rafcode 1.3.2 → 2.1.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 +118 -22
- package/RAF/aaaacu-worktree-weaver/decisions.md +88 -0
- package/RAF/aaaacu-worktree-weaver/input.md +27 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/01-git-worktree-utilities.md +41 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/02-worktree-plan-command.md +44 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/03-worktree-do-command.md +58 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/04-auto-merge-and-cleanup.md +40 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/05-worktree-tests.md +43 -0
- package/RAF/aaaacu-worktree-weaver/outcomes/06-update-documentation.md +33 -0
- package/RAF/aaaacu-worktree-weaver/plans/01-git-worktree-utilities.md +51 -0
- package/RAF/aaaacu-worktree-weaver/plans/02-worktree-plan-command.md +93 -0
- package/RAF/aaaacu-worktree-weaver/plans/03-worktree-do-command.md +81 -0
- package/RAF/aaaacu-worktree-weaver/plans/04-auto-merge-and-cleanup.md +51 -0
- package/RAF/aaaacu-worktree-weaver/plans/05-worktree-tests.md +52 -0
- package/RAF/aaaacu-worktree-weaver/plans/06-update-documentation.md +55 -0
- package/RAF/aaaacv-trim-the-fat/decisions.md +34 -0
- package/RAF/aaaacv-trim-the-fat/input.md +5 -0
- package/RAF/aaaacv-trim-the-fat/outcomes/01-add-worktree-support-to-status.md +43 -0
- package/RAF/aaaacv-trim-the-fat/outcomes/02-remove-multi-project-from-do.md +50 -0
- package/RAF/aaaacv-trim-the-fat/outcomes/03-commit-artifacts-on-amend.md +35 -0
- package/RAF/aaaacv-trim-the-fat/outcomes/04-worktree-aware-exit-messages.md +36 -0
- package/RAF/aaaacv-trim-the-fat/plans/01-add-worktree-support-to-status.md +43 -0
- package/RAF/aaaacv-trim-the-fat/plans/02-remove-multi-project-from-do.md +44 -0
- package/RAF/aaaacv-trim-the-fat/plans/03-commit-artifacts-on-amend.md +38 -0
- package/RAF/aaaacv-trim-the-fat/plans/04-worktree-aware-exit-messages.md +38 -0
- package/RAF/aaaacw-prune-cycle/decisions.md +25 -0
- package/RAF/aaaacw-prune-cycle/input.md +5 -0
- package/RAF/aaaacw-prune-cycle/outcomes/01-create-worktree-from-branch.md +32 -0
- package/RAF/aaaacw-prune-cycle/outcomes/02-cleanup-worktree-on-success.md +33 -0
- package/RAF/aaaacw-prune-cycle/outcomes/03-amend-recreate-worktree.md +40 -0
- package/RAF/aaaacw-prune-cycle/plans/01-create-worktree-from-branch.md +31 -0
- package/RAF/aaaacw-prune-cycle/plans/02-cleanup-worktree-on-success.md +38 -0
- package/RAF/aaaacw-prune-cycle/plans/03-amend-recreate-worktree.md +50 -0
- package/RAF/aaaacx-epoch-shift/decisions.md +25 -0
- package/RAF/aaaacx-epoch-shift/input.md +1 -0
- package/RAF/aaaacx-epoch-shift/outcomes/01-epoch-id-generation.md +34 -0
- package/RAF/aaaacx-epoch-shift/outcomes/02-update-pattern-matching.md +32 -0
- package/RAF/aaaacx-epoch-shift/outcomes/03-update-tests.md +59 -0
- package/RAF/aaaacx-epoch-shift/outcomes/04-update-documentation.md +30 -0
- package/RAF/aaaacx-epoch-shift/plans/01-epoch-id-generation.md +40 -0
- package/RAF/aaaacx-epoch-shift/plans/02-update-pattern-matching.md +60 -0
- package/RAF/aaaacx-epoch-shift/plans/03-update-tests.md +48 -0
- package/RAF/aaaacx-epoch-shift/plans/04-update-documentation.md +44 -0
- package/RAF/ahmpro-merge-guardian/decisions.md +25 -0
- package/RAF/ahmpro-merge-guardian/input.md +4 -0
- package/RAF/ahmpro-merge-guardian/outcomes/001-fix-amend-worktree-commit.md +45 -0
- package/RAF/ahmpro-merge-guardian/outcomes/002-base36-task-ids.md +55 -0
- package/RAF/ahmpro-merge-guardian/outcomes/003-worktree-pr-creation.md +41 -0
- package/RAF/ahmpro-merge-guardian/outcomes/004-post-execution-picker.md +53 -0
- package/RAF/ahmpro-merge-guardian/plans/001-fix-amend-worktree-commit.md +39 -0
- package/RAF/ahmpro-merge-guardian/plans/002-base36-task-ids.md +43 -0
- package/RAF/ahmpro-merge-guardian/plans/003-worktree-pr-creation.md +43 -0
- package/RAF/ahmpro-merge-guardian/plans/004-post-execution-picker.md +51 -0
- package/RAF/ahnbcu-letterjam/decisions.md +13 -0
- package/RAF/ahnbcu-letterjam/input.md +3 -0
- package/RAF/ahnbcu-letterjam/outcomes/01-base26-encoding.md +42 -0
- package/RAF/ahnbcu-letterjam/outcomes/02-update-tests.md +38 -0
- package/RAF/ahnbcu-letterjam/outcomes/03-migrate-command.md +51 -0
- package/RAF/ahnbcu-letterjam/outcomes/04-update-documentation.md +29 -0
- package/RAF/ahnbcu-letterjam/plans/01-base26-encoding.md +36 -0
- package/RAF/ahnbcu-letterjam/plans/02-update-tests.md +37 -0
- package/RAF/ahnbcu-letterjam/plans/03-migrate-command.md +49 -0
- package/RAF/ahnbcu-letterjam/plans/04-update-documentation.md +39 -0
- package/RAF/ahnwrk-worktree-weaver/decisions.md +19 -0
- package/RAF/ahnwrk-worktree-weaver/input.md +4 -0
- package/RAF/ahnwrk-worktree-weaver/outcomes/01-remove-co-authored-by.md +20 -0
- package/RAF/ahnwrk-worktree-weaver/outcomes/02-update-task-status-format.md +21 -0
- package/RAF/ahnwrk-worktree-weaver/outcomes/03-worktree-auto-discovery.md +34 -0
- package/RAF/ahnwrk-worktree-weaver/outcomes/04-fix-pr-description.md +30 -0
- package/RAF/ahnwrk-worktree-weaver/plans/01-remove-co-authored-by.md +26 -0
- package/RAF/ahnwrk-worktree-weaver/plans/02-update-task-status-format.md +27 -0
- package/RAF/ahnwrk-worktree-weaver/plans/03-worktree-auto-discovery.md +37 -0
- package/RAF/ahnwrk-worktree-weaver/plans/04-fix-pr-description.md +50 -0
- package/RAF/ahrren-turbo-finder/decisions.md +19 -0
- package/RAF/ahrren-turbo-finder/input.md +2 -0
- package/RAF/ahrren-turbo-finder/outcomes/01-worktree-auto-detect.md +40 -0
- package/RAF/ahrren-turbo-finder/outcomes/02-medium-effort-do.md +34 -0
- package/RAF/ahrren-turbo-finder/plans/01-worktree-auto-detect.md +44 -0
- package/RAF/ahrren-turbo-finder/plans/02-medium-effort-do.md +39 -0
- package/RAF/ahrtxf-session-sentinel/decisions.md +19 -0
- package/RAF/ahrtxf-session-sentinel/input.md +1 -0
- package/RAF/ahrtxf-session-sentinel/outcomes/01-capture-session-id.md +37 -0
- package/RAF/ahrtxf-session-sentinel/outcomes/02-resume-flag.md +45 -0
- package/RAF/ahrtxf-session-sentinel/plans/01-capture-session-id.md +41 -0
- package/RAF/ahrtxf-session-sentinel/plans/02-resume-flag.md +51 -0
- package/README.md +56 -10
- package/dist/commands/do.d.ts +15 -0
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +431 -129
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/migrate.d.ts +14 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +228 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +237 -40
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +221 -47
- package/dist/commands/status.js.map +1 -1
- package/dist/core/claude-runner.d.ts +21 -2
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +199 -29
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/git.d.ts +15 -6
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +53 -20
- 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.d.ts +84 -0
- package/dist/core/pull-request.d.ts.map +1 -0
- package/dist/core/pull-request.js +414 -0
- package/dist/core/pull-request.js.map +1 -0
- package/dist/core/shutdown-handler.d.ts.map +1 -1
- package/dist/core/shutdown-handler.js +4 -0
- package/dist/core/shutdown-handler.js.map +1 -1
- package/dist/core/state-derivation.d.ts +3 -3
- package/dist/core/state-derivation.d.ts.map +1 -1
- package/dist/core/state-derivation.js +18 -14
- package/dist/core/state-derivation.js.map +1 -1
- package/dist/core/worktree.d.ts +138 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +383 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/stream-renderer.d.ts +3 -0
- package/dist/parsers/stream-renderer.d.ts.map +1 -1
- package/dist/parsers/stream-renderer.js +1 -1
- package/dist/parsers/stream-renderer.js.map +1 -1
- package/dist/prompts/amend.d.ts +1 -0
- package/dist/prompts/amend.d.ts.map +1 -1
- package/dist/prompts/amend.js +14 -10
- package/dist/prompts/amend.js.map +1 -1
- package/dist/prompts/execution.d.ts.map +1 -1
- package/dist/prompts/execution.js +4 -2
- package/dist/prompts/execution.js.map +1 -1
- package/dist/prompts/planning.d.ts +1 -0
- package/dist/prompts/planning.d.ts.map +1 -1
- package/dist/prompts/planning.js +9 -8
- package/dist/prompts/planning.js.map +1 -1
- package/dist/types/config.d.ts +6 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/ui/project-picker.d.ts +34 -3
- package/dist/ui/project-picker.d.ts.map +1 -1
- package/dist/ui/project-picker.js +78 -10
- package/dist/ui/project-picker.js.map +1 -1
- package/dist/utils/paths.d.ts +38 -43
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +123 -193
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/terminal-symbols.d.ts +2 -2
- package/dist/utils/terminal-symbols.js +3 -3
- package/dist/utils/terminal-symbols.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +2 -8
- package/dist/utils/validation.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/do.ts +505 -139
- package/src/commands/migrate.ts +269 -0
- package/src/commands/plan.ts +264 -40
- package/src/commands/status.ts +252 -45
- package/src/core/claude-runner.ts +246 -33
- package/src/core/git.ts +57 -21
- package/src/core/project-manager.ts +2 -1
- package/src/core/pull-request.ts +480 -0
- package/src/core/shutdown-handler.ts +5 -0
- package/src/core/state-derivation.ts +18 -14
- package/src/core/worktree.ts +434 -0
- package/src/index.ts +2 -0
- package/src/parsers/stream-renderer.ts +4 -1
- package/src/prompts/amend.ts +15 -9
- package/src/prompts/execution.ts +4 -2
- package/src/prompts/planning.ts +10 -8
- package/src/types/config.ts +7 -0
- package/src/ui/project-picker.ts +110 -10
- package/src/utils/paths.ts +129 -214
- package/src/utils/terminal-symbols.ts +3 -3
- package/src/utils/validation.ts +2 -9
- package/tests/unit/amend-prompt.test.ts +85 -0
- package/tests/unit/claude-runner-interactive.test.ts +24 -0
- package/tests/unit/claude-runner.test.ts +518 -64
- package/tests/unit/commit-planning-artifacts-worktree.test.ts +327 -0
- package/tests/unit/commit-planning-artifacts.test.ts +303 -35
- package/tests/unit/dependency-integration.test.ts +95 -95
- package/tests/unit/do-blocked-tasks.test.ts +53 -53
- package/tests/unit/do-command.test.ts +39 -132
- package/tests/unit/do-rerun.test.ts +65 -65
- package/tests/unit/do-worktree-cleanup.test.ts +151 -0
- package/tests/unit/execution-prompt.test.ts +71 -60
- package/tests/unit/failure-history.test.ts +19 -19
- package/tests/unit/git-commit-helpers.test.ts +5 -5
- package/tests/unit/git-stash.test.ts +4 -4
- package/tests/unit/migrate-command.test.ts +197 -0
- package/tests/unit/outcome-content.test.ts +20 -20
- package/tests/unit/paths.test.ts +269 -467
- package/tests/unit/plan-amend-worktree-recreate.test.ts +246 -0
- package/tests/unit/plan-command.test.ts +103 -103
- package/tests/unit/planning-prompt.test.ts +41 -4
- package/tests/unit/post-execution-picker.test.ts +252 -0
- package/tests/unit/project-manager.test.ts +20 -8
- package/tests/unit/project-picker.test.ts +425 -42
- package/tests/unit/pull-request.test.ts +852 -0
- package/tests/unit/state-derivation.test.ts +138 -137
- package/tests/unit/status-command.test.ts +344 -76
- package/tests/unit/stream-renderer.test.ts +30 -0
- package/tests/unit/terminal-symbols.test.ts +4 -4
- package/tests/unit/worktree-integration.test.ts +405 -0
- package/tests/unit/worktree.test.ts +625 -0
- package/tests/unit/do-multiproject.test.ts +0 -270
- /package/RAF/{001-raf-task-improvements → aaaaab-raf-task-improvements}/input.md +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/001-add-decisions-folder.md → aaaaab-raf-task-improvements/outcomes/01-add-decisions-folder.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/002-fix-write-error-on-shutdown.md → aaaaab-raf-task-improvements/outcomes/02-fix-write-error-on-shutdown.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/003-stash-changes-on-failure.md → aaaaab-raf-task-improvements/outcomes/03-stash-changes-on-failure.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/004-add-project-name-to-commits.md → aaaaab-raf-task-improvements/outcomes/04-add-project-name-to-commits.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/005-add-running-time-display.md → aaaaab-raf-task-improvements/outcomes/05-add-running-time-display.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/006-add-task-name-to-logs.md → aaaaab-raf-task-improvements/outcomes/06-add-task-name-to-logs.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/007-show-model-at-task-start.md → aaaaab-raf-task-improvements/outcomes/07-show-model-at-task-start.md} +0 -0
- /package/RAF/{001-raf-task-improvements/outcomes/009-remove-editor-placeholder-text.md → aaaaab-raf-task-improvements/outcomes/09-remove-editor-placeholder-text.md} +0 -0
- /package/RAF/{001-raf-task-improvements → aaaaab-raf-task-improvements}/outcomes/SUMMARY.md +0 -0
- /package/RAF/{001-raf-task-improvements/plans/001-add-decisions-folder.md → aaaaab-raf-task-improvements/plans/01-add-decisions-folder.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/002-fix-write-error-on-shutdown.md → aaaaab-raf-task-improvements/plans/02-fix-write-error-on-shutdown.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/003-stash-changes-on-failure.md → aaaaab-raf-task-improvements/plans/03-stash-changes-on-failure.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/004-add-project-name-to-commits.md → aaaaab-raf-task-improvements/plans/04-add-project-name-to-commits.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/005-add-running-time-display.md → aaaaab-raf-task-improvements/plans/05-add-running-time-display.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/006-add-task-name-to-logs.md → aaaaab-raf-task-improvements/plans/06-add-task-name-to-logs.md} +0 -0
- /package/RAF/{001-raf-task-improvements/plans/009-remove-editor-placeholder-text.md → aaaaab-raf-task-improvements/plans/09-remove-editor-placeholder-text.md} +0 -0
- /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/decisions/DECISIONS.md +0 -0
- /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/input.md +0 -0
- /package/RAF/{002-raf-task-improvements-execution/outcomes/001-commit-show-model-at-task-start.md → aaaaac-raf-task-improvements-execution/outcomes/01-commit-show-model-at-task-start.md} +0 -0
- /package/RAF/{002-raf-task-improvements-execution/outcomes/002-delete-skipped-plan.md → aaaaac-raf-task-improvements-execution/outcomes/02-delete-skipped-plan.md} +0 -0
- /package/RAF/{002-raf-task-improvements-execution → aaaaac-raf-task-improvements-execution}/outcomes/SUMMARY.md +0 -0
- /package/RAF/{002-raf-task-improvements-execution/plans/001-commit-show-model-at-task-start.md → aaaaac-raf-task-improvements-execution/plans/01-commit-show-model-at-task-start.md} +0 -0
- /package/RAF/{002-raf-task-improvements-execution/plans/002-delete-skipped-plan.md → aaaaac-raf-task-improvements-execution/plans/02-delete-skipped-plan.md} +0 -0
- /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/decisions/DECISIONS.md +0 -0
- /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/input.md +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/001-remove-state-json.md → aaaaad-multi-project-execution/outcomes/01-remove-state-json.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/002-update-raf-status.md → aaaaad-multi-project-execution/outcomes/02-update-raf-status.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/003-simplify-git-logic.md → aaaaad-multi-project-execution/outcomes/03-simplify-git-logic.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/004-auto-commit-planning.md → aaaaad-multi-project-execution/outcomes/04-auto-commit-planning.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/005-rerun-failed-tasks.md → aaaaad-multi-project-execution/outcomes/05-rerun-failed-tasks.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/006-multi-project-execution.md → aaaaad-multi-project-execution/outcomes/06-multi-project-execution.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/007-verify-timeout.md → aaaaad-multi-project-execution/outcomes/07-verify-timeout.md} +0 -0
- /package/RAF/{003-multi-project-execution/outcomes/008-move-decisions-file.md → aaaaad-multi-project-execution/outcomes/08-move-decisions-file.md} +0 -0
- /package/RAF/{003-multi-project-execution → aaaaad-multi-project-execution}/outcomes/SUMMARY.md +0 -0
- /package/RAF/{003-multi-project-execution/plans/001-remove-state-json.md → aaaaad-multi-project-execution/plans/01-remove-state-json.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/002-update-raf-status.md → aaaaad-multi-project-execution/plans/02-update-raf-status.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/003-simplify-git-logic.md → aaaaad-multi-project-execution/plans/03-simplify-git-logic.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/004-auto-commit-planning.md → aaaaad-multi-project-execution/plans/04-auto-commit-planning.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/005-rerun-failed-tasks.md → aaaaad-multi-project-execution/plans/05-rerun-failed-tasks.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/006-multi-project-execution.md → aaaaad-multi-project-execution/plans/06-multi-project-execution.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/007-verify-timeout.md → aaaaad-multi-project-execution/plans/07-verify-timeout.md} +0 -0
- /package/RAF/{003-multi-project-execution/plans/008-move-decisions-file.md → aaaaad-multi-project-execution/plans/08-move-decisions-file.md} +0 -0
- /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/decisions.md +0 -0
- /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/input.md +0 -0
- /package/RAF/{004-task-naming-optimization/outcomes/001-remove-summary-file.md → aaaaae-task-naming-optimization/outcomes/01-remove-summary-file.md} +0 -0
- /package/RAF/{004-task-naming-optimization/outcomes/002-base36-project-numbering.md → aaaaae-task-naming-optimization/outcomes/02-base36-project-numbering.md} +0 -0
- /package/RAF/{004-task-naming-optimization/outcomes/003-improve-haiku-prompt.md → aaaaae-task-naming-optimization/outcomes/03-improve-haiku-prompt.md} +0 -0
- /package/RAF/{004-task-naming-optimization → aaaaae-task-naming-optimization}/outcomes/SUMMARY.md +0 -0
- /package/RAF/{004-task-naming-optimization/plans/001-remove-summary-file.md → aaaaae-task-naming-optimization/plans/01-remove-summary-file.md} +0 -0
- /package/RAF/{004-task-naming-optimization/plans/002-base36-project-numbering.md → aaaaae-task-naming-optimization/plans/02-base36-project-numbering.md} +0 -0
- /package/RAF/{004-task-naming-optimization/plans/003-improve-haiku-prompt.md → aaaaae-task-naming-optimization/plans/03-improve-haiku-prompt.md} +0 -0
- /package/RAF/{005-task-naming-improvements → aaaaaf-task-naming-improvements}/decisions.md +0 -0
- /package/RAF/{005-task-naming-improvements → aaaaaf-task-naming-improvements}/input.md +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/001-enhance-identifier-resolution.md → aaaaaf-task-naming-improvements/outcomes/01-enhance-identifier-resolution.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/002-add-identifier-support-to-status.md → aaaaaf-task-naming-improvements/outcomes/02-add-identifier-support-to-status.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/003-update-do-for-full-folder-names.md → aaaaaf-task-naming-improvements/outcomes/03-update-do-for-full-folder-names.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/004-implement-amend-flag-for-plan.md → aaaaaf-task-naming-improvements/outcomes/04-implement-amend-flag-for-plan.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/005-commit-outcomes-on-complete.md → aaaaaf-task-naming-improvements/outcomes/05-commit-outcomes-on-complete.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/006-update-execution-prompt-commit-schema.md → aaaaaf-task-naming-improvements/outcomes/06-update-execution-prompt-commit-schema.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/007-allow-pending-task-amendments.md → aaaaaf-task-naming-improvements/outcomes/07-allow-pending-task-amendments.md} +0 -0
- /package/RAF/{005-task-naming-improvements/outcomes/008-fix-timeout-label.md → aaaaaf-task-naming-improvements/outcomes/08-fix-timeout-label.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/001-enhance-identifier-resolution.md → aaaaaf-task-naming-improvements/plans/01-enhance-identifier-resolution.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/002-add-identifier-support-to-status.md → aaaaaf-task-naming-improvements/plans/02-add-identifier-support-to-status.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/003-update-do-for-full-folder-names.md → aaaaaf-task-naming-improvements/plans/03-update-do-for-full-folder-names.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/004-implement-amend-flag-for-plan.md → aaaaaf-task-naming-improvements/plans/04-implement-amend-flag-for-plan.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/005-commit-outcomes-on-complete.md → aaaaaf-task-naming-improvements/plans/05-commit-outcomes-on-complete.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/006-update-execution-prompt-commit-schema.md → aaaaaf-task-naming-improvements/plans/06-update-execution-prompt-commit-schema.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/007-allow-pending-task-amendments.md → aaaaaf-task-naming-improvements/plans/07-allow-pending-task-amendments.md} +0 -0
- /package/RAF/{005-task-naming-improvements/plans/008-fix-timeout-label.md → aaaaaf-task-naming-improvements/plans/08-fix-timeout-label.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers → aaaaag-fix-double-summary-headers}/decisions.md +0 -0
- /package/RAF/{006-fix-double-summary-headers → aaaaag-fix-double-summary-headers}/input.md +0 -0
- /package/RAF/{006-fix-double-summary-headers/outcomes/001-fix-double-summary-headers.md → aaaaag-fix-double-summary-headers/outcomes/01-fix-double-summary-headers.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/outcomes/002-update-readme-for-npm.md → aaaaag-fix-double-summary-headers/outcomes/02-update-readme-for-npm.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/outcomes/003-npm-publish-instructions.md → aaaaag-fix-double-summary-headers/outcomes/03-npm-publish-instructions.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/outcomes/004-flexible-project-lookup.md → aaaaag-fix-double-summary-headers/outcomes/04-flexible-project-lookup.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/plans/001-fix-double-summary-headers.md → aaaaag-fix-double-summary-headers/plans/01-fix-double-summary-headers.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/plans/002-update-readme-for-npm.md → aaaaag-fix-double-summary-headers/plans/02-update-readme-for-npm.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/plans/003-npm-publish-instructions.md → aaaaag-fix-double-summary-headers/plans/03-npm-publish-instructions.md} +0 -0
- /package/RAF/{006-fix-double-summary-headers/plans/004-flexible-project-lookup.md → aaaaag-fix-double-summary-headers/plans/04-flexible-project-lookup.md} +0 -0
- /package/RAF/{007-improve-outcome-format → aaaaah-improve-outcome-format}/decisions.md +0 -0
- /package/RAF/{007-improve-outcome-format → aaaaah-improve-outcome-format}/input.md +0 -0
- /package/RAF/{007-improve-outcome-format/outcomes/001-update-execution-prompt.md → aaaaah-improve-outcome-format/outcomes/01-update-execution-prompt.md} +0 -0
- /package/RAF/{007-improve-outcome-format/outcomes/002-update-state-derivation.md → aaaaah-improve-outcome-format/outcomes/02-update-state-derivation.md} +0 -0
- /package/RAF/{007-improve-outcome-format/outcomes/003-update-do-command-outcome-handling.md → aaaaah-improve-outcome-format/outcomes/03-update-do-command-outcome-handling.md} +0 -0
- /package/RAF/{007-improve-outcome-format/outcomes/004-implement-failure-analysis.md → aaaaah-improve-outcome-format/outcomes/04-implement-failure-analysis.md} +0 -0
- /package/RAF/{007-improve-outcome-format/outcomes/005-update-documentation.md → aaaaah-improve-outcome-format/outcomes/05-update-documentation.md} +0 -0
- /package/RAF/{007-improve-outcome-format/plans/001-update-execution-prompt.md → aaaaah-improve-outcome-format/plans/01-update-execution-prompt.md} +0 -0
- /package/RAF/{007-improve-outcome-format/plans/002-update-state-derivation.md → aaaaah-improve-outcome-format/plans/02-update-state-derivation.md} +0 -0
- /package/RAF/{007-improve-outcome-format/plans/003-update-do-command-outcome-handling.md → aaaaah-improve-outcome-format/plans/03-update-do-command-outcome-handling.md} +0 -0
- /package/RAF/{007-improve-outcome-format/plans/004-implement-failure-analysis.md → aaaaah-improve-outcome-format/plans/04-implement-failure-analysis.md} +0 -0
- /package/RAF/{007-improve-outcome-format/plans/005-update-documentation.md → aaaaah-improve-outcome-format/plans/05-update-documentation.md} +0 -0
- /package/RAF/{008-beautiful-do → aaaaai-beautiful-do}/decisions.md +0 -0
- /package/RAF/{008-beautiful-do → aaaaai-beautiful-do}/input.md +0 -0
- /package/RAF/{008-beautiful-do/outcomes/001-terminal-symbols.md → aaaaai-beautiful-do/outcomes/01-terminal-symbols.md} +0 -0
- /package/RAF/{008-beautiful-do/outcomes/002-refactor-do-output.md → aaaaai-beautiful-do/outcomes/02-refactor-do-output.md} +0 -0
- /package/RAF/{008-beautiful-do/outcomes/003-refactor-status-output.md → aaaaai-beautiful-do/outcomes/03-refactor-status-output.md} +0 -0
- /package/RAF/{008-beautiful-do/outcomes/004-simplify-logger.md → aaaaai-beautiful-do/outcomes/04-simplify-logger.md} +0 -0
- /package/RAF/{008-beautiful-do/outcomes/005-add-tests.md → aaaaai-beautiful-do/outcomes/05-add-tests.md} +0 -0
- /package/RAF/{008-beautiful-do/plans/001-terminal-symbols.md → aaaaai-beautiful-do/plans/01-terminal-symbols.md} +0 -0
- /package/RAF/{008-beautiful-do/plans/002-refactor-do-output.md → aaaaai-beautiful-do/plans/02-refactor-do-output.md} +0 -0
- /package/RAF/{008-beautiful-do/plans/003-refactor-status-output.md → aaaaai-beautiful-do/plans/03-refactor-status-output.md} +0 -0
- /package/RAF/{008-beautiful-do/plans/004-simplify-logger.md → aaaaai-beautiful-do/plans/04-simplify-logger.md} +0 -0
- /package/RAF/{008-beautiful-do/plans/005-add-tests.md → aaaaai-beautiful-do/plans/05-add-tests.md} +0 -0
- /package/RAF/{009-system-promt-ammend → aaaaaj-system-promt-ammend}/decisions.md +0 -0
- /package/RAF/{009-system-promt-ammend → aaaaaj-system-promt-ammend}/input.md +0 -0
- /package/RAF/{009-system-promt-ammend/outcomes/001-model-override.md → aaaaaj-system-promt-ammend/outcomes/01-model-override.md} +0 -0
- /package/RAF/{009-system-promt-ammend/outcomes/002-system-prompt-append.md → aaaaaj-system-promt-ammend/outcomes/02-system-prompt-append.md} +0 -0
- /package/RAF/{009-system-promt-ammend/outcomes/003-retry-context.md → aaaaaj-system-promt-ammend/outcomes/03-retry-context.md} +0 -0
- /package/RAF/{009-system-promt-ammend/plans/001-model-override.md → aaaaaj-system-promt-ammend/plans/01-model-override.md} +0 -0
- /package/RAF/{009-system-promt-ammend/plans/002-system-prompt-append.md → aaaaaj-system-promt-ammend/plans/02-system-prompt-append.md} +0 -0
- /package/RAF/{009-system-promt-ammend/plans/003-retry-context.md → aaaaaj-system-promt-ammend/plans/03-retry-context.md} +0 -0
- /package/RAF/{010-outcome-marker-fallback → aaaabk-outcome-marker-fallback}/decisions.md +0 -0
- /package/RAF/{010-outcome-marker-fallback → aaaabk-outcome-marker-fallback}/input.md +0 -0
- /package/RAF/{010-outcome-marker-fallback/outcomes/001-outcome-file-marker-fallback.md → aaaabk-outcome-marker-fallback/outcomes/01-outcome-file-marker-fallback.md} +0 -0
- /package/RAF/{010-outcome-marker-fallback/outcomes/002-creative-project-naming.md → aaaabk-outcome-marker-fallback/outcomes/02-creative-project-naming.md} +0 -0
- /package/RAF/{010-outcome-marker-fallback/plans/001-outcome-file-marker-fallback.md → aaaabk-outcome-marker-fallback/plans/01-outcome-file-marker-fallback.md} +0 -0
- /package/RAF/{010-outcome-marker-fallback/plans/002-creative-project-naming.md → aaaabk-outcome-marker-fallback/plans/02-creative-project-naming.md} +0 -0
- /package/RAF/{011-do-task-in-commit → aaaabl-do-task-in-commit}/decisions.md +0 -0
- /package/RAF/{011-do-task-in-commit → aaaabl-do-task-in-commit}/input.md +0 -0
- /package/RAF/{011-do-task-in-commit/outcomes/001-update-execution-prompt.md → aaaabl-do-task-in-commit/outcomes/01-update-execution-prompt.md} +0 -0
- /package/RAF/{011-do-task-in-commit/outcomes/002-update-tests.md → aaaabl-do-task-in-commit/outcomes/02-update-tests.md} +0 -0
- /package/RAF/{011-do-task-in-commit/outcomes/003-update-documentation.md → aaaabl-do-task-in-commit/outcomes/03-update-documentation.md} +0 -0
- /package/RAF/{011-do-task-in-commit/plans/001-update-execution-prompt.md → aaaabl-do-task-in-commit/plans/01-update-execution-prompt.md} +0 -0
- /package/RAF/{011-do-task-in-commit/plans/002-update-tests.md → aaaabl-do-task-in-commit/plans/02-update-tests.md} +0 -0
- /package/RAF/{011-do-task-in-commit/plans/003-update-documentation.md → aaaabl-do-task-in-commit/plans/03-update-documentation.md} +0 -0
- /package/RAF/{012-name-picker-buffet → aaaabm-name-picker-buffet}/decisions.md +0 -0
- /package/RAF/{012-name-picker-buffet → aaaabm-name-picker-buffet}/input.md +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/001-name-picker-for-raf-plan.md → aaaabm-name-picker-buffet/outcomes/01-name-picker-for-raf-plan.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/002-interactive-project-picker-for-raf-do.md → aaaabm-name-picker-buffet/outcomes/02-interactive-project-picker-for-raf-do.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/003-raf-status-truncation.md → aaaabm-name-picker-buffet/outcomes/03-raf-status-truncation.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/004-failure-reason-details.md → aaaabm-name-picker-buffet/outcomes/04-failure-reason-details.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/005-remove-raf-commits.md → aaaabm-name-picker-buffet/outcomes/05-remove-raf-commits.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/006-update-execution-prompt-for-commits.md → aaaabm-name-picker-buffet/outcomes/06-update-execution-prompt-for-commits.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/007-fix-plan-mode-user-prompt.md → aaaabm-name-picker-buffet/outcomes/07-fix-plan-mode-user-prompt.md} +0 -0
- /package/RAF/{012-name-picker-buffet/outcomes/008-add-auto-flag-for-plan-mode.md → aaaabm-name-picker-buffet/outcomes/08-add-auto-flag-for-plan-mode.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/001-name-picker-for-raf-plan.md → aaaabm-name-picker-buffet/plans/01-name-picker-for-raf-plan.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/002-interactive-project-picker-for-raf-do.md → aaaabm-name-picker-buffet/plans/02-interactive-project-picker-for-raf-do.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/003-raf-status-truncation.md → aaaabm-name-picker-buffet/plans/03-raf-status-truncation.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/004-failure-reason-details.md → aaaabm-name-picker-buffet/plans/04-failure-reason-details.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/005-remove-raf-commits.md → aaaabm-name-picker-buffet/plans/05-remove-raf-commits.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/006-update-execution-prompt-for-commits.md → aaaabm-name-picker-buffet/plans/06-update-execution-prompt-for-commits.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/007-fix-plan-mode-user-prompt.md → aaaabm-name-picker-buffet/plans/07-fix-plan-mode-user-prompt.md} +0 -0
- /package/RAF/{012-name-picker-buffet/plans/008-add-auto-flag-for-plan-mode.md → aaaabm-name-picker-buffet/plans/08-add-auto-flag-for-plan-mode.md} +0 -0
- /package/RAF/{013-dependencies-watchdog → aaaabn-dependencies-watchdog}/decisions.md +0 -0
- /package/RAF/{013-dependencies-watchdog → aaaabn-dependencies-watchdog}/input.md +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/001-define-dependency-syntax.md → aaaabn-dependencies-watchdog/outcomes/01-define-dependency-syntax.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/002-update-planning-prompts.md → aaaabn-dependencies-watchdog/outcomes/02-update-planning-prompts.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/003-parse-dependencies-update-state.md → aaaabn-dependencies-watchdog/outcomes/03-parse-dependencies-update-state.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/004-implement-dependency-checking-in-do.md → aaaabn-dependencies-watchdog/outcomes/04-implement-dependency-checking-in-do.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/005-update-execution-prompts.md → aaaabn-dependencies-watchdog/outcomes/05-update-execution-prompts.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/006-add-tests.md → aaaabn-dependencies-watchdog/outcomes/06-add-tests.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/007-add-act-alias.md → aaaabn-dependencies-watchdog/outcomes/07-add-act-alias.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/outcomes/008-add-exit-message.md → aaaabn-dependencies-watchdog/outcomes/08-add-exit-message.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/001-define-dependency-syntax.md → aaaabn-dependencies-watchdog/plans/01-define-dependency-syntax.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/002-update-planning-prompts.md → aaaabn-dependencies-watchdog/plans/02-update-planning-prompts.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/003-parse-dependencies-update-state.md → aaaabn-dependencies-watchdog/plans/03-parse-dependencies-update-state.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/004-implement-dependency-checking-in-do.md → aaaabn-dependencies-watchdog/plans/04-implement-dependency-checking-in-do.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/005-update-execution-prompts.md → aaaabn-dependencies-watchdog/plans/05-update-execution-prompts.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/006-add-tests.md → aaaabn-dependencies-watchdog/plans/06-add-tests.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/007-add-act-alias.md → aaaabn-dependencies-watchdog/plans/07-add-act-alias.md} +0 -0
- /package/RAF/{013-dependencies-watchdog/plans/008-add-exit-message.md → aaaabn-dependencies-watchdog/plans/08-add-exit-message.md} +0 -0
- /package/RAF/{014-watchdog → aaaabo-watchdog}/decisions.md +0 -0
- /package/RAF/{014-watchdog → aaaabo-watchdog}/input.md +0 -0
- /package/RAF/{014-watchdog/outcomes/001-amend-flag-position.md → aaaabo-watchdog/outcomes/01-amend-flag-position.md} +0 -0
- /package/RAF/{014-watchdog/outcomes/002-details-only-on-failure.md → aaaabo-watchdog/outcomes/02-details-only-on-failure.md} +0 -0
- /package/RAF/{014-watchdog/plans/001-amend-flag-position.md → aaaabo-watchdog/plans/01-amend-flag-position.md} +0 -0
- /package/RAF/{014-watchdog/plans/002-details-only-on-failure.md → aaaabo-watchdog/plans/02-details-only-on-failure.md} +0 -0
- /package/RAF/{015-name-lottery → aaaabp-name-lottery}/decisions.md +0 -0
- /package/RAF/{015-name-lottery → aaaabp-name-lottery}/input.md +0 -0
- /package/RAF/{015-name-lottery/outcomes/001-auto-pick-project-name.md → aaaabp-name-lottery/outcomes/01-auto-pick-project-name.md} +0 -0
- /package/RAF/{015-name-lottery/outcomes/002-mention-plan-files-in-commit.md → aaaabp-name-lottery/outcomes/02-mention-plan-files-in-commit.md} +0 -0
- /package/RAF/{015-name-lottery/outcomes/003-fix-input-md-in-amend-flow.md → aaaabp-name-lottery/outcomes/03-fix-input-md-in-amend-flow.md} +0 -0
- /package/RAF/{015-name-lottery/plans/001-auto-pick-project-name.md → aaaabp-name-lottery/plans/01-auto-pick-project-name.md} +0 -0
- /package/RAF/{015-name-lottery/plans/002-mention-plan-files-in-commit.md → aaaabp-name-lottery/plans/02-mention-plan-files-in-commit.md} +0 -0
- /package/RAF/{015-name-lottery/plans/003-fix-input-md-in-amend-flow.md → aaaabp-name-lottery/plans/03-fix-input-md-in-amend-flow.md} +0 -0
- /package/RAF/{016-planning-scalpel → aaaabq-planning-scalpel}/decisions.md +0 -0
- /package/RAF/{016-planning-scalpel → aaaabq-planning-scalpel}/input.md +0 -0
- /package/RAF/{016-planning-scalpel/outcomes/001-update-git-commit-instructions.md → aaaabq-planning-scalpel/outcomes/01-update-git-commit-instructions.md} +0 -0
- /package/RAF/{016-planning-scalpel/plans/001-update-git-commit-instructions.md → aaaabq-planning-scalpel/plans/01-update-git-commit-instructions.md} +0 -0
- /package/RAF/{017-decision-vault → aaaabr-decision-vault}/decisions.md +0 -0
- /package/RAF/{017-decision-vault → aaaabr-decision-vault}/input.md +0 -0
- /package/RAF/{017-decision-vault/outcomes/001-create-git-commit-utility.md → aaaabr-decision-vault/outcomes/01-create-git-commit-utility.md} +0 -0
- /package/RAF/{017-decision-vault/outcomes/002-integrate-commit-into-plan.md → aaaabr-decision-vault/outcomes/02-integrate-commit-into-plan.md} +0 -0
- /package/RAF/{017-decision-vault/outcomes/003-add-tests-for-planning-commit.md → aaaabr-decision-vault/outcomes/03-add-tests-for-planning-commit.md} +0 -0
- /package/RAF/{017-decision-vault/plans/001-create-git-commit-utility.md → aaaabr-decision-vault/plans/01-create-git-commit-utility.md} +0 -0
- /package/RAF/{017-decision-vault/plans/002-integrate-commit-into-plan.md → aaaabr-decision-vault/plans/02-integrate-commit-into-plan.md} +0 -0
- /package/RAF/{017-decision-vault/plans/003-add-tests-for-planning-commit.md → aaaabr-decision-vault/plans/03-add-tests-for-planning-commit.md} +0 -0
- /package/RAF/{018-workflow-forge → aaaabs-workflow-forge}/decisions.md +0 -0
- /package/RAF/{018-workflow-forge → aaaabs-workflow-forge}/input.md +0 -0
- /package/RAF/{018-workflow-forge/outcomes/001-add-task-number-progress.md → aaaabs-workflow-forge/outcomes/01-add-task-number-progress.md} +0 -0
- /package/RAF/{018-workflow-forge/outcomes/002-update-plan-do-prompts.md → aaaabs-workflow-forge/outcomes/02-update-plan-do-prompts.md} +0 -0
- /package/RAF/{018-workflow-forge/plans/001-add-task-number-progress.md → aaaabs-workflow-forge/plans/01-add-task-number-progress.md} +0 -0
- /package/RAF/{018-workflow-forge/plans/002-update-plan-do-prompts.md → aaaabs-workflow-forge/plans/02-update-plan-do-prompts.md} +0 -0
- /package/RAF/{019-verbose-chronicle → aaaabt-verbose-chronicle}/decisions.md +0 -0
- /package/RAF/{019-verbose-chronicle → aaaabt-verbose-chronicle}/input.md +0 -0
- /package/RAF/{019-verbose-chronicle/outcomes/001-amend-iteration-references.md → aaaabt-verbose-chronicle/outcomes/01-amend-iteration-references.md} +0 -0
- /package/RAF/{019-verbose-chronicle/outcomes/002-verbose-task-name-display.md → aaaabt-verbose-chronicle/outcomes/02-verbose-task-name-display.md} +0 -0
- /package/RAF/{019-verbose-chronicle/outcomes/003-verbose-streaming-fix.md → aaaabt-verbose-chronicle/outcomes/03-verbose-streaming-fix.md} +0 -0
- /package/RAF/{019-verbose-chronicle/outcomes/004-commit-verification-before-halt.md → aaaabt-verbose-chronicle/outcomes/04-commit-verification-before-halt.md} +0 -0
- /package/RAF/{019-verbose-chronicle/plans/001-amend-iteration-references.md → aaaabt-verbose-chronicle/plans/01-amend-iteration-references.md} +0 -0
- /package/RAF/{019-verbose-chronicle/plans/002-verbose-task-name-display.md → aaaabt-verbose-chronicle/plans/02-verbose-task-name-display.md} +0 -0
- /package/RAF/{019-verbose-chronicle/plans/003-verbose-streaming-fix.md → aaaabt-verbose-chronicle/plans/03-verbose-streaming-fix.md} +0 -0
- /package/RAF/{019-verbose-chronicle/plans/004-commit-verification-before-halt.md → aaaabt-verbose-chronicle/plans/04-commit-verification-before-halt.md} +0 -0
|
@@ -45,11 +45,17 @@ export interface ClaudeRunnerOptions {
|
|
|
45
45
|
commitContext?: {
|
|
46
46
|
/** HEAD commit hash recorded before task execution began. */
|
|
47
47
|
preExecutionHead: string;
|
|
48
|
-
/** Expected commit message prefix (e.g., "RAF[005:
|
|
48
|
+
/** Expected commit message prefix (e.g., "RAF[005:01]"). */
|
|
49
49
|
expectedPrefix: string;
|
|
50
50
|
/** Path to the outcome file that should be committed. */
|
|
51
51
|
outcomeFilePath: string;
|
|
52
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Claude Code reasoning effort level.
|
|
55
|
+
* Sets CLAUDE_CODE_EFFORT_LEVEL env var for the spawned process.
|
|
56
|
+
* Only applied in non-interactive modes (run, runVerbose).
|
|
57
|
+
*/
|
|
58
|
+
effortLevel?: 'low' | 'medium' | 'high';
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
export interface ClaudeRunnerConfig {
|
|
@@ -65,6 +71,7 @@ export interface RunResult {
|
|
|
65
71
|
exitCode: number;
|
|
66
72
|
timedOut: boolean;
|
|
67
73
|
contextOverflow: boolean;
|
|
74
|
+
sessionId?: string;
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
const CONTEXT_OVERFLOW_PATTERNS = [
|
|
@@ -104,7 +111,7 @@ export const OUTCOME_POLL_INTERVAL_MS = 5_000;
|
|
|
104
111
|
export interface CommitContext {
|
|
105
112
|
/** HEAD commit hash recorded before task execution began. */
|
|
106
113
|
preExecutionHead: string;
|
|
107
|
-
/** Expected commit message prefix (e.g., "RAF[005:
|
|
114
|
+
/** Expected commit message prefix (e.g., "RAF[005:01]"). */
|
|
108
115
|
expectedPrefix: string;
|
|
109
116
|
/** Path to the outcome file that should be committed. */
|
|
110
117
|
outcomeFilePath: string;
|
|
@@ -252,11 +259,20 @@ export class ClaudeRunner {
|
|
|
252
259
|
private activeProcess: pty.IPty | null = null;
|
|
253
260
|
private killed = false;
|
|
254
261
|
private model: string;
|
|
262
|
+
private _sessionId: string | undefined;
|
|
255
263
|
|
|
256
264
|
constructor(config: ClaudeRunnerConfig = {}) {
|
|
257
265
|
this.model = config.model ?? 'opus';
|
|
258
266
|
}
|
|
259
267
|
|
|
268
|
+
/**
|
|
269
|
+
* Get the session ID captured from the most recent Claude session.
|
|
270
|
+
* Available after the system.init event is received during run() or runVerbose().
|
|
271
|
+
*/
|
|
272
|
+
get sessionId(): string | undefined {
|
|
273
|
+
return this._sessionId;
|
|
274
|
+
}
|
|
275
|
+
|
|
260
276
|
/**
|
|
261
277
|
* Run Claude interactively with stdin/stdout passthrough.
|
|
262
278
|
* Used for planning phase where user interaction is needed.
|
|
@@ -367,7 +383,7 @@ export class ClaudeRunner {
|
|
|
367
383
|
* - Default timeout is 60 minutes if not specified
|
|
368
384
|
*/
|
|
369
385
|
async run(prompt: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
|
|
370
|
-
const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext } = options;
|
|
386
|
+
const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
|
|
371
387
|
// Ensure timeout is a positive number, fallback to 60 minutes
|
|
372
388
|
const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
|
|
373
389
|
const timeoutMs = validatedTimeout * 60 * 1000;
|
|
@@ -377,14 +393,20 @@ export class ClaudeRunner {
|
|
|
377
393
|
let stderr = '';
|
|
378
394
|
let timedOut = false;
|
|
379
395
|
let contextOverflow = false;
|
|
396
|
+
let sessionId: string | undefined;
|
|
380
397
|
|
|
381
398
|
const claudePath = getClaudePath();
|
|
382
399
|
|
|
383
400
|
logger.debug(`Starting Claude execution session with model: ${this.model}`);
|
|
384
401
|
logger.debug(`Claude path: ${claudePath}`);
|
|
385
402
|
|
|
386
|
-
//
|
|
387
|
-
|
|
403
|
+
// Build env, optionally injecting effort level
|
|
404
|
+
const env = effortLevel
|
|
405
|
+
? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
|
|
406
|
+
: process.env;
|
|
407
|
+
|
|
408
|
+
// Use --output-format stream-json to get structured events including session_id.
|
|
409
|
+
// Unlike runVerbose(), output is parsed silently without writing to stdout.
|
|
388
410
|
// --dangerously-skip-permissions bypasses interactive prompts
|
|
389
411
|
// -p enables print mode (non-interactive)
|
|
390
412
|
const proc = spawn(claudePath, [
|
|
@@ -393,11 +415,14 @@ export class ClaudeRunner {
|
|
|
393
415
|
this.model,
|
|
394
416
|
'--append-system-prompt',
|
|
395
417
|
prompt,
|
|
418
|
+
'--output-format',
|
|
419
|
+
'stream-json',
|
|
420
|
+
'--verbose',
|
|
396
421
|
'-p',
|
|
397
422
|
'Execute the task as described in the system prompt.',
|
|
398
423
|
], {
|
|
399
424
|
cwd,
|
|
400
|
-
env
|
|
425
|
+
env,
|
|
401
426
|
stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
|
|
402
427
|
});
|
|
403
428
|
|
|
@@ -408,6 +433,9 @@ export class ClaudeRunner {
|
|
|
408
433
|
const timeoutHandle = setTimeout(() => {
|
|
409
434
|
timedOut = true;
|
|
410
435
|
logger.warn('Claude session timed out');
|
|
436
|
+
if (sessionId) {
|
|
437
|
+
logger.info(`Session ID: ${sessionId}`);
|
|
438
|
+
}
|
|
411
439
|
proc.kill('SIGTERM');
|
|
412
440
|
}, timeoutMs);
|
|
413
441
|
|
|
@@ -418,22 +446,47 @@ export class ClaudeRunner {
|
|
|
418
446
|
commitContext,
|
|
419
447
|
);
|
|
420
448
|
|
|
421
|
-
//
|
|
449
|
+
// Buffer for incomplete NDJSON lines (data chunks may split across line boundaries)
|
|
450
|
+
let lineBuffer = '';
|
|
451
|
+
|
|
452
|
+
// Collect stdout - parse NDJSON silently (no display output)
|
|
422
453
|
proc.stdout.on('data', (data) => {
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
454
|
+
lineBuffer += data.toString();
|
|
455
|
+
|
|
456
|
+
// Process complete lines from the NDJSON stream
|
|
457
|
+
let newlineIndex: number;
|
|
458
|
+
while ((newlineIndex = lineBuffer.indexOf('\n')) !== -1) {
|
|
459
|
+
const line = lineBuffer.substring(0, newlineIndex);
|
|
460
|
+
lineBuffer = lineBuffer.substring(newlineIndex + 1);
|
|
461
|
+
|
|
462
|
+
const result = renderStreamEvent(line);
|
|
463
|
+
|
|
464
|
+
if (result.sessionId && !sessionId) {
|
|
465
|
+
sessionId = result.sessionId;
|
|
466
|
+
this._sessionId = sessionId;
|
|
436
467
|
}
|
|
468
|
+
|
|
469
|
+
if (result.textContent) {
|
|
470
|
+
output += result.textContent;
|
|
471
|
+
|
|
472
|
+
// Check for completion marker to start grace period
|
|
473
|
+
completionDetector.checkOutput(output);
|
|
474
|
+
|
|
475
|
+
// Check for context overflow
|
|
476
|
+
for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
|
|
477
|
+
if (pattern.test(result.textContent)) {
|
|
478
|
+
contextOverflow = true;
|
|
479
|
+
logger.warn('Context overflow detected');
|
|
480
|
+
if (sessionId) {
|
|
481
|
+
logger.info(`Session ID: ${sessionId}`);
|
|
482
|
+
}
|
|
483
|
+
proc.kill('SIGTERM');
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Silently discard display output (unlike runVerbose)
|
|
437
490
|
}
|
|
438
491
|
});
|
|
439
492
|
|
|
@@ -443,6 +496,17 @@ export class ClaudeRunner {
|
|
|
443
496
|
});
|
|
444
497
|
|
|
445
498
|
proc.on('close', (exitCode) => {
|
|
499
|
+
// Process any remaining data in the line buffer
|
|
500
|
+
if (lineBuffer.trim()) {
|
|
501
|
+
const result = renderStreamEvent(lineBuffer);
|
|
502
|
+
if (result.sessionId && !sessionId) {
|
|
503
|
+
sessionId = result.sessionId;
|
|
504
|
+
}
|
|
505
|
+
if (result.textContent) {
|
|
506
|
+
output += result.textContent;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
446
510
|
clearTimeout(timeoutHandle);
|
|
447
511
|
completionDetector.cleanup();
|
|
448
512
|
this.activeProcess = null;
|
|
@@ -456,6 +520,7 @@ export class ClaudeRunner {
|
|
|
456
520
|
exitCode: exitCode ?? (this.killed ? 130 : 1),
|
|
457
521
|
timedOut,
|
|
458
522
|
contextOverflow,
|
|
523
|
+
sessionId,
|
|
459
524
|
});
|
|
460
525
|
});
|
|
461
526
|
});
|
|
@@ -474,7 +539,7 @@ export class ClaudeRunner {
|
|
|
474
539
|
* - Default timeout is 60 minutes if not specified
|
|
475
540
|
*/
|
|
476
541
|
async runVerbose(prompt: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
|
|
477
|
-
const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext } = options;
|
|
542
|
+
const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
|
|
478
543
|
// Ensure timeout is a positive number, fallback to 60 minutes
|
|
479
544
|
const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
|
|
480
545
|
const timeoutMs = validatedTimeout * 60 * 1000;
|
|
@@ -484,6 +549,7 @@ export class ClaudeRunner {
|
|
|
484
549
|
let stderr = '';
|
|
485
550
|
let timedOut = false;
|
|
486
551
|
let contextOverflow = false;
|
|
552
|
+
let sessionId: string | undefined;
|
|
487
553
|
|
|
488
554
|
const claudePath = getClaudePath();
|
|
489
555
|
|
|
@@ -491,6 +557,11 @@ export class ClaudeRunner {
|
|
|
491
557
|
logger.debug(`Prompt length: ${prompt.length}, timeout: ${timeoutMs}ms, cwd: ${cwd}`);
|
|
492
558
|
logger.debug(`Claude path: ${claudePath}`);
|
|
493
559
|
|
|
560
|
+
// Build env, optionally injecting effort level
|
|
561
|
+
const env = effortLevel
|
|
562
|
+
? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
|
|
563
|
+
: process.env;
|
|
564
|
+
|
|
494
565
|
logger.debug('Spawning process...');
|
|
495
566
|
// Use --output-format stream-json --verbose to get real-time streaming events
|
|
496
567
|
// including tool calls, file operations, and intermediate output.
|
|
@@ -509,7 +580,7 @@ export class ClaudeRunner {
|
|
|
509
580
|
'Execute the task as described in the system prompt.',
|
|
510
581
|
], {
|
|
511
582
|
cwd,
|
|
512
|
-
env
|
|
583
|
+
env,
|
|
513
584
|
stdio: ['ignore', 'pipe', 'pipe'], // no stdin needed
|
|
514
585
|
});
|
|
515
586
|
|
|
@@ -521,6 +592,9 @@ export class ClaudeRunner {
|
|
|
521
592
|
const timeoutHandle = setTimeout(() => {
|
|
522
593
|
timedOut = true;
|
|
523
594
|
logger.warn('Claude session timed out');
|
|
595
|
+
if (sessionId) {
|
|
596
|
+
logger.info(`Session ID: ${sessionId}`);
|
|
597
|
+
}
|
|
524
598
|
proc.kill('SIGTERM');
|
|
525
599
|
}, timeoutMs);
|
|
526
600
|
|
|
@@ -549,27 +623,35 @@ export class ClaudeRunner {
|
|
|
549
623
|
const line = lineBuffer.substring(0, newlineIndex);
|
|
550
624
|
lineBuffer = lineBuffer.substring(newlineIndex + 1);
|
|
551
625
|
|
|
552
|
-
const
|
|
626
|
+
const result = renderStreamEvent(line);
|
|
627
|
+
|
|
628
|
+
if (result.sessionId && !sessionId) {
|
|
629
|
+
sessionId = result.sessionId;
|
|
630
|
+
this._sessionId = sessionId;
|
|
631
|
+
}
|
|
553
632
|
|
|
554
|
-
if (textContent) {
|
|
555
|
-
output += textContent;
|
|
633
|
+
if (result.textContent) {
|
|
634
|
+
output += result.textContent;
|
|
556
635
|
|
|
557
636
|
// Check for completion marker to start grace period
|
|
558
637
|
completionDetector.checkOutput(output);
|
|
559
638
|
|
|
560
639
|
// Check for context overflow
|
|
561
640
|
for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
|
|
562
|
-
if (pattern.test(textContent)) {
|
|
641
|
+
if (pattern.test(result.textContent)) {
|
|
563
642
|
contextOverflow = true;
|
|
564
643
|
logger.warn('Context overflow detected');
|
|
644
|
+
if (sessionId) {
|
|
645
|
+
logger.info(`Session ID: ${sessionId}`);
|
|
646
|
+
}
|
|
565
647
|
proc.kill('SIGTERM');
|
|
566
648
|
break;
|
|
567
649
|
}
|
|
568
650
|
}
|
|
569
651
|
}
|
|
570
652
|
|
|
571
|
-
if (display) {
|
|
572
|
-
process.stdout.write(display);
|
|
653
|
+
if (result.display) {
|
|
654
|
+
process.stdout.write(result.display);
|
|
573
655
|
}
|
|
574
656
|
}
|
|
575
657
|
});
|
|
@@ -582,12 +664,15 @@ export class ClaudeRunner {
|
|
|
582
664
|
proc.on('close', (exitCode) => {
|
|
583
665
|
// Process any remaining data in the line buffer
|
|
584
666
|
if (lineBuffer.trim()) {
|
|
585
|
-
const
|
|
586
|
-
if (
|
|
587
|
-
|
|
667
|
+
const result = renderStreamEvent(lineBuffer);
|
|
668
|
+
if (result.sessionId && !sessionId) {
|
|
669
|
+
sessionId = result.sessionId;
|
|
588
670
|
}
|
|
589
|
-
if (
|
|
590
|
-
|
|
671
|
+
if (result.textContent) {
|
|
672
|
+
output += result.textContent;
|
|
673
|
+
}
|
|
674
|
+
if (result.display) {
|
|
675
|
+
process.stdout.write(result.display);
|
|
591
676
|
}
|
|
592
677
|
}
|
|
593
678
|
|
|
@@ -605,6 +690,134 @@ export class ClaudeRunner {
|
|
|
605
690
|
exitCode: exitCode ?? (this.killed ? 130 : 1),
|
|
606
691
|
timedOut,
|
|
607
692
|
contextOverflow,
|
|
693
|
+
sessionId,
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
});
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
* Resume an interrupted Claude session by session ID.
|
|
701
|
+
* Spawns Claude with --resume flag only — no prompt, model, or system prompt flags.
|
|
702
|
+
* Uses stream-json output format for session ID extraction and completion detection.
|
|
703
|
+
*/
|
|
704
|
+
async runResume(sessionId: string, options: ClaudeRunnerOptions = {}): Promise<RunResult> {
|
|
705
|
+
const { timeout = 60, cwd = process.cwd(), outcomeFilePath, commitContext, effortLevel } = options;
|
|
706
|
+
const validatedTimeout = Number(timeout) > 0 ? Number(timeout) : 60;
|
|
707
|
+
const timeoutMs = validatedTimeout * 60 * 1000;
|
|
708
|
+
|
|
709
|
+
return new Promise((resolve) => {
|
|
710
|
+
let output = '';
|
|
711
|
+
let stderr = '';
|
|
712
|
+
let timedOut = false;
|
|
713
|
+
let contextOverflow = false;
|
|
714
|
+
let newSessionId: string | undefined;
|
|
715
|
+
|
|
716
|
+
const claudePath = getClaudePath();
|
|
717
|
+
|
|
718
|
+
logger.debug(`Resuming Claude session: ${sessionId}`);
|
|
719
|
+
|
|
720
|
+
const env = effortLevel
|
|
721
|
+
? { ...process.env, CLAUDE_CODE_EFFORT_LEVEL: effortLevel }
|
|
722
|
+
: process.env;
|
|
723
|
+
|
|
724
|
+
// Resume with minimal flags: --resume, --dangerously-skip-permissions, --output-format stream-json --verbose
|
|
725
|
+
// Do NOT pass --model, --append-system-prompt, or -p — Claude restores these from the session
|
|
726
|
+
const proc = spawn(claudePath, [
|
|
727
|
+
'--resume',
|
|
728
|
+
sessionId,
|
|
729
|
+
'--dangerously-skip-permissions',
|
|
730
|
+
'--output-format',
|
|
731
|
+
'stream-json',
|
|
732
|
+
'--verbose',
|
|
733
|
+
], {
|
|
734
|
+
cwd,
|
|
735
|
+
env,
|
|
736
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
737
|
+
});
|
|
738
|
+
|
|
739
|
+
this.activeProcess = proc as any;
|
|
740
|
+
|
|
741
|
+
const timeoutHandle = setTimeout(() => {
|
|
742
|
+
timedOut = true;
|
|
743
|
+
logger.warn('Resumed Claude session timed out');
|
|
744
|
+
if (newSessionId) {
|
|
745
|
+
logger.info(`Session ID: ${newSessionId}`);
|
|
746
|
+
}
|
|
747
|
+
proc.kill('SIGTERM');
|
|
748
|
+
}, timeoutMs);
|
|
749
|
+
|
|
750
|
+
const completionDetector = createCompletionDetector(
|
|
751
|
+
() => proc.kill('SIGTERM'),
|
|
752
|
+
outcomeFilePath,
|
|
753
|
+
commitContext,
|
|
754
|
+
);
|
|
755
|
+
|
|
756
|
+
let lineBuffer = '';
|
|
757
|
+
|
|
758
|
+
proc.stdout.on('data', (data) => {
|
|
759
|
+
lineBuffer += data.toString();
|
|
760
|
+
|
|
761
|
+
let newlineIndex: number;
|
|
762
|
+
while ((newlineIndex = lineBuffer.indexOf('\n')) !== -1) {
|
|
763
|
+
const line = lineBuffer.substring(0, newlineIndex);
|
|
764
|
+
lineBuffer = lineBuffer.substring(newlineIndex + 1);
|
|
765
|
+
|
|
766
|
+
const result = renderStreamEvent(line);
|
|
767
|
+
|
|
768
|
+
if (result.sessionId && !newSessionId) {
|
|
769
|
+
newSessionId = result.sessionId;
|
|
770
|
+
this._sessionId = newSessionId;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
if (result.textContent) {
|
|
774
|
+
output += result.textContent;
|
|
775
|
+
completionDetector.checkOutput(output);
|
|
776
|
+
|
|
777
|
+
for (const pattern of CONTEXT_OVERFLOW_PATTERNS) {
|
|
778
|
+
if (pattern.test(result.textContent)) {
|
|
779
|
+
contextOverflow = true;
|
|
780
|
+
logger.warn('Context overflow detected');
|
|
781
|
+
if (newSessionId) {
|
|
782
|
+
logger.info(`Session ID: ${newSessionId}`);
|
|
783
|
+
}
|
|
784
|
+
proc.kill('SIGTERM');
|
|
785
|
+
break;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
proc.stderr.on('data', (data) => {
|
|
793
|
+
stderr += data.toString();
|
|
794
|
+
});
|
|
795
|
+
|
|
796
|
+
proc.on('close', (exitCode) => {
|
|
797
|
+
if (lineBuffer.trim()) {
|
|
798
|
+
const result = renderStreamEvent(lineBuffer);
|
|
799
|
+
if (result.sessionId && !newSessionId) {
|
|
800
|
+
newSessionId = result.sessionId;
|
|
801
|
+
}
|
|
802
|
+
if (result.textContent) {
|
|
803
|
+
output += result.textContent;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
clearTimeout(timeoutHandle);
|
|
808
|
+
completionDetector.cleanup();
|
|
809
|
+
this.activeProcess = null;
|
|
810
|
+
|
|
811
|
+
if (stderr) {
|
|
812
|
+
logger.debug(`Claude stderr: ${stderr}`);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
resolve({
|
|
816
|
+
output,
|
|
817
|
+
exitCode: exitCode ?? (this.killed ? 130 : 1),
|
|
818
|
+
timedOut,
|
|
819
|
+
contextOverflow,
|
|
820
|
+
sessionId: newSessionId,
|
|
608
821
|
});
|
|
609
822
|
});
|
|
610
823
|
});
|
package/src/core/git.ts
CHANGED
|
@@ -12,9 +12,9 @@ export interface GitStatus {
|
|
|
12
12
|
/**
|
|
13
13
|
* Check if we're in a git repository.
|
|
14
14
|
*/
|
|
15
|
-
export function isGitRepo(): boolean {
|
|
15
|
+
export function isGitRepo(cwd?: string): boolean {
|
|
16
16
|
try {
|
|
17
|
-
execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe' });
|
|
17
|
+
execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) });
|
|
18
18
|
return true;
|
|
19
19
|
} catch {
|
|
20
20
|
return false;
|
|
@@ -58,9 +58,9 @@ export function getGitStatus(): GitStatus {
|
|
|
58
58
|
/**
|
|
59
59
|
* Check if there are uncommitted changes.
|
|
60
60
|
*/
|
|
61
|
-
export function hasUncommittedChanges(): boolean {
|
|
61
|
+
export function hasUncommittedChanges(cwd?: string): boolean {
|
|
62
62
|
try {
|
|
63
|
-
const status = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe' });
|
|
63
|
+
const status = execSync('git status --porcelain', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) });
|
|
64
64
|
return status.trim().length > 0;
|
|
65
65
|
} catch {
|
|
66
66
|
return false;
|
|
@@ -141,16 +141,16 @@ export function getChangedFiles(): string[] {
|
|
|
141
141
|
|
|
142
142
|
/**
|
|
143
143
|
* Stash uncommitted changes with a descriptive name.
|
|
144
|
-
* @param name - Name for the stash (e.g., "raf-001-task-
|
|
144
|
+
* @param name - Name for the stash (e.g., "raf-001-task-03-failed")
|
|
145
145
|
* @returns true if stash was created, false otherwise
|
|
146
146
|
*/
|
|
147
|
-
export function stashChanges(name: string): boolean {
|
|
148
|
-
if (!isGitRepo()) {
|
|
147
|
+
export function stashChanges(name: string, cwd?: string): boolean {
|
|
148
|
+
if (!isGitRepo(cwd)) {
|
|
149
149
|
logger.warn('Not in a git repository, skipping stash');
|
|
150
150
|
return false;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
-
if (!hasUncommittedChanges()) {
|
|
153
|
+
if (!hasUncommittedChanges(cwd)) {
|
|
154
154
|
logger.debug('No uncommitted changes to stash');
|
|
155
155
|
return false;
|
|
156
156
|
}
|
|
@@ -159,6 +159,7 @@ export function stashChanges(name: string): boolean {
|
|
|
159
159
|
execSync(`git stash push -m "${name.replace(/"/g, '\\"')}"`, {
|
|
160
160
|
encoding: 'utf-8',
|
|
161
161
|
stdio: 'pipe',
|
|
162
|
+
...(cwd ? { cwd } : {}),
|
|
162
163
|
});
|
|
163
164
|
return true;
|
|
164
165
|
} catch (error) {
|
|
@@ -171,9 +172,9 @@ export function stashChanges(name: string): boolean {
|
|
|
171
172
|
* Get the current HEAD commit hash.
|
|
172
173
|
* Returns null if not in a git repo or HEAD doesn't exist.
|
|
173
174
|
*/
|
|
174
|
-
export function getHeadCommitHash(): string | null {
|
|
175
|
+
export function getHeadCommitHash(cwd?: string): string | null {
|
|
175
176
|
try {
|
|
176
|
-
return execSync('git rev-parse HEAD', { encoding: 'utf-8', stdio: 'pipe' }).trim() || null;
|
|
177
|
+
return execSync('git rev-parse HEAD', { encoding: 'utf-8', stdio: 'pipe', ...(cwd ? { cwd } : {}) }).trim() || null;
|
|
177
178
|
} catch {
|
|
178
179
|
return null;
|
|
179
180
|
}
|
|
@@ -214,13 +215,20 @@ export function isFileCommittedInHead(filePath: string): boolean {
|
|
|
214
215
|
/**
|
|
215
216
|
* Commit planning artifacts (input.md and decisions.md) for a project.
|
|
216
217
|
* Uses commit message format: RAF[NNN] Plan: project-name
|
|
218
|
+
* For amendments: RAF[NNN] Amend: project-name
|
|
217
219
|
*
|
|
218
220
|
* @param projectPath - Full path to the project folder (e.g., /path/to/RAF/017-decision-vault)
|
|
221
|
+
* @param options - Optional settings
|
|
222
|
+
* @param options.cwd - Working directory for git commands (worktree support)
|
|
223
|
+
* @param options.additionalFiles - Extra file paths to stage (e.g., plan files for amend)
|
|
224
|
+
* @param options.isAmend - Use "Amend:" prefix instead of "Plan:" in commit message
|
|
219
225
|
* @returns Promise that resolves when commit is complete (or fails silently)
|
|
220
226
|
*/
|
|
221
|
-
export async function commitPlanningArtifacts(projectPath: string): Promise<void> {
|
|
227
|
+
export async function commitPlanningArtifacts(projectPath: string, options?: { cwd?: string; additionalFiles?: string[]; isAmend?: boolean }): Promise<void> {
|
|
228
|
+
const execCwd = options?.cwd;
|
|
229
|
+
|
|
222
230
|
// Check if we're in a git repository
|
|
223
|
-
if (!isGitRepo()) {
|
|
231
|
+
if (!isGitRepo(execCwd)) {
|
|
224
232
|
logger.warn('Not in a git repository, skipping planning artifacts commit');
|
|
225
233
|
return;
|
|
226
234
|
}
|
|
@@ -234,25 +242,52 @@ export async function commitPlanningArtifacts(projectPath: string): Promise<void
|
|
|
234
242
|
return;
|
|
235
243
|
}
|
|
236
244
|
|
|
237
|
-
// Build file paths
|
|
245
|
+
// Build absolute file paths
|
|
238
246
|
const inputFile = path.join(projectPath, 'input.md');
|
|
239
247
|
const decisionsFile = path.join(projectPath, 'decisions.md');
|
|
240
248
|
|
|
241
249
|
// Build commit message
|
|
242
|
-
const
|
|
250
|
+
const prefix = options?.isAmend ? 'Amend' : 'Plan';
|
|
251
|
+
const commitMessage = `RAF[${projectNumber}] ${prefix}: ${projectName}`;
|
|
252
|
+
|
|
253
|
+
// Build list of files to stage (absolute paths)
|
|
254
|
+
const absoluteFiles = [inputFile, decisionsFile, ...(options?.additionalFiles ?? [])];
|
|
255
|
+
|
|
256
|
+
// Convert to relative paths when cwd is provided (worktree mode).
|
|
257
|
+
// Git resolves paths relative to the working directory. Using relative paths
|
|
258
|
+
// avoids issues with symlink resolution (e.g., /tmp → /private/tmp on macOS)
|
|
259
|
+
// that can cause absolute paths to not match git's internal worktree paths.
|
|
260
|
+
const filesToStage = execCwd
|
|
261
|
+
? absoluteFiles.map(f => path.relative(execCwd, f))
|
|
262
|
+
: absoluteFiles;
|
|
263
|
+
|
|
264
|
+
// Stage each file individually so one missing file doesn't block the others
|
|
265
|
+
let stagedCount = 0;
|
|
266
|
+
for (const file of filesToStage) {
|
|
267
|
+
try {
|
|
268
|
+
execSync(`git add -- "${file}"`, {
|
|
269
|
+
encoding: 'utf-8',
|
|
270
|
+
stdio: 'pipe',
|
|
271
|
+
...(execCwd ? { cwd: execCwd } : {}),
|
|
272
|
+
});
|
|
273
|
+
stagedCount++;
|
|
274
|
+
} catch (error) {
|
|
275
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
276
|
+
logger.warn(`Failed to stage ${file}: ${msg}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
243
279
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
encoding: 'utf-8',
|
|
249
|
-
stdio: 'pipe',
|
|
250
|
-
});
|
|
280
|
+
if (stagedCount === 0) {
|
|
281
|
+
logger.debug('No files were staged for planning artifacts commit');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
251
284
|
|
|
285
|
+
try {
|
|
252
286
|
// Check if there's anything staged to commit
|
|
253
287
|
const stagedStatus = execSync('git diff --cached --name-only', {
|
|
254
288
|
encoding: 'utf-8',
|
|
255
289
|
stdio: 'pipe',
|
|
290
|
+
...(execCwd ? { cwd: execCwd } : {}),
|
|
256
291
|
}).trim();
|
|
257
292
|
|
|
258
293
|
if (!stagedStatus) {
|
|
@@ -264,6 +299,7 @@ export async function commitPlanningArtifacts(projectPath: string): Promise<void
|
|
|
264
299
|
execSync(`git commit -m "${commitMessage.replace(/"/g, '\\"')}"`, {
|
|
265
300
|
encoding: 'utf-8',
|
|
266
301
|
stdio: 'pipe',
|
|
302
|
+
...(execCwd ? { cwd: execCwd } : {}),
|
|
267
303
|
});
|
|
268
304
|
|
|
269
305
|
logger.debug(`Committed planning artifacts: ${commitMessage}`);
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
getDecisionsPath,
|
|
12
12
|
getInputPath,
|
|
13
13
|
listProjects,
|
|
14
|
+
TASK_ID_PATTERN,
|
|
14
15
|
} from '../utils/paths.js';
|
|
15
16
|
import { sanitizeProjectName } from '../utils/validation.js';
|
|
16
17
|
import { logger } from '../utils/logger.js';
|
|
@@ -145,7 +146,7 @@ export class ProjectManager {
|
|
|
145
146
|
const files = fs.readdirSync(outcomesDir).filter((f) => f.endsWith('.md')).sort();
|
|
146
147
|
|
|
147
148
|
for (const file of files) {
|
|
148
|
-
const match = file.match(
|
|
149
|
+
const match = file.match(new RegExp(`^(${TASK_ID_PATTERN})-`));
|
|
149
150
|
if (match && match[1]) {
|
|
150
151
|
const content = fs.readFileSync(path.join(outcomesDir, file), 'utf-8');
|
|
151
152
|
outcomes.push({ taskId: match[1], content });
|