@softspark/ai-toolkit 4.3.0 → 4.3.2
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 +56 -0
- package/README.md +10 -9
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/ARCHITECTURE.md +6 -1
- package/app/hooks/_hook-io.sh +17 -0
- package/app/hooks/_search-capability.sh +52 -4
- package/app/hooks/commit-quality.sh +1 -0
- package/app/hooks/governance-capture.sh +1 -0
- package/app/hooks/guard-config.sh +1 -0
- package/app/hooks/guard-destructive.sh +1 -0
- package/app/hooks/mcp-health.sh +3 -1
- package/app/hooks/revert-guard.sh +1 -0
- package/app/hooks/search-tracker.sh +6 -2
- package/app/hooks/session-start.sh +22 -12
- package/app/hooks/stop-search-check.sh +56 -1
- package/app/hooks/test-cohesion.sh +1 -0
- package/app/hooks/track-usage.sh +1 -0
- package/app/hooks/user-prompt-submit.sh +2 -1
- package/app/hooks.json +2 -2
- package/benchmarks/ecosystem-doctor-snapshot.json +42 -37
- package/kb/procedures/release-verification-sop.md +7 -5
- package/kb/reference/codex-cli-compatibility.md +11 -2
- package/kb/reference/hooks-catalog.md +21 -8
- package/llms-full.txt +122 -30
- package/manifest.json +2 -2
- package/package.json +1 -1
- package/scripts/generate_codex_hooks.py +1 -1
- package/scripts/test_cohesion.py +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"last_run": "2026-05-
|
|
2
|
+
"last_run": "2026-05-21T08:27:23Z",
|
|
3
3
|
"schema_version": 1,
|
|
4
4
|
"tools": {
|
|
5
5
|
"aider": {
|
|
@@ -24,17 +24,18 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"augment": {
|
|
27
|
-
"docs_hash": "
|
|
27
|
+
"docs_hash": "8be23f4fb78816c3",
|
|
28
28
|
"headings": [
|
|
29
|
-
"
|
|
30
|
-
"Chat",
|
|
29
|
+
"Code",
|
|
31
30
|
"Documentation Index",
|
|
32
31
|
"Introduction",
|
|
32
|
+
"On this page",
|
|
33
|
+
"Other automation",
|
|
34
|
+
"Review",
|
|
33
35
|
"\u200bAuggie CLI",
|
|
34
|
-
"\
|
|
35
|
-
"\
|
|
36
|
-
"\
|
|
37
|
-
"\u200bVisual Studio Code"
|
|
36
|
+
"\u200bAutomate your SDLC",
|
|
37
|
+
"\u200bCosmos",
|
|
38
|
+
"\u200bGet started in minutes"
|
|
38
39
|
],
|
|
39
40
|
"markers": {
|
|
40
41
|
".augment": true,
|
|
@@ -57,10 +58,11 @@
|
|
|
57
58
|
}
|
|
58
59
|
},
|
|
59
60
|
"claude-code": {
|
|
60
|
-
"docs_hash": "
|
|
61
|
+
"docs_hash": "0518086bd4527849",
|
|
61
62
|
"headings": [
|
|
62
|
-
"Claude Code overview",
|
|
63
63
|
"Documentation Index",
|
|
64
|
+
"On this page",
|
|
65
|
+
"Overview",
|
|
64
66
|
"\u200bGet started",
|
|
65
67
|
"\u200bNext steps",
|
|
66
68
|
"\u200bUse Claude Code everywhere",
|
|
@@ -103,24 +105,27 @@
|
|
|
103
105
|
"slash command": true,
|
|
104
106
|
"sub-agent": true
|
|
105
107
|
},
|
|
106
|
-
"version": "2.1.
|
|
108
|
+
"version": "2.1.146 (Claude Code)"
|
|
107
109
|
},
|
|
108
110
|
"cline": {
|
|
109
|
-
"docs_hash": "
|
|
111
|
+
"docs_hash": "c2ce2443743365fa",
|
|
110
112
|
"headings": [
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"Customization",
|
|
113
|
+
"API Reference",
|
|
114
|
+
"CLI",
|
|
115
|
+
"Cline Overview",
|
|
115
116
|
"Documentation Index",
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
117
|
+
"JetBrains Plugin",
|
|
118
|
+
"Kanban",
|
|
119
|
+
"Observability",
|
|
120
|
+
"On this page",
|
|
121
|
+
"SDK",
|
|
122
|
+
"Security & Governance",
|
|
123
|
+
"Team Management",
|
|
124
|
+
"VS Code Extension",
|
|
125
|
+
"\u200bAgent Core (SDK)",
|
|
126
|
+
"\u200bApplications",
|
|
127
|
+
"\u200bEnterprise Solutions",
|
|
128
|
+
"\u200bOther IDE Supports",
|
|
124
129
|
"\u200bWhat is Cline?"
|
|
125
130
|
],
|
|
126
131
|
"markers": {
|
|
@@ -137,7 +142,7 @@
|
|
|
137
142
|
}
|
|
138
143
|
},
|
|
139
144
|
"codex-cli": {
|
|
140
|
-
"docs_hash": "
|
|
145
|
+
"docs_hash": "70f184b6cdd1f765",
|
|
141
146
|
"headings": [
|
|
142
147
|
"About",
|
|
143
148
|
"Contributing",
|
|
@@ -156,7 +161,7 @@
|
|
|
156
161
|
"Packages 0",
|
|
157
162
|
"Provide feedback",
|
|
158
163
|
"Quickstart",
|
|
159
|
-
"Releases
|
|
164
|
+
"Releases 795",
|
|
160
165
|
"Repository files navigation",
|
|
161
166
|
"Resources",
|
|
162
167
|
"Saved searches",
|
|
@@ -186,10 +191,10 @@
|
|
|
186
191
|
"mcp_servers": false,
|
|
187
192
|
"sandbox": true
|
|
188
193
|
},
|
|
189
|
-
"version": "codex-cli 0.
|
|
194
|
+
"version": "codex-cli 0.132.0"
|
|
190
195
|
},
|
|
191
196
|
"cursor": {
|
|
192
|
-
"docs_hash": "
|
|
197
|
+
"docs_hash": "60edb30c9ddcdadd",
|
|
193
198
|
"headings": [],
|
|
194
199
|
"markers": {
|
|
195
200
|
".cursor/rules": false,
|
|
@@ -205,7 +210,7 @@
|
|
|
205
210
|
}
|
|
206
211
|
},
|
|
207
212
|
"gemini-cli": {
|
|
208
|
-
"docs_hash": "
|
|
213
|
+
"docs_hash": "c6aab087667f7717",
|
|
209
214
|
"headings": [
|
|
210
215
|
"Breadcrumbs",
|
|
211
216
|
"Directory actions",
|
|
@@ -244,16 +249,16 @@
|
|
|
244
249
|
}
|
|
245
250
|
},
|
|
246
251
|
"github-copilot": {
|
|
247
|
-
"docs_hash": "
|
|
252
|
+
"docs_hash": "ab274112faeec90f",
|
|
248
253
|
"headings": [
|
|
249
254
|
"About Copilot auto model selection",
|
|
250
255
|
"About Copilot integrations",
|
|
251
256
|
"About agent management",
|
|
252
257
|
"About agent skills",
|
|
253
|
-
"About agentic memory for GitHub Copilot",
|
|
254
258
|
"About billing for GitHub Copilot in organizations and enterprises",
|
|
255
259
|
"About billing for individual GitHub Copilot plans",
|
|
256
260
|
"About custom agents",
|
|
261
|
+
"About customizing GitHub Copilot responses",
|
|
257
262
|
"Articles",
|
|
258
263
|
"Did you find what you needed?",
|
|
259
264
|
"GitHub Copilot",
|
|
@@ -276,7 +281,7 @@
|
|
|
276
281
|
}
|
|
277
282
|
},
|
|
278
283
|
"google-antigravity": {
|
|
279
|
-
"docs_hash": "
|
|
284
|
+
"docs_hash": "2c48c702b9e592a7",
|
|
280
285
|
"headings": [],
|
|
281
286
|
"markers": {
|
|
282
287
|
"AGENTS.md": false,
|
|
@@ -292,7 +297,7 @@
|
|
|
292
297
|
}
|
|
293
298
|
},
|
|
294
299
|
"opencode": {
|
|
295
|
-
"docs_hash": "
|
|
300
|
+
"docs_hash": "5277673e235393f7",
|
|
296
301
|
"headings": [
|
|
297
302
|
"Add features",
|
|
298
303
|
"Ask questions",
|
|
@@ -331,20 +336,19 @@
|
|
|
331
336
|
}
|
|
332
337
|
},
|
|
333
338
|
"roo-code": {
|
|
334
|
-
"docs_hash": "
|
|
339
|
+
"docs_hash": "54908ae23136b646",
|
|
335
340
|
"headings": [
|
|
336
341
|
"A mindset for success\u200b",
|
|
337
342
|
"Additional Resources\u200b",
|
|
338
343
|
"Getting Started\u200b",
|
|
339
344
|
"Roo Code Docs",
|
|
340
|
-
"Tutorial & Feature Videos\u200b",
|
|
341
345
|
"What can Roo Code do for you\u200b"
|
|
342
346
|
],
|
|
343
347
|
"markers": {
|
|
344
348
|
"Code Actions": false,
|
|
345
349
|
"MCP": true,
|
|
346
350
|
"Orchestrator mode": false,
|
|
347
|
-
"custom modes":
|
|
351
|
+
"custom modes": false,
|
|
348
352
|
"description": true,
|
|
349
353
|
"groups": false,
|
|
350
354
|
"roleDefinition": false,
|
|
@@ -353,7 +357,7 @@
|
|
|
353
357
|
}
|
|
354
358
|
},
|
|
355
359
|
"windsurf": {
|
|
356
|
-
"docs_hash": "
|
|
360
|
+
"docs_hash": "fa29ba621f291d81",
|
|
357
361
|
"headings": [
|
|
358
362
|
"Advanced",
|
|
359
363
|
"App Deploys",
|
|
@@ -362,6 +366,7 @@
|
|
|
362
366
|
"Documentation Index",
|
|
363
367
|
"MCP",
|
|
364
368
|
"Memories",
|
|
369
|
+
"On this page",
|
|
365
370
|
"Recommended Plugins",
|
|
366
371
|
"Terminal",
|
|
367
372
|
"Usage",
|
|
@@ -3,10 +3,10 @@ title: "SOP: Release Verification"
|
|
|
3
3
|
category: procedures
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [sop, verification, release, smoke-test, install, update, qa, provenance, sarif]
|
|
6
|
-
version: "1.4.
|
|
6
|
+
version: "1.4.3"
|
|
7
7
|
created: "2026-04-08"
|
|
8
|
-
last_updated: "2026-
|
|
9
|
-
description: "End-to-end smoke test after installing or updating @softspark/ai-toolkit — verifies CLI, install, doctor, validation, tests, eject, npm provenance attestation, SARIF audit, and per-skill permissions. Reflects the v2.8.0 supply-chain standard. v1.3.0 added the single-run npm test discipline; v1.4.0 adds v3.0.0 deep-coverage checks (--profile full, --codex-skills, breaking-change surfaces, idempotence, registry drift, live-JSON parse) and refreshes stale thresholds. v1.4.2 makes the Phase 9.4 idempotence check deterministic by sorting file paths before hashing."
|
|
8
|
+
last_updated: "2026-05-19"
|
|
9
|
+
description: "End-to-end smoke test after installing or updating @softspark/ai-toolkit — verifies CLI, install, doctor, validation, tests, eject, npm provenance attestation, SARIF audit, and per-skill permissions. Reflects the v2.8.0 supply-chain standard. v1.3.0 added the single-run npm test discipline; v1.4.0 adds v3.0.0 deep-coverage checks (--profile full, --codex-skills, breaking-change surfaces, idempotence, registry drift, live-JSON parse) and refreshes stale thresholds. v1.4.2 makes the Phase 9.4 idempotence check deterministic by sorting file paths before hashing. v1.4.3 tightens the Phase 8.4 URL pin check so the success-message count includes only entries with a `url:` field, not local `path:` entries, and documents the `sources.json` envelope shape."
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# SOP: Release Verification
|
|
@@ -303,11 +303,13 @@ python3 scripts/audit_skills.py --permissions | head -40
|
|
|
303
303
|
|
|
304
304
|
### 8.4 URL-sourced rules/hooks are checksum-pinned
|
|
305
305
|
|
|
306
|
+
`sources.json` is an envelope of the form `{"schema_version": 1, "rules"|"hooks": {...}}`, so the jq filter must pick the nested map before piping into the pin assertion. The URL-count in the success message ignores local `path:`-only entries — only entries with a `url:` field are pinned and counted.
|
|
307
|
+
|
|
306
308
|
```bash
|
|
307
309
|
jq '.rules // .hooks // {}' ~/.softspark/ai-toolkit/rules/sources.json 2>/dev/null \
|
|
308
|
-
| python3 -c "import json, sys; d=json.load(sys.stdin) or {}; bad=[n for n,v in d.items() if v.get('url') and not v.get('sha256')]; assert not bad, f'UNPINNED: {bad}'; print(f'RULE PIN OK: {
|
|
310
|
+
| python3 -c "import json, sys; d=json.load(sys.stdin) or {}; bad=[n for n,v in d.items() if v.get('url') and not v.get('sha256')]; assert not bad, f'UNPINNED: {bad}'; url_n=sum(1 for v in d.values() if v.get('url')); print(f'RULE PIN OK: {url_n} URL rules, all with sha256')"
|
|
309
311
|
jq '.hooks // {}' ~/.softspark/ai-toolkit/hooks/external/sources.json 2>/dev/null \
|
|
310
|
-
| python3 -c "import json, sys; d=json.load(sys.stdin) or {}; bad=[n for n,v in d.items() if v.get('url') and not v.get('sha256')]; assert not bad, f'UNPINNED: {bad}'; print(f'HOOK PIN OK: {
|
|
312
|
+
| python3 -c "import json, sys; d=json.load(sys.stdin) or {}; bad=[n for n,v in d.items() if v.get('url') and not v.get('sha256')]; assert not bad, f'UNPINNED: {bad}'; url_n=sum(1 for v in d.values() if v.get('url')); print(f'HOOK PIN OK: {url_n} URL hooks, all with sha256')"
|
|
311
313
|
```
|
|
312
314
|
|
|
313
315
|
**Verify:**
|
|
@@ -3,9 +3,9 @@ title: "AI Toolkit - Codex CLI Compatibility"
|
|
|
3
3
|
category: reference
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [codex, compatibility, install, skills, hooks]
|
|
6
|
-
version: "1.0.
|
|
6
|
+
version: "1.0.1"
|
|
7
7
|
created: "2026-04-12"
|
|
8
|
-
last_updated: "2026-
|
|
8
|
+
last_updated: "2026-05-21"
|
|
9
9
|
description: "Reference for how ai-toolkit maps Claude-oriented skills, hooks, and plugin packs to Codex CLI."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -110,6 +110,11 @@ 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.
|
|
117
|
+
|
|
113
118
|
## Behavioral Limits
|
|
114
119
|
|
|
115
120
|
Codex wrappers preserve workflow intent, but not every Claude runtime behavior
|
|
@@ -120,6 +125,10 @@ Known limits:
|
|
|
120
125
|
- No native Codex equivalent of tmux-backed Agent Teams lifecycle events
|
|
121
126
|
- No separate task object model equivalent to Claude `Task*` APIs
|
|
122
127
|
- Hook event coverage is narrower than Claude Code
|
|
128
|
+
- MCP search tool calls may not fire the shared `PostToolUse` search tracker,
|
|
129
|
+
so `stop-search-check.sh` also checks `~/.codex/log/codex-tui.log` for
|
|
130
|
+
`smart_query`, `hybrid_search_kb`, `crag_search`, `multi_hop_search`, and
|
|
131
|
+
`verify_answer` calls after the search-first flag timestamp before blocking.
|
|
123
132
|
|
|
124
133
|
These are runtime platform limits, not installation defects.
|
|
125
134
|
|
|
@@ -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.
|
|
6
|
+
version: "1.5.2"
|
|
7
7
|
created: "2026-03-27"
|
|
8
|
-
last_updated: "2026-05-
|
|
8
|
+
last_updated: "2026-05-21"
|
|
9
9
|
description: "Complete reference of all ai-toolkit hooks: events, scripts, installation, and runtime behavior."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -50,6 +50,11 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
|
|
|
50
50
|
3. Loads session context from `.claude/session-context.md` (if exists)
|
|
51
51
|
4. Loads active instincts from `.claude/instincts/*.md` (if any)
|
|
52
52
|
|
|
53
|
+
When `AI_TOOLKIT_HOOK_QUIET=1`, the hook still performs session-state reset,
|
|
54
|
+
stale search-flag cleanup, and update notification side effects, but suppresses
|
|
55
|
+
all informational stdout so runtimes such as Codex do not show startup hook
|
|
56
|
+
context in the UI.
|
|
57
|
+
|
|
53
58
|
### Notification — `notify-waiting.sh`
|
|
54
59
|
|
|
55
60
|
| Field | Value |
|
|
@@ -104,7 +109,10 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
|
|
|
104
109
|
|
|
105
110
|
**Action:** Adds a lightweight governance reminder: plan mode for architectural work, evidence-first debugging, KB-first research, and validation expectations.
|
|
106
111
|
|
|
107
|
-
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
112
|
+
Skipped when `TOOLKIT_HOOK_PROFILE=minimal`. The bundled `app/hooks.json`
|
|
113
|
+
registers this command with `AI_TOOLKIT_HOOK_QUIET=1`, so it still arms or
|
|
114
|
+
clears the per-session search-first flag but suppresses the informational
|
|
115
|
+
reminder output.
|
|
108
116
|
|
|
109
117
|
### UserPromptSubmit (usage tracking) — `track-usage.sh`
|
|
110
118
|
|
|
@@ -377,11 +385,11 @@ First-match-wins per file. Built-in runners: `bats`, `pytest`, `vitest`, `jest`.
|
|
|
377
385
|
| Field | Value |
|
|
378
386
|
|-------|-------|
|
|
379
387
|
| Event | `PostToolUse` |
|
|
380
|
-
| Matcher | `
|
|
388
|
+
| Matcher | `mcp__.*__(smart_query\|hybrid_search_kb\|crag_search\|multi_hop_search\|verify_answer)\|WebSearch\|WebFetch` |
|
|
381
389
|
| Script | `~/.softspark/ai-toolkit/hooks/search-tracker.sh` |
|
|
382
390
|
| Fires | After any search-style tool call |
|
|
383
391
|
|
|
384
|
-
**Action:** Clears `~/.softspark/ai-toolkit/state/search-required
|
|
392
|
+
**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.
|
|
385
393
|
|
|
386
394
|
Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
387
395
|
|
|
@@ -394,7 +402,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
394
402
|
| Script | `~/.softspark/ai-toolkit/hooks/stop-search-check.sh` |
|
|
395
403
|
| Fires | When Claude finishes a response |
|
|
396
404
|
|
|
397
|
-
**Action:** If `search-required
|
|
405
|
+
**Action:** If `search-required-<session_id>.flag` for the calling session is still present (no search tool ran during this turn) and a search provider is still detectable, emits `{"decision":"block","reason":"..."}` to continue the conversation with a search-first reminder. If no RAG/Web provider is detected, it clears the stale flag and exits 0, so offline/no-MCP users are not blocked. On Codex, where MCP search tools may not trigger the shared `PostToolUse` tracker, the hook also checks `~/.codex/log/codex-tui.log` for search tool calls after the flag timestamp before blocking. Flags are scoped by `session_id` from the hook stdin payload so a Stop in session B never consumes session A's flag (and vice versa). Stale per-session flags older than 60 minutes are GC'd on the next `SessionStart`.
|
|
398
406
|
|
|
399
407
|
**Overrides:** `CLAUDE_SKIP_SEARCH_FIRST=1`, `AI_TOOLKIT_SEARCH_FIRST=off`, or `AI_TOOLKIT_SEARCH_FIRST=strict` to force enforcement. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
400
408
|
|
|
@@ -432,7 +440,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
|
|
|
432
440
|
| `scripts/test_cohesion.py` | Resolves changed paths → test commands via cohesion map. First-match-wins. Stdlib-only. |
|
|
433
441
|
| `app/hooks/test-cohesion-map.json` | Toolkit-default path → tests mapping (used when no project map exists). |
|
|
434
442
|
| `app/hooks/_locate-toolkit.sh` | Shared bash helper that exports `$TOOLKIT_DIR` for hooks needing scripts/. |
|
|
435
|
-
| `app/hooks/_hook-io.sh` | Shared bash helper that normalizes hook payloads across Claude, Augment, Gemini, Windsurf, and Cursor-style JSON. |
|
|
443
|
+
| `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` for non-blocking context output. |
|
|
436
444
|
| `app/hooks/_search-capability.sh` | Shared bash helper that enables search-first blocking only when RAG/Web is configured or strict mode is requested. |
|
|
437
445
|
|
|
438
446
|
## Runtime Profiles
|
|
@@ -449,6 +457,11 @@ Set in `.claude/settings.local.json`:
|
|
|
449
457
|
| `standard` | All hooks (default) |
|
|
450
458
|
| `strict` | Standard + mypy --strict on task completion |
|
|
451
459
|
|
|
460
|
+
Set `AI_TOOLKIT_HOOK_QUIET=1` on hook commands to suppress non-blocking
|
|
461
|
+
informational context while preserving side effects and blocking decisions.
|
|
462
|
+
Codex-generated hooks use this mode by default, and Claude's bundled
|
|
463
|
+
`UserPromptSubmit` entry uses it to avoid visible prompt hook context.
|
|
464
|
+
|
|
452
465
|
## Architecture
|
|
453
466
|
|
|
454
467
|
```
|
|
@@ -456,7 +469,7 @@ Set in `.claude/settings.local.json`:
|
|
|
456
469
|
├── rules/ # Registered rules (add-rule.sh)
|
|
457
470
|
├── state/ # Per-session runtime state (NEW)
|
|
458
471
|
│ ├── session-edits.json # Append-only edit log per session
|
|
459
|
-
│ ├── search-required
|
|
472
|
+
│ ├── search-required-<sid>.flag # Per-session: set by user-prompt-submit, cleared by search-tracker/stop-search-check, GC'd at SessionStart (>60min)
|
|
460
473
|
│ ├── loaded-instructions.log # Audit trail of which rules entered context
|
|
461
474
|
│ └── test-cohesion-last.log # Last cohesion test command output
|
|
462
475
|
└── hooks/ # Hook scripts (copied on install)
|