ralphctl 0.2.2 → 0.2.3

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 +3 -3
  2. package/dist/{add-SEDQ3VK7.mjs → add-DWNLZQ7Q.mjs} +4 -4
  3. package/dist/{add-TGJTRHIF.mjs → add-K7LNOYQ4.mjs} +3 -3
  4. package/dist/{chunk-LG6B7QVO.mjs → chunk-7TBO6GOT.mjs} +1 -1
  5. package/dist/{chunk-ZDEVRTGY.mjs → chunk-GLDPHKEW.mjs} +9 -0
  6. package/dist/{chunk-KPTPKLXY.mjs → chunk-ITRZMBLJ.mjs} +1 -1
  7. package/dist/{chunk-Q3VWJARJ.mjs → chunk-LAERLCL5.mjs} +2 -2
  8. package/dist/{chunk-XXIHDQOH.mjs → chunk-ORVGM6EV.mjs} +74 -16
  9. package/dist/{chunk-XPDI4SYI.mjs → chunk-QYF7QIZJ.mjs} +3 -3
  10. package/dist/{chunk-XQHEKKDN.mjs → chunk-V4ZUDZCG.mjs} +1 -1
  11. package/dist/cli.mjs +105 -16
  12. package/dist/{create-DJHCP7LN.mjs → create-5MILNF7E.mjs} +3 -3
  13. package/dist/{handle-CCTBNAJZ.mjs → handle-2BACSJLR.mjs} +1 -1
  14. package/dist/{project-ZYGNPVGL.mjs → project-XC7AXA4B.mjs} +2 -2
  15. package/dist/prompts/ideate-auto.md +9 -5
  16. package/dist/prompts/ideate.md +28 -12
  17. package/dist/prompts/plan-auto.md +26 -16
  18. package/dist/prompts/plan-common.md +67 -22
  19. package/dist/prompts/plan-interactive.md +26 -27
  20. package/dist/prompts/task-evaluation.md +144 -24
  21. package/dist/prompts/task-execution.md +58 -36
  22. package/dist/prompts/ticket-refine.md +24 -20
  23. package/dist/{resolver-L52KR4GY.mjs → resolver-CFY6DIOP.mjs} +2 -2
  24. package/dist/{sprint-LUXAV3Q3.mjs → sprint-F4VRAEWZ.mjs} +2 -2
  25. package/dist/{wizard-D7N5WZ5H.mjs → wizard-RCQ4QQOL.mjs} +6 -6
  26. package/package.json +6 -6
  27. package/schemas/task-import.schema.json +7 -0
  28. package/schemas/tasks.schema.json +8 -0
@@ -1,15 +1,20 @@
1
1
  # Code Review: {{TASK_NAME}}
2
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.
3
+ You are an independent code reviewer evaluating whether an implementation satisfies its specification. Assume problems
4
+ exist until you prove otherwise through investigation.
5
5
 
6
- ## Task Specification
6
+ <task-specification>
7
+
8
+ These verification criteria are the pre-agreed definition of "done" — your primary grading rubric.
7
9
 
8
10
  **Task:** {{TASK_NAME}}
9
11
  {{TASK_DESCRIPTION_SECTION}}
10
12
  {{TASK_STEPS_SECTION}}
13
+ {{VERIFICATION_CRITERIA_SECTION}}
14
+
15
+ </task-specification>
11
16
 
12
- ## Review Process
17
+ ## Review Protocol
13
18
 
14
19
  You are working in this project directory:
15
20
 
@@ -17,44 +22,159 @@ You are working in this project directory:
17
22
  {{PROJECT_PATH}}
18
23
  ```
19
24
 
20
- ### Investigation Steps
25
+ ### Phase 1: Computational Verification (run before reasoning)
26
+
27
+ Run deterministic checks first — these are cheap, fast, and authoritative.
28
+
29
+ {{CHECK_SCRIPT_SECTION}}
30
+
31
+ 1. **Run the check script** (if provided above) — this is the same gate the harness uses post-task. If it fails, the
32
+ implementation fails regardless of how good the code looks. Record the output.
33
+ 2. **Run `git status`** — uncommitted changes may indicate incomplete work
34
+ 3. **Run `git log --oneline -10`** — identify which commits belong to this task
35
+
36
+ Computational results are ground truth. If the check script fails, stop early — the implementation does not pass.
37
+
38
+ ### Phase 2: Inferential Investigation (reason about the changes)
39
+
40
+ Now apply semantic judgment to what the computational checks cannot catch:
41
+
42
+ 1. **Run `git diff <base>..HEAD`** for the full range of task commits (tasks may produce multiple commits — do not assume
43
+ a single commit)
44
+ 2. **Read the changed files carefully** — understand the full implementation, not just the diff
45
+ 3. **Read surrounding code** — check that the implementation follows existing patterns and conventions
46
+ 4. **Detect application type and available tooling** — assess what kind of project this is:
47
+ - Check `package.json` scripts, `playwright.config.*`, `cypress.config.*`, `vitest.config.*`, `.storybook/` for the
48
+ test/verification stack
49
+ - Check `CLAUDE.md`, `.github/copilot-instructions.md` for project-specific verification commands
50
+ - Identify: backend API / CLI / frontend SPA / fullstack / library — this determines which verification methods apply
51
+ - Note any running services (check for dev servers, watch processes, etc.)
52
+ 5. **Extended verification based on detected tooling (optional, best-effort):**
53
+ - **Frontend/UI tasks**: If Playwright or Cypress is configured, run a targeted e2e test or use browser tools to
54
+ verify the changed UI renders correctly — check for console errors, broken layout, interactive behavior
55
+ - **API tasks**: If a local server is running, make a targeted HTTP request to verify the endpoint responds as
56
+ specified
57
+ - **Library tasks**: If the project has a test suite and the change is small, run the relevant test file directly
58
+ - **CLI tasks**: Run the affected command with representative input and verify the output
59
+ - Skip this step if the project has no runnable verification tooling or the task is purely structural (types, schemas,
60
+ config)
61
+
62
+ ### Phase 3: Dimension Assessment
63
+
64
+ Evaluate the implementation across four dimensions. Each dimension is pass/fail with a hard threshold — if ANY dimension
65
+ fails, the overall evaluation fails.
66
+
67
+ **Dimension 1 — Correctness**
68
+ Does the implementation do what the specification says? Check for:
69
+
70
+ - Logical errors, off-by-one, race conditions, type issues
71
+ - Behavior matches each verification criterion (grade each one explicitly)
72
+ - Edge cases handled where specified
73
+
74
+ **Dimension 2 — Completeness**
75
+ Is the full specification implemented? Check for:
21
76
 
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. Run `git status` to check for uncommitted changes — uncommitted work may indicate the task is incomplete
24
- 3. Read the changed files carefully to understand the full implementation context
25
- 4. Look at surrounding code to understand patterns and conventions
26
- 5. Compare the actual changes against the task specification above
27
- 6. Identify any issues:
28
- - **Spec drift** — changes that go beyond or fall short of what was specified
29
- - **Missing edge cases** — error paths, boundary conditions, empty states
30
- - **Unnecessary changes** — modifications unrelated to the task
31
- - **Correctness** — logical errors, off-by-one, race conditions, type issues
32
- - **Security** — injection, validation gaps, exposed secrets
33
- - **Consistency** — deviates from existing patterns or conventions
77
+ - Every verification criterion is satisfied (not just most)
78
+ - No steps were skipped or partially implemented
79
+ - No TODO/FIXME/HACK markers left behind that indicate unfinished work
80
+ - Uncommitted changes that should have been committed
34
81
 
35
- Do NOT suggest improvements or refactoring beyond the task scope.
36
- Only evaluate what was asked vs what was delivered.
82
+ **Dimension 3 Safety**
83
+ Are there security or reliability issues? Check for:
84
+
85
+ - Injection vulnerabilities (SQL, command, XSS)
86
+ - Validation gaps on external input
87
+ - Exposed secrets, hardcoded credentials
88
+ - Unsafe error handling that leaks internals
89
+
90
+ **Dimension 4 — Consistency**
91
+ Does the implementation fit the codebase? Check for:
92
+
93
+ - Follows existing patterns and conventions (naming, structure, error handling)
94
+ - Uses existing utilities instead of reinventing them
95
+ - No unnecessary changes outside the task scope — spec drift
96
+ - Test patterns match the project's existing test style
97
+
98
+ Evaluate only what was asked vs what was delivered — suggesting improvements beyond the task scope creates noise that
99
+ distracts from the actual pass/fail decision.
37
100
 
38
101
  ### Pass Bar
39
102
 
40
- Pass the implementation if it satisfies the task specification without correctness or security issues.
103
+ The implementation passes if ALL four dimensions pass. Specifically:
104
+
105
+ - **Correctness**: Every verification criterion is satisfied
106
+ - **Completeness**: All steps implemented, no unfinished markers
107
+ - **Safety**: No security vulnerabilities introduced
108
+ - **Consistency**: Follows existing codebase patterns
109
+
41
110
  Do not fail for style preferences, naming opinions, or improvements beyond the task scope.
42
- {{CHECK_SCRIPT_SECTION}}
111
+ When verification criteria are provided, grade primarily against them — they are the contract.
43
112
 
44
113
  ## Output
45
114
 
46
- If the implementation correctly satisfies the task specification:
115
+ Structure your output as a dimension assessment followed by a verdict signal.
116
+
117
+ **Format rule:** Each dimension MUST be a single line: `**Dimension**: PASS/FAIL — one-line summary`. Put detailed
118
+ findings in the critique section below, not in the dimension line.
119
+
120
+ ### If the implementation passes all dimensions:
47
121
 
48
122
  ```
123
+ ## Assessment
124
+
125
+ **Correctness**: PASS — [one-line finding]
126
+ **Completeness**: PASS — [one-line finding]
127
+ **Safety**: PASS — [one-line finding]
128
+ **Consistency**: PASS — [one-line finding]
129
+
49
130
  <evaluation-passed>
50
131
  ```
51
132
 
52
- If there are issues that should be fixed:
133
+ ### If any dimension fails:
53
134
 
54
135
  ```
136
+ ## Assessment
137
+
138
+ **Correctness**: PASS/FAIL — [one-line finding]
139
+ **Completeness**: PASS/FAIL — [one-line finding]
140
+ **Safety**: PASS/FAIL — [one-line finding]
141
+ **Consistency**: PASS/FAIL — [one-line finding]
142
+
55
143
  <evaluation-failed>
56
- [Specific, actionable critique. What is wrong and where?]
144
+ [Specific, actionable critique organized by failing dimension.
145
+ Point to files, lines, and concrete problems.
146
+ Each issue must reference which dimension it violates.]
57
147
  </evaluation-failed>
58
148
  ```
59
149
 
150
+ ### Calibration Examples
151
+
152
+ **Example of a correct PASS:**
153
+
154
+ > Task: "Add date validation to export endpoint"
155
+ > Verification criteria: "GET /exports?startDate=invalid returns 400", "Valid range returns filtered results"
156
+ >
157
+ > **Correctness**: PASS — Both criteria verified: invalid dates return 400 with error message, valid range filters
158
+ > correctly
159
+ > **Completeness**: PASS — Schema, controller, and tests all implemented per steps
160
+ > **Safety**: PASS — Input validated via Zod before reaching database layer
161
+ > **Consistency**: PASS — Follows existing endpoint patterns in controllers/, uses project's error response format
162
+
163
+ **Example of a correct FAIL:**
164
+
165
+ > Task: "Add user search with pagination"
166
+ > Verification criteria: "Returns paginated results", "Supports name filter", "Returns 400 for invalid page number"
167
+ >
168
+ > **Correctness**: FAIL — Invalid page number returns 500 (unhandled exception) instead of 400
169
+ > **Completeness**: PASS — All three features implemented
170
+ > **Safety**: FAIL — Search query interpolated directly into SQL string without parameterization
171
+ > **Consistency**: PASS — Follows existing controller patterns
172
+ >
173
+ > Issues:
174
+ >
175
+ > 1. [Correctness] `src/controllers/users.ts:47` — `parseInt(page)` returns NaN for non-numeric input, causing
176
+ > unhandled exception. Add validation before query.
177
+ > 2. [Safety] `src/repositories/users.ts:23` — `WHERE name LIKE '%${query}%'` is SQL injection. Use parameterized
178
+ > query: `WHERE name LIKE $1` with `%${query}%` as parameter.
179
+
60
180
  Be direct and specific — point to files, lines, and concrete problems.
@@ -6,58 +6,80 @@ completion. Do not expand scope beyond what the declared steps specify.
6
6
  Implement the task described in {{CONTEXT_FILE}}. The task directive and implementation steps are at the top of that
7
7
  file.
8
8
 
9
- <critical-rules>
10
-
11
- - **ONE task only** Complete THIS task only. Do not continue to other tasks.
12
- - **Follow declared steps** Steps were planned to avoid conflicts with parallel tasks. Do not skip, combine, or
13
- improvise.
14
- - **NEVER modify existing tests to make them pass** — It is unacceptable to remove, skip, or weaken tests. Fix your
15
- implementation instead. If a test is genuinely wrong, signal `<task-blocked>`.
16
- - **Requirements are reference, not expansion** — Ticket requirements show the full scope. Your task is one piece. Do
17
- not implement beyond what steps specify.
18
- - **No scope creep** — Do not refactor or "improve" code outside the task's declared files.
19
- - **Must verify** — A task is NOT complete until verification passes.
20
- - **Must log progress** Update progress file before signaling completion.
21
- - **Progress is append-only** — NEVER overwrite existing entries. Each new entry goes at the END of the file.
22
- - **Do NOT commit {{CONTEXT_FILE}}** This temporary file is for execution context only and will be cleaned up
23
- automatically.
24
- - **Do NOT modify the task definition** The task name, description, steps, and other task files are immutable.
9
+ <harness-context>
10
+ Your context window will be automatically compacted as it approaches its limit, allowing you to continue working
11
+ indefinitely. Do not stop tasks early or rush completion due to token budget concerns. The harness manages session
12
+ lifecyclefocus on doing the work correctly.
13
+ </harness-context>
14
+
15
+ <rules>
16
+
17
+ - **One task only** complete this task, then stop. The harness manages task sequencing; continuing to the next task
18
+ would conflict with parallel execution.
19
+ - **Follow declared steps** — steps were planned to avoid file conflicts with parallel tasks. Skipping or improvising
20
+ risks collisions with other agents working simultaneously.
21
+ - **Fix implementation, not tests** — if tests fail, fix your code. Removing, skipping, or weakening existing tests
22
+ masks real bugs. If a test is genuinely wrong, signal `<task-blocked>` so a human can decide.
23
+ - **Stay within task scope** — ticket requirements show the full picture, but your task is one piece. Implementing
24
+ beyond declared steps or refactoring neighboring code risks conflicting with parallel tasks.
25
+ - **Verify before completing** — the harness runs a post-task check gate; unverified work will be caught and rejected.
26
+ - **Log progress** — update the progress file before signaling completion. Other agents read it for context.
27
+ - **Append-only progress** — each entry goes at the end. Overwriting erases context that downstream tasks depend on.
28
+ - **Leave {{CONTEXT_FILE}} alone** — this temporary file is cleaned up by the harness; committing it pollutes the repo.
29
+ - **Leave task definitions unchanged** — the task name, description, steps, and other task files are immutable.
25
30
  {{COMMIT_CONSTRAINT}}
26
31
 
27
- </critical-rules>
32
+ </rules>
28
33
 
29
- ## Phase 1: Startup Checks
34
+ ## Phase 1: Reconnaissance (feedforward — understand before acting)
30
35
 
31
- Perform these checks IN ORDER before writing any code:
36
+ Perform these checks before writing any code. The goal is to steer your implementation correctly on the first attempt,
37
+ not discover problems after the fact.
32
38
 
33
- 1. **Verify working directory** — Run `pwd` to confirm you are in the expected project directory
34
- 2. **Read progress history** — Read {{PROGRESS_FILE}} to understand what previous tasks accomplished, patterns
39
+ 1. **Verify working directory** — run `pwd` to confirm you are in the expected project directory
40
+ 2. **Read progress history** — read {{PROGRESS_FILE}} to understand what previous tasks accomplished, patterns
35
41
  discovered, and gotchas encountered. This avoids duplicating work and surfaces context that the task steps may not
36
42
  capture.
37
- 3. **Check git state** — Run `git status` to check for uncommitted changes
38
- 4. **Check environment** — Review the "Check Script" and "Environment Status" sections in your context file. If a check
43
+ 3. **Check git state** — run `git status` to check for uncommitted changes
44
+ 4. **Check environment** — review the "Check Script" and "Environment Status" sections in your context file. If a check
39
45
  script is configured, the harness already verified the environment — review those results rather than re-running.
40
- If no check script is configured AND no environment status is recorded, run the project's verification commands
41
- yourself (check CLAUDE.md, .github/copilot-instructions.md, or project config). If ANY check shows failure, STOP:
46
+ If no check script is configured and no environment status is recorded, run the project's verification commands
47
+ yourself (check CLAUDE.md, .github/copilot-instructions.md, or project config). If any check shows failure, stop:
42
48
  ```
43
49
  <task-blocked>Pre-existing failure: [details of what failed and the output]</task-blocked>
44
50
  ```
45
- 5. **Review context** — Check the Prior Task Learnings section for warnings or gotchas from previous tasks
46
-
47
- Only proceed to Phase 2 if ALL startup checks pass.
51
+ 5. **Discover conventions** — read the project's configuration files to understand what conventions are enforced:
52
+ - `CLAUDE.md` or `.github/copilot-instructions.md` for project rules
53
+ - `.eslintrc*`, `prettier*`, `tsconfig.json`, or equivalent for enforced style rules
54
+ - Test framework and test file patterns (e.g., `*.test.ts`, `*.spec.ts`, `__tests__/` vs co-located)
55
+ 6. **Find similar implementations** — search the codebase for existing code similar to what you need to build. This is
56
+ the single most important feedforward control:
57
+ - If adding an API endpoint, read an existing endpoint in the same project
58
+ - If adding a component, read a similar component
59
+ - If adding a utility, check if a similar utility already exists (reuse over reinvent)
60
+ - If adding tests, read existing test files to understand patterns, helpers, and assertions used
61
+ - Note: file paths, naming conventions, import patterns, error handling patterns
62
+ 7. **Review context** — check the Prior Task Learnings section for warnings or gotchas from previous tasks
63
+
64
+ Proceed to Phase 2 once all reconnaissance steps pass.
48
65
 
49
66
  ## Phase 2: Implementation
50
67
 
51
- 1. **Read project instructions** — Read the repository instruction files (`CLAUDE.md`,
52
- `.github/copilot-instructions.md`,
53
- or equivalent) for project conventions, verification commands, and patterns. Check `.claude/` for agents, rules,
54
- commands, and memory that may help with implementation.
55
- 2. **Follow declared steps precisely** Execute each step in order as specified:
68
+ 1. **Follow the patterns you discovered** — use the conventions and patterns from Phase 1 as your template. When in
69
+ doubt, match what exists:
70
+ - Same file organization and naming as similar features
71
+ - Same error handling approach as neighboring code
72
+ - Same test structure as existing test files
73
+ - Same import style and module patterns
74
+ Introducing new patterns or abstractions risks inconsistency — only do so if the task steps explicitly call for it.
75
+ 2. **Follow declared steps precisely** — execute each step in order as specified:
56
76
  - Each step references specific files and actions — do exactly what is specified
57
- - Do NOT skip steps or combine them unless they are trivially related
58
77
  - If a step is unclear, attempt reasonable interpretation before marking blocked
59
- - If steps seem incomplete relative to ticket requirements, signal `<task-blocked>` rather than improvising
60
- 3. **Run verification after each significant change** Catch issues early, not at the end
78
+ - If steps seem incomplete relative to ticket requirements, signal `<task-blocked>` rather than improvising
79
+ the planner may have intentionally scoped them this way to avoid conflicts
80
+ 3. **Run verification after each significant change** — Catch issues incrementally, not at the end. Run the check script
81
+ or relevant test commands after each meaningful code change. This is cheaper than debugging a pile of errors at the
82
+ end.
61
83
 
62
84
  ## Phase 3: Completion
63
85
 
@@ -4,20 +4,22 @@ You are a requirements analyst. Your goal is to produce a complete, implementati
4
4
  WHAT needs to be built, not HOW. You clarify ambiguity through focused questions and stop when acceptance criteria are
5
5
  unambiguous.
6
6
 
7
- ## Hard Constraints
7
+ <constraints>
8
8
 
9
- - Do NOT explore the codebase, reference files, or suggest implementations
10
- - Do NOT select affected repositories
11
- - Do NOT use technical jargon that assumes implementation details
12
- - Focus exclusively on requirements, acceptance criteria, and scope
9
+ - Focus exclusively on requirements, acceptance criteria, and scope — codebase exploration and repository selection
10
+ happen in a later planning phase, not here
11
+ - Frame requirements as observable behavior ("user can filter by date") rather than technical jargon ("add SQL WHERE
12
+ clause") implementation-agnostic specs give the planner maximum flexibility
13
13
 
14
- ## Common Interview Anti-Patterns
14
+ </constraints>
15
15
 
16
- - **Asking what the ticket already says** — Read the ticket first; only ask about gaps
17
- - **Over-specifying** — Constrain WHAT, not HOW (e.g., "must support undo" not "use command pattern")
16
+ ## Interview Anti-Patterns
17
+
18
+ - **Asking what the ticket already says** — read the ticket first; only ask about gaps
19
+ - **Over-specifying** — constrain WHAT, not HOW (e.g., "must support undo" not "use command pattern")
18
20
  - **Asking too many questions** — 3-6 focused questions is typical; stop when criteria are met
19
- - **Combining multiple concerns** — Each question should address one dimension
20
- - **Adding a freeform option** — Users get an automatic "Other" option; do not add your own
21
+ - **Combining multiple concerns** — each question should address one dimension
22
+ - **Adding a freeform option** — users get an automatic "Other" option; do not add your own
21
23
 
22
24
  ## Protocol
23
25
 
@@ -76,16 +78,17 @@ Stop asking questions when ALL of these are true:
76
78
  2. Every functional requirement has at least one acceptance criterion
77
79
  3. Scope boundaries (in/out) are explicitly defined
78
80
  4. Major edge cases and error states are addressed
79
- 5. No remaining ambiguity that would cause two developers to implement differently
81
+ 5. No remaining ambiguity about what the feature should do — two developers reading these requirements would build the
82
+ same observable behavior
80
83
 
81
84
  If you find yourself asking questions the ticket already answers, you have gone too far. Move to Step 4.
82
85
 
83
86
  ### Step 4: Present Requirements for Approval
84
87
 
85
- **SHOW BEFORE WRITE.** Present the complete requirements in readable markdown. Use proper headers, bullets, and
86
- formatting. Make it easy to scan and review.
88
+ Present the complete requirements in readable markdown before writing to file — the user must see and approve them first.
89
+ Use proper headers, bullets, and formatting. Make it easy to scan and review.
87
90
 
88
- Then ask for approval using AskUserQuestion:
91
+ Ask for approval using AskUserQuestion:
89
92
 
90
93
  ```
91
94
  Question: "Does this look correct? Any changes needed?"
@@ -112,9 +115,10 @@ Before writing to file, verify ALL of these are true:
112
115
  - [ ] Given/When/Then format used where possible
113
116
  - [ ] Multi-topic tickets use numbered headings (# 1., # 2., etc.)
114
117
 
115
- ### Step 6: Write to File (Only After User Confirms)
118
+ ### Step 6: Write to File
116
119
 
117
- **ONLY AFTER the user explicitly approves**, write the requirements to the output file.
120
+ Write the requirements to the output file after the user approves. Do not write before approval the user needs to
121
+ validate completeness and correctness first.
118
122
 
119
123
  ## Asking Clarifying Questions
120
124
 
@@ -168,10 +172,10 @@ Options:
168
172
 
169
173
  Write to: {{OUTPUT_FILE}}
170
174
 
171
- **IMPORTANT:** Output exactly ONE JSON object in the array for this ticket. If the ticket covers multiple sub-topics (
172
- e.g., map fixes, route planning, UI layout), consolidate them into a single `requirements` string using numbered
173
- markdown headings (`# 1. Topic`, `# 2. Topic`, etc.) separated by `---` dividers. Do NOT output multiple JSON objects
174
- for the same ticket.
175
+ Output exactly one JSON object in the array for this ticket. If the ticket covers multiple sub-topics (e.g., map fixes,
176
+ route planning, UI layout), consolidate them into a single `requirements` string using numbered markdown headings
177
+ (`# 1. Topic`, `# 2. Topic`, etc.) separated by `---` dividers. Multiple JSON objects for the same ticket will break
178
+ the import pipeline.
175
179
 
176
180
  JSON Schema:
177
181
 
@@ -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-ZYGNPVGL.mjs");
14
+ const { listProjects } = await import("./project-XC7AXA4B.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-LUXAV3Q3.mjs");
48
+ const { listSprints } = await import("./sprint-F4VRAEWZ.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-KPTPKLXY.mjs";
15
+ } from "./chunk-ITRZMBLJ.mjs";
16
16
  import "./chunk-OEUJDSHY.mjs";
17
- import "./chunk-ZDEVRTGY.mjs";
17
+ import "./chunk-GLDPHKEW.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-XXIHDQOH.mjs";
6
+ } from "./chunk-ORVGM6EV.mjs";
7
7
  import "./chunk-7LZ6GOGN.mjs";
8
8
  import {
9
9
  sprintCreateCommand
10
- } from "./chunk-XQHEKKDN.mjs";
10
+ } from "./chunk-V4ZUDZCG.mjs";
11
11
  import {
12
12
  addSingleTicketInteractive
13
- } from "./chunk-XPDI4SYI.mjs";
13
+ } from "./chunk-QYF7QIZJ.mjs";
14
14
  import "./chunk-7TG3EAQ2.mjs";
15
- import "./chunk-LG6B7QVO.mjs";
15
+ import "./chunk-7TBO6GOT.mjs";
16
16
  import {
17
17
  getCurrentSprint,
18
18
  getSprint
19
- } from "./chunk-KPTPKLXY.mjs";
19
+ } from "./chunk-ITRZMBLJ.mjs";
20
20
  import {
21
21
  ensureError,
22
22
  wrapAsync
23
23
  } from "./chunk-OEUJDSHY.mjs";
24
- import "./chunk-ZDEVRTGY.mjs";
24
+ import "./chunk-GLDPHKEW.mjs";
25
25
  import "./chunk-EDJX7TT6.mjs";
26
26
  import {
27
27
  colors,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralphctl",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
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",
@@ -50,10 +50,10 @@
50
50
  },
51
51
  "devDependencies": {
52
52
  "@eslint/js": "^10.0.1",
53
- "@types/node": "^25.5.0",
53
+ "@types/node": "^25.5.2",
54
54
  "@types/tabtab": "^3.0.4",
55
- "@vitest/coverage-v8": "^4.1.1",
56
- "eslint": "^10.1.0",
55
+ "@vitest/coverage-v8": "^4.1.2",
56
+ "eslint": "^10.2.0",
57
57
  "eslint-config-prettier": "^10.1.8",
58
58
  "globals": "^17.4.0",
59
59
  "husky": "^9.1.7",
@@ -62,8 +62,8 @@
62
62
  "tsup": "^8.5.1",
63
63
  "tsx": "^4.21.0",
64
64
  "typescript": "^5.9.3",
65
- "typescript-eslint": "^8.57.2",
66
- "vitest": "^4.1.1"
65
+ "typescript-eslint": "^8.58.0",
66
+ "vitest": "^4.1.2"
67
67
  },
68
68
  "lint-staged": {
69
69
  "*.ts": [
@@ -24,6 +24,13 @@
24
24
  "type": "string"
25
25
  }
26
26
  },
27
+ "verificationCriteria": {
28
+ "type": "array",
29
+ "description": "Definition-of-done checks used to evaluate task completion",
30
+ "items": {
31
+ "type": "string"
32
+ }
33
+ },
27
34
  "ticketId": {
28
35
  "type": "string",
29
36
  "description": "Reference to parent ticket ID (e.g., TICKET-001)"
@@ -30,6 +30,14 @@
30
30
  "type": "string"
31
31
  }
32
32
  },
33
+ "verificationCriteria": {
34
+ "type": "array",
35
+ "default": [],
36
+ "description": "Definition-of-done checks used to evaluate task completion",
37
+ "items": {
38
+ "type": "string"
39
+ }
40
+ },
33
41
  "status": {
34
42
  "type": "string",
35
43
  "enum": ["todo", "in_progress", "done"],