rafcode 1.0.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 +32 -0
- package/CLAUDE.md +187 -0
- package/LICENSE +21 -0
- package/RAF/001-raf-task-improvements/input.md +9 -0
- package/RAF/001-raf-task-improvements/outcomes/001-add-decisions-folder.md +21 -0
- package/RAF/001-raf-task-improvements/outcomes/002-fix-write-error-on-shutdown.md +22 -0
- package/RAF/001-raf-task-improvements/outcomes/003-stash-changes-on-failure.md +34 -0
- package/RAF/001-raf-task-improvements/outcomes/004-add-project-name-to-commits.md +28 -0
- package/RAF/001-raf-task-improvements/outcomes/005-add-running-time-display.md +36 -0
- package/RAF/001-raf-task-improvements/outcomes/006-add-task-name-to-logs.md +22 -0
- package/RAF/001-raf-task-improvements/outcomes/007-show-model-at-task-start.md +52 -0
- package/RAF/001-raf-task-improvements/outcomes/009-remove-editor-placeholder-text.md +20 -0
- package/RAF/001-raf-task-improvements/outcomes/SUMMARY.md +83 -0
- package/RAF/001-raf-task-improvements/plans/001-add-decisions-folder.md +38 -0
- package/RAF/001-raf-task-improvements/plans/002-fix-write-error-on-shutdown.md +33 -0
- package/RAF/001-raf-task-improvements/plans/003-stash-changes-on-failure.md +37 -0
- package/RAF/001-raf-task-improvements/plans/004-add-project-name-to-commits.md +34 -0
- package/RAF/001-raf-task-improvements/plans/005-add-running-time-display.md +39 -0
- package/RAF/001-raf-task-improvements/plans/006-add-task-name-to-logs.md +37 -0
- package/RAF/001-raf-task-improvements/plans/009-remove-editor-placeholder-text.md +34 -0
- package/RAF/002-raf-task-improvements-execution/decisions/DECISIONS.md +13 -0
- package/RAF/002-raf-task-improvements-execution/input.md +3 -0
- package/RAF/002-raf-task-improvements-execution/outcomes/001-commit-show-model-at-task-start.md +17 -0
- package/RAF/002-raf-task-improvements-execution/outcomes/002-delete-skipped-plan.md +23 -0
- package/RAF/002-raf-task-improvements-execution/outcomes/SUMMARY.md +32 -0
- package/RAF/002-raf-task-improvements-execution/plans/001-commit-show-model-at-task-start.md +37 -0
- package/RAF/002-raf-task-improvements-execution/plans/002-delete-skipped-plan.md +23 -0
- package/RAF/003-multi-project-execution/decisions/DECISIONS.md +68 -0
- package/RAF/003-multi-project-execution/input.md +6 -0
- package/RAF/003-multi-project-execution/outcomes/001-remove-state-json.md +52 -0
- package/RAF/003-multi-project-execution/outcomes/002-update-raf-status.md +50 -0
- package/RAF/003-multi-project-execution/outcomes/003-simplify-git-logic.md +35 -0
- package/RAF/003-multi-project-execution/outcomes/004-auto-commit-planning.md +43 -0
- package/RAF/003-multi-project-execution/outcomes/005-rerun-failed-tasks.md +43 -0
- package/RAF/003-multi-project-execution/outcomes/006-multi-project-execution.md +42 -0
- package/RAF/003-multi-project-execution/outcomes/007-verify-timeout.md +54 -0
- package/RAF/003-multi-project-execution/outcomes/008-move-decisions-file.md +38 -0
- package/RAF/003-multi-project-execution/outcomes/SUMMARY.md +79 -0
- package/RAF/003-multi-project-execution/plans/001-remove-state-json.md +71 -0
- package/RAF/003-multi-project-execution/plans/002-update-raf-status.md +65 -0
- package/RAF/003-multi-project-execution/plans/003-simplify-git-logic.md +74 -0
- package/RAF/003-multi-project-execution/plans/004-auto-commit-planning.md +57 -0
- package/RAF/003-multi-project-execution/plans/005-rerun-failed-tasks.md +69 -0
- package/RAF/003-multi-project-execution/plans/006-multi-project-execution.md +81 -0
- package/RAF/003-multi-project-execution/plans/007-verify-timeout.md +63 -0
- package/RAF/003-multi-project-execution/plans/008-move-decisions-file.md +78 -0
- package/RAF/004-task-naming-optimization/decisions.md +22 -0
- package/RAF/004-task-naming-optimization/input.md +6 -0
- package/RAF/004-task-naming-optimization/outcomes/001-remove-summary-file.md +17 -0
- package/RAF/004-task-naming-optimization/outcomes/002-base36-project-numbering.md +32 -0
- package/RAF/004-task-naming-optimization/outcomes/003-improve-haiku-prompt.md +20 -0
- package/RAF/004-task-naming-optimization/outcomes/SUMMARY.md +28 -0
- package/RAF/004-task-naming-optimization/plans/001-remove-summary-file.md +34 -0
- package/RAF/004-task-naming-optimization/plans/002-base36-project-numbering.md +56 -0
- package/RAF/004-task-naming-optimization/plans/003-improve-haiku-prompt.md +50 -0
- package/RAF/005-task-naming-improvements/decisions.md +60 -0
- package/RAF/005-task-naming-improvements/input.md +2 -0
- package/RAF/005-task-naming-improvements/outcomes/001-enhance-identifier-resolution.md +42 -0
- package/RAF/005-task-naming-improvements/outcomes/002-add-identifier-support-to-status.md +38 -0
- package/RAF/005-task-naming-improvements/outcomes/003-update-do-for-full-folder-names.md +44 -0
- package/RAF/005-task-naming-improvements/outcomes/004-implement-amend-flag-for-plan.md +55 -0
- package/RAF/005-task-naming-improvements/outcomes/005-commit-outcomes-on-complete.md +47 -0
- package/RAF/005-task-naming-improvements/outcomes/006-update-execution-prompt-commit-schema.md +40 -0
- package/RAF/005-task-naming-improvements/outcomes/007-allow-pending-task-amendments.md +38 -0
- package/RAF/005-task-naming-improvements/outcomes/008-fix-timeout-label.md +24 -0
- package/RAF/005-task-naming-improvements/plans/001-enhance-identifier-resolution.md +46 -0
- package/RAF/005-task-naming-improvements/plans/002-add-identifier-support-to-status.md +36 -0
- package/RAF/005-task-naming-improvements/plans/003-update-do-for-full-folder-names.md +38 -0
- package/RAF/005-task-naming-improvements/plans/004-implement-amend-flag-for-plan.md +67 -0
- package/RAF/005-task-naming-improvements/plans/005-commit-outcomes-on-complete.md +86 -0
- package/RAF/005-task-naming-improvements/plans/006-update-execution-prompt-commit-schema.md +60 -0
- package/RAF/005-task-naming-improvements/plans/007-allow-pending-task-amendments.md +60 -0
- package/RAF/005-task-naming-improvements/plans/008-fix-timeout-label.md +31 -0
- package/RAF/006-fix-double-summary-headers/decisions.md +28 -0
- package/RAF/006-fix-double-summary-headers/input.md +3 -0
- package/RAF/006-fix-double-summary-headers/outcomes/001-fix-double-summary-headers.md +29 -0
- package/RAF/006-fix-double-summary-headers/outcomes/002-update-readme-for-npm.md +31 -0
- package/RAF/006-fix-double-summary-headers/outcomes/003-npm-publish-instructions.md +30 -0
- package/RAF/006-fix-double-summary-headers/outcomes/004-flexible-project-lookup.md +47 -0
- package/RAF/006-fix-double-summary-headers/plans/001-fix-double-summary-headers.md +42 -0
- package/RAF/006-fix-double-summary-headers/plans/002-update-readme-for-npm.md +44 -0
- package/RAF/006-fix-double-summary-headers/plans/003-npm-publish-instructions.md +45 -0
- package/RAF/006-fix-double-summary-headers/plans/004-flexible-project-lookup.md +40 -0
- package/RAF/007-improve-outcome-format/decisions.md +28 -0
- package/RAF/007-improve-outcome-format/input.md +2 -0
- package/RAF/007-improve-outcome-format/outcomes/001-update-execution-prompt.md +10 -0
- package/RAF/007-improve-outcome-format/outcomes/002-update-state-derivation.md +17 -0
- package/RAF/007-improve-outcome-format/outcomes/003-update-do-command-outcome-handling.md +16 -0
- package/RAF/007-improve-outcome-format/outcomes/004-implement-failure-analysis.md +16 -0
- package/RAF/007-improve-outcome-format/outcomes/005-update-documentation.md +15 -0
- package/RAF/007-improve-outcome-format/plans/001-update-execution-prompt.md +36 -0
- package/RAF/007-improve-outcome-format/plans/002-update-state-derivation.md +35 -0
- package/RAF/007-improve-outcome-format/plans/003-update-do-command-outcome-handling.md +37 -0
- package/RAF/007-improve-outcome-format/plans/004-implement-failure-analysis.md +44 -0
- package/RAF/007-improve-outcome-format/plans/005-update-documentation.md +33 -0
- package/RAF/008-beautiful-do/decisions.md +31 -0
- package/RAF/008-beautiful-do/input.md +1 -0
- package/RAF/008-beautiful-do/outcomes/001-terminal-symbols.md +55 -0
- package/RAF/008-beautiful-do/outcomes/002-refactor-do-output.md +95 -0
- package/RAF/008-beautiful-do/outcomes/003-refactor-status-output.md +71 -0
- package/RAF/008-beautiful-do/outcomes/004-simplify-logger.md +53 -0
- package/RAF/008-beautiful-do/outcomes/005-add-tests.md +41 -0
- package/RAF/008-beautiful-do/plans/001-terminal-symbols.md +41 -0
- package/RAF/008-beautiful-do/plans/002-refactor-do-output.md +44 -0
- package/RAF/008-beautiful-do/plans/003-refactor-status-output.md +37 -0
- package/RAF/008-beautiful-do/plans/004-simplify-logger.md +32 -0
- package/RAF/008-beautiful-do/plans/005-add-tests.md +40 -0
- package/RAF/009-system-promt-ammend/decisions.md +13 -0
- package/RAF/009-system-promt-ammend/input.md +9 -0
- package/RAF/009-system-promt-ammend/outcomes/001-model-override.md +79 -0
- package/RAF/009-system-promt-ammend/outcomes/002-system-prompt-append.md +51 -0
- package/RAF/009-system-promt-ammend/outcomes/003-retry-context.md +60 -0
- package/RAF/009-system-promt-ammend/plans/001-model-override.md +61 -0
- package/RAF/009-system-promt-ammend/plans/002-system-prompt-append.md +56 -0
- package/RAF/009-system-promt-ammend/plans/003-retry-context.md +76 -0
- package/RAF/010-outcome-marker-fallback/decisions.md +19 -0
- package/RAF/010-outcome-marker-fallback/input.md +1 -0
- package/RAF/010-outcome-marker-fallback/outcomes/001-outcome-file-marker-fallback.md +35 -0
- package/RAF/010-outcome-marker-fallback/outcomes/002-creative-project-naming.md +47 -0
- package/RAF/010-outcome-marker-fallback/plans/001-outcome-file-marker-fallback.md +58 -0
- package/RAF/010-outcome-marker-fallback/plans/002-creative-project-naming.md +68 -0
- package/RAF/011-do-task-in-commit/decisions.md +22 -0
- package/RAF/011-do-task-in-commit/input.md +1 -0
- package/RAF/011-do-task-in-commit/outcomes/001-update-execution-prompt.md +54 -0
- package/RAF/011-do-task-in-commit/outcomes/002-update-tests.md +61 -0
- package/RAF/011-do-task-in-commit/outcomes/003-update-documentation.md +51 -0
- package/RAF/011-do-task-in-commit/plans/001-update-execution-prompt.md +46 -0
- package/RAF/011-do-task-in-commit/plans/002-update-tests.md +51 -0
- package/RAF/011-do-task-in-commit/plans/003-update-documentation.md +45 -0
- package/RAF/012-name-picker-buffet/decisions.md +40 -0
- package/RAF/012-name-picker-buffet/input.md +6 -0
- package/RAF/012-name-picker-buffet/outcomes/001-name-picker-for-raf-plan.md +49 -0
- package/RAF/012-name-picker-buffet/outcomes/002-interactive-project-picker-for-raf-do.md +49 -0
- package/RAF/012-name-picker-buffet/outcomes/003-raf-status-truncation.md +55 -0
- package/RAF/012-name-picker-buffet/outcomes/004-failure-reason-details.md +65 -0
- package/RAF/012-name-picker-buffet/outcomes/005-remove-raf-commits.md +57 -0
- package/RAF/012-name-picker-buffet/outcomes/006-update-execution-prompt-for-commits.md +47 -0
- package/RAF/012-name-picker-buffet/outcomes/007-fix-plan-mode-user-prompt.md +83 -0
- package/RAF/012-name-picker-buffet/outcomes/008-add-auto-flag-for-plan-mode.md +77 -0
- package/RAF/012-name-picker-buffet/plans/001-name-picker-for-raf-plan.md +47 -0
- package/RAF/012-name-picker-buffet/plans/002-interactive-project-picker-for-raf-do.md +43 -0
- package/RAF/012-name-picker-buffet/plans/003-raf-status-truncation.md +36 -0
- package/RAF/012-name-picker-buffet/plans/004-failure-reason-details.md +46 -0
- package/RAF/012-name-picker-buffet/plans/005-remove-raf-commits.md +42 -0
- package/RAF/012-name-picker-buffet/plans/006-update-execution-prompt-for-commits.md +47 -0
- package/RAF/012-name-picker-buffet/plans/007-fix-plan-mode-user-prompt.md +55 -0
- package/RAF/012-name-picker-buffet/plans/008-add-auto-flag-for-plan-mode.md +49 -0
- package/RAF/013-dependencies-watchdog/decisions.md +37 -0
- package/RAF/013-dependencies-watchdog/input.md +1 -0
- package/RAF/013-dependencies-watchdog/outcomes/001-define-dependency-syntax.md +56 -0
- package/RAF/013-dependencies-watchdog/outcomes/002-update-planning-prompts.md +60 -0
- package/RAF/013-dependencies-watchdog/outcomes/003-parse-dependencies-update-state.md +81 -0
- package/RAF/013-dependencies-watchdog/outcomes/004-implement-dependency-checking-in-do.md +116 -0
- package/RAF/013-dependencies-watchdog/outcomes/005-update-execution-prompts.md +75 -0
- package/RAF/013-dependencies-watchdog/outcomes/006-add-tests.md +100 -0
- package/RAF/013-dependencies-watchdog/outcomes/007-add-act-alias.md +46 -0
- package/RAF/013-dependencies-watchdog/outcomes/008-add-exit-message.md +52 -0
- package/RAF/013-dependencies-watchdog/plans/001-define-dependency-syntax.md +32 -0
- package/RAF/013-dependencies-watchdog/plans/002-update-planning-prompts.md +38 -0
- package/RAF/013-dependencies-watchdog/plans/003-parse-dependencies-update-state.md +46 -0
- package/RAF/013-dependencies-watchdog/plans/004-implement-dependency-checking-in-do.md +48 -0
- package/RAF/013-dependencies-watchdog/plans/005-update-execution-prompts.md +44 -0
- package/RAF/013-dependencies-watchdog/plans/006-add-tests.md +54 -0
- package/RAF/013-dependencies-watchdog/plans/007-add-act-alias.md +26 -0
- package/RAF/013-dependencies-watchdog/plans/008-add-exit-message.md +31 -0
- package/RAF/014-watchdog/decisions.md +16 -0
- package/RAF/014-watchdog/input.md +2 -0
- package/RAF/014-watchdog/outcomes/001-amend-flag-position.md +50 -0
- package/RAF/014-watchdog/outcomes/002-details-only-on-failure.md +58 -0
- package/RAF/014-watchdog/plans/001-amend-flag-position.md +34 -0
- package/RAF/014-watchdog/plans/002-details-only-on-failure.md +46 -0
- package/RAF/015-name-lottery/decisions.md +14 -0
- package/RAF/015-name-lottery/input.md +3 -0
- package/RAF/015-name-lottery/outcomes/001-auto-pick-project-name.md +31 -0
- package/RAF/015-name-lottery/outcomes/002-mention-plan-files-in-commit.md +23 -0
- package/RAF/015-name-lottery/outcomes/003-fix-input-md-in-amend-flow.md +44 -0
- package/RAF/015-name-lottery/plans/001-auto-pick-project-name.md +38 -0
- package/RAF/015-name-lottery/plans/002-mention-plan-files-in-commit.md +32 -0
- package/RAF/015-name-lottery/plans/003-fix-input-md-in-amend-flow.md +44 -0
- package/README.md +116 -0
- package/dist/commands/do.d.ts +12 -0
- package/dist/commands/do.d.ts.map +1 -0
- package/dist/commands/do.js +684 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +345 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +117 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/claude-runner.d.ts +78 -0
- package/dist/core/claude-runner.d.ts.map +1 -0
- package/dist/core/claude-runner.js +297 -0
- package/dist/core/claude-runner.js.map +1 -0
- package/dist/core/editor.d.ts +10 -0
- package/dist/core/editor.d.ts.map +1 -0
- package/dist/core/editor.js +77 -0
- package/dist/core/editor.js.map +1 -0
- package/dist/core/failure-analyzer.d.ts +28 -0
- package/dist/core/failure-analyzer.d.ts.map +1 -0
- package/dist/core/failure-analyzer.js +305 -0
- package/dist/core/failure-analyzer.js.map +1 -0
- package/dist/core/git.d.ts +42 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +148 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/project-manager.d.ts +72 -0
- package/dist/core/project-manager.d.ts.map +1 -0
- package/dist/core/project-manager.js +193 -0
- package/dist/core/project-manager.js.map +1 -0
- package/dist/core/retry-handler.d.ts +19 -0
- package/dist/core/retry-handler.d.ts.map +1 -0
- package/dist/core/retry-handler.js +51 -0
- package/dist/core/retry-handler.js.map +1 -0
- package/dist/core/shutdown-handler.d.ts +30 -0
- package/dist/core/shutdown-handler.d.ts.map +1 -0
- package/dist/core/shutdown-handler.js +79 -0
- package/dist/core/shutdown-handler.js.map +1 -0
- package/dist/core/state-derivation.d.ts +82 -0
- package/dist/core/state-derivation.d.ts.map +1 -0
- package/dist/core/state-derivation.js +271 -0
- package/dist/core/state-derivation.js.map +1 -0
- package/dist/core/state-manager.d.ts +54 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +198 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/output-parser.d.ts +19 -0
- package/dist/parsers/output-parser.d.ts.map +1 -0
- package/dist/parsers/output-parser.js +137 -0
- package/dist/parsers/output-parser.js.map +1 -0
- package/dist/prompts/amend.d.ts +20 -0
- package/dist/prompts/amend.d.ts.map +1 -0
- package/dist/prompts/amend.js +166 -0
- package/dist/prompts/amend.js.map +1 -0
- package/dist/prompts/execution.d.ts +30 -0
- package/dist/prompts/execution.d.ts.map +1 -0
- package/dist/prompts/execution.js +179 -0
- package/dist/prompts/execution.js.map +1 -0
- package/dist/prompts/planning.d.ts +15 -0
- package/dist/prompts/planning.d.ts.map +1 -0
- package/dist/prompts/planning.js +163 -0
- package/dist/prompts/planning.js.map +1 -0
- package/dist/types/config.d.ts +26 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/state.d.ts +33 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +28 -0
- package/dist/types/state.js.map +1 -0
- package/dist/ui/name-picker-subprocess.d.ts +11 -0
- package/dist/ui/name-picker-subprocess.d.ts.map +1 -0
- package/dist/ui/name-picker-subprocess.js +83 -0
- package/dist/ui/name-picker-subprocess.js.map +1 -0
- package/dist/ui/name-picker.d.ts +19 -0
- package/dist/ui/name-picker.d.ts.map +1 -0
- package/dist/ui/name-picker.js +173 -0
- package/dist/ui/name-picker.js.map +1 -0
- package/dist/ui/project-picker.d.ts +27 -0
- package/dist/ui/project-picker.d.ts.map +1 -0
- package/dist/ui/project-picker.js +58 -0
- package/dist/ui/project-picker.js.map +1 -0
- package/dist/utils/config.d.ts +24 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +63 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +32 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +60 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/name-generator.d.ts +20 -0
- package/dist/utils/name-generator.d.ts.map +1 -0
- package/dist/utils/name-generator.js +183 -0
- package/dist/utils/name-generator.js.map +1 -0
- package/dist/utils/paths.d.ts +132 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +412 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/status-line.d.ts +14 -0
- package/dist/utils/status-line.d.ts.map +1 -0
- package/dist/utils/status-line.js +36 -0
- package/dist/utils/status-line.js.map +1 -0
- package/dist/utils/terminal-symbols.d.ts +50 -0
- package/dist/utils/terminal-symbols.d.ts.map +1 -0
- package/dist/utils/terminal-symbols.js +97 -0
- package/dist/utils/terminal-symbols.js.map +1 -0
- package/dist/utils/timer.d.ts +17 -0
- package/dist/utils/timer.d.ts.map +1 -0
- package/dist/utils/timer.js +56 -0
- package/dist/utils/timer.js.map +1 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +106 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +12 -0
- package/dist/utils/version.js.map +1 -0
- package/jest.config.ts +30 -0
- package/package.json +55 -0
- package/src/commands/do.ts +829 -0
- package/src/commands/plan.ts +422 -0
- package/src/commands/status.ts +146 -0
- package/src/core/claude-runner.ts +374 -0
- package/src/core/editor.ts +85 -0
- package/src/core/failure-analyzer.ts +372 -0
- package/src/core/git.ts +166 -0
- package/src/core/project-manager.ts +243 -0
- package/src/core/retry-handler.ts +72 -0
- package/src/core/shutdown-handler.ts +93 -0
- package/src/core/state-derivation.ts +343 -0
- package/src/index.ts +20 -0
- package/src/parsers/output-parser.ts +164 -0
- package/src/prompts/amend.ts +194 -0
- package/src/prompts/execution.ts +223 -0
- package/src/prompts/planning.ts +175 -0
- package/src/types/config.ts +35 -0
- package/src/ui/name-picker-subprocess.ts +96 -0
- package/src/ui/name-picker.ts +198 -0
- package/src/ui/project-picker.ts +80 -0
- package/src/utils/config.ts +69 -0
- package/src/utils/logger.ts +81 -0
- package/src/utils/name-generator.ts +211 -0
- package/src/utils/paths.ts +497 -0
- package/src/utils/status-line.ts +45 -0
- package/src/utils/terminal-symbols.ts +124 -0
- package/src/utils/timer.ts +64 -0
- package/src/utils/validation.ts +132 -0
- package/src/utils/version.ts +12 -0
- package/tests/unit/claude-runner-interactive.test.ts +343 -0
- package/tests/unit/claude-runner.test.ts +629 -0
- package/tests/unit/command-output.test.ts +295 -0
- package/tests/unit/config.test.ts +72 -0
- package/tests/unit/dependency-integration.test.ts +559 -0
- package/tests/unit/do-blocked-tasks.test.ts +323 -0
- package/tests/unit/do-command.test.ts +198 -0
- package/tests/unit/do-multiproject.test.ts +270 -0
- package/tests/unit/do-rerun.test.ts +270 -0
- package/tests/unit/execution-prompt.test.ts +406 -0
- package/tests/unit/failure-analyzer.test.ts +276 -0
- package/tests/unit/failure-history.test.ts +143 -0
- package/tests/unit/git-stash.test.ts +138 -0
- package/tests/unit/git.test.ts +80 -0
- package/tests/unit/logger.test.ts +132 -0
- package/tests/unit/name-generator.test.ts +283 -0
- package/tests/unit/name-picker.test.ts +179 -0
- package/tests/unit/outcome-content.test.ts +166 -0
- package/tests/unit/output-parser.test.ts +178 -0
- package/tests/unit/paths.test.ts +741 -0
- package/tests/unit/plan-command-amend-flag.test.ts +115 -0
- package/tests/unit/plan-command-amend-input.test.ts +156 -0
- package/tests/unit/plan-command-auto-flag.test.ts +112 -0
- package/tests/unit/plan-command.test.ts +580 -0
- package/tests/unit/planning-prompt.test.ts +137 -0
- package/tests/unit/project-manager.test.ts +265 -0
- package/tests/unit/project-picker.test.ts +338 -0
- package/tests/unit/retry-handler.test.ts +89 -0
- package/tests/unit/state-derivation.test.ts +714 -0
- package/tests/unit/status-command.test.ts +271 -0
- package/tests/unit/status-line.test.ts +92 -0
- package/tests/unit/terminal-symbols.test.ts +214 -0
- package/tests/unit/timer.test.ts +102 -0
- package/tests/unit/validation.test.ts +118 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Task 001 - Add Model Override Support
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Added CLI flags to override the Claude model for `plan` and `do` commands. Users can now specify which model to use per-command using `--model <name>` or the `--sonnet` shorthand.
|
|
6
|
+
|
|
7
|
+
## Implementation Details
|
|
8
|
+
|
|
9
|
+
### Types (`src/types/config.ts`)
|
|
10
|
+
- Added `ClaudeModelName` type: `'sonnet' | 'haiku' | 'opus'`
|
|
11
|
+
- Added `model?: ClaudeModelName` to `PlanCommandOptions`
|
|
12
|
+
- Added `model?: ClaudeModelName` and `sonnet?: boolean` to `DoCommandOptions`
|
|
13
|
+
|
|
14
|
+
### Validation (`src/utils/validation.ts`)
|
|
15
|
+
- Added `VALID_MODELS` constant: `['sonnet', 'haiku', 'opus']`
|
|
16
|
+
- Added `validateModelName(model: string)`: Normalizes to lowercase and validates
|
|
17
|
+
- Added `resolveModelOption(model?, sonnet?)`: Resolves model from flags with conflict detection, defaults to 'opus'
|
|
18
|
+
|
|
19
|
+
### Plan Command (`src/commands/plan.ts`)
|
|
20
|
+
- Added `.option('-m, --model <name>', 'Claude model to use (sonnet, haiku, opus)')`
|
|
21
|
+
- Added `.option('--sonnet', 'Use Sonnet model (shorthand for --model sonnet)')`
|
|
22
|
+
- Validates model with `resolveModelOption()` before execution
|
|
23
|
+
- Passes model to `ClaudeRunner`
|
|
24
|
+
- Logs model being used in verbose mode
|
|
25
|
+
|
|
26
|
+
### Do Command (`src/commands/do.ts`)
|
|
27
|
+
- Added `.option('-m, --model <name>', 'Claude model to use (sonnet, haiku, opus)')`
|
|
28
|
+
- Added `.option('--sonnet', 'Use Sonnet model (shorthand for --model sonnet)')`
|
|
29
|
+
- Validates model with `resolveModelOption()` before execution
|
|
30
|
+
- Passes model to `ClaudeRunner`
|
|
31
|
+
- Logs model being used in verbose mode
|
|
32
|
+
|
|
33
|
+
### ClaudeRunner (`src/core/claude-runner.ts`)
|
|
34
|
+
- Added `model?: string` to `ClaudeRunnerConfig`
|
|
35
|
+
- Constructor stores model, defaults to `'opus'`
|
|
36
|
+
- All methods (`runInteractive`, `run`, `runVerbose`) pass `--model <model>` to Claude CLI
|
|
37
|
+
- Debug logging includes model name
|
|
38
|
+
|
|
39
|
+
### Tests
|
|
40
|
+
- `tests/unit/validation.test.ts`:
|
|
41
|
+
- Tests for `validateModelName()` (valid names, case normalization, invalid rejection)
|
|
42
|
+
- Tests for `resolveModelOption()` (default opus, --model flag, --sonnet shorthand, conflict detection, invalid name rejection)
|
|
43
|
+
- `tests/unit/claude-runner.test.ts`:
|
|
44
|
+
- Tests for model configuration (default opus, model passed in run(), model passed in runVerbose(), correct flag order)
|
|
45
|
+
|
|
46
|
+
## Acceptance Criteria Status
|
|
47
|
+
|
|
48
|
+
- [x] `raf plan --model sonnet` uses Sonnet model
|
|
49
|
+
- [x] `raf plan --sonnet` uses Sonnet model
|
|
50
|
+
- [x] `raf do myproject --model haiku` uses Haiku model
|
|
51
|
+
- [x] `raf do myproject --sonnet` uses Sonnet model
|
|
52
|
+
- [x] Invalid model names are rejected with clear error
|
|
53
|
+
- [x] `--model` and `--sonnet` together produce error
|
|
54
|
+
- [x] Default is Opus when no flag provided
|
|
55
|
+
- [x] All tests pass (544 tests)
|
|
56
|
+
|
|
57
|
+
## Usage Examples
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Use Sonnet for planning (faster iterations)
|
|
61
|
+
raf plan --model sonnet
|
|
62
|
+
|
|
63
|
+
# Use Sonnet shorthand
|
|
64
|
+
raf plan --sonnet
|
|
65
|
+
|
|
66
|
+
# Use Haiku for execution
|
|
67
|
+
raf do myproject --model haiku
|
|
68
|
+
|
|
69
|
+
# Use Opus explicitly (same as default)
|
|
70
|
+
raf do myproject --model opus
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
<promise>COMPLETE</promise>
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
## Details
|
|
77
|
+
- Attempts: 1
|
|
78
|
+
- Elapsed time: 2m 12s
|
|
79
|
+
- Completed at: 2026-01-31T12:03:32.915Z
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Task 002 - Use System Prompt Append for RAF Instructions
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Changed RAF to pass its prompts using Claude CLI's `--append-system-prompt` flag instead of as user messages. This gives RAF instructions stronger precedence by placing them in the system prompt section, directly above tool definitions.
|
|
6
|
+
|
|
7
|
+
## Key Changes
|
|
8
|
+
|
|
9
|
+
### Modified Files
|
|
10
|
+
|
|
11
|
+
1. **src/core/claude-runner.ts**
|
|
12
|
+
- `runInteractive()`: Changed from passing prompt as positional argument to using `--append-system-prompt` flag
|
|
13
|
+
- `run()`: Uses `--append-system-prompt` for RAF instructions with a minimal trigger prompt (`Execute the task as described in the system prompt.`) via `-p` flag
|
|
14
|
+
- `runVerbose()`: Same changes as `run()`
|
|
15
|
+
|
|
16
|
+
2. **tests/unit/claude-runner.test.ts**
|
|
17
|
+
- Added new test suite "system prompt append flag" with 4 tests:
|
|
18
|
+
- `should use --append-system-prompt flag in run()`
|
|
19
|
+
- `should use --append-system-prompt flag in runVerbose()`
|
|
20
|
+
- `should pass minimal trigger prompt with -p flag`
|
|
21
|
+
- `should include all required flags in correct order`
|
|
22
|
+
|
|
23
|
+
### Technical Details
|
|
24
|
+
|
|
25
|
+
The implementation uses:
|
|
26
|
+
- `--append-system-prompt <prompt>` to add RAF instructions to the system prompt (preserves Claude Code's built-in system prompt)
|
|
27
|
+
- `-p` flag for print mode (non-interactive execution)
|
|
28
|
+
- A minimal trigger prompt "Execute the task as described in the system prompt." to initiate Claude's response
|
|
29
|
+
|
|
30
|
+
Note: The plan mentioned `--system-prompt-append` but the actual Claude CLI flag is `--append-system-prompt`. This was discovered by checking `claude --help`.
|
|
31
|
+
|
|
32
|
+
## Acceptance Criteria Status
|
|
33
|
+
|
|
34
|
+
- [x] RAF uses `--append-system-prompt` flag for all Claude invocations
|
|
35
|
+
- [x] Planning mode (`raf plan`) works correctly with appended system prompt
|
|
36
|
+
- [x] Execution mode (`raf do`) works correctly with appended system prompt
|
|
37
|
+
- [x] Claude's built-in tools and functionality remain available
|
|
38
|
+
- [x] RAF instructions have better adherence (implementation complete, subjective testing pending)
|
|
39
|
+
- [x] All existing tests pass (538 tests pass)
|
|
40
|
+
|
|
41
|
+
## Tests
|
|
42
|
+
|
|
43
|
+
All 538 tests pass including the 4 new tests for `--append-system-prompt` flag usage.
|
|
44
|
+
|
|
45
|
+
<promise>COMPLETE</promise>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## Details
|
|
49
|
+
- Attempts: 3
|
|
50
|
+
- Elapsed time: 6m 26s
|
|
51
|
+
- Completed at: 2026-01-31T11:56:06.242Z
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Task 003 - Add Previous Outcome Context on Retry
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Verified and confirmed the retry context functionality that provides Claude with context from previous failed attempts when retrying a task. On retry attempts (2nd and beyond), the execution prompt includes a "Retry Context" section that instructs Claude to read the previous outcome file before starting.
|
|
6
|
+
|
|
7
|
+
## Implementation Details
|
|
8
|
+
|
|
9
|
+
### Modified Files
|
|
10
|
+
|
|
11
|
+
1. **src/prompts/execution.ts**
|
|
12
|
+
- `ExecutionPromptParams` interface includes `attemptNumber?: number` and `previousOutcomeFile?: string` parameters
|
|
13
|
+
- `getExecutionPrompt()` generates a "Retry Context" section when `attemptNumber > 1` and `previousOutcomeFile` exists
|
|
14
|
+
- The retry context section instructs Claude to:
|
|
15
|
+
1. Read the previous outcome file first
|
|
16
|
+
2. Understand what was attempted and why it failed
|
|
17
|
+
3. Account for the previous failure in the approach
|
|
18
|
+
4. Avoid making the same mistakes
|
|
19
|
+
|
|
20
|
+
2. **src/commands/do.ts**
|
|
21
|
+
- Prompt generation is inside the retry loop to include updated attempt context
|
|
22
|
+
- Uses `fs.existsSync()` to check if outcome file exists before including it in retry context
|
|
23
|
+
- Passes `attemptNumber` and `previousOutcomeFile` to `getExecutionPrompt()` on each attempt
|
|
24
|
+
|
|
25
|
+
3. **tests/unit/execution-prompt.test.ts**
|
|
26
|
+
- Contains 6 tests for retry context functionality:
|
|
27
|
+
- `should not include retry context on first attempt`
|
|
28
|
+
- `should not include retry context when attemptNumber is not provided`
|
|
29
|
+
- `should include retry context on second attempt with previous outcome file`
|
|
30
|
+
- `should include retry context on third attempt`
|
|
31
|
+
- `should not include retry context on second attempt without previous outcome file`
|
|
32
|
+
- `should instruct to read previous outcome file and avoid same mistakes`
|
|
33
|
+
|
|
34
|
+
## Acceptance Criteria Status
|
|
35
|
+
|
|
36
|
+
- [x] On first attempt, no retry context in prompt
|
|
37
|
+
- [x] On second attempt, prompt includes retry context section
|
|
38
|
+
- [x] Retry context instructs Claude to read the previous outcome file
|
|
39
|
+
- [x] Retry context includes the attempt number
|
|
40
|
+
- [x] Missing outcome file doesn't break retry (no retry context if file doesn't exist)
|
|
41
|
+
- [x] All tests pass (544 tests)
|
|
42
|
+
|
|
43
|
+
## Technical Notes
|
|
44
|
+
|
|
45
|
+
The retry context is conditionally generated based on:
|
|
46
|
+
- `attemptNumber > 1` (only on retry attempts)
|
|
47
|
+
- `previousOutcomeFile` exists (only if there's a previous outcome file to read)
|
|
48
|
+
|
|
49
|
+
This ensures:
|
|
50
|
+
- First attempts have no extra context
|
|
51
|
+
- Retries without an outcome file don't reference a non-existent file
|
|
52
|
+
- The outcome file path is provided as an absolute path Claude can read directly
|
|
53
|
+
|
|
54
|
+
<promise>COMPLETE</promise>
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
## Details
|
|
58
|
+
- Attempts: 3
|
|
59
|
+
- Elapsed time: 5m 14s
|
|
60
|
+
- Completed at: 2026-01-31T12:01:20.753Z
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Task: Add Model Override Support
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
Add CLI flags to override the Claude model for `plan` and `do` commands.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
Currently RAF uses whatever model is configured in Claude's settings. Users need the ability to override this per-command to use different models for different purposes (e.g., Sonnet for faster iterations, Opus for complex planning).
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
- Add `--model <name>` flag to both `plan` and `do` commands
|
|
11
|
+
- Accept values: `sonnet`, `haiku`, `opus` (case-insensitive)
|
|
12
|
+
- Add `--sonnet` shorthand flag (equivalent to `--model sonnet`)
|
|
13
|
+
- Default model is `opus` for both plan and do stages
|
|
14
|
+
- Model flag must be passed to Claude CLI via `--model` argument
|
|
15
|
+
- Flags should be mutually exclusive (`--model` and `--sonnet` cannot both be specified)
|
|
16
|
+
|
|
17
|
+
## Implementation Steps
|
|
18
|
+
|
|
19
|
+
1. **Update types** (`src/types/config.ts`):
|
|
20
|
+
- Add `model?: string` to `DoCommandOptions` interface
|
|
21
|
+
- Add `model?: string` to a new `PlanCommandOptions` interface (or extend existing)
|
|
22
|
+
|
|
23
|
+
2. **Update `plan.ts` command**:
|
|
24
|
+
- Add `.option('-m, --model <name>', 'Claude model to use (sonnet, haiku, opus)')`
|
|
25
|
+
- Add `.option('--sonnet', 'Use Sonnet model (shorthand for --model sonnet)')`
|
|
26
|
+
- Validate model name if provided (must be sonnet, haiku, or opus)
|
|
27
|
+
- Check for conflicting flags (--model and --sonnet together)
|
|
28
|
+
- Pass model to `ClaudeRunner`
|
|
29
|
+
|
|
30
|
+
3. **Update `do.ts` command**:
|
|
31
|
+
- Add `.option('-m, --model <name>', 'Claude model to use (sonnet, haiku, opus)')`
|
|
32
|
+
- Add `.option('--sonnet', 'Use Sonnet model (shorthand for --model sonnet)')`
|
|
33
|
+
- Validate model name if provided
|
|
34
|
+
- Check for conflicting flags
|
|
35
|
+
- Pass model to `ClaudeRunner`
|
|
36
|
+
|
|
37
|
+
4. **Update `ClaudeRunner`**:
|
|
38
|
+
- Add `model?: string` to `ClaudeRunnerOptions`
|
|
39
|
+
- For `runInteractive()`: add `--model <model>` to args if model is specified
|
|
40
|
+
- For `run()` and `runVerbose()`: add `--model <model>` to spawn args if model is specified
|
|
41
|
+
- Default to 'opus' if no model specified
|
|
42
|
+
|
|
43
|
+
5. **Add tests**:
|
|
44
|
+
- Test model validation
|
|
45
|
+
- Test conflicting flag detection
|
|
46
|
+
- Test model argument passed correctly to Claude CLI
|
|
47
|
+
|
|
48
|
+
## Acceptance Criteria
|
|
49
|
+
- [ ] `raf plan --model sonnet` uses Sonnet model
|
|
50
|
+
- [ ] `raf plan --sonnet` uses Sonnet model
|
|
51
|
+
- [ ] `raf do myproject --model haiku` uses Haiku model
|
|
52
|
+
- [ ] `raf do myproject --sonnet` uses Sonnet model
|
|
53
|
+
- [ ] Invalid model names are rejected with clear error
|
|
54
|
+
- [ ] `--model` and `--sonnet` together produce error
|
|
55
|
+
- [ ] Default is Opus when no flag provided
|
|
56
|
+
- [ ] All tests pass
|
|
57
|
+
|
|
58
|
+
## Notes
|
|
59
|
+
- The Claude CLI accepts `--model <name>` as a flag
|
|
60
|
+
- Model names should be normalized to lowercase before validation
|
|
61
|
+
- Consider logging the model being used in verbose mode
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Task: Use System Prompt Append for RAF Instructions
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
Change RAF to pass its prompts using Claude CLI's `--system-prompt-append` flag instead of as user messages.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
Currently RAF passes its instructions (planning prompts, execution prompts) as the initial user message to Claude. This gives them lower precedence in Claude's attention. By using `--system-prompt-append`, RAF's instructions will appear in the system prompt section, directly above tool definitions, giving them stronger precedence and better adherence.
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
- Use `--system-prompt-append` CLI flag to pass RAF's prompts
|
|
11
|
+
- This applies to both interactive (`runInteractive`) and non-interactive (`run`, `runVerbose`) modes
|
|
12
|
+
- The prompt content remains the same - only the delivery mechanism changes
|
|
13
|
+
- Preserve Claude Code's built-in functionality (system preset is preserved)
|
|
14
|
+
|
|
15
|
+
## Implementation Steps
|
|
16
|
+
|
|
17
|
+
1. **Research Claude CLI flags**:
|
|
18
|
+
- Verify `--system-prompt-append` flag exists and its exact syntax
|
|
19
|
+
- May need to check Claude CLI help: `claude --help`
|
|
20
|
+
|
|
21
|
+
2. **Update `ClaudeRunner.runInteractive()`**:
|
|
22
|
+
- Change from passing prompt as positional argument
|
|
23
|
+
- Use `--system-prompt-append <prompt>` flag instead
|
|
24
|
+
- The prompt should still contain all RAF instructions
|
|
25
|
+
|
|
26
|
+
3. **Update `ClaudeRunner.run()`**:
|
|
27
|
+
- Currently uses `-p` flag for prompt
|
|
28
|
+
- Change to use `--system-prompt-append` flag
|
|
29
|
+
- Keep `--dangerously-skip-permissions` flag
|
|
30
|
+
|
|
31
|
+
4. **Update `ClaudeRunner.runVerbose()`**:
|
|
32
|
+
- Same changes as `run()`
|
|
33
|
+
- Ensure verbose output still works correctly
|
|
34
|
+
|
|
35
|
+
5. **Test manually**:
|
|
36
|
+
- Run `raf plan` and verify planning works correctly
|
|
37
|
+
- Run `raf do` and verify execution works correctly
|
|
38
|
+
- Check that Claude follows RAF instructions well
|
|
39
|
+
|
|
40
|
+
6. **Add/update tests**:
|
|
41
|
+
- Verify correct flags are passed to Claude CLI
|
|
42
|
+
- Mock spawn/pty and verify arguments
|
|
43
|
+
|
|
44
|
+
## Acceptance Criteria
|
|
45
|
+
- [ ] RAF uses `--system-prompt-append` flag for all Claude invocations
|
|
46
|
+
- [ ] Planning mode (`raf plan`) works correctly with appended system prompt
|
|
47
|
+
- [ ] Execution mode (`raf do`) works correctly with appended system prompt
|
|
48
|
+
- [ ] Claude's built-in tools and functionality remain available
|
|
49
|
+
- [ ] RAF instructions have better adherence (subjective, test manually)
|
|
50
|
+
- [ ] All existing tests pass
|
|
51
|
+
|
|
52
|
+
## Notes
|
|
53
|
+
- The `--system-prompt-append` flag preserves Claude Code's built-in system prompt while adding custom instructions
|
|
54
|
+
- This is different from `--system-prompt` which would replace the entire system prompt
|
|
55
|
+
- If the flag syntax is different than expected, adjust implementation accordingly
|
|
56
|
+
- May need to escape special characters in the prompt content for shell safety
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Task: Add Previous Outcome Context on Retry
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
When retrying a task, provide Claude with context from the previous attempt by instructing it to read the outcome file.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
When a task fails and is retried, Claude starts fresh without knowledge of what went wrong. By providing the path to the previous outcome file and instructing Claude to read it, we give Claude valuable context about:
|
|
8
|
+
- What was attempted
|
|
9
|
+
- Why it failed
|
|
10
|
+
- What to avoid or do differently
|
|
11
|
+
|
|
12
|
+
This should improve retry success rates.
|
|
13
|
+
|
|
14
|
+
## Requirements
|
|
15
|
+
- On retry attempts (2nd attempt and beyond), add retry context to the prompt
|
|
16
|
+
- Instruct Claude to read the previous outcome file before starting
|
|
17
|
+
- Include the attempt number in the context
|
|
18
|
+
- Do not embed the outcome content directly - just provide the path
|
|
19
|
+
- Applies to both failed tasks and interrupted tasks with partial outcomes
|
|
20
|
+
|
|
21
|
+
## Implementation Steps
|
|
22
|
+
|
|
23
|
+
1. **Update `ExecutionPromptParams`** in `src/prompts/execution.ts`:
|
|
24
|
+
- Add `attemptNumber: number` parameter
|
|
25
|
+
- Add `previousOutcomeFile?: string` parameter (path to outcome file if exists)
|
|
26
|
+
|
|
27
|
+
2. **Update `getExecutionPrompt()`** in `src/prompts/execution.ts`:
|
|
28
|
+
- If `attemptNumber > 1` and `previousOutcomeFile` exists, add a retry context section
|
|
29
|
+
- Section should say something like:
|
|
30
|
+
```
|
|
31
|
+
## Retry Context
|
|
32
|
+
|
|
33
|
+
This is attempt ${attemptNumber} at executing this task. The previous attempt
|
|
34
|
+
produced an outcome file that you should review before starting.
|
|
35
|
+
|
|
36
|
+
**Previous outcome file**: ${previousOutcomeFile}
|
|
37
|
+
|
|
38
|
+
Please:
|
|
39
|
+
1. Read the previous outcome file first
|
|
40
|
+
2. Understand what was attempted and why it failed
|
|
41
|
+
3. Account for the previous failure in your approach
|
|
42
|
+
4. Avoid making the same mistakes
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
3. **Update `do.ts`** to track and pass attempt info:
|
|
46
|
+
- Track `attempts` counter (already exists)
|
|
47
|
+
- Check if outcome file exists before retry
|
|
48
|
+
- Pass `attemptNumber` and `previousOutcomeFile` to `getExecutionPrompt()`
|
|
49
|
+
|
|
50
|
+
4. **Update `getOutcomeFilePath()` usage**:
|
|
51
|
+
- The outcome file path is already computed as `outcomeFilePath`
|
|
52
|
+
- Check if this file exists before including it in retry context
|
|
53
|
+
|
|
54
|
+
5. **Handle edge cases**:
|
|
55
|
+
- First attempt: no retry context
|
|
56
|
+
- Retry but no outcome file: don't include previous outcome path
|
|
57
|
+
- Outcome file exists: include it even if partial
|
|
58
|
+
|
|
59
|
+
6. **Add tests**:
|
|
60
|
+
- Test prompt includes retry context on attempt 2+
|
|
61
|
+
- Test prompt excludes retry context on attempt 1
|
|
62
|
+
- Test prompt handles missing outcome file gracefully
|
|
63
|
+
|
|
64
|
+
## Acceptance Criteria
|
|
65
|
+
- [ ] On first attempt, no retry context in prompt
|
|
66
|
+
- [ ] On second attempt, prompt includes retry context section
|
|
67
|
+
- [ ] Retry context instructs Claude to read the previous outcome file
|
|
68
|
+
- [ ] Retry context includes the attempt number
|
|
69
|
+
- [ ] Missing outcome file doesn't break retry
|
|
70
|
+
- [ ] All tests pass
|
|
71
|
+
|
|
72
|
+
## Notes
|
|
73
|
+
- The outcome file may contain partial work even if the task "failed"
|
|
74
|
+
- Claude should be able to use this to avoid duplicate work
|
|
75
|
+
- Keep the retry context section concise but informative
|
|
76
|
+
- The outcome file path is an absolute path that Claude can read directly
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Project Decisions
|
|
2
|
+
|
|
3
|
+
## Should RAF check the outcome file first, only the outcome file, or check both sources (terminal output AND outcome file) for robustness?
|
|
4
|
+
Both sources (Recommended) - Check terminal output first, fall back to outcome file - more robust.
|
|
5
|
+
|
|
6
|
+
## Should we add a unit test specifically for the outcome file fallback behavior, or are integration tests sufficient?
|
|
7
|
+
Integration only - Rely on existing integration tests, just ensure the fix works.
|
|
8
|
+
|
|
9
|
+
## Where in do.ts should the fallback check happen?
|
|
10
|
+
Let Claude decide the implementation placement.
|
|
11
|
+
|
|
12
|
+
## Should this be split into multiple tasks or kept as a single task?
|
|
13
|
+
Single task (Recommended) - One task: fix marker detection with outcome file fallback.
|
|
14
|
+
|
|
15
|
+
## What style of creative project names do you prefer?
|
|
16
|
+
Mix of styles - Let Claude be creative with any memorable style.
|
|
17
|
+
|
|
18
|
+
## Should the project name still hint at what the project does, or can it be completely abstract?
|
|
19
|
+
Metaphorical - Use metaphors/analogies that capture the spirit of the task.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
- [ ] see commit db9034da3e1bea6ece16aafdab336c508438e78e . the problem is that claude outputs marker correctly in output file but RAF doesn't see it, it looks in claude code output. change RAF code so that it look in output file instead (or maybe both places for robustness, investigate the codebase and suggest)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Outcome: Outcome File Marker Fallback
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Implemented fallback logic in `do.ts` to check the outcome file for completion markers when not found in Claude's terminal output.
|
|
6
|
+
|
|
7
|
+
## Changes Made
|
|
8
|
+
|
|
9
|
+
### Modified File: `src/commands/do.ts`
|
|
10
|
+
|
|
11
|
+
Added fallback logic in the `else` block (lines 407-420) that handles unknown results from terminal output parsing:
|
|
12
|
+
|
|
13
|
+
1. **Check outcome file existence**: If no marker is found in terminal output, check if the outcome file exists
|
|
14
|
+
2. **Parse outcome file**: If it exists, read and parse the outcome file using `parseOutcomeStatus()`
|
|
15
|
+
3. **Determine success/failure**:
|
|
16
|
+
- If outcome file has `<promise>COMPLETE</promise>` marker → mark task as successful
|
|
17
|
+
- If outcome file has `<promise>FAILED</promise>` marker → mark task as failed with reason "Task failed (from outcome file)"
|
|
18
|
+
- If outcome file exists but has no marker → set failure reason to "No completion marker found in output or outcome file"
|
|
19
|
+
4. **Handle missing outcome file**: If outcome file doesn't exist, keep original behavior with "No completion marker found" failure reason
|
|
20
|
+
|
|
21
|
+
## Acceptance Criteria Verification
|
|
22
|
+
|
|
23
|
+
- [x] When Claude writes `<promise>COMPLETE</promise>` to outcome file but not terminal output, task is marked successful
|
|
24
|
+
- [x] When Claude writes `<promise>FAILED</promise>` to outcome file but not terminal output, task is marked failed
|
|
25
|
+
- [x] When marker is in terminal output, behavior is unchanged (terminal takes precedence)
|
|
26
|
+
- [x] When marker is in neither location, task fails with clear message
|
|
27
|
+
- [x] All existing tests pass (544 tests passed)
|
|
28
|
+
|
|
29
|
+
## Notes
|
|
30
|
+
|
|
31
|
+
- The `parseOutcomeStatus` function was already imported (line 27) and returns `'completed'`, `'failed'`, or `null`
|
|
32
|
+
- The `outcomeFilePath` variable was already computed at line 332
|
|
33
|
+
- Terminal output check remains first for backwards compatibility
|
|
34
|
+
|
|
35
|
+
<promise>COMPLETE</promise>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Outcome: Creative Project Naming
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Changed the project name generator from Haiku to Sonnet and updated the prompt to generate creative, metaphorical project names instead of literal descriptive names.
|
|
6
|
+
|
|
7
|
+
## Changes Made
|
|
8
|
+
|
|
9
|
+
### Modified: `src/utils/name-generator.ts`
|
|
10
|
+
|
|
11
|
+
1. **Changed model constant** (line 5):
|
|
12
|
+
- From: `const HAIKU_MODEL = 'haiku'`
|
|
13
|
+
- To: `const SONNET_MODEL = 'sonnet'`
|
|
14
|
+
|
|
15
|
+
2. **Updated prompt** (lines 7-21):
|
|
16
|
+
- Changed from action-oriented, descriptive naming (e.g., `add-user-auth`, `fix-payment-flow`)
|
|
17
|
+
- To creative, metaphorical naming (e.g., `gatekeeper`, `phoenix`, `speed-demon`)
|
|
18
|
+
- Changed max word count from 2-4 words to 1-3 words
|
|
19
|
+
- Added examples of creative names for common project types
|
|
20
|
+
|
|
21
|
+
3. **Renamed function** (line 48):
|
|
22
|
+
- From: `callHaikuForName()`
|
|
23
|
+
- To: `callSonnetForName()`
|
|
24
|
+
|
|
25
|
+
4. **Updated all debug log messages** to reference Sonnet instead of Haiku
|
|
26
|
+
|
|
27
|
+
### Modified: `tests/unit/name-generator.test.ts`
|
|
28
|
+
|
|
29
|
+
- Updated test name descriptions from "Haiku" to "Sonnet"
|
|
30
|
+
- Updated model assertion from `claude --model haiku` to `claude --model sonnet`
|
|
31
|
+
|
|
32
|
+
## Acceptance Criteria Verification
|
|
33
|
+
|
|
34
|
+
- [x] Model changed from Haiku to Sonnet
|
|
35
|
+
- [x] Prompt updated to request creative, metaphorical names
|
|
36
|
+
- [x] Generated names are short (1-3 words)
|
|
37
|
+
- [x] Names are creative and memorable (not literal descriptions) - enforced via prompt examples
|
|
38
|
+
- [x] Fallback behavior still works if Sonnet call fails
|
|
39
|
+
- [x] All existing tests pass (544 tests passed)
|
|
40
|
+
|
|
41
|
+
<promise>COMPLETE</promise>
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## Details
|
|
45
|
+
- Attempts: 2
|
|
46
|
+
- Elapsed time: 2m 55s
|
|
47
|
+
- Completed at: 2026-01-31T12:14:32.114Z
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Task: Outcome File Marker Fallback
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
Fix marker detection in `do.ts` to check the outcome file for completion markers when not found in Claude's terminal output.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
Currently, RAF only checks Claude's terminal output for `<promise>COMPLETE</promise>` markers (via `parseOutput()` in `output-parser.ts`). However, Claude writes the marker to the outcome file, which RAF doesn't check until after determining success/failure. This causes tasks to be incorrectly marked as failed even when Claude successfully completed them and wrote the marker to the outcome file.
|
|
8
|
+
|
|
9
|
+
See commit `db9034da3e1bea6ece16aafdab336c508438e78e` for an example where the outcome file contains a valid `<promise>COMPLETE</promise>` marker but RAF reported failure.
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
- Check terminal output first (current behavior via `parseOutput()`)
|
|
13
|
+
- If terminal output has no marker (`parsed.result === 'unknown'`), check the outcome file as fallback
|
|
14
|
+
- Use existing `parseOutcomeStatus()` function from `state-derivation.ts` to parse outcome file
|
|
15
|
+
- Only check outcome file if it exists (use `fs.existsSync()`)
|
|
16
|
+
- Handle both COMPLETE and FAILED markers from outcome file
|
|
17
|
+
|
|
18
|
+
## Implementation Steps
|
|
19
|
+
|
|
20
|
+
1. In `src/commands/do.ts`, locate the section after `parseOutput(result.output)` call (around line 385)
|
|
21
|
+
|
|
22
|
+
2. In the conditional block that handles `parsed.result` (lines 400-410), modify the logic:
|
|
23
|
+
- Keep existing checks for `complete` and `failed` results from terminal output
|
|
24
|
+
- In the `else` block (unknown result), add fallback to check outcome file:
|
|
25
|
+
```typescript
|
|
26
|
+
} else {
|
|
27
|
+
// Unknown result - check outcome file as fallback
|
|
28
|
+
if (fs.existsSync(outcomeFilePath)) {
|
|
29
|
+
const outcomeContent = fs.readFileSync(outcomeFilePath, 'utf-8');
|
|
30
|
+
const outcomeStatus = parseOutcomeStatus(outcomeContent);
|
|
31
|
+
if (outcomeStatus === 'completed') {
|
|
32
|
+
success = true;
|
|
33
|
+
} else if (outcomeStatus === 'failed') {
|
|
34
|
+
failureReason = 'Task failed (from outcome file)';
|
|
35
|
+
} else {
|
|
36
|
+
failureReason = 'No completion marker found in output or outcome file';
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
failureReason = 'No completion marker found';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
3. Ensure `parseOutcomeStatus` is already imported (it is, on line 27)
|
|
45
|
+
|
|
46
|
+
4. Run existing tests to verify no regressions: `npm test`
|
|
47
|
+
|
|
48
|
+
## Acceptance Criteria
|
|
49
|
+
- [ ] When Claude writes `<promise>COMPLETE</promise>` to outcome file but not terminal output, task is marked successful
|
|
50
|
+
- [ ] When Claude writes `<promise>FAILED</promise>` to outcome file but not terminal output, task is marked failed
|
|
51
|
+
- [ ] When marker is in terminal output, behavior is unchanged (terminal takes precedence)
|
|
52
|
+
- [ ] When marker is in neither location, task fails with clear message
|
|
53
|
+
- [ ] All existing tests pass
|
|
54
|
+
|
|
55
|
+
## Notes
|
|
56
|
+
- The `outcomeFilePath` variable is already computed at line 332
|
|
57
|
+
- The `parseOutcomeStatus` function returns `'completed'`, `'failed'`, or `null`
|
|
58
|
+
- Keep the terminal output check first for backwards compatibility and to catch markers that appear in Claude's conversational output
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Task: Creative Project Naming
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
Change the project naming model from Haiku to Sonnet and update the prompt to generate short, punchy, creative, and memorable names using metaphors.
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
Currently, `src/utils/name-generator.ts` uses Haiku to generate descriptive, action-oriented names like `add-user-auth` or `fix-payment-flow`. The user wants more creative, memorable names that use metaphors to capture the spirit of the task rather than literally describing it.
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
- Change model from `haiku` to `sonnet`
|
|
11
|
+
- Update prompt to ask for creative, punchy, memorable names
|
|
12
|
+
- Names should use metaphors/analogies that capture the spirit of the task
|
|
13
|
+
- Mix of styles allowed: codenames, abstract, playful, evocative
|
|
14
|
+
- Keep names short (1-3 words, kebab-case)
|
|
15
|
+
- Names should be fun and memorable, not boring descriptors
|
|
16
|
+
|
|
17
|
+
## Implementation Steps
|
|
18
|
+
|
|
19
|
+
1. Open `src/utils/name-generator.ts`
|
|
20
|
+
|
|
21
|
+
2. Change the model constant (line 5):
|
|
22
|
+
```typescript
|
|
23
|
+
const SONNET_MODEL = 'sonnet';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
3. Replace the `NAME_GENERATION_PROMPT` (lines 7-14) with a creative prompt:
|
|
27
|
+
```typescript
|
|
28
|
+
const NAME_GENERATION_PROMPT = `Generate a short, punchy, creative project name (1-3 words, kebab-case).
|
|
29
|
+
|
|
30
|
+
Be creative! Use metaphors, analogies, or evocative words that capture the SPIRIT of the project.
|
|
31
|
+
Don't literally describe what it does - make it memorable and fun.
|
|
32
|
+
|
|
33
|
+
Good examples:
|
|
34
|
+
- Bug fix → 'bug-squasher', 'exterminator', 'patch-adams'
|
|
35
|
+
- Performance optimization → 'turbo-boost', 'lightning-rod', 'speed-demon'
|
|
36
|
+
- Auth system → 'gatekeeper', 'bouncer', 'key-master'
|
|
37
|
+
- Refactoring → 'spring-cleaning', 'phoenix', 'makeover'
|
|
38
|
+
- New feature → 'moonshot', 'secret-sauce', 'magic-wand'
|
|
39
|
+
|
|
40
|
+
Output ONLY the kebab-case name. No quotes, no explanation.
|
|
41
|
+
|
|
42
|
+
Project description:`;
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
4. Update the function name reference from `callHaikuForName` to `callSonnetForName` (or keep generic like `callModelForName`)
|
|
46
|
+
|
|
47
|
+
5. Update the model flag in `execSync` call (line 47):
|
|
48
|
+
```typescript
|
|
49
|
+
`claude --model ${SONNET_MODEL} --print "${escapeShellArg(fullPrompt)}"`
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
6. Update debug log messages to reference Sonnet instead of Haiku
|
|
53
|
+
|
|
54
|
+
7. Run tests to verify: `npm test`
|
|
55
|
+
|
|
56
|
+
## Acceptance Criteria
|
|
57
|
+
- [ ] Model changed from Haiku to Sonnet
|
|
58
|
+
- [ ] Prompt updated to request creative, metaphorical names
|
|
59
|
+
- [ ] Generated names are short (1-3 words)
|
|
60
|
+
- [ ] Names are creative and memorable (not literal descriptions)
|
|
61
|
+
- [ ] Fallback behavior still works if Sonnet call fails
|
|
62
|
+
- [ ] All existing tests pass
|
|
63
|
+
|
|
64
|
+
## Notes
|
|
65
|
+
- Sonnet is more creative than Haiku, which is why it's better suited for this task
|
|
66
|
+
- The prompt examples help guide the model toward the desired style
|
|
67
|
+
- Keep the sanitization logic unchanged - it handles edge cases well
|
|
68
|
+
- The fallback to extracting words from description remains as safety net
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Project Decisions
|
|
2
|
+
|
|
3
|
+
## What should be the source of the task description for the commit message?
|
|
4
|
+
Instruct Claude in the task execution prompt to write a meaningful commit message describing what the task accomplished (not extract from plan file).
|
|
5
|
+
|
|
6
|
+
## How should long descriptions be handled in commit messages?
|
|
7
|
+
Let Claude decide based on the situation.
|
|
8
|
+
|
|
9
|
+
## Should the RAF prefix format still be kept in commit messages?
|
|
10
|
+
Yes, keep the RAF[project:task] prefix to identify RAF-managed commits. Format: `RAF[005:001] <description>`
|
|
11
|
+
|
|
12
|
+
## Should the prompt give Claude any guidelines for the commit message?
|
|
13
|
+
Minimal guidance - just tell Claude to write a meaningful commit message describing what was done. No strict rules like conventional commits.
|
|
14
|
+
|
|
15
|
+
## Should project name be included in commit message?
|
|
16
|
+
No. Only include a good, concise task name and short description. No project name.
|
|
17
|
+
|
|
18
|
+
## What is the scope of changes needed?
|
|
19
|
+
Three areas only:
|
|
20
|
+
1. Execution prompt (`src/prompts/execution.ts`)
|
|
21
|
+
2. Unit tests (`tests/unit/execution-prompt.test.ts`)
|
|
22
|
+
3. Documentation (`CLAUDE.md`)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
do task description in commit message for task instead of project name + task name
|