ai-whisper 0.1.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.
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: ai-whisper-ralph
3
+ description: Kick off the ralph-loop workflow on a given goal file. Use when the user says things like "run ralph on <path>", "ralph loop on <path>", "kick off ralph with <path>", "/aiw-ralph <path>", "$aiw-ralph <path>", or otherwise asks to start the ralph-loop workflow on a specific goal file.
4
+ ---
5
+
6
+ # ai-whisper-ralph
7
+
8
+ Kick off the ai-whisper ralph-loop workflow on a specific goal file. This skill is fire-and-forget: it verifies the collab is ready, runs `whisper workflow start`, and exits. **Do NOT continue polling or narrating after kickoff** — continuous activity from the calling agent keeps it busy, which blocks the broker's idle detection and stalls the workflow. The dashboard (`whisper collab dashboard`) is the inspection surface during the run.
9
+
10
+ ## When to invoke
11
+
12
+ Match phrases like:
13
+ - *"run ralph on docs/GOAL.md"* / *"ralph loop on @docs/GOAL.md"*
14
+ - *"kick off ralph with docs/GOAL.md"*
15
+ - *"/aiw-ralph docs/GOAL.md"* (Claude picker form)
16
+ - *"$aiw-ralph docs/GOAL.md"* (Codex picker form)
17
+
18
+ If the user references a goal ambiguously (e.g., "run ralph on the goal we just discussed"), ASK them for the path ONCE before proceeding. Do not guess.
19
+
20
+ ## Steps
21
+
22
+ ### 1. Resolve the goal path
23
+
24
+ The user names a path. If it begins with `@`, strip the `@`. Resolve to an absolute path. Verify it's a readable file via the Read tool. If not readable:
25
+
26
+ > Goal file `<path>` is not readable. Check the path and try again.
27
+
28
+ The file is an **open-ended goal / checklist** (e.g. `GOAL.md`), not a formal spec. The ralph loop reads it as ground truth and grinds toward it chunk-by-chunk. Any **per-chunk procedure or conventions** the user wants the implementer to follow (test-first, lint, commit format, definition-of-done) belong **inside this goal file** — the loop re-reads the goal on every iteration, so embedded procedure persists across context resets and is applied to every chunk. (There is no separate procedure artifact in this version.) This framing is guidance for preparing the goal file before kickoff; it is not runtime output.
29
+
30
+ ### 2. Verify collab readiness
31
+
32
+ Run:
33
+
34
+ ```bash
35
+ whisper collab status --json
36
+ ```
37
+
38
+ Parse the JSON. The expected shape is:
39
+
40
+ ```json
41
+ {
42
+ "collabId": "collab_xyz",
43
+ "workspaceRoot": "/path",
44
+ "status": "active",
45
+ "daemon": { "host": "127.0.0.1", "port": 4311, "pid": 12345 },
46
+ "agents": [
47
+ { "agentType": "codex", "bindingState": "bound" | "pending_attach" | "unbound" | null },
48
+ { "agentType": "claude", "bindingState": "bound" | "pending_attach" | "unbound" | null }
49
+ ],
50
+ "recovery": { "state": "normal" | "recovery_required" | "recovered" },
51
+ "evaluator": { "ready": true | false, "status": "ready" | "missing_anthropic_key" | "invalid_config" | "disabled" | "unknown" }
52
+ }
53
+ ```
54
+
55
+ Required for readiness:
56
+ - `daemon !== null`
57
+ - `status === "active"`
58
+ - `recovery.state === "normal"`
59
+ - BOTH `agents[*].bindingState === "bound"` (for `codex` AND `claude`)
60
+ - `evaluator.status` is NOT `"missing_anthropic_key"` or `"invalid_config"` (i.e., `ready`, `disabled`, and `unknown` all pass this gate; only the two true-misconfiguration statuses block)
61
+
62
+ If the JSON has `{ "error": "no_collab_for_cwd", ... }`:
63
+
64
+ > No collab found in this workspace. Run `whisper collab mount codex` in one terminal and `whisper collab mount claude` in another, then re-run this skill.
65
+
66
+ If `recovery.state === "recovery_required"`:
67
+
68
+ > The collab is in recovery_required state. Run `whisper collab recover`, then re-run this skill.
69
+
70
+ If `recovery.state === "recovered"`:
71
+
72
+ > The collab has been recovered and still needs reconnect. Run `whisper collab reconnect codex` and `whisper collab reconnect claude`, then re-run this skill.
73
+
74
+ If one agent's `bindingState` is anything but `"bound"`:
75
+
76
+ > <Agent> is not mounted (current bindingState: `<state>`). Run `whisper collab mount <agent>` in a separate terminal, then re-run this skill.
77
+
78
+ (Do NOT append permission flags — mount already spawns the agent in full-permission mode; passing `--dangerously-skip-permissions` / `--dangerously-bypass-approvals-and-sandbox` again can crash the agent on a duplicate-argument error.)
79
+
80
+ If `evaluator.status === "missing_anthropic_key"` (i.e., `evaluator.ready === false` AND status is `missing_anthropic_key`):
81
+
82
+ > The evaluator has no Anthropic API key. Create `~/.ai-whisper/auth.json` with `{ "ANTHROPIC_API_KEY": "sk-ant-..." }` (chmod 600), then restart the daemon (`whisper collab stop` and re-mount, or restart the broker), and re-run this skill. See the README "Evaluator configuration" section.
83
+
84
+ If `evaluator.status === "invalid_config"` (i.e., `evaluator.ready === false` AND status is `invalid_config`):
85
+
86
+ > The evaluator config is malformed. Fix the JSON in `~/.ai-whisper/auth.json` or `~/.ai-whisper/config.json`, then restart the daemon and re-run this skill. See the README "Evaluator configuration" section.
87
+
88
+ If `evaluator.status === "disabled"`: this means the orchestrator is intentionally off — it is NOT a misconfiguration and does NOT block this skill gate. Proceed to step 3; `workflow start` will surface the orchestrator-disabled error itself.
89
+
90
+ (Note: `evaluator.ready` is `false` for `missing_anthropic_key`, `invalid_config`, AND `disabled`; it is `true` only for `ready` and `unknown`. That's why this gate keys off `status` rather than `ready` — so `disabled` does not block the skill while the two true-misconfiguration statuses do.)
91
+
92
+ ### 3. Kick off the workflow
93
+
94
+ Run:
95
+
96
+ ```bash
97
+ whisper workflow start --type=ralph-loop --spec=<resolved-absolute-path>
98
+ ```
99
+
100
+ (No `--implementer` / `--reviewer` — the CLI fills ralph defaults: implementer=claude, reviewer=codex. `--spec` names the goal file.)
101
+
102
+ Parse the workflowId from stdout (format: `Workflow started: <workflowId>`).
103
+
104
+ ### 4. Report and exit
105
+
106
+ Print exactly this one line — it is the **only** runtime output the skill emits after kickoff:
107
+
108
+ > Workflow `<workflowId>` started. Track progress with `whisper collab dashboard`.
109
+
110
+ Then stop. Do NOT poll `whisper workflow inspect`. Do NOT narrate. Do NOT print the "What ralph does" documentation below. The workflow runs in the broker driver; your job is done.
111
+
112
+ ## What ralph does (static documentation — NEVER printed at runtime)
113
+
114
+ This section is reference prose for the invoking agent's understanding. It is documentation, not a runtime step, and must NOT be emitted after kickoff (doing so would violate the exactly-one-line report/exit contract in step 4).
115
+
116
+ Once kicked off, ralph grinds the goal **chunk-by-chunk**: each iteration the implementer reads the goal, picks the next smallest independently-verifiable chunk, delivers it, and a reviewer checks that chunk. When the implementer claims the **entire** goal is complete, an acceptance review gates completion against the goal's criteria — only then does the workflow finish. The loop's durable memory lives under `.ai-whisper/ralph/<workflowId>/`: `PROGRESS.md` (the work ledger) and `LEARNINGS.md` (generalizable lessons), which survive context resets. Each accepted chunk is auto-committed. Watch all of this on `whisper collab dashboard`; do not babysit it from chat.
117
+
118
+ ## Why fire-and-forget
119
+
120
+ The broker's relay handoff system uses **idle detection** to know when an agent is ready to receive the next handoff. If this skill polled the workflow's status every few seconds, the calling agent (you) would emit output continuously, the broker would never see you as idle, and the workflow's first handoff couldn't be delivered to you — the workflow stalls. Kick off and exit; observation belongs to the dashboard.
121
+
122
+ ## Resume / cancel
123
+
124
+ If the user asks to resume a halted workflow, run:
125
+
126
+ ```bash
127
+ whisper workflow resume <workflowId>
128
+ ```
129
+
130
+ If they ask to cancel:
131
+
132
+ ```bash
133
+ whisper workflow cancel <workflowId>
134
+ ```
135
+
136
+ Same fire-and-forget shape: invoke, report one line, exit.
@@ -0,0 +1,127 @@
1
+ ---
2
+ name: ai-whisper-sdd
3
+ description: Kick off the spec-driven-development (SDD) workflow on a given spec file. Use when the user says things like "run SDD on <path>", "kick off spec-driven-development with <path>", "/aiw-sdd <path>", "$aiw-sdd <path>", or otherwise asks to start the spec-driven-development workflow on a specific spec file.
4
+ ---
5
+
6
+ # ai-whisper-sdd
7
+
8
+ Kick off the ai-whisper spec-driven-development (SDD) workflow on a specific spec file. This skill is fire-and-forget: it verifies the collab is ready, runs `whisper workflow start`, and exits. **Do NOT continue polling or narrating after kickoff** — continuous activity from the calling agent keeps it busy, which blocks the broker's idle detection and stalls the workflow. The dashboard (`whisper collab dashboard`) is the inspection surface during the run.
9
+
10
+ ## When to invoke
11
+
12
+ Match phrases like:
13
+ - *"run SDD on docs/spec.md"* / *"kick off spec-driven-development with @docs/spec.md"*
14
+ - *"/aiw-sdd docs/spec.md"* (Claude picker form)
15
+ - *"$aiw-sdd docs/spec.md"* (Codex picker form)
16
+
17
+ If the user references a spec ambiguously (e.g., "run SDD on the spec we just wrote"), ASK them for the path ONCE before proceeding. Do not guess.
18
+
19
+ ## Steps
20
+
21
+ ### 1. Resolve the spec path
22
+
23
+ The user names a path. If it begins with `@`, strip the `@`. Resolve to an absolute path. Verify it's a readable file via the Read tool. If not readable:
24
+
25
+ > Spec file `<path>` is not readable. Check the path and try again.
26
+
27
+ ### 2. Verify collab readiness
28
+
29
+ Run:
30
+
31
+ ```bash
32
+ whisper collab status --json
33
+ ```
34
+
35
+ Parse the JSON. The expected shape is:
36
+
37
+ ```json
38
+ {
39
+ "collabId": "collab_xyz",
40
+ "workspaceRoot": "/path",
41
+ "status": "active",
42
+ "daemon": { "host": "127.0.0.1", "port": 4311, "pid": 12345 },
43
+ "agents": [
44
+ { "agentType": "codex", "bindingState": "bound" | "pending_attach" | "unbound" | null },
45
+ { "agentType": "claude", "bindingState": "bound" | "pending_attach" | "unbound" | null }
46
+ ],
47
+ "recovery": { "state": "normal" | "recovery_required" | "recovered" },
48
+ "evaluator": { "ready": true | false, "status": "ready" | "missing_anthropic_key" | "invalid_config" | "disabled" | "unknown" }
49
+ }
50
+ ```
51
+
52
+ Required for readiness:
53
+ - `daemon !== null`
54
+ - `status === "active"`
55
+ - `recovery.state === "normal"`
56
+ - BOTH `agents[*].bindingState === "bound"` (for `codex` AND `claude`)
57
+ - `evaluator.status` is NOT `"missing_anthropic_key"` or `"invalid_config"` (i.e., `ready`, `disabled`, and `unknown` all pass this gate; only the two true-misconfiguration statuses block)
58
+
59
+ If the JSON has `{ "error": "no_collab_for_cwd", ... }`:
60
+
61
+ > No collab found in this workspace. Run `whisper collab mount codex` in one terminal and `whisper collab mount claude` in another, then re-run this skill.
62
+
63
+ If `recovery.state === "recovery_required"`:
64
+
65
+ > The collab is in recovery_required state. Run `whisper collab recover`, then re-run this skill.
66
+
67
+ If `recovery.state === "recovered"`:
68
+
69
+ > The collab has been recovered and still needs reconnect. Run `whisper collab reconnect codex` and `whisper collab reconnect claude`, then re-run this skill.
70
+
71
+ If one agent's `bindingState` is anything but `"bound"`:
72
+
73
+ > <Agent> is not mounted (current bindingState: `<state>`). Run `whisper collab mount <agent>` in a separate terminal, then re-run this skill.
74
+
75
+ (Do NOT append permission flags — mount already spawns the agent in full-permission mode; passing `--dangerously-skip-permissions` / `--dangerously-bypass-approvals-and-sandbox` again can crash the agent on a duplicate-argument error.)
76
+
77
+ If `evaluator.status === "missing_anthropic_key"` (i.e., `evaluator.ready === false` AND status is `missing_anthropic_key`):
78
+
79
+ > The evaluator has no Anthropic API key. Create `~/.ai-whisper/auth.json` with `{ "ANTHROPIC_API_KEY": "sk-ant-..." }` (chmod 600), then restart the daemon (`whisper collab stop` and re-mount, or restart the broker), and re-run this skill. See the README "Evaluator configuration" section.
80
+
81
+ If `evaluator.status === "invalid_config"` (i.e., `evaluator.ready === false` AND status is `invalid_config`):
82
+
83
+ > The evaluator config is malformed. Fix the JSON in `~/.ai-whisper/auth.json` or `~/.ai-whisper/config.json`, then restart the daemon and re-run this skill. See the README "Evaluator configuration" section.
84
+
85
+ If `evaluator.status === "disabled"`: this means the orchestrator is intentionally off — it is NOT a misconfiguration and does NOT block this skill gate. Proceed to step 3; `workflow start` will surface the orchestrator-disabled error itself.
86
+
87
+ (Note: `evaluator.ready` is `false` for `missing_anthropic_key`, `invalid_config`, AND `disabled`; it is `true` only for `ready` and `unknown`. That's why this gate keys off `status` rather than `ready` — so `disabled` does not block the skill while the two true-misconfiguration statuses do.)
88
+
89
+ ### 3. Kick off the workflow
90
+
91
+ Run:
92
+
93
+ ```bash
94
+ whisper workflow start --type=spec-driven-development --spec=<resolved-absolute-path>
95
+ ```
96
+
97
+ (No `--implementer` / `--reviewer` — the CLI fills SDD defaults: implementer=claude, reviewer=codex.)
98
+
99
+ Parse the workflowId from stdout (format: `Workflow started: <workflowId>`).
100
+
101
+ ### 4. Report and exit
102
+
103
+ Print exactly:
104
+
105
+ > Workflow `<workflowId>` started. Track progress with `whisper collab dashboard`.
106
+
107
+ Then stop. Do NOT poll `whisper workflow inspect`. Do NOT continue narrating. The workflow runs in the broker driver; your job is done.
108
+
109
+ ## Why fire-and-forget
110
+
111
+ The broker's relay handoff system uses **idle detection** to know when an agent is ready to receive the next handoff. If this skill polled the workflow's status every few seconds, the calling agent (you) would emit output continuously, the broker would never see you as idle, and the workflow's first handoff couldn't be delivered to you — the workflow stalls. Kick off and exit; observation belongs to the dashboard.
112
+
113
+ ## Resume / cancel
114
+
115
+ If the user asks to resume a halted workflow, run:
116
+
117
+ ```bash
118
+ whisper workflow resume <workflowId>
119
+ ```
120
+
121
+ If they ask to cancel:
122
+
123
+ ```bash
124
+ whisper workflow cancel <workflowId>
125
+ ```
126
+
127
+ Same fire-and-forget shape: invoke, report one line, exit.
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "ai-whisper",
3
+ "version": "0.1.0",
4
+ "description": "Terminal-first relay for paired AI coding agents (Claude + Codex), driven by structured workflows.",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/ai-creed/ai-whisper.git"
9
+ },
10
+ "homepage": "https://ai-creed.dev/projects/ai-whisper/",
11
+ "type": "module",
12
+ "bin": {
13
+ "whisper": "./dist/bin/whisper.js",
14
+ "whisper-relay-monitor": "./dist/bin/relay-monitor.js"
15
+ },
16
+ "dependencies": {
17
+ "@anthropic-ai/sdk": "^0.88.0",
18
+ "better-sqlite3": "^11.8.1",
19
+ "commander": "^13.1.0",
20
+ "fastify": "^5.2.1",
21
+ "ink": "^7.0.3",
22
+ "nanoid": "^5.1.5",
23
+ "node-pty": "^1.1.0",
24
+ "ollama": "^0.6.3",
25
+ "react": "^19.2.6",
26
+ "zod": "^3.24.2"
27
+ },
28
+ "devDependencies": {
29
+ "@types/better-sqlite3": "^7.6.12",
30
+ "@types/react": "^19.2.14",
31
+ "ink-testing-library": "^4.0.0",
32
+ "@ai-whisper/adapter-claude": "0.0.0",
33
+ "@ai-whisper/adapter-codex": "0.0.0",
34
+ "@ai-whisper/companion-core": "0.0.0",
35
+ "@ai-whisper/shared": "0.0.0",
36
+ "@ai-whisper/broker": "0.0.0"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "skills"
41
+ ],
42
+ "scripts": {
43
+ "build": "node scripts/bundle.mjs && node scripts/copy-skills.mjs",
44
+ "typecheck": "tsc -b --emitDeclarationOnly"
45
+ }
46
+ }
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: ai-whisper-ralph
3
+ description: Kick off the ralph-loop workflow on a given goal file. Use when the user says things like "run ralph on <path>", "ralph loop on <path>", "kick off ralph with <path>", "/aiw-ralph <path>", "$aiw-ralph <path>", or otherwise asks to start the ralph-loop workflow on a specific goal file.
4
+ ---
5
+
6
+ # ai-whisper-ralph
7
+
8
+ Kick off the ai-whisper ralph-loop workflow on a specific goal file. This skill is fire-and-forget: it verifies the collab is ready, runs `whisper workflow start`, and exits. **Do NOT continue polling or narrating after kickoff** — continuous activity from the calling agent keeps it busy, which blocks the broker's idle detection and stalls the workflow. The dashboard (`whisper collab dashboard`) is the inspection surface during the run.
9
+
10
+ ## When to invoke
11
+
12
+ Match phrases like:
13
+ - *"run ralph on docs/GOAL.md"* / *"ralph loop on @docs/GOAL.md"*
14
+ - *"kick off ralph with docs/GOAL.md"*
15
+ - *"/aiw-ralph docs/GOAL.md"* (Claude picker form)
16
+ - *"$aiw-ralph docs/GOAL.md"* (Codex picker form)
17
+
18
+ If the user references a goal ambiguously (e.g., "run ralph on the goal we just discussed"), ASK them for the path ONCE before proceeding. Do not guess.
19
+
20
+ ## Steps
21
+
22
+ ### 1. Resolve the goal path
23
+
24
+ The user names a path. If it begins with `@`, strip the `@`. Resolve to an absolute path. Verify it's a readable file via the Read tool. If not readable:
25
+
26
+ > Goal file `<path>` is not readable. Check the path and try again.
27
+
28
+ The file is an **open-ended goal / checklist** (e.g. `GOAL.md`), not a formal spec. The ralph loop reads it as ground truth and grinds toward it chunk-by-chunk. Any **per-chunk procedure or conventions** the user wants the implementer to follow (test-first, lint, commit format, definition-of-done) belong **inside this goal file** — the loop re-reads the goal on every iteration, so embedded procedure persists across context resets and is applied to every chunk. (There is no separate procedure artifact in this version.) This framing is guidance for preparing the goal file before kickoff; it is not runtime output.
29
+
30
+ ### 2. Verify collab readiness
31
+
32
+ Run:
33
+
34
+ ```bash
35
+ whisper collab status --json
36
+ ```
37
+
38
+ Parse the JSON. The expected shape is:
39
+
40
+ ```json
41
+ {
42
+ "collabId": "collab_xyz",
43
+ "workspaceRoot": "/path",
44
+ "status": "active",
45
+ "daemon": { "host": "127.0.0.1", "port": 4311, "pid": 12345 },
46
+ "agents": [
47
+ { "agentType": "codex", "bindingState": "bound" | "pending_attach" | "unbound" | null },
48
+ { "agentType": "claude", "bindingState": "bound" | "pending_attach" | "unbound" | null }
49
+ ],
50
+ "recovery": { "state": "normal" | "recovery_required" | "recovered" },
51
+ "evaluator": { "ready": true | false, "status": "ready" | "missing_anthropic_key" | "invalid_config" | "disabled" | "unknown" }
52
+ }
53
+ ```
54
+
55
+ Required for readiness:
56
+ - `daemon !== null`
57
+ - `status === "active"`
58
+ - `recovery.state === "normal"`
59
+ - BOTH `agents[*].bindingState === "bound"` (for `codex` AND `claude`)
60
+ - `evaluator.status` is NOT `"missing_anthropic_key"` or `"invalid_config"` (i.e., `ready`, `disabled`, and `unknown` all pass this gate; only the two true-misconfiguration statuses block)
61
+
62
+ If the JSON has `{ "error": "no_collab_for_cwd", ... }`:
63
+
64
+ > No collab found in this workspace. Run `whisper collab mount codex` in one terminal and `whisper collab mount claude` in another, then re-run this skill.
65
+
66
+ If `recovery.state === "recovery_required"`:
67
+
68
+ > The collab is in recovery_required state. Run `whisper collab recover`, then re-run this skill.
69
+
70
+ If `recovery.state === "recovered"`:
71
+
72
+ > The collab has been recovered and still needs reconnect. Run `whisper collab reconnect codex` and `whisper collab reconnect claude`, then re-run this skill.
73
+
74
+ If one agent's `bindingState` is anything but `"bound"`:
75
+
76
+ > <Agent> is not mounted (current bindingState: `<state>`). Run `whisper collab mount <agent>` in a separate terminal, then re-run this skill.
77
+
78
+ (Do NOT append permission flags — mount already spawns the agent in full-permission mode; passing `--dangerously-skip-permissions` / `--dangerously-bypass-approvals-and-sandbox` again can crash the agent on a duplicate-argument error.)
79
+
80
+ If `evaluator.status === "missing_anthropic_key"` (i.e., `evaluator.ready === false` AND status is `missing_anthropic_key`):
81
+
82
+ > The evaluator has no Anthropic API key. Create `~/.ai-whisper/auth.json` with `{ "ANTHROPIC_API_KEY": "sk-ant-..." }` (chmod 600), then restart the daemon (`whisper collab stop` and re-mount, or restart the broker), and re-run this skill. See the README "Evaluator configuration" section.
83
+
84
+ If `evaluator.status === "invalid_config"` (i.e., `evaluator.ready === false` AND status is `invalid_config`):
85
+
86
+ > The evaluator config is malformed. Fix the JSON in `~/.ai-whisper/auth.json` or `~/.ai-whisper/config.json`, then restart the daemon and re-run this skill. See the README "Evaluator configuration" section.
87
+
88
+ If `evaluator.status === "disabled"`: this means the orchestrator is intentionally off — it is NOT a misconfiguration and does NOT block this skill gate. Proceed to step 3; `workflow start` will surface the orchestrator-disabled error itself.
89
+
90
+ (Note: `evaluator.ready` is `false` for `missing_anthropic_key`, `invalid_config`, AND `disabled`; it is `true` only for `ready` and `unknown`. That's why this gate keys off `status` rather than `ready` — so `disabled` does not block the skill while the two true-misconfiguration statuses do.)
91
+
92
+ ### 3. Kick off the workflow
93
+
94
+ Run:
95
+
96
+ ```bash
97
+ whisper workflow start --type=ralph-loop --spec=<resolved-absolute-path>
98
+ ```
99
+
100
+ (No `--implementer` / `--reviewer` — the CLI fills ralph defaults: implementer=claude, reviewer=codex. `--spec` names the goal file.)
101
+
102
+ Parse the workflowId from stdout (format: `Workflow started: <workflowId>`).
103
+
104
+ ### 4. Report and exit
105
+
106
+ Print exactly this one line — it is the **only** runtime output the skill emits after kickoff:
107
+
108
+ > Workflow `<workflowId>` started. Track progress with `whisper collab dashboard`.
109
+
110
+ Then stop. Do NOT poll `whisper workflow inspect`. Do NOT narrate. Do NOT print the "What ralph does" documentation below. The workflow runs in the broker driver; your job is done.
111
+
112
+ ## What ralph does (static documentation — NEVER printed at runtime)
113
+
114
+ This section is reference prose for the invoking agent's understanding. It is documentation, not a runtime step, and must NOT be emitted after kickoff (doing so would violate the exactly-one-line report/exit contract in step 4).
115
+
116
+ Once kicked off, ralph grinds the goal **chunk-by-chunk**: each iteration the implementer reads the goal, picks the next smallest independently-verifiable chunk, delivers it, and a reviewer checks that chunk. When the implementer claims the **entire** goal is complete, an acceptance review gates completion against the goal's criteria — only then does the workflow finish. The loop's durable memory lives under `.ai-whisper/ralph/<workflowId>/`: `PROGRESS.md` (the work ledger) and `LEARNINGS.md` (generalizable lessons), which survive context resets. Each accepted chunk is auto-committed. Watch all of this on `whisper collab dashboard`; do not babysit it from chat.
117
+
118
+ ## Why fire-and-forget
119
+
120
+ The broker's relay handoff system uses **idle detection** to know when an agent is ready to receive the next handoff. If this skill polled the workflow's status every few seconds, the calling agent (you) would emit output continuously, the broker would never see you as idle, and the workflow's first handoff couldn't be delivered to you — the workflow stalls. Kick off and exit; observation belongs to the dashboard.
121
+
122
+ ## Resume / cancel
123
+
124
+ If the user asks to resume a halted workflow, run:
125
+
126
+ ```bash
127
+ whisper workflow resume <workflowId>
128
+ ```
129
+
130
+ If they ask to cancel:
131
+
132
+ ```bash
133
+ whisper workflow cancel <workflowId>
134
+ ```
135
+
136
+ Same fire-and-forget shape: invoke, report one line, exit.
@@ -0,0 +1,127 @@
1
+ ---
2
+ name: ai-whisper-sdd
3
+ description: Kick off the spec-driven-development (SDD) workflow on a given spec file. Use when the user says things like "run SDD on <path>", "kick off spec-driven-development with <path>", "/aiw-sdd <path>", "$aiw-sdd <path>", or otherwise asks to start the spec-driven-development workflow on a specific spec file.
4
+ ---
5
+
6
+ # ai-whisper-sdd
7
+
8
+ Kick off the ai-whisper spec-driven-development (SDD) workflow on a specific spec file. This skill is fire-and-forget: it verifies the collab is ready, runs `whisper workflow start`, and exits. **Do NOT continue polling or narrating after kickoff** — continuous activity from the calling agent keeps it busy, which blocks the broker's idle detection and stalls the workflow. The dashboard (`whisper collab dashboard`) is the inspection surface during the run.
9
+
10
+ ## When to invoke
11
+
12
+ Match phrases like:
13
+ - *"run SDD on docs/spec.md"* / *"kick off spec-driven-development with @docs/spec.md"*
14
+ - *"/aiw-sdd docs/spec.md"* (Claude picker form)
15
+ - *"$aiw-sdd docs/spec.md"* (Codex picker form)
16
+
17
+ If the user references a spec ambiguously (e.g., "run SDD on the spec we just wrote"), ASK them for the path ONCE before proceeding. Do not guess.
18
+
19
+ ## Steps
20
+
21
+ ### 1. Resolve the spec path
22
+
23
+ The user names a path. If it begins with `@`, strip the `@`. Resolve to an absolute path. Verify it's a readable file via the Read tool. If not readable:
24
+
25
+ > Spec file `<path>` is not readable. Check the path and try again.
26
+
27
+ ### 2. Verify collab readiness
28
+
29
+ Run:
30
+
31
+ ```bash
32
+ whisper collab status --json
33
+ ```
34
+
35
+ Parse the JSON. The expected shape is:
36
+
37
+ ```json
38
+ {
39
+ "collabId": "collab_xyz",
40
+ "workspaceRoot": "/path",
41
+ "status": "active",
42
+ "daemon": { "host": "127.0.0.1", "port": 4311, "pid": 12345 },
43
+ "agents": [
44
+ { "agentType": "codex", "bindingState": "bound" | "pending_attach" | "unbound" | null },
45
+ { "agentType": "claude", "bindingState": "bound" | "pending_attach" | "unbound" | null }
46
+ ],
47
+ "recovery": { "state": "normal" | "recovery_required" | "recovered" },
48
+ "evaluator": { "ready": true | false, "status": "ready" | "missing_anthropic_key" | "invalid_config" | "disabled" | "unknown" }
49
+ }
50
+ ```
51
+
52
+ Required for readiness:
53
+ - `daemon !== null`
54
+ - `status === "active"`
55
+ - `recovery.state === "normal"`
56
+ - BOTH `agents[*].bindingState === "bound"` (for `codex` AND `claude`)
57
+ - `evaluator.status` is NOT `"missing_anthropic_key"` or `"invalid_config"` (i.e., `ready`, `disabled`, and `unknown` all pass this gate; only the two true-misconfiguration statuses block)
58
+
59
+ If the JSON has `{ "error": "no_collab_for_cwd", ... }`:
60
+
61
+ > No collab found in this workspace. Run `whisper collab mount codex` in one terminal and `whisper collab mount claude` in another, then re-run this skill.
62
+
63
+ If `recovery.state === "recovery_required"`:
64
+
65
+ > The collab is in recovery_required state. Run `whisper collab recover`, then re-run this skill.
66
+
67
+ If `recovery.state === "recovered"`:
68
+
69
+ > The collab has been recovered and still needs reconnect. Run `whisper collab reconnect codex` and `whisper collab reconnect claude`, then re-run this skill.
70
+
71
+ If one agent's `bindingState` is anything but `"bound"`:
72
+
73
+ > <Agent> is not mounted (current bindingState: `<state>`). Run `whisper collab mount <agent>` in a separate terminal, then re-run this skill.
74
+
75
+ (Do NOT append permission flags — mount already spawns the agent in full-permission mode; passing `--dangerously-skip-permissions` / `--dangerously-bypass-approvals-and-sandbox` again can crash the agent on a duplicate-argument error.)
76
+
77
+ If `evaluator.status === "missing_anthropic_key"` (i.e., `evaluator.ready === false` AND status is `missing_anthropic_key`):
78
+
79
+ > The evaluator has no Anthropic API key. Create `~/.ai-whisper/auth.json` with `{ "ANTHROPIC_API_KEY": "sk-ant-..." }` (chmod 600), then restart the daemon (`whisper collab stop` and re-mount, or restart the broker), and re-run this skill. See the README "Evaluator configuration" section.
80
+
81
+ If `evaluator.status === "invalid_config"` (i.e., `evaluator.ready === false` AND status is `invalid_config`):
82
+
83
+ > The evaluator config is malformed. Fix the JSON in `~/.ai-whisper/auth.json` or `~/.ai-whisper/config.json`, then restart the daemon and re-run this skill. See the README "Evaluator configuration" section.
84
+
85
+ If `evaluator.status === "disabled"`: this means the orchestrator is intentionally off — it is NOT a misconfiguration and does NOT block this skill gate. Proceed to step 3; `workflow start` will surface the orchestrator-disabled error itself.
86
+
87
+ (Note: `evaluator.ready` is `false` for `missing_anthropic_key`, `invalid_config`, AND `disabled`; it is `true` only for `ready` and `unknown`. That's why this gate keys off `status` rather than `ready` — so `disabled` does not block the skill while the two true-misconfiguration statuses do.)
88
+
89
+ ### 3. Kick off the workflow
90
+
91
+ Run:
92
+
93
+ ```bash
94
+ whisper workflow start --type=spec-driven-development --spec=<resolved-absolute-path>
95
+ ```
96
+
97
+ (No `--implementer` / `--reviewer` — the CLI fills SDD defaults: implementer=claude, reviewer=codex.)
98
+
99
+ Parse the workflowId from stdout (format: `Workflow started: <workflowId>`).
100
+
101
+ ### 4. Report and exit
102
+
103
+ Print exactly:
104
+
105
+ > Workflow `<workflowId>` started. Track progress with `whisper collab dashboard`.
106
+
107
+ Then stop. Do NOT poll `whisper workflow inspect`. Do NOT continue narrating. The workflow runs in the broker driver; your job is done.
108
+
109
+ ## Why fire-and-forget
110
+
111
+ The broker's relay handoff system uses **idle detection** to know when an agent is ready to receive the next handoff. If this skill polled the workflow's status every few seconds, the calling agent (you) would emit output continuously, the broker would never see you as idle, and the workflow's first handoff couldn't be delivered to you — the workflow stalls. Kick off and exit; observation belongs to the dashboard.
112
+
113
+ ## Resume / cancel
114
+
115
+ If the user asks to resume a halted workflow, run:
116
+
117
+ ```bash
118
+ whisper workflow resume <workflowId>
119
+ ```
120
+
121
+ If they ask to cancel:
122
+
123
+ ```bash
124
+ whisper workflow cancel <workflowId>
125
+ ```
126
+
127
+ Same fire-and-forget shape: invoke, report one line, exit.