@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.ddc97c10
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 +54 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -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 +24 -26
- 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 +35 -352
- package/dist/resources/extensions/gsd/auto.js +45 -21
- 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/context.js +16 -2
- 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 +12 -15
- 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-engine-checks.js +3 -3
- 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 +57 -8
- 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/milestone-planning-persistence.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/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 +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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/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-contract.js +14 -3
- 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-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -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 +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/verification-verdict.js +2 -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 +12 -12
- 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 +12 -12
- 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 +9 -1
- 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 +74 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -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 +24 -29
- 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 +41 -364
- package/src/resources/extensions/gsd/auto.ts +64 -25
- 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/context.ts +16 -2
- 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 +13 -11
- 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-engine-checks.ts +3 -3
- 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 +71 -31
- 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/milestone-planning-persistence.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/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 +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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/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-remote-session-lock-cleanup.test.ts +65 -3
- 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/guided-dispatch-root.test.ts +2 -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 +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/phases-terminal-complete-idempotent.test.ts +242 -0
- 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-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/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- 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/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/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-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-contract.ts +38 -3
- 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-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -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 +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/verification-verdict.ts +4 -2
- 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 → McokybTayhff1xEVc-d3T}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → McokybTayhff1xEVc-d3T}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
18
|
-
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath
|
|
18
|
+
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath } from "./paths.js";
|
|
19
19
|
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
20
20
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
@@ -25,8 +25,6 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
|
25
25
|
import type { GSDPreferences } from "./preferences-types.js";
|
|
26
26
|
import { isClosedStatus } from "./status-guards.js";
|
|
27
27
|
import { loadFile } from "./files.js";
|
|
28
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
29
|
-
import { isMilestoneComplete } from "./state.js";
|
|
30
28
|
import {
|
|
31
29
|
runVerificationGate,
|
|
32
30
|
runVerificationGateForTargets,
|
|
@@ -52,6 +50,7 @@ import { getSlice } from "./gsd-db.js";
|
|
|
52
50
|
import { getLedger } from "./metrics.js";
|
|
53
51
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
54
52
|
import { formatPostUnitStatusCard } from "./auto-status-message.js";
|
|
53
|
+
import { detectWebApp } from "./web-app-uat.js";
|
|
55
54
|
|
|
56
55
|
export interface VerificationContext {
|
|
57
56
|
s: AutoSession;
|
|
@@ -373,29 +372,13 @@ async function runValidateMilestonePostCheck(
|
|
|
373
372
|
* DB-backed projects are authoritative (#4094 peer review); falls back to
|
|
374
373
|
* roadmap parsing only when the DB is unavailable.
|
|
375
374
|
*/
|
|
376
|
-
async function countIncompleteSlices(
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Filesystem fallback: parse the roadmap markdown.
|
|
387
|
-
try {
|
|
388
|
-
const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
389
|
-
if (!roadmapFile) return 1;
|
|
390
|
-
const roadmapContent = await loadFile(roadmapFile);
|
|
391
|
-
if (!roadmapContent) return 1;
|
|
392
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
393
|
-
if (roadmap.slices.length === 0) return 1;
|
|
394
|
-
return isMilestoneComplete(roadmap) ? 0 : 1;
|
|
395
|
-
} catch {
|
|
396
|
-
// Parsing failures should not cause false-positive pauses.
|
|
397
|
-
return 1;
|
|
398
|
-
}
|
|
375
|
+
async function countIncompleteSlices(_basePath: string, milestoneId: string): Promise<number> {
|
|
376
|
+
// DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
|
|
377
|
+
// rows means "unknown" — do not pause.
|
|
378
|
+
if (!isDbAvailable()) return 1;
|
|
379
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
380
|
+
if (slices.length === 0) return 1;
|
|
381
|
+
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
399
382
|
}
|
|
400
383
|
|
|
401
384
|
/**
|
|
@@ -805,17 +788,32 @@ export async function runPostUnitVerification(
|
|
|
805
788
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
806
789
|
s.pendingVerificationRetry = null;
|
|
807
790
|
return "continue";
|
|
791
|
+
} else if (
|
|
792
|
+
verdict.reason === "no-host-checks" &&
|
|
793
|
+
taskAlreadyComplete &&
|
|
794
|
+
detectWebApp(s.basePath) &&
|
|
795
|
+
!result.runtimeErrors?.some((e) => e.blocking)
|
|
796
|
+
) {
|
|
797
|
+
s.verificationRetryCount.delete(retryKey);
|
|
798
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
799
|
+
s.pendingVerificationRetry = null;
|
|
800
|
+
ctx.ui.notify(
|
|
801
|
+
"No task-level host verification command was found for a completed browser-facing task; continuing so slice UAT can verify the UI with browser tools.",
|
|
802
|
+
"warning",
|
|
803
|
+
);
|
|
804
|
+
return "continue";
|
|
808
805
|
} else if (verdict.reason === "no-host-checks") {
|
|
809
806
|
s.verificationRetryCount.delete(retryKey);
|
|
810
807
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
811
808
|
s.pendingVerificationRetry = null;
|
|
809
|
+
const pauseMessage = `Verification failed: ${verdict.failureContext}`;
|
|
812
810
|
ctx.ui.notify(
|
|
813
|
-
|
|
811
|
+
`Verification gate FAILED — ${verdict.failureContext}`,
|
|
814
812
|
"error",
|
|
815
813
|
);
|
|
816
814
|
process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
|
|
817
815
|
await pauseAuto(ctx, pi, {
|
|
818
|
-
message:
|
|
816
|
+
message: pauseMessage,
|
|
819
817
|
category: "unknown",
|
|
820
818
|
});
|
|
821
819
|
return "pause";
|
|
@@ -5,6 +5,7 @@ import { existsSync, lstatSync, readdirSync, type Stats } from "node:fs";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
|
|
7
7
|
import { worktreePath } from "./worktree-manager.js";
|
|
8
|
+
import { worktreesDirs } from "./worktree-placement.js";
|
|
8
9
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
9
10
|
import type { WorktreeSafetyResult } from "./worktree-safety.js";
|
|
10
11
|
|
|
@@ -39,6 +40,16 @@ export function expectedAutoWorktreePath(
|
|
|
39
40
|
return worktreePath(projectRoot, id);
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
/** Every path the milestone worktree may legitimately live at (canonical + legacy). */
|
|
44
|
+
function candidateAutoWorktreePaths(
|
|
45
|
+
projectRoot: string,
|
|
46
|
+
milestoneId: string | null | undefined,
|
|
47
|
+
): string[] {
|
|
48
|
+
const id = milestoneId?.trim();
|
|
49
|
+
if (!id || !isValidMilestoneId(id)) return [];
|
|
50
|
+
return worktreesDirs(projectRoot).map((dir) => join(dir, id));
|
|
51
|
+
}
|
|
52
|
+
|
|
42
53
|
export function resolvePausedAutoWorktreePath(input: {
|
|
43
54
|
basePath: string;
|
|
44
55
|
originalBasePath?: string | null;
|
|
@@ -82,8 +93,8 @@ export function assessAutoWorktreeRepairTarget(input: {
|
|
|
82
93
|
if (!expectedPath) {
|
|
83
94
|
return { ok: false, reason: "missing expected worktree path" };
|
|
84
95
|
}
|
|
85
|
-
const
|
|
86
|
-
if (
|
|
96
|
+
const candidatePaths = candidateAutoWorktreePaths(input.projectRoot, input.milestoneId);
|
|
97
|
+
if (candidatePaths.length === 0 || !candidatePaths.some((candidate) => samePath(expectedPath, candidate))) {
|
|
87
98
|
return { ok: false, reason: "expected worktree path does not match milestone" };
|
|
88
99
|
}
|
|
89
100
|
if (!samePath(input.activeRoot, input.projectRoot) && !samePath(input.activeRoot, expectedPath)) {
|
|
@@ -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
|