@softspark/ai-toolkit 4.15.0 → 4.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/AGENTS.md +117 -0
  2. package/CHANGELOG.md +43 -0
  3. package/README.md +19 -13
  4. package/app/.claude-plugin/plugin.json +1 -1
  5. package/app/ARCHITECTURE.md +4 -3
  6. package/app/hooks/_hook-io.sh +18 -3
  7. package/app/hooks/ai-toolkit-statusline.sh +30 -5
  8. package/app/hooks/filter-tool-output.sh +76 -0
  9. package/app/hooks/governance-capture.sh +1 -1
  10. package/app/hooks/guard-path.sh +2 -2
  11. package/app/hooks/post-tool-use.sh +5 -3
  12. package/app/hooks/pre-compact-save.sh +4 -3
  13. package/app/hooks/quality-gate.sh +12 -1
  14. package/app/hooks/revert-guard.sh +5 -2
  15. package/app/hooks/save-session.sh +4 -2
  16. package/app/hooks/session-end.sh +36 -4
  17. package/app/hooks/session-start.sh +11 -5
  18. package/app/hooks.json +10 -0
  19. package/app/output-filter-policy.json +15 -0
  20. package/app/skills/brand-voice/scripts/measure.py +7 -5
  21. package/benchmarks/ecosystem-doctor-snapshot.json +22 -22
  22. package/benchmarks/output-filter/README.md +11 -0
  23. package/benchmarks/output-filter/scenarios.json +25 -0
  24. package/bin/ai-toolkit.js +2 -0
  25. package/kb/history/completed/native-tool-output-filter-plan.md +517 -0
  26. package/kb/procedures/release-preparation-sop.md +6 -5
  27. package/kb/reference/architecture-overview.md +6 -5
  28. package/kb/reference/cli-reference.md +19 -2
  29. package/kb/reference/codex-cli-compatibility.md +1 -0
  30. package/kb/reference/copilot-compatibility.md +173 -0
  31. package/kb/reference/enterprise-config-guide.md +28 -2
  32. package/kb/reference/global-install-model.md +6 -2
  33. package/kb/reference/hooks-catalog.md +105 -16
  34. package/kb/reference/opencode-compatibility.md +1 -0
  35. package/kb/reference/supported-tools-registry.md +10 -5
  36. package/kb/reference/tool-output-filter.md +288 -0
  37. package/kb/reference/windows-support.md +4 -3
  38. package/llms-full.txt +1182 -40
  39. package/llms.txt +3 -0
  40. package/manifest.json +9 -6
  41. package/package.json +3 -2
  42. package/scripts/benchmark_output_filter.py +343 -0
  43. package/scripts/check_deps.py +16 -0
  44. package/scripts/claude_app.py +30 -2
  45. package/scripts/config_cli.py +4 -4
  46. package/scripts/config_lock.py +120 -14
  47. package/scripts/config_merger.py +103 -20
  48. package/scripts/config_resolver.py +22 -2
  49. package/scripts/config_validator.py +268 -16
  50. package/scripts/copilot_legacy_hashes.json +338 -0
  51. package/scripts/doctor.py +1 -0
  52. package/scripts/generate_codex_hooks.py +2 -0
  53. package/scripts/generate_copilot.py +464 -71
  54. package/scripts/generate_copilot_hooks.py +124 -7
  55. package/scripts/generate_gemini_hooks.py +33 -10
  56. package/scripts/generate_opencode_plugin.py +28 -12
  57. package/scripts/install_steps/ai_tools.py +115 -3
  58. package/scripts/install_steps/hooks.py +25 -1
  59. package/scripts/output_filter_cli.py +347 -0
  60. package/scripts/output_filter_hook.py +23 -0
  61. package/scripts/plugin_schema.py +27 -1
  62. package/scripts/schemas/ai-toolkit-config.schema.json +83 -5
  63. package/scripts/session_state.py +156 -42
  64. package/scripts/tool_output_filter/__init__.py +33 -0
  65. package/scripts/tool_output_filter/contracts.py +173 -0
  66. package/scripts/tool_output_filter/engine.py +260 -0
  67. package/scripts/tool_output_filter/hook_runtime.py +369 -0
  68. package/scripts/tool_output_filter/input.py +56 -0
  69. package/scripts/tool_output_filter/invariants.py +40 -0
  70. package/scripts/tool_output_filter/policy.py +153 -0
  71. package/scripts/tool_output_filter/profiles/__init__.py +68 -0
  72. package/scripts/tool_output_filter/profiles/repeat_lines.py +71 -0
  73. package/scripts/tool_output_filter/profiles/tap_success.py +154 -0
  74. package/scripts/tool_output_filter/recovery.py +846 -0
  75. package/scripts/tool_output_filter/telemetry.py +13 -0
  76. package/scripts/uninstall.py +96 -3
@@ -0,0 +1,173 @@
1
+ ---
2
+ title: "AI Toolkit - GitHub Copilot Compatibility"
3
+ category: reference
4
+ service: ai-toolkit
5
+ tags: [copilot, compatibility, install, skills, prompts, instructions, agents, hooks]
6
+ version: "1.0.0"
7
+ created: "2026-07-15"
8
+ last_updated: "2026-07-15"
9
+ description: "Reference for how ai-toolkit integrates with GitHub Copilot — the five .github/ surfaces, their runtime context-loading semantics, and why the same skill is emitted as both a prompt file and a skill directory."
10
+ ---
11
+
12
+ # AI Toolkit - GitHub Copilot Compatibility
13
+
14
+ ## Summary
15
+
16
+ `ai-toolkit install --local --editors copilot` emits native GitHub Copilot
17
+ customization files under `.github/`. Copilot is the toolkit's widest-surface
18
+ editor target: a single skill can materialize into up to three distinct Copilot
19
+ mechanisms (path-scoped instruction, invokable prompt, on-demand skill). All
20
+ emitted paths are generated build artifacts and are `.gitignore`d — they are not
21
+ committed source. This document explains what each surface is, **when each one
22
+ enters the model context**, and why the same skill body appears in more than one
23
+ file. Install/profile behavior is owned by `kb/reference/global-install-model.md`;
24
+ config-path and capability tracking by `kb/reference/supported-tools-registry.md`.
25
+
26
+ ## Generated Surfaces
27
+
28
+ | Surface | Path | Copilot mechanism |
29
+ |---------|------|-------------------|
30
+ | Repo-wide instructions | `.github/copilot-instructions.md` | Always-on repository custom instructions |
31
+ | Path-scoped instructions | `.github/instructions/ai-toolkit-*.instructions.md` | Custom instructions gated by an `applyTo` glob |
32
+ | Prompt files | `.github/prompts/ai-toolkit-*.prompt.md` | Reusable prompts, invoked as `/name` |
33
+ | Native agents | `.github/agents/ai-toolkit-*.agent.md` | Custom agents in the agent picker |
34
+ | Portable skills | `.github/skills/ai-toolkit-*/SKILL.md` (+ `reference/`, `scripts/`) | Agent Skills, injected on demand |
35
+ | Lifecycle hooks | `.github/hooks/ai-toolkit.json` + runtime | Version-1 Copilot hooks (profile ≥ `standard`) |
36
+ | Shared rules | root `AGENTS.md` | Read by Copilot code review and CLI |
37
+
38
+ ## Surface Loading Semantics
39
+
40
+ The five customization surfaces do **not** all cost context the same way. This
41
+ is the practical difference that governs token usage and any perceived
42
+ "double loading":
43
+
44
+ | Surface | Enters context… | Passive cost |
45
+ |---------|-----------------|--------------|
46
+ | `copilot-instructions.md` | Every chat request in the repo | Always-on |
47
+ | `*.instructions.md` with `applyTo: "**"` | Every request (glob matches all files) | Effectively always-on |
48
+ | `*.instructions.md` with a scoped glob (e.g. `**/*.py`) | Only when a matching file is in context | Path-scoped |
49
+ | `*.prompt.md` | **Only** when the user runs `/<name>` | None until invoked |
50
+ | `SKILL.md` | **Only** when Copilot chooses to use the skill (progressive disclosure) | None until triggered |
51
+ | `*.agent.md` | Only when that agent is selected in the picker | None until selected |
52
+
53
+ Instructions are auto-added to requests as soon as their `applyTo` glob matches;
54
+ skills and prompts are pull-based, never injected passively.
55
+
56
+ ## Prompt ↔ Skill Duplication
57
+
58
+ Every user-invocable skill is emitted **both** as a `.github/prompts/*.prompt.md`
59
+ (so it is available as a `/slash-command`) **and** as a
60
+ `.github/skills/<name>/SKILL.md` directory (so Copilot can auto-trigger it with
61
+ its bundled `scripts/` and `reference/` assets). The two bodies are byte-identical
62
+ after their frontmatter and Copilot execution-notes header; the differences are:
63
+
64
+ - the prompt carries only a `description`; the skill adds `name` and bundles the
65
+ runnable assets the prompt does not ship;
66
+ - the prompt's execution note treats the current request as task input, the
67
+ skill's note resolves relative paths against its own directory.
68
+
69
+ **This is intentional, not a stale leftover, and does not cause a persistent
70
+ double-load:**
71
+
72
+ - Neither surface is always-on. The prompt loads only on explicit `/invoke`; the
73
+ skill loads only on trigger. Neither sits in `copilot-instructions.md` or in an
74
+ always-matching `applyTo`, so the shared body carries **zero** passive context
75
+ cost.
76
+ - The same skill is registered from a **single** root (`.github/skills`), not
77
+ duplicated across `.claude/skills` or `.agents/skills` in the same repo, so
78
+ there is no duplicate skill registration.
79
+ - The one edge case is a single turn where the user runs `/<name>` **and** Copilot
80
+ autonomously pulls the matching skill in the same request. That is a one-shot
81
+ redundancy of identical text — wasted tokens for that turn only, with no
82
+ conflicting instructions and no persistent effect.
83
+
84
+ Neither surface can replace the other: the prompt has no bundled scanner or
85
+ reference material, and the skill directory is not exposed as a slash command.
86
+ The body is duplicated so each surface is self-contained.
87
+
88
+ ## Compatibility Read Paths
89
+
90
+ Copilot also discovers project `.claude/skills` and `.agents/skills`, and
91
+ personal `~/.agents/skills`. ai-toolkit still materializes self-contained native
92
+ skills under `.github/skills` (and under the active Copilot config root for
93
+ global installs) so that bundled assets and helper scripts remain available and
94
+ `COPILOT_HOME` sessions do not depend on fallback discovery. The toolkit does not
95
+ write the same skill into two roots at once, so fallback discovery never produces
96
+ a duplicate registration.
97
+
98
+ ## Generated, Git-Ignored Artifacts
99
+
100
+ All Copilot outputs are build products, regenerated on every install/generate,
101
+ and listed in `.gitignore`:
102
+
103
+ - `.github/copilot-instructions.md`
104
+ - `.github/instructions/`
105
+ - `.github/prompts/`
106
+ - `.github/agents/`
107
+ - `.github/skills/`
108
+ - `.github/hooks/`
109
+
110
+ Deleting them locally is safe (they are untracked and ignored); the next
111
+ `ai-toolkit install --editors copilot` or generator run recreates them. The
112
+ generator also cleans stale managed entries and byte-exact historical ai-toolkit
113
+ files while preserving user-authored files.
114
+
115
+ ## Install & Profiles
116
+
117
+ Authoritative behavior lives in `kb/reference/global-install-model.md`. In brief:
118
+
119
+ - **All profiles (including `minimal`)** emit root `AGENTS.md`,
120
+ `.github/copilot-instructions.md`, native `.github/agents`, and portable
121
+ self-contained `.github/skills`.
122
+ - **`standard`, `strict`, `full`** additionally emit scoped `.github/instructions`,
123
+ `.github/prompts`, and native version-1 `.github/hooks`.
124
+ - **`minimal`** omits instructions, prompts, and hooks.
125
+
126
+ Moving an existing project down to `minimal` removes only marked or byte-exact
127
+ historical ai-toolkit instructions/prompts/hooks; unmanaged project files stay.
128
+
129
+ ## Auto-Detection
130
+
131
+ The installer treats Copilot as configured when any of these markers exist:
132
+ `.github/copilot-instructions.md`, `.github/instructions`, `.github/prompts`,
133
+ `.github/agents`, `.github/skills`, `.github/hooks`, `.github/mcp.json`.
134
+ `ai-toolkit update` then picks up Copilot automatically.
135
+
136
+ ## Generators & CLI
137
+
138
+ Copilot has no dedicated `ai-toolkit copilot-*` subcommand; it is produced by
139
+ `ai-toolkit install --editors copilot` (add `--local` for project scope) or by
140
+ running the generators directly:
141
+
142
+ - `scripts/generate_copilot.py` — instructions, prompts, native agents, and
143
+ portable skill directories (`> .github/copilot-instructions.md` with no target
144
+ argument; multi-surface emission with a target directory).
145
+ - `scripts/generate_copilot_hooks.py` — version-1 hook config plus a
146
+ self-contained repository/config-root runtime.
147
+
148
+ ## Behavioral Limits
149
+
150
+ - Prompt files are available only in VS Code, Visual Studio, and JetBrains IDEs;
151
+ GitHub.com and the CLI use instructions, skills, agents, and `AGENTS.md`.
152
+ - Custom agents emit native `.agent.md` with `name` and `description`; `tools` is
153
+ omitted rather than guessing editor-specific aliases.
154
+ - Prompt and skill bodies strip Claude-only interpolation (`$ARGUMENTS`,
155
+ `CLAUDE_SKILL_DIR`) and delegation APIs; hooks use the GitHub version-1 schema
156
+ with camelCase event names.
157
+
158
+ ## Verification
159
+
160
+ - `scripts/generate_copilot.py` / `generate_copilot_hooks.py` contract tests
161
+ (`tests/test_copilot.bats`, `tests/test_copilot_hooks.bats`).
162
+ - Release layout check in `kb/procedures/release-verification-sop.md` asserts the
163
+ `.github/{agents,skills,instructions,prompts,hooks}` surfaces.
164
+ - `validate.py --strict` + `audit_skills.py --ci` in CI.
165
+
166
+ ## Related
167
+
168
+ - `kb/reference/global-install-model.md`
169
+ - `kb/reference/supported-tools-registry.md`
170
+ - `kb/reference/codex-cli-compatibility.md`
171
+ - `kb/reference/opencode-compatibility.md`
172
+ - `kb/reference/skills-catalog.md`
173
+ - `kb/reference/agents-catalog.md`
@@ -10,7 +10,7 @@ tags:
10
10
  - multi-repo
11
11
  doc_type: reference
12
12
  created: "2026-04-11"
13
- last_updated: "2026-04-11"
13
+ last_updated: "2026-07-23"
14
14
  description: "Comprehensive guide for setting up and using ai-toolkit configuration inheritance. Covers base config creation, project setup, enforcement rules, CI integration, and troubleshooting."
15
15
  ---
16
16
 
@@ -77,7 +77,9 @@ ai-toolkit config check # CI enforcement check
77
77
  |-------|------|-------------|
78
78
  | `extends` | string | Base config source (npm, git URL, local path) |
79
79
  | `profile` | enum | `minimal`, `standard`, `strict`, `full`, `offline-slm` |
80
+ | `toolOutputFilter` | object | Native Bash result filtering policy: mode, profiles, savings thresholds, and recovery limits |
80
81
  | `agents` | object | `enabled`, `disabled`, `custom` arrays |
82
+ | `plugins` | object | Resolved `enabled` and `disabled` plugin intent |
81
83
  | `rules` | object | `inject`, `remove` arrays |
82
84
  | `constitution` | object | `amendments` array (article 8+ only) |
83
85
  | `enforce` | object | Non-overridable constraints (base configs only) |
@@ -146,10 +148,34 @@ Base configs can define non-overridable constraints via the `enforce` block:
146
148
  | Constraint | Effect |
147
149
  |------------|--------|
148
150
  | `minHookProfile` | Projects cannot use a weaker hook profile |
149
- | `requiredPlugins` | Must be installed in all projects |
151
+ | `requiredPlugins` | Adds each required name to the effective `plugins.enabled` intent and prevents projects from disabling it |
150
152
  | `forbidOverride` | These components cannot be overridden |
151
153
  | `requiredAgents` | Must be enabled in all projects |
152
154
 
155
+ `requiredPlugins` is configuration enforcement, not an installer. It makes the
156
+ effective intent explicit and causes validation to reject a conflicting
157
+ `plugins.disabled` entry. Install the named plugin pack separately with
158
+ `ai-toolkit plugin install <name>` or your organization deployment workflow.
159
+
160
+ ### Native tool-output filtering
161
+
162
+ Projects can opt into the dependency-free output filter without changing the
163
+ organization-wide default:
164
+
165
+ ```json
166
+ {
167
+ "toolOutputFilter": {
168
+ "mode": "observe",
169
+ "profiles": ["repeat-lines", "tap-success"]
170
+ }
171
+ }
172
+ ```
173
+
174
+ `ai-toolkit install --local` materializes the effective policy as the managed
175
+ `.claude/ai-toolkit-output-filter.json` file. `off` is the default, `observe`
176
+ collects metadata without changing model-visible output, and `safe` permits
177
+ replacement only when every invariant and exact-recovery check succeeds.
178
+
153
179
  ### Overrides
154
180
 
155
181
  Projects can override base settings, but must declare intent:
@@ -3,9 +3,9 @@ title: "Global Install Model"
3
3
  category: reference
4
4
  service: ai-toolkit
5
5
  tags: [install, global, claude, codex, plugins, local-setup]
6
- version: "3.3.0"
6
+ version: "3.3.1"
7
7
  created: "2026-03-26"
8
- last_updated: "2026-07-14"
8
+ last_updated: "2026-07-15"
9
9
  description: "Reference description of Claude Code global install, Claude app plugin export, project-local editor setup, global Codex plugin layering, and command responsibilities in ai-toolkit."
10
10
  ---
11
11
 
@@ -165,6 +165,9 @@ Claude Code hooks do **not** live in project-local settings. They are merged onl
165
165
  self-contained `.github/skills`. Profiles `standard`, `strict`, and `full`
166
166
  add scoped `.github/instructions`, `.github/prompts`, and native version-1
167
167
  `.github/hooks`. Profile `minimal` omits those three additional directories.
168
+ When an existing project moves from `standard`, `strict`, or `full` to
169
+ `minimal`, the installer removes only marked or byte-exact historical ai-toolkit
170
+ instructions, prompts, and hooks. Unmanaged project files remain in place.
168
171
 
169
172
  Global install emits personal instructions, scoped instructions, agents, and
170
173
  skills under the active Copilot config root; profile `standard` and above adds
@@ -223,4 +226,5 @@ Global-only editor MCP configs are not written during `install --local`. Use `ai
223
226
  - `kb/reference/distribution-model.md`
224
227
  - `kb/reference/merge-friendly-install-model.md`
225
228
  - `kb/reference/codex-cli-compatibility.md`
229
+ - `kb/reference/copilot-compatibility.md`
226
230
  - `kb/reference/mcp-editor-compatibility.md`
@@ -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.7.0"
6
+ version: "1.8.0"
7
7
  created: "2026-03-27"
8
- last_updated: "2026-07-14"
8
+ last_updated: "2026-07-23"
9
9
  description: "Complete reference of all ai-toolkit hooks: events, scripts, installation, and runtime behavior."
10
10
  ---
11
11
 
@@ -13,7 +13,7 @@ description: "Complete reference of all ai-toolkit hooks: events, scripts, insta
13
13
 
14
14
  ## Overview
15
15
 
16
- ai-toolkit provides 28 global hook entries across 14 lifecycle events that enforce quality, safety, and workflow rules across all Claude Code sessions, plus a separate `statusLine` command. Hooks are merged into `~/.claude/settings.json` on install, with logic in standalone scripts at `~/.softspark/ai-toolkit/hooks/`.
16
+ ai-toolkit provides 29 global hook entries across 14 lifecycle events that enforce quality, safety, and workflow rules across all Claude Code sessions, plus a separate `statusLine` command. Hooks are merged into `~/.claude/settings.json` on install, with logic in standalone scripts at `~/.softspark/ai-toolkit/hooks/`.
17
17
 
18
18
  ## Supported Surface
19
19
 
@@ -29,7 +29,11 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
29
29
  ```
30
30
 
31
31
  **File locations:**
32
+
32
33
  - Scripts: `~/.softspark/ai-toolkit/hooks/*.sh`
34
+ - Output-filter runtime: `~/.softspark/ai-toolkit/scripts/output_filter_hook.py`, `output_filter_cli.py`, and `tool_output_filter/`
35
+ - Global output-filter policy: `~/.softspark/ai-toolkit/hooks/output-filter-policy.json`
36
+ - Managed project policy: `<project>/.claude/ai-toolkit-output-filter.json`
33
37
  - Config: `~/.claude/settings.json` → `hooks` key
34
38
  - Source: `ai-toolkit/app/hooks/*.sh` + `app/hooks.json`
35
39
 
@@ -50,10 +54,11 @@ ai-toolkit update # re-copies scripts, re-merges (idempotent)
50
54
  3. Loads session context from the per-repo session store (if exists)
51
55
  4. Loads active instincts from `.claude/instincts/*.md` (if any)
52
56
 
53
- By default the hook performs session-state reset, stale search-flag cleanup, and
54
- update notification side effects without printing informational stdout. Set
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
+ By default the hook resets edit state for a new native session, preserves it
58
+ when the source is `compact`, performs stale search-flag cleanup, and checks
59
+ for updates without printing informational stdout. Set
60
+ `AI_TOOLKIT_HOOK_VERBOSE=1` to print the startup reminders and loaded context
61
+ for debugging; `AI_TOOLKIT_HOOK_QUIET=1` keeps it silent explicitly.
57
62
 
58
63
  > **Session storage:** auto-generated session artifacts (context, handoff note,
59
64
  > checkpoints, decisions) are stored **outside the project repo** under
@@ -173,6 +178,59 @@ arms the corrective Stop hook.
173
178
 
174
179
  Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
175
180
 
181
+ ### PostToolUse (native Bash output filter): `filter-tool-output.sh`
182
+
183
+ | Field | Value |
184
+ |-------|-------|
185
+ | Event | `PostToolUse` |
186
+ | Matcher | `Bash` |
187
+ | Script | `~/.softspark/ai-toolkit/hooks/filter-tool-output.sh` |
188
+ | Fires | After a successful Claude Code Bash tool call |
189
+
190
+ The hook is disabled by default and runs last among the installed
191
+ `PostToolUse` handlers. Its modes are:
192
+
193
+ | Mode | Behavior |
194
+ |------|----------|
195
+ | `off` | Shell fast path exits before Python starts |
196
+ | `observe` | Evaluates eligible output and writes content-free metadata, but emits no replacement |
197
+ | `safe` | Replaces eligible output only after invariants pass and the exact native response is stored for recovery |
198
+
199
+ Only explicitly allowlisted test, lint, typecheck, and validation command
200
+ shapes are eligible. Failed or interrupted tools, non-empty stderr, image or
201
+ binary results, pipes, redirects, deployment, migrations, audits, security
202
+ scanners, malformed payloads, unavailable recovery, and any uncertain case
203
+ remain unchanged.
204
+
205
+ The per-project policy `<project>/.claude/ai-toolkit-output-filter.json` is
206
+ honored only when **both** checks pass: the project root is registered in
207
+ `~/.softspark/ai-toolkit/projects.json`, and the sibling regular file
208
+ `<project>/.claude/.ai-toolkit-output-filter.owner` holds the ai-toolkit owner
209
+ marker. `ai-toolkit install --local` writes both. Registration is required
210
+ because the owner marker is a public constant, so a cloned or untrusted
211
+ checkout must never be able to self-enable filtering by shipping its own
212
+ marker. An unregistered project, a missing or foreign marker, or a symlinked
213
+ project root or `.claude` directory falls back to the installed global policy
214
+ at `~/.softspark/ai-toolkit/hooks/output-filter-policy.json`, which ships as
215
+ `off`.
216
+
217
+ `jq` is a required system dependency (`python3 scripts/check_deps.py`
218
+ verifies it alongside `python3`, `git`, and `node`); without it `guard-path.sh`
219
+ blocks file tools rather than skipping path validation.
220
+
221
+ Recovery data is private and session-scoped under
222
+ `~/.softspark/ai-toolkit/sessions/<repo-key>/output-filter/`. Telemetry records
223
+ only profile/version, byte and line counts, latency, outcome, and fallback
224
+ reason. Recovery-backed modes require a bounded native session ID containing
225
+ only ASCII letters, digits, underscores, or hyphens. Three consecutive
226
+ profile, invariant, or recovery safety failures open a session circuit
227
+ breaker. Set `AI_TOOLKIT_OUTPUT_FILTER_DISABLE=1` for an immediate bypass.
228
+
229
+ The replacement adapter is Claude Code-specific. Claude Chat/Cowork exports
230
+ exclude it, and the generated hooks for other editors do not activate it.
231
+ The `minimal` hook profile and `AI_TOOLKIT_DISABLED_HOOKS=filter-tool-output`
232
+ bypass it before the Python runtime starts.
233
+
176
234
  ### Stop (quality check) — `quality-check.sh`
177
235
 
178
236
  | Field | Value |
@@ -286,9 +344,13 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
286
344
  | Script | `~/.softspark/ai-toolkit/hooks/session-end.sh` |
287
345
  | Fires | When a Claude session ends |
288
346
 
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.
347
+ **Action:** Removes private output-filter artifacts and isolated edit state for
348
+ the ending native session, then writes `session-end.md` to the per-repo session store
349
+ (`~/.softspark/ai-toolkit/sessions/<repo-key>/`) with a lightweight handoff note
350
+ for the next session.
290
351
 
291
- Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
352
+ The handoff note is skipped when `TOOLKIT_HOOK_PROFILE=minimal`; recovery and
353
+ edit-state cleanup still run.
292
354
 
293
355
  ### TeammateIdle — inline
294
356
 
@@ -313,7 +375,7 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
313
375
  | Script | `~/.softspark/ai-toolkit/hooks/guard-config.sh` |
314
376
  | Fires | Before any file write/edit operation |
315
377
 
316
- **Action:** Blocks (exit 2) edits to linter and formatter config files `.eslintrc`, `.eslintrc.*`, `eslint.config.*`, `.prettierrc`, `.prettierrc.*`, `prettier.config.*`, `tsconfig.json`, `tsconfig.*.json` unless the request contains an explicit acknowledgment phrase (e.g. "intentionally editing config"). Returns a human-readable explanation to Claude so it can ask the user for confirmation before retrying.
378
+ **Action:** Always blocks (exit 2) edits to protected linter and formatter configuration: ESLint, Prettier, TypeScript, Stylelint, Biome, `ruff.toml`, and Ruff sections in `pyproject.toml`. Prompt text and acknowledgment phrases do not bypass the guard. A user who explicitly authorizes a protected edit must deliberately remove the guard for that operation.
317
379
 
318
380
  ### SessionStart — `mcp-health.sh`
319
381
 
@@ -335,7 +397,12 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
335
397
  | Script | `~/.softspark/ai-toolkit/hooks/governance-capture.sh` |
336
398
  | Fires | After any tool use |
337
399
 
338
- **Action:** Non-blocking (always exits 0). Logs security-sensitive operations (Bash commands, file writes to sensitive paths, large writes) to `~/.softspark/ai-toolkit/governance.log` with ISO timestamp, session ID, tool name, and a content excerpt. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
400
+ **Action:** Non-blocking (always exits 0). Logs recognized
401
+ dangerous-command categories and writes to sensitive filenames to
402
+ `~/.softspark/ai-toolkit/governance.log` with an ISO timestamp, normalized
403
+ session ID, tool name, and a bounded category or path detail. It does not
404
+ store the full command or file content. Skipped when
405
+ `TOOLKIT_HOOK_PROFILE=minimal`.
339
406
 
340
407
  ### PreCompact — `pre-compact-save.sh`
341
408
 
@@ -346,7 +413,11 @@ Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
346
413
  | Script | `~/.softspark/ai-toolkit/hooks/pre-compact-save.sh` |
347
414
  | Fires | Before context compaction |
348
415
 
349
- **Action:** Saves a timestamped context snapshot to `~/.softspark/ai-toolkit/compactions/YYYY-MM-DD_HH-MM-SS.txt`. Captures session ID, working directory, git branch and status, and environment metadata. Provides an audit trail of what was in context at each compaction point. Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
416
+ **Action:** Saves a timestamped context snapshot to
417
+ `~/.softspark/ai-toolkit/compactions/YYYY-MM-DD_HH-MM-SS_<session>.txt`.
418
+ Captures the bounded normalized session ID, working directory, and git branch.
419
+ Provides an audit trail for compaction boundaries. Skipped when
420
+ `TOOLKIT_HOOK_PROFILE=minimal`.
350
421
 
351
422
  ### PreToolUse (commit quality) — `commit-quality.sh`
352
423
 
@@ -426,7 +497,23 @@ First-match-wins per file. Built-in runners: `bats`, `pytest`, `vitest`, `jest`.
426
497
  | Script | `~/.softspark/ai-toolkit/hooks/search-tracker.sh` |
427
498
  | Fires | After any search-style tool call |
428
499
 
429
- **Action:** Clears `~/.softspark/ai-toolkit/state/search-required-<session_id>.flag` (per-session, keyed by `session_id` from the hook stdin payload, falling back to `transcript_path` basename, then `default`). Pairs with `user-prompt-submit.sh` (sets the flag on long technical prompts only when a search provider is detected or strict mode is enabled) and `stop-search-check.sh` (blocks Stop if the calling session's flag is still set). Search provider detection parses actual MCP server names from `mcpServers`, `mcp_servers`, or `mcp` config blocks; hook matchers and permission allowlists do not count as providers. Codex Stop enforcement also scans the recent `$CODEX_HOME/log/codex-tui.log` window (default `~/.codex/log/codex-tui.log`) for `ToolCall: mcp__...__smart_query` and `tool.name="smart_query"`-style entries because Codex MCP tool calls may not fire the shared `PostToolUse` tracker. Together the hooks enforce the global CLAUDE.md GOLDEN RULE without breaking offline/no-RAG installs and without cross-session interference when multiple Claude Code windows run in parallel.
500
+ **Action:** Clears `~/.softspark/ai-toolkit/state/search-required-<session_id>.flag`
501
+ for the bounded normalized native session. Identity lookup accepts
502
+ `session_id`, Augment `conversation_id` / `conversationId`,
503
+ `CLAUDE_SESSION_ID`, or the transcript basename before falling back to
504
+ `default`. It pairs with `user-prompt-submit.sh` (sets the flag on long
505
+ technical prompts only when a search provider is detected or strict mode is
506
+ enabled) and `stop-search-check.sh` (blocks Stop if the calling session's flag
507
+ is still set). Search provider detection parses actual MCP server names from
508
+ `mcpServers`, `mcp_servers`, or `mcp` config blocks; hook matchers and
509
+ permission allowlists do not count as providers. Codex Stop enforcement also
510
+ scans the recent `$CODEX_HOME/log/codex-tui.log` window (default
511
+ `~/.codex/log/codex-tui.log`) for `ToolCall:
512
+ mcp__...__smart_query` and `tool.name="smart_query"`-style entries because
513
+ Codex MCP tool calls may not fire the shared `PostToolUse` tracker. Together
514
+ the hooks enforce the global CLAUDE.md GOLDEN RULE without breaking
515
+ offline/no-RAG installs and without cross-session interference when multiple
516
+ runtime windows run in parallel.
430
517
 
431
518
  Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
432
519
 
@@ -473,7 +560,7 @@ Non-blocking (exit 0). Skipped when `TOOLKIT_HOOK_PROFILE=minimal`.
473
560
 
474
561
  | Component | Purpose |
475
562
  |-----------|---------|
476
- | `scripts/session_state.py` | Append-only edit log keyed by session_id. Cleared on SessionStart. Read by revert-guard, test-cohesion, quality-gate. |
563
+ | `scripts/session_state.py` | Isolated edit state keyed by a hash of the normalized native session ID. Reset on SessionStart and cleaned on SessionEnd. Read by revert-guard and quality-gate. |
477
564
  | `scripts/test_cohesion.py` | Resolves changed paths → test commands via cohesion map. First-match-wins. Stdlib-only. |
478
565
  | `app/hooks/test-cohesion-map.json` | Toolkit-default path → tests mapping (used when no project map exists). |
479
566
  | `app/hooks/_locate-toolkit.sh` | Shared bash helper that exports `$TOOLKIT_DIR` for hooks needing scripts/. |
@@ -507,8 +594,9 @@ commands explicitly silent, and Codex-generated hooks plus Claude's bundled
507
594
  ```
508
595
  ~/.softspark/ai-toolkit/
509
596
  ├── rules/ # Registered rules (add-rule.sh)
510
- ├── state/ # Per-session runtime state (NEW)
511
- │ ├── session-edits.json # Append-only edit log per session
597
+ ├── state/ # Per-session runtime state
598
+ │ ├── session-edits-<hash>.json # Isolated edit state, removed at SessionEnd
599
+ │ ├── session-edits.json # Compatibility alias for the active session
512
600
  │ ├── search-required-<sid>.flag # Per-session: set by user-prompt-submit, cleared by search-tracker/stop-search-check, GC'd at SessionStart (>60min)
513
601
  │ ├── loaded-instructions.log # Audit trail of which rules entered context
514
602
  │ └── test-cohesion-last.log # Last cohesion test command output
@@ -580,6 +668,7 @@ Beyond the global Claude Code hooks above, editor profiles emit native hook file
580
668
  | Augment | `.augment/settings.json` (hooks block) | `generate_augment_hooks.py` | Claude-style events |
581
669
  | GitHub Copilot | `.github/hooks/ai-toolkit.json`; user `$COPILOT_HOME/hooks/ai-toolkit.json` | `generate_copilot_hooks.py` | GitHub version 1, camelCase events (profile ≥ `standard`) |
582
670
  | Codex CLI | `.codex/hooks.json`; user `$CODEX_HOME/hooks.json` | `generate_codex_hooks.py` | Native Codex schema, PascalCase events, command ownership markers |
671
+ | OpenCode | `.opencode/plugins/ai-toolkit-hooks.js`; user `~/.config/opencode/plugins/ai-toolkit-hooks.js` | `generate_opencode_plugin.py` | Native JavaScript plugin hooks |
583
672
 
584
673
  ### Cursor hooks (`.cursor/hooks.json`)
585
674
 
@@ -162,6 +162,7 @@ The opencode integration is verified by:
162
162
  - `kb/reference/skills-catalog.md`
163
163
  - `kb/reference/agents-catalog.md`
164
164
  - `kb/reference/codex-cli-compatibility.md`
165
+ - `kb/reference/copilot-compatibility.md`
165
166
  - `kb/reference/architecture-overview.md`
166
167
  - `kb/reference/global-install-model.md`
167
168
  - `kb/reference/mcp-editor-compatibility.md`
@@ -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.10.0"
6
+ version: "1.11.0"
7
7
  created: "2026-04-23"
8
- last_updated: "2026-07-14"
8
+ last_updated: "2026-07-23"
9
9
  description: "Human-readable view of scripts/ecosystem_tools.json — the canonical list of tools ai-toolkit integrates with (Claude Code, Claude Chat/Cowork, and 11 editors), their documentation URLs, config paths, our generators, and tracked capability markers."
10
10
  ---
11
11
 
@@ -33,6 +33,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
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` |
35
35
  | Tracked handler types | `command`, `prompt`, `agent`, `mcp_tool`, `http` (POST event JSON to allowlisted URLs via `allowedHttpHookUrls`) |
36
+ | Tool-output replacement | Native `PostToolUse.updatedToolOutput`; ai-toolkit exposes dependency-free `off`, byte-identical `observe`, and opt-in recoverable `safe` modes for eligible successful Bash text |
36
37
  | Other capabilities | slash commands, MCP server/client, sub-agent, output style, `SKILL.md` (≥500 lines warn) |
37
38
  | Version probe | `claude --version` |
38
39
  | Notes | v2.1.169 added `disableBundledSkills` setting + `CLAUDE_CODE_DISABLE_BUNDLED_SKILLS` env var (hides bundled skills/built-in slash commands from the model; toolkit skills in `.claude/skills/` are unaffected — useful when toolkit skills overlap built-ins) and `claude --safe-mode` / `CLAUDE_CODE_SAFE_MODE` (starts with hooks, skills, agents, and CLAUDE.md disabled — first isolation step when debugging toolkit rule enforcement). `fallbackModel` settings key (v2.1.166) noted as not-adopted (class C, no toolkit surface writes model settings). |
@@ -52,6 +53,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
52
53
  | Plugin layout | `.claude-plugin/plugin.json`, `skills/*/SKILL.md`, `agents/*.md`, `hooks/hooks.json`; ai-toolkit uses manifest paths under `claude-app/` for its generated app-only rules and hooks |
53
54
  | Our generator | `scripts/claude_app.py` (`ai-toolkit claude-app export`) |
54
55
  | Runtime split | Skills work in Chat (web/Desktop) and Cowork. Hooks and sub-agents run only in Cowork. Claude app does **not** scan Claude Code's `~/.claude/rules/`, `CLAUDE.md`, or `~/.claude/settings.json`. |
56
+ | Tool-output replacement | Not shipped. The Claude Code-only filter hook and runtime are excluded from the app archive until Cowork has an independently verified replacement contract. |
55
57
  | Install/update | Export the ZIP, upload it from `Customize > Plugins`, then paste the generated global-instructions file into `Settings > Cowork > Global instructions`. Re-export/re-upload after toolkit updates. |
56
58
 
57
59
  ---
@@ -103,7 +105,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
103
105
  | Our generators | `scripts/generate_copilot.py` (instructions, prompts, agents, and portable skill directories), `scripts/generate_copilot_hooks.py` (native version-1 hook config plus self-contained runtime) |
104
106
  | Global install | `ai-toolkit install --editors copilot` writes instructions, agents, skills, and, for profile ≥ `standard`, native hooks below `$COPILOT_HOME` when set or `~/.copilot` otherwise. VS Code Copilot and GitHub.com use repo `.github/` files, so local emission remains required. |
105
107
  | Tracked capabilities | `copilot-instructions.md`, Copilot Chat, Copilot Workspace, Copilot cloud agent, `applyTo`, custom agents, prompt files, `instructions.md`, `AGENTS.md`, MCP, skills, CLI hooks, `~/.copilot/` |
106
- | Compatibility notes | Custom agents use native `.agent.md` files with `name` and `description`; `tools` is omitted instead of guessing editor-specific aliases. Prompt and skill bodies remove Claude-only interpolation and delegation APIs. Hooks use the GitHub version-1 schema, camelCase event names, native decision payloads, and a repository/config-root-contained Python runtime instead of Claude hook scripts. Project MCP remains owned by the editor MCP sync path. Copilot code review also reads the nearest `AGENTS.md`; local install keeps its generated section separate from Codex/OpenCode sections. |
108
+ | Compatibility notes | Custom agents use native `.agent.md` files with `name` and `description`; `tools` is omitted instead of guessing editor-specific aliases. Prompt and skill bodies remove Claude-only interpolation and delegation APIs. Hooks use the GitHub version-1 schema, camelCase event names, native decision payloads, and a repository/config-root-contained Python runtime instead of Claude hook scripts. Project MCP remains owned by the editor MCP sync path. Copilot code review also reads the nearest `AGENTS.md`; local install keeps its generated section separate from Codex/OpenCode sections. Surface loading semantics and the prompt/skill duplication are documented in `kb/reference/copilot-compatibility.md`. |
107
109
 
108
110
  ### Gemini CLI
109
111
 
@@ -170,7 +172,7 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
170
172
  | Our generators | `scripts/generate_augment.py`, `scripts/generate_augment_rules.py`, `scripts/generate_augment_agents.py` (profile=full), `scripts/generate_augment_commands.py` (profile=full), `scripts/generate_augment_hooks.py` (profile=full, HOME-scoped), `scripts/generate_augment_skills.py` (profile=full) |
171
173
  | Global install | `ai-toolkit install --editors augment` writes `~/.augment/rules/ai-toolkit.md` **plus** (profile=full) `~/.augment/agents/`, `~/.augment/commands/`, and hooks in `~/.augment/settings.json` — all documented user-tier surfaces. A global-only Augment user previously got no hooks/agents/commands. Skills need no global emission: Auggie natively reads `~/.claude/skills/`. |
172
174
  | Tracked capabilities | `.augment`, Agent mode, Next Edit, MCP, context engine, Auggie CLI, `always_apply`, `agent_requested`, subagents, custom commands, `SKILL.md`, `PreToolUse`, `PostToolUse`, `SessionStart`, `SessionEnd`, `Stop`, `Notification`, ACP Mode, plugins/marketplace |
173
- | Latest / notes | Auggie CLI v0.31.0. Since v0.30.0 (2026-06-25) `PreToolUse`/`PostToolUse` hooks fire during sub-agent sessions, so our wired hook groups now run concurrently from parallel sub-agents hook payload identifier is `conversation_id` (not `session_id`), a concurrency note to track. `Notification` is enum-only (doctor flipped its marker) no dedicated handler documented, so class C (do NOT wire). Plugins/marketplace (`auggie plugin marketplace add`, `.augment-plugin`/`.claude-plugin` layouts, `enabledPlugins`/`autoUpdateMarketplaces` in settings) documented but not yet a shipping target. |
175
+ | Latest / notes | Auggie CLI v0.31.0. Since v0.30.0 (2026-06-25) `PreToolUse`/`PostToolUse` hooks fire during sub-agent sessions. The shared hook input adapter normalizes Augment's `conversation_id`, so edit and quality state remains isolated across parallel sub-agents. `Notification` is enum-only (doctor flipped its marker), with no dedicated handler documented, so class C (do NOT wire). Plugins/marketplace (`auggie plugin marketplace add`, `.augment-plugin`/`.claude-plugin` layouts, `enabledPlugins`/`autoUpdateMarketplaces` in settings) are documented but not yet a shipping target. |
174
176
  | SPA caveat | Mintlify Next.js SPA; use `https://docs.augmentcode.com/<path>.md` siblings (discoverable via `/llms.txt`) for machine reads |
175
177
 
176
178
  ### Google Antigravity
@@ -198,7 +200,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
198
200
  | Config paths | **Instructions:** project `AGENTS.md` (root→cwd chain, closest wins) and global `~/.codex/AGENTS.md` (`$CODEX_HOME/AGENTS.md`; `~/.codex/AGENTS.override.md` takes precedence). NOTE: `~/AGENTS.md` is NOT a global-instruction surface — Codex only reads it if a session's cwd is exactly `$HOME`. Plus `.agents/skills/*/SKILL.md`, `.codex/agents/*.toml`, `~/.codex/agents/*.toml`, `.codex/hooks.json`, `~/.codex/hooks.json`, `.codex/config.toml` (project layers, root→cwd, closest wins, trusted projects only), `~/.codex/config.toml`. |
199
201
  | Our generators | `scripts/generate_codex.py`, `scripts/generate_codex_agents.py` (native custom-agent TOML), `scripts/generate_codex_hooks.py`, `scripts/generate_codex_skills.py` (opt-in via `--codex-skills`) |
200
202
  | 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/`. Global install writes `~/.codex/AGENTS.md` (not `~/AGENTS.md`, which Codex never loads globally); plugin-pack rules are marker-injected into the same file. `project_doc_max_bytes` default is 32 KiB and Codex silently truncates AGENTS.md past that (see codex-cli-compatibility.md). |
201
- | 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 (via `generate_codex_hooks.py` AND `inject-hook` propagation, kept in sync), mirroring the Claude Code mapping in `app/hooks.json`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
203
+ | Tracked hook events | Upstream canonical (codex-rs `HookEventName` enum): `PreToolUse`, `PostToolUse`, `PermissionRequest`, `PreCompact`, `PostCompact`, `SessionStart`, `UserPromptSubmit`, `SubagentStart`, `SubagentStop`, `Stop` (10 events). We wire 9 through an explicit Codex map, including destructive-command and wrong-home path guards on both Bash `PreToolUse` and `PermissionRequest`. `PostCompact` is not wired (its only hook was the removed environment-snapshot probe). |
204
+ | Tool-output replacement | Manual `ai-toolkit output-filter inspect` only. The Claude-specific `updatedToolOutput` adapter is not emitted into Codex hooks. |
202
205
  | Tracked handler types | `command` (emitted by default; the only handler Codex actually runs). `prompt` and `agent` are parsed by Codex but NOT yet executed, so hand-authored handlers of those types are inert. |
203
206
  | Other capabilities | `AGENTS.md`, `config.toml`, `mcp_servers`, sandbox policies, `.agents/skills/*/SKILL.md` (native Codex skill discovery path), `.codex/agents/*.toml` (native custom agents) |
204
207
  | Version probe | `codex --version` |
@@ -212,6 +215,8 @@ The canonical data lives in **`scripts/ecosystem_tools.json`** and is consumed b
212
215
  | Release notes | https://github.com/sst/opencode/releases (redirects to anomalyco/opencode) |
213
216
  | Config paths | `opencode.json`, `.opencode/agents/*.md`, `.opencode/commands/*.md`, `.opencode/plugins/*`, `.opencode/skills/*/SKILL.md` (v1.14+), `AGENTS.md`; skill fallback discovery: `.claude/skills/`, `.agents/skills/`, `~/.config/opencode/skills/`, `~/.claude/skills/`, `~/.agents/skills/` |
214
217
  | Our generators | `scripts/generate_opencode.py`, `scripts/generate_opencode_agents.py`, `scripts/generate_opencode_commands.py`, `scripts/generate_opencode_json.py`, `scripts/generate_opencode_plugin.py` |
218
+ | Hook isolation | Tool hooks preserve native `sessionID` as normalized `session_id`; exit code 2 from a blocking pre-tool guard is raised back to OpenCode instead of being ignored. |
219
+ | Tool-output replacement | Manual `ai-toolkit output-filter inspect` only. No active OpenCode output adapter is shipped. |
215
220
  | Tracked plugin events | `session.created`, `session.compacted`, `session.deleted`, `message.updated`, `tool.execute.before`, `tool.execute.after`, `permission.asked`, `command.executed` |
216
221
  | 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 |
217
222
  | Version probe | `opencode --version` |