ralph-teams 0.1.1 → 0.1.2
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 +28 -16
- package/dist/commands/add-epic.d.ts.map +1 -1
- package/dist/commands/add-epic.js +13 -3
- package/dist/commands/add-epic.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +42 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +42 -4
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +30 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/summary.d.ts +20 -0
- package/dist/commands/summary.d.ts.map +1 -1
- package/dist/commands/summary.js +127 -0
- package/dist/commands/summary.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +23 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/json-tool.d.ts +21 -0
- package/dist/json-tool.d.ts.map +1 -0
- package/dist/json-tool.js +539 -0
- package/dist/json-tool.js.map +1 -0
- package/dist/prd-utils.d.ts +1 -1
- package/dist/prd-utils.d.ts.map +1 -1
- package/dist/prd-utils.js +1 -0
- package/dist/prd-utils.js.map +1 -1
- package/package.json +3 -2
- package/prd.json.example +28 -80
- package/ralph.sh +563 -108
package/README.md
CHANGED
|
@@ -71,7 +71,6 @@ flowchart TB
|
|
|
71
71
|
## Requirements
|
|
72
72
|
|
|
73
73
|
- Node.js 18+
|
|
74
|
-
- `jq` in `PATH`
|
|
75
74
|
- Git available if you want Ralph to switch/create the target branch
|
|
76
75
|
|
|
77
76
|
Backend-specific requirements:
|
|
@@ -82,12 +81,6 @@ Backend-specific requirements:
|
|
|
82
81
|
- `gh` CLI in `PATH`
|
|
83
82
|
- GitHub Copilot CLI available through `gh copilot`
|
|
84
83
|
|
|
85
|
-
Install `jq` on macOS:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
brew install jq
|
|
89
|
-
```
|
|
90
|
-
|
|
91
84
|
## Install
|
|
92
85
|
|
|
93
86
|
Install globally:
|
|
@@ -108,6 +101,7 @@ Then verify:
|
|
|
108
101
|
|
|
109
102
|
```bash
|
|
110
103
|
ralph-teams --help
|
|
104
|
+
rjq --help
|
|
111
105
|
```
|
|
112
106
|
|
|
113
107
|
## Quick Start
|
|
@@ -143,11 +137,12 @@ ralph-teams run
|
|
|
143
137
|
ralph-teams logs
|
|
144
138
|
```
|
|
145
139
|
|
|
146
|
-
Run `ralph.sh` directly when you want
|
|
140
|
+
Run `ralph.sh` directly when you want shell-level flags:
|
|
147
141
|
|
|
148
142
|
```bash
|
|
149
143
|
./ralph.sh prd.json --backend claude
|
|
150
144
|
./ralph.sh prd.json --backend copilot
|
|
145
|
+
./ralph.sh prd.json --parallel 2
|
|
151
146
|
./ralph.sh prd.json --backend copilot --max-epics 1
|
|
152
147
|
```
|
|
153
148
|
|
|
@@ -186,19 +181,22 @@ Runs Ralph against a PRD file. Default path is `./prd.json`.
|
|
|
186
181
|
```bash
|
|
187
182
|
ralph-teams run
|
|
188
183
|
ralph-teams run ./my-prd.json
|
|
184
|
+
ralph-teams run --backend copilot
|
|
185
|
+
ralph-teams run --parallel 2
|
|
189
186
|
```
|
|
190
187
|
|
|
191
188
|
Behavior:
|
|
192
189
|
|
|
193
|
-
- validates that the
|
|
190
|
+
- validates that the selected backend dependencies, `rjq`, and the PRD are available
|
|
194
191
|
- locates bundled `ralph.sh`
|
|
195
192
|
- streams Ralph output directly to the terminal
|
|
196
193
|
- exits with Ralph's exit code
|
|
197
194
|
|
|
198
195
|
Notes:
|
|
199
196
|
|
|
200
|
-
-
|
|
201
|
-
-
|
|
197
|
+
- `--backend` is forwarded to `ralph.sh`
|
|
198
|
+
- runs sequentially by default
|
|
199
|
+
- `--parallel <n>` enables the experimental parallel wave runner
|
|
202
200
|
|
|
203
201
|
### `ralph-teams status [path]`
|
|
204
202
|
|
|
@@ -218,6 +216,8 @@ ralph-teams logs
|
|
|
218
216
|
ralph-teams logs --tail 20
|
|
219
217
|
```
|
|
220
218
|
|
|
219
|
+
`--tail` shows the last `N` wave blocks from `progress.txt`.
|
|
220
|
+
|
|
221
221
|
### `ralph-teams reset <epicId> [path]`
|
|
222
222
|
|
|
223
223
|
Resets one epic to `pending` and sets all of its stories back to `passes: false`.
|
|
@@ -254,6 +254,7 @@ Checks include:
|
|
|
254
254
|
- valid epic status values
|
|
255
255
|
- duplicate epic IDs
|
|
256
256
|
- duplicate story IDs
|
|
257
|
+
- invalid `dependsOn` values
|
|
257
258
|
- unknown `dependsOn` references
|
|
258
259
|
- circular epic dependencies
|
|
259
260
|
|
|
@@ -343,7 +344,7 @@ Example:
|
|
|
343
344
|
|
|
344
345
|
Important fields:
|
|
345
346
|
|
|
346
|
-
- `epics[].status`: `pending` | `completed` | `partial` | `failed`
|
|
347
|
+
- `epics[].status`: `pending` | `completed` | `partial` | `failed` | `merge-failed`
|
|
347
348
|
- `epics[].dependsOn`: epic IDs that must be completed first
|
|
348
349
|
- `userStories[].passes`: whether the story is currently marked as passing
|
|
349
350
|
|
|
@@ -373,11 +374,14 @@ The current execution contract is:
|
|
|
373
374
|
|
|
374
375
|
- Ralph loops through epics in PRD order
|
|
375
376
|
- blocked epics are skipped until dependencies are complete
|
|
377
|
+
- runs sequentially by default
|
|
378
|
+
- experimental wave parallelism is enabled only with `--parallel <n>`
|
|
376
379
|
- the backend team processes one epic per session
|
|
377
380
|
- stories run sequentially inside that epic
|
|
378
381
|
- already-passed stories are skipped
|
|
379
382
|
- each story gets at most two build/validate cycles
|
|
380
383
|
- the validator checks output independently from the builder's reasoning
|
|
384
|
+
- after writing `results/result-EPIC-xxx.txt`, the team lead must print the same result and exit the session immediately
|
|
381
385
|
|
|
382
386
|
## Troubleshooting
|
|
383
387
|
|
|
@@ -395,6 +399,8 @@ Or from this repo:
|
|
|
395
399
|
npm link
|
|
396
400
|
```
|
|
397
401
|
|
|
402
|
+
The package also installs `rjq`, which `ralph.sh` uses internally.
|
|
403
|
+
|
|
398
404
|
### `Error: 'claude' CLI not found`
|
|
399
405
|
|
|
400
406
|
Install Claude Code and ensure `claude` is on your `PATH`.
|
|
@@ -425,12 +431,12 @@ If that still does not stream, the issue is likely in the local `gh copilot` env
|
|
|
425
431
|
|
|
426
432
|
Install Claude Code and ensure `claude` is on your `PATH`.
|
|
427
433
|
|
|
428
|
-
### `Error: '
|
|
434
|
+
### `Error: 'rjq' not found`
|
|
429
435
|
|
|
430
|
-
Install `
|
|
436
|
+
Install or relink the package so the bundled JSON CLI is on your `PATH`:
|
|
431
437
|
|
|
432
438
|
```bash
|
|
433
|
-
|
|
439
|
+
npm install -g ralph-teams
|
|
434
440
|
```
|
|
435
441
|
|
|
436
442
|
### Ralph cannot switch branches
|
|
@@ -444,7 +450,13 @@ Useful commands in this repo:
|
|
|
444
450
|
```bash
|
|
445
451
|
npm run build
|
|
446
452
|
npm run typecheck
|
|
453
|
+
npm test
|
|
447
454
|
npm link
|
|
448
455
|
```
|
|
449
456
|
|
|
450
|
-
|
|
457
|
+
Packaged binaries:
|
|
458
|
+
|
|
459
|
+
- `ralph-teams`: main CLI entrypoint (`dist/index.js`)
|
|
460
|
+
- `rjq`: bundled JSON query/manipulation CLI used by `ralph.sh` (`dist/json-tool.js`)
|
|
461
|
+
|
|
462
|
+
The runtime orchestrator is `ralph.sh`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-epic.d.ts","sourceRoot":"","sources":["../../src/commands/add-epic.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"add-epic.d.ts","sourceRoot":"","sources":["../../src/commands/add-epic.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GnE"}
|
|
@@ -38,13 +38,23 @@ async function addEpicCommand(prdPath) {
|
|
|
38
38
|
// Show existing epics for dependency selection
|
|
39
39
|
let dependsOn = [];
|
|
40
40
|
if (prd.epics.length > 0) {
|
|
41
|
+
const validEpicIds = new Set(prd.epics.map((epic) => epic.id));
|
|
41
42
|
console.log(chalk_1.default.dim('\nExisting epics:'));
|
|
42
43
|
for (const e of prd.epics) {
|
|
43
44
|
console.log(chalk_1.default.dim(` ${e.id}: ${e.title}`));
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
while (true) {
|
|
47
|
+
const depsInput = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan('\nDependencies (comma-separated epic IDs, or Enter for none): '));
|
|
48
|
+
if (depsInput.trim() === '') {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
const candidateDeps = depsInput.split(',').map(d => d.trim()).filter(d => d !== '');
|
|
52
|
+
const unknownDeps = candidateDeps.filter((dep) => !validEpicIds.has(dep));
|
|
53
|
+
if (unknownDeps.length === 0) {
|
|
54
|
+
dependsOn = candidateDeps;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
console.log(chalk_1.default.red(`Unknown epic IDs: ${unknownDeps.join(', ')}`));
|
|
48
58
|
}
|
|
49
59
|
}
|
|
50
60
|
// Collect user stories
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-epic.js","sourceRoot":"","sources":["../../src/commands/add-epic.ts"],"names":[],"mappings":";;;;;AAGA,
|
|
1
|
+
{"version":3,"file":"add-epic.js","sourceRoot":"","sources":["../../src/commands/add-epic.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkBD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA8D9E;AAiCD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD1E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -36,6 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.buildInitPrompt = buildInitPrompt;
|
|
39
40
|
exports.initCommand = initCommand;
|
|
40
41
|
const fs = __importStar(require("fs"));
|
|
41
42
|
const path = __importStar(require("path"));
|
|
@@ -61,20 +62,55 @@ function buildInitPrompt(prdExample, outputPath) {
|
|
|
61
62
|
'Do not ask the user to manually write epics or user stories from scratch unless they explicitly want to.',
|
|
62
63
|
'Instead, interview the user, clarify the product requirements, and synthesize the PRD yourself.',
|
|
63
64
|
'',
|
|
64
|
-
'
|
|
65
|
+
'## Conversation Flow',
|
|
66
|
+
'',
|
|
67
|
+
'### Phase 1: Requirements Gathering',
|
|
65
68
|
'- Start by asking the user to describe what they want to build, if they have not already.',
|
|
66
|
-
'- Ask follow-up questions
|
|
69
|
+
'- Ask follow-up questions to clarify scope, users, workflows, constraints, and priorities.',
|
|
67
70
|
'- Keep the discussion practical and product-oriented.',
|
|
68
|
-
'
|
|
71
|
+
'',
|
|
72
|
+
'### Phase 2: Design & Dependency Discussion',
|
|
73
|
+
'Before generating any epics, you MUST discuss these topics with the user:',
|
|
74
|
+
'',
|
|
75
|
+
'**Design Questions:**',
|
|
76
|
+
'- Identify 2-4 open architectural or implementation questions that affect how the work should be structured.',
|
|
77
|
+
'- Present them to the user and discuss before moving on.',
|
|
78
|
+
'- Examples: "Should X be a separate service?", "Do you want server-side or client-side rendering for Y?", "Should we use an existing library for Z or build custom?"',
|
|
79
|
+
'',
|
|
80
|
+
'**Epic Ordering & Dependencies:**',
|
|
81
|
+
'- Propose how you would break the work into epics (just titles and one-line descriptions at this stage).',
|
|
82
|
+
'- For each epic, explain what it depends on and why.',
|
|
83
|
+
'- Present the dependency graph explicitly, e.g.:',
|
|
84
|
+
' "EPIC-001 (no deps) -> EPIC-002 (needs EPIC-001) -> EPIC-003 (needs EPIC-002)"',
|
|
85
|
+
' "EPIC-001 (no deps) -> EPIC-004 (needs EPIC-001, can run parallel with EPIC-002)"',
|
|
86
|
+
'- Ask: "Does this ordering make sense? Would you change any dependencies?"',
|
|
87
|
+
'- Do NOT proceed until the user confirms the dependency structure.',
|
|
88
|
+
'',
|
|
89
|
+
'### Phase 3: PRD Structure Review',
|
|
90
|
+
'- Present the full epic structure: epic titles, story titles (no full descriptions yet), and dependency graph.',
|
|
91
|
+
'- Each epic should have 2-5 stories. Err on the side of fewer, larger stories.',
|
|
92
|
+
'- A story should represent a meaningful, testable increment — NOT a single function, config change, or file edit.',
|
|
93
|
+
'- Bad example: "Add migration for users table" (too granular)',
|
|
94
|
+
'- Good example: "User data model, API endpoints, and basic CRUD" (meaningful chunk)',
|
|
95
|
+
'- If the user thinks stories are too granular, consolidate aggressively.',
|
|
96
|
+
'- Only proceed to generation once the user approves.',
|
|
97
|
+
'',
|
|
98
|
+
'### Phase 4: Generation',
|
|
99
|
+
'- Generate the full prd.json and write it.',
|
|
100
|
+
'',
|
|
101
|
+
'## Rules',
|
|
69
102
|
`- Write the final file to: ${outputPath}`,
|
|
70
103
|
'- The file must be valid JSON.',
|
|
71
104
|
'- Use the example below as the schema and style reference.',
|
|
72
105
|
'- Include project, branchName, description, and epics.',
|
|
73
106
|
'- Generate epics and user stories automatically based on the discussion.',
|
|
74
|
-
'-
|
|
107
|
+
'- Each epic should have 2-5 consolidated user stories. Fewer meaty stories are better than many granular ones.',
|
|
75
108
|
'- Use sequential IDs like EPIC-001 and US-001.',
|
|
76
109
|
'- Set new epic status values to "pending".',
|
|
77
110
|
'- Set all new story passes values to false.',
|
|
111
|
+
'- dependsOn MUST be set for every epic. Use [] for epics with no dependencies.',
|
|
112
|
+
'- The dependsOn values must exactly match the dependency graph agreed upon in Phase 2.',
|
|
113
|
+
'- If an epic can run in parallel with others (no real dependency), its dependsOn should be [] or only include true prerequisites.',
|
|
78
114
|
'- Before writing the final file, summarize the proposed PRD structure and let the user correct anything important.',
|
|
79
115
|
'- Only finish once the PRD has been written, or the user cancels.',
|
|
80
116
|
'',
|
|
@@ -121,7 +157,8 @@ async function initCommand(options = {}) {
|
|
|
121
157
|
const prompt = buildInitPrompt(prdExample, outputPath);
|
|
122
158
|
console.log(chalk_1.default.bold('\nralph-teams init\n'));
|
|
123
159
|
console.log(chalk_1.default.dim(`Starting interactive PRD creator with ${backend}...`));
|
|
124
|
-
console.log(chalk_1.default.dim(`The agent will discuss requirements with you and write ${outputPath}
|
|
160
|
+
console.log(chalk_1.default.dim(`The agent will discuss requirements with you and write ${outputPath}`));
|
|
161
|
+
console.log(chalk_1.default.dim('The agent will discuss design decisions and dependencies before generating.\n'));
|
|
125
162
|
ensureBackendAvailable(backend);
|
|
126
163
|
let child;
|
|
127
164
|
if (backend === 'claude') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,0CA8DC;AAiCD,kCAsDC;AA9KD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAiD;AACjD,kDAA0B;AAM1B,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qBAAqB,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC;KAChD,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,eAAe,CAAC,UAAkB,EAAE,UAAkB;IACpE,OAAO;QACL,+CAA+C;QAC/C,4EAA4E;QAC5E,0GAA0G;QAC1G,iGAAiG;QACjG,EAAE;QACF,sBAAsB;QACtB,EAAE;QACF,qCAAqC;QACrC,2FAA2F;QAC3F,4FAA4F;QAC5F,uDAAuD;QACvD,EAAE;QACF,6CAA6C;QAC7C,2EAA2E;QAC3E,EAAE;QACF,uBAAuB;QACvB,8GAA8G;QAC9G,0DAA0D;QAC1D,sKAAsK;QACtK,EAAE;QACF,mCAAmC;QACnC,0GAA0G;QAC1G,sDAAsD;QACtD,kDAAkD;QAClD,kFAAkF;QAClF,qFAAqF;QACrF,4EAA4E;QAC5E,oEAAoE;QACpE,EAAE;QACF,mCAAmC;QACnC,gHAAgH;QAChH,gFAAgF;QAChF,mHAAmH;QACnH,+DAA+D;QAC/D,qFAAqF;QACrF,0EAA0E;QAC1E,sDAAsD;QACtD,EAAE;QACF,yBAAyB;QACzB,4CAA4C;QAC5C,EAAE;QACF,UAAU;QACV,8BAA8B,UAAU,EAAE;QAC1C,gCAAgC;QAChC,4DAA4D;QAC5D,wDAAwD;QACxD,0EAA0E;QAC1E,gHAAgH;QAChH,gDAAgD;QAChD,4CAA4C;QAC5C,6CAA6C;QAC7C,gFAAgF;QAChF,wFAAwF;QACxF,mIAAmI;QACnI,oHAAoH;QACpH,mEAAmE;QACnE,EAAE;QACF,yBAAyB;QACzB,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAA,yBAAS,EAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,yBAAS,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE;YACpE,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,UAAuB,EAAE;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yCAAyC,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC,CAAC;IAExG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhC,IAAI,KAAK,CAAC;IACV,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,KAAK,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,CAAC,gCAAgC,EAAE,MAAM,CAAC,EAAE;YAClE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,GAAG,IAAA,qBAAK,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;YAClE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,UAAU,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAsDA,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyB5D"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -41,14 +41,53 @@ const fs = __importStar(require("fs"));
|
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
43
|
function colorizeLine(line) {
|
|
44
|
+
// Wave boundaries (highest priority — check before PASS/FAIL substring matches)
|
|
45
|
+
if (/^===\s+Wave\s+\d+/.test(line))
|
|
46
|
+
return chalk_1.default.cyan.bold(line);
|
|
47
|
+
// Merge results
|
|
48
|
+
if (line.includes('MERGE FAILED'))
|
|
49
|
+
return chalk_1.default.red(line);
|
|
50
|
+
if (line.includes('MERGED'))
|
|
51
|
+
return chalk_1.default.blue(line);
|
|
52
|
+
// Pass/fail outcomes
|
|
44
53
|
if (line.includes('PASS'))
|
|
45
54
|
return chalk_1.default.green(line);
|
|
46
55
|
if (line.includes('FAIL'))
|
|
47
56
|
return chalk_1.default.red(line);
|
|
57
|
+
// Section headers
|
|
48
58
|
if (line.startsWith('##'))
|
|
49
59
|
return chalk_1.default.yellow(line);
|
|
50
60
|
return line;
|
|
51
61
|
}
|
|
62
|
+
function splitLogEntries(content) {
|
|
63
|
+
const lines = content.split('\n');
|
|
64
|
+
const waveEntries = [];
|
|
65
|
+
let currentWave = [];
|
|
66
|
+
for (const line of lines) {
|
|
67
|
+
if (/^===\s+Wave\s+\d+/.test(line)) {
|
|
68
|
+
if (currentWave.length > 0) {
|
|
69
|
+
waveEntries.push(currentWave.join('\n').trimEnd());
|
|
70
|
+
}
|
|
71
|
+
currentWave = [line];
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (currentWave.length > 0) {
|
|
75
|
+
currentWave.push(line);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (currentWave.length > 0) {
|
|
79
|
+
waveEntries.push(currentWave.join('\n').trimEnd());
|
|
80
|
+
}
|
|
81
|
+
if (waveEntries.length > 0) {
|
|
82
|
+
return waveEntries;
|
|
83
|
+
}
|
|
84
|
+
const separator = '\n---\n';
|
|
85
|
+
if (content.includes(separator)) {
|
|
86
|
+
return content.split(separator).map((entry) => entry.trim()).filter((entry) => entry !== '');
|
|
87
|
+
}
|
|
88
|
+
const trimmed = content.trim();
|
|
89
|
+
return trimmed === '' ? [] : [trimmed];
|
|
90
|
+
}
|
|
52
91
|
function logsCommand(options) {
|
|
53
92
|
const logPath = path.resolve('./progress.txt');
|
|
54
93
|
if (!fs.existsSync(logPath)) {
|
|
@@ -56,17 +95,16 @@ function logsCommand(options) {
|
|
|
56
95
|
return;
|
|
57
96
|
}
|
|
58
97
|
const content = fs.readFileSync(logPath, 'utf-8');
|
|
59
|
-
|
|
60
|
-
let entries = content.split(separator);
|
|
98
|
+
let output = content;
|
|
61
99
|
if (options.tail !== undefined) {
|
|
62
100
|
const n = parseInt(options.tail, 10);
|
|
63
101
|
if (isNaN(n) || n <= 0) {
|
|
64
102
|
console.error(chalk_1.default.red('Error: --tail must be a positive integer'));
|
|
65
103
|
process.exit(1);
|
|
66
104
|
}
|
|
67
|
-
entries =
|
|
105
|
+
const entries = splitLogEntries(content);
|
|
106
|
+
output = entries.slice(-n).join('\n\n');
|
|
68
107
|
}
|
|
69
|
-
const output = entries.join(separator);
|
|
70
108
|
const lines = output.split('\n');
|
|
71
109
|
for (const line of lines) {
|
|
72
110
|
console.log(colorizeLine(line));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -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,MAAM,eAAe,CAAC;AAG1C,UAAU,OAAO;IACf,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;CACnB;
|
|
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;AAG1C,UAAU,OAAO;IACf,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;CACnB;AAwCD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,GAAE,OAAqB,GAAG,IAAI,CAuE/H"}
|
package/dist/commands/run.js
CHANGED
|
@@ -67,9 +67,16 @@ function isCommandInstalled(cmd, deps) {
|
|
|
67
67
|
const result = deps.spawnSync('command', ['-v', cmd], { shell: true });
|
|
68
68
|
return result.status === 0;
|
|
69
69
|
}
|
|
70
|
+
function parseParallel(parallel) {
|
|
71
|
+
if (!/^\d+$/.test(parallel)) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return parseInt(parallel, 10);
|
|
75
|
+
}
|
|
70
76
|
function runCommand(prdPath, options, deps = defaultDeps) {
|
|
71
77
|
const resolved = path.resolve(prdPath);
|
|
72
78
|
const backend = options.backend || 'claude';
|
|
79
|
+
const parallel = options.parallel;
|
|
73
80
|
if (!deps.existsSync(resolved)) {
|
|
74
81
|
console.error(chalk_1.default.red(`Error: prd.json not found at ${resolved}`));
|
|
75
82
|
console.error(chalk_1.default.dim('Run `ralph-teams init` to create one.'));
|
|
@@ -99,8 +106,30 @@ function runCommand(prdPath, options, deps = defaultDeps) {
|
|
|
99
106
|
}
|
|
100
107
|
console.log(chalk_1.default.dim(`Using PRD: ${resolved}`));
|
|
101
108
|
console.log(chalk_1.default.dim(`Using backend: ${backend}`));
|
|
102
|
-
console.log(chalk_1.default.dim(`Using ralph.sh: ${ralphSh}
|
|
109
|
+
console.log(chalk_1.default.dim(`Using ralph.sh: ${ralphSh}`));
|
|
110
|
+
if (parallel !== undefined) {
|
|
111
|
+
const parallelCount = parseParallel(parallel);
|
|
112
|
+
if (parallelCount === null) {
|
|
113
|
+
console.error(chalk_1.default.red('Error: --parallel must be a whole number'));
|
|
114
|
+
deps.exit(1);
|
|
115
|
+
}
|
|
116
|
+
if (parallelCount <= 0) {
|
|
117
|
+
console.error(chalk_1.default.red('Error: --parallel must be greater than 0'));
|
|
118
|
+
deps.exit(1);
|
|
119
|
+
}
|
|
120
|
+
console.log(chalk_1.default.dim(`Parallel: ${parallelCount} epics per wave\n`));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(chalk_1.default.dim('Mode: sequential\n'));
|
|
124
|
+
}
|
|
103
125
|
const args = [resolved, '--backend', backend];
|
|
126
|
+
if (parallel !== undefined) {
|
|
127
|
+
const parallelCount = parseParallel(parallel);
|
|
128
|
+
if (parallelCount === null || parallelCount <= 0) {
|
|
129
|
+
deps.exit(1);
|
|
130
|
+
}
|
|
131
|
+
args.push('--parallel', String(parallelCount));
|
|
132
|
+
}
|
|
104
133
|
const result = deps.spawnSync(ralphSh, args, {
|
|
105
134
|
stdio: 'inherit',
|
|
106
135
|
shell: false,
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,22 @@
|
|
|
1
|
+
/** A single wave's worth of data parsed from progress.txt */
|
|
2
|
+
export interface WaveInfo {
|
|
3
|
+
waveNumber: number;
|
|
4
|
+
epicIds: string[];
|
|
5
|
+
results: Array<{
|
|
6
|
+
epicId: string;
|
|
7
|
+
outcome: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse wave boundaries and results from progress.txt.
|
|
12
|
+
* Returns an empty array if the file does not exist or contains no wave data.
|
|
13
|
+
*
|
|
14
|
+
* Expected progress.txt format (written by ralph.sh):
|
|
15
|
+
* === Wave N — <date> ===
|
|
16
|
+
* EPIC-XXX
|
|
17
|
+
* EPIC-YYY
|
|
18
|
+
* [EPIC-XXX] OUTCOME — <date>
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseWavesFromProgress(progressPath: string): WaveInfo[];
|
|
1
21
|
export declare function summaryCommand(prdPath: string): void;
|
|
2
22
|
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,EAAE,CA6CvE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAgFpD"}
|