@tacuchi/agent-workflow-cli 21.0.0 → 21.3.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 +3 -2
- package/dist/adapters/git-cli.js +12 -7
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/application/capability/compose.js +161 -0
- package/dist/application/capability/compose.js.map +1 -0
- package/dist/application/capability/descriptor-loader.js +109 -0
- package/dist/application/capability/descriptor-loader.js.map +1 -0
- package/dist/application/capability/design-handler.js +299 -0
- package/dist/application/capability/design-handler.js.map +1 -0
- package/dist/application/capability/dispatcher.js +312 -0
- package/dist/application/capability/dispatcher.js.map +1 -0
- package/dist/application/capability/durable-effect.js +220 -0
- package/dist/application/capability/durable-effect.js.map +1 -0
- package/dist/application/capability/installed-inventory.js +168 -0
- package/dist/application/capability/installed-inventory.js.map +1 -0
- package/dist/application/capability/readiness.js +204 -0
- package/dist/application/capability/readiness.js.map +1 -0
- package/dist/application/capability/resolution.js +264 -0
- package/dist/application/capability/resolution.js.map +1 -0
- package/dist/application/capability/wrapper.js +195 -0
- package/dist/application/capability/wrapper.js.map +1 -0
- package/dist/application/context/manifest.js +11 -5
- package/dist/application/context/manifest.js.map +1 -1
- package/dist/application/context/measure.js +5 -2
- package/dist/application/context/measure.js.map +1 -1
- package/dist/application/context/plan-service.js +6 -6
- package/dist/application/context/plan-service.js.map +1 -1
- package/dist/application/design/design-bundle-service.js +148 -0
- package/dist/application/design/design-bundle-service.js.map +1 -0
- package/dist/application/design/design-proposal-service.js +69 -0
- package/dist/application/design/design-proposal-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +275 -7
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +100 -0
- package/dist/application/design/design-record-service.js.map +1 -0
- package/dist/application/flow/advance.js +533 -0
- package/dist/application/flow/advance.js.map +1 -0
- package/dist/application/flow/flow-service.js +65 -0
- package/dist/application/flow/flow-service.js.map +1 -0
- package/dist/application/flow/run-projection.js +80 -0
- package/dist/application/flow/run-projection.js.map +1 -0
- package/dist/application/flow/run-state-service.js +107 -0
- package/dist/application/flow/run-state-service.js.map +1 -0
- package/dist/application/flow/submit.js +423 -0
- package/dist/application/flow/submit.js.map +1 -0
- package/dist/application/markdown.js +16 -2
- package/dist/application/markdown.js.map +1 -1
- package/dist/application/resume-service.js +23 -10
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/hooks-toml.js +137 -17
- package/dist/application/self/hooks-toml.js.map +1 -1
- package/dist/application/self/host-states.js +87 -1
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-hooks.js +62 -6
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.js +37 -6
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -0
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/skills-resolver-service.js +8 -2
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +4 -1
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +15 -2
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +13 -1
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/capability.js +182 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/flow.js +71 -0
- package/dist/cli/commands/flow.js.map +1 -0
- package/dist/cli/commands/index.js +4 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/skills.js +55 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +5 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +6 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +6 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +14 -2
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +13 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +8 -1
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/domain/capability/descriptor.js +553 -0
- package/dist/domain/capability/descriptor.js.map +1 -0
- package/dist/domain/capability/effects.js +90 -0
- package/dist/domain/capability/effects.js.map +1 -0
- package/dist/domain/capability/protocol.js +494 -0
- package/dist/domain/capability/protocol.js.map +1 -0
- package/dist/domain/contract-reader.js +84 -0
- package/dist/domain/contract-reader.js.map +1 -0
- package/dist/domain/design/adapter.js +161 -0
- package/dist/domain/design/adapter.js.map +1 -0
- package/dist/domain/design/artifact.js +148 -4
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +263 -4
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/direct.js +108 -0
- package/dist/domain/design/direct.js.map +1 -0
- package/dist/domain/design/external-send.js +65 -0
- package/dist/domain/design/external-send.js.map +1 -0
- package/dist/domain/design/maturity.js +71 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/offline.js +92 -0
- package/dist/domain/design/offline.js.map +1 -0
- package/dist/domain/design/profiles.js +212 -0
- package/dist/domain/design/profiles.js.map +1 -0
- package/dist/domain/design/proposal.js +234 -0
- package/dist/domain/design/proposal.js.map +1 -0
- package/dist/domain/design/render-bundle.js +0 -0
- package/dist/domain/design/render-bundle.js.map +1 -0
- package/dist/domain/design/rendition.js +472 -0
- package/dist/domain/design/rendition.js.map +1 -0
- package/dist/domain/design/sources.js +180 -0
- package/dist/domain/design/sources.js.map +1 -0
- package/dist/domain/design/validation.js +12 -68
- package/dist/domain/design/validation.js.map +1 -1
- package/dist/domain/design/visual-evidence.js +155 -0
- package/dist/domain/design/visual-evidence.js.map +1 -0
- package/dist/domain/flow/answer.js +459 -0
- package/dist/domain/flow/answer.js.map +1 -0
- package/dist/domain/flow/authority.js +2338 -0
- package/dist/domain/flow/authority.js.map +1 -0
- package/dist/domain/flow/authorization.js +62 -0
- package/dist/domain/flow/authorization.js.map +1 -0
- package/dist/domain/flow/directive.js +421 -0
- package/dist/domain/flow/directive.js.map +1 -0
- package/dist/domain/flow/rules.js +140 -0
- package/dist/domain/flow/rules.js.map +1 -0
- package/dist/domain/flow/run-state.js +317 -0
- package/dist/domain/flow/run-state.js.map +1 -0
- package/dist/domain/harnesses.js +124 -4
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/host-verification.js +8 -8
- package/dist/domain/skills.js +13 -14
- package/dist/domain/skills.js.map +1 -1
- package/dist/domain/structured-choice-stamp.js +106 -0
- package/dist/domain/structured-choice-stamp.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/SKILL.md +5 -5
- package/skills/w/context/MANIFEST.json +42 -1
- package/skills/w/harness/HARNESS.md +30 -4
- package/skills/w/loops/CHASSIS.md +11 -20
- package/skills/w/loops/CODE-POLICIES.md +9 -15
- package/skills/w/loops/plan-exec-loop/LOOP.md +11 -13
- package/skills/w/loops/plan-new-loop/LOOP.md +6 -4
- package/skills/w/loops/plan-refine-loop/LOOP.md +5 -3
- package/skills/w/loops/quick-loop/LOOP.md +18 -26
- package/skills/w/loops/spec-refine-loop/LOOP.md +14 -18
- package/skills/w/modules/COMPACTION.md +2 -6
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +2 -0
- package/skills/w/modules/DESIGN-REFERENCES.md +15 -11
- package/skills/w/modules/IDEATION-GATE.md +3 -3
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +17 -36
- package/skills/w/modules/PLAN-INPUT.md +5 -3
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +3 -1
- package/skills/w/modules/PLAN-SPLIT-GATE.md +7 -5
- package/skills/w/modules/PROMPT-CONTINUITY.md +3 -1
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +4 -4
- package/skills/w/roles/README.md +2 -0
- package/skills/w/roles/design/CONTRACT.md +80 -0
- package/skills/w/roles/design/ROLE.md +7 -0
- package/skills/w/schemas/capability-descriptor.schema.json +260 -0
- package/skills/w/schemas/design/design-render-bundle.v1.schema.json +191 -0
- package/skills/w/schemas/design/design-rendition.v1.schema.json +232 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +29 -1
package/dist/domain/harnesses.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { HOST_VERIFICATIONS } from "./host-verification.js";
|
|
2
|
+
/** The mention form every host that auto-discovers skills by description shares. */
|
|
3
|
+
const MENTION = {
|
|
4
|
+
kind: "mention",
|
|
5
|
+
template: "<name>",
|
|
6
|
+
note: "las skills se activan por su description: se nombra la capacidad en la conversación",
|
|
7
|
+
};
|
|
2
8
|
export const HARNESSES = [
|
|
3
9
|
{
|
|
4
10
|
id: "claude-code",
|
|
@@ -20,6 +26,17 @@ export const HARNESSES = [
|
|
|
20
26
|
pluginHooksDir: "hooks",
|
|
21
27
|
skillsDirs: [".claude/skills"],
|
|
22
28
|
installTarget: "claude",
|
|
29
|
+
invocation: MENTION,
|
|
30
|
+
structuredChoice: {
|
|
31
|
+
state: "native",
|
|
32
|
+
tool: "AskUserQuestion",
|
|
33
|
+
ceilings: { questions: 4, options: 4 },
|
|
34
|
+
sentence: "field",
|
|
35
|
+
sentenceMaxChars: null,
|
|
36
|
+
customAnswer: true,
|
|
37
|
+
fallbackReason: "the call fails, or the asker is a subagent (the tool belongs to the main agent only)",
|
|
38
|
+
evidence: "official docs 2026-08-02; the binding in daily use, and the regression plan 016 preserves",
|
|
39
|
+
},
|
|
23
40
|
},
|
|
24
41
|
{
|
|
25
42
|
id: "codex",
|
|
@@ -28,10 +45,18 @@ export const HARNESSES = [
|
|
|
28
45
|
support: { tier: "official" },
|
|
29
46
|
runtime: { bins: ["codex"], versionArgs: ["--version"] },
|
|
30
47
|
configDir: { kind: "dir", path: "~/.codex" },
|
|
31
|
-
// Codex HAS hooks
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
|
|
48
|
+
// Codex HAS hooks and its user-level path is settled — `~/.codex/hooks.json`,
|
|
49
|
+
// Claude-shaped, with the 5 template events among its 11 (probe 2026-08-04:
|
|
50
|
+
// codex read and validated a file written there, clamping a timeout). What it
|
|
51
|
+
// does NOT allow is an installer arming them: every new or changed hook needs
|
|
52
|
+
// an interactive human review, persisted as `trusted_hash` in
|
|
53
|
+
// `[hooks.state]`. Writing the file is therefore not arming it, and forging
|
|
54
|
+
// that hash would forge the person's security decision — so this stays
|
|
55
|
+
// `managed: false` and the mechanism string says exactly why.
|
|
56
|
+
hooks: {
|
|
57
|
+
mechanism: "~/.codex/hooks.json (Claude-shaped); each hook needs an interactive trust review in codex, recorded as trusted_hash in [hooks.state]",
|
|
58
|
+
managed: false,
|
|
59
|
+
},
|
|
35
60
|
envMarkers: ["CODEX_HOME", "CODEX_CLI", "CODEX_RUNTIME"],
|
|
36
61
|
mcpHostId: "codex",
|
|
37
62
|
globalMcpPaths: {
|
|
@@ -50,6 +75,20 @@ export const HARNESSES = [
|
|
|
50
75
|
// secondary for older builds. Verified vs developers.openai.com/codex/skills.
|
|
51
76
|
skillsDirs: [".agents/skills", ".codex/skills"],
|
|
52
77
|
installTarget: "codex",
|
|
78
|
+
invocation: MENTION,
|
|
79
|
+
// `degraded`, not `unsupported`: the tool IS in the runtime (its own router and
|
|
80
|
+
// TUI renderer name it), so what is missing is reachability — and that has an
|
|
81
|
+
// opt-in worth naming instead of a capability worth denying.
|
|
82
|
+
structuredChoice: {
|
|
83
|
+
state: "degraded",
|
|
84
|
+
tool: "request_user_input",
|
|
85
|
+
ceilings: { questions: 3, options: 3 },
|
|
86
|
+
sentence: "field",
|
|
87
|
+
sentenceMaxChars: null,
|
|
88
|
+
customAnswer: false,
|
|
89
|
+
fallbackReason: "its router refuses the call in Default mode (`request_user_input is unavailable in Default mode`) and exec mode never offers it, while the opt-in `default_mode_request_user_input` is still under development",
|
|
90
|
+
evidence: "probe 2026-08-04 on codex-cli 0.146.0: a real run hit the router refusal and the model listed its own tool set without it; `codex features list` reports the opt-in as 'under development false'",
|
|
91
|
+
},
|
|
53
92
|
},
|
|
54
93
|
{
|
|
55
94
|
// Detection: OZ_RUN_ID takes priority over warp markers to handle overlap.
|
|
@@ -73,6 +112,17 @@ export const HARNESSES = [
|
|
|
73
112
|
pluginHooksDir: null,
|
|
74
113
|
skillsDirs: [".agents/skills"],
|
|
75
114
|
installTarget: "oz",
|
|
115
|
+
invocation: MENTION,
|
|
116
|
+
structuredChoice: {
|
|
117
|
+
state: "unsupported",
|
|
118
|
+
tool: null,
|
|
119
|
+
ceilings: null,
|
|
120
|
+
sentence: "in-label",
|
|
121
|
+
sentenceMaxChars: null,
|
|
122
|
+
customAnswer: false,
|
|
123
|
+
fallbackReason: "its launcher is a 122-byte Bash shim inside Warp.app, with no tool surface of its own to reach",
|
|
124
|
+
evidence: "probe 2026-08-04 on oz v0.2026.07.29.09.05: the shim carries no question-tool name at all",
|
|
125
|
+
},
|
|
76
126
|
},
|
|
77
127
|
{
|
|
78
128
|
id: "warp",
|
|
@@ -104,6 +154,17 @@ export const HARNESSES = [
|
|
|
104
154
|
// (skill-as-command). See install-skill.ts:synthesizeCommandSkills.
|
|
105
155
|
skillsDirs: [".warp/skills", ".agents/skills", ".claude/skills", ".codex/skills"],
|
|
106
156
|
installTarget: "warp",
|
|
157
|
+
invocation: MENTION,
|
|
158
|
+
structuredChoice: {
|
|
159
|
+
state: "unsupported",
|
|
160
|
+
tool: null,
|
|
161
|
+
ceilings: null,
|
|
162
|
+
sentence: "in-label",
|
|
163
|
+
sentenceMaxChars: null,
|
|
164
|
+
customAnswer: false,
|
|
165
|
+
fallbackReason: "no structured-choice surface is documented for it",
|
|
166
|
+
evidence: "official docs 2026-08-02; it ships no CLI, so there is nothing local to probe",
|
|
167
|
+
},
|
|
107
168
|
},
|
|
108
169
|
{
|
|
109
170
|
// Gemini CLI (deprecated mid-2026) + Antigravity CLI (`agy`, successor;
|
|
@@ -143,6 +204,22 @@ export const HARNESSES = [
|
|
|
143
204
|
pluginHooksDir: null, // Extension-bundled hooks (BeforeTool) — Phase 2
|
|
144
205
|
skillsDirs: [".agents/skills", ".gemini/skills"],
|
|
145
206
|
installTarget: "gemini",
|
|
207
|
+
invocation: MENTION,
|
|
208
|
+
// The tool is `AskQuestion`, NOT the deprecated Gemini CLI's `ask_user`: the
|
|
209
|
+
// live binary here is `agy`, and `ask_user` does not appear in it at all.
|
|
210
|
+
// Naming the retired one would stamp a tool no installed host answers to.
|
|
211
|
+
structuredChoice: {
|
|
212
|
+
state: "native",
|
|
213
|
+
tool: "AskQuestion",
|
|
214
|
+
ceilings: null,
|
|
215
|
+
// `AskQuestionOption` carries `id` and `text` and nothing else — there is no
|
|
216
|
+
// field for the sentence, so it rides inside the visible option string.
|
|
217
|
+
sentence: "in-label",
|
|
218
|
+
sentenceMaxChars: null,
|
|
219
|
+
customAnswer: true,
|
|
220
|
+
fallbackReason: "the call fails or the host disables the tool (`AskQuestionToolConfig`)",
|
|
221
|
+
evidence: "probe 2026-08-04 on agy 1.0.16 (Antigravity, the successor that reuses ~/.gemini): its shipped proto declares `AskQuestionEntry` with `options`, `is_multi_select` and `write_in_response`, and `AskQuestionOption` with `id` + `text` only; no per-call ceiling is declared anywhere. The run itself is unverified — `agy --print` returned nothing within 150s",
|
|
222
|
+
},
|
|
146
223
|
},
|
|
147
224
|
{
|
|
148
225
|
// OpenCode (sst/opencode). Config `opencode.json` ($schema); MCP under `mcp`
|
|
@@ -167,6 +244,17 @@ export const HARNESSES = [
|
|
|
167
244
|
pluginHooksDir: null,
|
|
168
245
|
skillsDirs: [".opencode/skills", ".agents/skills", ".claude/skills"],
|
|
169
246
|
installTarget: "opencode",
|
|
247
|
+
invocation: MENTION,
|
|
248
|
+
structuredChoice: {
|
|
249
|
+
state: "native",
|
|
250
|
+
tool: "question",
|
|
251
|
+
ceilings: null,
|
|
252
|
+
sentence: "field",
|
|
253
|
+
sentenceMaxChars: null,
|
|
254
|
+
customAnswer: true,
|
|
255
|
+
fallbackReason: "a non-interactive run (`opencode run`) starts with the `question` permission set to `deny`, or the call fails",
|
|
256
|
+
evidence: "probe 2026-08-04 on opencode 1.18.5: `QuestionOption` carries its own `label` and `description`, `custom` defaults to true, and no count ceiling is declared; the exported session of a real `run` showed `question` denied",
|
|
257
|
+
},
|
|
170
258
|
},
|
|
171
259
|
{
|
|
172
260
|
// Crush (charmbracelet/crush). Config `crush.json` ($schema charm.land/crush.json);
|
|
@@ -202,6 +290,20 @@ export const HARNESSES = [
|
|
|
202
290
|
".claude/skills",
|
|
203
291
|
],
|
|
204
292
|
installTarget: "crush",
|
|
293
|
+
invocation: MENTION,
|
|
294
|
+
structuredChoice: {
|
|
295
|
+
state: "native",
|
|
296
|
+
tool: "question",
|
|
297
|
+
ceilings: { questions: 5, options: 5 },
|
|
298
|
+
sentence: "field",
|
|
299
|
+
// The one host that CAPS the sentence. It matters: a consequence longer than
|
|
300
|
+
// this cannot be shortened to fit without losing content, which is a
|
|
301
|
+
// degradation to declare, not a trim to perform quietly.
|
|
302
|
+
sentenceMaxChars: 100,
|
|
303
|
+
customAnswer: true,
|
|
304
|
+
fallbackReason: "the call fails, or an option's consequence does not fit that cap",
|
|
305
|
+
evidence: "probe 2026-08-04 on crush v0.87.0: ceilings 5×5, a description required on every question (<300 chars) and on every choice (<100 chars), and an automatic fill-in option, all read from the installed binary; the run itself could not be verified (expired auth)",
|
|
306
|
+
},
|
|
205
307
|
},
|
|
206
308
|
{
|
|
207
309
|
// Kimi Code (MoonshotAI) — successor of the Python `kimi-cli`, shipped as a
|
|
@@ -242,6 +344,24 @@ export const HARNESSES = [
|
|
|
242
344
|
pluginHooksDir: null, // Its hooks live in config.toml, not in a plugin dir.
|
|
243
345
|
skillsDirs: [".kimi-code/skills", ".agents/skills"],
|
|
244
346
|
installTarget: "kimi",
|
|
347
|
+
// The one host with a VERIFIED typed form: a skill dropped in
|
|
348
|
+
// ~/.agents/skills was listed and invoked this way (probe 2026-07-29, the
|
|
349
|
+
// same one `COMMAND_SKILLS_HOSTS` rests on).
|
|
350
|
+
invocation: {
|
|
351
|
+
kind: "slash",
|
|
352
|
+
template: "/skill:<name>",
|
|
353
|
+
note: "probe 2026-07-29: las skills SON la superficie de comandos de Kimi Code",
|
|
354
|
+
},
|
|
355
|
+
structuredChoice: {
|
|
356
|
+
state: "native",
|
|
357
|
+
tool: "AskUserQuestion",
|
|
358
|
+
ceilings: { questions: 4, options: 4 },
|
|
359
|
+
sentence: "field",
|
|
360
|
+
sentenceMaxChars: null,
|
|
361
|
+
customAnswer: true,
|
|
362
|
+
fallbackReason: "the call fails, or the permission mode is `auto` or the run is non-interactive (this host's own system rule forbids the call there)",
|
|
363
|
+
evidence: "probe 2026-08-04 on kimi 0.31.1: the tool is in the default agent's list and its schema is 1-4 questions × 2-4 options with `label` + `description`; in `--prompt` it refused the call ('auto mode is active') and degraded to labeled markdown on its own, options and consequences intact",
|
|
364
|
+
},
|
|
245
365
|
},
|
|
246
366
|
];
|
|
247
367
|
/** Hosts that auto-discover skills from the open-standard `~/.agents/skills`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/domain/harnesses.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
//
|
|
9
9
|
// A host absent from this record has simply never been verified by a run.
|
|
10
10
|
export const HOST_VERIFICATIONS = {
|
|
11
|
-
"claude-code": { version: "2.1.
|
|
12
|
-
codex: { version: "0.
|
|
13
|
-
oz: { version: "0.2026.07.
|
|
14
|
-
warp: { version: null, at: "2026-
|
|
15
|
-
gemini: { version: "1.0.16", at: "2026-
|
|
16
|
-
opencode: { version: "1.18.
|
|
17
|
-
crush: { version: "0.87.0", at: "2026-
|
|
18
|
-
kimi: { version: "0.
|
|
11
|
+
"claude-code": { version: "2.1.222", at: "2026-08-05", depth: "install" },
|
|
12
|
+
codex: { version: "0.146.0", at: "2026-08-05", depth: "install" },
|
|
13
|
+
oz: { version: "0.2026.07.29.09.05.stable_02", at: "2026-08-05", depth: "invocation" },
|
|
14
|
+
warp: { version: null, at: "2026-08-05", depth: "install" },
|
|
15
|
+
gemini: { version: "1.0.16", at: "2026-08-05", depth: "install" },
|
|
16
|
+
opencode: { version: "1.18.5", at: "2026-08-05", depth: "invocation" },
|
|
17
|
+
crush: { version: "0.87.0", at: "2026-08-05", depth: "invocation" },
|
|
18
|
+
kimi: { version: "0.31.1", at: "2026-08-05", depth: "install" },
|
|
19
19
|
};
|
|
20
20
|
//# sourceMappingURL=host-verification.js.map
|
package/dist/domain/skills.js
CHANGED
|
@@ -26,20 +26,19 @@ const ROLE_SET = new Set(SKILL_ROLES);
|
|
|
26
26
|
export function isSkillRole(value) {
|
|
27
27
|
return ROLE_SET.has(value);
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
*/
|
|
29
|
+
export function classifyCapabilityBinding(resolved, canonicalName) {
|
|
30
|
+
if (!resolved.enabled || resolved.skill === null) {
|
|
31
|
+
return { state: "off", reason: `'${resolved.role}' está en off`, action: null };
|
|
32
|
+
}
|
|
33
|
+
if (resolved.skill === canonicalName) {
|
|
34
|
+
return { state: "floor_and_improvements", reason: null, action: null };
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
state: "misconfigured",
|
|
38
|
+
reason: `'${resolved.role}' apunta a '${resolved.skill}', y un binding de reemplazo no selecciona una mejora`,
|
|
39
|
+
action: `dejá el binding sin declarar, ponelo en '${canonicalName}' o desactivalo con "off"`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
43
42
|
export const RETIRED_SKILL_IDENTITIES = new Map([
|
|
44
43
|
[
|
|
45
44
|
"ui-design",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/domain/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAIjG,4DAA4D;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAA8B;IAC/D,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,GAAG;CACd,CAAC;AAcF,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;AAE3D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/domain/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAIjG,4DAA4D;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAA8B;IAC/D,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,GAAG;CACd,CAAC;AAcF,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;AAE3D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AA+CD,MAAM,UAAU,yBAAyB,CACvC,QAAuB,EACvB,aAAqB;IAErB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,eAAe,QAAQ,CAAC,KAAK,uDAAuD;QAC7G,MAAM,EAAE,4CAA4C,aAAa,2BAA2B;KAC7F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAgC,IAAI,GAAG,CAAC;IAC3E;QACE,WAAW;QACX,2FAA2F;KAC5F;IACD;QACE,SAAS;QACT,uGAAuG;KACxG;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-host structured-choice binding, rendered as the text an installed
|
|
3
|
+
* surface carries.
|
|
4
|
+
*
|
|
5
|
+
* Why a stamp at all: the canonical bundle is host-neutral on purpose, and the CLI
|
|
6
|
+
* does not present — it emits directives and a surface shows them. So the only
|
|
7
|
+
* thing that ever knew which host it was talking about was the INSTALL, and it was
|
|
8
|
+
* throwing that away: every wrapper on every host shipped the same neutral
|
|
9
|
+
* sentence, and an agent reading it had nothing telling it which mechanism to
|
|
10
|
+
* reach for. Runtime detection is not the answer either — `aw harness` legitimately
|
|
11
|
+
* answers `unknown` inside Kimi Code, which exports no env marker.
|
|
12
|
+
*
|
|
13
|
+
* So the binding is stamped at install, when the target IS known, and it is
|
|
14
|
+
* generated from {@link HarnessSpec.structuredChoice} and nothing else — a second
|
|
15
|
+
* hand-written copy per host is exactly the drift the catalog exists to prevent.
|
|
16
|
+
*
|
|
17
|
+
* It stays short by design. Every byte here lands in EVERY installed wrapper on
|
|
18
|
+
* that host and is read on every invocation, so this is a context cost, not free
|
|
19
|
+
* documentation: it says which mechanism, its ceilings, where the sentence goes,
|
|
20
|
+
* and when to fall back. The reasoning behind the rule lives in `HARNESS.md`.
|
|
21
|
+
*/
|
|
22
|
+
import { harnessByInstallTarget } from "./harnesses.js";
|
|
23
|
+
/**
|
|
24
|
+
* The universal floor, spelled the same way on every host — including the ones
|
|
25
|
+
* that reach it as a fallback. Kept in one constant so a host that degrades and a
|
|
26
|
+
* host that never had a mechanism describe the same thing identically: two
|
|
27
|
+
* wordings would read as two different fallbacks.
|
|
28
|
+
*/
|
|
29
|
+
const LABELED_MARKDOWN = "labeled markdown — every option as `Label — functional sentence`, the `flow` control (`Compactar`/`Cerrar`) always among them, answered by label or `Aceptar recomendaciones`";
|
|
30
|
+
const CONTENT_RULE = "Degrade the mechanism, never the content: no alternative is merged, truncated or dropped to fit, and any loss is declared as a degradation.";
|
|
31
|
+
/**
|
|
32
|
+
* The stamp for one host, as a markdown blockquote (no trailing newline).
|
|
33
|
+
*
|
|
34
|
+
* A blockquote because it is inserted into documents whose own body is markdown —
|
|
35
|
+
* a command wrapper, a synthesized skill, a capability skill — and a quote block
|
|
36
|
+
* reads as "this is about your host", not as another step of the procedure.
|
|
37
|
+
*/
|
|
38
|
+
export function renderStructuredChoiceStamp(spec) {
|
|
39
|
+
const binding = spec.structuredChoice;
|
|
40
|
+
const lines = [
|
|
41
|
+
`**Structured-choice on this host (\`${spec.installTarget}\`, stamped at install).**`,
|
|
42
|
+
];
|
|
43
|
+
if (binding.state === "native" && binding.tool !== null) {
|
|
44
|
+
lines[0] += ` Present every human and authorization boundary with \`${binding.tool}\`${ceilingClause(binding.ceilings)}.`;
|
|
45
|
+
lines.push(sentenceClause(binding.sentence, binding.sentenceMaxChars));
|
|
46
|
+
if (binding.customAnswer) {
|
|
47
|
+
lines.push("It already offers a free-text answer, so do not add an `Other` option of your own.");
|
|
48
|
+
}
|
|
49
|
+
// The condition leads: a reader who stops at the comma still knows WHEN this
|
|
50
|
+
// applies. Trailing it after the fallback's own long description buried it.
|
|
51
|
+
lines.push(`When ${binding.fallbackReason}, fall back to ${LABELED_MARKDOWN}.`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
lines[0] += ` Present every human and authorization boundary as ${LABELED_MARKDOWN}.`;
|
|
55
|
+
lines.push(binding.tool === null
|
|
56
|
+
? `This host exposes no native selection surface: ${binding.fallbackReason}.`
|
|
57
|
+
: `Its \`${binding.tool}\` is not reachable: ${binding.fallbackReason}.`);
|
|
58
|
+
}
|
|
59
|
+
lines.push(CONTENT_RULE);
|
|
60
|
+
return lines.map((line) => `> ${line}`).join("\n");
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The stamp for an install target, host or shared destination.
|
|
64
|
+
*
|
|
65
|
+
* A shared skills dir is read by several hosts at once, so stamping one host's tool
|
|
66
|
+
* into it would name the wrong mechanism for every other reader. It gets the
|
|
67
|
+
* guaranteed floor plus where to resolve its own column — which is the honest
|
|
68
|
+
* answer, and the only one that cannot be wrong.
|
|
69
|
+
*/
|
|
70
|
+
export function stampForInstallTarget(target) {
|
|
71
|
+
const spec = harnessByInstallTarget(target);
|
|
72
|
+
if (spec !== null)
|
|
73
|
+
return renderStructuredChoiceStamp(spec);
|
|
74
|
+
return [
|
|
75
|
+
`> **Structured-choice on this host (\`${target}\` is a shared skills dir, stamped at install).**`,
|
|
76
|
+
"> Several hosts read this directory, so no single native mechanism can be named here.",
|
|
77
|
+
`> Present every human and authorization boundary as ${LABELED_MARKDOWN}; if the host you`,
|
|
78
|
+
"> are actually running in has a native surface, its column in `harness/HARNESS.md` §",
|
|
79
|
+
"> *Harness binding matrix* is the one to follow.",
|
|
80
|
+
`> ${CONTENT_RULE}`,
|
|
81
|
+
].join("\n");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A ceiling the host declares, or the explicit absence of one.
|
|
85
|
+
*
|
|
86
|
+
* The absent case does not fall silent: with no host ceiling the chassis' own
|
|
87
|
+
* `≤3 content questions` is what applies, and an agent told nothing would either
|
|
88
|
+
* invent a limit or ignore both.
|
|
89
|
+
*/
|
|
90
|
+
function ceilingClause(ceilings) {
|
|
91
|
+
const flowSlot = ", always reserving one question slot for the `flow` control (`Compactar`/`Cerrar`)";
|
|
92
|
+
if (ceilings === null) {
|
|
93
|
+
return `, whose per-call ceilings this host does not declare — keep the chassis' ≤3 content questions${flowSlot}`;
|
|
94
|
+
}
|
|
95
|
+
return `, at most ${ceilings.questions} questions per call and ${ceilings.options} options each${flowSlot}`;
|
|
96
|
+
}
|
|
97
|
+
/** Where the option's functional sentence goes, and whether the host caps it. */
|
|
98
|
+
function sentenceClause(sentence, maxChars) {
|
|
99
|
+
const cap = maxChars === null
|
|
100
|
+
? ""
|
|
101
|
+
: ` This host caps that sentence at ${maxChars} characters: a consequence that does not fit is a degradation to declare, never a sentence to trim.`;
|
|
102
|
+
return sentence === "field"
|
|
103
|
+
? `The option's label and its functional sentence go in their own fields.${cap}`
|
|
104
|
+
: `This host shows one visible option string, so render \`Label — functional sentence\`.${cap}`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=structured-choice-stamp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-choice-stamp.js","sourceRoot":"","sources":["../../src/domain/structured-choice-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAwC,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE9F;;;;;GAKG;AACH,MAAM,gBAAgB,GACpB,+KAA+K,CAAC;AAElL,MAAM,YAAY,GAChB,6IAA6I,CAAC;AAEhJ;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAiB;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACtC,MAAM,KAAK,GAAG;QACZ,uCAAuC,IAAI,CAAC,aAAa,4BAA4B;KACtF,CAAC;IAEF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxD,KAAK,CAAC,CAAC,CAAC,IAAI,0DAA0D,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC1H,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CACR,oFAAoF,CACrF,CAAC;QACJ,CAAC;QACD,6EAA6E;QAC7E,4EAA4E;QAC5E,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,cAAc,kBAAkB,gBAAgB,GAAG,CAAC,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,CAAC,CAAC,IAAI,sDAAsD,gBAAgB,GAAG,CAAC;QACtF,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,IAAI,KAAK,IAAI;YACnB,CAAC,CAAC,kDAAkD,OAAO,CAAC,cAAc,GAAG;YAC7E,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,wBAAwB,OAAO,CAAC,cAAc,GAAG,CAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO;QACL,yCAAyC,MAAM,mDAAmD;QAClG,uFAAuF;QACvF,uDAAuD,gBAAgB,mBAAmB;QAC1F,sFAAsF;QACtF,kDAAkD;QAClD,KAAK,YAAY,EAAE;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,QAAuD;IAC5E,MAAM,QAAQ,GACZ,oFAAoF,CAAC;IACvF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,gGAAgG,QAAQ,EAAE,CAAC;IACpH,CAAC;IACD,OAAO,aAAa,QAAQ,CAAC,SAAS,2BAA2B,QAAQ,CAAC,OAAO,gBAAgB,QAAQ,EAAE,CAAC;AAC9G,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,QAA8B,EAAE,QAAuB;IAC7E,MAAM,GAAG,GACP,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,oCAAoC,QAAQ,qGAAqG,CAAC;IACxJ,OAAO,QAAQ,KAAK,OAAO;QACzB,CAAC,CAAC,yEAAyE,GAAG,EAAE;QAChF,CAAC,CAAC,wFAAwF,GAAG,EAAE,CAAC;AACpG,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tacuchi/agent-workflow-cli",
|
|
3
|
-
"version": "21.
|
|
3
|
+
"version": "21.3.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": {
|
package/skills/w/SKILL.md
CHANGED
|
@@ -89,11 +89,11 @@ Before any loop, the AI resolves its **operating context** on **every prompt** w
|
|
|
89
89
|
**Continuity rule** (single source — the chassis and the loops reference here):
|
|
90
90
|
|
|
91
91
|
1. **Flow command** = **new work line** → new session.
|
|
92
|
-
2. **
|
|
93
|
-
3.
|
|
94
|
-
4. **
|
|
95
|
-
|
|
96
|
-
|
|
92
|
+
2. **Prompt with no command** = "same line" → continue/reopen the **most recent** session (the *last started*).
|
|
93
|
+
3. Only if the prompt is clearly **unrelated**: offer choosing (`continuar NNN` | `trabajo nuevo`) or fall to "no flow".
|
|
94
|
+
4. **Convergence closes** the session; a later related prompt **reopens** it (resume removes `.closed`).
|
|
95
|
+
|
|
96
|
+
> **The two exceptions to #1 are not this document's call:** re-running the same command over the **same input** does not open another line — `aw session-resume --code <NNN> --reopen` locates that flow's session by descriptor and `## Origin` and resumes it instead of duplicating it — and an **accepted escalation** inside a loop (quick → SPEC) opens a new line **without** a command, which `aw resume` treats as equivalent to having invoked the destination flow's, because the consent was explicit. Both stay stated here for their reason, not their rule: a line must never fork because somebody re-ran a command, and never continue silently because somebody changed subject.
|
|
97
97
|
|
|
98
98
|
It is the **inter-turn** face of the *persistent objective* (same `CHECKPOINT`+resume, applied to the next prompt) — agnostic doctrine, not a host hook. It applies to **every artifact** (`SCRIPTS.sql` is the worked example; QUICK case: `loops/quick-loop/LOOP.md`).
|
|
99
99
|
|
|
@@ -22,6 +22,40 @@
|
|
|
22
22
|
"classification": "in-conversation work has to be classified before it is written",
|
|
23
23
|
"authoring": "the deliverable's own notation, structure or ordering is not obvious from the material"
|
|
24
24
|
},
|
|
25
|
+
"$comment_flow_signals": "Vocabulary the AGENT may declare at a flow boundary — kept HERE, next to the context signals, so there is one catalog and not two that drift. The frontier is exact: recognizing a signal is judgment (the agent's), applying the threshold over the declared signals is a rule (the CLI's). A signal outside this vocabulary never advances a journey. Each id must be consumed by some transition of the authority registry, and every signal a transition consumes must appear here: the guard runs in both directions.",
|
|
26
|
+
"flow_signals": {
|
|
27
|
+
"quick.needs-architecture": "the objective cannot be met without deciding how responsibilities are distributed",
|
|
28
|
+
"quick.two-or-more-sources": "the change reaches two or more declared sources",
|
|
29
|
+
"quick.multiple-deliverables": "the objective bundles more than one independent deliverable",
|
|
30
|
+
"quick.large-feature-or-refactor": "the size is that of a feature or a refactor, not a scoped fix",
|
|
31
|
+
"quick.ambiguous-requirements": "what is being asked needs elicitation before anything can be built",
|
|
32
|
+
"quick.deliverable-is-analysis": "what the task produces is an analysis or a design, so its criterion is a rubric a person ratifies",
|
|
33
|
+
"spec.functional-ambiguity": "a functional ambiguity with two readings that would change what gets built is blocking this spec",
|
|
34
|
+
"spec.solution-space-unexplored": "a trigger of the ideation gate fires: the spec settled on its first idea and the alternatives would change the outcome",
|
|
35
|
+
"spec.independent-outcomes": "the prompt holds outcomes each worth delivering on its own",
|
|
36
|
+
"spec.enumerated-features": "the prompt enumerates distinct features explicitly",
|
|
37
|
+
"spec.distinct-moments": "the parts are requested for different moments or in a stated order",
|
|
38
|
+
"spec.independent-value": "the users or the value of each part do not depend on the others",
|
|
39
|
+
"plan.independent-tranches": "the tranches are executable and deliverable independently",
|
|
40
|
+
"plan.no-shared-deps": "the tranches share neither dependencies nor risk",
|
|
41
|
+
"plan.distinct-priorities": "the tranches are requested at different moments or priorities",
|
|
42
|
+
"plan.far-beyond-s": "the plan far exceeds S-complexity phases",
|
|
43
|
+
"plan.staging-requested": "the person asked for the work to be staged",
|
|
44
|
+
"plan.dependency-outside-range": "a phase of the range depends on something neither already satisfied nor an earlier phase of that same range",
|
|
45
|
+
"plan.result-shapes-later": "a phase result, proof, probe or human decision determines how a later phase has to be built",
|
|
46
|
+
"plan.blocker-between-phases": "an unresolved question, a live blocker, an operative handoff or an irreversible external action sits between the phases",
|
|
47
|
+
"plan.recovery-boundary": "an intermediate commit, release, review or deployment is a required recovery boundary",
|
|
48
|
+
"plan.not-one-reviewable-unit": "the combined change is not coherent, recoverable and reviewable as a single unit",
|
|
49
|
+
"plan.entry-gap-minor": "the plan is all but executable: the gap is derivable from what it already states, so it can be normalized in place",
|
|
50
|
+
"plan.entry-gap-structural": "phases, contracts or journey are missing, or temporary behavior leaves its boundary undeclared",
|
|
51
|
+
"plan.deviation-structural": "the change that appeared while implementing touches a contract, the participating components, the phase order or the simulation boundary",
|
|
52
|
+
"plan.deviation-functional": "the change that appeared while implementing touches the expected result, the scope, a business rule or an acceptance criterion",
|
|
53
|
+
"chassis.context-pressure": "a fresh reader would need the CHECKPOINT to continue this run",
|
|
54
|
+
"plan.tasks-to-mark": "at least one task of the batch finished its local work and its checkbox is still open",
|
|
55
|
+
"plan.plan-closable": "every phase of the plan will be validated once this batch closes, so the plan can be sealed done",
|
|
56
|
+
"plan.commit-pending": "at least one affected source carries uncommitted changes from this batch",
|
|
57
|
+
"quick.db-touched": "the task read from or wrote to a database, so there is a statement to derive into the session script"
|
|
58
|
+
},
|
|
25
59
|
"commands": {
|
|
26
60
|
"quick": {
|
|
27
61
|
"core": [
|
|
@@ -448,6 +482,13 @@
|
|
|
448
482
|
]
|
|
449
483
|
}
|
|
450
484
|
},
|
|
485
|
+
"capabilities": {
|
|
486
|
+
"$comment": "Conformant capabilities: the same read-set question as a command, and deliberately NOT commands — no commands/<name>.md, no activation median, no reclassification as a single-pass command.",
|
|
487
|
+
"design": {
|
|
488
|
+
"core": ["roles/design/CONTRACT.md"],
|
|
489
|
+
"modules": []
|
|
490
|
+
}
|
|
491
|
+
},
|
|
451
492
|
"journeys": [
|
|
452
493
|
{
|
|
453
494
|
"id": "spec",
|
|
@@ -487,7 +528,7 @@
|
|
|
487
528
|
}
|
|
488
529
|
],
|
|
489
530
|
"budget_policy": {
|
|
490
|
-
"$comment": "Ratios of the frozen baseline (spec 009
|
|
531
|
+
"$comment": "Ratios of the frozen baseline (spec 009 § Decisions: -30% discovery, -40% median and -20% minimum activation, -25% median execution, +5% ceiling per journey). Absolute targets are DERIVED from baseline x ratio, never written by hand. The +5% ceiling also caps modules.total, the conditional tree as one figure: a representative journey carries no signal, so no journey line ever prices a module, and without that line the modules would grow unwatched.",
|
|
491
532
|
"discovery_max_ratio": 0.7,
|
|
492
533
|
"activation_median_max_ratio": 0.6,
|
|
493
534
|
"activation_each_max_ratio": 0.8,
|
|
@@ -47,13 +47,13 @@ The capabilities the harness layer depends on, with their universal fallback (wh
|
|
|
47
47
|
|
|
48
48
|
## Harness binding matrix
|
|
49
49
|
|
|
50
|
-
Concrete mechanism per harness (matrix base verified **Jul-2026**; the `structured-choice` row
|
|
50
|
+
Concrete mechanism per harness (matrix base verified **Jul-2026**; the `structured-choice` row re-verified **2026-08-04** and the Codex `hooks` row **2026-08-05**, both against the INSTALLED runtimes plus real runs — not 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
52
|
| Capability | Claude Code | Codex | Kimi Code | Gemini / Antigravity | OpenCode | Crush | Warp / Oz | Generic |
|
|
53
53
|
|---|---|---|---|---|---|---|---|---|
|
|
54
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
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**; 1–4 questions, 2–4 options; label + description) | `request_user_input`
|
|
56
|
+
| structured-choice | `AskUserQuestion` (**main-agent only**; 1–4 questions, 2–4 options; label + description; free-text always offered) | `request_user_input` **not reachable** (~): its router refuses it in Default mode and exec mode never offers it; opt-in `default_mode_request_user_input` still *under development* → labeled markdown | `AskUserQuestion` (1–4 questions, 2–4 options; label + description; free-text offered) — **not called in `auto`/non-interactive mode** by the host's own rule → labeled markdown | `AskQuestion` (Antigravity/`agy`, the live binary: option `text` only, **no description field** → `Label — sentence`; write-in; no ceiling declared). `ask_user` is the retired Gemini CLI's and is **absent** from `agy` | `question` (label + description as separate fields; `custom` free-text on by default; no ceiling declared) — **denied in a non-interactive run** → labeled markdown | `question` (≤5 questions, ≤5 choices; description required per question <300 chars and **per choice <100 chars**; automatic fill-in) | no structured-choice surface → labeled markdown | labeled markdown (label + sentence) |
|
|
57
57
|
| compaction | `/compact` | Pre/PostCompact hooks | `/compact` + Pre/PostCompact hooks | ~ | `session.compacted` | ~ | ~ | CHECKPOINT + resume |
|
|
58
58
|
| subagent-dispatch | `Task` (parallel) | `SubagentStart` / agents | sub-agents (`SubagentStart`/`SubagentStop`) | agents (`.gemini/agents`) | `.opencode/agent/*.md` | ~ | ~ (cloud agents) | inline |
|
|
59
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` |
|
|
@@ -65,11 +65,17 @@ Concrete mechanism per harness (matrix base verified **Jul-2026**; the `structur
|
|
|
65
65
|
|
|
66
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
67
|
|
|
68
|
+
> **Codex hooks caveats** (verified **2026-08-05** vs codex-cli 0.146.0 + real runs). Its user-level hooks are **not** in `config.toml`: they live in **`~/.codex/hooks.json`** with the **same JSON shape as Claude's** — `{"hooks": {"<Event>": [{"matcher": …, "hooks": [{"type": "command", "command": …, "timeout": N}]}]}}`. The event enum (`HookEventsToml`) is `PreToolUse` · `PermissionRequest` · `PostToolUse` · `PreCompact` · `PostCompact` · `SessionStart` · `SessionEnd` · `UserPromptSubmit` · `SubagentStart` · `SubagentStop` · `Stop`, so **all 5 events of the bundled template fit**, and its handlers admit `command`, **`prompt`** and `agent` — the `type: "prompt"` hook kimi cannot express, codex can. One observed limit: `SessionEnd` clamps its timeout to **3 s**.
|
|
69
|
+
>
|
|
70
|
+
> **But writing that file does not arm it, and that is why Workline does not manage hooks here.** Codex requires an **interactive human review per new or changed hook** (`New hook - review required`, `Modified since last trusted - review required`) and persists the decision as `trusted_hash` under `[hooks.state]`, keyed `"<file>:<event_snake_case>:<i>:<j>"`; the hash pins the command, so any edit re-requires review. Probe: in a clean `CODEX_HOME` a freshly written `hooks.json` was **read and validated** (it clamped a timeout) yet **no hook ran** across two consecutive runs, and codex recorded no trust entry of its own. Forging that hash would forge the person's security approval, so the surfaces say **available, not armed** and name this reason. `--dangerously-bypass-hook-trust` is per-invocation and self-describing. Plugin-bundled hooks skip the review (`Managed hooks are always on`), which is the route to take if this is ever revisited.
|
|
71
|
+
|
|
68
72
|
> **Notes (field research Aug-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`). The **enforcement layer** is **not 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.
|
|
69
73
|
|
|
70
74
|
> **structured-choice routing.** A native binding qualifies only when the current client exposes it and can display the option's functional sentence without loss. When it has separate fields, map the semantic label and sentence to them; when it exposes one visible option string, render `Label — functional sentence`. Otherwise use labeled markdown. Respect the per-call ceilings in the row and reserve one question slot for `flow`; carry overflow into a later call. If the native tool already injects a custom/free-text option, do not add a duplicate `Other` option.
|
|
71
75
|
|
|
72
|
-
> **structured-choice evidence (
|
|
76
|
+
> **structured-choice evidence — what a RUN proved (2026-08-04).** Probed against the runtimes installed on the verification machine: claude 2.1.222 · codex-cli 0.146.0 · kimi 0.31.1 · opencode 1.18.5 · crush v0.87.0 · agy 1.0.16 · oz v0.2026.07.29. **Codex**: a real run hit `codex_core::tools::router: error=request_user_input is unavailable in Default mode` and the model listed its own tool set without it; `codex features list` reports the opt-in as `under development false`, and `[tools] experimental_request_user_input` is not a boolean but a table. **Kimi**: the tool is in its default agent's list, and in `--prompt` the host's own rule (`Do NOT call AskUserQuestion while auto mode is active`) made it degrade to labeled markdown by itself, options intact. **OpenCode**: the exported session of a real `opencode run` carries `{"permission":"question","action":"deny"}`. **Crush**: its ceilings and the per-choice 100-char cap were read from the installed binary; the run could not be verified (expired auth). **Antigravity (`agy`)**: its shipped proto declares `AskQuestionEntry {options, is_multi_select, write_in_response}` and `AskQuestionOption {id, text}` — no description field — while `ask_user` does not appear in the binary at all. **Warp** ships no CLI, so its row rests on docs; **Oz**'s launcher is a 122-byte Bash shim inside Warp.app with no tool surface of its own.
|
|
77
|
+
>
|
|
78
|
+
> **Doc references (checked 2026-08-02):** [Claude Code](https://code.claude.com/docs/en/agent-sdk/user-input) · [Codex App Server](https://learn.chatgpt.com/docs/app-server.md) · [Kimi Code](https://moonshotai.github.io/kimi-code/en/reference/tools.html) · [Gemini CLI](https://geminicli.com/docs/tools/ask-user/) · [Antigravity changelog](https://github.com/google-antigravity/antigravity-cli/blob/main/CHANGELOG.md) · [OpenCode](https://dev.opencode.ai/docs/tools/) · [Crush source](https://github.com/charmbracelet/crush) · [Warp agents](https://docs.warp.dev/agent-platform/getting-started/agents-in-warp) / [Oz CLI](https://docs.warp.dev/reference/cli). Public docs do not expose Antigravity's full question schema or a dedicated Warp/Oz structured-choice schema; the row says so instead of inferring one.
|
|
73
79
|
|
|
74
80
|
> **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`. No dedicated structured-choice schema is documented for Oz itself, so a direct Oz run uses labeled markdown; if Oz delegates to another harness and exposes that harness's native question surface, follow that harness's own binding. Oz differs from Warp 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 those caveats.
|
|
75
81
|
|
|
@@ -79,6 +85,26 @@ Concrete mechanism per harness (matrix base verified **Jul-2026**; the `structur
|
|
|
79
85
|
|
|
80
86
|
> **web-research (consumer & consent).** Single consumer today: `spec-refine-loop` § *Ideation gate* (the SPEC flow's divergent gate). Consent is **bundled into accepting that gate's offer** — one accepted offer authorizes that round's searches; never free browsing outside a consented round. It is *enhancement*, never a `must`: on degrade the loop ideates **offline and declares it** (unlike host-memory's silent omit — the user consented expecting the web, so silence would mislead).
|
|
81
87
|
|
|
88
|
+
## Directive presentation (flow boundaries)
|
|
89
|
+
|
|
90
|
+
A host surface — a command wrapper, a skill, an adapter — **invokes** the direction engine (`aw flow advance` / `aw flow submit`), **transports** the directive it returns and **presents** it. It never re-derives a transition, re-orders a journey or restates a rule the engine owns: the CLI decides, the surface shows. Two surfaces on two hosts therefore show the *same* boundary through *different* mechanisms, which is precisely the *capability, not tool* principle applied to one more capability.
|
|
91
|
+
|
|
92
|
+
Each boundary kind maps to a capability **already catalogued above**; this table adds no host column, so per-host mechanisms keep living in exactly one place — the binding matrix.
|
|
93
|
+
|
|
94
|
+
| Boundary | What it asks for | Capability used | Must survive the presentation |
|
|
95
|
+
|---|---|---|---|
|
|
96
|
+
| **semantic** | a bounded judgment from the agent | *procedure-loading* — the agent reads the request's `read_set` and answers inline; no human mechanism involved | `request` whole — contract, limits, `read_set` — and `state_digest` |
|
|
97
|
+
| **human** | a preference nobody may infer | *structured-choice* | every `choices` entry with its consequence, and the single recommendation |
|
|
98
|
+
| **authorization** | an approval over the effect classes it names | *structured-choice* | `choices`, `effects`, `authorizations`, and the approval digest carried in `next_action` |
|
|
99
|
+
| **execution** | a step the CLI decided and cannot run inside its own process | *command-invocation* — run exactly the invocation the directive names | `action` whole — program, args, target, input, the `evidence` demanded and the recovery — plus `state_digest` |
|
|
100
|
+
| **blocked** | nothing, until the cause is cleared | — (plain report) | `error`: code, message and the one valid action |
|
|
101
|
+
| **final** | nothing: the journey is done | — (plain report) | `pending` (empty) and the `applied` trace with each step's authority |
|
|
102
|
+
|
|
103
|
+
- **Four things a presentation may never drop**, whatever the host: the **options** with their consequence (`choices`), the **explanation** of what is being asked (`request` at a semantic boundary), the **effects** at stake (`effects` + `authorizations`), and the **resume evidence** (`state_digest` + `session`) — without that last pair the boundary cannot be answered from another host, or after the conversation is gone.
|
|
104
|
+
- **Degrade the mechanism, never the content.** A host with no native question surface renders labeled markdown (see the matrix); it does not merge, truncate or drop alternatives to fit. Losing content is a *degradation* and is declared as one.
|
|
105
|
+
- **Ownership travels with every step.** The trace says each applied transition is `cli-owned`, and a surface may not present one as its own decision — the registry (`domain/flow/authority.ts`) is the only place ownership changes.
|
|
106
|
+
- **An execution boundary is answered with output, never with agreement.** The surface transports `action` unchanged, the executor runs *that* invocation, and `aw flow submit` brings back the real result: the outcome, the invocation it actually ran, and one validation per demanded evidence id carrying the tool's own output in `detail`. A boolean confirmation, a narration or an approval already granted prove nothing ran — the engine refuses them and the transition stays pending with the action's declared recovery.
|
|
107
|
+
|
|
82
108
|
## Leverage installed skills
|
|
83
109
|
|
|
84
110
|
"Leverage whatever skills the harness has installed" resolves through the **same** `.workflow/skills.toml` binding: a role can point at a skill **installed on the host** (third-party, via skills.sh) instead of the built-in. Rule:
|
|
@@ -114,7 +140,7 @@ Each command's **contract** (Flow, Trigger, Input, Mode, …) is agnostic. The *
|
|
|
114
140
|
|
|
115
141
|
## Status
|
|
116
142
|
|
|
117
|
-
Capability model + binding matrix **defined** and **validated** with field research (base **Jul-2026**; `structured-choice`
|
|
143
|
+
Capability model + binding matrix **defined** and **validated** with field research (base **Jul-2026**; the `structured-choice` row re-verified **2026-08-04** and the Codex `hooks` row **2026-08-05** against the INSTALLED runtimes plus real runs — see the evidence note under the matrix for which claims rest on a run and which still rest on a doc).
|
|
118
144
|
|
|
119
145
|
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. Anti-drift guards cover the CODE projections (TUI, install targets, doctor, detection); `chassis-consistency.test.ts` additionally parses the `structured-choice` row and asserts every host binding or explicit limitation. 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.
|
|
120
146
|
|