@softspark/ai-toolkit 4.9.0 → 4.10.1

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,33 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v4.10.1 — Copilot AGENTS.md install + Claude KB-first rule (2026-06-23)
11
+
12
+ Patch release. Fixes two governance regressions found in the editor-update audit: Copilot installs now emit the root `AGENTS.md` surface documented in the registry, and Claude Code receives the KB-first rule in `CLAUDE.md`, which it actually reads. Test count: 1195 → 1198.
13
+
14
+ ### Fixed
15
+ - **GitHub Copilot local install now emits root `AGENTS.md`.** `ai-toolkit install --local --editors copilot` writes the generated agent catalog into a `TOOLKIT:copilot-agents` section without clobbering existing Codex/opencode `TOOLKIT:ai-toolkit` sections or user-authored content. Dry-run output and tests now cover the `.github/copilot-instructions.md + AGENTS.md` contract.
16
+ - **Claude Code KB-first rule restored in the right instruction file.** `CLAUDE.md` now explicitly requires `smart_query()` or `hybrid_search_kb()` before technical/project answers; the prior generated `AGENTS.md` placement was not sufficient for Claude Code runtime enforcement.
17
+ - **Codex PostToolUse no longer emits unsupported `suppressOutput`.** `loop-guard.sh` no longer forces `AI_TOOLKIT_HOOK_FORMAT=json`; under Codex it stays quiet/plain unless the generator explicitly opts into a supported JSON schema.
18
+ - **Npm package excludes local Claude session artifacts.** `package.json` now excludes `app/**/.claude/**` so ignored maintainer-local session files cannot leak into `npm pack`.
19
+
20
+ ### Changed
21
+ - **Editor registry/docs aligned with implementation.** README, architecture overview, and the supported-tools registry now describe Copilot's root `AGENTS.md` emission consistently.
22
+ - **Ecosystem doctor baseline refreshed.** Snapshot updated for upstream Claude Code and Gemini CLI documentation content hash drift; no generator changes were required.
23
+
24
+ ## v4.10.0 — Per-repo session storage outside the repo + drop dead session-context hook (2026-06-17)
25
+
26
+ Minor release. Session lifecycle hooks stop writing auto-generated files into each project's `.claude/` directory and store them per-repo under `~/.softspark/ai-toolkit/`. The dead `session-context.sh` hook (write-only, no consumer) is removed across all editor generators. Test count: 1197 → 1195.
27
+
28
+ ### Changed
29
+ - **Session lifecycle hooks store artifacts outside the repo.** `save-session.sh`, `session-end.sh`, `session-start.sh`, and `pre-compact.sh` now read/write the auto-generated session files (`session-context.md`, `session-end.md`, `session-context.md.checkpoints`, `decisions.md`) under `~/.softspark/ai-toolkit/sessions/<repo-key>/` instead of the project's `.claude/` directory. `<repo-key>` is the git work-tree root path (fallback: cwd) with `/` replaced by `-`, keyed per repo so projects stay isolated. Stops these files from piling up in every repository. New shared helper `app/hooks/_session-paths.sh` is the single source of path resolution. No migration of pre-existing in-repo files: the new store starts fresh, old `.claude/session-*.md` left for the user to delete.
30
+ - **Constitution Art. I §5** updated to point proactive checkpointing at the per-repo session store.
31
+
32
+ ### Removed
33
+ - **Dropped the dead `session-context.sh` hook.** It fired on `SessionStart` and wrote an environment snapshot (`~/.softspark/ai-toolkit/sessions/<id>.json`: pwd, git branch/status, node/python versions) that no hook, script, or tool ever read — pure write-only dead code (Constitution Art. VI.1). Removed the script, its `app/hooks.json` wiring, its entries across all 7 editor hook generators (cursor, windsurf, codex, devin, augment, gemini, opencode), its tests, and its catalog/overview docs. Editors that had it as the sole entry for an event (windsurf `post_setup_worktree`, codex `PostCompact`, gemini `BeforeModel`, devin `SessionStart`) drop that event. Not related to the session-storage change above — it never wrote to the repo.
34
+
35
+ ---
36
+
10
37
  ## v4.9.0 - Epistemic integrity rules + deep-research skill + custom-rule leak fix (2026-06-15)
11
38
 
12
39
  Minor release. Adds a constitution article on injection resistance and grounding, a new web-research methodology skill, and an anti-sycophancy/formatting pass across the voice layer. Also fixes a leak where a maintainer's personal registered rules were baked into the toolkit's own committed editor files. Skill count: 107 → 108. Constitution: 6 → 7 articles. Test count: 1196 → 1197.
package/README.md CHANGED
@@ -6,16 +6,18 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Skills](https://img.shields.io/badge/skills-108-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-1197%20passing-success)](tests/)
9
+ [![Tests](https://img.shields.io/badge/tests-1198%20passing-success)](tests/)
10
10
 
11
- ## What's New in v4.9.0
11
+ ## What's New in v4.10.1
12
12
 
13
- v4.9.0 hardens the toolkit's epistemics and fixes a leak where a maintainer's personal rules were baked into the toolkit's own committed editor files.
13
+ v4.10.1 fixes editor-governance gaps found in the release audit.
14
14
 
15
- - **Constitution Article VII Epistemic & Injection Integrity**: embedded or untrusted text is data, not commands (no privilege escalation or exfiltration); never fabricate files, APIs, or citations; declare ungrounded when sources come back empty. Constitution: 6 → 7 articles.
16
- - **`deep-research` skill**: multi-source web research methodology retrieve-vs-answer gate, complexity-scaled search budget, source-conflict skepticism, adversarial verification, attribution-without-reproduction. Skill count: 107 108.
17
- - **Anti-sycophancy + formatting discipline**: `golden-rules` gains "Honesty Over Agreeableness"; `brand-voice` gains list-gating, minimum-substance bullets, and mode carve-outs (code quality never reduced, auto-escalation, disclosure-on-pushback).
18
- - **Custom-rule leak fixed**: `AGENTS.md`, `GEMINI.md`, and `.github/copilot-instructions.md` no longer embed a maintainer's personal `~/.softspark/ai-toolkit/rules/` content, gated behind the new `AI_TOOLKIT_NO_CUSTOM_RULES` flag with a regression test.
15
+ - **Copilot local installs now emit root `AGENTS.md`**: `ai-toolkit install --local --editors copilot` writes the generated agent catalog into a `TOOLKIT:copilot-agents` section while preserving existing Codex/opencode sections and user text.
16
+ - **Claude Code KB-first enforcement restored**: `CLAUDE.md` now carries the mandatory `smart_query()` / `hybrid_search_kb()` rule before technical/project answers, instead of relying on generated `AGENTS.md`.
17
+ - **Codex PostToolUse hook output fixed**: `loop-guard.sh` no longer forces Claude-style JSON with `suppressOutput` under quiet Codex hooks.
18
+ - **Release packaging hardened**: local `.claude` session artifacts under `app/` are excluded from `npm pack`, even if they exist in a maintainer checkout.
19
+ - **Docs and ecosystem baseline refreshed**: README, registry, and architecture docs now match the Copilot implementation; ecosystem-doctor snapshot is refreshed for upstream Claude/Gemini docs hash drift.
20
+ - **Test count**: 1195 → 1198.
19
21
 
20
22
  See [CHANGELOG.md](CHANGELOG.md) for full history.
21
23
 
@@ -104,7 +106,7 @@ See [CLI Reference](kb/reference/cli-reference.md) for all commands and options.
104
106
  | Cursor | `.cursor/rules/*.mdc` + `.cursor/mcp.json` + `.cursor/skills/*` | ✅ | project (`~/.cursor/mcp.json` for MCP only) |
105
107
  | Windsurf (Devin Desktop) | `~/.codeium/.../global_rules.md` + `~/.codeium/windsurf/skills/*` + `.devin/rules/*.md` + `.windsurf/rules/*.md` (legacy) | ✅ | global + project |
106
108
  | Gemini CLI | `~/.gemini/GEMINI.md` | ✅ | global |
107
- | GitHub Copilot | `.github/copilot-instructions.md` | — | project |
109
+ | GitHub Copilot | `.github/copilot-instructions.md` + `.github/instructions/*` + `.github/prompts/*` + `AGENTS.md` | — | project |
108
110
  | Cline | `~/Documents/Cline/Rules/*.md` + `~/.cline/skills/*` + `.clinerules/*.md` | — | global + project |
109
111
  | Roo Code | `~/.roo/rules/*.md` + `.roomodes` + `.roo/rules/*.md` | — | global rules + project |
110
112
  | Aider | `~/.aider.conf.yml` + `.aider.conf.yml` + `CONVENTIONS.md` | — | global + project |
@@ -148,7 +150,7 @@ ai-toolkit/
148
150
  │ └── ARCHITECTURE.md # Full system design
149
151
  ├── kb/ # Reference docs, procedures, plans
150
152
  ├── scripts/ # Validation, install, evaluation scripts
151
- ├── tests/ # Bats test suite (1197 tests)
153
+ ├── tests/ # Bats test suite (1198 tests)
152
154
  └── CHANGELOG.md
153
155
  ```
154
156
 
@@ -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.9.0",
4
+ "version": "4.10.1",
5
5
  "author": {
6
6
  "name": "SoftSpark",
7
7
  "url": "https://github.com/softspark"
@@ -21,7 +21,7 @@ status: IMMUTABLE
21
21
  - Exceeding limits requires explicit user override
22
22
 
23
23
  ### Section 5: Proactive Context Checkpointing
24
- - During multi-step tasks (>5 tool calls), update `.claude/session-context.md` after each major milestone
24
+ - During multi-step tasks (>5 tool calls), append milestones to the per-repo session-context store after each major milestone. Auto-generated session files live under `~/.softspark/ai-toolkit/sessions/<repo-root-with-/-as->/` (the repo work-tree root path with `/` replaced by `-`), NOT inside the project repo. Append agent checkpoints to `session-context.md.checkpoints` in that directory; the Stop hook folds them into the session summary
25
25
  - Checkpoint MUST include: current objective, completed steps, pending steps, files modified, key decisions
26
26
  - Minimum frequency: after every completed task phase, workflow stage, or subagent handoff
27
27
  - Agent SHOULD checkpoint before any risky or destructive operation
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bash
2
+ # _session-paths.sh — shared per-repo session storage paths for lifecycle hooks.
3
+ #
4
+ # All auto-generated session artifacts live OUTSIDE the project repo, under a
5
+ # per-repo subdirectory of ~/.softspark/ai-toolkit/sessions/. This keeps generated
6
+ # files (session context, handoff note, checkpoints, decisions) from polluting
7
+ # every project's .claude/ directory.
8
+ #
9
+ # Usage (in a hook script):
10
+ # source "$(dirname "$0")/_session-paths.sh"
11
+ # Then use the exported SESSION_* paths.
12
+ #
13
+ # Repo key: the git work-tree root (fallback: cwd) with "/" replaced by "-",
14
+ # mirroring Claude Code's own ~/.claude/projects/<encoded-path> convention so the
15
+ # location is derivable by an agent, not an opaque hash.
16
+
17
+ _session_repo_root() {
18
+ if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
19
+ local top
20
+ top="$(git rev-parse --show-toplevel 2>/dev/null)"
21
+ if [ -n "$top" ]; then
22
+ printf '%s' "$top"
23
+ return 0
24
+ fi
25
+ fi
26
+ pwd
27
+ }
28
+
29
+ SESSION_REPO_ROOT="$(_session_repo_root)"
30
+ SESSION_REPO_KEY="${SESSION_REPO_ROOT//\//-}"
31
+ SESSION_DIR="$HOME/.softspark/ai-toolkit/sessions/$SESSION_REPO_KEY"
32
+ SESSION_CONTEXT_FILE="$SESSION_DIR/session-context.md"
33
+ SESSION_CHECKPOINTS_FILE="$SESSION_DIR/session-context.md.checkpoints"
34
+ SESSION_END_FILE="$SESSION_DIR/session-end.md"
35
+ SESSION_DECISIONS_FILE="$SESSION_DIR/decisions.md"
36
+
37
+ export SESSION_REPO_ROOT SESSION_REPO_KEY SESSION_DIR
38
+ export SESSION_CONTEXT_FILE SESSION_CHECKPOINTS_FILE SESSION_END_FILE SESSION_DECISIONS_FILE
39
+
40
+ unset -f _session_repo_root
@@ -53,7 +53,6 @@ fi
53
53
  COUNT=$(grep -cxF "$HASH" "$LOG" 2>/dev/null | tr -d ' ')
54
54
  [ -z "$COUNT" ] && COUNT=0
55
55
  if [ "$COUNT" -ge "$THRESHOLD" ]; then
56
- export AI_TOOLKIT_HOOK_FORMAT=json
57
56
  hook_emit_context "PostToolUse" \
58
57
  "Loop guard: the same ${TOOL_NAME} action has repeated ${COUNT}x within the last ${WINDOW} steps. If you are not making progress, stop and reassess — try a different approach or ask the user — instead of retrying the identical action."
59
58
  fi
@@ -8,6 +8,8 @@
8
8
 
9
9
  # shellcheck source=_profile-check.sh
10
10
  source "$(dirname "$0")/_profile-check.sh"
11
+ # shellcheck source=_session-paths.sh
12
+ source "$(dirname "$0")/_session-paths.sh"
11
13
 
12
14
  # ---------------------------------------------------------------------------
13
15
  # 1. Mandatory reload reminder (highest priority — always survives)
@@ -32,9 +34,9 @@ fi
32
34
  # ---------------------------------------------------------------------------
33
35
  # 3. Current task state (medium priority — what we're doing)
34
36
  # ---------------------------------------------------------------------------
35
- if [ -f ".claude/session-context.md" ]; then
37
+ if [ -f "$SESSION_CONTEXT_FILE" ]; then
36
38
  echo "=== Session Context ==="
37
- cat ".claude/session-context.md"
39
+ cat "$SESSION_CONTEXT_FILE"
38
40
  echo "======================="
39
41
  fi
40
42
 
@@ -55,10 +57,10 @@ fi
55
57
  # ---------------------------------------------------------------------------
56
58
  # 5. Key decisions file (if user has been noting decisions this session)
57
59
  # ---------------------------------------------------------------------------
58
- if [ -f ".claude/decisions.md" ]; then
60
+ if [ -f "$SESSION_DECISIONS_FILE" ]; then
59
61
  echo "=== Key Decisions This Session ==="
60
62
  # Only show last 10 lines to keep token budget tight
61
- tail -10 ".claude/decisions.md"
63
+ tail -10 "$SESSION_DECISIONS_FILE"
62
64
  echo "=================================="
63
65
  fi
64
66
 
@@ -6,16 +6,18 @@
6
6
 
7
7
  # shellcheck source=_profile-check.sh
8
8
  source "$(dirname "$0")/_profile-check.sh"
9
+ # shellcheck source=_session-paths.sh
10
+ source "$(dirname "$0")/_session-paths.sh"
9
11
 
10
12
  # Read from stdin (Claude Code passes JSON with .session_id, .last_assistant_message)
11
13
  INPUT=$(cat)
12
14
  SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
13
15
  LAST_MSG=$(echo "$INPUT" | jq -r '.last_assistant_message // "No summary available"' 2>/dev/null | head -5)
14
16
 
15
- SESSION_FILE=".claude/session-context.md"
17
+ SESSION_FILE="$SESSION_CONTEXT_FILE"
16
18
 
17
19
  if [ -n "$SESSION_ID" ]; then
18
- mkdir -p .claude
20
+ mkdir -p "$SESSION_DIR"
19
21
 
20
22
  # Gather git state for richer context
21
23
  GIT_BRANCH=""
@@ -7,13 +7,14 @@
7
7
 
8
8
  # shellcheck source=_profile-check.sh
9
9
  source "$(dirname "$0")/_profile-check.sh"
10
+ # shellcheck source=_session-paths.sh
11
+ source "$(dirname "$0")/_session-paths.sh"
10
12
 
11
- STATE_DIR=".claude"
12
- SESSION_FILE="$STATE_DIR/session-context.md"
13
- HANDOFF_FILE="$STATE_DIR/session-end.md"
13
+ SESSION_FILE="$SESSION_CONTEXT_FILE"
14
+ HANDOFF_FILE="$SESSION_END_FILE"
14
15
  STAMP="$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date)"
15
16
 
16
- mkdir -p "$STATE_DIR"
17
+ mkdir -p "$SESSION_DIR"
17
18
 
18
19
  {
19
20
  echo "# Session End Snapshot"
@@ -28,9 +29,9 @@ mkdir -p "$STATE_DIR"
28
29
  } > "$HANDOFF_FILE"
29
30
 
30
31
  if [ -f "$SESSION_FILE" ]; then
31
- echo "SessionEnd: wrote .claude/session-end.md and preserved existing .claude/session-context.md for the next session."
32
+ echo "SessionEnd: wrote $HANDOFF_FILE and preserved existing session-context for the next session."
32
33
  else
33
- echo "SessionEnd: wrote .claude/session-end.md. Consider persisting open tasks in .claude/session-context.md before ending long workstreams."
34
+ echo "SessionEnd: wrote $HANDOFF_FILE. Consider persisting open tasks in the session-context file before ending long workstreams."
34
35
  fi
35
36
 
36
37
  exit 0
@@ -6,6 +6,8 @@
6
6
 
7
7
  # shellcheck source=_locate-toolkit.sh
8
8
  source "$(dirname "$0")/_locate-toolkit.sh"
9
+ # shellcheck source=_session-paths.sh
10
+ source "$(dirname "$0")/_session-paths.sh"
9
11
 
10
12
  emit_context() {
11
13
  [ "${AI_TOOLKIT_HOOK_QUIET:-0}" = "1" ] && return 0
@@ -51,7 +53,7 @@ if [ -n "$VERSION_MSG" ]; then
51
53
  fi
52
54
 
53
55
  # 3. Load session context (if available)
54
- SESSION_FILE=".claude/session-context.md"
56
+ SESSION_FILE="$SESSION_CONTEXT_FILE"
55
57
  if [ -f "$SESSION_FILE" ] && [ "${AI_TOOLKIT_HOOK_QUIET:-0}" != "1" ] && [ "${AI_TOOLKIT_HOOK_VERBOSE:-0}" = "1" ]; then
56
58
  printf '%s\n' "=== Session Context ==="
57
59
  cat "$SESSION_FILE"
package/app/hooks.json CHANGED
@@ -20,16 +20,6 @@
20
20
  "command": "\"$HOME/.softspark/ai-toolkit/hooks/mcp-health.sh\""
21
21
  }
22
22
  ]
23
- },
24
- {
25
- "_source": "ai-toolkit",
26
- "matcher": "startup|compact",
27
- "hooks": [
28
- {
29
- "type": "command",
30
- "command": "\"$HOME/.softspark/ai-toolkit/hooks/session-context.sh\""
31
- }
32
- ]
33
23
  }
34
24
  ],
35
25
  "Notification": [
@@ -1,5 +1,5 @@
1
1
  {
2
- "last_run": "2026-06-09T22:04:06Z",
2
+ "last_run": "2026-06-23T07:06:46Z",
3
3
  "schema_version": 1,
4
4
  "tools": {
5
5
  "aider": {
@@ -24,7 +24,7 @@
24
24
  }
25
25
  },
26
26
  "augment": {
27
- "docs_hash": "f4c5995e8333a4d5",
27
+ "docs_hash": "a0c51061febc16c4",
28
28
  "headings": [
29
29
  "Admin",
30
30
  "Auggie CLI",
@@ -66,7 +66,7 @@
66
66
  }
67
67
  },
68
68
  "claude-code": {
69
- "docs_hash": "e6f6b4d9d4057cb0",
69
+ "docs_hash": "c20e5688ed230a66",
70
70
  "headings": [
71
71
  "Core concepts",
72
72
  "Documentation Index",
@@ -122,10 +122,10 @@
122
122
  "slash command": true,
123
123
  "sub-agent": true
124
124
  },
125
- "version": "2.1.170 (Claude Code)"
125
+ "version": "2.1.186 (Claude Code)"
126
126
  },
127
127
  "cline": {
128
- "docs_hash": "806fa530c90e227d",
128
+ "docs_hash": "858fa542e2aacde5",
129
129
  "headings": [
130
130
  "API Reference",
131
131
  "Best Practices",
@@ -168,7 +168,7 @@
168
168
  }
169
169
  },
170
170
  "codex-cli": {
171
- "docs_hash": "1b4a56a8e918d721",
171
+ "docs_hash": "eeb0e17a839b09bd",
172
172
  "headings": [
173
173
  "API",
174
174
  "API Reference",
@@ -235,10 +235,10 @@
235
235
  "mcp_servers": false,
236
236
  "sandbox": true
237
237
  },
238
- "version": "codex-cli 0.138.0"
238
+ "version": "codex-cli 0.142.0"
239
239
  },
240
240
  "cursor": {
241
- "docs_hash": "b68e4adf6e21f543",
241
+ "docs_hash": "86b6d48e8ab40d90",
242
242
  "headings": [],
243
243
  "markers": {
244
244
  ".cursor/rules": false,
@@ -254,7 +254,7 @@
254
254
  }
255
255
  },
256
256
  "gemini-cli": {
257
- "docs_hash": "a0e9a213229063c8",
257
+ "docs_hash": "c3ba6d09d810f9c3",
258
258
  "headings": [
259
259
  "Breadcrumbs",
260
260
  "Directory actions",
@@ -296,7 +296,7 @@
296
296
  }
297
297
  },
298
298
  "github-copilot": {
299
- "docs_hash": "ead818d74ead1f2e",
299
+ "docs_hash": "df7c22e121dbb3d1",
300
300
  "headings": [
301
301
  "About Copilot auto model selection",
302
302
  "About Copilot automations",
@@ -317,6 +317,7 @@
317
317
  "Still need help?"
318
318
  ],
319
319
  "markers": {
320
+ "AGENTS.md": false,
320
321
  "Copilot Chat": true,
321
322
  "Copilot Workspace": false,
322
323
  "Copilot cloud agent": true,
@@ -329,7 +330,7 @@
329
330
  }
330
331
  },
331
332
  "google-antigravity": {
332
- "docs_hash": "5ea5426c4445e746",
333
+ "docs_hash": "e6c90b9d937dd9f0",
333
334
  "headings": [],
334
335
  "markers": {
335
336
  "AGENTS.md": false,
@@ -346,7 +347,7 @@
346
347
  }
347
348
  },
348
349
  "opencode": {
349
- "docs_hash": "f546c8b741790cb8",
350
+ "docs_hash": "302de3ac69940747",
350
351
  "headings": [
351
352
  "Add features",
352
353
  "Ask questions",
@@ -406,8 +407,9 @@
406
407
  }
407
408
  },
408
409
  "windsurf": {
409
- "docs_hash": "91034c064d9f8290",
410
+ "docs_hash": "cdd657d4d684c68a",
410
411
  "headings": [
412
+ "Accounts",
411
413
  "Advanced",
412
414
  "Agent Command Center",
413
415
  "App Deploys",
@@ -420,15 +422,15 @@
420
422
  "On this page",
421
423
  "Recommended Plugins",
422
424
  "Releases",
425
+ "Security",
423
426
  "Terminal",
424
427
  "Usage",
425
428
  "Welcome to Devin Desktop",
426
429
  "Windsurf Plugins",
427
430
  "Workflows",
428
- "\u200b1. Select setup flow",
429
- "\u200b2. Choose editor theme",
430
- "\u200b3. Sign up / Log in",
431
- "\u200b4. Let\u2019s Surf!",
431
+ "\u200b1. Select your preferred theme",
432
+ "\u200b2. Log In / Sign Up",
433
+ "\u200b3. Start Building with Devin!",
432
434
  "\u200bCustom App Icons (beta)",
433
435
  "\u200bDevin Desktop Next",
434
436
  "\u200bForgot to Import VS Code Configurations?",
@@ -436,8 +438,7 @@
436
438
  "\u200bOnboarding",
437
439
  "\u200bSet Up",
438
440
  "\u200bThings to Try",
439
- "\u200bUninstall Devin Desktop",
440
- "\u200bUpdate Devin Desktop"
441
+ "\u200bUninstall Devin Desktop"
441
442
  ],
442
443
  "markers": {
443
444
  "AGENTS.md": true,
@@ -54,7 +54,7 @@ ai-toolkit/
54
54
  generate_agents_md.py # Regenerates AGENTS.md
55
55
  generate_cursor_rules.py # Generates .cursorrules (sources _common.py)
56
56
  generate_windsurf.py # Generates .windsurfrules (sources _common.py)
57
- generate_copilot.py # Generates .github/copilot-instructions.md (sources _common.py)
57
+ generate_copilot.py # Generates Copilot .github/* surfaces; install also injects AGENTS.md
58
58
  generate_gemini.py # Generates GEMINI.md (sources _common.py)
59
59
  generate_cline.py # Generates .clinerules (sources _common.py)
60
60
  generate_roo_modes.py # Generates .roomodes
@@ -109,7 +109,7 @@ Machine (global) Project (local)
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`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/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` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.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`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.github/instructions/*.instructions.md` + `.github/prompts/*.prompt.md` + root `AGENTS.md` for Copilot agent instructions, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/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` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.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
 
@@ -269,7 +269,6 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
269
269
  |------|---------|--------|--------|
270
270
  | SessionStart | Session start + compact | `session-start.sh` | MANDATORY rules reminder + session context + instincts |
271
271
  | SessionStart | Session start | `mcp-health.sh` | Check MCP runtime availability |
272
- | SessionStart | Session start | `session-context.sh` | Capture environment snapshot |
273
272
  | Notification | Claude waiting for input | *(inline)* | macOS desktop notification |
274
273
  | PreToolUse | Before Bash | `guard-destructive.sh` | Block destructive commands |
275
274
  | PreToolUse | Before file ops (Bash, Read, Edit, Write, MultiEdit, Glob, Grep, NotebookEdit, mcp\_filesystem) | `guard-path.sh` | Block wrong-user path hallucination |
@@ -116,16 +116,22 @@ by default because Codex currently renders `additionalContext` as visible hook
116
116
  context in the TUI. This keeps prompt-submit output quiet while preserving hook
117
117
  side effects and blocking decisions such as search-first Stop enforcement.
118
118
 
119
- Codex `UserPromptSubmit` JSON output is event-specific. When emitting context,
120
- the hook must include the event name alongside the context:
119
+ Codex hooks must not force Claude-only JSON output fields such as
120
+ `suppressOutput`. In particular, advisory `PostToolUse` hooks like
121
+ `loop-guard.sh` run in quiet/plain mode under Codex; they keep side effects but
122
+ do not emit hidden Claude-style context unless a future Codex runtime explicitly
123
+ supports that schema.
124
+
125
+ If a future Codex runtime enables JSON context output for `UserPromptSubmit`,
126
+ the output must be event-specific and include the event name alongside the
127
+ context:
121
128
 
122
129
  ```json
123
130
  {
124
131
  "hookSpecificOutput": {
125
132
  "hookEventName": "UserPromptSubmit",
126
133
  "additionalContext": "..."
127
- },
128
- "suppressOutput": true
134
+ }
129
135
  }
130
136
  ```
131
137
 
@@ -47,13 +47,21 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
47
47
  **Actions:**
48
48
  1. Injects MANDATORY reminder to follow CLAUDE.md rules
49
49
  2. Injects REMINDER about tests and documentation
50
- 3. Loads session context from `.claude/session-context.md` (if exists)
50
+ 3. Loads session context from the per-repo session store (if exists)
51
51
  4. Loads active instincts from `.claude/instincts/*.md` (if any)
52
52
 
53
53
  By default the hook performs session-state reset, stale search-flag cleanup, and
54
54
  update notification side effects without printing informational stdout. Set
55
- `AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
56
- for debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
55
+ `AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context for
56
+ debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
57
+
58
+ > **Session storage:** auto-generated session artifacts (context, handoff note,
59
+ > checkpoints, decisions) are stored **outside the project repo** under
60
+ > `~/.softspark/ai-toolkit/sessions/<repo-key>/`, where `<repo-key>` is the git
61
+ > work-tree root path (fallback: cwd) with `/` replaced by `-` (mirrors Claude
62
+ > Code's own `~/.claude/projects/` convention). This keeps generated files from
63
+ > piling up in every project's `.claude/` directory. Path resolution lives in the
64
+ > shared helper `app/hooks/_session-paths.sh`.
57
65
 
58
66
  ### Notification — `notify-waiting.sh`
59
67
 
@@ -192,10 +200,10 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
192
200
  | Script | `~/.softspark/ai-toolkit/hooks/save-session.sh` |
193
201
  | Fires | After every Claude response |
194
202
 
195
- **Action:** Writes enriched session context to `.claude/session-context.md` for cross-session persistence. Captures:
203
+ **Action:** Writes enriched session context to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/session-context.md`) for cross-session persistence. Captures:
196
204
  - Session ID and last assistant message (first 5 lines)
197
205
  - Git branch, uncommitted change count, and diff stat (last 5 lines)
198
- - Agent-written checkpoints from `.claude/session-context.md.checkpoints` (if present — written by proactive checkpointing per Constitution Art. I §5)
206
+ - Agent-written checkpoints from `session-context.md.checkpoints` in the same store (if present — written by proactive checkpointing per Constitution Art. I §5)
199
207
 
200
208
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
201
209
 
@@ -263,9 +271,9 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
263
271
  **Actions (prioritized — higher priority items survive tighter token budgets):**
264
272
  1. **Mandatory reload reminder** — always emitted, instructs Claude to re-read CLAUDE.md and active tasks
265
273
  2. **Active instincts** — lists each instinct with confidence score and pattern name from `.claude/instincts/*.md`
266
- 3. **Session context** — preserves task state from `.claude/session-context.md` (if exists)
274
+ 3. **Session context** — preserves task state from the per-repo session store (if exists)
267
275
  4. **Git working state** — branch name, uncommitted change count, last commit (if inside a git repo)
268
- 5. **Key decisions** — last 10 lines from `.claude/decisions.md` (if exists)
276
+ 5. **Key decisions** — last 10 lines from `decisions.md` in the per-repo session store (if exists)
269
277
 
270
278
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
271
279
 
@@ -278,7 +286,7 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
278
286
  | Script | `~/.softspark/ai-toolkit/hooks/session-end.sh` |
279
287
  | Fires | When a Claude session ends |
280
288
 
281
- **Action:** Writes `.claude/session-end.md` with a lightweight handoff note for the next session and reminds the next session to review preserved context.
289
+ **Action:** Writes `session-end.md` to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/`) with a lightweight handoff note for the next session and reminds the next session to review preserved context.
282
290
 
283
291
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
284
292
 
@@ -351,17 +359,6 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
351
359
 
352
360
  **Action:** Non-blocking (always exits 0). Inspects Bash commands containing `git commit`. Extracts the commit message from the `-m` flag and checks it against Conventional Commits format (`type: description`, where type is one of feat/fix/docs/refactor/test/chore/ci/perf/style/revert). Emits an advisory warning if the message does not match — the commit is not blocked, only nudged. Commands without `git commit` or without a `-m` message (e.g. interactive commits) are ignored.
353
361
 
354
- ### SessionStart — `session-context.sh`
355
-
356
- | Field | Value |
357
- |-------|-------|
358
- | Event | `SessionStart` |
359
- | Matcher | *(all)* |
360
- | Script | `~/.softspark/ai-toolkit/hooks/session-context.sh` |
361
- | Fires | Session start |
362
-
363
- **Action:** Captures an environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json`. Records working directory, git branch, git status summary, Node.js version, Python version, and timestamp. Used by other hooks and tools to access session metadata without re-running discovery commands. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
364
-
365
362
  ---
366
363
 
367
364
  ## New Hooks (Constitution Art. VI Enforcement)
@@ -520,8 +517,8 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
520
517
  ├── _locate-toolkit.sh # NEW: shared $TOOLKIT_DIR locator
521
518
  ├── _hook-io.sh # NEW: shared multi-editor payload/output adapter
522
519
  ├── _search-capability.sh # NEW: capability-aware search-first enforcement
520
+ ├── _session-paths.sh # NEW: per-repo session storage path resolver
523
521
  ├── session-start.sh
524
- ├── session-context.sh
525
522
  ├── guard-destructive.sh
526
523
  ├── guard-path.sh
527
524
  ├── guard-config.sh
@@ -549,7 +546,7 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
549
546
 
550
547
  ~/.claude/settings.json
551
548
  └── hooks: # Hook definitions referencing ~/.softspark/ai-toolkit/hooks/
552
- ├── SessionStart → session-start.sh, mcp-health.sh, session-context.sh
549
+ ├── SessionStart → session-start.sh, mcp-health.sh
553
550
  ├── Notification → notify-waiting.sh
554
551
  ├── PreToolUse → guard-destructive.sh, guard-path.sh, guard-config.sh, commit-quality.sh, revert-guard.sh
555
552
  ├── UserPromptSubmit → user-prompt-submit.sh, track-usage.sh
@@ -590,7 +587,7 @@ Windsurf rebranded to Devin Desktop (2026-06-02); the Cascade agent — and its
590
587
  Devin CLI uses a **Claude-compatible** hook format (docs.devin.ai/cli/extensibility/hooks). Key facts driving the generator:
591
588
 
592
589
  - **Standalone file shape:** in `.devin/hooks.v1.json` the entire file IS the hooks object — no top-level `"hooks"` wrapper key (unlike `.claude/settings.json`).
593
- - **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`, `SessionStart`. `post_setup_worktree` has no Devin equivalent (`session-context.sh` moves to `SessionStart`); `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
590
+ - **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`. `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
594
591
  - **Matchers:** regex against the Devin **tool name** (`read`, `edit`, `exec`, `grep`, `glob`, `mcp__<server>__<tool>`) — NOT Claude's `Bash`/`Edit`, so the shared guards reliably fire.
595
592
  - **Block contract:** the guard scripts emit `{"decision":"block","reason":...}` on stdout (plain mode) AND exit 2 — Devin honors both. Hooks run **without** `AI_TOOLKIT_HOOK_FORMAT=json` because Devin expects the flat `{"decision","reason"}` shape, not Claude's `hookSpecificOutput` envelope.
596
593
  - **Stdin payload:** flat `{ "hook_event_name", "tool_name", "tool_input" }` — already handled by `_hook-io.sh` via its `.tool_name` / `.tool_input.*` branches, so no normalizer change was needed.
@@ -79,7 +79,7 @@ Each command file carries the prompt in its markdown body (built from the SKILL.
79
79
 
80
80
  | opencode event | Bash hook(s) |
81
81
  |----------------------------|--------------------------------------------------------------------|
82
- | `session.created` | `session-start.sh` + `session-context.sh` + `mcp-health.sh` |
82
+ | `session.created` | `session-start.sh` + `mcp-health.sh` |
83
83
  | `session.compacted` | `pre-compact.sh` + `pre-compact-save.sh` (PreCompact equivalent) |
84
84
  | `session.deleted` | `session-end.sh` + `save-session.sh` |
85
85
  | `message.updated` | `user-prompt-submit.sh` + `track-usage.sh` |
@@ -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.0"
6
+ version: "1.7.0"
7
7
  created: "2026-04-23"
8
- last_updated: "2026-06-10"
8
+ last_updated: "2026-06-23"
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
 
@@ -28,7 +28,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
28
28
  | ID | `claude-code` |
29
29
  | Docs | https://code.claude.com/docs (platform.claude.com/docs 307-redirects here) |
30
30
  | Release notes | https://github.com/anthropics/claude-code/releases |
31
- | Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.170) |
31
+ | Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.186) |
32
32
  | Config paths | `~/.claude/settings.json`, `.claude/settings.json` (project, committed), `.claude/settings.local.json`, `CLAUDE.md`, `.claude/rules/*.md`, `.claude/agents/*.md`, `.claude/skills/*/SKILL.md`, `~/.claude/themes/*.json` (v2.1.118+) |
33
33
  | Our generators | — (Claude Code is the primary target; toolkit content ships directly as `.md` files and `settings.json` merges) |
34
34
  | Tracked hook events | Core: `SessionStart`, `SessionEnd`, `UserPromptSubmit`, `Notification`, `MessageDisplay`. Tool: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`. Turn: `Stop`, `StopFailure`, `UserPromptExpansion`. Subagent: `SubagentStart`, `SubagentStop`. Compaction: `PreCompact`, `PostCompact`. Permissions: `PermissionRequest`, `PermissionDenied`. Elicitation: `Elicitation`, `ElicitationResult`. Teams: `TaskCreated`, `TaskCompleted`, `TeammateIdle`. Worktrees/env: `WorktreeCreate`, `WorktreeRemove`, `CwdChanged`, `FileChanged`, `ConfigChange`. Setup: `Setup`, `InstructionsLoaded` |
@@ -79,8 +79,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
79
79
  | Release notes | https://github.blog/changelog/label/copilot/ |
80
80
  | Config paths | `.github/copilot-instructions.md`, `.github/instructions/*.instructions.md`, `.github/prompts/*.prompt.md`, `AGENTS.md` |
81
81
  | Our generators | `scripts/generate_copilot.py` |
82
- | Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, MCP |
83
- | Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). |
82
+ | Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, `AGENTS.md`, MCP |
83
+ | Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). Copilot code review reads the nearest `AGENTS.md` automatically since the 2026-06-18 GA (all tiers); `ai-toolkit install --local --editors copilot` injects a `TOOLKIT:copilot-agents` section generated from `generate_agents_md.py` without clobbering Codex/opencode sections in the same file. The 4000-char cap on `copilot-instructions.md` / `*.instructions.md` was also removed (2026-06-12). |
84
84
 
85
85
  ### Gemini CLI
86
86
 
@@ -93,7 +93,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
93
93
  | Our generators | `scripts/generate_gemini.py`, `scripts/generate_gemini_hooks.py` (profile>=standard), `scripts/generate_gemini_commands.py` (profile=full), `scripts/generate_gemini_skills.py` (profile=full) |
94
94
  | Tracked capabilities | `GEMINI.md`, `mcpServers`, tools, `settings.json`, `BeforeTool`, `AfterTool`, `BeforeToolSelection`, `BeforeAgent`, `AfterAgent`, `BeforeModel`, `AfterModel`, `Notification`, `PreCompress`, `SessionStart`, `SessionEnd`, `SKILL.md`, `activate_skill`, custom commands, `gemini-extension.json` (no native `Stop` event — generator maps Stop-equivalent to `AfterAgent`; 11 documented hook events total) |
95
95
  | Version probe | `gemini --version` |
96
- | Latest upstream | v0.45.2 (2026-06-05). NOTE: Gemini CLI drops free/paid tiers 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist keeps Gemini CLI. |
96
+ | Latest upstream | v0.47.0 (2026-06-18). NOTE: Gemini CLI dropped free/paid individual tiers on 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist and paid API keys keep Gemini CLI, so the integration stays. The 11 hook events are unchanged. v0.48 preview migrates the `coreTools` setting to `tools.core` (a tool-allowlist key we do not emit, so no generator change). |
97
97
 
98
98
  ### Cline
99
99
 
@@ -165,12 +165,12 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
165
165
  | Field | Value |
166
166
  |-------|-------|
167
167
  | ID | `codex-cli` |
168
- | Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.138.0, 2026-06) |
168
+ | Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.142.0, 2026-06) |
169
169
  | Release notes | https://github.com/openai/codex/releases |
170
170
  | Config paths | `AGENTS.md`, `.agents/skills/*/SKILL.md`, `.codex/hooks.json`, `.codex/config.toml` (project layers, root→cwd, closest wins, trusted projects only), `~/.codex/config.toml` |
171
171
  | Our generators | `scripts/generate_codex.py`, `scripts/generate_codex_hooks.py`, `scripts/generate_codex_skills.py` (opt-in via `--codex-skills`) |
172
172
  | Rules delivery | Universal coding rules are inlined into `AGENTS.md` (Codex reads instructions only from AGENTS.md, not `.agents/rules/`); language rules ship as `<lang>-rules` skills under `.agents/skills/`. |
173
- | Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire all 10 to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. |
173
+ | Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire 9 of these to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
174
174
  | Tracked handler types | `command` (emitted by default); `prompt` and `agent` available upstream but authored by hand |
175
175
  | Other capabilities | `AGENTS.md`, `config.toml`, `mcp_servers`, sandbox policies, `.agents/skills/*/SKILL.md` (native Codex skill discovery path) |
176
176
  | Version probe | `codex --version` |
@@ -187,7 +187,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
187
187
  | Tracked plugin events | `session.created`, `session.compacted`, `session.deleted`, `message.updated`, `tool.execute.before`, `tool.execute.after`, `permission.asked`, `command.executed` |
188
188
  | Other capabilities | `opencode.json` config, primary + subagent modes, `@`-mention subagents, `/`-invocation commands, MCP (local + remote), plugin hooks in JS/TS, native `SKILL.md` discovery with Claude-compatible fallback, `permission.skill.*` matrix |
189
189
  | Version probe | `opencode --version` |
190
- | Watch item | v1.16.0 (2026-06-05) ships an experimental v2 skill registry (flat-file skills, `slash` frontmatter key) undocumented as of 2026-06-09; re-check next sync before touching `generate_opencode*.py`. |
190
+ | Watch item | v1.16.0 (2026-06-05) shipped an experimental v2 skill registry (flat-file skills, `slash` frontmatter key). As of the 2026-06-23 sync (upstream v1.17.9) it is still undocumented and not stabilized: the skills docs show only the nested `SKILL.md` layout with no `slash` key, so `generate_opencode*.py` is unchanged. Re-check next sync. |
191
191
 
192
192
  ---
193
193
 
@@ -27,7 +27,6 @@ Hook logic lives in `app/hooks/*.sh` — not inline JSON one-liners. Scripts are
27
27
  |-------|--------|--------|
28
28
  | SessionStart | `session-start.sh` | MANDATORY rules reminder + session context + instincts + reset session-edit state |
29
29
  | SessionStart | `mcp-health.sh` | Check MCP server command availability (non-blocking warning) |
30
- | SessionStart | `session-context.sh` | Capture environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json` |
31
30
  | Notification | `notify-waiting.sh` | Cross-platform desktop notification |
32
31
  | PreToolUse | `guard-destructive.sh` | Block `rm -rf`, `DROP TABLE`, etc. |
33
32
  | PreToolUse | `guard-path.sh` | Block wrong-user path hallucination |
package/llms-full.txt CHANGED
@@ -6286,7 +6286,7 @@ ai-toolkit/
6286
6286
  generate_agents_md.py # Regenerates AGENTS.md
6287
6287
  generate_cursor_rules.py # Generates .cursorrules (sources _common.py)
6288
6288
  generate_windsurf.py # Generates .windsurfrules (sources _common.py)
6289
- generate_copilot.py # Generates .github/copilot-instructions.md (sources _common.py)
6289
+ generate_copilot.py # Generates Copilot .github/* surfaces; install also injects AGENTS.md
6290
6290
  generate_gemini.py # Generates GEMINI.md (sources _common.py)
6291
6291
  generate_cline.py # Generates .clinerules (sources _common.py)
6292
6292
  generate_roo_modes.py # Generates .roomodes
@@ -6341,7 +6341,7 @@ Machine (global) Project (local)
6341
6341
  - `--editors cursor,aider` — install only selected editors
6342
6342
  - (no flag) — auto-detect from existing project files; `update --local` picks up whatever editors already have configs
6343
6343
 
6344
- Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/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` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.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`.
6344
+ Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.devin/rules/*.md` + `.windsurf/rules/*.md` (dual-emit since the Devin Desktop rebrand), `.github/instructions/*.instructions.md` + `.github/prompts/*.prompt.md` + root `AGENTS.md` for Copilot agent instructions, `.clinerules/*.md`, `.roo/rules/*.md`, `.augment/rules/ai-toolkit-*.md`, `.agents/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` (universal coding rules inlined — Codex reads only AGENTS.md, not `.agents/rules/`), `.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`.
6345
6345
 
6346
6346
  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`).
6347
6347
 
@@ -6501,7 +6501,6 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
6501
6501
  |------|---------|--------|--------|
6502
6502
  | SessionStart | Session start + compact | `session-start.sh` | MANDATORY rules reminder + session context + instincts |
6503
6503
  | SessionStart | Session start | `mcp-health.sh` | Check MCP runtime availability |
6504
- | SessionStart | Session start | `session-context.sh` | Capture environment snapshot |
6505
6504
  | Notification | Claude waiting for input | *(inline)* | macOS desktop notification |
6506
6505
  | PreToolUse | Before Bash | `guard-destructive.sh` | Block destructive commands |
6507
6506
  | PreToolUse | Before file ops (Bash, Read, Edit, Write, MultiEdit, Glob, Grep, NotebookEdit, mcp\_filesystem) | `guard-path.sh` | Block wrong-user path hallucination |
@@ -7182,16 +7181,22 @@ by default because Codex currently renders `additionalContext` as visible hook
7182
7181
  context in the TUI. This keeps prompt-submit output quiet while preserving hook
7183
7182
  side effects and blocking decisions such as search-first Stop enforcement.
7184
7183
 
7185
- Codex `UserPromptSubmit` JSON output is event-specific. When emitting context,
7186
- the hook must include the event name alongside the context:
7184
+ Codex hooks must not force Claude-only JSON output fields such as
7185
+ `suppressOutput`. In particular, advisory `PostToolUse` hooks like
7186
+ `loop-guard.sh` run in quiet/plain mode under Codex; they keep side effects but
7187
+ do not emit hidden Claude-style context unless a future Codex runtime explicitly
7188
+ supports that schema.
7189
+
7190
+ If a future Codex runtime enables JSON context output for `UserPromptSubmit`,
7191
+ the output must be event-specific and include the event name alongside the
7192
+ context:
7187
7193
 
7188
7194
  ```json
7189
7195
  {
7190
7196
  "hookSpecificOutput": {
7191
7197
  "hookEventName": "UserPromptSubmit",
7192
7198
  "additionalContext": "..."
7193
- },
7194
- "suppressOutput": true
7199
+ }
7195
7200
  }
7196
7201
  ```
7197
7202
 
@@ -9043,13 +9048,21 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
9043
9048
  **Actions:**
9044
9049
  1. Injects MANDATORY reminder to follow CLAUDE.md rules
9045
9050
  2. Injects REMINDER about tests and documentation
9046
- 3. Loads session context from `.claude/session-context.md` (if exists)
9051
+ 3. Loads session context from the per-repo session store (if exists)
9047
9052
  4. Loads active instincts from `.claude/instincts/*.md` (if any)
9048
9053
 
9049
9054
  By default the hook performs session-state reset, stale search-flag cleanup, and
9050
9055
  update notification side effects without printing informational stdout. Set
9051
- `AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
9052
- for debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
9056
+ `AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context for
9057
+ debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
9058
+
9059
+ > **Session storage:** auto-generated session artifacts (context, handoff note,
9060
+ > checkpoints, decisions) are stored **outside the project repo** under
9061
+ > `~/.softspark/ai-toolkit/sessions/<repo-key>/`, where `<repo-key>` is the git
9062
+ > work-tree root path (fallback: cwd) with `/` replaced by `-` (mirrors Claude
9063
+ > Code's own `~/.claude/projects/` convention). This keeps generated files from
9064
+ > piling up in every project's `.claude/` directory. Path resolution lives in the
9065
+ > shared helper `app/hooks/_session-paths.sh`.
9053
9066
 
9054
9067
  ### Notification — `notify-waiting.sh`
9055
9068
 
@@ -9188,10 +9201,10 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9188
9201
  | Script | `~/.softspark/ai-toolkit/hooks/save-session.sh` |
9189
9202
  | Fires | After every Claude response |
9190
9203
 
9191
- **Action:** Writes enriched session context to `.claude/session-context.md` for cross-session persistence. Captures:
9204
+ **Action:** Writes enriched session context to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/session-context.md`) for cross-session persistence. Captures:
9192
9205
  - Session ID and last assistant message (first 5 lines)
9193
9206
  - Git branch, uncommitted change count, and diff stat (last 5 lines)
9194
- - Agent-written checkpoints from `.claude/session-context.md.checkpoints` (if present — written by proactive checkpointing per Constitution Art. I §5)
9207
+ - Agent-written checkpoints from `session-context.md.checkpoints` in the same store (if present — written by proactive checkpointing per Constitution Art. I §5)
9195
9208
 
9196
9209
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9197
9210
 
@@ -9259,9 +9272,9 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9259
9272
  **Actions (prioritized — higher priority items survive tighter token budgets):**
9260
9273
  1. **Mandatory reload reminder** — always emitted, instructs Claude to re-read CLAUDE.md and active tasks
9261
9274
  2. **Active instincts** — lists each instinct with confidence score and pattern name from `.claude/instincts/*.md`
9262
- 3. **Session context** — preserves task state from `.claude/session-context.md` (if exists)
9275
+ 3. **Session context** — preserves task state from the per-repo session store (if exists)
9263
9276
  4. **Git working state** — branch name, uncommitted change count, last commit (if inside a git repo)
9264
- 5. **Key decisions** — last 10 lines from `.claude/decisions.md` (if exists)
9277
+ 5. **Key decisions** — last 10 lines from `decisions.md` in the per-repo session store (if exists)
9265
9278
 
9266
9279
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9267
9280
 
@@ -9274,7 +9287,7 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9274
9287
  | Script | `~/.softspark/ai-toolkit/hooks/session-end.sh` |
9275
9288
  | Fires | When a Claude session ends |
9276
9289
 
9277
- **Action:** Writes `.claude/session-end.md` with a lightweight handoff note for the next session and reminds the next session to review preserved context.
9290
+ **Action:** Writes `session-end.md` to the per-repo session store (`~/.softspark/ai-toolkit/sessions/<repo-key>/`) with a lightweight handoff note for the next session and reminds the next session to review preserved context.
9278
9291
 
9279
9292
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9280
9293
 
@@ -9347,17 +9360,6 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9347
9360
 
9348
9361
  **Action:** Non-blocking (always exits 0). Inspects Bash commands containing `git commit`. Extracts the commit message from the `-m` flag and checks it against Conventional Commits format (`type: description`, where type is one of feat/fix/docs/refactor/test/chore/ci/perf/style/revert). Emits an advisory warning if the message does not match — the commit is not blocked, only nudged. Commands without `git commit` or without a `-m` message (e.g. interactive commits) are ignored.
9349
9362
 
9350
- ### SessionStart — `session-context.sh`
9351
-
9352
- | Field | Value |
9353
- |-------|-------|
9354
- | Event | `SessionStart` |
9355
- | Matcher | *(all)* |
9356
- | Script | `~/.softspark/ai-toolkit/hooks/session-context.sh` |
9357
- | Fires | Session start |
9358
-
9359
- **Action:** Captures an environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json`. Records working directory, git branch, git status summary, Node.js version, Python version, and timestamp. Used by other hooks and tools to access session metadata without re-running discovery commands. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
9360
-
9361
9363
  ---
9362
9364
 
9363
9365
  ## New Hooks (Constitution Art. VI Enforcement)
@@ -9516,8 +9518,8 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
9516
9518
  ├── _locate-toolkit.sh # NEW: shared $TOOLKIT_DIR locator
9517
9519
  ├── _hook-io.sh # NEW: shared multi-editor payload/output adapter
9518
9520
  ├── _search-capability.sh # NEW: capability-aware search-first enforcement
9521
+ ├── _session-paths.sh # NEW: per-repo session storage path resolver
9519
9522
  ├── session-start.sh
9520
- ├── session-context.sh
9521
9523
  ├── guard-destructive.sh
9522
9524
  ├── guard-path.sh
9523
9525
  ├── guard-config.sh
@@ -9545,7 +9547,7 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
9545
9547
 
9546
9548
  ~/.claude/settings.json
9547
9549
  └── hooks: # Hook definitions referencing ~/.softspark/ai-toolkit/hooks/
9548
- ├── SessionStart → session-start.sh, mcp-health.sh, session-context.sh
9550
+ ├── SessionStart → session-start.sh, mcp-health.sh
9549
9551
  ├── Notification → notify-waiting.sh
9550
9552
  ├── PreToolUse → guard-destructive.sh, guard-path.sh, guard-config.sh, commit-quality.sh, revert-guard.sh
9551
9553
  ├── UserPromptSubmit → user-prompt-submit.sh, track-usage.sh
@@ -9586,7 +9588,7 @@ Windsurf rebranded to Devin Desktop (2026-06-02); the Cascade agent — and its
9586
9588
  Devin CLI uses a **Claude-compatible** hook format (docs.devin.ai/cli/extensibility/hooks). Key facts driving the generator:
9587
9589
 
9588
9590
  - **Standalone file shape:** in `.devin/hooks.v1.json` the entire file IS the hooks object — no top-level `"hooks"` wrapper key (unlike `.claude/settings.json`).
9589
- - **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`, `SessionStart`. `post_setup_worktree` has no Devin equivalent (`session-context.sh` moves to `SessionStart`); `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
9591
+ - **Events:** Claude-style PascalCase — `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`. `post_cascade_response` maps to `Stop` (which carries no response text on stdin).
9590
9592
  - **Matchers:** regex against the Devin **tool name** (`read`, `edit`, `exec`, `grep`, `glob`, `mcp__<server>__<tool>`) — NOT Claude's `Bash`/`Edit`, so the shared guards reliably fire.
9591
9593
  - **Block contract:** the guard scripts emit `{"decision":"block","reason":...}` on stdout (plain mode) AND exit 2 — Devin honors both. Hooks run **without** `AI_TOOLKIT_HOOK_FORMAT=json` because Devin expects the flat `{"decision","reason"}` shape, not Claude's `hookSpecificOutput` envelope.
9592
9594
  - **Stdin payload:** flat `{ "hook_event_name", "tool_name", "tool_input" }` — already handled by `_hook-io.sh` via its `.tool_name` / `.tool_input.*` branches, so no normalizer change was needed.
@@ -11057,7 +11059,7 @@ Each command file carries the prompt in its markdown body (built from the SKILL.
11057
11059
 
11058
11060
  | opencode event | Bash hook(s) |
11059
11061
  |----------------------------|--------------------------------------------------------------------|
11060
- | `session.created` | `session-start.sh` + `session-context.sh` + `mcp-health.sh` |
11062
+ | `session.created` | `session-start.sh` + `mcp-health.sh` |
11061
11063
  | `session.compacted` | `pre-compact.sh` + `pre-compact-save.sh` (PreCompact equivalent) |
11062
11064
  | `session.deleted` | `session-end.sh` + `save-session.sh` |
11063
11065
  | `message.updated` | `user-prompt-submit.sh` + `track-usage.sh` |
@@ -11895,9 +11897,9 @@ title: "Supported Tools Registry"
11895
11897
  category: reference
11896
11898
  service: ai-toolkit
11897
11899
  tags: [editors, platforms, generators, integration, ecosystem]
11898
- version: "1.6.0"
11900
+ version: "1.7.0"
11899
11901
  created: "2026-04-23"
11900
- last_updated: "2026-06-10"
11902
+ last_updated: "2026-06-23"
11901
11903
  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."
11902
11904
  ---
11903
11905
 
@@ -11920,7 +11922,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11920
11922
  | ID | `claude-code` |
11921
11923
  | Docs | https://code.claude.com/docs (platform.claude.com/docs 307-redirects here) |
11922
11924
  | Release notes | https://github.com/anthropics/claude-code/releases |
11923
- | Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.170) |
11925
+ | Changelog | https://code.claude.com/docs/en/changelog (lists current 2.1.186) |
11924
11926
  | Config paths | `~/.claude/settings.json`, `.claude/settings.json` (project, committed), `.claude/settings.local.json`, `CLAUDE.md`, `.claude/rules/*.md`, `.claude/agents/*.md`, `.claude/skills/*/SKILL.md`, `~/.claude/themes/*.json` (v2.1.118+) |
11925
11927
  | Our generators | — (Claude Code is the primary target; toolkit content ships directly as `.md` files and `settings.json` merges) |
11926
11928
  | Tracked hook events | Core: `SessionStart`, `SessionEnd`, `UserPromptSubmit`, `Notification`, `MessageDisplay`. Tool: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`. Turn: `Stop`, `StopFailure`, `UserPromptExpansion`. Subagent: `SubagentStart`, `SubagentStop`. Compaction: `PreCompact`, `PostCompact`. Permissions: `PermissionRequest`, `PermissionDenied`. Elicitation: `Elicitation`, `ElicitationResult`. Teams: `TaskCreated`, `TaskCompleted`, `TeammateIdle`. Worktrees/env: `WorktreeCreate`, `WorktreeRemove`, `CwdChanged`, `FileChanged`, `ConfigChange`. Setup: `Setup`, `InstructionsLoaded` |
@@ -11971,8 +11973,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11971
11973
  | Release notes | https://github.blog/changelog/label/copilot/ |
11972
11974
  | Config paths | `.github/copilot-instructions.md`, `.github/instructions/*.instructions.md`, `.github/prompts/*.prompt.md`, `AGENTS.md` |
11973
11975
  | Our generators | `scripts/generate_copilot.py` |
11974
- | Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, MCP |
11975
- | Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). |
11976
+ | Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, `AGENTS.md`, MCP |
11977
+ | Tier notes | Custom agents (`.github/agents/*.agent.md`) and repo-level MCP config are Pro/Pro+/Business/Enterprise only and intentionally not integrated (class C per ecosystem-sync SOP). Copilot code review reads the nearest `AGENTS.md` automatically since the 2026-06-18 GA (all tiers); `ai-toolkit install --local --editors copilot` injects a `TOOLKIT:copilot-agents` section generated from `generate_agents_md.py` without clobbering Codex/opencode sections in the same file. The 4000-char cap on `copilot-instructions.md` / `*.instructions.md` was also removed (2026-06-12). |
11976
11978
 
11977
11979
  ### Gemini CLI
11978
11980
 
@@ -11985,7 +11987,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
11985
11987
  | Our generators | `scripts/generate_gemini.py`, `scripts/generate_gemini_hooks.py` (profile>=standard), `scripts/generate_gemini_commands.py` (profile=full), `scripts/generate_gemini_skills.py` (profile=full) |
11986
11988
  | Tracked capabilities | `GEMINI.md`, `mcpServers`, tools, `settings.json`, `BeforeTool`, `AfterTool`, `BeforeToolSelection`, `BeforeAgent`, `AfterAgent`, `BeforeModel`, `AfterModel`, `Notification`, `PreCompress`, `SessionStart`, `SessionEnd`, `SKILL.md`, `activate_skill`, custom commands, `gemini-extension.json` (no native `Stop` event — generator maps Stop-equivalent to `AfterAgent`; 11 documented hook events total) |
11987
11989
  | Version probe | `gemini --version` |
11988
- | Latest upstream | v0.45.2 (2026-06-05). NOTE: Gemini CLI drops free/paid tiers 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist keeps Gemini CLI. |
11990
+ | Latest upstream | v0.47.0 (2026-06-18). NOTE: Gemini CLI dropped free/paid individual tiers on 2026-06-18 in favor of Antigravity CLI (we ship `generate_antigravity.py`); enterprise Code Assist and paid API keys keep Gemini CLI, so the integration stays. The 11 hook events are unchanged. v0.48 preview migrates the `coreTools` setting to `tools.core` (a tool-allowlist key we do not emit, so no generator change). |
11989
11991
 
11990
11992
  ### Cline
11991
11993
 
@@ -12057,12 +12059,12 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
12057
12059
  | Field | Value |
12058
12060
  |-------|-------|
12059
12061
  | ID | `codex-cli` |
12060
- | Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.138.0, 2026-06) |
12062
+ | Docs | https://developers.openai.com/codex (live docs site; config pages split into `/codex/config-basic`, `/codex/config-reference`, `/codex/config-advanced` plus `/codex/hooks`, `/codex/skills`; latest stable codex-cli 0.142.0, 2026-06) |
12061
12063
  | Release notes | https://github.com/openai/codex/releases |
12062
12064
  | Config paths | `AGENTS.md`, `.agents/skills/*/SKILL.md`, `.codex/hooks.json`, `.codex/config.toml` (project layers, root→cwd, closest wins, trusted projects only), `~/.codex/config.toml` |
12063
12065
  | Our generators | `scripts/generate_codex.py`, `scripts/generate_codex_hooks.py`, `scripts/generate_codex_skills.py` (opt-in via `--codex-skills`) |
12064
12066
  | Rules delivery | Universal coding rules are inlined into `AGENTS.md` (Codex reads instructions only from AGENTS.md, not `.agents/rules/`); language rules ship as `<lang>-rules` skills under `.agents/skills/`. |
12065
- | Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire all 10 to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. |
12067
+ | Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire 9 of these to shared toolkit hook scripts, mirroring the Claude Code mapping in `app/hooks.json`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
12066
12068
  | Tracked handler types | `command` (emitted by default); `prompt` and `agent` available upstream but authored by hand |
12067
12069
  | Other capabilities | `AGENTS.md`, `config.toml`, `mcp_servers`, sandbox policies, `.agents/skills/*/SKILL.md` (native Codex skill discovery path) |
12068
12070
  | Version probe | `codex --version` |
@@ -12079,7 +12081,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
12079
12081
  | Tracked plugin events | `session.created`, `session.compacted`, `session.deleted`, `message.updated`, `tool.execute.before`, `tool.execute.after`, `permission.asked`, `command.executed` |
12080
12082
  | Other capabilities | `opencode.json` config, primary + subagent modes, `@`-mention subagents, `/`-invocation commands, MCP (local + remote), plugin hooks in JS/TS, native `SKILL.md` discovery with Claude-compatible fallback, `permission.skill.*` matrix |
12081
12083
  | Version probe | `opencode --version` |
12082
- | Watch item | v1.16.0 (2026-06-05) ships an experimental v2 skill registry (flat-file skills, `slash` frontmatter key) undocumented as of 2026-06-09; re-check next sync before touching `generate_opencode*.py`. |
12084
+ | Watch item | v1.16.0 (2026-06-05) shipped an experimental v2 skill registry (flat-file skills, `slash` frontmatter key). As of the 2026-06-23 sync (upstream v1.17.9) it is still undocumented and not stabilized: the skills docs show only the nested `SKILL.md` layout with no `slash` key, so `generate_opencode*.py` is unchanged. Re-check next sync. |
12083
12085
 
12084
12086
  ---
12085
12087
 
@@ -12244,7 +12246,6 @@ Hook logic lives in `app/hooks/*.sh` — not inline JSON one-liners. Scripts are
12244
12246
  |-------|--------|--------|
12245
12247
  | SessionStart | `session-start.sh` | MANDATORY rules reminder + session context + instincts + reset session-edit state |
12246
12248
  | SessionStart | `mcp-health.sh` | Check MCP server command availability (non-blocking warning) |
12247
- | SessionStart | `session-context.sh` | Capture environment snapshot to `~/.softspark/ai-toolkit/sessions/current-context.json` |
12248
12249
  | Notification | `notify-waiting.sh` | Cross-platform desktop notification |
12249
12250
  | PreToolUse | `guard-destructive.sh` | Block `rm -rf`, `DROP TABLE`, etc. |
12250
12251
  | PreToolUse | `guard-path.sh` | Block wrong-user path hallucination |
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.9.0",
2
+ "version": "4.10.1",
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.9.0",
3
+ "version": "4.10.1",
4
4
  "description": "AI coding toolkit: 108 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",
@@ -71,6 +71,8 @@
71
71
  "files": [
72
72
  "bin/",
73
73
  "app/",
74
+ "!app/**/.claude",
75
+ "!app/**/.claude/**",
74
76
  "!app/**/__pycache__",
75
77
  "!app/**/*.pyc",
76
78
  "scripts/",
@@ -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-06-10",
4
+ "last_updated": "2026-06-23",
5
5
  "tools": [
6
6
  {
7
7
  "id": "claude-code",
@@ -200,6 +200,7 @@
200
200
  "custom agents",
201
201
  "prompt files",
202
202
  "instructions.md",
203
+ "AGENTS.md",
203
204
  "MCP"
204
205
  ],
205
206
  "version_probe": null
@@ -42,7 +42,6 @@ AUGMENT_HOOKS: dict[str, list[tuple[str, str]]] = {
42
42
  "SessionStart": [
43
43
  ("", "session-start.sh"),
44
44
  ("", "mcp-health.sh"),
45
- ("", "session-context.sh"),
46
45
  ],
47
46
  "PreToolUse": [
48
47
  ("launch-process", "guard-destructive.sh"),
@@ -33,7 +33,6 @@ CODEX_HOOKS: dict[str, list[tuple[str, str]]] = {
33
33
  "SessionStart": [
34
34
  ("startup|resume", "session-start.sh"),
35
35
  ("startup|resume", "mcp-health.sh"),
36
- ("startup|resume", "session-context.sh"),
37
36
  ],
38
37
  "PreToolUse": [
39
38
  ("Bash", "guard-destructive.sh"),
@@ -67,10 +66,6 @@ CODEX_HOOKS: dict[str, list[tuple[str, str]]] = {
67
66
  ("", "pre-compact.sh"),
68
67
  ("", "pre-compact-save.sh"),
69
68
  ],
70
- "PostCompact": [
71
- # Re-establish working context after compaction.
72
- ("", "session-context.sh"),
73
- ],
74
69
  "Stop": [
75
70
  ("", "quality-check.sh"),
76
71
  ("", "save-session.sh"),
@@ -17,6 +17,12 @@ This generator produces three surfaces, all on the OSS/Free/Pro tier
17
17
  Invoked manually in VS Code Copilot Chat via ``/name``. Written only
18
18
  when ``generate()`` is called with a target directory.
19
19
 
20
+ GitHub Copilot code review (generally available 2026-06-18, all tiers) now
21
+ automatically reads the root-level ``AGENTS.md`` when generating review
22
+ feedback. We already emit that file via ``scripts/generate_agents_md.py``, so
23
+ no Copilot-specific emission is added here; ``AGENTS.md`` is tracked in this
24
+ tool's ``capability_markers`` in ``scripts/ecosystem_tools.json``.
25
+
20
26
  Features that live on Pro/Pro+/Business/Enterprise tiers are intentionally
21
27
  not generated (classified as class C in the ecosystem-sync SOP):
22
28
  * ``.github/agents/*.agent.md`` — custom agent profiles (tier-gated)
@@ -38,7 +38,6 @@ CURSOR_HOOKS: dict[str, list[tuple[str, str]]] = {
38
38
  "sessionStart": [
39
39
  ("", "session-start.sh"),
40
40
  ("", "mcp-health.sh"),
41
- ("", "session-context.sh"),
42
41
  ],
43
42
  "beforeShellExecution": [
44
43
  ("", "guard-destructive.sh"),
@@ -61,11 +61,6 @@ DEVIN_HOOKS: dict[str, list[tuple[str, list[str]]]] = {
61
61
  "Stop": [
62
62
  ("", ["quality-check.sh", "save-session.sh", "stop-search-check.sh"]),
63
63
  ],
64
- # Cascade's post_setup_worktree has no Devin equivalent; session-context
65
- # moves to SessionStart (Devin fires SessionStart when a session begins).
66
- "SessionStart": [
67
- ("", ["session-context.sh"]),
68
- ],
69
64
  }
70
65
 
71
66
 
@@ -40,7 +40,6 @@ GEMINI_HOOKS: dict[str, list[tuple[str, str]]] = {
40
40
  "SessionStart": [
41
41
  ("", "session-start.sh"),
42
42
  ("", "mcp-health.sh"),
43
- ("", "session-context.sh"),
44
43
  ],
45
44
  "BeforeTool": [
46
45
  # run_shell_command covers Bash-equivalent destructive patterns
@@ -67,10 +66,6 @@ GEMINI_HOOKS: dict[str, list[tuple[str, str]]] = {
67
66
  ("", "save-session.sh"),
68
67
  ("", "stop-search-check.sh"),
69
68
  ],
70
- "BeforeModel": [
71
- # Light-weight observability slot. Reuses the session-context probe.
72
- ("", "session-context.sh"),
73
- ],
74
69
  "SessionEnd": [
75
70
  ("", "session-end.sh"),
76
71
  ],
@@ -11,7 +11,7 @@ opencode lifecycle events. Coverage map:
11
11
 
12
12
  opencode event -> ai-toolkit Bash hook(s)
13
13
  ---------------------------------------------------------------
14
- session.created -> session-start.sh + session-context.sh + mcp-health.sh
14
+ session.created -> session-start.sh + mcp-health.sh
15
15
  session.compacted -> pre-compact.sh + pre-compact-save.sh
16
16
  session.deleted -> session-end.sh + save-session.sh
17
17
  message.updated -> user-prompt-submit.sh + track-usage.sh
@@ -79,7 +79,6 @@ export const AiToolkitHooks = async ({ $, project, directory, worktree }) => ({
79
79
  switch (event.type) {
80
80
  case "session.created":
81
81
  await runHook($, "session-start.sh", payload);
82
- await runHook($, "session-context.sh", payload);
83
82
  await runHook($, "mcp-health.sh", payload);
84
83
  break;
85
84
  case "session.compacted":
@@ -72,9 +72,6 @@ WINDSURF_HOOKS: dict[str, list[str]] = {
72
72
  "save-session.sh",
73
73
  "stop-search-check.sh",
74
74
  ],
75
- "post_setup_worktree": [
76
- "session-context.sh",
77
- ],
78
75
  }
79
76
 
80
77
 
@@ -352,6 +352,39 @@ def inject_with_rules(
352
352
  print(f" Updated: {target_file}")
353
353
 
354
354
 
355
+ def _inject_text_section(target_file: Path, section: str, text: str) -> None:
356
+ """Inject generated text into one marker section without touching others."""
357
+ target_file.parent.mkdir(parents=True, exist_ok=True)
358
+ existing = target_file.read_text(encoding="utf-8") if target_file.is_file() else ""
359
+ existing = _trim_trailing_blanks(_strip_section(existing, section))
360
+
361
+ parts: list[str] = []
362
+ if existing.strip():
363
+ parts.append(existing)
364
+ parts.append("")
365
+ parts.extend([
366
+ f"<!-- TOOLKIT:{section} START -->",
367
+ "<!-- Auto-injected by ai-toolkit. Re-run to update. -->",
368
+ "",
369
+ text.rstrip("\n"),
370
+ "",
371
+ f"<!-- TOOLKIT:{section} END -->",
372
+ ])
373
+
374
+ output = _collapse_blank_runs("\n".join(parts) + "\n").lstrip("\n")
375
+ target_file.write_text(output, encoding="utf-8")
376
+
377
+
378
+ def _install_copilot_agents_md(cwd: Path) -> None:
379
+ """Emit root AGENTS.md for GitHub Copilot without clobbering other tools."""
380
+ generated = run_script("generate_agents_md.py", capture=True)
381
+ if not generated.strip():
382
+ print(" ERROR: generate_agents_md.py produced no output")
383
+ return
384
+ _inject_text_section(cwd / "AGENTS.md", "copilot-agents", generated)
385
+ print(" Updated: AGENTS.md (Copilot agent instructions)")
386
+
387
+
355
388
  def run_script(script_name: str, *args: str, capture: bool = False) -> str:
356
389
  """Run a script from the scripts/ directory (prefers .py over .sh)."""
357
390
  scripts_dir = toolkit_dir / "scripts"
@@ -724,7 +757,7 @@ def _install_local_dry_run(reset: bool, editors: list[str] | None = None,
724
757
 
725
758
  # Editor-specific dry-run messages
726
759
  _EDITOR_DRY_RUN = {
727
- "copilot": " Would inject: .github/copilot-instructions.md",
760
+ "copilot": " Would inject: .github/copilot-instructions.md + AGENTS.md",
728
761
  "cursor": " Would generate: .cursorrules + .cursor/rules/*.mdc",
729
762
  "windsurf": " Would generate: .windsurfrules + .devin/rules/*.md + .windsurf/rules/*.md",
730
763
  "cline": " Would generate: .clinerules/*.md",
@@ -949,6 +982,7 @@ def _create_local_ai_tool_configs(cwd: Path, rules_dir: Path,
949
982
  cwd / ".github" / "copilot-instructions.md",
950
983
  rules_dir,
951
984
  )
985
+ _install_copilot_agents_md(cwd)
952
986
  # `standard` and above: emit path-specific instructions + prompt files
953
987
  # (directory mode). `minimal` stays backwards-compatible with v2.
954
988
  if add_copilot_dir:
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env bash
2
- # session-context.sh — Capture session context at start for later reference.
3
- #
4
- # Fires on: SessionStart
5
- # Saves environment snapshot to JSON for cross-hook and cross-session use.
6
- # Skipped when TOOLKIT_HOOK_PROFILE=minimal.
7
-
8
- # shellcheck source=_profile-check.sh
9
- source "$(dirname "$0")/_profile-check.sh"
10
-
11
- # Read from stdin (Claude Code passes JSON with .session_id)
12
- INPUT=$(cat)
13
- SESSION=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
14
- [ -z "$SESSION" ] && SESSION="$$"
15
- SESSIONS_DIR="$HOME/.softspark/ai-toolkit/sessions"
16
- mkdir -p "$SESSIONS_DIR"
17
-
18
- CONTEXT_FILE="$SESSIONS_DIR/${SESSION}.json"
19
-
20
- # Gather context
21
- WORKDIR="$(pwd)"
22
- GIT_BRANCH=""
23
- GIT_STATUS=""
24
- if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
25
- GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "detached")
26
- GIT_STATUS=$(git status --short 2>/dev/null | head -20)
27
- fi
28
-
29
- NODE_VERSION=""
30
- if command -v node >/dev/null 2>&1; then
31
- NODE_VERSION=$(node --version 2>/dev/null)
32
- fi
33
-
34
- PYTHON_VERSION=""
35
- if command -v python3 >/dev/null 2>&1; then
36
- PYTHON_VERSION=$(python3 --version 2>/dev/null | awk '{print $2}')
37
- fi
38
-
39
- CURRENT_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
40
-
41
- # Write JSON using python3 for proper escaping
42
- python3 - "$CONTEXT_FILE" "$WORKDIR" "$GIT_BRANCH" "$GIT_STATUS" "$CURRENT_DATE" "$NODE_VERSION" "$PYTHON_VERSION" <<'PY'
43
- import json
44
- import sys
45
- import os
46
-
47
- context_file = sys.argv[1]
48
- data = {
49
- "pwd": sys.argv[2],
50
- "git_branch": sys.argv[3],
51
- "git_status": sys.argv[4],
52
- "date": sys.argv[5],
53
- "node_version": sys.argv[6],
54
- "python_version": sys.argv[7],
55
- }
56
-
57
- tmp = context_file + ".tmp"
58
- with open(tmp, "w") as f:
59
- json.dump(data, f, indent=2)
60
- os.replace(tmp, context_file)
61
- PY
62
-
63
- exit 0