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.
- package/README.md +21 -9
- package/dist/add-GX7P7XTT.mjs +16 -0
- package/dist/add-JGUOR4Z5.mjs +18 -0
- package/dist/bootstrap-FMHG6DRY.mjs +11 -0
- package/dist/chunk-3QBEBKMZ.mjs +103 -0
- package/dist/chunk-4GHVNKLV.mjs +5088 -0
- package/dist/{chunk-EDJX7TT6.mjs → chunk-57UWLHRH.mjs} +22 -2
- package/dist/chunk-747KW2RW.mjs +24 -0
- package/dist/chunk-CDOPLXFK.mjs +5485 -0
- package/dist/{chunk-7TG3EAQ2.mjs → chunk-CFUVE2BP.mjs} +1 -5
- package/dist/{chunk-IB6OCKZW.mjs → chunk-CTP2A436.mjs} +60 -55
- package/dist/{chunk-UBPZHHCD.mjs → chunk-D2YGPLIV.mjs} +84 -41
- package/dist/{chunk-QBXHAXHI.mjs → chunk-FKMKOWLA.mjs} +154 -208
- package/dist/chunk-HL4ZMHCQ.mjs +261 -0
- package/dist/{chunk-OEUJDSHY.mjs → chunk-IWXBJD2D.mjs} +1 -1
- package/dist/chunk-JXMHLW42.mjs +227 -0
- package/dist/{chunk-EUNAUHC3.mjs → chunk-NUYQK5MN.mjs} +80 -29
- package/dist/{chunk-JRFOUFD3.mjs → chunk-YCDUVPRT.mjs} +32 -52
- package/dist/cli.mjs +168 -3978
- package/dist/create-7WFSCMP4.mjs +15 -0
- package/dist/{handle-TA4MYNQJ.mjs → handle-BBAZJ44Y.mjs} +2 -2
- package/dist/mount-XZPBDRPZ.mjs +6751 -0
- package/dist/{project-YONEJICR.mjs → project-2IE7VWDB.mjs} +9 -5
- package/dist/prompts/harness-context.md +5 -0
- package/dist/prompts/ideate-auto.md +34 -19
- package/dist/prompts/ideate.md +21 -4
- package/dist/prompts/plan-auto.md +19 -24
- package/dist/prompts/plan-common.md +42 -17
- package/dist/prompts/plan-interactive.md +16 -21
- package/dist/prompts/signals-evaluation.md +6 -0
- package/dist/prompts/signals-planning.md +5 -0
- package/dist/prompts/signals-task.md +7 -0
- package/dist/prompts/sprint-feedback.md +48 -0
- package/dist/prompts/task-evaluation-resume.md +27 -13
- package/dist/prompts/task-evaluation.md +44 -34
- package/dist/prompts/task-execution.md +46 -46
- package/dist/prompts/ticket-refine.md +6 -5
- package/dist/prompts/validation-checklist.md +14 -0
- package/dist/{resolver-RXEY6EJE.mjs → resolver-EOE5WUMV.mjs} +5 -5
- package/dist/{sprint-FGLWYWKX.mjs → sprint-OGOFEJJH.mjs} +7 -9
- package/dist/start-MMWC7QLI.mjs +17 -0
- package/package.json +15 -13
- package/dist/add-3T225IX5.mjs +0 -16
- package/dist/add-6A5432U2.mjs +0 -16
- package/dist/chunk-742XQ7FL.mjs +0 -551
- package/dist/chunk-7LZ6GOGN.mjs +0 -53
- package/dist/chunk-DUU5346E.mjs +0 -59
- package/dist/chunk-U62BX47C.mjs +0 -4231
- package/dist/create-MYGOWO2F.mjs +0 -12
- package/dist/multiline-OHSNFCRG.mjs +0 -40
- package/dist/wizard-HWOH2HPV.mjs +0 -193
- package/schemas/config.schema.json +0 -30
- package/schemas/ideate-output.schema.json +0 -22
- package/schemas/projects.schema.json +0 -58
- package/schemas/requirements-output.schema.json +0 -24
- package/schemas/sprint.schema.json +0 -109
- package/schemas/task-import.schema.json +0 -56
- 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
|
|
185
|
-
|
|
|
186
|
-
| `ralphctl sprint start`
|
|
187
|
-
| `ralphctl sprint health`
|
|
188
|
-
| `ralphctl
|
|
189
|
-
| `ralphctl
|
|
190
|
-
| `ralphctl task
|
|
191
|
-
| `ralphctl
|
|
192
|
-
| `ralphctl sprint
|
|
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,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
|
+
};
|