ralphctl 0.5.0 → 0.6.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 +29 -16
- package/dist/absolute-path-WUTZQ37D.mjs +8 -0
- package/dist/chunk-6RDMCLWU.mjs +108 -0
- package/dist/chunk-HIU74KTO.mjs +1046 -0
- package/dist/chunk-S3PTDH57.mjs +78 -0
- package/dist/chunk-WV4D2CPG.mjs +26 -0
- package/dist/cli.mjs +22413 -717
- package/dist/manifest.json +24 -0
- package/dist/prompt-adapter-JQICGVX7.mjs +7 -0
- package/dist/prompts/ideate.md +3 -1
- package/dist/prompts/plan-auto.md +23 -8
- package/dist/prompts/plan-common-examples.md +3 -3
- package/dist/prompts/plan-common.md +6 -5
- package/dist/prompts/plan-interactive.md +30 -7
- package/dist/prompts/repo-onboard.md +154 -64
- package/dist/prompts/signals-task.md +3 -0
- package/dist/prompts/sprint-feedback.md +3 -0
- package/dist/prompts/task-evaluation.md +74 -53
- package/dist/prompts/task-execution.md +65 -21
- package/dist/prompts/ticket-refine.md +11 -8
- package/dist/prompts/validation-checklist.md +3 -2
- package/dist/skills/default/abstraction-first/SKILL.md +45 -0
- package/dist/skills/default/alignment/SKILL.md +46 -0
- package/dist/skills/default/iterative-review/SKILL.md +48 -0
- package/dist/skills/exec/.gitkeep +0 -0
- package/dist/skills/plan/.gitkeep +0 -0
- package/dist/skills/refine/.gitkeep +0 -0
- package/dist/storage-paths-IPNZZM5D.mjs +15 -0
- package/dist/validation-error-QT6Q7FYU.mjs +7 -0
- package/package.json +9 -4
- package/dist/add-67UFUI54.mjs +0 -17
- package/dist/add-DVPVHENV.mjs +0 -18
- package/dist/bootstrap-FMHG6DRY.mjs +0 -11
- package/dist/chunk-62HYDA7L.mjs +0 -1128
- package/dist/chunk-747KW2RW.mjs +0 -24
- package/dist/chunk-BSB4EDGR.mjs +0 -260
- package/dist/chunk-BT5FKIZX.mjs +0 -787
- package/dist/chunk-CBMFRQ4Y.mjs +0 -441
- package/dist/chunk-CFUVE2BP.mjs +0 -16
- package/dist/chunk-D6QZNEYN.mjs +0 -5520
- package/dist/chunk-FNAAA32W.mjs +0 -103
- package/dist/chunk-GQ2WFKBN.mjs +0 -269
- package/dist/chunk-IWXBJD2D.mjs +0 -27
- package/dist/chunk-OGEXYSFS.mjs +0 -228
- package/dist/chunk-VAZ3LJBI.mjs +0 -179
- package/dist/chunk-WDMLPXOD.mjs +0 -363
- package/dist/chunk-XN2UIHBY.mjs +0 -589
- package/dist/chunk-ZE2BRQA2.mjs +0 -5542
- package/dist/create-Z635FQKO.mjs +0 -15
- package/dist/handle-23EFF3BE.mjs +0 -22
- package/dist/mount-NCYR22SN.mjs +0 -7434
- package/dist/project-DQHF4ISP.mjs +0 -34
- package/dist/prompts/check-script-discover.md +0 -69
- package/dist/prompts/ideate-auto.md +0 -195
- package/dist/prompts/task-evaluation-resume.md +0 -41
- package/dist/resolver-OVPYVW6Q.mjs +0 -163
- package/dist/sprint-4E26AB5F.mjs +0 -38
- package/dist/start-T34NI3LF.mjs +0 -19
package/README.md
CHANGED
|
@@ -24,6 +24,21 @@ across repositories.**
|
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
+
## Upgrading from 0.5.x to 0.6.0
|
|
28
|
+
|
|
29
|
+
The rewrite changes the on-disk layout under `~/.ralphctl/`. Existing 0.5.x data is **not migrated automatically**.
|
|
30
|
+
Before upgrading:
|
|
31
|
+
|
|
32
|
+
1. Back up your existing data: `mv ~/.ralphctl ~/.ralphctl.0.5-backup`
|
|
33
|
+
2. Install 0.6.0 (`pnpm install ralphctl@0.6.0` or via your package manager)
|
|
34
|
+
3. Run `ralphctl project add` to register your projects in the new layout
|
|
35
|
+
4. (Optional) Re-create sprints from your backup as needed
|
|
36
|
+
|
|
37
|
+
ralphctl will detect a legacy layout on first launch and refuse to start until you back up + reset, with
|
|
38
|
+
instructions printed.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
27
42
|
## Why ralphctl?
|
|
28
43
|
|
|
29
44
|
AI coding agents are powerful but lose context on long tasks, need babysitting when things break, and have no way to
|
|
@@ -49,8 +64,8 @@ ralphctl handles the rest.
|
|
|
49
64
|
with you from specs each task
|
|
50
65
|
```
|
|
51
66
|
|
|
52
|
-
- **Dependency-ordered execution** — tasks run
|
|
53
|
-
|
|
67
|
+
- **Dependency-ordered execution** — tasks run strictly one at a time in topological order; the evaluator's read-only
|
|
68
|
+
`git status` check catches dirty trees so work doesn't compound on a broken state
|
|
54
69
|
- **Generator-evaluator cycle** — an independent AI reviewer checks each task against its spec; if it fails, the
|
|
55
70
|
generator gets feedback and iterates
|
|
56
71
|
- **Context persistence** — sprint state, progress history, and task context survive across sessions; interrupted work
|
|
@@ -103,7 +118,8 @@ ralphctl sprint start
|
|
|
103
118
|
- **Coordinate across repositories** — one sprint can span multiple repos with automatic dependency tracking
|
|
104
119
|
- **Branch per sprint** — optional shared branch across every affected repo, with `sprint close --create-pr` to open
|
|
105
120
|
pull requests when you're done
|
|
106
|
-
- **
|
|
121
|
+
- **Recover from rate limits** — automatic session resume across rate-limit pauses keeps the in-flight task's full
|
|
122
|
+
context when the provider restarts
|
|
107
123
|
- **Separate the what from the how** — AI clarifies requirements first, then generates implementation tasks, with human
|
|
108
124
|
approval gates
|
|
109
125
|
- **Pick up where you left off** — full state persistence across sessions; interrupted work resumes automatically
|
|
@@ -174,14 +190,14 @@ export RALPHCTL_ROOT="/path/to/custom/data-dir"
|
|
|
174
190
|
|
|
175
191
|
### Project & Sprint Setup
|
|
176
192
|
|
|
177
|
-
| Command
|
|
178
|
-
|
|
|
179
|
-
| `ralphctl project add`
|
|
180
|
-
| `ralphctl sprint create`
|
|
181
|
-
| `ralphctl sprint list`
|
|
182
|
-
| `ralphctl sprint show`
|
|
183
|
-
| `ralphctl sprint
|
|
184
|
-
| `ralphctl ticket add`
|
|
193
|
+
| Command | Description |
|
|
194
|
+
| ----------------------------- | -------------------------------- |
|
|
195
|
+
| `ralphctl project add` | Register a project and its repos |
|
|
196
|
+
| `ralphctl sprint create` | Create a new sprint (draft) |
|
|
197
|
+
| `ralphctl sprint list` | List all sprints |
|
|
198
|
+
| `ralphctl sprint show` | Show current sprint details |
|
|
199
|
+
| `ralphctl sprint set-current` | Switch the current sprint |
|
|
200
|
+
| `ralphctl ticket add` | Add a work item to a sprint |
|
|
185
201
|
|
|
186
202
|
### AI-Assisted Planning
|
|
187
203
|
|
|
@@ -197,13 +213,10 @@ export RALPHCTL_ROOT="/path/to/custom/data-dir"
|
|
|
197
213
|
| Command | Description |
|
|
198
214
|
| -------------------------- | ------------------------------------------------------ |
|
|
199
215
|
| `ralphctl sprint start` | Execute tasks with AI (`--branch` for a sprint branch) |
|
|
200
|
-
| `ralphctl sprint
|
|
201
|
-
| `ralphctl sprint insights` | Analyze evaluator results across tasks |
|
|
202
|
-
| `ralphctl status` | Sprint overview with progress bar |
|
|
216
|
+
| `ralphctl sprint progress` | Sprint progress with blocker / stale-task diagnostics |
|
|
203
217
|
| `ralphctl task list` | List tasks in the current sprint |
|
|
204
|
-
| `ralphctl task next` | Show the next unblocked task |
|
|
205
218
|
| `ralphctl sprint close` | Close an active sprint (`--create-pr` for PRs) |
|
|
206
|
-
| `ralphctl sprint
|
|
219
|
+
| `ralphctl sprint remove` | Delete a sprint permanently |
|
|
207
220
|
|
|
208
221
|
Run `ralphctl <command> --help` for details on any command.
|
|
209
222
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
AbsolutePath
|
|
4
|
+
} from "./chunk-S3PTDH57.mjs";
|
|
5
|
+
|
|
6
|
+
// src/integration/persistence/storage-paths.ts
|
|
7
|
+
import { mkdir } from "fs/promises";
|
|
8
|
+
import { homedir } from "os";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
function defaultRoot() {
|
|
11
|
+
const fromEnv = process.env["RALPHCTL_ROOT"];
|
|
12
|
+
if (fromEnv !== void 0 && fromEnv.length > 0) {
|
|
13
|
+
return AbsolutePath.trustString(fromEnv);
|
|
14
|
+
}
|
|
15
|
+
return AbsolutePath.trustString(join(homedir(), ".ralphctl"));
|
|
16
|
+
}
|
|
17
|
+
function asAbsolute(p) {
|
|
18
|
+
return AbsolutePath.trustString(p);
|
|
19
|
+
}
|
|
20
|
+
function resolveStoragePaths(opts = {}) {
|
|
21
|
+
const root = opts.root ?? defaultRoot();
|
|
22
|
+
const configDir = asAbsolute(join(root, "config"));
|
|
23
|
+
const dataDir = asAbsolute(join(root, "data"));
|
|
24
|
+
const sprintsDir = asAbsolute(join(dataDir, "sprints"));
|
|
25
|
+
const cacheDir = asAbsolute(join(root, "cache"));
|
|
26
|
+
const logsDir = asAbsolute(join(root, "logs"));
|
|
27
|
+
const backupsDir = asAbsolute(join(root, "backups"));
|
|
28
|
+
const configFile = asAbsolute(join(configDir, "config.json"));
|
|
29
|
+
const projectsFile = asAbsolute(join(configDir, "projects.json"));
|
|
30
|
+
return {
|
|
31
|
+
root,
|
|
32
|
+
configDir,
|
|
33
|
+
dataDir,
|
|
34
|
+
sprintsDir,
|
|
35
|
+
cacheDir,
|
|
36
|
+
logsDir,
|
|
37
|
+
backupsDir,
|
|
38
|
+
configFile,
|
|
39
|
+
projectsFile,
|
|
40
|
+
sprintDir(id) {
|
|
41
|
+
return asAbsolute(join(sprintsDir, id));
|
|
42
|
+
},
|
|
43
|
+
sprintFile(id) {
|
|
44
|
+
return asAbsolute(join(sprintsDir, id, "sprint.json"));
|
|
45
|
+
},
|
|
46
|
+
tasksFile(id) {
|
|
47
|
+
return asAbsolute(join(sprintsDir, id, "tasks.json"));
|
|
48
|
+
},
|
|
49
|
+
progressFile(id) {
|
|
50
|
+
return asAbsolute(join(sprintsDir, id, "progress.md"));
|
|
51
|
+
},
|
|
52
|
+
requirementsAggregateFile(id) {
|
|
53
|
+
return asAbsolute(join(sprintsDir, id, "requirements.json"));
|
|
54
|
+
},
|
|
55
|
+
feedbackFile(id) {
|
|
56
|
+
return asAbsolute(join(sprintsDir, id, "feedback.md"));
|
|
57
|
+
},
|
|
58
|
+
refinementUnitDir(id, unitSlug) {
|
|
59
|
+
return asAbsolute(join(sprintsDir, id, "refinement", unitSlug));
|
|
60
|
+
},
|
|
61
|
+
ideationUnitDir(id, unitSlug) {
|
|
62
|
+
return asAbsolute(join(sprintsDir, id, "ideation", unitSlug));
|
|
63
|
+
},
|
|
64
|
+
planningDir(id) {
|
|
65
|
+
return asAbsolute(join(sprintsDir, id, "planning"));
|
|
66
|
+
},
|
|
67
|
+
executionUnitDir(id, unitSlug) {
|
|
68
|
+
return asAbsolute(join(sprintsDir, id, "execution", unitSlug));
|
|
69
|
+
},
|
|
70
|
+
doneCriteriaFile(id) {
|
|
71
|
+
return asAbsolute(join(sprintsDir, id, "done-criteria.md"));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function ensureLayoutDirs(paths) {
|
|
76
|
+
const dirs = [
|
|
77
|
+
paths.configDir,
|
|
78
|
+
paths.sprintsDir,
|
|
79
|
+
paths.cacheDir,
|
|
80
|
+
paths.logsDir,
|
|
81
|
+
paths.backupsDir
|
|
82
|
+
];
|
|
83
|
+
await Promise.all(dirs.map((d) => mkdir(d, { recursive: true })));
|
|
84
|
+
}
|
|
85
|
+
var ensuredRoots = /* @__PURE__ */ new Map();
|
|
86
|
+
async function ensureLayoutDirsOnce(paths) {
|
|
87
|
+
const key = paths.root;
|
|
88
|
+
const existing = ensuredRoots.get(key);
|
|
89
|
+
if (existing !== void 0) return existing;
|
|
90
|
+
const pending = ensureLayoutDirs(paths);
|
|
91
|
+
ensuredRoots.set(key, pending);
|
|
92
|
+
try {
|
|
93
|
+
await pending;
|
|
94
|
+
} catch (err) {
|
|
95
|
+
ensuredRoots.delete(key);
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function resetEnsureLayoutDirsCache() {
|
|
100
|
+
ensuredRoots.clear();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
resolveStoragePaths,
|
|
105
|
+
ensureLayoutDirs,
|
|
106
|
+
ensureLayoutDirsOnce,
|
|
107
|
+
resetEnsureLayoutDirsCache
|
|
108
|
+
};
|