ralphctl 0.8.6 → 0.9.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 +79 -55
- package/dist/cli.mjs +4137 -2538
- package/dist/manifest.json +2 -1
- package/dist/prompts/distill-learnings/template.md +98 -0
- package/dist/prompts/implement/template.md +3 -1
- package/dist/skills/ralphctl-abstraction-first/SKILL.md +1 -0
- package/dist/skills/ralphctl-iterative-review/SKILL.md +1 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/lukas-grigis/ralphctl)
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
|
-
<img src="./.github/assets/home.png" alt="ralphctl
|
|
14
|
+
<img src="./.github/assets/home.png" alt="ralphctl home screen — Ralph donut banner with 'The pointy kitty took it!' tagline, demo project tile, WORK / OBSERVE / SYSTEM menus with keybindings, bottom footer" width="900" />
|
|
15
15
|
</p>
|
|
16
16
|
|
|
17
17
|
**Agent harness for long-running AI coding tasks —
|
|
@@ -22,17 +22,19 @@ with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-c
|
|
|
22
22
|
> _"I'm helping!"_ — Ralph Wiggum
|
|
23
23
|
|
|
24
24
|
> [!NOTE]
|
|
25
|
-
> **Active development.** New features and polish ship regularly.
|
|
26
|
-
>
|
|
27
|
-
>
|
|
28
|
-
>
|
|
25
|
+
> **Active development.** New features and polish ship regularly. **0.9.0** adds
|
|
26
|
+
> opt-in parallel task execution — independent tasks within a dependency wave run
|
|
27
|
+
> concurrently, each in its own git worktree, folded back onto one branch.
|
|
28
|
+
> Upgrades are simple: install the latest version, redo your config, proceed.
|
|
29
|
+
> See [Upgrading](#upgrading) and [CHANGELOG](./CHANGELOG.md).
|
|
29
30
|
|
|
30
31
|
---
|
|
31
32
|
|
|
32
33
|
## What is ralphctl?
|
|
33
34
|
|
|
34
35
|
AI coding agents are powerful but lose context on long tasks, need babysitting when things break, and have no way to
|
|
35
|
-
coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI —
|
|
36
|
+
coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, with GitHub Copilot
|
|
37
|
+
and OpenAI Codex in preview — in a
|
|
36
38
|
structured harness that decomposes your work into dependency-ordered tasks, drives each one through
|
|
37
39
|
a [generator-evaluator loop](https://www.anthropic.com/engineering/harness-design-long-running-apps) that catches issues
|
|
38
40
|
before moving on, and persists context across sessions so nothing gets lost.
|
|
@@ -55,8 +57,9 @@ ralphctl
|
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
That's it. The TUI launches, walks you through registering a project, refining your first ticket, generating a task
|
|
58
|
-
plan, and kicking off implementation. Press
|
|
59
|
-
|
|
60
|
+
plan, and kicking off implementation. Press `+` from the home screen to create a new sprint, press `n` to start a
|
|
61
|
+
flow (refine / plan / implement / readiness / …), or open the Sprints submenu and follow its on-screen hint to pick
|
|
62
|
+
or create a sprint. No commands to memorize.
|
|
60
63
|
|
|
61
64
|
**Requirements:** [Node.js](https://nodejs.org/) ≥ 24, [Git](https://git-scm.com/), and one supported AI CLI in `PATH`
|
|
62
65
|
and authenticated.
|
|
@@ -93,15 +96,11 @@ ralphctl export-context --sprint <id> --project <id> --output <path>
|
|
|
93
96
|
# Settings
|
|
94
97
|
ralphctl settings show
|
|
95
98
|
ralphctl settings apply-preset claude-only # or mixed / copilot-only / codex-only
|
|
96
|
-
ralphctl settings set ai.implement.provider claude-code
|
|
97
|
-
ralphctl settings set ai.implement.model
|
|
98
|
-
ralphctl settings set ai.implement.effort
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
ralphctl sprint regenerate-progress <sprint-id>
|
|
102
|
-
|
|
103
|
-
# Single-frame text digest of the active sprint
|
|
104
|
-
ralphctl snapshot [--sprint <id>]
|
|
99
|
+
ralphctl settings set ai.implement.generator.provider claude-code
|
|
100
|
+
ralphctl settings set ai.implement.generator.model <model-id>
|
|
101
|
+
ralphctl settings set ai.implement.generator.effort high
|
|
102
|
+
ralphctl settings set ai.implement.evaluator.provider openai-codex
|
|
103
|
+
ralphctl settings set ai.implement.evaluator.model <model-id>
|
|
105
104
|
```
|
|
106
105
|
|
|
107
106
|
</details>
|
|
@@ -125,18 +124,20 @@ ralphctl snapshot [--sprint <id>]
|
|
|
125
124
|
|
|
126
125
|
**Refine** is implementation-agnostic: the AI clarifies requirements with you, ticket by ticket, and flips each one from
|
|
127
126
|
`pending` to `approved`. **Plan** requires every ticket approved — the AI explores the affected repos and generates a
|
|
128
|
-
dependency-ordered task graph. **Implement** drives those tasks
|
|
129
|
-
second AI pass reviews each task against its spec before the harness marks it done and moves
|
|
127
|
+
dependency-ordered task graph. **Implement** drives those tasks in dependency order through a generator-evaluator cycle:
|
|
128
|
+
a second AI pass reviews each task against its spec before the harness marks it done and moves on. Independent tasks in
|
|
129
|
+
the same dependency wave can run in parallel (opt-in) when you want a sprint to finish faster.
|
|
130
130
|
|
|
131
131
|
Key properties:
|
|
132
132
|
|
|
133
|
-
- **Dependency-ordered execution** — tasks run
|
|
134
|
-
|
|
133
|
+
- **Dependency-ordered execution** — tasks run in topological order; no task starts until its blockers are done.
|
|
134
|
+
Opt-in parallelism (`concurrency.maxParallelTasks` > 1) runs independent tasks within a dependency wave concurrently,
|
|
135
|
+
each in its own git worktree folded onto one branch — default stays serial
|
|
135
136
|
- **Generator-evaluator cycle** — an independent AI reviewer checks each task; if it fails, the generator gets the
|
|
136
137
|
critique and iterates (up to `harness.maxAttempts` tries before the task is flagged `blocked`)
|
|
137
138
|
- **Context persistence** — sprint state, branch, progress history, and per-task context survive across sessions;
|
|
138
139
|
interrupted runs resume automatically
|
|
139
|
-
- **Multi-repo support** — one sprint can span several repositories with per-repo setup and
|
|
140
|
+
- **Multi-repo support** — one sprint can span several repositories with per-repo setup and verify scripts
|
|
140
141
|
|
|
141
142
|
For the full architectural picture see [`.claude/docs/ARCHITECTURE.md`](./.claude/docs/ARCHITECTURE.md) and [
|
|
142
143
|
`.claude/docs/REQUIREMENTS.md`](./.claude/docs/REQUIREMENTS.md).
|
|
@@ -148,17 +149,19 @@ For the full architectural picture see [`.claude/docs/ARCHITECTURE.md`](./.claud
|
|
|
148
149
|
> [!IMPORTANT]
|
|
149
150
|
> Not all three AI providers are equally production-ready inside ralphctl.
|
|
150
151
|
|
|
151
|
-
| Provider | Status
|
|
152
|
-
| ----------------------------------------- |
|
|
153
|
-
| **Claude Code** (`claude-code`) | **Stable — primary verified provider**
|
|
154
|
-
| **GitHub Copilot CLI** (`github-copilot`) | Preview — not
|
|
155
|
-
| **OpenAI Codex** (`openai-codex`) | Preview — not
|
|
152
|
+
| Provider | Status | Headless flag | Native context file |
|
|
153
|
+
| ----------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------- | --------------------------------- |
|
|
154
|
+
| **Claude Code** (`claude-code`) | **Stable — primary verified provider** | `--permission-mode bypassPermissions` + per-tool deny list | `CLAUDE.md` at repo root |
|
|
155
|
+
| **GitHub Copilot CLI** (`github-copilot`) | Preview — maturing; works well day-to-day, not yet formally verified end-to-end | `--autopilot --allow-all` + `--max-autopilot-continues=200` | `.github/copilot-instructions.md` |
|
|
156
|
+
| **OpenAI Codex** (`openai-codex`) | Preview — maturing; works well day-to-day, not yet formally verified end-to-end | `-s workspace-write` (topology-scoped) | `AGENTS.md` |
|
|
156
157
|
|
|
157
|
-
"Preview" means the integration
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
"Preview" means the integration is in active use and increasingly solid — recent releases run Copilot and Codex well
|
|
159
|
+
across the everyday flows — but harness behaviour against them hasn't been put through the same formal end-to-end
|
|
160
|
+
verification as Claude Code. A couple of features still no-op on them (bundled skill injection, `bodyFile` forensic
|
|
161
|
+
artifacts), and Codex can't fine-grained-deny edits on existing repo files — its sandbox modes are binary, so path
|
|
162
|
+
scope (cwd + `--add-dir`) is the only safety envelope. Parallel execution is provider-agnostic: it works with whichever
|
|
163
|
+
provider each implement role is configured to use, under the same per-provider caveats. If you hit a rough edge on a
|
|
164
|
+
preview provider, please [open an issue](https://github.com/lukas-grigis/ralphctl/issues).
|
|
162
165
|
|
|
163
166
|
One-shot configuration for any provider: `ralphctl settings apply-preset <name>` where `<name>` is
|
|
164
167
|
`mixed`, `claude-only`, `copilot-only`, or `codex-only`.
|
|
@@ -171,6 +174,8 @@ One-shot configuration for any provider: `ralphctl settings apply-preset <name>`
|
|
|
171
174
|
- **Catch mistakes before they compound** — independent AI review after each task, iterating until quality passes or
|
|
172
175
|
budget is exhausted
|
|
173
176
|
- **Coordinate across repositories** — one sprint can span multiple repos with automatic dependency tracking
|
|
177
|
+
- **Finish sprints faster (opt-in)** — run independent tasks within a dependency wave in parallel, each in its own git
|
|
178
|
+
worktree, folded back onto one sprint branch (still one PR); default stays serial, zero change
|
|
174
179
|
- **Branch per sprint** — optional shared branch across every affected repo; `ralphctl create-pr --sprint <id>` opens a
|
|
175
180
|
PR / MR via `gh` or `glab` when you're done
|
|
176
181
|
- **Recover from rate limits** — exponential backoff and session resume keep the in-flight task's full context when the
|
|
@@ -200,13 +205,15 @@ ralphctl settings apply-preset codex-only # every flow on OpenAI Codex
|
|
|
200
205
|
A preset stamps the entire `ai` section in one shot. None is marked default; on a fresh install the welcome
|
|
201
206
|
view silently auto-seeds a preset based on which provider CLIs it detects on `PATH`.
|
|
202
207
|
|
|
203
|
-
**Per-flow settings.** Each
|
|
204
|
-
`
|
|
208
|
+
**Per-flow settings.** Each flow carries its own `{provider, model, effort?}` row: `refine`, `plan`, `readiness`,
|
|
209
|
+
`ideate`, and `createPr`. The `implement` flow instead splits into a nested `generator` / `evaluator` pair
|
|
210
|
+
(`ai.implement.generator.*` and `ai.implement.evaluator.*`), each its own `{provider, model, effort?}` row. Edit
|
|
211
|
+
individual keys with:
|
|
205
212
|
|
|
206
213
|
```bash
|
|
207
|
-
ralphctl settings set ai.implement.provider claude-code
|
|
208
|
-
ralphctl settings set ai.implement.model <model-id>
|
|
209
|
-
ralphctl settings set ai.implement.effort high
|
|
214
|
+
ralphctl settings set ai.implement.generator.provider claude-code
|
|
215
|
+
ralphctl settings set ai.implement.generator.model <model-id>
|
|
216
|
+
ralphctl settings set ai.implement.generator.effort high
|
|
210
217
|
|
|
211
218
|
ralphctl settings set ai.plan.provider github-copilot
|
|
212
219
|
ralphctl settings set ai.plan.model <model-id>
|
|
@@ -218,11 +225,22 @@ row's CLI at launch and exits with a clear error if the binary is missing.
|
|
|
218
225
|
**Tune the generator-evaluator loop** (under `harness`):
|
|
219
226
|
|
|
220
227
|
```bash
|
|
221
|
-
ralphctl settings set harness.maxAttempts 2 # Cap fix attempts per task (1–10, default
|
|
228
|
+
ralphctl settings set harness.maxAttempts 2 # Cap fix attempts per task (1–10, default 3)
|
|
222
229
|
ralphctl settings set harness.maxTurns 8 # Generator-evaluator turns per attempt (1–10)
|
|
223
230
|
ralphctl settings set harness.rateLimitRetries 3 # Adapter-side 429 retries (0–10)
|
|
224
231
|
```
|
|
225
232
|
|
|
233
|
+
**Run tasks in parallel** (optional — default is serial):
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
ralphctl settings set concurrency.maxParallelTasks 3 # 1–5; 1 = serial (default), >1 = parallel git worktrees
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
When `> 1`, independent tasks within a dependency wave run concurrently — each in its own git worktree, with its own
|
|
240
|
+
`setupScript` run, folded back onto the single sprint branch (still one PR per sprint). A task whose worktree setup
|
|
241
|
+
fails is blocked on its own without stopping its siblings; if two same-wave tasks edit the same file, the second is
|
|
242
|
+
blocked at fold time and a relaunch retries it. Dependencies are always respected — only independent tasks overlap.
|
|
243
|
+
|
|
226
244
|
### Data directory
|
|
227
245
|
|
|
228
246
|
All state lives in `~/.ralphctl/` by default (settings under `config/`, sprints + projects under `data/`, advisory locks
|
|
@@ -234,16 +252,16 @@ export RALPHCTL_HOME="/path/to/custom/dir"
|
|
|
234
252
|
|
|
235
253
|
### Environment variables
|
|
236
254
|
|
|
237
|
-
| Variable | Default | Purpose
|
|
238
|
-
| ---------------------------- | -------------- |
|
|
239
|
-
| `RALPHCTL_HOME` | `~/.ralphctl/` | Override application root (data + config + state)
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
255
|
+
| Variable | Default | Purpose |
|
|
256
|
+
| ---------------------------- | -------------- | ---------------------------------------------------- |
|
|
257
|
+
| `RALPHCTL_HOME` | `~/.ralphctl/` | Override application root (data + config + state) |
|
|
258
|
+
| `RALPHCTL_SKIP_LEGACY_CHECK` | unset | Bypass the v0.6.x legacy-layout detector at boot |
|
|
259
|
+
| `RALPHCTL_NO_TUI` | unset | Suppress implicit interactive prompts in `implement` |
|
|
260
|
+
| `NO_COLOR` | unset | Suppress ANSI colors |
|
|
261
|
+
| `CI` | auto-detected | Suppress implicit interactive prompts in `implement` |
|
|
262
|
+
|
|
263
|
+
Log verbosity is `settings.logging.level` (`silent` / `debug` / `info` / `warn` / `error`, default `info`), set via
|
|
264
|
+
`ralphctl settings set logging.level <level>` or the TUI `Settings` view — not an environment variable.
|
|
247
265
|
|
|
248
266
|
---
|
|
249
267
|
|
|
@@ -288,7 +306,6 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
|
|
|
288
306
|
| `ralphctl settings set <key> <value>` | Set a single settings key |
|
|
289
307
|
| `ralphctl settings apply-preset <name>` | Stamp the entire `ai` section (`mixed` / `claude-only` / `copilot-only` / `codex-only`) |
|
|
290
308
|
| `ralphctl completion <shell>` | Print shell tab-completion script |
|
|
291
|
-
| `ralphctl snapshot [--sprint <id>]` | Single-frame text digest of sprint state |
|
|
292
309
|
|
|
293
310
|
### Project & Sprint Inspection
|
|
294
311
|
|
|
@@ -305,15 +322,15 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
|
|
|
305
322
|
| `ralphctl ticket list / show <id>` | Inspect tickets |
|
|
306
323
|
| `ralphctl ticket remove <id>` | Remove a ticket from a draft sprint |
|
|
307
324
|
| `ralphctl task list / show <id>` | Inspect tasks (planning generates them) |
|
|
325
|
+
| `ralphctl task unblock <id>` | Reset a blocked task to `todo` |
|
|
308
326
|
|
|
309
327
|
### Sprint Lifecycle
|
|
310
328
|
|
|
311
|
-
| Command
|
|
312
|
-
|
|
|
313
|
-
| `ralphctl sprint activate <id>`
|
|
314
|
-
| `ralphctl sprint close <id>`
|
|
315
|
-
| `ralphctl sprint remove <id>`
|
|
316
|
-
| `ralphctl sprint regenerate-progress <id>` | Rebuild `progress.md` from disk state |
|
|
329
|
+
| Command | Description |
|
|
330
|
+
| ------------------------------- | ------------------------------- |
|
|
331
|
+
| `ralphctl sprint activate <id>` | Flip a draft sprint to `active` |
|
|
332
|
+
| `ralphctl sprint close <id>` | Transition `review` → `done` |
|
|
333
|
+
| `ralphctl sprint remove <id>` | Delete a sprint permanently |
|
|
317
334
|
|
|
318
335
|
### Export & PR
|
|
319
336
|
|
|
@@ -323,6 +340,13 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
|
|
|
323
340
|
| `ralphctl export-context --sprint <id> --project <id> --output <path>` | Render harness context (sprint + project + tasks) to markdown |
|
|
324
341
|
| `ralphctl create-pr --sprint <id> [--base <branch>] [--draft]` | Open a PR/MR via `gh` or `glab`, persist the URL on the sprint |
|
|
325
342
|
|
|
343
|
+
### Maintenance
|
|
344
|
+
|
|
345
|
+
| Command | Description |
|
|
346
|
+
| ------------------------------------------------------------------------------------------ | ----------------------------------------------- |
|
|
347
|
+
| `ralphctl runs list [--flow <name>]` | List per-run forensic artifacts grouped by flow |
|
|
348
|
+
| `ralphctl runs prune [--older-than 7d] [--keep-last <n>] [--flow <name>] [--dry-run] [-y]` | Delete per-run forensic artifacts |
|
|
349
|
+
|
|
326
350
|
Run `ralphctl <command> --help` for flag-level detail.
|
|
327
351
|
|
|
328
352
|
</details>
|