@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
|
@@ -20,10 +20,17 @@ export function normalizeWorktreePathForCompare(path: string): string {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
* Find the GSD worktree segment in
|
|
24
|
-
*
|
|
23
|
+
* Find the GSD worktree segment in the canonical layout (.gsd-worktrees/),
|
|
24
|
+
* the legacy direct layout (.gsd/worktrees/), and the symlink-resolved
|
|
25
|
+
* external-state layout used by ~/.gsd/projects/<hash>.
|
|
25
26
|
*/
|
|
26
27
|
export function findWorktreeSegment(normalizedPath: string): WorktreeSegment | null {
|
|
28
|
+
const canonicalMarker = "/.gsd-worktrees/";
|
|
29
|
+
const canonicalIdx = normalizedPath.indexOf(canonicalMarker);
|
|
30
|
+
if (canonicalIdx !== -1) {
|
|
31
|
+
return { gsdIdx: canonicalIdx, afterWorktrees: canonicalIdx + canonicalMarker.length };
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
const directMarker = "/.gsd/worktrees/";
|
|
28
35
|
const directIdx = normalizedPath.indexOf(directMarker);
|
|
29
36
|
if (directIdx !== -1) {
|
|
@@ -62,6 +69,18 @@ export function isGsdWorktreePath(path: string): boolean {
|
|
|
62
69
|
return findWorktreeSegment(path.replaceAll("\\", "/")) !== null;
|
|
63
70
|
}
|
|
64
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Project-root prefix of a GSD worktree path, or null when the path is not
|
|
74
|
+
* inside a recognized worktree layout. Pure string split — no env handling,
|
|
75
|
+
* HOME guard, or filesystem fallbacks (resolveWorktreeProjectRoot adds
|
|
76
|
+
* those). Separator normalization is 1:1 on characters, so the prefix is
|
|
77
|
+
* sliced from the ORIGINAL string and keeps its separators.
|
|
78
|
+
*/
|
|
79
|
+
export function projectRootFromWorktreePath(path: string): string | null {
|
|
80
|
+
const segment = findWorktreeSegment(path.replaceAll("\\", "/"));
|
|
81
|
+
return segment ? path.slice(0, segment.gsdIdx) : null;
|
|
82
|
+
}
|
|
83
|
+
|
|
65
84
|
/**
|
|
66
85
|
* When a milestone worktree lives under the external-state layout
|
|
67
86
|
* (`<gsdHome>/projects/<hash>/worktrees/<MID>/`, or the `GSD_STATE_DIR`
|
|
@@ -72,7 +91,8 @@ export function isGsdWorktreePath(path: string): boolean {
|
|
|
72
91
|
export function resolveExternalStateProjectGsdFromWorktreePath(projectPath: string): string | null {
|
|
73
92
|
const normalized = resolve(projectPath).replaceAll("\\", "/");
|
|
74
93
|
|
|
75
|
-
//
|
|
94
|
+
// Canonical/direct layouts — parent state is resolved via repoIdentity(git root).
|
|
95
|
+
if (normalized.includes("/.gsd-worktrees/")) return null;
|
|
76
96
|
if (normalized.includes("/.gsd/worktrees/") && !normalized.includes("/.gsd/projects/")) {
|
|
77
97
|
return null;
|
|
78
98
|
}
|
|
@@ -139,12 +159,15 @@ function resolveProjectRootFromPath(path: string): string {
|
|
|
139
159
|
return resolveNearestBootstrappedGsdRoot(path) ?? resolveGitWorkingTreeRoot(path) ?? path;
|
|
140
160
|
}
|
|
141
161
|
|
|
162
|
+
// Slice at the first `.gsd` boundary, but never past the worktree segment:
|
|
163
|
+
// in the canonical layout (`<root>/.gsd-worktrees/<MID>/.gsd/...`) the first
|
|
164
|
+
// `/.gsd/` occurrence is the worktree-local projection dir, not the project
|
|
165
|
+
// root's state dir.
|
|
142
166
|
const sepChar = path.includes("\\") ? "\\" : "/";
|
|
143
167
|
const gsdMarker = `${sepChar}.gsd${sepChar}`;
|
|
144
168
|
const markerIdx = path.indexOf(gsdMarker);
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
: path.slice(0, segment.gsdIdx);
|
|
169
|
+
const sliceIdx = markerIdx !== -1 ? Math.min(markerIdx, segment.gsdIdx) : segment.gsdIdx;
|
|
170
|
+
const candidate = path.slice(0, sliceIdx);
|
|
148
171
|
|
|
149
172
|
const gsdHomeNorm = normalizeWorktreePathForCompare(gsdHome());
|
|
150
173
|
const candidateGsdPath = normalizeWorktreePathForCompare(join(candidate, ".gsd"));
|
|
@@ -6,6 +6,7 @@ import { execFileSync } from "node:child_process";
|
|
|
6
6
|
import { join, resolve } from "node:path";
|
|
7
7
|
|
|
8
8
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
9
|
+
import { worktreesDirs } from "./worktree-placement.js";
|
|
9
10
|
import { listWorktrees } from "./worktree-manager.js";
|
|
10
11
|
import { getCurrentBranch } from "./worktree.js";
|
|
11
12
|
|
|
@@ -158,10 +159,12 @@ export function createWorktreeSafetyModule(
|
|
|
158
159
|
const projectRoot = resolve(input.projectRoot);
|
|
159
160
|
const unitRoot = resolve(input.unitRoot);
|
|
160
161
|
const isolationMode = input.isolationMode ?? "worktree";
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
// A milestone worktree may live in the canonical container or the
|
|
163
|
+
// legacy one (pre-placement-change worktrees keep their location).
|
|
164
|
+
const expectedRoots = isolationMode === "worktree"
|
|
165
|
+
? worktreesDirs(projectRoot).map((dir) => join(dir, milestoneId))
|
|
166
|
+
: [projectRoot];
|
|
167
|
+
if (!expectedRoots.some((expectedRoot) => samePath(unitRoot, expectedRoot))) {
|
|
165
168
|
return failure(
|
|
166
169
|
"invalid-root",
|
|
167
170
|
isolationMode === "worktree"
|
|
@@ -170,7 +173,7 @@ export function createWorktreeSafetyModule(
|
|
|
170
173
|
isolationMode === "worktree"
|
|
171
174
|
? "Prepare the Unit in its canonical milestone worktree before allowing source writes."
|
|
172
175
|
: "Run the Unit from the project root when worktree isolation is disabled.",
|
|
173
|
-
{ expectedRoot, unitRoot },
|
|
176
|
+
{ expectedRoot: expectedRoots[0], unitRoot },
|
|
174
177
|
);
|
|
175
178
|
}
|
|
176
179
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// GSD worktree session state
|
|
2
|
+
import { findWorktreeSegment, projectRootFromWorktreePath } from "./worktree-root.js";
|
|
3
|
+
|
|
2
4
|
let originalCwd: string | null = null;
|
|
3
5
|
|
|
4
6
|
export function getWorktreeOriginalCwd(): string | null {
|
|
@@ -15,21 +17,19 @@ export function clearWorktreeOriginalCwd(): void {
|
|
|
15
17
|
|
|
16
18
|
export function ensureWorktreeOriginalCwdFromPath(cwd: string = process.cwd()): string | null {
|
|
17
19
|
if (originalCwd) return originalCwd;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
if (markerIdx !== -1) {
|
|
21
|
-
originalCwd = cwd.slice(0, markerIdx);
|
|
22
|
-
}
|
|
20
|
+
const root = projectRootFromWorktreePath(cwd);
|
|
21
|
+
if (root) originalCwd = root;
|
|
23
22
|
return originalCwd;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
export function getActiveWorktreeName(): string | null {
|
|
27
26
|
if (!originalCwd) return null;
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
if (!
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
const normalizedCwd = process.cwd().replaceAll("\\", "/");
|
|
28
|
+
const normalizedOriginal = originalCwd.replace(/[\\/]+$/, "").replaceAll("\\", "/");
|
|
29
|
+
const segment = findWorktreeSegment(normalizedCwd);
|
|
30
|
+
if (!segment) return null;
|
|
31
|
+
// Only treat the cwd as an active worktree of OUR project root.
|
|
32
|
+
if (normalizedCwd.slice(0, segment.gsdIdx) !== normalizedOriginal) return null;
|
|
33
|
+
const name = normalizedCwd.slice(segment.afterWorktrees).split("/")[0];
|
|
34
34
|
return name || null;
|
|
35
35
|
}
|
|
@@ -74,6 +74,30 @@ const VERDICT_RE = /verdict:\s*[\w-]+/i;
|
|
|
74
74
|
* Only overwrites when the source has a verdict — never clobbers a
|
|
75
75
|
* worktree ASSESSMENT with a verdictless project-root copy.
|
|
76
76
|
*/
|
|
77
|
+
function forceOverwriteValidationWithVerdict(
|
|
78
|
+
srcMilestoneDir: string,
|
|
79
|
+
dstMilestoneDir: string,
|
|
80
|
+
milestoneId: string,
|
|
81
|
+
): void {
|
|
82
|
+
if (!existsSync(srcMilestoneDir) || !milestoneId) return;
|
|
83
|
+
|
|
84
|
+
const srcFile = join(srcMilestoneDir, `${milestoneId}-VALIDATION.md`);
|
|
85
|
+
if (!existsSync(srcFile)) return;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const srcContent = readFileSync(srcFile, "utf-8");
|
|
89
|
+
if (!VERDICT_RE.test(srcContent)) return;
|
|
90
|
+
|
|
91
|
+
mkdirSync(dstMilestoneDir, { recursive: true });
|
|
92
|
+
safeCopy(srcFile, join(dstMilestoneDir, `${milestoneId}-VALIDATION.md`), { force: true });
|
|
93
|
+
} catch (err) {
|
|
94
|
+
logWarning(
|
|
95
|
+
"worktree",
|
|
96
|
+
`validation force-copy failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
77
101
|
function forceOverwriteAssessmentsWithVerdict(
|
|
78
102
|
srcMilestoneDir: string,
|
|
79
103
|
dstMilestoneDir: string,
|
|
@@ -260,10 +284,10 @@ export function _projectRootToWorktreeImpl(
|
|
|
260
284
|
// session resume the DB is rebuilt from disk, and if the stale ASSESSMENT
|
|
261
285
|
// persists, checkNeedsRunUat finds no passing verdict → re-dispatches
|
|
262
286
|
// run-uat indefinitely (stuck-loop ×9).
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
);
|
|
287
|
+
const prMilestoneDir = join(prGsd, "milestones", milestoneId);
|
|
288
|
+
const wtMilestoneDir = join(wtGsd, "milestones", milestoneId);
|
|
289
|
+
forceOverwriteValidationWithVerdict(prMilestoneDir, wtMilestoneDir, milestoneId);
|
|
290
|
+
forceOverwriteAssessmentsWithVerdict(prMilestoneDir, wtMilestoneDir);
|
|
267
291
|
|
|
268
292
|
// Forward-sync completed-units.json from project root to worktree.
|
|
269
293
|
// Project root is authoritative for completion state after crash recovery;
|
|
@@ -442,25 +466,41 @@ export class WorktreeStateProjection {
|
|
|
442
466
|
* any Unit dispatches.
|
|
443
467
|
*/
|
|
444
468
|
projectRootToWorktree(scope: MilestoneScope): void {
|
|
445
|
-
|
|
469
|
+
this.projectRootToWorktreePaths(
|
|
446
470
|
scope.workspace.projectRoot,
|
|
447
471
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
448
472
|
scope.milestoneId,
|
|
449
473
|
);
|
|
450
474
|
}
|
|
451
475
|
|
|
476
|
+
projectRootToWorktreePaths(
|
|
477
|
+
projectRoot: string,
|
|
478
|
+
worktreePath: string,
|
|
479
|
+
milestoneId: string | null,
|
|
480
|
+
): void {
|
|
481
|
+
_projectRootToWorktreeImpl(projectRoot, worktreePath, milestoneId);
|
|
482
|
+
}
|
|
483
|
+
|
|
452
484
|
/**
|
|
453
485
|
* Project state from the auto-worktree back onto the project root for `scope`.
|
|
454
486
|
* Called by the post-unit pipeline between Units.
|
|
455
487
|
*/
|
|
456
488
|
projectWorktreeToRoot(scope: MilestoneScope): void {
|
|
457
|
-
|
|
489
|
+
this.projectWorktreeToRootPaths(
|
|
458
490
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
459
491
|
scope.workspace.projectRoot,
|
|
460
492
|
scope.milestoneId,
|
|
461
493
|
);
|
|
462
494
|
}
|
|
463
495
|
|
|
496
|
+
projectWorktreeToRootPaths(
|
|
497
|
+
worktreePath: string,
|
|
498
|
+
projectRoot: string,
|
|
499
|
+
milestoneId: string | null,
|
|
500
|
+
): void {
|
|
501
|
+
_projectWorktreeToRootImpl(worktreePath, projectRoot, milestoneId);
|
|
502
|
+
}
|
|
503
|
+
|
|
464
504
|
/**
|
|
465
505
|
* Final projection from the auto-worktree to the project root before
|
|
466
506
|
* teardown. Called by Lifecycle's exit path after a successful merge,
|
|
@@ -471,10 +511,18 @@ export class WorktreeStateProjection {
|
|
|
471
511
|
* telemetry on what crossed the boundary.
|
|
472
512
|
*/
|
|
473
513
|
finalizeProjectionForMerge(scope: MilestoneScope): { synced: string[] } {
|
|
474
|
-
return
|
|
514
|
+
return this.finalizeProjectionForMergePaths(
|
|
475
515
|
scope.workspace.projectRoot,
|
|
476
516
|
scope.workspace.worktreeRoot ?? scope.workspace.projectRoot,
|
|
477
517
|
scope.milestoneId,
|
|
478
518
|
);
|
|
479
519
|
}
|
|
520
|
+
|
|
521
|
+
finalizeProjectionForMergePaths(
|
|
522
|
+
projectRoot: string,
|
|
523
|
+
worktreePath: string,
|
|
524
|
+
milestoneId: string,
|
|
525
|
+
): { synced: string[] } {
|
|
526
|
+
return _finalizeProjectionForMergeImpl(projectRoot, worktreePath, milestoneId);
|
|
527
|
+
}
|
|
480
528
|
}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { randomUUID } from "node:crypto";
|
|
23
23
|
import { emitJournalEvent, queryJournal } from "./journal.js";
|
|
24
24
|
import type { JournalEntry } from "./journal.js";
|
|
25
|
+
import type { AutoTerminalOutcome } from "./auto/contracts.js";
|
|
25
26
|
|
|
26
27
|
function now(): string {
|
|
27
28
|
return new Date().toISOString();
|
|
@@ -91,6 +92,21 @@ export function normalizeAutoExitReason(rawReason?: string): AutoExitReason {
|
|
|
91
92
|
: "other";
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
export function autoExitReasonForTerminalOutcome(
|
|
96
|
+
outcome: AutoTerminalOutcome | undefined,
|
|
97
|
+
): AutoExitReason | null {
|
|
98
|
+
switch (outcome?.code) {
|
|
99
|
+
case "all-complete":
|
|
100
|
+
return "all-complete";
|
|
101
|
+
case "settlement-blocked":
|
|
102
|
+
return "blocked";
|
|
103
|
+
case "no-remaining-units":
|
|
104
|
+
return "stop";
|
|
105
|
+
default:
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
94
110
|
// ─── Emitters ────────────────────────────────────────────────────────────
|
|
95
111
|
|
|
96
112
|
export function emitWorktreeCreated(
|
|
@@ -243,9 +243,11 @@ export function registerNativeSearchHooks(pi: NativeSearchPI): { getIsAnthropic:
|
|
|
243
243
|
// Anthropic-only tool never leaks into OpenAI Responses requests.
|
|
244
244
|
isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
|
|
245
245
|
} else {
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
|
|
246
|
+
// No authoritative provider info available (no event.model, no model_select).
|
|
247
|
+
// Do NOT inject native web_search — guessing on model name alone causes 400
|
|
248
|
+
// "unsupported_value" errors when the actual provider (copilot, openrouter,
|
|
249
|
+
// proxy, etc.) doesn't expose the server-side search tool (#648).
|
|
250
|
+
isAnthropic = false;
|
|
249
251
|
}
|
|
250
252
|
if (!isAnthropic) return;
|
|
251
253
|
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Canonical `browser_*` tool names of the Browser Automation Contract.
|
|
9
|
+
*
|
|
10
|
+
* These are the product-level names Units see regardless of which Browser
|
|
11
|
+
* Automation Engine serves them (ADR-024). Adding a capability here is the
|
|
12
|
+
* one-line vocabulary change; the engine adapters and presentation surfaces
|
|
13
|
+
* are typed against this list, so missing coverage fails typecheck.
|
|
14
|
+
*/
|
|
15
|
+
export const BROWSER_CONTRACT_TOOL_NAMES = [
|
|
16
|
+
"browser_navigate",
|
|
17
|
+
"browser_click",
|
|
18
|
+
"browser_type",
|
|
19
|
+
"browser_fill_form",
|
|
20
|
+
"browser_click_ref",
|
|
21
|
+
"browser_fill_ref",
|
|
22
|
+
"browser_wait_for",
|
|
23
|
+
"browser_assert",
|
|
24
|
+
"browser_verify",
|
|
25
|
+
"browser_screenshot",
|
|
26
|
+
"browser_snapshot_refs",
|
|
27
|
+
"browser_find",
|
|
28
|
+
"browser_get_console_logs",
|
|
29
|
+
"browser_get_network_logs",
|
|
30
|
+
"browser_evaluate",
|
|
31
|
+
"browser_reload",
|
|
32
|
+
"browser_batch",
|
|
33
|
+
"browser_act",
|
|
34
|
+
] as const;
|
|
35
|
+
|
|
36
|
+
export type BrowserContractToolName = (typeof BROWSER_CONTRACT_TOOL_NAMES)[number];
|
|
37
|
+
|
|
38
|
+
const BROWSER_CONTRACT_TOOL_NAME_SET: ReadonlySet<string> = new Set(BROWSER_CONTRACT_TOOL_NAMES);
|
|
39
|
+
|
|
40
|
+
export function isBrowserContractToolName(name: string): name is BrowserContractToolName {
|
|
41
|
+
return BROWSER_CONTRACT_TOOL_NAME_SET.has(name);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Whether a canonical (non-MCP-prefixed) tool name belongs to the browser tool
|
|
46
|
+
* family. Broader than the contract list on purpose: an External MCP Client or
|
|
47
|
+
* host integration may supply additional `browser_*` tools that still satisfy
|
|
48
|
+
* browser-backed UAT.
|
|
49
|
+
*/
|
|
50
|
+
export function hasBrowserContractPrefix(canonicalToolName: string): boolean {
|
|
51
|
+
return canonicalToolName.startsWith("browser_");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Contract tool names whose appearance in prose marks browser-backed UAT
|
|
56
|
+
* activity (requirement or evidence language). Consumed by the
|
|
57
|
+
* browser-evidence regexes so textual detection stays derived from the
|
|
58
|
+
* contract vocabulary.
|
|
59
|
+
*/
|
|
60
|
+
export const BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES = [
|
|
61
|
+
"browser_assert",
|
|
62
|
+
"browser_batch",
|
|
63
|
+
"browser_find",
|
|
64
|
+
"browser_verify",
|
|
65
|
+
"browser_snapshot_refs",
|
|
66
|
+
] as const satisfies readonly BrowserContractToolName[];
|
|
@@ -55,6 +55,14 @@ function parseGsdBrowserVersion(output: string): string | null {
|
|
|
55
55
|
return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
59
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function resolveExplicitGsdBrowserCliPath(env: NodeJS.ProcessEnv): string | undefined {
|
|
63
|
+
return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
58
66
|
function resolveBundledGsdBrowserPackageVersion(): string | null {
|
|
59
67
|
try {
|
|
60
68
|
const requireFromHere = createRequire(import.meta.url);
|
|
@@ -66,20 +74,28 @@ function resolveBundledGsdBrowserPackageVersion(): string | null {
|
|
|
66
74
|
}
|
|
67
75
|
}
|
|
68
76
|
|
|
77
|
+
// The `gsd-browser --version` subprocess result cannot change mid-session (the
|
|
78
|
+
// engine-switch guard forbids restarting with a different engine), and both the
|
|
79
|
+
// availability probe and the launch-config resolution ask for it at session
|
|
80
|
+
// start — memoize so the up-to-2s spawn happens once per process.
|
|
81
|
+
let cachedPathProbeVersion: string | null | undefined;
|
|
82
|
+
|
|
69
83
|
function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
|
|
70
84
|
const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
|
|
71
85
|
if (explicit) return parseGsdBrowserVersion(explicit);
|
|
86
|
+
if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
|
|
72
87
|
|
|
73
88
|
try {
|
|
74
|
-
|
|
89
|
+
cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
|
|
75
90
|
encoding: "utf-8",
|
|
76
91
|
env,
|
|
77
92
|
stdio: ["ignore", "pipe", "ignore"],
|
|
78
93
|
timeout: 2000,
|
|
79
94
|
}));
|
|
80
95
|
} catch {
|
|
81
|
-
|
|
96
|
+
cachedPathProbeVersion = null;
|
|
82
97
|
}
|
|
98
|
+
return cachedPathProbeVersion;
|
|
83
99
|
}
|
|
84
100
|
|
|
85
101
|
function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
|
|
@@ -91,7 +107,7 @@ function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
|
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process.env): string | null {
|
|
94
|
-
const explicit =
|
|
110
|
+
const explicit = resolveExplicitGsdBrowserCliPath(env);
|
|
95
111
|
if (explicit) return explicit;
|
|
96
112
|
|
|
97
113
|
try {
|
|
@@ -115,6 +131,45 @@ export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process
|
|
|
115
131
|
return null;
|
|
116
132
|
}
|
|
117
133
|
|
|
134
|
+
export type GsdBrowserCliAvailability =
|
|
135
|
+
| { available: true; via: "explicit-env" | "bundled" | "path"; detail: string }
|
|
136
|
+
| { available: false; detail: string };
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cheap availability probe for the gsd-browser CLI: explicit env overrides,
|
|
140
|
+
* then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
|
|
141
|
+
* a PATH lookup (one short subprocess, memoized). Used by Browser Automation
|
|
142
|
+
* Engine resolution to decide whether the managed engine is provable before
|
|
143
|
+
* preferring it over legacy Playwright. `via` names the provable source, not
|
|
144
|
+
* necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
|
|
145
|
+
* prefer a newer PATH CLI over the bundled one.
|
|
146
|
+
*/
|
|
147
|
+
export function resolveGsdBrowserCliAvailability(env: NodeJS.ProcessEnv = process.env): GsdBrowserCliAvailability {
|
|
148
|
+
const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
149
|
+
if (explicitCommand) {
|
|
150
|
+
return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
154
|
+
if (explicitCliPath) {
|
|
155
|
+
return existsSync(explicitCliPath)
|
|
156
|
+
? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
|
|
157
|
+
: { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
|
|
161
|
+
if (bundledCliPath) {
|
|
162
|
+
return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const pathVersion = resolvePathGsdBrowserVersion(env);
|
|
166
|
+
if (pathVersion) {
|
|
167
|
+
return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
|
|
171
|
+
}
|
|
172
|
+
|
|
118
173
|
export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string): string {
|
|
119
174
|
const resolvedProjectRoot = resolve(projectRoot);
|
|
120
175
|
const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
|
|
@@ -123,6 +178,35 @@ export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string)
|
|
|
123
178
|
return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
|
|
124
179
|
}
|
|
125
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Recognize an MCP server config (from .mcp.json / Claude settings) as a
|
|
183
|
+
* gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
|
|
184
|
+
* writes the config shape, so it also owns recognizing it. New launch shapes
|
|
185
|
+
* are taught here, in one place.
|
|
186
|
+
*/
|
|
187
|
+
export function isGsdBrowserMcpServerConfig(config: unknown): boolean {
|
|
188
|
+
if (!isRecord(config)) return false;
|
|
189
|
+
|
|
190
|
+
const command = typeof config.command === "string" ? config.command : "";
|
|
191
|
+
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (isRecord(config.env)) {
|
|
196
|
+
const env = config.env;
|
|
197
|
+
if (
|
|
198
|
+
typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
199
|
+
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
200
|
+
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string"
|
|
201
|
+
) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
|
|
207
|
+
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
208
|
+
}
|
|
209
|
+
|
|
126
210
|
export function resolveGsdBrowserMcpLaunchConfig(
|
|
127
211
|
projectRoot: string,
|
|
128
212
|
env: NodeJS.ProcessEnv = process.env,
|
|
@@ -133,7 +217,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
133
217
|
const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
|
|
134
218
|
const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
|
|
135
219
|
const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
136
|
-
const explicitCliPath =
|
|
220
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
137
221
|
const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
|
|
138
222
|
const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
|
|
139
223
|
? resolveBundledGsdBrowserCliPath(env)
|
|
@@ -62,6 +62,13 @@ export interface RoundResult {
|
|
|
62
62
|
/** Always false — end is handled by showWrapUpScreen, not per-question */
|
|
63
63
|
endInterview: false;
|
|
64
64
|
answers: Record<string, { selected: string | string[]; notes: string }>;
|
|
65
|
+
/**
|
|
66
|
+
* Set to true only when the round ended because the external AbortSignal
|
|
67
|
+
* fired (e.g. a system/host teardown), as distinct from a deliberate user
|
|
68
|
+
* dismissal. Consumers use this to avoid laundering a system teardown into a
|
|
69
|
+
* clean user-declined cancel. Additive/optional — native consumers ignore it.
|
|
70
|
+
*/
|
|
71
|
+
interrupted?: boolean;
|
|
65
72
|
}
|
|
66
73
|
|
|
67
74
|
export interface WrapUpResult {
|
|
@@ -97,6 +104,12 @@ export interface InterviewRoundOptions {
|
|
|
97
104
|
* Defaults to "end interview".
|
|
98
105
|
*/
|
|
99
106
|
exitLabel?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Render as a floating overlay instead of replacing the editor. Use when the
|
|
109
|
+
* interview must stay visible during an in-flight agent stream (e.g. claude-code-cli
|
|
110
|
+
* MCP elicitation).
|
|
111
|
+
*/
|
|
112
|
+
overlay?: boolean;
|
|
100
113
|
}
|
|
101
114
|
|
|
102
115
|
export interface WrapUpOptions {
|
|
@@ -240,7 +253,7 @@ export async function showInterviewRound(
|
|
|
240
253
|
|
|
241
254
|
// External cancellation (e.g. remote channel won the race)
|
|
242
255
|
if (opts.signal) {
|
|
243
|
-
const onAbort = () => finish({ endInterview: false, answers: {} });
|
|
256
|
+
const onAbort = () => finish({ endInterview: false, answers: {}, interrupted: true });
|
|
244
257
|
if (opts.signal.aborted) { onAbort(); }
|
|
245
258
|
else {
|
|
246
259
|
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
@@ -845,5 +858,5 @@ export async function showInterviewRound(
|
|
|
845
858
|
invalidate: () => { cachedLines = undefined; },
|
|
846
859
|
handleInput,
|
|
847
860
|
};
|
|
848
|
-
});
|
|
861
|
+
}, opts.overlay ? { overlay: true } : undefined);
|
|
849
862
|
}
|