@softspark/ai-toolkit 4.31.0 → 4.32.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/README.md +26 -19
  3. package/app/.claude-plugin/plugin.json +1 -1
  4. package/app/claude-app/hooks/hooks.json +4 -2
  5. package/app/claude-app/skills/ai-toolkit-rules/SKILL.md +30 -16
  6. package/app/hooks/quality-gate.sh +9 -2
  7. package/app/hooks.json +4 -2
  8. package/app/rules/common/git-team.md +33 -0
  9. package/app/rules/common/git-workflow.md +6 -20
  10. package/app/rules/common/performance.md +25 -1
  11. package/app/rules/common/testing.md +7 -1
  12. package/benchmarks/ecosystem-doctor-snapshot.json +17 -15
  13. package/bin/ai-toolkit.js +2 -0
  14. package/kb/procedures/sop-maintenance.md +6 -3
  15. package/kb/reference/cli-reference.md +3 -2
  16. package/kb/reference/global-install-model.md +16 -3
  17. package/kb/reference/hooks-catalog.md +5 -3
  18. package/kb/reference/language-rules.md +28 -10
  19. package/kb/reference/unique-features.md +2 -1
  20. package/llms-full.txt +60 -22
  21. package/manifest.json +2 -2
  22. package/package.json +5 -2
  23. package/scripts/benchmark_ecosystem.py +0 -1
  24. package/scripts/check_split.py +11 -9
  25. package/scripts/claude_app.py +5 -7
  26. package/scripts/codex_skill_adapter.py +4 -12
  27. package/scripts/compile_slm.py +10 -26
  28. package/scripts/doctor.py +322 -0
  29. package/scripts/evaluate_skills.py +1 -1
  30. package/scripts/frontmatter.py +452 -29
  31. package/scripts/generate_augment_rules.py +4 -4
  32. package/scripts/generate_cursor_mdc.py +2 -3
  33. package/scripts/generate_language_rules_skills.py +8 -14
  34. package/scripts/generate_llms_txt.py +1 -15
  35. package/scripts/generate_opencode_agents.py +0 -1
  36. package/scripts/generate_opencode_skills.py +2 -20
  37. package/scripts/generate_windsurf_rules.py +0 -1
  38. package/scripts/generator_base.py +0 -1
  39. package/scripts/inject_hook_cli.py +15 -2
  40. package/scripts/inject_mcp_cli.py +1 -2
  41. package/scripts/install.py +32 -1
  42. package/scripts/install_git_hooks.py +0 -1
  43. package/scripts/install_steps/ai_tools.py +65 -25
  44. package/scripts/install_steps/markers.py +6 -6
  45. package/scripts/install_steps/skill_scope.py +188 -0
  46. package/scripts/instruction_core.py +5 -8
  47. package/scripts/merge-hooks.py +13 -3
  48. package/scripts/pack_codebase.py +1 -1
  49. package/scripts/surface_manifest.py +6 -7
  50. package/scripts/validate.py +180 -11
package/CHANGELOG.md CHANGED
@@ -7,6 +7,95 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v4.32.0 - Context budget: scoped rules, scoped language skills, doctor budget checks (2026-09-04)
11
+
12
+ ### Added
13
+
14
+ - **`install --language-skills detected|all`.** Language knowledge skills
15
+ (`<lang>-rules`, `<lang>-patterns`) for languages no registered project uses
16
+ are turned off through `skillOverrides` in `~/.claude/settings.json`. The
17
+ entries the toolkit wrote are tracked in `state.json` and restored when a
18
+ newly registered project brings the language back; a user's own override is
19
+ never touched; with no registered project on disk nothing is disabled. `all`
20
+ restores everything and persists the choice.
21
+ - **`doctor` check 12, Context Budget.** Estimated resident tokens of the
22
+ model-visible skill listing (against `skillListingBudgetFraction`), the agent
23
+ listing, and always-loaded user memory, plus skills with zero recorded use in
24
+ both Claude Code's counters and the toolkit's `stats.json`. Read-only; prints
25
+ the `skillOverrides` key to paste.
26
+ - **`doctor` check 13, Permission Rules.** Warns on `permissions.allow`
27
+ wildcards that pre-approve execution or writes: interpreters, task runners,
28
+ package installs, `gh api`, `curl`/`wget`, `git fetch`/`pull`, destructive
29
+ commands, `find -exec`. Never edits.
30
+ - **`validate.py` skill description budget.** Error over 1024 characters (the
31
+ Agent Skills cap), warning over 400, and an error for an unquoted description
32
+ containing `: ` or ` #` (strict YAML drops every field, `allowed-tools`
33
+ included). Applied to plugin-pack skills too.
34
+ - **`git-team` common rule.** Branching, pull-request, and review conventions
35
+ moved out of `git-workflow` into a rule that ships with `--profile strict`
36
+ only, via a new `profiles:` frontmatter gate. See `DECISIONS.md`.
37
+ - **One frontmatter parser.** `scripts/frontmatter.py` now parses the whole
38
+ toolkit subset (scalars, quoted scalars, `>-`/`|` blocks, block and flow
39
+ lists, nested maps) strictly and is the only parser; twelve private
40
+ strip/parse copies in `validate.py`, `doctor.py`, `install_steps/ai_tools.py`,
41
+ `claude_app.py`, `compile_slm.py`, `surface_manifest.py`, `instruction_core.py`,
42
+ `check_split.py`, `codex_skill_adapter.py`, `generate_opencode_skills.py`, and
43
+ `generate_language_rules_skills.py` are gone. Every shipped `app/` and `kb/`
44
+ Markdown file parses under the strict grammar (pytest corpus test).
45
+ - **Repo dev tooling, stdlib runtime.** `requirements-dev.txt` + `pytest.ini`
46
+ + `mypy.ini` (pytest, ruff, mypy) and a `python-quality` CI job:
47
+ `npm run test:py` (348 pytest tests under `tests/python/`), `npm run lint:py`
48
+ (ruff `E,F`, rule set in `package.json`), `npm run typecheck:py` (mypy
49
+ `--strict` over an allowlist). No `pyproject.toml`: the toolkit's own
50
+ `quality-gate.sh` reads one as "Python project, run `ruff check .`", which
51
+ is not what an npm-first repo wants. Nothing is added to the published
52
+ package or to user machines. See `DECISIONS.md` for why no runtime
53
+ dependency.
54
+
55
+ ### Changed
56
+
57
+ - **Common rules are path-scoped from their source.** `app/rules/common/*.md`
58
+ may declare `paths:`; the generated `.claude/rules/ai-toolkit-*.md` copies it.
59
+ `testing` and `performance` load only for matching files; `coding-style`,
60
+ `git-workflow`, and `security` stay always-on. The `.claude/CLAUDE.md` index
61
+ now lists which rules are always-on and which are path-scoped instead of
62
+ claiming lazy loading for all of them.
63
+ - **Stop hooks `quality-check.sh` and `save-session.sh` run with
64
+ `"async": true`.** Both are advisory and always exit 0; the linter was the
65
+ bulk of a 3.3 s median Stop chain. `quality-gate.sh` (exit 2) and
66
+ `stop-search-check.sh` stay synchronous.
67
+ - **`git-workflow` is the solo-safe core** (commit format, no secrets, `main`
68
+ deployable, tags, recovery). Version 2.0.0.
69
+
70
+ ### Fixed
71
+
72
+ - **`quality-gate.sh` runs ruff only for projects that configured it.** A bare
73
+ `pyproject.toml` (build metadata, pytest/mypy tables) used to trigger
74
+ `ruff check .` on every Stop under whatever ruff configuration the machine
75
+ resolves; found when this repository's own gate went red on 348 unrelated
76
+ findings. Ruff now needs `ruff.toml`, `.ruff.toml`, or a `[tool.ruff]` table.
77
+ - **Codex/DSH skill sync no longer flattens nested frontmatter.** Native
78
+ (non-adapted) skills had their frontmatter re-rendered line by line, which
79
+ turned a `hooks:` block into stray top-level `PreToolUse:` / `- matcher:`
80
+ lines. The frontmatter now passes through verbatim.
81
+ - **Hook merge de-duplicates legacy untagged toolkit hooks by command identity.**
82
+ Scheduling fields (`async`, `timeout`, `statusMessage`, ...) no longer defeat
83
+ the match, so adding one in `app/hooks.json` does not leave existing installs
84
+ running the old and the new copy side by side. Fixed in both
85
+ `scripts/merge-hooks.py` and `scripts/inject_hook_cli.py`.
86
+ - **Test count.** Bats increased from 1931 to 1966; 348 pytest tests added under
87
+ `tests/python/` (run by the new `python-quality` CI job).
88
+
89
+ ### Ecosystem
90
+
91
+ - Ecosystem doctor run for this minor release: 12 tools drifted since the
92
+ v4.30.3 snapshot, all class A (content edits with no heading delta) or class
93
+ C (Cline gained a "Resources" heading, Codex CLI a "ChatGPT Work" heading;
94
+ neither adds a surface the toolkit integrates). Tracked versions moved:
95
+ Claude Code 2.1.252 -> 2.1.260 (its hooks documentation now lists the
96
+ `async` command-hook field this release relies on), Codex CLI 0.151.0 ->
97
+ 0.153.2. No generator changed; snapshot refreshed.
98
+
10
99
  ## v4.31.0 - Toolkit rules reach every editor (2026-09-03)
11
100
 
12
101
  ### Added
package/README.md CHANGED
@@ -6,25 +6,30 @@
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-114-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-1931%20passing-success)](tests/)
10
-
11
- ## What's New in v4.31.0
12
-
13
- **v4.31.0** corrects the post-release health check for the managed DSH and
14
- plugin-owned MCP release:
15
-
16
- - `ai-toolkit doctor` now extracts `1.0.80` from the official Copilot CLI output
17
- `GitHub Copilot CLI 1.0.80.` instead of treating sentence punctuation as an
18
- invalid SemVer suffix.
19
- - Complete-token validation remains fail closed for malformed versions such as
20
- `1.2.3.4`, invalid prerelease identifiers, and leading-zero numeric fields.
21
- - The DSH cold-add regression keeps its legacy-timeout coverage with macOS CI
22
- process-startup headroom, removing the release-blocking timing flake.
23
- - Release tags now require green Ubuntu and macOS branch CI for the exact commit
24
- before the publish workflow can start.
25
- - The release retains the explicit DSH lifecycle, plugin-owned MCP/rules, portable
26
- recovery gates, and the exact DSH package set published in v4.30.2. Test count:
27
- 1920 -> 1931.
9
+ [![Tests](https://img.shields.io/badge/tests-1966%20passing-success)](tests/)
10
+
11
+ ## What's New in v4.32.0
12
+
13
+ **v4.32.0** cuts what every session pays for before you type, and adds the
14
+ checks that keep it cut:
15
+
16
+ - Common rules are path-scoped from their source: `testing` and `performance`
17
+ load only for matching files, and the project `.claude/CLAUDE.md` index says
18
+ which rules are always-on instead of claiming lazy loading for all of them.
19
+ - Language knowledge skills follow your projects: `install --language-skills
20
+ detected` (default) turns off `<lang>-rules`/`<lang>-patterns` skills for
21
+ languages no registered project uses, reversibly, and restores them when a
22
+ project brings the language back.
23
+ - `ai-toolkit doctor` gains a Context Budget check (est. resident tokens,
24
+ zero-use skills) and a Permission Rules check (over-broad `permissions.allow`
25
+ wildcards). Both read-only.
26
+ - One strict frontmatter parser replaces twelve private copies; `validate.py`
27
+ now rejects descriptions over 1024 characters or unquoted ones containing
28
+ `: `. Every shipped Markdown file parses under the strict grammar.
29
+ - Team-only git conventions moved to a `git-team` rule that ships with
30
+ `--profile strict`; `quality-gate.sh` lints with ruff only when the project
31
+ configured ruff; advisory Stop hooks run in the background. Test count:
32
+ 1931 -> 1966 bats + 348 pytest.
28
33
 
29
34
  See [CHANGELOG.md](CHANGELOG.md) for full history.
30
35
 
@@ -62,6 +67,8 @@ npx @softspark/ai-toolkit install
62
67
 
63
68
  **That's it.** Claude Code picks up 114 skills, 44 agents, quality hooks, and the safety constitution automatically.
64
69
 
70
+ Language knowledge skills (`rust-rules`, `kotlin-patterns`, ...) are scoped to the languages your registered projects use: once you have run `ai-toolkit install --local` in at least one project, the global install turns the other languages' skills off through `skillOverrides` in `~/.claude/settings.json` so their descriptions stop loading into every session. A new project in a new language turns its skills back on. `ai-toolkit install --language-skills all` keeps every language skill on and remembers that choice; `ai-toolkit doctor` shows the resulting context budget.
71
+
65
72
  **Windows:** WSL is the recommended runtime. Native Windows works when Git Bash is available for hook scripts; dependency hints cover `winget`, Chocolatey, and Scoop. See [Windows Support](kb/reference/windows-support.md).
66
73
 
67
74
  ### Update
@@ -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.31.0",
6
+ "version": "4.32.0",
7
7
  "author": {
8
8
  "name": "SoftSpark",
9
9
  "url": "https://github.com/softspark"
@@ -151,7 +151,8 @@
151
151
  "hooks": [
152
152
  {
153
153
  "type": "command",
154
- "command": "AI_TOOLKIT_DIR=\"${CLAUDE_PLUGIN_ROOT}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/quality-check.sh\""
154
+ "command": "AI_TOOLKIT_DIR=\"${CLAUDE_PLUGIN_ROOT}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/quality-check.sh\"",
155
+ "async": true
155
156
  }
156
157
  ]
157
158
  },
@@ -160,7 +161,8 @@
160
161
  "hooks": [
161
162
  {
162
163
  "type": "command",
163
- "command": "AI_TOOLKIT_DIR=\"${CLAUDE_PLUGIN_ROOT}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/save-session.sh\""
164
+ "command": "AI_TOOLKIT_DIR=\"${CLAUDE_PLUGIN_ROOT}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/save-session.sh\"",
165
+ "async": true
164
166
  }
165
167
  ]
166
168
  },
@@ -207,27 +207,22 @@ Default response mode for this project is **concise**. The `brand-voice` skill (
207
207
  - Magic numbers/strings: use named constants.
208
208
  - Mutable global state: use dependency injection instead.
209
209
 
210
- ## Source: `app/rules/common/git-workflow.md`
211
-
212
- # Git Workflow Rules
210
+ ## Source: `app/rules/common/git-team.md`
213
211
 
214
- ## Commit Messages
215
- - Use conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`.
216
- - First line: imperative mood, max 72 chars (`feat: add user registration endpoint`).
217
- - Body (optional): explain *why*, not *what*. The diff shows what.
218
- - Reference tickets: `fix: prevent duplicate orders (PROJ-456)`.
212
+ # Git Team Workflow Rules
219
213
 
220
- ## Commit Practices
221
- - Commit small, atomic changes. One commit = one logical change.
222
- - Never commit: secrets, `.env` files, build artifacts, large binaries.
223
- - Never commit broken code to `main`. Use feature branches.
224
- - Squash fixup commits before merging to keep history clean.
214
+ These rules assume more than one person merges into `main`. They ship only with
215
+ the `strict` profile; a solo maintainer who commits straight to `main` is not
216
+ doing anything wrong, and a reviewer that keeps flagging "use a feature branch"
217
+ in that setting is noise. The solo-safe core (commit format, no secrets, no
218
+ force-push) lives in `git-workflow`.
225
219
 
226
220
  ## Branching
227
- - `main` is always deployable. Protect it with required reviews and CI.
228
- - Feature branches: `feat/user-registration`, `fix/order-total-calc`.
221
+ - Protect `main` with required reviews and CI. Never commit broken code to it.
222
+ - Work on feature branches: `feat/user-registration`, `fix/order-total-calc`.
223
+ - Rebase feature branches on `main` before opening a PR to keep linear history.
224
+ - Squash fixup commits before merging to keep history clean.
229
225
  - Delete branches after merge. Stale branches are clutter.
230
- - Rebase feature branches on main before PR to keep linear history.
231
226
 
232
227
  ## Pull Requests
233
228
  - Keep PRs small: <400 lines changed. Split large features into stacked PRs.
@@ -240,6 +235,25 @@ Default response mode for this project is **concise**. The `brand-voice` skill (
240
235
  - Approve with comments if nits only. Block for: bugs, security, missing tests.
241
236
  - Respond to reviews within 24 hours. Do not let PRs rot.
242
237
 
238
+ ## Source: `app/rules/common/git-workflow.md`
239
+
240
+ # Git Workflow Rules
241
+
242
+ Solo-safe core: everything here holds whether one person or twenty merge into
243
+ `main`. Branching, pull-request, and review conventions for teams live in
244
+ `git-team` and ship only with the `strict` profile.
245
+
246
+ ## Commit Messages
247
+ - Use conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`.
248
+ - First line: imperative mood, max 72 chars (`feat: add user registration endpoint`).
249
+ - Body (optional): explain *why*, not *what*. The diff shows what.
250
+ - Reference tickets: `fix: prevent duplicate orders (PROJ-456)`.
251
+
252
+ ## Commit Practices
253
+ - Commit small, atomic changes. One commit = one logical change.
254
+ - Never commit: secrets, `.env` files, build artifacts, large binaries.
255
+ - `main` is always deployable: run the project's gates before every commit that lands there.
256
+
243
257
  ## Tags and Releases
244
258
  - Use semantic versioning: MAJOR.MINOR.PATCH.
245
259
  - Tag releases: `git tag v1.2.3`. Automate changelog from commits.
@@ -98,8 +98,15 @@ if [ -f .claude/test-cohesion-map.json ] || \
98
98
  fi
99
99
 
100
100
  if [ -f pyproject.toml ] || [ -f setup.py ]; then
101
- if require_command ruff; then
102
- run_required "ruff found errors" "head -30" ruff check .
101
+ # Lint only what the project itself configured. A bare pyproject.toml
102
+ # (build metadata, pytest/mypy tables) says nothing about ruff, and running
103
+ # `ruff check .` under whatever config the machine resolves turns the Stop
104
+ # gate red on findings the project never signed up for (v4.32.0 postmortem:
105
+ # 348 findings in a repo whose ruff rule set lives in a package.json script).
106
+ if [ -f ruff.toml ] || [ -f .ruff.toml ] || grep -qs '^\[tool\.ruff' pyproject.toml; then
107
+ if require_command ruff; then
108
+ run_required "ruff found errors" "head -30" ruff check .
109
+ fi
103
110
  fi
104
111
  if [ -d src ] && [ "$PROFILE" = "strict" ]; then
105
112
  if require_command mypy; then
package/app/hooks.json CHANGED
@@ -167,7 +167,8 @@
167
167
  "hooks": [
168
168
  {
169
169
  "type": "command",
170
- "command": "\"$HOME/.softspark/ai-toolkit/hooks/quality-check.sh\""
170
+ "command": "\"$HOME/.softspark/ai-toolkit/hooks/quality-check.sh\"",
171
+ "async": true
171
172
  }
172
173
  ]
173
174
  },
@@ -177,7 +178,8 @@
177
178
  "hooks": [
178
179
  {
179
180
  "type": "command",
180
- "command": "\"$HOME/.softspark/ai-toolkit/hooks/save-session.sh\""
181
+ "command": "\"$HOME/.softspark/ai-toolkit/hooks/save-session.sh\"",
182
+ "async": true
181
183
  }
182
184
  ]
183
185
  },
@@ -0,0 +1,33 @@
1
+ ---
2
+ language: common
3
+ category: git-team
4
+ version: "1.0.0"
5
+ profiles:
6
+ - "strict"
7
+ ---
8
+
9
+ # Git Team Workflow Rules
10
+
11
+ These rules assume more than one person merges into `main`. They ship only with
12
+ the `strict` profile; a solo maintainer who commits straight to `main` is not
13
+ doing anything wrong, and a reviewer that keeps flagging "use a feature branch"
14
+ in that setting is noise. The solo-safe core (commit format, no secrets, no
15
+ force-push) lives in `git-workflow`.
16
+
17
+ ## Branching
18
+ - Protect `main` with required reviews and CI. Never commit broken code to it.
19
+ - Work on feature branches: `feat/user-registration`, `fix/order-total-calc`.
20
+ - Rebase feature branches on `main` before opening a PR to keep linear history.
21
+ - Squash fixup commits before merging to keep history clean.
22
+ - Delete branches after merge. Stale branches are clutter.
23
+
24
+ ## Pull Requests
25
+ - Keep PRs small: <400 lines changed. Split large features into stacked PRs.
26
+ - PR title follows conventional commit format.
27
+ - Include: summary, test plan, and screenshots/recordings for UI changes.
28
+ - Require at least one approval before merge.
29
+
30
+ ## Code Review
31
+ - Review for: correctness, security, performance, readability.
32
+ - Approve with comments if nits only. Block for: bugs, security, missing tests.
33
+ - Respond to reviews within 24 hours. Do not let PRs rot.
@@ -1,11 +1,15 @@
1
1
  ---
2
2
  language: common
3
3
  category: git-workflow
4
- version: "1.0.0"
4
+ version: "2.0.0"
5
5
  ---
6
6
 
7
7
  # Git Workflow Rules
8
8
 
9
+ Solo-safe core: everything here holds whether one person or twenty merge into
10
+ `main`. Branching, pull-request, and review conventions for teams live in
11
+ `git-team` and ship only with the `strict` profile.
12
+
9
13
  ## Commit Messages
10
14
  - Use conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`.
11
15
  - First line: imperative mood, max 72 chars (`feat: add user registration endpoint`).
@@ -15,25 +19,7 @@ version: "1.0.0"
15
19
  ## Commit Practices
16
20
  - Commit small, atomic changes. One commit = one logical change.
17
21
  - Never commit: secrets, `.env` files, build artifacts, large binaries.
18
- - Never commit broken code to `main`. Use feature branches.
19
- - Squash fixup commits before merging to keep history clean.
20
-
21
- ## Branching
22
- - `main` is always deployable. Protect it with required reviews and CI.
23
- - Feature branches: `feat/user-registration`, `fix/order-total-calc`.
24
- - Delete branches after merge. Stale branches are clutter.
25
- - Rebase feature branches on main before PR to keep linear history.
26
-
27
- ## Pull Requests
28
- - Keep PRs small: <400 lines changed. Split large features into stacked PRs.
29
- - PR title follows conventional commit format.
30
- - Include: summary, test plan, and screenshots/recordings for UI changes.
31
- - Require at least one approval before merge.
32
-
33
- ## Code Review
34
- - Review for: correctness, security, performance, readability.
35
- - Approve with comments if nits only. Block for: bugs, security, missing tests.
36
- - Respond to reviews within 24 hours. Do not let PRs rot.
22
+ - `main` is always deployable: run the project's gates before every commit that lands there.
37
23
 
38
24
  ## Tags and Releases
39
25
  - Use semantic versioning: MAJOR.MINOR.PATCH.
@@ -1,7 +1,31 @@
1
1
  ---
2
2
  language: common
3
3
  category: performance
4
- version: "1.0.0"
4
+ version: "1.1.0"
5
+ paths:
6
+ - "**/*.py"
7
+ - "**/*.ts"
8
+ - "**/*.tsx"
9
+ - "**/*.js"
10
+ - "**/*.jsx"
11
+ - "**/*.mjs"
12
+ - "**/*.cjs"
13
+ - "**/*.go"
14
+ - "**/*.rs"
15
+ - "**/*.java"
16
+ - "**/*.kt"
17
+ - "**/*.kts"
18
+ - "**/*.swift"
19
+ - "**/*.dart"
20
+ - "**/*.cs"
21
+ - "**/*.php"
22
+ - "**/*.cpp"
23
+ - "**/*.cc"
24
+ - "**/*.cxx"
25
+ - "**/*.hpp"
26
+ - "**/*.h"
27
+ - "**/*.rb"
28
+ - "**/*.sql"
5
29
  ---
6
30
 
7
31
  # Universal Performance Rules
@@ -1,7 +1,13 @@
1
1
  ---
2
2
  language: common
3
3
  category: testing
4
- version: "1.0.0"
4
+ version: "1.1.0"
5
+ paths:
6
+ - "**/*.test.*"
7
+ - "**/*.spec.*"
8
+ - "**/test_*"
9
+ - "**/*_test.*"
10
+ - "**/tests/**"
5
11
  ---
6
12
 
7
13
  # Universal Testing Rules
@@ -1,5 +1,5 @@
1
1
  {
2
- "last_run": "2026-09-01T07:58:08Z",
2
+ "last_run": "2026-09-04T08:36:45Z",
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": "83f1458d1a2060e9",
27
+ "docs_hash": "0e91c48495240138",
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": "273703f5030fd2ab",
69
+ "docs_hash": "4ba2582ffb78c262",
70
70
  "headings": [
71
71
  "Add global and folder instructions",
72
72
  "Availability",
@@ -108,7 +108,7 @@
108
108
  }
109
109
  },
110
110
  "claude-code": {
111
- "docs_hash": "eea5867f24e1ed91",
111
+ "docs_hash": "10fe9c9fa45efb7a",
112
112
  "headings": [
113
113
  "Core concepts",
114
114
  "Documentation Index",
@@ -174,10 +174,10 @@
174
174
  "userConfig": false,
175
175
  "workflows": true
176
176
  },
177
- "version": "2.1.252 (Claude Code)"
177
+ "version": "2.1.260 (Claude Code)"
178
178
  },
179
179
  "cline": {
180
- "docs_hash": "13a2b874f0e0173c",
180
+ "docs_hash": "53d71ba66743ef56",
181
181
  "headings": [
182
182
  "API Reference",
183
183
  "Best Practices",
@@ -195,6 +195,7 @@
195
195
  "Kanban",
196
196
  "Observability",
197
197
  "On this page",
198
+ "Resources",
198
199
  "SDK",
199
200
  "Security &amp; Governance",
200
201
  "Team Management",
@@ -224,7 +225,7 @@
224
225
  }
225
226
  },
226
227
  "codex-cli": {
227
- "docs_hash": "f7df4a0b9f583a2e",
228
+ "docs_hash": "5444e9c3b6b4d284",
228
229
  "headings": [
229
230
  "API",
230
231
  "API Reference",
@@ -241,6 +242,7 @@
241
242
  "Build with Codex",
242
243
  "Capabilities",
243
244
  "Categories",
245
+ "ChatGPT Work",
244
246
  "ChatGPT web",
245
247
  "ChatKit",
246
248
  "Choose a model",
@@ -363,10 +365,10 @@
363
365
  "plugin marketplace": false,
364
366
  "sandbox": true
365
367
  },
366
- "version": "codex-cli 0.151.0"
368
+ "version": "codex-cli 0.153.2"
367
369
  },
368
370
  "cursor": {
369
- "docs_hash": "8665fb50dce5f322",
371
+ "docs_hash": "328f32fe1afe3e7e",
370
372
  "headings": [
371
373
  "Agent",
372
374
  "CLI",
@@ -399,7 +401,7 @@
399
401
  }
400
402
  },
401
403
  "dsh": {
402
- "docs_hash": "265ff3799848801e",
404
+ "docs_hash": "217350a932acc7fb",
403
405
  "headings": [],
404
406
  "markers": {
405
407
  "Agent Preset": false,
@@ -410,7 +412,7 @@
410
412
  }
411
413
  },
412
414
  "gemini-cli": {
413
- "docs_hash": "02285d342536bdeb",
415
+ "docs_hash": "b78dde41b3161819",
414
416
  "headings": [
415
417
  "Breadcrumbs",
416
418
  "Directory actions",
@@ -451,7 +453,7 @@
451
453
  "version": "0.57.0"
452
454
  },
453
455
  "github-copilot": {
454
- "docs_hash": "fd80b4ec446cec3f",
456
+ "docs_hash": "606c4417d0acebed",
455
457
  "headings": [
456
458
  "About Copilot auto model selection",
457
459
  "About Copilot automations",
@@ -488,7 +490,7 @@
488
490
  }
489
491
  },
490
492
  "google-antigravity": {
491
- "docs_hash": "9fe532d247c3e361",
493
+ "docs_hash": "8cbf9aaffb6b57bf",
492
494
  "headings": [],
493
495
  "markers": {
494
496
  "AGENTS.md": false,
@@ -515,7 +517,7 @@
515
517
  }
516
518
  },
517
519
  "opencode": {
518
- "docs_hash": "154885af5c7de582",
520
+ "docs_hash": "4dac69e305e60373",
519
521
  "headings": [
520
522
  "Add features",
521
523
  "Ask questions",
@@ -577,7 +579,7 @@
577
579
  }
578
580
  },
579
581
  "windsurf": {
580
- "docs_hash": "4a3e8dc19dfdedd6",
582
+ "docs_hash": "121e915ebbd89355",
581
583
  "headings": [
582
584
  "Accounts",
583
585
  "Advanced",
package/bin/ai-toolkit.js CHANGED
@@ -311,6 +311,8 @@ function showHelp() {
311
311
  console.log(' dsh (explicit project target; requires --local; excluded from "all")');
312
312
  console.log(' Default with --local: auto-detect from existing project files');
313
313
  console.log(' --auto-detect Detect project languages and install matching rule modules');
314
+ console.log(' --language-skills <s> detected (default): turn off <lang>-rules/<lang>-patterns skills for languages');
315
+ console.log(' no registered project uses (skillOverrides, reversible); all: keep every language skill on');
314
316
  console.log(' --list, --dry-run Dry-run: show what would be applied');
315
317
  console.log('\nOptions for create:');
316
318
  console.log(' skill <name> --template=<type> Scaffold skill (types: linter, reviewer, generator, workflow, knowledge)');
@@ -3,9 +3,9 @@ title: "SOP: AI Toolkit Maintenance"
3
3
  category: procedures
4
4
  service: ai-toolkit
5
5
  tags: [sop, maintenance, agents, skills, install]
6
- version: "3.4.0"
6
+ version: "3.5.0"
7
7
  created: "2026-03-23"
8
- last_updated: "2026-08-06"
8
+ last_updated: "2026-09-04"
9
9
  description: "Standard operating procedures for installing, maintaining, and evolving the ai-toolkit."
10
10
  ---
11
11
 
@@ -229,7 +229,9 @@ that runtime should receive the change.
229
229
  greets the user with a traceback, and one that reads stdin must answer an
230
230
  empty stdin with an error rather than blocking forever.
231
231
  3. Update `kb/reference/skills-catalog.md` and `app/ARCHITECTURE.md`
232
- 4. Run `scripts/validate.py` — it checks the invocation, the body budget, and
232
+ 4. Run `scripts/validate.py` — it checks the invocation, the body budget, the
233
+ description budget (warn over 400 characters, error over 1024; unquoted
234
+ descriptions containing `: ` or ` #` are rejected, use `>-`), and
233
235
  `reference/` link resolution
234
236
  5. Run `python3 scripts/surface_manifest.py` before the next release to adopt the
235
237
  new skill into the protected surface
@@ -305,6 +307,7 @@ bats tests/test_install.bats tests/test_codex.bats
305
307
  bats tests/test_claude_app.bats tests/test_hooks_per_editor.bats
306
308
  python3 scripts/claude_app.py verify
307
309
  python3 scripts/validate.py --strict
310
+ npm run test:py # pytest over scripts/ logic incl. the frontmatter corpus test (dev venv, see CONTRIBUTING.md)
308
311
  ```
309
312
 
310
313
  ## Managing Plugins
@@ -4,7 +4,7 @@ category: reference
4
4
  service: ai-toolkit
5
5
  tags: [cli, commands, reference, install, update, plugin, mcp, telemetry]
6
6
  created: "2026-04-13"
7
- last_updated: "2026-08-19"
7
+ last_updated: "2026-09-04"
8
8
  description: "Complete CLI reference for all ai-toolkit commands, options, and flags."
9
9
  ---
10
10
 
@@ -19,6 +19,7 @@ Usage: ai-toolkit <command> [options]
19
19
  | Command | Description |
20
20
  |---------|-------------|
21
21
  | `install` | First-time global install into `~/.claude/` + Cursor, Windsurf, Gemini |
22
+ | `install --language-skills detected\|all` | `detected` (default): turn off `<lang>-rules`/`<lang>-patterns` skills for languages no registered project uses, via `skillOverrides` in `~/.claude/settings.json` (entries are tracked in `state.json` and restored when a project brings the language back; a user's own override is never touched); `all`: keep every language skill on. The choice persists across `install`/`update` |
22
23
  | `install --local` | Claude Code configs only; add `--editors all` or `--editors cursor,aider` for other tools |
23
24
  | `update` | Re-apply toolkit after `npm install -g @softspark/ai-toolkit@latest` |
24
25
  | `update --local` | Re-apply + auto-detect editors from existing project files |
@@ -26,7 +27,7 @@ Usage: ai-toolkit <command> [options]
26
27
  | `status` | Show installed modules and version |
27
28
  | `uninstall` | Remove toolkit from `~/.claude/` |
28
29
  | `validate` | Verify toolkit integrity (`--strict` for CI-grade, warnings = errors) |
29
- | `doctor` | Diagnose install health, hooks, quick-win assets, and artifact drift |
30
+ | `doctor` | Diagnose install health, hooks, quick-win assets, artifact drift, context budget (est. resident tokens of the skill/agent listings and user rules, plus skills with zero recorded use; read-only, prints the `skillOverrides` key to paste), and permission rules (`permissions.allow` wildcards on interpreters, task runners, package installs, `gh api`, `curl`, `git fetch`, destructive commands; warns only, never edits) |
30
31
  | `doctor --fix` | Auto-repair broken symlinks, missing hooks, stale artifacts |
31
32
  | `eject [dir]` | Export standalone config (no symlinks, no toolkit dependency) |
32
33
  | `claude-app export [--output FILE] [--no-custom-rules] [--verify]` | Build an uploadable Claude Chat/Desktop/Cowork plugin ZIP and global-instructions file |