@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 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: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Skills](https://img.shields.io/badge/skills-108-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-1445%20passing-success)](tests/)
9
+ [![Tests](https://img.shields.io/badge/tests-1465%20passing-success)](tests/)
10
10
 
11
- ## What's New in v4.17.0
11
+ ## What's New in v4.19.0
12
12
 
13
- v4.17.0 removes the native tool-output filter shipped in v4.16.0.
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
- - **Native tool-output filter removed**: measured whole-session token saving was 0.0000% on real traffic, because agent-issued commands are overwhelmingly compound and the filter only accepted simple registered shapes. The `PostToolUse` hook, the CLI, and the `toolOutputFilter` config key are gone.
16
- - **Automatic cleanup on update**: `ai-toolkit update` removes the orphaned hook script, the global and project policy files, and any stored recovery artifacts left by v4.16.x. Foreign files in those directories are preserved.
17
- - **Stricter config validation**: unknown top-level config keys are rejected, plugin manifests must declare `requires`, and lock files go stale on toolkit version bumps.
18
- - **GitHub Copilot compatibility reference**: new `kb/reference/copilot-compatibility.md` documenting the Copilot integration surface.
19
- - **Copilot remnant recovery**: asset-only `.github/skills/ai-toolkit-*` leftovers from older cleanups are rebuilt in place instead of aborting `install --local` / `update`.
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 (1445 tests)
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.17.0",
6
+ "version": "4.19.0",
7
7
  "author": {
8
8
  "name": "SoftSpark",
9
9
  "url": "https://github.com/softspark"
@@ -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
- - `security-pack`
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-26T11:36:57Z",
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": "1dd9e9f490e7103a",
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": "9a5cb995316c7c71",
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": "d373a3e4db1f4c79",
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": "d76db24ff58cb7ea",
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": "c6d93617f9359329",
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": "03145f425dd475d1",
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": "d57d379406804a4b",
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');