Make ocean-cli globally installable as @oceanprotocol/cli#164
Make ocean-cli globally installable as @oceanprotocol/cli#164alexcos20 wants to merge 11 commits into
@oceanprotocol/cli#164Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughThe CLI is configured as the scoped ChangesCLI distribution and runtime
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant ocean-cli
participant createCLI
participant P2PBootstrap
User->>ocean-cli: invoke help, version, or command
ocean-cli->>ocean-cli: inspect process.argv
alt help or version
ocean-cli-->>User: print output and exit
else command
ocean-cli->>createCLI: initialize CLI
createCLI->>P2PBootstrap: bootstrap when NODE_URL is a P2P address
ocean-cli-->>User: execute command or enter REPL
end
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
/run-security-scan |
alexcos20
left a comment
There was a problem hiding this comment.
AI automated code review (Gemini 3).
Overall risk: low
Summary:
This PR excellently prepares ocean-cli for global distribution via npm. The addition of the smoke test for tarball contents, NPM provenance for supply chain security, and the move to module-based resolution for ABI files are great architectural improvements. LGTM!
Comments:
• [INFO][style] Since you have instantiated a require function, you can load and parse the JSON file in a single, native step instead of using readFileSync and JSON.parse. This is cleaner and matches what you did in src/cli.ts.
-const ERC20Template = JSON.parse(
- readFileSync(
- require.resolve(
- "@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json"
- ),
- "utf8"
- )
-);
+const ERC20Template = require("@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json");• [INFO][other] The addition of this pack_smoke job is excellent. Verifying the tarball contents in CI before publishing prevents shipping unwanted directories (like src/ and test/) and ensures the binary is globally installable without regressions.
• [INFO][security] Great job including id-token: write and --provenance. This strongly enhances the supply chain security of the package by linking the published artifact to its build execution.
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (1)
test/replMenu.test.ts (1)
12-12: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftTest Escape exit behavior in a TTY.
This only updates the prompt assertion.
runRepl()uses piped stdin, so it cannot exercise the newinput.isTTYEscape handler. Add a pseudo-TTY test (or extract the handler for unit testing) that sends\x1band asserts a clean exit.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/replMenu.test.ts` at line 12, Add coverage for the TTY-specific Escape exit path in runRepl, which is not exercised by the existing piped-stdin test. Use a pseudo-TTY or extract and unit-test the input.isTTY handler, send \x1b, and assert that the REPL exits cleanly.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/ci.yml:
- Around line 43-51: Update the CI workflow permissions for the pack_smoke job
to explicitly grant only contents: read, and configure the actions/checkout step
to disable persisted credentials. Keep the existing checkout behavior and
smoke-job steps unchanged.
In @.github/workflows/publish.yml:
- Around line 3-6: Restrict the publish workflow’s push trigger to tags matching
v*. Before publishing, add a validation step that compares the triggering tag’s
version with the version in package.json and stop the workflow when they differ,
ensuring only matching validated release tags publish.
- Around line 15-16: Remove the job-level NODE_AUTH_TOKEN declaration and add it
only to each step that runs npm publish in the workflow, preserving the existing
secret reference and leaving npm ci steps without access to the publishing
credential.
In `@README.md`:
- Around line 100-115: Update the README environment-variable documentation by
correcting “miliseconds” to “milliseconds” and adding the bash language label to
each of the three fenced shell snippets for INDEXING_MAX_RETRIES,
INDEXING_RETRY_INTERVAL, and AVOID_LOOP_RUN.
In `@src/index.ts`:
- Around line 63-73: Reformat the changed TypeScript with Prettier using 2-space
indentation, single quotes, and semicolons: update stripNpmPrefix and the
related changed block in src/index.ts (lines 63-73), the changed code and module
literal in src/cli.ts (line 5), the affected block in src/helpers.ts (lines
28-42), and the import in src/policyServerHelper.ts (line 2).
- Around line 184-194: Update the help-handling condition in the CLI startup
flow to also recognize the positional commands “h” and “help”, matching
createCLI()’s configuration-free behavior. Ensure all supported help forms call
program.outputHelp() and return before the REPL initialization, while leaving
version handling unchanged.
---
Nitpick comments:
In `@test/replMenu.test.ts`:
- Line 12: Add coverage for the TTY-specific Escape exit path in runRepl, which
is not exercised by the existing piped-stdin test. Use a pseudo-TTY or extract
and unit-test the input.isTTY handler, send \x1b, and assert that the REPL exits
cleanly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 70335b8a-0e88-4a95-9c2f-17b16bb8d3db
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (11)
.github/workflows/ci.yml.github/workflows/publish.ymlCLAUDE.mdREADME.mdpackage.jsonsrc/cli.tssrc/helpers.tssrc/index.tssrc/interactiveFlow.tssrc/policyServerHelper.tstest/replMenu.test.ts
| * Strip an optional leading `npm run cli` or `ocean-cli` prefix so that a pasted | ||
| * example command (from either the contributor docs or the global-install docs) | ||
| * behaves identically to the bare command form. | ||
| */ | ||
| function stripNpmPrefix(tokens: string[]): string[] { | ||
| if (tokens[0] === "npm" && tokens[1] === "run" && tokens[2] === "cli") { | ||
| return tokens.slice(3) | ||
| } | ||
| if (tokens[0] === "ocean-cli") { | ||
| return tokens.slice(1) | ||
| } |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Format the changed TypeScript with Prettier.
The changed files share the same formatting drift from the required 2-space, single-quote, semicolon style.
src/index.ts#L63-L73: Reformat this and the remaining changed blocks with Prettier.src/cli.ts#L5-L5: Use a single-quoted module literal and format the related changed code.src/helpers.ts#L28-L42: Apply the required indentation, quote, and semicolon style.src/policyServerHelper.ts#L2-L2: Use single quotes and terminate the import with a semicolon.
As per coding guidelines, **/*.{ts,tsx,js} must use Prettier with 2-space indentation, single quotes, and semicolons.
📍 Affects 4 files
src/index.ts#L63-L73(this comment)src/cli.ts#L5-L5src/helpers.ts#L28-L42src/policyServerHelper.ts#L2-L2
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/index.ts` around lines 63 - 73, Reformat the changed TypeScript with
Prettier using 2-space indentation, single quotes, and semicolons: update
stripNpmPrefix and the related changed block in src/index.ts (lines 63-73), the
changed code and module literal in src/cli.ts (line 5), the affected block in
src/helpers.ts (lines 28-42), and the import in src/policyServerHelper.ts (line
2).
Source: Coding guidelines
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…/ocean-cli into feature/cli_global
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/cli.ts (1)
68-79: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winSeparate environment bypass from output/exiting behavior.
createCLI()lets any--help/-h/--version/-Vanywhere bypass environment validation, butsrc/index.tsonly exits to print root help/version for bare./bincalls. For a command subpath likeocean-cli publish --help,src/index.tsnever receives that argv becauseprocess.argvis[node, bin], so Commander only parses the remaining program argv and may render the root help. Handle subcommand help/version through Commander’s exit-override handling, while keeping only the no-init flag atcli.ts.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/cli.ts` around lines 68 - 79, Update the argv bypass logic in createCLI so it only skips environment validation and P2P bootstrap for the no-init invocation handled by src/index.ts, rather than for help/version flags anywhere in the command line. Move subcommand help/version output and exiting into Commander’s exit-override handling, ensuring commands such as publish --help render the subcommand output while preserving bare root help/version behavior.
🧹 Nitpick comments (1)
src/index.ts (1)
2-2: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winRun Prettier on all changed TypeScript.
src/index.ts#L2-L2: format the side-effect import with the repository’s quote and semicolon rules.src/index.ts#L187-L194: format the help/version branch.src/index.ts#L214-L220: format the initial-help branch.src/warnings.ts#L18-L29: format the warning-filter module.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/index.ts` at line 2, Run Prettier on the changed TypeScript. Format the side-effect import and the help/version and initial-help branches in src/index.ts at lines 2-2, 187-194, and 214-220, plus the warning-filter module in src/warnings.ts at lines 18-29; make no behavioral changes.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/ci.yml:
- Line 46: Remove the duplicate jobs mapping and move the pack_smoke job
definition under the existing top-level jobs block. Preserve pack_smoke’s
configuration while ensuring the workflow contains only one jobs key.
In `@CHANGELOG.md`:
- Line 35: Correct the typo in the changelog entry by replacing “downaloded”
with “downloaded,” without changing the surrounding text or commit link.
In `@src/warnings.ts`:
- Around line 20-29: Update the warning-handler setup around
process.on("warning") to preserve existing process warning listeners instead of
clearing them with process.removeAllListeners("warning"). Save and retain any
pre-existing listeners, or replace only the default printer while ensuring
custom preload, instrumentation, and observability handlers continue to run.
---
Outside diff comments:
In `@src/cli.ts`:
- Around line 68-79: Update the argv bypass logic in createCLI so it only skips
environment validation and P2P bootstrap for the no-init invocation handled by
src/index.ts, rather than for help/version flags anywhere in the command line.
Move subcommand help/version output and exiting into Commander’s exit-override
handling, ensuring commands such as publish --help render the subcommand output
while preserving bare root help/version behavior.
---
Nitpick comments:
In `@src/index.ts`:
- Line 2: Run Prettier on the changed TypeScript. Format the side-effect import
and the help/version and initial-help branches in src/index.ts at lines 2-2,
187-194, and 214-220, plus the warning-filter module in src/warnings.ts at lines
18-29; make no behavioral changes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 1bc6932c-a496-4a58-aac6-19b1c29165b3
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (8)
.github/workflows/ci.yml.github/workflows/publish.ymlCHANGELOG.mdREADME.mdpackage.jsonsrc/cli.tssrc/index.tssrc/warnings.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- package.json
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: |
There was a problem hiding this comment.
🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
Merge pack_smoke into the existing jobs mapping.
jobs is already declared at Line 6. Adding another jobs key at Line 46 makes the workflow invalid YAML, preventing GitHub Actions from loading the workflow. Define pack_smoke under the original jobs: block instead.
🧰 Tools
🪛 actionlint (1.7.12)
[error] 46-46: key "jobs" is duplicated in "workflow" section. previously defined at line:6,col:1
(syntax-check)
🪛 YAMLlint (1.37.1)
[error] 46-46: duplication of key "jobs" in mapping
(key-duplicates)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/ci.yml at line 46, Remove the duplicate jobs mapping and
move the pack_smoke job definition under the existing top-level jobs block.
Preserve pack_smoke’s configuration while ensuring the workflow contains only
one jobs key.
Source: Linters/SAST tools
| - use latest ocean.js [`#147`](https://github.com/oceanprotocol/ocean-cli/pull/147) | ||
| - chore: add example metadata [`#132`](https://github.com/oceanprotocol/ocean-cli/pull/132) | ||
| - chore: buy v5 [`bc2b222`](https://github.com/oceanprotocol/ocean-cli/commit/bc2b2227c08620a63e171ab9e8d1660a3190bd4a) | ||
| - fix: removed file downaloded [`c99c066`](https://github.com/oceanprotocol/ocean-cli/commit/c99c06639dd6ad3a4c2f93ba01f5163bc77ec24f) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Fix the changelog typo.
Change downaloded to downloaded.
🧰 Tools
🪛 LanguageTool
[grammar] ~35-~35: Ensure spelling is correct
Context: ...b9e8d1660a3190bd4a) - fix: removed file downaloded [c99c066](https://github.com/oceanpro...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@CHANGELOG.md` at line 35, Correct the typo in the changelog entry by
replacing “downaloded” with “downloaded,” without changing the surrounding text
or commit link.
Source: Linters/SAST tools
| process.removeAllListeners("warning"); | ||
|
|
||
| process.on("warning", (warning: Error & { code?: string }) => { | ||
| if (SILENCED.has(warning.name)) return; | ||
| // Reproduce Node's default one-line format for everything else. | ||
| const code = warning.code ? ` [${warning.code}]` : ""; | ||
| console.error( | ||
| `(node:${process.pid})${code} ${warning.stack ?? `${warning.name}: ${warning.message}`}` | ||
| ); | ||
| }); |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
echo "== locate warnings.ts =="
fd -a 'warnings\.ts$' . || true
echo "== file contents =="
for f in $(fd 'warnings\.ts$' .); do
echo "--- $f"
wc -l "$f"
cat -n "$f"
done
echo "== usages of warnings/removeAllListeners/warning listener =="
rg -n "removeAllListeners|on\\(\"warning\"|warning|Warnings|warnings" src package.json 2>/dev/null || true
echo "== Node version and listener behavior probe =="
node -v
node - <<'JS'
const listeners = ['default', 'custom-telemetry'];
// Node's own warning listener is an emitted custom handler under the hood;
// emulate a handler installed earlier.
process.on('warning', (warn) => console.log('custom handler saw', warn.code || warn.name));
// Simulate this module's guard: remove warning listeners, then replace with a filter.
process.removeAllListeners('warning');
process.on('warning', (warning) => {
if (warning.name === 'DeprecationWarning') return;
const code = warning.code ? ` [${warning.code}]` : '';
console.error(`(node:${process.pid})${code} ${warning.stack ?? `${warning.name}: ${warning.message}`}`);
});
const emitted = new Error('example');
emitted.name = 'CustomWarning';
emitted.code = 'CUST1';
process.emitWarning(emitted, 'CustomWarning', 'CUST1');
console.log('remaining warning listener count after removeAllListeners + replace:', process.listenerCount('warning'));
JSRepository: oceanprotocol/ocean-cli
Length of output: 3681
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
echo "== package/node engine =="
cat package.json | sed -n '1,120p'
echo "== inspect Node 22 if present =="
if command -v node22 >/dev/null 2>&1 || command -v /usr/bin/node22 >/dev/null 2>&1; then
node22 -v || true
else
echo "node22 binary not found"
fi
echo "== Node listener semantics via public API =="
node - <<'JS'
const emittedRef = [];
process.on('warning', (w) => emittedRef.push('custom:' + w.name));
process.emitWarning(new Error('p1'), 'P1');
const before = process.getEventListeners('warning').length;
process.removeAllListeners('warning');
const after = process.getEventListeners('warning').length;
process.on('warning', (w) => emittedRef.push('custom2:' + w.name));
const emitted = new Error('p2');
emitted.name = 'P2';
process.emitWarning(emitted, 'P2');
console.log(JSON.stringify({
beforeCount: before,
afterCount: after,
emitted: emittedRef
}));
JS
echo "== diff context =="
git diff -- src/warnings.ts src/index.ts --stat 2>/dev/null || trueRepository: oceanprotocol/ocean-cli
Length of output: 3907
Preserve existing warning listeners.
process.removeAllListeners("warning") clears every warning listener, including handlers added by preload scripts, instrumentation, or observability tooling. Re-register any custom listeners that should continue to run, or avoid removing the default printer by replacing it only after saving existing listeners.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/warnings.ts` around lines 20 - 29, Update the warning-handler setup
around process.on("warning") to preserve existing process warning listeners
instead of clearing them with process.removeAllListeners("warning"). Save and
retain any pre-existing listeners, or replace only the default printer while
ensuring custom preload, instrumentation, and observability handlers continue to
run.
Closes #50
Make ocean-cli globally installable as
@oceanprotocol/cliPublishes the CLI to npm so users can install it once and run
ocean-clifromanywhere, instead of only from a checkout via
npm run cli:@oceanprotocol/cli(scoped, published with public access).ocean-cli(unchanged user-facing command; independent of the package name).ocean-cliruns the command you pass (if any) and then keeps reading further commands interactively, Claude-Code-style. Exit withexit/quit, ESC, or CTRL-C.AVOID_LOOP_RUN=truestill forces one-shot mode for CI/scripting.Why
The compiled CLI could only run from the project root, had no npm
bin, nopublish whitelist, a taken unscoped name, and it hard-crashed on
--helpwhen noenv vars were set — none of which is acceptable for a globally installed tool.
Changes
Code — location independence & packaging
src/helpers.ts— the ERC20 template ABI was read from a cwd-relative./node_modules/...path at module load, crashing withENOENTfrom any otherdirectory. Now resolved through the module system
(
createRequire(import.meta.url).resolve(...)) so it's found inside the installedpackage tree regardless of cwd. This also fixes a latent bug: the value was a raw
string but is used as
ERC20Template.abi— it's nowJSON.parsed, so.abiactually resolves.
src/index.ts— added the#!/usr/bin/env nodeshebang (line 1) so npm'sbinproduces a working executable (tscpreserves it intodist/index.js).package.json—name→@oceanprotocol/cli; addedbin(
ocean-cli→dist/index.js),files(dist,metadata,README.md),repository,publishConfig.access: public, and aprepublishOnly: npm run buildso every tarball ships a fresh
dist/..jsextension fixes —src/policyServerHelper.tsandsrc/interactiveFlow.tsimported relative modules without the mandatory.jsextension. The
policyServerInterfacesone emitted a runtime import that made thecompiled CLI fail to load under Node (
ERR_MODULE_NOT_FOUND) — masked in devbecause
tsxis extension-lenient, but fatal for a global install. Both fixed.Code — first-run UX & version
src/cli.ts— env-var validation and the P2P/libp2p bootstrap are nowskipped for pure help/version invocations (
--help/-h/--version/-V/h/help),detected from
process.argv. Every real command still validates, with the threeerror messages and their order byte-identical (keys → RPC → NODE_URL), as
asserted by
test/setup.test.ts. The CLI--versionnow reads frompackage.json(createRequire(...)("../package.json").version) instead of ahardcoded
"2.0.0", so it can't drift.src/index.ts—--version/-Vnow print and exit cleanly (alongside theexisting
--helphandling) rather than dropping into the REPL.Code — REPL polish (default behavior unchanged)
stripNpmPrefixnow also strips a leadingocean-clitoken, so examples pastedfrom either the contributor docs (
npm run cli …) or the global-install docs(
ocean-cli …) work verbatim in interactive mode.keypresslistener, guarded byinput.isTTYso piped stdin in tests/scripts is unaffected).exit/quit/\q/EOFand CTRL-C continue to work. The prompt text was updated to mention ESC, and the
synced copy in
test/replMenu.test.tsupdated to match.Dependencies
chalk(^4.1.2) as a direct dependency — it was imported directly butonly resolved transitively via hoisting, which is fragile in a global install.
dependencies: deletedesm(unused),moved
ts-nodetodevDependencies(mocha'sts-node/esmloader needs it), andremoved the duplicate
tsx(already indevDependencies).Docs
(
npm i -g @oceanprotocol/cli→ocean-cli <command>); the from-sourcenpm run clipath is kept for contributors with a note that the two forms areinterchangeable. Documented the interactive-by-default behavior + ESC/CTRL-C exit,
and corrected the stale
INDEXING_*defaults (now 120 retries × 4000 ms).help/version validation skip, and the ABI-resolution description.
CI & release automation
.github/workflows/ci.yml— newpack_smokejob (runs on every PR, noBarge): build →
npm pack→ assert the tarball shipsdist//metadata//README.mdand not
src//test/→npm i -gthe tarball → runocean-cli --version,--help,-h,-Vfrom a foreign cwd with no env vars. This permanently guardsthe global-install contract (broken bin, cwd-dependent loading, env-gated help).
@oceanprotocol/lib(ocean.js): a localnpm run release(release-it --non-interactive) bumps the version, builds,regenerates the changelog (
auto-changelog), commits, tagsv${version},pushes, and cuts a GitHub Release — but does not publish to npm
(
release-itconfig:npm.publish: false). Addedrelease/changelogscripts,the
release-itconfig block, andrelease-it/auto-changelogdevDeps..github/workflows/publish.yml(new, replaces the earlierrelease.yml) —triggered by pushing a git tag (
on: push: tags), exactly like ocean.js'spublish.yml. Runsnpm cithennpm publishwithNODE_AUTH_TOKEN=${{ secrets.NPM_TOKEN }}: a tag containingnextpublishes tothe
nextdist-tag, otherwiselatest. Uses--provenance --access public(
id-token: write);prepublishOnlyrebuildsdist/during publish.Verification
Built with Node 22 and exercised from a foreign cwd with no env vars:
Packaging + real global install (isolated
--prefix):Infra-free tests (Node 22):
Full
npm run test:systemstill requires a running Barge stack.Cutting a release
Prerequisites:
NPM_TOKENrepo secret — an npm automation token with publish rightson the
@oceanprotocolorg.publish.ymlreads it asNODE_AUTH_TOKEN.release-itneeds a GitHub token for the Release step (GITHUB_TOKEN/GH_TOKEN) when run in CI; locally it uses yourgh/git credentials.--provenancerequires therepositoryfield (added here) to match this repo.Summary by CodeRabbit
New Features
@oceanprotocol/clipackage.ocean-cliexecution with help and version commands.Bug Fixes
Documentation
Chores