@rhize/skill-forge 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -161,17 +161,34 @@ guessing between the two).
161
161
  |---|---|---|
162
162
  | Local directory | `./my-mcp-server` | Copied into quarantine, same as a local skill source. |
163
163
  | Git URL | `https://github.com/owner/mcp-server.git` | Shallow-cloned into quarantine, same as a git skill source. |
164
- | npm package | `@scope/name` or `some-mcp-server` | `npm pack <name> --pack-destination <quarantine>`, then tarball **extraction only** — never `npm install`, never lifecycle scripts. |
164
+ | npm package | `@scope/name` or `some-mcp-server` | `npm pack <name> --ignore-scripts --pack-destination <quarantine>`, then tarball **extraction only** — never `npm install`, never lifecycle scripts. Every tarball member path is validated (absolute paths and `..` segments are rejected) before extraction. |
165
165
 
166
166
  **What's gated**
167
167
 
168
168
  Safety runs the same built-in deny-pattern ruleset used for skills (curl\|bash, credential-file
169
- access, etc.) plus MCP-specific rules: inline credential values in config/env, unpinned `npx -y`
170
- launch commands, `--dangerously-*`/`--no-sandbox` flags, and filesystem-root launch args — see the
169
+ access, etc.) plus MCP-specific rules: inline credential values in config/env (quoted or
170
+ unquoted), unpinned `npx -y` launch commands (a moving/dist tag like `@latest` counts as
171
+ unpinned, and `npx` is recognized by basename so a full path or `npx.cmd` can't evade it),
172
+ `--dangerously-*`/`--no-sandbox` flags, and filesystem-root launch args — see the
171
173
  [MCP safety ruleset table](docs/gate-policy.md#mcp-safety-ruleset). Overlap analysis (Pro, free
172
174
  during the 0.x beta) ranks the candidate against the server entries already present in your
173
175
  configured `mcpTargets` files, instead of against a skills root.
174
176
 
177
+ **Capability profile (v0.6).** The report also includes a **static** capability summary — tool,
178
+ resource, and prompt counts, plus a `declaredConfidence` (`high`/`partial`/`none`) — parsed from
179
+ the candidate's `package.json`, any shipped `.mcp.json`/manifest, and MCP SDK source-text patterns
180
+ (`server.tool(...)`, `setRequestHandler(ListToolsRequestSchema, ...)`, etc.):
181
+
182
+ ```
183
+ Artifact type : mcp
184
+ Capabilities : 2 tools, 1 resource, 0 prompts (declaredConfidence: high)
185
+ ```
186
+
187
+ This is free (it's profiling, not a Pro feature) and **never derived by running the candidate
188
+ server** — anything that can't be determined from source text is reported as undetermined rather
189
+ than discovered by executing it. `--json` includes the full `tools`/`resources`/`prompts` name
190
+ lists under `profile.capabilities`.
191
+
175
192
  **Promote semantics**
176
193
 
177
194
  Promoting an MCP candidate writes ONE server entry into a target MCP config file's `mcpServers`
@@ -192,7 +209,13 @@ map — it never touches a skills root:
192
209
 
193
210
  There's no MCP equivalent of the skill provenance ledger (`SOURCES.md`) — the pending-ingestion
194
211
  queue (Pro) and `--ingest` handoff both apply the same way, keyed on the written config file path
195
- instead of an installed skill directory.
212
+ instead of an installed skill directory. The queued entry carries the candidate's static capability
213
+ profile (`capabilities`, v0.6, above), so a `--ingest` handoff run on an MCP promote has real
214
+ material to work with: `assets/ingest-prompt.md` branches on `artifactType: "mcp"` and walks the
215
+ same five-verb decide (DEFER/ABSORB/FORK/REJECT/WATCH) applied to a server instead of a skill —
216
+ compare declared capabilities against what's already configured, then keep/tighten/remove the
217
+ promoted config entry accordingly. Same static-only rule as the CLI's own profiling: the deep pass
218
+ never runs or installs the candidate server to inspect it.
196
219
 
197
220
  **TOML-format agents: detect-only.** `skill-forge init` detects MCP config files for every known
198
221
  agent, including TOML-format ones (Codex CLI's `config.toml`) — they show up in `init`'s MCP-target
@@ -245,6 +268,11 @@ implementation status.
245
268
  - **Block on HIGH/CRITICAL.** Any finding at `HIGH` or `CRITICAL` severity blocks the candidate
246
269
  outright (verdict `block`); a lower-severity finding produces `warn`; a clean scan is `pass`.
247
270
  `--yes` honors this: `block` is rejected automatically.
271
+ - **npm-sourced MCP candidates: `--ignore-scripts` + tarball member validation.** An npm-package
272
+ MCP source is fetched with `npm pack --ignore-scripts`, and the tarball's member list is checked
273
+ with `tar -tzf` before extraction — any absolute path or `..` path segment refuses the extract
274
+ with an error instead of running `tar -xzf` (a path-traversal guard against a malicious tarball
275
+ writing outside the quarantine sandbox).
248
276
  - **SkillSpector, when installed.** If [SkillSpector](https://github.com/NVIDIA/SkillSpector)
249
277
  (Apache-2.0) is on `PATH`, skill-forge shells out to it (`--no-llm` by default, so scanned skill
250
278
  content is never sent to an external LLM provider) and merges its findings into the same report.
@@ -262,7 +290,10 @@ that deeper judgment (which patterns to keep, whether to absorb into an existing
262
290
  new one, verifying the result beats baseline) is a job for a coding agent, not the gate. `--ingest`
263
291
  hands a promoted skill off to one, running the bundled, agent-neutral prompt at
264
292
  `assets/ingest-prompt.md` (Claude Code users get a deeper experience via the companion
265
- `rhize-skill-forge` plugin skill, but the bundled prompt works with any agent).
293
+ `rhize-skill-forge` plugin skill, but the bundled prompt works with any agent). The same flag works
294
+ on an MCP server promote (`--artifact mcp --ingest`, v0.6): the bundled prompt branches on the
295
+ queue entry's `artifactType` and runs the matching decide pass — see
296
+ [MCP gating](#mcp-gating-v05) above.
266
297
 
267
298
  ```bash
268
299
  skill-forge add owner/name --yes --ingest