@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 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: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
7
7
  [![Skills](https://img.shields.io/badge/skills-109-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-1636%20passing-success)](tests/)
9
+ [![Tests](https://img.shields.io/badge/tests-1637%20passing-success)](tests/)
10
10
 
11
- ## What's New in v4.25.0
11
+ ## What's New in v4.25.1
12
12
 
13
- **v4.25.0** brings the editor integrations onto their current native surfaces:
13
+ **v4.25.1** fixes the CVE scanner path exercised by the published-package smoke test:
14
14
 
15
- - Codex gets its exact 11-event hook contract and a deterministic native plugin
16
- exporter with offline verification.
17
- - Google Antigravity gets native hooks, agents, plugin packaging, MCP mapping,
18
- and local/global install profiles.
19
- - Gemini gains native agents, OpenCode gains native skill directories, and Cline
20
- gains native rules plus its exact 8-event hook lifecycle.
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 (1636 tests)
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.0",
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"] = f"Audit command timed out after 120s"
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.1.0"
6
+ version: "1.2.0"
7
7
  created: "2026-07-26"
8
- last_updated: "2026-08-06"
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
- printf '{"name":"fx","dependencies":{"react":"18"}}\n' > "$FX/package.json"
163
-
164
- for s in a11y-validate seo-validate hipaa-validate cve-scan; do
165
- D="$HOME/.claude/skills/$s"
166
- script=$(ls "$D"/scripts/*.py 2>/dev/null | head -1)
167
- [ -n "$script" ] || continue
168
- echo "=== $s ==="
169
- CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$script" "$FX" --output json </dev/null 2>&1 | head -3
170
- done
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: "Comprehensive guide for setting up and using ai-toolkit configuration inheritance. Covers base config creation, project setup, enforcement rules, CI integration, and troubleshooting."
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.1.0"
7044
+ version: "1.2.0"
7045
7045
  created: "2026-07-26"
7046
- last_updated: "2026-08-06"
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
- printf '{"name":"fx","dependencies":{"react":"18"}}\n' > "$FX/package.json"
7201
-
7202
- for s in a11y-validate seo-validate hipaa-validate cve-scan; do
7203
- D="$HOME/.claude/skills/$s"
7204
- script=$(ls "$D"/scripts/*.py 2>/dev/null | head -1)
7205
- [ -n "$script" ] || continue
7206
- echo "=== $s ==="
7207
- CLAUDE_SKILL_DIR="$D" timeout 60 python3 "$script" "$FX" --output json </dev/null 2>&1 | head -3
7208
- done
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: "Comprehensive guide for setting up and using ai-toolkit configuration inheritance. Covers base config creation, project setup, enforcement rules, CI integration, and troubleshooting."
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
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.25.0",
2
+ "version": "4.25.1",
3
3
  "components": {
4
4
  "agents": {
5
5
  "description": "44 specialized agents (orchestrator, backend, frontend, security, devops, etc.)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softspark/ai-toolkit",
3
- "version": "4.25.0",
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",