@tacuchi/agent-workflow-cli 20.24.0 → 20.25.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/README.md +34 -11
- package/dist/application/dev-only-services.js +17 -14
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/mcp-host-reader.js +3 -1
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +86 -41
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/plugin-doctor/hooks.js +7 -1
- package/dist/application/plugin-doctor/hooks.js.map +1 -1
- package/dist/application/self/bootstrap.js +30 -16
- package/dist/application/self/bootstrap.js.map +1 -1
- package/dist/application/self/clean-legacy.js +5 -0
- package/dist/application/self/clean-legacy.js.map +1 -1
- package/dist/application/self/detect-hosts.js +31 -45
- package/dist/application/self/detect-hosts.js.map +1 -1
- package/dist/application/self/doctor-self.js +7 -2
- package/dist/application/self/doctor-self.js.map +1 -1
- package/dist/application/self/hooks-toml.js +232 -0
- package/dist/application/self/hooks-toml.js.map +1 -0
- package/dist/application/self/host-states.js +290 -0
- package/dist/application/self/host-states.js.map +1 -0
- package/dist/application/self/install-hooks.js +98 -4
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.js +28 -16
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/install-targets.js +23 -0
- package/dist/application/self/install-targets.js.map +1 -1
- package/dist/application/self/mcp-config.js +13 -19
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/skills-manager.js +9 -0
- package/dist/application/self/skills-manager.js.map +1 -1
- package/dist/application/self/uninstall.js +162 -26
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/cli/commands/dev-only.js +4 -1
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/mcp.js +16 -8
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +69 -60
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +6 -0
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/hosts.js +39 -17
- package/dist/cli/tui/hosts.js.map +1 -1
- package/dist/cli/tui/tabs/config-tab.js +3 -3
- package/dist/cli/tui/tabs/config-tab.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js +7 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +32 -10
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.js +13 -4
- package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
- package/dist/cli/tui/tabs/status-tab.js +11 -17
- package/dist/cli/tui/tabs/status-tab.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +7 -3
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/cli/tui/tui-prefs.js +7 -1
- package/dist/cli/tui/tui-prefs.js.map +1 -1
- package/dist/domain/harnesses.js +129 -0
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/host-verification.js +20 -0
- package/dist/domain/host-verification.js.map +1 -0
- package/package.json +3 -2
- package/skills/w/harness/HARNESS.md +23 -16
package/dist/domain/harnesses.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import { HOST_VERIFICATIONS } from "./host-verification.js";
|
|
1
2
|
export const HARNESSES = [
|
|
2
3
|
{
|
|
3
4
|
id: "claude-code",
|
|
5
|
+
label: "Claude Code",
|
|
6
|
+
glyph: "C",
|
|
7
|
+
support: { tier: "official" },
|
|
8
|
+
runtime: { bins: ["claude"], versionArgs: ["--version"] },
|
|
9
|
+
configDir: { kind: "dir", path: "~/.claude" },
|
|
10
|
+
hooks: { mechanism: "~/.claude/settings.json → hooks{}", managed: true },
|
|
4
11
|
envMarkers: ["CLAUDECODE", "CLAUDE_PLUGIN_ROOT", "CLAUDE_AGENT_ID"],
|
|
5
12
|
mcpHostId: "claude",
|
|
6
13
|
globalMcpPaths: {
|
|
@@ -16,6 +23,15 @@ export const HARNESSES = [
|
|
|
16
23
|
},
|
|
17
24
|
{
|
|
18
25
|
id: "codex",
|
|
26
|
+
label: "Codex",
|
|
27
|
+
glyph: "X",
|
|
28
|
+
support: { tier: "official" },
|
|
29
|
+
runtime: { bins: ["codex"], versionArgs: ["--version"] },
|
|
30
|
+
configDir: { kind: "dir", path: "~/.codex" },
|
|
31
|
+
// Codex HAS hooks, in a different format (TOML) with no settled user-level
|
|
32
|
+
// syntax — declared, not managed: the surfaces say "available, not armed"
|
|
33
|
+
// instead of pretending the host has none.
|
|
34
|
+
hooks: { mechanism: "~/.codex/config.toml (plugin hooks/hooks.json)", managed: false },
|
|
19
35
|
envMarkers: ["CODEX_HOME", "CODEX_CLI", "CODEX_RUNTIME"],
|
|
20
36
|
mcpHostId: "codex",
|
|
21
37
|
globalMcpPaths: {
|
|
@@ -40,6 +56,17 @@ export const HARNESSES = [
|
|
|
40
56
|
// Keep oz before warp in the array so first-match detection picks oz first
|
|
41
57
|
// when both OZ_RUN_ID and TERM_PROGRAM=WarpTerminal are set.
|
|
42
58
|
id: "oz",
|
|
59
|
+
label: "Oz",
|
|
60
|
+
glyph: "Z",
|
|
61
|
+
support: { tier: "best-effort", unstableSurface: true },
|
|
62
|
+
// Oz ships inside Warp.app (…/Contents/Resources/bin/oz) and Warp puts that
|
|
63
|
+
// dir on PATH — so the binary IS probe-able even though ~/.oz never exists.
|
|
64
|
+
runtime: { bins: ["oz"], versionArgs: ["--version"] },
|
|
65
|
+
configDir: {
|
|
66
|
+
kind: "none",
|
|
67
|
+
reason: "Oz runs inside Warp's environment and keeps no config dir of its own",
|
|
68
|
+
},
|
|
69
|
+
hooks: null, // DEC-W4: no hook system.
|
|
43
70
|
envMarkers: ["OZ_RUN_ID"],
|
|
44
71
|
mcpHostId: null, // Oz does not write a config file; emits JSON for --mcp flag
|
|
45
72
|
pluginManifest: null,
|
|
@@ -49,6 +76,14 @@ export const HARNESSES = [
|
|
|
49
76
|
},
|
|
50
77
|
{
|
|
51
78
|
id: "warp",
|
|
79
|
+
label: "Warp Terminal",
|
|
80
|
+
glyph: "W",
|
|
81
|
+
support: { tier: "official" },
|
|
82
|
+
// No `warp` CLI exists: it is a GUI terminal. Runtime availability is
|
|
83
|
+
// therefore not probe-able — the detection reports that, it does not guess.
|
|
84
|
+
runtime: { bins: [], versionArgs: [] },
|
|
85
|
+
configDir: { kind: "mcp-parent" },
|
|
86
|
+
hooks: null, // DEC-W4: no hook system.
|
|
52
87
|
envMarkers: ["WARP_IS_LOCAL_SHELL_SESSION"],
|
|
53
88
|
termProgramMatch: "WarpTerminal",
|
|
54
89
|
mcpHostId: "warp",
|
|
@@ -81,6 +116,14 @@ export const HARNESSES = [
|
|
|
81
116
|
// ANTIGRAVITY_* markers are the env vars agy exports to subprocesses.
|
|
82
117
|
// MCP in settings.json (mcpServers, Claude-compatible shape).
|
|
83
118
|
id: "gemini",
|
|
119
|
+
label: "Gemini CLI / Antigravity",
|
|
120
|
+
glyph: "G",
|
|
121
|
+
support: { tier: "official" },
|
|
122
|
+
// `agy` is the live binary; `gemini` is the deprecated CLI that shares
|
|
123
|
+
// ~/.gemini. Probed in that order so the successor wins.
|
|
124
|
+
runtime: { bins: ["agy", "gemini"], versionArgs: ["--version"] },
|
|
125
|
+
configDir: { kind: "dir", path: "~/.gemini" },
|
|
126
|
+
hooks: { mechanism: "extension-bundled (BeforeTool)", managed: false },
|
|
84
127
|
envMarkers: [
|
|
85
128
|
"GEMINI_CLI",
|
|
86
129
|
"GEMINI_SANDBOX",
|
|
@@ -106,6 +149,12 @@ export const HARNESSES = [
|
|
|
106
149
|
// (type "local", command as array, `environment`). Reads .claude/skills and
|
|
107
150
|
// .agents/skills directly. Enforcement via JS plugins (tool.execute.before) — Phase 2.
|
|
108
151
|
id: "opencode",
|
|
152
|
+
label: "OpenCode",
|
|
153
|
+
glyph: "O",
|
|
154
|
+
support: { tier: "best-effort" },
|
|
155
|
+
runtime: { bins: ["opencode"], versionArgs: ["--version"] },
|
|
156
|
+
configDir: { kind: "mcp-parent" },
|
|
157
|
+
hooks: { mechanism: "JS/TS plugins (tool.execute.before)", managed: false },
|
|
109
158
|
envMarkers: ["OPENCODE", "OPENCODE_BIN", "OPENCODE_CONFIG"],
|
|
110
159
|
mcpHostId: "opencode",
|
|
111
160
|
globalMcpPaths: {
|
|
@@ -126,6 +175,12 @@ export const HARNESSES = [
|
|
|
126
175
|
// Global config verified 2026-07 (README charmbracelet/crush): Unix XDG,
|
|
127
176
|
// Windows %LOCALAPPDATA%\crush\crush.json (override CRUSH_GLOBAL_CONFIG).
|
|
128
177
|
id: "crush",
|
|
178
|
+
label: "Crush",
|
|
179
|
+
glyph: "R",
|
|
180
|
+
support: { tier: "best-effort", unstableSurface: true },
|
|
181
|
+
runtime: { bins: ["crush"], versionArgs: ["--version"] },
|
|
182
|
+
configDir: { kind: "mcp-parent" },
|
|
183
|
+
hooks: { mechanism: "preliminary; enforcement via allowed_tools allowlist", managed: false },
|
|
129
184
|
envMarkers: ["CRUSH", "CRUSH_CONFIG"],
|
|
130
185
|
mcpHostId: "crush",
|
|
131
186
|
globalMcpPaths: {
|
|
@@ -148,7 +203,81 @@ export const HARNESSES = [
|
|
|
148
203
|
],
|
|
149
204
|
installTarget: "crush",
|
|
150
205
|
},
|
|
206
|
+
{
|
|
207
|
+
// Kimi Code (MoonshotAI) — successor of the Python `kimi-cli`, shipped as a
|
|
208
|
+
// single Node SEA binary. Everything below was verified 2026-07-29 against
|
|
209
|
+
// the shipped v0.29.2 binary (its JS is readable) plus live probes:
|
|
210
|
+
// · skills, 4 tiers: user `<KIMI_CODE_HOME>/skills` + `~/.agents/skills`,
|
|
211
|
+
// project `.kimi-code/skills` + `.agents/skills`. Probe: a skill dropped
|
|
212
|
+
// in ~/.agents/skills was listed AND invoked as `/skill:<name>`.
|
|
213
|
+
// · hooks in `[[hooks]]` of the USER-GLOBAL config.toml only — there is no
|
|
214
|
+
// project-level config.toml (probe: a project hook never fired). Schema
|
|
215
|
+
// is event/matcher/command/timeout, strict — NOT Claude's shape.
|
|
216
|
+
// · MCP `mcp.json` with the Claude-compatible `mcpServers` wrapper: global
|
|
217
|
+
// `~/.kimi-code/mcp.json`, project `<cwd>/.kimi-code/mcp.json`.
|
|
218
|
+
// · NO env markers reach subprocesses (probe: `env | grep ^KIMI` is empty
|
|
219
|
+
// inside its own shell tool), hence the empty envMarkers and the binary
|
|
220
|
+
// probe below — the installer lives in ~/.kimi-code/bin, a dir only
|
|
221
|
+
// interactive shells put on PATH.
|
|
222
|
+
id: "kimi",
|
|
223
|
+
label: "Kimi Code",
|
|
224
|
+
glyph: "K",
|
|
225
|
+
support: { tier: "official", unstableSurface: true },
|
|
226
|
+
runtime: {
|
|
227
|
+
bins: ["kimi"],
|
|
228
|
+
fallbackBinPaths: ["~/.kimi-code/bin/kimi"],
|
|
229
|
+
versionArgs: ["--version"],
|
|
230
|
+
},
|
|
231
|
+
configDir: { kind: "dir", path: "~/.kimi-code" },
|
|
232
|
+
hooks: { mechanism: "~/.kimi-code/config.toml → [[hooks]]", managed: true },
|
|
233
|
+
envMarkers: [],
|
|
234
|
+
mcpHostId: "kimi",
|
|
235
|
+
globalMcpPaths: {
|
|
236
|
+
darwin: "~/.kimi-code/mcp.json",
|
|
237
|
+
linux: "~/.kimi-code/mcp.json",
|
|
238
|
+
win32: "~/.kimi-code/mcp.json",
|
|
239
|
+
},
|
|
240
|
+
projectMcpPath: ".kimi-code/mcp.json",
|
|
241
|
+
pluginManifest: null, // Kimi has plugins, but no manifest convention we ship.
|
|
242
|
+
pluginHooksDir: null, // Its hooks live in config.toml, not in a plugin dir.
|
|
243
|
+
skillsDirs: [".kimi-code/skills", ".agents/skills"],
|
|
244
|
+
installTarget: "kimi",
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
/** Hosts that auto-discover skills from the open-standard `~/.agents/skills`. */
|
|
248
|
+
function hostsReading(dir) {
|
|
249
|
+
return HARNESSES.filter((h) => h.skillsDirs.includes(dir)).map((h) => h.id);
|
|
250
|
+
}
|
|
251
|
+
export const SHARED_SKILL_DESTINATIONS = [
|
|
252
|
+
{
|
|
253
|
+
id: "agents",
|
|
254
|
+
label: "Agents (shared skills dir)",
|
|
255
|
+
glyph: "A",
|
|
256
|
+
dir: "~/.agents/skills",
|
|
257
|
+
readBy: hostsReading(".agents/skills"),
|
|
258
|
+
},
|
|
151
259
|
];
|
|
260
|
+
/** One install target per host, in catalog order. THE host set. */
|
|
261
|
+
export const HOST_INSTALL_TARGETS = HARNESSES.map((h) => h.installTarget);
|
|
262
|
+
/**
|
|
263
|
+
* Hosts that write an MCP config FILE. Oz is out on purpose: it takes servers
|
|
264
|
+
* through a `--mcp` launch flag, so there is nothing to write for it.
|
|
265
|
+
*/
|
|
266
|
+
export const MCP_FILE_HOSTS = HARNESSES.filter((h) => h.mcpHostId !== null).map((h) => h.mcpHostId);
|
|
267
|
+
/** Install targets that are shared destinations, not hosts. */
|
|
268
|
+
export const SHARED_INSTALL_TARGETS = SHARED_SKILL_DESTINATIONS.map((d) => d.id);
|
|
269
|
+
/** The HarnessSpec owning an install target, or null for a shared destination. */
|
|
270
|
+
export function harnessByInstallTarget(target) {
|
|
271
|
+
return HARNESSES.find((h) => h.installTarget === target) ?? null;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* What a verification RUN proved about this host, or null when no run ever
|
|
275
|
+
* covered it. Read it instead of asserting support from the tier alone: the
|
|
276
|
+
* tier is what we promise, this is what was actually checked.
|
|
277
|
+
*/
|
|
278
|
+
export function verificationFor(id) {
|
|
279
|
+
return HOST_VERIFICATIONS[id] ?? null;
|
|
280
|
+
}
|
|
152
281
|
/**
|
|
153
282
|
* Resolves the global MCP config path template for a harness spec. Does NOT
|
|
154
283
|
* expand `~` nor %LOCALAPPDATA% — expansion is the caller's job (see
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// VERIFICATION LEDGER — written by `npm run smoke:hosts`, never by hand.
|
|
2
|
+
//
|
|
3
|
+
// It is deliberately a separate module from the catalog: `harnesses.ts` is
|
|
4
|
+
// hand-authored (ids, dirs, tiers — what we DECIDE), this file records what a
|
|
5
|
+
// run actually PROVED. Keeping the two apart is what lets every projection say
|
|
6
|
+
// "verified against X on date Y" without a surface ever claiming a verification
|
|
7
|
+
// that no run backs (spec 010, criterion 10).
|
|
8
|
+
//
|
|
9
|
+
// A host absent from this record has simply never been verified by a run.
|
|
10
|
+
export const HOST_VERIFICATIONS = {
|
|
11
|
+
"claude-code": { version: "2.1.220", at: "2026-07-29", depth: "install" },
|
|
12
|
+
codex: { version: "0.145.0", at: "2026-07-29", depth: "install" },
|
|
13
|
+
oz: { version: "0.2026.07.22.09.01.stable_01", at: "2026-07-29", depth: "invocation" },
|
|
14
|
+
warp: { version: null, at: "2026-07-29", depth: "install" },
|
|
15
|
+
gemini: { version: "1.0.16", at: "2026-07-29", depth: "install" },
|
|
16
|
+
opencode: { version: "1.18.0", at: "2026-07-29", depth: "invocation" },
|
|
17
|
+
crush: { version: "0.87.0", at: "2026-07-29", depth: "invocation" },
|
|
18
|
+
kimi: { version: "0.29.2", at: "2026-07-29", depth: "install" },
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=host-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-verification.js","sourceRoot":"","sources":["../../src/domain/host-verification.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,8CAA8C;AAC9C,EAAE;AACF,0EAA0E;AAiB1E,MAAM,CAAC,MAAM,kBAAkB,GAAoD;IACjF,aAAa,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;IACzE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;IACjE,EAAE,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IACtF,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3D,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;IACjE,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IACtE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;IACnE,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;CAChE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tacuchi/agent-workflow-cli",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.25.0",
|
|
4
4
|
"description": "Runtime CLI for Workline — the stages + loops + artifacts system for agent work. Bundles the universal `w` skill set under `skills/w/` (slash commands `/w:*`: spec-new/spec-refine, plan-new/plan-exec, quick, persist, workspace-init, export-*); `self install --target <host>` copies SKILL + commands + hooks into the host. Pluggable capability skills via `.workflow/skills.toml`. Multi-empresa parametrization via `profile.json` cascade. Namespace auto-detected from any `.<ns>/sessions/` dir in CWD; default `workflow`.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"lint:fix": "biome check --write .",
|
|
19
19
|
"format": "biome format --write .",
|
|
20
20
|
"typecheck": "tsc --noEmit",
|
|
21
|
-
"prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build"
|
|
21
|
+
"prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build",
|
|
22
|
+
"smoke:hosts": "npm run build && node scripts/smoke-hosts.mjs"
|
|
22
23
|
},
|
|
23
24
|
"keywords": [
|
|
24
25
|
"cli",
|
|
@@ -49,21 +49,23 @@ The capabilities the harness layer depends on, with their universal fallback (wh
|
|
|
49
49
|
|
|
50
50
|
Concrete mechanism per harness (**Jul-2026**, verified against official docs; `~` partial). Antigravity CLI reuses Gemini's surfaces (`~/.gemini/`); Oz reuses Warp's (they share the **Warp / Oz** column, with MCP via flag — see the note under the matrix).
|
|
51
51
|
|
|
52
|
-
| Capability | Claude Code | Codex | Gemini / Antigravity | OpenCode | Crush | Warp / Oz | Generic |
|
|
53
|
-
|
|
54
|
-
| command-invocation | `.claude/commands/` (slash) | skills only (`$` mention; no commands dir, prompts removed) | skills only in agy (system slash commands; `.gemini/commands/*.toml` = legacy Gemini CLI) | `.opencode/command/` | `.crush/commands` (palette) + user-invocable skills | skills as `/name` | text |
|
|
55
|
-
| procedure-loading (skills) | `SKILL.md` `.claude/skills` | `SKILL.md` `.agents/skills` | `SKILL.md` (agentskills) | `SKILL.md` `.opencode`+`.claude`+`.agents` | `SKILL.md` `~/.config/crush`+`.agents`+`.claude` (`.crush/skills` is project-only) | `SKILL.md` `.agents`+`.warp`+`.claude` | read-and-follow `.md` |
|
|
56
|
-
| structured-choice | `AskUserQuestion` (**main-agent only**) | — | — | — | — | — | numbered markdown |
|
|
57
|
-
| compaction | `/compact` | Pre/PostCompact hooks | ~ | `session.compacted` | ~ | ~ | CHECKPOINT + resume |
|
|
58
|
-
| subagent-dispatch | `Task` (parallel) | `SubagentStart` / agents | agents (`.gemini/agents`) | `.opencode/agent/*.md` | ~ | ~ (cloud agents) | inline |
|
|
59
|
-
| persistent-context | `CLAUDE.md` (does **not** read AGENTS.md → symlink) | `AGENTS.md` | `GEMINI.md` + `AGENTS.md` | `AGENTS.md` | `CRUSH.md` + `AGENTS.md` | `AGENTS.md` (auto) | `AGENTS.md` |
|
|
60
|
-
| **host-memory** | `MEMORY.md` (cheap) + transcripts/`--resume` (deep) | `AGENTS.md` (static → fallback) | `GEMINI.md`+`AGENTS.md` (static → fallback) | `AGENTS.md` (static → fallback) | `CRUSH.md`+`AGENTS.md` (static → fallback) | rules / history (~) | git/`docs/` + ask |
|
|
61
|
-
| **web-research** | `WebSearch` / `WebFetch` | `web_search` (opt-in config) | `google_web_search` + `web_fetch` | `webfetch` (~) | ~ | ~ (agent web access) | — (offline + declare) |
|
|
62
|
-
| external-data (MCP) | `.mcp.json` | `.codex/config.toml` `[mcp_servers]` | `settings.json` `mcpServers` | `opencode.json` `mcp` | `crush.json` `mcp` | `.warp/.mcp.json` (+auto-discovers `.mcp.json`) · Oz: `--mcp` flag | — |
|
|
63
|
-
| **enforcement (deny tool)** | `PreToolUse` → `permissionDecision:deny` / exit 2 | `PreToolUse` (**≈same protocol**) | `BeforeTool` → `decision:deny` / exit 2 | plugin `tool.execute.before` (`throw`) | `allowed_tools` (+ preliminary hooks) | allow/deny lists (**coarse**) | doctrine (git-safe #5) |
|
|
64
|
-
| plugin / dist | `.claude-plugin` + marketplace | `.codex-plugin` + `/plugins` marketplace | Extension `gemini-extension.json` | JS/TS plugin (npm) | MCP + skills + config | Warp Drive | — |
|
|
65
|
-
|
|
66
|
-
> **
|
|
52
|
+
| Capability | Claude Code | Codex | Kimi Code | Gemini / Antigravity | OpenCode | Crush | Warp / Oz | Generic |
|
|
53
|
+
|---|---|---|---|---|---|---|---|---|
|
|
54
|
+
| command-invocation | `.claude/commands/` (slash) | skills only (`$` mention; no commands dir, prompts removed) | skills only, as `/skill:<name>` (no commands dir) | skills only in agy (system slash commands; `.gemini/commands/*.toml` = legacy Gemini CLI) | `.opencode/command/` | `.crush/commands` (palette) + user-invocable skills | skills as `/name` | text |
|
|
55
|
+
| procedure-loading (skills) | `SKILL.md` `.claude/skills` | `SKILL.md` `.agents/skills` | `SKILL.md` `.kimi-code/skills`+`.agents/skills` (user and project tiers) | `SKILL.md` (agentskills) | `SKILL.md` `.opencode`+`.claude`+`.agents` | `SKILL.md` `~/.config/crush`+`.agents`+`.claude` (`.crush/skills` is project-only) | `SKILL.md` `.agents`+`.warp`+`.claude` | read-and-follow `.md` |
|
|
56
|
+
| structured-choice | `AskUserQuestion` (**main-agent only**) | — | — | — | — | — | — | numbered markdown |
|
|
57
|
+
| compaction | `/compact` | Pre/PostCompact hooks | `/compact` + Pre/PostCompact hooks | ~ | `session.compacted` | ~ | ~ | CHECKPOINT + resume |
|
|
58
|
+
| subagent-dispatch | `Task` (parallel) | `SubagentStart` / agents | sub-agents (`SubagentStart`/`SubagentStop`) | agents (`.gemini/agents`) | `.opencode/agent/*.md` | ~ | ~ (cloud agents) | inline |
|
|
59
|
+
| persistent-context | `CLAUDE.md` (does **not** read AGENTS.md → symlink) | `AGENTS.md` | `AGENTS.md` (hierarchical) | `GEMINI.md` + `AGENTS.md` | `AGENTS.md` | `CRUSH.md` + `AGENTS.md` | `AGENTS.md` (auto) | `AGENTS.md` |
|
|
60
|
+
| **host-memory** | `MEMORY.md` (cheap) + transcripts/`--resume` (deep) | `AGENTS.md` (static → fallback) | sessions with resume/fork (`kimi -S`) + `AGENTS.md` | `GEMINI.md`+`AGENTS.md` (static → fallback) | `AGENTS.md` (static → fallback) | `CRUSH.md`+`AGENTS.md` (static → fallback) | rules / history (~) | git/`docs/` + ask |
|
|
61
|
+
| **web-research** | `WebSearch` / `WebFetch` | `web_search` (opt-in config) | moonshot search + fetch services | `google_web_search` + `web_fetch` | `webfetch` (~) | ~ | ~ (agent web access) | — (offline + declare) |
|
|
62
|
+
| external-data (MCP) | `.mcp.json` | `.codex/config.toml` `[mcp_servers]` | `~/.kimi-code/mcp.json` `mcpServers` (also reads project `.mcp.json`) | `settings.json` `mcpServers` | `opencode.json` `mcp` | `crush.json` `mcp` | `.warp/.mcp.json` (+auto-discovers `.mcp.json`) · Oz: `--mcp` flag | — |
|
|
63
|
+
| **enforcement (deny tool)** | `PreToolUse` → `permissionDecision:deny` / exit 2 | `PreToolUse` (**≈same protocol**) | `PreToolUse` → block / exit 2 | `BeforeTool` → `decision:deny` / exit 2 | plugin `tool.execute.before` (`throw`) | `allowed_tools` (+ preliminary hooks) | allow/deny lists (**coarse**) | doctrine (git-safe #5) |
|
|
64
|
+
| plugin / dist | `.claude-plugin` + marketplace | `.codex-plugin` + `/plugins` marketplace | plugins + marketplace (no manifest we ship) | Extension `gemini-extension.json` | JS/TS plugin (npm) | MCP + skills + config | Warp Drive | — |
|
|
65
|
+
|
|
66
|
+
> **Kimi Code caveats** (verified 2026-07-29 vs the shipped v0.29.2 binary + live probes): it exports **no env markers** to its subprocesses, so `aw harness` legitimately answers `unknown` inside it and detection goes through binary + config dir. Its hooks live **only** in the user-global `config.toml` — there is no project-level config — and their schema is `event`/`matcher`/`command`/`timeout`, so the bundled JSON template is *transformed*, not copied: `type: "prompt"` hooks cannot be expressed and are reported as skipped, and matchers are carried only for the tool-name events.
|
|
67
|
+
|
|
68
|
+
> **Notes (field research Jul-2026):** **`SKILL.md` skills** are the **universal** portable unit — **every harness in the matrix** supports them (Codex added them Dec-2025; **`.agents/skills` is the cross-host anchor**, read by Codex/OpenCode/Crush/Warp/Oz/**Kimi Code** — every host except Claude Code, which reads only `.claude/skills`). **Structured choice** (`AskUserQuestion`) remains **Claude Code / main-agent only** → elsewhere `structured-choice` degrades to numbered markdown. The **enforcement layer** (new row) is **NO longer Claude-exclusive**: Codex + Gemini use a near-identical protocol (`permissionDecision:deny` / exit 2) and OpenCode blocks via `throw` in a JS plugin; Crush/Warp only offer **coarse** allow/deny (no custom per-command logic) → there, conventions stay **advisory** + allow/deny lists. Enforced **plan mode** is never trusted for safety; git-safe (invariant #5) is our own — though a host-planner's *output* (the plan it built) is adoptable input (`../commands/plan-new.md` § *Input resolution*, mode 4). **MCP** is universal (each host its file/key). The **guaranteed floor** (last column) runs the full model.
|
|
67
69
|
|
|
68
70
|
> **Oz (Warp's cloud sibling).** `oz agent run` is a cloud agent orchestrator that **reuses Warp's surfaces**: same skills (`.agents/skills`, top-level dirs like Warp) and `AGENTS.md`, with `structured-choice` equally degraded to numbered markdown. It differs in three points: **detection** via `OZ_RUN_ID` (takes priority over Warp when both markers coexist); **MCP without a config file** — the JSON is passed via the `--mcp` flag of `oz agent run` (or the `OZ_MCP_CONFIG` env), it never writes `.warp/.mcp.json`; and **no plugin or hooks** (advisory enforcement, like Warp). Hence it shares the **Warp / Oz** column with that MCP caveat.
|
|
69
71
|
|
|
@@ -102,9 +104,14 @@ Each command's **contract** (Flow, Trigger, Input, Mode, …) is agnostic. The *
|
|
|
102
104
|
| OpenCode | `~/.opencode/command/w/<cmd>.md` | `/w/<cmd>` |
|
|
103
105
|
| Crush | `~/.crush/commands/w/<cmd>.md` (plain body — Crush parses no frontmatter) | palette `user:w:<cmd>` |
|
|
104
106
|
| Warp/Oz | synthesized skill `w-<cmd>/SKILL.md` next to the bundle (Warp lists skills as `/name`) | `/w-<cmd>` |
|
|
107
|
+
| Kimi Code | synthesized skill `~/.kimi-code/skills/w-<cmd>/SKILL.md` (reads no commands dir; verified vs v0.29.2) | `/skill:w-<cmd>` |
|
|
105
108
|
|
|
106
109
|
*Skill-as-command* (a synthesized `w-<cmd>` skill whose body is the command, with bundle references rewritten to `../w/…`) is the **universal fallback** for any host without a native commands surface. The loop/role/export manuals are deliberately **not** `SKILL.md` files (`LOOP.md`/`ROLE.md`/`EXPORT.md`/`HARNESS.md`): hosts that scan skill roots **recursively** (Codex ≤6 levels; OpenCode and Crush — which also cross-read `~/.claude/skills` and `~/.agents/skills`) must never index the internals as invocable skills. The contract never changes; the wrapper does (another column).
|
|
107
110
|
|
|
108
111
|
## Status
|
|
109
112
|
|
|
110
|
-
Capability model + binding matrix **defined** and **validated** with field research (**Jul-2026**, against official docs
|
|
113
|
+
Capability model + binding matrix **defined** and **validated** with field research (**Jul-2026**, against official docs and, for Kimi Code, the shipped binary).
|
|
114
|
+
|
|
115
|
+
The catalog counts **8 hosts** — `claude-code`, `codex`, `oz`, `warp`, `gemini`, `opencode`, `crush`, `kimi` — each with its own entry in `domain/harnesses.ts`. The columns above group two pairs that share a config surface (Warp/Oz, Gemini/Antigravity), which is a presentation choice, not a second taxonomy: the host set is whatever `HARNESSES` says. The anti-drift guards cover the CODE projections (TUI, install targets, doctor, detection) — this table is prose and no test reads it, so it is kept in step by review, not by a check. Support levels: **official** — Claude Code, Codex, Warp, Gemini/Antigravity, Kimi Code; **best-effort** — Oz, OpenCode, Crush. `agents` (`~/.agents/skills`) is a **shared destination**, never a host.
|
|
116
|
+
|
|
117
|
+
All support `SKILL.md` (anchor `.agents/skills`) + MCP + `AGENTS.md`; deterministic enforcement on Claude/Codex/Kimi/Gemini/OpenCode, advisory + coarse allow/deny on Crush/Warp/Oz. The CLI (`aw`) implements the registry (`domain/harnesses.ts`), the per-host MCP writers, `detect-hosts` and `install-skill --target <host>`. The universal floor (`AGENTS.md` + text + files + skills) runs the full model today.
|