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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `state load` — full project config + STATE.md raw text (CJS `cmdStateLoad`).
|
|
3
|
+
*
|
|
4
|
+
* Uses the same `loadConfig(cwd)` as `get-shit-done/bin/lib/state.cjs` by resolving
|
|
5
|
+
* `core.cjs` next to a shipped/bundled/user `get-shit-done` install (same probe order
|
|
6
|
+
* as `resolveGsdToolsPath`). This keeps JSON output **byte-compatible** with
|
|
7
|
+
* `node gsd-tools.cjs state load` for monorepo and standard installs.
|
|
8
|
+
*
|
|
9
|
+
* Distinct from {@link stateJson} (`state json` / `state.json`) which mirrors
|
|
10
|
+
* `cmdStateJson` (rebuilt frontmatter only).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { readFile } from 'node:fs/promises';
|
|
14
|
+
import { existsSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { createRequire } from 'node:module';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { planningPaths } from './helpers.js';
|
|
20
|
+
import type { QueryHandler } from './utils.js';
|
|
21
|
+
import { GSDError, ErrorClassification } from '../errors.js';
|
|
22
|
+
|
|
23
|
+
const BUNDLED_CORE_CJS = fileURLToPath(
|
|
24
|
+
new URL('../../../get-shit-done/bin/lib/core.cjs', import.meta.url),
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
function resolveCoreCjsPath(projectDir: string): string | null {
|
|
28
|
+
const candidates = [
|
|
29
|
+
BUNDLED_CORE_CJS,
|
|
30
|
+
join(projectDir, '.claude', 'get-shit-done', 'bin', 'lib', 'core.cjs'),
|
|
31
|
+
join(homedir(), '.claude', 'get-shit-done', 'bin', 'lib', 'core.cjs'),
|
|
32
|
+
];
|
|
33
|
+
return candidates.find(p => existsSync(p)) ?? null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function loadConfigCjs(projectDir: string): Record<string, unknown> {
|
|
37
|
+
const corePath = resolveCoreCjsPath(projectDir);
|
|
38
|
+
if (!corePath) {
|
|
39
|
+
throw new GSDError(
|
|
40
|
+
'state load: get-shit-done/bin/lib/core.cjs not found. Install GSD (e.g. npm i -g get-shit-done-cc) or clone with get-shit-done next to the SDK.',
|
|
41
|
+
ErrorClassification.Blocked,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
const req = createRequire(import.meta.url);
|
|
45
|
+
const { loadConfig } = req(corePath) as { loadConfig: (cwd: string) => Record<string, unknown> };
|
|
46
|
+
return loadConfig(projectDir);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Query handler for `state load` / bare `state` (normalize → `state.load`).
|
|
51
|
+
*
|
|
52
|
+
* Port of `cmdStateLoad` from `get-shit-done/bin/lib/state.cjs` lines 44–86.
|
|
53
|
+
*/
|
|
54
|
+
export const stateProjectLoad: QueryHandler = async (_args, projectDir) => {
|
|
55
|
+
const config = loadConfigCjs(projectDir);
|
|
56
|
+
const planDir = planningPaths(projectDir).planning;
|
|
57
|
+
|
|
58
|
+
let stateRaw = '';
|
|
59
|
+
try {
|
|
60
|
+
stateRaw = await readFile(join(planDir, 'STATE.md'), 'utf-8');
|
|
61
|
+
} catch (err) {
|
|
62
|
+
if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const configExists = existsSync(join(planDir, 'config.json'));
|
|
68
|
+
const roadmapExists = existsSync(join(planDir, 'ROADMAP.md'));
|
|
69
|
+
const stateExists = stateRaw.length > 0;
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
data: {
|
|
73
|
+
config,
|
|
74
|
+
state_raw: stateRaw,
|
|
75
|
+
state_exists: stateExists,
|
|
76
|
+
roadmap_exists: roadmapExists,
|
|
77
|
+
config_exists: configExists,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* `--raw` stdout for `state load` (matches CJS `cmdStateLoad` lines 65–83).
|
|
84
|
+
*/
|
|
85
|
+
export function formatStateLoadRawStdout(data: unknown): string {
|
|
86
|
+
const d = data as Record<string, unknown>;
|
|
87
|
+
const c = d.config as Record<string, unknown> | undefined;
|
|
88
|
+
if (!c) {
|
|
89
|
+
return typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
90
|
+
}
|
|
91
|
+
const configExists = d.config_exists;
|
|
92
|
+
const roadmapExists = d.roadmap_exists;
|
|
93
|
+
const stateExists = d.state_exists;
|
|
94
|
+
const lines = [
|
|
95
|
+
`model_profile=${c.model_profile}`,
|
|
96
|
+
`commit_docs=${c.commit_docs}`,
|
|
97
|
+
`branching_strategy=${c.branching_strategy}`,
|
|
98
|
+
`phase_branch_template=${c.phase_branch_template}`,
|
|
99
|
+
`milestone_branch_template=${c.milestone_branch_template}`,
|
|
100
|
+
`parallelization=${c.parallelization}`,
|
|
101
|
+
`research=${c.research}`,
|
|
102
|
+
`plan_checker=${c.plan_checker}`,
|
|
103
|
+
`verifier=${c.verifier}`,
|
|
104
|
+
`config_exists=${configExists}`,
|
|
105
|
+
`roadmap_exists=${roadmapExists}`,
|
|
106
|
+
`state_exists=${stateExists}`,
|
|
107
|
+
];
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for state query handlers.
|
|
3
|
+
*
|
|
4
|
+
* Tests stateJson, stateGet, and stateSnapshot handlers.
|
|
5
|
+
* Uses temp directories with real .planning/ structures.
|
|
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
|
+
// Will be imported once implemented
|
|
14
|
+
import { stateJson, stateGet, stateSnapshot } from './state.js';
|
|
15
|
+
|
|
16
|
+
// ─── Fixtures ──────────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
const STATE_BODY = `# Project State
|
|
19
|
+
|
|
20
|
+
## Project Reference
|
|
21
|
+
|
|
22
|
+
See: .planning/PROJECT.md (updated 2026-04-07)
|
|
23
|
+
|
|
24
|
+
**Core value:** Improve the project.
|
|
25
|
+
**Current focus:** Phase 10
|
|
26
|
+
|
|
27
|
+
## Current Position
|
|
28
|
+
|
|
29
|
+
Phase: 10 (Read-Only Queries) — EXECUTING
|
|
30
|
+
Plan: 2 of 3
|
|
31
|
+
Status: Ready to execute
|
|
32
|
+
Last Activity: 2026-04-08
|
|
33
|
+
Last Activity Description: Completed plan 01
|
|
34
|
+
|
|
35
|
+
Progress: [████░░░░░░] 40%
|
|
36
|
+
|
|
37
|
+
## Decisions Made
|
|
38
|
+
|
|
39
|
+
Recent decisions affecting current work:
|
|
40
|
+
|
|
41
|
+
| Phase | Summary | Rationale |
|
|
42
|
+
|-------|---------|-----------|
|
|
43
|
+
| 09 | Used GSDError pattern | Consistent with existing SDK errors |
|
|
44
|
+
| 10 | Temp dir test pattern | ESM spy limitations |
|
|
45
|
+
|
|
46
|
+
## Blockers
|
|
47
|
+
|
|
48
|
+
- STATE.md parsing edge cases need audit
|
|
49
|
+
- Verification rule inventory needs review
|
|
50
|
+
|
|
51
|
+
## Session
|
|
52
|
+
|
|
53
|
+
Last session: 2026-04-08T05:00:00Z
|
|
54
|
+
Stopped At: Completed 10-01-PLAN.md
|
|
55
|
+
Resume File: None
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
const STATE_WITH_FRONTMATTER = `---
|
|
59
|
+
gsd_state_version: 1.0
|
|
60
|
+
milestone: v3.0
|
|
61
|
+
milestone_name: SDK-First Migration
|
|
62
|
+
status: executing
|
|
63
|
+
stopped_at: Completed 10-01-PLAN.md
|
|
64
|
+
last_updated: "2026-04-08T05:01:21.919Z"
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
${STATE_BODY}`;
|
|
68
|
+
|
|
69
|
+
const ROADMAP_CONTENT = `# Roadmap
|
|
70
|
+
|
|
71
|
+
## Roadmap v3.0: SDK-First Migration
|
|
72
|
+
|
|
73
|
+
### Phase 09: Foundation
|
|
74
|
+
- Build infrastructure
|
|
75
|
+
|
|
76
|
+
### Phase 10: Read-Only Queries
|
|
77
|
+
- Port state queries
|
|
78
|
+
|
|
79
|
+
### Phase 11: Mutations
|
|
80
|
+
- Port write operations
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
let tmpDir: string;
|
|
84
|
+
|
|
85
|
+
// ─── Setup / Teardown ──────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
beforeEach(async () => {
|
|
88
|
+
tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-test-'));
|
|
89
|
+
const planningDir = join(tmpDir, '.planning');
|
|
90
|
+
const phasesDir = join(planningDir, 'phases');
|
|
91
|
+
|
|
92
|
+
// Create .planning structure
|
|
93
|
+
await mkdir(phasesDir, { recursive: true });
|
|
94
|
+
|
|
95
|
+
// Create STATE.md with frontmatter
|
|
96
|
+
await writeFile(join(planningDir, 'STATE.md'), STATE_WITH_FRONTMATTER);
|
|
97
|
+
|
|
98
|
+
// Create ROADMAP.md
|
|
99
|
+
await writeFile(join(planningDir, 'ROADMAP.md'), ROADMAP_CONTENT);
|
|
100
|
+
|
|
101
|
+
// Create config.json
|
|
102
|
+
await writeFile(join(planningDir, 'config.json'), JSON.stringify({
|
|
103
|
+
model_profile: 'quality',
|
|
104
|
+
workflow: { auto_advance: true },
|
|
105
|
+
}));
|
|
106
|
+
|
|
107
|
+
// Create phase directories with plans and summaries
|
|
108
|
+
const phase09 = join(phasesDir, '09-foundation');
|
|
109
|
+
await mkdir(phase09, { recursive: true });
|
|
110
|
+
await writeFile(join(phase09, '09-01-PLAN.md'), '---\nphase: 09\nplan: 01\n---\nPlan 1');
|
|
111
|
+
await writeFile(join(phase09, '09-01-SUMMARY.md'), 'Summary 1');
|
|
112
|
+
await writeFile(join(phase09, '09-02-PLAN.md'), '---\nphase: 09\nplan: 02\n---\nPlan 2');
|
|
113
|
+
await writeFile(join(phase09, '09-02-SUMMARY.md'), 'Summary 2');
|
|
114
|
+
await writeFile(join(phase09, '09-03-PLAN.md'), '---\nphase: 09\nplan: 03\n---\nPlan 3');
|
|
115
|
+
await writeFile(join(phase09, '09-03-SUMMARY.md'), 'Summary 3');
|
|
116
|
+
|
|
117
|
+
const phase10 = join(phasesDir, '10-read-only-queries');
|
|
118
|
+
await mkdir(phase10, { recursive: true });
|
|
119
|
+
await writeFile(join(phase10, '10-01-PLAN.md'), '---\nphase: 10\nplan: 01\n---\nPlan 1');
|
|
120
|
+
await writeFile(join(phase10, '10-01-SUMMARY.md'), 'Summary 1');
|
|
121
|
+
await writeFile(join(phase10, '10-02-PLAN.md'), '---\nphase: 10\nplan: 02\n---\nPlan 2');
|
|
122
|
+
await writeFile(join(phase10, '10-03-PLAN.md'), '---\nphase: 10\nplan: 03\n---\nPlan 3');
|
|
123
|
+
|
|
124
|
+
const phase11 = join(phasesDir, '11-mutations');
|
|
125
|
+
await mkdir(phase11, { recursive: true });
|
|
126
|
+
await writeFile(join(phase11, '11-01-PLAN.md'), '---\nphase: 11\nplan: 01\n---\nPlan 1');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
afterEach(async () => {
|
|
130
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// ─── stateJson (state json / state.json) ───────────────────────────────────
|
|
134
|
+
|
|
135
|
+
describe('stateJson', () => {
|
|
136
|
+
it('rebuilds frontmatter from body + disk', async () => {
|
|
137
|
+
const result = await stateJson([], tmpDir);
|
|
138
|
+
const data = result.data as Record<string, unknown>;
|
|
139
|
+
|
|
140
|
+
expect(data.gsd_state_version).toBe('1.0');
|
|
141
|
+
expect(data.milestone).toBe('v3.0');
|
|
142
|
+
expect(data.milestone_name).toBe('SDK-First Migration');
|
|
143
|
+
expect(data.status).toBe('executing');
|
|
144
|
+
expect(data.last_updated).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('returns progress with disk-scanned counts', async () => {
|
|
148
|
+
const result = await stateJson([], tmpDir);
|
|
149
|
+
const data = result.data as Record<string, unknown>;
|
|
150
|
+
const progress = data.progress as Record<string, unknown>;
|
|
151
|
+
|
|
152
|
+
// 3 phases in roadmap (09, 10, 11), 7 total plans, 4 summaries
|
|
153
|
+
expect(progress.total_phases).toBe(3);
|
|
154
|
+
expect(progress.total_plans).toBe(7);
|
|
155
|
+
expect(progress.completed_plans).toBe(4);
|
|
156
|
+
// Phase 09 complete (3/3), phase 10 incomplete (1/3), phase 11 incomplete (0/1)
|
|
157
|
+
expect(progress.completed_phases).toBe(1);
|
|
158
|
+
// 4/7 = 57%
|
|
159
|
+
expect(progress.percent).toBe(57);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('preserves stopped_at from existing frontmatter', async () => {
|
|
163
|
+
const result = await stateJson([], tmpDir);
|
|
164
|
+
const data = result.data as Record<string, unknown>;
|
|
165
|
+
|
|
166
|
+
expect(data.stopped_at).toBe('Completed 10-01-PLAN.md');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('preserves existing non-unknown status when body-derived is unknown', async () => {
|
|
170
|
+
// Create STATE.md with frontmatter status but no Status in body
|
|
171
|
+
const stateContent = `---
|
|
172
|
+
gsd_state_version: 1.0
|
|
173
|
+
status: paused
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
# Project State
|
|
177
|
+
|
|
178
|
+
Phase: 10
|
|
179
|
+
Plan: 2 of 3
|
|
180
|
+
`;
|
|
181
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), stateContent);
|
|
182
|
+
|
|
183
|
+
const result = await stateJson([], tmpDir);
|
|
184
|
+
const data = result.data as Record<string, unknown>;
|
|
185
|
+
|
|
186
|
+
// Body has no Status field -> derived is 'unknown', should preserve frontmatter 'paused'
|
|
187
|
+
expect(data.status).toBe('paused');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('returns error object when STATE.md not found', async () => {
|
|
191
|
+
const emptyDir = await mkdtemp(join(tmpdir(), 'gsd-state-empty-'));
|
|
192
|
+
await mkdir(join(emptyDir, '.planning'), { recursive: true });
|
|
193
|
+
|
|
194
|
+
const result = await stateJson([], emptyDir);
|
|
195
|
+
const data = result.data as Record<string, unknown>;
|
|
196
|
+
|
|
197
|
+
expect(data.error).toBe('STATE.md not found');
|
|
198
|
+
await rm(emptyDir, { recursive: true, force: true });
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('normalizes status to known values', async () => {
|
|
202
|
+
const stateContent = `---
|
|
203
|
+
gsd_state_version: 1.0
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# Project State
|
|
207
|
+
|
|
208
|
+
Status: In Progress
|
|
209
|
+
`;
|
|
210
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), stateContent);
|
|
211
|
+
|
|
212
|
+
const result = await stateJson([], tmpDir);
|
|
213
|
+
const data = result.data as Record<string, unknown>;
|
|
214
|
+
|
|
215
|
+
expect(data.status).toBe('executing');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('derives percent from disk counts (ground truth)', async () => {
|
|
219
|
+
// Body says 0% but disk has 4/7 summaries
|
|
220
|
+
const stateContent = `---
|
|
221
|
+
gsd_state_version: 1.0
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
# Project State
|
|
225
|
+
|
|
226
|
+
Status: Ready to execute
|
|
227
|
+
Progress: [░░░░░░░░░░] 0%
|
|
228
|
+
`;
|
|
229
|
+
await writeFile(join(tmpDir, '.planning', 'STATE.md'), stateContent);
|
|
230
|
+
|
|
231
|
+
const result = await stateJson([], tmpDir);
|
|
232
|
+
const data = result.data as Record<string, unknown>;
|
|
233
|
+
const progress = data.progress as Record<string, unknown>;
|
|
234
|
+
|
|
235
|
+
// Disk should override the body's 0%
|
|
236
|
+
expect(progress.percent).toBe(57);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// ─── stateGet ──────────────────────────────────────────────────────────────
|
|
241
|
+
|
|
242
|
+
describe('stateGet', () => {
|
|
243
|
+
it('returns full content when no field specified', async () => {
|
|
244
|
+
const result = await stateGet([], tmpDir);
|
|
245
|
+
const data = result.data as Record<string, unknown>;
|
|
246
|
+
|
|
247
|
+
expect(data.content).toBeDefined();
|
|
248
|
+
expect(typeof data.content).toBe('string');
|
|
249
|
+
expect((data.content as string)).toContain('# Project State');
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('extracts bold-format field', async () => {
|
|
253
|
+
const result = await stateGet(['Core value'], tmpDir);
|
|
254
|
+
const data = result.data as Record<string, unknown>;
|
|
255
|
+
|
|
256
|
+
expect(data['Core value']).toBe('Improve the project.');
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('extracts plain-format field', async () => {
|
|
260
|
+
const result = await stateGet(['Plan'], tmpDir);
|
|
261
|
+
const data = result.data as Record<string, unknown>;
|
|
262
|
+
|
|
263
|
+
expect(data['Plan']).toBe('2 of 3');
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('extracts section content under ## heading', async () => {
|
|
267
|
+
const result = await stateGet(['Current Position'], tmpDir);
|
|
268
|
+
const data = result.data as Record<string, unknown>;
|
|
269
|
+
|
|
270
|
+
expect(data['Current Position']).toBeDefined();
|
|
271
|
+
expect((data['Current Position'] as string)).toContain('Phase: 10');
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('returns error for missing field', async () => {
|
|
275
|
+
const result = await stateGet(['Nonexistent Field'], tmpDir);
|
|
276
|
+
const data = result.data as Record<string, unknown>;
|
|
277
|
+
|
|
278
|
+
expect(data.error).toBe('Section or field "Nonexistent Field" not found');
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// ─── stateSnapshot ─────────────────────────────────────────────────────────
|
|
283
|
+
|
|
284
|
+
describe('stateSnapshot', () => {
|
|
285
|
+
it('returns structured snapshot', async () => {
|
|
286
|
+
const result = await stateSnapshot([], tmpDir);
|
|
287
|
+
const data = result.data as Record<string, unknown>;
|
|
288
|
+
|
|
289
|
+
expect(data.current_phase).toBeDefined();
|
|
290
|
+
// Status field in body is "Ready to execute" but frontmatter has "executing"
|
|
291
|
+
// stateSnapshot reads full content and matches "status: executing" from frontmatter first
|
|
292
|
+
expect(data.status).toBeDefined();
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('parses decisions table into array', async () => {
|
|
296
|
+
const result = await stateSnapshot([], tmpDir);
|
|
297
|
+
const data = result.data as Record<string, unknown>;
|
|
298
|
+
const decisions = data.decisions as Array<Record<string, string>>;
|
|
299
|
+
|
|
300
|
+
expect(Array.isArray(decisions)).toBe(true);
|
|
301
|
+
expect(decisions.length).toBe(2);
|
|
302
|
+
expect(decisions[0].phase).toBe('09');
|
|
303
|
+
expect(decisions[0].summary).toBe('Used GSDError pattern');
|
|
304
|
+
expect(decisions[0].rationale).toBe('Consistent with existing SDK errors');
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('parses blockers list', async () => {
|
|
308
|
+
const result = await stateSnapshot([], tmpDir);
|
|
309
|
+
const data = result.data as Record<string, unknown>;
|
|
310
|
+
const blockers = data.blockers as string[];
|
|
311
|
+
|
|
312
|
+
expect(Array.isArray(blockers)).toBe(true);
|
|
313
|
+
expect(blockers.length).toBe(2);
|
|
314
|
+
expect(blockers[0]).toContain('STATE.md parsing edge cases');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it('parses session info', async () => {
|
|
318
|
+
const result = await stateSnapshot([], tmpDir);
|
|
319
|
+
const data = result.data as Record<string, unknown>;
|
|
320
|
+
const session = data.session as Record<string, string | null>;
|
|
321
|
+
|
|
322
|
+
expect(session).toBeDefined();
|
|
323
|
+
expect(session.stopped_at).toBe('Completed 10-01-PLAN.md');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('returns error when STATE.md not found', async () => {
|
|
327
|
+
const emptyDir = await mkdtemp(join(tmpdir(), 'gsd-snap-empty-'));
|
|
328
|
+
await mkdir(join(emptyDir, '.planning'), { recursive: true });
|
|
329
|
+
|
|
330
|
+
const result = await stateSnapshot([], emptyDir);
|
|
331
|
+
const data = result.data as Record<string, unknown>;
|
|
332
|
+
|
|
333
|
+
expect(data.error).toBe('STATE.md not found');
|
|
334
|
+
await rm(emptyDir, { recursive: true, force: true });
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it('returns numeric fields as numbers', async () => {
|
|
338
|
+
const result = await stateSnapshot([], tmpDir);
|
|
339
|
+
const data = result.data as Record<string, unknown>;
|
|
340
|
+
|
|
341
|
+
// progress_percent may be null if no Progress: N% format found
|
|
342
|
+
// but total_phases etc. should be numbers when present
|
|
343
|
+
if (data.total_phases !== null) {
|
|
344
|
+
expect(typeof data.total_phases).toBe('number');
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
});
|