@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- 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 +38 -6
- 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 +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +15 -20
- 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 +32 -12
- 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-handlers.js +46 -3
- 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 +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -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/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- 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 +51 -5
- package/dist/resources/extensions/gsd/markdown-renderer.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/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/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/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- 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-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- 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 +337 -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/web-app-uat.js +45 -8
- 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 +45 -28
- 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 +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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 +8 -8
- 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 +8 -8
- 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 +1 -1
- 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/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -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 +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.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-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/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/dist/cli.js +6 -3
- 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/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/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 +145 -59
- 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/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/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 +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- 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/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/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/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- 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 +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +28 -24
- 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 +33 -12
- 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-handlers.ts +46 -3
- 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 +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -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/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- 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 +50 -5
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -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/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/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/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- 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-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- 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/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/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/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/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- 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 +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- 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/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/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/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- 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/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/runtime-invariant-modules.test.ts +1 -0
- 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/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-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- 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 +155 -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/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -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 +2 -2
- 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-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- 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 +412 -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/web-app-uat.ts +51 -8
- 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 +47 -28
- 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 +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- 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/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
unlinkSync,
|
|
21
21
|
lstatSync as lstatSyncFn,
|
|
22
22
|
} from "node:fs";
|
|
23
|
-
import { dirname, isAbsolute, join, relative, resolve
|
|
23
|
+
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
24
24
|
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
25
25
|
import {
|
|
26
26
|
reconcileWorktreeDb,
|
|
@@ -44,6 +44,7 @@ import {
|
|
|
44
44
|
worktreePath,
|
|
45
45
|
isInsideWorktreesDir,
|
|
46
46
|
} from "./worktree-manager.js";
|
|
47
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
47
48
|
import {
|
|
48
49
|
detectWorktreeName,
|
|
49
50
|
resolveGitHeadPath,
|
|
@@ -51,17 +52,25 @@ import {
|
|
|
51
52
|
} from "./worktree.js";
|
|
52
53
|
import {
|
|
53
54
|
isGsdWorktreePath,
|
|
55
|
+
projectRootFromWorktreePath,
|
|
54
56
|
normalizeWorktreePathForCompare,
|
|
55
57
|
resolveWorktreeProjectRoot,
|
|
56
58
|
} from "./worktree-root.js";
|
|
57
59
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
58
60
|
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
59
|
-
import {
|
|
60
|
-
buildPullRequestEvidence,
|
|
61
|
-
createDraftPullRequestFromEvidence,
|
|
62
|
-
} from "./pull-request-process.js";
|
|
61
|
+
import { publishMilestone } from "./publication.js";
|
|
63
62
|
import { debugLog } from "./debug-logger.js";
|
|
64
63
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
64
|
+
import {
|
|
65
|
+
checkoutBranchWithStashGuard,
|
|
66
|
+
cleanupConflictState,
|
|
67
|
+
gsdJsonlFilesWithConflictMarkers,
|
|
68
|
+
hasConflictMarkers,
|
|
69
|
+
popStashByRef,
|
|
70
|
+
removeMergeStateFiles,
|
|
71
|
+
stashAlreadyExistsFilesFromError,
|
|
72
|
+
stashRefFromError,
|
|
73
|
+
} from "./worktree-git-recovery.js";
|
|
65
74
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
66
75
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
67
76
|
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
@@ -85,7 +94,6 @@ import {
|
|
|
85
94
|
nativeDiffNumstat,
|
|
86
95
|
nativeUpdateRef,
|
|
87
96
|
nativeIsAncestor,
|
|
88
|
-
nativeMergeAbort,
|
|
89
97
|
nativeWorktreeList,
|
|
90
98
|
nativeLsFiles,
|
|
91
99
|
} from "./native-git-bridge.js";
|
|
@@ -132,111 +140,6 @@ const ROOT_STATE_FILES = [
|
|
|
132
140
|
// because the project root is authoritative for preferences (#2684).
|
|
133
141
|
] as const;
|
|
134
142
|
|
|
135
|
-
/**
|
|
136
|
-
* Pop a stash entry by tracking the unique marker embedded in its message so
|
|
137
|
-
* concurrent stash operations against the same project root cannot cause us to
|
|
138
|
-
* pop the wrong entry.
|
|
139
|
-
*
|
|
140
|
-
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
141
|
-
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
142
|
-
* returns null.
|
|
143
|
-
*
|
|
144
|
-
* Throws on pop failure so callers can handle conflict cases the same way
|
|
145
|
-
* they would with the prior `git stash pop` form. When throwing after a
|
|
146
|
-
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
147
|
-
*
|
|
148
|
-
* (Issue #4980 HIGH-6)
|
|
149
|
-
*/
|
|
150
|
-
function popStashByRef(basePath: string, stashMarker: string | null): string | null {
|
|
151
|
-
let popArg: string | null = null;
|
|
152
|
-
if (stashMarker) {
|
|
153
|
-
try {
|
|
154
|
-
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
155
|
-
cwd: basePath,
|
|
156
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
157
|
-
encoding: "utf-8",
|
|
158
|
-
}).trim().split("\n").filter(Boolean);
|
|
159
|
-
for (const entry of list) {
|
|
160
|
-
const [ref, subject] = entry.split("\0");
|
|
161
|
-
if (ref && subject?.includes(stashMarker)) {
|
|
162
|
-
popArg = ref;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
} catch (err) {
|
|
167
|
-
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (!popArg) {
|
|
171
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
try {
|
|
175
|
-
execFileSync("git", ["stash", "pop", popArg], {
|
|
176
|
-
cwd: basePath,
|
|
177
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
178
|
-
encoding: "utf-8",
|
|
179
|
-
});
|
|
180
|
-
} catch (err) {
|
|
181
|
-
if (err && typeof err === "object") {
|
|
182
|
-
(err as { stashRef?: string }).stashRef = popArg;
|
|
183
|
-
}
|
|
184
|
-
throw err;
|
|
185
|
-
}
|
|
186
|
-
return popArg;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
191
|
-
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
192
|
-
*/
|
|
193
|
-
function stashRefFromError(err: unknown): string | null {
|
|
194
|
-
if (!err || typeof err !== "object") return null;
|
|
195
|
-
const stashRef = (err as { stashRef?: unknown }).stashRef;
|
|
196
|
-
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function stashAlreadyExistsFilesFromError(err: unknown): string[] {
|
|
200
|
-
if (!err || typeof err !== "object") return [];
|
|
201
|
-
const stderr = (err as { stderr?: unknown }).stderr;
|
|
202
|
-
const stderrText = typeof stderr === "string"
|
|
203
|
-
? stderr
|
|
204
|
-
: stderr instanceof Uint8Array
|
|
205
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
206
|
-
: "";
|
|
207
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
208
|
-
const text = `${stderrText}\n${message}`;
|
|
209
|
-
const files = new Set<string>();
|
|
210
|
-
for (const line of text.split("\n")) {
|
|
211
|
-
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
212
|
-
if (!m) continue;
|
|
213
|
-
const filePath = m[1]?.trim();
|
|
214
|
-
if (filePath) files.add(filePath);
|
|
215
|
-
}
|
|
216
|
-
return [...files];
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
221
|
-
* markers from a failed stash-pop or merge attempt.
|
|
222
|
-
*
|
|
223
|
-
* Returns false when the file cannot be read.
|
|
224
|
-
*/
|
|
225
|
-
function hasConflictMarkers(filePath: string): boolean {
|
|
226
|
-
try {
|
|
227
|
-
const content = readFileSync(filePath, "utf-8");
|
|
228
|
-
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
229
|
-
} catch {
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function gsdJsonlFilesWithConflictMarkers(basePath: string): string[] {
|
|
235
|
-
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) =>
|
|
236
|
-
hasConflictMarkers(join(basePath, f)),
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
143
|
/**
|
|
241
144
|
* Check if two filesystem paths resolve to the same real location.
|
|
242
145
|
* Returns false if either path cannot be resolved (e.g. doesn't exist).
|
|
@@ -382,19 +285,6 @@ export function _gitPathspecForWorktreePath(basePath: string, targetPath: string
|
|
|
382
285
|
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
383
286
|
}
|
|
384
287
|
|
|
385
|
-
function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
386
|
-
try {
|
|
387
|
-
execFileSync("git", ["remote", "get-url", remote], {
|
|
388
|
-
cwd: basePath,
|
|
389
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
390
|
-
encoding: "utf-8",
|
|
391
|
-
});
|
|
392
|
-
return true;
|
|
393
|
-
} catch {
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
288
|
function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
|
|
399
289
|
const changedPaths = new Set<string>();
|
|
400
290
|
let mergeLog = "";
|
|
@@ -524,49 +414,6 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
|
|
|
524
414
|
filePath.startsWith(".gsd/") ||
|
|
525
415
|
SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
526
416
|
|
|
527
|
-
function removeMergeStateFiles(basePath: string, contextLabel: string): void {
|
|
528
|
-
try {
|
|
529
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
530
|
-
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
531
|
-
cwd: basePath,
|
|
532
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
533
|
-
encoding: "utf-8",
|
|
534
|
-
}).trim();
|
|
535
|
-
const p = rawPath.length > 0
|
|
536
|
-
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
537
|
-
: join(resolveGitDir(basePath), f);
|
|
538
|
-
if (existsSync(p)) unlinkSync(p);
|
|
539
|
-
}
|
|
540
|
-
} catch (err) {
|
|
541
|
-
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
function cleanupConflictState(basePath: string): void {
|
|
546
|
-
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
547
|
-
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
548
|
-
// index, then remove merge message files that native/libgit2 paths may have
|
|
549
|
-
// created.
|
|
550
|
-
try {
|
|
551
|
-
nativeMergeAbort(basePath);
|
|
552
|
-
} catch (err) {
|
|
553
|
-
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
554
|
-
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
555
|
-
error: err instanceof Error ? err.message : String(err),
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
try {
|
|
559
|
-
execFileSync("git", ["reset", "--merge"], {
|
|
560
|
-
cwd: basePath,
|
|
561
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
562
|
-
encoding: "utf-8",
|
|
563
|
-
});
|
|
564
|
-
} catch (err) {
|
|
565
|
-
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
566
|
-
}
|
|
567
|
-
removeMergeStateFiles(basePath, "conflict");
|
|
568
|
-
}
|
|
569
|
-
|
|
570
417
|
// ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
|
|
571
418
|
|
|
572
419
|
/**
|
|
@@ -655,21 +502,8 @@ export function checkResourcesStale(
|
|
|
655
502
|
* Returns the corrected base path.
|
|
656
503
|
*/
|
|
657
504
|
export function escapeStaleWorktree(base: string): string {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
let idx = base.indexOf(directMarker);
|
|
661
|
-
if (idx === -1) {
|
|
662
|
-
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
|
|
663
|
-
const symlinkRe = new RegExp(
|
|
664
|
-
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`,
|
|
665
|
-
);
|
|
666
|
-
const match = base.match(symlinkRe);
|
|
667
|
-
if (!match || match.index === undefined) return base;
|
|
668
|
-
idx = match.index;
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
// base is inside .gsd/worktrees/<something> — extract the project root
|
|
672
|
-
const projectRoot = base.slice(0, idx);
|
|
505
|
+
const projectRoot = projectRootFromWorktreePath(base);
|
|
506
|
+
if (projectRoot === null) return base;
|
|
673
507
|
|
|
674
508
|
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
675
509
|
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
@@ -1066,122 +900,6 @@ export function enterBranchModeForMilestone(
|
|
|
1066
900
|
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
1067
901
|
}
|
|
1068
902
|
|
|
1069
|
-
export function checkoutBranchWithStashGuard(
|
|
1070
|
-
basePath: string,
|
|
1071
|
-
branch: string,
|
|
1072
|
-
reason: string,
|
|
1073
|
-
): void {
|
|
1074
|
-
let stashMarker: string | null = null;
|
|
1075
|
-
let stashed = false;
|
|
1076
|
-
|
|
1077
|
-
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
1078
|
-
if (status.length > 0) {
|
|
1079
|
-
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
1080
|
-
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
1081
|
-
cwd: basePath,
|
|
1082
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1083
|
-
encoding: "utf-8",
|
|
1084
|
-
});
|
|
1085
|
-
execFileSync(
|
|
1086
|
-
"git",
|
|
1087
|
-
["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
|
|
1088
|
-
{
|
|
1089
|
-
cwd: basePath,
|
|
1090
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1091
|
-
encoding: "utf-8",
|
|
1092
|
-
},
|
|
1093
|
-
);
|
|
1094
|
-
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
1095
|
-
cwd: basePath,
|
|
1096
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1097
|
-
encoding: "utf-8",
|
|
1098
|
-
});
|
|
1099
|
-
stashed = stashListAfter !== stashListBefore;
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
// Checkout and stash-restore are split so we can distinguish two failure
|
|
1103
|
-
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
1104
|
-
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
1105
|
-
// the working-tree changes remain in the stash list. We surface a distinct
|
|
1106
|
-
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
1107
|
-
try {
|
|
1108
|
-
nativeCheckoutBranch(basePath, branch);
|
|
1109
|
-
} catch (checkoutErr) {
|
|
1110
|
-
if (stashed) {
|
|
1111
|
-
try {
|
|
1112
|
-
popStashByRef(basePath, stashMarker);
|
|
1113
|
-
} catch (restoreErr) {
|
|
1114
|
-
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
throw checkoutErr;
|
|
1118
|
-
}
|
|
1119
|
-
|
|
1120
|
-
if (stashed) {
|
|
1121
|
-
try {
|
|
1122
|
-
popStashByRef(basePath, stashMarker);
|
|
1123
|
-
} catch (popErr) {
|
|
1124
|
-
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
1125
|
-
const stderr = popErr && typeof popErr === "object"
|
|
1126
|
-
? (popErr as { stderr?: unknown }).stderr
|
|
1127
|
-
: undefined;
|
|
1128
|
-
const stderrText = typeof stderr === "string"
|
|
1129
|
-
? stderr
|
|
1130
|
-
: stderr instanceof Uint8Array
|
|
1131
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
1132
|
-
: "";
|
|
1133
|
-
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
1134
|
-
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
1135
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
1136
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
1137
|
-
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
1138
|
-
const stashRefForDrop = stashRefFromError(popErr);
|
|
1139
|
-
const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
|
|
1140
|
-
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
1141
|
-
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
1142
|
-
: [];
|
|
1143
|
-
const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
|
|
1144
|
-
|
|
1145
|
-
if (
|
|
1146
|
-
isUntrackedRestoreFailure &&
|
|
1147
|
-
gsdConflictFiles.length > 0 &&
|
|
1148
|
-
nonGsdAlreadyExists.length === 0 &&
|
|
1149
|
-
nonGsdUnmerged.length === 0
|
|
1150
|
-
) {
|
|
1151
|
-
for (const f of gsdConflictFiles) {
|
|
1152
|
-
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
1153
|
-
cwd: basePath,
|
|
1154
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1155
|
-
encoding: "utf-8",
|
|
1156
|
-
});
|
|
1157
|
-
nativeAddPaths(basePath, [f]);
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
if (stashRefForDrop) {
|
|
1161
|
-
try {
|
|
1162
|
-
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
1163
|
-
cwd: basePath,
|
|
1164
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1165
|
-
encoding: "utf-8",
|
|
1166
|
-
});
|
|
1167
|
-
} catch (err) { /* stash may already be consumed */
|
|
1168
|
-
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1169
|
-
}
|
|
1170
|
-
} else {
|
|
1171
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
1172
|
-
}
|
|
1173
|
-
return;
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
const wrapped = new Error(
|
|
1177
|
-
`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
|
|
1178
|
-
);
|
|
1179
|
-
if (stashRefForDrop) (wrapped as { stashRef?: string }).stashRef = stashRefForDrop;
|
|
1180
|
-
throw wrapped;
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
|
|
1185
903
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
1186
904
|
|
|
1187
905
|
/**
|
|
@@ -1567,7 +1285,9 @@ export function getAutoWorktreePath(
|
|
|
1567
1285
|
): string | null {
|
|
1568
1286
|
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1569
1287
|
|
|
1570
|
-
|
|
1288
|
+
// basePath is already the resolved project root — go straight to placement
|
|
1289
|
+
// instead of worktreePath(), which would re-resolve the root.
|
|
1290
|
+
const p = worktreePathFor(basePath, milestoneId);
|
|
1571
1291
|
if (!existsSync(p)) return null;
|
|
1572
1292
|
|
|
1573
1293
|
// Validate this is a real git worktree, not a stray directory.
|
|
@@ -2309,8 +2029,6 @@ export function mergeMilestoneToMain(
|
|
|
2309
2029
|
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
2310
2030
|
const gsdContentConflicts: string[] = [];
|
|
2311
2031
|
const alreadyExists = stashAlreadyExistsFilesFromError(e);
|
|
2312
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
2313
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
2314
2032
|
|
|
2315
2033
|
// Untracked-file restore failures can leave marker conflicts in tracked
|
|
2316
2034
|
// .gsd JSONL files without producing `U` status entries.
|
|
@@ -2374,11 +2092,12 @@ export function mergeMilestoneToMain(
|
|
|
2374
2092
|
} else if (
|
|
2375
2093
|
gsdUU.length === 0 &&
|
|
2376
2094
|
nonGsdUU.length === 0 &&
|
|
2377
|
-
|
|
2378
|
-
nonGsdAlreadyExists.length === 0
|
|
2095
|
+
alreadyExists.length > 0
|
|
2379
2096
|
) {
|
|
2380
|
-
// Untracked-file restore failure from stash pop where all collided
|
|
2381
|
-
//
|
|
2097
|
+
// Untracked-file restore failure from stash pop where all collided paths
|
|
2098
|
+
// already exist after merge (committed on target). Safe to drop the stash
|
|
2099
|
+
// for the full alreadyExists set — they were untracked on source by
|
|
2100
|
+
// definition of the "already exists, no checkout" failure.
|
|
2382
2101
|
if (stashRefForDrop) {
|
|
2383
2102
|
try {
|
|
2384
2103
|
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
@@ -2397,10 +2116,6 @@ export function mergeMilestoneToMain(
|
|
|
2397
2116
|
logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
|
|
2398
2117
|
files: nonGsdUU.join(", "),
|
|
2399
2118
|
});
|
|
2400
|
-
} else if (nonGsdAlreadyExists.length > 0) {
|
|
2401
|
-
logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
|
|
2402
|
-
files: nonGsdAlreadyExists.join(", "),
|
|
2403
|
-
});
|
|
2404
2119
|
} else {
|
|
2405
2120
|
logWarning(
|
|
2406
2121
|
"worktree",
|
|
@@ -2518,62 +2233,24 @@ export function mergeMilestoneToMain(
|
|
|
2518
2233
|
};
|
|
2519
2234
|
|
|
2520
2235
|
let shouldCleanup = false;
|
|
2521
|
-
let pushed = false;
|
|
2522
|
-
let prCreated = false;
|
|
2523
2236
|
try {
|
|
2524
|
-
// 10.
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
}
|
|
2541
|
-
|
|
2542
|
-
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
2543
|
-
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
2544
|
-
const remote = prefs.remote ?? "origin";
|
|
2545
|
-
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
2546
|
-
if (gitRemoteExists(originalBasePath_, remote)) {
|
|
2547
|
-
try {
|
|
2548
|
-
// Push the milestone branch to remote first
|
|
2549
|
-
execFileSync("git", ["push", remote, milestoneBranch], {
|
|
2550
|
-
cwd: originalBasePath_,
|
|
2551
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
2552
|
-
encoding: "utf-8",
|
|
2553
|
-
});
|
|
2554
|
-
const prEvidence = buildPullRequestEvidence({
|
|
2555
|
-
milestoneId,
|
|
2556
|
-
milestoneTitle,
|
|
2557
|
-
changeType: "feat",
|
|
2558
|
-
summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
2559
|
-
testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
|
|
2560
|
-
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2561
|
-
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2562
|
-
});
|
|
2563
|
-
const prUrl = createDraftPullRequestFromEvidence(originalBasePath_, milestoneId, prEvidence, {
|
|
2564
|
-
head: milestoneBranch,
|
|
2565
|
-
base: prTarget,
|
|
2566
|
-
});
|
|
2567
|
-
if (!prUrl) {
|
|
2568
|
-
throw new Error("gh pr create returned no URL");
|
|
2569
|
-
}
|
|
2570
|
-
prCreated = true;
|
|
2571
|
-
} catch (err) {
|
|
2572
|
-
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
2573
|
-
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2574
|
-
}
|
|
2575
|
-
}
|
|
2576
|
-
}
|
|
2237
|
+
// 10/9b. Publication (auto-push / draft PR) — Publication module seam (ADR-034).
|
|
2238
|
+
const publication = publishMilestone({
|
|
2239
|
+
basePath: originalBasePath_,
|
|
2240
|
+
milestoneId,
|
|
2241
|
+
milestoneTitle,
|
|
2242
|
+
integrationBranch: mainBranch,
|
|
2243
|
+
milestoneBranch,
|
|
2244
|
+
sliceSummaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
2245
|
+
nothingToCommit,
|
|
2246
|
+
prefs: {
|
|
2247
|
+
autoPush: prefs.auto_push === true,
|
|
2248
|
+
autoPr: prefs.auto_pr === true,
|
|
2249
|
+
remote: prefs.remote,
|
|
2250
|
+
prTargetBranch: prefs.pr_target_branch,
|
|
2251
|
+
},
|
|
2252
|
+
});
|
|
2253
|
+
const { pushed, prCreated } = publication;
|
|
2577
2254
|
|
|
2578
2255
|
// 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
|
|
2579
2256
|
// throws only when the milestone has unanchored code changes, passes
|
|
@@ -81,6 +81,7 @@ import {
|
|
|
81
81
|
resolveAutoSupervisorConfig,
|
|
82
82
|
loadEffectiveGSDPreferences,
|
|
83
83
|
getIsolationMode,
|
|
84
|
+
resolveEffectiveUnitIsolationMode,
|
|
84
85
|
} from "./preferences.js";
|
|
85
86
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
86
87
|
import type { GSDPreferences } from "./preferences.js";
|
|
@@ -330,6 +331,11 @@ import {
|
|
|
330
331
|
} from "./db/auto-workers.js";
|
|
331
332
|
import { releaseMilestoneLease } from "./db/milestone-leases.js";
|
|
332
333
|
import { normalizeRealPath } from "./paths.js";
|
|
334
|
+
import {
|
|
335
|
+
formatStopNoticePrefix,
|
|
336
|
+
isBlockedStopReason,
|
|
337
|
+
stopNoticeDisplayReason,
|
|
338
|
+
} from "./stop-notice.js";
|
|
333
339
|
|
|
334
340
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
335
341
|
// ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
|
|
@@ -354,19 +360,7 @@ export function formatAutoStopNotification(prefix: string, totals: { cost: numbe
|
|
|
354
360
|
].join("\n");
|
|
355
361
|
}
|
|
356
362
|
|
|
357
|
-
|
|
358
|
-
return /^Blocked:\s*/i.test(reason ?? "");
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
function formatAutoStopDisplayReason(reason?: string | null): string {
|
|
362
|
-
return (reason ?? "").replace(/^Blocked:\s*/i, "").trim();
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export function formatAutoStopNotificationPrefix(reason?: string | null): string {
|
|
366
|
-
const displayReason = formatAutoStopDisplayReason(reason);
|
|
367
|
-
const prefix = isBlockedStopReason(reason) ? "Auto-mode blocked" : "Auto-mode stopped";
|
|
368
|
-
return displayReason ? `${prefix} — ${displayReason}` : prefix;
|
|
369
|
-
}
|
|
363
|
+
export { formatStopNoticePrefix as formatAutoStopNotificationPrefix } from "./stop-notice.js";
|
|
370
364
|
|
|
371
365
|
function clearSessionModelOverrideForCommandSession(ctx?: ExtensionContext | null): void {
|
|
372
366
|
const sessionId =
|
|
@@ -634,22 +628,24 @@ export function shouldUseWorktreeIsolation(basePath?: string): boolean {
|
|
|
634
628
|
|
|
635
629
|
type AutoIsolationMode = ReturnType<typeof getIsolationMode>;
|
|
636
630
|
|
|
637
|
-
function resolveEffectiveUnitIsolationMode(
|
|
638
|
-
configuredMode: AutoIsolationMode,
|
|
639
|
-
isolationDegraded: boolean,
|
|
640
|
-
): AutoIsolationMode {
|
|
641
|
-
return configuredMode === "worktree" && isolationDegraded ? "branch" : configuredMode;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
631
|
export function _resolveEffectiveUnitIsolationModeForTest(
|
|
645
632
|
configuredMode: AutoIsolationMode,
|
|
646
633
|
isolationDegraded: boolean,
|
|
634
|
+
strandedRecoveryIsolationMode: "worktree" | "branch" | null = null,
|
|
647
635
|
): AutoIsolationMode {
|
|
648
|
-
return resolveEffectiveUnitIsolationMode(
|
|
636
|
+
return resolveEffectiveUnitIsolationMode(
|
|
637
|
+
configuredMode,
|
|
638
|
+
isolationDegraded,
|
|
639
|
+
strandedRecoveryIsolationMode,
|
|
640
|
+
);
|
|
649
641
|
}
|
|
650
642
|
|
|
651
643
|
function getEffectiveUnitIsolationMode(basePath: string): AutoIsolationMode {
|
|
652
|
-
return resolveEffectiveUnitIsolationMode(
|
|
644
|
+
return resolveEffectiveUnitIsolationMode(
|
|
645
|
+
getIsolationMode(basePath),
|
|
646
|
+
s.isolationDegraded,
|
|
647
|
+
s.strandedRecoveryIsolationMode,
|
|
648
|
+
);
|
|
653
649
|
}
|
|
654
650
|
|
|
655
651
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
@@ -928,6 +924,14 @@ export function setCurrentDispatchedModelId(model: { provider: string; id: strin
|
|
|
928
924
|
s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
|
|
929
925
|
}
|
|
930
926
|
|
|
927
|
+
/**
|
|
928
|
+
* Update the active unit model after runtime recovery switches models mid-unit.
|
|
929
|
+
* The next session restore path reads this field before dispatching again.
|
|
930
|
+
*/
|
|
931
|
+
export function setCurrentUnitModelForRecovery(model: any | null): void {
|
|
932
|
+
s.currentUnitModel = model;
|
|
933
|
+
}
|
|
934
|
+
|
|
931
935
|
// Tool tracking — delegates to auto-tool-tracking.ts
|
|
932
936
|
export function markToolStart(toolCallId: string, toolName?: string): void {
|
|
933
937
|
_markToolStart(toolCallId, s.active, toolName);
|
|
@@ -1462,8 +1466,8 @@ export async function stopAuto(
|
|
|
1462
1466
|
): Promise<void> {
|
|
1463
1467
|
if (!s.active && !s.paused) return;
|
|
1464
1468
|
const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
|
|
1465
|
-
const stopNotificationPrefix =
|
|
1466
|
-
const displayReason =
|
|
1469
|
+
const stopNotificationPrefix = formatStopNoticePrefix(reason);
|
|
1470
|
+
const displayReason = stopNoticeDisplayReason(reason);
|
|
1467
1471
|
const isHeadlessStop = process.env.GSD_HEADLESS === "1";
|
|
1468
1472
|
const completionStopRequested = Boolean(options.completionWidget);
|
|
1469
1473
|
const preserveCloseoutTranscript = !isHeadlessStop && (
|
|
@@ -23,6 +23,15 @@ interface BlockedModelsFile {
|
|
|
23
23
|
blocked: BlockedModelEntry[];
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
interface TemporaryBlockedModelEntry {
|
|
27
|
+
provider: string;
|
|
28
|
+
id: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
blockedUntil: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const temporaryBlockedModels = new Map<string, TemporaryBlockedModelEntry>();
|
|
34
|
+
|
|
26
35
|
function blockedModelsPath(basePath: string): string {
|
|
27
36
|
return join(gsdRoot(basePath), "runtime", "blocked-models.json");
|
|
28
37
|
}
|
|
@@ -31,6 +40,10 @@ function modelKey(provider: string, id: string): string {
|
|
|
31
40
|
return `${provider.toLowerCase()}/${id.toLowerCase()}`;
|
|
32
41
|
}
|
|
33
42
|
|
|
43
|
+
function temporaryModelKey(basePath: string, provider: string, id: string): string {
|
|
44
|
+
return `${basePath}:${modelKey(provider, id)}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
34
47
|
function readFileSafe(path: string): BlockedModelsFile {
|
|
35
48
|
if (!existsSync(path)) return { version: 1, blocked: [] };
|
|
36
49
|
try {
|
|
@@ -66,6 +79,42 @@ export function isModelBlocked(
|
|
|
66
79
|
);
|
|
67
80
|
}
|
|
68
81
|
|
|
82
|
+
export function blockModelUntil(
|
|
83
|
+
basePath: string,
|
|
84
|
+
provider: string,
|
|
85
|
+
id: string,
|
|
86
|
+
blockedUntil: number,
|
|
87
|
+
reason: string,
|
|
88
|
+
): void {
|
|
89
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
90
|
+
if (blockedUntil <= Date.now()) {
|
|
91
|
+
temporaryBlockedModels.delete(key);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
temporaryBlockedModels.set(key, { provider, id, reason, blockedUntil });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function isModelTemporarilyUnavailable(
|
|
98
|
+
basePath: string,
|
|
99
|
+
provider: string | undefined,
|
|
100
|
+
id: string | undefined,
|
|
101
|
+
now = Date.now(),
|
|
102
|
+
): boolean {
|
|
103
|
+
if (!provider || !id) return false;
|
|
104
|
+
const key = temporaryModelKey(basePath, provider, id);
|
|
105
|
+
const entry = temporaryBlockedModels.get(key);
|
|
106
|
+
if (!entry) return false;
|
|
107
|
+
if (entry.blockedUntil <= now) {
|
|
108
|
+
temporaryBlockedModels.delete(key);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function clearTemporaryModelBlocksForTest(): void {
|
|
115
|
+
temporaryBlockedModels.clear();
|
|
116
|
+
}
|
|
117
|
+
|
|
69
118
|
export function blockModel(
|
|
70
119
|
basePath: string,
|
|
71
120
|
provider: string,
|