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
|
@@ -6,24 +6,40 @@
|
|
|
6
6
|
* manages create, enter, detect, and teardown for auto-mode worktrees.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
|
|
9
|
+
import {
|
|
10
|
+
existsSync,
|
|
11
|
+
cpSync,
|
|
12
|
+
readFileSync,
|
|
13
|
+
readdirSync,
|
|
14
|
+
mkdirSync,
|
|
15
|
+
realpathSync,
|
|
16
|
+
unlinkSync,
|
|
17
|
+
lstatSync as lstatSyncFn,
|
|
18
|
+
} from "node:fs";
|
|
19
|
+
import { isAbsolute, join } from "node:path";
|
|
11
20
|
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
21
|
+
import {
|
|
22
|
+
copyWorktreeDb,
|
|
23
|
+
reconcileWorktreeDb,
|
|
24
|
+
isDbAvailable,
|
|
25
|
+
} from "./gsd-db.js";
|
|
26
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
12
27
|
import { execSync, execFileSync } from "node:child_process";
|
|
28
|
+
import { safeCopy, safeCopyRecursive } from "./safe-fs.js";
|
|
29
|
+
import { gsdRoot } from "./paths.js";
|
|
13
30
|
import {
|
|
14
31
|
createWorktree,
|
|
15
32
|
removeWorktree,
|
|
16
33
|
worktreePath,
|
|
17
34
|
} from "./worktree-manager.js";
|
|
18
|
-
import { detectWorktreeName, resolveGitHeadPath, nudgeGitBranchCache } from "./worktree.js";
|
|
19
|
-
import { ensureGsdSymlink } from "./repo-identity.js";
|
|
20
35
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
36
|
+
detectWorktreeName,
|
|
37
|
+
resolveGitHeadPath,
|
|
38
|
+
nudgeGitBranchCache,
|
|
39
|
+
} from "./worktree.js";
|
|
40
|
+
import { MergeConflictError, readIntegrationBranch } from "./git-service.js";
|
|
24
41
|
import { parseRoadmap } from "./files.js";
|
|
25
42
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
26
|
-
import { gsdRoot } from "./paths.js";
|
|
27
43
|
import {
|
|
28
44
|
nativeGetCurrentBranch,
|
|
29
45
|
nativeWorkingTreeStatus,
|
|
@@ -38,13 +54,28 @@ import {
|
|
|
38
54
|
nativeBranchDelete,
|
|
39
55
|
nativeBranchExists,
|
|
40
56
|
} from "./native-git-bridge.js";
|
|
41
|
-
import { getErrorMessage } from "./error-utils.js";
|
|
42
57
|
|
|
43
58
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
44
59
|
|
|
45
60
|
/** Original project root before chdir into auto-worktree. */
|
|
46
61
|
let originalBase: string | null = null;
|
|
47
62
|
|
|
63
|
+
function clearProjectRootStateFiles(basePath: string, milestoneId: string): void {
|
|
64
|
+
const gsdDir = gsdRoot(basePath);
|
|
65
|
+
const transientFiles = [
|
|
66
|
+
join(gsdDir, "STATE.md"),
|
|
67
|
+
join(gsdDir, "auto.lock"),
|
|
68
|
+
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
for (const file of transientFiles) {
|
|
72
|
+
try {
|
|
73
|
+
unlinkSync(file);
|
|
74
|
+
} catch {
|
|
75
|
+
/* non-fatal — file may not exist */
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
48
79
|
// ─── Worktree ↔ Main Repo Sync (#1311) ──────────────────────────────────────
|
|
49
80
|
|
|
50
81
|
/**
|
|
@@ -61,7 +92,10 @@ let originalBase: string | null = null;
|
|
|
61
92
|
* Only adds missing content — never overwrites existing files in the worktree
|
|
62
93
|
* (the worktree's execution state is authoritative for in-progress work).
|
|
63
94
|
*/
|
|
64
|
-
export function syncGsdStateToWorktree(
|
|
95
|
+
export function syncGsdStateToWorktree(
|
|
96
|
+
mainBasePath: string,
|
|
97
|
+
worktreePath_: string,
|
|
98
|
+
): { synced: string[] } {
|
|
65
99
|
const mainGsd = gsdRoot(mainBasePath);
|
|
66
100
|
const wtGsd = gsdRoot(worktreePath_);
|
|
67
101
|
const synced: string[] = [];
|
|
@@ -78,7 +112,13 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
78
112
|
if (!existsSync(mainGsd) || !existsSync(wtGsd)) return { synced };
|
|
79
113
|
|
|
80
114
|
// Sync root-level .gsd/ files (DECISIONS, REQUIREMENTS, PROJECT, KNOWLEDGE)
|
|
81
|
-
const rootFiles = [
|
|
115
|
+
const rootFiles = [
|
|
116
|
+
"DECISIONS.md",
|
|
117
|
+
"REQUIREMENTS.md",
|
|
118
|
+
"PROJECT.md",
|
|
119
|
+
"KNOWLEDGE.md",
|
|
120
|
+
"OVERRIDES.md",
|
|
121
|
+
];
|
|
82
122
|
for (const f of rootFiles) {
|
|
83
123
|
const src = join(mainGsd, f);
|
|
84
124
|
const dst = join(wtGsd, f);
|
|
@@ -86,18 +126,23 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
86
126
|
try {
|
|
87
127
|
cpSync(src, dst);
|
|
88
128
|
synced.push(f);
|
|
89
|
-
} catch {
|
|
129
|
+
} catch {
|
|
130
|
+
/* non-fatal */
|
|
131
|
+
}
|
|
90
132
|
}
|
|
91
133
|
}
|
|
92
134
|
|
|
93
135
|
// Sync milestones: copy entire milestone directories that are missing
|
|
94
136
|
const mainMilestonesDir = join(mainGsd, "milestones");
|
|
95
137
|
const wtMilestonesDir = join(wtGsd, "milestones");
|
|
96
|
-
if (existsSync(mainMilestonesDir)
|
|
138
|
+
if (existsSync(mainMilestonesDir)) {
|
|
97
139
|
try {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
140
|
+
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
141
|
+
const mainMilestones = readdirSync(mainMilestonesDir, {
|
|
142
|
+
withFileTypes: true,
|
|
143
|
+
})
|
|
144
|
+
.filter((d) => d.isDirectory() && /^M\d{3}/.test(d.name))
|
|
145
|
+
.map((d) => d.name);
|
|
101
146
|
|
|
102
147
|
for (const mid of mainMilestones) {
|
|
103
148
|
const srcDir = join(mainMilestonesDir, mid);
|
|
@@ -108,12 +153,16 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
108
153
|
try {
|
|
109
154
|
cpSync(srcDir, dstDir, { recursive: true });
|
|
110
155
|
synced.push(`milestones/${mid}/`);
|
|
111
|
-
} catch {
|
|
156
|
+
} catch {
|
|
157
|
+
/* non-fatal */
|
|
158
|
+
}
|
|
112
159
|
} else {
|
|
113
160
|
// Milestone directory exists but may be missing files (stale snapshot).
|
|
114
161
|
// Sync individual top-level milestone files (CONTEXT, ROADMAP, RESEARCH, etc.)
|
|
115
162
|
try {
|
|
116
|
-
const srcFiles = readdirSync(srcDir).filter(
|
|
163
|
+
const srcFiles = readdirSync(srcDir).filter(
|
|
164
|
+
(f) => f.endsWith(".md") || f.endsWith(".json"),
|
|
165
|
+
);
|
|
117
166
|
for (const f of srcFiles) {
|
|
118
167
|
const srcFile = join(srcDir, f);
|
|
119
168
|
const dstFile = join(dstDir, f);
|
|
@@ -124,7 +173,9 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
124
173
|
cpSync(srcFile, dstFile);
|
|
125
174
|
synced.push(`milestones/${mid}/${f}`);
|
|
126
175
|
}
|
|
127
|
-
} catch {
|
|
176
|
+
} catch {
|
|
177
|
+
/* non-fatal */
|
|
178
|
+
}
|
|
128
179
|
}
|
|
129
180
|
}
|
|
130
181
|
|
|
@@ -135,12 +186,16 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
135
186
|
try {
|
|
136
187
|
cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
|
|
137
188
|
synced.push(`milestones/${mid}/slices/`);
|
|
138
|
-
} catch {
|
|
189
|
+
} catch {
|
|
190
|
+
/* non-fatal */
|
|
191
|
+
}
|
|
139
192
|
} else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
|
|
140
193
|
// Both exist — sync missing slice directories
|
|
141
|
-
const srcSlices = readdirSync(srcSlicesDir, {
|
|
142
|
-
|
|
143
|
-
|
|
194
|
+
const srcSlices = readdirSync(srcSlicesDir, {
|
|
195
|
+
withFileTypes: true,
|
|
196
|
+
})
|
|
197
|
+
.filter((d) => d.isDirectory())
|
|
198
|
+
.map((d) => d.name);
|
|
144
199
|
for (const sid of srcSlices) {
|
|
145
200
|
const srcSlice = join(srcSlicesDir, sid);
|
|
146
201
|
const dstSlice = join(dstSlicesDir, sid);
|
|
@@ -148,19 +203,113 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
148
203
|
try {
|
|
149
204
|
cpSync(srcSlice, dstSlice, { recursive: true });
|
|
150
205
|
synced.push(`milestones/${mid}/slices/${sid}/`);
|
|
151
|
-
} catch {
|
|
206
|
+
} catch {
|
|
207
|
+
/* non-fatal */
|
|
208
|
+
}
|
|
152
209
|
}
|
|
153
210
|
}
|
|
154
211
|
}
|
|
155
|
-
} catch {
|
|
212
|
+
} catch {
|
|
213
|
+
/* non-fatal */
|
|
214
|
+
}
|
|
156
215
|
}
|
|
157
216
|
}
|
|
158
|
-
} catch {
|
|
217
|
+
} catch {
|
|
218
|
+
/* non-fatal */
|
|
219
|
+
}
|
|
159
220
|
}
|
|
160
221
|
|
|
161
222
|
return { synced };
|
|
162
223
|
}
|
|
163
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Sync milestone artifacts from worktree back to the main external state directory.
|
|
227
|
+
* Called before milestone merge to ensure completion artifacts (SUMMARY, VALIDATION,
|
|
228
|
+
* updated ROADMAP) are visible from the project root (#1412).
|
|
229
|
+
*
|
|
230
|
+
* Only syncs .gsd/milestones/ content — root-level files (DECISIONS, REQUIREMENTS, etc.)
|
|
231
|
+
* are handled by the merge itself.
|
|
232
|
+
*/
|
|
233
|
+
export function syncWorktreeStateBack(
|
|
234
|
+
mainBasePath: string,
|
|
235
|
+
worktreePath: string,
|
|
236
|
+
milestoneId: string,
|
|
237
|
+
): { synced: string[] } {
|
|
238
|
+
const mainGsd = gsdRoot(mainBasePath);
|
|
239
|
+
const wtGsd = gsdRoot(worktreePath);
|
|
240
|
+
const synced: string[] = [];
|
|
241
|
+
|
|
242
|
+
// If both resolve to the same directory (symlink), no sync needed
|
|
243
|
+
try {
|
|
244
|
+
const mainResolved = realpathSync(mainGsd);
|
|
245
|
+
const wtResolved = realpathSync(wtGsd);
|
|
246
|
+
if (mainResolved === wtResolved) return { synced };
|
|
247
|
+
} catch {
|
|
248
|
+
// Can't resolve — proceed with sync
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
252
|
+
const mainMilestoneDir = join(mainGsd, "milestones", milestoneId);
|
|
253
|
+
|
|
254
|
+
if (!existsSync(wtMilestoneDir)) return { synced };
|
|
255
|
+
mkdirSync(mainMilestoneDir, { recursive: true });
|
|
256
|
+
|
|
257
|
+
// Sync milestone-level files (SUMMARY, VALIDATION, ROADMAP, CONTEXT)
|
|
258
|
+
try {
|
|
259
|
+
for (const entry of readdirSync(wtMilestoneDir, { withFileTypes: true })) {
|
|
260
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
261
|
+
const src = join(wtMilestoneDir, entry.name);
|
|
262
|
+
const dst = join(mainMilestoneDir, entry.name);
|
|
263
|
+
try {
|
|
264
|
+
cpSync(src, dst, { force: true });
|
|
265
|
+
synced.push(`milestones/${milestoneId}/${entry.name}`);
|
|
266
|
+
} catch {
|
|
267
|
+
/* non-fatal */
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
} catch {
|
|
272
|
+
/* non-fatal */
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Sync slice-level files (summaries, UATs)
|
|
276
|
+
const wtSlicesDir = join(wtMilestoneDir, "slices");
|
|
277
|
+
const mainSlicesDir = join(mainMilestoneDir, "slices");
|
|
278
|
+
if (existsSync(wtSlicesDir)) {
|
|
279
|
+
try {
|
|
280
|
+
for (const sliceEntry of readdirSync(wtSlicesDir, {
|
|
281
|
+
withFileTypes: true,
|
|
282
|
+
})) {
|
|
283
|
+
if (!sliceEntry.isDirectory()) continue;
|
|
284
|
+
const sid = sliceEntry.name;
|
|
285
|
+
const wtSliceDir = join(wtSlicesDir, sid);
|
|
286
|
+
const mainSliceDir = join(mainSlicesDir, sid);
|
|
287
|
+
mkdirSync(mainSliceDir, { recursive: true });
|
|
288
|
+
|
|
289
|
+
for (const fileEntry of readdirSync(wtSliceDir, {
|
|
290
|
+
withFileTypes: true,
|
|
291
|
+
})) {
|
|
292
|
+
if (fileEntry.isFile() && fileEntry.name.endsWith(".md")) {
|
|
293
|
+
const src = join(wtSliceDir, fileEntry.name);
|
|
294
|
+
const dst = join(mainSliceDir, fileEntry.name);
|
|
295
|
+
try {
|
|
296
|
+
cpSync(src, dst, { force: true });
|
|
297
|
+
synced.push(
|
|
298
|
+
`milestones/${milestoneId}/slices/${sid}/${fileEntry.name}`,
|
|
299
|
+
);
|
|
300
|
+
} catch {
|
|
301
|
+
/* non-fatal */
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
} catch {
|
|
307
|
+
/* non-fatal */
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return { synced };
|
|
312
|
+
}
|
|
164
313
|
// ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
|
|
165
314
|
|
|
166
315
|
/**
|
|
@@ -171,7 +320,11 @@ export function syncGsdStateToWorktree(mainBasePath: string, worktreePath_: stri
|
|
|
171
320
|
* Reads the hook path from git.worktree_post_create in preferences.
|
|
172
321
|
* Pass hookPath directly to bypass preference loading (useful for testing).
|
|
173
322
|
*/
|
|
174
|
-
export function runWorktreePostCreateHook(
|
|
323
|
+
export function runWorktreePostCreateHook(
|
|
324
|
+
sourceDir: string,
|
|
325
|
+
worktreeDir: string,
|
|
326
|
+
hookPath?: string,
|
|
327
|
+
): string | null {
|
|
175
328
|
if (hookPath === undefined) {
|
|
176
329
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
177
330
|
hookPath = prefs?.worktree_post_create;
|
|
@@ -198,7 +351,7 @@ export function runWorktreePostCreateHook(sourceDir: string, worktreeDir: string
|
|
|
198
351
|
});
|
|
199
352
|
return null;
|
|
200
353
|
} catch (err) {
|
|
201
|
-
const msg =
|
|
354
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
202
355
|
return `Worktree post-create hook failed: ${msg}`;
|
|
203
356
|
}
|
|
204
357
|
}
|
|
@@ -219,7 +372,110 @@ export function autoWorktreeBranch(milestoneId: string): string {
|
|
|
219
372
|
* to prevent split-brain.
|
|
220
373
|
*/
|
|
221
374
|
|
|
222
|
-
|
|
375
|
+
/**
|
|
376
|
+
* Forward-merge plan checkbox state from the project root into a freshly
|
|
377
|
+
* re-attached worktree (#778).
|
|
378
|
+
*
|
|
379
|
+
* When auto-mode stops via crash (not graceful stop), the milestone branch
|
|
380
|
+
* HEAD may be behind the filesystem state at the project root because
|
|
381
|
+
* syncStateToProjectRoot() runs after every task completion but the final
|
|
382
|
+
* git commit may not have happened before the crash. On restart the worktree
|
|
383
|
+
* is re-attached to the branch HEAD, which has [ ] for the crashed task,
|
|
384
|
+
* causing verifyExpectedArtifact() to fail and triggering an infinite
|
|
385
|
+
* dispatch/skip loop.
|
|
386
|
+
*
|
|
387
|
+
* Fix: after re-attaching, read every *.md plan file in the milestone
|
|
388
|
+
* directory at the project root and apply any [x] checkbox states that are
|
|
389
|
+
* ahead of the worktree version (forward-only: never downgrade [x] → [ ]).
|
|
390
|
+
*
|
|
391
|
+
* This is safe because syncStateToProjectRoot() is the authoritative source
|
|
392
|
+
* of post-task state at the project root — it writes the same [x] the LLM
|
|
393
|
+
* produced, then the auto-commit follows. If the commit never happened, the
|
|
394
|
+
* filesystem copy is still valid and correct.
|
|
395
|
+
*/
|
|
396
|
+
function reconcilePlanCheckboxes(
|
|
397
|
+
projectRoot: string,
|
|
398
|
+
wtPath: string,
|
|
399
|
+
milestoneId: string,
|
|
400
|
+
): void {
|
|
401
|
+
const srcMilestone = join(projectRoot, ".gsd", "milestones", milestoneId);
|
|
402
|
+
const dstMilestone = join(wtPath, ".gsd", "milestones", milestoneId);
|
|
403
|
+
if (!existsSync(srcMilestone) || !existsSync(dstMilestone)) return;
|
|
404
|
+
|
|
405
|
+
// Walk all markdown files in the milestone directory (plans, summaries, etc.)
|
|
406
|
+
function walkMd(dir: string): string[] {
|
|
407
|
+
const results: string[] = [];
|
|
408
|
+
try {
|
|
409
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
410
|
+
const full = join(dir, entry.name);
|
|
411
|
+
if (entry.isDirectory()) {
|
|
412
|
+
results.push(...walkMd(full));
|
|
413
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
414
|
+
results.push(full);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
} catch {
|
|
418
|
+
/* non-fatal */
|
|
419
|
+
}
|
|
420
|
+
return results;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
for (const srcFile of walkMd(srcMilestone)) {
|
|
424
|
+
const rel = srcFile.slice(srcMilestone.length);
|
|
425
|
+
const dstFile = dstMilestone + rel;
|
|
426
|
+
if (!existsSync(dstFile)) continue; // only reconcile existing files
|
|
427
|
+
|
|
428
|
+
let srcContent: string;
|
|
429
|
+
let dstContent: string;
|
|
430
|
+
try {
|
|
431
|
+
srcContent = readFileSync(srcFile, "utf-8");
|
|
432
|
+
dstContent = readFileSync(dstFile, "utf-8");
|
|
433
|
+
} catch {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (srcContent === dstContent) continue;
|
|
438
|
+
|
|
439
|
+
// Extract all checked task IDs from the source (project root)
|
|
440
|
+
// Pattern: - [x] **T<id>: or - [x] **S<id>: (case-insensitive x)
|
|
441
|
+
const checkedRe = /^- \[[xX]\] \*\*([TS]\d+):/gm;
|
|
442
|
+
const srcChecked = new Set<string>();
|
|
443
|
+
for (const m of srcContent.matchAll(checkedRe)) srcChecked.add(m[1]);
|
|
444
|
+
|
|
445
|
+
if (srcChecked.size === 0) continue;
|
|
446
|
+
|
|
447
|
+
// Forward-apply: replace [ ] → [x] for any IDs that are checked in src
|
|
448
|
+
let updated = dstContent;
|
|
449
|
+
let changed = false;
|
|
450
|
+
for (const id of srcChecked) {
|
|
451
|
+
const escapedId = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
452
|
+
const uncheckedRe = new RegExp(
|
|
453
|
+
`^(- )\\[ \\]( \\*\\*${escapedId}:)`,
|
|
454
|
+
"gm",
|
|
455
|
+
);
|
|
456
|
+
if (uncheckedRe.test(updated)) {
|
|
457
|
+
updated = updated.replace(
|
|
458
|
+
new RegExp(`^(- )\\[ \\]( \\*\\*${escapedId}:)`, "gm"),
|
|
459
|
+
"$1[x]$2",
|
|
460
|
+
);
|
|
461
|
+
changed = true;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
if (changed) {
|
|
466
|
+
try {
|
|
467
|
+
atomicWriteSync(dstFile, updated, "utf-8");
|
|
468
|
+
} catch {
|
|
469
|
+
/* non-fatal */
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
export function createAutoWorktree(
|
|
476
|
+
basePath: string,
|
|
477
|
+
milestoneId: string,
|
|
478
|
+
): string {
|
|
223
479
|
const branch = autoWorktreeBranch(milestoneId);
|
|
224
480
|
|
|
225
481
|
// Check if the milestone branch already exists — it survives auto-mode
|
|
@@ -231,21 +487,46 @@ export function createAutoWorktree(basePath: string, milestoneId: string): strin
|
|
|
231
487
|
let info: { name: string; path: string; branch: string; exists: boolean };
|
|
232
488
|
if (branchExists) {
|
|
233
489
|
// Re-attach worktree to the existing milestone branch (preserving commits)
|
|
234
|
-
info = createWorktree(basePath, milestoneId, {
|
|
490
|
+
info = createWorktree(basePath, milestoneId, {
|
|
491
|
+
branch,
|
|
492
|
+
reuseExistingBranch: true,
|
|
493
|
+
});
|
|
235
494
|
} else {
|
|
236
495
|
// Fresh start — create branch from integration branch
|
|
237
|
-
const integrationBranch =
|
|
238
|
-
|
|
496
|
+
const integrationBranch =
|
|
497
|
+
readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
498
|
+
info = createWorktree(basePath, milestoneId, {
|
|
499
|
+
branch,
|
|
500
|
+
startPoint: integrationBranch,
|
|
501
|
+
});
|
|
239
502
|
}
|
|
240
503
|
|
|
241
|
-
//
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
|
|
504
|
+
// Copy .gsd/ planning artifacts from the source repo into the new worktree.
|
|
505
|
+
// Worktrees are fresh git checkouts — untracked files don't carry over.
|
|
506
|
+
// Planning artifacts may be untracked if the project's .gitignore had a
|
|
507
|
+
// blanket .gsd/ rule (pre-v2.14.0). Without this copy, auto-mode loops
|
|
508
|
+
// on plan-slice because the plan file doesn't exist in the worktree.
|
|
509
|
+
//
|
|
510
|
+
// IMPORTANT: Skip when re-attaching to an existing branch (#759).
|
|
511
|
+
// The branch checkout already has committed artifacts with correct state
|
|
512
|
+
// (e.g. [x] for completed slices). Copying from the project root would
|
|
513
|
+
// overwrite them with stale data ([ ] checkboxes) because the root is
|
|
514
|
+
// not always fully synced.
|
|
515
|
+
if (!branchExists) {
|
|
516
|
+
copyPlanningArtifacts(basePath, info.path);
|
|
517
|
+
} else {
|
|
518
|
+
// Re-attaching to an existing branch: forward-merge any plan checkpoint
|
|
519
|
+
// state from the project root into the worktree (#778).
|
|
520
|
+
//
|
|
521
|
+
// If auto-mode stopped via crash, the milestone branch HEAD may lag behind
|
|
522
|
+
// the project root filesystem because syncStateToProjectRoot() ran after
|
|
523
|
+
// task completion but the auto-commit never fired. On restart the worktree
|
|
524
|
+
// is re-created from the branch HEAD (which has [ ] for the crashed task),
|
|
525
|
+
// causing verifyExpectedArtifact() to return false → stale-key eviction →
|
|
526
|
+
// infinite dispatch/skip loop. Reconciling here ensures the worktree sees
|
|
527
|
+
// the same [x] state that syncStateToProjectRoot() wrote to the root.
|
|
528
|
+
reconcilePlanCheckboxes(basePath, info.path, milestoneId);
|
|
529
|
+
}
|
|
249
530
|
|
|
250
531
|
// Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
|
|
251
532
|
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
@@ -264,7 +545,7 @@ export function createAutoWorktree(basePath: string, milestoneId: string): strin
|
|
|
264
545
|
// Don't store originalBase -- caller can retry or clean up.
|
|
265
546
|
throw new GSDError(
|
|
266
547
|
GSD_IO_ERROR,
|
|
267
|
-
`Auto-worktree created at ${info.path} but chdir failed: ${
|
|
548
|
+
`Auto-worktree created at ${info.path} but chdir failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
268
549
|
);
|
|
269
550
|
}
|
|
270
551
|
|
|
@@ -272,6 +553,49 @@ export function createAutoWorktree(basePath: string, milestoneId: string): strin
|
|
|
272
553
|
return info.path;
|
|
273
554
|
}
|
|
274
555
|
|
|
556
|
+
/**
|
|
557
|
+
* Copy .gsd/ planning artifacts from source repo to a new worktree.
|
|
558
|
+
* Copies milestones/, DECISIONS.md, REQUIREMENTS.md, PROJECT.md, QUEUE.md,
|
|
559
|
+
* STATE.md, KNOWLEDGE.md, and OVERRIDES.md.
|
|
560
|
+
* Skips runtime files (auto.lock, metrics.json, etc.) and the worktrees/ dir.
|
|
561
|
+
* Best-effort — failures are non-fatal since auto-mode can recreate artifacts.
|
|
562
|
+
*/
|
|
563
|
+
function copyPlanningArtifacts(srcBase: string, wtPath: string): void {
|
|
564
|
+
const srcGsd = join(srcBase, ".gsd");
|
|
565
|
+
const dstGsd = join(wtPath, ".gsd");
|
|
566
|
+
if (!existsSync(srcGsd)) return;
|
|
567
|
+
|
|
568
|
+
// Copy milestones/ directory (planning files, roadmaps, plans, research)
|
|
569
|
+
safeCopyRecursive(join(srcGsd, "milestones"), join(dstGsd, "milestones"), {
|
|
570
|
+
force: true,
|
|
571
|
+
filter: (src) => !src.endsWith("-META.json"),
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// Copy top-level planning files
|
|
575
|
+
for (const file of [
|
|
576
|
+
"DECISIONS.md",
|
|
577
|
+
"REQUIREMENTS.md",
|
|
578
|
+
"PROJECT.md",
|
|
579
|
+
"QUEUE.md",
|
|
580
|
+
"STATE.md",
|
|
581
|
+
"KNOWLEDGE.md",
|
|
582
|
+
"OVERRIDES.md",
|
|
583
|
+
]) {
|
|
584
|
+
safeCopy(join(srcGsd, file), join(dstGsd, file), { force: true });
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// Copy gsd.db if present in source
|
|
588
|
+
const srcDb = join(srcGsd, "gsd.db");
|
|
589
|
+
const destDb = join(dstGsd, "gsd.db");
|
|
590
|
+
if (existsSync(srcDb)) {
|
|
591
|
+
try {
|
|
592
|
+
copyWorktreeDb(srcDb, destDb);
|
|
593
|
+
} catch {
|
|
594
|
+
/* non-fatal */
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
275
599
|
/**
|
|
276
600
|
* Teardown an auto-worktree: chdir back to original base, then remove
|
|
277
601
|
* the worktree and its branch.
|
|
@@ -291,12 +615,15 @@ export function teardownAutoWorktree(
|
|
|
291
615
|
} catch (err) {
|
|
292
616
|
throw new GSDError(
|
|
293
617
|
GSD_IO_ERROR,
|
|
294
|
-
`Failed to chdir back to ${originalBasePath} during teardown: ${
|
|
618
|
+
`Failed to chdir back to ${originalBasePath} during teardown: ${err instanceof Error ? err.message : String(err)}`,
|
|
295
619
|
);
|
|
296
620
|
}
|
|
297
621
|
|
|
298
622
|
nudgeGitBranchCache(previousCwd);
|
|
299
|
-
removeWorktree(originalBasePath, milestoneId, {
|
|
623
|
+
removeWorktree(originalBasePath, milestoneId, {
|
|
624
|
+
branch,
|
|
625
|
+
deleteBranch: !preserveBranch,
|
|
626
|
+
});
|
|
300
627
|
}
|
|
301
628
|
|
|
302
629
|
/**
|
|
@@ -304,36 +631,13 @@ export function teardownAutoWorktree(
|
|
|
304
631
|
* Checks both module state and git branch prefix.
|
|
305
632
|
*/
|
|
306
633
|
export function isInAutoWorktree(basePath: string): boolean {
|
|
634
|
+
if (!originalBase) return false;
|
|
307
635
|
const cwd = process.cwd();
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
if (!cwd.startsWith(wtDir)) return false;
|
|
314
|
-
const branch = nativeGetCurrentBranch(cwd);
|
|
315
|
-
return branch.startsWith("milestone/");
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Fallback: infer worktree status structurally when originalBase is null
|
|
319
|
-
// (happens after session restart where module-level state is lost, #1120).
|
|
320
|
-
// Check if cwd is inside a .gsd/worktrees/ directory and has a .git file
|
|
321
|
-
// (worktree marker) pointing to the main repo.
|
|
322
|
-
const worktreeMarker = join(cwd, ".git");
|
|
323
|
-
if (!existsSync(worktreeMarker)) return false;
|
|
324
|
-
try {
|
|
325
|
-
const stat = statSync(worktreeMarker);
|
|
326
|
-
if (stat.isDirectory()) return false; // Main repo has .git dir, not file
|
|
327
|
-
// Worktrees have a .git file with "gitdir: ..." pointing to the main repo
|
|
328
|
-
const gitContent = readFileSync(worktreeMarker, "utf-8").trim();
|
|
329
|
-
if (!gitContent.startsWith("gitdir:")) return false;
|
|
330
|
-
// Verify we're inside a GSD-managed worktree
|
|
331
|
-
if (!detectWorktreeName(cwd)) return false;
|
|
332
|
-
const branch = nativeGetCurrentBranch(cwd);
|
|
333
|
-
return branch.startsWith("milestone/");
|
|
334
|
-
} catch {
|
|
335
|
-
return false;
|
|
336
|
-
}
|
|
636
|
+
const resolvedBase = existsSync(basePath) ? realpathSync(basePath) : basePath;
|
|
637
|
+
const wtDir = join(resolvedBase, ".gsd", "worktrees");
|
|
638
|
+
if (!cwd.startsWith(wtDir)) return false;
|
|
639
|
+
const branch = nativeGetCurrentBranch(cwd);
|
|
640
|
+
return branch.startsWith("milestone/");
|
|
337
641
|
}
|
|
338
642
|
|
|
339
643
|
/**
|
|
@@ -344,7 +648,10 @@ export function isInAutoWorktree(basePath: string): boolean {
|
|
|
344
648
|
* gitdir: pointer) rather than just a stray directory. This prevents
|
|
345
649
|
* mis-detection of leftover directories as active worktrees (#695).
|
|
346
650
|
*/
|
|
347
|
-
export function getAutoWorktreePath(
|
|
651
|
+
export function getAutoWorktreePath(
|
|
652
|
+
basePath: string,
|
|
653
|
+
milestoneId: string,
|
|
654
|
+
): string | null {
|
|
348
655
|
const p = worktreePath(basePath, milestoneId);
|
|
349
656
|
if (!existsSync(p)) return null;
|
|
350
657
|
|
|
@@ -368,39 +675,42 @@ export function getAutoWorktreePath(basePath: string, milestoneId: string): stri
|
|
|
368
675
|
*
|
|
369
676
|
* Atomic: chdir + originalBase update in same try block.
|
|
370
677
|
*/
|
|
371
|
-
export function enterAutoWorktree(
|
|
678
|
+
export function enterAutoWorktree(
|
|
679
|
+
basePath: string,
|
|
680
|
+
milestoneId: string,
|
|
681
|
+
): string {
|
|
372
682
|
const p = worktreePath(basePath, milestoneId);
|
|
373
683
|
if (!existsSync(p)) {
|
|
374
|
-
throw new GSDError(
|
|
684
|
+
throw new GSDError(
|
|
685
|
+
GSD_IO_ERROR,
|
|
686
|
+
`Auto-worktree for ${milestoneId} does not exist at ${p}`,
|
|
687
|
+
);
|
|
375
688
|
}
|
|
376
689
|
|
|
377
690
|
// Validate this is a real git worktree, not a stray directory (#695)
|
|
378
691
|
const gitPath = join(p, ".git");
|
|
379
692
|
if (!existsSync(gitPath)) {
|
|
380
|
-
throw new GSDError(
|
|
693
|
+
throw new GSDError(
|
|
694
|
+
GSD_GIT_ERROR,
|
|
695
|
+
`Auto-worktree path ${p} exists but is not a git worktree (no .git)`,
|
|
696
|
+
);
|
|
381
697
|
}
|
|
382
698
|
try {
|
|
383
699
|
const content = readFileSync(gitPath, "utf8").trim();
|
|
384
700
|
if (!content.startsWith("gitdir: ")) {
|
|
385
|
-
throw new GSDError(
|
|
701
|
+
throw new GSDError(
|
|
702
|
+
GSD_GIT_ERROR,
|
|
703
|
+
`Auto-worktree path ${p} has a .git but it is not a worktree gitdir pointer`,
|
|
704
|
+
);
|
|
386
705
|
}
|
|
387
706
|
} catch (err) {
|
|
388
707
|
if (err instanceof Error && err.message.includes("worktree")) throw err;
|
|
389
|
-
throw new GSDError(
|
|
708
|
+
throw new GSDError(
|
|
709
|
+
GSD_IO_ERROR,
|
|
710
|
+
`Auto-worktree path ${p} exists but .git is unreadable`,
|
|
711
|
+
);
|
|
390
712
|
}
|
|
391
713
|
|
|
392
|
-
// Ensure worktree shares external state via symlink (#1311).
|
|
393
|
-
// On resume (enterAutoWorktree), the symlink may be missing if it was
|
|
394
|
-
// created before ensureGsdSymlink existed, or the .gsd/ directory may be
|
|
395
|
-
// a stale git-tracked copy instead of a symlink. Refreshing here ensures
|
|
396
|
-
// the worktree sees the same milestone state as the main repo.
|
|
397
|
-
ensureGsdSymlink(p);
|
|
398
|
-
|
|
399
|
-
// Sync .gsd/ state from main repo into worktree (#1311).
|
|
400
|
-
// Covers the case where .gsd/ is a real directory (not symlinked) and
|
|
401
|
-
// milestones were created on main after the worktree was last used.
|
|
402
|
-
syncGsdStateToWorktree(basePath, p);
|
|
403
|
-
|
|
404
714
|
const previousCwd = process.cwd();
|
|
405
715
|
|
|
406
716
|
try {
|
|
@@ -409,7 +719,7 @@ export function enterAutoWorktree(basePath: string, milestoneId: string): string
|
|
|
409
719
|
} catch (err) {
|
|
410
720
|
throw new GSDError(
|
|
411
721
|
GSD_IO_ERROR,
|
|
412
|
-
`Failed to enter auto-worktree at ${p}: ${
|
|
722
|
+
`Failed to enter auto-worktree at ${p}: ${err instanceof Error ? err.message : String(err)}`,
|
|
413
723
|
);
|
|
414
724
|
}
|
|
415
725
|
|
|
@@ -432,8 +742,10 @@ export function getActiveAutoWorktreeContext(): {
|
|
|
432
742
|
} | null {
|
|
433
743
|
if (!originalBase) return null;
|
|
434
744
|
const cwd = process.cwd();
|
|
435
|
-
const resolvedBase = existsSync(originalBase)
|
|
436
|
-
|
|
745
|
+
const resolvedBase = existsSync(originalBase)
|
|
746
|
+
? realpathSync(originalBase)
|
|
747
|
+
: originalBase;
|
|
748
|
+
const wtDir = join(resolvedBase, ".gsd", "worktrees");
|
|
437
749
|
if (!cwd.startsWith(wtDir)) return null;
|
|
438
750
|
const worktreeName = detectWorktreeName(cwd);
|
|
439
751
|
if (!worktreeName) return null;
|
|
@@ -457,7 +769,10 @@ function autoCommitDirtyState(cwd: string): boolean {
|
|
|
457
769
|
const status = nativeWorkingTreeStatus(cwd);
|
|
458
770
|
if (!status) return false;
|
|
459
771
|
nativeAddAll(cwd);
|
|
460
|
-
const result = nativeCommit(
|
|
772
|
+
const result = nativeCommit(
|
|
773
|
+
cwd,
|
|
774
|
+
"chore: auto-commit before milestone merge",
|
|
775
|
+
);
|
|
461
776
|
return result !== null;
|
|
462
777
|
} catch {
|
|
463
778
|
return false;
|
|
@@ -493,59 +808,53 @@ export function mergeMilestoneToMain(
|
|
|
493
808
|
// 1. Auto-commit dirty state in worktree before leaving
|
|
494
809
|
autoCommitDirtyState(worktreeCwd);
|
|
495
810
|
|
|
811
|
+
// Reconcile worktree DB into main DB before leaving worktree context
|
|
812
|
+
if (isDbAvailable()) {
|
|
813
|
+
try {
|
|
814
|
+
const worktreeDbPath = join(worktreeCwd, ".gsd", "gsd.db");
|
|
815
|
+
const mainDbPath = join(originalBasePath_, ".gsd", "gsd.db");
|
|
816
|
+
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
817
|
+
} catch {
|
|
818
|
+
/* non-fatal */
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
496
822
|
// 2. Parse roadmap for slice listing
|
|
497
823
|
const roadmap = parseRoadmap(roadmapContent);
|
|
498
|
-
const completedSlices = roadmap.slices.filter(s => s.done);
|
|
824
|
+
const completedSlices = roadmap.slices.filter((s) => s.done);
|
|
499
825
|
|
|
500
826
|
// 3. chdir to original base
|
|
501
827
|
const previousCwd = process.cwd();
|
|
502
828
|
process.chdir(originalBasePath_);
|
|
503
829
|
|
|
504
|
-
// 3a. Auto-commit any dirty state in the project root. Without this, the
|
|
505
|
-
// squash merge can fail with "Your local changes would be overwritten" (#1127).
|
|
506
|
-
autoCommitDirtyState(originalBasePath_);
|
|
507
|
-
|
|
508
|
-
// 3b. Remove untracked .gsd/ runtime files that syncStateToProjectRoot copied.
|
|
509
|
-
// Only clean specific runtime files — NEVER touch milestones/, decisions, or
|
|
510
|
-
// other planning artifacts that represent user work (#1250).
|
|
511
|
-
const runtimeFilesToClean = ["STATE.md", "completed-units.json", "auto.lock", "gsd.db"];
|
|
512
|
-
for (const f of runtimeFilesToClean) {
|
|
513
|
-
const p = join(originalBasePath_, ".gsd", f);
|
|
514
|
-
try { if (existsSync(p)) unlinkSync(p); } catch { /* non-fatal */ }
|
|
515
|
-
}
|
|
516
|
-
try {
|
|
517
|
-
const runtimeDir = join(originalBasePath_, ".gsd", "runtime");
|
|
518
|
-
if (existsSync(runtimeDir)) rmSync(runtimeDir, { recursive: true, force: true });
|
|
519
|
-
} catch { /* non-fatal */ }
|
|
520
|
-
|
|
521
830
|
// 4. Resolve integration branch — prefer milestone metadata, fall back to preferences / "main"
|
|
522
831
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
523
|
-
const integrationBranch = readIntegrationBranch(
|
|
832
|
+
const integrationBranch = readIntegrationBranch(
|
|
833
|
+
originalBasePath_,
|
|
834
|
+
milestoneId,
|
|
835
|
+
);
|
|
524
836
|
const mainBranch = integrationBranch ?? prefs.main_branch ?? "main";
|
|
525
837
|
|
|
838
|
+
// Remove transient project-root state files before any branch or merge
|
|
839
|
+
// operation. Untracked milestone metadata can otherwise block squash merges.
|
|
840
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
841
|
+
|
|
526
842
|
// 5. Checkout integration branch (skip if already current — avoids git error
|
|
527
843
|
// when main is already checked out in the project-root worktree, #757)
|
|
528
844
|
const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
|
|
529
845
|
if (currentBranchAtBase !== mainBranch) {
|
|
530
|
-
// Remove untracked .gsd/ state files that may conflict with the branch
|
|
531
|
-
// being checked out. These are regenerated by doctor/rebuildState and
|
|
532
|
-
// are not meaningful in the main working tree — the worktree had the
|
|
533
|
-
// real state. Without this, `git checkout main` fails with
|
|
534
|
-
// "Your local changes would be overwritten" (#827).
|
|
535
|
-
const gsdStateFiles = ["STATE.md", "completed-units.json", "auto.lock"];
|
|
536
|
-
for (const f of gsdStateFiles) {
|
|
537
|
-
const p = join(gsdRoot(originalBasePath_), f);
|
|
538
|
-
try { unlinkSync(p); } catch { /* non-fatal — file may not exist */ }
|
|
539
|
-
}
|
|
540
846
|
nativeCheckoutBranch(originalBasePath_, mainBranch);
|
|
541
847
|
}
|
|
542
848
|
|
|
543
849
|
// 6. Build rich commit message
|
|
544
|
-
const milestoneTitle =
|
|
850
|
+
const milestoneTitle =
|
|
851
|
+
roadmap.title.replace(/^M\d+:\s*/, "").trim() || milestoneId;
|
|
545
852
|
const subject = `feat(${milestoneId}): ${milestoneTitle}`;
|
|
546
853
|
let body = "";
|
|
547
854
|
if (completedSlices.length > 0) {
|
|
548
|
-
const sliceLines = completedSlices
|
|
855
|
+
const sliceLines = completedSlices
|
|
856
|
+
.map((s) => `- ${s.id}: ${s.title}`)
|
|
857
|
+
.join("\n");
|
|
549
858
|
body = `\n\nCompleted slices:\n${sliceLines}\n\nBranch: ${milestoneBranch}`;
|
|
550
859
|
}
|
|
551
860
|
const commitMessage = subject + body;
|
|
@@ -555,17 +864,20 @@ export function mergeMilestoneToMain(
|
|
|
555
864
|
|
|
556
865
|
if (!mergeResult.success) {
|
|
557
866
|
// Check for conflicts — use merge result first, fall back to nativeConflictFiles
|
|
558
|
-
const conflictedFiles =
|
|
559
|
-
|
|
560
|
-
|
|
867
|
+
const conflictedFiles =
|
|
868
|
+
mergeResult.conflicts.length > 0
|
|
869
|
+
? mergeResult.conflicts
|
|
870
|
+
: nativeConflictFiles(originalBasePath_);
|
|
561
871
|
|
|
562
872
|
if (conflictedFiles.length > 0) {
|
|
563
873
|
// Separate .gsd/ state file conflicts from real code conflicts.
|
|
564
|
-
// GSD state files (STATE.md,
|
|
874
|
+
// GSD state files (STATE.md, auto.lock, etc.)
|
|
565
875
|
// diverge between branches during normal operation — always prefer the
|
|
566
876
|
// milestone branch version since it has the latest execution state.
|
|
567
|
-
const gsdConflicts = conflictedFiles.filter(f => f.startsWith(".gsd/"));
|
|
568
|
-
const codeConflicts = conflictedFiles.filter(
|
|
877
|
+
const gsdConflicts = conflictedFiles.filter((f) => f.startsWith(".gsd/"));
|
|
878
|
+
const codeConflicts = conflictedFiles.filter(
|
|
879
|
+
(f) => !f.startsWith(".gsd/"),
|
|
880
|
+
);
|
|
569
881
|
|
|
570
882
|
// Auto-resolve .gsd/ conflicts by accepting the milestone branch version
|
|
571
883
|
if (gsdConflicts.length > 0) {
|
|
@@ -583,7 +895,12 @@ export function mergeMilestoneToMain(
|
|
|
583
895
|
|
|
584
896
|
// If there are still non-.gsd conflicts, escalate
|
|
585
897
|
if (codeConflicts.length > 0) {
|
|
586
|
-
throw new MergeConflictError(
|
|
898
|
+
throw new MergeConflictError(
|
|
899
|
+
codeConflicts,
|
|
900
|
+
"squash",
|
|
901
|
+
milestoneBranch,
|
|
902
|
+
mainBranch,
|
|
903
|
+
);
|
|
587
904
|
}
|
|
588
905
|
}
|
|
589
906
|
// No conflicts detected — possibly "already up to date", fall through to commit
|
|
@@ -638,7 +955,10 @@ export function mergeMilestoneToMain(
|
|
|
638
955
|
|
|
639
956
|
// 10. Remove worktree directory first (must happen before branch deletion)
|
|
640
957
|
try {
|
|
641
|
-
removeWorktree(originalBasePath_, milestoneId, {
|
|
958
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
959
|
+
branch: null as unknown as string,
|
|
960
|
+
deleteBranch: false,
|
|
961
|
+
});
|
|
642
962
|
} catch {
|
|
643
963
|
// Best-effort -- worktree dir may already be gone
|
|
644
964
|
}
|