@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +24 -37
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +12 -46
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +14 -25
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +17 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -22
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +29 -35
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +10 -46
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +19 -26
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +20 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -5,10 +5,12 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
|
5
5
|
import { minimatch } from "minimatch";
|
|
6
6
|
|
|
7
7
|
import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
8
|
+
import { stripMcpToolPrefix } from "../mcp-tool-name.js";
|
|
8
9
|
import { getIsolationMode } from "../preferences.js";
|
|
9
10
|
import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-context-manifest.js";
|
|
10
11
|
import { logWarning } from "../workflow-logger.js";
|
|
11
12
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
13
|
+
import { worktreesDirs } from "../worktree-placement.js";
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
@@ -123,9 +125,7 @@ const GATE_SAFE_TOOLS = new Set([
|
|
|
123
125
|
]);
|
|
124
126
|
|
|
125
127
|
export function canonicalToolName(toolName: string): string {
|
|
126
|
-
|
|
127
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
128
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
128
|
+
return stripMcpToolPrefix(toolName);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
export interface WriteGateSnapshot {
|
|
@@ -245,6 +245,27 @@ export function loadWriteGateSnapshot(basePath: string): WriteGateSnapshot {
|
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Merge the persisted write-gate snapshot into the in-process Map entry.
|
|
250
|
+
* The workflow MCP server runs in a child process and records depth
|
|
251
|
+
* verification there; without this refresh the extension host keeps stale
|
|
252
|
+
* pending-gate memory and `activateDeferredApprovalGate` can re-arm a gate
|
|
253
|
+
* that the subprocess already cleared on disk.
|
|
254
|
+
*
|
|
255
|
+
* Returns the snapshot used for the refresh so callers that need to inspect
|
|
256
|
+
* it (e.g. re-arm guards) avoid a second disk read.
|
|
257
|
+
*/
|
|
258
|
+
export function refreshWriteGateStateFromDisk(basePath: string): WriteGateSnapshot {
|
|
259
|
+
const snapshot = loadWriteGateSnapshot(basePath);
|
|
260
|
+
if (!shouldPersistWriteGateSnapshot()) return snapshot;
|
|
261
|
+
const state = getWriteGateState(basePath);
|
|
262
|
+
state.pendingGateId = snapshot.pendingGateId;
|
|
263
|
+
state.activeQueuePhase = snapshot.activeQueuePhase;
|
|
264
|
+
state.verifiedDepthMilestones = new Set(snapshot.verifiedDepthMilestones);
|
|
265
|
+
state.verifiedApprovalGates = new Set(snapshot.verifiedApprovalGates ?? []);
|
|
266
|
+
return snapshot;
|
|
267
|
+
}
|
|
268
|
+
|
|
248
269
|
export function isDepthVerified(basePath: string = process.cwd()): boolean {
|
|
249
270
|
return getWriteGateState(basePath).verifiedDepthMilestones.size > 0;
|
|
250
271
|
}
|
|
@@ -257,6 +278,7 @@ export function isMilestoneDepthVerified(
|
|
|
257
278
|
basePath: string = process.cwd(),
|
|
258
279
|
): boolean {
|
|
259
280
|
if (!milestoneId) return false;
|
|
281
|
+
refreshWriteGateStateFromDisk(basePath);
|
|
260
282
|
return getWriteGateState(basePath).verifiedDepthMilestones.has(milestoneId);
|
|
261
283
|
}
|
|
262
284
|
|
|
@@ -358,6 +380,7 @@ export function clearPendingGate(basePath: string): void {
|
|
|
358
380
|
* Get the currently pending gate, if any.
|
|
359
381
|
*/
|
|
360
382
|
export function getPendingGate(basePath: string = process.cwd()): string | null {
|
|
383
|
+
refreshWriteGateStateFromDisk(basePath);
|
|
361
384
|
return getWriteGateState(basePath).pendingGateId;
|
|
362
385
|
}
|
|
363
386
|
|
|
@@ -462,6 +485,111 @@ export function isDepthConfirmationAnswer(
|
|
|
462
485
|
return false;
|
|
463
486
|
}
|
|
464
487
|
|
|
488
|
+
export interface AskUserQuestionsGateQuestion {
|
|
489
|
+
id?: unknown;
|
|
490
|
+
options?: Array<{ label?: string }>;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export interface AskUserQuestionsGateDetails {
|
|
494
|
+
cancelled?: boolean;
|
|
495
|
+
interrupted?: boolean;
|
|
496
|
+
response?: {
|
|
497
|
+
answers?: Record<string, { selected?: unknown } | undefined>;
|
|
498
|
+
} | null;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
export type AskUserQuestionsGateResult =
|
|
502
|
+
| { status: "not-gate" }
|
|
503
|
+
| { status: "waiting"; pendingGateId: string; interrupted: boolean }
|
|
504
|
+
| { status: "verified"; gateId: string; milestoneId: string | null }
|
|
505
|
+
| { status: "answered"; gateId: string };
|
|
506
|
+
|
|
507
|
+
function findGateQuestion(
|
|
508
|
+
questions: AskUserQuestionsGateQuestion[],
|
|
509
|
+
gateId: string,
|
|
510
|
+
): AskUserQuestionsGateQuestion | undefined {
|
|
511
|
+
return questions.find((question) => question?.id === gateId);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function readSelectedGateAnswer(
|
|
515
|
+
details: AskUserQuestionsGateDetails,
|
|
516
|
+
questionId: string,
|
|
517
|
+
): unknown {
|
|
518
|
+
return details.response?.answers?.[questionId]?.selected;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function verifyAnsweredGate(
|
|
522
|
+
basePath: string,
|
|
523
|
+
question: AskUserQuestionsGateQuestion,
|
|
524
|
+
fallbackMilestoneId?: string | null,
|
|
525
|
+
): AskUserQuestionsGateResult {
|
|
526
|
+
const gateId = typeof question.id === "string" ? question.id : "";
|
|
527
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId) ?? fallbackMilestoneId ?? null;
|
|
528
|
+
markApprovalGateVerified(gateId, basePath);
|
|
529
|
+
markDepthVerified(milestoneId, basePath);
|
|
530
|
+
clearPendingGate(basePath);
|
|
531
|
+
return { status: "verified", gateId, milestoneId };
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
export function applyAskUserQuestionsGateResult(options: {
|
|
535
|
+
basePath: string;
|
|
536
|
+
questions: AskUserQuestionsGateQuestion[];
|
|
537
|
+
details: AskUserQuestionsGateDetails;
|
|
538
|
+
fallbackMilestoneId?: string | null;
|
|
539
|
+
}): AskUserQuestionsGateResult {
|
|
540
|
+
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
541
|
+
const currentPendingGate = getPendingGate(basePath);
|
|
542
|
+
if (currentPendingGate) {
|
|
543
|
+
if (details.cancelled || !details.response) {
|
|
544
|
+
return {
|
|
545
|
+
status: "waiting",
|
|
546
|
+
pendingGateId: currentPendingGate,
|
|
547
|
+
interrupted: details.interrupted === true,
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const pendingQuestion = findGateQuestion(questions, currentPendingGate);
|
|
552
|
+
if (pendingQuestion) {
|
|
553
|
+
const selected = readSelectedGateAnswer(details, currentPendingGate);
|
|
554
|
+
if (isDepthConfirmationAnswer(selected, pendingQuestion.options)) {
|
|
555
|
+
return verifyAnsweredGate(basePath, pendingQuestion, fallbackMilestoneId);
|
|
556
|
+
}
|
|
557
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
if (details.cancelled || !details.response) return { status: "not-gate" };
|
|
562
|
+
|
|
563
|
+
for (const question of questions) {
|
|
564
|
+
if (typeof question.id !== "string" || !isGateQuestionId(question.id)) continue;
|
|
565
|
+
const selected = readSelectedGateAnswer(details, question.id);
|
|
566
|
+
if (!isDepthConfirmationAnswer(selected, question.options)) {
|
|
567
|
+
return { status: "answered", gateId: question.id };
|
|
568
|
+
}
|
|
569
|
+
if (currentPendingGate && question.id !== currentPendingGate) {
|
|
570
|
+
return { status: "answered", gateId: currentPendingGate };
|
|
571
|
+
}
|
|
572
|
+
return verifyAnsweredGate(basePath, question, fallbackMilestoneId);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
return { status: "not-gate" };
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
export function formatPendingAskUserQuestionsGateMessage(
|
|
579
|
+
pendingGateId: string,
|
|
580
|
+
interrupted: boolean,
|
|
581
|
+
): string {
|
|
582
|
+
return [
|
|
583
|
+
`Waiting for depth confirmation on gate "${pendingGateId}".`,
|
|
584
|
+
interrupted
|
|
585
|
+
? "The confirmation question was interrupted before a response was recorded."
|
|
586
|
+
: "No user response was received for the confirmation question.",
|
|
587
|
+
"Do not infer approval from earlier or prior messages.",
|
|
588
|
+
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
589
|
+
`Re-call ask_user_questions with the same gate question id ("${pendingGateId}") and wait for the user's response.`,
|
|
590
|
+
].join(" ");
|
|
591
|
+
}
|
|
592
|
+
|
|
465
593
|
export function shouldBlockContextWrite(
|
|
466
594
|
toolName: string,
|
|
467
595
|
inputPath: string,
|
|
@@ -1034,10 +1162,12 @@ export function shouldBlockWorktreeWrite(
|
|
|
1034
1162
|
const realTarget = realpathOrResolve(absTarget);
|
|
1035
1163
|
const realRoot = realpathOrResolve(projectRoot);
|
|
1036
1164
|
const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
|
|
1037
|
-
const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
|
|
1038
1165
|
|
|
1039
|
-
// Allow writes inside
|
|
1040
|
-
|
|
1166
|
+
// Allow writes inside a legitimate worktrees subtree (canonical
|
|
1167
|
+
// .gsd-worktrees/ or legacy .gsd/worktrees/).
|
|
1168
|
+
for (const container of worktreesDirs(projectRoot)) {
|
|
1169
|
+
if (isPathContained(realTarget, realpathOrResolve(container))) return { block: false };
|
|
1170
|
+
}
|
|
1041
1171
|
|
|
1042
1172
|
// Allow writes to .gsd/ planning artifacts, but reject siblings whose name
|
|
1043
1173
|
// starts with "worktrees" (the worktrees-extra prefix trick — case 4).
|
|
@@ -14,3 +14,6 @@ export const QUICK_BRANCH_RE = /^gsd\/quick\//;
|
|
|
14
14
|
|
|
15
15
|
/** Matches GSD-generated workflow template branches, not arbitrary user gsd/* branches. */
|
|
16
16
|
export const WORKFLOW_BRANCH_RE = /^gsd\/(?:hotfix|bugfix|small-feature|refactor|spike|security-audit|dep-upgrade|full-project)\//;
|
|
17
|
+
|
|
18
|
+
/** Auto-mode milestone branch prefix: milestone/<MID>. */
|
|
19
|
+
export const MILESTONE_BRANCH_PREFIX = "milestone/";
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared browser-observable UAT requirement and evidence detection.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
import { BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES } from "../shared/browser-contract.js";
|
|
5
|
+
|
|
6
|
+
// Alternation fragment over the contract's evidence-signal names, e.g.
|
|
7
|
+
// `browser_(?:assert|batch|...)`. The names are `browser_`-prefixed
|
|
8
|
+
// identifiers (pinned by tests/browser-contract.test.ts), so no escaping is
|
|
9
|
+
// needed.
|
|
10
|
+
const BROWSER_TOOL_SIGNAL = `browser_(?:${
|
|
11
|
+
BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES.map((name) => name.slice("browser_".length)).join("|")
|
|
12
|
+
})`;
|
|
13
|
+
|
|
14
|
+
export const BROWSER_REQUIREMENT_RE = new RegExp(
|
|
15
|
+
String.raw`\b(?:file://|localhost|playwright|chrome|screenshot|snapshot|${BROWSER_TOOL_SIGNAL})\b|\b(?:open|launch|navigate|load|visit|serve|start)\b.{0,80}\b(?:browser|page|localhost|file://)\b|\bbrowser\s+(?:check|session|test|uat|tool|automation|interaction|flow)\b`,
|
|
16
|
+
"i",
|
|
17
|
+
);
|
|
5
18
|
export const NO_BROWSER_EVIDENCE_RE = /\b(?:no|without|not|wasn'?t|isn'?t)\s+(?:automated\s+)?(?:live\s+)?browser(?:\s+(?:session|test|uat))?|\bno\s+automated\s+browser\b|\bnot\s+conducted\b/i;
|
|
6
|
-
export const BROWSER_RUNTIME_RE =
|
|
19
|
+
export const BROWSER_RUNTIME_RE = new RegExp(
|
|
20
|
+
String.raw`\b(?:browser|playwright|chrome|camoufox|${BROWSER_TOOL_SIGNAL}|screenshot|snapshot|file://|localhost)\b`,
|
|
21
|
+
"i",
|
|
22
|
+
);
|
|
7
23
|
export const BROWSER_ACTION_RE = /\b(?:open(?:ed)?|navigate(?:d)?|click(?:ed)?|type(?:d)?|reload(?:ed)?|capture(?:d)?|screenshot|snapshot)\b/i;
|
|
8
24
|
export const BROWSER_ASSERTION_RE = /\b(?:assert(?:ed|ion)?|observed|confirmed|verified|expected|visible|text|count|label|strikethrough|localstorage|screenshot|snapshot|passed)\b/i;
|
|
9
25
|
const NON_REQUIREMENT_BROWSER_HEADING_RE = /^(?:not\s+proven|not\s+covered|out\s+of\s+scope|deferred|follow-?ups?|known\s+limitations|notes\s+for\s+tester)\b/i;
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
12
|
-
import { join, resolve
|
|
12
|
+
import { join, resolve } from "node:path";
|
|
13
13
|
import { randomUUID } from "node:crypto";
|
|
14
14
|
import { gsdRoot } from "./paths.js";
|
|
15
|
+
import { projectRootFromWorktreePath } from "./worktree-root.js";
|
|
15
16
|
|
|
16
17
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
17
18
|
|
|
@@ -59,21 +60,9 @@ const VALID_CLASSIFICATIONS: readonly string[] = [
|
|
|
59
60
|
* directory that contains `.gsd/worktrees/` — that's the project root.
|
|
60
61
|
*/
|
|
61
62
|
export function resolveCapturesPath(basePath: string): string {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
let idx = resolved.indexOf(worktreeMarker);
|
|
66
|
-
if (idx === -1) {
|
|
67
|
-
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
|
|
68
|
-
const symlinkRe = new RegExp(
|
|
69
|
-
`\\${sep}\\.gsd\\${sep}projects\\${sep}[a-f0-9]+\\${sep}worktrees\\${sep}`,
|
|
70
|
-
);
|
|
71
|
-
const match = resolved.match(symlinkRe);
|
|
72
|
-
if (match && match.index !== undefined) idx = match.index;
|
|
73
|
-
}
|
|
74
|
-
if (idx !== -1) {
|
|
75
|
-
// basePath is inside a worktree — resolve to project root
|
|
76
|
-
const projectRoot = resolved.slice(0, idx);
|
|
63
|
+
// If basePath is inside a worktree, resolve to the project root.
|
|
64
|
+
const projectRoot = projectRootFromWorktreePath(resolve(basePath));
|
|
65
|
+
if (projectRoot) {
|
|
77
66
|
return join(projectRoot, ".gsd", CAPTURES_FILENAME);
|
|
78
67
|
}
|
|
79
68
|
return join(gsdRoot(basePath), CAPTURES_FILENAME);
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
3
|
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
|
|
4
6
|
import {
|
|
5
|
-
getDbPath,
|
|
6
7
|
getLatestAssessmentByScope,
|
|
7
8
|
getMilestone,
|
|
8
9
|
getMilestoneSlices,
|
|
9
10
|
getPendingGates,
|
|
10
11
|
getSliceTasks,
|
|
11
12
|
isDbAvailable,
|
|
12
|
-
refreshOpenDatabaseFromDisk,
|
|
13
13
|
} from "./gsd-db.js";
|
|
14
|
+
import {
|
|
15
|
+
getWorkflowDatabasePath,
|
|
16
|
+
refreshWorkflowDatabaseFromDisk,
|
|
17
|
+
} from "./db-workspace.js";
|
|
14
18
|
import { isClosedStatus } from "./status-guards.js";
|
|
19
|
+
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
15
20
|
|
|
16
21
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
17
22
|
|
|
@@ -37,6 +42,8 @@ export type CloseoutConsistencyResult =
|
|
|
37
42
|
|
|
38
43
|
export interface CloseoutConsistencyOptions {
|
|
39
44
|
refreshFromDisk?: boolean;
|
|
45
|
+
allowOpenMilestone?: boolean;
|
|
46
|
+
artifactBasePath?: string;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
|
|
@@ -52,6 +59,12 @@ function isFileBackedDbPath(path: string | null): boolean {
|
|
|
52
59
|
return Boolean(path && path !== ":memory:");
|
|
53
60
|
}
|
|
54
61
|
|
|
62
|
+
function artifactBasePathFromDb(): string | undefined {
|
|
63
|
+
const dbPath = getWorkflowDatabasePath();
|
|
64
|
+
if (!isFileBackedDbPath(dbPath)) return undefined;
|
|
65
|
+
return dirname(dirname(dbPath!));
|
|
66
|
+
}
|
|
67
|
+
|
|
55
68
|
export function checkCloseoutConsistencyGate(
|
|
56
69
|
milestoneId: string,
|
|
57
70
|
options: CloseoutConsistencyOptions = {},
|
|
@@ -63,7 +76,7 @@ export function checkCloseoutConsistencyGate(
|
|
|
63
76
|
);
|
|
64
77
|
}
|
|
65
78
|
|
|
66
|
-
if (options.refreshFromDisk && isFileBackedDbPath(
|
|
79
|
+
if (options.refreshFromDisk && isFileBackedDbPath(getWorkflowDatabasePath()) && !refreshWorkflowDatabaseFromDisk()) {
|
|
67
80
|
return blocked(
|
|
68
81
|
"db-refresh-failed",
|
|
69
82
|
`Closeout consistency blocked for ${milestoneId}: canonical DB refresh failed.`,
|
|
@@ -77,15 +90,17 @@ export function checkCloseoutConsistencyGate(
|
|
|
77
90
|
`Closeout consistency blocked for ${milestoneId}: milestone is missing from canonical DB.`,
|
|
78
91
|
);
|
|
79
92
|
}
|
|
80
|
-
if (!isClosedStatus(milestone.status)) {
|
|
93
|
+
if (!isClosedStatus(milestone.status) && !options.allowOpenMilestone) {
|
|
81
94
|
return blocked(
|
|
82
95
|
"milestone-open",
|
|
83
96
|
`Closeout consistency blocked for ${milestoneId}: canonical DB milestone status is "${milestone.status}".`,
|
|
84
97
|
);
|
|
85
98
|
}
|
|
86
99
|
|
|
100
|
+
const validation = milestone.status === "skipped"
|
|
101
|
+
? null
|
|
102
|
+
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
87
103
|
if (milestone.status !== "skipped") {
|
|
88
|
-
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
89
104
|
if (validation?.status !== "pass") {
|
|
90
105
|
return blocked(
|
|
91
106
|
"validation-not-pass",
|
|
@@ -102,6 +117,13 @@ export function checkCloseoutConsistencyGate(
|
|
|
102
117
|
);
|
|
103
118
|
}
|
|
104
119
|
|
|
120
|
+
if (milestone.status !== "skipped") {
|
|
121
|
+
closeQualityGatesFromEvidence(milestoneId, {
|
|
122
|
+
artifactBasePath: options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
123
|
+
milestoneValidationPassed: validation?.status === "pass",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
105
127
|
for (const slice of slices) {
|
|
106
128
|
if (!isClosedStatus(slice.status)) {
|
|
107
129
|
return blocked(
|
|
@@ -10,6 +10,7 @@ import { runTurnGitAction, type TurnGitActionMode, type TurnGitActionResult } fr
|
|
|
10
10
|
import { _getAdapter, upsertTurnGitTransaction } from "./gsd-db.js";
|
|
11
11
|
import { probeGitConflictState } from "./git-conflict-state.js";
|
|
12
12
|
import { parseUnitId } from "./unit-id.js";
|
|
13
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
13
14
|
|
|
14
15
|
export interface CloseoutFailureRecord {
|
|
15
16
|
traceId: string;
|
|
@@ -156,7 +157,7 @@ export function resolveCloseoutRecoveryBasePath(projectRoot: string, record: Clo
|
|
|
156
157
|
const parsed = parseUnitId(record.unitId);
|
|
157
158
|
const milestoneId = parsed.milestone ?? (/^M\d+(?:-[a-z0-9]{6})?/.exec(record.unitId)?.[0] ?? "");
|
|
158
159
|
if (milestoneId) {
|
|
159
|
-
const worktreePath = existingRealPath(
|
|
160
|
+
const worktreePath = existingRealPath(worktreePathFor(projectRoot, milestoneId));
|
|
160
161
|
if (worktreePath) return worktreePath;
|
|
161
162
|
}
|
|
162
163
|
|
|
@@ -472,17 +472,21 @@ export function ensureCodebaseMapFresh(
|
|
|
472
472
|
const force = ensureOptions?.force === true;
|
|
473
473
|
const now = Date.now();
|
|
474
474
|
|
|
475
|
+
// Enumerate files and compute fingerprint before the TTL check so that
|
|
476
|
+
// file changes are always detected, even within the TTL window.
|
|
477
|
+
const existing = readCodebaseMap(basePath);
|
|
478
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
479
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
480
|
+
|
|
481
|
+
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
482
|
+
// confirming that no tracked files changed since the last check.
|
|
475
483
|
if (!force && ttlMs > 0) {
|
|
476
484
|
const cached = freshnessCache.get(cacheKey);
|
|
477
|
-
if (cached && now - cached.checkedAt < ttlMs) {
|
|
485
|
+
if (cached && now - cached.checkedAt < ttlMs && cached.result.fingerprint === fingerprint) {
|
|
478
486
|
return cached.result;
|
|
479
487
|
}
|
|
480
488
|
}
|
|
481
489
|
|
|
482
|
-
const existing = readCodebaseMap(basePath);
|
|
483
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
484
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
485
|
-
|
|
486
490
|
const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
|
|
487
491
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
488
492
|
return result;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
-
import { join
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { gsdHome } from "../gsd-home.js";
|
|
6
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
6
7
|
import { VISUAL_BRIEF_MODES } from "../../visual-brief/prompts.js";
|
|
7
8
|
|
|
8
9
|
|
|
@@ -396,75 +397,12 @@ function getExtensionCompletions(prefix: string, action: string) {
|
|
|
396
397
|
}
|
|
397
398
|
}
|
|
398
399
|
|
|
399
|
-
function normalizePathForCompare(path: string): string {
|
|
400
|
-
return path.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
function findWorktreeSegment(normalizedPath: string): { gsdIdx: number; afterWorktrees: number } | null {
|
|
404
|
-
const directMarker = "/.gsd/worktrees/";
|
|
405
|
-
const directIdx = normalizedPath.indexOf(directMarker);
|
|
406
|
-
if (directIdx !== -1) {
|
|
407
|
-
return { gsdIdx: directIdx, afterWorktrees: directIdx + directMarker.length };
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
const symlinkMatch = normalizedPath.match(/\/\.gsd\/projects\/[a-f0-9]+\/worktrees\//);
|
|
411
|
-
if (symlinkMatch?.index !== undefined) {
|
|
412
|
-
return { gsdIdx: symlinkMatch.index, afterWorktrees: symlinkMatch.index + symlinkMatch[0].length };
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
function resolveProjectRootFromGitFile(worktreePath: string): string | null {
|
|
419
|
-
try {
|
|
420
|
-
let dir = worktreePath;
|
|
421
|
-
for (let i = 0; i < 30; i++) {
|
|
422
|
-
const gitPath = join(dir, ".git");
|
|
423
|
-
if (existsSync(gitPath)) {
|
|
424
|
-
const content = readFileSync(gitPath, "utf8").trim();
|
|
425
|
-
if (content.startsWith("gitdir: ")) {
|
|
426
|
-
const gitDir = resolve(dir, content.slice(8));
|
|
427
|
-
const dotGitDir = resolve(gitDir, "..", "..");
|
|
428
|
-
if (dotGitDir.endsWith(".git") || dotGitDir.endsWith(".git/") || dotGitDir.endsWith(".git\\")) {
|
|
429
|
-
return resolve(dotGitDir, "..");
|
|
430
|
-
}
|
|
431
|
-
const commonDirPath = join(gitDir, "commondir");
|
|
432
|
-
if (existsSync(commonDirPath)) {
|
|
433
|
-
const commonDir = readFileSync(commonDirPath, "utf8").trim();
|
|
434
|
-
return resolve(resolve(gitDir, commonDir), "..");
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
const parent = resolve(dir, "..");
|
|
440
|
-
if (parent === dir) break;
|
|
441
|
-
dir = parent;
|
|
442
|
-
}
|
|
443
|
-
} catch {
|
|
444
|
-
// Completion must stay best-effort.
|
|
445
|
-
}
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
400
|
function resolveProjectRootForCompletion(basePath: string): string {
|
|
401
|
+
// Completion honors GSD_PROJECT_ROOT unconditionally (worker processes may
|
|
402
|
+
// complete from any cwd); resolveWorktreeProjectRoot only honors it for
|
|
403
|
+
// worktree paths.
|
|
450
404
|
if (process.env.GSD_PROJECT_ROOT) return process.env.GSD_PROJECT_ROOT;
|
|
451
|
-
|
|
452
|
-
const normalizedPath = normalizePathForCompare(basePath);
|
|
453
|
-
const segment = findWorktreeSegment(normalizedPath);
|
|
454
|
-
if (!segment) return basePath;
|
|
455
|
-
|
|
456
|
-
const separator = basePath.includes("\\") ? "\\" : "/";
|
|
457
|
-
const gsdMarker = `${separator}.gsd${separator}`;
|
|
458
|
-
const gsdIdx = basePath.indexOf(gsdMarker);
|
|
459
|
-
const candidate = gsdIdx !== -1 ? basePath.slice(0, gsdIdx) : basePath.slice(0, segment.gsdIdx);
|
|
460
|
-
|
|
461
|
-
const normalizedGsdHome = normalizePathForCompare(gsdHome());
|
|
462
|
-
const candidateGsdPath = normalizePathForCompare(join(candidate, ".gsd"));
|
|
463
|
-
if (candidateGsdPath === normalizedGsdHome || candidateGsdPath.startsWith(`${normalizedGsdHome}/`)) {
|
|
464
|
-
return resolveProjectRootFromGitFile(basePath) ?? basePath;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
return candidate;
|
|
405
|
+
return resolveWorktreeProjectRoot(basePath);
|
|
468
406
|
}
|
|
469
407
|
|
|
470
408
|
export function getGsdArgumentCompletions(prefix: string) {
|
|
@@ -6,6 +6,7 @@ import { resolve } from "node:path";
|
|
|
6
6
|
import { enableDebug } from "../../debug-logger.js";
|
|
7
7
|
import { getAutoDashboardData, isAutoActive, isAutoPaused, pauseAuto, startAutoDetached, stopAuto, stopAutoRemote } from "../../auto.js";
|
|
8
8
|
import { handleRate } from "../../commands-rate.js";
|
|
9
|
+
import { notifyPreferenceDiagnostics } from "../../preferences-diagnostics.js";
|
|
9
10
|
import { setSessionModelOverride } from "../../session-model-override.js";
|
|
10
11
|
import { guardRemoteSession, projectRoot } from "../context.js";
|
|
11
12
|
import { findMilestoneIds } from "../../milestone-id-utils.js";
|
|
@@ -91,6 +92,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
91
92
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
92
93
|
const basePath = projectRoot();
|
|
93
94
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
95
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
94
96
|
|
|
95
97
|
// Validate the milestone target exists and is not already complete.
|
|
96
98
|
if (milestoneId) {
|
|
@@ -118,6 +120,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
118
120
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
119
121
|
const basePath = projectRoot();
|
|
120
122
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
123
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
121
124
|
|
|
122
125
|
// Validate the milestone target exists and is not already complete.
|
|
123
126
|
if (milestoneId) {
|
|
@@ -28,6 +28,7 @@ import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
|
|
|
28
28
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
29
29
|
import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
|
|
30
30
|
import { loadPrompt } from "./prompt-loader.js";
|
|
31
|
+
import { buildClaudeRuntimeFloorAdvisory } from "../../shared/claude-runtime-floor.js";
|
|
31
32
|
import { isPnpmInstall } from "../../shared/package-manager-detection.js";
|
|
32
33
|
import {
|
|
33
34
|
buildDoctorHealIssuePayload,
|
|
@@ -67,6 +68,21 @@ function resolveInstallCommand(pkg: string): string {
|
|
|
67
68
|
return `npm install -g ${pkg}`;
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
function notifyClaudeRuntimeFloorAdvisory(ctx: ExtensionCommandContext): void {
|
|
72
|
+
let advisory: string | null = null;
|
|
73
|
+
try {
|
|
74
|
+
advisory = buildClaudeRuntimeFloorAdvisory({
|
|
75
|
+
agentDir: join(gsdHome(), "agent"),
|
|
76
|
+
cwd: process.cwd(),
|
|
77
|
+
});
|
|
78
|
+
} catch {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (advisory) {
|
|
82
|
+
ctx.ui.notify(advisory, "warning");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
70
86
|
async function fetchLatestVersionForCommand(registryUrl: string = UPDATE_REGISTRY_URL): Promise<string | null> {
|
|
71
87
|
const controller = new AbortController();
|
|
72
88
|
const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
|
|
@@ -549,6 +565,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
|
|
|
549
565
|
|
|
550
566
|
if (current && compareSemverLocal(latest, current) <= 0) {
|
|
551
567
|
ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
|
|
568
|
+
if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
552
569
|
return;
|
|
553
570
|
}
|
|
554
571
|
|
|
@@ -568,6 +585,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
|
|
|
568
585
|
: `Updated to v${latest}. Restart your GSD session to use the new version.`,
|
|
569
586
|
"info",
|
|
570
587
|
);
|
|
588
|
+
if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
571
589
|
} catch {
|
|
572
590
|
ctx.ui.notify(
|
|
573
591
|
`Update failed. Try manually: ${installCmd}`,
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
import {
|
|
9
|
+
isWorkflowDatabaseOpen,
|
|
10
|
+
openExistingWorkflowDatabase,
|
|
11
|
+
} from "./db-workspace.js";
|
|
11
12
|
import { logWarning } from "./workflow-logger.js";
|
|
12
13
|
import { getErrorMessage } from "./error-utils.js";
|
|
13
14
|
|
|
@@ -48,12 +49,10 @@ export function formatInspectOutput(data: InspectData): string {
|
|
|
48
49
|
|
|
49
50
|
export async function handleInspect(ctx: ExtensionCommandContext): Promise<void> {
|
|
50
51
|
try {
|
|
51
|
-
const {
|
|
52
|
+
const { _getAdapter } = await import("./gsd-db.js");
|
|
52
53
|
|
|
53
|
-
if (!
|
|
54
|
-
|
|
55
|
-
const dbPath = join(gsdDir, "gsd.db");
|
|
56
|
-
if (!existsSync(gsdDir) || !existsSync(dbPath) || !openDatabase(dbPath)) {
|
|
54
|
+
if (!isWorkflowDatabaseOpen()) {
|
|
55
|
+
if (!openExistingWorkflowDatabase(process.cwd()).ok) {
|
|
57
56
|
ctx.ui.notify("No GSD database available. Run /gsd auto to create one.", "info");
|
|
58
57
|
return;
|
|
59
58
|
}
|