@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- 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/extensions/ask-user-questions.js +78 -23
- 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 +122 -234
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +24 -37
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -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-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -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 +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- 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 +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- 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-db.js +183 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- 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-eligibility.js +3 -6
- 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/parallel-orchestrator.js +3 -2
- 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-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +12 -46
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- 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/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- 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/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +14 -25
- 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/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- 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/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +17 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- 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 +49 -21
- 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-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- 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/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- 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 +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -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-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- 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 +8 -8
- 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/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 +6 -6
- 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 +1 -1
- 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/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- 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 +3 -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 +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.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/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -22
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +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/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- 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/extensions/ask-user-questions.ts +87 -24
- 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/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 +148 -285
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +29 -35
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -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-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- 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 +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- 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 +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- 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-db.ts +185 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- 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-eligibility.ts +4 -5
- 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/parallel-orchestrator.ts +6 -2
- 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-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +10 -46
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- 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/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- 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/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +19 -26
- 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/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- 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-runtime-state.test.ts +34 -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/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/canonical-milestone-root.test.ts +20 -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/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- 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/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -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/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -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 +342 -1
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -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 +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- 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 +35 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- 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/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- 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/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +20 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- 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 +97 -21
- 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-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- 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/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- 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 +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -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/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -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,
|
|
@@ -28,10 +28,12 @@ import {
|
|
|
28
28
|
getMilestone,
|
|
29
29
|
getMilestoneSlices,
|
|
30
30
|
getSliceTasks,
|
|
31
|
-
closeDatabase,
|
|
32
|
-
openDatabase,
|
|
33
|
-
getDbPath,
|
|
34
31
|
} from "./gsd-db.js";
|
|
32
|
+
import {
|
|
33
|
+
closeWorkflowDatabase,
|
|
34
|
+
getWorkflowDatabasePath,
|
|
35
|
+
openWorkflowDatabasePath,
|
|
36
|
+
} from "./db-workspace.js";
|
|
35
37
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
36
38
|
import { execFileSync } from "node:child_process";
|
|
37
39
|
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
@@ -42,6 +44,7 @@ import {
|
|
|
42
44
|
worktreePath,
|
|
43
45
|
isInsideWorktreesDir,
|
|
44
46
|
} from "./worktree-manager.js";
|
|
47
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
45
48
|
import {
|
|
46
49
|
detectWorktreeName,
|
|
47
50
|
resolveGitHeadPath,
|
|
@@ -49,14 +52,25 @@ import {
|
|
|
49
52
|
} from "./worktree.js";
|
|
50
53
|
import {
|
|
51
54
|
isGsdWorktreePath,
|
|
55
|
+
projectRootFromWorktreePath,
|
|
52
56
|
normalizeWorktreePathForCompare,
|
|
53
57
|
resolveWorktreeProjectRoot,
|
|
54
58
|
} from "./worktree-root.js";
|
|
55
59
|
import { autoResolveSafeConflictPaths } from "./git-conflict-resolve.js";
|
|
56
|
-
import { MergeConflictError,
|
|
57
|
-
import {
|
|
60
|
+
import { MergeConflictError, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
61
|
+
import { publishMilestone } from "./publication.js";
|
|
58
62
|
import { debugLog } from "./debug-logger.js";
|
|
59
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";
|
|
60
74
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
61
75
|
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
62
76
|
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
@@ -80,22 +94,19 @@ import {
|
|
|
80
94
|
nativeDiffNumstat,
|
|
81
95
|
nativeUpdateRef,
|
|
82
96
|
nativeIsAncestor,
|
|
83
|
-
nativeMergeAbort,
|
|
84
97
|
nativeWorktreeList,
|
|
85
98
|
nativeLsFiles,
|
|
86
99
|
} from "./native-git-bridge.js";
|
|
87
100
|
import {
|
|
88
101
|
CLOSEOUT_CONSISTENCY_BLOCKED_REASON,
|
|
89
|
-
checkCloseoutConsistencyGate,
|
|
90
|
-
formatCloseoutConsistencyBlock,
|
|
91
102
|
} from "./closeout-consistency-gate.js";
|
|
103
|
+
import {
|
|
104
|
+
formatCloseoutProofBlock,
|
|
105
|
+
proveMilestoneCloseout,
|
|
106
|
+
} from "./milestone-closeout-proof.js";
|
|
92
107
|
import { gsdHome } from "./gsd-home.js";
|
|
93
108
|
import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
|
|
94
|
-
import {
|
|
95
|
-
_finalizeProjectionForMergeImpl,
|
|
96
|
-
_projectRootToWorktreeImpl,
|
|
97
|
-
_projectWorktreeToRootImpl,
|
|
98
|
-
} from "./worktree-state-projection.js";
|
|
109
|
+
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
99
110
|
|
|
100
111
|
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
101
112
|
const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
|
|
@@ -129,111 +140,6 @@ const ROOT_STATE_FILES = [
|
|
|
129
140
|
// because the project root is authoritative for preferences (#2684).
|
|
130
141
|
] as const;
|
|
131
142
|
|
|
132
|
-
/**
|
|
133
|
-
* Pop a stash entry by tracking the unique marker embedded in its message so
|
|
134
|
-
* concurrent stash operations against the same project root cannot cause us to
|
|
135
|
-
* pop the wrong entry.
|
|
136
|
-
*
|
|
137
|
-
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
138
|
-
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
139
|
-
* returns null.
|
|
140
|
-
*
|
|
141
|
-
* Throws on pop failure so callers can handle conflict cases the same way
|
|
142
|
-
* they would with the prior `git stash pop` form. When throwing after a
|
|
143
|
-
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
144
|
-
*
|
|
145
|
-
* (Issue #4980 HIGH-6)
|
|
146
|
-
*/
|
|
147
|
-
function popStashByRef(basePath: string, stashMarker: string | null): string | null {
|
|
148
|
-
let popArg: string | null = null;
|
|
149
|
-
if (stashMarker) {
|
|
150
|
-
try {
|
|
151
|
-
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
152
|
-
cwd: basePath,
|
|
153
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
154
|
-
encoding: "utf-8",
|
|
155
|
-
}).trim().split("\n").filter(Boolean);
|
|
156
|
-
for (const entry of list) {
|
|
157
|
-
const [ref, subject] = entry.split("\0");
|
|
158
|
-
if (ref && subject?.includes(stashMarker)) {
|
|
159
|
-
popArg = ref;
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
} catch (err) {
|
|
164
|
-
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (!popArg) {
|
|
168
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
execFileSync("git", ["stash", "pop", popArg], {
|
|
173
|
-
cwd: basePath,
|
|
174
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
175
|
-
encoding: "utf-8",
|
|
176
|
-
});
|
|
177
|
-
} catch (err) {
|
|
178
|
-
if (err && typeof err === "object") {
|
|
179
|
-
(err as { stashRef?: string }).stashRef = popArg;
|
|
180
|
-
}
|
|
181
|
-
throw err;
|
|
182
|
-
}
|
|
183
|
-
return popArg;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
188
|
-
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
189
|
-
*/
|
|
190
|
-
function stashRefFromError(err: unknown): string | null {
|
|
191
|
-
if (!err || typeof err !== "object") return null;
|
|
192
|
-
const stashRef = (err as { stashRef?: unknown }).stashRef;
|
|
193
|
-
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function stashAlreadyExistsFilesFromError(err: unknown): string[] {
|
|
197
|
-
if (!err || typeof err !== "object") return [];
|
|
198
|
-
const stderr = (err as { stderr?: unknown }).stderr;
|
|
199
|
-
const stderrText = typeof stderr === "string"
|
|
200
|
-
? stderr
|
|
201
|
-
: stderr instanceof Uint8Array
|
|
202
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
203
|
-
: "";
|
|
204
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
205
|
-
const text = `${stderrText}\n${message}`;
|
|
206
|
-
const files = new Set<string>();
|
|
207
|
-
for (const line of text.split("\n")) {
|
|
208
|
-
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
209
|
-
if (!m) continue;
|
|
210
|
-
const filePath = m[1]?.trim();
|
|
211
|
-
if (filePath) files.add(filePath);
|
|
212
|
-
}
|
|
213
|
-
return [...files];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
218
|
-
* markers from a failed stash-pop or merge attempt.
|
|
219
|
-
*
|
|
220
|
-
* Returns false when the file cannot be read.
|
|
221
|
-
*/
|
|
222
|
-
function hasConflictMarkers(filePath: string): boolean {
|
|
223
|
-
try {
|
|
224
|
-
const content = readFileSync(filePath, "utf-8");
|
|
225
|
-
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
226
|
-
} catch {
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function gsdJsonlFilesWithConflictMarkers(basePath: string): string[] {
|
|
232
|
-
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) =>
|
|
233
|
-
hasConflictMarkers(join(basePath, f)),
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
143
|
/**
|
|
238
144
|
* Check if two filesystem paths resolve to the same real location.
|
|
239
145
|
* Returns false if either path cannot be resolved (e.g. doesn't exist).
|
|
@@ -379,19 +285,6 @@ export function _gitPathspecForWorktreePath(basePath: string, targetPath: string
|
|
|
379
285
|
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
380
286
|
}
|
|
381
287
|
|
|
382
|
-
function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
383
|
-
try {
|
|
384
|
-
execFileSync("git", ["remote", "get-url", remote], {
|
|
385
|
-
cwd: basePath,
|
|
386
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
387
|
-
encoding: "utf-8",
|
|
388
|
-
});
|
|
389
|
-
return true;
|
|
390
|
-
} catch {
|
|
391
|
-
return false;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
288
|
function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
|
|
396
289
|
const changedPaths = new Set<string>();
|
|
397
290
|
let mergeLog = "";
|
|
@@ -521,49 +414,6 @@ export const isSafeToAutoResolve = (filePath: string): boolean =>
|
|
|
521
414
|
filePath.startsWith(".gsd/") ||
|
|
522
415
|
SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
523
416
|
|
|
524
|
-
function removeMergeStateFiles(basePath: string, contextLabel: string): void {
|
|
525
|
-
try {
|
|
526
|
-
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
527
|
-
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
528
|
-
cwd: basePath,
|
|
529
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
530
|
-
encoding: "utf-8",
|
|
531
|
-
}).trim();
|
|
532
|
-
const p = rawPath.length > 0
|
|
533
|
-
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
534
|
-
: join(resolveGitDir(basePath), f);
|
|
535
|
-
if (existsSync(p)) unlinkSync(p);
|
|
536
|
-
}
|
|
537
|
-
} catch (err) {
|
|
538
|
-
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
function cleanupConflictState(basePath: string): void {
|
|
543
|
-
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
544
|
-
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
545
|
-
// index, then remove merge message files that native/libgit2 paths may have
|
|
546
|
-
// created.
|
|
547
|
-
try {
|
|
548
|
-
nativeMergeAbort(basePath);
|
|
549
|
-
} catch (err) {
|
|
550
|
-
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
551
|
-
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
552
|
-
error: err instanceof Error ? err.message : String(err),
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
try {
|
|
556
|
-
execFileSync("git", ["reset", "--merge"], {
|
|
557
|
-
cwd: basePath,
|
|
558
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
559
|
-
encoding: "utf-8",
|
|
560
|
-
});
|
|
561
|
-
} catch (err) {
|
|
562
|
-
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
563
|
-
}
|
|
564
|
-
removeMergeStateFiles(basePath, "conflict");
|
|
565
|
-
}
|
|
566
|
-
|
|
567
417
|
// ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
|
|
568
418
|
|
|
569
419
|
/**
|
|
@@ -584,7 +434,7 @@ export function syncProjectRootToWorktree(
|
|
|
584
434
|
worktreePath_: string,
|
|
585
435
|
milestoneId: string | null,
|
|
586
436
|
): void {
|
|
587
|
-
|
|
437
|
+
new WorktreeStateProjection().projectRootToWorktreePaths(projectRoot, worktreePath_, milestoneId);
|
|
588
438
|
}
|
|
589
439
|
|
|
590
440
|
/**
|
|
@@ -597,7 +447,7 @@ export function syncStateToProjectRoot(
|
|
|
597
447
|
projectRoot: string,
|
|
598
448
|
milestoneId: string | null,
|
|
599
449
|
): void {
|
|
600
|
-
|
|
450
|
+
new WorktreeStateProjection().projectWorktreeToRootPaths(worktreePath_, projectRoot, milestoneId);
|
|
601
451
|
}
|
|
602
452
|
|
|
603
453
|
// ─── Resource Staleness ───────────────────────────────────────────────────
|
|
@@ -652,21 +502,8 @@ export function checkResourcesStale(
|
|
|
652
502
|
* Returns the corrected base path.
|
|
653
503
|
*/
|
|
654
504
|
export function escapeStaleWorktree(base: string): string {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
let idx = base.indexOf(directMarker);
|
|
658
|
-
if (idx === -1) {
|
|
659
|
-
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
|
|
660
|
-
const symlinkRe = new RegExp(
|
|
661
|
-
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`,
|
|
662
|
-
);
|
|
663
|
-
const match = base.match(symlinkRe);
|
|
664
|
-
if (!match || match.index === undefined) return base;
|
|
665
|
-
idx = match.index;
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
// base is inside .gsd/worktrees/<something> — extract the project root
|
|
669
|
-
const projectRoot = base.slice(0, idx);
|
|
505
|
+
const projectRoot = projectRootFromWorktreePath(base);
|
|
506
|
+
if (projectRoot === null) return base;
|
|
670
507
|
|
|
671
508
|
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
672
509
|
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
@@ -960,7 +797,11 @@ export function syncWorktreeStateBack(
|
|
|
960
797
|
worktreePath: string,
|
|
961
798
|
milestoneId: string,
|
|
962
799
|
): { synced: string[] } {
|
|
963
|
-
return
|
|
800
|
+
return new WorktreeStateProjection().finalizeProjectionForMergePaths(
|
|
801
|
+
mainBasePath,
|
|
802
|
+
worktreePath,
|
|
803
|
+
milestoneId,
|
|
804
|
+
);
|
|
964
805
|
}
|
|
965
806
|
export { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
966
807
|
|
|
@@ -1059,122 +900,6 @@ export function enterBranchModeForMilestone(
|
|
|
1059
900
|
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
1060
901
|
}
|
|
1061
902
|
|
|
1062
|
-
export function checkoutBranchWithStashGuard(
|
|
1063
|
-
basePath: string,
|
|
1064
|
-
branch: string,
|
|
1065
|
-
reason: string,
|
|
1066
|
-
): void {
|
|
1067
|
-
let stashMarker: string | null = null;
|
|
1068
|
-
let stashed = false;
|
|
1069
|
-
|
|
1070
|
-
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
1071
|
-
if (status.length > 0) {
|
|
1072
|
-
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
1073
|
-
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
1074
|
-
cwd: basePath,
|
|
1075
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1076
|
-
encoding: "utf-8",
|
|
1077
|
-
});
|
|
1078
|
-
execFileSync(
|
|
1079
|
-
"git",
|
|
1080
|
-
["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
|
|
1081
|
-
{
|
|
1082
|
-
cwd: basePath,
|
|
1083
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1084
|
-
encoding: "utf-8",
|
|
1085
|
-
},
|
|
1086
|
-
);
|
|
1087
|
-
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
1088
|
-
cwd: basePath,
|
|
1089
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1090
|
-
encoding: "utf-8",
|
|
1091
|
-
});
|
|
1092
|
-
stashed = stashListAfter !== stashListBefore;
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
// Checkout and stash-restore are split so we can distinguish two failure
|
|
1096
|
-
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
1097
|
-
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
1098
|
-
// the working-tree changes remain in the stash list. We surface a distinct
|
|
1099
|
-
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
1100
|
-
try {
|
|
1101
|
-
nativeCheckoutBranch(basePath, branch);
|
|
1102
|
-
} catch (checkoutErr) {
|
|
1103
|
-
if (stashed) {
|
|
1104
|
-
try {
|
|
1105
|
-
popStashByRef(basePath, stashMarker);
|
|
1106
|
-
} catch (restoreErr) {
|
|
1107
|
-
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
throw checkoutErr;
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
if (stashed) {
|
|
1114
|
-
try {
|
|
1115
|
-
popStashByRef(basePath, stashMarker);
|
|
1116
|
-
} catch (popErr) {
|
|
1117
|
-
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
1118
|
-
const stderr = popErr && typeof popErr === "object"
|
|
1119
|
-
? (popErr as { stderr?: unknown }).stderr
|
|
1120
|
-
: undefined;
|
|
1121
|
-
const stderrText = typeof stderr === "string"
|
|
1122
|
-
? stderr
|
|
1123
|
-
: stderr instanceof Uint8Array
|
|
1124
|
-
? Buffer.from(stderr).toString("utf-8")
|
|
1125
|
-
: "";
|
|
1126
|
-
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
1127
|
-
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
1128
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
1129
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
1130
|
-
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
1131
|
-
const stashRefForDrop = stashRefFromError(popErr);
|
|
1132
|
-
const nonGsdUnmerged = nativeConflictFiles(basePath).filter((f) => !f.startsWith(".gsd/"));
|
|
1133
|
-
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
1134
|
-
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
1135
|
-
: [];
|
|
1136
|
-
const gsdConflictFiles = [...new Set([...gsdAlreadyExists, ...gsdContentConflicts])];
|
|
1137
|
-
|
|
1138
|
-
if (
|
|
1139
|
-
isUntrackedRestoreFailure &&
|
|
1140
|
-
gsdConflictFiles.length > 0 &&
|
|
1141
|
-
nonGsdAlreadyExists.length === 0 &&
|
|
1142
|
-
nonGsdUnmerged.length === 0
|
|
1143
|
-
) {
|
|
1144
|
-
for (const f of gsdConflictFiles) {
|
|
1145
|
-
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
1146
|
-
cwd: basePath,
|
|
1147
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1148
|
-
encoding: "utf-8",
|
|
1149
|
-
});
|
|
1150
|
-
nativeAddPaths(basePath, [f]);
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
if (stashRefForDrop) {
|
|
1154
|
-
try {
|
|
1155
|
-
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
1156
|
-
cwd: basePath,
|
|
1157
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
1158
|
-
encoding: "utf-8",
|
|
1159
|
-
});
|
|
1160
|
-
} catch (err) { /* stash may already be consumed */
|
|
1161
|
-
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1162
|
-
}
|
|
1163
|
-
} else {
|
|
1164
|
-
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
1165
|
-
}
|
|
1166
|
-
return;
|
|
1167
|
-
}
|
|
1168
|
-
|
|
1169
|
-
const wrapped = new Error(
|
|
1170
|
-
`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
|
|
1171
|
-
);
|
|
1172
|
-
if (stashRefForDrop) (wrapped as { stashRef?: string }).stashRef = stashRefForDrop;
|
|
1173
|
-
throw wrapped;
|
|
1174
|
-
}
|
|
1175
|
-
}
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
903
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
1179
904
|
|
|
1180
905
|
/**
|
|
@@ -1560,7 +1285,9 @@ export function getAutoWorktreePath(
|
|
|
1560
1285
|
): string | null {
|
|
1561
1286
|
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1562
1287
|
|
|
1563
|
-
|
|
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);
|
|
1564
1291
|
if (!existsSync(p)) return null;
|
|
1565
1292
|
|
|
1566
1293
|
// Validate this is a real git worktree, not a stray directory.
|
|
@@ -1782,10 +1509,10 @@ export function mergeMilestoneToMain(
|
|
|
1782
1509
|
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1783
1510
|
const mainDbPath = contract.projectDb;
|
|
1784
1511
|
try {
|
|
1785
|
-
const activeDbPath =
|
|
1512
|
+
const activeDbPath = getWorkflowDatabasePath();
|
|
1786
1513
|
if (activeDbPath && _shouldReconcileWorktreeDb(activeDbPath, mainDbPath)) {
|
|
1787
|
-
|
|
1788
|
-
if (!
|
|
1514
|
+
closeWorkflowDatabase();
|
|
1515
|
+
if (!openWorkflowDatabasePath(mainDbPath)) {
|
|
1789
1516
|
throw new Error(`cannot open project DB at ${mainDbPath}`);
|
|
1790
1517
|
}
|
|
1791
1518
|
}
|
|
@@ -1798,9 +1525,9 @@ export function mergeMilestoneToMain(
|
|
|
1798
1525
|
throw new GSDError(GSD_GIT_ERROR, `${message}. Recovery reason: ${CLOSEOUT_CONSISTENCY_BLOCKED_REASON}.`);
|
|
1799
1526
|
}
|
|
1800
1527
|
|
|
1801
|
-
const
|
|
1802
|
-
if (!
|
|
1803
|
-
throw new GSDError(GSD_GIT_ERROR,
|
|
1528
|
+
const closeoutProof = proveMilestoneCloseout(milestoneId);
|
|
1529
|
+
if (!closeoutProof.ok) {
|
|
1530
|
+
throw new GSDError(GSD_GIT_ERROR, formatCloseoutProofBlock(closeoutProof));
|
|
1804
1531
|
}
|
|
1805
1532
|
}
|
|
1806
1533
|
|
|
@@ -2127,10 +1854,10 @@ export function mergeMilestoneToMain(
|
|
|
2127
1854
|
// stashing so Windows releases the handles; reopen after. No-op on
|
|
2128
1855
|
// POSIX, where advisory locks don't block git.
|
|
2129
1856
|
const needsDbCycle = process.platform === "win32" && isDbAvailable();
|
|
2130
|
-
const dbPathToReopen = needsDbCycle ?
|
|
1857
|
+
const dbPathToReopen = needsDbCycle ? getWorkflowDatabasePath() : null;
|
|
2131
1858
|
if (needsDbCycle) {
|
|
2132
1859
|
try {
|
|
2133
|
-
|
|
1860
|
+
closeWorkflowDatabase();
|
|
2134
1861
|
} catch (err) {
|
|
2135
1862
|
logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2136
1863
|
}
|
|
@@ -2180,7 +1907,7 @@ export function mergeMilestoneToMain(
|
|
|
2180
1907
|
: nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2181
1908
|
if (needsDbCycle && dbPathToReopen) {
|
|
2182
1909
|
try {
|
|
2183
|
-
|
|
1910
|
+
openWorkflowDatabasePath(dbPathToReopen);
|
|
2184
1911
|
} catch (err) {
|
|
2185
1912
|
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2186
1913
|
}
|
|
@@ -2302,8 +2029,6 @@ export function mergeMilestoneToMain(
|
|
|
2302
2029
|
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
2303
2030
|
const gsdContentConflicts: string[] = [];
|
|
2304
2031
|
const alreadyExists = stashAlreadyExistsFilesFromError(e);
|
|
2305
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
2306
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
2307
2032
|
|
|
2308
2033
|
// Untracked-file restore failures can leave marker conflicts in tracked
|
|
2309
2034
|
// .gsd JSONL files without producing `U` status entries.
|
|
@@ -2367,11 +2092,12 @@ export function mergeMilestoneToMain(
|
|
|
2367
2092
|
} else if (
|
|
2368
2093
|
gsdUU.length === 0 &&
|
|
2369
2094
|
nonGsdUU.length === 0 &&
|
|
2370
|
-
|
|
2371
|
-
nonGsdAlreadyExists.length === 0
|
|
2095
|
+
alreadyExists.length > 0
|
|
2372
2096
|
) {
|
|
2373
|
-
// Untracked-file restore failure from stash pop where all collided
|
|
2374
|
-
//
|
|
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.
|
|
2375
2101
|
if (stashRefForDrop) {
|
|
2376
2102
|
try {
|
|
2377
2103
|
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
@@ -2390,10 +2116,6 @@ export function mergeMilestoneToMain(
|
|
|
2390
2116
|
logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
|
|
2391
2117
|
files: nonGsdUU.join(", "),
|
|
2392
2118
|
});
|
|
2393
|
-
} else if (nonGsdAlreadyExists.length > 0) {
|
|
2394
|
-
logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
|
|
2395
|
-
files: nonGsdAlreadyExists.join(", "),
|
|
2396
|
-
});
|
|
2397
2119
|
} else {
|
|
2398
2120
|
logWarning(
|
|
2399
2121
|
"worktree",
|
|
@@ -2511,62 +2233,24 @@ export function mergeMilestoneToMain(
|
|
|
2511
2233
|
};
|
|
2512
2234
|
|
|
2513
2235
|
let shouldCleanup = false;
|
|
2514
|
-
let pushed = false;
|
|
2515
|
-
let prCreated = false;
|
|
2516
2236
|
try {
|
|
2517
|
-
// 10.
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
}
|
|
2534
|
-
|
|
2535
|
-
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
2536
|
-
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
2537
|
-
const remote = prefs.remote ?? "origin";
|
|
2538
|
-
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
2539
|
-
if (gitRemoteExists(originalBasePath_, remote)) {
|
|
2540
|
-
try {
|
|
2541
|
-
// Push the milestone branch to remote first
|
|
2542
|
-
execFileSync("git", ["push", remote, milestoneBranch], {
|
|
2543
|
-
cwd: originalBasePath_,
|
|
2544
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
2545
|
-
encoding: "utf-8",
|
|
2546
|
-
});
|
|
2547
|
-
const prEvidence = buildPrEvidence({
|
|
2548
|
-
milestoneId,
|
|
2549
|
-
milestoneTitle,
|
|
2550
|
-
changeType: "feat",
|
|
2551
|
-
summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
2552
|
-
testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
|
|
2553
|
-
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2554
|
-
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2555
|
-
});
|
|
2556
|
-
const prUrl = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
|
|
2557
|
-
head: milestoneBranch,
|
|
2558
|
-
base: prTarget,
|
|
2559
|
-
});
|
|
2560
|
-
if (!prUrl) {
|
|
2561
|
-
throw new Error("gh pr create returned no URL");
|
|
2562
|
-
}
|
|
2563
|
-
prCreated = true;
|
|
2564
|
-
} catch (err) {
|
|
2565
|
-
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
2566
|
-
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2567
|
-
}
|
|
2568
|
-
}
|
|
2569
|
-
}
|
|
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;
|
|
2570
2254
|
|
|
2571
2255
|
// 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
|
|
2572
2256
|
// throws only when the milestone has unanchored code changes, passes
|