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
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
import type { ExtensionAPI, ExtensionContext, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
10
10
|
import { showNextAction } from "../shared/next-action-ui.js";
|
|
11
11
|
import { loadFile, parseRoadmap } from "./files.js";
|
|
12
|
-
import { loadPrompt } from "./prompt-loader.js";
|
|
12
|
+
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
13
13
|
import { deriveState } from "./state.js";
|
|
14
14
|
import { startAuto } from "./auto.js";
|
|
15
15
|
import { readCrashLock, clearLock, formatCrashInfo } from "./crash-recovery.js";
|
|
16
|
+
import { listUnitRuntimeRecords, clearUnitRuntimeRecord } from "./unit-runtime.js";
|
|
17
|
+
import { resolveExpectedArtifactPath } from "./auto.js";
|
|
16
18
|
import {
|
|
17
19
|
gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath,
|
|
18
20
|
resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
|
|
@@ -97,11 +99,19 @@ function dispatchWorkflow(pi: ExtensionAPI, note: string, customType = "gsd-run"
|
|
|
97
99
|
*/
|
|
98
100
|
function buildDiscussPrompt(nextId: string, preamble: string, _basePath: string): string {
|
|
99
101
|
const milestoneRel = `.gsd/milestones/${nextId}`;
|
|
102
|
+
const inlinedTemplates = [
|
|
103
|
+
inlineTemplate("project", "Project"),
|
|
104
|
+
inlineTemplate("requirements", "Requirements"),
|
|
105
|
+
inlineTemplate("context", "Context"),
|
|
106
|
+
inlineTemplate("roadmap", "Roadmap"),
|
|
107
|
+
inlineTemplate("decisions", "Decisions"),
|
|
108
|
+
].join("\n\n---\n\n");
|
|
100
109
|
return loadPrompt("discuss", {
|
|
101
110
|
milestoneId: nextId,
|
|
102
111
|
preamble,
|
|
103
112
|
contextPath: `${milestoneRel}/${nextId}-CONTEXT.md`,
|
|
104
113
|
roadmapPath: `${milestoneRel}/${nextId}-ROADMAP.md`,
|
|
114
|
+
inlinedTemplates,
|
|
105
115
|
});
|
|
106
116
|
}
|
|
107
117
|
|
|
@@ -234,11 +244,13 @@ export async function showQueue(
|
|
|
234
244
|
].join(" ");
|
|
235
245
|
|
|
236
246
|
// ── Dispatch the queue prompt ───────────────────────────────────────
|
|
247
|
+
const queueInlinedTemplates = inlineTemplate("context", "Context");
|
|
237
248
|
const prompt = loadPrompt("queue", {
|
|
238
249
|
preamble,
|
|
239
250
|
nextId,
|
|
240
251
|
nextIdPlus1,
|
|
241
252
|
existingMilestonesContext: existingContext,
|
|
253
|
+
inlinedTemplates: queueInlinedTemplates,
|
|
242
254
|
});
|
|
243
255
|
|
|
244
256
|
pi.sendMessage(
|
|
@@ -415,6 +427,7 @@ async function buildDiscussSlicePrompt(
|
|
|
415
427
|
const sliceDirPath = `.gsd/milestones/${mid}/slices/${sid}`;
|
|
416
428
|
const sliceContextPath = `${sliceDirPath}/${sid}-CONTEXT.md`;
|
|
417
429
|
|
|
430
|
+
const inlinedTemplates = inlineTemplate("slice-context", "Slice Context");
|
|
418
431
|
return loadPrompt("guided-discuss-slice", {
|
|
419
432
|
milestoneId: mid,
|
|
420
433
|
sliceId: sid,
|
|
@@ -423,6 +436,7 @@ async function buildDiscussSlicePrompt(
|
|
|
423
436
|
sliceDirPath,
|
|
424
437
|
contextPath: sliceContextPath,
|
|
425
438
|
projectRoot: base,
|
|
439
|
+
inlinedTemplates,
|
|
426
440
|
});
|
|
427
441
|
}
|
|
428
442
|
|
|
@@ -506,6 +520,42 @@ export async function showDiscuss(
|
|
|
506
520
|
/**
|
|
507
521
|
* The one wizard. Reads state, shows contextual options, dispatches into the workflow doc.
|
|
508
522
|
*/
|
|
523
|
+
/**
|
|
524
|
+
* Self-heal: scan runtime records and clear stale ones left behind when
|
|
525
|
+
* auto-mode crashed mid-unit. auto.ts has its own selfHealRuntimeRecords()
|
|
526
|
+
* but guided-flow (manual /gsd mode) never called it — meaning stale records
|
|
527
|
+
* persisted until the next /gsd auto run. This ensures the wizard always
|
|
528
|
+
* starts from a clean state regardless of how the previous session ended.
|
|
529
|
+
*/
|
|
530
|
+
function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { cleared: number } {
|
|
531
|
+
try {
|
|
532
|
+
const records = listUnitRuntimeRecords(basePath);
|
|
533
|
+
let cleared = 0;
|
|
534
|
+
for (const record of records) {
|
|
535
|
+
const { unitType, unitId, phase } = record;
|
|
536
|
+
// Clear records whose expected artifact already exists (completed but not cleaned up)
|
|
537
|
+
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
538
|
+
if (artifactPath && existsSync(artifactPath)) {
|
|
539
|
+
clearUnitRuntimeRecord(basePath, unitType, unitId);
|
|
540
|
+
cleared++;
|
|
541
|
+
continue;
|
|
542
|
+
}
|
|
543
|
+
// Clear records stuck in dispatched or timeout phase (process died mid-unit)
|
|
544
|
+
if (phase === "dispatched" || phase === "timeout") {
|
|
545
|
+
clearUnitRuntimeRecord(basePath, unitType, unitId);
|
|
546
|
+
cleared++;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
if (cleared > 0) {
|
|
550
|
+
ctx.ui.notify(`Self-heal: cleared ${cleared} stale runtime record(s) from a previous session.`, "info");
|
|
551
|
+
}
|
|
552
|
+
return { cleared };
|
|
553
|
+
} catch {
|
|
554
|
+
// Non-fatal — self-heal should never block the wizard
|
|
555
|
+
return { cleared: 0 };
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
509
559
|
export async function showSmartEntry(
|
|
510
560
|
ctx: ExtensionCommandContext,
|
|
511
561
|
pi: ExtensionAPI,
|
|
@@ -544,6 +594,9 @@ export async function showSmartEntry(
|
|
|
544
594
|
}
|
|
545
595
|
}
|
|
546
596
|
|
|
597
|
+
// ── Self-heal stale runtime records from crashed auto-mode sessions ──
|
|
598
|
+
selfHealRuntimeRecords(basePath, ctx);
|
|
599
|
+
|
|
547
600
|
// Check for crash from previous auto-mode session
|
|
548
601
|
const crashLock = readCrashLock(basePath);
|
|
549
602
|
if (crashLock) {
|
|
@@ -683,8 +736,9 @@ export async function showSmartEntry(
|
|
|
683
736
|
});
|
|
684
737
|
|
|
685
738
|
if (choice === "discuss_draft") {
|
|
739
|
+
const discussMilestoneTemplates = inlineTemplate("context", "Context");
|
|
686
740
|
const basePrompt = loadPrompt("guided-discuss-milestone", {
|
|
687
|
-
milestoneId, milestoneTitle,
|
|
741
|
+
milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
|
|
688
742
|
});
|
|
689
743
|
const seed = draftContent
|
|
690
744
|
? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
|
|
@@ -692,9 +746,10 @@ export async function showSmartEntry(
|
|
|
692
746
|
pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
|
|
693
747
|
dispatchWorkflow(pi, seed, "gsd-discuss");
|
|
694
748
|
} else if (choice === "discuss_fresh") {
|
|
749
|
+
const discussMilestoneTemplates = inlineTemplate("context", "Context");
|
|
695
750
|
pendingAutoStart = { ctx, pi, basePath, milestoneId, step: stepMode };
|
|
696
751
|
dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
|
|
697
|
-
milestoneId, milestoneTitle,
|
|
752
|
+
milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
|
|
698
753
|
}), "gsd-discuss");
|
|
699
754
|
} else if (choice === "skip_milestone") {
|
|
700
755
|
const milestoneIds = findMilestoneIds(basePath);
|
|
@@ -753,13 +808,20 @@ export async function showSmartEntry(
|
|
|
753
808
|
});
|
|
754
809
|
|
|
755
810
|
if (choice === "plan") {
|
|
811
|
+
const planMilestoneTemplates = [
|
|
812
|
+
inlineTemplate("roadmap", "Roadmap"),
|
|
813
|
+
inlineTemplate("plan", "Slice Plan"),
|
|
814
|
+
inlineTemplate("task-plan", "Task Plan"),
|
|
815
|
+
inlineTemplate("secrets-manifest", "Secrets Manifest"),
|
|
816
|
+
].join("\n\n---\n\n");
|
|
756
817
|
const secretsOutputPath = relMilestoneFile(basePath, milestoneId, "SECRETS");
|
|
757
818
|
dispatchWorkflow(pi, loadPrompt("guided-plan-milestone", {
|
|
758
|
-
milestoneId, milestoneTitle, secretsOutputPath,
|
|
819
|
+
milestoneId, milestoneTitle, secretsOutputPath, inlinedTemplates: planMilestoneTemplates,
|
|
759
820
|
}));
|
|
760
821
|
} else if (choice === "discuss") {
|
|
822
|
+
const discussMilestoneTemplates = inlineTemplate("context", "Context");
|
|
761
823
|
dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
|
|
762
|
-
milestoneId, milestoneTitle,
|
|
824
|
+
milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates,
|
|
763
825
|
}));
|
|
764
826
|
} else if (choice === "skip_milestone") {
|
|
765
827
|
const milestoneIds = findMilestoneIds(basePath);
|
|
@@ -866,14 +928,19 @@ export async function showSmartEntry(
|
|
|
866
928
|
});
|
|
867
929
|
|
|
868
930
|
if (choice === "plan") {
|
|
931
|
+
const planSliceTemplates = [
|
|
932
|
+
inlineTemplate("plan", "Slice Plan"),
|
|
933
|
+
inlineTemplate("task-plan", "Task Plan"),
|
|
934
|
+
].join("\n\n---\n\n");
|
|
869
935
|
dispatchWorkflow(pi, loadPrompt("guided-plan-slice", {
|
|
870
|
-
milestoneId, sliceId, sliceTitle,
|
|
936
|
+
milestoneId, sliceId, sliceTitle, inlinedTemplates: planSliceTemplates,
|
|
871
937
|
}));
|
|
872
938
|
} else if (choice === "discuss") {
|
|
873
939
|
dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath));
|
|
874
940
|
} else if (choice === "research") {
|
|
941
|
+
const researchTemplates = inlineTemplate("research", "Research");
|
|
875
942
|
dispatchWorkflow(pi, loadPrompt("guided-research-slice", {
|
|
876
|
-
milestoneId, sliceId, sliceTitle,
|
|
943
|
+
milestoneId, sliceId, sliceTitle, inlinedTemplates: researchTemplates,
|
|
877
944
|
}));
|
|
878
945
|
} else if (choice === "status") {
|
|
879
946
|
const { fireStatusViaCommand } = await import("./commands.js");
|
|
@@ -904,8 +971,12 @@ export async function showSmartEntry(
|
|
|
904
971
|
});
|
|
905
972
|
|
|
906
973
|
if (choice === "complete") {
|
|
974
|
+
const completeSliceTemplates = [
|
|
975
|
+
inlineTemplate("slice-summary", "Slice Summary"),
|
|
976
|
+
inlineTemplate("uat", "UAT"),
|
|
977
|
+
].join("\n\n---\n\n");
|
|
907
978
|
dispatchWorkflow(pi, loadPrompt("guided-complete-slice", {
|
|
908
|
-
milestoneId, sliceId, sliceTitle,
|
|
979
|
+
milestoneId, sliceId, sliceTitle, inlinedTemplates: completeSliceTemplates,
|
|
909
980
|
}));
|
|
910
981
|
} else if (choice === "status") {
|
|
911
982
|
const { fireStatusViaCommand } = await import("./commands.js");
|
|
@@ -965,8 +1036,9 @@ export async function showSmartEntry(
|
|
|
965
1036
|
milestoneId, sliceId,
|
|
966
1037
|
}));
|
|
967
1038
|
} else {
|
|
1039
|
+
const executeTaskTemplates = inlineTemplate("task-summary", "Task Summary");
|
|
968
1040
|
dispatchWorkflow(pi, loadPrompt("guided-execute-task", {
|
|
969
|
-
milestoneId, sliceId, taskId, taskTitle,
|
|
1041
|
+
milestoneId, sliceId, taskId, taskTitle, inlinedTemplates: executeTaskTemplates,
|
|
970
1042
|
}));
|
|
971
1043
|
}
|
|
972
1044
|
} else if (choice === "status") {
|
|
@@ -39,6 +39,8 @@ import {
|
|
|
39
39
|
loadEffectiveGSDPreferences,
|
|
40
40
|
renderPreferencesForSystemPrompt,
|
|
41
41
|
resolveAllSkillReferences,
|
|
42
|
+
resolveModelWithFallbacksForUnit,
|
|
43
|
+
getNextFallbackModel,
|
|
42
44
|
} from "./preferences.js";
|
|
43
45
|
import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "./skill-discovery.js";
|
|
44
46
|
import {
|
|
@@ -339,12 +341,71 @@ export default function (pi: ExtensionAPI) {
|
|
|
339
341
|
"errorMessage" in lastMsg && lastMsg.errorMessage
|
|
340
342
|
? `: ${lastMsg.errorMessage}`
|
|
341
343
|
: "";
|
|
344
|
+
|
|
345
|
+
const dash = getAutoDashboardData();
|
|
346
|
+
if (dash.currentUnit) {
|
|
347
|
+
const modelConfig = resolveModelWithFallbacksForUnit(dash.currentUnit.type);
|
|
348
|
+
if (modelConfig && modelConfig.fallbacks.length > 0) {
|
|
349
|
+
const availableModels = ctx.modelRegistry.getAvailable();
|
|
350
|
+
const currentModelId = ctx.model?.id;
|
|
351
|
+
|
|
352
|
+
const nextModelId = getNextFallbackModel(currentModelId, modelConfig);
|
|
353
|
+
|
|
354
|
+
if (nextModelId) {
|
|
355
|
+
let modelToSet;
|
|
356
|
+
const slashIdx = nextModelId.indexOf("/");
|
|
357
|
+
if (slashIdx !== -1) {
|
|
358
|
+
const provider = nextModelId.substring(0, slashIdx);
|
|
359
|
+
const id = nextModelId.substring(slashIdx + 1);
|
|
360
|
+
modelToSet = availableModels.find(
|
|
361
|
+
m => m.provider.toLowerCase() === provider.toLowerCase()
|
|
362
|
+
&& m.id.toLowerCase() === id.toLowerCase()
|
|
363
|
+
);
|
|
364
|
+
} else {
|
|
365
|
+
const currentProvider = ctx.model?.provider;
|
|
366
|
+
const exactProviderMatch = availableModels.find(
|
|
367
|
+
m => m.id === nextModelId && m.provider === currentProvider
|
|
368
|
+
);
|
|
369
|
+
modelToSet = exactProviderMatch ?? availableModels.find(m => m.id === nextModelId);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (modelToSet) {
|
|
373
|
+
const ok = await pi.setModel(modelToSet, { persist: false });
|
|
374
|
+
if (ok) {
|
|
375
|
+
ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
|
|
376
|
+
// Trigger a generic "Continue execution" to resume the task since the previous attempt failed
|
|
377
|
+
pi.sendMessage(
|
|
378
|
+
{ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false },
|
|
379
|
+
{ triggerTurn: true }
|
|
380
|
+
);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
342
388
|
(ctx as any).log(`Auto-mode paused due to provider error${errorDetail}`);
|
|
343
389
|
await pauseAuto(ctx, pi);
|
|
344
390
|
return;
|
|
345
391
|
}
|
|
346
392
|
|
|
347
|
-
|
|
393
|
+
try {
|
|
394
|
+
await handleAgentEnd(ctx, pi);
|
|
395
|
+
} catch (err) {
|
|
396
|
+
// Safety net: if handleAgentEnd throws despite its internal try-catch,
|
|
397
|
+
// ensure auto-mode stops gracefully instead of silently stalling (#381).
|
|
398
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
399
|
+
ctx.ui.notify(
|
|
400
|
+
`Auto-mode error in agent_end handler: ${message}. Stopping auto-mode.`,
|
|
401
|
+
"error",
|
|
402
|
+
);
|
|
403
|
+
try {
|
|
404
|
+
await pauseAuto(ctx, pi);
|
|
405
|
+
} catch {
|
|
406
|
+
// Last resort — at least log
|
|
407
|
+
}
|
|
408
|
+
}
|
|
348
409
|
});
|
|
349
410
|
|
|
350
411
|
// ── session_before_compact ────────────────────────────────────────────────
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// Native Git Bridge
|
|
2
|
+
// Provides fast READ-ONLY git operations backed by libgit2 via the Rust native module.
|
|
3
|
+
// Falls back to execSync git commands when the native module is unavailable.
|
|
4
|
+
//
|
|
5
|
+
// Only READ operations are native — WRITE operations (commit, merge, checkout, push)
|
|
6
|
+
// remain as execSync calls in git-service.ts.
|
|
7
|
+
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
|
|
10
|
+
/** Env overlay that suppresses interactive git credential prompts and git-svn noise. */
|
|
11
|
+
const GIT_NO_PROMPT_ENV = {
|
|
12
|
+
...process.env,
|
|
13
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
14
|
+
GIT_ASKPASS: "",
|
|
15
|
+
GIT_SVN_ID: "",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
let nativeModule: {
|
|
19
|
+
gitCurrentBranch: (repoPath: string) => string | null;
|
|
20
|
+
gitMainBranch: (repoPath: string) => string;
|
|
21
|
+
gitBranchExists: (repoPath: string, branch: string) => boolean;
|
|
22
|
+
gitHasMergeConflicts: (repoPath: string) => boolean;
|
|
23
|
+
gitWorkingTreeStatus: (repoPath: string) => string;
|
|
24
|
+
gitHasChanges: (repoPath: string) => boolean;
|
|
25
|
+
gitCommitCountBetween: (repoPath: string, fromRef: string, toRef: string) => number;
|
|
26
|
+
} | null = null;
|
|
27
|
+
|
|
28
|
+
let loadAttempted = false;
|
|
29
|
+
|
|
30
|
+
function loadNative(): typeof nativeModule {
|
|
31
|
+
if (loadAttempted) return nativeModule;
|
|
32
|
+
loadAttempted = true;
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
36
|
+
const mod = require("@gsd/native");
|
|
37
|
+
if (mod.gitCurrentBranch && mod.gitHasChanges) {
|
|
38
|
+
nativeModule = mod;
|
|
39
|
+
}
|
|
40
|
+
} catch {
|
|
41
|
+
// Native module not available — all functions fall back to git CLI
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return nativeModule;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Run a git command via execSync. Returns trimmed stdout. */
|
|
48
|
+
function gitExec(basePath: string, args: string[], allowFailure = false): string {
|
|
49
|
+
try {
|
|
50
|
+
return execSync(`git ${args.join(" ")}`, {
|
|
51
|
+
cwd: basePath,
|
|
52
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
53
|
+
encoding: "utf-8",
|
|
54
|
+
env: GIT_NO_PROMPT_ENV,
|
|
55
|
+
}).trim();
|
|
56
|
+
} catch {
|
|
57
|
+
if (allowFailure) return "";
|
|
58
|
+
throw new Error(`git ${args.join(" ")} failed in ${basePath}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get the current branch name.
|
|
64
|
+
* Native: reads HEAD symbolic ref via libgit2.
|
|
65
|
+
* Fallback: `git branch --show-current`.
|
|
66
|
+
*/
|
|
67
|
+
export function nativeGetCurrentBranch(basePath: string): string {
|
|
68
|
+
const native = loadNative();
|
|
69
|
+
if (native) {
|
|
70
|
+
const branch = native.gitCurrentBranch(basePath);
|
|
71
|
+
return branch ?? "";
|
|
72
|
+
}
|
|
73
|
+
return gitExec(basePath, ["branch", "--show-current"]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Detect the repo-level main branch (origin/HEAD → main → master → current).
|
|
78
|
+
* Native: checks refs via libgit2.
|
|
79
|
+
* Fallback: `git symbolic-ref` + `git show-ref` chain.
|
|
80
|
+
*
|
|
81
|
+
* Note: milestone integration branch and worktree detection are handled
|
|
82
|
+
* by the caller (GitServiceImpl.getMainBranch) — this only covers the
|
|
83
|
+
* repo-level default detection that spawned multiple git processes.
|
|
84
|
+
*/
|
|
85
|
+
export function nativeDetectMainBranch(basePath: string): string {
|
|
86
|
+
const native = loadNative();
|
|
87
|
+
if (native) {
|
|
88
|
+
return native.gitMainBranch(basePath);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Fallback: same logic as GitServiceImpl.getMainBranch() repo-level detection
|
|
92
|
+
const symbolic = gitExec(basePath, ["symbolic-ref", "refs/remotes/origin/HEAD"], true);
|
|
93
|
+
if (symbolic) {
|
|
94
|
+
const match = symbolic.match(/refs\/remotes\/origin\/(.+)$/);
|
|
95
|
+
if (match) return match[1]!;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const mainExists = gitExec(basePath, ["show-ref", "--verify", "refs/heads/main"], true);
|
|
99
|
+
if (mainExists) return "main";
|
|
100
|
+
|
|
101
|
+
const masterExists = gitExec(basePath, ["show-ref", "--verify", "refs/heads/master"], true);
|
|
102
|
+
if (masterExists) return "master";
|
|
103
|
+
|
|
104
|
+
return gitExec(basePath, ["branch", "--show-current"]);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Check if a local branch exists.
|
|
109
|
+
* Native: checks refs/heads/<name> via libgit2.
|
|
110
|
+
* Fallback: `git show-ref --verify`.
|
|
111
|
+
*/
|
|
112
|
+
export function nativeBranchExists(basePath: string, branch: string): boolean {
|
|
113
|
+
const native = loadNative();
|
|
114
|
+
if (native) {
|
|
115
|
+
return native.gitBranchExists(basePath, branch);
|
|
116
|
+
}
|
|
117
|
+
const result = gitExec(basePath, ["show-ref", "--verify", `refs/heads/${branch}`], true);
|
|
118
|
+
return result !== "";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Check if the index has unmerged entries (merge conflicts).
|
|
123
|
+
* Native: reads index conflict state via libgit2.
|
|
124
|
+
* Fallback: `git diff --name-only --diff-filter=U`.
|
|
125
|
+
*/
|
|
126
|
+
export function nativeHasMergeConflicts(basePath: string): boolean {
|
|
127
|
+
const native = loadNative();
|
|
128
|
+
if (native) {
|
|
129
|
+
return native.gitHasMergeConflicts(basePath);
|
|
130
|
+
}
|
|
131
|
+
const result = gitExec(basePath, ["diff", "--name-only", "--diff-filter=U"], true);
|
|
132
|
+
return result !== "";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Get working tree status (porcelain format).
|
|
137
|
+
* Native: reads status via libgit2.
|
|
138
|
+
* Fallback: `git status --porcelain`.
|
|
139
|
+
*/
|
|
140
|
+
export function nativeWorkingTreeStatus(basePath: string): string {
|
|
141
|
+
const native = loadNative();
|
|
142
|
+
if (native) {
|
|
143
|
+
return native.gitWorkingTreeStatus(basePath);
|
|
144
|
+
}
|
|
145
|
+
return gitExec(basePath, ["status", "--porcelain"], true);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Quick check: any staged or unstaged changes?
|
|
150
|
+
* Native: libgit2 status check (single syscall).
|
|
151
|
+
* Fallback: `git status --short`.
|
|
152
|
+
*/
|
|
153
|
+
export function nativeHasChanges(basePath: string): boolean {
|
|
154
|
+
const native = loadNative();
|
|
155
|
+
if (native) {
|
|
156
|
+
return native.gitHasChanges(basePath);
|
|
157
|
+
}
|
|
158
|
+
const result = gitExec(basePath, ["status", "--short"], true);
|
|
159
|
+
return result !== "";
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Count commits between two refs (from..to).
|
|
164
|
+
* Native: libgit2 revwalk.
|
|
165
|
+
* Fallback: `git rev-list --count from..to`.
|
|
166
|
+
*/
|
|
167
|
+
export function nativeCommitCountBetween(basePath: string, fromRef: string, toRef: string): number {
|
|
168
|
+
const native = loadNative();
|
|
169
|
+
if (native) {
|
|
170
|
+
return native.gitCommitCountBetween(basePath, fromRef, toRef);
|
|
171
|
+
}
|
|
172
|
+
const result = gitExec(basePath, ["rev-list", "--count", `${fromRef}..${toRef}`], true);
|
|
173
|
+
return parseInt(result, 10) || 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Check if the native git module is available.
|
|
178
|
+
*/
|
|
179
|
+
export function isNativeGitAvailable(): boolean {
|
|
180
|
+
return loadNative() !== null;
|
|
181
|
+
}
|
|
@@ -9,9 +9,40 @@
|
|
|
9
9
|
* via prefix matching, so existing projects work without migration.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { readdirSync, existsSync } from "node:fs";
|
|
12
|
+
import { readdirSync, existsSync, Dirent } from "node:fs";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
|
|
15
|
+
// ─── Directory Listing Cache ──────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
const dirEntryCache = new Map<string, Dirent[]>();
|
|
18
|
+
const dirListCache = new Map<string, string[]>();
|
|
19
|
+
|
|
20
|
+
function cachedReaddirWithTypes(dirPath: string): Dirent[] {
|
|
21
|
+
const cached = dirEntryCache.get(dirPath);
|
|
22
|
+
if (cached) return cached;
|
|
23
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
24
|
+
dirEntryCache.set(dirPath, entries);
|
|
25
|
+
return entries;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function cachedReaddir(dirPath: string): string[] {
|
|
29
|
+
const cached = dirListCache.get(dirPath);
|
|
30
|
+
if (cached) return cached;
|
|
31
|
+
const entries = readdirSync(dirPath);
|
|
32
|
+
dirListCache.set(dirPath, entries);
|
|
33
|
+
return entries;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Clear the directory listing cache.
|
|
38
|
+
* Call after milestone transitions, file creation in planning directories,
|
|
39
|
+
* or at the start/end of a dispatch cycle.
|
|
40
|
+
*/
|
|
41
|
+
export function clearPathCache(): void {
|
|
42
|
+
dirEntryCache.clear();
|
|
43
|
+
dirListCache.clear();
|
|
44
|
+
}
|
|
45
|
+
|
|
15
46
|
// ─── Name Builders ─────────────────────────────────────────────────────────
|
|
16
47
|
|
|
17
48
|
/**
|
|
@@ -58,7 +89,7 @@ export function buildTaskFileName(taskId: string, suffix: string): string {
|
|
|
58
89
|
export function resolveDir(parentDir: string, idPrefix: string): string | null {
|
|
59
90
|
if (!existsSync(parentDir)) return null;
|
|
60
91
|
try {
|
|
61
|
-
const entries =
|
|
92
|
+
const entries = cachedReaddirWithTypes(parentDir);
|
|
62
93
|
// Exact match first (current convention: bare ID)
|
|
63
94
|
const exact = entries.find(e => e.isDirectory() && e.name === idPrefix);
|
|
64
95
|
if (exact) return exact.name;
|
|
@@ -83,7 +114,7 @@ export function resolveFile(dir: string, idPrefix: string, suffix: string): stri
|
|
|
83
114
|
if (!existsSync(dir)) return null;
|
|
84
115
|
const target = `${idPrefix}-${suffix}.md`.toUpperCase();
|
|
85
116
|
try {
|
|
86
|
-
const entries =
|
|
117
|
+
const entries = cachedReaddir(dir);
|
|
87
118
|
// Direct match: ID-SUFFIX.md
|
|
88
119
|
const direct = entries.find(e => e.toUpperCase() === target);
|
|
89
120
|
if (direct) return direct;
|
|
@@ -113,7 +144,7 @@ export function resolveTaskFiles(tasksDir: string, suffix: string): string[] {
|
|
|
113
144
|
const currentPattern = new RegExp(`^T\\d+-${suffix}\\.md$`, "i");
|
|
114
145
|
// Legacy convention: T01-INSTALL-PACKAGES-PLAN.md
|
|
115
146
|
const legacyPattern = new RegExp(`^T\\d+-.*-${suffix}\\.md$`, "i");
|
|
116
|
-
return
|
|
147
|
+
return cachedReaddir(tasksDir)
|
|
117
148
|
.filter(f => currentPattern.test(f) || legacyPattern.test(f))
|
|
118
149
|
.sort();
|
|
119
150
|
} catch {
|