ralphctl 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +21 -9
  2. package/dist/add-GX7P7XTT.mjs +16 -0
  3. package/dist/add-JGUOR4Z5.mjs +18 -0
  4. package/dist/bootstrap-FMHG6DRY.mjs +11 -0
  5. package/dist/chunk-3QBEBKMZ.mjs +103 -0
  6. package/dist/chunk-4GHVNKLV.mjs +5088 -0
  7. package/dist/{chunk-EDJX7TT6.mjs → chunk-57UWLHRH.mjs} +22 -2
  8. package/dist/chunk-747KW2RW.mjs +24 -0
  9. package/dist/chunk-CDOPLXFK.mjs +5485 -0
  10. package/dist/{chunk-7TG3EAQ2.mjs → chunk-CFUVE2BP.mjs} +1 -5
  11. package/dist/{chunk-IB6OCKZW.mjs → chunk-CTP2A436.mjs} +60 -55
  12. package/dist/{chunk-UBPZHHCD.mjs → chunk-D2YGPLIV.mjs} +84 -41
  13. package/dist/{chunk-QBXHAXHI.mjs → chunk-FKMKOWLA.mjs} +154 -208
  14. package/dist/chunk-HL4ZMHCQ.mjs +261 -0
  15. package/dist/{chunk-OEUJDSHY.mjs → chunk-IWXBJD2D.mjs} +1 -1
  16. package/dist/chunk-JXMHLW42.mjs +227 -0
  17. package/dist/{chunk-EUNAUHC3.mjs → chunk-NUYQK5MN.mjs} +80 -29
  18. package/dist/{chunk-JRFOUFD3.mjs → chunk-YCDUVPRT.mjs} +32 -52
  19. package/dist/cli.mjs +168 -3978
  20. package/dist/create-7WFSCMP4.mjs +15 -0
  21. package/dist/{handle-TA4MYNQJ.mjs → handle-BBAZJ44Y.mjs} +2 -2
  22. package/dist/mount-XZPBDRPZ.mjs +6751 -0
  23. package/dist/{project-YONEJICR.mjs → project-2IE7VWDB.mjs} +9 -5
  24. package/dist/prompts/harness-context.md +5 -0
  25. package/dist/prompts/ideate-auto.md +34 -19
  26. package/dist/prompts/ideate.md +21 -4
  27. package/dist/prompts/plan-auto.md +19 -24
  28. package/dist/prompts/plan-common.md +42 -17
  29. package/dist/prompts/plan-interactive.md +16 -21
  30. package/dist/prompts/signals-evaluation.md +6 -0
  31. package/dist/prompts/signals-planning.md +5 -0
  32. package/dist/prompts/signals-task.md +7 -0
  33. package/dist/prompts/sprint-feedback.md +48 -0
  34. package/dist/prompts/task-evaluation-resume.md +27 -13
  35. package/dist/prompts/task-evaluation.md +44 -34
  36. package/dist/prompts/task-execution.md +46 -46
  37. package/dist/prompts/ticket-refine.md +6 -5
  38. package/dist/prompts/validation-checklist.md +14 -0
  39. package/dist/{resolver-RXEY6EJE.mjs → resolver-EOE5WUMV.mjs} +5 -5
  40. package/dist/{sprint-FGLWYWKX.mjs → sprint-OGOFEJJH.mjs} +7 -9
  41. package/dist/start-MMWC7QLI.mjs +17 -0
  42. package/package.json +15 -13
  43. package/dist/add-3T225IX5.mjs +0 -16
  44. package/dist/add-6A5432U2.mjs +0 -16
  45. package/dist/chunk-742XQ7FL.mjs +0 -551
  46. package/dist/chunk-7LZ6GOGN.mjs +0 -53
  47. package/dist/chunk-DUU5346E.mjs +0 -59
  48. package/dist/chunk-U62BX47C.mjs +0 -4231
  49. package/dist/create-MYGOWO2F.mjs +0 -12
  50. package/dist/multiline-OHSNFCRG.mjs +0 -40
  51. package/dist/wizard-HWOH2HPV.mjs +0 -193
  52. package/schemas/config.schema.json +0 -30
  53. package/schemas/ideate-output.schema.json +0 -22
  54. package/schemas/projects.schema.json +0 -58
  55. package/schemas/requirements-output.schema.json +0 -24
  56. package/schemas/sprint.schema.json +0 -109
  57. package/schemas/task-import.schema.json +0 -56
  58. package/schemas/tasks.schema.json +0 -98
package/README.md CHANGED
@@ -99,6 +99,8 @@ Or run `ralphctl` with no arguments for an interactive menu that walks you throu
99
99
  - **Catch mistakes before they compound** — independent AI review after each task, iterating until quality passes or
100
100
  budget is exhausted
101
101
  - **Coordinate across repositories** — one sprint can span multiple repos with automatic dependency tracking
102
+ - **Branch per sprint** — optional shared branch across every affected repo, with `sprint close --create-pr` to open
103
+ pull requests when you're done
102
104
  - **Run tasks in parallel** — one per repo, with rate-limit backoff and automatic session resume
103
105
  - **Separate the what from the how** — AI clarifies requirements first, then generates implementation tasks, with human
104
106
  approval gates
@@ -119,6 +121,15 @@ ralphctl config set provider copilot # Use GitHub Copilot
119
121
 
120
122
  Auto-prompts on first AI command if not set. Both CLIs must be in your PATH and authenticated.
121
123
 
124
+ Tune the generator-evaluator loop:
125
+
126
+ ```bash
127
+ ralphctl config set evaluationIterations 2 # Up to 2 fix attempts per task (default: 1)
128
+ ralphctl config set evaluationIterations 0 # Disable evaluation entirely
129
+ ```
130
+
131
+ `sprint start --no-evaluate` skips evaluation for a single run without touching the global setting.
132
+
122
133
  <details>
123
134
  <summary>Provider differences</summary>
124
135
 
@@ -181,15 +192,16 @@ export RALPHCTL_ROOT="/path/to/custom/data-dir"
181
192
 
182
193
  ### Execution & Monitoring
183
194
 
184
- | Command | Description |
185
- | ------------------------ | --------------------------------- |
186
- | `ralphctl sprint start` | Execute tasks with AI |
187
- | `ralphctl sprint health` | Diagnose blockers and stale tasks |
188
- | `ralphctl status` | Sprint overview with progress bar |
189
- | `ralphctl task list` | List tasks in the current sprint |
190
- | `ralphctl task next` | Show the next unblocked task |
191
- | `ralphctl sprint close` | Close an active sprint |
192
- | `ralphctl sprint delete` | Delete a sprint permanently |
195
+ | Command | Description |
196
+ | -------------------------- | ------------------------------------------------------ |
197
+ | `ralphctl sprint start` | Execute tasks with AI (`--branch` for a sprint branch) |
198
+ | `ralphctl sprint health` | Diagnose blockers and stale tasks |
199
+ | `ralphctl sprint insights` | Analyze evaluator results across tasks |
200
+ | `ralphctl status` | Sprint overview with progress bar |
201
+ | `ralphctl task list` | List tasks in the current sprint |
202
+ | `ralphctl task next` | Show the next unblocked task |
203
+ | `ralphctl sprint close` | Close an active sprint (`--create-pr` for PRs) |
204
+ | `ralphctl sprint delete` | Delete a sprint permanently |
193
205
 
194
206
  Run `ralphctl <command> --help` for details on any command.
195
207
 
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ addCheckScriptToRepository,
4
+ projectAddCommand
5
+ } from "./chunk-D2YGPLIV.mjs";
6
+ import "./chunk-NUYQK5MN.mjs";
7
+ import "./chunk-CFUVE2BP.mjs";
8
+ import "./chunk-747KW2RW.mjs";
9
+ import "./chunk-FKMKOWLA.mjs";
10
+ import "./chunk-IWXBJD2D.mjs";
11
+ import "./chunk-CTP2A436.mjs";
12
+ import "./chunk-57UWLHRH.mjs";
13
+ export {
14
+ addCheckScriptToRepository,
15
+ projectAddCommand
16
+ };
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ addSingleTicketInteractive,
4
+ ticketAddCommand
5
+ } from "./chunk-JXMHLW42.mjs";
6
+ import "./chunk-NUYQK5MN.mjs";
7
+ import "./chunk-HL4ZMHCQ.mjs";
8
+ import "./chunk-CFUVE2BP.mjs";
9
+ import "./chunk-747KW2RW.mjs";
10
+ import "./chunk-YCDUVPRT.mjs";
11
+ import "./chunk-FKMKOWLA.mjs";
12
+ import "./chunk-IWXBJD2D.mjs";
13
+ import "./chunk-CTP2A436.mjs";
14
+ import "./chunk-57UWLHRH.mjs";
15
+ export {
16
+ addSingleTicketInteractive,
17
+ ticketAddCommand
18
+ };
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getPrompt,
4
+ getSharedDeps,
5
+ setSharedDeps
6
+ } from "./chunk-747KW2RW.mjs";
7
+ export {
8
+ getPrompt,
9
+ getSharedDeps,
10
+ setSharedDeps
11
+ };
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ listProjects
4
+ } from "./chunk-NUYQK5MN.mjs";
5
+ import {
6
+ EXIT_ERROR,
7
+ exitWithCode
8
+ } from "./chunk-CFUVE2BP.mjs";
9
+ import {
10
+ getPrompt
11
+ } from "./chunk-747KW2RW.mjs";
12
+ import {
13
+ createSprint,
14
+ setCurrentSprint
15
+ } from "./chunk-YCDUVPRT.mjs";
16
+ import {
17
+ emoji,
18
+ field,
19
+ formatSprintStatus,
20
+ icons,
21
+ showError,
22
+ showNextStep,
23
+ showRandomQuote,
24
+ showSuccess
25
+ } from "./chunk-FKMKOWLA.mjs";
26
+
27
+ // src/integration/cli/commands/sprint/create.ts
28
+ async function sprintCreateCommand(options = {}) {
29
+ const projects = await listProjects();
30
+ if (projects.length === 0) {
31
+ showError("No projects configured.");
32
+ showNextStep("ralphctl project add", "add a project first");
33
+ if (options.interactive === false) exitWithCode(EXIT_ERROR);
34
+ return;
35
+ }
36
+ let projectId;
37
+ const projectFlag = options.project?.trim();
38
+ if (projectFlag) {
39
+ const match = projects.find((p) => p.name === projectFlag || p.id === projectFlag);
40
+ if (!match) {
41
+ showError(`Project not found: ${projectFlag}`);
42
+ if (options.interactive === false) exitWithCode(EXIT_ERROR);
43
+ return;
44
+ }
45
+ projectId = match.id;
46
+ } else if (options.interactive === false) {
47
+ showError("--project is required in non-interactive mode");
48
+ exitWithCode(EXIT_ERROR);
49
+ } else if (projects.length === 1 && projects[0]) {
50
+ projectId = projects[0].id;
51
+ } else {
52
+ projectId = await getPrompt().select({
53
+ message: `${icons.project} Project:`,
54
+ choices: projects.map((p) => ({ label: p.displayName, value: p.id, description: p.description }))
55
+ });
56
+ }
57
+ if (!projectId) {
58
+ showError("No project selected.");
59
+ return;
60
+ }
61
+ const pickedProject = projects.find((p) => p.id === projectId);
62
+ let name;
63
+ if (options.interactive === false) {
64
+ const trimmed = options.name?.trim();
65
+ name = trimmed && trimmed.length > 0 ? trimmed : void 0;
66
+ } else {
67
+ const inputName = await getPrompt().input({
68
+ message: `${icons.sprint} Sprint name (optional):`,
69
+ default: options.name?.trim()
70
+ });
71
+ const trimmed = inputName.trim();
72
+ name = trimmed.length > 0 ? trimmed : void 0;
73
+ }
74
+ const sprint = await createSprint({ projectId, name });
75
+ let setAsCurrent = true;
76
+ if (options.interactive) {
77
+ setAsCurrent = await getPrompt().confirm({
78
+ message: `${emoji.donut} Set as current sprint?`,
79
+ default: true
80
+ });
81
+ }
82
+ if (setAsCurrent) {
83
+ await setCurrentSprint(sprint.id);
84
+ }
85
+ showSuccess("Sprint created!", [
86
+ ["ID", sprint.id],
87
+ ["Name", sprint.name],
88
+ ["Project", pickedProject ? `${pickedProject.displayName} (${pickedProject.name})` : projectId],
89
+ ["Status", formatSprintStatus(sprint.status)]
90
+ ]);
91
+ showRandomQuote();
92
+ if (setAsCurrent) {
93
+ console.log(field("Current", "Yes (this sprint is now active target)"));
94
+ showNextStep("ralphctl ticket add", "add tickets to this sprint");
95
+ } else {
96
+ console.log(field("Current", "No"));
97
+ showNextStep(`ralphctl sprint current ${sprint.id}`, "set as current later");
98
+ }
99
+ }
100
+
101
+ export {
102
+ sprintCreateCommand
103
+ };