ralphctl 0.4.6 → 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.
Files changed (58) hide show
  1. package/README.md +29 -16
  2. package/dist/absolute-path-WUTZQ37D.mjs +8 -0
  3. package/dist/chunk-6RDMCLWU.mjs +108 -0
  4. package/dist/chunk-HIU74KTO.mjs +1046 -0
  5. package/dist/chunk-S3PTDH57.mjs +78 -0
  6. package/dist/chunk-WV4D2CPG.mjs +26 -0
  7. package/dist/cli.mjs +22413 -717
  8. package/dist/manifest.json +24 -0
  9. package/dist/prompt-adapter-JQICGVX7.mjs +7 -0
  10. package/dist/prompts/ideate.md +3 -1
  11. package/dist/prompts/plan-auto.md +23 -8
  12. package/dist/prompts/plan-common-examples.md +3 -3
  13. package/dist/prompts/plan-common.md +6 -5
  14. package/dist/prompts/plan-interactive.md +30 -7
  15. package/dist/prompts/repo-onboard.md +154 -64
  16. package/dist/prompts/signals-task.md +3 -0
  17. package/dist/prompts/sprint-feedback.md +3 -0
  18. package/dist/prompts/task-evaluation.md +74 -53
  19. package/dist/prompts/task-execution.md +65 -21
  20. package/dist/prompts/ticket-refine.md +11 -8
  21. package/dist/prompts/validation-checklist.md +3 -2
  22. package/dist/skills/default/abstraction-first/SKILL.md +45 -0
  23. package/dist/skills/default/alignment/SKILL.md +46 -0
  24. package/dist/skills/default/iterative-review/SKILL.md +48 -0
  25. package/dist/skills/exec/.gitkeep +0 -0
  26. package/dist/skills/plan/.gitkeep +0 -0
  27. package/dist/skills/refine/.gitkeep +0 -0
  28. package/dist/storage-paths-IPNZZM5D.mjs +15 -0
  29. package/dist/validation-error-QT6Q7FYU.mjs +7 -0
  30. package/package.json +9 -4
  31. package/dist/add-DVPVHENV.mjs +0 -18
  32. package/dist/add-YVXM34RP.mjs +0 -17
  33. package/dist/bootstrap-FMHG6DRY.mjs +0 -11
  34. package/dist/chunk-747KW2RW.mjs +0 -24
  35. package/dist/chunk-B3RCOHW3.mjs +0 -5519
  36. package/dist/chunk-BSB4EDGR.mjs +0 -260
  37. package/dist/chunk-CBMFRQ4Y.mjs +0 -441
  38. package/dist/chunk-CFUVE2BP.mjs +0 -16
  39. package/dist/chunk-FNAAA32W.mjs +0 -103
  40. package/dist/chunk-GQ2WFKBN.mjs +0 -269
  41. package/dist/chunk-IWXBJD2D.mjs +0 -27
  42. package/dist/chunk-O566EEDL.mjs +0 -5542
  43. package/dist/chunk-OGEXYSFS.mjs +0 -228
  44. package/dist/chunk-PYZEQ2VK.mjs +0 -787
  45. package/dist/chunk-VAZ3LJBI.mjs +0 -179
  46. package/dist/chunk-WDMLPXOD.mjs +0 -363
  47. package/dist/chunk-XN2UIHBY.mjs +0 -589
  48. package/dist/chunk-ZLWSPLWI.mjs +0 -1117
  49. package/dist/create-Z635FQKO.mjs +0 -15
  50. package/dist/handle-23EFF3BE.mjs +0 -22
  51. package/dist/mount-B3MLHNVY.mjs +0 -7434
  52. package/dist/project-DQHF4ISP.mjs +0 -34
  53. package/dist/prompts/check-script-discover.md +0 -69
  54. package/dist/prompts/ideate-auto.md +0 -195
  55. package/dist/prompts/task-evaluation-resume.md +0 -41
  56. package/dist/resolver-OVPYVW6Q.mjs +0 -163
  57. package/dist/sprint-4E26AB5F.mjs +0 -38
  58. package/dist/start-FP7MVN5P.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 in the right sequence, one per repo at a time, with parallel execution
53
- where possible
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
- - **Run tasks in parallel** — one per repo, with rate-limit backoff and automatic session resume
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 | Description |
178
- | ------------------------ | -------------------------------- |
179
- | `ralphctl project add` | Register a project and its repos |
180
- | `ralphctl sprint create` | Create a new sprint (draft) |
181
- | `ralphctl sprint list` | List all sprints |
182
- | `ralphctl sprint show` | Show current sprint details |
183
- | `ralphctl sprint switch` | Quick sprint switcher |
184
- | `ralphctl ticket add` | Add a work item to a sprint |
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 health` | Diagnose blockers and stale tasks |
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 delete` | Delete a sprint permanently |
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,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ AbsolutePath
4
+ } from "./chunk-S3PTDH57.mjs";
5
+ import "./chunk-WV4D2CPG.mjs";
6
+ export {
7
+ AbsolutePath
8
+ };
@@ -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
+ };