@rhize/skill-forge 0.6.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,13 +161,15 @@ 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.
@@ -266,6 +268,11 @@ implementation status.
266
268
  - **Block on HIGH/CRITICAL.** Any finding at `HIGH` or `CRITICAL` severity blocks the candidate
267
269
  outright (verdict `block`); a lower-severity finding produces `warn`; a clean scan is `pass`.
268
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).
269
276
  - **SkillSpector, when installed.** If [SkillSpector](https://github.com/NVIDIA/SkillSpector)
270
277
  (Apache-2.0) is on `PATH`, skill-forge shells out to it (`--no-llm` by default, so scanned skill
271
278
  content is never sent to an external LLM provider) and merges its findings into the same report.