@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
|
@@ -327,7 +327,15 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
327
327
|
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
328
328
|
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
329
329
|
const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
330
|
-
|
|
330
|
+
// A stranded-recovery session that adopted the milestone branch in the
|
|
331
|
+
// project root must keep re-entering in that mode: the root checkout holds
|
|
332
|
+
// the branch, so creating the canonical worktree would fail with "already
|
|
333
|
+
// in use by another worktree". The override clears when the recovered
|
|
334
|
+
// milestone merges (_mergeAndExit), restoring configured isolation for
|
|
335
|
+
// subsequent milestones.
|
|
336
|
+
const mode = opts.modeOverride ??
|
|
337
|
+
s.strandedRecoveryIsolationMode ??
|
|
338
|
+
getIsolationMode(basePath);
|
|
331
339
|
if (s.isolationDegraded) {
|
|
332
340
|
if (mode === "worktree") {
|
|
333
341
|
try {
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* GSD Worktree Manager
|
|
5
5
|
*
|
|
6
|
-
* Creates and manages git worktrees under .gsd
|
|
6
|
+
* Creates and manages git worktrees under .gsd-worktrees/<name>/ (canonical;
|
|
7
|
+
* legacy .gsd/worktrees/<name>/ stays recognized — see worktree-placement.ts).
|
|
7
8
|
* Each worktree gets its own branch (worktree/<name>) and a full
|
|
8
9
|
* working copy of the project, enabling parallel work streams.
|
|
9
10
|
*
|
|
@@ -11,7 +12,7 @@
|
|
|
11
12
|
* the main branch, then dispatches an LLM-guided merge flow.
|
|
12
13
|
*
|
|
13
14
|
* Flow:
|
|
14
|
-
* 1. create() — git worktree add .gsd
|
|
15
|
+
* 1. create() — git worktree add .gsd-worktrees/<name> -b worktree/<name>
|
|
15
16
|
* 2. user works in the worktree (new plans, milestones, etc.)
|
|
16
17
|
* 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
|
|
17
18
|
* 4. remove() — git worktree remove + branch cleanup
|
|
@@ -24,6 +25,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
24
25
|
import { nativeBranchList, nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeIsAncestor, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
25
26
|
import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
|
|
26
27
|
import { isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
28
|
+
import { canonicalWorktreesDir, worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
27
29
|
function deleteBranchIfPresent(basePath, branch, warningPrefix) {
|
|
28
30
|
try {
|
|
29
31
|
if (!nativeBranchExists(basePath, branch))
|
|
@@ -81,30 +83,39 @@ export function resolveGitDir(basePath) {
|
|
|
81
83
|
}
|
|
82
84
|
return gitPath;
|
|
83
85
|
}
|
|
86
|
+
/** Canonical container for new worktrees. For scans that must also see legacy
|
|
87
|
+
* worktrees, use allWorktreesDirs(). */
|
|
84
88
|
export function worktreesDir(basePath) {
|
|
85
|
-
return
|
|
89
|
+
return canonicalWorktreesDir(resolveWorktreeProjectRoot(basePath));
|
|
86
90
|
}
|
|
91
|
+
/** Every container a GSD worktree may live in (canonical + legacy), canonical first. */
|
|
92
|
+
export function allWorktreesDirs(basePath) {
|
|
93
|
+
return worktreesDirs(resolveWorktreeProjectRoot(basePath));
|
|
94
|
+
}
|
|
95
|
+
/** Path for worktree `name` — an existing legacy worktree keeps its location. */
|
|
87
96
|
export function worktreePath(basePath, name) {
|
|
88
|
-
return
|
|
97
|
+
return worktreePathFor(resolveWorktreeProjectRoot(basePath), name);
|
|
89
98
|
}
|
|
90
99
|
export function worktreeBranchName(name) {
|
|
91
100
|
return `worktree/${name}`;
|
|
92
101
|
}
|
|
93
102
|
/**
|
|
94
|
-
* Validate that a path is inside
|
|
95
|
-
*
|
|
96
|
-
* so that a symlink-resolved
|
|
103
|
+
* Validate that a path is inside a GSD worktrees container (canonical
|
|
104
|
+
* .gsd-worktrees/ or legacy .gsd/worktrees/). Resolves symlinks and
|
|
105
|
+
* normalizes ".." traversals before comparison so that a symlink-resolved
|
|
106
|
+
* or crafted path cannot escape containment.
|
|
97
107
|
*
|
|
98
108
|
* Used as a safety gate before any destructive operation (rmSync,
|
|
99
109
|
* nativeWorktreeRemove --force) to prevent #2365-style data loss.
|
|
100
110
|
*/
|
|
101
111
|
export function isInsideWorktreesDir(basePath, targetPath) {
|
|
102
|
-
const wtDirPath = worktreesDir(basePath);
|
|
103
|
-
const wtDir = existsSync(wtDirPath) ? realpathSync(wtDirPath) : resolve(wtDirPath);
|
|
104
112
|
const resolved = existsSync(targetPath) ? realpathSync(targetPath) : resolve(targetPath);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
return allWorktreesDirs(basePath).some((wtDirPath) => {
|
|
114
|
+
const wtDir = existsSync(wtDirPath) ? realpathSync(wtDirPath) : resolve(wtDirPath);
|
|
115
|
+
// The resolved path must start with the worktrees dir followed by a separator,
|
|
116
|
+
// not merely be a prefix match (e.g. ".gsd/worktrees-extra" must not match).
|
|
117
|
+
return resolved === wtDir || resolved.startsWith(wtDir + sep);
|
|
118
|
+
});
|
|
108
119
|
}
|
|
109
120
|
function isRegisteredGitWorktreeAtPath(basePath, wtPath) {
|
|
110
121
|
try {
|
|
@@ -200,11 +211,11 @@ export function buildManualValidationGuidance(basePath, milestoneId, opts = {})
|
|
|
200
211
|
if (!milestoneId)
|
|
201
212
|
return null;
|
|
202
213
|
const validationRoot = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
203
|
-
const inWorktree = validationRoot
|
|
214
|
+
const inWorktree = isGsdWorktreePath(validationRoot);
|
|
204
215
|
const lines = [`Validate the work here: ${validationRoot}`];
|
|
205
216
|
if (inWorktree) {
|
|
206
|
-
lines.push("This milestone runs in a git worktree, so the code lives under the
|
|
207
|
-
|
|
217
|
+
lines.push("This milestone runs in a git worktree, so the code lives under the " +
|
|
218
|
+
`GSD worktrees directory. Open it with: cd "${validationRoot}"`);
|
|
208
219
|
}
|
|
209
220
|
if (opts.uatPath) {
|
|
210
221
|
lines.push(`Follow the UAT checklist at: ${opts.uatPath}`);
|
|
@@ -224,21 +235,29 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
224
235
|
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
225
236
|
throw new GSDError(GSD_PARSE_ERROR, `Invalid worktree name "${name}". Use only letters, numbers, hyphens, and underscores.`);
|
|
226
237
|
}
|
|
227
|
-
const
|
|
238
|
+
const existingPath = worktreePath(basePath, name);
|
|
228
239
|
const branch = opts.branch ?? worktreeBranchName(name);
|
|
229
|
-
if (existsSync(
|
|
240
|
+
if (existsSync(existingPath)) {
|
|
230
241
|
// A valid git worktree is registered in `git worktree list` and has a .git
|
|
231
242
|
// *file* with a gitdir: pointer. Leftover directories (no .git, a standalone
|
|
232
243
|
// .git directory from accidental `git init`, or an orphan pointer) block
|
|
233
244
|
// creation unless removed.
|
|
234
|
-
if (isRegisteredGitWorktreeAtPath(basePath,
|
|
235
|
-
throw new GSDError(GSD_STALE_STATE, `Worktree "${name}" already exists at ${
|
|
245
|
+
if (isRegisteredGitWorktreeAtPath(basePath, existingPath)) {
|
|
246
|
+
throw new GSDError(GSD_STALE_STATE, `Worktree "${name}" already exists at ${existingPath}`);
|
|
236
247
|
}
|
|
237
|
-
removeStaleWorktreeDirectory(
|
|
248
|
+
removeStaleWorktreeDirectory(existingPath, name);
|
|
238
249
|
}
|
|
239
|
-
//
|
|
250
|
+
// New worktrees always land in the canonical container, even when a stale
|
|
251
|
+
// legacy directory was just cleaned up.
|
|
240
252
|
const wtDir = worktreesDir(basePath);
|
|
253
|
+
const wtPath = join(wtDir, name);
|
|
241
254
|
mkdirSync(wtDir, { recursive: true });
|
|
255
|
+
// When existingPath resolved to a legacy location, the canonical target may
|
|
256
|
+
// still hold a stale directory from a prior aborted creation (no .git marker).
|
|
257
|
+
// Remove it so git worktree add does not fail with "path already exists".
|
|
258
|
+
if (existingPath !== wtPath && existsSync(wtPath) && !isRegisteredGitWorktreeAtPath(basePath, wtPath)) {
|
|
259
|
+
removeStaleWorktreeDirectory(wtPath, name);
|
|
260
|
+
}
|
|
242
261
|
// Prune any stale worktree entries from a previous removal
|
|
243
262
|
nativeWorktreePrune(basePath);
|
|
244
263
|
// Use the explicit start point (e.g. integration branch) if provided,
|
|
@@ -305,7 +324,8 @@ export function createWorktree(basePath, name, opts = {}) {
|
|
|
305
324
|
}
|
|
306
325
|
/**
|
|
307
326
|
* List all GSD-managed worktrees.
|
|
308
|
-
* Uses native worktree list and filters to those under
|
|
327
|
+
* Uses native worktree list and filters to those under a GSD worktrees
|
|
328
|
+
* container (canonical .gsd-worktrees/ or legacy .gsd/worktrees/).
|
|
309
329
|
*/
|
|
310
330
|
export function listWorktrees(basePath) {
|
|
311
331
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
@@ -315,12 +335,8 @@ export function listWorktrees(basePath) {
|
|
|
315
335
|
}
|
|
316
336
|
const seenRoots = new Set();
|
|
317
337
|
const worktreeRoots = baseVariants
|
|
318
|
-
.
|
|
319
|
-
|
|
320
|
-
return {
|
|
321
|
-
normalized: normalizePathForComparison(path),
|
|
322
|
-
};
|
|
323
|
-
})
|
|
338
|
+
.flatMap(baseVariant => worktreesDirs(baseVariant))
|
|
339
|
+
.map(path => ({ normalized: normalizePathForComparison(path) }))
|
|
324
340
|
.filter(root => {
|
|
325
341
|
if (seenRoots.has(root.normalized))
|
|
326
342
|
return false;
|
|
@@ -645,6 +661,7 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
645
661
|
* This module uses a split representation (paths/exact/prefixes) for efficient matching.
|
|
646
662
|
*/
|
|
647
663
|
const SKIP_PATHS = [
|
|
664
|
+
".gsd-worktrees/",
|
|
648
665
|
".gsd/worktrees/",
|
|
649
666
|
".gsd/runtime/",
|
|
650
667
|
".gsd/activity/",
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Placement module — owns WHERE GSD worktrees physically live.
|
|
3
|
+
*
|
|
4
|
+
* Canonical placement: `<projectRoot>/.gsd-worktrees/<name>` — a real
|
|
5
|
+
* directory that never crosses the `.gsd` symlink managed by repo-identity.
|
|
6
|
+
* Under the external-state layout (`.gsd → ~/.gsd/projects/<hash>/`), the
|
|
7
|
+
* legacy `.gsd/worktrees/` location materialised worktrees inside the user's
|
|
8
|
+
* home directory behind an opaque hash path; the canonical sibling keeps the
|
|
9
|
+
* working copy at the project root regardless of where `.gsd` state lives.
|
|
10
|
+
*
|
|
11
|
+
* Legacy placement (`<projectRoot>/.gsd/worktrees/<name>`, possibly resolving
|
|
12
|
+
* through the symlink to `~/.gsd/projects/<hash>/worktrees/<name>`) stays
|
|
13
|
+
* recognized so in-flight milestones keep working across upgrades:
|
|
14
|
+
* - creation always uses the canonical location;
|
|
15
|
+
* - resolution prefers an existing legacy worktree for the same name;
|
|
16
|
+
* - containment checks accept membership in either location.
|
|
17
|
+
*
|
|
18
|
+
* Path → project identification lives in worktree-root.ts; this module owns
|
|
19
|
+
* only the forward direction (project + name → physical path).
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
/** Directory name of the canonical worktrees container at the project root. */
|
|
24
|
+
export const CANONICAL_WORKTREES_DIRNAME = ".gsd-worktrees";
|
|
25
|
+
/** Canonical container for newly created worktrees. Never crosses the `.gsd` symlink. */
|
|
26
|
+
export function canonicalWorktreesDir(projectRoot) {
|
|
27
|
+
return join(projectRoot, CANONICAL_WORKTREES_DIRNAME);
|
|
28
|
+
}
|
|
29
|
+
/** Legacy container (`.gsd/worktrees/`) — may resolve through the external-state symlink. */
|
|
30
|
+
export function legacyWorktreesDir(projectRoot) {
|
|
31
|
+
return join(projectRoot, ".gsd", "worktrees");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* All containers a GSD worktree may live in, canonical first.
|
|
35
|
+
* Use for listing, scanning, and containment checks.
|
|
36
|
+
*/
|
|
37
|
+
export function worktreesDirs(projectRoot) {
|
|
38
|
+
return [canonicalWorktreesDir(projectRoot), legacyWorktreesDir(projectRoot)];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Physical path for the worktree `name` under `projectRoot`.
|
|
42
|
+
*
|
|
43
|
+
* Canonical wins only when it has a `.git` marker (i.e. is a live worktree).
|
|
44
|
+
* A bare directory with no `.git` — a stale leftover from an aborted create
|
|
45
|
+
* or a partial cleanup — does not shadow an existing legacy worktree, so the
|
|
46
|
+
* legacy path is tried next. The legacy check remains a plain existsSync;
|
|
47
|
+
* callers that need a *registered* worktree validate the `.git` marker
|
|
48
|
+
* themselves (resolveCanonicalMilestoneRoot, getAutoWorktreePath).
|
|
49
|
+
* Falls back to canonical for new-worktree creation when neither path exists.
|
|
50
|
+
*/
|
|
51
|
+
export function worktreePathFor(projectRoot, name) {
|
|
52
|
+
const canonical = join(canonicalWorktreesDir(projectRoot), name);
|
|
53
|
+
if (existsSync(canonical) && existsSync(join(canonical, ".git")))
|
|
54
|
+
return canonical;
|
|
55
|
+
const legacy = join(legacyWorktreesDir(projectRoot), name);
|
|
56
|
+
if (existsSync(legacy))
|
|
57
|
+
return legacy;
|
|
58
|
+
return canonical;
|
|
59
|
+
}
|
|
@@ -8,19 +8,23 @@
|
|
|
8
8
|
import { readdirSync } from "node:fs";
|
|
9
9
|
import { enterAutoWorktree, getAutoWorktreePath } from "./auto-worktree.js";
|
|
10
10
|
import { getIsolationMode } from "./preferences.js";
|
|
11
|
-
import {
|
|
11
|
+
import { allWorktreesDirs } from "./worktree-manager.js";
|
|
12
12
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
13
13
|
/**
|
|
14
|
-
* Enumerate the live (valid git) auto-worktrees
|
|
14
|
+
* Enumerate the live (valid git) auto-worktrees in the project's worktree
|
|
15
|
+
* containers (canonical .gsd-worktrees/ and legacy .gsd/worktrees/).
|
|
15
16
|
* Reuses getAutoWorktreePath's validation so stray directories are ignored.
|
|
16
17
|
*/
|
|
17
18
|
function liveMilestoneWorktrees(projectRoot) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
const names = new Set();
|
|
20
|
+
for (const dir of allWorktreesDirs(projectRoot)) {
|
|
21
|
+
try {
|
|
22
|
+
for (const name of readdirSync(dir))
|
|
23
|
+
names.add(name);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// container absent — skip
|
|
27
|
+
}
|
|
24
28
|
}
|
|
25
29
|
const live = [];
|
|
26
30
|
for (const id of names) {
|
|
@@ -14,10 +14,16 @@ export function normalizeWorktreePathForCompare(path) {
|
|
|
14
14
|
return process.platform === "win32" ? (trimmed || "/").toLowerCase() : (trimmed || "/");
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Find the GSD worktree segment in
|
|
18
|
-
*
|
|
17
|
+
* Find the GSD worktree segment in the canonical layout (.gsd-worktrees/),
|
|
18
|
+
* the legacy direct layout (.gsd/worktrees/), and the symlink-resolved
|
|
19
|
+
* external-state layout used by ~/.gsd/projects/<hash>.
|
|
19
20
|
*/
|
|
20
21
|
export function findWorktreeSegment(normalizedPath) {
|
|
22
|
+
const canonicalMarker = "/.gsd-worktrees/";
|
|
23
|
+
const canonicalIdx = normalizedPath.indexOf(canonicalMarker);
|
|
24
|
+
if (canonicalIdx !== -1) {
|
|
25
|
+
return { gsdIdx: canonicalIdx, afterWorktrees: canonicalIdx + canonicalMarker.length };
|
|
26
|
+
}
|
|
21
27
|
const directMarker = "/.gsd/worktrees/";
|
|
22
28
|
const directIdx = normalizedPath.indexOf(directMarker);
|
|
23
29
|
if (directIdx !== -1) {
|
|
@@ -51,6 +57,17 @@ export function findWorktreeSegment(normalizedPath) {
|
|
|
51
57
|
export function isGsdWorktreePath(path) {
|
|
52
58
|
return findWorktreeSegment(path.replaceAll("\\", "/")) !== null;
|
|
53
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Project-root prefix of a GSD worktree path, or null when the path is not
|
|
62
|
+
* inside a recognized worktree layout. Pure string split — no env handling,
|
|
63
|
+
* HOME guard, or filesystem fallbacks (resolveWorktreeProjectRoot adds
|
|
64
|
+
* those). Separator normalization is 1:1 on characters, so the prefix is
|
|
65
|
+
* sliced from the ORIGINAL string and keeps its separators.
|
|
66
|
+
*/
|
|
67
|
+
export function projectRootFromWorktreePath(path) {
|
|
68
|
+
const segment = findWorktreeSegment(path.replaceAll("\\", "/"));
|
|
69
|
+
return segment ? path.slice(0, segment.gsdIdx) : null;
|
|
70
|
+
}
|
|
54
71
|
/**
|
|
55
72
|
* When a milestone worktree lives under the external-state layout
|
|
56
73
|
* (`<gsdHome>/projects/<hash>/worktrees/<MID>/`, or the `GSD_STATE_DIR`
|
|
@@ -60,7 +77,9 @@ export function isGsdWorktreePath(path) {
|
|
|
60
77
|
*/
|
|
61
78
|
export function resolveExternalStateProjectGsdFromWorktreePath(projectPath) {
|
|
62
79
|
const normalized = resolve(projectPath).replaceAll("\\", "/");
|
|
63
|
-
//
|
|
80
|
+
// Canonical/direct layouts — parent state is resolved via repoIdentity(git root).
|
|
81
|
+
if (normalized.includes("/.gsd-worktrees/"))
|
|
82
|
+
return null;
|
|
64
83
|
if (normalized.includes("/.gsd/worktrees/") && !normalized.includes("/.gsd/projects/")) {
|
|
65
84
|
return null;
|
|
66
85
|
}
|
|
@@ -117,12 +136,15 @@ function resolveProjectRootFromPath(path) {
|
|
|
117
136
|
if (!segment) {
|
|
118
137
|
return resolveNearestBootstrappedGsdRoot(path) ?? resolveGitWorkingTreeRoot(path) ?? path;
|
|
119
138
|
}
|
|
139
|
+
// Slice at the first `.gsd` boundary, but never past the worktree segment:
|
|
140
|
+
// in the canonical layout (`<root>/.gsd-worktrees/<MID>/.gsd/...`) the first
|
|
141
|
+
// `/.gsd/` occurrence is the worktree-local projection dir, not the project
|
|
142
|
+
// root's state dir.
|
|
120
143
|
const sepChar = path.includes("\\") ? "\\" : "/";
|
|
121
144
|
const gsdMarker = `${sepChar}.gsd${sepChar}`;
|
|
122
145
|
const markerIdx = path.indexOf(gsdMarker);
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
: path.slice(0, segment.gsdIdx);
|
|
146
|
+
const sliceIdx = markerIdx !== -1 ? Math.min(markerIdx, segment.gsdIdx) : segment.gsdIdx;
|
|
147
|
+
const candidate = path.slice(0, sliceIdx);
|
|
126
148
|
const gsdHomeNorm = normalizeWorktreePathForCompare(gsdHome());
|
|
127
149
|
const candidateGsdPath = normalizeWorktreePathForCompare(join(candidate, ".gsd"));
|
|
128
150
|
if (candidateGsdPath === gsdHomeNorm || candidateGsdPath.startsWith(`${gsdHomeNorm}/`)) {
|
|
@@ -4,6 +4,7 @@ import { existsSync, lstatSync } from "node:fs";
|
|
|
4
4
|
import { execFileSync } from "node:child_process";
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
6
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
7
|
+
import { worktreesDirs } from "./worktree-placement.js";
|
|
7
8
|
import { listWorktrees } from "./worktree-manager.js";
|
|
8
9
|
import { getCurrentBranch } from "./worktree.js";
|
|
9
10
|
const fsOnlyDeps = {
|
|
@@ -59,15 +60,17 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
59
60
|
const projectRoot = resolve(input.projectRoot);
|
|
60
61
|
const unitRoot = resolve(input.unitRoot);
|
|
61
62
|
const isolationMode = input.isolationMode ?? "worktree";
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
// A milestone worktree may live in the canonical container or the
|
|
64
|
+
// legacy one (pre-placement-change worktrees keep their location).
|
|
65
|
+
const expectedRoots = isolationMode === "worktree"
|
|
66
|
+
? worktreesDirs(projectRoot).map((dir) => join(dir, milestoneId))
|
|
67
|
+
: [projectRoot];
|
|
68
|
+
if (!expectedRoots.some((expectedRoot) => samePath(unitRoot, expectedRoot))) {
|
|
66
69
|
return failure("invalid-root", isolationMode === "worktree"
|
|
67
70
|
? `Unit root ${unitRoot} is not the expected worktree root for ${milestoneId}.`
|
|
68
71
|
: `Unit root ${unitRoot} is not the project root while isolation mode is ${isolationMode}.`, isolationMode === "worktree"
|
|
69
72
|
? "Prepare the Unit in its canonical milestone worktree before allowing source writes."
|
|
70
|
-
: "Run the Unit from the project root when worktree isolation is disabled.", { expectedRoot, unitRoot });
|
|
73
|
+
: "Run the Unit from the project root when worktree isolation is disabled.", { expectedRoot: expectedRoots[0], unitRoot });
|
|
71
74
|
}
|
|
72
75
|
if (!deps.existsSync(unitRoot)) {
|
|
73
76
|
return failure("worktree-missing", `Worktree root ${unitRoot} does not exist.`, "Create or recover the milestone worktree before dispatching the source-writing Unit.", { unitRoot });
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// GSD worktree session state
|
|
2
|
+
import { findWorktreeSegment, projectRootFromWorktreePath } from "./worktree-root.js";
|
|
2
3
|
let originalCwd = null;
|
|
3
4
|
export function getWorktreeOriginalCwd() {
|
|
4
5
|
return originalCwd;
|
|
@@ -12,22 +13,22 @@ export function clearWorktreeOriginalCwd() {
|
|
|
12
13
|
export function ensureWorktreeOriginalCwdFromPath(cwd = process.cwd()) {
|
|
13
14
|
if (originalCwd)
|
|
14
15
|
return originalCwd;
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
originalCwd = cwd.slice(0, markerIdx);
|
|
19
|
-
}
|
|
16
|
+
const root = projectRootFromWorktreePath(cwd);
|
|
17
|
+
if (root)
|
|
18
|
+
originalCwd = root;
|
|
20
19
|
return originalCwd;
|
|
21
20
|
}
|
|
22
21
|
export function getActiveWorktreeName() {
|
|
23
22
|
if (!originalCwd)
|
|
24
23
|
return null;
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
24
|
+
const normalizedCwd = process.cwd().replaceAll("\\", "/");
|
|
25
|
+
const normalizedOriginal = originalCwd.replace(/[\\/]+$/, "").replaceAll("\\", "/");
|
|
26
|
+
const segment = findWorktreeSegment(normalizedCwd);
|
|
27
|
+
if (!segment)
|
|
29
28
|
return null;
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
// Only treat the cwd as an active worktree of OUR project root.
|
|
30
|
+
if (normalizedCwd.slice(0, segment.gsdIdx) !== normalizedOriginal)
|
|
31
|
+
return null;
|
|
32
|
+
const name = normalizedCwd.slice(segment.afterWorktrees).split("/")[0];
|
|
32
33
|
return name || null;
|
|
33
34
|
}
|
|
@@ -60,6 +60,23 @@ const VERDICT_RE = /verdict:\s*[\w-]+/i;
|
|
|
60
60
|
* Only overwrites when the source has a verdict — never clobbers a
|
|
61
61
|
* worktree ASSESSMENT with a verdictless project-root copy.
|
|
62
62
|
*/
|
|
63
|
+
function forceOverwriteValidationWithVerdict(srcMilestoneDir, dstMilestoneDir, milestoneId) {
|
|
64
|
+
if (!existsSync(srcMilestoneDir) || !milestoneId)
|
|
65
|
+
return;
|
|
66
|
+
const srcFile = join(srcMilestoneDir, `${milestoneId}-VALIDATION.md`);
|
|
67
|
+
if (!existsSync(srcFile))
|
|
68
|
+
return;
|
|
69
|
+
try {
|
|
70
|
+
const srcContent = readFileSync(srcFile, "utf-8");
|
|
71
|
+
if (!VERDICT_RE.test(srcContent))
|
|
72
|
+
return;
|
|
73
|
+
mkdirSync(dstMilestoneDir, { recursive: true });
|
|
74
|
+
safeCopy(srcFile, join(dstMilestoneDir, `${milestoneId}-VALIDATION.md`), { force: true });
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logWarning("worktree", `validation force-copy failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
63
80
|
function forceOverwriteAssessmentsWithVerdict(srcMilestoneDir, dstMilestoneDir) {
|
|
64
81
|
if (!existsSync(srcMilestoneDir))
|
|
65
82
|
return;
|
|
@@ -211,7 +228,10 @@ export function _projectRootToWorktreeImpl(projectRoot, worktreePath_, milestone
|
|
|
211
228
|
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
212
229
|
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
213
230
|
// run-uat indefinitely (stuck-loop ×9).
|
|
214
|
-
|
|
231
|
+
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
232
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
233
|
+
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
234
|
+
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
215
235
|
// Forward-sync completed-units.json from project root to worktree.
|
|
216
236
|
// Project root is authoritative for completion state after crash recovery;
|
|
217
237
|
// without this, the worktree re-dispatches already-completed units (#1886).
|
|
@@ -354,14 +374,20 @@ export class WorktreeStateProjection {
|
|
|
354
374
|
* any Unit dispatches.
|
|
355
375
|
*/
|
|
356
376
|
projectRootToWorktree(scope) {
|
|
357
|
-
|
|
377
|
+
this.projectRootToWorktreePaths(scope.workspace.projectRoot, scope.workspace.worktreeRoot ?? scope.workspace.projectRoot, scope.milestoneId);
|
|
378
|
+
}
|
|
379
|
+
projectRootToWorktreePaths(projectRoot, worktreePath, milestoneId) {
|
|
380
|
+
_projectRootToWorktreeImpl(projectRoot, worktreePath, milestoneId);
|
|
358
381
|
}
|
|
359
382
|
/**
|
|
360
383
|
* Project state from the auto-worktree back onto the project root for `scope`.
|
|
361
384
|
* Called by the post-unit pipeline between Units.
|
|
362
385
|
*/
|
|
363
386
|
projectWorktreeToRoot(scope) {
|
|
364
|
-
|
|
387
|
+
this.projectWorktreeToRootPaths(scope.workspace.worktreeRoot ?? scope.workspace.projectRoot, scope.workspace.projectRoot, scope.milestoneId);
|
|
388
|
+
}
|
|
389
|
+
projectWorktreeToRootPaths(worktreePath, projectRoot, milestoneId) {
|
|
390
|
+
_projectWorktreeToRootImpl(worktreePath, projectRoot, milestoneId);
|
|
365
391
|
}
|
|
366
392
|
/**
|
|
367
393
|
* Final projection from the auto-worktree to the project root before
|
|
@@ -373,6 +399,9 @@ export class WorktreeStateProjection {
|
|
|
373
399
|
* telemetry on what crossed the boundary.
|
|
374
400
|
*/
|
|
375
401
|
finalizeProjectionForMerge(scope) {
|
|
376
|
-
return
|
|
402
|
+
return this.finalizeProjectionForMergePaths(scope.workspace.projectRoot, scope.workspace.worktreeRoot ?? scope.workspace.projectRoot, scope.milestoneId);
|
|
403
|
+
}
|
|
404
|
+
finalizeProjectionForMergePaths(projectRoot, worktreePath, milestoneId) {
|
|
405
|
+
return _finalizeProjectionForMergeImpl(projectRoot, worktreePath, milestoneId);
|
|
377
406
|
}
|
|
378
407
|
}
|
|
@@ -63,6 +63,18 @@ export function normalizeAutoExitReason(rawReason) {
|
|
|
63
63
|
? reasonLc
|
|
64
64
|
: "other";
|
|
65
65
|
}
|
|
66
|
+
export function autoExitReasonForTerminalOutcome(outcome) {
|
|
67
|
+
switch (outcome?.code) {
|
|
68
|
+
case "all-complete":
|
|
69
|
+
return "all-complete";
|
|
70
|
+
case "settlement-blocked":
|
|
71
|
+
return "blocked";
|
|
72
|
+
case "no-remaining-units":
|
|
73
|
+
return "stop";
|
|
74
|
+
default:
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
66
78
|
// ─── Emitters ────────────────────────────────────────────────────────────
|
|
67
79
|
export function emitWorktreeCreated(projectRoot, milestoneId, meta = {}) {
|
|
68
80
|
emitJournalEvent(projectRoot, baseEntry("worktree-created", {
|
|
@@ -214,9 +214,11 @@ export function registerNativeSearchHooks(pi) {
|
|
|
214
214
|
isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
|
|
215
215
|
}
|
|
216
216
|
else {
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
|
|
217
|
+
// No authoritative provider info available (no event.model, no model_select).
|
|
218
|
+
// Do NOT inject native web_search — guessing on model name alone causes 400
|
|
219
|
+
// "unsupported_value" errors when the actual provider (copilot, openrouter,
|
|
220
|
+
// proxy, etc.) doesn't expose the server-side search tool (#648).
|
|
221
|
+
isAnthropic = false;
|
|
220
222
|
}
|
|
221
223
|
if (!isAnthropic)
|
|
222
224
|
return;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Browser Automation Contract — the single source for the canonical
|
|
3
|
+
// Pi-facing browser tool vocabulary. Engine adapters (legacy Playwright, managed
|
|
4
|
+
// gsd-browser), UAT policy, dispatch preflight, and evidence detection all derive
|
|
5
|
+
// their browser tool knowledge from this module instead of re-listing names.
|
|
6
|
+
/**
|
|
7
|
+
* Canonical `browser_*` tool names of the Browser Automation Contract.
|
|
8
|
+
*
|
|
9
|
+
* These are the product-level names Units see regardless of which Browser
|
|
10
|
+
* Automation Engine serves them (ADR-024). Adding a capability here is the
|
|
11
|
+
* one-line vocabulary change; the engine adapters and presentation surfaces
|
|
12
|
+
* are typed against this list, so missing coverage fails typecheck.
|
|
13
|
+
*/
|
|
14
|
+
export const BROWSER_CONTRACT_TOOL_NAMES = [
|
|
15
|
+
"browser_navigate",
|
|
16
|
+
"browser_click",
|
|
17
|
+
"browser_type",
|
|
18
|
+
"browser_fill_form",
|
|
19
|
+
"browser_click_ref",
|
|
20
|
+
"browser_fill_ref",
|
|
21
|
+
"browser_wait_for",
|
|
22
|
+
"browser_assert",
|
|
23
|
+
"browser_verify",
|
|
24
|
+
"browser_screenshot",
|
|
25
|
+
"browser_snapshot_refs",
|
|
26
|
+
"browser_find",
|
|
27
|
+
"browser_get_console_logs",
|
|
28
|
+
"browser_get_network_logs",
|
|
29
|
+
"browser_evaluate",
|
|
30
|
+
"browser_reload",
|
|
31
|
+
"browser_batch",
|
|
32
|
+
"browser_act",
|
|
33
|
+
];
|
|
34
|
+
const BROWSER_CONTRACT_TOOL_NAME_SET = new Set(BROWSER_CONTRACT_TOOL_NAMES);
|
|
35
|
+
export function isBrowserContractToolName(name) {
|
|
36
|
+
return BROWSER_CONTRACT_TOOL_NAME_SET.has(name);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether a canonical (non-MCP-prefixed) tool name belongs to the browser tool
|
|
40
|
+
* family. Broader than the contract list on purpose: an External MCP Client or
|
|
41
|
+
* host integration may supply additional `browser_*` tools that still satisfy
|
|
42
|
+
* browser-backed UAT.
|
|
43
|
+
*/
|
|
44
|
+
export function hasBrowserContractPrefix(canonicalToolName) {
|
|
45
|
+
return canonicalToolName.startsWith("browser_");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Contract tool names whose appearance in prose marks browser-backed UAT
|
|
49
|
+
* activity (requirement or evidence language). Consumed by the
|
|
50
|
+
* browser-evidence regexes so textual detection stays derived from the
|
|
51
|
+
* contract vocabulary.
|
|
52
|
+
*/
|
|
53
|
+
export const BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES = [
|
|
54
|
+
"browser_assert",
|
|
55
|
+
"browser_batch",
|
|
56
|
+
"browser_find",
|
|
57
|
+
"browser_verify",
|
|
58
|
+
"browser_snapshot_refs",
|
|
59
|
+
];
|