@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 +36 -5
- package/dist/cli.js +413 -256
- package/dist/cli.js.map +1 -1
- package/dist/ingest-prompt.md +103 -10
- package/package.json +1 -1
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
|
|
170
|
-
|
|
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
|