@agent-relay/sdk 2.3.14 β 2.3.15
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 +68 -838
- package/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/__tests__/contract-fixtures.test.d.ts +2 -0
- package/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/contract-fixtures.test.js +85 -0
- package/dist/__tests__/contract-fixtures.test.js.map +1 -0
- package/dist/__tests__/facade.test.d.ts +2 -0
- package/dist/__tests__/facade.test.d.ts.map +1 -0
- package/dist/__tests__/facade.test.js +305 -0
- package/dist/__tests__/facade.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +169 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/pty.test.d.ts +2 -0
- package/dist/__tests__/pty.test.d.ts.map +1 -0
- package/dist/__tests__/pty.test.js +20 -0
- package/dist/__tests__/pty.test.js.map +1 -0
- package/dist/__tests__/quickstart.test.d.ts +2 -0
- package/dist/__tests__/quickstart.test.d.ts.map +1 -0
- package/dist/__tests__/quickstart.test.js +176 -0
- package/dist/__tests__/quickstart.test.js.map +1 -0
- package/dist/__tests__/spawn-from-env.test.d.ts +2 -0
- package/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-from-env.test.js +206 -0
- package/dist/__tests__/spawn-from-env.test.js.map +1 -0
- package/dist/__tests__/unit.test.d.ts +2 -0
- package/dist/__tests__/unit.test.d.ts.map +1 -0
- package/dist/__tests__/unit.test.js +347 -0
- package/dist/__tests__/unit.test.js.map +1 -0
- package/dist/browser.d.ts +16 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +19 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.d.ts +140 -526
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +430 -1509
- package/dist/client.js.map +1 -1
- package/dist/consensus-helpers.d.ts +103 -0
- package/dist/consensus-helpers.d.ts.map +1 -0
- package/dist/consensus-helpers.js +147 -0
- package/dist/consensus-helpers.js.map +1 -0
- package/dist/consensus.d.ts +72 -0
- package/dist/consensus.d.ts.map +1 -0
- package/dist/consensus.js +378 -0
- package/dist/consensus.js.map +1 -0
- package/dist/examples/demo.d.ts +2 -0
- package/dist/examples/demo.d.ts.map +1 -0
- package/dist/examples/demo.js +63 -0
- package/dist/examples/demo.js.map +1 -0
- package/dist/examples/example.d.ts +2 -0
- package/dist/examples/example.d.ts.map +1 -0
- package/dist/examples/example.js +80 -0
- package/dist/examples/example.js.map +1 -0
- package/dist/examples/quickstart.d.ts +2 -0
- package/dist/examples/quickstart.d.ts.map +1 -0
- package/dist/examples/quickstart.js +56 -0
- package/dist/examples/quickstart.js.map +1 -0
- package/dist/examples/ralph-loop.d.ts +2 -0
- package/dist/examples/ralph-loop.d.ts.map +1 -0
- package/dist/examples/ralph-loop.js +281 -0
- package/dist/examples/ralph-loop.js.map +1 -0
- package/dist/examples/workflow-superiority.d.ts +32 -0
- package/dist/examples/workflow-superiority.d.ts.map +1 -0
- package/dist/examples/workflow-superiority.js +1421 -0
- package/dist/examples/workflow-superiority.js.map +1 -0
- package/dist/index.d.ts +13 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -26
- package/dist/index.js.map +1 -1
- package/dist/logs.d.ts +70 -25
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +238 -42
- package/dist/logs.js.map +1 -1
- package/dist/models.d.ts +9 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +17 -0
- package/dist/models.js.map +1 -0
- package/dist/protocol.d.ts +366 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/pty.d.ts +8 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +26 -0
- package/dist/pty.js.map +1 -0
- package/dist/relay-adapter.d.ts +139 -0
- package/dist/relay-adapter.d.ts.map +1 -0
- package/dist/relay-adapter.js +210 -0
- package/dist/relay-adapter.js.map +1 -0
- package/dist/relay.d.ts +304 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +910 -0
- package/dist/relay.js.map +1 -0
- package/dist/shadow.d.ts +101 -0
- package/dist/shadow.d.ts.map +1 -0
- package/dist/shadow.js +174 -0
- package/dist/shadow.js.map +1 -0
- package/dist/spawn-from-env.d.ts +77 -0
- package/dist/spawn-from-env.d.ts.map +1 -0
- package/dist/spawn-from-env.js +172 -0
- package/dist/spawn-from-env.js.map +1 -0
- package/dist/workflows/barrier.d.ts +72 -0
- package/dist/workflows/barrier.d.ts.map +1 -0
- package/dist/workflows/barrier.js +162 -0
- package/dist/workflows/barrier.js.map +1 -0
- package/dist/workflows/builder.d.ts +114 -0
- package/dist/workflows/builder.d.ts.map +1 -0
- package/dist/workflows/builder.js +201 -0
- package/dist/workflows/builder.js.map +1 -0
- package/dist/workflows/cli.d.ts +11 -0
- package/dist/workflows/cli.d.ts.map +1 -0
- package/dist/workflows/cli.js +144 -0
- package/dist/workflows/cli.js.map +1 -0
- package/dist/workflows/coordinator.d.ts +73 -0
- package/dist/workflows/coordinator.d.ts.map +1 -0
- package/dist/workflows/coordinator.js +647 -0
- package/dist/workflows/coordinator.js.map +1 -0
- package/dist/workflows/custom-steps.d.ts +73 -0
- package/dist/workflows/custom-steps.d.ts.map +1 -0
- package/dist/workflows/custom-steps.js +321 -0
- package/dist/workflows/custom-steps.js.map +1 -0
- package/dist/workflows/dry-run-format.d.ts +6 -0
- package/dist/workflows/dry-run-format.d.ts.map +1 -0
- package/dist/workflows/dry-run-format.js +68 -0
- package/dist/workflows/dry-run-format.js.map +1 -0
- package/dist/workflows/file-db.d.ts +33 -0
- package/dist/workflows/file-db.d.ts.map +1 -0
- package/dist/workflows/file-db.js +108 -0
- package/dist/workflows/file-db.js.map +1 -0
- package/dist/workflows/index.d.ts +15 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +15 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/memory-db.d.ts +17 -0
- package/dist/workflows/memory-db.d.ts.map +1 -0
- package/dist/workflows/memory-db.js +33 -0
- package/dist/workflows/memory-db.js.map +1 -0
- package/dist/workflows/run.d.ts +38 -0
- package/dist/workflows/run.d.ts.map +1 -0
- package/dist/workflows/run.js +25 -0
- package/dist/workflows/run.js.map +1 -0
- package/dist/workflows/runner.d.ts +320 -0
- package/dist/workflows/runner.d.ts.map +1 -0
- package/dist/workflows/runner.js +2821 -0
- package/dist/workflows/runner.js.map +1 -0
- package/dist/workflows/state.d.ts +77 -0
- package/dist/workflows/state.d.ts.map +1 -0
- package/dist/workflows/state.js +140 -0
- package/dist/workflows/state.js.map +1 -0
- package/dist/workflows/templates.d.ts +47 -0
- package/dist/workflows/templates.d.ts.map +1 -0
- package/dist/workflows/templates.js +405 -0
- package/dist/workflows/templates.js.map +1 -0
- package/dist/workflows/trajectory.d.ts +87 -0
- package/dist/workflows/trajectory.d.ts.map +1 -0
- package/dist/workflows/trajectory.js +441 -0
- package/dist/workflows/trajectory.js.map +1 -0
- package/dist/workflows/types.d.ts +306 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +23 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workflows/validator.d.ts +11 -0
- package/dist/workflows/validator.d.ts.map +1 -0
- package/dist/workflows/validator.js +128 -0
- package/dist/workflows/validator.js.map +1 -0
- package/package.json +59 -53
- package/dist/discovery.d.ts +0 -10
- package/dist/discovery.d.ts.map +0 -1
- package/dist/discovery.js +0 -22
- package/dist/discovery.js.map +0 -1
- package/dist/errors.d.ts +0 -9
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -9
- package/dist/errors.js.map +0 -1
- package/dist/protocol/index.d.ts +0 -8
- package/dist/protocol/index.d.ts.map +0 -1
- package/dist/protocol/index.js +0 -8
- package/dist/protocol/index.js.map +0 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ralph Loop β Claude + Codex pair-programming through a PRD.
|
|
3
|
+
*
|
|
4
|
+
* Each iteration spawns TWO agents that work together simultaneously:
|
|
5
|
+
* - Claude (PTY) β the architect. Plans, guides, and reviews.
|
|
6
|
+
* - Codex (PTY, --full-auto) β the builder. Implements the code.
|
|
7
|
+
*
|
|
8
|
+
* Both agents join #general and communicate in real-time:
|
|
9
|
+
* 1. Claude receives the story and posts an implementation plan
|
|
10
|
+
* 2. Codex receives the story + sees Claude's plan on #general
|
|
11
|
+
* 3. As Codex works, Claude can course-correct via the channel
|
|
12
|
+
* 4. When Codex finishes, Claude reviews and posts REVIEW:PASS/FAIL
|
|
13
|
+
* 5. Quality checks run, story marked done or retried with feedback
|
|
14
|
+
*
|
|
15
|
+
* Why two agents instead of one?
|
|
16
|
+
* - Claude reasons about architecture, Codex executes rapidly
|
|
17
|
+
* - They see each other's messages in real-time (not just handoffs)
|
|
18
|
+
* - Fresh eyes on review catch mistakes a single agent misses
|
|
19
|
+
* - Each iteration is doubly effective β thinking + doing in parallel
|
|
20
|
+
*
|
|
21
|
+
* Run:
|
|
22
|
+
* npx tsc && npm run ralph
|
|
23
|
+
*
|
|
24
|
+
* References:
|
|
25
|
+
* https://github.com/snarktank/ralph
|
|
26
|
+
* https://ghuntley.com/ralph/
|
|
27
|
+
*/
|
|
28
|
+
import fs from "node:fs";
|
|
29
|
+
import { execSync } from "node:child_process";
|
|
30
|
+
import { AgentRelay } from "../relay.js";
|
|
31
|
+
// ββ Configuration βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
32
|
+
const PRD_PATH = process.env.PRD_PATH ?? "prd.json";
|
|
33
|
+
const PROGRESS_PATH = process.env.PROGRESS_PATH ?? "progress.txt";
|
|
34
|
+
const MAX_ITERATIONS = Number(process.env.MAX_ITERATIONS ?? 10);
|
|
35
|
+
const MAX_REVIEW_ROUNDS = Number(process.env.MAX_REVIEW_ROUNDS ?? 2);
|
|
36
|
+
const QUALITY_CMD = process.env.QUALITY_CMD ?? "npm run check";
|
|
37
|
+
/** Max time (ms) to wait for both agents per round before releasing them. */
|
|
38
|
+
const ROUND_TIMEOUT_MS = Number(process.env.ROUND_TIMEOUT_MS ?? 5 * 60 * 1000);
|
|
39
|
+
// ββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
40
|
+
function loadPrd() {
|
|
41
|
+
return JSON.parse(fs.readFileSync(PRD_PATH, "utf-8"));
|
|
42
|
+
}
|
|
43
|
+
function savePrd(prd) {
|
|
44
|
+
fs.writeFileSync(PRD_PATH, JSON.stringify(prd, null, 2) + "\n");
|
|
45
|
+
}
|
|
46
|
+
function appendProgress(entry) {
|
|
47
|
+
const line = `[${new Date().toISOString()}] ${entry}\n`;
|
|
48
|
+
fs.appendFileSync(PROGRESS_PATH, line);
|
|
49
|
+
}
|
|
50
|
+
function readProgress() {
|
|
51
|
+
return fs.existsSync(PROGRESS_PATH)
|
|
52
|
+
? fs.readFileSync(PROGRESS_PATH, "utf-8")
|
|
53
|
+
: "";
|
|
54
|
+
}
|
|
55
|
+
function nextStory(prd) {
|
|
56
|
+
return prd.userStories.find((s) => !s.passes);
|
|
57
|
+
}
|
|
58
|
+
function runQualityChecks() {
|
|
59
|
+
try {
|
|
60
|
+
const output = execSync(QUALITY_CMD, { encoding: "utf-8", stdio: "pipe" });
|
|
61
|
+
return { passed: true, output };
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const output = err.stdout ?? String(err);
|
|
65
|
+
return { passed: false, output };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ββ Prompt builders βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
69
|
+
function architectPrompt(story, progress) {
|
|
70
|
+
const criteria = story.acceptanceCriteria.map((c) => ` - ${c}`).join("\n");
|
|
71
|
+
return [
|
|
72
|
+
`## Architect: ${story.title}`,
|
|
73
|
+
``,
|
|
74
|
+
`You are the architect. A Codex agent ("Builder") is working alongside you.`,
|
|
75
|
+
`You are both on the #general channel and can communicate freely.`,
|
|
76
|
+
``,
|
|
77
|
+
`### How to communicate`,
|
|
78
|
+
`Use the Relaycast MCP tools to post messages to #general:`,
|
|
79
|
+
`1. Call set_workspace_key with your RELAY_API_KEY env var`,
|
|
80
|
+
`2. Register as an agent using your name`,
|
|
81
|
+
`3. Use post_message to send to the #general channel`,
|
|
82
|
+
``,
|
|
83
|
+
story.description,
|
|
84
|
+
``,
|
|
85
|
+
`### Acceptance Criteria`,
|
|
86
|
+
criteria,
|
|
87
|
+
``,
|
|
88
|
+
`### Previous Learnings`,
|
|
89
|
+
progress || "(first story)",
|
|
90
|
+
``,
|
|
91
|
+
`### Your job`,
|
|
92
|
+
`1. Post a concise implementation plan to #general (files, changes, edge cases)`,
|
|
93
|
+
`2. Monitor the Builder's progress messages on the channel`,
|
|
94
|
+
`3. Provide guidance if the Builder asks questions or goes off track`,
|
|
95
|
+
`4. When the Builder says it's done, review the git diff`,
|
|
96
|
+
`5. Post exactly "REVIEW:PASS" to #general if all criteria are met`,
|
|
97
|
+
`6. Post exactly "REVIEW:FAIL" followed by feedback to #general if issues remain`,
|
|
98
|
+
``,
|
|
99
|
+
`IMPORTANT: You MUST use Relaycast MCP tools to post messages. This is how`,
|
|
100
|
+
`the orchestrator knows you're done. Post your plan first, then your verdict.`,
|
|
101
|
+
].join("\n");
|
|
102
|
+
}
|
|
103
|
+
function builderPrompt(story, progress, reviewFeedback) {
|
|
104
|
+
const criteria = story.acceptanceCriteria.map((c) => ` - ${c}`).join("\n");
|
|
105
|
+
const sections = [
|
|
106
|
+
`## Builder: ${story.title}`,
|
|
107
|
+
``,
|
|
108
|
+
`You are the builder. A Claude agent ("Architect") is guiding you on #general.`,
|
|
109
|
+
`Read the Architect's plan from the channel and implement it.`,
|
|
110
|
+
``,
|
|
111
|
+
`### How to communicate`,
|
|
112
|
+
`Use the Relaycast MCP tools to post messages to #general:`,
|
|
113
|
+
`1. Call set_workspace_key with your RELAY_API_KEY env var`,
|
|
114
|
+
`2. Register as an agent using your name`,
|
|
115
|
+
`3. Use post_message to send to the #general channel`,
|
|
116
|
+
``,
|
|
117
|
+
story.description,
|
|
118
|
+
``,
|
|
119
|
+
`### Acceptance Criteria`,
|
|
120
|
+
criteria,
|
|
121
|
+
];
|
|
122
|
+
if (reviewFeedback) {
|
|
123
|
+
sections.push(``, `### Review Feedback (fix these issues first)`, reviewFeedback);
|
|
124
|
+
}
|
|
125
|
+
sections.push(``, `### Previous Learnings`, progress || "(first story)", ``, `### Your job`, `1. Read the Architect's plan from #general`, `2. Implement the changes`, `3. Post progress updates to #general as you work`, `4. When done, post exactly "IMPLEMENTATION COMPLETE" to #general`, ``, `IMPORTANT: You MUST use Relaycast MCP tools to post messages. This is how`, `the orchestrator knows you're done.`);
|
|
126
|
+
return sections.join("\n");
|
|
127
|
+
}
|
|
128
|
+
// ββ Main loop βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
129
|
+
const relay = new AgentRelay({ env: process.env });
|
|
130
|
+
const channelLog = [];
|
|
131
|
+
relay.onMessageReceived = (msg) => {
|
|
132
|
+
channelLog.push(msg);
|
|
133
|
+
console.log(` π¬ ${msg.from}: "${msg.text.slice(0, 80)}β¦"`);
|
|
134
|
+
};
|
|
135
|
+
relay.onAgentSpawned = (agent) => console.log(` π’ ${agent.name} spawned (${agent.runtime})`);
|
|
136
|
+
relay.onAgentReleased = (agent) => console.log(` π΄ ${agent.name} released`);
|
|
137
|
+
relay.onAgentExited = (agent) => console.log(` βͺ ${agent.name} exited`);
|
|
138
|
+
relay.onMessageSent = (msg) => console.log(` π€ β ${msg.to}: "${msg.text.slice(0, 60)}β¦"`);
|
|
139
|
+
const prd = loadPrd();
|
|
140
|
+
const orchestrator = relay.human({ name: "Ralph" });
|
|
141
|
+
console.log(`\nββ Ralph Loop (Claude + Codex) ββ`);
|
|
142
|
+
console.log(` branch: ${prd.branchName}`);
|
|
143
|
+
console.log(` stories: ${prd.userStories.length}`);
|
|
144
|
+
console.log(` remaining: ${prd.userStories.filter((s) => !s.passes).length}`);
|
|
145
|
+
console.log(` max iterations: ${MAX_ITERATIONS}`);
|
|
146
|
+
console.log(` max review rounds: ${MAX_REVIEW_ROUNDS}\n`);
|
|
147
|
+
let iteration = 0;
|
|
148
|
+
while (iteration < MAX_ITERATIONS) {
|
|
149
|
+
const story = nextStory(prd);
|
|
150
|
+
if (!story)
|
|
151
|
+
break;
|
|
152
|
+
iteration++;
|
|
153
|
+
console.log(`\nββ Story ${story.id}: ${story.title} (iteration ${iteration}) ββ\n`);
|
|
154
|
+
let reviewFeedback;
|
|
155
|
+
let storyPassed = false;
|
|
156
|
+
for (let round = 0; round < MAX_REVIEW_ROUNDS; round++) {
|
|
157
|
+
const roundLabel = round === 0 ? "initial" : `fix-${round}`;
|
|
158
|
+
const progress = readProgress();
|
|
159
|
+
// ββ Spawn both agents concurrently ββββββββββββββββββββββββββββββββββ
|
|
160
|
+
console.log(` β‘ Spawning Claude (architect) + Codex (builder) β round: ${roundLabel}`);
|
|
161
|
+
const [architect, builder] = await Promise.all([
|
|
162
|
+
relay.claude.spawn({
|
|
163
|
+
name: `Architect-${story.id}-${roundLabel}`,
|
|
164
|
+
channels: ["general"],
|
|
165
|
+
}),
|
|
166
|
+
relay.codex.spawn({
|
|
167
|
+
name: `Builder-${story.id}-${roundLabel}`,
|
|
168
|
+
args: ["--full-auto"],
|
|
169
|
+
channels: ["general"],
|
|
170
|
+
}),
|
|
171
|
+
]);
|
|
172
|
+
// ββ Inject tasks via relay ββββββββββββββββββββββββββββββββββββββββββ
|
|
173
|
+
// Claude gets the architect prompt first so it can post the plan
|
|
174
|
+
await orchestrator.sendMessage({
|
|
175
|
+
to: architect.name,
|
|
176
|
+
text: architectPrompt(story, progress),
|
|
177
|
+
});
|
|
178
|
+
// Small delay so Claude's plan arrives before Codex starts reading
|
|
179
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
180
|
+
await orchestrator.sendMessage({
|
|
181
|
+
to: builder.name,
|
|
182
|
+
text: builderPrompt(story, progress, reviewFeedback),
|
|
183
|
+
});
|
|
184
|
+
// ββ Wait for agents to finish or detect completion ββββββββββββββββββββ
|
|
185
|
+
// Interactive agents don't exit on their own, so we poll channel
|
|
186
|
+
// messages for completion signals and release them when done.
|
|
187
|
+
console.log(` β³ Claude + Codex working together on #generalβ¦`);
|
|
188
|
+
const startLen = channelLog.length;
|
|
189
|
+
const deadline = Date.now() + ROUND_TIMEOUT_MS;
|
|
190
|
+
let verdict;
|
|
191
|
+
// Poll every 5s for completion signals in channel messages
|
|
192
|
+
while (Date.now() < deadline) {
|
|
193
|
+
const recent = channelLog.slice(startLen);
|
|
194
|
+
// Check if Claude posted a review verdict
|
|
195
|
+
const review = recent.find((m) => m.text.includes("REVIEW:PASS") || m.text.includes("REVIEW:FAIL"));
|
|
196
|
+
if (review) {
|
|
197
|
+
verdict = review.text;
|
|
198
|
+
console.log(` π Claude posted verdict`);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
// Check if Codex signaled completion (Claude may still be reviewing)
|
|
202
|
+
const implDone = recent.find((m) => m.text.includes("IMPLEMENTATION COMPLETE"));
|
|
203
|
+
if (implDone) {
|
|
204
|
+
console.log(` π Codex finished, waiting for Claude's reviewβ¦`);
|
|
205
|
+
// Give Claude up to 60s more to post a verdict
|
|
206
|
+
const reviewDeadline = Date.now() + 60_000;
|
|
207
|
+
while (Date.now() < reviewDeadline) {
|
|
208
|
+
await new Promise((r) => setTimeout(r, 3000));
|
|
209
|
+
const afterImpl = channelLog.slice(startLen);
|
|
210
|
+
const rv = afterImpl.find((m) => m.text.includes("REVIEW:PASS") || m.text.includes("REVIEW:FAIL"));
|
|
211
|
+
if (rv) {
|
|
212
|
+
verdict = rv.text;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
// Check if either agent exited on its own
|
|
219
|
+
const archResult = await architect.waitForExit(0);
|
|
220
|
+
const buildResult = await builder.waitForExit(0);
|
|
221
|
+
if (archResult !== "timeout" && buildResult !== "timeout")
|
|
222
|
+
break;
|
|
223
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
224
|
+
}
|
|
225
|
+
// Release both agents (they're interactive so won't exit on their own)
|
|
226
|
+
const cleanup = async (agent) => {
|
|
227
|
+
try {
|
|
228
|
+
await agent.release();
|
|
229
|
+
}
|
|
230
|
+
catch { /* already exited */ }
|
|
231
|
+
};
|
|
232
|
+
await Promise.all([cleanup(architect), cleanup(builder)]);
|
|
233
|
+
// ββ Quality gate ββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
234
|
+
console.log(` π running quality checksβ¦`);
|
|
235
|
+
const quality = runQualityChecks();
|
|
236
|
+
if (!quality.passed) {
|
|
237
|
+
appendProgress(`β ${story.id} round=${roundLabel} β quality checks failed`);
|
|
238
|
+
reviewFeedback = `Quality checks failed:\n${quality.output.slice(0, 500)}`;
|
|
239
|
+
console.log(` β quality checks failed\n`);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
// ββ Check verdict βββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
243
|
+
if (verdict?.includes("REVIEW:PASS")) {
|
|
244
|
+
storyPassed = true;
|
|
245
|
+
appendProgress(`β
${story.id} β ${story.title} β PASSED (round=${roundLabel})`);
|
|
246
|
+
console.log(` β
story passed!\n`);
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
else if (verdict?.includes("REVIEW:FAIL")) {
|
|
250
|
+
const failText = verdict.replace("REVIEW:FAIL", "").trim();
|
|
251
|
+
reviewFeedback = failText;
|
|
252
|
+
appendProgress(`π ${story.id} round=${roundLabel} β review failed: ${reviewFeedback.slice(0, 200)}`);
|
|
253
|
+
console.log(` π review failed, starting new round\n`);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// No verdict from Claude β quality passed so accept it
|
|
257
|
+
storyPassed = true;
|
|
258
|
+
appendProgress(`β
${story.id} β ${story.title} β PASSED (quality only, round=${roundLabel})`);
|
|
259
|
+
console.log(` β
quality passed (no explicit review verdict)\n`);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (storyPassed) {
|
|
264
|
+
story.passes = true;
|
|
265
|
+
savePrd(prd);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
appendProgress(`β οΈ ${story.id} β exhausted review rounds, moving on`);
|
|
269
|
+
console.log(` β οΈ exhausted ${MAX_REVIEW_ROUNDS} review rounds for ${story.id}\n`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// ββ Summary βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
273
|
+
const remaining = prd.userStories.filter((s) => !s.passes);
|
|
274
|
+
if (remaining.length === 0) {
|
|
275
|
+
console.log(`\nπ COMPLETE β all stories pass.`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
console.log(`\nβ οΈ ${remaining.length} stories remain after ${iteration} iterations.`);
|
|
279
|
+
}
|
|
280
|
+
await relay.shutdown();
|
|
281
|
+
//# sourceMappingURL=ralph-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralph-loop.js","sourceRoot":"","sources":["../../src/examples/ralph-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Superiority β Multi-Agent Implementation Campaign
|
|
3
|
+
*
|
|
4
|
+
* A fully specified DAG workflow that orchestrates Claude (lead + reviewer)
|
|
5
|
+
* and Codex workers across five implementation tiers to make the relay
|
|
6
|
+
* broker-sdk workflow system decisively superior to Agno and Swarms AI.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Claude lead: orchestrates each phase, approves trajectories, makes
|
|
10
|
+
* final architectural decisions
|
|
11
|
+
* - Codex workers: implement code changes, one per specialization domain
|
|
12
|
+
* - Claude code-reviewer: independent review after every implementation phase
|
|
13
|
+
* (separate from lead to avoid confirmation bias)
|
|
14
|
+
*
|
|
15
|
+
* DAG phases:
|
|
16
|
+
* Phase 0 β Codebase analysis + spec approval
|
|
17
|
+
* Phase 1 β Type system extension (condition/loop/router/hitl/sub-workflow)
|
|
18
|
+
* Phase 2 β Execution engine (runner handles new primitives + session)
|
|
19
|
+
* Phase 3 β Meta-orchestration (parallel with Phase 4)
|
|
20
|
+
* Phase 4 β Storage backends (parallel with Phase 3)
|
|
21
|
+
* Phase 5 β Deployment & observability
|
|
22
|
+
* Phase 6 β Integration validation + final lead sign-off
|
|
23
|
+
*
|
|
24
|
+
* Run:
|
|
25
|
+
* npx tsx src/examples/workflow-superiority.ts
|
|
26
|
+
*
|
|
27
|
+
* Environment:
|
|
28
|
+
* RELAY_API_KEY β optional. If absent the runner auto-provisions a
|
|
29
|
+
* fresh Relaycast workspace for each run (fully isolated, no caching).
|
|
30
|
+
*/
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=workflow-superiority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-superiority.d.ts","sourceRoot":"","sources":["../../src/examples/workflow-superiority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}
|