rafcode 1.2.0 → 2.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.md +118 -22
- package/RAF/aaaabt-verbose-chronicle/decisions.md +25 -0
- package/RAF/aaaabt-verbose-chronicle/input.md +3 -0
- package/RAF/aaaabt-verbose-chronicle/outcomes/01-amend-iteration-references.md +25 -0
- package/RAF/aaaabt-verbose-chronicle/outcomes/02-verbose-task-name-display.md +31 -0
- package/RAF/aaaabt-verbose-chronicle/outcomes/03-verbose-streaming-fix.md +48 -0
- package/RAF/aaaabt-verbose-chronicle/outcomes/04-commit-verification-before-halt.md +56 -0
- package/RAF/aaaabt-verbose-chronicle/plans/01-amend-iteration-references.md +35 -0
- package/RAF/aaaabt-verbose-chronicle/plans/02-verbose-task-name-display.md +38 -0
- package/RAF/aaaabt-verbose-chronicle/plans/03-verbose-streaming-fix.md +45 -0
- package/RAF/aaaabt-verbose-chronicle/plans/04-commit-verification-before-halt.md +62 -0
- 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/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 +400 -131
- 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 +52 -1
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +195 -17
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/git.d.ts +29 -5
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +95 -18
- 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/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 +120 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +322 -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 +42 -0
- package/dist/parsers/stream-renderer.d.ts.map +1 -0
- package/dist/parsers/stream-renderer.js +100 -0
- package/dist/parsers/stream-renderer.js.map +1 -0
- package/dist/prompts/amend.d.ts +1 -0
- package/dist/prompts/amend.d.ts.map +1 -1
- package/dist/prompts/amend.js +25 -10
- package/dist/prompts/amend.js.map +1 -1
- package/dist/prompts/execution.js +5 -5
- 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 +11 -10
- package/dist/prompts/planning.js.map +1 -1
- package/dist/types/config.d.ts +5 -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 +471 -142
- 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 +270 -17
- package/src/core/git.ts +99 -19
- package/src/core/project-manager.ts +2 -1
- package/src/core/pull-request.ts +480 -0
- package/src/core/state-derivation.ts +18 -14
- package/src/core/worktree.ts +357 -0
- package/src/index.ts +2 -0
- package/src/parsers/stream-renderer.ts +139 -0
- package/src/prompts/amend.ts +27 -9
- package/src/prompts/execution.ts +5 -5
- package/src/prompts/planning.ts +12 -10
- package/src/types/config.ts +6 -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.test.ts +567 -1
- 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 +103 -0
- 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 +144 -93
- package/tests/unit/planning-prompt.test.ts +41 -4
- package/tests/unit/post-execution-picker.test.ts +251 -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 +286 -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 +523 -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
|
@@ -28,32 +28,32 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
28
28
|
describe('Project Resolution for Amend', () => {
|
|
29
29
|
beforeEach(() => {
|
|
30
30
|
// Create a project with tasks
|
|
31
|
-
const projectDir = path.join(tempDir, '
|
|
31
|
+
const projectDir = path.join(tempDir, 'aaaaad-my-project');
|
|
32
32
|
fs.mkdirSync(projectDir);
|
|
33
33
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
34
34
|
fs.writeFileSync(
|
|
35
|
-
path.join(projectDir, 'plans', '
|
|
35
|
+
path.join(projectDir, 'plans', '01-first-task.md'),
|
|
36
36
|
'# Task: First Task\n'
|
|
37
37
|
);
|
|
38
38
|
fs.writeFileSync(
|
|
39
|
-
path.join(projectDir, 'plans', '
|
|
39
|
+
path.join(projectDir, 'plans', '02-second-task.md'),
|
|
40
40
|
'# Task: Second Task\n'
|
|
41
41
|
);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
it('should resolve project by
|
|
45
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
46
|
-
expect(result).toBe(path.join(tempDir, '
|
|
44
|
+
it('should resolve project by 6-char base26 ID for amend', () => {
|
|
45
|
+
const result = resolveProjectIdentifier(tempDir, 'aaaaad');
|
|
46
|
+
expect(result).toBe(path.join(tempDir, 'aaaaad-my-project'));
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
it('should resolve project by name for amend', () => {
|
|
50
50
|
const result = resolveProjectIdentifier(tempDir, 'my-project');
|
|
51
|
-
expect(result).toBe(path.join(tempDir, '
|
|
51
|
+
expect(result).toBe(path.join(tempDir, 'aaaaad-my-project'));
|
|
52
52
|
});
|
|
53
53
|
|
|
54
54
|
it('should resolve project by full folder name for amend', () => {
|
|
55
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
56
|
-
expect(result).toBe(path.join(tempDir, '
|
|
55
|
+
const result = resolveProjectIdentifier(tempDir, 'aaaaad-my-project');
|
|
56
|
+
expect(result).toBe(path.join(tempDir, 'aaaaad-my-project'));
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
it('should return null for non-existent project', () => {
|
|
@@ -62,39 +62,39 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
describe('
|
|
65
|
+
describe('Base26 Project Resolution for Amend', () => {
|
|
66
66
|
beforeEach(() => {
|
|
67
|
-
const projectDir = path.join(tempDir, '
|
|
67
|
+
const projectDir = path.join(tempDir, 'abcdef-important-project');
|
|
68
68
|
fs.mkdirSync(projectDir);
|
|
69
69
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
70
70
|
fs.writeFileSync(
|
|
71
|
-
path.join(projectDir, 'plans', '
|
|
71
|
+
path.join(projectDir, 'plans', '01-initial-task.md'),
|
|
72
72
|
'# Task: Initial Task\n'
|
|
73
73
|
);
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
it('should resolve project by
|
|
77
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
78
|
-
expect(result).toBe(path.join(tempDir, '
|
|
76
|
+
it('should resolve project by 6-char base26 prefix for amend', () => {
|
|
77
|
+
const result = resolveProjectIdentifier(tempDir, 'abcdef');
|
|
78
|
+
expect(result).toBe(path.join(tempDir, 'abcdef-important-project'));
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
it('should resolve project by full
|
|
82
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
83
|
-
expect(result).toBe(path.join(tempDir, '
|
|
81
|
+
it('should resolve project by full base26 folder name for amend', () => {
|
|
82
|
+
const result = resolveProjectIdentifier(tempDir, 'abcdef-important-project');
|
|
83
|
+
expect(result).toBe(path.join(tempDir, 'abcdef-important-project'));
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
describe('Existing Project State Loading', () => {
|
|
88
88
|
it('should load pending tasks', () => {
|
|
89
|
-
const projectDir = path.join(tempDir, '
|
|
89
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
90
90
|
fs.mkdirSync(projectDir);
|
|
91
91
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
92
92
|
fs.writeFileSync(
|
|
93
|
-
path.join(projectDir, 'plans', '
|
|
93
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
94
94
|
'# Task: Task One\n'
|
|
95
95
|
);
|
|
96
96
|
fs.writeFileSync(
|
|
97
|
-
path.join(projectDir, 'plans', '
|
|
97
|
+
path.join(projectDir, 'plans', '02-task-two.md'),
|
|
98
98
|
'# Task: Task Two\n'
|
|
99
99
|
);
|
|
100
100
|
|
|
@@ -105,16 +105,16 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
105
105
|
});
|
|
106
106
|
|
|
107
107
|
it('should load completed tasks', () => {
|
|
108
|
-
const projectDir = path.join(tempDir, '
|
|
108
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
109
109
|
fs.mkdirSync(projectDir);
|
|
110
110
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
111
111
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
112
112
|
fs.writeFileSync(
|
|
113
|
-
path.join(projectDir, 'plans', '
|
|
113
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
114
114
|
'# Task: Task One\n'
|
|
115
115
|
);
|
|
116
116
|
fs.writeFileSync(
|
|
117
|
-
path.join(projectDir, 'outcomes', '
|
|
117
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
118
118
|
'Task completed.\n\n<promise>COMPLETE</promise>'
|
|
119
119
|
);
|
|
120
120
|
|
|
@@ -124,16 +124,16 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
124
124
|
});
|
|
125
125
|
|
|
126
126
|
it('should load failed tasks', () => {
|
|
127
|
-
const projectDir = path.join(tempDir, '
|
|
127
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
128
128
|
fs.mkdirSync(projectDir);
|
|
129
129
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
130
130
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
131
131
|
fs.writeFileSync(
|
|
132
|
-
path.join(projectDir, 'plans', '
|
|
132
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
133
133
|
'# Task: Task One\n'
|
|
134
134
|
);
|
|
135
135
|
fs.writeFileSync(
|
|
136
|
-
path.join(projectDir, 'outcomes', '
|
|
136
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
137
137
|
'Task failed.\n\n<promise>FAILED</promise>'
|
|
138
138
|
);
|
|
139
139
|
|
|
@@ -143,28 +143,28 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
143
143
|
});
|
|
144
144
|
|
|
145
145
|
it('should load mixed task statuses', () => {
|
|
146
|
-
const projectDir = path.join(tempDir, '
|
|
146
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
147
147
|
fs.mkdirSync(projectDir);
|
|
148
148
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
149
149
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
150
150
|
fs.writeFileSync(
|
|
151
|
-
path.join(projectDir, 'plans', '
|
|
151
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
152
152
|
'# Task: Task One\n'
|
|
153
153
|
);
|
|
154
154
|
fs.writeFileSync(
|
|
155
|
-
path.join(projectDir, 'plans', '
|
|
155
|
+
path.join(projectDir, 'plans', '02-task-two.md'),
|
|
156
156
|
'# Task: Task Two\n'
|
|
157
157
|
);
|
|
158
158
|
fs.writeFileSync(
|
|
159
|
-
path.join(projectDir, 'plans', '
|
|
159
|
+
path.join(projectDir, 'plans', '03-task-three.md'),
|
|
160
160
|
'# Task: Task Three\n'
|
|
161
161
|
);
|
|
162
162
|
fs.writeFileSync(
|
|
163
|
-
path.join(projectDir, 'outcomes', '
|
|
163
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
164
164
|
'Task completed.\n\n<promise>COMPLETE</promise>'
|
|
165
165
|
);
|
|
166
166
|
fs.writeFileSync(
|
|
167
|
-
path.join(projectDir, 'outcomes', '
|
|
167
|
+
path.join(projectDir, 'outcomes', '02-task-two.md'),
|
|
168
168
|
'Task failed.\n\n<promise>FAILED</promise>'
|
|
169
169
|
);
|
|
170
170
|
// Task three has no outcome - pending
|
|
@@ -179,24 +179,24 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
179
179
|
|
|
180
180
|
describe('Fully Completed Project Detection', () => {
|
|
181
181
|
it('should detect fully completed project', () => {
|
|
182
|
-
const projectDir = path.join(tempDir, '
|
|
182
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
183
183
|
fs.mkdirSync(projectDir);
|
|
184
184
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
185
185
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
186
186
|
fs.writeFileSync(
|
|
187
|
-
path.join(projectDir, 'plans', '
|
|
187
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
188
188
|
'# Task: Task One\n'
|
|
189
189
|
);
|
|
190
190
|
fs.writeFileSync(
|
|
191
|
-
path.join(projectDir, 'plans', '
|
|
191
|
+
path.join(projectDir, 'plans', '02-task-two.md'),
|
|
192
192
|
'# Task: Task Two\n'
|
|
193
193
|
);
|
|
194
194
|
fs.writeFileSync(
|
|
195
|
-
path.join(projectDir, 'outcomes', '
|
|
195
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
196
196
|
'Task completed.\n\n<promise>COMPLETE</promise>'
|
|
197
197
|
);
|
|
198
198
|
fs.writeFileSync(
|
|
199
|
-
path.join(projectDir, 'outcomes', '
|
|
199
|
+
path.join(projectDir, 'outcomes', '02-task-two.md'),
|
|
200
200
|
'Task completed.\n\n<promise>COMPLETE</promise>'
|
|
201
201
|
);
|
|
202
202
|
|
|
@@ -205,20 +205,20 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
205
205
|
});
|
|
206
206
|
|
|
207
207
|
it('should not mark project as complete with pending tasks', () => {
|
|
208
|
-
const projectDir = path.join(tempDir, '
|
|
208
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
209
209
|
fs.mkdirSync(projectDir);
|
|
210
210
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
211
211
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
212
212
|
fs.writeFileSync(
|
|
213
|
-
path.join(projectDir, 'plans', '
|
|
213
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
214
214
|
'# Task: Task One\n'
|
|
215
215
|
);
|
|
216
216
|
fs.writeFileSync(
|
|
217
|
-
path.join(projectDir, 'plans', '
|
|
217
|
+
path.join(projectDir, 'plans', '02-task-two.md'),
|
|
218
218
|
'# Task: Task Two\n'
|
|
219
219
|
);
|
|
220
220
|
fs.writeFileSync(
|
|
221
|
-
path.join(projectDir, 'outcomes', '
|
|
221
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
222
222
|
'Task completed.\n\n<promise>COMPLETE</promise>'
|
|
223
223
|
);
|
|
224
224
|
|
|
@@ -227,16 +227,16 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
227
227
|
});
|
|
228
228
|
|
|
229
229
|
it('should not mark project as complete with failed tasks', () => {
|
|
230
|
-
const projectDir = path.join(tempDir, '
|
|
230
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
231
231
|
fs.mkdirSync(projectDir);
|
|
232
232
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
233
233
|
fs.mkdirSync(path.join(projectDir, 'outcomes'));
|
|
234
234
|
fs.writeFileSync(
|
|
235
|
-
path.join(projectDir, 'plans', '
|
|
235
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
236
236
|
'# Task: Task One\n'
|
|
237
237
|
);
|
|
238
238
|
fs.writeFileSync(
|
|
239
|
-
path.join(projectDir, 'outcomes', '
|
|
239
|
+
path.join(projectDir, 'outcomes', '01-task-one.md'),
|
|
240
240
|
'Task failed.\n\n<promise>FAILED</promise>'
|
|
241
241
|
);
|
|
242
242
|
|
|
@@ -247,12 +247,12 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
247
247
|
|
|
248
248
|
describe('Task Name Extraction', () => {
|
|
249
249
|
it('should extract task name from plan file', () => {
|
|
250
|
-
const name = extractTaskNameFromPlanFile('
|
|
250
|
+
const name = extractTaskNameFromPlanFile('01-fix-login-bug.md');
|
|
251
251
|
expect(name).toBe('fix-login-bug');
|
|
252
252
|
});
|
|
253
253
|
|
|
254
254
|
it('should extract task name from plan file with multiple hyphens', () => {
|
|
255
|
-
const name = extractTaskNameFromPlanFile('
|
|
255
|
+
const name = extractTaskNameFromPlanFile('02-add-user-registration-flow.md');
|
|
256
256
|
expect(name).toBe('add-user-registration-flow');
|
|
257
257
|
});
|
|
258
258
|
|
|
@@ -269,19 +269,19 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
269
269
|
|
|
270
270
|
describe('Next Task Number Calculation', () => {
|
|
271
271
|
it('should calculate next task number correctly', () => {
|
|
272
|
-
const projectDir = path.join(tempDir, '
|
|
272
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
273
273
|
fs.mkdirSync(projectDir);
|
|
274
274
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
275
275
|
fs.writeFileSync(
|
|
276
|
-
path.join(projectDir, 'plans', '
|
|
276
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
277
277
|
'# Task: Task One\n'
|
|
278
278
|
);
|
|
279
279
|
fs.writeFileSync(
|
|
280
|
-
path.join(projectDir, 'plans', '
|
|
280
|
+
path.join(projectDir, 'plans', '02-task-two.md'),
|
|
281
281
|
'# Task: Task Two\n'
|
|
282
282
|
);
|
|
283
283
|
fs.writeFileSync(
|
|
284
|
-
path.join(projectDir, 'plans', '
|
|
284
|
+
path.join(projectDir, 'plans', '03-task-three.md'),
|
|
285
285
|
'# Task: Task Three\n'
|
|
286
286
|
);
|
|
287
287
|
|
|
@@ -294,11 +294,11 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
294
294
|
});
|
|
295
295
|
|
|
296
296
|
it('should handle single task project', () => {
|
|
297
|
-
const projectDir = path.join(tempDir, '
|
|
297
|
+
const projectDir = path.join(tempDir, 'aaaaab-test-project');
|
|
298
298
|
fs.mkdirSync(projectDir);
|
|
299
299
|
fs.mkdirSync(path.join(projectDir, 'plans'));
|
|
300
300
|
fs.writeFileSync(
|
|
301
|
-
path.join(projectDir, 'plans', '
|
|
301
|
+
path.join(projectDir, 'plans', '01-task-one.md'),
|
|
302
302
|
'# Task: Task One\n'
|
|
303
303
|
);
|
|
304
304
|
|
|
@@ -316,8 +316,8 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
316
316
|
const params: AmendPromptParams = {
|
|
317
317
|
projectPath: '/test/project',
|
|
318
318
|
existingTasks: [
|
|
319
|
-
{ id: '
|
|
320
|
-
{ id: '
|
|
319
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
320
|
+
{ id: '02', planFile: 'plans/02-second.md', status: 'pending', taskName: 'second' },
|
|
321
321
|
],
|
|
322
322
|
nextTaskNumber: 3,
|
|
323
323
|
newTaskDescription: 'Add new feature X',
|
|
@@ -335,8 +335,8 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
335
335
|
const params: AmendPromptParams = {
|
|
336
336
|
projectPath: '/test/project',
|
|
337
337
|
existingTasks: [
|
|
338
|
-
{ id: '
|
|
339
|
-
{ id: '
|
|
338
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
339
|
+
{ id: '02', planFile: 'plans/02-second.md', status: 'pending', taskName: 'second' },
|
|
340
340
|
],
|
|
341
341
|
nextTaskNumber: 3,
|
|
342
342
|
newTaskDescription: 'Add new feature X',
|
|
@@ -345,9 +345,9 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
345
345
|
const { systemPrompt } = getAmendPrompt(params);
|
|
346
346
|
|
|
347
347
|
expect(systemPrompt).toContain('AMENDMENT MODE');
|
|
348
|
-
expect(systemPrompt).toContain('Task
|
|
349
|
-
expect(systemPrompt).toContain('Task
|
|
350
|
-
expect(systemPrompt).toContain('starting from number
|
|
348
|
+
expect(systemPrompt).toContain('Task 01: first [COMPLETED] [PROTECTED]');
|
|
349
|
+
expect(systemPrompt).toContain('Task 02: second [PENDING] [MODIFIABLE]');
|
|
350
|
+
expect(systemPrompt).toContain('starting from number 03');
|
|
351
351
|
expect(systemPrompt).toContain('/test/project');
|
|
352
352
|
});
|
|
353
353
|
|
|
@@ -369,7 +369,7 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
369
369
|
const params: AmendPromptParams = {
|
|
370
370
|
projectPath: '/test/project',
|
|
371
371
|
existingTasks: [
|
|
372
|
-
{ id: '
|
|
372
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
373
373
|
],
|
|
374
374
|
nextTaskNumber: 2,
|
|
375
375
|
newTaskDescription: 'New tasks',
|
|
@@ -388,7 +388,7 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
388
388
|
const params: AmendPromptParams = {
|
|
389
389
|
projectPath: '/test/project',
|
|
390
390
|
existingTasks: [
|
|
391
|
-
{ id: '
|
|
391
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'failed', taskName: 'first' },
|
|
392
392
|
],
|
|
393
393
|
nextTaskNumber: 2,
|
|
394
394
|
newTaskDescription: 'New tasks',
|
|
@@ -396,16 +396,16 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
396
396
|
|
|
397
397
|
const { systemPrompt } = getAmendPrompt(params);
|
|
398
398
|
|
|
399
|
-
expect(systemPrompt).toContain('Task
|
|
399
|
+
expect(systemPrompt).toContain('Task 01: first [FAILED] [MODIFIABLE]');
|
|
400
400
|
});
|
|
401
401
|
|
|
402
402
|
it('should list protected tasks separately', () => {
|
|
403
403
|
const params: AmendPromptParams = {
|
|
404
404
|
projectPath: '/test/project',
|
|
405
405
|
existingTasks: [
|
|
406
|
-
{ id: '
|
|
407
|
-
{ id: '
|
|
408
|
-
{ id: '
|
|
406
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
407
|
+
{ id: '02', planFile: 'plans/02-second.md', status: 'completed', taskName: 'second' },
|
|
408
|
+
{ id: '03', planFile: 'plans/03-third.md', status: 'pending', taskName: 'third' },
|
|
409
409
|
],
|
|
410
410
|
nextTaskNumber: 4,
|
|
411
411
|
newTaskDescription: 'New tasks',
|
|
@@ -414,17 +414,17 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
414
414
|
const { systemPrompt } = getAmendPrompt(params);
|
|
415
415
|
|
|
416
416
|
expect(systemPrompt).toContain('### Protected Tasks (COMPLETED - cannot be modified)');
|
|
417
|
-
expect(systemPrompt).toContain('- Task
|
|
418
|
-
expect(systemPrompt).toContain('- Task
|
|
417
|
+
expect(systemPrompt).toContain('- Task 01: first');
|
|
418
|
+
expect(systemPrompt).toContain('- Task 02: second');
|
|
419
419
|
});
|
|
420
420
|
|
|
421
421
|
it('should list modifiable tasks separately', () => {
|
|
422
422
|
const params: AmendPromptParams = {
|
|
423
423
|
projectPath: '/test/project',
|
|
424
424
|
existingTasks: [
|
|
425
|
-
{ id: '
|
|
426
|
-
{ id: '
|
|
427
|
-
{ id: '
|
|
425
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
426
|
+
{ id: '02', planFile: 'plans/02-second.md', status: 'pending', taskName: 'second' },
|
|
427
|
+
{ id: '03', planFile: 'plans/03-third.md', status: 'failed', taskName: 'third' },
|
|
428
428
|
],
|
|
429
429
|
nextTaskNumber: 4,
|
|
430
430
|
newTaskDescription: 'New tasks',
|
|
@@ -433,15 +433,15 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
433
433
|
const { systemPrompt } = getAmendPrompt(params);
|
|
434
434
|
|
|
435
435
|
expect(systemPrompt).toContain('### Modifiable Tasks (PENDING/FAILED - can be modified if requested)');
|
|
436
|
-
expect(systemPrompt).toContain('- Task
|
|
437
|
-
expect(systemPrompt).toContain('- Task
|
|
436
|
+
expect(systemPrompt).toContain('- Task 02: second');
|
|
437
|
+
expect(systemPrompt).toContain('- Task 03: third');
|
|
438
438
|
});
|
|
439
439
|
|
|
440
440
|
it('should show (none) when there are no protected tasks', () => {
|
|
441
441
|
const params: AmendPromptParams = {
|
|
442
442
|
projectPath: '/test/project',
|
|
443
443
|
existingTasks: [
|
|
444
|
-
{ id: '
|
|
444
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'pending', taskName: 'first' },
|
|
445
445
|
],
|
|
446
446
|
nextTaskNumber: 2,
|
|
447
447
|
newTaskDescription: 'New tasks',
|
|
@@ -456,7 +456,7 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
456
456
|
const params: AmendPromptParams = {
|
|
457
457
|
projectPath: '/test/project',
|
|
458
458
|
existingTasks: [
|
|
459
|
-
{ id: '
|
|
459
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
460
460
|
],
|
|
461
461
|
nextTaskNumber: 2,
|
|
462
462
|
newTaskDescription: 'New tasks',
|
|
@@ -471,10 +471,10 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
471
471
|
const params: AmendPromptParams = {
|
|
472
472
|
projectPath: '/test/project',
|
|
473
473
|
existingTasks: [
|
|
474
|
-
{ id: '
|
|
475
|
-
{ id: '
|
|
476
|
-
{ id: '
|
|
477
|
-
{ id: '
|
|
474
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'setup' },
|
|
475
|
+
{ id: '02', planFile: 'plans/02-second.md', status: 'completed', taskName: 'database' },
|
|
476
|
+
{ id: '03', planFile: 'plans/03-third.md', status: 'failed', taskName: 'api' },
|
|
477
|
+
{ id: '04', planFile: 'plans/04-fourth.md', status: 'pending', taskName: 'tests' },
|
|
478
478
|
],
|
|
479
479
|
nextTaskNumber: 5,
|
|
480
480
|
newTaskDescription: 'New tasks',
|
|
@@ -483,10 +483,10 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
483
483
|
const { systemPrompt } = getAmendPrompt(params);
|
|
484
484
|
|
|
485
485
|
// Check summary list
|
|
486
|
-
expect(systemPrompt).toContain('Task
|
|
487
|
-
expect(systemPrompt).toContain('Task
|
|
488
|
-
expect(systemPrompt).toContain('Task
|
|
489
|
-
expect(systemPrompt).toContain('Task
|
|
486
|
+
expect(systemPrompt).toContain('Task 01: setup [COMPLETED] [PROTECTED]');
|
|
487
|
+
expect(systemPrompt).toContain('Task 02: database [COMPLETED] [PROTECTED]');
|
|
488
|
+
expect(systemPrompt).toContain('Task 03: api [FAILED] [MODIFIABLE]');
|
|
489
|
+
expect(systemPrompt).toContain('Task 04: tests [PENDING] [MODIFIABLE]');
|
|
490
490
|
|
|
491
491
|
// Check separate lists
|
|
492
492
|
expect(systemPrompt).toContain('### Protected Tasks (COMPLETED - cannot be modified)');
|
|
@@ -497,7 +497,7 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
497
497
|
const params: AmendPromptParams = {
|
|
498
498
|
projectPath: '/my/project/path',
|
|
499
499
|
existingTasks: [
|
|
500
|
-
{ id: '
|
|
500
|
+
{ id: '01', planFile: 'plans/01-task.md', status: 'pending', taskName: 'task' },
|
|
501
501
|
],
|
|
502
502
|
nextTaskNumber: 2,
|
|
503
503
|
newTaskDescription: 'New tasks',
|
|
@@ -505,8 +505,8 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
505
505
|
|
|
506
506
|
const { systemPrompt } = getAmendPrompt(params);
|
|
507
507
|
|
|
508
|
-
expect(systemPrompt).toContain('/my/project/path/plans/
|
|
509
|
-
expect(systemPrompt).toContain('/my/project/path/plans/
|
|
508
|
+
expect(systemPrompt).toContain('/my/project/path/plans/02-task-name.md');
|
|
509
|
+
expect(systemPrompt).toContain('/my/project/path/plans/03-task-name.md');
|
|
510
510
|
});
|
|
511
511
|
|
|
512
512
|
it('should include new task description in user message', () => {
|
|
@@ -550,29 +550,80 @@ describe('Plan Command - Amend Functionality', () => {
|
|
|
550
550
|
expect(userMessage).toContain('Add a caching layer for API responses');
|
|
551
551
|
expect(userMessage).toContain('planning interview');
|
|
552
552
|
});
|
|
553
|
+
|
|
554
|
+
it('should include outcome file paths for completed tasks in task summary', () => {
|
|
555
|
+
const params: AmendPromptParams = {
|
|
556
|
+
projectPath: '/test/project',
|
|
557
|
+
existingTasks: [
|
|
558
|
+
{ id: '01', planFile: 'plans/01-setup.md', status: 'completed', taskName: 'setup' },
|
|
559
|
+
{ id: '02', planFile: 'plans/02-database.md', status: 'completed', taskName: 'database' },
|
|
560
|
+
],
|
|
561
|
+
nextTaskNumber: 3,
|
|
562
|
+
newTaskDescription: 'Fix setup issues',
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
const { systemPrompt } = getAmendPrompt(params);
|
|
566
|
+
|
|
567
|
+
expect(systemPrompt).toContain('Outcome: /test/project/outcomes/01-setup.md');
|
|
568
|
+
expect(systemPrompt).toContain('Outcome: /test/project/outcomes/02-database.md');
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
it('should not include outcome file paths for non-completed tasks', () => {
|
|
572
|
+
const params: AmendPromptParams = {
|
|
573
|
+
projectPath: '/test/project',
|
|
574
|
+
existingTasks: [
|
|
575
|
+
{ id: '01', planFile: 'plans/01-pending-task.md', status: 'pending', taskName: 'pending-task' },
|
|
576
|
+
{ id: '02', planFile: 'plans/02-failed-task.md', status: 'failed', taskName: 'failed-task' },
|
|
577
|
+
],
|
|
578
|
+
nextTaskNumber: 3,
|
|
579
|
+
newTaskDescription: 'New tasks',
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
const { systemPrompt } = getAmendPrompt(params);
|
|
583
|
+
|
|
584
|
+
expect(systemPrompt).not.toContain('Outcome: /test/project/outcomes/01-pending-task.md');
|
|
585
|
+
expect(systemPrompt).not.toContain('Outcome: /test/project/outcomes/02-failed-task.md');
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
it('should include follow-up task instructions in system prompt', () => {
|
|
589
|
+
const params: AmendPromptParams = {
|
|
590
|
+
projectPath: '/test/project',
|
|
591
|
+
existingTasks: [
|
|
592
|
+
{ id: '01', planFile: 'plans/01-first.md', status: 'completed', taskName: 'first' },
|
|
593
|
+
],
|
|
594
|
+
nextTaskNumber: 2,
|
|
595
|
+
newTaskDescription: 'Fix issues from first task',
|
|
596
|
+
};
|
|
597
|
+
|
|
598
|
+
const { systemPrompt } = getAmendPrompt(params);
|
|
599
|
+
|
|
600
|
+
expect(systemPrompt).toContain('Identifying Follow-up Tasks');
|
|
601
|
+
expect(systemPrompt).toContain('follow-up to task NN');
|
|
602
|
+
expect(systemPrompt).toContain('outcome file paths for completed tasks are listed above');
|
|
603
|
+
});
|
|
553
604
|
});
|
|
554
605
|
|
|
555
606
|
describe('Existing Project Detection Without Amend Flag', () => {
|
|
556
607
|
it('should find existing project by name', () => {
|
|
557
|
-
fs.mkdirSync(path.join(tempDir, '
|
|
608
|
+
fs.mkdirSync(path.join(tempDir, 'aaaaab-existing-project'));
|
|
558
609
|
const result = resolveProjectIdentifier(tempDir, 'existing-project');
|
|
559
610
|
expect(result).not.toBeNull();
|
|
560
611
|
});
|
|
561
612
|
|
|
562
|
-
it('should find existing project by
|
|
563
|
-
fs.mkdirSync(path.join(tempDir, '
|
|
564
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
613
|
+
it('should find existing project by 6-char base26 ID', () => {
|
|
614
|
+
fs.mkdirSync(path.join(tempDir, 'aaaaab-existing-project'));
|
|
615
|
+
const result = resolveProjectIdentifier(tempDir, 'aaaaab');
|
|
565
616
|
expect(result).not.toBeNull();
|
|
566
617
|
});
|
|
567
618
|
|
|
568
619
|
it('should find existing project by full folder name', () => {
|
|
569
|
-
fs.mkdirSync(path.join(tempDir, '
|
|
570
|
-
const result = resolveProjectIdentifier(tempDir, '
|
|
620
|
+
fs.mkdirSync(path.join(tempDir, 'aaaaab-existing-project'));
|
|
621
|
+
const result = resolveProjectIdentifier(tempDir, 'aaaaab-existing-project');
|
|
571
622
|
expect(result).not.toBeNull();
|
|
572
623
|
});
|
|
573
624
|
|
|
574
625
|
it('should return null for non-existing project', () => {
|
|
575
|
-
fs.mkdirSync(path.join(tempDir, '
|
|
626
|
+
fs.mkdirSync(path.join(tempDir, 'aaaaab-existing-project'));
|
|
576
627
|
const result = resolveProjectIdentifier(tempDir, 'new-project');
|
|
577
628
|
expect(result).toBeNull();
|
|
578
629
|
});
|
|
@@ -76,8 +76,8 @@ describe('Planning Prompt', () => {
|
|
|
76
76
|
|
|
77
77
|
const { systemPrompt } = getPlanningPrompt(params);
|
|
78
78
|
|
|
79
|
-
expect(systemPrompt).toContain('/test/project/plans/
|
|
80
|
-
expect(systemPrompt).toContain('/test/project/plans/
|
|
79
|
+
expect(systemPrompt).toContain('/test/project/plans/01-task-name.md');
|
|
80
|
+
expect(systemPrompt).toContain('/test/project/plans/02-task-name.md');
|
|
81
81
|
});
|
|
82
82
|
|
|
83
83
|
it('should include task guidelines in system prompt', () => {
|
|
@@ -88,7 +88,7 @@ describe('Planning Prompt', () => {
|
|
|
88
88
|
|
|
89
89
|
const { systemPrompt } = getPlanningPrompt(params);
|
|
90
90
|
|
|
91
|
-
expect(systemPrompt).toContain('
|
|
91
|
+
expect(systemPrompt).toContain('identify distinct');
|
|
92
92
|
expect(systemPrompt).toContain('independently completable');
|
|
93
93
|
expect(systemPrompt).toContain('10-30 minutes');
|
|
94
94
|
});
|
|
@@ -117,10 +117,47 @@ describe('Planning Prompt', () => {
|
|
|
117
117
|
const { systemPrompt } = getPlanningPrompt(params);
|
|
118
118
|
|
|
119
119
|
expect(systemPrompt).toContain('ALWAYS interview the user before creating plans');
|
|
120
|
-
expect(systemPrompt).toContain('numbered order (
|
|
120
|
+
expect(systemPrompt).toContain('numbered order (01, 02, 03');
|
|
121
121
|
expect(systemPrompt).toContain('kebab-case names');
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
+
it('should show raf do without --worktree when worktreeMode is false', () => {
|
|
125
|
+
const params: PlanningPromptParams = {
|
|
126
|
+
projectPath: '/test/project',
|
|
127
|
+
inputContent: 'Some project',
|
|
128
|
+
worktreeMode: false,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const { systemPrompt } = getPlanningPrompt(params);
|
|
132
|
+
|
|
133
|
+
expect(systemPrompt).toContain('raf do <project>');
|
|
134
|
+
expect(systemPrompt).not.toContain('--worktree');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should show raf do without --worktree when worktreeMode is undefined', () => {
|
|
138
|
+
const params: PlanningPromptParams = {
|
|
139
|
+
projectPath: '/test/project',
|
|
140
|
+
inputContent: 'Some project',
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const { systemPrompt } = getPlanningPrompt(params);
|
|
144
|
+
|
|
145
|
+
expect(systemPrompt).toContain('raf do <project>');
|
|
146
|
+
expect(systemPrompt).not.toContain('--worktree');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should show raf do with --worktree when worktreeMode is true', () => {
|
|
150
|
+
const params: PlanningPromptParams = {
|
|
151
|
+
projectPath: '/test/project',
|
|
152
|
+
inputContent: 'Some project',
|
|
153
|
+
worktreeMode: true,
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const { systemPrompt } = getPlanningPrompt(params);
|
|
157
|
+
|
|
158
|
+
expect(systemPrompt).toContain('raf do <project> --worktree');
|
|
159
|
+
});
|
|
160
|
+
|
|
124
161
|
it('should include project description in user message', () => {
|
|
125
162
|
const params: PlanningPromptParams = {
|
|
126
163
|
projectPath: '/test/project',
|