rafcode 3.0.0 → 3.8.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/.claude/settings.local.json +3 -1
- package/CLAUDE.md +0 -1
- package/RAF/38-dual-wielder/decisions.md +9 -0
- package/RAF/38-dual-wielder/input.md +6 -1
- package/RAF/38-dual-wielder/outcomes/8-e2e-test-codex-provider.md +139 -0
- package/RAF/38-dual-wielder/plans/8-e2e-test-codex-provider.md +95 -0
- package/RAF/39-pathless-rover/decisions.md +16 -0
- package/RAF/39-pathless-rover/input.md +2 -0
- package/RAF/39-pathless-rover/outcomes/1-fix-codex-stream-renderer.md +21 -0
- package/RAF/39-pathless-rover/outcomes/2-wire-provider-flag.md +28 -0
- package/RAF/39-pathless-rover/outcomes/3-remove-worktree-flag-do.md +41 -0
- package/RAF/39-pathless-rover/outcomes/4-remove-worktree-flag-plan-amend.md +30 -0
- package/RAF/39-pathless-rover/outcomes/5-update-prompts-and-docs.md +26 -0
- package/RAF/39-pathless-rover/plans/1-fix-codex-stream-renderer.md +43 -0
- package/RAF/39-pathless-rover/plans/2-wire-provider-flag.md +48 -0
- package/RAF/39-pathless-rover/plans/3-remove-worktree-flag-do.md +41 -0
- package/RAF/39-pathless-rover/plans/4-remove-worktree-flag-plan-amend.md +43 -0
- package/RAF/39-pathless-rover/plans/5-update-prompts-and-docs.md +31 -0
- package/RAF/40-numeric-order-fix/decisions.md +7 -0
- package/RAF/40-numeric-order-fix/input.md +19 -0
- package/RAF/40-numeric-order-fix/outcomes/1-fix-numeric-sort-order.md +18 -0
- package/RAF/40-numeric-order-fix/outcomes/2-add-npm-keywords.md +10 -0
- package/RAF/40-numeric-order-fix/plans/1-fix-numeric-sort-order.md +48 -0
- package/RAF/40-numeric-order-fix/plans/2-add-npm-keywords.md +23 -0
- package/RAF/41-echo-chamber/decisions.md +13 -0
- package/RAF/41-echo-chamber/input.md +4 -0
- package/RAF/41-echo-chamber/outcomes/1-update-codex-model-defaults.md +24 -0
- package/RAF/41-echo-chamber/outcomes/2-e2e-test-codex-provider.md +74 -0
- package/RAF/41-echo-chamber/plans/1-update-codex-model-defaults.md +28 -0
- package/RAF/41-echo-chamber/plans/2-e2e-test-codex-provider.md +103 -0
- package/RAF/42-patch-parade/decisions.md +29 -0
- package/RAF/42-patch-parade/input.md +9 -0
- package/RAF/42-patch-parade/outcomes/1-fix-codex-model-resolution.md +36 -0
- package/RAF/42-patch-parade/outcomes/2-fix-provider-aware-name-generation.md +31 -0
- package/RAF/42-patch-parade/outcomes/3-fix-codex-error-event-rendering.md +32 -0
- package/RAF/42-patch-parade/outcomes/4-update-cli-help-docs.md +28 -0
- package/RAF/42-patch-parade/outcomes/5-update-default-codex-models-to-gpt-5-4.md +33 -0
- package/RAF/42-patch-parade/outcomes/6-unify-model-config-schema.md +89 -0
- package/RAF/42-patch-parade/plans/1-fix-codex-model-resolution.md +35 -0
- package/RAF/42-patch-parade/plans/2-fix-provider-aware-name-generation.md +38 -0
- package/RAF/42-patch-parade/plans/3-fix-codex-error-event-rendering.md +32 -0
- package/RAF/42-patch-parade/plans/4-update-cli-help-docs.md +31 -0
- package/RAF/42-patch-parade/plans/5-update-default-codex-models-to-gpt-5-4.md +35 -0
- package/RAF/42-patch-parade/plans/6-unify-model-config-schema.md +46 -0
- package/RAF/43-swiss-army/decisions.md +34 -0
- package/RAF/43-swiss-army/input.md +7 -0
- package/RAF/43-swiss-army/outcomes/1-fix-model-validation.md +21 -0
- package/RAF/43-swiss-army/outcomes/2-update-commit-format.md +31 -0
- package/RAF/43-swiss-army/outcomes/3-wire-reasoning-effort.md +28 -0
- package/RAF/43-swiss-army/outcomes/4-remove-provider-flag.md +27 -0
- package/RAF/43-swiss-army/outcomes/5-config-wizard-validation.md +23 -0
- package/RAF/43-swiss-army/outcomes/6-add-fast-mode.md +32 -0
- package/RAF/43-swiss-army/outcomes/7-config-preset.md +31 -0
- package/RAF/43-swiss-army/plans/1-fix-model-validation.md +38 -0
- package/RAF/43-swiss-army/plans/2-update-commit-format.md +46 -0
- package/RAF/43-swiss-army/plans/3-wire-reasoning-effort.md +39 -0
- package/RAF/43-swiss-army/plans/4-remove-provider-flag.md +43 -0
- package/RAF/43-swiss-army/plans/5-config-wizard-validation.md +42 -0
- package/RAF/43-swiss-army/plans/6-add-fast-mode.md +46 -0
- package/RAF/43-swiss-army/plans/7-config-preset.md +51 -0
- package/RAF/44-config-api-change/decisions.md +22 -0
- package/RAF/44-config-api-change/input.md +5 -0
- package/RAF/44-config-api-change/outcomes/1-restructure-config-subcommands.md +19 -0
- package/RAF/44-config-api-change/outcomes/2-move-preset-under-config.md +17 -0
- package/RAF/44-config-api-change/outcomes/3-update-existing-tests-for-config-api.md +14 -0
- package/RAF/44-config-api-change/outcomes/4-update-config-command-docs.md +11 -0
- package/RAF/44-config-api-change/outcomes/5-fix-codex-name-generation.md +18 -0
- package/RAF/44-config-api-change/plans/1-restructure-config-subcommands.md +37 -0
- package/RAF/44-config-api-change/plans/2-move-preset-under-config.md +38 -0
- package/RAF/44-config-api-change/plans/3-update-existing-tests-for-config-api.md +38 -0
- package/RAF/44-config-api-change/plans/4-update-config-command-docs.md +36 -0
- package/RAF/44-config-api-change/plans/5-fix-codex-name-generation.md +49 -0
- package/RAF/45-signal-cairn/decisions.md +7 -0
- package/RAF/45-signal-cairn/input.md +2 -0
- package/RAF/45-signal-cairn/outcomes/1-rename-provider-to-harness.md +19 -0
- package/RAF/45-signal-cairn/outcomes/2-normalize-model-display-names.md +18 -0
- package/RAF/45-signal-cairn/plans/1-rename-provider-to-harness.md +40 -0
- package/RAF/45-signal-cairn/plans/2-normalize-model-display-names.md +41 -0
- package/RAF/45-signal-lantern/decisions.md +10 -0
- package/RAF/45-signal-lantern/input.md +2 -0
- package/RAF/45-signal-lantern/outcomes/1-add-effort-and-fast-to-do-model-display.md +15 -0
- package/RAF/45-signal-lantern/outcomes/2-capture-codex-post-run-token-usage.md +15 -0
- package/RAF/45-signal-lantern/outcomes/3-show-codex-token-summaries-without-fake-cost.md +14 -0
- package/RAF/45-signal-lantern/plans/1-add-effort-and-fast-to-do-model-display.md +38 -0
- package/RAF/45-signal-lantern/plans/2-capture-codex-post-run-token-usage.md +37 -0
- package/RAF/45-signal-lantern/plans/3-show-codex-token-summaries-without-fake-cost.md +40 -0
- package/RAF/46-lantern-arc/decisions.md +19 -0
- package/RAF/46-lantern-arc/input.md +6 -0
- package/RAF/46-lantern-arc/outcomes/1-remove-spark-alias.md +16 -0
- package/RAF/46-lantern-arc/outcomes/2-clean-up-worktree-plan-command.md +30 -0
- package/RAF/46-lantern-arc/outcomes/3-fix-token-usage-accumulation.md +32 -0
- package/RAF/46-lantern-arc/outcomes/4-display-effort-in-compact-mode.md +22 -0
- package/RAF/46-lantern-arc/outcomes/5-codex-fast-mode-research.md +38 -0
- package/RAF/46-lantern-arc/outcomes/6-optimize-llm-prompts.md +39 -0
- package/RAF/46-lantern-arc/plans/1-remove-spark-alias.md +38 -0
- package/RAF/46-lantern-arc/plans/2-clean-up-worktree-plan-command.md +33 -0
- package/RAF/46-lantern-arc/plans/3-fix-token-usage-accumulation.md +33 -0
- package/RAF/46-lantern-arc/plans/4-display-effort-in-compact-mode.md +28 -0
- package/RAF/46-lantern-arc/plans/5-codex-fast-mode-research.md +34 -0
- package/RAF/46-lantern-arc/plans/6-optimize-llm-prompts.md +48 -0
- package/RAF/47-signal-trim/decisions.md +13 -0
- package/RAF/47-signal-trim/input.md +2 -0
- package/RAF/47-signal-trim/plans/1-remove-cache-from-status.md +73 -0
- package/README.md +50 -63
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +47 -49
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/do.d.ts +2 -0
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +91 -230
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +54 -259
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/preset.d.ts +3 -0
- package/dist/commands/preset.d.ts.map +1 -0
- package/dist/commands/preset.js +158 -0
- package/dist/commands/preset.js.map +1 -0
- package/dist/core/claude-runner.d.ts +2 -0
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +36 -12
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/codex-runner.d.ts +1 -0
- package/dist/core/codex-runner.d.ts.map +1 -1
- package/dist/core/codex-runner.js +26 -7
- package/dist/core/codex-runner.js.map +1 -1
- package/dist/core/failure-analyzer.js +2 -1
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/git.d.ts +2 -2
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +53 -3
- package/dist/core/git.js.map +1 -1
- package/dist/core/project-manager.d.ts.map +1 -1
- package/dist/core/project-manager.js +2 -2
- package/dist/core/project-manager.js.map +1 -1
- package/dist/core/pull-request.js +5 -5
- package/dist/core/pull-request.js.map +1 -1
- package/dist/core/runner-factory.d.ts +4 -4
- package/dist/core/runner-factory.d.ts.map +1 -1
- package/dist/core/runner-factory.js +8 -8
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-interface.d.ts +1 -1
- package/dist/core/runner-types.d.ts +17 -4
- package/dist/core/runner-types.d.ts.map +1 -1
- package/dist/core/state-derivation.js +3 -3
- package/dist/core/state-derivation.js.map +1 -1
- package/dist/parsers/codex-stream-renderer.d.ts +28 -4
- package/dist/parsers/codex-stream-renderer.d.ts.map +1 -1
- package/dist/parsers/codex-stream-renderer.js +110 -0
- package/dist/parsers/codex-stream-renderer.js.map +1 -1
- package/dist/prompts/amend.d.ts +0 -1
- package/dist/prompts/amend.d.ts.map +1 -1
- package/dist/prompts/amend.js +31 -104
- package/dist/prompts/amend.js.map +1 -1
- package/dist/prompts/execution.d.ts.map +1 -1
- package/dist/prompts/execution.js +17 -34
- package/dist/prompts/execution.js.map +1 -1
- package/dist/prompts/planning.d.ts.map +1 -1
- package/dist/prompts/planning.js +23 -123
- package/dist/prompts/planning.js.map +1 -1
- package/dist/types/config.d.ts +33 -32
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +14 -28
- package/dist/types/config.js.map +1 -1
- package/dist/utils/config.d.ts +36 -16
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +209 -104
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/name-generator.d.ts.map +1 -1
- package/dist/utils/name-generator.js +25 -12
- package/dist/utils/name-generator.js.map +1 -1
- package/dist/utils/paths.d.ts +5 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +9 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/terminal-symbols.d.ts +15 -2
- package/dist/utils/terminal-symbols.d.ts.map +1 -1
- package/dist/utils/terminal-symbols.js +36 -4
- package/dist/utils/terminal-symbols.js.map +1 -1
- package/dist/utils/token-tracker.d.ts +6 -1
- package/dist/utils/token-tracker.d.ts.map +1 -1
- package/dist/utils/token-tracker.js +84 -51
- package/dist/utils/token-tracker.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -2
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +4 -25
- package/dist/utils/validation.js.map +1 -1
- package/package.json +7 -2
- package/src/commands/config.ts +60 -63
- package/src/commands/do.ts +96 -262
- package/src/commands/plan.ts +55 -279
- package/src/commands/preset.ts +186 -0
- package/src/core/claude-runner.ts +45 -5
- package/src/core/codex-runner.ts +32 -7
- package/src/core/failure-analyzer.ts +2 -1
- package/src/core/git.ts +57 -3
- package/src/core/project-manager.ts +2 -1
- package/src/core/pull-request.ts +5 -5
- package/src/core/runner-factory.ts +9 -9
- package/src/core/runner-interface.ts +1 -1
- package/src/core/runner-types.ts +17 -4
- package/src/core/state-derivation.ts +3 -3
- package/src/parsers/codex-stream-renderer.ts +149 -4
- package/src/prompts/amend.ts +30 -105
- package/src/prompts/config-docs.md +206 -62
- package/src/prompts/execution.ts +17 -34
- package/src/prompts/planning.ts +23 -124
- package/src/types/config.ts +47 -59
- package/src/utils/config.ts +248 -115
- package/src/utils/name-generator.ts +29 -13
- package/src/utils/paths.ts +10 -0
- package/src/utils/terminal-symbols.ts +46 -6
- package/src/utils/token-tracker.ts +96 -57
- package/src/utils/validation.ts +5 -30
- package/tests/unit/amend-prompt.test.ts +3 -2
- package/tests/unit/claude-runner-interactive.test.ts +21 -3
- package/tests/unit/claude-runner.test.ts +39 -0
- package/tests/unit/codex-runner.test.ts +163 -0
- package/tests/unit/codex-stream-renderer.test.ts +127 -0
- package/tests/unit/command-output.test.ts +57 -0
- package/tests/unit/commit-planning-artifacts-worktree.test.ts +24 -7
- package/tests/unit/commit-planning-artifacts.test.ts +26 -4
- package/tests/unit/config-command.test.ts +215 -303
- package/tests/unit/config.test.ts +319 -235
- package/tests/unit/dependency-integration.test.ts +27 -1
- package/tests/unit/do-model-display.test.ts +35 -0
- package/tests/unit/execution-prompt.test.ts +49 -19
- package/tests/unit/name-generator.test.ts +82 -12
- package/tests/unit/plan-command-auto-flag.test.ts +7 -10
- package/tests/unit/plan-command.test.ts +14 -17
- package/tests/unit/planning-prompt.test.ts +9 -8
- package/tests/unit/terminal-symbols.test.ts +94 -3
- package/tests/unit/token-tracker.test.ts +180 -1
- package/tests/unit/validation.test.ts +9 -41
- package/tests/unit/worktree-flag-override.test.ts +0 -186
|
@@ -9,21 +9,44 @@
|
|
|
9
9
|
* - TodoList: Task tracking (skipped)
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type { UsageData } from '../types/config.js';
|
|
12
13
|
import type { RenderResult } from './stream-renderer.js';
|
|
13
14
|
|
|
14
15
|
export interface CodexEvent {
|
|
15
16
|
type: string;
|
|
16
|
-
|
|
17
|
+
id?: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
/** Claude flat-format fields (AgentMessage) */
|
|
17
20
|
content?: string;
|
|
18
|
-
/**
|
|
21
|
+
/** Claude flat-format fields (CommandExecution) */
|
|
19
22
|
command?: string;
|
|
20
23
|
exit_code?: number;
|
|
21
|
-
/**
|
|
24
|
+
/** Claude flat-format fields (FileChange) */
|
|
22
25
|
file_path?: string;
|
|
23
26
|
change_kind?: string;
|
|
24
|
-
/**
|
|
27
|
+
/** Claude flat-format fields (McpToolCall) */
|
|
25
28
|
tool_name?: string;
|
|
26
29
|
server_name?: string;
|
|
30
|
+
/** Real Codex nested item (for item.completed / item.started) */
|
|
31
|
+
item?: {
|
|
32
|
+
type: string;
|
|
33
|
+
text?: string;
|
|
34
|
+
command?: string;
|
|
35
|
+
exit_code?: number;
|
|
36
|
+
path?: string;
|
|
37
|
+
change_kind?: string;
|
|
38
|
+
message?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Error message (for error / turn.failed events) */
|
|
41
|
+
message?: string;
|
|
42
|
+
/** Nested error object (for turn.failed events) */
|
|
43
|
+
error?: { message?: string };
|
|
44
|
+
/** Usage data (for turn.completed events) */
|
|
45
|
+
usage?: {
|
|
46
|
+
input_tokens?: number;
|
|
47
|
+
output_tokens?: number;
|
|
48
|
+
total_tokens?: number;
|
|
49
|
+
};
|
|
27
50
|
}
|
|
28
51
|
|
|
29
52
|
function truncate(text: string, maxLen: number): string {
|
|
@@ -65,6 +88,23 @@ export function renderCodexStreamEvent(line: string): RenderResult {
|
|
|
65
88
|
// Skip todo list events - minimal noise
|
|
66
89
|
return { display: '', textContent: '' };
|
|
67
90
|
|
|
91
|
+
// Real Codex CLI event types (nested format)
|
|
92
|
+
case 'item.completed':
|
|
93
|
+
return renderItemCompleted(event);
|
|
94
|
+
|
|
95
|
+
case 'item.started':
|
|
96
|
+
// Skip started events — we render on completion
|
|
97
|
+
return { display: '', textContent: '' };
|
|
98
|
+
|
|
99
|
+
case 'turn.completed':
|
|
100
|
+
return renderTurnCompleted(event);
|
|
101
|
+
|
|
102
|
+
case 'error':
|
|
103
|
+
return renderError(event);
|
|
104
|
+
|
|
105
|
+
case 'turn.failed':
|
|
106
|
+
return renderTurnFailed(event);
|
|
107
|
+
|
|
68
108
|
default:
|
|
69
109
|
// Skip unknown event types gracefully
|
|
70
110
|
return { display: '', textContent: '' };
|
|
@@ -106,3 +146,108 @@ function renderMcpToolCall(event: CodexEvent): RenderResult {
|
|
|
106
146
|
textContent: '',
|
|
107
147
|
};
|
|
108
148
|
}
|
|
149
|
+
|
|
150
|
+
// --- Real Codex CLI event handlers (nested format) ---
|
|
151
|
+
|
|
152
|
+
function renderItemCompleted(event: CodexEvent): RenderResult {
|
|
153
|
+
const item = event.item;
|
|
154
|
+
if (!item) return { display: '', textContent: '' };
|
|
155
|
+
|
|
156
|
+
switch (item.type) {
|
|
157
|
+
case 'agent_message': {
|
|
158
|
+
const text = item.text ?? '';
|
|
159
|
+
return {
|
|
160
|
+
display: text ? text + '\n' : '',
|
|
161
|
+
textContent: text,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
case 'command_execution': {
|
|
165
|
+
const cmd = item.command ?? '';
|
|
166
|
+
const exitCode = item.exit_code ?? 0;
|
|
167
|
+
const status = exitCode === 0 ? '✓' : `✗ exit ${exitCode}`;
|
|
168
|
+
return {
|
|
169
|
+
display: ` → Running: ${truncate(cmd, 120)} [${status}]\n`,
|
|
170
|
+
textContent: '',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
case 'file_change': {
|
|
174
|
+
const filePath = item.path ?? 'unknown';
|
|
175
|
+
const kind = item.change_kind ?? 'modified';
|
|
176
|
+
return {
|
|
177
|
+
display: ` → File ${kind}: ${filePath}\n`,
|
|
178
|
+
textContent: '',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
case 'error': {
|
|
182
|
+
const msg = item.message ?? 'Unknown error';
|
|
183
|
+
return {
|
|
184
|
+
display: ` ✗ Error: ${msg}\n`,
|
|
185
|
+
textContent: msg,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
default:
|
|
189
|
+
return { display: '', textContent: '' };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function renderTurnCompleted(event: CodexEvent): RenderResult {
|
|
194
|
+
const usageData = extractUsageData(event);
|
|
195
|
+
|
|
196
|
+
if (event.usage) {
|
|
197
|
+
const { input_tokens, output_tokens } = event.usage;
|
|
198
|
+
const parts: string[] = [];
|
|
199
|
+
if (input_tokens !== undefined) parts.push(`in: ${input_tokens}`);
|
|
200
|
+
if (output_tokens !== undefined) parts.push(`out: ${output_tokens}`);
|
|
201
|
+
if (parts.length > 0) {
|
|
202
|
+
return {
|
|
203
|
+
display: ` → Usage: ${parts.join(', ')}\n`,
|
|
204
|
+
textContent: '',
|
|
205
|
+
usageData,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { display: '', textContent: '', usageData };
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function extractUsageData(event: CodexEvent): UsageData | undefined {
|
|
213
|
+
if (!event.usage) {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const modelId = event.model ?? 'codex';
|
|
218
|
+
const inputTokens = event.usage.input_tokens ?? 0;
|
|
219
|
+
const outputTokens = event.usage.output_tokens ?? 0;
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
inputTokens,
|
|
223
|
+
outputTokens,
|
|
224
|
+
cacheReadInputTokens: 0,
|
|
225
|
+
cacheCreationInputTokens: 0,
|
|
226
|
+
modelUsage: {
|
|
227
|
+
[modelId]: {
|
|
228
|
+
inputTokens,
|
|
229
|
+
outputTokens,
|
|
230
|
+
cacheReadInputTokens: 0,
|
|
231
|
+
cacheCreationInputTokens: 0,
|
|
232
|
+
costUsd: null,
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
totalCostUsd: null,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function renderError(event: CodexEvent): RenderResult {
|
|
240
|
+
const msg = event.message ?? 'Unknown error';
|
|
241
|
+
return {
|
|
242
|
+
display: ` ✗ Error: ${msg}\n`,
|
|
243
|
+
textContent: msg,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function renderTurnFailed(event: CodexEvent): RenderResult {
|
|
248
|
+
const msg = event.error?.message ?? event.message ?? 'Turn failed';
|
|
249
|
+
return {
|
|
250
|
+
display: ` ✗ Failed: ${msg}\n`,
|
|
251
|
+
textContent: msg,
|
|
252
|
+
};
|
|
253
|
+
}
|
package/src/prompts/amend.ts
CHANGED
|
@@ -6,7 +6,6 @@ export interface AmendPromptParams {
|
|
|
6
6
|
existingTasks: Array<DerivedTask & { taskName: string }>;
|
|
7
7
|
nextTaskNumber: number;
|
|
8
8
|
newTaskDescription: string;
|
|
9
|
-
worktreeMode?: boolean;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
11
|
export interface AmendPromptResult {
|
|
@@ -25,9 +24,7 @@ export function getAmendPrompt(params: AmendPromptParams): AmendPromptResult {
|
|
|
25
24
|
existingTasks,
|
|
26
25
|
nextTaskNumber,
|
|
27
26
|
newTaskDescription,
|
|
28
|
-
worktreeMode,
|
|
29
27
|
} = params;
|
|
30
|
-
const worktreeFlag = worktreeMode ? ' --worktree' : '';
|
|
31
28
|
|
|
32
29
|
const existingTasksSummary = existingTasks
|
|
33
30
|
.map((task) => {
|
|
@@ -59,15 +56,14 @@ export function getAmendPrompt(params: AmendPromptParams): AmendPromptResult {
|
|
|
59
56
|
? modifiableTasks.map((t) => `- Task ${t.id}: ${t.taskName}`).join('\n')
|
|
60
57
|
: '(none)';
|
|
61
58
|
|
|
62
|
-
const systemPrompt = `You are a project planning assistant for RAF (Ralph's Automation Framework).
|
|
59
|
+
const systemPrompt = `You are a project planning assistant for RAF (Ralph's Automation Framework). Add new tasks or modify pending tasks in an existing project.
|
|
63
60
|
|
|
64
|
-
##
|
|
61
|
+
## Amendment Mode
|
|
65
62
|
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
- You can create NEW tasks starting from number ${encodeTaskId(nextTaskNumber)}
|
|
63
|
+
- [PROTECTED] tasks (completed): NEVER modify — their outcomes depend on the original plan
|
|
64
|
+
- [MODIFIABLE] tasks (pending/failed): MAY modify if the user requests changes
|
|
65
|
+
- Do NOT renumber existing tasks
|
|
66
|
+
- New tasks start from number ${encodeTaskId(nextTaskNumber)}
|
|
71
67
|
|
|
72
68
|
## Project Location
|
|
73
69
|
|
|
@@ -75,54 +71,30 @@ Project folder: ${projectPath}
|
|
|
75
71
|
|
|
76
72
|
## Existing Tasks
|
|
77
73
|
|
|
78
|
-
The following tasks already exist in this project:
|
|
79
|
-
|
|
80
74
|
${existingTasksSummary}
|
|
81
75
|
|
|
82
|
-
### Protected
|
|
76
|
+
### Protected (COMPLETED)
|
|
83
77
|
${protectedTasksList}
|
|
84
78
|
|
|
85
|
-
### Modifiable
|
|
79
|
+
### Modifiable (PENDING/FAILED)
|
|
86
80
|
${modifiableTasksList}
|
|
87
81
|
|
|
88
82
|
## Instructions
|
|
89
83
|
|
|
90
84
|
### Step 1: Read Context
|
|
91
85
|
|
|
92
|
-
|
|
93
|
-
- ${projectPath}/input.md
|
|
94
|
-
|
|
95
|
-
And review existing decisions from:
|
|
96
|
-
- ${projectPath}/decisions.md (if it exists)
|
|
86
|
+
Read the original project description (\`${projectPath}/input.md\`) and existing decisions (\`${projectPath}/decisions.md\`, if it exists).
|
|
97
87
|
|
|
98
88
|
### Step 2: Analyze New Requirements
|
|
99
89
|
|
|
100
|
-
|
|
101
|
-
- How the new tasks relate to existing ones
|
|
102
|
-
- Dependencies on completed tasks (check the ## Dependencies section in existing plan files)
|
|
103
|
-
- Whether new tasks should reference existing task outcomes
|
|
104
|
-
|
|
105
|
-
**Identifying Follow-up Tasks**: When a new task is a follow-up, fix, or iteration of a previously completed task, you MUST reference the previous task's outcome in the new plan's Context section. This gives the executing agent full context about what was done before.
|
|
106
|
-
|
|
107
|
-
Use this format in the Context section:
|
|
90
|
+
Consider how new tasks relate to existing ones and their dependencies. For follow-up/fix tasks, reference the previous task's outcome in the Context section:
|
|
108
91
|
\`This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md\`
|
|
109
92
|
|
|
110
|
-
The outcome file paths for completed tasks are listed above in the Existing Tasks section.
|
|
111
|
-
|
|
112
93
|
### Step 3: Interview the User
|
|
113
94
|
|
|
114
|
-
For EACH new task
|
|
115
|
-
- Specific requirements and constraints
|
|
116
|
-
- Technology preferences
|
|
117
|
-
- Any existing code or patterns to follow
|
|
118
|
-
- Edge cases to handle
|
|
119
|
-
|
|
120
|
-
### Step 3.5: Record Decisions
|
|
95
|
+
For EACH new task, use AskUserQuestion to gather specific requirements, technology preferences, existing patterns, and edge cases.
|
|
121
96
|
|
|
122
|
-
After EACH
|
|
123
|
-
- ${projectPath}/decisions.md
|
|
124
|
-
|
|
125
|
-
Use this format:
|
|
97
|
+
After EACH answer, append the Q&A to \`${projectPath}/decisions.md\`:
|
|
126
98
|
\`\`\`markdown
|
|
127
99
|
## [Question asked]
|
|
128
100
|
[User's answer]
|
|
@@ -130,12 +102,9 @@ Use this format:
|
|
|
130
102
|
|
|
131
103
|
### Step 4: Create New Plan Files
|
|
132
104
|
|
|
133
|
-
|
|
134
|
-
- ${projectPath}/plans/${encodeTaskId(nextTaskNumber)}-task-name.md
|
|
135
|
-
- ${projectPath}/plans/${encodeTaskId(nextTaskNumber + 1)}-task-name.md
|
|
136
|
-
- etc.
|
|
105
|
+
Create plan files starting from \`${projectPath}/plans/${encodeTaskId(nextTaskNumber)}-task-name.md\`. Use kebab-case names.
|
|
137
106
|
|
|
138
|
-
Each plan file MUST have
|
|
107
|
+
Each plan file MUST have this structure:
|
|
139
108
|
|
|
140
109
|
\`\`\`markdown
|
|
141
110
|
---
|
|
@@ -144,95 +113,51 @@ effort: medium
|
|
|
144
113
|
# Task: [Task Name]
|
|
145
114
|
|
|
146
115
|
## Objective
|
|
147
|
-
[Clear, one-sentence description
|
|
116
|
+
[Clear, one-sentence description]
|
|
148
117
|
|
|
149
118
|
## Context
|
|
150
|
-
[Why this task is needed,
|
|
151
|
-
[
|
|
152
|
-
[For follow-up/fix tasks: "This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md"]
|
|
119
|
+
[Why this task is needed, relation to existing tasks]
|
|
120
|
+
[For follow-ups: "This is a follow-up to task NN. See outcome: {projectPath}/outcomes/NN-task-name.md"]
|
|
153
121
|
|
|
154
122
|
## Dependencies
|
|
155
|
-
[Optional
|
|
156
|
-
[Comma-separated list of task IDs this task depends on, e.g., "1, 2"]
|
|
157
|
-
[If a dependency fails, this task will be automatically blocked]
|
|
123
|
+
[Optional — omit if none. Comma-separated task IDs, e.g., "1, 2"]
|
|
158
124
|
|
|
159
125
|
## Requirements
|
|
160
|
-
[Specific requirements gathered from the user interview]
|
|
161
126
|
- Requirement 1
|
|
162
127
|
- Requirement 2
|
|
163
|
-
- ...
|
|
164
128
|
|
|
165
129
|
## Implementation Steps
|
|
166
130
|
1. [Step 1]
|
|
167
131
|
2. [Step 2]
|
|
168
|
-
3. [Step 3]
|
|
169
|
-
...
|
|
170
132
|
|
|
171
133
|
## Acceptance Criteria
|
|
172
134
|
- [ ] Criterion 1
|
|
173
135
|
- [ ] Criterion 2
|
|
174
|
-
- [ ] All tests pass
|
|
175
136
|
|
|
176
137
|
## Notes
|
|
177
|
-
[
|
|
178
|
-
[Reference to existing task outcomes if relevant]
|
|
179
|
-
\`\`\`
|
|
180
|
-
|
|
181
|
-
### Frontmatter Requirements
|
|
182
|
-
|
|
183
|
-
The \`effort\` field is REQUIRED in every plan file. It indicates task complexity and determines which model will execute the task:
|
|
184
|
-
- \`effort: low\` — Trivial/mechanical changes, simple one-file edits, config changes
|
|
185
|
-
- \`effort: medium\` — Well-scoped feature work, bug fixes with clear plans, multi-file changes following existing patterns
|
|
186
|
-
- \`effort: high\` — Architectural changes, complex logic, tasks requiring deep codebase understanding
|
|
187
|
-
|
|
188
|
-
Optionally, you can add an explicit \`model\` field to override the effort-based model selection:
|
|
189
|
-
\`\`\`markdown
|
|
190
|
-
---
|
|
191
|
-
effort: medium
|
|
192
|
-
model: opus
|
|
193
|
-
---
|
|
194
|
-
# Task: ...
|
|
138
|
+
[Additional context, warnings, references to existing task outcomes]
|
|
195
139
|
\`\`\`
|
|
196
140
|
|
|
197
|
-
|
|
141
|
+
**Frontmatter fields:**
|
|
142
|
+
- \`effort\` (REQUIRED): \`low\` (trivial/mechanical), \`medium\` (well-scoped feature work), \`high\` (architectural/complex)
|
|
143
|
+
- \`model\` (optional): Override effort-based model selection. Rarely needed.
|
|
198
144
|
|
|
199
145
|
### Step 5: Confirm Completion
|
|
200
146
|
|
|
201
|
-
|
|
202
|
-
1. Provide a summary of:
|
|
203
|
-
- The new tasks you've created, including the effort level for each task. Example format:
|
|
204
|
-
- Task 2: add-caching (effort: medium)
|
|
205
|
-
- Task 3: update-docs (effort: low)
|
|
206
|
-
- How they relate to existing tasks
|
|
207
|
-
- Total task count in the project
|
|
208
|
-
2. Display this exit message to the user:
|
|
147
|
+
Summarize new tasks with effort levels, their relation to existing tasks, and total task count. Then display:
|
|
209
148
|
|
|
210
149
|
\`\`\`
|
|
211
150
|
Planning complete! To exit this session and run your tasks:
|
|
212
151
|
1. Press Ctrl-C twice to exit
|
|
213
|
-
2. Then run: raf do <project
|
|
152
|
+
2. Then run: raf do <project>
|
|
214
153
|
\`\`\`
|
|
215
154
|
|
|
216
|
-
##
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
5. Use descriptive, kebab-case names for plan files
|
|
223
|
-
6. Each plan should be self-contained with all context needed
|
|
224
|
-
7. Specify task dependencies using the ## Dependencies section with task IDs only (e.g., "1, 2")
|
|
225
|
-
8. Tasks without dependencies should omit the Dependencies section entirely
|
|
226
|
-
9. Be specific - vague plans lead to poor execution
|
|
227
|
-
10. ALWAYS include the \`effort\` frontmatter field in every plan file — assess each task's complexity
|
|
228
|
-
|
|
229
|
-
## Plan Output Style
|
|
230
|
-
|
|
231
|
-
Plans can include whatever level of detail you deem helpful for the executing agent. Use your judgment:
|
|
232
|
-
- Include implementation details when they clarify the approach
|
|
233
|
-
- Code snippets are acceptable when they help illustrate a specific pattern
|
|
234
|
-
- File paths are helpful when referencing existing project files, patterns, or directories
|
|
235
|
-
- Focus on clarity — the goal is for the executing agent to understand what needs to be done`;
|
|
155
|
+
## Rules
|
|
156
|
+
|
|
157
|
+
- Always interview the user before creating or modifying plans
|
|
158
|
+
- Each plan must be self-contained with all context needed
|
|
159
|
+
- Be specific — vague plans lead to poor execution
|
|
160
|
+
- Include implementation details, code snippets, and file paths when they clarify the approach`;
|
|
236
161
|
|
|
237
162
|
const userMessage = `I want to add the following new tasks to this project:
|
|
238
163
|
|