gsd-pi 2.10.12 → 2.12.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/dist/bundled-extension-paths.d.ts +2 -0
- package/dist/bundled-extension-paths.js +10 -0
- package/dist/loader.js +45 -28
- package/dist/onboarding.js +100 -0
- package/dist/resource-loader.js +12 -3
- package/dist/resources/GSD-WORKFLOW.md +661 -0
- package/dist/resources/agents/researcher.md +29 -0
- package/dist/resources/agents/scout.md +56 -0
- package/dist/resources/agents/worker.md +31 -0
- package/dist/resources/extensions/ask-user-questions.ts +289 -0
- package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
- package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
- package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
- package/dist/resources/extensions/async-jobs/index.ts +133 -0
- package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
- package/dist/resources/extensions/bg-shell/index.ts +3179 -0
- package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
- package/dist/resources/extensions/browser-tools/capture.ts +165 -0
- package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
- package/dist/resources/extensions/browser-tools/core.js +1057 -0
- package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
- package/dist/resources/extensions/browser-tools/index.ts +51 -0
- package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
- package/dist/resources/extensions/browser-tools/package.json +24 -0
- package/dist/resources/extensions/browser-tools/refs.ts +264 -0
- package/dist/resources/extensions/browser-tools/settle.ts +197 -0
- package/dist/resources/extensions/browser-tools/state.ts +408 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
- package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
- package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
- package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
- package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
- package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
- package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
- package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
- package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
- package/dist/resources/extensions/browser-tools/utils.ts +660 -0
- package/dist/resources/extensions/context7/index.ts +428 -0
- package/dist/resources/extensions/context7/package.json +11 -0
- package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
- package/dist/resources/extensions/google-search/index.ts +336 -0
- package/dist/resources/extensions/google-search/package.json +9 -0
- package/dist/resources/extensions/gsd/activity-log.ts +116 -0
- package/dist/resources/extensions/gsd/auto.ts +3732 -0
- package/dist/resources/extensions/gsd/commands.ts +544 -0
- package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
- package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
- package/dist/resources/extensions/gsd/doctor.ts +766 -0
- package/dist/resources/extensions/gsd/exit-command.ts +18 -0
- package/dist/resources/extensions/gsd/files.ts +857 -0
- package/dist/resources/extensions/gsd/git-service.ts +904 -0
- package/dist/resources/extensions/gsd/gitignore.ts +200 -0
- package/dist/resources/extensions/gsd/guided-flow.ts +1054 -0
- package/dist/resources/extensions/gsd/index.ts +735 -0
- package/dist/resources/extensions/gsd/metrics.ts +374 -0
- package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
- package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
- package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
- package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
- package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
- package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
- package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
- package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
- package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
- package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
- package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
- package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
- package/dist/resources/extensions/gsd/package.json +11 -0
- package/dist/resources/extensions/gsd/paths.ts +339 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +449 -0
- package/dist/resources/extensions/gsd/preferences.ts +988 -0
- package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
- package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
- package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
- package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
- package/dist/resources/extensions/gsd/prompts/system.md +190 -0
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
- package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
- package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
- package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
- package/dist/resources/extensions/gsd/state.ts +569 -0
- package/dist/resources/extensions/gsd/templates/context.md +76 -0
- package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
- package/dist/resources/extensions/gsd/templates/plan.md +131 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
- package/dist/resources/extensions/gsd/templates/project.md +31 -0
- package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
- package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
- package/dist/resources/extensions/gsd/templates/research.md +46 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
- package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
- package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
- package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
- package/dist/resources/extensions/gsd/templates/state.md +19 -0
- package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
- package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
- package/dist/resources/extensions/gsd/templates/uat.md +54 -0
- package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
- package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
- package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
- package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
- package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
- package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
- package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
- package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
- package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
- package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
- package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
- package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
- package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
- package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
- package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
- package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
- package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
- package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
- package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
- package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
- package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
- package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
- package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
- package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
- package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
- package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
- package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
- package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
- package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
- package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
- package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
- package/dist/resources/extensions/gsd/types.ts +296 -0
- package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
- package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
- package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
- package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
- package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
- package/dist/resources/extensions/mac-tools/index.ts +852 -0
- package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
- package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
- package/dist/resources/extensions/mcporter/index.ts +429 -0
- package/dist/resources/extensions/remote-questions/config.ts +81 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
- package/dist/resources/extensions/remote-questions/format.ts +163 -0
- package/dist/resources/extensions/remote-questions/manager.ts +192 -0
- package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
- package/dist/resources/extensions/remote-questions/status.ts +31 -0
- package/dist/resources/extensions/remote-questions/store.ts +77 -0
- package/dist/resources/extensions/remote-questions/types.ts +75 -0
- package/dist/resources/extensions/search-the-web/cache.ts +78 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
- package/dist/resources/extensions/search-the-web/format.ts +258 -0
- package/dist/resources/extensions/search-the-web/http.ts +238 -0
- package/dist/resources/extensions/search-the-web/index.ts +65 -0
- package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
- package/dist/resources/extensions/search-the-web/provider.ts +136 -0
- package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
- package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
- package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
- package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
- package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
- package/dist/resources/extensions/shared/interview-ui.ts +613 -0
- package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
- package/dist/resources/extensions/shared/progress-widget.ts +282 -0
- package/dist/resources/extensions/shared/terminal.ts +23 -0
- package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
- package/dist/resources/extensions/shared/ui.ts +400 -0
- package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
- package/dist/resources/extensions/slash-commands/audit.ts +88 -0
- package/dist/resources/extensions/slash-commands/clear.ts +10 -0
- package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
- package/dist/resources/extensions/slash-commands/index.ts +12 -0
- package/dist/resources/extensions/subagent/agents.ts +126 -0
- package/dist/resources/extensions/subagent/index.ts +1072 -0
- package/dist/resources/extensions/subagent/isolation.ts +498 -0
- package/dist/resources/extensions/ttsr/index.ts +163 -0
- package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
- package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
- package/dist/resources/extensions/universal-config/discovery.ts +78 -0
- package/dist/resources/extensions/universal-config/format.ts +160 -0
- package/dist/resources/extensions/universal-config/index.ts +118 -0
- package/dist/resources/extensions/universal-config/package.json +11 -0
- package/dist/resources/extensions/universal-config/scanners.ts +579 -0
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
- package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
- package/dist/resources/extensions/universal-config/tools.ts +60 -0
- package/dist/resources/extensions/universal-config/types.ts +116 -0
- package/dist/resources/extensions/voice/index.ts +271 -0
- package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
- package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
- package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
- package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
- package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
- package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
- package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
- package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
- package/dist/resources/skills/frontend-design/SKILL.md +45 -0
- package/dist/resources/skills/github-workflows/SKILL.md +92 -0
- package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
- package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
- package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
- package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
- package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
- package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
- package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
- package/dist/resources/skills/swiftui/SKILL.md +208 -0
- package/dist/resources/skills/swiftui/references/animations.md +921 -0
- package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
- package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
- package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
- package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
- package/dist/resources/skills/swiftui/references/performance.md +1706 -0
- package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
- package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
- package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
- package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
- package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
- package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
- package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
- package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
- package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
- package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
- package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
- package/dist/wizard.js +1 -0
- package/package.json +8 -6
- package/packages/native/dist/fd/index.d.ts +1 -0
- package/packages/native/dist/fd/index.js +1 -0
- package/packages/native/dist/grep/index.d.ts +2 -1
- package/packages/native/dist/grep/index.js +1 -0
- package/packages/native/src/__tests__/fd.test.mjs +35 -0
- package/packages/native/src/__tests__/grep.test.mjs +26 -9
- package/packages/native/src/fd/index.ts +1 -0
- package/packages/native/src/grep/index.ts +3 -2
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +169 -55
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +13 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +16 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +91 -1
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +273 -63
- package/packages/pi-agent-core/src/agent.ts +24 -0
- package/packages/pi-agent-core/src/types.ts +98 -0
- package/packages/pi-ai/dist/env-api-keys.js +2 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +314 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +236 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +2 -0
- package/packages/pi-ai/src/models.generated.ts +236 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
- package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
- package/packages/pi-ai/src/types.ts +2 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +1 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +1 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
- package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
- package/packages/pi-coding-agent/src/core/index.ts +1 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
- package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
- package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
- package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +3 -4
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +7 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +57 -50
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/autocomplete.ts +3 -5
- package/packages/pi-tui/src/components/editor.ts +70 -49
- package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
- package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/pkg/dist/core/export-html/index.d.ts +37 -0
- package/pkg/dist/core/export-html/index.d.ts.map +1 -0
- package/pkg/dist/core/export-html/index.js +223 -0
- package/pkg/dist/core/export-html/index.js.map +1 -0
- package/pkg/dist/core/export-html/template.css +971 -0
- package/pkg/dist/core/export-html/template.html +54 -0
- package/pkg/dist/core/export-html/template.js +1583 -0
- package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
- package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/pkg/dist/core/export-html/tool-renderer.js +70 -0
- package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
- package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
- package/scripts/postinstall.js +30 -17
- package/src/resources/extensions/bg-shell/index.ts +51 -7
- package/src/resources/extensions/gsd/activity-log.ts +61 -14
- package/src/resources/extensions/gsd/auto.ts +288 -19
- package/src/resources/extensions/gsd/commands.ts +9 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
- package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
- package/src/resources/extensions/gsd/doctor.ts +60 -3
- package/src/resources/extensions/gsd/files.ts +45 -1
- package/src/resources/extensions/gsd/git-service.ts +46 -41
- package/src/resources/extensions/gsd/guided-flow.ts +81 -9
- package/src/resources/extensions/gsd/index.ts +62 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
- package/src/resources/extensions/gsd/paths.ts +35 -4
- package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
- package/src/resources/extensions/gsd/preferences.ts +232 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
- package/src/resources/extensions/gsd/prompts/queue.md +3 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/state.ts +130 -18
- package/src/resources/extensions/gsd/templates/context.md +1 -1
- package/src/resources/extensions/gsd/templates/state.md +3 -3
- package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
- package/src/resources/extensions/gsd/types.ts +109 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
- package/src/resources/extensions/gsd/worktree.ts +5 -4
- package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
- package/src/resources/extensions/search-the-web/native-search.ts +32 -23
- package/src/resources/extensions/search-the-web/provider.ts +19 -2
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
- package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
- package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
- package/src/resources/extensions/subagent/index.ts +2 -1
- package/src/resources/skills/github-workflows/SKILL.md +5 -0
- package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
- package/dist/resources/extensions/gsd/git-service.js +0 -756
- package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
- package/dist/resources/extensions/gsd/preferences.js +0 -616
- package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
- package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
- package/dist/resources/extensions/remote-questions/config.js +0 -68
- package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
- package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
- package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
- package/dist/resources/extensions/remote-questions/format.js +0 -119
- package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
- package/dist/resources/extensions/remote-questions/manager.js +0 -161
- package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
- package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
- package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
- package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
- package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
- package/dist/resources/extensions/remote-questions/status.js +0 -25
- package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
- package/dist/resources/extensions/remote-questions/store.js +0 -66
- package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
- package/dist/resources/extensions/remote-questions/types.js +0 -4
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests: deriveState, indexWorkspace, inlinePriorMilestoneSummary,
|
|
3
|
+
* dispatch-guard, and branch operations with unique-format (M001-abc123) and
|
|
4
|
+
* mixed classic+unique milestone directories.
|
|
5
|
+
*
|
|
6
|
+
* Uses real filesystem and git fixtures — no mocking.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { execSync } from 'node:child_process';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
|
|
14
|
+
import { deriveState } from '../state.ts';
|
|
15
|
+
import { indexWorkspace } from '../workspace-index.ts';
|
|
16
|
+
import { inlinePriorMilestoneSummary } from '../files.ts';
|
|
17
|
+
import { getPriorSliceCompletionBlocker } from '../dispatch-guard.ts';
|
|
18
|
+
import {
|
|
19
|
+
ensureSliceBranch,
|
|
20
|
+
getCurrentBranch,
|
|
21
|
+
getSliceBranchName,
|
|
22
|
+
mergeSliceToMain,
|
|
23
|
+
parseSliceBranch,
|
|
24
|
+
switchToMain,
|
|
25
|
+
} from '../worktree.ts';
|
|
26
|
+
import { clearPathCache } from '../paths.ts';
|
|
27
|
+
import { createTestContext } from './test-helpers.ts';
|
|
28
|
+
|
|
29
|
+
// ─── Assertion Helpers ────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
32
|
+
// ─── Fixture Helpers ──────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
function createFixtureBase(): string {
|
|
35
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-integration-mixed-'));
|
|
36
|
+
mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
|
|
37
|
+
return base;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writeRoadmap(base: string, mid: string, content: string): void {
|
|
41
|
+
const dir = join(base, '.gsd', 'milestones', mid);
|
|
42
|
+
mkdirSync(dir, { recursive: true });
|
|
43
|
+
writeFileSync(join(dir, `${mid}-ROADMAP.md`), content);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function writePlan(base: string, mid: string, sid: string, content: string): void {
|
|
47
|
+
const dir = join(base, '.gsd', 'milestones', mid, 'slices', sid);
|
|
48
|
+
mkdirSync(join(dir, 'tasks'), { recursive: true });
|
|
49
|
+
writeFileSync(join(dir, `${sid}-PLAN.md`), content);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function writeMilestoneSummary(base: string, mid: string, content: string): void {
|
|
53
|
+
const dir = join(base, '.gsd', 'milestones', mid);
|
|
54
|
+
mkdirSync(dir, { recursive: true });
|
|
55
|
+
writeFileSync(join(dir, `${mid}-SUMMARY.md`), content);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function cleanup(base: string): void {
|
|
59
|
+
rmSync(base, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function run(command: string, cwd: string): string {
|
|
63
|
+
return execSync(command, { cwd, stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8' }).trim();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function createGitRepo(): string {
|
|
67
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-integration-git-'));
|
|
68
|
+
mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
|
|
69
|
+
run('git init -b main', base);
|
|
70
|
+
run("git config user.name 'Integration Test'", base);
|
|
71
|
+
run("git config user.email 'test@example.com'", base);
|
|
72
|
+
return base;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
76
|
+
// Test Groups
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
78
|
+
|
|
79
|
+
async function main(): Promise<void> {
|
|
80
|
+
|
|
81
|
+
// ─── Group 1: deriveState with new-format-only milestones ─────────────
|
|
82
|
+
console.log('\n=== Group 1: deriveState with new-format-only milestones ===');
|
|
83
|
+
{
|
|
84
|
+
const base = createFixtureBase();
|
|
85
|
+
try {
|
|
86
|
+
// Create M001-abc123 with roadmap + 2 slices (S01 complete, S02 in-progress)
|
|
87
|
+
writeRoadmap(base, 'M001-abc123', `# M001-abc123: Test Feature
|
|
88
|
+
|
|
89
|
+
**Vision:** Test vision
|
|
90
|
+
|
|
91
|
+
## Slices
|
|
92
|
+
- [x] **S01: Setup** \`risk:low\` \`depends:[]\`
|
|
93
|
+
> Foundation work
|
|
94
|
+
- [ ] **S02: Core Logic** \`risk:medium\` \`depends:[]\`
|
|
95
|
+
> Main implementation
|
|
96
|
+
`);
|
|
97
|
+
|
|
98
|
+
// S01 is complete — write a plan with all tasks done
|
|
99
|
+
writePlan(base, 'M001-abc123', 'S01', `# S01: Setup
|
|
100
|
+
|
|
101
|
+
**Goal:** Setup
|
|
102
|
+
**Demo:** Setup works
|
|
103
|
+
|
|
104
|
+
## Tasks
|
|
105
|
+
- [x] **T01: Init** \`est:10m\`
|
|
106
|
+
Initialize project.
|
|
107
|
+
`);
|
|
108
|
+
|
|
109
|
+
// S02 is in-progress — write a plan with first task not done
|
|
110
|
+
writePlan(base, 'M001-abc123', 'S02', `# S02: Core Logic
|
|
111
|
+
|
|
112
|
+
**Goal:** Implement core
|
|
113
|
+
**Demo:** Core works
|
|
114
|
+
|
|
115
|
+
## Tasks
|
|
116
|
+
- [ ] **T01: Build core** \`est:20m\`
|
|
117
|
+
Build the core logic.
|
|
118
|
+
- [ ] **T02: Test core** \`est:15m\`
|
|
119
|
+
Test the core logic.
|
|
120
|
+
`);
|
|
121
|
+
|
|
122
|
+
const state = await deriveState(base);
|
|
123
|
+
|
|
124
|
+
// Phase should be executing (active milestone with incomplete slice + plan + tasks)
|
|
125
|
+
assertEq(state.phase, 'executing', 'G1: phase is executing');
|
|
126
|
+
assertTrue(state.activeMilestone !== null, 'G1: activeMilestone is not null');
|
|
127
|
+
assertEq(state.activeMilestone?.id, 'M001-abc123', 'G1: activeMilestone id is M001-abc123');
|
|
128
|
+
assertEq(state.activeMilestone?.title, 'Test Feature', 'G1: title stripped to Test Feature');
|
|
129
|
+
|
|
130
|
+
// Registry
|
|
131
|
+
assertEq(state.registry.length, 1, 'G1: registry has 1 entry');
|
|
132
|
+
assertEq(state.registry[0]?.id, 'M001-abc123', 'G1: registry entry id');
|
|
133
|
+
assertEq(state.registry[0]?.status, 'active', 'G1: registry entry status is active');
|
|
134
|
+
assertEq(state.registry[0]?.title, 'Test Feature', 'G1: registry title stripped');
|
|
135
|
+
|
|
136
|
+
// Active slice
|
|
137
|
+
assertTrue(state.activeSlice !== null, 'G1: activeSlice is not null');
|
|
138
|
+
assertEq(state.activeSlice?.id, 'S02', 'G1: activeSlice is S02');
|
|
139
|
+
|
|
140
|
+
// Progress
|
|
141
|
+
assertEq(state.progress?.milestones?.done, 0, 'G1: milestones done = 0');
|
|
142
|
+
assertEq(state.progress?.milestones?.total, 1, 'G1: milestones total = 1');
|
|
143
|
+
} finally {
|
|
144
|
+
cleanup(base);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ─── Group 2: deriveState with mixed-format milestones ────────────────
|
|
149
|
+
console.log('\n=== Group 2: deriveState with mixed old+new format milestones ===');
|
|
150
|
+
{
|
|
151
|
+
const base = createFixtureBase();
|
|
152
|
+
try {
|
|
153
|
+
// M001 — complete milestone (all slices done + summary)
|
|
154
|
+
writeRoadmap(base, 'M001', `# M001: Legacy Feature
|
|
155
|
+
|
|
156
|
+
**Vision:** Legacy vision
|
|
157
|
+
|
|
158
|
+
## Slices
|
|
159
|
+
- [x] **S01: Only Slice** \`risk:low\` \`depends:[]\`
|
|
160
|
+
> Done
|
|
161
|
+
`);
|
|
162
|
+
|
|
163
|
+
writePlan(base, 'M001', 'S01', `# S01: Only Slice
|
|
164
|
+
|
|
165
|
+
**Goal:** Done
|
|
166
|
+
**Demo:** Works
|
|
167
|
+
|
|
168
|
+
## Tasks
|
|
169
|
+
- [x] **T01: Do it** \`est:10m\`
|
|
170
|
+
Did it.
|
|
171
|
+
`);
|
|
172
|
+
|
|
173
|
+
writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
|
|
174
|
+
|
|
175
|
+
**One-liner summary**
|
|
176
|
+
|
|
177
|
+
## What Happened
|
|
178
|
+
Everything worked.
|
|
179
|
+
`);
|
|
180
|
+
|
|
181
|
+
// M002-abc123 — active milestone (incomplete slice)
|
|
182
|
+
writeRoadmap(base, 'M002-abc123', `# M002-abc123: New Feature
|
|
183
|
+
|
|
184
|
+
**Vision:** New vision
|
|
185
|
+
|
|
186
|
+
## Slices
|
|
187
|
+
- [x] **S01: Setup** \`risk:low\` \`depends:[]\`
|
|
188
|
+
> Setup done
|
|
189
|
+
- [ ] **S02: Implementation** \`risk:medium\` \`depends:[]\`
|
|
190
|
+
> Main work
|
|
191
|
+
`);
|
|
192
|
+
|
|
193
|
+
writePlan(base, 'M002-abc123', 'S01', `# S01: Setup
|
|
194
|
+
|
|
195
|
+
**Goal:** Setup
|
|
196
|
+
**Demo:** Setup done
|
|
197
|
+
|
|
198
|
+
## Tasks
|
|
199
|
+
- [x] **T01: Init** \`est:10m\`
|
|
200
|
+
Init done.
|
|
201
|
+
`);
|
|
202
|
+
|
|
203
|
+
writePlan(base, 'M002-abc123', 'S02', `# S02: Implementation
|
|
204
|
+
|
|
205
|
+
**Goal:** Implement
|
|
206
|
+
**Demo:** Works
|
|
207
|
+
|
|
208
|
+
## Tasks
|
|
209
|
+
- [ ] **T01: Build** \`est:20m\`
|
|
210
|
+
Build it.
|
|
211
|
+
`);
|
|
212
|
+
|
|
213
|
+
const state = await deriveState(base);
|
|
214
|
+
|
|
215
|
+
// Registry — should have 2 entries sorted by seq number
|
|
216
|
+
assertEq(state.registry.length, 2, 'G2: registry has 2 entries');
|
|
217
|
+
assertEq(state.registry[0]?.id, 'M001', 'G2: registry[0] is M001 (sorted first)');
|
|
218
|
+
assertEq(state.registry[1]?.id, 'M002-abc123', 'G2: registry[1] is M002-abc123 (sorted second)');
|
|
219
|
+
|
|
220
|
+
// M001 is complete
|
|
221
|
+
assertEq(state.registry[0]?.status, 'complete', 'G2: M001 status is complete');
|
|
222
|
+
assertEq(state.registry[0]?.title, 'Legacy Feature', 'G2: M001 title stripped');
|
|
223
|
+
|
|
224
|
+
// M002-abc123 is active
|
|
225
|
+
assertEq(state.registry[1]?.status, 'active', 'G2: M002-abc123 status is active');
|
|
226
|
+
assertEq(state.registry[1]?.title, 'New Feature', 'G2: M002-abc123 title stripped');
|
|
227
|
+
|
|
228
|
+
// Active milestone
|
|
229
|
+
assertTrue(state.activeMilestone !== null, 'G2: activeMilestone is not null');
|
|
230
|
+
assertEq(state.activeMilestone?.id, 'M002-abc123', 'G2: activeMilestone is M002-abc123');
|
|
231
|
+
assertEq(state.activeMilestone?.title, 'New Feature', 'G2: activeMilestone title stripped');
|
|
232
|
+
|
|
233
|
+
// Phase
|
|
234
|
+
assertEq(state.phase, 'executing', 'G2: phase is executing');
|
|
235
|
+
|
|
236
|
+
// Active slice
|
|
237
|
+
assertEq(state.activeSlice?.id, 'S02', 'G2: activeSlice is S02');
|
|
238
|
+
|
|
239
|
+
// Progress
|
|
240
|
+
assertEq(state.progress?.milestones?.done, 1, 'G2: milestones done = 1');
|
|
241
|
+
assertEq(state.progress?.milestones?.total, 2, 'G2: milestones total = 2');
|
|
242
|
+
} finally {
|
|
243
|
+
cleanup(base);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ─── Group 3: indexWorkspace with mixed-format milestones ─────────────
|
|
248
|
+
console.log('\n=== Group 3: indexWorkspace with mixed-format milestones ===');
|
|
249
|
+
{
|
|
250
|
+
const base = createFixtureBase();
|
|
251
|
+
try {
|
|
252
|
+
// Same fixture as Group 2: M001 (complete) + M002-abc123 (active)
|
|
253
|
+
writeRoadmap(base, 'M001', `# M001: Legacy Feature
|
|
254
|
+
|
|
255
|
+
**Vision:** Legacy vision
|
|
256
|
+
|
|
257
|
+
## Slices
|
|
258
|
+
- [x] **S01: Only Slice** \`risk:low\` \`depends:[]\`
|
|
259
|
+
> Done
|
|
260
|
+
`);
|
|
261
|
+
|
|
262
|
+
writePlan(base, 'M001', 'S01', `# S01: Only Slice
|
|
263
|
+
|
|
264
|
+
**Goal:** Done
|
|
265
|
+
**Demo:** Works
|
|
266
|
+
|
|
267
|
+
## Tasks
|
|
268
|
+
- [x] **T01: Do it** \`est:10m\`
|
|
269
|
+
Did it.
|
|
270
|
+
`);
|
|
271
|
+
|
|
272
|
+
writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
|
|
273
|
+
|
|
274
|
+
**One-liner summary**
|
|
275
|
+
|
|
276
|
+
## What Happened
|
|
277
|
+
Everything worked.
|
|
278
|
+
`);
|
|
279
|
+
|
|
280
|
+
writeRoadmap(base, 'M002-abc123', `# M002-abc123: New Feature
|
|
281
|
+
|
|
282
|
+
**Vision:** New vision
|
|
283
|
+
|
|
284
|
+
## Slices
|
|
285
|
+
- [ ] **S01: First Slice** \`risk:low\` \`depends:[]\`
|
|
286
|
+
> First work
|
|
287
|
+
`);
|
|
288
|
+
|
|
289
|
+
writePlan(base, 'M002-abc123', 'S01', `# S01: First Slice
|
|
290
|
+
|
|
291
|
+
**Goal:** First
|
|
292
|
+
**Demo:** First works
|
|
293
|
+
|
|
294
|
+
## Tasks
|
|
295
|
+
- [ ] **T01: Build** \`est:20m\`
|
|
296
|
+
Build it.
|
|
297
|
+
`);
|
|
298
|
+
|
|
299
|
+
const index = await indexWorkspace(base);
|
|
300
|
+
|
|
301
|
+
// Both milestones indexed
|
|
302
|
+
assertEq(index.milestones.length, 2, 'G3: 2 milestones in index');
|
|
303
|
+
assertEq(index.milestones[0]?.id, 'M001', 'G3: index[0] is M001');
|
|
304
|
+
assertEq(index.milestones[1]?.id, 'M002-abc123', 'G3: index[1] is M002-abc123');
|
|
305
|
+
|
|
306
|
+
// Titles stripped from both formats
|
|
307
|
+
assertEq(index.milestones[0]?.title, 'Legacy Feature', 'G3: M001 title stripped');
|
|
308
|
+
assertEq(index.milestones[1]?.title, 'New Feature', 'G3: M002-abc123 title stripped');
|
|
309
|
+
|
|
310
|
+
// Active state
|
|
311
|
+
assertEq(index.active.milestoneId, 'M002-abc123', 'G3: active milestone is M002-abc123');
|
|
312
|
+
assertEq(index.active.sliceId, 'S01', 'G3: active slice is S01');
|
|
313
|
+
|
|
314
|
+
// Scopes include new-format paths
|
|
315
|
+
assertTrue(
|
|
316
|
+
index.scopes.some(s => s.scope === 'M002-abc123'),
|
|
317
|
+
'G3: scope includes M002-abc123 milestone',
|
|
318
|
+
);
|
|
319
|
+
assertTrue(
|
|
320
|
+
index.scopes.some(s => s.scope === 'M002-abc123/S01'),
|
|
321
|
+
'G3: scope includes M002-abc123/S01 slice',
|
|
322
|
+
);
|
|
323
|
+
assertTrue(
|
|
324
|
+
index.scopes.some(s => s.scope === 'M002-abc123/S01/T01'),
|
|
325
|
+
'G3: scope includes M002-abc123/S01/T01 task',
|
|
326
|
+
);
|
|
327
|
+
} finally {
|
|
328
|
+
cleanup(base);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ─── Group 4: inlinePriorMilestoneSummary with mixed formats ──────────
|
|
333
|
+
console.log('\n=== Group 4: inlinePriorMilestoneSummary with mixed formats ===');
|
|
334
|
+
{
|
|
335
|
+
const base = createFixtureBase();
|
|
336
|
+
try {
|
|
337
|
+
// M001 — completed with summary
|
|
338
|
+
mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
|
|
339
|
+
writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
|
|
340
|
+
|
|
341
|
+
**Completed legacy feature**
|
|
342
|
+
|
|
343
|
+
## What Happened
|
|
344
|
+
Built the legacy feature successfully.
|
|
345
|
+
|
|
346
|
+
## Key Decisions
|
|
347
|
+
- Used old format for milestone IDs.
|
|
348
|
+
`);
|
|
349
|
+
|
|
350
|
+
// M002-abc123 — active milestone (just needs directory to exist)
|
|
351
|
+
mkdirSync(join(base, '.gsd', 'milestones', 'M002-abc123'), { recursive: true });
|
|
352
|
+
|
|
353
|
+
const result = await inlinePriorMilestoneSummary('M002-abc123', base);
|
|
354
|
+
|
|
355
|
+
// Result should be non-null (M001 is before M002-abc123)
|
|
356
|
+
assertTrue(result !== null, 'G4: result is non-null');
|
|
357
|
+
assertTrue(typeof result === 'string', 'G4: result is a string');
|
|
358
|
+
|
|
359
|
+
// Should contain the M001 summary content
|
|
360
|
+
assertTrue(result!.includes('Prior Milestone Summary'), 'G4: contains Prior Milestone Summary header');
|
|
361
|
+
assertTrue(result!.includes('Built the legacy feature successfully'), 'G4: contains M001 summary content');
|
|
362
|
+
assertTrue(result!.includes('Used old format for milestone IDs'), 'G4: contains M001 key decisions');
|
|
363
|
+
} finally {
|
|
364
|
+
cleanup(base);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// ─── Group 5: dispatch-guard with new-format milestones ──────────────
|
|
369
|
+
console.log('\n=== Group 5: dispatch-guard with new-format milestones ===');
|
|
370
|
+
{
|
|
371
|
+
const base = createGitRepo();
|
|
372
|
+
try {
|
|
373
|
+
// M001-abc123: all slices complete
|
|
374
|
+
writeRoadmap(base, 'M001-abc123', `# M001-abc123: First Feature
|
|
375
|
+
|
|
376
|
+
**Vision:** First
|
|
377
|
+
|
|
378
|
+
## Slices
|
|
379
|
+
- [x] **S01: Done** \`risk:low\` \`depends:[]\`
|
|
380
|
+
> Completed
|
|
381
|
+
`);
|
|
382
|
+
|
|
383
|
+
// M002-abc123: S01 incomplete
|
|
384
|
+
writeRoadmap(base, 'M002-abc123', `# M002-abc123: Second Feature
|
|
385
|
+
|
|
386
|
+
**Vision:** Second
|
|
387
|
+
|
|
388
|
+
## Slices
|
|
389
|
+
- [ ] **S01: Pending** \`risk:low\` \`depends:[]\`
|
|
390
|
+
> Not started
|
|
391
|
+
- [ ] **S02: Also Pending** \`risk:low\` \`depends:[S01]\`
|
|
392
|
+
> Not started
|
|
393
|
+
`);
|
|
394
|
+
|
|
395
|
+
// Initial commit so dispatch-guard can read from git branch
|
|
396
|
+
writeFileSync(join(base, 'README.md'), 'init\n');
|
|
397
|
+
run('git add .', base);
|
|
398
|
+
run('git commit -m init', base);
|
|
399
|
+
|
|
400
|
+
// No blocker: M001-abc123 is complete, dispatching M002-abc123/S01
|
|
401
|
+
assertEq(
|
|
402
|
+
getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01'),
|
|
403
|
+
null,
|
|
404
|
+
'G5: no blocker for M002-abc123/S01 when M001-abc123 all complete',
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
// No blocker for first slice of first milestone
|
|
408
|
+
assertEq(
|
|
409
|
+
getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M001-abc123/S01/T01'),
|
|
410
|
+
null,
|
|
411
|
+
'G5: no blocker for M001-abc123/S01/T01 (first milestone first slice)',
|
|
412
|
+
);
|
|
413
|
+
|
|
414
|
+
// Blocker: trying to dispatch M002-abc123/S02 when S01 is incomplete
|
|
415
|
+
assertMatch(
|
|
416
|
+
getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M002-abc123/S02/T01') ?? '',
|
|
417
|
+
/earlier slice M002-abc123\/S01 is not complete/,
|
|
418
|
+
'G5: blocks M002-abc123/S02 when S01 incomplete',
|
|
419
|
+
);
|
|
420
|
+
|
|
421
|
+
// Non-slice dispatch type should not be blocked
|
|
422
|
+
assertEq(
|
|
423
|
+
getPriorSliceCompletionBlocker(base, 'main', 'plan-milestone', 'M002-abc123'),
|
|
424
|
+
null,
|
|
425
|
+
'G5: non-slice dispatch type not blocked',
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
// Mixed format: M001 (incomplete) + M002-abc123
|
|
429
|
+
writeRoadmap(base, 'M001', `# M001: Legacy Feature
|
|
430
|
+
|
|
431
|
+
**Vision:** Legacy
|
|
432
|
+
|
|
433
|
+
## Slices
|
|
434
|
+
- [x] **S01: Done** \`risk:low\` \`depends:[]\`
|
|
435
|
+
> Done
|
|
436
|
+
- [ ] **S02: Pending** \`risk:low\` \`depends:[S01]\`
|
|
437
|
+
> Pending
|
|
438
|
+
`);
|
|
439
|
+
run('git add .', base);
|
|
440
|
+
run('git commit -m add-m001', base);
|
|
441
|
+
clearPathCache();
|
|
442
|
+
|
|
443
|
+
// M001 (seq=1) < M001-abc123 (seq=1) — but M001 has incomplete S02
|
|
444
|
+
// Since M001 seq=1 and M002-abc123 seq=2, blocker should reference M001/S02
|
|
445
|
+
assertMatch(
|
|
446
|
+
getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01') ?? '',
|
|
447
|
+
/earlier slice M001\/S02 is not complete/,
|
|
448
|
+
'G5: mixed-format blocker references M001/S02',
|
|
449
|
+
);
|
|
450
|
+
|
|
451
|
+
// Complete M001 and verify no blocker
|
|
452
|
+
writeRoadmap(base, 'M001', `# M001: Legacy Feature
|
|
453
|
+
|
|
454
|
+
**Vision:** Legacy
|
|
455
|
+
|
|
456
|
+
## Slices
|
|
457
|
+
- [x] **S01: Done** \`risk:low\` \`depends:[]\`
|
|
458
|
+
> Done
|
|
459
|
+
- [x] **S02: Done** \`risk:low\` \`depends:[S01]\`
|
|
460
|
+
> Done
|
|
461
|
+
`);
|
|
462
|
+
run('git add .', base);
|
|
463
|
+
run('git commit -m complete-m001', base);
|
|
464
|
+
clearPathCache();
|
|
465
|
+
|
|
466
|
+
assertEq(
|
|
467
|
+
getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01'),
|
|
468
|
+
null,
|
|
469
|
+
'G5: no blocker after M001 completed (mixed format)',
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
// M001-abc123 still has all complete, M002-abc123/S01 still incomplete
|
|
473
|
+
// Check that S02 of M002-abc123 is still blocked by its own S01
|
|
474
|
+
assertMatch(
|
|
475
|
+
getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M002-abc123/S02/T01') ?? '',
|
|
476
|
+
/earlier slice M002-abc123\/S01 is not complete/,
|
|
477
|
+
'G5: intra-milestone blocker still works in mixed-format context',
|
|
478
|
+
);
|
|
479
|
+
} finally {
|
|
480
|
+
cleanup(base);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ─── Group 6: Branch operations with new-format IDs ─────────────────
|
|
485
|
+
console.log('\n=== Group 6: Branch operations with new-format IDs ===');
|
|
486
|
+
{
|
|
487
|
+
const base = createGitRepo();
|
|
488
|
+
try {
|
|
489
|
+
// Need a milestone dir and initial commit for branch ops
|
|
490
|
+
writeRoadmap(base, 'M001-abc123', `# M001-abc123: Branch Test
|
|
491
|
+
|
|
492
|
+
**Vision:** Test branches
|
|
493
|
+
|
|
494
|
+
## Slices
|
|
495
|
+
- [ ] **S01: Slice One** \`risk:low\` \`depends:[]\`
|
|
496
|
+
> Branch test
|
|
497
|
+
`);
|
|
498
|
+
writePlan(base, 'M001-abc123', 'S01', `# S01: Slice One
|
|
499
|
+
|
|
500
|
+
**Goal:** Test
|
|
501
|
+
**Demo:** Branch works
|
|
502
|
+
|
|
503
|
+
## Tasks
|
|
504
|
+
- [ ] **T01: Build** \`est:10m\`
|
|
505
|
+
Build it.
|
|
506
|
+
`);
|
|
507
|
+
writeFileSync(join(base, 'README.md'), 'initial\n');
|
|
508
|
+
run('git add .', base);
|
|
509
|
+
run('git commit -m init', base);
|
|
510
|
+
|
|
511
|
+
// Test getSliceBranchName with new-format ID
|
|
512
|
+
assertEq(
|
|
513
|
+
getSliceBranchName('M001-abc123', 'S01'),
|
|
514
|
+
'gsd/M001-abc123/S01',
|
|
515
|
+
'G6: getSliceBranchName returns gsd/M001-abc123/S01',
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
// Test parseSliceBranch with new-format branch name
|
|
519
|
+
const parsed = parseSliceBranch('gsd/M001-abc123/S01');
|
|
520
|
+
assertTrue(parsed !== null, 'G6: parseSliceBranch returns non-null for new-format');
|
|
521
|
+
assertEq(parsed?.milestoneId, 'M001-abc123', 'G6: parsed milestoneId is M001-abc123');
|
|
522
|
+
assertEq(parsed?.sliceId, 'S01', 'G6: parsed sliceId is S01');
|
|
523
|
+
assertEq(parsed?.worktreeName, null, 'G6: parsed worktreeName is null (no worktree)');
|
|
524
|
+
|
|
525
|
+
// Test ensureSliceBranch creates the branch
|
|
526
|
+
const created = ensureSliceBranch(base, 'M001-abc123', 'S01');
|
|
527
|
+
assertTrue(created, 'G6: ensureSliceBranch returns true (branch created)');
|
|
528
|
+
assertEq(
|
|
529
|
+
getCurrentBranch(base),
|
|
530
|
+
'gsd/M001-abc123/S01',
|
|
531
|
+
'G6: getCurrentBranch returns gsd/M001-abc123/S01',
|
|
532
|
+
);
|
|
533
|
+
|
|
534
|
+
// Idempotent: second ensure should not create
|
|
535
|
+
const secondCreate = ensureSliceBranch(base, 'M001-abc123', 'S01');
|
|
536
|
+
assertEq(secondCreate, false, 'G6: second ensureSliceBranch returns false');
|
|
537
|
+
|
|
538
|
+
// Make a change on the slice branch, commit, then merge to main
|
|
539
|
+
writeFileSync(join(base, 'feature.txt'), 'new feature from slice\n');
|
|
540
|
+
run('git add feature.txt', base);
|
|
541
|
+
run('git commit -m "feat: slice work"', base);
|
|
542
|
+
|
|
543
|
+
// Switch to main and merge
|
|
544
|
+
switchToMain(base);
|
|
545
|
+
assertEq(getCurrentBranch(base), 'main', 'G6: back on main after switchToMain');
|
|
546
|
+
|
|
547
|
+
const merge = mergeSliceToMain(base, 'M001-abc123', 'S01', 'Slice One');
|
|
548
|
+
assertEq(merge.branch, 'gsd/M001-abc123/S01', 'G6: merge reports correct branch');
|
|
549
|
+
assertEq(getCurrentBranch(base), 'main', 'G6: still on main after merge');
|
|
550
|
+
assertTrue(merge.deletedBranch, 'G6: merge deleted the slice branch');
|
|
551
|
+
|
|
552
|
+
// Verify the merged content exists on main
|
|
553
|
+
const content = readFileSync(join(base, 'feature.txt'), 'utf-8');
|
|
554
|
+
assertTrue(content.includes('new feature from slice'), 'G6: merged content on main');
|
|
555
|
+
|
|
556
|
+
// Verify branch is gone
|
|
557
|
+
const branches = run('git branch', base);
|
|
558
|
+
assertTrue(!branches.includes('gsd/M001-abc123/S01'), 'G6: slice branch deleted after merge');
|
|
559
|
+
} finally {
|
|
560
|
+
cleanup(base);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// ─── Summary ──────────────────────────────────────────────────────────
|
|
565
|
+
report();
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// When run via vitest, wrap in test(); when run via tsx, call directly.
|
|
569
|
+
const isVitest = typeof globalThis !== 'undefined' && (globalThis as any).__vitest_worker__?.config?.defines != null && 'vitest' in (globalThis as any).__vitest_worker__.config.defines || process.env.VITEST;
|
|
570
|
+
if (isVitest) {
|
|
571
|
+
const { test } = await import('vitest');
|
|
572
|
+
test('integration-mixed-milestones: all groups pass', async () => {
|
|
573
|
+
await main();
|
|
574
|
+
});
|
|
575
|
+
} else {
|
|
576
|
+
main().catch((error) => {
|
|
577
|
+
console.error(error);
|
|
578
|
+
process.exit(1);
|
|
579
|
+
});
|
|
580
|
+
}
|