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,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for prompt-builder.ts
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import {
|
|
7
|
+
buildExecutorPrompt,
|
|
8
|
+
parseAgentTools,
|
|
9
|
+
parseAgentRole,
|
|
10
|
+
DEFAULT_ALLOWED_TOOLS,
|
|
11
|
+
} from './prompt-builder.js';
|
|
12
|
+
import type { ParsedPlan, PlanFrontmatter, MustHaves } from './types.js';
|
|
13
|
+
|
|
14
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
function makePlan(overrides: Partial<ParsedPlan> = {}): ParsedPlan {
|
|
17
|
+
const defaultFrontmatter: PlanFrontmatter = {
|
|
18
|
+
phase: '01-auth',
|
|
19
|
+
plan: '01',
|
|
20
|
+
type: 'execute',
|
|
21
|
+
wave: 1,
|
|
22
|
+
depends_on: [],
|
|
23
|
+
files_modified: [],
|
|
24
|
+
autonomous: true,
|
|
25
|
+
requirements: ['AUTH-01'],
|
|
26
|
+
must_haves: { truths: [], artifacts: [], key_links: [] },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
frontmatter: { ...defaultFrontmatter, ...overrides.frontmatter },
|
|
31
|
+
objective: overrides.objective ?? 'Implement JWT authentication with refresh tokens',
|
|
32
|
+
execution_context: overrides.execution_context ?? [],
|
|
33
|
+
context_refs: overrides.context_refs ?? [],
|
|
34
|
+
tasks: overrides.tasks ?? [
|
|
35
|
+
{
|
|
36
|
+
type: 'auto',
|
|
37
|
+
name: 'Create auth module',
|
|
38
|
+
files: ['src/auth.ts'],
|
|
39
|
+
read_first: ['src/types.ts'],
|
|
40
|
+
action: 'Create the auth module with login and refresh endpoints',
|
|
41
|
+
verify: 'npm test -- --filter auth',
|
|
42
|
+
acceptance_criteria: ['JWT tokens issued on login', 'Refresh tokens rotate correctly'],
|
|
43
|
+
done: 'Auth module created and tests pass',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: 'auto',
|
|
47
|
+
name: 'Add middleware',
|
|
48
|
+
files: ['src/middleware.ts'],
|
|
49
|
+
read_first: [],
|
|
50
|
+
action: 'Create auth middleware for protected routes',
|
|
51
|
+
verify: 'npm test -- --filter middleware',
|
|
52
|
+
acceptance_criteria: [],
|
|
53
|
+
done: 'Middleware validates JWT on protected routes',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
raw: '',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const SAMPLE_AGENT_DEF = `---
|
|
61
|
+
name: gsd-executor
|
|
62
|
+
description: Executes GSD plans
|
|
63
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
64
|
+
permissionMode: acceptEdits
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
<role>
|
|
68
|
+
You are a GSD plan executor. You execute PLAN.md files atomically.
|
|
69
|
+
</role>
|
|
70
|
+
|
|
71
|
+
<execution_flow>
|
|
72
|
+
Some flow content
|
|
73
|
+
</execution_flow>`;
|
|
74
|
+
|
|
75
|
+
// ─── parseAgentTools ─────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
describe('parseAgentTools', () => {
|
|
78
|
+
it('extracts tools from agent definition frontmatter', () => {
|
|
79
|
+
const tools = parseAgentTools(SAMPLE_AGENT_DEF);
|
|
80
|
+
expect(tools).toEqual(['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob']);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('returns defaults when no frontmatter found', () => {
|
|
84
|
+
const tools = parseAgentTools('Just some text without frontmatter');
|
|
85
|
+
expect(tools).toEqual(DEFAULT_ALLOWED_TOOLS);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('returns defaults when frontmatter has no tools key', () => {
|
|
89
|
+
const def = `---\nname: test\n---\nContent`;
|
|
90
|
+
const tools = parseAgentTools(def);
|
|
91
|
+
expect(tools).toEqual(DEFAULT_ALLOWED_TOOLS);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('handles empty tools value', () => {
|
|
95
|
+
const def = `---\ntools: \n---`;
|
|
96
|
+
const tools = parseAgentTools(def);
|
|
97
|
+
expect(tools).toEqual(DEFAULT_ALLOWED_TOOLS);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// ─── parseAgentRole ──────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
describe('parseAgentRole', () => {
|
|
104
|
+
it('extracts role content from agent definition', () => {
|
|
105
|
+
const role = parseAgentRole(SAMPLE_AGENT_DEF);
|
|
106
|
+
expect(role).toContain('GSD plan executor');
|
|
107
|
+
expect(role).toContain('PLAN.md files atomically');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('returns empty string when no role block', () => {
|
|
111
|
+
expect(parseAgentRole('No role block here')).toBe('');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// ─── buildExecutorPrompt ─────────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
describe('buildExecutorPrompt', () => {
|
|
118
|
+
it('includes the objective text', () => {
|
|
119
|
+
const plan = makePlan();
|
|
120
|
+
const prompt = buildExecutorPrompt(plan);
|
|
121
|
+
expect(prompt).toContain('Implement JWT authentication with refresh tokens');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('includes all task names', () => {
|
|
125
|
+
const plan = makePlan();
|
|
126
|
+
const prompt = buildExecutorPrompt(plan);
|
|
127
|
+
expect(prompt).toContain('Create auth module');
|
|
128
|
+
expect(prompt).toContain('Add middleware');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('includes task actions', () => {
|
|
132
|
+
const plan = makePlan();
|
|
133
|
+
const prompt = buildExecutorPrompt(plan);
|
|
134
|
+
expect(prompt).toContain('Create the auth module with login and refresh endpoints');
|
|
135
|
+
expect(prompt).toContain('Create auth middleware for protected routes');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('includes task verification commands', () => {
|
|
139
|
+
const plan = makePlan();
|
|
140
|
+
const prompt = buildExecutorPrompt(plan);
|
|
141
|
+
expect(prompt).toContain('npm test -- --filter auth');
|
|
142
|
+
expect(prompt).toContain('npm test -- --filter middleware');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('includes task file references', () => {
|
|
146
|
+
const plan = makePlan();
|
|
147
|
+
const prompt = buildExecutorPrompt(plan);
|
|
148
|
+
expect(prompt).toContain('src/auth.ts');
|
|
149
|
+
expect(prompt).toContain('src/types.ts');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('includes acceptance criteria', () => {
|
|
153
|
+
const plan = makePlan();
|
|
154
|
+
const prompt = buildExecutorPrompt(plan);
|
|
155
|
+
expect(prompt).toContain('JWT tokens issued on login');
|
|
156
|
+
expect(prompt).toContain('Refresh tokens rotate correctly');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('includes SUMMARY.md creation instruction', () => {
|
|
160
|
+
const plan = makePlan();
|
|
161
|
+
const prompt = buildExecutorPrompt(plan);
|
|
162
|
+
expect(prompt).toContain('SUMMARY.md');
|
|
163
|
+
expect(prompt).toContain('Create a SUMMARY.md file');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('includes sequential execution instruction', () => {
|
|
167
|
+
const plan = makePlan();
|
|
168
|
+
const prompt = buildExecutorPrompt(plan);
|
|
169
|
+
expect(prompt).toContain('Execute these tasks sequentially');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('handles plan with no tasks gracefully', () => {
|
|
173
|
+
const plan = makePlan({ tasks: [] });
|
|
174
|
+
const prompt = buildExecutorPrompt(plan);
|
|
175
|
+
expect(prompt).toContain('No tasks defined');
|
|
176
|
+
expect(prompt).toContain('SUMMARY.md');
|
|
177
|
+
// Should not throw
|
|
178
|
+
expect(prompt.length).toBeGreaterThan(0);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('includes context references when present', () => {
|
|
182
|
+
const plan = makePlan({
|
|
183
|
+
context_refs: ['src/config.ts', 'docs/architecture.md'],
|
|
184
|
+
});
|
|
185
|
+
const prompt = buildExecutorPrompt(plan);
|
|
186
|
+
expect(prompt).toContain('@src/config.ts');
|
|
187
|
+
expect(prompt).toContain('@docs/architecture.md');
|
|
188
|
+
expect(prompt).toContain('Read these files for context');
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('omits context section when no refs', () => {
|
|
192
|
+
const plan = makePlan({ context_refs: [] });
|
|
193
|
+
const prompt = buildExecutorPrompt(plan);
|
|
194
|
+
expect(prompt).not.toContain('Context Files');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('includes plan metadata', () => {
|
|
198
|
+
const plan = makePlan();
|
|
199
|
+
const prompt = buildExecutorPrompt(plan);
|
|
200
|
+
expect(prompt).toContain('Phase: 01-auth');
|
|
201
|
+
expect(prompt).toContain('Plan: 01');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('includes must-have truths when present', () => {
|
|
205
|
+
const plan = makePlan({
|
|
206
|
+
frontmatter: {
|
|
207
|
+
phase: '01',
|
|
208
|
+
plan: '01',
|
|
209
|
+
type: 'execute',
|
|
210
|
+
wave: 1,
|
|
211
|
+
depends_on: [],
|
|
212
|
+
files_modified: [],
|
|
213
|
+
autonomous: true,
|
|
214
|
+
requirements: [],
|
|
215
|
+
must_haves: {
|
|
216
|
+
truths: ['All endpoints require JWT auth', 'Tokens expire after 15 minutes'],
|
|
217
|
+
artifacts: [],
|
|
218
|
+
key_links: [],
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
const prompt = buildExecutorPrompt(plan);
|
|
223
|
+
expect(prompt).toContain('All endpoints require JWT auth');
|
|
224
|
+
expect(prompt).toContain('Tokens expire after 15 minutes');
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('includes must-have artifacts', () => {
|
|
228
|
+
const plan = makePlan({
|
|
229
|
+
frontmatter: {
|
|
230
|
+
phase: '01',
|
|
231
|
+
plan: '01',
|
|
232
|
+
type: 'execute',
|
|
233
|
+
wave: 1,
|
|
234
|
+
depends_on: [],
|
|
235
|
+
files_modified: [],
|
|
236
|
+
autonomous: true,
|
|
237
|
+
requirements: [],
|
|
238
|
+
must_haves: {
|
|
239
|
+
truths: [],
|
|
240
|
+
artifacts: [{ path: 'src/auth.ts', provides: 'JWT auth module' }],
|
|
241
|
+
key_links: [],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
const prompt = buildExecutorPrompt(plan);
|
|
246
|
+
expect(prompt).toContain('`src/auth.ts`');
|
|
247
|
+
expect(prompt).toContain('JWT auth module');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it('includes must-have key_links', () => {
|
|
251
|
+
const plan = makePlan({
|
|
252
|
+
frontmatter: {
|
|
253
|
+
phase: '01',
|
|
254
|
+
plan: '01',
|
|
255
|
+
type: 'execute',
|
|
256
|
+
wave: 1,
|
|
257
|
+
depends_on: [],
|
|
258
|
+
files_modified: [],
|
|
259
|
+
autonomous: true,
|
|
260
|
+
requirements: [],
|
|
261
|
+
must_haves: {
|
|
262
|
+
truths: [],
|
|
263
|
+
artifacts: [],
|
|
264
|
+
key_links: [{ from: 'auth.ts', to: 'middleware.ts', via: 'import' }],
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
const prompt = buildExecutorPrompt(plan);
|
|
269
|
+
expect(prompt).toContain('auth.ts → middleware.ts via import');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('includes role from agent definition when provided', () => {
|
|
273
|
+
const plan = makePlan();
|
|
274
|
+
const prompt = buildExecutorPrompt(plan, SAMPLE_AGENT_DEF);
|
|
275
|
+
expect(prompt).toContain('## Role');
|
|
276
|
+
expect(prompt).toContain('GSD plan executor');
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it('works without agent definition', () => {
|
|
280
|
+
const plan = makePlan();
|
|
281
|
+
const prompt = buildExecutorPrompt(plan);
|
|
282
|
+
// Should still produce a valid prompt without role section
|
|
283
|
+
expect(prompt).toContain('## Objective');
|
|
284
|
+
expect(prompt).toContain('## Tasks');
|
|
285
|
+
expect(prompt).not.toContain('## Role');
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('provides fallback objective when plan has empty objective', () => {
|
|
289
|
+
const plan = makePlan({ objective: '' });
|
|
290
|
+
const prompt = buildExecutorPrompt(plan);
|
|
291
|
+
expect(prompt).toContain('Execute plan: 01');
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('includes done criteria for tasks', () => {
|
|
295
|
+
const plan = makePlan();
|
|
296
|
+
const prompt = buildExecutorPrompt(plan);
|
|
297
|
+
expect(prompt).toContain('Auth module created and tests pass');
|
|
298
|
+
expect(prompt).toContain('Middleware validates JWT on protected routes');
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('includes commit instruction in completion section', () => {
|
|
302
|
+
const plan = makePlan();
|
|
303
|
+
const prompt = buildExecutorPrompt(plan);
|
|
304
|
+
expect(prompt).toContain('Commit the SUMMARY.md');
|
|
305
|
+
});
|
|
306
|
+
});
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt builder — assembles executor prompts from parsed plans.
|
|
3
|
+
*
|
|
4
|
+
* Converts a ParsedPlan into a structured prompt that tells the
|
|
5
|
+
* executor agent exactly what to do: follow the tasks sequentially,
|
|
6
|
+
* verify each one, and produce a SUMMARY.md at the end.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ParsedPlan, PlanTask } from './types.js';
|
|
10
|
+
|
|
11
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
const DEFAULT_ALLOWED_TOOLS = ['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob'];
|
|
14
|
+
|
|
15
|
+
// ─── Agent definition parsing ────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Extract the tools list from a gsd-executor.md agent definition.
|
|
19
|
+
* Falls back to DEFAULT_ALLOWED_TOOLS if parsing fails.
|
|
20
|
+
*/
|
|
21
|
+
export function parseAgentTools(agentDef: string): string[] {
|
|
22
|
+
// Look for "tools:" in the YAML frontmatter
|
|
23
|
+
const frontmatterMatch = agentDef.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
24
|
+
if (!frontmatterMatch) return DEFAULT_ALLOWED_TOOLS;
|
|
25
|
+
|
|
26
|
+
const toolsMatch = frontmatterMatch[1].match(/^tools:\s*(.+)$/m);
|
|
27
|
+
if (!toolsMatch) return DEFAULT_ALLOWED_TOOLS;
|
|
28
|
+
|
|
29
|
+
const tools = toolsMatch[1]
|
|
30
|
+
.split(',')
|
|
31
|
+
.map((t) => t.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
|
|
34
|
+
return tools.length > 0 ? tools : DEFAULT_ALLOWED_TOOLS;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Extract the role instructions from a gsd-executor.md agent definition.
|
|
39
|
+
* Returns the <role>...</role> block content, or empty string.
|
|
40
|
+
*/
|
|
41
|
+
export function parseAgentRole(agentDef: string): string {
|
|
42
|
+
const match = agentDef.match(/<role>([\s\S]*?)<\/role>/i);
|
|
43
|
+
return match ? match[1].trim() : '';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ─── Prompt assembly ─────────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Format a single task into a prompt block.
|
|
50
|
+
*/
|
|
51
|
+
function formatTask(task: PlanTask, index: number): string {
|
|
52
|
+
const lines: string[] = [];
|
|
53
|
+
lines.push(`### Task ${index + 1}: ${task.name}`);
|
|
54
|
+
|
|
55
|
+
if (task.files.length > 0) {
|
|
56
|
+
lines.push(`**Files:** ${task.files.join(', ')}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (task.read_first.length > 0) {
|
|
60
|
+
lines.push(`**Read first:** ${task.read_first.join(', ')}`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push('**Action:**');
|
|
65
|
+
lines.push(task.action);
|
|
66
|
+
|
|
67
|
+
if (task.verify) {
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push('**Verify:**');
|
|
70
|
+
lines.push(task.verify);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (task.done) {
|
|
74
|
+
lines.push('');
|
|
75
|
+
lines.push('**Done when:**');
|
|
76
|
+
lines.push(task.done);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (task.acceptance_criteria.length > 0) {
|
|
80
|
+
lines.push('');
|
|
81
|
+
lines.push('**Acceptance criteria:**');
|
|
82
|
+
for (const criterion of task.acceptance_criteria) {
|
|
83
|
+
lines.push(`- ${criterion}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Build the executor prompt from a parsed plan and optional agent definition.
|
|
92
|
+
*
|
|
93
|
+
* The prompt instructs the executor to:
|
|
94
|
+
* 1. Follow the plan tasks sequentially
|
|
95
|
+
* 2. Run verification for each task
|
|
96
|
+
* 3. Commit each task individually
|
|
97
|
+
* 4. Produce a SUMMARY.md file on completion
|
|
98
|
+
*
|
|
99
|
+
* @param plan - Parsed plan structure from plan-parser
|
|
100
|
+
* @param agentDef - Raw content of gsd-executor.md agent definition (optional)
|
|
101
|
+
* @returns Assembled prompt string
|
|
102
|
+
*/
|
|
103
|
+
export function buildExecutorPrompt(plan: ParsedPlan, agentDef?: string): string {
|
|
104
|
+
const sections: string[] = [];
|
|
105
|
+
|
|
106
|
+
// ── Role instructions from agent definition ──
|
|
107
|
+
if (agentDef) {
|
|
108
|
+
const role = parseAgentRole(agentDef);
|
|
109
|
+
if (role) {
|
|
110
|
+
sections.push(`## Role\n\n${role}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ── Objective ──
|
|
115
|
+
if (plan.objective) {
|
|
116
|
+
sections.push(`## Objective\n\n${plan.objective}`);
|
|
117
|
+
} else {
|
|
118
|
+
sections.push(`## Objective\n\nExecute plan: ${plan.frontmatter.plan || plan.frontmatter.phase || 'unnamed'}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ── Plan metadata ──
|
|
122
|
+
const meta: string[] = [];
|
|
123
|
+
if (plan.frontmatter.phase) meta.push(`Phase: ${plan.frontmatter.phase}`);
|
|
124
|
+
if (plan.frontmatter.plan) meta.push(`Plan: ${plan.frontmatter.plan}`);
|
|
125
|
+
if (plan.frontmatter.type) meta.push(`Type: ${plan.frontmatter.type}`);
|
|
126
|
+
if (meta.length > 0) {
|
|
127
|
+
sections.push(`## Plan Info\n\n${meta.join('\n')}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── Context references ──
|
|
131
|
+
if (plan.context_refs.length > 0) {
|
|
132
|
+
const refs = plan.context_refs.map((r) => `- @${r}`).join('\n');
|
|
133
|
+
sections.push(`## Context Files\n\nRead these files for context before starting:\n${refs}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ── Tasks ──
|
|
137
|
+
if (plan.tasks.length > 0) {
|
|
138
|
+
const taskBlocks = plan.tasks.map((t, i) => formatTask(t, i)).join('\n\n---\n\n');
|
|
139
|
+
sections.push(`## Tasks\n\nExecute these tasks sequentially. For each task: read any referenced files, execute the action, run verification, confirm done criteria, then commit.\n\n${taskBlocks}`);
|
|
140
|
+
} else {
|
|
141
|
+
sections.push(`## Tasks\n\nNo tasks defined in this plan. Review the objective and determine if any actions are needed.`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ── Must-haves ──
|
|
145
|
+
if (plan.frontmatter.must_haves) {
|
|
146
|
+
const mh = plan.frontmatter.must_haves;
|
|
147
|
+
const parts: string[] = [];
|
|
148
|
+
|
|
149
|
+
if (mh.truths.length > 0) {
|
|
150
|
+
parts.push('**Truths (invariants):**');
|
|
151
|
+
for (const t of mh.truths) {
|
|
152
|
+
parts.push(`- ${t}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (mh.artifacts.length > 0) {
|
|
157
|
+
parts.push('**Required artifacts:**');
|
|
158
|
+
for (const a of mh.artifacts) {
|
|
159
|
+
parts.push(`- \`${a.path}\`: ${a.provides}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (mh.key_links.length > 0) {
|
|
164
|
+
parts.push('**Key links:**');
|
|
165
|
+
for (const l of mh.key_links) {
|
|
166
|
+
parts.push(`- ${l.from} → ${l.to} via ${l.via}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (parts.length > 0) {
|
|
171
|
+
sections.push(`## Must-Haves\n\n${parts.join('\n')}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ── Completion instructions ──
|
|
176
|
+
sections.push(
|
|
177
|
+
`## Completion\n\n` +
|
|
178
|
+
`After all tasks are complete:\n` +
|
|
179
|
+
`1. Run any overall verification or success criteria checks\n` +
|
|
180
|
+
`2. Create a SUMMARY.md file documenting:\n` +
|
|
181
|
+
` - One-line summary of what was accomplished\n` +
|
|
182
|
+
` - Tasks completed with commit hashes\n` +
|
|
183
|
+
` - Any deviations from the plan\n` +
|
|
184
|
+
` - Files created or modified\n` +
|
|
185
|
+
` - Known issues (if any)\n` +
|
|
186
|
+
`3. Commit the SUMMARY.md\n` +
|
|
187
|
+
`4. Report completion`,
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
return sections.join('\n\n');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export { DEFAULT_ALLOWED_TOOLS };
|