ralphctl 0.1.4 → 0.2.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 +23 -14
- package/dist/{add-7LBVENXM.mjs → add-SEDQ3VK7.mjs} +4 -4
- package/dist/{add-DVEYDCTR.mjs → add-TGJTRHIF.mjs} +3 -3
- package/dist/{chunk-M7JV6MKD.mjs → chunk-HLGOQNJ4.mjs} +384 -96
- package/dist/{chunk-LFDW6MWF.mjs → chunk-KPTPKLXY.mjs} +16 -3
- package/dist/{chunk-PDI6HBZ7.mjs → chunk-LG6B7QVO.mjs} +1 -1
- package/dist/{chunk-YIB7QYU4.mjs → chunk-Q3VWJARJ.mjs} +2 -2
- package/dist/{chunk-F2MMCTB5.mjs → chunk-XPDI4SYI.mjs} +5 -4
- package/dist/{chunk-DZ6HHTM5.mjs → chunk-XQHEKKDN.mjs} +1 -1
- package/dist/{chunk-W3TY22IS.mjs → chunk-ZDEVRTGY.mjs} +10 -3
- package/dist/cli.mjs +174 -65
- package/dist/{create-MQ4OHZAX.mjs → create-DJHCP7LN.mjs} +3 -3
- package/dist/{handle-K2AZLTKU.mjs → handle-CCTBNAJZ.mjs} +1 -1
- package/dist/{project-Q4LKML42.mjs → project-ZYGNPVGL.mjs} +2 -2
- package/dist/prompts/ideate-auto.md +3 -2
- package/dist/prompts/ideate.md +2 -2
- package/dist/prompts/plan-auto.md +11 -8
- package/dist/prompts/plan-common.md +13 -8
- package/dist/prompts/plan-interactive.md +11 -10
- package/dist/prompts/task-evaluation.md +54 -0
- package/dist/prompts/task-execution.md +7 -5
- package/dist/{resolver-NH34HTB6.mjs → resolver-L52KR4GY.mjs} +2 -2
- package/dist/{sprint-UHYXSEBJ.mjs → sprint-LUXAV3Q3.mjs} +2 -2
- package/dist/{wizard-MCDDXLGE.mjs → wizard-2OKIQLZJ.mjs} +6 -6
- package/package.json +17 -14
- package/schemas/config.schema.json +10 -0
- package/schemas/projects.schema.json +5 -0
- package/schemas/tasks.schema.json +9 -0
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
## Project Resources (`.claude/` directory)
|
|
1
|
+
## Project Resources (instruction files and `.claude/` directory)
|
|
2
2
|
|
|
3
|
-
Each repository may have a `.claude/` directory
|
|
4
|
-
|
|
3
|
+
Each repository may have project-specific instruction files and a `.claude/` directory. Check them during exploration
|
|
4
|
+
and
|
|
5
|
+
leverage them throughout planning:
|
|
5
6
|
|
|
6
|
-
- **`CLAUDE.md`** — Project-level rules, conventions, and persistent memory
|
|
7
|
+
- **`CLAUDE.md`** — Project-level rules, conventions, and persistent memory
|
|
8
|
+
- **`.github/copilot-instructions.md`** — GitHub Copilot-specific repository instructions, if present
|
|
7
9
|
- **`agents/`** — Specialized agent definitions for Task tool delegation (architecture, testing, domain tasks)
|
|
8
10
|
- **`commands/`** — Custom slash commands (skills) — invoke with the Skill tool for project-specific workflows
|
|
9
11
|
- **`rules/`** — Project-specific rules and constraints that apply to all work
|
|
10
12
|
- **`memory/`** — Persistent learnings from previous sessions — consult for patterns and decisions
|
|
11
13
|
- **`settings.json` / `settings.local.json`** — Tool permissions, model preferences, hooks
|
|
12
14
|
|
|
13
|
-
If CLAUDE.md
|
|
15
|
+
If repository instruction files exist (`CLAUDE.md`, `.github/copilot-instructions.md`), treat their instructions as
|
|
16
|
+
authoritative for that codebase.
|
|
14
17
|
|
|
15
18
|
## What Makes a Great Task
|
|
16
19
|
|
|
@@ -25,7 +28,7 @@ Every task must have:
|
|
|
25
28
|
|
|
26
29
|
### Task Sizing
|
|
27
30
|
|
|
28
|
-
Completable in a single
|
|
31
|
+
Completable in a single AI session: 1-3 primary files (up to 5-7 total with tests), ~50-200 lines of meaningful
|
|
29
32
|
changes, one logical change per task. Split if too large, merge if too small.
|
|
30
33
|
|
|
31
34
|
**TOO GRANULAR (avoid):**
|
|
@@ -120,7 +123,8 @@ Every task must include explicit, actionable steps — the implementation checkl
|
|
|
120
123
|
|
|
121
124
|
1. **Specific file references** — Name exact files/directories to create or modify
|
|
122
125
|
2. **Concrete actions** — "Add function X to file Y", not "implement the feature"
|
|
123
|
-
3. **Verification included** — Last step(s) should include project-specific verification commands from
|
|
126
|
+
3. **Verification included** — Last step(s) should include project-specific verification commands from the repository
|
|
127
|
+
instruction files
|
|
124
128
|
4. **No ambiguity** — Another developer should be able to follow steps without guessing
|
|
125
129
|
|
|
126
130
|
**BAD (vague):**
|
|
@@ -149,7 +153,8 @@ Every task must include explicit, actionable steps — the implementation checkl
|
|
|
149
153
|
}
|
|
150
154
|
```
|
|
151
155
|
|
|
152
|
-
Use actual file paths discovered during exploration. Reference
|
|
156
|
+
Use actual file paths discovered during exploration. Reference the repository instruction files for verification
|
|
157
|
+
commands.
|
|
153
158
|
|
|
154
159
|
## Task Naming
|
|
155
160
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Interactive Task Planning Protocol
|
|
2
2
|
|
|
3
3
|
You are a task planning specialist collaborating with the user. Your goal is to produce a dependency-ordered set of
|
|
4
|
-
implementation tasks — each one a self-contained mini-spec that a developer
|
|
4
|
+
implementation tasks — each one a self-contained mini-spec that a developer can pick up cold and complete in
|
|
5
5
|
a single session.
|
|
6
6
|
|
|
7
7
|
## Protocol
|
|
@@ -10,15 +10,15 @@ a single session.
|
|
|
10
10
|
|
|
11
11
|
Before planning, understand the codebase:
|
|
12
12
|
|
|
13
|
-
1. **Read CLAUDE.md
|
|
14
|
-
|
|
15
|
-
memory (see "Project Resources" section below).
|
|
13
|
+
1. **Read project instructions** — Start with `CLAUDE.md` if it exists, and also check provider-specific files such as
|
|
14
|
+
`.github/copilot-instructions.md` when present. Follow any links to other documentation. Check `.claude/` directory
|
|
15
|
+
for agents, rules, and memory (see "Project Resources" section below).
|
|
16
16
|
2. **Read key files** — README, manifest files (package.json, pyproject.toml, Cargo.toml, etc.), main entry points,
|
|
17
17
|
directory structure
|
|
18
18
|
3. **Find similar implementations** — Look for existing features similar to what tickets require and follow their
|
|
19
19
|
patterns
|
|
20
|
-
4. **Extract verification commands** — Find the exact build, test, lint, and typecheck commands from
|
|
21
|
-
project config
|
|
20
|
+
4. **Extract verification commands** — Find the exact build, test, lint, and typecheck commands from the repository
|
|
21
|
+
instruction files or project config
|
|
22
22
|
|
|
23
23
|
### Step 2: Review Ticket Requirements
|
|
24
24
|
|
|
@@ -36,7 +36,8 @@ The user has already selected which repositories to include before this session
|
|
|
36
36
|
you via your working directory.
|
|
37
37
|
|
|
38
38
|
1. **Check accessible directories** — The pre-selected repository paths are listed in the Sprint Context below
|
|
39
|
-
2. **Deep-dive into selected repos** — Read
|
|
39
|
+
2. **Deep-dive into selected repos** — Read the repository instruction files, key files, patterns, conventions, and
|
|
40
|
+
existing implementations
|
|
40
41
|
3. **Map ticket scope to repos** — Determine which parts of each ticket map to which repository
|
|
41
42
|
|
|
42
43
|
**Do NOT** propose changing the repository selection. If you believe a critical repository is missing, mention it to the
|
|
@@ -50,7 +51,7 @@ Using the confirmed repositories and your codebase exploration, create tasks. Us
|
|
|
50
51
|
|
|
51
52
|
- **Explore agent** — Broad codebase understanding, finding files, architecture overview
|
|
52
53
|
- **Plan agent** — Designing implementation approaches for complex decisions
|
|
53
|
-
- **
|
|
54
|
+
- **Provider guide agents** — Understanding AI provider capabilities and hooks (e.g., `claude-code-guide` for Claude)
|
|
54
55
|
|
|
55
56
|
**Search Tools:**
|
|
56
57
|
|
|
@@ -126,7 +127,7 @@ Before writing the final JSON, verify every item:
|
|
|
126
127
|
- [ ] Independent tasks do NOT block each other (parallelism maximized)
|
|
127
128
|
- [ ] Every task has 3+ specific, actionable steps with file references
|
|
128
129
|
- [ ] Steps reference concrete files and functions from the actual codebase
|
|
129
|
-
- [ ] Each task includes verification using commands from
|
|
130
|
+
- [ ] Each task includes verification using commands from the repository instruction files (if available)
|
|
130
131
|
- [ ] Every task has a `projectPath` from the project's repository paths
|
|
131
132
|
|
|
132
133
|
## Sprint Context
|
|
@@ -187,4 +188,4 @@ Use this exact JSON Schema:
|
|
|
187
188
|
|
|
188
189
|
---
|
|
189
190
|
|
|
190
|
-
Start by reading
|
|
191
|
+
Start by reading the repository instruction files and exploring the codebase, then discuss the approach with the user.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Code Review: {{TASK_NAME}}
|
|
2
|
+
|
|
3
|
+
You are an independent code reviewer. Your sole job is to evaluate whether the implementation matches the task
|
|
4
|
+
specification. Be skeptical — assume problems exist until proven otherwise.
|
|
5
|
+
|
|
6
|
+
## Task Specification
|
|
7
|
+
|
|
8
|
+
**Task:** {{TASK_NAME}}
|
|
9
|
+
{{TASK_DESCRIPTION_SECTION}}
|
|
10
|
+
{{TASK_STEPS_SECTION}}
|
|
11
|
+
|
|
12
|
+
## Review Process
|
|
13
|
+
|
|
14
|
+
You are working in this project directory:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
{{PROJECT_PATH}}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Investigation Steps
|
|
21
|
+
|
|
22
|
+
1. Run `git log --oneline -10` to identify the commits from this task, then run `git diff <base>..HEAD` for the full range of changes (tasks may produce multiple commits — do not assume a single commit)
|
|
23
|
+
2. Read the changed files carefully to understand the full implementation context
|
|
24
|
+
3. Look at surrounding code to understand patterns and conventions
|
|
25
|
+
4. Compare the actual changes against the task specification above
|
|
26
|
+
5. Identify any issues:
|
|
27
|
+
- **Spec drift** — changes that go beyond or fall short of what was specified
|
|
28
|
+
- **Missing edge cases** — error paths, boundary conditions, empty states
|
|
29
|
+
- **Unnecessary changes** — modifications unrelated to the task
|
|
30
|
+
- **Correctness** — logical errors, off-by-one, race conditions, type issues
|
|
31
|
+
- **Security** — injection, validation gaps, exposed secrets
|
|
32
|
+
- **Consistency** — deviates from existing patterns or conventions
|
|
33
|
+
|
|
34
|
+
Do NOT suggest improvements or refactoring beyond the task scope.
|
|
35
|
+
Only evaluate what was asked vs what was delivered.
|
|
36
|
+
{{CHECK_SCRIPT_SECTION}}
|
|
37
|
+
|
|
38
|
+
## Output
|
|
39
|
+
|
|
40
|
+
If the implementation correctly satisfies the task specification:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
<evaluation-passed>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If there are issues that should be fixed:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
<evaluation-failed>
|
|
50
|
+
[Specific, actionable critique. What is wrong and where?]
|
|
51
|
+
</evaluation-failed>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Be direct and specific — point to files, lines, and concrete problems.
|
|
@@ -37,7 +37,7 @@ Perform these checks IN ORDER before writing any code:
|
|
|
37
37
|
3. **Check git state** — Run `git status` to check for uncommitted changes
|
|
38
38
|
4. **Check environment** — Look at the "Check Script" and "Environment Status" sections in your context file. If a check
|
|
39
39
|
script is configured, the harness ran it at sprint start. If not configured, run the project's verification commands
|
|
40
|
-
yourself (
|
|
40
|
+
yourself (check CLAUDE.md, .github/copilot-instructions.md, or project config). If ANY check fails, STOP:
|
|
41
41
|
```
|
|
42
42
|
<task-blocked>Pre-existing failure: [details of what failed and the output]</task-blocked>
|
|
43
43
|
```
|
|
@@ -47,8 +47,10 @@ Only proceed to Phase 2 if ALL startup checks pass.
|
|
|
47
47
|
|
|
48
48
|
## Phase 2: Implementation
|
|
49
49
|
|
|
50
|
-
1. **Read
|
|
51
|
-
|
|
50
|
+
1. **Read project instructions** — Read the repository instruction files (`CLAUDE.md`,
|
|
51
|
+
`.github/copilot-instructions.md`,
|
|
52
|
+
or equivalent) for project conventions, verification commands, and patterns. Check `.claude/` for agents, rules,
|
|
53
|
+
commands, and memory that may help with implementation.
|
|
52
54
|
2. **Follow declared steps precisely** — Execute each step in order as specified:
|
|
53
55
|
- Each step references specific files and actions — do exactly what is specified
|
|
54
56
|
- Do NOT skip steps or combine them unless they are trivially related
|
|
@@ -62,8 +64,8 @@ Complete these steps IN ORDER:
|
|
|
62
64
|
|
|
63
65
|
1. **Confirm all steps done** — Every task step has been completed
|
|
64
66
|
2. **Run ALL verification commands** — Execute every verification command (see Check Script section in the context file
|
|
65
|
-
or
|
|
66
|
-
is not marked done unless it passes.
|
|
67
|
+
or project instructions). Fix any failures before proceeding. The harness runs the check script as a post-task
|
|
68
|
+
gate — your task is not marked done unless it passes.
|
|
67
69
|
{{COMMIT_STEP}}
|
|
68
70
|
3. **Update progress file** — Append to {{PROGRESS_FILE}} using this format:
|
|
69
71
|
|
|
@@ -11,7 +11,7 @@ var dynamicResolvers = {
|
|
|
11
11
|
"--project": async () => {
|
|
12
12
|
const result = await wrapAsync(
|
|
13
13
|
async () => {
|
|
14
|
-
const { listProjects } = await import("./project-
|
|
14
|
+
const { listProjects } = await import("./project-ZYGNPVGL.mjs");
|
|
15
15
|
return listProjects();
|
|
16
16
|
},
|
|
17
17
|
(err) => new IOError("Failed to load projects for completion", err instanceof Error ? err : void 0)
|
|
@@ -45,7 +45,7 @@ var configValueCompletions = {
|
|
|
45
45
|
async function getSprintCompletions() {
|
|
46
46
|
const result = await wrapAsync(
|
|
47
47
|
async () => {
|
|
48
|
-
const { listSprints } = await import("./sprint-
|
|
48
|
+
const { listSprints } = await import("./sprint-LUXAV3Q3.mjs");
|
|
49
49
|
return listSprints();
|
|
50
50
|
},
|
|
51
51
|
(err) => new IOError("Failed to load sprints for completion", err instanceof Error ? err : void 0)
|
|
@@ -12,9 +12,9 @@ import {
|
|
|
12
12
|
listSprints,
|
|
13
13
|
resolveSprintId,
|
|
14
14
|
saveSprint
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-KPTPKLXY.mjs";
|
|
16
16
|
import "./chunk-OEUJDSHY.mjs";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-ZDEVRTGY.mjs";
|
|
18
18
|
import {
|
|
19
19
|
NoCurrentSprintError,
|
|
20
20
|
SprintNotFoundError,
|
|
@@ -3,25 +3,25 @@ import {
|
|
|
3
3
|
sprintPlanCommand,
|
|
4
4
|
sprintRefineCommand,
|
|
5
5
|
sprintStartCommand
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HLGOQNJ4.mjs";
|
|
7
7
|
import "./chunk-7LZ6GOGN.mjs";
|
|
8
8
|
import {
|
|
9
9
|
sprintCreateCommand
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XQHEKKDN.mjs";
|
|
11
11
|
import {
|
|
12
12
|
addSingleTicketInteractive
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XPDI4SYI.mjs";
|
|
14
14
|
import "./chunk-7TG3EAQ2.mjs";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-LG6B7QVO.mjs";
|
|
16
16
|
import {
|
|
17
17
|
getCurrentSprint,
|
|
18
18
|
getSprint
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-KPTPKLXY.mjs";
|
|
20
20
|
import {
|
|
21
21
|
ensureError,
|
|
22
22
|
wrapAsync
|
|
23
23
|
} from "./chunk-OEUJDSHY.mjs";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-ZDEVRTGY.mjs";
|
|
25
25
|
import "./chunk-EDJX7TT6.mjs";
|
|
26
26
|
import {
|
|
27
27
|
colors,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ralphctl",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Agent harness for long-running AI coding tasks — orchestrates Claude Code & GitHub Copilot across repositories",
|
|
5
5
|
"homepage": "https://github.com/lukas-grigis/ralphctl",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "MIT",
|
|
@@ -15,13 +15,15 @@
|
|
|
15
15
|
},
|
|
16
16
|
"keywords": [
|
|
17
17
|
"cli",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
18
|
+
"agent-harness",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"github-copilot",
|
|
21
|
+
"ai-coding",
|
|
22
|
+
"task-orchestration",
|
|
23
23
|
"anthropic",
|
|
24
|
-
"developer-tools"
|
|
24
|
+
"developer-tools",
|
|
25
|
+
"long-running-agents",
|
|
26
|
+
"generator-evaluator"
|
|
25
27
|
],
|
|
26
28
|
"bin": {
|
|
27
29
|
"ralphctl": "./dist/cli.mjs"
|
|
@@ -37,7 +39,7 @@
|
|
|
37
39
|
"node": ">=24.0.0"
|
|
38
40
|
},
|
|
39
41
|
"dependencies": {
|
|
40
|
-
"@inquirer/prompts": "^8.3.
|
|
42
|
+
"@inquirer/prompts": "^8.3.2",
|
|
41
43
|
"colorette": "^2.0.20",
|
|
42
44
|
"commander": "^14.0.3",
|
|
43
45
|
"gradient-string": "^3.0.0",
|
|
@@ -48,19 +50,20 @@
|
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"@eslint/js": "^10.0.1",
|
|
51
|
-
"@types/node": "^25.
|
|
53
|
+
"@types/node": "^25.5.0",
|
|
52
54
|
"@types/tabtab": "^3.0.4",
|
|
53
|
-
"
|
|
55
|
+
"@vitest/coverage-v8": "^4.1.1",
|
|
56
|
+
"eslint": "^10.1.0",
|
|
54
57
|
"eslint-config-prettier": "^10.1.8",
|
|
55
58
|
"globals": "^17.4.0",
|
|
56
59
|
"husky": "^9.1.7",
|
|
57
|
-
"lint-staged": "^16.
|
|
60
|
+
"lint-staged": "^16.4.0",
|
|
58
61
|
"prettier": "^3.8.1",
|
|
59
62
|
"tsup": "^8.5.1",
|
|
60
63
|
"tsx": "^4.21.0",
|
|
61
64
|
"typescript": "^5.9.3",
|
|
62
|
-
"typescript-eslint": "^8.
|
|
63
|
-
"vitest": "^4.
|
|
65
|
+
"typescript-eslint": "^8.57.2",
|
|
66
|
+
"vitest": "^4.1.1"
|
|
64
67
|
},
|
|
65
68
|
"lint-staged": {
|
|
66
69
|
"*.ts": [
|
|
@@ -15,6 +15,16 @@
|
|
|
15
15
|
"enum": ["claude", "copilot", null],
|
|
16
16
|
"default": null,
|
|
17
17
|
"description": "AI provider to use for code generation (claude or copilot)"
|
|
18
|
+
},
|
|
19
|
+
"editor": {
|
|
20
|
+
"type": ["string", "null"],
|
|
21
|
+
"default": null,
|
|
22
|
+
"description": "Editor command for editing files (e.g., 'subl -w', 'code --wait', 'vim')"
|
|
23
|
+
},
|
|
24
|
+
"evaluationIterations": {
|
|
25
|
+
"type": "integer",
|
|
26
|
+
"minimum": 0,
|
|
27
|
+
"description": "Number of evaluation iterations (0 = disabled, default fallback: 1)"
|
|
18
28
|
}
|
|
19
29
|
}
|
|
20
30
|
}
|
|
@@ -40,6 +40,11 @@
|
|
|
40
40
|
"checkScript": {
|
|
41
41
|
"type": "string",
|
|
42
42
|
"description": "Idempotent check command that bootstraps and verifies the environment (e.g., pnpm install && pnpm typecheck && pnpm lint && pnpm test)"
|
|
43
|
+
},
|
|
44
|
+
"checkTimeout": {
|
|
45
|
+
"type": "number",
|
|
46
|
+
"exclusiveMinimum": 0,
|
|
47
|
+
"description": "Per-repo timeout in milliseconds for check script execution (overrides RALPHCTL_SETUP_TIMEOUT_MS)"
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
}
|
|
@@ -66,6 +66,15 @@
|
|
|
66
66
|
"verificationOutput": {
|
|
67
67
|
"type": "string",
|
|
68
68
|
"description": "Output from the verification run"
|
|
69
|
+
},
|
|
70
|
+
"evaluated": {
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"default": false,
|
|
73
|
+
"description": "Whether the evaluator ran on this task"
|
|
74
|
+
},
|
|
75
|
+
"evaluationOutput": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "Output from the evaluation run (truncated to 2000 chars)"
|
|
69
78
|
}
|
|
70
79
|
}
|
|
71
80
|
}
|