@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.
- package/AGENTS.md +117 -0
- package/CHANGELOG.md +43 -0
- package/README.md +19 -13
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/ARCHITECTURE.md +4 -3
- package/app/hooks/_hook-io.sh +18 -3
- package/app/hooks/ai-toolkit-statusline.sh +30 -5
- package/app/hooks/filter-tool-output.sh +76 -0
- package/app/hooks/governance-capture.sh +1 -1
- package/app/hooks/guard-path.sh +2 -2
- package/app/hooks/post-tool-use.sh +5 -3
- package/app/hooks/pre-compact-save.sh +4 -3
- package/app/hooks/quality-gate.sh +12 -1
- package/app/hooks/revert-guard.sh +5 -2
- package/app/hooks/save-session.sh +4 -2
- package/app/hooks/session-end.sh +36 -4
- package/app/hooks/session-start.sh +11 -5
- package/app/hooks.json +10 -0
- package/app/output-filter-policy.json +15 -0
- package/app/skills/brand-voice/scripts/measure.py +7 -5
- package/benchmarks/ecosystem-doctor-snapshot.json +22 -22
- package/benchmarks/output-filter/README.md +11 -0
- package/benchmarks/output-filter/scenarios.json +25 -0
- package/bin/ai-toolkit.js +2 -0
- package/kb/history/completed/native-tool-output-filter-plan.md +517 -0
- package/kb/procedures/release-preparation-sop.md +6 -5
- package/kb/reference/architecture-overview.md +6 -5
- package/kb/reference/cli-reference.md +19 -2
- package/kb/reference/codex-cli-compatibility.md +1 -0
- package/kb/reference/copilot-compatibility.md +173 -0
- package/kb/reference/enterprise-config-guide.md +28 -2
- package/kb/reference/global-install-model.md +6 -2
- package/kb/reference/hooks-catalog.md +105 -16
- package/kb/reference/opencode-compatibility.md +1 -0
- package/kb/reference/supported-tools-registry.md +10 -5
- package/kb/reference/tool-output-filter.md +288 -0
- package/kb/reference/windows-support.md +4 -3
- package/llms-full.txt +1182 -40
- package/llms.txt +3 -0
- package/manifest.json +9 -6
- package/package.json +3 -2
- package/scripts/benchmark_output_filter.py +343 -0
- package/scripts/check_deps.py +16 -0
- package/scripts/claude_app.py +30 -2
- package/scripts/config_cli.py +4 -4
- package/scripts/config_lock.py +120 -14
- package/scripts/config_merger.py +103 -20
- package/scripts/config_resolver.py +22 -2
- package/scripts/config_validator.py +268 -16
- package/scripts/copilot_legacy_hashes.json +338 -0
- package/scripts/doctor.py +1 -0
- package/scripts/generate_codex_hooks.py +2 -0
- package/scripts/generate_copilot.py +464 -71
- package/scripts/generate_copilot_hooks.py +124 -7
- package/scripts/generate_gemini_hooks.py +33 -10
- package/scripts/generate_opencode_plugin.py +28 -12
- package/scripts/install_steps/ai_tools.py +115 -3
- package/scripts/install_steps/hooks.py +25 -1
- package/scripts/output_filter_cli.py +347 -0
- package/scripts/output_filter_hook.py +23 -0
- package/scripts/plugin_schema.py +27 -1
- package/scripts/schemas/ai-toolkit-config.schema.json +83 -5
- package/scripts/session_state.py +156 -42
- package/scripts/tool_output_filter/__init__.py +33 -0
- package/scripts/tool_output_filter/contracts.py +173 -0
- package/scripts/tool_output_filter/engine.py +260 -0
- package/scripts/tool_output_filter/hook_runtime.py +369 -0
- package/scripts/tool_output_filter/input.py +56 -0
- package/scripts/tool_output_filter/invariants.py +40 -0
- package/scripts/tool_output_filter/policy.py +153 -0
- package/scripts/tool_output_filter/profiles/__init__.py +68 -0
- package/scripts/tool_output_filter/profiles/repeat_lines.py +71 -0
- package/scripts/tool_output_filter/profiles/tap_success.py +154 -0
- package/scripts/tool_output_filter/recovery.py +846 -0
- package/scripts/tool_output_filter/telemetry.py +13 -0
- 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-
|
|
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` |
|
|
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.
|
|
6
|
+
version: "3.3.1"
|
|
7
7
|
created: "2026-03-26"
|
|
8
|
-
last_updated: "2026-07-
|
|
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.
|
|
6
|
+
version: "1.8.0"
|
|
7
7
|
created: "2026-03-27"
|
|
8
|
-
last_updated: "2026-07-
|
|
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
|
|
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
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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:**
|
|
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
|
-
|
|
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:**
|
|
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
|
|
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
|
|
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`
|
|
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` |
|
|
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
|
|
511
|
-
│ ├── session-edits
|
|
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.
|
|
6
|
+
version: "1.11.0"
|
|
7
7
|
created: "2026-04-23"
|
|
8
|
-
last_updated: "2026-07-
|
|
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
|
|
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
|
|
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` |
|