ai-whisper 0.12.1 → 0.14.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 +11 -8
- package/dist/bin/broker-daemon.js +45 -3
- package/dist/bin/companion-agent.js +382 -34
- package/dist/bin/relay-monitor.js +52 -4
- package/dist/bin/whisper.js +890 -90
- package/package.json +5 -4
- package/skills/ai-whisper-bugfix/SKILL.md +15 -12
- package/skills/ai-whisper-deliberation/SKILL.md +15 -12
- package/skills/ai-whisper-plan-execution/SKILL.md +1 -1
- package/skills/ai-whisper-quick-task/SKILL.md +217 -0
- package/skills/ai-whisper-ralph/SKILL.md +15 -12
- package/skills/ai-whisper-sdd/SKILL.md +16 -13
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ai-whisper
|
|
2
2
|
|
|
3
|
-
ai-whisper pairs two coding agents — mount any two of Claude, Codex, ezio, and
|
|
3
|
+
ai-whisper pairs two coding agents — mount any two of Claude, Codex, ezio, agy, and Cursor — into a terminal-native pair that hand work back and forth under a single baton, so one agent implements while the other reviews, and a structured workflow drives the loop to a finished, reviewed deliverable without a human babysitting every round.
|
|
4
4
|
|
|
5
5
|
## Magic moment
|
|
6
6
|
|
|
@@ -13,6 +13,8 @@ whisper collab mount claude
|
|
|
13
13
|
whisper collab mount codex
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
Swap in any of the four agents — `whisper collab mount cursor` drives Cursor's `agent` CLI the same way, so e.g. `claude` + `cursor` is a valid pair.
|
|
17
|
+
|
|
16
18
|
Then, from inside either agent's session, kick off a structured workflow against a spec — just ask in plain language:
|
|
17
19
|
|
|
18
20
|
```text
|
|
@@ -52,10 +54,11 @@ It is **not** for:
|
|
|
52
54
|
|
|
53
55
|
## Prerequisites
|
|
54
56
|
|
|
55
|
-
You pair any two of
|
|
57
|
+
You pair any two of five agents — `claude`, `codex`, `ezio`, `agy`, and `cursor`. ai-whisper drives the *real* Claude, Codex, Antigravity, and Cursor CLIs, so install and authenticate whichever of those you plan to mount first; `ezio` is protocol-native and ships with ai-whisper, so it needs no separate CLI.
|
|
56
58
|
|
|
57
59
|
- **[Claude Code CLI](https://claude.com/claude-code)** — the `claude` command, signed in.
|
|
58
60
|
- **[Codex CLI](https://github.com/openai/codex)** — the `codex` command, signed in.
|
|
61
|
+
- **[Cursor CLI](https://cursor.com/cli)** — the `agent` command, signed in. (Override the binary with `AI_WHISPER_CURSOR_CMD` if it is on your PATH under a different name.)
|
|
59
62
|
- **ezio** *(optional)* — bundled with ai-whisper; mount it with `whisper collab mount ezio`, no separate install.
|
|
60
63
|
- **agy** *(optional)* — the `agy` command (Antigravity CLI), signed in. Mount it with `whisper collab mount agy` (manual-mount parity; no auto-launch via `collab start`).
|
|
61
64
|
- **Node.js 22+**.
|
|
@@ -66,7 +69,7 @@ You pair any two of four agents — `claude`, `codex`, `ezio`, and `agy`. ai-whi
|
|
|
66
69
|
|
|
67
70
|
## Safety & permissions
|
|
68
71
|
|
|
69
|
-
ai-whisper launches each agent in **full-autonomy mode** so the relay can drive it unattended — `claude --dangerously-skip-permissions
|
|
72
|
+
ai-whisper launches each agent in **full-autonomy mode** so the relay can drive it unattended — `claude --dangerously-skip-permissions`, `codex --dangerously-bypass-approvals-and-sandbox`, and `agent --force` (Cursor). Inside the mounted workspace the agents read, write, and run commands without prompting. Point it at code you're willing to let two agents change autonomously, watch the run on the dashboard, and remember you are the final gatekeeper — review the result before you ship it. The deeper rationale is in [Concepts](docs/concepts.md).
|
|
70
73
|
|
|
71
74
|
## Quickstart
|
|
72
75
|
|
|
@@ -100,7 +103,7 @@ whisper collab mount claude
|
|
|
100
103
|
whisper collab mount codex
|
|
101
104
|
```
|
|
102
105
|
|
|
103
|
-
The first `mount` creates the collab and starts the broker daemon for the workspace; the second binds the other agent. From either session, start a workflow against a spec or goal file — `spec-driven-development` for a spec, `ralph-loop` for an open-ended goal, plus `complex-bug-fixing
|
|
106
|
+
The first `mount` creates the collab and starts the broker daemon for the workspace; the second binds the other agent. From either session, start a workflow against a spec or goal file — `spec-driven-development` for a spec, `ralph-loop` for an open-ended goal, plus `quick-task`, `complex-bug-fixing`, and `deliberation` (see [Workflows](docs/workflows.md)). Watch it run with:
|
|
104
107
|
|
|
105
108
|
```bash
|
|
106
109
|
whisper collab dashboard
|
|
@@ -124,19 +127,19 @@ A run that stops short usually **escalates** — it does not crash. When the eva
|
|
|
124
127
|
|
|
125
128
|
ai-whisper is **not a swarm**. The agents never type at once — work moves by a single baton, one owner at a time. Mounted sessions are *real* agent sessions in your terminal — Claude or Codex CLIs, ezio, or agy — and those sessions are the source of truth. Autonomy is supervised: every handoff, verdict, and round is inspectable, and runs are resumable rather than fire-and-forget. Work is organized as structured workflows — explicit loops and state transitions, not a free-form chat.
|
|
126
129
|
|
|
127
|
-
Claude, Codex, ezio, and
|
|
130
|
+
Claude, Codex, ezio, agy, and Cursor are supported today — you mount any two of them; the architecture is provider-agnostic by design, so other coding-agent CLIs can be added behind the same relay.
|
|
128
131
|
|
|
129
132
|
For the full mental model, read [Concepts](docs/concepts.md).
|
|
130
133
|
|
|
131
134
|
## Duo characters
|
|
132
135
|
|
|
133
|
-
|
|
136
|
+
When enabled, a collab casts its two agents as a classic movie duo. The first `whisper collab mount` rolls a pair — Sherlock & Watson, Batman & Robin, Walter White & Jesse Pinkman, and four more — and each mount summons its character with ASCII art and an iconic one-liner before the agent CLI starts. The assignment sticks for the lifetime of the collab: the dashboard and relay chrome show `Batman (claude)` instead of a bare vendor name, and the agents themselves are told who they are (character flavor stays in conversational prose only — never in code, commits, or workflow verdicts).
|
|
134
137
|
|
|
135
|
-
It's cosmetic and
|
|
138
|
+
It's cosmetic and **off by default** — a plain `whisper collab mount` rolls nothing, shows nothing, and uses plain vendor names everywhere. Opt in by setting `AI_WHISPER_DUO=on` (also accepts `1`, `true`, `yes`) in your environment; once enabled, silence a single mount with `--no-duo`, which overrides the environment for that mount.
|
|
136
139
|
|
|
137
140
|
## Learn more
|
|
138
141
|
|
|
139
|
-
- [Workflows](docs/workflows.md) — how to use the
|
|
142
|
+
- [Workflows](docs/workflows.md) — how to use the five workflows well: choosing between `spec-driven-development`, `quick-task`, `ralph-loop`, `complex-bug-fixing`, and `deliberation`, and authoring the spec, task brief, goal, bug report, or seed that drives the run.
|
|
140
143
|
- [Concepts](docs/concepts.md) — the mental model: baton handoff, real mounted sessions, supervised autonomy, workflow-first execution.
|
|
141
144
|
- [Relay & handoff flows](docs/relay-handoff-flows.md) — the complete handoff state machine, capture-status table, hotkey reference, per-step verdicts, and troubleshooting.
|
|
142
145
|
- [Evaluator configuration](docs/evaluator-configuration.md) — required credentials and options for the LLM evaluator that gates workflows.
|
|
@@ -63,7 +63,7 @@ var threadStates = [
|
|
|
63
63
|
"failed"
|
|
64
64
|
];
|
|
65
65
|
var collabStates = ["active", "stopped"];
|
|
66
|
-
var agentTypes = ["codex", "claude", "ezio", "agy"];
|
|
66
|
+
var agentTypes = ["codex", "claude", "ezio", "agy", "cursor"];
|
|
67
67
|
var sessionRegistrationStates = ["registered"];
|
|
68
68
|
var workItemStates = [
|
|
69
69
|
"queued",
|
|
@@ -332,7 +332,7 @@ var mockProviderReplySchema = z14.object({
|
|
|
332
332
|
|
|
333
333
|
// ../shared/dist/relay-host.js
|
|
334
334
|
import { z as z15 } from "zod";
|
|
335
|
-
var relayTargets = ["codex", "claude", "ezio", "agy", "pull"];
|
|
335
|
+
var relayTargets = ["codex", "claude", "ezio", "agy", "cursor", "pull"];
|
|
336
336
|
var relayDirectiveSchema = z15.object({
|
|
337
337
|
raw: z15.string().min(1),
|
|
338
338
|
target: z15.enum(relayTargets),
|
|
@@ -2808,6 +2808,47 @@ var DELIBERATION = {
|
|
|
2808
2808
|
}
|
|
2809
2809
|
]
|
|
2810
2810
|
};
|
|
2811
|
+
var QUICK_TASK_KICKOFF = `You are the implementer in an autonomous quick-task workflow. No human is in the loop \u2014 never ask for confirmation, permission, or clarification; do the work yourself.
|
|
2812
|
+
|
|
2813
|
+
Read the task brief at {specPath}. It was written after a human approved the approach \u2014 treat it as the ratified contract: implement the "Approved approach" section as written; do NOT redesign it.
|
|
2814
|
+
|
|
2815
|
+
1. The files under "Scope" are the declared blast radius. Implement the task, add or adjust the tests the brief's "Acceptance checks" imply, run the project's verification command and ensure it passes.
|
|
2816
|
+
2. Commit your changes (do NOT commit the task brief; .ai-whisper/ is gitignored).
|
|
2817
|
+
|
|
2818
|
+
Scope guard: if the work is materially bigger than the brief \u2014 you need to touch non-test files beyond the "Scope" list, the approved approach does not survive contact with the code, or a hidden dependency/migration appears \u2014 do NOT push through. Hand back that you CANNOT PROCEED, naming what exploded; the run halts to the human, who re-scopes or escalates to spec-driven-development.
|
|
2819
|
+
|
|
2820
|
+
Hand back the commit SHAs and the verification output, plus a 1-2 sentence summary; your reply must be at least two sentences, well over 100 characters \u2014 never hand back only a single word.`;
|
|
2821
|
+
var QUICK_TASK_REVIEW = `The implementer claims the task in the brief at {specPath} is complete \u2014 the changes are commits {commitRange}. The upper bound is a LIVE \`HEAD\`: resolve it against the current repository at review time and INCLUDE any commits added during this review round (e.g. fixes for your prior findings); do not pin the review to an earlier tip. Verify against the brief's "Acceptance checks" and confirm the change stays inside the brief's "Scope": touching non-test files beyond the declared Scope list is a blocking finding \u2014 the implementer should have halted instead. Run the project's verification/tests yourself. This is an autonomous workflow with no human in the loop.
|
|
2822
|
+
|
|
2823
|
+
` + CODE_REVIEW_SKILL_GUIDANCE + WORKFLOW_REVIEW_PROTOCOL;
|
|
2824
|
+
var QUICK_TASK_FIX = "Apply the reviewer's findings to commits {commitRange} now (amend or add commits as needed). This is an autonomous workflow \u2014 no human will respond. Do the work yourself and hand back the updated commit SHAs and verification output; never ask for confirmation, permission, or clarification. End your handback with a 1-2 sentence summary of what you changed; your reply must be at least two sentences, well over 100 characters \u2014 never hand back only a single word.";
|
|
2825
|
+
var QUICK_TASK = {
|
|
2826
|
+
type: "quick-task",
|
|
2827
|
+
displayName: "Quick Task",
|
|
2828
|
+
description: "Human-approved task brief \u2192 implement \u2192 acceptance review, hard-gated to small pre-scoped tasks",
|
|
2829
|
+
defaultImplementer: "claude",
|
|
2830
|
+
defaultReviewer: "codex",
|
|
2831
|
+
phases: [
|
|
2832
|
+
{
|
|
2833
|
+
name: "implement-and-review",
|
|
2834
|
+
implementerRole: "implementer",
|
|
2835
|
+
reviewerRole: "reviewer",
|
|
2836
|
+
maxRounds: 5,
|
|
2837
|
+
initialHandoffStep: "implement",
|
|
2838
|
+
kickoffTemplate: QUICK_TASK_KICKOFF,
|
|
2839
|
+
stepTemplates: {
|
|
2840
|
+
implement: QUICK_TASK_KICKOFF,
|
|
2841
|
+
review: QUICK_TASK_REVIEW,
|
|
2842
|
+
fix: QUICK_TASK_FIX
|
|
2843
|
+
},
|
|
2844
|
+
reviewMode: "acceptance-review",
|
|
2845
|
+
evaluatorPromptKey: "review-loop",
|
|
2846
|
+
artifactOut: { kind: "commit-range" },
|
|
2847
|
+
anchorCommitBaseOnEntry: true,
|
|
2848
|
+
renderFixTemplateOnFindings: true
|
|
2849
|
+
}
|
|
2850
|
+
]
|
|
2851
|
+
};
|
|
2811
2852
|
function withOperatorControl(def) {
|
|
2812
2853
|
return {
|
|
2813
2854
|
...def,
|
|
@@ -2823,7 +2864,8 @@ var REGISTRY = {
|
|
|
2823
2864
|
[SPEC_DRIVEN_DEVELOPMENT.type]: withOperatorControl(SPEC_DRIVEN_DEVELOPMENT),
|
|
2824
2865
|
[RALPH_LOOP.type]: withOperatorControl(RALPH_LOOP),
|
|
2825
2866
|
[COMPLEX_BUG_FIXING.type]: withOperatorControl(COMPLEX_BUG_FIXING),
|
|
2826
|
-
[DELIBERATION.type]: withOperatorControl(DELIBERATION)
|
|
2867
|
+
[DELIBERATION.type]: withOperatorControl(DELIBERATION),
|
|
2868
|
+
[QUICK_TASK.type]: withOperatorControl(QUICK_TASK)
|
|
2827
2869
|
};
|
|
2828
2870
|
function ralphRunDir(workspaceRoot, workflowId) {
|
|
2829
2871
|
return join(workspaceRoot, ".ai-whisper", "ralph", workflowId);
|