ralphctl 0.1.3 → 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.
Files changed (28) hide show
  1. package/README.md +23 -14
  2. package/dist/{add-7LBVENXM.mjs → add-SEDQ3VK7.mjs} +4 -4
  3. package/dist/{add-DVEYDCTR.mjs → add-TGJTRHIF.mjs} +3 -3
  4. package/dist/{chunk-M7JV6MKD.mjs → chunk-HLGOQNJ4.mjs} +384 -96
  5. package/dist/{chunk-LFDW6MWF.mjs → chunk-KPTPKLXY.mjs} +16 -3
  6. package/dist/{chunk-PDI6HBZ7.mjs → chunk-LG6B7QVO.mjs} +1 -1
  7. package/dist/{chunk-YIB7QYU4.mjs → chunk-Q3VWJARJ.mjs} +2 -2
  8. package/dist/{chunk-F2MMCTB5.mjs → chunk-XPDI4SYI.mjs} +5 -4
  9. package/dist/{chunk-DZ6HHTM5.mjs → chunk-XQHEKKDN.mjs} +1 -1
  10. package/dist/{chunk-W3TY22IS.mjs → chunk-ZDEVRTGY.mjs} +10 -3
  11. package/dist/cli.mjs +174 -65
  12. package/dist/{create-MQ4OHZAX.mjs → create-DJHCP7LN.mjs} +3 -3
  13. package/dist/{handle-K2AZLTKU.mjs → handle-CCTBNAJZ.mjs} +1 -1
  14. package/dist/{project-Q4LKML42.mjs → project-ZYGNPVGL.mjs} +2 -2
  15. package/dist/prompts/ideate-auto.md +3 -2
  16. package/dist/prompts/ideate.md +2 -2
  17. package/dist/prompts/plan-auto.md +11 -8
  18. package/dist/prompts/plan-common.md +13 -8
  19. package/dist/prompts/plan-interactive.md +11 -10
  20. package/dist/prompts/task-evaluation.md +54 -0
  21. package/dist/prompts/task-execution.md +7 -5
  22. package/dist/{resolver-NH34HTB6.mjs → resolver-L52KR4GY.mjs} +2 -2
  23. package/dist/{sprint-UHYXSEBJ.mjs → sprint-LUXAV3Q3.mjs} +2 -2
  24. package/dist/{wizard-MCDDXLGE.mjs → wizard-2OKIQLZJ.mjs} +6 -6
  25. package/package.json +17 -14
  26. package/schemas/config.schema.json +10 -0
  27. package/schemas/projects.schema.json +5 -0
  28. 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 with project-specific resources. Check it during exploration and leverage
4
- these throughout planning:
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 (also check root `CLAUDE.md`)
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 exists, treat its instructions as authoritative for that codebase.
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 Claude session: 1-3 primary files (up to 5-7 total with tests), ~50-200 lines of meaningful
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 CLAUDE.md
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 CLAUDE.md for verification commands.
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 (or Claude) can pick up cold and complete in
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** (if it exists) Contains project-specific instructions, patterns, conventions, and verification
14
- commands you must follow. Follow any links to other documentation. Check `.claude/` directory for agents, rules, and
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 CLAUDE.md or
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 CLAUDE.md, key files, patterns, conventions, and existing implementations
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
- - **claude-code-guide agent** — Understanding Claude Code capabilities and hooks
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 CLAUDE.md (if available)
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 CLAUDE.md and exploring the codebase, then discuss the approach with the user.
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 (see CLAUDE.md). If ANY check fails, STOP:
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 CLAUDE.md and .claude/ directory** — Read CLAUDE.md for project conventions, verification commands, and
51
- patterns. Check `.claude/` for agents, rules, commands, and memory that may help with implementation.
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 CLAUDE.md). Fix any failures before proceeding. The harness runs the check script as a post-task gate — your task
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-Q4LKML42.mjs");
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-UHYXSEBJ.mjs");
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-LFDW6MWF.mjs";
15
+ } from "./chunk-KPTPKLXY.mjs";
16
16
  import "./chunk-OEUJDSHY.mjs";
17
- import "./chunk-W3TY22IS.mjs";
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-M7JV6MKD.mjs";
6
+ } from "./chunk-HLGOQNJ4.mjs";
7
7
  import "./chunk-7LZ6GOGN.mjs";
8
8
  import {
9
9
  sprintCreateCommand
10
- } from "./chunk-DZ6HHTM5.mjs";
10
+ } from "./chunk-XQHEKKDN.mjs";
11
11
  import {
12
12
  addSingleTicketInteractive
13
- } from "./chunk-F2MMCTB5.mjs";
13
+ } from "./chunk-XPDI4SYI.mjs";
14
14
  import "./chunk-7TG3EAQ2.mjs";
15
- import "./chunk-PDI6HBZ7.mjs";
15
+ import "./chunk-LG6B7QVO.mjs";
16
16
  import {
17
17
  getCurrentSprint,
18
18
  getSprint
19
- } from "./chunk-LFDW6MWF.mjs";
19
+ } from "./chunk-KPTPKLXY.mjs";
20
20
  import {
21
21
  ensureError,
22
22
  wrapAsync
23
23
  } from "./chunk-OEUJDSHY.mjs";
24
- import "./chunk-W3TY22IS.mjs";
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.1.3",
4
- "description": "Sprint and task management CLI for AI-assisted coding",
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
- "claude",
19
- "ai",
20
- "sprint",
21
- "task-management",
22
- "planning",
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.0",
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.3.3",
53
+ "@types/node": "^25.5.0",
52
54
  "@types/tabtab": "^3.0.4",
53
- "eslint": "^10.0.2",
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.3.1",
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.56.1",
63
- "vitest": "^4.0.18"
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
  }