gsd-pi 2.33.1 → 2.34.0-dev.bbb5216
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-resource-path.d.ts +8 -0
- package/dist/bundled-resource-path.js +14 -0
- package/dist/cli.js +16 -0
- package/dist/headless-query.js +6 -6
- package/dist/resource-loader.d.ts +2 -0
- package/dist/resource-loader.js +39 -4
- package/dist/resources/extensions/ask-user-questions.js +217 -0
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
- package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
- package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
- package/dist/resources/extensions/async-jobs/index.js +119 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
- package/dist/resources/extensions/aws-auth/index.js +138 -0
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
- package/dist/resources/extensions/bg-shell/index.js +41 -0
- package/dist/resources/extensions/bg-shell/interaction.js +160 -0
- package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
- package/dist/resources/extensions/bg-shell/overlay.js +378 -0
- package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
- package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
- package/dist/resources/extensions/bg-shell/types.js +96 -0
- package/dist/resources/extensions/bg-shell/utilities.js +50 -0
- package/dist/resources/extensions/browser-tools/capture.js +179 -0
- package/dist/resources/extensions/browser-tools/core.js +899 -0
- package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
- package/dist/resources/extensions/browser-tools/index.js +123 -0
- package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
- package/dist/resources/extensions/browser-tools/refs.js +254 -0
- package/dist/resources/extensions/browser-tools/settle.js +173 -0
- package/dist/resources/extensions/browser-tools/state.js +126 -0
- package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
- package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
- package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
- package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
- package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
- package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
- package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
- package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
- package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
- package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
- package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
- package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
- package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
- package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
- package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
- package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
- package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
- package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
- package/dist/resources/extensions/browser-tools/utils.js +490 -0
- package/dist/resources/extensions/context7/index.js +337 -0
- package/dist/resources/extensions/get-secrets-from-user.js +492 -0
- package/dist/resources/extensions/google-search/index.js +373 -0
- package/dist/resources/extensions/gsd/activity-log.js +146 -0
- package/dist/resources/extensions/gsd/atomic-write.js +38 -0
- package/dist/resources/extensions/gsd/auto/session.js +182 -0
- package/dist/resources/extensions/gsd/auto-budget.js +30 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
- package/dist/resources/extensions/gsd/auto-loop.js +956 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
- package/dist/resources/extensions/gsd/auto-observability.js +56 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
- package/dist/resources/extensions/gsd/auto-start.js +414 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
- package/dist/resources/extensions/gsd/auto-timers.js +180 -0
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
- package/dist/resources/extensions/gsd/auto-verification.js +171 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
- package/dist/resources/extensions/gsd/auto.js +765 -0
- package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
- package/dist/resources/extensions/gsd/captures.js +354 -0
- package/dist/resources/extensions/gsd/claude-import.js +540 -0
- package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
- package/dist/resources/extensions/gsd/commands-config.js +89 -0
- package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
- package/dist/resources/extensions/gsd/commands-logs.js +468 -0
- package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
- package/dist/resources/extensions/gsd/commands.js +1024 -0
- package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
- package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
- package/dist/resources/extensions/gsd/context-budget.js +187 -0
- package/dist/resources/extensions/gsd/context-store.js +165 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
- package/dist/resources/extensions/gsd/db-writer.js +298 -0
- package/dist/resources/extensions/gsd/debug-logger.js +161 -0
- package/dist/resources/extensions/gsd/detection.js +373 -0
- package/dist/resources/extensions/gsd/diff-context.js +168 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
- package/dist/resources/extensions/gsd/doctor-format.js +71 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
- package/dist/resources/extensions/gsd/doctor-types.js +12 -0
- package/dist/resources/extensions/gsd/doctor.js +672 -0
- package/dist/resources/extensions/gsd/error-utils.js +6 -0
- package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
- package/dist/resources/extensions/gsd/exit-command.js +11 -0
- package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
- package/dist/resources/extensions/gsd/export.js +268 -0
- package/dist/resources/extensions/gsd/file-watcher.js +76 -0
- package/dist/resources/extensions/gsd/files.js +937 -0
- package/dist/resources/extensions/gsd/forensics.js +511 -0
- package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
- package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
- package/dist/resources/extensions/gsd/git-service.js +460 -0
- package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
- package/dist/resources/extensions/gsd/gsd-db.js +735 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
- package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
- package/dist/resources/extensions/gsd/health-widget.js +141 -0
- package/dist/resources/extensions/gsd/history.js +118 -0
- package/dist/resources/extensions/gsd/index.js +1114 -0
- package/dist/resources/extensions/gsd/init-wizard.js +479 -0
- package/dist/resources/extensions/gsd/json-persistence.js +62 -0
- package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
- package/dist/resources/extensions/gsd/key-manager.js +829 -0
- package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
- package/dist/resources/extensions/gsd/md-importer.js +440 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
- package/dist/resources/extensions/gsd/memory-store.js +351 -0
- package/dist/resources/extensions/gsd/metrics.js +377 -0
- package/dist/resources/extensions/gsd/migrate/command.js +157 -0
- package/dist/resources/extensions/gsd/migrate/index.js +7 -0
- package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
- package/dist/resources/extensions/gsd/migrate/types.js +4 -0
- package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
- package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
- package/dist/resources/extensions/gsd/migrate-external.js +130 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
- package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
- package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
- package/dist/resources/extensions/gsd/model-router.js +187 -0
- package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
- package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
- package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
- package/dist/resources/extensions/gsd/notifications.js +58 -0
- package/dist/resources/extensions/gsd/observability-validator.js +398 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
- package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
- package/dist/resources/extensions/gsd/paths.js +414 -0
- package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
- package/dist/resources/extensions/gsd/preferences-models.js +294 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
- package/dist/resources/extensions/gsd/preferences-types.js +73 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
- package/dist/resources/extensions/gsd/preferences.js +325 -0
- package/dist/resources/extensions/gsd/progress-score.js +102 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
- package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
- package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
- package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
- package/dist/resources/extensions/gsd/queue-order.js +178 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
- package/dist/resources/extensions/gsd/quick.js +206 -0
- package/dist/resources/extensions/gsd/repo-identity.js +187 -0
- package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
- package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
- package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
- package/dist/resources/extensions/gsd/routing-history.js +210 -0
- package/dist/resources/extensions/gsd/safe-fs.js +52 -0
- package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
- package/dist/resources/extensions/gsd/session-forensics.js +427 -0
- package/dist/resources/extensions/gsd/session-lock.js +397 -0
- package/dist/resources/extensions/gsd/session-status-io.js +134 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
- package/dist/resources/extensions/gsd/skill-health.js +324 -0
- package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
- package/dist/resources/extensions/gsd/state.js +653 -0
- package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
- package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
- package/dist/resources/extensions/gsd/token-counter.js +54 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
- package/dist/resources/extensions/gsd/triage-ui.js +125 -0
- package/dist/resources/extensions/gsd/types.js +4 -0
- package/dist/resources/extensions/gsd/undo.js +205 -0
- package/dist/resources/extensions/gsd/unit-id.js +7 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
- package/dist/resources/extensions/gsd/validate-directory.js +143 -0
- package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
- package/dist/resources/extensions/gsd/verification-gate.js +514 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
- package/dist/resources/extensions/gsd/workspace-index.js +139 -0
- package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
- package/dist/resources/extensions/gsd/worktree-command.js +682 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
- package/dist/resources/extensions/gsd/worktree.js +199 -0
- package/dist/resources/extensions/mac-tools/index.js +768 -0
- package/dist/resources/extensions/mcp-client/index.js +363 -0
- package/dist/resources/extensions/package.json +3 -0
- package/dist/resources/extensions/remote-questions/config.js +70 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
- package/dist/resources/extensions/remote-questions/format.js +234 -0
- package/dist/resources/extensions/remote-questions/http-client.js +43 -0
- package/dist/resources/extensions/remote-questions/manager.js +156 -0
- package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
- package/dist/resources/extensions/remote-questions/notify.js +89 -0
- package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/status.js +25 -0
- package/dist/resources/extensions/remote-questions/store.js +70 -0
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/types.js +5 -0
- package/dist/resources/extensions/search-the-web/cache.js +74 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
- package/dist/resources/extensions/search-the-web/format.js +161 -0
- package/dist/resources/extensions/search-the-web/http.js +178 -0
- package/dist/resources/extensions/search-the-web/index.js +41 -0
- package/dist/resources/extensions/search-the-web/native-search.js +166 -0
- package/dist/resources/extensions/search-the-web/provider.js +143 -0
- package/dist/resources/extensions/search-the-web/tavily.js +82 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
- package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
- package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
- package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
- package/dist/resources/extensions/shared/confirm-ui.js +96 -0
- package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
- package/dist/resources/extensions/shared/frontmatter.js +109 -0
- package/dist/resources/extensions/shared/interview-ui.js +569 -0
- package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
- package/dist/resources/extensions/shared/next-action-ui.js +168 -0
- package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
- package/dist/resources/extensions/shared/sanitize.js +17 -0
- package/dist/resources/extensions/shared/terminal.js +21 -0
- package/dist/resources/extensions/shared/ui.js +245 -0
- package/dist/resources/extensions/shared/wizard-ui.js +478 -0
- package/dist/resources/extensions/slash-commands/audit.js +72 -0
- package/dist/resources/extensions/slash-commands/clear.js +8 -0
- package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
- package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
- package/dist/resources/extensions/slash-commands/index.js +10 -0
- package/dist/resources/extensions/subagent/agents.js +103 -0
- package/dist/resources/extensions/subagent/index.js +905 -0
- package/dist/resources/extensions/subagent/isolation.js +384 -0
- package/dist/resources/extensions/subagent/worker-registry.js +73 -0
- package/dist/resources/extensions/ttsr/index.js +144 -0
- package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
- package/dist/resources/extensions/universal-config/discovery.js +94 -0
- package/dist/resources/extensions/universal-config/format.js +178 -0
- package/dist/resources/extensions/universal-config/index.js +99 -0
- package/dist/resources/extensions/universal-config/scanners.js +574 -0
- package/dist/resources/extensions/universal-config/tools.js +57 -0
- package/dist/resources/extensions/universal-config/types.js +8 -0
- package/dist/resources/extensions/voice/index.js +247 -0
- package/dist/startup-timings.d.ts +2 -0
- package/dist/startup-timings.js +22 -0
- package/dist/tool-bootstrap.js +59 -11
- package/dist/worktree-cli.js +7 -7
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +9 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +9 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/index.ts +41 -46
- package/src/resources/extensions/browser-tools/index.ts +156 -67
- package/src/resources/extensions/gsd/auto/session.ts +47 -30
- package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
- package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
- package/src/resources/extensions/gsd/auto-observability.ts +4 -2
- package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
- package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
- package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
- package/src/resources/extensions/gsd/auto-start.ts +440 -354
- package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
- package/src/resources/extensions/gsd/auto-timers.ts +3 -4
- package/src/resources/extensions/gsd/auto-verification.ts +76 -72
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
- package/src/resources/extensions/gsd/auto.ts +516 -1189
- package/src/resources/extensions/gsd/captures.ts +10 -4
- package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
- package/src/resources/extensions/gsd/commands.ts +39 -31
- package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
- package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
- package/src/resources/extensions/gsd/git-service.ts +32 -12
- package/src/resources/extensions/gsd/gitignore.ts +4 -2
- package/src/resources/extensions/gsd/gsd-db.ts +375 -180
- package/src/resources/extensions/gsd/guided-flow.ts +22 -11
- package/src/resources/extensions/gsd/index.ts +76 -163
- package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
- package/src/resources/extensions/gsd/progress-score.ts +65 -200
- package/src/resources/extensions/gsd/quick.ts +121 -76
- package/src/resources/extensions/gsd/repo-identity.ts +56 -22
- package/src/resources/extensions/gsd/session-lock.ts +17 -0
- package/src/resources/extensions/gsd/templates/preferences.md +1 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
- package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
- package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
- package/src/resources/extensions/gsd/types.ts +90 -77
- package/src/resources/extensions/gsd/undo.ts +42 -46
- package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
- package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
- package/src/resources/extensions/gsd/verification-gate.ts +4 -16
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
- package/src/resources/extensions/gsd/worktree-command.ts +29 -11
- package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -44
- package/src/resources/extensions/package.json +3 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
- package/src/resources/extensions/search-the-web/index.ts +35 -52
- package/src/resources/extensions/search-the-web/tavily.ts +1 -1
- package/dist/resources/extensions/ask-user-questions.ts +0 -290
- package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
- package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
- package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
- package/dist/resources/extensions/async-jobs/index.ts +0 -141
- package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
- package/dist/resources/extensions/aws-auth/index.ts +0 -144
- package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
- package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
- package/dist/resources/extensions/bg-shell/index.ts +0 -59
- package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
- package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
- package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
- package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
- package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
- package/dist/resources/extensions/bg-shell/types.ts +0 -303
- package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
- package/dist/resources/extensions/browser-tools/capture.ts +0 -199
- package/dist/resources/extensions/browser-tools/core.ts +0 -1196
- package/dist/resources/extensions/browser-tools/index.ts +0 -71
- package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
- package/dist/resources/extensions/browser-tools/refs.ts +0 -264
- package/dist/resources/extensions/browser-tools/settle.ts +0 -197
- package/dist/resources/extensions/browser-tools/state.ts +0 -408
- package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
- package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
- package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
- package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
- package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
- package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
- package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
- package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
- package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
- package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
- package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
- package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
- package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
- package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
- package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
- package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
- package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
- package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
- package/dist/resources/extensions/browser-tools/utils.ts +0 -660
- package/dist/resources/extensions/context7/index.ts +0 -428
- package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
- package/dist/resources/extensions/google-search/index.ts +0 -466
- package/dist/resources/extensions/gsd/activity-log.ts +0 -162
- package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
- package/dist/resources/extensions/gsd/auto/session.ts +0 -236
- package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
- package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
- package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
- package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
- package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
- package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
- package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
- package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
- package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
- package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
- package/dist/resources/extensions/gsd/auto-start.ts +0 -483
- package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
- package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
- package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
- package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
- package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
- package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
- package/dist/resources/extensions/gsd/auto.ts +0 -1834
- package/dist/resources/extensions/gsd/captures.ts +0 -427
- package/dist/resources/extensions/gsd/claude-import.ts +0 -656
- package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
- package/dist/resources/extensions/gsd/commands-config.ts +0 -102
- package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
- package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
- package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
- package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
- package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
- package/dist/resources/extensions/gsd/commands.ts +0 -1149
- package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
- package/dist/resources/extensions/gsd/context-budget.ts +0 -266
- package/dist/resources/extensions/gsd/context-store.ts +0 -195
- package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
- package/dist/resources/extensions/gsd/db-writer.ts +0 -360
- package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
- package/dist/resources/extensions/gsd/detection.ts +0 -470
- package/dist/resources/extensions/gsd/diff-context.ts +0 -214
- package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
- package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
- package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
- package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
- package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
- package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
- package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
- package/dist/resources/extensions/gsd/doctor.ts +0 -722
- package/dist/resources/extensions/gsd/error-utils.ts +0 -6
- package/dist/resources/extensions/gsd/exit-command.ts +0 -18
- package/dist/resources/extensions/gsd/export.ts +0 -317
- package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
- package/dist/resources/extensions/gsd/files.ts +0 -1058
- package/dist/resources/extensions/gsd/forensics.ts +0 -629
- package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
- package/dist/resources/extensions/gsd/git-service.ts +0 -580
- package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
- package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
- package/dist/resources/extensions/gsd/health-widget.ts +0 -167
- package/dist/resources/extensions/gsd/history.ts +0 -143
- package/dist/resources/extensions/gsd/index.ts +0 -1390
- package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
- package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
- package/dist/resources/extensions/gsd/key-manager.ts +0 -996
- package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
- package/dist/resources/extensions/gsd/md-importer.ts +0 -527
- package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
- package/dist/resources/extensions/gsd/memory-store.ts +0 -441
- package/dist/resources/extensions/gsd/metrics.ts +0 -532
- package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
- package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
- package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
- package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
- package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
- package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
- package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
- package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
- package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
- package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
- package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
- package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
- package/dist/resources/extensions/gsd/model-router.ts +0 -256
- package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
- package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
- package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
- package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
- package/dist/resources/extensions/gsd/notifications.ts +0 -87
- package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
- package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
- package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
- package/dist/resources/extensions/gsd/paths.ts +0 -449
- package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
- package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
- package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
- package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
- package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
- package/dist/resources/extensions/gsd/preferences.ts +0 -416
- package/dist/resources/extensions/gsd/progress-score.ts +0 -273
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
- package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
- package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
- package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
- package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
- package/dist/resources/extensions/gsd/queue-order.ts +0 -230
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
- package/dist/resources/extensions/gsd/quick.ts +0 -212
- package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
- package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
- package/dist/resources/extensions/gsd/routing-history.ts +0 -286
- package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
- package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
- package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
- package/dist/resources/extensions/gsd/session-lock.ts +0 -426
- package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
- package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
- package/dist/resources/extensions/gsd/skill-health.ts +0 -417
- package/dist/resources/extensions/gsd/state.ts +0 -727
- package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
- package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
- package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
- package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
- package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
- package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
- package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
- package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
- package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
- package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
- package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
- package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
- package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
- package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
- package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
- package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
- package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
- package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
- package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
- package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
- package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
- package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
- package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
- package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
- package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
- package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
- package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
- package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
- package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
- package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
- package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
- package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
- package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
- package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
- package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
- package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
- package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
- package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
- package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
- package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
- package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
- package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
- package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
- package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
- package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
- package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
- package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
- package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
- package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
- package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
- package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
- package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
- package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
- package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
- package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
- package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
- package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
- package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
- package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
- package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
- package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
- package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
- package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
- package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
- package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
- package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
- package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
- package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
- package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
- package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
- package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
- package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
- package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
- package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
- package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
- package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
- package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
- package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
- package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
- package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
- package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
- package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
- package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
- package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
- package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
- package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
- package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
- package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
- package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
- package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
- package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
- package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
- package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
- package/dist/resources/extensions/gsd/token-counter.ts +0 -65
- package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
- package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
- package/dist/resources/extensions/gsd/types.ts +0 -425
- package/dist/resources/extensions/gsd/undo.ts +0 -223
- package/dist/resources/extensions/gsd/unit-id.ts +0 -14
- package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
- package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
- package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
- package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
- package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
- package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
- package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
- package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
- package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
- package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
- package/dist/resources/extensions/gsd/worktree.ts +0 -257
- package/dist/resources/extensions/mac-tools/index.ts +0 -852
- package/dist/resources/extensions/mcp-client/index.ts +0 -459
- package/dist/resources/extensions/remote-questions/config.ts +0 -83
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
- package/dist/resources/extensions/remote-questions/format.ts +0 -315
- package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
- package/dist/resources/extensions/remote-questions/manager.ts +0 -184
- package/dist/resources/extensions/remote-questions/notify.ts +0 -90
- package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
- package/dist/resources/extensions/remote-questions/status.ts +0 -31
- package/dist/resources/extensions/remote-questions/store.ts +0 -81
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
- package/dist/resources/extensions/remote-questions/types.ts +0 -102
- package/dist/resources/extensions/search-the-web/cache.ts +0 -78
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
- package/dist/resources/extensions/search-the-web/format.ts +0 -258
- package/dist/resources/extensions/search-the-web/http.ts +0 -238
- package/dist/resources/extensions/search-the-web/index.ts +0 -65
- package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
- package/dist/resources/extensions/search-the-web/provider.ts +0 -148
- package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
- package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
- package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
- package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
- package/dist/resources/extensions/shared/frontmatter.ts +0 -117
- package/dist/resources/extensions/shared/interview-ui.ts +0 -613
- package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
- package/dist/resources/extensions/shared/sanitize.ts +0 -19
- package/dist/resources/extensions/shared/terminal.ts +0 -23
- package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
- package/dist/resources/extensions/shared/ui.ts +0 -400
- package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
- package/dist/resources/extensions/slash-commands/audit.ts +0 -88
- package/dist/resources/extensions/slash-commands/clear.ts +0 -10
- package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
- package/dist/resources/extensions/slash-commands/index.ts +0 -12
- package/dist/resources/extensions/subagent/agents.ts +0 -126
- package/dist/resources/extensions/subagent/index.ts +0 -1121
- package/dist/resources/extensions/subagent/isolation.ts +0 -501
- package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
- package/dist/resources/extensions/ttsr/index.ts +0 -168
- package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
- package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
- package/dist/resources/extensions/universal-config/discovery.ts +0 -104
- package/dist/resources/extensions/universal-config/format.ts +0 -191
- package/dist/resources/extensions/universal-config/index.ts +0 -120
- package/dist/resources/extensions/universal-config/scanners.ts +0 -642
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
- package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
- package/dist/resources/extensions/universal-config/tools.ts +0 -60
- package/dist/resources/extensions/universal-config/types.ts +0 -135
- package/dist/resources/extensions/voice/index.ts +0 -272
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
- package/src/resources/extensions/gsd/auto-constants.ts +0 -6
- package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
- package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
|
@@ -0,0 +1,830 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Auto-Worktree -- lifecycle management for auto-mode worktrees.
|
|
3
|
+
*
|
|
4
|
+
* Auto-mode creates worktrees with `milestone/<MID>` branches (distinct from
|
|
5
|
+
* manual `/worktree` which uses `worktree/<name>` branches). This module
|
|
6
|
+
* manages create, enter, detect, and teardown for auto-mode worktrees.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, cpSync, readFileSync, readdirSync, mkdirSync, realpathSync, unlinkSync, lstatSync as lstatSyncFn, } from "node:fs";
|
|
9
|
+
import { isAbsolute, join } from "node:path";
|
|
10
|
+
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
11
|
+
import { copyWorktreeDb, reconcileWorktreeDb, isDbAvailable, } from "./gsd-db.js";
|
|
12
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
|
|
15
|
+
import { gsdRoot } from "./paths.js";
|
|
16
|
+
import { createWorktree, removeWorktree, worktreePath, } from "./worktree-manager.js";
|
|
17
|
+
import { detectWorktreeName, nudgeGitBranchCache, } from "./worktree.js";
|
|
18
|
+
import { MergeConflictError, readIntegrationBranch } from "./git-service.js";
|
|
19
|
+
import { parseRoadmap } from "./files.js";
|
|
20
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
21
|
+
import { nativeGetCurrentBranch, nativeWorkingTreeStatus, nativeAddAll, nativeCommit, nativeCheckoutBranch, nativeMergeSquash, nativeConflictFiles, nativeCheckoutTheirs, nativeAddPaths, nativeRmForce, nativeBranchDelete, nativeBranchExists, } from "./native-git-bridge.js";
|
|
22
|
+
// ─── Module State ──────────────────────────────────────────────────────────
|
|
23
|
+
/** Original project root before chdir into auto-worktree. */
|
|
24
|
+
let originalBase = null;
|
|
25
|
+
function clearProjectRootStateFiles(basePath, milestoneId) {
|
|
26
|
+
const gsdDir = gsdRoot(basePath);
|
|
27
|
+
const transientFiles = [
|
|
28
|
+
join(gsdDir, "STATE.md"),
|
|
29
|
+
join(gsdDir, "auto.lock"),
|
|
30
|
+
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
31
|
+
];
|
|
32
|
+
for (const file of transientFiles) {
|
|
33
|
+
try {
|
|
34
|
+
unlinkSync(file);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
/* non-fatal — file may not exist */
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ─── Worktree ↔ Main Repo Sync (#1311) ──────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Sync .gsd/ state from the main repo into the worktree.
|
|
44
|
+
*
|
|
45
|
+
* When .gsd/ is a symlink to the external state directory, both the main
|
|
46
|
+
* repo and worktree share the same directory — no sync needed.
|
|
47
|
+
*
|
|
48
|
+
* When .gsd/ is a real directory (e.g., git-tracked or manage_gitignore:false),
|
|
49
|
+
* the worktree has its own copy that may be stale. This function copies
|
|
50
|
+
* missing milestones, CONTEXT, ROADMAP, DECISIONS, REQUIREMENTS, and
|
|
51
|
+
* PROJECT files from the main repo's .gsd/ into the worktree's .gsd/.
|
|
52
|
+
*
|
|
53
|
+
* Only adds missing content — never overwrites existing files in the worktree
|
|
54
|
+
* (the worktree's execution state is authoritative for in-progress work).
|
|
55
|
+
*/
|
|
56
|
+
export function syncGsdStateToWorktree(mainBasePath, worktreePath_) {
|
|
57
|
+
const mainGsd = gsdRoot(mainBasePath);
|
|
58
|
+
const wtGsd = gsdRoot(worktreePath_);
|
|
59
|
+
const synced = [];
|
|
60
|
+
// If both resolve to the same directory (symlink), no sync needed
|
|
61
|
+
try {
|
|
62
|
+
const mainResolved = realpathSync(mainGsd);
|
|
63
|
+
const wtResolved = realpathSync(wtGsd);
|
|
64
|
+
if (mainResolved === wtResolved)
|
|
65
|
+
return { synced };
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Can't resolve — proceed with sync as a safety measure
|
|
69
|
+
}
|
|
70
|
+
if (!existsSync(mainGsd) || !existsSync(wtGsd))
|
|
71
|
+
return { synced };
|
|
72
|
+
// Sync root-level .gsd/ files (DECISIONS, REQUIREMENTS, PROJECT, KNOWLEDGE)
|
|
73
|
+
const rootFiles = [
|
|
74
|
+
"DECISIONS.md",
|
|
75
|
+
"REQUIREMENTS.md",
|
|
76
|
+
"PROJECT.md",
|
|
77
|
+
"KNOWLEDGE.md",
|
|
78
|
+
"OVERRIDES.md",
|
|
79
|
+
];
|
|
80
|
+
for (const f of rootFiles) {
|
|
81
|
+
const src = join(mainGsd, f);
|
|
82
|
+
const dst = join(wtGsd, f);
|
|
83
|
+
if (existsSync(src) && !existsSync(dst)) {
|
|
84
|
+
try {
|
|
85
|
+
cpSync(src, dst);
|
|
86
|
+
synced.push(f);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* non-fatal */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Sync milestones: copy entire milestone directories that are missing
|
|
94
|
+
const mainMilestonesDir = join(mainGsd, "milestones");
|
|
95
|
+
const wtMilestonesDir = join(wtGsd, "milestones");
|
|
96
|
+
if (existsSync(mainMilestonesDir)) {
|
|
97
|
+
try {
|
|
98
|
+
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
99
|
+
const mainMilestones = readdirSync(mainMilestonesDir, {
|
|
100
|
+
withFileTypes: true,
|
|
101
|
+
})
|
|
102
|
+
.filter((d) => d.isDirectory() && /^M\d{3}/.test(d.name))
|
|
103
|
+
.map((d) => d.name);
|
|
104
|
+
for (const mid of mainMilestones) {
|
|
105
|
+
const srcDir = join(mainMilestonesDir, mid);
|
|
106
|
+
const dstDir = join(wtMilestonesDir, mid);
|
|
107
|
+
if (!existsSync(dstDir)) {
|
|
108
|
+
// Entire milestone missing from worktree — copy it
|
|
109
|
+
try {
|
|
110
|
+
cpSync(srcDir, dstDir, { recursive: true });
|
|
111
|
+
synced.push(`milestones/${mid}/`);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
/* non-fatal */
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Milestone directory exists but may be missing files (stale snapshot).
|
|
119
|
+
// Sync individual top-level milestone files (CONTEXT, ROADMAP, RESEARCH, etc.)
|
|
120
|
+
try {
|
|
121
|
+
const srcFiles = readdirSync(srcDir).filter((f) => f.endsWith(".md") || f.endsWith(".json"));
|
|
122
|
+
for (const f of srcFiles) {
|
|
123
|
+
const srcFile = join(srcDir, f);
|
|
124
|
+
const dstFile = join(dstDir, f);
|
|
125
|
+
if (!existsSync(dstFile)) {
|
|
126
|
+
try {
|
|
127
|
+
const srcStat = lstatSyncFn(srcFile);
|
|
128
|
+
if (srcStat.isFile()) {
|
|
129
|
+
cpSync(srcFile, dstFile);
|
|
130
|
+
synced.push(`milestones/${mid}/${f}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
/* non-fatal */
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Sync slices directory if it exists in main but not in worktree
|
|
139
|
+
const srcSlicesDir = join(srcDir, "slices");
|
|
140
|
+
const dstSlicesDir = join(dstDir, "slices");
|
|
141
|
+
if (existsSync(srcSlicesDir) && !existsSync(dstSlicesDir)) {
|
|
142
|
+
try {
|
|
143
|
+
cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
|
|
144
|
+
synced.push(`milestones/${mid}/slices/`);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
/* non-fatal */
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
|
|
151
|
+
// Both exist — sync missing slice directories
|
|
152
|
+
const srcSlices = readdirSync(srcSlicesDir, {
|
|
153
|
+
withFileTypes: true,
|
|
154
|
+
})
|
|
155
|
+
.filter((d) => d.isDirectory())
|
|
156
|
+
.map((d) => d.name);
|
|
157
|
+
for (const sid of srcSlices) {
|
|
158
|
+
const srcSlice = join(srcSlicesDir, sid);
|
|
159
|
+
const dstSlice = join(dstSlicesDir, sid);
|
|
160
|
+
if (!existsSync(dstSlice)) {
|
|
161
|
+
try {
|
|
162
|
+
cpSync(srcSlice, dstSlice, { recursive: true });
|
|
163
|
+
synced.push(`milestones/${mid}/slices/${sid}/`);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
/* non-fatal */
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
/* non-fatal */
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
/* non-fatal */
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return { synced };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sync milestone artifacts from worktree back to the main external state directory.
|
|
186
|
+
* Called before milestone merge to ensure completion artifacts (SUMMARY, VALIDATION,
|
|
187
|
+
* updated ROADMAP) are visible from the project root (#1412).
|
|
188
|
+
*
|
|
189
|
+
* Only syncs .gsd/milestones/ content — root-level files (DECISIONS, REQUIREMENTS, etc.)
|
|
190
|
+
* are handled by the merge itself.
|
|
191
|
+
*/
|
|
192
|
+
export function syncWorktreeStateBack(mainBasePath, worktreePath, milestoneId) {
|
|
193
|
+
const mainGsd = gsdRoot(mainBasePath);
|
|
194
|
+
const wtGsd = gsdRoot(worktreePath);
|
|
195
|
+
const synced = [];
|
|
196
|
+
// If both resolve to the same directory (symlink), no sync needed
|
|
197
|
+
try {
|
|
198
|
+
const mainResolved = realpathSync(mainGsd);
|
|
199
|
+
const wtResolved = realpathSync(wtGsd);
|
|
200
|
+
if (mainResolved === wtResolved)
|
|
201
|
+
return { synced };
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Can't resolve — proceed with sync
|
|
205
|
+
}
|
|
206
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
207
|
+
const mainMilestoneDir = join(mainGsd, "milestones", milestoneId);
|
|
208
|
+
if (!existsSync(wtMilestoneDir))
|
|
209
|
+
return { synced };
|
|
210
|
+
mkdirSync(mainMilestoneDir, { recursive: true });
|
|
211
|
+
// Sync milestone-level files (SUMMARY, VALIDATION, ROADMAP, CONTEXT)
|
|
212
|
+
try {
|
|
213
|
+
for (const entry of readdirSync(wtMilestoneDir, { withFileTypes: true })) {
|
|
214
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
215
|
+
const src = join(wtMilestoneDir, entry.name);
|
|
216
|
+
const dst = join(mainMilestoneDir, entry.name);
|
|
217
|
+
try {
|
|
218
|
+
cpSync(src, dst, { force: true });
|
|
219
|
+
synced.push(`milestones/${milestoneId}/${entry.name}`);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
/* non-fatal */
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
/* non-fatal */
|
|
229
|
+
}
|
|
230
|
+
// Sync slice-level files (summaries, UATs)
|
|
231
|
+
const wtSlicesDir = join(wtMilestoneDir, "slices");
|
|
232
|
+
const mainSlicesDir = join(mainMilestoneDir, "slices");
|
|
233
|
+
if (existsSync(wtSlicesDir)) {
|
|
234
|
+
try {
|
|
235
|
+
for (const sliceEntry of readdirSync(wtSlicesDir, {
|
|
236
|
+
withFileTypes: true,
|
|
237
|
+
})) {
|
|
238
|
+
if (!sliceEntry.isDirectory())
|
|
239
|
+
continue;
|
|
240
|
+
const sid = sliceEntry.name;
|
|
241
|
+
const wtSliceDir = join(wtSlicesDir, sid);
|
|
242
|
+
const mainSliceDir = join(mainSlicesDir, sid);
|
|
243
|
+
mkdirSync(mainSliceDir, { recursive: true });
|
|
244
|
+
for (const fileEntry of readdirSync(wtSliceDir, {
|
|
245
|
+
withFileTypes: true,
|
|
246
|
+
})) {
|
|
247
|
+
if (fileEntry.isFile() && fileEntry.name.endsWith(".md")) {
|
|
248
|
+
const src = join(wtSliceDir, fileEntry.name);
|
|
249
|
+
const dst = join(mainSliceDir, fileEntry.name);
|
|
250
|
+
try {
|
|
251
|
+
cpSync(src, dst, { force: true });
|
|
252
|
+
synced.push(`milestones/${milestoneId}/slices/${sid}/${fileEntry.name}`);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
/* non-fatal */
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
/* non-fatal */
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { synced };
|
|
266
|
+
}
|
|
267
|
+
// ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
|
|
268
|
+
/**
|
|
269
|
+
* Run the user-configured post-create hook script after worktree creation.
|
|
270
|
+
* The script receives SOURCE_DIR and WORKTREE_DIR as environment variables.
|
|
271
|
+
* Failure is non-fatal — returns the error message or null on success.
|
|
272
|
+
*
|
|
273
|
+
* Reads the hook path from git.worktree_post_create in preferences.
|
|
274
|
+
* Pass hookPath directly to bypass preference loading (useful for testing).
|
|
275
|
+
*/
|
|
276
|
+
export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
|
|
277
|
+
if (hookPath === undefined) {
|
|
278
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
279
|
+
hookPath = prefs?.worktree_post_create;
|
|
280
|
+
}
|
|
281
|
+
if (!hookPath)
|
|
282
|
+
return null;
|
|
283
|
+
// Resolve relative paths against the source project root
|
|
284
|
+
const resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
|
|
285
|
+
if (!existsSync(resolved)) {
|
|
286
|
+
return `Worktree post-create hook not found: ${resolved}`;
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
execSync(resolved, {
|
|
290
|
+
cwd: worktreeDir,
|
|
291
|
+
env: {
|
|
292
|
+
...process.env,
|
|
293
|
+
SOURCE_DIR: sourceDir,
|
|
294
|
+
WORKTREE_DIR: worktreeDir,
|
|
295
|
+
},
|
|
296
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
297
|
+
encoding: "utf-8",
|
|
298
|
+
timeout: 30_000, // 30 second timeout
|
|
299
|
+
});
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
304
|
+
return `Worktree post-create hook failed: ${msg}`;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
|
|
308
|
+
export function autoWorktreeBranch(milestoneId) {
|
|
309
|
+
return `milestone/${milestoneId}`;
|
|
310
|
+
}
|
|
311
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
312
|
+
/**
|
|
313
|
+
* Create a new auto-worktree for a milestone, chdir into it, and store
|
|
314
|
+
* the original base path for later teardown.
|
|
315
|
+
*
|
|
316
|
+
* Atomic: chdir + originalBase update happen in the same try block
|
|
317
|
+
* to prevent split-brain.
|
|
318
|
+
*/
|
|
319
|
+
/**
|
|
320
|
+
* Forward-merge plan checkbox state from the project root into a freshly
|
|
321
|
+
* re-attached worktree (#778).
|
|
322
|
+
*
|
|
323
|
+
* When auto-mode stops via crash (not graceful stop), the milestone branch
|
|
324
|
+
* HEAD may be behind the filesystem state at the project root because
|
|
325
|
+
* syncStateToProjectRoot() runs after every task completion but the final
|
|
326
|
+
* git commit may not have happened before the crash. On restart the worktree
|
|
327
|
+
* is re-attached to the branch HEAD, which has [ ] for the crashed task,
|
|
328
|
+
* causing verifyExpectedArtifact() to fail and triggering an infinite
|
|
329
|
+
* dispatch/skip loop.
|
|
330
|
+
*
|
|
331
|
+
* Fix: after re-attaching, read every *.md plan file in the milestone
|
|
332
|
+
* directory at the project root and apply any [x] checkbox states that are
|
|
333
|
+
* ahead of the worktree version (forward-only: never downgrade [x] → [ ]).
|
|
334
|
+
*
|
|
335
|
+
* This is safe because syncStateToProjectRoot() is the authoritative source
|
|
336
|
+
* of post-task state at the project root — it writes the same [x] the LLM
|
|
337
|
+
* produced, then the auto-commit follows. If the commit never happened, the
|
|
338
|
+
* filesystem copy is still valid and correct.
|
|
339
|
+
*/
|
|
340
|
+
function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
|
|
341
|
+
const srcMilestone = join(projectRoot, ".gsd", "milestones", milestoneId);
|
|
342
|
+
const dstMilestone = join(wtPath, ".gsd", "milestones", milestoneId);
|
|
343
|
+
if (!existsSync(srcMilestone) || !existsSync(dstMilestone))
|
|
344
|
+
return;
|
|
345
|
+
// Walk all markdown files in the milestone directory (plans, summaries, etc.)
|
|
346
|
+
function walkMd(dir) {
|
|
347
|
+
const results = [];
|
|
348
|
+
try {
|
|
349
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
350
|
+
const full = join(dir, entry.name);
|
|
351
|
+
if (entry.isDirectory()) {
|
|
352
|
+
results.push(...walkMd(full));
|
|
353
|
+
}
|
|
354
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
355
|
+
results.push(full);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
/* non-fatal */
|
|
361
|
+
}
|
|
362
|
+
return results;
|
|
363
|
+
}
|
|
364
|
+
for (const srcFile of walkMd(srcMilestone)) {
|
|
365
|
+
const rel = srcFile.slice(srcMilestone.length);
|
|
366
|
+
const dstFile = dstMilestone + rel;
|
|
367
|
+
if (!existsSync(dstFile))
|
|
368
|
+
continue; // only reconcile existing files
|
|
369
|
+
let srcContent;
|
|
370
|
+
let dstContent;
|
|
371
|
+
try {
|
|
372
|
+
srcContent = readFileSync(srcFile, "utf-8");
|
|
373
|
+
dstContent = readFileSync(dstFile, "utf-8");
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
if (srcContent === dstContent)
|
|
379
|
+
continue;
|
|
380
|
+
// Extract all checked task IDs from the source (project root)
|
|
381
|
+
// Pattern: - [x] **T<id>: or - [x] **S<id>: (case-insensitive x)
|
|
382
|
+
const checkedRe = /^- \[[xX]\] \*\*([TS]\d+):/gm;
|
|
383
|
+
const srcChecked = new Set();
|
|
384
|
+
for (const m of srcContent.matchAll(checkedRe))
|
|
385
|
+
srcChecked.add(m[1]);
|
|
386
|
+
if (srcChecked.size === 0)
|
|
387
|
+
continue;
|
|
388
|
+
// Forward-apply: replace [ ] → [x] for any IDs that are checked in src
|
|
389
|
+
let updated = dstContent;
|
|
390
|
+
let changed = false;
|
|
391
|
+
for (const id of srcChecked) {
|
|
392
|
+
const escapedId = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
393
|
+
const uncheckedRe = new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm");
|
|
394
|
+
if (uncheckedRe.test(updated)) {
|
|
395
|
+
updated = updated.replace(new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm"), "$1[x]$2");
|
|
396
|
+
changed = true;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (changed) {
|
|
400
|
+
try {
|
|
401
|
+
atomicWriteSync(dstFile, updated, "utf-8");
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
/* non-fatal */
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
export function createAutoWorktree(basePath, milestoneId) {
|
|
410
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
411
|
+
// Check if the milestone branch already exists — it survives auto-mode
|
|
412
|
+
// stop/pause and contains committed work from prior sessions. If it exists,
|
|
413
|
+
// re-attach the worktree to it WITHOUT resetting. Only create a fresh branch
|
|
414
|
+
// from the integration branch when no prior work exists.
|
|
415
|
+
const branchExists = nativeBranchExists(basePath, branch);
|
|
416
|
+
let info;
|
|
417
|
+
if (branchExists) {
|
|
418
|
+
// Re-attach worktree to the existing milestone branch (preserving commits)
|
|
419
|
+
info = createWorktree(basePath, milestoneId, {
|
|
420
|
+
branch,
|
|
421
|
+
reuseExistingBranch: true,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
// Fresh start — create branch from integration branch
|
|
426
|
+
const integrationBranch = readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
427
|
+
info = createWorktree(basePath, milestoneId, {
|
|
428
|
+
branch,
|
|
429
|
+
startPoint: integrationBranch,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
// Copy .gsd/ planning artifacts from the source repo into the new worktree.
|
|
433
|
+
// Worktrees are fresh git checkouts — untracked files don't carry over.
|
|
434
|
+
// Planning artifacts may be untracked if the project's .gitignore had a
|
|
435
|
+
// blanket .gsd/ rule (pre-v2.14.0). Without this copy, auto-mode loops
|
|
436
|
+
// on plan-slice because the plan file doesn't exist in the worktree.
|
|
437
|
+
//
|
|
438
|
+
// IMPORTANT: Skip when re-attaching to an existing branch (#759).
|
|
439
|
+
// The branch checkout already has committed artifacts with correct state
|
|
440
|
+
// (e.g. [x] for completed slices). Copying from the project root would
|
|
441
|
+
// overwrite them with stale data ([ ] checkboxes) because the root is
|
|
442
|
+
// not always fully synced.
|
|
443
|
+
if (!branchExists) {
|
|
444
|
+
copyPlanningArtifacts(basePath, info.path);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// Re-attaching to an existing branch: forward-merge any plan checkpoint
|
|
448
|
+
// state from the project root into the worktree (#778).
|
|
449
|
+
//
|
|
450
|
+
// If auto-mode stopped via crash, the milestone branch HEAD may lag behind
|
|
451
|
+
// the project root filesystem because syncStateToProjectRoot() ran after
|
|
452
|
+
// task completion but the auto-commit never fired. On restart the worktree
|
|
453
|
+
// is re-created from the branch HEAD (which has [ ] for the crashed task),
|
|
454
|
+
// causing verifyExpectedArtifact() to return false → stale-key eviction →
|
|
455
|
+
// infinite dispatch/skip loop. Reconciling here ensures the worktree sees
|
|
456
|
+
// the same [x] state that syncStateToProjectRoot() wrote to the root.
|
|
457
|
+
reconcilePlanCheckboxes(basePath, info.path, milestoneId);
|
|
458
|
+
}
|
|
459
|
+
// Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
|
|
460
|
+
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
461
|
+
if (hookError) {
|
|
462
|
+
// Non-fatal — log but don't prevent worktree usage
|
|
463
|
+
console.error(`[GSD] ${hookError}`);
|
|
464
|
+
}
|
|
465
|
+
const previousCwd = process.cwd();
|
|
466
|
+
try {
|
|
467
|
+
process.chdir(info.path);
|
|
468
|
+
originalBase = basePath;
|
|
469
|
+
}
|
|
470
|
+
catch (err) {
|
|
471
|
+
// If chdir fails, the worktree was created but we couldn't enter it.
|
|
472
|
+
// Don't store originalBase -- caller can retry or clean up.
|
|
473
|
+
throw new GSDError(GSD_IO_ERROR, `Auto-worktree created at ${info.path} but chdir failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
474
|
+
}
|
|
475
|
+
nudgeGitBranchCache(previousCwd);
|
|
476
|
+
return info.path;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Copy .gsd/ planning artifacts from source repo to a new worktree.
|
|
480
|
+
* Copies milestones/, DECISIONS.md, REQUIREMENTS.md, PROJECT.md, QUEUE.md,
|
|
481
|
+
* STATE.md, KNOWLEDGE.md, and OVERRIDES.md.
|
|
482
|
+
* Skips runtime files (auto.lock, metrics.json, etc.) and the worktrees/ dir.
|
|
483
|
+
* Best-effort — failures are non-fatal since auto-mode can recreate artifacts.
|
|
484
|
+
*/
|
|
485
|
+
function copyPlanningArtifacts(srcBase, wtPath) {
|
|
486
|
+
const srcGsd = join(srcBase, ".gsd");
|
|
487
|
+
const dstGsd = join(wtPath, ".gsd");
|
|
488
|
+
if (!existsSync(srcGsd))
|
|
489
|
+
return;
|
|
490
|
+
// Copy milestones/ directory (planning files, roadmaps, plans, research)
|
|
491
|
+
safeCopyRecursive(join(srcGsd, "milestones"), join(dstGsd, "milestones"), {
|
|
492
|
+
force: true,
|
|
493
|
+
filter: (src) => !src.endsWith("-META.json"),
|
|
494
|
+
});
|
|
495
|
+
// Copy top-level planning files
|
|
496
|
+
for (const file of [
|
|
497
|
+
"DECISIONS.md",
|
|
498
|
+
"REQUIREMENTS.md",
|
|
499
|
+
"PROJECT.md",
|
|
500
|
+
"QUEUE.md",
|
|
501
|
+
"STATE.md",
|
|
502
|
+
"KNOWLEDGE.md",
|
|
503
|
+
"OVERRIDES.md",
|
|
504
|
+
]) {
|
|
505
|
+
safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
|
|
506
|
+
}
|
|
507
|
+
// Copy gsd.db if present in source
|
|
508
|
+
const srcDb = join(srcGsd, "gsd.db");
|
|
509
|
+
const destDb = join(dstGsd, "gsd.db");
|
|
510
|
+
if (existsSync(srcDb)) {
|
|
511
|
+
try {
|
|
512
|
+
copyWorktreeDb(srcDb, destDb);
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
/* non-fatal */
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Teardown an auto-worktree: chdir back to original base, then remove
|
|
521
|
+
* the worktree and its branch.
|
|
522
|
+
*/
|
|
523
|
+
export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
524
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
525
|
+
const { preserveBranch = false } = opts;
|
|
526
|
+
const previousCwd = process.cwd();
|
|
527
|
+
try {
|
|
528
|
+
process.chdir(originalBasePath);
|
|
529
|
+
originalBase = null;
|
|
530
|
+
}
|
|
531
|
+
catch (err) {
|
|
532
|
+
throw new GSDError(GSD_IO_ERROR, `Failed to chdir back to ${originalBasePath} during teardown: ${err instanceof Error ? err.message : String(err)}`);
|
|
533
|
+
}
|
|
534
|
+
nudgeGitBranchCache(previousCwd);
|
|
535
|
+
removeWorktree(originalBasePath, milestoneId, {
|
|
536
|
+
branch,
|
|
537
|
+
deleteBranch: !preserveBranch,
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Detect if the process is currently inside an auto-worktree.
|
|
542
|
+
* Checks both module state and git branch prefix.
|
|
543
|
+
*/
|
|
544
|
+
export function isInAutoWorktree(basePath) {
|
|
545
|
+
if (!originalBase)
|
|
546
|
+
return false;
|
|
547
|
+
const cwd = process.cwd();
|
|
548
|
+
const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : basePath;
|
|
549
|
+
const wtDir = join(resolvedBase, ".gsd", "worktrees");
|
|
550
|
+
if (!cwd.startsWith(wtDir))
|
|
551
|
+
return false;
|
|
552
|
+
const branch = nativeGetCurrentBranch(cwd);
|
|
553
|
+
return branch.startsWith("milestone/");
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Get the filesystem path for an auto-worktree, or null if it doesn't exist
|
|
557
|
+
* or is not a valid git worktree.
|
|
558
|
+
*
|
|
559
|
+
* Validates that the path is a real git worktree (has a .git file with a
|
|
560
|
+
* gitdir: pointer) rather than just a stray directory. This prevents
|
|
561
|
+
* mis-detection of leftover directories as active worktrees (#695).
|
|
562
|
+
*/
|
|
563
|
+
export function getAutoWorktreePath(basePath, milestoneId) {
|
|
564
|
+
const p = worktreePath(basePath, milestoneId);
|
|
565
|
+
if (!existsSync(p))
|
|
566
|
+
return null;
|
|
567
|
+
// Validate this is a real git worktree, not a stray directory.
|
|
568
|
+
// A git worktree has a .git *file* (not directory) containing "gitdir: <path>".
|
|
569
|
+
const gitPath = join(p, ".git");
|
|
570
|
+
if (!existsSync(gitPath))
|
|
571
|
+
return null;
|
|
572
|
+
try {
|
|
573
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
574
|
+
if (!content.startsWith("gitdir: "))
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
catch {
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
return p;
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Enter an existing auto-worktree (chdir into it, store originalBase).
|
|
584
|
+
* Use for resume -- the worktree already exists from a prior create.
|
|
585
|
+
*
|
|
586
|
+
* Atomic: chdir + originalBase update in same try block.
|
|
587
|
+
*/
|
|
588
|
+
export function enterAutoWorktree(basePath, milestoneId) {
|
|
589
|
+
const p = worktreePath(basePath, milestoneId);
|
|
590
|
+
if (!existsSync(p)) {
|
|
591
|
+
throw new GSDError(GSD_IO_ERROR, `Auto-worktree for ${milestoneId} does not exist at ${p}`);
|
|
592
|
+
}
|
|
593
|
+
// Validate this is a real git worktree, not a stray directory (#695)
|
|
594
|
+
const gitPath = join(p, ".git");
|
|
595
|
+
if (!existsSync(gitPath)) {
|
|
596
|
+
throw new GSDError(GSD_GIT_ERROR, `Auto-worktree path ${p} exists but is not a git worktree (no .git)`);
|
|
597
|
+
}
|
|
598
|
+
try {
|
|
599
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
600
|
+
if (!content.startsWith("gitdir: ")) {
|
|
601
|
+
throw new GSDError(GSD_GIT_ERROR, `Auto-worktree path ${p} has a .git but it is not a worktree gitdir pointer`);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
catch (err) {
|
|
605
|
+
if (err instanceof Error && err.message.includes("worktree"))
|
|
606
|
+
throw err;
|
|
607
|
+
throw new GSDError(GSD_IO_ERROR, `Auto-worktree path ${p} exists but .git is unreadable`);
|
|
608
|
+
}
|
|
609
|
+
const previousCwd = process.cwd();
|
|
610
|
+
try {
|
|
611
|
+
process.chdir(p);
|
|
612
|
+
originalBase = basePath;
|
|
613
|
+
}
|
|
614
|
+
catch (err) {
|
|
615
|
+
throw new GSDError(GSD_IO_ERROR, `Failed to enter auto-worktree at ${p}: ${err instanceof Error ? err.message : String(err)}`);
|
|
616
|
+
}
|
|
617
|
+
nudgeGitBranchCache(previousCwd);
|
|
618
|
+
return p;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Get the original project root stored when entering an auto-worktree.
|
|
622
|
+
* Returns null if not currently in an auto-worktree.
|
|
623
|
+
*/
|
|
624
|
+
export function getAutoWorktreeOriginalBase() {
|
|
625
|
+
return originalBase;
|
|
626
|
+
}
|
|
627
|
+
export function getActiveAutoWorktreeContext() {
|
|
628
|
+
if (!originalBase)
|
|
629
|
+
return null;
|
|
630
|
+
const cwd = process.cwd();
|
|
631
|
+
const resolvedBase = existsSync(originalBase)
|
|
632
|
+
? realpathSync(originalBase)
|
|
633
|
+
: originalBase;
|
|
634
|
+
const wtDir = join(resolvedBase, ".gsd", "worktrees");
|
|
635
|
+
if (!cwd.startsWith(wtDir))
|
|
636
|
+
return null;
|
|
637
|
+
const worktreeName = detectWorktreeName(cwd);
|
|
638
|
+
if (!worktreeName)
|
|
639
|
+
return null;
|
|
640
|
+
const branch = nativeGetCurrentBranch(cwd);
|
|
641
|
+
if (!branch.startsWith("milestone/"))
|
|
642
|
+
return null;
|
|
643
|
+
return {
|
|
644
|
+
originalBase,
|
|
645
|
+
worktreeName,
|
|
646
|
+
branch,
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
// ─── Merge Milestone -> Main ───────────────────────────────────────────────
|
|
650
|
+
/**
|
|
651
|
+
* Auto-commit any dirty (uncommitted) state in the given directory.
|
|
652
|
+
* Returns true if a commit was made, false if working tree was clean.
|
|
653
|
+
*/
|
|
654
|
+
function autoCommitDirtyState(cwd) {
|
|
655
|
+
try {
|
|
656
|
+
const status = nativeWorkingTreeStatus(cwd);
|
|
657
|
+
if (!status)
|
|
658
|
+
return false;
|
|
659
|
+
nativeAddAll(cwd);
|
|
660
|
+
const result = nativeCommit(cwd, "chore: auto-commit before milestone merge");
|
|
661
|
+
return result !== null;
|
|
662
|
+
}
|
|
663
|
+
catch {
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Squash-merge the milestone branch into main with a rich commit message
|
|
669
|
+
* listing all completed slices, then tear down the worktree.
|
|
670
|
+
*
|
|
671
|
+
* Sequence:
|
|
672
|
+
* 1. Auto-commit dirty worktree state
|
|
673
|
+
* 2. chdir to originalBasePath
|
|
674
|
+
* 3. git checkout main
|
|
675
|
+
* 4. git merge --squash milestone/<MID>
|
|
676
|
+
* 5. git commit with rich message
|
|
677
|
+
* 6. Auto-push if enabled
|
|
678
|
+
* 7. Delete milestone branch
|
|
679
|
+
* 8. Remove worktree directory
|
|
680
|
+
* 9. Clear originalBase
|
|
681
|
+
*
|
|
682
|
+
* On merge conflict: throws MergeConflictError.
|
|
683
|
+
* On "nothing to commit" after squash: handles gracefully (no error).
|
|
684
|
+
*/
|
|
685
|
+
export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapContent) {
|
|
686
|
+
const worktreeCwd = process.cwd();
|
|
687
|
+
const milestoneBranch = autoWorktreeBranch(milestoneId);
|
|
688
|
+
// 1. Auto-commit dirty state in worktree before leaving
|
|
689
|
+
autoCommitDirtyState(worktreeCwd);
|
|
690
|
+
// Reconcile worktree DB into main DB before leaving worktree context
|
|
691
|
+
if (isDbAvailable()) {
|
|
692
|
+
try {
|
|
693
|
+
const worktreeDbPath = join(worktreeCwd, ".gsd", "gsd.db");
|
|
694
|
+
const mainDbPath = join(originalBasePath_, ".gsd", "gsd.db");
|
|
695
|
+
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
696
|
+
}
|
|
697
|
+
catch {
|
|
698
|
+
/* non-fatal */
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
// 2. Parse roadmap for slice listing
|
|
702
|
+
const roadmap = parseRoadmap(roadmapContent);
|
|
703
|
+
const completedSlices = roadmap.slices.filter((s) => s.done);
|
|
704
|
+
// 3. chdir to original base
|
|
705
|
+
const previousCwd = process.cwd();
|
|
706
|
+
process.chdir(originalBasePath_);
|
|
707
|
+
// 4. Resolve integration branch — prefer milestone metadata, fall back to preferences / "main"
|
|
708
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
709
|
+
const integrationBranch = readIntegrationBranch(originalBasePath_, milestoneId);
|
|
710
|
+
const mainBranch = integrationBranch ?? prefs.main_branch ?? "main";
|
|
711
|
+
// Remove transient project-root state files before any branch or merge
|
|
712
|
+
// operation. Untracked milestone metadata can otherwise block squash merges.
|
|
713
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
714
|
+
// 5. Checkout integration branch (skip if already current — avoids git error
|
|
715
|
+
// when main is already checked out in the project-root worktree, #757)
|
|
716
|
+
const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
|
|
717
|
+
if (currentBranchAtBase !== mainBranch) {
|
|
718
|
+
nativeCheckoutBranch(originalBasePath_, mainBranch);
|
|
719
|
+
}
|
|
720
|
+
// 6. Build rich commit message
|
|
721
|
+
const milestoneTitle = roadmap.title.replace(/^M\d+:\s*/, "").trim() || milestoneId;
|
|
722
|
+
const subject = `feat(${milestoneId}): ${milestoneTitle}`;
|
|
723
|
+
let body = "";
|
|
724
|
+
if (completedSlices.length > 0) {
|
|
725
|
+
const sliceLines = completedSlices
|
|
726
|
+
.map((s) => `- ${s.id}: ${s.title}`)
|
|
727
|
+
.join("\n");
|
|
728
|
+
body = `\n\nCompleted slices:\n${sliceLines}\n\nBranch: ${milestoneBranch}`;
|
|
729
|
+
}
|
|
730
|
+
const commitMessage = subject + body;
|
|
731
|
+
// 7. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
732
|
+
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
733
|
+
if (!mergeResult.success) {
|
|
734
|
+
// Check for conflicts — use merge result first, fall back to nativeConflictFiles
|
|
735
|
+
const conflictedFiles = mergeResult.conflicts.length > 0
|
|
736
|
+
? mergeResult.conflicts
|
|
737
|
+
: nativeConflictFiles(originalBasePath_);
|
|
738
|
+
if (conflictedFiles.length > 0) {
|
|
739
|
+
// Separate .gsd/ state file conflicts from real code conflicts.
|
|
740
|
+
// GSD state files (STATE.md, auto.lock, etc.)
|
|
741
|
+
// diverge between branches during normal operation — always prefer the
|
|
742
|
+
// milestone branch version since it has the latest execution state.
|
|
743
|
+
const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
|
|
744
|
+
const codeConflicts = conflictedFiles.filter((f) => !f.startsWith(".gsd/"));
|
|
745
|
+
// Auto-resolve .gsd/ conflicts by accepting the milestone branch version
|
|
746
|
+
if (gsdConflicts.length > 0) {
|
|
747
|
+
for (const gsdFile of gsdConflicts) {
|
|
748
|
+
try {
|
|
749
|
+
nativeCheckoutTheirs(originalBasePath_, [gsdFile]);
|
|
750
|
+
nativeAddPaths(originalBasePath_, [gsdFile]);
|
|
751
|
+
}
|
|
752
|
+
catch {
|
|
753
|
+
// If checkout --theirs fails, try removing the file from the merge
|
|
754
|
+
// (it's a runtime file that shouldn't be committed anyway)
|
|
755
|
+
nativeRmForce(originalBasePath_, [gsdFile]);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
// If there are still non-.gsd conflicts, escalate
|
|
760
|
+
if (codeConflicts.length > 0) {
|
|
761
|
+
throw new MergeConflictError(codeConflicts, "squash", milestoneBranch, mainBranch);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
// No conflicts detected — possibly "already up to date", fall through to commit
|
|
765
|
+
}
|
|
766
|
+
// 8. Commit (handle nothing-to-commit gracefully)
|
|
767
|
+
const commitResult = nativeCommit(originalBasePath_, commitMessage);
|
|
768
|
+
const nothingToCommit = commitResult === null;
|
|
769
|
+
// 9. Auto-push if enabled
|
|
770
|
+
let pushed = false;
|
|
771
|
+
if (prefs.auto_push === true && !nothingToCommit) {
|
|
772
|
+
const remote = prefs.remote ?? "origin";
|
|
773
|
+
try {
|
|
774
|
+
execSync(`git push ${remote} ${mainBranch}`, {
|
|
775
|
+
cwd: originalBasePath_,
|
|
776
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
777
|
+
encoding: "utf-8",
|
|
778
|
+
});
|
|
779
|
+
pushed = true;
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
// Push failure is non-fatal
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
// 9b. Auto-create PR if enabled (requires push_branches + push succeeded)
|
|
786
|
+
let prCreated = false;
|
|
787
|
+
if (prefs.auto_pr === true && pushed) {
|
|
788
|
+
const remote = prefs.remote ?? "origin";
|
|
789
|
+
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
790
|
+
try {
|
|
791
|
+
// Push the milestone branch to remote first
|
|
792
|
+
execSync(`git push ${remote} ${milestoneBranch}`, {
|
|
793
|
+
cwd: originalBasePath_,
|
|
794
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
795
|
+
encoding: "utf-8",
|
|
796
|
+
});
|
|
797
|
+
// Create PR via gh CLI
|
|
798
|
+
execSync(`gh pr create --base "${prTarget}" --head "${milestoneBranch}" --title "Milestone ${milestoneId} complete" --body "Auto-created by GSD on milestone completion."`, {
|
|
799
|
+
cwd: originalBasePath_,
|
|
800
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
801
|
+
encoding: "utf-8",
|
|
802
|
+
});
|
|
803
|
+
prCreated = true;
|
|
804
|
+
}
|
|
805
|
+
catch {
|
|
806
|
+
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
// 10. Remove worktree directory first (must happen before branch deletion)
|
|
810
|
+
try {
|
|
811
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
812
|
+
branch: null,
|
|
813
|
+
deleteBranch: false,
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
catch {
|
|
817
|
+
// Best-effort -- worktree dir may already be gone
|
|
818
|
+
}
|
|
819
|
+
// 11. Delete milestone branch (after worktree removal so ref is unlocked)
|
|
820
|
+
try {
|
|
821
|
+
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
822
|
+
}
|
|
823
|
+
catch {
|
|
824
|
+
// Best-effort
|
|
825
|
+
}
|
|
826
|
+
// 12. Clear module state
|
|
827
|
+
originalBase = null;
|
|
828
|
+
nudgeGitBranchCache(previousCwd);
|
|
829
|
+
return { commitMessage, pushed, prCreated };
|
|
830
|
+
}
|