@softspark/ai-toolkit 4.3.2 → 4.4.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 +63 -0
- package/README.md +11 -12
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/ARCHITECTURE.md +1 -1
- package/app/hooks/_hook-io.sh +3 -4
- package/app/hooks/session-start.sh +5 -5
- package/app/hooks/stop-search-check.sh +4 -1
- package/app/hooks.json +1 -1
- package/benchmarks/ecosystem-doctor-snapshot.json +35 -14
- package/kb/procedures/maintenance-sop.md +40 -3
- package/kb/reference/architecture-overview.md +2 -2
- package/kb/reference/codex-cli-compatibility.md +13 -5
- package/kb/reference/global-install-model.md +2 -2
- package/kb/reference/hooks-catalog.md +23 -16
- package/kb/reference/supported-tools-registry.md +12 -12
- package/llms-full.txt +92 -40
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/ecosystem_tools.json +25 -7
- package/scripts/generate_cline_skills.py +26 -0
- package/scripts/generate_codex_hooks.py +9 -1
- package/scripts/generate_cursor_skills.py +25 -0
- package/scripts/generate_windsurf_skills.py +26 -0
- package/scripts/install.py +2 -2
- package/scripts/install_steps/ai_tools.py +30 -8
- package/scripts/skill_pointer.py +49 -0
|
@@ -3,9 +3,9 @@ title: "Supported Tools Registry"
|
|
|
3
3
|
category: reference
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [editors, platforms, generators, integration, ecosystem]
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.3.0"
|
|
7
7
|
created: "2026-04-23"
|
|
8
|
-
last_updated: "2026-
|
|
8
|
+
last_updated: "2026-05-25"
|
|
9
9
|
description: "Human-readable view of scripts/ecosystem_tools.json — the canonical list of tools ai-toolkit integrates with (Claude Code + 11 editors), their documentation URLs, config paths, our generators, and tracked capability markers."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -47,9 +47,9 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
47
47
|
| Docs | https://cursor.com/docs |
|
|
48
48
|
| Changelog | https://cursor.com/changelog |
|
|
49
49
|
| Stable docs mirror | https://cursor.com/llms.txt (all doc pages have .md twins) |
|
|
50
|
-
| Config paths | `.cursorrules`, `.cursor/rules/*.mdc`, `.cursor/rules/*.md`, `AGENTS.md`, `.cursor/mcp.json`, `~/.cursor/mcp.json`, `.cursor/skills/*/SKILL.md`, `.cursor/agents/*.md`, `.cursor/hooks.json` |
|
|
51
|
-
| Compat read paths | `.
|
|
52
|
-
| Our generators | `scripts/generate_cursor_rules.py`, `scripts/generate_cursor_mdc.py`, `scripts/generate_cursor_hooks.py` (profile=full), `scripts/generate_cursor_agents.py` (profile=full) |
|
|
50
|
+
| Config paths | `.cursorrules`, `.cursor/rules/*.mdc`, `.cursor/rules/*.md`, `AGENTS.md`, `.cursor/mcp.json`, `~/.cursor/mcp.json`, `.cursor/skills/*/SKILL.md`, `~/.cursor/skills/*/SKILL.md`, `.cursor/agents/*.md`, `.cursor/hooks.json` |
|
|
51
|
+
| Compat read paths | `.agents/skills/`, `~/.agents/skills/`, `.claude/skills/`, `~/.claude/skills/`, `.codex/skills/`, `~/.codex/skills/` |
|
|
52
|
+
| Our generators | `scripts/generate_cursor_rules.py`, `scripts/generate_cursor_mdc.py`, `scripts/generate_cursor_hooks.py` (profile=full), `scripts/generate_cursor_agents.py` (profile=full), `scripts/generate_cursor_skills.py` (profile=full pointer) |
|
|
53
53
|
| Tracked capabilities | `cursorrules`, `.cursor/rules`, `AGENTS.md`, `mcp.json`, Composer, Agent Mode, hooks.json, subagents, skills, plugins |
|
|
54
54
|
|
|
55
55
|
### Windsurf
|
|
@@ -60,10 +60,10 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
60
60
|
| Docs | https://docs.windsurf.com |
|
|
61
61
|
| Changelog | https://windsurf.com/changelog |
|
|
62
62
|
| Stable docs mirror | https://docs.windsurf.com/llms.txt + per-page .md twins |
|
|
63
|
-
| Config paths | `.windsurfrules`, `.windsurf/rules/*.md`, `.windsurf/workflows/*.md`, `AGENTS.md`, `~/.codeium/windsurf/memories/global_rules.md`, `~/.codeium/windsurf/mcp_config.json` |
|
|
63
|
+
| Config paths | `.windsurfrules`, `.windsurf/rules/*.md`, `.windsurf/workflows/*.md`, `.windsurf/skills/*/SKILL.md`, `AGENTS.md`, `~/.codeium/windsurf/memories/global_rules.md`, `~/.codeium/windsurf/skills/*/SKILL.md`, `~/.codeium/windsurf/mcp_config.json` |
|
|
64
64
|
| Compat read paths | `.agents/skills/`, `~/.agents/skills/`, (with Claude Code config-reading) `.claude/skills/`, `~/.claude/skills/` |
|
|
65
|
-
| Our generators | `scripts/generate_windsurf.py`, `scripts/generate_windsurf_rules.py`, `scripts/generate_windsurf_hooks.py` (profile=full) |
|
|
66
|
-
| Tracked capabilities | Cascade, `windsurfrules`, `AGENTS.md`, activation triggers (`always_on`/`glob`/`model_decision`), workflows, MCP, memories, hooks |
|
|
65
|
+
| Our generators | `scripts/generate_windsurf.py`, `scripts/generate_windsurf_rules.py`, `scripts/generate_windsurf_hooks.py` (profile=full), `scripts/generate_windsurf_skills.py` (global + profile=full pointer) |
|
|
66
|
+
| Tracked capabilities | Cascade, `windsurfrules`, `AGENTS.md`, activation triggers (`always_on`/`glob`/`model_decision`), workflows, skills, MCP, memories, hooks |
|
|
67
67
|
| Activation modes emitted | always_on (agents/security/quality), glob (testing + language rules), model_decision (code-style/workflow) |
|
|
68
68
|
|
|
69
69
|
### GitHub Copilot
|
|
@@ -98,11 +98,11 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
98
98
|
| ID | `cline` |
|
|
99
99
|
| Docs | https://docs.cline.bot |
|
|
100
100
|
| Release notes | https://github.com/cline/cline/releases |
|
|
101
|
-
| Config paths | `.clinerules/*.md
|
|
102
|
-
| Our generators | `scripts/generate_cline.py`, `scripts/generate_cline_rules.py` |
|
|
101
|
+
| Config paths | `.clinerules/*.md` (compat), `.clinerules/workflows/*.md` (compat workflows), `.cline/rules/*.md`, `.cline/hooks/`, `.cline/skills/*/SKILL.md`, `~/.cline/rules/*.md`, `~/.cline/hooks/`, `~/.cline/skills/*/SKILL.md`, `~/.cline/data/settings/cline_mcp_settings.json` |
|
|
102
|
+
| Our generators | `scripts/generate_cline.py`, `scripts/generate_cline_rules.py`, `scripts/generate_cline_skills.py` |
|
|
103
103
|
| Tracked capabilities | `clinerules`, Plan Mode, Act Mode, MCP, custom modes, workflows, hooks, skills, subagents, conditional rules |
|
|
104
|
-
| Notes | Conditional rules (`paths:` YAML frontmatter) are emitted for testing and language-specific rules since 2026-04.
|
|
105
|
-
| Global install | `ai-toolkit install --editors cline` writes
|
|
104
|
+
| Notes | Conditional rules (`paths:` YAML frontmatter) are emitted for testing and language-specific rules since 2026-04. Project rules still use `.clinerules/` for compatibility; the documented `~/.cline/rules/` path is used for global install. Skills are emitted as a pointer catalogue in `profile=full` and global installs. |
|
|
105
|
+
| Global install | `ai-toolkit install --editors cline` writes documented global rules under `~/.cline/rules/` and a skill pointer under `~/.cline/skills/`; MCP remains managed by `ai-toolkit mcp install --editor cline`. |
|
|
106
106
|
|
|
107
107
|
### Roo Code
|
|
108
108
|
|
package/llms-full.txt
CHANGED
|
@@ -4404,9 +4404,9 @@ title: "SOP: Claude Toolkit Maintenance"
|
|
|
4404
4404
|
category: procedures
|
|
4405
4405
|
service: ai-toolkit
|
|
4406
4406
|
tags: [sop, maintenance, agents, skills, install]
|
|
4407
|
-
version: "3.0.
|
|
4407
|
+
version: "3.0.1"
|
|
4408
4408
|
created: "2026-03-23"
|
|
4409
|
-
last_updated: "2026-
|
|
4409
|
+
last_updated: "2026-05-25"
|
|
4410
4410
|
description: "Standard operating procedures for installing, maintaining, and evolving the ai-toolkit."
|
|
4411
4411
|
---
|
|
4412
4412
|
|
|
@@ -4435,7 +4435,7 @@ ai-toolkit install --local --editors all # all supported editor
|
|
|
4435
4435
|
ai-toolkit install --local --editors cursor,aider # specific editors only
|
|
4436
4436
|
```
|
|
4437
4437
|
|
|
4438
|
-
Supported editors: `cursor`, `windsurf`, `cline`, `roo`, `aider`, `augment`, `copilot`, `antigravity`, `codex`.
|
|
4438
|
+
Supported editors: `cursor`, `windsurf`, `cline`, `roo`, `aider`, `augment`, `copilot`, `antigravity`, `codex`, `gemini`, `opencode`.
|
|
4439
4439
|
|
|
4440
4440
|
To restrict which language rules are injected, use `--lang`:
|
|
4441
4441
|
|
|
@@ -4603,6 +4603,43 @@ Manual path:
|
|
|
4603
4603
|
|
|
4604
4604
|
Use `PreToolUse` for blocking validations, `PostToolUse` for non-blocking feedback, `UserPromptSubmit` for prompt governance, and `PreCompact` / `SessionEnd` for context preservation and handoff.
|
|
4605
4605
|
|
|
4606
|
+
## Troubleshooting Rule Enforcement in Claude Code
|
|
4607
|
+
|
|
4608
|
+
Use this when Claude appears to ignore `CLAUDE.md`, `.claude/rules/*.md`, output styles, or search-first rules.
|
|
4609
|
+
|
|
4610
|
+
1. **Check current Claude docs first.** Confirm the live contract for memory, settings, output styles, and hooks:
|
|
4611
|
+
- `https://code.claude.com/docs/en/memory`
|
|
4612
|
+
- `https://code.claude.com/docs/en/settings`
|
|
4613
|
+
- `https://code.claude.com/docs/en/output-styles`
|
|
4614
|
+
- `https://code.claude.com/docs/en/hooks`
|
|
4615
|
+
2. **Verify instruction loading.** Run `/memory` in Claude Code and confirm the expected `CLAUDE.md`, `CLAUDE.local.md`, and `.claude/rules/*.md` files are listed. Remember that Claude Code reads `CLAUDE.md`, not `AGENTS.md`, unless `CLAUDE.md` imports it.
|
|
4616
|
+
3. **Verify the active output style.** Check `.claude/settings.local.json` or `/config`. Output style changes apply after `/clear` or a new session.
|
|
4617
|
+
4. **Inspect installed hooks.** Ensure `~/.claude/settings.json` contains the ai-toolkit `UserPromptSubmit` and `Stop` entries. The governance hook must run with `AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json` so it injects `additionalContext` without noisy transcript output.
|
|
4618
|
+
5. **Reproduce the hook path directly.**
|
|
4619
|
+
```bash
|
|
4620
|
+
printf '{"session_id":"debug","prompt":"debug this technical rule issue"}' \
|
|
4621
|
+
| AI_TOOLKIT_SEARCH_FIRST=strict AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json \
|
|
4622
|
+
~/.softspark/ai-toolkit/hooks/user-prompt-submit.sh
|
|
4623
|
+
```
|
|
4624
|
+
The output must be valid JSON with `hookSpecificOutput.additionalContext`.
|
|
4625
|
+
6. **Check corrective enforcement.** If the assistant still skips required research, `stop-search-check.sh` should block Stop with the search-first message. If it does not, inspect `~/.softspark/ai-toolkit/state/search-required-*.flag` and the Codex/Claude transcript logs.
|
|
4626
|
+
7. **Repair drift.** Run:
|
|
4627
|
+
```bash
|
|
4628
|
+
ai-toolkit update --only hooks
|
|
4629
|
+
python3 scripts/ecosystem_doctor.py --tool claude-code --format text
|
|
4630
|
+
scripts/validate.py
|
|
4631
|
+
```
|
|
4632
|
+
|
|
4633
|
+
## Verification
|
|
4634
|
+
|
|
4635
|
+
After changing rule-enforcement behavior, run at minimum:
|
|
4636
|
+
|
|
4637
|
+
```bash
|
|
4638
|
+
bats tests/test_hooks.bats tests/test_search_first_flow.bats
|
|
4639
|
+
bats tests/test_install.bats tests/test_codex.bats
|
|
4640
|
+
python3 scripts/validate.py --strict
|
|
4641
|
+
```
|
|
4642
|
+
|
|
4606
4643
|
## Managing Plugins
|
|
4607
4644
|
|
|
4608
4645
|
```bash
|
|
@@ -6195,11 +6232,11 @@ Machine (global) Project (local)
|
|
|
6195
6232
|
**`ai-toolkit update`** — re-apply after `npm install -g @softspark/ai-toolkit@latest` or after `add-rule` / `remove-rule`. Same as `install` but semantically correct for update flows.
|
|
6196
6233
|
|
|
6197
6234
|
**`ai-toolkit install --local`** — run per project. Always installs Claude Code configs (CLAUDE.md, settings.local.json, constitution.md, language rules). Editor configs are opt-in via `--editors`:
|
|
6198
|
-
- `--editors all` — install all
|
|
6235
|
+
- `--editors all` — install all 11 editors (Cursor, Windsurf, Cline, Roo, Aider, Augment, Copilot, Antigravity, Codex, Gemini, opencode)
|
|
6199
6236
|
- `--editors cursor,aider` — install only selected editors
|
|
6200
6237
|
- (no flag) — auto-detect from existing project files; `update --local` picks up whatever editors already have configs
|
|
6201
6238
|
|
|
6202
|
-
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.windsurf/rules/*.md`, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agent/rules/*.md`, `CONVENTIONS.md`). Codex local install additionally generates `AGENTS.md`, `.agents/rules/*.md`, `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
6239
|
+
Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.windsurf/rules/*.md`, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agent/rules/*.md`, `CONVENTIONS.md`). Full-profile installs also emit native skill pointer catalogues for Cursor, Windsurf, and Cline. Codex local install additionally generates `AGENTS.md`, `.agents/rules/*.md`, `.agents/skills/*`, and `.codex/hooks.json`. Hooks are global-only — not merged into project settings except for editor-native local hook files such as Codex `.codex/hooks.json`. Experimental plugin packs can also layer a global Codex target in `HOME` (`~/AGENTS.md`, `~/.agents/`, `~/.codex/hooks.json`) when installed with `ai-toolkit plugin install --editor codex`.
|
|
6203
6240
|
|
|
6204
6241
|
If a project already has `.mcp.json`, local install mirrors its `mcpServers` entries into `.claude/settings.local.json` plus any selected editors with project-scoped native MCP files (`.cursor/mcp.json`, `.github/mcp.json`).
|
|
6205
6242
|
|
|
@@ -6928,7 +6965,7 @@ title: "AI Toolkit - Codex CLI Compatibility"
|
|
|
6928
6965
|
category: reference
|
|
6929
6966
|
service: ai-toolkit
|
|
6930
6967
|
tags: [codex, compatibility, install, skills, hooks]
|
|
6931
|
-
version: "1.0.
|
|
6968
|
+
version: "1.0.2"
|
|
6932
6969
|
created: "2026-04-12"
|
|
6933
6970
|
last_updated: "2026-05-21"
|
|
6934
6971
|
description: "Reference for how ai-toolkit maps Claude-oriented skills, hooks, and plugin packs to Codex CLI."
|
|
@@ -7035,10 +7072,16 @@ This means Claude-only events such as `TaskCompleted`, `TeammateIdle`,
|
|
|
7035
7072
|
`~/.codex/hooks.json` (global layer). Non-Codex events are silently skipped.
|
|
7036
7073
|
`remove-hook` cleans both Claude and Codex targets.
|
|
7037
7074
|
|
|
7038
|
-
Generated Codex hook commands include `AI_TOOLKIT_HOOK_QUIET=1`.
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7075
|
+
Generated Codex hook commands include `AI_TOOLKIT_HOOK_QUIET=1`. The
|
|
7076
|
+
`UserPromptSubmit` governance hook additionally sets `AI_TOOLKIT_HOOK_FORMAT=json`
|
|
7077
|
+
so it can pass quiet `additionalContext` before the model responds. This keeps
|
|
7078
|
+
non-blocking reminders and startup context out of visible hook output while
|
|
7079
|
+
preserving hook side effects, proactive search-first context, and blocking
|
|
7080
|
+
decisions such as search-first Stop enforcement.
|
|
7081
|
+
|
|
7082
|
+
Plain-text informational hook context is also silent by default in the shared
|
|
7083
|
+
hook helper. Set `AI_TOOLKIT_HOOK_VERBOSE=1` only when debugging hook output
|
|
7084
|
+
outside the Codex UI.
|
|
7042
7085
|
|
|
7043
7086
|
## Behavioral Limits
|
|
7044
7087
|
|
|
@@ -7054,6 +7097,8 @@ Known limits:
|
|
|
7054
7097
|
so `stop-search-check.sh` also checks `~/.codex/log/codex-tui.log` for
|
|
7055
7098
|
`smart_query`, `hybrid_search_kb`, `crag_search`, `multi_hop_search`, and
|
|
7056
7099
|
`verify_answer` calls after the search-first flag timestamp before blocking.
|
|
7100
|
+
The scan is bounded to a recent log window, but sized to tolerate noisy Codex
|
|
7101
|
+
skill-loader output between the search call and the Stop hook.
|
|
7057
7102
|
|
|
7058
7103
|
These are runtime platform limits, not installation defects.
|
|
7059
7104
|
|
|
@@ -8529,10 +8574,10 @@ The `--profile` flag controls how much of each editor's native surface is activa
|
|
|
8529
8574
|
`ai-toolkit install --editors <name>` can write global files only for editors
|
|
8530
8575
|
with documented, file-based config surfaces:
|
|
8531
8576
|
|
|
8532
|
-
- `windsurf`: `~/.codeium/windsurf/memories/global_rules.md`
|
|
8577
|
+
- `windsurf`: `~/.codeium/windsurf/memories/global_rules.md` plus `~/.codeium/windsurf/skills/ai-toolkit-skill-catalogue/SKILL.md`
|
|
8533
8578
|
- `gemini`: `~/.gemini/GEMINI.md`
|
|
8534
8579
|
- `augment`: `~/.augment/rules/ai-toolkit.md`
|
|
8535
|
-
- `cline`:
|
|
8580
|
+
- `cline`: `~/.cline/rules/ai-toolkit-*.md` plus `~/.cline/skills/ai-toolkit-skill-catalogue/SKILL.md`
|
|
8536
8581
|
- `roo`: `~/.roo/rules/ai-toolkit-*.md`
|
|
8537
8582
|
- `aider`: `~/.aider.conf.yml` plus `~/.aider-ai-toolkit-CONVENTIONS.md` when the YAML file does not already exist
|
|
8538
8583
|
- `codex`: `~/AGENTS.md`, `~/.agents/rules/*`, `~/.agents/skills/*`, `~/.codex/hooks.json`
|
|
@@ -8835,9 +8880,9 @@ title: "Hooks Catalog"
|
|
|
8835
8880
|
category: reference
|
|
8836
8881
|
service: ai-toolkit
|
|
8837
8882
|
tags: [hooks, quality, safety, enforcement, settings.json]
|
|
8838
|
-
version: "1.5.
|
|
8883
|
+
version: "1.5.5"
|
|
8839
8884
|
created: "2026-03-27"
|
|
8840
|
-
last_updated: "2026-05-
|
|
8885
|
+
last_updated: "2026-05-25"
|
|
8841
8886
|
description: "Complete reference of all ai-toolkit hooks: events, scripts, installation, and runtime behavior."
|
|
8842
8887
|
---
|
|
8843
8888
|
|
|
@@ -8882,10 +8927,10 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
|
|
|
8882
8927
|
3. Loads session context from `.claude/session-context.md` (if exists)
|
|
8883
8928
|
4. Loads active instincts from `.claude/instincts/*.md` (if any)
|
|
8884
8929
|
|
|
8885
|
-
|
|
8886
|
-
|
|
8887
|
-
|
|
8888
|
-
|
|
8930
|
+
By default the hook performs session-state reset, stale search-flag cleanup, and
|
|
8931
|
+
update notification side effects without printing informational stdout. Set
|
|
8932
|
+
`AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
|
|
8933
|
+
for debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
|
|
8889
8934
|
|
|
8890
8935
|
### Notification — `notify-waiting.sh`
|
|
8891
8936
|
|
|
@@ -8939,12 +8984,18 @@ context in the UI.
|
|
|
8939
8984
|
| Script | `~/.softspark/ai-toolkit/hooks/user-prompt-submit.sh` |
|
|
8940
8985
|
| Fires | Before Claude starts working on a submitted prompt |
|
|
8941
8986
|
|
|
8942
|
-
**Action:**
|
|
8987
|
+
**Action:** Maintains the per-session search-first flag used by Stop enforcement
|
|
8988
|
+
and can provide a lightweight governance reminder: plan mode for architectural
|
|
8989
|
+
work, evidence-first debugging, KB-first research, and validation expectations.
|
|
8943
8990
|
|
|
8944
8991
|
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`. The bundled `app/hooks.json`
|
|
8945
|
-
registers this command with `AI_TOOLKIT_HOOK_QUIET=1
|
|
8946
|
-
|
|
8947
|
-
|
|
8992
|
+
registers this command with `AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json`.
|
|
8993
|
+
This keeps the hook visually quiet (`suppressOutput: true`) while still
|
|
8994
|
+
injecting `hookSpecificOutput.additionalContext` before Claude starts working.
|
|
8995
|
+
That context is the proactive half of search-first enforcement; the paired
|
|
8996
|
+
`stop-search-check.sh` remains the corrective half. In plain-text mode,
|
|
8997
|
+
informational reminders are silent by default and require
|
|
8998
|
+
`AI_TOOLKIT_HOOK_VERBOSE=1`.
|
|
8948
8999
|
|
|
8949
9000
|
### UserPromptSubmit (usage tracking) — `track-usage.sh`
|
|
8950
9001
|
|
|
@@ -9221,7 +9272,7 @@ First-match-wins per file. Built-in runners: `bats`, `pytest`, `vitest`, `jest`.
|
|
|
9221
9272
|
| Script | `~/.softspark/ai-toolkit/hooks/search-tracker.sh` |
|
|
9222
9273
|
| Fires | After any search-style tool call |
|
|
9223
9274
|
|
|
9224
|
-
**Action:** Clears `~/.softspark/ai-toolkit/state/search-required-<session_id>.flag` (per-session, keyed by `session_id` from the hook stdin payload, falling back to `transcript_path` basename, then `default`). Pairs with `user-prompt-submit.sh` (sets the flag on long technical prompts only when a search provider is detected or strict mode is enabled) and `stop-search-check.sh` (blocks Stop if the calling session's flag is still set). Search provider detection parses actual MCP server names from `mcpServers`, `mcp_servers`, or `mcp` config blocks; hook matchers and permission allowlists do not count as providers. Together the hooks enforce the global CLAUDE.md GOLDEN RULE without breaking offline/no-RAG installs and without cross-session interference when multiple Claude Code windows run in parallel.
|
|
9275
|
+
**Action:** Clears `~/.softspark/ai-toolkit/state/search-required-<session_id>.flag` (per-session, keyed by `session_id` from the hook stdin payload, falling back to `transcript_path` basename, then `default`). Pairs with `user-prompt-submit.sh` (sets the flag on long technical prompts only when a search provider is detected or strict mode is enabled) and `stop-search-check.sh` (blocks Stop if the calling session's flag is still set). Search provider detection parses actual MCP server names from `mcpServers`, `mcp_servers`, or `mcp` config blocks; hook matchers and permission allowlists do not count as providers. Codex Stop enforcement also scans the recent `~/.codex/log/codex-tui.log` window for `ToolCall: mcp__...__smart_query` and `tool.name="smart_query"`-style entries because Codex MCP tool calls may not fire the shared `PostToolUse` tracker. Together the hooks enforce the global CLAUDE.md GOLDEN RULE without breaking offline/no-RAG installs and without cross-session interference when multiple Claude Code windows run in parallel.
|
|
9225
9276
|
|
|
9226
9277
|
Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
9227
9278
|
|
|
@@ -9272,7 +9323,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
9272
9323
|
| `scripts/test_cohesion.py` | Resolves changed paths → test commands via cohesion map. First-match-wins. Stdlib-only. |
|
|
9273
9324
|
| `app/hooks/test-cohesion-map.json` | Toolkit-default path → tests mapping (used when no project map exists). |
|
|
9274
9325
|
| `app/hooks/_locate-toolkit.sh` | Shared bash helper that exports `$TOOLKIT_DIR` for hooks needing scripts/. |
|
|
9275
|
-
| `app/hooks/_hook-io.sh` | Shared bash helper that normalizes hook payloads across Claude, Augment, Gemini, Windsurf, and Cursor-style JSON.
|
|
9326
|
+
| `app/hooks/_hook-io.sh` | Shared bash helper that normalizes hook payloads across Claude, Augment, Gemini, Windsurf, and Cursor-style JSON. JSON context output takes precedence over `AI_TOOLKIT_HOOK_QUIET=1`, so quiet hooks can still emit `additionalContext` with `suppressOutput: true`; plain-text output requires `AI_TOOLKIT_HOOK_VERBOSE=1`. |
|
|
9276
9327
|
| `app/hooks/_search-capability.sh` | Shared bash helper that enables search-first blocking only when RAG/Web is configured or strict mode is requested. |
|
|
9277
9328
|
|
|
9278
9329
|
## Runtime Profiles
|
|
@@ -9289,10 +9340,11 @@ Set in `.claude/settings.local.json`:
|
|
|
9289
9340
|
| `standard` | All hooks (default) |
|
|
9290
9341
|
| `strict` | Standard + mypy --strict on task completion |
|
|
9291
9342
|
|
|
9292
|
-
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9343
|
+
Non-blocking informational context is silent in plain-text mode by default while
|
|
9344
|
+
side effects and blocking decisions still run. Set `AI_TOOLKIT_HOOK_VERBOSE=1`
|
|
9345
|
+
only when debugging hook context locally. `AI_TOOLKIT_HOOK_QUIET=1` keeps hook
|
|
9346
|
+
commands explicitly silent, and Codex-generated hooks plus Claude's bundled
|
|
9347
|
+
`UserPromptSubmit` entry use it to avoid visible prompt hook context.
|
|
9296
9348
|
|
|
9297
9349
|
## Architecture
|
|
9298
9350
|
|
|
@@ -11662,9 +11714,9 @@ title: "Supported Tools Registry"
|
|
|
11662
11714
|
category: reference
|
|
11663
11715
|
service: ai-toolkit
|
|
11664
11716
|
tags: [editors, platforms, generators, integration, ecosystem]
|
|
11665
|
-
version: "1.
|
|
11717
|
+
version: "1.3.0"
|
|
11666
11718
|
created: "2026-04-23"
|
|
11667
|
-
last_updated: "2026-
|
|
11719
|
+
last_updated: "2026-05-25"
|
|
11668
11720
|
description: "Human-readable view of scripts/ecosystem_tools.json — the canonical list of tools ai-toolkit integrates with (Claude Code + 11 editors), their documentation URLs, config paths, our generators, and tracked capability markers."
|
|
11669
11721
|
---
|
|
11670
11722
|
|
|
@@ -11706,9 +11758,9 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11706
11758
|
| Docs | https://cursor.com/docs |
|
|
11707
11759
|
| Changelog | https://cursor.com/changelog |
|
|
11708
11760
|
| Stable docs mirror | https://cursor.com/llms.txt (all doc pages have .md twins) |
|
|
11709
|
-
| Config paths | `.cursorrules`, `.cursor/rules/*.mdc`, `.cursor/rules/*.md`, `AGENTS.md`, `.cursor/mcp.json`, `~/.cursor/mcp.json`, `.cursor/skills/*/SKILL.md`, `.cursor/agents/*.md`, `.cursor/hooks.json` |
|
|
11710
|
-
| Compat read paths | `.
|
|
11711
|
-
| Our generators | `scripts/generate_cursor_rules.py`, `scripts/generate_cursor_mdc.py`, `scripts/generate_cursor_hooks.py` (profile=full), `scripts/generate_cursor_agents.py` (profile=full) |
|
|
11761
|
+
| Config paths | `.cursorrules`, `.cursor/rules/*.mdc`, `.cursor/rules/*.md`, `AGENTS.md`, `.cursor/mcp.json`, `~/.cursor/mcp.json`, `.cursor/skills/*/SKILL.md`, `~/.cursor/skills/*/SKILL.md`, `.cursor/agents/*.md`, `.cursor/hooks.json` |
|
|
11762
|
+
| Compat read paths | `.agents/skills/`, `~/.agents/skills/`, `.claude/skills/`, `~/.claude/skills/`, `.codex/skills/`, `~/.codex/skills/` |
|
|
11763
|
+
| Our generators | `scripts/generate_cursor_rules.py`, `scripts/generate_cursor_mdc.py`, `scripts/generate_cursor_hooks.py` (profile=full), `scripts/generate_cursor_agents.py` (profile=full), `scripts/generate_cursor_skills.py` (profile=full pointer) |
|
|
11712
11764
|
| Tracked capabilities | `cursorrules`, `.cursor/rules`, `AGENTS.md`, `mcp.json`, Composer, Agent Mode, hooks.json, subagents, skills, plugins |
|
|
11713
11765
|
|
|
11714
11766
|
### Windsurf
|
|
@@ -11719,10 +11771,10 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11719
11771
|
| Docs | https://docs.windsurf.com |
|
|
11720
11772
|
| Changelog | https://windsurf.com/changelog |
|
|
11721
11773
|
| Stable docs mirror | https://docs.windsurf.com/llms.txt + per-page .md twins |
|
|
11722
|
-
| Config paths | `.windsurfrules`, `.windsurf/rules/*.md`, `.windsurf/workflows/*.md`, `AGENTS.md`, `~/.codeium/windsurf/memories/global_rules.md`, `~/.codeium/windsurf/mcp_config.json` |
|
|
11774
|
+
| Config paths | `.windsurfrules`, `.windsurf/rules/*.md`, `.windsurf/workflows/*.md`, `.windsurf/skills/*/SKILL.md`, `AGENTS.md`, `~/.codeium/windsurf/memories/global_rules.md`, `~/.codeium/windsurf/skills/*/SKILL.md`, `~/.codeium/windsurf/mcp_config.json` |
|
|
11723
11775
|
| Compat read paths | `.agents/skills/`, `~/.agents/skills/`, (with Claude Code config-reading) `.claude/skills/`, `~/.claude/skills/` |
|
|
11724
|
-
| Our generators | `scripts/generate_windsurf.py`, `scripts/generate_windsurf_rules.py`, `scripts/generate_windsurf_hooks.py` (profile=full) |
|
|
11725
|
-
| Tracked capabilities | Cascade, `windsurfrules`, `AGENTS.md`, activation triggers (`always_on`/`glob`/`model_decision`), workflows, MCP, memories, hooks |
|
|
11776
|
+
| Our generators | `scripts/generate_windsurf.py`, `scripts/generate_windsurf_rules.py`, `scripts/generate_windsurf_hooks.py` (profile=full), `scripts/generate_windsurf_skills.py` (global + profile=full pointer) |
|
|
11777
|
+
| Tracked capabilities | Cascade, `windsurfrules`, `AGENTS.md`, activation triggers (`always_on`/`glob`/`model_decision`), workflows, skills, MCP, memories, hooks |
|
|
11726
11778
|
| Activation modes emitted | always_on (agents/security/quality), glob (testing + language rules), model_decision (code-style/workflow) |
|
|
11727
11779
|
|
|
11728
11780
|
### GitHub Copilot
|
|
@@ -11757,11 +11809,11 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
|
|
|
11757
11809
|
| ID | `cline` |
|
|
11758
11810
|
| Docs | https://docs.cline.bot |
|
|
11759
11811
|
| Release notes | https://github.com/cline/cline/releases |
|
|
11760
|
-
| Config paths | `.clinerules/*.md
|
|
11761
|
-
| Our generators | `scripts/generate_cline.py`, `scripts/generate_cline_rules.py` |
|
|
11812
|
+
| Config paths | `.clinerules/*.md` (compat), `.clinerules/workflows/*.md` (compat workflows), `.cline/rules/*.md`, `.cline/hooks/`, `.cline/skills/*/SKILL.md`, `~/.cline/rules/*.md`, `~/.cline/hooks/`, `~/.cline/skills/*/SKILL.md`, `~/.cline/data/settings/cline_mcp_settings.json` |
|
|
11813
|
+
| Our generators | `scripts/generate_cline.py`, `scripts/generate_cline_rules.py`, `scripts/generate_cline_skills.py` |
|
|
11762
11814
|
| Tracked capabilities | `clinerules`, Plan Mode, Act Mode, MCP, custom modes, workflows, hooks, skills, subagents, conditional rules |
|
|
11763
|
-
| Notes | Conditional rules (`paths:` YAML frontmatter) are emitted for testing and language-specific rules since 2026-04.
|
|
11764
|
-
| Global install | `ai-toolkit install --editors cline` writes
|
|
11815
|
+
| Notes | Conditional rules (`paths:` YAML frontmatter) are emitted for testing and language-specific rules since 2026-04. Project rules still use `.clinerules/` for compatibility; the documented `~/.cline/rules/` path is used for global install. Skills are emitted as a pointer catalogue in `profile=full` and global installs. |
|
|
11816
|
+
| Global install | `ai-toolkit install --editors cline` writes documented global rules under `~/.cline/rules/` and a skill pointer under `~/.cline/skills/`; MCP remains managed by `ai-toolkit mcp install --editor cline`. |
|
|
11765
11817
|
|
|
11766
11818
|
### Roo Code
|
|
11767
11819
|
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@softspark/ai-toolkit",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "AI coding toolkit: 107 skills, 44 agents, 12-editor write-through (Claude, Cursor, Windsurf, Copilot, Gemini, Cline, Roo, Aider, Augment, Antigravity, Codex, opencode), machine-enforced safety constitution, SARIF audit, signed npm provenance.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"description": "Authoritative registry of tools ai-toolkit integrates with. Consumed by scripts/ecosystem_doctor.py to detect upstream doc/version drift.",
|
|
4
|
-
"last_updated": "2026-
|
|
4
|
+
"last_updated": "2026-05-25",
|
|
5
5
|
"tools": [
|
|
6
6
|
{
|
|
7
7
|
"id": "claude-code",
|
|
@@ -80,12 +80,20 @@
|
|
|
80
80
|
".cursor/mcp.json",
|
|
81
81
|
"~/.cursor/mcp.json",
|
|
82
82
|
".cursor/skills/*/SKILL.md",
|
|
83
|
+
"~/.cursor/skills/*/SKILL.md",
|
|
84
|
+
".agents/skills/*/SKILL.md",
|
|
85
|
+
"~/.agents/skills/*/SKILL.md",
|
|
86
|
+
".claude/skills/*/SKILL.md",
|
|
87
|
+
"~/.claude/skills/*/SKILL.md",
|
|
88
|
+
".codex/skills/*/SKILL.md",
|
|
89
|
+
"~/.codex/skills/*/SKILL.md",
|
|
83
90
|
".cursor/agents/*.md",
|
|
84
91
|
".cursor/hooks.json"
|
|
85
92
|
],
|
|
86
93
|
"our_generators": [
|
|
87
94
|
"scripts/generate_cursor_rules.py",
|
|
88
|
-
"scripts/generate_cursor_mdc.py"
|
|
95
|
+
"scripts/generate_cursor_mdc.py",
|
|
96
|
+
"scripts/generate_cursor_skills.py"
|
|
89
97
|
],
|
|
90
98
|
"capability_markers": [
|
|
91
99
|
"cursorrules",
|
|
@@ -114,14 +122,17 @@
|
|
|
114
122
|
".windsurfrules",
|
|
115
123
|
".windsurf/rules/*.md",
|
|
116
124
|
".windsurf/workflows/*.md",
|
|
125
|
+
".windsurf/skills/*/SKILL.md",
|
|
117
126
|
"AGENTS.md",
|
|
118
127
|
"~/.codeium/windsurf/memories/global_rules.md",
|
|
128
|
+
"~/.codeium/windsurf/skills/*/SKILL.md",
|
|
119
129
|
"~/.codeium/windsurf/mcp_config.json",
|
|
120
130
|
"~/.codeium/windsurf/global_workflows/*.md"
|
|
121
131
|
],
|
|
122
132
|
"our_generators": [
|
|
123
133
|
"scripts/generate_windsurf.py",
|
|
124
|
-
"scripts/generate_windsurf_rules.py"
|
|
134
|
+
"scripts/generate_windsurf_rules.py",
|
|
135
|
+
"scripts/generate_windsurf_skills.py"
|
|
125
136
|
],
|
|
126
137
|
"capability_markers": [
|
|
127
138
|
"Cascade",
|
|
@@ -131,6 +142,8 @@
|
|
|
131
142
|
"glob",
|
|
132
143
|
"model_decision",
|
|
133
144
|
"workflows",
|
|
145
|
+
"skills",
|
|
146
|
+
"SKILL.md",
|
|
134
147
|
"MCP",
|
|
135
148
|
"memories",
|
|
136
149
|
"hooks"
|
|
@@ -225,14 +238,19 @@
|
|
|
225
238
|
"config_paths": [
|
|
226
239
|
".clinerules/*.md",
|
|
227
240
|
".clinerules/workflows/*.md",
|
|
228
|
-
".
|
|
229
|
-
".cline/
|
|
241
|
+
".cline/rules/*.md",
|
|
242
|
+
".cline/hooks/",
|
|
243
|
+
".cline/skills/*/SKILL.md",
|
|
244
|
+
"~/.cline/rules/*.md",
|
|
245
|
+
"~/.cline/hooks/",
|
|
246
|
+
"~/.cline/skills/*/SKILL.md",
|
|
230
247
|
"~/.cline/data/settings/cline_mcp_settings.json",
|
|
231
|
-
"
|
|
248
|
+
".claude/skills/*/SKILL.md"
|
|
232
249
|
],
|
|
233
250
|
"our_generators": [
|
|
234
251
|
"scripts/generate_cline.py",
|
|
235
|
-
"scripts/generate_cline_rules.py"
|
|
252
|
+
"scripts/generate_cline_rules.py",
|
|
253
|
+
"scripts/generate_cline_skills.py"
|
|
236
254
|
],
|
|
237
255
|
"capability_markers": [
|
|
238
256
|
"clinerules",
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate a Cline skill pointer under ``.cline/skills/``."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
9
|
+
from skill_pointer import POINTER_SKILL_NAME, write_pointer_skill
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def generate(target_dir: Path, *, emit_skill_pointer: bool = True,
|
|
13
|
+
skill_root: str = ".cline/skills") -> None:
|
|
14
|
+
if not emit_skill_pointer:
|
|
15
|
+
return
|
|
16
|
+
write_pointer_skill(target_dir, skill_root, "Cline")
|
|
17
|
+
print(f" Generated: {skill_root}/{POINTER_SKILL_NAME}/SKILL.md")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def main() -> None:
|
|
21
|
+
target = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.cwd()
|
|
22
|
+
generate(target)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
main()
|
|
@@ -25,6 +25,9 @@ from pathlib import Path
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
HOOKS_PREFIX = 'AI_TOOLKIT_HOOK_QUIET=1 "$HOME/.softspark/ai-toolkit/hooks/'
|
|
28
|
+
HOOKS_JSON_CONTEXT_PREFIX = (
|
|
29
|
+
'AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json "$HOME/.softspark/ai-toolkit/hooks/'
|
|
30
|
+
)
|
|
28
31
|
|
|
29
32
|
# Hooks compatible with Codex, grouped by event.
|
|
30
33
|
# Format: (matcher, script_name)
|
|
@@ -63,7 +66,12 @@ def build_hooks_json() -> dict:
|
|
|
63
66
|
for event, entries in CODEX_HOOKS.items():
|
|
64
67
|
hooks[event] = []
|
|
65
68
|
for matcher, script in entries:
|
|
66
|
-
|
|
69
|
+
prefix = (
|
|
70
|
+
HOOKS_JSON_CONTEXT_PREFIX
|
|
71
|
+
if event == "UserPromptSubmit" and script == "user-prompt-submit.sh"
|
|
72
|
+
else HOOKS_PREFIX
|
|
73
|
+
)
|
|
74
|
+
entry: dict = {"hooks": [{"type": "command", "command": f"{prefix}{script}\""}]}
|
|
67
75
|
if matcher:
|
|
68
76
|
entry["matcher"] = matcher
|
|
69
77
|
hooks[event].append(entry)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate a Cursor skill pointer under ``.cursor/skills/``."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
9
|
+
from skill_pointer import POINTER_SKILL_NAME, write_pointer_skill
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def generate(target_dir: Path, *, emit_skill_pointer: bool = True) -> None:
|
|
13
|
+
if not emit_skill_pointer:
|
|
14
|
+
return
|
|
15
|
+
write_pointer_skill(target_dir, ".cursor/skills", "Cursor")
|
|
16
|
+
print(f" Generated: .cursor/skills/{POINTER_SKILL_NAME}/SKILL.md")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def main() -> None:
|
|
20
|
+
target = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.cwd()
|
|
21
|
+
generate(target)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
if __name__ == "__main__":
|
|
25
|
+
main()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate a Windsurf skill pointer under ``.windsurf/skills/``."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
9
|
+
from skill_pointer import POINTER_SKILL_NAME, write_pointer_skill
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def generate(target_dir: Path, *, emit_skill_pointer: bool = True,
|
|
13
|
+
skill_root: str = ".windsurf/skills") -> None:
|
|
14
|
+
if not emit_skill_pointer:
|
|
15
|
+
return
|
|
16
|
+
write_pointer_skill(target_dir, skill_root, "Windsurf")
|
|
17
|
+
print(f" Generated: {skill_root}/{POINTER_SKILL_NAME}/SKILL.md")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def main() -> None:
|
|
21
|
+
target = Path(sys.argv[1]) if len(sys.argv) > 1 else Path.cwd()
|
|
22
|
+
generate(target)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
main()
|
package/scripts/install.py
CHANGED
|
@@ -12,9 +12,9 @@ Claude Code (~/.claude/):
|
|
|
12
12
|
- Rules injected into ~/.claude/CLAUDE.md
|
|
13
13
|
|
|
14
14
|
Other tools (global config locations):
|
|
15
|
-
- Windsurf: ~/.codeium/windsurf/memories/global_rules.md
|
|
15
|
+
- Windsurf: ~/.codeium/windsurf/memories/global_rules.md + ~/.codeium/windsurf/skills/
|
|
16
16
|
- Gemini: ~/.gemini/GEMINI.md
|
|
17
|
-
- Cline:
|
|
17
|
+
- Cline: ~/.cline/rules/ + ~/.cline/skills/
|
|
18
18
|
- Roo Code: ~/.roo/rules/
|
|
19
19
|
- Aider: ~/.aider.conf.yml (created only if absent)
|
|
20
20
|
- Augment: ~/.augment/rules/ai-toolkit.md
|