Repository navigation
Add nodespace skill install/uninstall/status CLI subcommand - #2511
Conversation
…2368) Closes the CLI -> skill bootstrap loop: a CLI-only install had no way to set up the NodeSpace skill for detected AI-agent harnesses, unlike the GUI app's first-launch installer. The new subcommand shells out to the same packages/skill installer (compiled sidecar when bundled, dist/ install.js fallback otherwise), reusing agents.ts's harness table with no second copy. Also extends release.yml's build-headless job to compile and upload the nodespace-skill-installer sidecar (and its SKILL.md/shims/references resource bundle) for the headless macOS/Linux targets, so a CLI-only install actually has something to invoke. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018o8BPRcosQCrryoE5XYMYj
Code Review SummaryNet positive, well-engineered infrastructure/glue change. It closes the CLI→skill loop cleanly: a new Requirements Check (issue #2368)
Code Review Findings🔴 CriticalNone. No security, correctness-of-core-logic, or architectural regressions found. 🟡 Important
🟢 Suggestions
|
malibio
left a comment
There was a problem hiding this comment.
Automated pragmatic-code-review: APPROVE (posted as a comment — GitHub blocks self-approval). Full findings in the review comment above.
…installer resolution - `uninstall()` parsed InstallOutcome.skipped but never printed it, unlike `install`/`status` -- fixed to match, so the "reports skipped harnesses" acceptance criterion holds for every subcommand, not just two of three. - resolve_compiled_installer() was the one genuinely new resolution path in this PR (skill_setup.rs's analog has a real end-to-end compiled-binary test) and had no coverage. Split it into a pure compiled_installer_beside() helper -- same current_exe()-as-parameter seam daemon_setup's sidecar_path_from_exe uses -- and added tests for the missing-binary, missing-resource-root, and both-present cases. Skipped from the review: a confirmation prompt for `uninstall` (the existing `nodespace uninstall` full-uninstall command has none either -- adding one here would be inconsistent, not more consistent); restoring tracing::debug! logging (packages/cli has no tracing subscriber wired up anywhere else, so this would be new infrastructure, not a parity fix); the gemini->antigravity rename (tracked separately in #2473, explicitly out of scope for #2368). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018o8BPRcosQCrryoE5XYMYj
|
Addressed the review feedback (commit bee802d):
Re-Review DecisionDecision: NO RE-REVIEW NEEDED Rationale: Both changes are small, low-risk, and directly implement the reviewer's own suggested fix (print the already-collected |
Summary
skill_setup.rs).nodespace skill install|uninstall|status(packages/cli/src/commands/skill.rs). Mirrorsskill_setup.rs'sInstallerenum (compiled sidecar preferred,dist/install.js+ bun/node fallback), minus every Tauri-specific piece — this crate has noAppHandle.installprompts for confirmation on a real terminal ([Y/n], matching the issue's proposed UX), auto-confirms with a stated reason when there's no TTY, and accepts--yesfor explicit non-interactive use.packages/skill/src/agents.ts's harness table via the shared installer — no second copy, per the issue's acceptance criteria.release.yml'sbuild-headlessjob to compile thenodespace-skill-installersidecar and package its SKILL.md/shims/references resources as release assets for the non-Windows headless targets (macOS ARM, Linux ARM/x86), so a CLI-only install actually has something to invoke.nodespace-website(NodeSpaceAI/nodespace-website#4) adds--skill/--no-skilltoinstall.sh, which downloads those new release assets and calls this subcommand after a CLI install completes.Design decision (per the issue)
Implemented both options the issue laid out: the CLI subcommand (issue's recommended option 2 — most discoverable, handles the "harness installed later" case) and the release-asset upload (option 1), since the subcommand needs the sidecar published as a release asset to have anything to invoke on a CLI-only machine.
agents.tswas left targeting today's harness table (gemini, notantigravity) — #2473's Gemini → Antigravity CLI swap is separate, unstarted work and out of scope here.Acceptance criteria
packages/skill'sagents.ts— no second copy of the harness table--yes), mirroring--gui/--no-guiTest plan
bun run test:all— no new failures (frontend baseline unchanged at 238/238 test files; every Rust crate 0 failed)bun run quality:fix— cleanpackages/cli/src/commands/skill.rs(parse_installer_output,bundled_sidecar_name,resolve_script_installererror path)cargo run -q -p nodespace-cli --example gen_skill_md -- --writeregeneratedreferences/cli.md;skill_md_generation.rs's coverage tests pass$HOME:status(nothing detected) →install --yes(installs into.claude) →status(present) →uninstall(removed) →status(nothing detected) — confirmed real files land at~/.claude/skills/nodespace/.claudepresent, add.codexafterward, re-runinstall --yes— confirms new-harness pickup and idempotent re-run (already-installed harness reported again, no duplicate/error)sh -nsyntax check + sourced-function tests on the companioninstall.shchangeCo-Authored-By: Claude Sonnet 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_018o8BPRcosQCrryoE5XYMYj
🤖 Generated with Claude Code