Skip to content

Publish the NodeSpace skill so users can actually install it: public import repo + automated release #2283

Closed

Description

@malibio

Problem

A user cannot install the NodeSpace skill today. The app's auto-install path shells out via npx to @nodespaceai/skill, which has never existed on the npm registry:

GET https://registry.npmjs.org/@nodespaceai/skill  →  404

#1184 ("Publish @nodespaceai/skill to npm") was closed as completed on 2026-05-19, but the publish step never ran — the issue was closed on the code landing, not on the artifact existing. The package itself is fully prepared: packages/skill/package.json declares the correct name at v0.2.0, with bin.nodespace-skill and a files allowlist covering dist, shims, and SKILL.md. Nothing is wrong with the code.

This blocks everything downstream. #2272 (skill instructions) and #1958 (graph as source of truth for the skill) are both unverifiable end-to-end until a user can actually install the thing in a real harness.

Scope

This issue covers distribution of the NodeSpace Agent Skill to user-launched external agents — the path where a user starts Claude Code, Codex, Gemini CLI, OpenCode, or Cursor themselves and wants NodeSpace available. Out of scope: the PTY path where NodeSpace launches the agent (ADR-032).

The ask: a public import repo

Publish the skill as a public repository users import into their agent, rather than (or in addition to) an npm package.

Under the Agent Skills standard (agentskills.io) a skill is just a folder — SKILL.md plus optional references/, scripts/, assets/. A public repo is the natural primitive for that: it's what the ~40 adopting harnesses and the emerging skill marketplaces consume, and it doesn't require an npm account, a scoped-package publish, or npx to be working on the user's machine.

Hard requirement: generated output, not hand-editable

The repo must be a publish target the release pipeline pushes to, never a place people edit directly. If it becomes hand-editable it is simply another representation of the same facts, which is the exact problem #1958 exists to eliminate.

There is a cautionary precedent in this org: the Homebrew tap was hand-maintained and went two months stale (v0.1.6 vs v0.2.0) before #2114. The same failure mode applies here, with the difference that a stale skill silently teaches agents wrong things rather than failing to install.

Requirements

  • @nodespaceai/skill is published and installable, or an explicit decision is recorded that the public repo replaces the npm path (and the app's auto-install is updated accordingly — it currently shells out to npx)
  • If publishing to npm: confirm --access public. A scoped package defaults to restricted, which 404s identically for unauthenticated users — it is possible to publish and observe no change.
  • A public repo exists containing a spec-compliant skill folder: skills/nodespace/SKILL.md with required name + description frontmatter, name matching the directory name.
  • Frontmatter ships for all four installer targets, not Claude Code only — packages/skill/src/agents.ts:31-54 currently prepends frontmatter for Claude Code alone, leaving Codex/Gemini/OpenCode with spec-invalid folders (see NodeSpace skill instructions don't establish it as the source of truth for docs/specs — only teaches how to call functions #2272).
  • Publishing is automated in the release pipeline so the skill and the app that depends on it cannot drift apart. The current failure is exactly that drift.
  • Installing from the published artifact is verified by hand in at least one real harness — the skill activates and can drive the nodespace CLI.
  • Closing criteria are the artifact existing and being installable, not the code landing. That distinction is what produced this issue.

Open questions

  • Does the public repo replace npm, or complement it? The repo serves harness-native import; npm serves the app's programmatic auto-install. Both may be wanted, but then both need automating, and a single source must generate them.
  • What is the repo's relationship to nodespace-core? Presumably generated from packages/skill and pushed on release, following the homebrew-nodespace pattern (public distribution target, separate repo).
  • Versioning. How does a user know which NodeSpace version a given skill revision targets? The spec's optional compatibility field (max 500 chars, for environment requirements) may be the right place.
  • Does the delivery-channel decision in Make the graph the source of truth for the NodeSpace skill, and decide how guidance reaches external agents #1958 change what gets published? If guidance is fetched from the graph rather than shipped in the body, the published artifact is much smaller — a stub plus frontmatter. Worth sequencing after that decision, or designing the pipeline so either outcome is publishable.

Related

Activity

  1. malibio commented on Aug 24, 2026

    @malibio
    CollaboratorAuthor

    Scope note: where an installed skill can actually be used.

    The skill is self-bootstrapping — SKILL.md's Preflight Check (SKILL.md:50-67) already detects command not found: nodespace, proposes the install (sh -c "$(curl -fsSL https://nodespace.ai/install.sh)" -- --no-gui) gated on explicit user confirmation, and handles the stale-$PATH case. So "the CLI isn't there yet" is a handled condition, not a blocker, on any host where the skill can install and run it.

    The real constraint is data locality, not installability:

    • Local harnesses (Claude Code, Codex, Gemini CLI, OpenCode, Cursor on the user's machine) — full support. Preflight installs the CLI if absent and talks to the local daemon.
    • Claude Desktop scheduled tasks — these run locally and load skills from the normal locations, so they work the same way.
    • Cowork / cloud sessions — these do not read ~/.claude/skills/; they load skills enabled for the claude.ai account, synced at session start. The install would succeed, but it runs on an ephemeral remote host with no access to the user's local graph, so the session gets an empty workspace. This is a property of local-first, not a distribution gap — worth documenting so it reads as intended behavior rather than a bug report waiting to happen.

    Distribution consequence: if the skill is ever published through the claude.ai account path (Customize in the Desktop sidebar / skills settings), that upload validates frontmatter strictly against the spec's six fields and hard-errors on unknown keys. Staying spec-minimal (name, description, license, compatibility, metadata, allowed-tools) is what keeps that path open.

    Also worth carrying into #1958's delivery-channel decision: the preflight embeds a curl | sh install instruction. It is correctly gated on user confirmation today and ships in a reviewed file. If procedural guidance is fetched from the graph instead, an install command becomes something graph content can specify — a materially different trust proposition than one reviewed at publish time.

  2. malibio commented on Aug 24, 2026

    @malibio
    CollaboratorAuthor

    Handing this to @mstomar125. Recon notes so the stale parts of the description above don't cost a second investigation:

    The npx premise is out of date. The description opens on the app shelling out to npx @nodespaceai/skill. That was already fixed in #2143 — skill_setup.rs now resolves the installer from a Tauri-bundled resources/skill/dist/install.js (staged by scripts/build-skill.ts) and runs bun <installer> install directly. There's even a regression test, installer_command_invokes_bun_directly_not_npx_or_npm, asserting npx/npm can't come back. So the app's auto-install needs nothing from npm, and #2271's root cause is already resolved.

    npm has no consumer left. Agent Skills are distributed as git repos, not npm packages — the spec defines a skill as a folder (SKILL.md + optional references//scripts//assets/), and the harnesses that consume them read from a repo or local folder, not a registry. npm was only ever the right channel for the npx-run installer binary, which #2143 removed. Recommend closing out the npm requirement with an explicit recorded decision (the description already allows for that) rather than publishing an artifact nothing reads. @nodespaceai/skill still 404s as of today.

    No public skill repo exists yet. Confirmed against the org: the only public repos are nodespace-core and homebrew-nodespace. packages/skill is the source inside the monorepo, not an importable target — a user can't import a monorepo subdirectory as a skill folder. Suggest NodeSpaceAI/nodespace-skill with skills/nodespace/SKILL.md inside, so the name frontmatter matches its directory as the spec requires.

    Real remaining work:

    1. Spec-compliance bug — packages/skill/src/agents.ts:31-54 prepends frontmatter for Claude Code only. Codex/Gemini/OpenCode get folders with no name/description, which are spec-invalid.
    2. The generated public repo + release automation.

    Reusable precedent worth following: scripts/homebrew-tap-push.ts already implements clone → write → commit → push with token scrubbing on every path, and is shared by update-homebrew-cask.ts / update-homebrew-formula.ts. Those are driven by release.yml jobs and paired with a homebrew-drift-check.yml — exactly the generated-target + drift-check shape this issue asks for, including the --push / dry-run / drift-check command convention.

    Sequencing vs #1958: agreed with the description's framing — build the pipeline to generate whatever packages/skill contains. #1958's delivery-channel decision changes the content (534-line body today vs. a thin stub later), not the pipeline, so this doesn't need to wait.

    Two things need @malibio: creating the public repo, and the push-token secret.

  3. mstomar125 commented on Aug 25, 2026

    @mstomar125
    Contributor

    Frontend baseline: 227 test files passed, 4794 tests passed (79.17s).

  4. mstomar125 commented on Aug 25, 2026

    @mstomar125
    Contributor

    PR #2296 implements this: #2296

    Decision recorded: @nodespaceai/skill will not be published to npm; the public NodeSpaceAI/nodespace-skill repo is the sole distribution channel for external harness import. The desktop app's own install path has never depended on npm (it runs the built installer directly with bun, never npx/npm — see packages/desktop-app/src-tauri/src/skill_setup.rs), so nothing currently blocks on the package landing on the registry.

    Live right now, not just code: NodeSpaceAI/nodespace-skill contains README.md and a spec-compliant skills/nodespace/SKILL.md + skills/nodespace/references/cli.md, pushed by actually running the new scripts/publish-skill-repo.ts --push by hand as a one-time bootstrap (using my own credentials, not a CI secret) — the same code path the release pipeline will run, exercised for real rather than simulated. Verified against the live, freshly-cloned artifact with a validator built directly from the agentskills.io spec table: 16/16 checks pass.

    Publishing is automated: release.yml gets a new sync-skill-repo job, triggered the same release: [published] way sync-homebrew-cask is.

    Frontmatter for all four targets: already fixed in #2284 (merged just before this branch started) — verified still correct. Confirmed via the actual agentskills.io spec and Claude Code's own docs that allowed-tools is one of the spec's six universal frontmatter fields (not Claude-Code-specific, just "Experimental"), so sharing it across all four installer targets is spec-compliant.

    Open item: SKILL_REPO_TOKEN (contents:write on NodeSpaceAI/nodespace-skill) needs to be provisioned as a repo secret before the automated pipeline can push on a real release — I can't create repo secrets myself. Until then, sync-skill-repo will fail loudly and notify-failure will open an issue, same as HOMEBREW_TAP_TOKEN did before it was set.

    Full details, verification method, and other open items are in the PR description.

  5. mstomar125 commented on Aug 25, 2026

    @mstomar125
    Contributor

    Closing-requirement gap filled, for real: this was merged with the live-activation check honestly flagged as unverified (the implementing agent had no OAuth session / a non-writable keychain in its sandbox — confirmed independently by the coordinating session hitting the identical restriction). A real Claude Code session on a real machine has now run it:

    • Activation: PASS — the skill loaded automatically from the task description alone, no explicit naming needed.
    • Real CLI commands: PASS — after the skill's own preflight installed the CLI, it ran multiple real search strategies (semantic w/ lowered threshold, exact substring, notarization-flavored phrasing) against a real 321-node database (86 root).

    This satisfies "verified by hand in at least one real harness — the skill activates and can drive the nodespace CLI" for real, not just by inspection. Remaining harness legs (Codex/Gemini/Cursor, and the daemon-down degradation case) are being tracked against #1958's own test matrix, not this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions