ralphctl 0.14.1 → 0.15.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 CHANGED
@@ -5,9 +5,9 @@
5
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-6.0-3178c6?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
6
6
  [![Node.js](https://img.shields.io/badge/node-%E2%89%A5_24-5fa04e?style=flat&logo=nodedotjs&logoColor=white)](https://nodejs.org/)
7
7
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat&logo=git&logoColor=white)](./CONTRIBUTING.md)
8
- [![Claude Code](https://img.shields.io/badge/Claude_Code-stable-191919?style=flat&logo=anthropic&logoColor=white)](https://docs.anthropic.com/en/docs/claude-code)
9
- [![OpenAI Codex](https://img.shields.io/badge/OpenAI_Codex-preview-412991?style=flat&logo=openai&logoColor=white)](https://github.com/openai/codex)
10
- [![GitHub Copilot](https://img.shields.io/badge/GitHub_Copilot-preview-000?style=flat&logo=githubcopilot&logoColor=white)](https://docs.github.com/en/copilot/github-copilot-in-the-cli)
8
+ [![Claude Code](https://img.shields.io/badge/Claude_Code-supported-191919?style=flat&logo=anthropic&logoColor=white)](https://docs.anthropic.com/en/docs/claude-code)
9
+ [![GitHub Copilot CLI](https://img.shields.io/badge/GitHub_Copilot_CLI-supported-000?style=flat&logo=githubcopilot&logoColor=white)](https://docs.github.com/en/copilot/github-copilot-in-the-cli)
10
+ [![OpenAI Codex CLI](https://img.shields.io/badge/OpenAI_Codex_CLI-supported-412991?style=flat&logo=openai&logoColor=white)](https://github.com/openai/codex)
11
11
  [![Built with Donuts](https://img.shields.io/badge/%F0%9F%8D%A9-Built_with_Donuts-ff6f00?style=flat)](https://github.com/lukas-grigis/ralphctl)
12
12
 
13
13
  <p align="center">
@@ -16,17 +16,18 @@
16
16
 
17
17
  # ralphctl
18
18
 
19
- **A ralph harness for long-running AI coding tasks — a hardened ralph loop that
20
- orchestrates [Claude Code](https://docs.anthropic.com/en/docs/claude-code) across repositories,
21
- with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-cli) and
22
- [OpenAI Codex](https://github.com/openai/codex) available in preview.**
19
+ **A ralph harness for long-running AI coding tasks — a hardened ralph loop that drives your coding agent of choice
20
+ ([Claude Code](https://docs.anthropic.com/en/docs/claude-code),
21
+ [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli), or
22
+ [OpenAI Codex CLI](https://github.com/openai/codex)) across one or more repositories.**
23
23
 
24
24
  > _"I'm helping!"_ — Ralph Wiggum
25
25
 
26
26
  > [!NOTE]
27
- > **Active development.** New features and polish ship regularly. The latest release expands the preset
28
- > matrix to 20 presets across five families (`standard`, `economic`, `strong-gate`, `fast`, `frontier`),
29
- > each in `mixed` / `claude-only` / `copilot-only` / `codex-only` variants.
27
+ > **Active development.** New features and polish ship regularly. All three providers — Claude Code,
28
+ > GitHub Copilot CLI, and OpenAI Codex CLI — are supported; pick one per flow or mix them, in one command,
29
+ > from a preset matrix of 20 presets across five families (`standard`, `economic`, `strong-gate`, `fast`,
30
+ > `frontier`), each in `mixed` / `claude-only` / `copilot-only` / `codex-only` variants.
30
31
  > Upgrades are best-effort: install the latest version, redo your config, proceed.
31
32
  > See [Upgrading](#upgrading) and [CHANGELOG](./CHANGELOG.md).
32
33
 
@@ -36,18 +37,20 @@ with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-c
36
37
 
37
38
  The "Ralph" technique comes from Geoffrey Huntley's [Ralph Wiggum as a software engineer](https://ghuntley.com/ralph/):
38
39
  point a coding agent at a task and run it in a loop until the work is done. The bare version
39
- (`while :; do cat PROMPT.md | claude-code; done`) loops blindly — it re-runs the same prompt and hopes each pass lands.
40
+ (`while :; do cat PROMPT.md | claude; done`) loops blindly — it re-runs the same prompt and hopes each pass lands.
40
41
  ralphctl is a ralph harness around that idea: instead of blind repetition it runs a generator-evaluator loop, where one
41
42
  pass writes the change and a second independent pass reviews it against the task spec before the loop advances. Same
42
- loop, with a verification gate on every step.
43
+ loop, with a verification gate on every step. For the wider picture — what an agent harness is, and how the
44
+ plan → generate → evaluate → verify loop turns one-shot prompting into a repeatable workflow — see
45
+ [AI Agent Harnesses: A Field Guide](https://lukasgrigis.dev/blog/guides/agent-harnesses/).
43
46
 
44
47
  ---
45
48
 
46
49
  ## What is ralphctl?
47
50
 
48
51
  AI coding agents are powerful but lose context on long tasks, need babysitting when things break, and have no way to
49
- coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, with GitHub Copilot
50
- and OpenAI Codex in preview — in a
52
+ coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, GitHub Copilot CLI,
53
+ or OpenAI Codex CLI — in a
51
54
  structured harness that decomposes your work into dependency-ordered tasks, drives each one through
52
55
  a [generator-evaluator loop](https://www.anthropic.com/engineering/harness-design-long-running-apps) that catches issues
53
56
  before moving on, and persists context across sessions so nothing gets lost.
@@ -64,8 +67,9 @@ npm install -g ralphctl
64
67
 
65
68
  > Needs [Node.js](https://nodejs.org/) ≥ 24 — `mise use node@24` or `nvm install 24`.
66
69
 
67
- Install [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (or a preview provider — see below) and
68
- authenticate it, then confirm ralphctl can see it:
70
+ Install one of the supported CLIs — [Claude Code](https://docs.anthropic.com/en/docs/claude-code),
71
+ [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli), or
72
+ [OpenAI Codex CLI](https://github.com/openai/codex) — and authenticate it, then confirm ralphctl can see it:
69
73
 
70
74
  ```bash
71
75
  ralphctl doctor # verifies your provider CLI is installed + authenticated — the #1 first-run failure
@@ -99,7 +103,7 @@ ralphctl sprint show <sprint-id>
99
103
  ralphctl sprint progress <sprint-id>
100
104
 
101
105
  # Add / inspect tickets
102
- ralphctl ticket add
106
+ ralphctl ticket add --title "<title>"
103
107
  ralphctl ticket list
104
108
 
105
109
  # Manage sprint state
@@ -131,23 +135,26 @@ ralphctl settings set ai.implement.evaluator.model <model-id>
131
135
  ## How It Works
132
136
 
133
137
  ```
134
- You describe what to build ralphctl handles the rest
135
- ───────────────────────── ─────────────────────────────────
136
- ┌──────────┐ ┌──────────┐ ┌────────┐ ┌──────┐ ┌───────────┐
137
- │ Create │──>│ Add │───────>│ Refine │──>│ Plan │──>│ Implement │
138
- │ Sprint │ │ Tickets │ │ (WHAT) │ │(HOW) │ │ Loop │
139
- └──────────┘ └──────────┘ └────────┘ └──────┘ └───────────┘
140
- │ │ │
141
- AI clarifies AI generates AI implements
142
- requirements task graph + AI reviews
143
- with you from specs each task
138
+ You describe what to build ralphctl drives it to done
139
+ ───────────────────────── ────────────────────────────────────────────
140
+ ┌──────────┐ ┌──────────┐ ┌────────┐ ┌──────┐ ┌───────────┐ ┌────────┐
141
+ │ Create │──>│ Add │───────>│ Refine │──>│ Plan │──>│ Implement │──>│ Review │──> done
142
+ │ Sprint │ │ Tickets │ │ (WHAT) │ │(HOW) │ │ Loop │ │ Loop │
143
+ └──────────┘ └──────────┘ └────────┘ └──────┘ └───────────┘ └────────┘
144
+ │ │ │ │
145
+ AI clarifies AI builds AI implements you steer
146
+ requirements the task + AI reviews revisions,
147
+ with you graph each task close to done
144
148
  ```
145
149
 
146
150
  **Refine** is implementation-agnostic: the AI clarifies requirements with you, ticket by ticket, and flips each one from
147
151
  `pending` to `approved`. **Plan** requires every ticket approved — the AI explores the affected repos and generates a
148
152
  dependency-ordered task graph. **Implement** drives those tasks in dependency order through a generator-evaluator cycle:
149
153
  a second AI pass reviews each task against its spec before the harness marks it done and moves on. Independent tasks in
150
- the same dependency wave can run in parallel (opt-in) when you want a sprint to finish faster.
154
+ the same dependency wave can run in parallel (opt-in) when you want a sprint to finish faster. **Review** closes the
155
+ loop — once every task lands, the sprint enters `review` and you run human-steered feedback rounds: you flag what's off,
156
+ the AI revises, and the sprint flips to `done` when you're satisfied. Opening a PR (`ralphctl create-pr`) is separate
157
+ and optional.
151
158
 
152
159
  Key properties:
153
160
 
@@ -165,24 +172,24 @@ For the full architectural picture see [`.claude/docs/ARCHITECTURE.md`](./.claud
165
172
 
166
173
  ---
167
174
 
168
- ## Provider Status
175
+ ## Providers
169
176
 
170
- > [!IMPORTANT]
171
- > Not all three AI providers are equally production-ready inside ralphctl.
177
+ ralphctl drives three AI coding CLIs. Choose one per flow — or mix them, say plan with one and implement with
178
+ another — through a [preset](#configuration) or per-row settings. All three are supported and in everyday use.
172
179
 
173
- | Provider | Status | Headless flag | Native context file |
174
- | ----------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------- | --------------------------------- |
175
- | **Claude Code** (`claude-code`) | **Stable — primary verified provider** | `--permission-mode bypassPermissions` + per-tool deny list | `CLAUDE.md` at repo root |
176
- | **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` |
177
- | **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` |
180
+ | Provider | CLI | Headless permission mapping | Native context file |
181
+ | ----------------------------------------- | --------- | ----------------------------------------------------------------------------------------------- | --------------------------------- |
182
+ | **Claude Code** (`claude-code`) | `claude` | `--permission-mode bypassPermissions` + per-tool deny list | `CLAUDE.md` at repo root |
183
+ | **GitHub Copilot CLI** (`github-copilot`) | `copilot` | `--autopilot --max-autopilot-continues=200` + `--allow-all` (per-tool deny list when read-only) | `.github/copilot-instructions.md` |
184
+ | **OpenAI Codex CLI** (`openai-codex`) | `codex` | `-s workspace-write` (topology-scoped) | `AGENTS.md` |
178
185
 
179
- "Preview" means the integration is in active use and increasingly solid — recent releases run Copilot and Codex well
180
- across the everyday flows — but harness behaviour against them hasn't been put through the same formal end-to-end
181
- verification as Claude Code. A couple of features still no-op on them (bundled skill injection, `bodyFile` forensic
182
- artifacts), and Codex can't fine-grained-deny edits on existing repo files — its sandbox modes are binary, so path
183
- scope (cwd + `--add-dir`) is the only safety envelope. Parallel execution is provider-agnostic: it works with whichever
184
- provider each implement role is configured to use, under the same per-provider caveats. If you hit a rough edge on a
185
- preview provider, please [open an issue](https://github.com/lukas-grigis/ralphctl/issues).
186
+ Claude Code has the most end-to-end mileage inside the harness — it's the most battle-tested of the three — but Copilot
187
+ and Codex run every flow and are supported first-class. Two small differences worth knowing: bundled skill injection
188
+ and `bodyFile` forensic artifacts currently no-op on Copilot and Codex, and Codex's sandbox has only two modes
189
+ (read-only / workspace-write), so path scope (cwd + `--add-dir`) is its fine-grained safety envelope rather than a
190
+ per-tool deny list. Parallel execution is provider-agnostic — it works with whichever provider each implement role is
191
+ configured to use. Hit a rough edge with any provider? Please [open an
192
+ issue](https://github.com/lukas-grigis/ralphctl/issues).
186
193
 
187
194
  One-shot configuration for any provider: `ralphctl settings apply-preset <name>` where `<name>` is one of
188
195
  20 presets across five families — `standard`, `economic`, `strong-gate`, `fast`, and `frontier`, each in
@@ -225,8 +232,8 @@ Configure via the TUI `Settings` view or one-shot CLI commands.
225
232
  # Standard — flagship model per flow
226
233
  ralphctl settings apply-preset mixed # best-fit provider per flow
227
234
  ralphctl settings apply-preset claude-only # every flow on Claude Code
228
- ralphctl settings apply-preset copilot-only # every flow on GitHub Copilot
229
- ralphctl settings apply-preset codex-only # every flow on OpenAI Codex
235
+ ralphctl settings apply-preset copilot-only # every flow on GitHub Copilot CLI
236
+ ralphctl settings apply-preset codex-only # every flow on OpenAI Codex CLI
230
237
 
231
238
  # Economic — implement starts one tier below flagship; escalation ladder climbs only on plateau
232
239
  ralphctl settings apply-preset mixed-economic
@@ -364,20 +371,20 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
364
371
 
365
372
  ### Project & Sprint Inspection
366
373
 
367
- | Command | Description |
368
- | ---------------------------------- | ----------------------------------------- |
369
- | `ralphctl project list` | List registered projects |
370
- | `ralphctl project show <id>` | Show one project (incl. repositories) |
371
- | `ralphctl project remove <id>` | Delete a project registration |
372
- | `ralphctl sprint list` | List all sprints |
373
- | `ralphctl sprint show <id>` | Show one sprint (tickets, status, branch) |
374
- | `ralphctl sprint progress <id>` | Sprint progress with blocker diagnostics |
375
- | `ralphctl sprint set-current <id>` | Switch the current sprint pointer |
376
- | `ralphctl ticket add` | Add a ticket to the current sprint |
377
- | `ralphctl ticket list / show <id>` | Inspect tickets |
378
- | `ralphctl ticket remove <id>` | Remove a ticket from a draft sprint |
379
- | `ralphctl task list / show <id>` | Inspect tasks (planning generates them) |
380
- | `ralphctl task unblock <id>` | Reset a blocked task to `todo` |
374
+ | Command | Description |
375
+ | ------------------------------------- | ----------------------------------------------------------------------------------- |
376
+ | `ralphctl project list` | List registered projects |
377
+ | `ralphctl project show <id>` | Show one project (incl. repositories) |
378
+ | `ralphctl project remove <id>` | Delete a project registration |
379
+ | `ralphctl sprint list` | List all sprints |
380
+ | `ralphctl sprint show <id>` | Show one sprint (tickets, status, branch) |
381
+ | `ralphctl sprint progress <id>` | Sprint progress with blocker diagnostics |
382
+ | `ralphctl sprint set-current <id>` | Switch the current sprint pointer |
383
+ | `ralphctl ticket add --title <title>` | Add a ticket to the current sprint (`--sprint`, `--description`, `--link` optional) |
384
+ | `ralphctl ticket list / show <id>` | Inspect tickets |
385
+ | `ralphctl ticket remove <id>` | Remove a ticket from a draft sprint |
386
+ | `ralphctl task list / show <id>` | Inspect tasks (planning generates them) |
387
+ | `ralphctl task unblock <id>` | Reset a blocked task to `todo` |
381
388
 
382
389
  ### Sprint Lifecycle
383
390
 
@@ -419,14 +426,15 @@ Run `ralphctl <command> --help` for flag-level detail.
419
426
  | [Migration](./MIGRATION.md) | Per-version upgrade context for big version jumps |
420
427
  | [Changelog](./CHANGELOG.md) | Version history |
421
428
 
422
- **Blog posts:** [Building ralphctl](https://lukasgrigis.dev/blog/building-ralphctl) (
423
- backstory) | [From task CLI to ralph harness](https://lukasgrigis.dev/blog/ralphctl-agent-harness/) (evaluator
424
- deep-dive)
429
+ **From the author** ([Lukas Grigis](https://lukasgrigis.dev/)):
430
+ [Building ralphctl](https://lukasgrigis.dev/blog/building-ralphctl) (backstory)
431
+ | [From task CLI to ralph harness](https://lukasgrigis.dev/blog/ralphctl-agent-harness/) (evaluator deep-dive)
432
+ | [The harness era caught up](https://lukasgrigis.dev/blog/ralphctl-harness-era/) (the field converges on the harness bet)
425
433
 
426
- **Further reading:
427
- ** [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Martin
428
- Fowler (April 2026) | [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) —
429
- Anthropic Engineering
434
+ **Further reading:**
435
+ [AI Agent Harnesses: A Field Guide](https://lukasgrigis.dev/blog/guides/agent-harnesses/) — Lukas Grigis
436
+ | [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Martin Fowler (April 2026)
437
+ | [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) — Anthropic Engineering
430
438
 
431
439
  ---
432
440
 
@@ -0,0 +1,92 @@
1
+ # Third-party notices
2
+
3
+ ralphctl bundles skill content adapted from the following MIT-licensed upstream projects. The
4
+ adapted copies live under `src/integration/ai/skills/bundled/` (shipped as `dist/skills/`);
5
+ verbatim upstream snapshots used for drift review live under `scripts/vendor/skills/`. Each
6
+ upstream's license and copyright notice is reproduced in full below, as the MIT license requires.
7
+
8
+ - `ralphctl-debugging-and-error-recovery`, `ralphctl-code-review-and-quality`,
9
+ `ralphctl-test-driven-development`, `ralphctl-idea-refinement` — from
10
+ [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills)
11
+ - `ralphctl-ponytail` — from [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail)
12
+ - `ralphctl-domain-driven-design` — from [wondelai/skills](https://github.com/wondelai/skills)
13
+
14
+ ---
15
+
16
+ ## addyosmani/agent-skills
17
+
18
+ ```
19
+ MIT License
20
+
21
+ Copyright (c) 2025 Addy Osmani
22
+
23
+ Permission is hereby granted, free of charge, to any person obtaining a copy
24
+ of this software and associated documentation files (the "Software"), to deal
25
+ in the Software without restriction, including without limitation the rights
26
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27
+ copies of the Software, and to permit persons to whom the Software is
28
+ furnished to do so, subject to the following conditions:
29
+
30
+ The above copyright notice and this permission notice shall be included in all
31
+ copies or substantial portions of the Software.
32
+
33
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39
+ SOFTWARE.
40
+ ```
41
+
42
+ ## DietrichGebert/ponytail
43
+
44
+ ```
45
+ MIT License
46
+
47
+ Copyright (c) 2026 DietrichGebert
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining a copy
50
+ of this software and associated documentation files (the "Software"), to deal
51
+ in the Software without restriction, including without limitation the rights
52
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
53
+ copies of the Software, and to permit persons to whom the Software is
54
+ furnished to do so, subject to the following conditions:
55
+
56
+ The above copyright notice and this permission notice shall be included in all
57
+ copies or substantial portions of the Software.
58
+
59
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
60
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
61
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
62
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
63
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
64
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
65
+ SOFTWARE.
66
+ ```
67
+
68
+ ## wondelai/skills
69
+
70
+ ```
71
+ MIT License
72
+
73
+ Copyright (c) 2025 Wondel.ai sp. z o.o.
74
+
75
+ Permission is hereby granted, free of charge, to any person obtaining a copy
76
+ of this software and associated documentation files (the "Software"), to deal
77
+ in the Software without restriction, including without limitation the rights
78
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
79
+ copies of the Software, and to permit persons to whom the Software is
80
+ furnished to do so, subject to the following conditions:
81
+
82
+ The above copyright notice and this permission notice shall be included in all
83
+ copies or substantial portions of the Software.
84
+
85
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
86
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
87
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
88
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
89
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
90
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
91
+ SOFTWARE.
92
+ ```