gsd-remix 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +939 -0
- package/README.zh-CN.md +876 -0
- package/agents/gsd-advisor-researcher.md +127 -0
- package/agents/gsd-ai-researcher.md +133 -0
- package/agents/gsd-assumptions-analyzer.md +105 -0
- package/agents/gsd-code-fixer.md +517 -0
- package/agents/gsd-code-reviewer.md +371 -0
- package/agents/gsd-codebase-mapper.md +781 -0
- package/agents/gsd-debug-session-manager.md +314 -0
- package/agents/gsd-debugger.md +1452 -0
- package/agents/gsd-doc-classifier.md +168 -0
- package/agents/gsd-doc-synthesizer.md +204 -0
- package/agents/gsd-doc-verifier.md +217 -0
- package/agents/gsd-doc-writer.md +615 -0
- package/agents/gsd-domain-researcher.md +153 -0
- package/agents/gsd-eval-auditor.md +191 -0
- package/agents/gsd-eval-planner.md +154 -0
- package/agents/gsd-executor.md +603 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +334 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +841 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1251 -0
- package/agents/gsd-project-researcher.md +677 -0
- package/agents/gsd-research-synthesizer.md +247 -0
- package/agents/gsd-roadmapper.md +688 -0
- package/agents/gsd-security-auditor.md +155 -0
- package/agents/gsd-ui-auditor.md +495 -0
- package/agents/gsd-ui-checker.md +309 -0
- package/agents/gsd-ui-researcher.md +380 -0
- package/agents/gsd-user-profiler.md +171 -0
- package/agents/gsd-verifier.md +830 -0
- package/bin/install.js +7062 -0
- package/commands/gsd/add-backlog.md +79 -0
- package/commands/gsd/add-phase.md +43 -0
- package/commands/gsd/add-tests.md +41 -0
- package/commands/gsd/add-todo.md +47 -0
- package/commands/gsd/ai-integration-phase.md +36 -0
- package/commands/gsd/analyze-dependencies.md +34 -0
- package/commands/gsd/audit-fix.md +33 -0
- package/commands/gsd/audit-milestone.md +36 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +46 -0
- package/commands/gsd/check-todos.md +45 -0
- package/commands/gsd/cleanup.md +23 -0
- package/commands/gsd/code-review-fix.md +52 -0
- package/commands/gsd/code-review.md +55 -0
- package/commands/gsd/complete-milestone.md +136 -0
- package/commands/gsd/debug.md +263 -0
- package/commands/gsd/discuss-phase.md +69 -0
- package/commands/gsd/do.md +30 -0
- package/commands/gsd/docs-update.md +48 -0
- package/commands/gsd/eval-review.md +32 -0
- package/commands/gsd/execute-phase.md +63 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract_learnings.md +22 -0
- package/commands/gsd/fast.md +30 -0
- package/commands/gsd/forensics.md +56 -0
- package/commands/gsd/from-gsd2.md +47 -0
- package/commands/gsd/graphify.md +201 -0
- package/commands/gsd/health.md +22 -0
- package/commands/gsd/help.md +24 -0
- package/commands/gsd/import.md +37 -0
- package/commands/gsd/inbox.md +38 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/insert-phase.md +32 -0
- package/commands/gsd/intel.md +179 -0
- package/commands/gsd/join-discord.md +19 -0
- package/commands/gsd/list-phase-assumptions.md +46 -0
- package/commands/gsd/list-workspaces.md +19 -0
- package/commands/gsd/manager.md +40 -0
- package/commands/gsd/map-codebase.md +71 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/new-milestone.md +44 -0
- package/commands/gsd/new-project.md +46 -0
- package/commands/gsd/new-workspace.md +44 -0
- package/commands/gsd/next.md +28 -0
- package/commands/gsd/note.md +34 -0
- package/commands/gsd/pause-work.md +38 -0
- package/commands/gsd/plan-milestone-gaps.md +34 -0
- package/commands/gsd/plan-phase.md +52 -0
- package/commands/gsd/plan-review-convergence.md +52 -0
- package/commands/gsd/plant-seed.md +28 -0
- package/commands/gsd/pr-branch.md +25 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +25 -0
- package/commands/gsd/quick.md +173 -0
- package/commands/gsd/reapply-patches.md +331 -0
- package/commands/gsd/remove-phase.md +31 -0
- package/commands/gsd/remove-workspace.md +26 -0
- package/commands/gsd/research-phase.md +195 -0
- package/commands/gsd/resume-work.md +40 -0
- package/commands/gsd/review-backlog.md +62 -0
- package/commands/gsd/review.md +40 -0
- package/commands/gsd/scan.md +26 -0
- package/commands/gsd/secure-phase.md +35 -0
- package/commands/gsd/session-report.md +19 -0
- package/commands/gsd/set-profile.md +12 -0
- package/commands/gsd/settings.md +36 -0
- package/commands/gsd/ship.md +23 -0
- package/commands/gsd/sketch-wrap-up.md +31 -0
- package/commands/gsd/sketch.md +49 -0
- package/commands/gsd/spec-phase.md +62 -0
- package/commands/gsd/spike-wrap-up.md +31 -0
- package/commands/gsd/spike.md +46 -0
- package/commands/gsd/stats.md +18 -0
- package/commands/gsd/sync-skills.md +19 -0
- package/commands/gsd/thread.md +227 -0
- package/commands/gsd/ui-phase.md +34 -0
- package/commands/gsd/ui-review.md +32 -0
- package/commands/gsd/ultraplan-phase.md +33 -0
- package/commands/gsd/undo.md +34 -0
- package/commands/gsd/update.md +37 -0
- package/commands/gsd/validate-phase.md +35 -0
- package/commands/gsd/verify-work.md +38 -0
- package/commands/gsd/workstreams.md +69 -0
- package/get-shit-done/bin/gsd-tools.cjs +1263 -0
- package/get-shit-done/bin/lib/artifacts.cjs +52 -0
- package/get-shit-done/bin/lib/audit.cjs +757 -0
- package/get-shit-done/bin/lib/commands.cjs +1023 -0
- package/get-shit-done/bin/lib/config-schema.cjs +79 -0
- package/get-shit-done/bin/lib/config.cjs +463 -0
- package/get-shit-done/bin/lib/core.cjs +1794 -0
- package/get-shit-done/bin/lib/docs.cjs +267 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +379 -0
- package/get-shit-done/bin/lib/graphify.cjs +494 -0
- package/get-shit-done/bin/lib/gsd2-import.cjs +511 -0
- package/get-shit-done/bin/lib/init.cjs +1878 -0
- package/get-shit-done/bin/lib/intel.cjs +639 -0
- package/get-shit-done/bin/lib/learnings.cjs +378 -0
- package/get-shit-done/bin/lib/milestone.cjs +283 -0
- package/get-shit-done/bin/lib/model-profiles.cjs +71 -0
- package/get-shit-done/bin/lib/phase.cjs +1058 -0
- package/get-shit-done/bin/lib/profile-output.cjs +1080 -0
- package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
- package/get-shit-done/bin/lib/roadmap.cjs +523 -0
- package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
- package/get-shit-done/bin/lib/security.cjs +504 -0
- package/get-shit-done/bin/lib/state.cjs +1649 -0
- package/get-shit-done/bin/lib/template.cjs +226 -0
- package/get-shit-done/bin/lib/uat.cjs +288 -0
- package/get-shit-done/bin/lib/verify.cjs +1184 -0
- package/get-shit-done/bin/lib/workstream.cjs +495 -0
- package/get-shit-done/bin/repair-sdk.cjs +177 -0
- package/get-shit-done/contexts/dev.md +21 -0
- package/get-shit-done/contexts/research.md +22 -0
- package/get-shit-done/contexts/review.md +22 -0
- package/get-shit-done/references/agent-contracts.md +79 -0
- package/get-shit-done/references/ai-evals.md +156 -0
- package/get-shit-done/references/ai-frameworks.md +186 -0
- package/get-shit-done/references/artifact-types.md +131 -0
- package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
- package/get-shit-done/references/checkpoints.md +808 -0
- package/get-shit-done/references/common-bug-patterns.md +114 -0
- package/get-shit-done/references/context-budget.md +49 -0
- package/get-shit-done/references/continuation-format.md +253 -0
- package/get-shit-done/references/debugger-philosophy.md +76 -0
- package/get-shit-done/references/decimal-phase-calculation.md +64 -0
- package/get-shit-done/references/doc-conflict-engine.md +91 -0
- package/get-shit-done/references/domain-probes.md +125 -0
- package/get-shit-done/references/executor-examples.md +110 -0
- package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
- package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
- package/get-shit-done/references/gate-prompts.md +100 -0
- package/get-shit-done/references/gates.md +70 -0
- package/get-shit-done/references/git-integration.md +295 -0
- package/get-shit-done/references/git-planning-commit.md +40 -0
- package/get-shit-done/references/ios-scaffold.md +123 -0
- package/get-shit-done/references/mandatory-initial-read.md +2 -0
- package/get-shit-done/references/model-profile-resolution.md +38 -0
- package/get-shit-done/references/model-profiles.md +145 -0
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planner-antipatterns.md +89 -0
- package/get-shit-done/references/planner-gap-closure.md +62 -0
- package/get-shit-done/references/planner-reviews.md +39 -0
- package/get-shit-done/references/planner-revision.md +87 -0
- package/get-shit-done/references/planner-source-audit.md +73 -0
- package/get-shit-done/references/planning-config.md +460 -0
- package/get-shit-done/references/project-skills-discovery.md +19 -0
- package/get-shit-done/references/questioning.md +162 -0
- package/get-shit-done/references/revision-loop.md +97 -0
- package/get-shit-done/references/sketch-interactivity.md +41 -0
- package/get-shit-done/references/sketch-theme-system.md +94 -0
- package/get-shit-done/references/sketch-tooling.md +45 -0
- package/get-shit-done/references/sketch-variant-patterns.md +81 -0
- package/get-shit-done/references/tdd.md +330 -0
- package/get-shit-done/references/thinking-models-debug.md +44 -0
- package/get-shit-done/references/thinking-models-execution.md +50 -0
- package/get-shit-done/references/thinking-models-planning.md +62 -0
- package/get-shit-done/references/thinking-models-research.md +50 -0
- package/get-shit-done/references/thinking-models-verification.md +55 -0
- package/get-shit-done/references/thinking-partner.md +96 -0
- package/get-shit-done/references/ui-brand.md +160 -0
- package/get-shit-done/references/universal-anti-patterns.md +63 -0
- package/get-shit-done/references/user-profiling.md +681 -0
- package/get-shit-done/references/verification-overrides.md +227 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/references/workstream-flag.md +111 -0
- package/get-shit-done/templates/AI-SPEC.md +246 -0
- package/get-shit-done/templates/DEBUG.md +169 -0
- package/get-shit-done/templates/README.md +76 -0
- package/get-shit-done/templates/SECURITY.md +61 -0
- package/get-shit-done/templates/UAT.md +265 -0
- package/get-shit-done/templates/UI-SPEC.md +100 -0
- package/get-shit-done/templates/VALIDATION.md +76 -0
- package/get-shit-done/templates/claude-md.md +145 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +56 -0
- package/get-shit-done/templates/context.md +352 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/copilot-instructions.md +7 -0
- package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/get-shit-done/templates/dev-preferences.md +21 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/discussion-log.md +63 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +610 -0
- package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/get-shit-done/templates/project.md +186 -0
- package/get-shit-done/templates/requirements.md +231 -0
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/get-shit-done/templates/research-project/STACK.md +120 -0
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/get-shit-done/templates/research.md +592 -0
- package/get-shit-done/templates/retrospective.md +54 -0
- package/get-shit-done/templates/roadmap.md +202 -0
- package/get-shit-done/templates/spec.md +307 -0
- package/get-shit-done/templates/state.md +184 -0
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +248 -0
- package/get-shit-done/templates/user-profile.md +146 -0
- package/get-shit-done/templates/user-setup.md +311 -0
- package/get-shit-done/templates/verification-report.md +322 -0
- package/get-shit-done/workflows/add-phase.md +112 -0
- package/get-shit-done/workflows/add-tests.md +354 -0
- package/get-shit-done/workflows/add-todo.md +160 -0
- package/get-shit-done/workflows/ai-integration-phase.md +284 -0
- package/get-shit-done/workflows/analyze-dependencies.md +96 -0
- package/get-shit-done/workflows/audit-fix.md +175 -0
- package/get-shit-done/workflows/audit-milestone.md +340 -0
- package/get-shit-done/workflows/audit-uat.md +109 -0
- package/get-shit-done/workflows/autonomous.md +789 -0
- package/get-shit-done/workflows/check-todos.md +179 -0
- package/get-shit-done/workflows/cleanup.md +154 -0
- package/get-shit-done/workflows/code-review-fix.md +497 -0
- package/get-shit-done/workflows/code-review.md +515 -0
- package/get-shit-done/workflows/complete-milestone.md +847 -0
- package/get-shit-done/workflows/diagnose-issues.md +238 -0
- package/get-shit-done/workflows/discovery-phase.md +291 -0
- package/get-shit-done/workflows/discuss-phase-assumptions.md +670 -0
- package/get-shit-done/workflows/discuss-phase-power.md +308 -0
- package/get-shit-done/workflows/discuss-phase.md +1378 -0
- package/get-shit-done/workflows/do.md +110 -0
- package/get-shit-done/workflows/docs-update.md +1155 -0
- package/get-shit-done/workflows/eval-review.md +155 -0
- package/get-shit-done/workflows/execute-phase.md +1677 -0
- package/get-shit-done/workflows/execute-plan.md +533 -0
- package/get-shit-done/workflows/explore.md +141 -0
- package/get-shit-done/workflows/extract_learnings.md +242 -0
- package/get-shit-done/workflows/fast.md +105 -0
- package/get-shit-done/workflows/forensics.md +265 -0
- package/get-shit-done/workflows/graduation.md +195 -0
- package/get-shit-done/workflows/health.md +314 -0
- package/get-shit-done/workflows/help.md +667 -0
- package/get-shit-done/workflows/import.md +246 -0
- package/get-shit-done/workflows/inbox.md +387 -0
- package/get-shit-done/workflows/ingest-docs.md +328 -0
- package/get-shit-done/workflows/insert-phase.md +130 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/list-workspaces.md +56 -0
- package/get-shit-done/workflows/manager.md +365 -0
- package/get-shit-done/workflows/map-codebase.md +393 -0
- package/get-shit-done/workflows/milestone-summary.md +223 -0
- package/get-shit-done/workflows/new-milestone.md +611 -0
- package/get-shit-done/workflows/new-project.md +1391 -0
- package/get-shit-done/workflows/new-workspace.md +239 -0
- package/get-shit-done/workflows/next.md +220 -0
- package/get-shit-done/workflows/node-repair.md +92 -0
- package/get-shit-done/workflows/note.md +158 -0
- package/get-shit-done/workflows/pause-work.md +243 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +273 -0
- package/get-shit-done/workflows/plan-phase.md +1349 -0
- package/get-shit-done/workflows/plan-review-convergence.md +254 -0
- package/get-shit-done/workflows/plant-seed.md +172 -0
- package/get-shit-done/workflows/pr-branch.md +157 -0
- package/get-shit-done/workflows/profile-user.md +452 -0
- package/get-shit-done/workflows/progress.md +619 -0
- package/get-shit-done/workflows/quick.md +970 -0
- package/get-shit-done/workflows/remove-phase.md +155 -0
- package/get-shit-done/workflows/remove-workspace.md +92 -0
- package/get-shit-done/workflows/research-phase.md +89 -0
- package/get-shit-done/workflows/resume-project.md +326 -0
- package/get-shit-done/workflows/review.md +344 -0
- package/get-shit-done/workflows/scan.md +102 -0
- package/get-shit-done/workflows/secure-phase.md +166 -0
- package/get-shit-done/workflows/session-report.md +146 -0
- package/get-shit-done/workflows/settings.md +319 -0
- package/get-shit-done/workflows/ship.md +302 -0
- package/get-shit-done/workflows/sketch-wrap-up.md +283 -0
- package/get-shit-done/workflows/sketch.md +286 -0
- package/get-shit-done/workflows/spec-phase.md +262 -0
- package/get-shit-done/workflows/spike-wrap-up.md +281 -0
- package/get-shit-done/workflows/spike.md +362 -0
- package/get-shit-done/workflows/stats.md +60 -0
- package/get-shit-done/workflows/sync-skills.md +182 -0
- package/get-shit-done/workflows/transition.md +693 -0
- package/get-shit-done/workflows/ui-phase.md +323 -0
- package/get-shit-done/workflows/ui-review.md +190 -0
- package/get-shit-done/workflows/ultraplan-phase.md +189 -0
- package/get-shit-done/workflows/undo.md +314 -0
- package/get-shit-done/workflows/update.md +587 -0
- package/get-shit-done/workflows/validate-phase.md +176 -0
- package/get-shit-done/workflows/verify-phase.md +465 -0
- package/get-shit-done/workflows/verify-work.md +740 -0
- package/hooks/dist/gsd-check-update-worker.js +108 -0
- package/hooks/dist/gsd-check-update.js +64 -0
- package/hooks/dist/gsd-context-monitor.js +192 -0
- package/hooks/dist/gsd-phase-boundary.sh +28 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +82 -0
- package/hooks/dist/gsd-read-injection-scanner.js +152 -0
- package/hooks/dist/gsd-session-state.sh +34 -0
- package/hooks/dist/gsd-statusline.js +293 -0
- package/hooks/dist/gsd-validate-commit.sh +48 -0
- package/hooks/dist/gsd-workflow-guard.js +94 -0
- package/hooks/gsd-check-update-worker.js +108 -0
- package/hooks/gsd-check-update.js +64 -0
- package/hooks/gsd-context-monitor.js +192 -0
- package/hooks/gsd-phase-boundary.sh +28 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +82 -0
- package/hooks/gsd-read-injection-scanner.js +152 -0
- package/hooks/gsd-session-state.sh +34 -0
- package/hooks/gsd-statusline.js +293 -0
- package/hooks/gsd-validate-commit.sh +48 -0
- package/hooks/gsd-workflow-guard.js +94 -0
- package/package.json +59 -0
- package/scripts/base64-scan.sh +262 -0
- package/scripts/build-hooks.js +95 -0
- package/scripts/gen-inventory-manifest.cjs +109 -0
- package/scripts/prompt-injection-scan.sh +201 -0
- package/scripts/run-tests.cjs +33 -0
- package/scripts/secret-scan.sh +227 -0
- package/sdk/package-lock.json +1998 -0
- package/sdk/package.json +52 -0
- package/sdk/prompts/agents/gsd-executor.md +110 -0
- package/sdk/prompts/agents/gsd-phase-researcher.md +158 -0
- package/sdk/prompts/agents/gsd-plan-checker.md +160 -0
- package/sdk/prompts/agents/gsd-planner.md +214 -0
- package/sdk/prompts/agents/gsd-project-researcher.md +323 -0
- package/sdk/prompts/agents/gsd-research-synthesizer.md +237 -0
- package/sdk/prompts/agents/gsd-roadmapper.md +670 -0
- package/sdk/prompts/agents/gsd-verifier.md +159 -0
- package/sdk/prompts/templates/project.md +186 -0
- package/sdk/prompts/templates/requirements.md +231 -0
- package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
- package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
- package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
- package/sdk/prompts/templates/research-project/STACK.md +120 -0
- package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
- package/sdk/prompts/templates/roadmap.md +202 -0
- package/sdk/prompts/templates/state.md +175 -0
- package/sdk/prompts/workflows/discuss-phase.md +126 -0
- package/sdk/prompts/workflows/execute-plan.md +106 -0
- package/sdk/prompts/workflows/plan-phase.md +84 -0
- package/sdk/prompts/workflows/research-phase.md +45 -0
- package/sdk/prompts/workflows/verify-phase.md +142 -0
- package/sdk/src/assembled-prompts.test.ts +349 -0
- package/sdk/src/cli-transport.test.ts +388 -0
- package/sdk/src/cli-transport.ts +130 -0
- package/sdk/src/cli.test.ts +383 -0
- package/sdk/src/cli.ts +670 -0
- package/sdk/src/config.test.ts +168 -0
- package/sdk/src/config.ts +177 -0
- package/sdk/src/context-engine.test.ts +295 -0
- package/sdk/src/context-engine.ts +170 -0
- package/sdk/src/context-truncation.test.ts +163 -0
- package/sdk/src/context-truncation.ts +233 -0
- package/sdk/src/e2e.integration.test.ts +178 -0
- package/sdk/src/errors.ts +72 -0
- package/sdk/src/event-stream.test.ts +661 -0
- package/sdk/src/event-stream.ts +441 -0
- package/sdk/src/failure-memory.test.ts +457 -0
- package/sdk/src/failure-memory.ts +1324 -0
- package/sdk/src/golden/capture.ts +95 -0
- package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
- package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
- package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
- package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
- package/sdk/src/golden/golden-integration-covered.ts +30 -0
- package/sdk/src/golden/golden-mutation-covered.ts +7 -0
- package/sdk/src/golden/golden-policy.test.ts +8 -0
- package/sdk/src/golden/golden-policy.ts +112 -0
- package/sdk/src/golden/golden.integration.test.ts +373 -0
- package/sdk/src/golden/init-golden-normalize.ts +15 -0
- package/sdk/src/golden/read-only-golden-rows.ts +77 -0
- package/sdk/src/golden/read-only-parity.integration.test.ts +125 -0
- package/sdk/src/golden/registry-canonical-commands.ts +31 -0
- package/sdk/src/gsd-tools.test.ts +409 -0
- package/sdk/src/gsd-tools.ts +595 -0
- package/sdk/src/headless-prompts.test.ts +159 -0
- package/sdk/src/index.ts +333 -0
- package/sdk/src/init-e2e.integration.test.ts +136 -0
- package/sdk/src/init-runner.test.ts +783 -0
- package/sdk/src/init-runner.ts +735 -0
- package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
- package/sdk/src/logger.test.ts +149 -0
- package/sdk/src/logger.ts +113 -0
- package/sdk/src/milestone-runner.test.ts +421 -0
- package/sdk/src/phase-prompt.test.ts +538 -0
- package/sdk/src/phase-prompt.ts +264 -0
- package/sdk/src/phase-runner-types.test.ts +421 -0
- package/sdk/src/phase-runner.integration.test.ts +377 -0
- package/sdk/src/phase-runner.test.ts +2333 -0
- package/sdk/src/phase-runner.ts +1203 -0
- package/sdk/src/plan-parser.test.ts +528 -0
- package/sdk/src/plan-parser.ts +427 -0
- package/sdk/src/prompt-builder.test.ts +306 -0
- package/sdk/src/prompt-builder.ts +193 -0
- package/sdk/src/prompt-sanitizer.test.ts +260 -0
- package/sdk/src/prompt-sanitizer.ts +71 -0
- package/sdk/src/query/QUERY-HANDLERS.md +317 -0
- package/sdk/src/query/audit-open.ts +722 -0
- package/sdk/src/query/check-auto-mode.test.ts +77 -0
- package/sdk/src/query/check-auto-mode.ts +50 -0
- package/sdk/src/query/check-completion.test.ts +113 -0
- package/sdk/src/query/check-completion.ts +182 -0
- package/sdk/src/query/check-gates.test.ts +103 -0
- package/sdk/src/query/check-gates.ts +112 -0
- package/sdk/src/query/check-ship-ready.test.ts +77 -0
- package/sdk/src/query/check-ship-ready.ts +103 -0
- package/sdk/src/query/check-verification-status.test.ts +143 -0
- package/sdk/src/query/check-verification-status.ts +160 -0
- package/sdk/src/query/commit.test.ts +202 -0
- package/sdk/src/query/commit.ts +301 -0
- package/sdk/src/query/config-gates.test.ts +89 -0
- package/sdk/src/query/config-gates.ts +69 -0
- package/sdk/src/query/config-mutation.test.ts +365 -0
- package/sdk/src/query/config-mutation.ts +497 -0
- package/sdk/src/query/config-query.test.ts +161 -0
- package/sdk/src/query/config-query.ts +190 -0
- package/sdk/src/query/context-history.test.ts +165 -0
- package/sdk/src/query/context-history.ts +467 -0
- package/sdk/src/query/decomposed-handlers.test.ts +365 -0
- package/sdk/src/query/detect-custom-files.ts +97 -0
- package/sdk/src/query/detect-phase-type.test.ts +105 -0
- package/sdk/src/query/detect-phase-type.ts +141 -0
- package/sdk/src/query/docs-init.ts +257 -0
- package/sdk/src/query/failure-capture.ts +58 -0
- package/sdk/src/query/frontmatter-array.test.ts +14 -0
- package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
- package/sdk/src/query/frontmatter-mutation.ts +343 -0
- package/sdk/src/query/frontmatter.test.ts +281 -0
- package/sdk/src/query/frontmatter.ts +397 -0
- package/sdk/src/query/helpers.test.ts +426 -0
- package/sdk/src/query/helpers.ts +482 -0
- package/sdk/src/query/index.ts +586 -0
- package/sdk/src/query/init-complex.test.ts +232 -0
- package/sdk/src/query/init-complex.ts +578 -0
- package/sdk/src/query/init.test.ts +522 -0
- package/sdk/src/query/init.ts +1046 -0
- package/sdk/src/query/intel.test.ts +90 -0
- package/sdk/src/query/intel.ts +404 -0
- package/sdk/src/query/normalize-query-command.test.ts +50 -0
- package/sdk/src/query/normalize-query-command.ts +56 -0
- package/sdk/src/query/phase-lifecycle.test.ts +1126 -0
- package/sdk/src/query/phase-lifecycle.ts +1799 -0
- package/sdk/src/query/phase-list-queries.test.ts +88 -0
- package/sdk/src/query/phase-list-queries.ts +152 -0
- package/sdk/src/query/phase-ready.test.ts +65 -0
- package/sdk/src/query/phase-ready.ts +158 -0
- package/sdk/src/query/phase.test.ts +307 -0
- package/sdk/src/query/phase.ts +340 -0
- package/sdk/src/query/pipeline.test.ts +169 -0
- package/sdk/src/query/pipeline.ts +243 -0
- package/sdk/src/query/plan-execution-route.test.ts +166 -0
- package/sdk/src/query/plan-execution-route.ts +209 -0
- package/sdk/src/query/plan-task-structure.test.ts +65 -0
- package/sdk/src/query/plan-task-structure.ts +63 -0
- package/sdk/src/query/profile-extract-messages.ts +247 -0
- package/sdk/src/query/profile-output.ts +908 -0
- package/sdk/src/query/profile-questionnaire-data.ts +181 -0
- package/sdk/src/query/profile-sample.ts +184 -0
- package/sdk/src/query/profile-scan-sessions.ts +174 -0
- package/sdk/src/query/profile.test.ts +74 -0
- package/sdk/src/query/profile.ts +337 -0
- package/sdk/src/query/progress.test.ts +156 -0
- package/sdk/src/query/progress.ts +566 -0
- package/sdk/src/query/registry.test.ts +216 -0
- package/sdk/src/query/registry.ts +174 -0
- package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
- package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
- package/sdk/src/query/roadmap-update-plan-progress.ts +132 -0
- package/sdk/src/query/roadmap.test.ts +359 -0
- package/sdk/src/query/roadmap.ts +591 -0
- package/sdk/src/query/route-next-action.test.ts +61 -0
- package/sdk/src/query/route-next-action.ts +345 -0
- package/sdk/src/query/runtime-health.ts +7 -0
- package/sdk/src/query/schema-detect.ts +189 -0
- package/sdk/src/query/skill-manifest.ts +214 -0
- package/sdk/src/query/skills.test.ts +80 -0
- package/sdk/src/query/skills.ts +62 -0
- package/sdk/src/query/state-mutation.test.ts +450 -0
- package/sdk/src/query/state-mutation.ts +1444 -0
- package/sdk/src/query/state-project-load.ts +109 -0
- package/sdk/src/query/state.test.ts +347 -0
- package/sdk/src/query/state.ts +397 -0
- package/sdk/src/query/summary.test.ts +95 -0
- package/sdk/src/query/summary.ts +296 -0
- package/sdk/src/query/template.test.ts +180 -0
- package/sdk/src/query/template.ts +242 -0
- package/sdk/src/query/uat.test.ts +77 -0
- package/sdk/src/query/uat.ts +314 -0
- package/sdk/src/query/utils.test.ts +82 -0
- package/sdk/src/query/utils.ts +92 -0
- package/sdk/src/query/validate.test.ts +656 -0
- package/sdk/src/query/validate.ts +807 -0
- package/sdk/src/query/verify.test.ts +414 -0
- package/sdk/src/query/verify.ts +645 -0
- package/sdk/src/query/websearch.test.ts +31 -0
- package/sdk/src/query/websearch.ts +82 -0
- package/sdk/src/query/workspace.test.ts +119 -0
- package/sdk/src/query/workspace.ts +131 -0
- package/sdk/src/query/workstream.test.ts +51 -0
- package/sdk/src/query/workstream.ts +434 -0
- package/sdk/src/research-gate.test.ts +190 -0
- package/sdk/src/research-gate.ts +94 -0
- package/sdk/src/runtime-health.test.ts +176 -0
- package/sdk/src/runtime-health.ts +387 -0
- package/sdk/src/session-runner.test.ts +98 -0
- package/sdk/src/session-runner.ts +299 -0
- package/sdk/src/tool-scoping.test.ts +160 -0
- package/sdk/src/tool-scoping.ts +61 -0
- package/sdk/src/types.ts +917 -0
- package/sdk/src/workstream-utils.ts +33 -0
- package/sdk/src/ws-flag.test.ts +285 -0
- package/sdk/src/ws-transport.test.ts +161 -0
- package/sdk/src/ws-transport.ts +93 -0
- package/sdk/tsconfig.json +20 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for roadmap query handlers.
|
|
3
|
+
*
|
|
4
|
+
* Tests roadmapAnalyze, roadmapGetPhase, getMilestoneInfo,
|
|
5
|
+
* extractCurrentMilestone, and stripShippedMilestones.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
9
|
+
import { mkdtemp, writeFile, mkdir, rm } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
|
|
13
|
+
// These will be imported once roadmap.ts is created
|
|
14
|
+
import {
|
|
15
|
+
roadmapAnalyze,
|
|
16
|
+
roadmapGetPhase,
|
|
17
|
+
getMilestoneInfo,
|
|
18
|
+
extractCurrentMilestone,
|
|
19
|
+
stripShippedMilestones,
|
|
20
|
+
} from './roadmap.js';
|
|
21
|
+
|
|
22
|
+
// ─── Test fixtures ────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
const ROADMAP_CONTENT = `# Roadmap
|
|
25
|
+
|
|
26
|
+
## Current Milestone: v3.0 SDK-First Migration
|
|
27
|
+
|
|
28
|
+
**Goal:** Migrate all deterministic orchestration into TypeScript SDK.
|
|
29
|
+
|
|
30
|
+
- [x] **Phase 9: Foundation and Test Infrastructure**
|
|
31
|
+
- [ ] **Phase 10: Read-Only Queries**
|
|
32
|
+
- [ ] **Phase 11: Mutations**
|
|
33
|
+
|
|
34
|
+
### Phase 9: Foundation and Test Infrastructure
|
|
35
|
+
|
|
36
|
+
**Goal:** Build core SDK infrastructure.
|
|
37
|
+
|
|
38
|
+
**Depends on:** None
|
|
39
|
+
|
|
40
|
+
**Success Criteria**:
|
|
41
|
+
1. Error classification system exists
|
|
42
|
+
2. Query registry works
|
|
43
|
+
|
|
44
|
+
### Phase 10: Read-Only Queries
|
|
45
|
+
|
|
46
|
+
**Goal:** Port read-only query operations.
|
|
47
|
+
|
|
48
|
+
**Depends on:** Phase 9
|
|
49
|
+
|
|
50
|
+
**Success Criteria**:
|
|
51
|
+
1. All read queries work
|
|
52
|
+
2. Golden file tests pass
|
|
53
|
+
|
|
54
|
+
### Phase 11: Mutations
|
|
55
|
+
|
|
56
|
+
**Goal:** Port mutation operations.
|
|
57
|
+
|
|
58
|
+
**Depends on:** Phase 10
|
|
59
|
+
`;
|
|
60
|
+
|
|
61
|
+
const STATE_WITH_MILESTONE = `---
|
|
62
|
+
gsd_state_version: 1.0
|
|
63
|
+
milestone: v3.0
|
|
64
|
+
status: executing
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
# Project State
|
|
68
|
+
|
|
69
|
+
**Current Phase:** 10
|
|
70
|
+
**Status:** Ready to execute
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
let tmpDir: string;
|
|
76
|
+
|
|
77
|
+
beforeEach(async () => {
|
|
78
|
+
tmpDir = await mkdtemp(join(tmpdir(), 'roadmap-test-'));
|
|
79
|
+
await mkdir(join(tmpDir, '.planning', 'phases', '09-foundation'), { recursive: true });
|
|
80
|
+
await mkdir(join(tmpDir, '.planning', 'phases', '10-read-only-queries'), { recursive: true });
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
afterEach(async () => {
|
|
84
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// ─── stripShippedMilestones ───────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
describe('stripShippedMilestones', () => {
|
|
90
|
+
it('removes <details> blocks', () => {
|
|
91
|
+
const content = 'before\n<details>\nshipped content\n</details>\nafter';
|
|
92
|
+
expect(stripShippedMilestones(content)).toBe('before\n\nafter');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('handles multiple <details> blocks', () => {
|
|
96
|
+
const content = '<details>a</details>middle<details>b</details>end';
|
|
97
|
+
expect(stripShippedMilestones(content)).toBe('middleend');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('returns content unchanged when no details blocks', () => {
|
|
101
|
+
expect(stripShippedMilestones('no details here')).toBe('no details here');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// ─── getMilestoneInfo ─────────────────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
describe('getMilestoneInfo', () => {
|
|
108
|
+
it('extracts version and name from heading format', async () => {
|
|
109
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
110
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
111
|
+
expect(info.version).toBe('v3.0');
|
|
112
|
+
expect(info.name).toBe('SDK-First Migration');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('extracts from in-progress marker format', async () => {
|
|
116
|
+
const roadmap = '- \u{1F6A7} **v2.1 Belgium** \u2014 Phases 24-28 (in progress)';
|
|
117
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
|
|
118
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
119
|
+
expect(info.version).toBe('v2.1');
|
|
120
|
+
expect(info.name).toBe('Belgium');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('extracts from yellow-circle in-flight marker (GSD ROADMAP template)', async () => {
|
|
124
|
+
const roadmap = '- 🟡 **v3.1 Upstream Landing** — Phase 15 (in flight)';
|
|
125
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
|
|
126
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
127
|
+
expect(info.version).toBe('v3.1');
|
|
128
|
+
expect(info.name).toBe('Upstream Landing');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('uses last **vX.Y Title** in milestone list before ## Phases when no emoji match', async () => {
|
|
132
|
+
const roadmap = `## Milestones
|
|
133
|
+
|
|
134
|
+
- ✅ **v1.0 A**
|
|
135
|
+
- ✅ **v3.0 B**
|
|
136
|
+
- ✅ **v3.1 Current Name**
|
|
137
|
+
|
|
138
|
+
## Phases
|
|
139
|
+
`;
|
|
140
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmap);
|
|
141
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
142
|
+
expect(info.version).toBe('v3.1');
|
|
143
|
+
expect(info.name).toBe('Current Name');
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('falls back to STATE.md milestone when ROADMAP.md is missing', async () => {
|
|
147
|
+
await writeFile(
|
|
148
|
+
join(tmpDir, '.planning', 'STATE.md'),
|
|
149
|
+
'---\nmilestone: v4.2\nmilestone_name: From State\n---\n\n# State\n',
|
|
150
|
+
);
|
|
151
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
152
|
+
expect(info.version).toBe('v4.2');
|
|
153
|
+
expect(info.name).toBe('From State');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('falls back to v1.0 when ROADMAP.md and STATE.md lack milestone', async () => {
|
|
157
|
+
const info = await getMilestoneInfo(tmpDir);
|
|
158
|
+
expect(info.version).toBe('v1.0');
|
|
159
|
+
expect(info.name).toBe('milestone');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// ─── extractCurrentMilestone ──────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
describe('extractCurrentMilestone', () => {
|
|
166
|
+
it('scopes content to current milestone from STATE.md version', async () => {
|
|
167
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
168
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
169
|
+
const result = await extractCurrentMilestone(ROADMAP_CONTENT, tmpDir);
|
|
170
|
+
expect(result).toContain('Phase 10');
|
|
171
|
+
expect(result).toContain('v3.0');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('strips shipped milestones when no cwd version found', async () => {
|
|
175
|
+
const content = '<details>old</details>current content';
|
|
176
|
+
// No STATE.md, no in-progress marker
|
|
177
|
+
const result = await extractCurrentMilestone(content, tmpDir);
|
|
178
|
+
expect(result).toBe('current content');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// ─── Bug #2422: preamble Backlog leak ─────────────────────────────────
|
|
182
|
+
it('bug-2422: does not include ## Backlog section before the current milestone', async () => {
|
|
183
|
+
const roadmapWithBacklog = `# ROADMAP
|
|
184
|
+
|
|
185
|
+
## Backlog
|
|
186
|
+
### Phase 999.1: Parking lot item A
|
|
187
|
+
### Phase 999.2: Parking lot item B
|
|
188
|
+
|
|
189
|
+
### 🚧 v2.0 My Milestone (In Progress)
|
|
190
|
+
- [ ] **Phase 100: Real work**
|
|
191
|
+
|
|
192
|
+
## v2.0 Phase Details
|
|
193
|
+
### Phase 100: Real work
|
|
194
|
+
**Goal**: Do stuff.
|
|
195
|
+
`;
|
|
196
|
+
const state = `---\nmilestone: v2.0\n---\n# State\n`;
|
|
197
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
|
|
198
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithBacklog);
|
|
199
|
+
|
|
200
|
+
const result = await extractCurrentMilestone(roadmapWithBacklog, tmpDir);
|
|
201
|
+
|
|
202
|
+
// Must NOT include backlog phases
|
|
203
|
+
expect(result).not.toContain('Phase 999.1');
|
|
204
|
+
expect(result).not.toContain('Phase 999.2');
|
|
205
|
+
expect(result).not.toContain('Parking lot');
|
|
206
|
+
// Must include the actual v2.0 content
|
|
207
|
+
expect(result).toContain('Phase 100');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// ─── Bug #2422: same-version sub-heading truncation ───────────────────
|
|
211
|
+
it('bug-2422: does not truncate at same-version sub-heading (## v2.0 Phase Details)', async () => {
|
|
212
|
+
const roadmapWithDetails = `# ROADMAP
|
|
213
|
+
|
|
214
|
+
### 🚧 v2.0 My Milestone (In Progress)
|
|
215
|
+
- [ ] **Phase 100: Real work**
|
|
216
|
+
|
|
217
|
+
## v2.0 Phase Details
|
|
218
|
+
### Phase 100: Real work
|
|
219
|
+
**Goal**: Do stuff.
|
|
220
|
+
`;
|
|
221
|
+
const state = `---\nmilestone: v2.0\n---\n# State\n`;
|
|
222
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), state);
|
|
223
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithDetails);
|
|
224
|
+
|
|
225
|
+
const result = await extractCurrentMilestone(roadmapWithDetails, tmpDir);
|
|
226
|
+
|
|
227
|
+
// The detail section must survive — not be cut off
|
|
228
|
+
expect(result).toContain('Phase 100');
|
|
229
|
+
expect(result).toContain('Phase Details');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// ─── roadmapGetPhase ──────────────────────────────────────────────────────
|
|
234
|
+
|
|
235
|
+
describe('roadmapGetPhase', () => {
|
|
236
|
+
it('returns phase info for existing phase', async () => {
|
|
237
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
238
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
239
|
+
const result = await roadmapGetPhase(['10'], tmpDir);
|
|
240
|
+
const data = result.data as Record<string, unknown>;
|
|
241
|
+
expect(data.found).toBe(true);
|
|
242
|
+
expect(data.phase_number).toBe('10');
|
|
243
|
+
expect(data.phase_name).toBe('Read-Only Queries');
|
|
244
|
+
expect(data.goal).toBe('Port read-only query operations.');
|
|
245
|
+
expect((data.success_criteria as string[]).length).toBe(2);
|
|
246
|
+
expect(data.section).toContain('### Phase 10');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('returns { found: false } for nonexistent phase', async () => {
|
|
250
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
251
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
252
|
+
const result = await roadmapGetPhase(['999'], tmpDir);
|
|
253
|
+
const data = result.data as Record<string, unknown>;
|
|
254
|
+
expect(data.found).toBe(false);
|
|
255
|
+
expect(data.phase_number).toBe('999');
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('throws GSDError when no phase number provided', async () => {
|
|
259
|
+
await expect(roadmapGetPhase([], tmpDir)).rejects.toThrow();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
it('handles malformed roadmap (checklist-only, no detail section)', async () => {
|
|
263
|
+
const malformed = `# Roadmap\n\n- [ ] **Phase 99: Missing Detail**\n`;
|
|
264
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), malformed);
|
|
265
|
+
const result = await roadmapGetPhase(['99'], tmpDir);
|
|
266
|
+
const data = result.data as Record<string, unknown>;
|
|
267
|
+
expect(data.error).toBe('malformed_roadmap');
|
|
268
|
+
expect(data.phase_name).toBe('Missing Detail');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it('returns error object when ROADMAP.md not found', async () => {
|
|
272
|
+
const result = await roadmapGetPhase(['10'], tmpDir);
|
|
273
|
+
const data = result.data as Record<string, unknown>;
|
|
274
|
+
expect(data.found).toBe(false);
|
|
275
|
+
expect(data.error).toBe('ROADMAP.md not found');
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// ─── roadmapAnalyze ───────────────────────────────────────────────────────
|
|
280
|
+
|
|
281
|
+
describe('roadmapAnalyze', () => {
|
|
282
|
+
it('returns full analysis for valid roadmap', async () => {
|
|
283
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
284
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
285
|
+
|
|
286
|
+
// Create some plan/summary files for disk correlation
|
|
287
|
+
await writeFile(join(tmpDir, '.planning', 'phases', '09-foundation', '09-01-PLAN.md'), '---\n---\n');
|
|
288
|
+
await writeFile(join(tmpDir, '.planning', 'phases', '09-foundation', '09-01-SUMMARY.md'), '---\n---\n');
|
|
289
|
+
await writeFile(join(tmpDir, '.planning', 'phases', '10-read-only-queries', '10-01-PLAN.md'), '---\n---\n');
|
|
290
|
+
|
|
291
|
+
const result = await roadmapAnalyze([], tmpDir);
|
|
292
|
+
const data = result.data as Record<string, unknown>;
|
|
293
|
+
|
|
294
|
+
expect(data.phase_count).toBe(3);
|
|
295
|
+
expect((data.phases as Array<Record<string, unknown>>).length).toBe(3);
|
|
296
|
+
|
|
297
|
+
const phases = data.phases as Array<Record<string, unknown>>;
|
|
298
|
+
// Phase 9 has 1 plan, 1 summary => complete (or roadmap checkbox says complete)
|
|
299
|
+
const p9 = phases.find(p => p.number === '9');
|
|
300
|
+
expect(p9).toBeDefined();
|
|
301
|
+
expect(p9!.name).toBe('Foundation and Test Infrastructure');
|
|
302
|
+
expect(p9!.roadmap_complete).toBe(true); // [x] in checklist
|
|
303
|
+
|
|
304
|
+
// Phase 10 has 1 plan, 0 summaries => planned
|
|
305
|
+
const p10 = phases.find(p => p.number === '10');
|
|
306
|
+
expect(p10).toBeDefined();
|
|
307
|
+
expect(p10!.disk_status).toBe('planned');
|
|
308
|
+
expect(p10!.plan_count).toBe(1);
|
|
309
|
+
|
|
310
|
+
// Phase 11 has no directory content
|
|
311
|
+
const p11 = phases.find(p => p.number === '11');
|
|
312
|
+
expect(p11).toBeDefined();
|
|
313
|
+
expect(p11!.disk_status).toBe('no_directory');
|
|
314
|
+
|
|
315
|
+
expect(data.total_plans).toBeGreaterThan(0);
|
|
316
|
+
expect(typeof data.progress_percent).toBe('number');
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
it('returns error when ROADMAP.md not found', async () => {
|
|
320
|
+
const result = await roadmapAnalyze([], tmpDir);
|
|
321
|
+
const data = result.data as Record<string, unknown>;
|
|
322
|
+
expect(data.error).toBe('ROADMAP.md not found');
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('overrides disk_status to complete when roadmap checkbox is checked', async () => {
|
|
326
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
327
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
328
|
+
|
|
329
|
+
// Phase 9 dir is empty (no plans/summaries) but roadmap has [x]
|
|
330
|
+
const result = await roadmapAnalyze([], tmpDir);
|
|
331
|
+
const data = result.data as Record<string, unknown>;
|
|
332
|
+
const phases = data.phases as Array<Record<string, unknown>>;
|
|
333
|
+
const p9 = phases.find(p => p.number === '9');
|
|
334
|
+
expect(p9!.disk_status).toBe('complete');
|
|
335
|
+
expect(p9!.roadmap_complete).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('detects missing phase details from checklist', async () => {
|
|
339
|
+
const roadmapWithExtra = ROADMAP_CONTENT + '\n- [ ] **Phase 99: Future Phase**\n';
|
|
340
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), roadmapWithExtra);
|
|
341
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
342
|
+
|
|
343
|
+
const result = await roadmapAnalyze([], tmpDir);
|
|
344
|
+
const data = result.data as Record<string, unknown>;
|
|
345
|
+
expect(data.missing_phase_details).toContain('99');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('handles repeated calls correctly (no lastIndex bug)', async () => {
|
|
349
|
+
await writeFile(join(tmpDir, '.planning', 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
350
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), STATE_WITH_MILESTONE);
|
|
351
|
+
|
|
352
|
+
const result1 = await roadmapAnalyze([], tmpDir);
|
|
353
|
+
const result2 = await roadmapAnalyze([], tmpDir);
|
|
354
|
+
const data1 = result1.data as Record<string, unknown>;
|
|
355
|
+
const data2 = result2.data as Record<string, unknown>;
|
|
356
|
+
|
|
357
|
+
expect((data1.phases as unknown[]).length).toBe((data2.phases as unknown[]).length);
|
|
358
|
+
});
|
|
359
|
+
});
|