@softspark/ai-toolkit 4.25.0 → 4.25.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/CHANGELOG.md +24 -0
- package/README.md +10 -12
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/skills/cve-scan/scripts/cve_scan.py +16 -2
- package/kb/procedures/post-release-testing-sop.md +20 -11
- package/kb/reference/enterprise-config-guide.md +1 -1
- package/llms-full.txt +21 -12
- package/manifest.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,30 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v4.25.1 — npm advisories count again (2026-08-19)
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`cve-scan` reported zero findings for a vulnerable npm project.** npm audit
|
|
15
|
+
can return the legacy `advisories` object as well as the current
|
|
16
|
+
`vulnerabilities` object. The scanner parsed only the latter, so five real
|
|
17
|
+
lodash advisories remained trapped in `raw_output` while `total_findings` was
|
|
18
|
+
zero and the process exited successfully. Both formats are now normalized,
|
|
19
|
+
and HIGH advisories restore the documented non-zero exit code.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **The published-package scanner smoke uses real per-scanner fixtures and
|
|
24
|
+
flags.** It now includes healthcare patterns and a deliberately vulnerable
|
|
25
|
+
locked npm dependency, invokes `cve-scan` with `--json`, and treats raw npm
|
|
26
|
+
advisories with no normalized findings as a parser failure.
|
|
27
|
+
|
|
28
|
+
### Tests
|
|
29
|
+
|
|
30
|
+
- Added a public-CLI regression test with a stubbed legacy npm audit response;
|
|
31
|
+
it asserts normalized severity, installed version, CVE, fixed range, finding
|
|
32
|
+
count, and exit status.
|
|
33
|
+
|
|
10
34
|
## v4.25.0 — editor-native integrations catch up (2026-08-19)
|
|
11
35
|
|
|
12
36
|
### Added
|
package/README.md
CHANGED
|
@@ -6,20 +6,18 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](app/skills/)
|
|
8
8
|
[](app/agents/)
|
|
9
|
-
[](tests/)
|
|
10
10
|
|
|
11
|
-
## What's New in v4.25.
|
|
11
|
+
## What's New in v4.25.1
|
|
12
12
|
|
|
13
|
-
**v4.25.
|
|
13
|
+
**v4.25.1** fixes the CVE scanner path exercised by the published-package smoke test:
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
- Claude Code validation now matches the current prompt, agent, HTTP hook, and
|
|
22
|
-
plugin contracts, with transactional symlink protections across new writers.
|
|
15
|
+
- Legacy npm audit `advisories` are normalized alongside the modern
|
|
16
|
+
`vulnerabilities` response.
|
|
17
|
+
- HIGH advisories now produce findings and the documented non-zero exit code
|
|
18
|
+
instead of a false clean result.
|
|
19
|
+
- The post-release scanner fixture now exercises accessibility, SEO, HIPAA, and
|
|
20
|
+
a deliberately vulnerable npm dependency with their real CLI flags.
|
|
23
21
|
|
|
24
22
|
See [CHANGELOG.md](CHANGELOG.md) for full history.
|
|
25
23
|
|
|
@@ -185,7 +183,7 @@ ai-toolkit/
|
|
|
185
183
|
│ └── ARCHITECTURE.md # Full system design
|
|
186
184
|
├── kb/ # Reference docs, procedures, plans
|
|
187
185
|
├── scripts/ # Validation, install, evaluation scripts
|
|
188
|
-
├── tests/ # Bats and Python test suite (
|
|
186
|
+
├── tests/ # Bats and Python test suite (1637 tests)
|
|
189
187
|
└── CHANGELOG.md
|
|
190
188
|
```
|
|
191
189
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "ai-toolkit",
|
|
4
4
|
"displayName": "AI Toolkit",
|
|
5
5
|
"description": "Professional-grade engineering skills, agents, rules, and lifecycle guardrails for Claude Code, Claude Chat, and Cowork.",
|
|
6
|
-
"version": "4.25.
|
|
6
|
+
"version": "4.25.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "SoftSpark",
|
|
9
9
|
"url": "https://github.com/softspark"
|
|
@@ -9,7 +9,6 @@ Stdlib only. No external dependencies.
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
import json
|
|
12
|
-
import os
|
|
13
12
|
import shutil
|
|
14
13
|
import subprocess
|
|
15
14
|
import sys
|
|
@@ -141,7 +140,7 @@ def run_audit(eco: dict, root: Path, fix: bool = False) -> dict:
|
|
|
141
140
|
except FileNotFoundError:
|
|
142
141
|
result["error"] = f"Tool '{eco['tool']}' not found in PATH"
|
|
143
142
|
except subprocess.TimeoutExpired:
|
|
144
|
-
result["error"] =
|
|
143
|
+
result["error"] = "Audit command timed out after 120s"
|
|
145
144
|
|
|
146
145
|
return result
|
|
147
146
|
|
|
@@ -168,6 +167,21 @@ def parse_npm_audit(raw: str) -> list[dict]:
|
|
|
168
167
|
"url": via.get("url", ""),
|
|
169
168
|
"fixed_in": info.get("fixAvailable", {}).get("version", "unknown") if isinstance(info.get("fixAvailable"), dict) else "unknown",
|
|
170
169
|
})
|
|
170
|
+
|
|
171
|
+
for advisory in data.get("advisories", {}).values():
|
|
172
|
+
installed_versions = sorted({
|
|
173
|
+
finding.get("version", "unknown")
|
|
174
|
+
for finding in advisory.get("findings", [])
|
|
175
|
+
})
|
|
176
|
+
findings.append({
|
|
177
|
+
"severity": advisory.get("severity", "unknown").upper(),
|
|
178
|
+
"package": advisory.get("module_name", "unknown"),
|
|
179
|
+
"installed": ", ".join(installed_versions) or "unknown",
|
|
180
|
+
"cve": advisory.get("cves", []) or [advisory.get("github_advisory_id", "N/A")],
|
|
181
|
+
"title": advisory.get("title", "Unknown"),
|
|
182
|
+
"url": advisory.get("url", ""),
|
|
183
|
+
"fixed_in": advisory.get("patched_versions", "unknown"),
|
|
184
|
+
})
|
|
171
185
|
return findings
|
|
172
186
|
|
|
173
187
|
|
|
@@ -3,9 +3,9 @@ title: "SOP: Post-Release Testing"
|
|
|
3
3
|
category: procedures
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [sop, post-release, smoke-test, npm, sandbox, plugin-pack, provenance, isolation]
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.2.0"
|
|
7
7
|
created: "2026-07-26"
|
|
8
|
-
last_updated: "2026-08-
|
|
8
|
+
last_updated: "2026-08-19"
|
|
9
9
|
description: "Smoke-test a published @softspark/ai-toolkit release from npm in an isolated HOME and npm prefix, without touching the maintainer's real install. Covers provenance, CLI, doctor, per-skill script resolution, scanner wiring, and the full plugin-pack lifecycle including the degraded-install path. Written for v4.18.0 and not run; v4.18.0 shipped a pack that broke every command it touched. First actually run on v4.22.0, which added Phases 4b and 4c after that release fixed four skills whose documented script path had never resolved and two that shipped a scanner nothing invoked."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -159,21 +159,30 @@ cat > "$FX/index.html" <<'EOF'
|
|
|
159
159
|
<!DOCTYPE html><html><head><title>t</title></head>
|
|
160
160
|
<body><h1>A</h1><h3>skipped h2</h3><img src="x.png"><input type="text"><div onclick="go()">click</div></body></html>
|
|
161
161
|
EOF
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
162
|
+
cat > "$FX/patient.py" <<'EOF'
|
|
163
|
+
patient = {"ssn": "123-45-6789", "diagnosis": "fixture"}
|
|
164
|
+
endpoint = "http://example.com/patient"
|
|
165
|
+
encrypt = False
|
|
166
|
+
EOF
|
|
167
|
+
printf '{"name":"fx","dependencies":{"lodash":"4.17.20","react":"18"}}\n' > "$FX/package.json"
|
|
168
|
+
npm install --package-lock-only --ignore-scripts --prefix "$FX"
|
|
169
|
+
|
|
170
|
+
D="$HOME/.claude/skills/a11y-validate"
|
|
171
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/a11y-scanner.py" "$FX" --output json </dev/null
|
|
172
|
+
D="$HOME/.claude/skills/seo-validate"
|
|
173
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/seo-scanner.py" "$FX" --output json </dev/null
|
|
174
|
+
D="$HOME/.claude/skills/hipaa-validate"
|
|
175
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/hipaa_scan.py" "$FX" --output json </dev/null
|
|
176
|
+
D="$HOME/.claude/skills/cve-scan"
|
|
177
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/cve_scan.py" "$FX" --json </dev/null
|
|
171
178
|
```
|
|
172
179
|
|
|
173
180
|
**Verify:**
|
|
174
181
|
- [ ] The scanner returns findings, not an empty set — the fixture has real defects
|
|
175
182
|
- [ ] Findings span more than one category, proving the whole check set ran
|
|
176
183
|
- [ ] A scanner that exits non-zero on findings is doing its job, not failing
|
|
184
|
+
- [ ] CVE output has `total_findings > 0`; raw npm advisories with an empty
|
|
185
|
+
normalized `findings` array are a parser failure, not a clean scan
|
|
177
186
|
|
|
178
187
|
`a11y-validate` and `seo-validate` shipped working scanners that **no step in
|
|
179
188
|
either skill invoked** for their entire life before v4.22.0. The model was told to
|
|
@@ -11,7 +11,7 @@ tags:
|
|
|
11
11
|
doc_type: reference
|
|
12
12
|
created: "2026-04-11"
|
|
13
13
|
last_updated: "2026-07-26"
|
|
14
|
-
description: "
|
|
14
|
+
description: "Configuration inheritance for ai-toolkit projects extends base settings from npm packages, Git URLs, or local paths. Defines merge semantics, enforcement rules, and CLI commands for validating and diffing configurations."
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
# Enterprise Config Inheritance Guide
|
package/llms-full.txt
CHANGED
|
@@ -7041,9 +7041,9 @@ title: "SOP: Post-Release Testing"
|
|
|
7041
7041
|
category: procedures
|
|
7042
7042
|
service: ai-toolkit
|
|
7043
7043
|
tags: [sop, post-release, smoke-test, npm, sandbox, plugin-pack, provenance, isolation]
|
|
7044
|
-
version: "1.
|
|
7044
|
+
version: "1.2.0"
|
|
7045
7045
|
created: "2026-07-26"
|
|
7046
|
-
last_updated: "2026-08-
|
|
7046
|
+
last_updated: "2026-08-19"
|
|
7047
7047
|
description: "Smoke-test a published @softspark/ai-toolkit release from npm in an isolated HOME and npm prefix, without touching the maintainer's real install. Covers provenance, CLI, doctor, per-skill script resolution, scanner wiring, and the full plugin-pack lifecycle including the degraded-install path. Written for v4.18.0 and not run; v4.18.0 shipped a pack that broke every command it touched. First actually run on v4.22.0, which added Phases 4b and 4c after that release fixed four skills whose documented script path had never resolved and two that shipped a scanner nothing invoked."
|
|
7048
7048
|
---
|
|
7049
7049
|
|
|
@@ -7197,21 +7197,30 @@ cat > "$FX/index.html" <<'EOF'
|
|
|
7197
7197
|
<!DOCTYPE html><html><head><title>t</title></head>
|
|
7198
7198
|
<body><h1>A</h1><h3>skipped h2</h3><img src="x.png"><input type="text"><div onclick="go()">click</div></body></html>
|
|
7199
7199
|
EOF
|
|
7200
|
-
|
|
7201
|
-
|
|
7202
|
-
|
|
7203
|
-
|
|
7204
|
-
|
|
7205
|
-
|
|
7206
|
-
|
|
7207
|
-
|
|
7208
|
-
|
|
7200
|
+
cat > "$FX/patient.py" <<'EOF'
|
|
7201
|
+
patient = {"ssn": "123-45-6789", "diagnosis": "fixture"}
|
|
7202
|
+
endpoint = "http://example.com/patient"
|
|
7203
|
+
encrypt = False
|
|
7204
|
+
EOF
|
|
7205
|
+
printf '{"name":"fx","dependencies":{"lodash":"4.17.20","react":"18"}}\n' > "$FX/package.json"
|
|
7206
|
+
npm install --package-lock-only --ignore-scripts --prefix "$FX"
|
|
7207
|
+
|
|
7208
|
+
D="$HOME/.claude/skills/a11y-validate"
|
|
7209
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/a11y-scanner.py" "$FX" --output json </dev/null
|
|
7210
|
+
D="$HOME/.claude/skills/seo-validate"
|
|
7211
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/seo-scanner.py" "$FX" --output json </dev/null
|
|
7212
|
+
D="$HOME/.claude/skills/hipaa-validate"
|
|
7213
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/hipaa_scan.py" "$FX" --output json </dev/null
|
|
7214
|
+
D="$HOME/.claude/skills/cve-scan"
|
|
7215
|
+
CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$D/scripts/cve_scan.py" "$FX" --json </dev/null
|
|
7209
7216
|
```
|
|
7210
7217
|
|
|
7211
7218
|
**Verify:**
|
|
7212
7219
|
- [ ] The scanner returns findings, not an empty set — the fixture has real defects
|
|
7213
7220
|
- [ ] Findings span more than one category, proving the whole check set ran
|
|
7214
7221
|
- [ ] A scanner that exits non-zero on findings is doing its job, not failing
|
|
7222
|
+
- [ ] CVE output has `total_findings > 0`; raw npm advisories with an empty
|
|
7223
|
+
normalized `findings` array are a parser failure, not a clean scan
|
|
7215
7224
|
|
|
7216
7225
|
`a11y-validate` and `seo-validate` shipped working scanners that **no step in
|
|
7217
7226
|
either skill invoked** for their entire life before v4.22.0. The model was told to
|
|
@@ -11046,7 +11055,7 @@ tags:
|
|
|
11046
11055
|
doc_type: reference
|
|
11047
11056
|
created: "2026-04-11"
|
|
11048
11057
|
last_updated: "2026-07-26"
|
|
11049
|
-
description: "
|
|
11058
|
+
description: "Configuration inheritance for ai-toolkit projects extends base settings from npm packages, Git URLs, or local paths. Defines merge semantics, enforcement rules, and CLI commands for validating and diffing configurations."
|
|
11050
11059
|
---
|
|
11051
11060
|
|
|
11052
11061
|
# Enterprise Config Inheritance Guide
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softspark/ai-toolkit",
|
|
3
|
-
"version": "4.25.
|
|
3
|
+
"version": "4.25.1",
|
|
4
4
|
"description": "AI coding toolkit: 109 skills, 44 agents, 12 developer-tool integrations, recoverable native tool-output filtering, Claude Chat/Cowork export, safety constitution, SARIF audit, and signed npm provenance.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|