ralph-teams 0.1.4 → 0.1.7
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/.claude/agents/team-lead.md +24 -10
- package/.github/agents/team-lead.agent.md +22 -8
- package/README.md +28 -28
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +31 -0
- package/dist/app.js.map +1 -0
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +1 -0
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/run.d.ts +4 -4
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +25 -203
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/task.d.ts +21 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +281 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -1
- package/dist/guidance.d.ts +1 -1
- package/dist/guidance.js +1 -1
- package/dist/index.js +8 -30
- package/dist/index.js.map +1 -1
- package/dist/json-tool.js +55 -5
- package/dist/json-tool.js.map +1 -1
- package/package.json +12 -5
- package/ralph.sh +305 -79
- package/dist/commands/add-epic.d.ts +0 -2
- package/dist/commands/add-epic.d.ts.map +0 -1
- package/dist/commands/add-epic.js +0 -102
- package/dist/commands/add-epic.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -13
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -17
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/update-stats.d.ts +0 -23
- package/dist/commands/update-stats.d.ts.map +0 -1
- package/dist/commands/update-stats.js +0 -14
- package/dist/commands/update-stats.js.map +0 -1
- package/dist/dashboard/activity-parser.d.ts +0 -100
- package/dist/dashboard/activity-parser.d.ts.map +0 -1
- package/dist/dashboard/activity-parser.js +0 -407
- package/dist/dashboard/activity-parser.js.map +0 -1
- package/dist/dashboard/discuss-context-loader.d.ts +0 -71
- package/dist/dashboard/discuss-context-loader.d.ts.map +0 -1
- package/dist/dashboard/discuss-context-loader.js +0 -227
- package/dist/dashboard/discuss-context-loader.js.map +0 -1
- package/dist/dashboard/guidance-writer.d.ts +0 -64
- package/dist/dashboard/guidance-writer.d.ts.map +0 -1
- package/dist/dashboard/guidance-writer.js +0 -142
- package/dist/dashboard/guidance-writer.js.map +0 -1
- package/dist/dashboard/index.d.ts +0 -34
- package/dist/dashboard/index.d.ts.map +0 -1
- package/dist/dashboard/index.js +0 -109
- package/dist/dashboard/index.js.map +0 -1
- package/dist/dashboard/merge-parser.d.ts +0 -37
- package/dist/dashboard/merge-parser.d.ts.map +0 -1
- package/dist/dashboard/merge-parser.js +0 -86
- package/dist/dashboard/merge-parser.js.map +0 -1
- package/dist/dashboard/poller.d.ts +0 -96
- package/dist/dashboard/poller.d.ts.map +0 -1
- package/dist/dashboard/poller.js +0 -427
- package/dist/dashboard/poller.js.map +0 -1
- package/dist/dashboard/renderer.d.ts +0 -106
- package/dist/dashboard/renderer.d.ts.map +0 -1
- package/dist/dashboard/renderer.js +0 -337
- package/dist/dashboard/renderer.js.map +0 -1
- package/dist/dashboard/screen.d.ts +0 -52
- package/dist/dashboard/screen.d.ts.map +0 -1
- package/dist/dashboard/screen.js +0 -534
- package/dist/dashboard/screen.js.map +0 -1
- package/dist/dashboard/story-state-parser.d.ts +0 -120
- package/dist/dashboard/story-state-parser.d.ts.map +0 -1
- package/dist/dashboard/story-state-parser.js +0 -234
- package/dist/dashboard/story-state-parser.js.map +0 -1
- package/dist/dashboard/types.d.ts +0 -127
- package/dist/dashboard/types.d.ts.map +0 -1
- package/dist/dashboard/types.js +0 -6
- package/dist/dashboard/types.js.map +0 -1
- package/dist/dashboard/views/discuss-view.d.ts +0 -85
- package/dist/dashboard/views/discuss-view.d.ts.map +0 -1
- package/dist/dashboard/views/discuss-view.js +0 -146
- package/dist/dashboard/views/discuss-view.js.map +0 -1
- package/dist/dashboard/views/epic-detail-view.d.ts +0 -57
- package/dist/dashboard/views/epic-detail-view.d.ts.map +0 -1
- package/dist/dashboard/views/epic-detail-view.js +0 -148
- package/dist/dashboard/views/epic-detail-view.js.map +0 -1
- package/dist/dashboard/views/log-view.d.ts +0 -29
- package/dist/dashboard/views/log-view.d.ts.map +0 -1
- package/dist/dashboard/views/log-view.js +0 -47
- package/dist/dashboard/views/log-view.js.map +0 -1
- package/dist/dashboard/views/summary-view.d.ts +0 -61
- package/dist/dashboard/views/summary-view.d.ts.map +0 -1
- package/dist/dashboard/views/summary-view.js +0 -125
- package/dist/dashboard/views/summary-view.js.map +0 -1
- package/dist/retry-controller.d.ts +0 -41
- package/dist/retry-controller.d.ts.map +0 -1
- package/dist/retry-controller.js +0 -123
- package/dist/retry-controller.js.map +0 -1
- package/dist/run-stats.d.ts +0 -173
- package/dist/run-stats.d.ts.map +0 -1
- package/dist/run-stats.js +0 -387
- package/dist/run-stats.js.map +0 -1
|
@@ -14,25 +14,42 @@ You are the coordinator for an epic implementation team. You receive an epic (a
|
|
|
14
14
|
- Idle or waiting messages from teammates are NORMAL — they do not mean the session should end.
|
|
15
15
|
- **NEVER send shutdown_request messages** — the session ending handles cleanup automatically.
|
|
16
16
|
- Process stories sequentially: build → validate → next. Do not stop early.
|
|
17
|
-
- You are done only when every story has been attempted (or skipped because already passed) AND you have
|
|
17
|
+
- You are done only when every story has been attempted (or skipped because already passed) AND you have updated the PRD file with each story's result.
|
|
18
18
|
|
|
19
19
|
## Your Role
|
|
20
20
|
|
|
21
21
|
You are the brain. You plan, coordinate, and decide. You NEVER write implementation code yourself. You delegate all coding to the Builder and all verification to the Validator.
|
|
22
22
|
|
|
23
|
+
## Claude Model Selection Policy
|
|
24
|
+
|
|
25
|
+
For Claude subagents, choose the model based on task difficulty unless the environment marks a role as explicitly overridden from `ralph.config.yml`.
|
|
26
|
+
|
|
27
|
+
- If `RALPH_MODEL_PLANNER_EXPLICIT=1`, use `RALPH_MODEL_PLANNER` as-is.
|
|
28
|
+
- If `RALPH_MODEL_BUILDER_EXPLICIT=1`, use `RALPH_MODEL_BUILDER` as-is.
|
|
29
|
+
- If `RALPH_MODEL_VALIDATOR_EXPLICIT=1`, use `RALPH_MODEL_VALIDATOR` as-is.
|
|
30
|
+
- If `RALPH_MODEL_MERGER_EXPLICIT=1`, use `RALPH_MODEL_MERGER` as-is.
|
|
31
|
+
- If no explicit override is set, choose dynamically:
|
|
32
|
+
- easy task -> `haiku`
|
|
33
|
+
- medium task -> `sonnet`
|
|
34
|
+
- difficult task -> `opus`
|
|
35
|
+
- Use conservative judgment. When a task has real ambiguity, architectural risk, or tricky verification requirements, treat it as difficult.
|
|
36
|
+
- The Team Lead itself stays on its configured model. By default that is `opus`.
|
|
37
|
+
|
|
23
38
|
## Startup Sequence
|
|
24
39
|
|
|
25
40
|
1. **Parse the epic** — Read the user stories and acceptance criteria passed to you in the prompt. Note the PRD file path provided in the prompt — you will use this exact path for all PRD updates.
|
|
26
41
|
2. **Planner — only spawn if truly needed.** Ask: "Could a developer implement every story in this epic without any design decisions, just by following the acceptance criteria literally?" If YES → **do NOT spawn the Planner**. If NO → spawn it.
|
|
27
42
|
- DO NOT spawn for: adding/removing lines in named files, changing config values, adding console.log statements, renaming things
|
|
28
43
|
- SPAWN for: new features, new files/modules, refactors, anything requiring architectural judgment
|
|
29
|
-
- When spawning: use `subagent_type: "planner"
|
|
30
|
-
3. **Spawn the Builder** — Spawn a **Builder** agent (`name: "builder"`, `subagent_type: "sonnet-coder"
|
|
44
|
+
- When spawning: use `subagent_type: "planner"`. If `RALPH_MODEL_PLANNER_EXPLICIT=1`, use `RALPH_MODEL_PLANNER`. Otherwise choose `haiku`/`sonnet`/`opus` based on task difficulty.
|
|
45
|
+
3. **Spawn the Builder** — Spawn a **Builder** agent (`name: "builder"`, `subagent_type: "sonnet-coder"`) — provide the full epic context, the implementation plan (if one was written), and instruct it to wait for story assignments from you via direct messages.
|
|
46
|
+
- If `RALPH_MODEL_BUILDER_EXPLICIT=1`, use `RALPH_MODEL_BUILDER`.
|
|
47
|
+
- Otherwise choose `haiku` for straightforward file edits, `sonnet` for normal implementation work, and `opus` only when the build task is unusually complex or risky.
|
|
31
48
|
4. **Validator — only spawn if truly needed.** Ask: "Can I verify this story is correct just by reading the file and checking the build output?" If YES → **do NOT spawn the Validator** — self-verify instead. If NO → spawn it.
|
|
32
49
|
- DO NOT spawn for: "add X to file Y" (read the file, check X is there), build/typecheck checks (run the command yourself or trust Builder's output)
|
|
33
50
|
- SPAWN for: logic correctness, new behaviour, API contracts, anything requiring judgment to verify
|
|
34
51
|
- When self-verifying: read the changed file(s), check each criterion, decide PASS or FAIL.
|
|
35
|
-
- When spawning: use `subagent_type: "validator"`, `
|
|
52
|
+
- When spawning: use `subagent_type: "validator"`. If `RALPH_MODEL_VALIDATOR_EXPLICIT=1`, use `RALPH_MODEL_VALIDATOR`. Otherwise choose `haiku` for simple checklist verification, `sonnet` for normal validation, and `opus` for difficult behavioral or systems-level verification.
|
|
36
53
|
|
|
37
54
|
## Workflow Per Story
|
|
38
55
|
|
|
@@ -111,12 +128,9 @@ After each story completes (pass or fail), update the PRD file at the path provi
|
|
|
111
128
|
|
|
112
129
|
After processing ALL stories in the epic (none left to attempt):
|
|
113
130
|
|
|
114
|
-
1. **
|
|
115
|
-
- If all passed: `PASS`
|
|
116
|
-
- If some passed: `PARTIAL: X/Y stories passed. Failed: [list story IDs]`
|
|
117
|
-
- If all failed: `FAIL: 0/Y stories passed.`
|
|
131
|
+
1. **Verify PRD is updated** — Ensure every story in the PRD file has been updated with `passes: true` or `passes: false`. The harness reads story results directly from the PRD file.
|
|
118
132
|
|
|
119
|
-
2. **
|
|
133
|
+
2. **Output the result** — Print a summary line: "DONE: X/Y stories passed" so it appears in the session output. Then stop — the session ending will clean up all subagents automatically.
|
|
120
134
|
|
|
121
135
|
## Rules
|
|
122
136
|
|
|
@@ -124,7 +138,7 @@ After processing ALL stories in the epic (none left to attempt):
|
|
|
124
138
|
- Only skip the Planner for genuinely simple epics — when in doubt, run it
|
|
125
139
|
- Only skip the Validator for genuinely simple stories — when in doubt, spawn it; for complex stories the Validator must always run
|
|
126
140
|
- NEVER exceed 2 total build+validate cycles per story (first attempt + 1 retry = 2 total)
|
|
127
|
-
- ALWAYS process ALL stories before
|
|
141
|
+
- ALWAYS process ALL stories before stopping
|
|
128
142
|
- ALWAYS check `passes` field before starting a story — skip already-passed stories
|
|
129
143
|
- ALWAYS document failures before moving on
|
|
130
144
|
- Keep Builder and Validator unaware of each other's reasoning — Validator should only see the code (via commit SHA), not Builder's explanation of what it did
|
|
@@ -13,18 +13,33 @@ You are the coordinator for an epic implementation team. You receive an epic (a
|
|
|
13
13
|
- **Do NOT stop until ALL stories in the epic have been processed.**
|
|
14
14
|
- Idle or waiting messages from sub-agents are NORMAL — they do not mean the session should end.
|
|
15
15
|
- Process stories sequentially: plan → build → validate → next. Do not stop early.
|
|
16
|
-
- You are done only when every story has been attempted (or skipped because already passed) AND you have
|
|
16
|
+
- You are done only when every story has been attempted (or skipped because already passed) AND you have updated the PRD file with each story's result.
|
|
17
17
|
|
|
18
18
|
## Your Role
|
|
19
19
|
|
|
20
20
|
You are the brain. You plan, coordinate, and decide. You NEVER write implementation code yourself. You delegate all coding to the Builder and all verification to the Validator.
|
|
21
21
|
|
|
22
|
+
## Model Selection Policy
|
|
23
|
+
|
|
24
|
+
When spawning sub-agents with Copilot, respect explicit config first and only fall back to dynamic task-based model selection when there is no explicit override.
|
|
25
|
+
|
|
26
|
+
- If `RALPH_MODEL_PLANNER_EXPLICIT=1`, use `RALPH_MODEL_PLANNER` for planner work.
|
|
27
|
+
- If `RALPH_MODEL_BUILDER_EXPLICIT=1`, use `RALPH_MODEL_BUILDER` for builder work.
|
|
28
|
+
- If `RALPH_MODEL_VALIDATOR_EXPLICIT=1`, use `RALPH_MODEL_VALIDATOR` for validator work.
|
|
29
|
+
- If `RALPH_MODEL_MERGER_EXPLICIT=1`, use `RALPH_MODEL_MERGER` for merger work.
|
|
30
|
+
- Otherwise choose dynamically:
|
|
31
|
+
- easy task -> `claude-haiku-4.5`
|
|
32
|
+
- medium task -> `claude-sonnet-4.6`
|
|
33
|
+
- difficult task -> `claude-opus-4.6`
|
|
34
|
+
- If the task tool supports `--reasoning-effort`, use `low` for easy tasks, `medium` for normal tasks, `high` for difficult tasks, and `xhigh` only for exceptionally hard analysis.
|
|
35
|
+
|
|
22
36
|
## Startup Sequence
|
|
23
37
|
|
|
24
38
|
1. **Parse the epic** — Read the user stories and acceptance criteria passed to you in the prompt. Note the PRD file path provided — you will use this exact path for all PRD updates.
|
|
25
39
|
2. **Planner — only spawn if truly needed.** Ask: "Could a developer implement every story in this epic without any design decisions, just by following the acceptance criteria literally?" If YES → **do NOT spawn the Planner**. If NO → spawn it via the `task` tool, wait for it to finish, then read `plans/plan-{epic-id}.md`.
|
|
26
40
|
- DO NOT spawn for: adding/removing lines in named files, changing config values, adding console.log statements, renaming things
|
|
27
41
|
- SPAWN for: new features, new files/modules, refactors, anything requiring architectural judgment
|
|
42
|
+
- Choose the planner model using the policy above
|
|
28
43
|
|
|
29
44
|
## Workflow Per Story
|
|
30
45
|
|
|
@@ -42,6 +57,7 @@ Before starting a story, check the `passes` field in the PRD file.
|
|
|
42
57
|
- The relevant section from the implementation plan
|
|
43
58
|
- Any context from previous stories
|
|
44
59
|
- **If the guidance file exists**, include this line explicitly: `Guidance file for this story: guidance/guidance-{story-id}.md — read it before implementing and follow the instructions in it.`
|
|
60
|
+
- Choose the builder model using the policy above
|
|
45
61
|
3. Wait for Builder to complete and return the commit SHA
|
|
46
62
|
|
|
47
63
|
### Validate Phase
|
|
@@ -50,6 +66,7 @@ Before starting a story, check the `passes` field in the PRD file.
|
|
|
50
66
|
- SPAWN for: logic correctness, new behaviour, API contracts, anything requiring judgment to verify
|
|
51
67
|
- When self-verifying: read the changed file(s), check each criterion, decide PASS or FAIL.
|
|
52
68
|
- If spawning: provide acceptance criteria + commit SHA + "Use `git diff <sha>~1 <sha>` to see exactly what changed."
|
|
69
|
+
- Choose the validator model using the policy above
|
|
53
70
|
4. Wait for Validator verdict (if spawned)
|
|
54
71
|
|
|
55
72
|
### Pushback Loop (max 2 total build+validate cycles)
|
|
@@ -102,13 +119,10 @@ After each story, update the PRD file at the path provided in the prompt. Set `p
|
|
|
102
119
|
|
|
103
120
|
After processing ALL stories in the epic:
|
|
104
121
|
|
|
105
|
-
1. **
|
|
106
|
-
- If all passed: `PASS`
|
|
107
|
-
- If some passed: `PARTIAL: X/Y stories passed. Failed: [list story IDs]`
|
|
108
|
-
- If all failed: `FAIL: 0/Y stories passed.`
|
|
122
|
+
1. **Verify PRD is updated** — Ensure every story in the PRD file has been updated with `passes: true` or `passes: false`. The harness reads story results directly from the PRD file.
|
|
109
123
|
|
|
110
|
-
2. **Output the result** — Print the
|
|
111
|
-
3. **Exit immediately** — End the session right after
|
|
124
|
+
2. **Output the result** — Print a summary line: "DONE: X/Y stories passed" so it appears in the session output.
|
|
125
|
+
3. **Exit immediately** — End the session right after printing the result. Do not wait for more work, do not idle, and do not keep sub-agents alive.
|
|
112
126
|
|
|
113
127
|
## Rules
|
|
114
128
|
|
|
@@ -116,7 +130,7 @@ After processing ALL stories in the epic:
|
|
|
116
130
|
- Only skip the Planner for genuinely simple epics — when in doubt, run it
|
|
117
131
|
- Only skip the Validator for genuinely simple stories — when in doubt, spawn it; for complex stories the Validator must always run
|
|
118
132
|
- NEVER exceed 2 total build+validate cycles per story
|
|
119
|
-
- ALWAYS process ALL stories before
|
|
133
|
+
- ALWAYS process ALL stories before stopping
|
|
120
134
|
- ALWAYS check `passes` field before starting a story
|
|
121
135
|
- ALWAYS pass the commit SHA from Builder to Validator
|
|
122
136
|
- ALWAYS exit the session immediately after writing and printing the final result
|
package/README.md
CHANGED
|
@@ -16,6 +16,13 @@ The system has two layers:
|
|
|
16
16
|
- `builder` makes changes and runs tests
|
|
17
17
|
- `validator` verifies the result independently
|
|
18
18
|
|
|
19
|
+
Default Team Lead policy by backend:
|
|
20
|
+
- Claude: keep `team-lead` on `opus`; for spawned work use `haiku` for easy tasks, `sonnet` for medium tasks, `opus` for difficult tasks
|
|
21
|
+
- Copilot: resolve those same tiers to `claude-haiku-4.5`, `claude-sonnet-4.6`, and `claude-opus-4.6`
|
|
22
|
+
- Codex: resolve those same tiers to `gpt-5-mini`, `gpt-5.3-codex`, and `gpt-5.4`
|
|
23
|
+
|
|
24
|
+
If `ralph.config.yml` explicitly sets an agent model for a role, that explicit config is still respected and disables the automatic difficulty-based choice for that role.
|
|
25
|
+
|
|
19
26
|
Ralph never writes code itself. It only schedules work, tracks results, and updates project state.
|
|
20
27
|
|
|
21
28
|
Current backends:
|
|
@@ -32,7 +39,6 @@ The runtime is file-based. During a run, Ralph treats these files as the working
|
|
|
32
39
|
- `logs/`: raw backend logs
|
|
33
40
|
- `results/`: per-epic final result markers
|
|
34
41
|
- `ralph-state.json`: interrupt/resume state
|
|
35
|
-
- `ralph-run-stats.json`: cost, token, and duration telemetry
|
|
36
42
|
|
|
37
43
|
## Flow
|
|
38
44
|
|
|
@@ -232,13 +238,33 @@ Notes:
|
|
|
232
238
|
- `--backend` is forwarded to `ralph.sh`
|
|
233
239
|
- runs sequentially by default
|
|
234
240
|
- `--parallel <n>` enables the experimental parallel wave runner
|
|
235
|
-
- `--dashboard` is temporarily disabled
|
|
236
241
|
|
|
237
242
|
Planning behavior:
|
|
238
243
|
|
|
239
244
|
- if an epic has `planned: true`, the Team Lead is expected to read `plans/plan-EPIC-xxx.md` and follow it
|
|
240
245
|
- if an epic is still unplanned, the Team Lead may still decide to spawn a planner during execution
|
|
241
246
|
|
|
247
|
+
### `ralph-teams task <prompt>`
|
|
248
|
+
|
|
249
|
+
Runs an ad hoc task in the current repository without creating a PRD, epic, or story structure.
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
ralph-teams task "fix the flaky auth test"
|
|
253
|
+
ralph-teams task "add rate limiting to login" --backend codex
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Behavior:
|
|
257
|
+
|
|
258
|
+
- requires a checked out git branch and runs on that same branch
|
|
259
|
+
- asks once whether you want to plan the task first
|
|
260
|
+
- if you choose planning, starts a guided planning session with the agent
|
|
261
|
+
- otherwise starts direct Team Lead execution for the task
|
|
262
|
+
|
|
263
|
+
Notes:
|
|
264
|
+
|
|
265
|
+
- this mode does not create `prd.json` entries or worktrees
|
|
266
|
+
- `--backend` controls whether the task uses `claude`, `copilot`, or `codex`
|
|
267
|
+
|
|
242
268
|
### `ralph-teams plan [path]`
|
|
243
269
|
|
|
244
270
|
Starts a guided planning discussion for epics that are not yet marked as planned. Default path is `./prd.json`.
|
|
@@ -328,20 +354,6 @@ Resets one epic to `pending` and sets all of its stories back to `passes: false`
|
|
|
328
354
|
ralph-teams reset EPIC-002
|
|
329
355
|
```
|
|
330
356
|
|
|
331
|
-
### `ralph-teams add-epic [path]`
|
|
332
|
-
|
|
333
|
-
Interactively appends a new epic to an existing PRD.
|
|
334
|
-
|
|
335
|
-
```bash
|
|
336
|
-
ralph-teams add-epic
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
This command:
|
|
340
|
-
|
|
341
|
-
- creates the next `EPIC-###` id
|
|
342
|
-
- creates globally unique `US-###` ids across the PRD
|
|
343
|
-
- lets you choose dependencies from existing epics
|
|
344
|
-
|
|
345
357
|
### `ralph-teams validate [path]`
|
|
346
358
|
|
|
347
359
|
Validates PRD structure and dependency integrity.
|
|
@@ -375,17 +387,6 @@ Shows:
|
|
|
375
387
|
- story pass counts
|
|
376
388
|
- blocked epics
|
|
377
389
|
|
|
378
|
-
### `ralph-teams stats [path]`
|
|
379
|
-
|
|
380
|
-
Shows the current stats feature status.
|
|
381
|
-
|
|
382
|
-
```bash
|
|
383
|
-
ralph-teams stats
|
|
384
|
-
ralph-teams stats ./ralph-run-stats.json
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
This command is temporarily disabled while the telemetry model is being corrected.
|
|
388
|
-
|
|
389
390
|
## Backends
|
|
390
391
|
|
|
391
392
|
### Claude Backend
|
|
@@ -501,7 +502,6 @@ During a run, Ralph writes:
|
|
|
501
502
|
- `results/result-EPIC-xxx.txt`: final pass/partial/fail result per epic
|
|
502
503
|
- `logs/epic-EPIC-xxx-<timestamp>.log`: raw backend session log
|
|
503
504
|
- `ralph-state.json`: saved interrupt/resume state
|
|
504
|
-
- `ralph-run-stats.json`: token, cost, duration, and estimate data
|
|
505
505
|
- `guidance/guidance-US-xxx.md`: retry guidance captured from discuss flows
|
|
506
506
|
|
|
507
507
|
Ralph also updates the original `prd.json` in place as story and epic state changes.
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-level error class with a numeric error code.
|
|
3
|
+
*/
|
|
4
|
+
export declare class AppError extends Error {
|
|
5
|
+
code: number;
|
|
6
|
+
constructor(message: string, code: number);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Initializes the application. Any unhandled errors are caught and
|
|
10
|
+
* wrapped in an AppError before being logged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function init(): void;
|
|
13
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAO1C;AAED;;;GAGG;AACH,wBAAgB,IAAI,IAAI,IAAI,CAU3B"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AppError = void 0;
|
|
4
|
+
exports.init = init;
|
|
5
|
+
/**
|
|
6
|
+
* Application-level error class with a numeric error code.
|
|
7
|
+
*/
|
|
8
|
+
class AppError extends Error {
|
|
9
|
+
constructor(message, code) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "AppError";
|
|
12
|
+
this.code = code;
|
|
13
|
+
// Restore prototype chain (required when extending built-ins in TypeScript)
|
|
14
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.AppError = AppError;
|
|
18
|
+
/**
|
|
19
|
+
* Initializes the application. Any unhandled errors are caught and
|
|
20
|
+
* wrapped in an AppError before being logged.
|
|
21
|
+
*/
|
|
22
|
+
function init() {
|
|
23
|
+
try {
|
|
24
|
+
// Application initialization logic goes here
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const appError = new AppError(err instanceof Error ? err.message : String(err), 1);
|
|
28
|
+
console.error(appError);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;AAmBA,oBAUC;AA7BD;;GAEG;AACH,MAAa,QAAS,SAAQ,KAAK;IAGjC,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,4EAA4E;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAVD,4BAUC;AAED;;;GAGG;AACH,SAAgB,IAAI;IAClB,IAAI,CAAC;QACH,6CAA6C;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAC3B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAChD,CAAC,CACF,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAevC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,YAAY,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC;IACrC,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC;IAC/B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;CAChC;AA8BD,wBAAgB,aAAa,CAAC,IAAI,GAAE,UAAwB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAevC,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,YAAY,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC;IACrC,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC;IAC/B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;CAChC;AA8BD,wBAAgB,aAAa,CAAC,IAAI,GAAE,UAAwB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAiH5F"}
|
package/dist/commands/resume.js
CHANGED
|
@@ -144,6 +144,7 @@ function resumeCommand(deps = defaultDeps, backendOverride) {
|
|
|
144
144
|
// Pass config values to ralph.sh via environment variables
|
|
145
145
|
const spawnEnv = {
|
|
146
146
|
...process.env,
|
|
147
|
+
RALPH_RESUME: '1',
|
|
147
148
|
RALPH_EPIC_TIMEOUT: String(resolvedConfig.timeouts.epicTimeout),
|
|
148
149
|
RALPH_IDLE_TIMEOUT: String(resolvedConfig.timeouts.idleTimeout),
|
|
149
150
|
RALPH_VALIDATOR_MAX_PUSHBACKS: String(resolvedConfig.execution.validatorMaxPushbacks),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
|
-
import { spawnSync
|
|
3
|
-
import { loadConfig } from '../config';
|
|
2
|
+
import { spawnSync } from 'child_process';
|
|
3
|
+
import { loadConfig, loadExplicitAgentModelOverrides } from '../config';
|
|
4
4
|
interface RunDeps {
|
|
5
5
|
existsSync: typeof fs.existsSync;
|
|
6
6
|
chmodSync: typeof fs.chmodSync;
|
|
7
|
+
unlinkSync: typeof fs.unlinkSync;
|
|
7
8
|
spawnSync: typeof spawnSync;
|
|
8
|
-
spawn: typeof spawn;
|
|
9
9
|
exit: (code?: number) => never;
|
|
10
10
|
cwd: () => string;
|
|
11
11
|
/** Override for config loading — used in tests to inject a mock loader. */
|
|
12
12
|
loadConfig?: typeof loadConfig;
|
|
13
|
+
loadExplicitAgentModelOverrides?: typeof loadExplicitAgentModelOverrides;
|
|
13
14
|
}
|
|
14
15
|
export declare function runCommand(prdPath: string, options: {
|
|
15
16
|
backend?: string;
|
|
16
17
|
parallel?: string;
|
|
17
|
-
dashboard?: boolean;
|
|
18
18
|
}, deps?: RunDeps): Promise<void>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,+BAA+B,EAAqB,MAAM,WAAW,CAAC;AAE3F,UAAU,OAAO;IACf,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC;IAC/B,UAAU,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;IACjC,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IAC/B,+BAA+B,CAAC,EAAE,OAAO,+BAA+B,CAAC;CAC1E;AA2CD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,IAAI,GAAE,OAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAsIf"}
|