ralph-teams 0.1.1
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 +450 -0
- package/dist/commands/add-epic.d.ts +2 -0
- package/dist/commands/add-epic.d.ts.map +1 -0
- package/dist/commands/add-epic.js +90 -0
- package/dist/commands/add-epic.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +163 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +75 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/reset.d.ts +2 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +25 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/run.d.ts +14 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +110 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +34 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summary.d.ts +2 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +67 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +210 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/prd-utils.d.ts +33 -0
- package/dist/prd-utils.d.ts.map +1 -0
- package/dist/prd-utils.js +101 -0
- package/dist/prd-utils.js.map +1 -0
- package/package.json +28 -0
- package/prd.json.example +158 -0
- package/ralph.sh +327 -0
package/README.md
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
# ralph-teams
|
|
2
|
+
|
|
3
|
+
`ralph-teams` is a CLI for running Ralph Teams: a shell-based orchestrator that reads a `prd.json`, loops through epics, and spawns AI coding agent teams to implement work story by story.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
The system has two layers:
|
|
8
|
+
|
|
9
|
+
- `ralph.sh` acts as the project manager. It validates the PRD, checks epic dependencies, loops through ready epics, records results, and updates progress files.
|
|
10
|
+
- A backend agent session handles one epic at a time using a small team:
|
|
11
|
+
- `team-lead` coordinates the epic
|
|
12
|
+
- `planner` creates the implementation plan
|
|
13
|
+
- `builder` makes changes and runs tests
|
|
14
|
+
- `validator` verifies the result independently
|
|
15
|
+
|
|
16
|
+
Ralph never writes code itself. It only schedules work, tracks results, and updates project state.
|
|
17
|
+
|
|
18
|
+
Current backends:
|
|
19
|
+
|
|
20
|
+
- `claude` via the `claude` CLI and `.claude/agents/*.md`
|
|
21
|
+
- `copilot` via `gh copilot` and `.github/agents/*.agent.md`
|
|
22
|
+
|
|
23
|
+
## Flow
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
flowchart TB
|
|
27
|
+
U[User runs CLI] --> C[run command]
|
|
28
|
+
C --> S[ralph.sh]
|
|
29
|
+
S --> V[Validate PRD and tools]
|
|
30
|
+
V --> E[Read next epic from PRD]
|
|
31
|
+
E --> B{Epic ready}
|
|
32
|
+
B -->|No| K[Skip epic]
|
|
33
|
+
B -->|Yes| TL
|
|
34
|
+
|
|
35
|
+
subgraph CS[Agent session: team agents for one epic]
|
|
36
|
+
direction TB
|
|
37
|
+
TL[Team lead]
|
|
38
|
+
P[Planner creates plan]
|
|
39
|
+
Q{Story already passed}
|
|
40
|
+
BU[Builder implements]
|
|
41
|
+
VA[Validator checks]
|
|
42
|
+
R{Validation passed}
|
|
43
|
+
W[Mark story passed in PRD]
|
|
44
|
+
F[Record failure]
|
|
45
|
+
M{More stories}
|
|
46
|
+
RF[Write result file]
|
|
47
|
+
|
|
48
|
+
TL --> P
|
|
49
|
+
P --> Q
|
|
50
|
+
Q -->|Yes| M
|
|
51
|
+
Q -->|No| BU
|
|
52
|
+
BU --> VA
|
|
53
|
+
VA --> R
|
|
54
|
+
R -->|Yes| W
|
|
55
|
+
R -->|Retry left| BU
|
|
56
|
+
R -->|No retry left| F
|
|
57
|
+
W --> M
|
|
58
|
+
F --> M
|
|
59
|
+
M -->|Yes| Q
|
|
60
|
+
M -->|No| RF
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
K --> ME{More epics}
|
|
64
|
+
RF --> P2[Update epic status]
|
|
65
|
+
P2 --> L[Append progress log]
|
|
66
|
+
L --> ME
|
|
67
|
+
ME -->|Yes| E
|
|
68
|
+
ME -->|No| D[Finish run]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Requirements
|
|
72
|
+
|
|
73
|
+
- Node.js 18+
|
|
74
|
+
- `jq` in `PATH`
|
|
75
|
+
- Git available if you want Ralph to switch/create the target branch
|
|
76
|
+
|
|
77
|
+
Backend-specific requirements:
|
|
78
|
+
|
|
79
|
+
- Claude backend:
|
|
80
|
+
- `claude` CLI in `PATH`
|
|
81
|
+
- Copilot backend:
|
|
82
|
+
- `gh` CLI in `PATH`
|
|
83
|
+
- GitHub Copilot CLI available through `gh copilot`
|
|
84
|
+
|
|
85
|
+
Install `jq` on macOS:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
brew install jq
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Install
|
|
92
|
+
|
|
93
|
+
Install globally:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm install -g ralph-teams
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Or use it locally from this repo:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
npm install
|
|
103
|
+
npm run build
|
|
104
|
+
npm link
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Then verify:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
ralph-teams --help
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Quick Start
|
|
114
|
+
|
|
115
|
+
1. Create a PRD:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
ralph-teams init
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
2. Validate it:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
ralph-teams validate
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
3. Inspect the planned work:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
ralph-teams summary
|
|
131
|
+
ralph-teams status
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
4. Run Ralph:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
ralph-teams run
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
5. Check progress:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
ralph-teams logs
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Run `ralph.sh` directly when you want to choose a backend:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
./ralph.sh prd.json --backend claude
|
|
150
|
+
./ralph.sh prd.json --backend copilot
|
|
151
|
+
./ralph.sh prd.json --backend copilot --max-epics 1
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Commands
|
|
155
|
+
|
|
156
|
+
### `ralph-teams init`
|
|
157
|
+
|
|
158
|
+
Creates a new `prd.json` interactively in the current directory by launching an AI PRD-creator session.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
ralph-teams init
|
|
162
|
+
ralph-teams init --backend claude
|
|
163
|
+
ralph-teams init --backend copilot
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Flow:
|
|
167
|
+
|
|
168
|
+
1. `init` launches an interactive agent session
|
|
169
|
+
2. the agent discusses the product with you directly
|
|
170
|
+
3. the agent asks follow-up questions until the requirements are clear
|
|
171
|
+
4. the agent generates the full `prd.json` with project metadata, epics, and user stories
|
|
172
|
+
5. the agent writes `./prd.json`
|
|
173
|
+
|
|
174
|
+
Notes:
|
|
175
|
+
|
|
176
|
+
- `init` is grounded by `prd.json.example`
|
|
177
|
+
- the agent generates epics and user stories automatically
|
|
178
|
+
- the agent should aim for about 5 user stories per epic when the scope supports it
|
|
179
|
+
- `--backend` controls whether the interview/generation uses `claude` or `copilot`
|
|
180
|
+
- the discussion itself is handled by the agent, not by a hardcoded questionnaire in the CLI
|
|
181
|
+
|
|
182
|
+
### `ralph-teams run [path]`
|
|
183
|
+
|
|
184
|
+
Runs Ralph against a PRD file. Default path is `./prd.json`.
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
ralph-teams run
|
|
188
|
+
ralph-teams run ./my-prd.json
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Behavior:
|
|
192
|
+
|
|
193
|
+
- validates that the default backend dependencies, `jq`, and the PRD are available
|
|
194
|
+
- locates bundled `ralph.sh`
|
|
195
|
+
- streams Ralph output directly to the terminal
|
|
196
|
+
- exits with Ralph's exit code
|
|
197
|
+
|
|
198
|
+
Notes:
|
|
199
|
+
|
|
200
|
+
- the CLI currently runs `ralph.sh` with its default backend
|
|
201
|
+
- if you want to force `claude` or `copilot`, run `ralph.sh` directly with `--backend`
|
|
202
|
+
|
|
203
|
+
### `ralph-teams status [path]`
|
|
204
|
+
|
|
205
|
+
Shows epic and story pass/fail state from a PRD.
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
ralph-teams status
|
|
209
|
+
ralph-teams status ./my-prd.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### `ralph-teams logs [--tail N]`
|
|
213
|
+
|
|
214
|
+
Shows `progress.txt` with light colorization.
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
ralph-teams logs
|
|
218
|
+
ralph-teams logs --tail 20
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### `ralph-teams reset <epicId> [path]`
|
|
222
|
+
|
|
223
|
+
Resets one epic to `pending` and sets all of its stories back to `passes: false`.
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
ralph-teams reset EPIC-002
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### `ralph-teams add-epic [path]`
|
|
230
|
+
|
|
231
|
+
Interactively appends a new epic to an existing PRD.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
ralph-teams add-epic
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
This command:
|
|
238
|
+
|
|
239
|
+
- creates the next `EPIC-###` id
|
|
240
|
+
- creates globally unique `US-###` ids across the PRD
|
|
241
|
+
- lets you choose dependencies from existing epics
|
|
242
|
+
|
|
243
|
+
### `ralph-teams validate [path]`
|
|
244
|
+
|
|
245
|
+
Validates PRD structure and dependency integrity.
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
ralph-teams validate
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Checks include:
|
|
252
|
+
|
|
253
|
+
- required fields
|
|
254
|
+
- valid epic status values
|
|
255
|
+
- duplicate epic IDs
|
|
256
|
+
- duplicate story IDs
|
|
257
|
+
- unknown `dependsOn` references
|
|
258
|
+
- circular epic dependencies
|
|
259
|
+
|
|
260
|
+
### `ralph-teams summary [path]`
|
|
261
|
+
|
|
262
|
+
Prints a dependency-oriented overview of epics.
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
ralph-teams summary
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Shows:
|
|
269
|
+
|
|
270
|
+
- dependency arrows
|
|
271
|
+
- epic status
|
|
272
|
+
- story pass counts
|
|
273
|
+
- blocked epics
|
|
274
|
+
|
|
275
|
+
## Backends
|
|
276
|
+
|
|
277
|
+
### Claude Backend
|
|
278
|
+
|
|
279
|
+
Uses:
|
|
280
|
+
|
|
281
|
+
- `claude` CLI
|
|
282
|
+
- `.claude/agents/`
|
|
283
|
+
- structured JSON streaming from the Claude CLI
|
|
284
|
+
|
|
285
|
+
Example:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
./ralph.sh prd.json --backend claude
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Copilot Backend
|
|
292
|
+
|
|
293
|
+
Uses:
|
|
294
|
+
|
|
295
|
+
- `gh copilot`
|
|
296
|
+
- `.github/agents/`
|
|
297
|
+
- PTY-backed execution so live Copilot output is visible during runs
|
|
298
|
+
|
|
299
|
+
Example:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
./ralph.sh prd.json --backend copilot
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Notes:
|
|
306
|
+
|
|
307
|
+
- Copilot live output is routed through a PTY wrapper in `ralph.sh`
|
|
308
|
+
- without the PTY wrapper, `gh copilot` may not show incremental output in pipe mode
|
|
309
|
+
|
|
310
|
+
## PRD Format
|
|
311
|
+
|
|
312
|
+
Example:
|
|
313
|
+
|
|
314
|
+
```json
|
|
315
|
+
{
|
|
316
|
+
"project": "MyApp",
|
|
317
|
+
"branchName": "ralph/my-feature",
|
|
318
|
+
"description": "Short description of the project",
|
|
319
|
+
"epics": [
|
|
320
|
+
{
|
|
321
|
+
"id": "EPIC-001",
|
|
322
|
+
"title": "Authentication",
|
|
323
|
+
"description": "Add login and session handling",
|
|
324
|
+
"status": "pending",
|
|
325
|
+
"dependsOn": [],
|
|
326
|
+
"userStories": [
|
|
327
|
+
{
|
|
328
|
+
"id": "US-001",
|
|
329
|
+
"title": "Login form",
|
|
330
|
+
"description": "As a user, I want to sign in",
|
|
331
|
+
"acceptanceCriteria": [
|
|
332
|
+
"User can submit email and password",
|
|
333
|
+
"Validation errors are shown clearly"
|
|
334
|
+
],
|
|
335
|
+
"priority": 1,
|
|
336
|
+
"passes": false
|
|
337
|
+
}
|
|
338
|
+
]
|
|
339
|
+
}
|
|
340
|
+
]
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Important fields:
|
|
345
|
+
|
|
346
|
+
- `epics[].status`: `pending` | `completed` | `partial` | `failed`
|
|
347
|
+
- `epics[].dependsOn`: epic IDs that must be completed first
|
|
348
|
+
- `userStories[].passes`: whether the story is currently marked as passing
|
|
349
|
+
|
|
350
|
+
Authoring guideline:
|
|
351
|
+
|
|
352
|
+
- aim for about 5 user stories per epic when the scope can be split cleanly
|
|
353
|
+
- use fewer only when the epic is genuinely small or further splitting would be artificial
|
|
354
|
+
|
|
355
|
+
The `init` command uses `prd.json.example` as schema and style guidance when generating a new PRD.
|
|
356
|
+
|
|
357
|
+
## Files Ralph Produces
|
|
358
|
+
|
|
359
|
+
During a run, Ralph writes:
|
|
360
|
+
|
|
361
|
+
- `progress.txt`: high-level run log
|
|
362
|
+
- `plans/plan-EPIC-xxx.md`: planner output for an epic
|
|
363
|
+
- `results/result-EPIC-xxx.txt`: final pass/partial/fail result per epic
|
|
364
|
+
- `logs/epic-EPIC-xxx-<timestamp>.log`: raw Claude session log
|
|
365
|
+
|
|
366
|
+
Ralph also updates the original `prd.json` in place as story and epic state changes.
|
|
367
|
+
|
|
368
|
+
The team lead agent log for each epic is written to `logs/` regardless of backend.
|
|
369
|
+
|
|
370
|
+
## Runtime Rules
|
|
371
|
+
|
|
372
|
+
The current execution contract is:
|
|
373
|
+
|
|
374
|
+
- Ralph loops through epics in PRD order
|
|
375
|
+
- blocked epics are skipped until dependencies are complete
|
|
376
|
+
- the backend team processes one epic per session
|
|
377
|
+
- stories run sequentially inside that epic
|
|
378
|
+
- already-passed stories are skipped
|
|
379
|
+
- each story gets at most two build/validate cycles
|
|
380
|
+
- the validator checks output independently from the builder's reasoning
|
|
381
|
+
|
|
382
|
+
## Troubleshooting
|
|
383
|
+
|
|
384
|
+
### `zsh: command not found: ralph-teams`
|
|
385
|
+
|
|
386
|
+
Install or relink the package:
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
npm install -g ralph-teams
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
Or from this repo:
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
npm link
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### `Error: 'claude' CLI not found`
|
|
399
|
+
|
|
400
|
+
Install Claude Code and ensure `claude` is on your `PATH`.
|
|
401
|
+
|
|
402
|
+
### `Error: 'gh' CLI not found`
|
|
403
|
+
|
|
404
|
+
Install GitHub CLI and ensure `gh` is on your `PATH`.
|
|
405
|
+
|
|
406
|
+
### `Error: GitHub Copilot CLI not available`
|
|
407
|
+
|
|
408
|
+
Make sure `gh copilot` is installed and working:
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
gh copilot -- --version
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Copilot backend runs but shows no live output
|
|
415
|
+
|
|
416
|
+
This repo runs Copilot through a PTY wrapper in `ralph.sh` because plain pipe mode does not reliably stream visible output from `gh copilot`.
|
|
417
|
+
|
|
418
|
+
If output still looks stuck, test the backend directly:
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
./ralph.sh prd.json --backend copilot --max-epics 1
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
If that still does not stream, the issue is likely in the local `gh copilot` environment rather than the CLI wrapper.
|
|
425
|
+
|
|
426
|
+
Install Claude Code and ensure `claude` is on your `PATH`.
|
|
427
|
+
|
|
428
|
+
### `Error: 'jq' not found`
|
|
429
|
+
|
|
430
|
+
Install `jq`:
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
brew install jq
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### Ralph cannot switch branches
|
|
437
|
+
|
|
438
|
+
`ralph.sh` refuses to switch branches if the worktree is dirty. Commit or stash your changes first.
|
|
439
|
+
|
|
440
|
+
## Development
|
|
441
|
+
|
|
442
|
+
Useful commands in this repo:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
npm run build
|
|
446
|
+
npm run typecheck
|
|
447
|
+
npm link
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
The packaged CLI entrypoint is `dist/index.js`, and the runtime orchestrator is `ralph.sh`.
|
|
@@ -0,0 +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,CA6FnE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addEpicCommand = addEpicCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const prd_utils_1 = require("../prd-utils");
|
|
9
|
+
async function addEpicCommand(prdPath) {
|
|
10
|
+
const { prd, resolved } = (0, prd_utils_1.loadPrd)(prdPath);
|
|
11
|
+
const rl = (0, prd_utils_1.createRl)();
|
|
12
|
+
// Auto-generate next epic ID
|
|
13
|
+
let maxEpicNum = 0;
|
|
14
|
+
for (const epic of prd.epics) {
|
|
15
|
+
const match = epic.id.match(/^EPIC-(\d+)$/);
|
|
16
|
+
if (match) {
|
|
17
|
+
const num = parseInt(match[1], 10);
|
|
18
|
+
if (num > maxEpicNum)
|
|
19
|
+
maxEpicNum = num;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const epicId = `EPIC-${String(maxEpicNum + 1).padStart(3, '0')}`;
|
|
23
|
+
// Auto-generate next story ID (scan ALL epics globally)
|
|
24
|
+
let maxStoryNum = 0;
|
|
25
|
+
for (const epic of prd.epics) {
|
|
26
|
+
for (const story of epic.userStories) {
|
|
27
|
+
const match = story.id.match(/^US-(\d+)$/);
|
|
28
|
+
if (match) {
|
|
29
|
+
const num = parseInt(match[1], 10);
|
|
30
|
+
if (num > maxStoryNum)
|
|
31
|
+
maxStoryNum = num;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk_1.default.bold(`\nAdding epic ${epicId}\n`));
|
|
36
|
+
const epicTitle = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan('Epic title: '));
|
|
37
|
+
const epicDescription = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan('Epic description: '));
|
|
38
|
+
// Show existing epics for dependency selection
|
|
39
|
+
let dependsOn = [];
|
|
40
|
+
if (prd.epics.length > 0) {
|
|
41
|
+
console.log(chalk_1.default.dim('\nExisting epics:'));
|
|
42
|
+
for (const e of prd.epics) {
|
|
43
|
+
console.log(chalk_1.default.dim(` ${e.id}: ${e.title}`));
|
|
44
|
+
}
|
|
45
|
+
const depsInput = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan('\nDependencies (comma-separated epic IDs, or Enter for none): '));
|
|
46
|
+
if (depsInput.trim() !== '') {
|
|
47
|
+
dependsOn = depsInput.split(',').map(d => d.trim()).filter(d => d !== '');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Collect user stories
|
|
51
|
+
const userStories = [];
|
|
52
|
+
let storyIndex = maxStoryNum + 1;
|
|
53
|
+
console.log(chalk_1.default.bold('\nAdd user stories to this epic.\n'));
|
|
54
|
+
console.log(chalk_1.default.dim('Target about 5 user stories for an epic when the scope supports it.\n'));
|
|
55
|
+
while (true) {
|
|
56
|
+
const storyId = `US-${String(storyIndex).padStart(3, '0')}`;
|
|
57
|
+
console.log(chalk_1.default.bold(`Story ${storyId}:`));
|
|
58
|
+
const storyTitle = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan(' Title: '));
|
|
59
|
+
const storyDescription = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan(' Description: '));
|
|
60
|
+
const criteria = await (0, prd_utils_1.askMultiline)(rl, chalk_1.default.cyan(' Acceptance criteria'));
|
|
61
|
+
userStories.push({
|
|
62
|
+
id: storyId,
|
|
63
|
+
title: storyTitle,
|
|
64
|
+
description: storyDescription,
|
|
65
|
+
acceptanceCriteria: criteria,
|
|
66
|
+
priority: userStories.length + 1,
|
|
67
|
+
passes: false,
|
|
68
|
+
});
|
|
69
|
+
storyIndex++;
|
|
70
|
+
const another = await (0, prd_utils_1.ask)(rl, chalk_1.default.cyan('\nAdd another story? (y/n): '));
|
|
71
|
+
if (another.toLowerCase() !== 'y')
|
|
72
|
+
break;
|
|
73
|
+
console.log('');
|
|
74
|
+
}
|
|
75
|
+
const newEpic = {
|
|
76
|
+
id: epicId,
|
|
77
|
+
title: epicTitle,
|
|
78
|
+
description: epicDescription,
|
|
79
|
+
status: 'pending',
|
|
80
|
+
dependsOn,
|
|
81
|
+
userStories,
|
|
82
|
+
};
|
|
83
|
+
prd.epics.push(newEpic);
|
|
84
|
+
(0, prd_utils_1.savePrd)(resolved, prd);
|
|
85
|
+
rl.close();
|
|
86
|
+
console.log(chalk_1.default.green(`\nAdded ${epicId}: ${epicTitle}`));
|
|
87
|
+
console.log(chalk_1.default.dim(` ${userStories.length} stories added`));
|
|
88
|
+
console.log(chalk_1.default.dim(` Saved to ${resolved}\n`));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=add-epic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-epic.js","sourceRoot":"","sources":["../../src/commands/add-epic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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;AA8ED,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD1E"}
|