@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.6ccd27b3
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/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +464 -200
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +207 -73
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2324
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +47 -29
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +50 -354
- package/dist/resources/extensions/gsd/auto.js +49 -22
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +69 -19
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +261 -136
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +144 -9
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +36 -31
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +207 -102
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.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/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +543 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +700 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +232 -76
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3013
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +48 -33
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +56 -366
- package/src/resources/extensions/gsd/auto.ts +69 -26
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +89 -18
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +272 -155
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +195 -29
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +329 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +54 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +49 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Git checkout/stash/merge-state recovery primitives for worktree operations.
|
|
3
|
+
/**
|
|
4
|
+
* Worktree Git Recovery — the recurring-bug hot spot, in one place.
|
|
5
|
+
*
|
|
6
|
+
* Owns the verbs that recover a repository from interrupted or conflicting
|
|
7
|
+
* git operations during worktree transitions:
|
|
8
|
+
*
|
|
9
|
+
* - `checkoutBranchWithStashGuard` — branch switch with stash protection,
|
|
10
|
+
* including the stash-pop EEXIST collision recovery for untracked files
|
|
11
|
+
* (force-checkout + targeted stash drop; #645 broadened it beyond `.gsd/`,
|
|
12
|
+
* guarded by "no non-.gsd unmerged entries remain").
|
|
13
|
+
* - `removeMergeStateFiles` — clears SQUASH_MSG / MERGE_HEAD / etc. left by
|
|
14
|
+
* a failed merge so subsequent merges don't fail on stale state.
|
|
15
|
+
* - `cleanupConflictState` — merge-abort + index reset + state-file cleanup
|
|
16
|
+
* after a conflicted (including squash) merge.
|
|
17
|
+
* - stash helpers (`popStashByRef`, `stashRefFromError`,
|
|
18
|
+
* `stashAlreadyExistsFilesFromError`, `gsdJsonlFilesWithConflictMarkers`)
|
|
19
|
+
* used by the merge pipeline in auto-worktree.ts.
|
|
20
|
+
*
|
|
21
|
+
* Extracted from auto-worktree.ts so recovery fixes land here instead of as
|
|
22
|
+
* embedded special cases in a 2,600-line orchestration module, and so the
|
|
23
|
+
* rules can be tested against scripted git states.
|
|
24
|
+
*
|
|
25
|
+
* The State Reconciliation drift repair (`state-reconciliation/drift/
|
|
26
|
+
* merge-state.ts`) keeps its own merge-state primitive by design — drift
|
|
27
|
+
* repairs own their raw primitives (see CONTEXT.md, Drift repair).
|
|
28
|
+
*/
|
|
29
|
+
import { execFileSync } from "node:child_process";
|
|
30
|
+
import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
31
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
32
|
+
import { debugLog } from "./debug-logger.js";
|
|
33
|
+
import { logError, logWarning } from "./workflow-logger.js";
|
|
34
|
+
import { nativeAddPaths, nativeCheckoutBranch, nativeConflictFiles, nativeLsFiles, nativeMergeAbort, nativeWorkingTreeStatus, } from "./native-git-bridge.js";
|
|
35
|
+
import { resolveGitDir } from "./worktree-manager.js";
|
|
36
|
+
/**
|
|
37
|
+
* Pop the stash entry created with `stashMarker` in its subject, resolving it
|
|
38
|
+
* to a concrete `stash@{n}` ref first so a concurrent stash push cannot make
|
|
39
|
+
* `git stash pop` grab the wrong entry.
|
|
40
|
+
*
|
|
41
|
+
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
42
|
+
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
43
|
+
* returns null.
|
|
44
|
+
*
|
|
45
|
+
* Throws on pop failure so callers can handle conflict cases the same way
|
|
46
|
+
* they would with the prior `git stash pop` form. When throwing after a
|
|
47
|
+
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
48
|
+
*
|
|
49
|
+
* (Issue #4980 HIGH-6)
|
|
50
|
+
*/
|
|
51
|
+
export function popStashByRef(basePath, stashMarker) {
|
|
52
|
+
let popArg = null;
|
|
53
|
+
if (stashMarker) {
|
|
54
|
+
try {
|
|
55
|
+
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
56
|
+
cwd: basePath,
|
|
57
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
58
|
+
encoding: "utf-8",
|
|
59
|
+
}).trim().split("\n").filter(Boolean);
|
|
60
|
+
for (const entry of list) {
|
|
61
|
+
const [ref, subject] = entry.split("\0");
|
|
62
|
+
if (ref && subject?.includes(stashMarker)) {
|
|
63
|
+
popArg = ref;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!popArg) {
|
|
73
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
execFileSync("git", ["stash", "pop", popArg], {
|
|
78
|
+
cwd: basePath,
|
|
79
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
80
|
+
encoding: "utf-8",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (err && typeof err === "object") {
|
|
85
|
+
err.stashRef = popArg;
|
|
86
|
+
}
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
return popArg;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
93
|
+
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
94
|
+
*/
|
|
95
|
+
export function stashRefFromError(err) {
|
|
96
|
+
if (!err || typeof err !== "object")
|
|
97
|
+
return null;
|
|
98
|
+
const stashRef = err.stashRef;
|
|
99
|
+
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
100
|
+
}
|
|
101
|
+
export function stashAlreadyExistsFilesFromError(err) {
|
|
102
|
+
if (!err || typeof err !== "object")
|
|
103
|
+
return [];
|
|
104
|
+
const stderr = err.stderr;
|
|
105
|
+
const stderrText = typeof stderr === "string"
|
|
106
|
+
? stderr
|
|
107
|
+
: stderr instanceof Uint8Array
|
|
108
|
+
? Buffer.from(stderr).toString("utf-8")
|
|
109
|
+
: "";
|
|
110
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
111
|
+
const text = `${stderrText}\n${message}`;
|
|
112
|
+
const files = new Set();
|
|
113
|
+
for (const line of text.split("\n")) {
|
|
114
|
+
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
115
|
+
if (!m)
|
|
116
|
+
continue;
|
|
117
|
+
const filePath = m[1]?.trim();
|
|
118
|
+
if (filePath)
|
|
119
|
+
files.add(filePath);
|
|
120
|
+
}
|
|
121
|
+
return [...files];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
125
|
+
* markers from a failed stash-pop or merge attempt.
|
|
126
|
+
*
|
|
127
|
+
* Returns false when the file cannot be read.
|
|
128
|
+
*/
|
|
129
|
+
export function hasConflictMarkers(filePath) {
|
|
130
|
+
try {
|
|
131
|
+
const content = readFileSync(filePath, "utf-8");
|
|
132
|
+
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function gsdJsonlFilesWithConflictMarkers(basePath) {
|
|
139
|
+
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) => hasConflictMarkers(join(basePath, f)));
|
|
140
|
+
}
|
|
141
|
+
export function removeMergeStateFiles(basePath, contextLabel) {
|
|
142
|
+
try {
|
|
143
|
+
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
144
|
+
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
145
|
+
cwd: basePath,
|
|
146
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
147
|
+
encoding: "utf-8",
|
|
148
|
+
}).trim();
|
|
149
|
+
const p = rawPath.length > 0
|
|
150
|
+
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
151
|
+
: join(resolveGitDir(basePath), f);
|
|
152
|
+
if (existsSync(p))
|
|
153
|
+
unlinkSync(p);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export function cleanupConflictState(basePath) {
|
|
161
|
+
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
162
|
+
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
163
|
+
// index, then remove merge message files that native/libgit2 paths may have
|
|
164
|
+
// created.
|
|
165
|
+
try {
|
|
166
|
+
nativeMergeAbort(basePath);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
170
|
+
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
171
|
+
error: err instanceof Error ? err.message : String(err),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
execFileSync("git", ["reset", "--merge"], {
|
|
176
|
+
cwd: basePath,
|
|
177
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
178
|
+
encoding: "utf-8",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
183
|
+
}
|
|
184
|
+
removeMergeStateFiles(basePath, "conflict");
|
|
185
|
+
}
|
|
186
|
+
export function checkoutBranchWithStashGuard(basePath, branch, reason) {
|
|
187
|
+
let stashMarker = null;
|
|
188
|
+
let stashed = false;
|
|
189
|
+
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
190
|
+
if (status.length > 0) {
|
|
191
|
+
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
192
|
+
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
193
|
+
cwd: basePath,
|
|
194
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
195
|
+
encoding: "utf-8",
|
|
196
|
+
});
|
|
197
|
+
execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`], {
|
|
198
|
+
cwd: basePath,
|
|
199
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
200
|
+
encoding: "utf-8",
|
|
201
|
+
});
|
|
202
|
+
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
203
|
+
cwd: basePath,
|
|
204
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
205
|
+
encoding: "utf-8",
|
|
206
|
+
});
|
|
207
|
+
stashed = stashListAfter !== stashListBefore;
|
|
208
|
+
}
|
|
209
|
+
// Checkout and stash-restore are split so we can distinguish two failure
|
|
210
|
+
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
211
|
+
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
212
|
+
// the working-tree changes remain in the stash list. We surface a distinct
|
|
213
|
+
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
214
|
+
try {
|
|
215
|
+
nativeCheckoutBranch(basePath, branch);
|
|
216
|
+
}
|
|
217
|
+
catch (checkoutErr) {
|
|
218
|
+
if (stashed) {
|
|
219
|
+
try {
|
|
220
|
+
popStashByRef(basePath, stashMarker);
|
|
221
|
+
}
|
|
222
|
+
catch (restoreErr) {
|
|
223
|
+
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
throw checkoutErr;
|
|
227
|
+
}
|
|
228
|
+
if (stashed) {
|
|
229
|
+
try {
|
|
230
|
+
popStashByRef(basePath, stashMarker);
|
|
231
|
+
}
|
|
232
|
+
catch (popErr) {
|
|
233
|
+
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
234
|
+
const stderr = popErr && typeof popErr === "object"
|
|
235
|
+
? popErr.stderr
|
|
236
|
+
: undefined;
|
|
237
|
+
const stderrText = typeof stderr === "string"
|
|
238
|
+
? stderr
|
|
239
|
+
: stderr instanceof Uint8Array
|
|
240
|
+
? Buffer.from(stderr).toString("utf-8")
|
|
241
|
+
: "";
|
|
242
|
+
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
243
|
+
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
244
|
+
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
245
|
+
const stashRefForDrop = stashRefFromError(popErr);
|
|
246
|
+
const allConflictFiles = nativeConflictFiles(basePath);
|
|
247
|
+
const nonGsdUnmerged = allConflictFiles.filter((f) => !f.startsWith(".gsd/"));
|
|
248
|
+
const gsdUnmerged = allConflictFiles.filter((f) => f.startsWith(".gsd/"));
|
|
249
|
+
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
250
|
+
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
251
|
+
: [];
|
|
252
|
+
// Resolve ALL untracked-collision files by accepting HEAD — files in
|
|
253
|
+
// alreadyExists were untracked on the source branch by definition of the
|
|
254
|
+
// "already exists, no checkout" failure, so target HEAD is authoritative.
|
|
255
|
+
// gsdUnmerged: .gsd/ index conflicts left by the partial stash pop are
|
|
256
|
+
// also resolved via HEAD — .gsd/ runtime state is always authoritative
|
|
257
|
+
// on the target branch, so accepting HEAD is safe here too.
|
|
258
|
+
const resolvable = [...new Set([...alreadyExists, ...gsdContentConflicts, ...gsdUnmerged])];
|
|
259
|
+
if (isUntrackedRestoreFailure &&
|
|
260
|
+
resolvable.length > 0 &&
|
|
261
|
+
nonGsdUnmerged.length === 0) {
|
|
262
|
+
for (const f of resolvable) {
|
|
263
|
+
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
264
|
+
cwd: basePath,
|
|
265
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
266
|
+
encoding: "utf-8",
|
|
267
|
+
});
|
|
268
|
+
nativeAddPaths(basePath, [f]);
|
|
269
|
+
}
|
|
270
|
+
if (stashRefForDrop) {
|
|
271
|
+
try {
|
|
272
|
+
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
273
|
+
cwd: basePath,
|
|
274
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
275
|
+
encoding: "utf-8",
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (err) { /* stash may already be consumed */
|
|
279
|
+
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const wrapped = new Error(`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`);
|
|
288
|
+
if (stashRefForDrop)
|
|
289
|
+
wrapped.stashRef = stashRefForDrop;
|
|
290
|
+
throw wrapped;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
@@ -32,6 +32,7 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
|
|
|
32
32
|
// callers — production wiring previously injected them via deps; the seam
|
|
33
33
|
// added type churn without enabling test variation.
|
|
34
34
|
import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
|
|
35
|
+
import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
|
|
35
36
|
import { invalidateAllCaches } from "./cache.js";
|
|
36
37
|
import { resolveMilestoneFile } from "./paths.js";
|
|
37
38
|
import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
@@ -327,7 +328,15 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
327
328
|
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
328
329
|
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
329
330
|
const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
330
|
-
|
|
331
|
+
// A stranded-recovery session that adopted the milestone branch in the
|
|
332
|
+
// project root must keep re-entering in that mode: the root checkout holds
|
|
333
|
+
// the branch, so creating the canonical worktree would fail with "already
|
|
334
|
+
// in use by another worktree". The override clears when the recovered
|
|
335
|
+
// milestone merges (_mergeAndExit), restoring configured isolation for
|
|
336
|
+
// subsequent milestones.
|
|
337
|
+
const mode = opts.modeOverride ??
|
|
338
|
+
s.strandedRecoveryIsolationMode ??
|
|
339
|
+
getIsolationMode(basePath);
|
|
331
340
|
if (s.isolationDegraded) {
|
|
332
341
|
if (mode === "worktree") {
|
|
333
342
|
try {
|
|
@@ -335,7 +344,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
335
344
|
s.basePath = basePath;
|
|
336
345
|
rebuildGitService(s, deps);
|
|
337
346
|
invalidateAllCaches();
|
|
338
|
-
ctx.notify(
|
|
347
|
+
ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
|
|
339
348
|
return { ok: true, mode: "branch", path: basePath };
|
|
340
349
|
}
|
|
341
350
|
catch (err) {
|
|
@@ -509,7 +518,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
509
518
|
eventType: "worktree-create-failed",
|
|
510
519
|
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
511
520
|
});
|
|
512
|
-
ctx.notify(
|
|
521
|
+
ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
|
|
513
522
|
// Degrade isolation for the rest of this session so mergeAndExit
|
|
514
523
|
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
515
524
|
s.isolationDegraded = true;
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* GSD Worktree Manager
|
|
5
5
|
*
|
|
6
|
-
* Creates and manages git worktrees under .gsd
|
|
6
|
+
* Creates and manages git worktrees under .gsd-worktrees/<name>/ (canonical;
|
|
7
|
+
* legacy .gsd/worktrees/<name>/ stays recognized — see worktree-placement.ts).
|
|
7
8
|
* Each worktree gets its own branch (worktree/<name>) and a full
|
|
8
9
|
* working copy of the project, enabling parallel work streams.
|
|
9
10
|
*
|
|
@@ -11,7 +12,7 @@
|
|
|
11
12
|
* the main branch, then dispatches an LLM-guided merge flow.
|
|
12
13
|
*
|
|
13
14
|
* Flow:
|
|
14
|
-
* 1. create() — git worktree add .gsd
|
|
15
|
+
* 1. create() — git worktree add .gsd-worktrees/<name> -b worktree/<name>
|
|
15
16
|
* 2. user works in the worktree (new plans, milestones, etc.)
|
|
16
17
|
* 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
|
|
17
18
|
* 4. remove() — git worktree remove + branch cleanup
|
|
@@ -24,6 +25,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
24
25
|
import { nativeBranchList, nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeIsAncestor, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
25
26
|
import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
|
|
26
27
|
import { isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
28
|
+
import { canonicalWorktreesDir, worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
27
29
|
function deleteBranchIfPresent(basePath, branch, warningPrefix) {
|
|
28
30
|
try {
|
|
29
31
|
if (!nativeBranchExists(basePath, branch))
|
|
@@ -81,30 +83,39 @@ export function resolveGitDir(basePath) {
|
|
|
81
83
|
}
|
|
82
84
|
return gitPath;
|
|
83
85
|
}
|
|
86
|
+
/** Canonical container for new worktrees. For scans that must also see legacy
|
|
87
|
+
* worktrees, use allWorktreesDirs(). */
|
|
84
88
|
export function worktreesDir(basePath) {
|
|
85
|
-
return
|
|
89
|
+
return canonicalWorktreesDir(resolveWorktreeProjectRoot(basePath));
|
|
86
90
|
}
|
|
91
|
+
/** Every container a GSD worktree may live in (canonical + legacy), canonical first. */
|
|
92
|
+
export function allWorktreesDirs(basePath) {
|
|
93
|
+
return worktreesDirs(resolveWorktreeProjectRoot(basePath));
|
|
94
|
+
}
|
|
95
|
+
/** Path for worktree `name` — an existing legacy worktree keeps its location. */
|
|
87
96
|
export function worktreePath(basePath, name) {
|
|
88
|
-
return
|
|
97
|
+
return worktreePathFor(resolveWorktreeProjectRoot(basePath), name);
|
|
89
98
|
}
|
|
90
99
|
export function worktreeBranchName(name) {
|
|
91
100
|
return `worktree/${name}`;
|
|
92
101
|
}
|
|
93
102
|
/**
|
|
94
|
-
* Validate that a path is inside
|
|
95
|
-
*
|
|
96
|
-
* so that a symlink-resolved
|
|
103
|
+
* Validate that a path is inside a GSD worktrees container (canonical
|
|
104
|
+
* .gsd-worktrees/ or legacy .gsd/worktrees/). Resolves symlinks and
|
|
105
|
+
* normalizes ".." traversals before comparison so that a symlink-resolved
|
|
106
|
+
* or crafted path cannot escape containment.
|
|
97
107
|
*
|
|
98
108
|
* Used as a safety gate before any destructive operation (rmSync,
|
|
99
109
|
* nativeWorktreeRemove --force) to prevent #2365-style data loss.
|
|
100
110
|
*/
|
|
101
111
|
export function isInsideWorktreesDir(basePath, targetPath) {
|
|
102
|
-
const wtDirPath = worktreesDir(basePath);
|
|
103
|
-
const wtDir = existsSync(wtDirPath) ? realpathSync(wtDirPath) : resolve(wtDirPath);
|
|
104
112
|
const resolved = existsSync(targetPath) ? realpathSync(targetPath) : resolve(targetPath);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
return allWorktreesDirs(basePath).some((wtDirPath) => {
|
|
114
|
+
const wtDir = existsSync(wtDirPath) ? realpathSync(wtDirPath) : resolve(wtDirPath);
|
|
115
|
+
// The resolved path must start with the worktrees dir followed by a separator,
|
|
116
|
+
// not merely be a prefix match (e.g. ".gsd/worktrees-extra" must not match).
|
|
117
|
+
return resolved === wtDir || resolved.startsWith(wtDir + sep);
|
|
118
|
+
});
|
|
108
119
|
}
|
|
109
120
|
function isRegisteredGitWorktreeAtPath(basePath, wtPath) {
|
|
110
121
|
try {
|
|
@@ -200,11 +211,11 @@ export function buildManualValidationGuidance(basePath, milestoneId, opts = {})
|
|
|
200
211
|
if (!milestoneId)
|
|
201
212
|
return null;
|
|
202
213
|
const validationRoot = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
203
|
-
const inWorktree = validationRoot
|
|
214
|
+
const inWorktree = isGsdWorktreePath(validationRoot);
|
|
204
215
|
const lines = [`Validate the work here: ${validationRoot}`];
|
|
205
216
|
if (inWorktree) {
|
|
206
|
-
lines.push("This milestone runs in a git worktree, so the code lives under the
|
|
207
|
-
|
|
217
|
+
lines.push("This milestone runs in a git worktree, so the code lives under the " +
|
|
218
|
+
`GSD worktrees directory. Open it with: cd "${validationRoot}"`);
|
|
208
219
|
}
|
|
209
220
|
if (opts.uatPath) {
|
|
210
221
|
lines.push(`Follow the UAT checklist at: ${opts.uatPath}`);
|
|
@@ -224,21 +235,29 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
224
235
|
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
225
236
|
throw new GSDError(GSD_PARSE_ERROR, `Invalid worktree name "${name}". Use only letters, numbers, hyphens, and underscores.`);
|
|
226
237
|
}
|
|
227
|
-
const
|
|
238
|
+
const existingPath = worktreePath(basePath, name);
|
|
228
239
|
const branch = opts.branch ?? worktreeBranchName(name);
|
|
229
|
-
if (existsSync(
|
|
240
|
+
if (existsSync(existingPath)) {
|
|
230
241
|
// A valid git worktree is registered in `git worktree list` and has a .git
|
|
231
242
|
// *file* with a gitdir: pointer. Leftover directories (no .git, a standalone
|
|
232
243
|
// .git directory from accidental `git init`, or an orphan pointer) block
|
|
233
244
|
// creation unless removed.
|
|
234
|
-
if (isRegisteredGitWorktreeAtPath(basePath,
|
|
235
|
-
throw new GSDError(GSD_STALE_STATE, `Worktree "${name}" already exists at ${
|
|
245
|
+
if (isRegisteredGitWorktreeAtPath(basePath, existingPath)) {
|
|
246
|
+
throw new GSDError(GSD_STALE_STATE, `Worktree "${name}" already exists at ${existingPath}`);
|
|
236
247
|
}
|
|
237
|
-
removeStaleWorktreeDirectory(
|
|
248
|
+
removeStaleWorktreeDirectory(existingPath, name);
|
|
238
249
|
}
|
|
239
|
-
//
|
|
250
|
+
// New worktrees always land in the canonical container, even when a stale
|
|
251
|
+
// legacy directory was just cleaned up.
|
|
240
252
|
const wtDir = worktreesDir(basePath);
|
|
253
|
+
const wtPath = join(wtDir, name);
|
|
241
254
|
mkdirSync(wtDir, { recursive: true });
|
|
255
|
+
// When existingPath resolved to a legacy location, the canonical target may
|
|
256
|
+
// still hold a stale directory from a prior aborted creation (no .git marker).
|
|
257
|
+
// Remove it so git worktree add does not fail with "path already exists".
|
|
258
|
+
if (existingPath !== wtPath && existsSync(wtPath) && !isRegisteredGitWorktreeAtPath(basePath, wtPath)) {
|
|
259
|
+
removeStaleWorktreeDirectory(wtPath, name);
|
|
260
|
+
}
|
|
242
261
|
// Prune any stale worktree entries from a previous removal
|
|
243
262
|
nativeWorktreePrune(basePath);
|
|
244
263
|
// Use the explicit start point (e.g. integration branch) if provided,
|
|
@@ -305,7 +324,8 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
305
324
|
}
|
|
306
325
|
/**
|
|
307
326
|
* List all GSD-managed worktrees.
|
|
308
|
-
* Uses native worktree list and filters to those under
|
|
327
|
+
* Uses native worktree list and filters to those under a GSD worktrees
|
|
328
|
+
* container (canonical .gsd-worktrees/ or legacy .gsd/worktrees/).
|
|
309
329
|
*/
|
|
310
330
|
export function listWorktrees(basePath) {
|
|
311
331
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
@@ -315,12 +335,8 @@ export function listWorktrees(basePath) {
|
|
|
315
335
|
}
|
|
316
336
|
const seenRoots = new Set();
|
|
317
337
|
const worktreeRoots = baseVariants
|
|
318
|
-
.
|
|
319
|
-
|
|
320
|
-
return {
|
|
321
|
-
normalized: normalizePathForComparison(path),
|
|
322
|
-
};
|
|
323
|
-
})
|
|
338
|
+
.flatMap(baseVariant => worktreesDirs(baseVariant))
|
|
339
|
+
.map(path => ({ normalized: normalizePathForComparison(path) }))
|
|
324
340
|
.filter(root => {
|
|
325
341
|
if (seenRoots.has(root.normalized))
|
|
326
342
|
return false;
|
|
@@ -512,7 +528,13 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
512
528
|
// inside .gsd/worktrees/ — a symlink inside the directory could point out.
|
|
513
529
|
const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
|
|
514
530
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
515
|
-
|
|
531
|
+
let cwd;
|
|
532
|
+
try {
|
|
533
|
+
cwd = process.cwd();
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
cwd = basePath;
|
|
537
|
+
}
|
|
516
538
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
517
539
|
if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
|
|
518
540
|
process.chdir(basePath);
|
|
@@ -645,6 +667,7 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
645
667
|
* This module uses a split representation (paths/exact/prefixes) for efficient matching.
|
|
646
668
|
*/
|
|
647
669
|
const SKIP_PATHS = [
|
|
670
|
+
".gsd-worktrees/",
|
|
648
671
|
".gsd/worktrees/",
|
|
649
672
|
".gsd/runtime/",
|
|
650
673
|
".gsd/activity/",
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Placement module — owns WHERE GSD worktrees physically live.
|
|
3
|
+
*
|
|
4
|
+
* Canonical placement: `<projectRoot>/.gsd-worktrees/<name>` — a real
|
|
5
|
+
* directory that never crosses the `.gsd` symlink managed by repo-identity.
|
|
6
|
+
* Under the external-state layout (`.gsd → ~/.gsd/projects/<hash>/`), the
|
|
7
|
+
* legacy `.gsd/worktrees/` location materialised worktrees inside the user's
|
|
8
|
+
* home directory behind an opaque hash path; the canonical sibling keeps the
|
|
9
|
+
* working copy at the project root regardless of where `.gsd` state lives.
|
|
10
|
+
*
|
|
11
|
+
* Legacy placement (`<projectRoot>/.gsd/worktrees/<name>`, possibly resolving
|
|
12
|
+
* through the symlink to `~/.gsd/projects/<hash>/worktrees/<name>`) stays
|
|
13
|
+
* recognized so in-flight milestones keep working across upgrades:
|
|
14
|
+
* - creation always uses the canonical location;
|
|
15
|
+
* - resolution prefers an existing legacy worktree for the same name;
|
|
16
|
+
* - containment checks accept membership in either location.
|
|
17
|
+
*
|
|
18
|
+
* Path → project identification lives in worktree-root.ts; this module owns
|
|
19
|
+
* only the forward direction (project + name → physical path).
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
/** Directory name of the canonical worktrees container at the project root. */
|
|
24
|
+
export const CANONICAL_WORKTREES_DIRNAME = ".gsd-worktrees";
|
|
25
|
+
/** Canonical container for newly created worktrees. Never crosses the `.gsd` symlink. */
|
|
26
|
+
export function canonicalWorktreesDir(projectRoot) {
|
|
27
|
+
return join(projectRoot, CANONICAL_WORKTREES_DIRNAME);
|
|
28
|
+
}
|
|
29
|
+
/** Legacy container (`.gsd/worktrees/`) — may resolve through the external-state symlink. */
|
|
30
|
+
export function legacyWorktreesDir(projectRoot) {
|
|
31
|
+
return join(projectRoot, ".gsd", "worktrees");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* All containers a GSD worktree may live in, canonical first.
|
|
35
|
+
* Use for listing, scanning, and containment checks.
|
|
36
|
+
*/
|
|
37
|
+
export function worktreesDirs(projectRoot) {
|
|
38
|
+
return [canonicalWorktreesDir(projectRoot), legacyWorktreesDir(projectRoot)];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Physical path for the worktree `name` under `projectRoot`.
|
|
42
|
+
*
|
|
43
|
+
* Canonical wins only when it has a `.git` marker (i.e. is a live worktree).
|
|
44
|
+
* A bare directory with no `.git` — a stale leftover from an aborted create
|
|
45
|
+
* or a partial cleanup — does not shadow an existing legacy worktree, so the
|
|
46
|
+
* legacy path is tried next. The legacy check remains a plain existsSync;
|
|
47
|
+
* callers that need a *registered* worktree validate the `.git` marker
|
|
48
|
+
* themselves (resolveCanonicalMilestoneRoot, getAutoWorktreePath).
|
|
49
|
+
* Falls back to canonical for new-worktree creation when neither path exists.
|
|
50
|
+
*/
|
|
51
|
+
export function worktreePathFor(projectRoot, name) {
|
|
52
|
+
const canonical = join(canonicalWorktreesDir(projectRoot), name);
|
|
53
|
+
if (existsSync(canonical) && existsSync(join(canonical, ".git")))
|
|
54
|
+
return canonical;
|
|
55
|
+
const legacy = join(legacyWorktreesDir(projectRoot), name);
|
|
56
|
+
if (existsSync(legacy))
|
|
57
|
+
return legacy;
|
|
58
|
+
return canonical;
|
|
59
|
+
}
|
|
@@ -8,19 +8,23 @@
|
|
|
8
8
|
import { readdirSync } from "node:fs";
|
|
9
9
|
import { enterAutoWorktree, getAutoWorktreePath } from "./auto-worktree.js";
|
|
10
10
|
import { getIsolationMode } from "./preferences.js";
|
|
11
|
-
import {
|
|
11
|
+
import { allWorktreesDirs } from "./worktree-manager.js";
|
|
12
12
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
13
13
|
/**
|
|
14
|
-
* Enumerate the live (valid git) auto-worktrees
|
|
14
|
+
* Enumerate the live (valid git) auto-worktrees in the project's worktree
|
|
15
|
+
* containers (canonical .gsd-worktrees/ and legacy .gsd/worktrees/).
|
|
15
16
|
* Reuses getAutoWorktreePath's validation so stray directories are ignored.
|
|
16
17
|
*/
|
|
17
18
|
function liveMilestoneWorktrees(projectRoot) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
const names = new Set();
|
|
20
|
+
for (const dir of allWorktreesDirs(projectRoot)) {
|
|
21
|
+
try {
|
|
22
|
+
for (const name of readdirSync(dir))
|
|
23
|
+
names.add(name);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// container absent — skip
|
|
27
|
+
}
|
|
24
28
|
}
|
|
25
29
|
const live = [];
|
|
26
30
|
for (const id of names) {
|