@softspark/ai-toolkit 4.3.3 → 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 CHANGED
@@ -7,6 +7,44 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v4.4.0 - native editor skill pointers and hook governance hardening (2026-05-25)
11
+
12
+ Minor release. Adds native skill pointer generation for more editor surfaces and hardens search-first governance so quiet hooks still inject model context without noisy transcript output.
13
+
14
+ ### Added
15
+
16
+ - **Native editor skill pointers** - Added Cursor, Windsurf, and Cline skill pointer generators so supported editors can discover the ai-toolkit skill catalog through their native skill directories.
17
+ - **Shared skill pointer builder** - Added `scripts/skill_pointer.py` to keep generated skill pointer metadata consistent across editor-specific generators.
18
+ - **Release coverage** - Added generator and hook tests covering the new skill pointer outputs, quiet JSON `UserPromptSubmit` context, and noisy Codex search-first log fallback.
19
+
20
+ ### Changed
21
+
22
+ - **Editor registry and install flow** - Updated supported-tool metadata and install behavior for Cursor, Windsurf, and Cline native skill pointer targets.
23
+ - **Codex hook generation** - `scripts/generate_codex_hooks.py` now emits quiet JSON context for `user-prompt-submit.sh`, matching Claude Code's installed hook behavior.
24
+ - **Hook runtime documentation** - Updated the hooks catalog, Codex compatibility notes, global install model, supported tools registry, and maintenance SOP with the new runtime behavior.
25
+
26
+ ### Fixed
27
+
28
+ - **Quiet hook context injection** - `_hook-io.sh` now lets `AI_TOOLKIT_HOOK_FORMAT=json` emit `hookSpecificOutput.additionalContext` even when `AI_TOOLKIT_HOOK_QUIET=1` is set.
29
+ - **Search-first false positives in Codex** - `stop-search-check.sh` now scans a larger recent Codex log window and recognizes both `ToolCall: mcp__...__smart_query` and `tool.name="smart_query"` log shapes.
30
+ - **Installed runtime drift** - Claude and Codex hook manifests now install `UserPromptSubmit` with `AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json`.
31
+
32
+ ### Ecosystem
33
+
34
+ - **Snapshot refresh** - Refreshed the ecosystem doctor snapshot after upstream documentation/content drift review and generator updates.
35
+
36
+ ### Verification
37
+
38
+ - `bats tests/test_generators.bats`
39
+ - `bats tests/test_cli.bats`
40
+ - `bats tests/test_skills_native.bats tests/test_native_surfaces.bats`
41
+ - `bats tests/test_hooks.bats tests/test_search_first_flow.bats`
42
+ - `bats tests/test_install.bats tests/test_codex.bats`
43
+ - `python3 scripts/validate.py --strict`
44
+ - `git diff --check`
45
+
46
+ ---
47
+
10
48
  ## v4.3.3 - silent hook context roll-forward (2026-05-21)
11
49
 
12
50
  Patch release. Rolls forward the quiet-hook release with a stricter default: non-blocking plain-text hook context is now silent even when a runtime uses a stale or manually copied command without `AI_TOOLKIT_HOOK_QUIET=1`.
package/README.md CHANGED
@@ -6,16 +6,16 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Skills](https://img.shields.io/badge/skills-107-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-1144%20passing-success)](tests/)
9
+ [![Tests](https://img.shields.io/badge/tests-1149%20passing-success)](tests/)
10
10
 
11
- ## What's New in v4.3.3
11
+ ## What's New in v4.4.0
12
12
 
13
- Patch release. Rolls forward quiet hook handling so informational hook context stays out of the visible chat window even with stale or manually copied hook commands.
13
+ Minor release. Adds native skill pointers for more editor surfaces and hardens quiet hook governance for Claude and Codex.
14
14
 
15
- - **Silent hook context by default**: `SessionStart`, `UserPromptSubmit`, and other non-blocking plain-text context output now require `AI_TOOLKIT_HOOK_VERBOSE=1`.
16
- - **Side effects preserved**: search-first flags, session-state reset, stale-flag cleanup, and blocking decisions still run without printing reminder text.
17
- - **Runtime refresh applied**: installed hook scripts and Codex/Claude hook config pick up the silent default.
18
- - **Test coverage updated**: hook tests now cover default silence and verbose opt-in, bringing the suite to 1144 tests.
15
+ - **Native editor skills**: Cursor, Windsurf, and Cline now get generated skill pointer catalogs alongside existing rule surfaces.
16
+ - **Quiet JSON governance**: `UserPromptSubmit` keeps output quiet while still injecting `additionalContext` for search-first and workflow reminders.
17
+ - **Codex search-first hardening**: Stop enforcement recognizes current Codex MCP log shapes and tolerates noisy skill-loader output.
18
+ - **Release coverage updated**: generator, install, Codex, hook, and search-first tests cover the new behavior; suite count is 1149 tests.
19
19
 
20
20
  See [CHANGELOG.md](CHANGELOG.md) for full history.
21
21
 
@@ -101,11 +101,11 @@ See [CLI Reference](kb/reference/cli-reference.md) for all commands and options.
101
101
  | Platform | Config Files | Scope |
102
102
  |----------|-------------|-------|
103
103
  | Claude Code | `~/.claude/` | global |
104
- | Cursor | `.cursor/rules/*.mdc` + `.cursor/mcp.json` | project (`~/.cursor/mcp.json` for MCP only) |
105
- | Windsurf | `~/.codeium/.../global_rules.md` + `.windsurf/rules/*.md` | global + project |
104
+ | Cursor | `.cursor/rules/*.mdc` + `.cursor/mcp.json` + `.cursor/skills/*` | project (`~/.cursor/mcp.json` for MCP only) |
105
+ | Windsurf | `~/.codeium/.../global_rules.md` + `~/.codeium/windsurf/skills/*` + `.windsurf/rules/*.md` | global + project |
106
106
  | Gemini CLI | `~/.gemini/GEMINI.md` | global |
107
107
  | GitHub Copilot | `.github/copilot-instructions.md` | project |
108
- | Cline | `~/Documents/Cline/Rules/*.md` + `.clinerules/*.md` | global + project |
108
+ | Cline | `~/.cline/rules/*.md` + `~/.cline/skills/*` + `.clinerules/*.md` | global + project |
109
109
  | Roo Code | `~/.roo/rules/*.md` + `.roomodes` + `.roo/rules/*.md` | global rules + project |
110
110
  | Aider | `~/.aider.conf.yml` + `.aider.conf.yml` + `CONVENTIONS.md` | global + project |
111
111
  | Augment | `~/.augment/rules/*.md` + `.augment/rules/ai-toolkit-*.md` | global + project |
@@ -148,7 +148,7 @@ ai-toolkit/
148
148
  │ └── ARCHITECTURE.md # Full system design
149
149
  ├── kb/ # Reference docs, procedures, plans
150
150
  ├── scripts/ # Validation, install, evaluation scripts
151
- ├── tests/ # Bats test suite (1144 tests)
151
+ ├── tests/ # Bats test suite (1149 tests)
152
152
  └── CHANGELOG.md
153
153
  ```
154
154
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ai-toolkit",
3
3
  "description": "Professional-grade Claude Code toolkit with persona presets, skill security auditor, expanded lifecycle hooks, experimental opt-in plugin packs, benchmark harvesting, and multi-tool support.",
4
- "version": "4.3.3",
4
+ "version": "4.4.0",
5
5
  "author": {
6
6
  "name": "SoftSpark",
7
7
  "url": "https://github.com/softspark"
@@ -356,7 +356,7 @@ Lead Session (You)
356
356
  Language rules are propagated to **all configured editors** — not just Claude. `dir_rules_shared.build_language_rules()` reads `app/rules/<lang>/*.md`, strips frontmatter, and returns combined content per language. Each directory-based generator (Cursor, Windsurf, Cline, Roo, Augment, Antigravity, Codex) emits `ai-toolkit-lang-<lang>` files in its native format. Registered custom rules (`~/.softspark/ai-toolkit/rules/`) are similarly propagated as `ai-toolkit-custom-<name>` files via `build_registered_rules()`.
357
357
 
358
358
  ### Codex Integration
359
- Codex receives `AGENTS.md`, `.agents/rules/*.md`, optional `.agents/skills/*`, and `.codex/hooks.json`. `generate_codex_hooks.py` emits only Codex-supported lifecycle events and prefixes commands with `AI_TOOLKIT_HOOK_QUIET=1`, so informational hook context is not shown at session start or prompt submit while side effects and blocking Stop decisions still run. Claude's bundled `UserPromptSubmit` hook also runs in quiet mode for the same reason.
359
+ Codex receives `AGENTS.md`, `.agents/rules/*.md`, optional `.agents/skills/*`, and `.codex/hooks.json`. `generate_codex_hooks.py` emits only Codex-supported lifecycle events and prefixes commands with `AI_TOOLKIT_HOOK_QUIET=1`, so informational hook output is not shown at session start or prompt submit while side effects and blocking Stop decisions still run. The `UserPromptSubmit` governance hook also sets `AI_TOOLKIT_HOOK_FORMAT=json` so proactive `additionalContext` reaches the model quietly. Claude's bundled `UserPromptSubmit` hook uses the same quiet JSON context path.
360
360
 
361
361
  ### opencode Integration (v2.5.0+)
362
362
  opencode is the 11th supported editor. Five generators handle its integration surface:
@@ -58,12 +58,11 @@ hook_new_content() {
58
58
 
59
59
  hook_emit_context() {
60
60
  local message="$1"
61
- if [ "${AI_TOOLKIT_HOOK_QUIET:-0}" = "1" ]; then
62
- return 0
63
- fi
64
61
  if [ "${AI_TOOLKIT_HOOK_FORMAT:-}" = "json" ]; then
65
62
  jq -nc --arg msg "$message" \
66
63
  '{"hookSpecificOutput":{"additionalContext":$msg},"suppressOutput":true}'
64
+ elif [ "${AI_TOOLKIT_HOOK_QUIET:-0}" = "1" ]; then
65
+ return 0
67
66
  elif [ "${AI_TOOLKIT_HOOK_VERBOSE:-0}" = "1" ]; then
68
67
  printf '%s\n' "$message"
69
68
  fi
@@ -59,7 +59,10 @@ try:
59
59
  with log_path.open("rb") as handle:
60
60
  handle.seek(0, 2)
61
61
  size = handle.tell()
62
- handle.seek(max(0, size - 2_000_000))
62
+ # Codex logs can be noisy between the search call and Stop hook
63
+ # execution, especially when skill loading emits repeated warnings.
64
+ # Keep this bounded, but large enough to avoid false positives.
65
+ handle.seek(max(0, size - 20_000_000))
63
66
  lines = handle.read().decode("utf-8", errors="replace").splitlines()
64
67
  except OSError:
65
68
  sys.exit(1)
package/app/hooks.json CHANGED
@@ -103,7 +103,7 @@
103
103
  "hooks": [
104
104
  {
105
105
  "type": "command",
106
- "command": "AI_TOOLKIT_HOOK_QUIET=1 \"$HOME/.softspark/ai-toolkit/hooks/user-prompt-submit.sh\""
106
+ "command": "AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json \"$HOME/.softspark/ai-toolkit/hooks/user-prompt-submit.sh\""
107
107
  }
108
108
  ]
109
109
  },
@@ -1,5 +1,5 @@
1
1
  {
2
- "last_run": "2026-05-21T08:27:23Z",
2
+ "last_run": "2026-05-25T11:12:53Z",
3
3
  "schema_version": 1,
4
4
  "tools": {
5
5
  "aider": {
@@ -24,14 +24,21 @@
24
24
  }
25
25
  },
26
26
  "augment": {
27
- "docs_hash": "8be23f4fb78816c3",
27
+ "docs_hash": "2546ce56fc2d92e4",
28
28
  "headings": [
29
+ "Admin",
30
+ "Auggie CLI",
29
31
  "Code",
32
+ "Cosmos",
30
33
  "Documentation Index",
34
+ "Getting Started",
31
35
  "Introduction",
36
+ "Models &amp; Pricing",
32
37
  "On this page",
33
38
  "Other automation",
39
+ "Other clients",
34
40
  "Review",
41
+ "Troubleshooting",
35
42
  "\u200bAuggie CLI",
36
43
  "\u200bAutomate your SDLC",
37
44
  "\u200bCosmos",
@@ -58,7 +65,7 @@
58
65
  }
59
66
  },
60
67
  "claude-code": {
61
- "docs_hash": "0518086bd4527849",
68
+ "docs_hash": "78dbdbf9b1b09fe8",
62
69
  "headings": [
63
70
  "Documentation Index",
64
71
  "On this page",
@@ -105,15 +112,20 @@
105
112
  "slash command": true,
106
113
  "sub-agent": true
107
114
  },
108
- "version": "2.1.146 (Claude Code)"
115
+ "version": "2.1.150 (Claude Code)"
109
116
  },
110
117
  "cline": {
111
- "docs_hash": "c2ce2443743365fa",
118
+ "docs_hash": "0d30b8f46cb45976",
112
119
  "headings": [
113
120
  "API Reference",
121
+ "Best Practices",
114
122
  "CLI",
115
123
  "Cline Overview",
124
+ "Configurations",
116
125
  "Documentation Index",
126
+ "Features",
127
+ "Getting Started",
128
+ "IDE Specific Features",
117
129
  "JetBrains Plugin",
118
130
  "Kanban",
119
131
  "Observability",
@@ -121,6 +133,8 @@
121
133
  "SDK",
122
134
  "Security &amp; Governance",
123
135
  "Team Management",
136
+ "Troubleshooting",
137
+ "Usage",
124
138
  "VS Code Extension",
125
139
  "\u200bAgent Core (SDK)",
126
140
  "\u200bApplications",
@@ -142,7 +156,7 @@
142
156
  }
143
157
  },
144
158
  "codex-cli": {
145
- "docs_hash": "70f184b6cdd1f765",
159
+ "docs_hash": "8cad495445dd03e0",
146
160
  "headings": [
147
161
  "About",
148
162
  "Contributing",
@@ -161,7 +175,7 @@
161
175
  "Packages 0",
162
176
  "Provide feedback",
163
177
  "Quickstart",
164
- "Releases 795",
178
+ "Releases 799",
165
179
  "Repository files navigation",
166
180
  "Resources",
167
181
  "Saved searches",
@@ -191,10 +205,10 @@
191
205
  "mcp_servers": false,
192
206
  "sandbox": true
193
207
  },
194
- "version": "codex-cli 0.132.0"
208
+ "version": "codex-cli 0.133.0"
195
209
  },
196
210
  "cursor": {
197
- "docs_hash": "60edb30c9ddcdadd",
211
+ "docs_hash": "56c9209877480e01",
198
212
  "headings": [],
199
213
  "markers": {
200
214
  ".cursor/rules": false,
@@ -210,7 +224,7 @@
210
224
  }
211
225
  },
212
226
  "gemini-cli": {
213
- "docs_hash": "c6aab087667f7717",
227
+ "docs_hash": "6a47f9b11ff1527d",
214
228
  "headings": [
215
229
  "Breadcrumbs",
216
230
  "Directory actions",
@@ -249,7 +263,7 @@
249
263
  }
250
264
  },
251
265
  "github-copilot": {
252
- "docs_hash": "ab274112faeec90f",
266
+ "docs_hash": "a5b81592ca646743",
253
267
  "headings": [
254
268
  "About Copilot auto model selection",
255
269
  "About Copilot integrations",
@@ -281,7 +295,7 @@
281
295
  }
282
296
  },
283
297
  "google-antigravity": {
284
- "docs_hash": "2c48c702b9e592a7",
298
+ "docs_hash": "6f089d2c7caabceb",
285
299
  "headings": [],
286
300
  "markers": {
287
301
  "AGENTS.md": false,
@@ -297,7 +311,7 @@
297
311
  }
298
312
  },
299
313
  "opencode": {
300
- "docs_hash": "5277673e235393f7",
314
+ "docs_hash": "74eb2d934df9b613",
301
315
  "headings": [
302
316
  "Add features",
303
317
  "Ask questions",
@@ -357,18 +371,23 @@
357
371
  }
358
372
  },
359
373
  "windsurf": {
360
- "docs_hash": "fa29ba621f291d81",
374
+ "docs_hash": "eddf51fabbcaa0a3",
361
375
  "headings": [
376
+ "Accounts",
362
377
  "Advanced",
378
+ "Agent Command Center",
363
379
  "App Deploys",
364
380
  "Cascade",
365
381
  "Context Awareness",
366
382
  "Documentation Index",
383
+ "Editor",
367
384
  "MCP",
368
385
  "Memories",
369
386
  "On this page",
370
387
  "Recommended Plugins",
388
+ "Security",
371
389
  "Terminal",
390
+ "Troubleshooting",
372
391
  "Usage",
373
392
  "Welcome to Windsurf",
374
393
  "Workflows",
@@ -390,11 +409,13 @@
390
409
  "AGENTS.md": true,
391
410
  "Cascade": true,
392
411
  "MCP": true,
412
+ "SKILL.md": false,
393
413
  "always_on": false,
394
414
  "glob": true,
395
415
  "hooks": true,
396
416
  "memories": true,
397
417
  "model_decision": false,
418
+ "skills": true,
398
419
  "windsurfrules": false,
399
420
  "workflows": true
400
421
  }
@@ -3,9 +3,9 @@ title: "SOP: Claude Toolkit Maintenance"
3
3
  category: procedures
4
4
  service: ai-toolkit
5
5
  tags: [sop, maintenance, agents, skills, install]
6
- version: "3.0.0"
6
+ version: "3.0.1"
7
7
  created: "2026-03-23"
8
- last_updated: "2026-04-23"
8
+ last_updated: "2026-05-25"
9
9
  description: "Standard operating procedures for installing, maintaining, and evolving the ai-toolkit."
10
10
  ---
11
11
 
@@ -34,7 +34,7 @@ ai-toolkit install --local --editors all # all supported editor
34
34
  ai-toolkit install --local --editors cursor,aider # specific editors only
35
35
  ```
36
36
 
37
- Supported editors: `cursor`, `windsurf`, `cline`, `roo`, `aider`, `augment`, `copilot`, `antigravity`, `codex`.
37
+ Supported editors: `cursor`, `windsurf`, `cline`, `roo`, `aider`, `augment`, `copilot`, `antigravity`, `codex`, `gemini`, `opencode`.
38
38
 
39
39
  To restrict which language rules are injected, use `--lang`:
40
40
 
@@ -202,6 +202,43 @@ Manual path:
202
202
 
203
203
  Use `PreToolUse` for blocking validations, `PostToolUse` for non-blocking feedback, `UserPromptSubmit` for prompt governance, and `PreCompact` / `SessionEnd` for context preservation and handoff.
204
204
 
205
+ ## Troubleshooting Rule Enforcement in Claude Code
206
+
207
+ Use this when Claude appears to ignore `CLAUDE.md`, `.claude/rules/*.md`, output styles, or search-first rules.
208
+
209
+ 1. **Check current Claude docs first.** Confirm the live contract for memory, settings, output styles, and hooks:
210
+ - `https://code.claude.com/docs/en/memory`
211
+ - `https://code.claude.com/docs/en/settings`
212
+ - `https://code.claude.com/docs/en/output-styles`
213
+ - `https://code.claude.com/docs/en/hooks`
214
+ 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.
215
+ 3. **Verify the active output style.** Check `.claude/settings.local.json` or `/config`. Output style changes apply after `/clear` or a new session.
216
+ 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.
217
+ 5. **Reproduce the hook path directly.**
218
+ ```bash
219
+ printf '{"session_id":"debug","prompt":"debug this technical rule issue"}' \
220
+ | AI_TOOLKIT_SEARCH_FIRST=strict AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json \
221
+ ~/.softspark/ai-toolkit/hooks/user-prompt-submit.sh
222
+ ```
223
+ The output must be valid JSON with `hookSpecificOutput.additionalContext`.
224
+ 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.
225
+ 7. **Repair drift.** Run:
226
+ ```bash
227
+ ai-toolkit update --only hooks
228
+ python3 scripts/ecosystem_doctor.py --tool claude-code --format text
229
+ scripts/validate.py
230
+ ```
231
+
232
+ ## Verification
233
+
234
+ After changing rule-enforcement behavior, run at minimum:
235
+
236
+ ```bash
237
+ bats tests/test_hooks.bats tests/test_search_first_flow.bats
238
+ bats tests/test_install.bats tests/test_codex.bats
239
+ python3 scripts/validate.py --strict
240
+ ```
241
+
205
242
  ## Managing Plugins
206
243
 
207
244
  ```bash
@@ -105,11 +105,11 @@ Machine (global) Project (local)
105
105
  **`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.
106
106
 
107
107
  **`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`:
108
- - `--editors all` — install all 9 editors (Cursor, Windsurf, Cline, Roo, Aider, Augment, Copilot, Antigravity, Codex)
108
+ - `--editors all` — install all 11 editors (Cursor, Windsurf, Cline, Roo, Aider, Augment, Copilot, Antigravity, Codex, Gemini, opencode)
109
109
  - `--editors cursor,aider` — install only selected editors
110
110
  - (no flag) — auto-detect from existing project files; `update --local` picks up whatever editors already have configs
111
111
 
112
- 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`.
112
+ 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`.
113
113
 
114
114
  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`).
115
115
 
@@ -110,10 +110,12 @@ This means Claude-only events such as `TaskCompleted`, `TeammateIdle`,
110
110
  `~/.codex/hooks.json` (global layer). Non-Codex events are silently skipped.
111
111
  `remove-hook` cleans both Claude and Codex targets.
112
112
 
113
- Generated Codex hook commands include `AI_TOOLKIT_HOOK_QUIET=1`. This keeps
114
- non-blocking reminders and startup context out of the visible Codex hook output
115
- while preserving hook side effects and blocking decisions such as search-first
116
- Stop enforcement.
113
+ Generated Codex hook commands include `AI_TOOLKIT_HOOK_QUIET=1`. The
114
+ `UserPromptSubmit` governance hook additionally sets `AI_TOOLKIT_HOOK_FORMAT=json`
115
+ so it can pass quiet `additionalContext` before the model responds. This keeps
116
+ non-blocking reminders and startup context out of visible hook output while
117
+ preserving hook side effects, proactive search-first context, and blocking
118
+ decisions such as search-first Stop enforcement.
117
119
 
118
120
  Plain-text informational hook context is also silent by default in the shared
119
121
  hook helper. Set `AI_TOOLKIT_HOOK_VERBOSE=1` only when debugging hook output
@@ -133,6 +135,8 @@ Known limits:
133
135
  so `stop-search-check.sh` also checks `~/.codex/log/codex-tui.log` for
134
136
  `smart_query`, `hybrid_search_kb`, `crag_search`, `multi_hop_search`, and
135
137
  `verify_answer` calls after the search-first flag timestamp before blocking.
138
+ The scan is bounded to a recent log window, but sized to tolerate noisy Codex
139
+ skill-loader output between the search call and the Stop hook.
136
140
 
137
141
  These are runtime platform limits, not installation defects.
138
142
 
@@ -60,10 +60,10 @@ The `--profile` flag controls how much of each editor's native surface is activa
60
60
  `ai-toolkit install --editors <name>` can write global files only for editors
61
61
  with documented, file-based config surfaces:
62
62
 
63
- - `windsurf`: `~/.codeium/windsurf/memories/global_rules.md`
63
+ - `windsurf`: `~/.codeium/windsurf/memories/global_rules.md` plus `~/.codeium/windsurf/skills/ai-toolkit-skill-catalogue/SKILL.md`
64
64
  - `gemini`: `~/.gemini/GEMINI.md`
65
65
  - `augment`: `~/.augment/rules/ai-toolkit.md`
66
- - `cline`: `~/Documents/Cline/Rules/ai-toolkit-*.md`
66
+ - `cline`: `~/.cline/rules/ai-toolkit-*.md` plus `~/.cline/skills/ai-toolkit-skill-catalogue/SKILL.md`
67
67
  - `roo`: `~/.roo/rules/ai-toolkit-*.md`
68
68
  - `aider`: `~/.aider.conf.yml` plus `~/.aider-ai-toolkit-CONVENTIONS.md` when the YAML file does not already exist
69
69
  - `codex`: `~/AGENTS.md`, `~/.agents/rules/*`, `~/.agents/skills/*`, `~/.codex/hooks.json`
@@ -3,9 +3,9 @@ title: "Hooks Catalog"
3
3
  category: reference
4
4
  service: ai-toolkit
5
5
  tags: [hooks, quality, safety, enforcement, settings.json]
6
- version: "1.5.3"
6
+ version: "1.5.5"
7
7
  created: "2026-03-27"
8
- last_updated: "2026-05-21"
8
+ last_updated: "2026-05-25"
9
9
  description: "Complete reference of all ai-toolkit hooks: events, scripts, installation, and runtime behavior."
10
10
  ---
11
11
 
@@ -112,11 +112,13 @@ and can provide a lightweight governance reminder: plan mode for architectural
112
112
  work, evidence-first debugging, KB-first research, and validation expectations.
113
113
 
114
114
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`. The bundled `app/hooks.json`
115
- registers this command with `AI_TOOLKIT_HOOK_QUIET=1`, so it still arms or
116
- clears the per-session search-first flag but suppresses the informational
117
- reminder output. In plain-text mode, informational reminders are silent by
118
- default and require `AI_TOOLKIT_HOOK_VERBOSE=1`; JSON hook output remains
119
- available with `AI_TOOLKIT_HOOK_FORMAT=json`.
115
+ registers this command with `AI_TOOLKIT_HOOK_QUIET=1 AI_TOOLKIT_HOOK_FORMAT=json`.
116
+ This keeps the hook visually quiet (`suppressOutput: true`) while still
117
+ injecting `hookSpecificOutput.additionalContext` before Claude starts working.
118
+ That context is the proactive half of search-first enforcement; the paired
119
+ `stop-search-check.sh` remains the corrective half. In plain-text mode,
120
+ informational reminders are silent by default and require
121
+ `AI_TOOLKIT_HOOK_VERBOSE=1`.
120
122
 
121
123
  ### UserPromptSubmit (usage tracking) — `track-usage.sh`
122
124
 
@@ -393,7 +395,7 @@ First-match-wins per file. Built-in runners: `bats`, `pytest`, `vitest`, `jest`.
393
395
  | Script | `~/.softspark/ai-toolkit/hooks/search-tracker.sh` |
394
396
  | Fires | After any search-style tool call |
395
397
 
396
- **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.
398
+ **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.
397
399
 
398
400
  Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
399
401
 
@@ -444,7 +446,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
444
446
  | `scripts/test_cohesion.py` | Resolves changed paths → test commands via cohesion map. First-match-wins. Stdlib-only. |
445
447
  | `app/hooks/test-cohesion-map.json` | Toolkit-default path → tests mapping (used when no project map exists). |
446
448
  | `app/hooks/_locate-toolkit.sh` | Shared bash helper that exports `$TOOLKIT_DIR` for hooks needing scripts/. |
447
- | `app/hooks/_hook-io.sh` | Shared bash helper that normalizes hook payloads across Claude, Augment, Gemini, Windsurf, and Cursor-style JSON. Honors `AI_TOOLKIT_HOOK_QUIET=1` and `AI_TOOLKIT_HOOK_VERBOSE=1` for non-blocking context output. |
449
+ | `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`. |
448
450
  | `app/hooks/_search-capability.sh` | Shared bash helper that enables search-first blocking only when RAG/Web is configured or strict mode is requested. |
449
451
 
450
452
  ## Runtime Profiles
@@ -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.2.1"
6
+ version: "1.3.0"
7
7
  created: "2026-04-23"
8
- last_updated: "2026-04-28"
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 | `.claude/skills/`, `.claude/agents/`, `.agents/skills/` (Cursor cross-reads these so ai-toolkit's Claude/Codex installs work automatically) |
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`, `.clinerules/workflows/*.md`, `.clinerules/hooks/`, `.cline/skills/`, `~/.cline/data/settings/cline_mcp_settings.json`, `~/Documents/Cline/Rules/` |
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. Skills (`.cline/skills/`) and hooks (`.clinerules/hooks/`) remain experimental upstream and are not yet generated. |
105
- | Global install | `ai-toolkit install --editors cline` writes only documented global rules under `~/Documents/Cline/Rules/`; MCP remains managed by `ai-toolkit mcp install --editor cline`. |
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.0"
4407
+ version: "3.0.1"
4408
4408
  created: "2026-03-23"
4409
- last_updated: "2026-04-23"
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 9 editors (Cursor, Windsurf, Cline, Roo, Aider, Augment, Copilot, Antigravity, Codex)
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
 
@@ -7035,10 +7072,12 @@ 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`. This keeps
7039
- non-blocking reminders and startup context out of the visible Codex hook output
7040
- while preserving hook side effects and blocking decisions such as search-first
7041
- Stop enforcement.
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.
7042
7081
 
7043
7082
  Plain-text informational hook context is also silent by default in the shared
7044
7083
  hook helper. Set `AI_TOOLKIT_HOOK_VERBOSE=1` only when debugging hook output
@@ -7058,6 +7097,8 @@ Known limits:
7058
7097
  so `stop-search-check.sh` also checks `~/.codex/log/codex-tui.log` for
7059
7098
  `smart_query`, `hybrid_search_kb`, `crag_search`, `multi_hop_search`, and
7060
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.
7061
7102
 
7062
7103
  These are runtime platform limits, not installation defects.
7063
7104
 
@@ -8533,10 +8574,10 @@ The `--profile` flag controls how much of each editor's native surface is activa
8533
8574
  `ai-toolkit install --editors <name>` can write global files only for editors
8534
8575
  with documented, file-based config surfaces:
8535
8576
 
8536
- - `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`
8537
8578
  - `gemini`: `~/.gemini/GEMINI.md`
8538
8579
  - `augment`: `~/.augment/rules/ai-toolkit.md`
8539
- - `cline`: `~/Documents/Cline/Rules/ai-toolkit-*.md`
8580
+ - `cline`: `~/.cline/rules/ai-toolkit-*.md` plus `~/.cline/skills/ai-toolkit-skill-catalogue/SKILL.md`
8540
8581
  - `roo`: `~/.roo/rules/ai-toolkit-*.md`
8541
8582
  - `aider`: `~/.aider.conf.yml` plus `~/.aider-ai-toolkit-CONVENTIONS.md` when the YAML file does not already exist
8542
8583
  - `codex`: `~/AGENTS.md`, `~/.agents/rules/*`, `~/.agents/skills/*`, `~/.codex/hooks.json`
@@ -8839,9 +8880,9 @@ title: "Hooks Catalog"
8839
8880
  category: reference
8840
8881
  service: ai-toolkit
8841
8882
  tags: [hooks, quality, safety, enforcement, settings.json]
8842
- version: "1.5.3"
8883
+ version: "1.5.5"
8843
8884
  created: "2026-03-27"
8844
- last_updated: "2026-05-21"
8885
+ last_updated: "2026-05-25"
8845
8886
  description: "Complete reference of all ai-toolkit hooks: events, scripts, installation, and runtime behavior."
8846
8887
  ---
8847
8888
 
@@ -8948,11 +8989,13 @@ and can provide a lightweight governance reminder: plan mode for architectural
8948
8989
  work, evidence-first debugging, KB-first research, and validation expectations.
8949
8990
 
8950
8991
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`. The bundled `app/hooks.json`
8951
- registers this command with `AI_TOOLKIT_HOOK_QUIET=1`, so it still arms or
8952
- clears the per-session search-first flag but suppresses the informational
8953
- reminder output. In plain-text mode, informational reminders are silent by
8954
- default and require `AI_TOOLKIT_HOOK_VERBOSE=1`; JSON hook output remains
8955
- available with `AI_TOOLKIT_HOOK_FORMAT=json`.
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`.
8956
8999
 
8957
9000
  ### UserPromptSubmit (usage tracking) — `track-usage.sh`
8958
9001
 
@@ -9229,7 +9272,7 @@ First-match-wins per file. Built-in runners: `bats`, `pytest`, `vitest`, `jest`.
9229
9272
  | Script | `~/.softspark/ai-toolkit/hooks/search-tracker.sh` |
9230
9273
  | Fires | After any search-style tool call |
9231
9274
 
9232
- **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.
9233
9276
 
9234
9277
  Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9235
9278
 
@@ -9280,7 +9323,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9280
9323
  | `scripts/test_cohesion.py` | Resolves changed paths → test commands via cohesion map. First-match-wins. Stdlib-only. |
9281
9324
  | `app/hooks/test-cohesion-map.json` | Toolkit-default path → tests mapping (used when no project map exists). |
9282
9325
  | `app/hooks/_locate-toolkit.sh` | Shared bash helper that exports `$TOOLKIT_DIR` for hooks needing scripts/. |
9283
- | `app/hooks/_hook-io.sh` | Shared bash helper that normalizes hook payloads across Claude, Augment, Gemini, Windsurf, and Cursor-style JSON. Honors `AI_TOOLKIT_HOOK_QUIET=1` and `AI_TOOLKIT_HOOK_VERBOSE=1` for non-blocking context output. |
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`. |
9284
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. |
9285
9328
 
9286
9329
  ## Runtime Profiles
@@ -11671,9 +11714,9 @@ title: "Supported Tools Registry"
11671
11714
  category: reference
11672
11715
  service: ai-toolkit
11673
11716
  tags: [editors, platforms, generators, integration, ecosystem]
11674
- version: "1.2.1"
11717
+ version: "1.3.0"
11675
11718
  created: "2026-04-23"
11676
- last_updated: "2026-04-28"
11719
+ last_updated: "2026-05-25"
11677
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."
11678
11721
  ---
11679
11722
 
@@ -11715,9 +11758,9 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11715
11758
  | Docs | https://cursor.com/docs |
11716
11759
  | Changelog | https://cursor.com/changelog |
11717
11760
  | Stable docs mirror | https://cursor.com/llms.txt (all doc pages have .md twins) |
11718
- | 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` |
11719
- | Compat read paths | `.claude/skills/`, `.claude/agents/`, `.agents/skills/` (Cursor cross-reads these so ai-toolkit's Claude/Codex installs work automatically) |
11720
- | 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) |
11721
11764
  | Tracked capabilities | `cursorrules`, `.cursor/rules`, `AGENTS.md`, `mcp.json`, Composer, Agent Mode, hooks.json, subagents, skills, plugins |
11722
11765
 
11723
11766
  ### Windsurf
@@ -11728,10 +11771,10 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11728
11771
  | Docs | https://docs.windsurf.com |
11729
11772
  | Changelog | https://windsurf.com/changelog |
11730
11773
  | Stable docs mirror | https://docs.windsurf.com/llms.txt + per-page .md twins |
11731
- | 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` |
11732
11775
  | Compat read paths | `.agents/skills/`, `~/.agents/skills/`, (with Claude Code config-reading) `.claude/skills/`, `~/.claude/skills/` |
11733
- | Our generators | `scripts/generate_windsurf.py`, `scripts/generate_windsurf_rules.py`, `scripts/generate_windsurf_hooks.py` (profile=full) |
11734
- | 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 |
11735
11778
  | Activation modes emitted | always_on (agents/security/quality), glob (testing + language rules), model_decision (code-style/workflow) |
11736
11779
 
11737
11780
  ### GitHub Copilot
@@ -11766,11 +11809,11 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11766
11809
  | ID | `cline` |
11767
11810
  | Docs | https://docs.cline.bot |
11768
11811
  | Release notes | https://github.com/cline/cline/releases |
11769
- | Config paths | `.clinerules/*.md`, `.clinerules/workflows/*.md`, `.clinerules/hooks/`, `.cline/skills/`, `~/.cline/data/settings/cline_mcp_settings.json`, `~/Documents/Cline/Rules/` |
11770
- | 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` |
11771
11814
  | Tracked capabilities | `clinerules`, Plan Mode, Act Mode, MCP, custom modes, workflows, hooks, skills, subagents, conditional rules |
11772
- | Notes | Conditional rules (`paths:` YAML frontmatter) are emitted for testing and language-specific rules since 2026-04. Skills (`.cline/skills/`) and hooks (`.clinerules/hooks/`) remain experimental upstream and are not yet generated. |
11773
- | Global install | `ai-toolkit install --editors cline` writes only documented global rules under `~/Documents/Cline/Rules/`; MCP remains managed by `ai-toolkit mcp install --editor cline`. |
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`. |
11774
11817
 
11775
11818
  ### Roo Code
11776
11819
 
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.3.3",
2
+ "version": "4.4.0",
3
3
  "components": {
4
4
  "agents": {
5
5
  "description": "44 specialized agents (orchestrator, backend, frontend, security, devops, etc.)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softspark/ai-toolkit",
3
- "version": "4.3.3",
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-04-23",
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
- ".clinerules/hooks/",
229
- ".cline/skills/",
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
- "~/Documents/Cline/Rules/"
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
- entry: dict = {"hooks": [{"type": "command", "command": f"{HOOKS_PREFIX}{script}\""}]}
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()
@@ -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: ~/Documents/Cline/Rules/
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
@@ -54,11 +54,11 @@ def install_ai_tools(target_dir: Path, rules_dir: Path,
54
54
  # in the requested set, install it unconditionally.
55
55
 
56
56
  if "windsurf" in eds:
57
- windsurf_file = target_dir / ".codeium" / "windsurf" / "memories" / "global_rules.md"
58
57
  if dry_run:
59
58
  print(" Would inject: ~/.codeium/windsurf/memories/global_rules.md")
59
+ print(" Would generate: ~/.codeium/windsurf/skills/ai-toolkit-skill-catalogue/SKILL.md")
60
60
  else:
61
- inject_with_rules("generate-windsurf.sh", windsurf_file, rules_dir)
61
+ _install_windsurf_global(target_dir, rules_dir)
62
62
  installed.append("windsurf")
63
63
 
64
64
  if "gemini" in eds:
@@ -79,7 +79,8 @@ def install_ai_tools(target_dir: Path, rules_dir: Path,
79
79
 
80
80
  if "cline" in eds:
81
81
  if dry_run:
82
- print(" Would generate: ~/Documents/Cline/Rules/ai-toolkit-*.md")
82
+ print(" Would generate: ~/.cline/rules/ai-toolkit-*.md")
83
+ print(" Would generate: ~/.cline/skills/ai-toolkit-skill-catalogue/SKILL.md")
83
84
  else:
84
85
  _install_cline_global(target_dir, rules_dir)
85
86
  installed.append("cline")
@@ -149,11 +150,23 @@ def _install_codex_global(target_dir: Path, rules_dir: Path) -> None:
149
150
  _install_codex_skills(target_dir)
150
151
 
151
152
 
153
+ def _install_windsurf_global(target_dir: Path, rules_dir: Path) -> None:
154
+ """Install Windsurf global rules plus an Agent Skills catalogue pointer."""
155
+ windsurf_file = target_dir / ".codeium" / "windsurf" / "memories" / "global_rules.md"
156
+ inject_with_rules("generate-windsurf.sh", windsurf_file, rules_dir)
157
+
158
+ from generate_windsurf_skills import generate as gen_windsurf_skills
159
+ gen_windsurf_skills(
160
+ target_dir,
161
+ skill_root=".codeium/windsurf/skills",
162
+ )
163
+
164
+
152
165
  def _install_cline_global(target_dir: Path, rules_dir: Path) -> None:
153
- """Install Cline global rules in the documented user rules directory."""
166
+ """Install Cline global rules in the documented ~/.cline directory."""
154
167
  from generate_cline_rules import generate as gen_cline_rules
155
168
 
156
- rules_root = target_dir / "Documents" / "Cline" / "Rules"
169
+ rules_root = target_dir / ".cline" / "rules"
157
170
  gen_cline_rules(
158
171
  target_dir,
159
172
  rules_dir=rules_dir,
@@ -161,7 +174,10 @@ def _install_cline_global(target_dir: Path, rules_dir: Path) -> None:
161
174
  emit_workflows=False,
162
175
  managed_scopes=("standard", "custom"),
163
176
  )
164
- print(" Created: ~/Documents/Cline/Rules/ai-toolkit-*.md")
177
+ print(" Created: ~/.cline/rules/ai-toolkit-*.md")
178
+
179
+ from generate_cline_skills import generate as gen_cline_skills
180
+ gen_cline_skills(target_dir)
165
181
 
166
182
 
167
183
  def _install_roo_global(target_dir: Path, rules_dir: Path) -> None:
@@ -693,9 +709,11 @@ def _install_local_dry_run(reset: bool, editors: list[str] | None = None,
693
709
  print(" Would generate: .gemini/settings.json hooks (profile >= standard)")
694
710
  if add_native_surfaces:
695
711
  if "cursor" in eds:
696
- print(" Would generate: .cursor/hooks.json + .cursor/agents/ (profile=full)")
712
+ print(" Would generate: .cursor/hooks.json + .cursor/agents/ + .cursor/skills/ (profile=full)")
697
713
  if "windsurf" in eds:
698
- print(" Would generate: .windsurf/hooks.json (profile=full)")
714
+ print(" Would generate: .windsurf/hooks.json + .windsurf/skills/ (profile=full)")
715
+ if "cline" in eds:
716
+ print(" Would generate: .cline/skills/ (profile=full)")
699
717
  if "augment" in eds:
700
718
  print(" Would generate: .augment/agents/ + .augment/commands/ + "
701
719
  "$HOME/.augment/settings.json + .augment/skills/ (profile=full)")
@@ -907,6 +925,7 @@ def _create_local_ai_tool_configs(cwd: Path, rules_dir: Path,
907
925
  if add_native_surfaces:
908
926
  _try_generator("generate_cursor_hooks", cwd)
909
927
  _try_generator("generate_cursor_agents", cwd)
928
+ _try_generator("generate_cursor_skills", cwd)
910
929
 
911
930
  if "windsurf" in eds:
912
931
  inject_with_rules(
@@ -919,6 +938,7 @@ def _create_local_ai_tool_configs(cwd: Path, rules_dir: Path,
919
938
  rules_dir=rules_dir)
920
939
  if add_native_surfaces:
921
940
  _try_generator("generate_windsurf_hooks", cwd)
941
+ _try_generator("generate_windsurf_skills", cwd)
922
942
 
923
943
  if "cline" in eds:
924
944
  # Migrate: remove legacy .clinerules single file (replaced by directory)
@@ -933,6 +953,8 @@ def _create_local_ai_tool_configs(cwd: Path, rules_dir: Path,
933
953
  rules_dir=rules_dir,
934
954
  managed_scopes=("standard", "lang", "custom"),
935
955
  )
956
+ if add_native_surfaces:
957
+ _try_generator("generate_cline_skills", cwd)
936
958
 
937
959
  if "roo" in eds:
938
960
  roo_output = run_script("generate-roo-modes.sh", capture=True)
@@ -0,0 +1,49 @@
1
+ """Shared generator for editor-native ai-toolkit skill catalogue pointers."""
2
+ from __future__ import annotations
3
+
4
+ from pathlib import Path
5
+
6
+ from emission import emit_skills_bullets
7
+
8
+
9
+ POINTER_SKILL_NAME = "ai-toolkit-skill-catalogue"
10
+
11
+
12
+ def build_pointer_skill(editor_name: str) -> str:
13
+ """Build a SKILL.md pointer to the canonical ai-toolkit skill catalogue."""
14
+ body = (
15
+ "# AI Toolkit Skill Catalogue\n\n"
16
+ f"This workspace uses ai-toolkit with {editor_name}. Real skills are "
17
+ "installed alongside Claude Code at `.claude/skills/` (project "
18
+ "install) or `~/.claude/skills/` (global install). If those paths are "
19
+ "not present, use the catalogue below to identify the matching "
20
+ "ai-toolkit skill before recreating its workflow manually.\n\n"
21
+ "## When to use this skill\n\n"
22
+ "- The user's request maps to one of the catalogued skills below.\n"
23
+ "- You need to discover which ai-toolkit skill should guide the task.\n\n"
24
+ "## How to use a catalogue entry\n\n"
25
+ "1. Match the user's task to a skill name in the catalogue.\n"
26
+ "2. Read the skill's SKILL.md from `.claude/skills/<name>/SKILL.md` "
27
+ "or `~/.claude/skills/<name>/SKILL.md` when available.\n"
28
+ "3. Follow that skill's workflow, rules, gotchas, and exclusions.\n\n"
29
+ "## Catalogue\n\n"
30
+ f"{emit_skills_bullets()}\n"
31
+ )
32
+ return (
33
+ "---\n"
34
+ f"name: {POINTER_SKILL_NAME}\n"
35
+ "description: Index of ai-toolkit skills installed at .claude/skills/"
36
+ " or ~/.claude/skills/. Read this first when the user's request "
37
+ "matches a named skill.\n"
38
+ "---\n"
39
+ f"{body}"
40
+ )
41
+
42
+
43
+ def write_pointer_skill(target_dir: Path, skill_root: str, editor_name: str) -> Path:
44
+ """Write a pointer skill under ``skill_root/<pointer>/SKILL.md``."""
45
+ skill_dir = target_dir / skill_root / POINTER_SKILL_NAME
46
+ skill_dir.mkdir(parents=True, exist_ok=True)
47
+ skill_file = skill_dir / "SKILL.md"
48
+ skill_file.write_text(build_pointer_skill(editor_name), encoding="utf-8")
49
+ return skill_file