@softspark/ai-toolkit 4.17.0 → 4.19.0
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 +89 -0
- package/README.md +12 -10
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/plugins/README.md +16 -4
- package/benchmarks/ecosystem-doctor-snapshot.json +8 -8
- package/bin/ai-toolkit.js +16 -1
- package/kb/history/completed/rtk-pack-integration-20260726.md +710 -0
- package/kb/history/completed/rtk-pack-retirement-20260727.md +168 -0
- package/kb/procedures/maintenance-sop.md +1 -1
- package/kb/procedures/post-release-testing-sop.md +217 -0
- package/kb/procedures/release-preparation-sop.md +20 -7
- package/kb/reference/cli-reference.md +1 -1
- package/kb/reference/plugin-pack-conventions.md +26 -2
- package/llms-full.txt +1161 -11
- package/llms.txt +3 -0
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/audit_skills.py +21 -0
- package/scripts/generate_cursor_hooks.py +44 -0
- package/scripts/generate_gemini_hooks.py +44 -0
- package/scripts/install.py +14 -1
- package/scripts/plugin.py +403 -49
- package/scripts/uninstall.py +29 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,95 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## v4.19.0 — rtk-pack retired (2026-07-27)
|
|
11
|
+
|
|
12
|
+
### Removed
|
|
13
|
+
|
|
14
|
+
- **`rtk-pack`**, one day after it shipped. The first real install proved every
|
|
15
|
+
rewritten command failed with exit 127: rtk names itself bare in the rewrite
|
|
16
|
+
and the pack keeps its binary off `PATH` on purpose, so the shell could not
|
|
17
|
+
find it. `git`, `ls`, `cat`, `find`, `grep`, `diff` and the rest all died
|
|
18
|
+
before running. A second defect fetched the Intel build onto Apple Silicon,
|
|
19
|
+
because `platform.machine()` reports `x86_64` from a Rosetta-translated
|
|
20
|
+
Python. The pack's own `plugin status` reported both as green.
|
|
21
|
+
|
|
22
|
+
All three were fixed and tested before the decision. The measured saving was
|
|
23
|
+
0.0615% of input tokens against a kill number of 0.05%, a margin the
|
|
24
|
+
integration plan itself called "a pass, not a vindication", which does not
|
|
25
|
+
justify a supply-chain surface, a five-target cross-build workflow, an
|
|
26
|
+
upstream-sync SOP, and a hook that rewrites every command before it runs.
|
|
27
|
+
|
|
28
|
+
Full postmortem: `kb/history/completed/rtk-pack-retirement-20260727.md`.
|
|
29
|
+
- `.github/workflows/rtk-build.yml`, `scripts/verify_rtk_binary.py`,
|
|
30
|
+
`tests/test_rtk_pack.bats`, `tests/test_verify_rtk_binary.bats`,
|
|
31
|
+
`kb/procedures/rtk-upstream-sync-sop.md`, and the GitHub Release
|
|
32
|
+
`softspark-rtk-v0.44.0-1` holding the five cross-built binaries.
|
|
33
|
+
|
|
34
|
+
If you installed the pack under v4.18.0, run
|
|
35
|
+
`ai-toolkit plugin remove rtk-pack`.
|
|
36
|
+
|
|
37
|
+
### Kept
|
|
38
|
+
|
|
39
|
+
Everything the pack work built underneath it, none of which is rtk-specific:
|
|
40
|
+
pack hook wiring for Cursor and Gemini, `supported_editors` in the manifest,
|
|
41
|
+
generic `plugin status` dispatch to a pack's own `scripts/status.py`,
|
|
42
|
+
version-aware `plugin update`, and `audit_skills.py --ci` plus the ShellCheck
|
|
43
|
+
gate covering `app/plugins/`.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## v4.18.0 — rtk-pack, an opt-in command rewriter (2026-07-26)
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
|
|
51
|
+
- **`rtk-pack`**, an opt-in plugin pack that rewrites Bash commands at
|
|
52
|
+
`PreToolUse` via [rtk](https://github.com/rtk-ai/rtk) (Apache-2.0). Nothing
|
|
53
|
+
installs it for you. `ai-toolkit plugin install rtk-pack` fetches a
|
|
54
|
+
platform-specific binary from an ai-toolkit GitHub Release and verifies its
|
|
55
|
+
SHA-256 before installing anything; a mismatch aborts and leaves nothing
|
|
56
|
+
behind. Read `app/plugins/rtk-pack/README.md` before enabling it: the rewrite
|
|
57
|
+
means what runs is not literally what the model asked for, and rtk applies
|
|
58
|
+
your permission verdict for the original command to the rewritten one.
|
|
59
|
+
- **`.github/workflows/rtk-build.yml`**, a manual-dispatch pipeline that
|
|
60
|
+
cross-builds rtk from upstream source for five targets with the compile-time
|
|
61
|
+
telemetry endpoint left undefined, proves each artifact starts, writes no
|
|
62
|
+
telemetry state and (on Linux) behaves identically with no network route,
|
|
63
|
+
then publishes checksummed artifacts with LICENSE and NOTICE.
|
|
64
|
+
- **`scripts/verify_rtk_binary.py`**, the silence verifier that pipeline uses.
|
|
65
|
+
A target it cannot start reports `inconclusive`, never `pass`.
|
|
66
|
+
- **`kb/procedures/rtk-upstream-sync-sop.md`**, the procedure for moving to a
|
|
67
|
+
newer upstream tag, including a re-measure gate and a published kill number.
|
|
68
|
+
- Plugin packs can now ship `scripts/status.py` and have `plugin status` pick it
|
|
69
|
+
up. This replaces a hardcoded `if name == "memory-pack"` branch, so any pack
|
|
70
|
+
can report its own health.
|
|
71
|
+
|
|
72
|
+
### Changed
|
|
73
|
+
|
|
74
|
+
- **`ai-toolkit update` now updates installed plugin packs.** It reads
|
|
75
|
+
`plugins.json` and runs the equivalent of `plugin update --all` for every
|
|
76
|
+
installed pack. `--local` leaves packs alone, since they are global.
|
|
77
|
+
- **`plugin update` is version-aware.** `plugins.json` records the pack version
|
|
78
|
+
installed per editor, and an update whose manifest version matches is a silent
|
|
79
|
+
no-op. Previously every update removed and reinstalled unconditionally, which
|
|
80
|
+
for a pack that downloads a binary meant refetching it every time. `--force`
|
|
81
|
+
overrides; `--dry-run` reports without acting. State written before versions
|
|
82
|
+
were tracked updates each pack exactly once.
|
|
83
|
+
- Plugin packs are now covered by `audit_skills.py --ci` and by the ShellCheck
|
|
84
|
+
gate in CI. Both previously scanned only `app/skills`, `app/agents` and
|
|
85
|
+
`app/hooks`, exempting the highest-risk code in the repo.
|
|
86
|
+
- A pack's install-time script may be named `init.py`; `init_db.py` still works.
|
|
87
|
+
Previously only the latter ran, so a pack using any other name installed
|
|
88
|
+
successfully while doing nothing.
|
|
89
|
+
|
|
90
|
+
### Fixed
|
|
91
|
+
|
|
92
|
+
- `plugin install` no longer aborts with `IsADirectoryError` when a pack ships a
|
|
93
|
+
subdirectory under `scripts/`.
|
|
94
|
+
- A failing pack init script now always reports, instead of printing nothing
|
|
95
|
+
when it exited non-zero with empty stderr.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
10
99
|
## v4.17.0 — Native tool-output filter removed (2026-07-26)
|
|
11
100
|
|
|
12
101
|
### Removed
|
package/README.md
CHANGED
|
@@ -6,17 +6,19 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](app/skills/)
|
|
8
8
|
[](app/agents/)
|
|
9
|
-
[](tests/)
|
|
10
10
|
|
|
11
|
-
## What's New in v4.
|
|
11
|
+
## What's New in v4.19.0
|
|
12
12
|
|
|
13
|
-
v4.
|
|
13
|
+
v4.19.0 removes `rtk-pack`. The pack that v4.18.0 shipped is gone; everything the work built underneath it stays.
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
- **
|
|
17
|
-
-
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
15
|
+
- **`rtk-pack` retired**: it broke every command it rewrote. rtk names itself bare in the rewrite, the pack kept its binary off `PATH` on purpose, and the result was exit 127 on `git`, `ls`, `cat`, `find`, `grep` and the rest. Measured value before the defect was 0.0615% of input tokens against a 0.05% kill number, so the fix was not worth the surface. See [the retirement note](kb/history/completed/rtk-pack-retirement-20260727.md).
|
|
16
|
+
- **Pack hook wiring for Cursor and Gemini stays**: packs write user-scope entries to `~/.cursor/hooks.json` and `~/.gemini/settings.json`, tagged per pack, and `plugin remove` takes only its own back out.
|
|
17
|
+
- **`ai-toolkit update` maintains installed packs**: it runs the equivalent of `plugin update --all`. Updates are version-aware, so a pack whose manifest has not moved is a silent no-op instead of a remove-and-reinstall.
|
|
18
|
+
- **Packs can report their own health**: `plugin status` picks up a pack's `scripts/status.py`, replacing a hardcoded per-pack branch.
|
|
19
|
+
- **Security gates cover packs**: `audit_skills.py --ci` and the ShellCheck gate now scan `app/plugins/`, which they previously skipped.
|
|
20
|
+
|
|
21
|
+
If you installed the pack under v4.18.0, run `ai-toolkit plugin remove rtk-pack`.
|
|
20
22
|
|
|
21
23
|
See [CHANGELOG.md](CHANGELOG.md) for full history.
|
|
22
24
|
|
|
@@ -143,7 +145,7 @@ See [CLI Reference](kb/reference/cli-reference.md) for all commands and options.
|
|
|
143
145
|
| `skills/` (knowledge) | 46 | Domain knowledge auto-loaded by agents (includes 13 `<lang>-rules` skills) |
|
|
144
146
|
| `agents/` | 44 | Specialized agents across 10 categories |
|
|
145
147
|
| `hooks/` | 28 entries / 14 events + statusLine | Quality gates, path safety, prompt governance, loop guard, session lifecycle |
|
|
146
|
-
| `plugins/` | 11 packs | Opt-in domain bundles (security, research, frontend, enterprise, 6 language packs) |
|
|
148
|
+
| `plugins/` | 11 packs | Opt-in domain bundles (security, research, frontend, enterprise, memory, 6 language packs) |
|
|
147
149
|
| `constitution.md` | 7 articles | Machine-enforced safety rules |
|
|
148
150
|
| `rules/` | auto-synced | Global/project rule files for Claude and other editors |
|
|
149
151
|
| `kb/` | reference docs | Architecture, procedures, and best practices |
|
|
@@ -166,7 +168,7 @@ ai-toolkit/
|
|
|
166
168
|
│ └── ARCHITECTURE.md # Full system design
|
|
167
169
|
├── kb/ # Reference docs, procedures, plans
|
|
168
170
|
├── scripts/ # Validation, install, evaluation scripts
|
|
169
|
-
├── tests/ # Bats and Python test suite (
|
|
171
|
+
├── tests/ # Bats and Python test suite (1494 tests)
|
|
170
172
|
└── CHANGELOG.md
|
|
171
173
|
```
|
|
172
174
|
|
|
@@ -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.
|
|
6
|
+
"version": "4.19.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "SoftSpark",
|
|
9
9
|
"url": "https://github.com/softspark"
|
package/app/plugins/README.md
CHANGED
|
@@ -17,10 +17,22 @@ Plugin packs can target:
|
|
|
17
17
|
These packs are not directly uploadable Claude app plugins. For Claude Chat,
|
|
18
18
|
Desktop, and Cowork use `ai-toolkit claude-app export`.
|
|
19
19
|
|
|
20
|
-
Current packs:
|
|
21
|
-
- `
|
|
22
|
-
- `research-pack`
|
|
23
|
-
- `frontend-pack`
|
|
20
|
+
Current packs (11):
|
|
21
|
+
- `csharp-pack`
|
|
24
22
|
- `enterprise-pack`
|
|
23
|
+
- `frontend-pack`
|
|
24
|
+
- `java-pack`
|
|
25
|
+
- `kotlin-pack`
|
|
26
|
+
- `memory-pack`
|
|
27
|
+
- `research-pack`
|
|
28
|
+
- `ruby-pack`
|
|
29
|
+
- `rust-pack`
|
|
30
|
+
- `security-pack`
|
|
31
|
+
- `swift-pack`
|
|
32
|
+
|
|
33
|
+
Every pack here is content: agents, skills, rules and hook scripts that ship in
|
|
34
|
+
this repository. None fetches a binary at install time. `rtk-pack` did, and was
|
|
35
|
+
retired in v4.19.0; see `kb/history/completed/rtk-pack-retirement-20260727.md`
|
|
36
|
+
before proposing another pack of that shape.
|
|
25
37
|
|
|
26
38
|
See `kb/reference/plugin-pack-conventions.md` for pack rules, validation, and adoption guidance.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"last_run": "2026-07-
|
|
2
|
+
"last_run": "2026-07-27T07:12:31Z",
|
|
3
3
|
"schema_version": 1,
|
|
4
4
|
"tools": {
|
|
5
5
|
"aider": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"augment": {
|
|
27
|
-
"docs_hash": "
|
|
27
|
+
"docs_hash": "b8b7ddbeaccd618d",
|
|
28
28
|
"headings": [
|
|
29
29
|
"Admin",
|
|
30
30
|
"Auggie CLI",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"claude-app": {
|
|
69
|
-
"docs_hash": "
|
|
69
|
+
"docs_hash": "1925050f50fb6fc3",
|
|
70
70
|
"headings": [
|
|
71
71
|
"Add global and folder instructions",
|
|
72
72
|
"Availability",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
109
|
"claude-code": {
|
|
110
|
-
"docs_hash": "
|
|
110
|
+
"docs_hash": "e85f8751f08026f0",
|
|
111
111
|
"headings": [
|
|
112
112
|
"Core concepts",
|
|
113
113
|
"Documentation Index",
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
"version": "2.1.220 (Claude Code)"
|
|
167
167
|
},
|
|
168
168
|
"cline": {
|
|
169
|
-
"docs_hash": "
|
|
169
|
+
"docs_hash": "3bbabe935a9e6ebb",
|
|
170
170
|
"headings": [
|
|
171
171
|
"API Reference",
|
|
172
172
|
"Best Practices",
|
|
@@ -364,7 +364,7 @@
|
|
|
364
364
|
}
|
|
365
365
|
},
|
|
366
366
|
"gemini-cli": {
|
|
367
|
-
"docs_hash": "
|
|
367
|
+
"docs_hash": "1149b358f401b6b3",
|
|
368
368
|
"headings": [
|
|
369
369
|
"Breadcrumbs",
|
|
370
370
|
"Directory actions",
|
|
@@ -444,7 +444,7 @@
|
|
|
444
444
|
}
|
|
445
445
|
},
|
|
446
446
|
"google-antigravity": {
|
|
447
|
-
"docs_hash": "
|
|
447
|
+
"docs_hash": "1e0c0d249231d2a9",
|
|
448
448
|
"headings": [],
|
|
449
449
|
"markers": {
|
|
450
450
|
"AGENTS.md": false,
|
|
@@ -520,7 +520,7 @@
|
|
|
520
520
|
}
|
|
521
521
|
},
|
|
522
522
|
"windsurf": {
|
|
523
|
-
"docs_hash": "
|
|
523
|
+
"docs_hash": "56080b3b62a1de8e",
|
|
524
524
|
"headings": [
|
|
525
525
|
"Accounts",
|
|
526
526
|
"Advanced",
|
package/bin/ai-toolkit.js
CHANGED
|
@@ -281,7 +281,7 @@ function showHelp() {
|
|
|
281
281
|
console.log(' remove --all Remove all installed plugins');
|
|
282
282
|
console.log(' list Show available plugin packs with install status');
|
|
283
283
|
console.log(' status Show currently installed plugins with data stats');
|
|
284
|
-
console.log(' --editor <list> Runtime target: claude, codex, or all (default: claude)');
|
|
284
|
+
console.log(' --editor <list> Runtime target: claude, codex, cursor, gemini, or all (default: claude)');
|
|
285
285
|
console.log('\nOptions for claude-app:');
|
|
286
286
|
console.log(' export [--output FILE] [--no-custom-rules] [--verify]');
|
|
287
287
|
console.log(' Build a ZIP for Customize > Plugins and Cowork instructions');
|
|
@@ -574,6 +574,21 @@ function handleUpdate(args) {
|
|
|
574
574
|
// User-provided args override state-derived args
|
|
575
575
|
run(scriptPath('install.py'), [...stateArgs, ...args]);
|
|
576
576
|
|
|
577
|
+
// Installed plugin packs live under ~/.softspark/ai-toolkit and are global,
|
|
578
|
+
// so --local (project-local config only) leaves them alone. The wiring is
|
|
579
|
+
// generic: plugin.py decides per pack whether anything changed and stays
|
|
580
|
+
// silent when nothing has, so this adds no noise for the common case.
|
|
581
|
+
if (!isLocal) {
|
|
582
|
+
const pluginArgs = ['update', '--editor', 'all', '--all'];
|
|
583
|
+
if (isDryRun) pluginArgs.push('--dry-run');
|
|
584
|
+
try {
|
|
585
|
+
run(scriptPath('plugin.py'), pluginArgs);
|
|
586
|
+
} catch (_err) {
|
|
587
|
+
// A pack update never fails the core update that already succeeded.
|
|
588
|
+
console.warn('WARN: plugin pack update skipped');
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
577
592
|
// After global update (not --local), propagate to all registered projects
|
|
578
593
|
if (!isLocal && !isDryRun) {
|
|
579
594
|
const registryPath = path.join(process.env.HOME, '.softspark', 'ai-toolkit', 'projects.json');
|