@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
|
@@ -25,15 +25,13 @@ import {
|
|
|
25
25
|
updateSliceStatus,
|
|
26
26
|
insertSlice,
|
|
27
27
|
getMilestone,
|
|
28
|
-
getMilestoneSlices,
|
|
29
|
-
getLatestAssessmentByScope,
|
|
30
28
|
updateMilestoneStatus,
|
|
31
|
-
refreshOpenDatabaseFromDisk,
|
|
32
29
|
getCompletedMilestoneTaskFileHints,
|
|
33
30
|
getMilestoneCommitAttributionShas,
|
|
34
31
|
recordMilestoneCommitAttribution,
|
|
35
32
|
transaction,
|
|
36
33
|
} from "./gsd-db.js";
|
|
34
|
+
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
37
35
|
import { isValidationTerminal } from "./state.js";
|
|
38
36
|
import { getErrorMessage } from "./error-utils.js";
|
|
39
37
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
@@ -72,7 +70,10 @@ import { isGsdWorktreePath } from "./worktree-root.js";
|
|
|
72
70
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
73
71
|
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
74
72
|
import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
|
|
75
|
-
import {
|
|
73
|
+
import {
|
|
74
|
+
proveMilestoneCloseout,
|
|
75
|
+
type CloseoutProofFailureReason,
|
|
76
|
+
} from "./milestone-closeout-proof.js";
|
|
76
77
|
|
|
77
78
|
// Re-export so existing consumers of auto-recovery.ts keep working.
|
|
78
79
|
export { resolveExpectedArtifactPath, diagnoseExpectedArtifact };
|
|
@@ -117,6 +118,19 @@ export type ArtifactRecoveryDbRefreshResult =
|
|
|
117
118
|
| { ok: true }
|
|
118
119
|
| { ok: false; fatal: boolean; message: string; reason: string };
|
|
119
120
|
|
|
121
|
+
function closeoutProofRecoveryReason(reason: CloseoutProofFailureReason): string {
|
|
122
|
+
switch (reason) {
|
|
123
|
+
case "slice-missing":
|
|
124
|
+
return "complete-milestone-slices-missing";
|
|
125
|
+
case "summary-artifact-missing":
|
|
126
|
+
return "complete-milestone-summary-missing";
|
|
127
|
+
case "summary-artifact-failed":
|
|
128
|
+
return "complete-milestone-summary-failed";
|
|
129
|
+
default:
|
|
130
|
+
return `complete-milestone-${reason}`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
120
134
|
export function refreshRecoveryDbForArtifact(
|
|
121
135
|
unitType: string,
|
|
122
136
|
unitId: string,
|
|
@@ -125,7 +139,7 @@ export function refreshRecoveryDbForArtifact(
|
|
|
125
139
|
if (unitType !== "plan-slice" && unitType !== "execute-task" && unitType !== "complete-milestone") return { ok: true };
|
|
126
140
|
if (!isDbAvailable()) return { ok: true };
|
|
127
141
|
|
|
128
|
-
if (!
|
|
142
|
+
if (!refreshWorkflowDatabaseFromDisk()) {
|
|
129
143
|
return {
|
|
130
144
|
ok: false,
|
|
131
145
|
fatal: unitType === "execute-task" || unitType === "complete-milestone",
|
|
@@ -156,52 +170,29 @@ export function refreshRecoveryDbForArtifact(
|
|
|
156
170
|
}
|
|
157
171
|
if (isClosedStatus(milestone.status)) return { ok: true };
|
|
158
172
|
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (slices.length === 0) {
|
|
171
|
-
return {
|
|
172
|
-
ok: false,
|
|
173
|
-
fatal: true,
|
|
174
|
-
reason: "complete-milestone-slices-missing",
|
|
175
|
-
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but no slices exist in the DB.`,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
const openSlice = slices.find((slice) => !isClosedStatus(slice.status));
|
|
179
|
-
if (openSlice) {
|
|
180
|
-
return {
|
|
181
|
-
ok: false,
|
|
182
|
-
fatal: true,
|
|
183
|
-
reason: "complete-milestone-slice-open",
|
|
184
|
-
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but slice ${openSlice.id} is still "${openSlice.status}" in the DB.`,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
for (const slice of slices) {
|
|
188
|
-
const openTask = getSliceTasks(mid, slice.id).find((task) => !isClosedStatus(task.status));
|
|
189
|
-
if (openTask) {
|
|
173
|
+
const artifactBasePath = resolveArtifactVerificationBase(unitId, basePath);
|
|
174
|
+
const closeoutProof = proveMilestoneCloseout(mid, {
|
|
175
|
+
allowOpenMilestone: true,
|
|
176
|
+
summaryArtifactBasePath: artifactBasePath,
|
|
177
|
+
implementationEvidence: {
|
|
178
|
+
basePath,
|
|
179
|
+
requirement: "present",
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
if (!closeoutProof.ok) {
|
|
183
|
+
if (closeoutProof.reason === "implementation-evidence-missing") {
|
|
190
184
|
return {
|
|
191
185
|
ok: false,
|
|
192
186
|
fatal: true,
|
|
193
|
-
reason: "complete-milestone-
|
|
194
|
-
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but
|
|
187
|
+
reason: "complete-milestone-implementation-missing",
|
|
188
|
+
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but implementation evidence is not present.`,
|
|
195
189
|
};
|
|
196
190
|
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (hasImplementationArtifacts(basePath, mid) !== "present") {
|
|
200
191
|
return {
|
|
201
192
|
ok: false,
|
|
202
193
|
fatal: true,
|
|
203
|
-
reason:
|
|
204
|
-
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but
|
|
194
|
+
reason: closeoutProofRecoveryReason(closeoutProof.reason),
|
|
195
|
+
message: `Stuck recovery found complete-milestone ${unitId} artifacts, but ${closeoutProof.message}`,
|
|
205
196
|
};
|
|
206
197
|
}
|
|
207
198
|
|
|
@@ -535,7 +526,7 @@ export function verifyExpectedArtifact(
|
|
|
535
526
|
try {
|
|
536
527
|
let taskIds: string[] | null = null;
|
|
537
528
|
if (isDbAvailable()) {
|
|
538
|
-
const refreshed =
|
|
529
|
+
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
539
530
|
if (refreshed) {
|
|
540
531
|
const tasks = getSliceTasks(mid, sid);
|
|
541
532
|
if (tasks.length > 0) taskIds = tasks.map(t => t.id);
|
|
@@ -642,14 +633,23 @@ export function verifyExpectedArtifact(
|
|
|
642
633
|
// A milestone with only .gsd/ plan files and zero implementation code is
|
|
643
634
|
// not genuinely complete — the LLM wrote plan files but skipped actual work.
|
|
644
635
|
if (unitType === "complete-milestone") {
|
|
645
|
-
const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
|
|
646
|
-
if (summaryOutcome === "failure") return false;
|
|
647
636
|
const { milestone: mid } = parseUnitId(unitId);
|
|
648
|
-
if (mid
|
|
649
|
-
|
|
650
|
-
|
|
637
|
+
if (!mid) return false;
|
|
638
|
+
const closeoutProof = proveMilestoneCloseout(mid, {
|
|
639
|
+
refreshFromDisk: true,
|
|
640
|
+
summaryArtifactBasePath: artifactBase,
|
|
641
|
+
implementationEvidence: {
|
|
642
|
+
basePath: base,
|
|
643
|
+
requirement: "not-absent",
|
|
644
|
+
},
|
|
645
|
+
});
|
|
646
|
+
if (!closeoutProof.ok) {
|
|
647
|
+
if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
|
|
648
|
+
const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
|
|
649
|
+
return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
|
|
650
|
+
}
|
|
651
|
+
return false;
|
|
651
652
|
}
|
|
652
|
-
if (hasImplementationArtifacts(base, mid) === "absent") return false;
|
|
653
653
|
}
|
|
654
654
|
|
|
655
655
|
return true;
|
|
@@ -9,8 +9,23 @@ import {
|
|
|
9
9
|
markToolEnd as markTrackedToolEnd,
|
|
10
10
|
markToolStart as markTrackedToolStart,
|
|
11
11
|
} from "./auto-tool-tracking.js";
|
|
12
|
+
// Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
|
|
13
|
+
// argument, unlike markToolStart at the bottom of this file) so it is true in
|
|
14
|
+
// foreground where the foreground approval-gate pause consults it.
|
|
15
|
+
export { isInteractiveElicitationInFlight } from "./auto-tool-tracking.js";
|
|
16
|
+
import {
|
|
17
|
+
createToolSurfaceSnapshot,
|
|
18
|
+
type ToolSurfaceSnapshot,
|
|
19
|
+
type ToolSurfaceSnapshotInput,
|
|
20
|
+
} from "./tool-surface-snapshot.js";
|
|
21
|
+
|
|
22
|
+
export type {
|
|
23
|
+
ToolSurfaceSnapshot,
|
|
24
|
+
ToolSurfaceSnapshotInput,
|
|
25
|
+
} from "./tool-surface-snapshot.js";
|
|
12
26
|
|
|
13
27
|
export const autoSession = new AutoSession();
|
|
28
|
+
let currentToolSurfaceSnapshot: ToolSurfaceSnapshot | null = null;
|
|
14
29
|
|
|
15
30
|
export type AutoRuntimeSnapshot = {
|
|
16
31
|
active: boolean;
|
|
@@ -20,6 +35,7 @@ export type AutoRuntimeSnapshot = {
|
|
|
20
35
|
orchestrationPhase?: "idle" | "running" | "paused" | "stopped" | "error";
|
|
21
36
|
orchestrationTransitionCount?: number;
|
|
22
37
|
orchestrationLastTransitionAt?: number;
|
|
38
|
+
toolSurface: ToolSurfaceSnapshot | null;
|
|
23
39
|
};
|
|
24
40
|
|
|
25
41
|
export function getAutoRuntimeSnapshot(): AutoRuntimeSnapshot {
|
|
@@ -32,9 +48,19 @@ export function getAutoRuntimeSnapshot(): AutoRuntimeSnapshot {
|
|
|
32
48
|
orchestrationPhase: orchestrationStatus?.phase,
|
|
33
49
|
orchestrationTransitionCount: orchestrationStatus?.transitionCount,
|
|
34
50
|
orchestrationLastTransitionAt: orchestrationStatus?.lastTransitionAt,
|
|
51
|
+
toolSurface: autoSession.active || autoSession.paused ? currentToolSurfaceSnapshot : null,
|
|
35
52
|
};
|
|
36
53
|
}
|
|
37
54
|
|
|
55
|
+
export function recordAutoToolSurfaceSnapshot(input: ToolSurfaceSnapshotInput): ToolSurfaceSnapshot {
|
|
56
|
+
currentToolSurfaceSnapshot = createToolSurfaceSnapshot(input);
|
|
57
|
+
return currentToolSurfaceSnapshot;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function clearAutoToolSurfaceSnapshot(): void {
|
|
61
|
+
currentToolSurfaceSnapshot = null;
|
|
62
|
+
}
|
|
63
|
+
|
|
38
64
|
export function isAutoActive(): boolean {
|
|
39
65
|
return autoSession.active;
|
|
40
66
|
}
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
ExtensionCommandContext,
|
|
17
17
|
} from "@gsd/pi-coding-agent";
|
|
18
18
|
import { deriveState } from "./state.js";
|
|
19
|
+
import { findWorktreeSegment, isGsdWorktreePath } from "./worktree-root.js";
|
|
19
20
|
import { loadFile, getManifestStatus } from "./files.js";
|
|
20
21
|
import type { InterruptedSessionAssessment } from "./interrupted-session.js";
|
|
21
22
|
import {
|
|
@@ -56,7 +57,8 @@ import {
|
|
|
56
57
|
detectWorktreeName,
|
|
57
58
|
setActiveMilestoneId,
|
|
58
59
|
} from "./worktree.js";
|
|
59
|
-
import { getAutoWorktreePath, isInAutoWorktree
|
|
60
|
+
import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
61
|
+
import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
60
62
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
61
63
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
62
64
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
@@ -66,7 +68,13 @@ import { initRoutingHistory } from "./routing-history.js";
|
|
|
66
68
|
import { restoreHookState, resetHookState } from "./post-unit-hooks.js";
|
|
67
69
|
import { resetProactiveHealing, setLevelChangeCallback } from "./doctor-proactive.js";
|
|
68
70
|
import { snapshotSkills } from "./skill-discovery.js";
|
|
69
|
-
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone,
|
|
71
|
+
import { isDbAvailable, getMilestone, getAllMilestones, insertMilestone, updateMilestoneStatus } from "./gsd-db.js";
|
|
72
|
+
import {
|
|
73
|
+
getWorkflowDatabaseStatus,
|
|
74
|
+
openExistingWorkflowDatabase,
|
|
75
|
+
openWorkflowDatabase,
|
|
76
|
+
resolveProjectRootDbPath,
|
|
77
|
+
} from "./db-workspace.js";
|
|
70
78
|
import { isClosedStatus } from "./status-guards.js";
|
|
71
79
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
72
80
|
import { extractVerdict } from "./verdict-parser.js";
|
|
@@ -90,9 +98,7 @@ import {
|
|
|
90
98
|
rmSync,
|
|
91
99
|
} from "node:fs";
|
|
92
100
|
import { join } from "node:path";
|
|
93
|
-
import { sep as pathSep } from "node:path";
|
|
94
101
|
|
|
95
|
-
import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
|
|
96
102
|
import { validateDirectory } from "./validate-directory.js";
|
|
97
103
|
import {
|
|
98
104
|
isCustomProvider,
|
|
@@ -150,10 +156,9 @@ export async function openProjectDbIfPresent(basePath: string): Promise<void> {
|
|
|
150
156
|
const gsdDbPath = resolveProjectRootDbPath(basePath);
|
|
151
157
|
if (!existsSync(gsdDbPath) || isDbAvailable()) return;
|
|
152
158
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
logWarning("engine", `gsd-db: failed to open existing database: ${err instanceof Error ? err.message : String(err)}`);
|
|
159
|
+
const result = openExistingWorkflowDatabase(basePath);
|
|
160
|
+
if (!result.ok && result.reason === "open-failed") {
|
|
161
|
+
logWarning("engine", `gsd-db: failed to open existing database: ${result.error?.message ?? "open failed"}`);
|
|
157
162
|
}
|
|
158
163
|
}
|
|
159
164
|
|
|
@@ -597,7 +602,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
597
602
|
warnings.push(`Failed to remove worktree directory for ${milestoneId}: ${err2 instanceof Error ? err2.message : String(err2)}`);
|
|
598
603
|
}
|
|
599
604
|
} else {
|
|
600
|
-
warnings.push(`Orphaned worktree directory for ${milestoneId} is outside
|
|
605
|
+
warnings.push(`Orphaned worktree directory for ${milestoneId} is outside the GSD worktrees containers — skipping removal for safety.`);
|
|
601
606
|
}
|
|
602
607
|
} else {
|
|
603
608
|
pushAction({
|
|
@@ -713,7 +718,7 @@ export function auditOrphanedMilestoneBranches(
|
|
|
713
718
|
if (!existsSync(wtDir)) continue;
|
|
714
719
|
if (!isInsideWorktreesDir(basePath, wtDir)) {
|
|
715
720
|
warnings.push(
|
|
716
|
-
`Orphaned worktree directory for ${m.id} is outside
|
|
721
|
+
`Orphaned worktree directory for ${m.id} is outside the GSD worktrees containers — skipping removal for safety.`,
|
|
717
722
|
);
|
|
718
723
|
continue;
|
|
719
724
|
}
|
|
@@ -1321,7 +1326,7 @@ export async function bootstrapAutoSession(
|
|
|
1321
1326
|
(state.phase === "pre-planning" || state.phase === "complete") &&
|
|
1322
1327
|
survivorIsolationMode !== "none" &&
|
|
1323
1328
|
!detectWorktreeName(base) &&
|
|
1324
|
-
!base
|
|
1329
|
+
!isGsdWorktreePath(base)
|
|
1325
1330
|
) {
|
|
1326
1331
|
const milestoneBranch = `milestone/${survivorMilestoneId}`;
|
|
1327
1332
|
const { nativeBranchExists } = await import("./native-git-bridge.js");
|
|
@@ -1606,16 +1611,12 @@ export async function bootstrapAutoSession(
|
|
|
1606
1611
|
// live here is gone.
|
|
1607
1612
|
|
|
1608
1613
|
const isUnderGsdWorktrees = (p: string): boolean => {
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
const symlinkRe = new RegExp(
|
|
1616
|
-
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees(?:\\${pathSep}|$)`,
|
|
1617
|
-
);
|
|
1618
|
-
return symlinkRe.test(p);
|
|
1614
|
+
const normalized = p.replaceAll("\\", "/");
|
|
1615
|
+
if (findWorktreeSegment(normalized) !== null) return true;
|
|
1616
|
+
// The container directory itself (no trailing worktree name), in any layout.
|
|
1617
|
+
return normalized.endsWith("/.gsd/worktrees")
|
|
1618
|
+
|| normalized.endsWith("/.gsd-worktrees")
|
|
1619
|
+
|| /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
|
|
1619
1620
|
};
|
|
1620
1621
|
|
|
1621
1622
|
if (
|
|
@@ -1673,21 +1674,14 @@ export async function bootstrapAutoSession(
|
|
|
1673
1674
|
|
|
1674
1675
|
// ── DB lifecycle ──
|
|
1675
1676
|
const gsdDbPath = resolveProjectRootDbPath(s.basePath);
|
|
1676
|
-
const
|
|
1677
|
-
if (
|
|
1678
|
-
|
|
1679
|
-
const { openDatabase: openDb } = await import("./gsd-db.js");
|
|
1680
|
-
openDb(gsdDbPath);
|
|
1681
|
-
} catch (err) {
|
|
1682
|
-
logError("engine", `failed to initialize project database: ${(err as Error).message}`);
|
|
1683
|
-
}
|
|
1677
|
+
const initialDbOpen = openWorkflowDatabase(s.basePath);
|
|
1678
|
+
if (!initialDbOpen.ok && initialDbOpen.reason === "open-failed") {
|
|
1679
|
+
logError("engine", `failed to initialize project database: ${initialDbOpen.error?.message ?? "open failed"}`);
|
|
1684
1680
|
}
|
|
1685
1681
|
if (_shouldAbortBootstrapForUnavailableDbForTest(gsdDbPath, isDbAvailable())) {
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
} catch (err) {
|
|
1690
|
-
logError("engine", `failed to open existing database: ${(err as Error).message}`);
|
|
1682
|
+
const retryDbOpen = openWorkflowDatabase(s.basePath);
|
|
1683
|
+
if (!retryDbOpen.ok && retryDbOpen.reason === "open-failed") {
|
|
1684
|
+
logError("engine", `failed to open existing database: ${retryDbOpen.error?.message ?? "open failed"}`);
|
|
1691
1685
|
}
|
|
1692
1686
|
}
|
|
1693
1687
|
|
|
@@ -1697,7 +1691,7 @@ export async function bootstrapAutoSession(
|
|
|
1697
1691
|
// call returns "db_unavailable", triggering artifact-retry which
|
|
1698
1692
|
// re-dispatches the same task — producing an infinite loop (#2419).
|
|
1699
1693
|
if (existsSync(gsdDbPath) && !isDbAvailable()) {
|
|
1700
|
-
const dbStatus =
|
|
1694
|
+
const dbStatus = getWorkflowDatabaseStatus();
|
|
1701
1695
|
const phaseHint = dbStatus.lastPhase === "open"
|
|
1702
1696
|
? "The database file could not be opened"
|
|
1703
1697
|
: dbStatus.lastPhase === "initSchema"
|
|
@@ -287,10 +287,23 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
287
287
|
}, 15000);
|
|
288
288
|
|
|
289
289
|
// ── 3. Hard timeout ──
|
|
290
|
-
|
|
290
|
+
const hardTimeoutBody = async () => {
|
|
291
291
|
try {
|
|
292
292
|
s.unitTimeoutHandle = null;
|
|
293
293
|
if (!s.active) return;
|
|
294
|
+
// User-interactive tools (ask_user_questions, secure_env_collect) block
|
|
295
|
+
// waiting for human input by design. Unlike the idle watchdog (above),
|
|
296
|
+
// the hard timeout had no interactive exemption, so a long human
|
|
297
|
+
// deliberation crossing the hard cap would still closeout + recover
|
|
298
|
+
// (triggerTurn) and abort the turn hosting the elicitation, reintroducing
|
|
299
|
+
// the self-cancel loop on slow answers (#2676). Re-arm instead of firing
|
|
300
|
+
// while a human is being asked, mirroring the idle watchdog's
|
|
301
|
+
// refresh-and-return. Conditional on hasInteractiveToolInFlight(), so a
|
|
302
|
+
// genuinely hung non-interactive unit still hits the hard cap.
|
|
303
|
+
if (getInFlightToolCount() > 0 && hasInteractiveToolInFlight()) {
|
|
304
|
+
s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
294
307
|
const expectedCurrentUnit = s.currentUnit
|
|
295
308
|
? { type: s.currentUnit.type, id: s.currentUnit.id, startedAt: s.currentUnit.startedAt }
|
|
296
309
|
: null;
|
|
@@ -323,7 +336,8 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
323
336
|
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
324
337
|
}
|
|
325
338
|
}
|
|
326
|
-
}
|
|
339
|
+
};
|
|
340
|
+
s.unitTimeoutHandle = setTimeout(hardTimeoutBody, hardTimeoutMs);
|
|
327
341
|
|
|
328
342
|
// ── 4. Context-pressure continue-here monitor ──
|
|
329
343
|
if (s.continueHereHandle) {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { stripMcpToolPrefix } from "@gsd/pi-ai";
|
|
8
|
+
import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
|
|
8
9
|
|
|
9
10
|
interface InFlightTool {
|
|
10
11
|
startedAt: number;
|
|
@@ -19,6 +20,17 @@ const inFlightTools = new Map<string, InFlightTool>();
|
|
|
19
20
|
*/
|
|
20
21
|
const INTERACTIVE_TOOLS = new Set(["ask_user_questions", "secure_env_collect"]);
|
|
21
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Mode-agnostic refcount of in-flight interactive elicitations that are an
|
|
25
|
+
* active human boundary (the model ASKED via ask_user_questions). Unlike the
|
|
26
|
+
* `inFlightTools` Map, this is NOT gated by auto-session.active, so it is true
|
|
27
|
+
* in FOREGROUND (where s.active is false). Kept SEPARATE from inFlightTools so
|
|
28
|
+
* getInFlightToolCount()/getOldestInFlightToolAgeMs()/hasInteractiveToolInFlight()
|
|
29
|
+
* and the auto-watchdog accounting are byte-for-byte unchanged. A refcount (not
|
|
30
|
+
* a boolean) handles nested/back-to-back elicitations in a single turn.
|
|
31
|
+
*/
|
|
32
|
+
let interactiveElicitationDepth = 0;
|
|
33
|
+
|
|
22
34
|
/**
|
|
23
35
|
* Mark a tool execution as in-flight.
|
|
24
36
|
* Records start time and tool name so the idle watchdog can detect tools
|
|
@@ -36,6 +48,29 @@ export function markToolEnd(toolCallId: string): void {
|
|
|
36
48
|
inFlightTools.delete(toolCallId);
|
|
37
49
|
}
|
|
38
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Mark an interactive elicitation (the model asking via ask_user_questions) as
|
|
53
|
+
* in flight. Ungated by auto-session.active so it is observable in foreground.
|
|
54
|
+
*/
|
|
55
|
+
export function markInteractiveElicitationStart(): void {
|
|
56
|
+
interactiveElicitationDepth++;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Mark an interactive elicitation as completed. Idempotent below zero.
|
|
61
|
+
*/
|
|
62
|
+
export function markInteractiveElicitationEnd(): void {
|
|
63
|
+
if (interactiveElicitationDepth > 0) interactiveElicitationDepth--;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Returns true if any interactive elicitation is currently the active human
|
|
68
|
+
* boundary. True in ALL modes (foreground and auto) while one is in flight.
|
|
69
|
+
*/
|
|
70
|
+
export function isInteractiveElicitationInFlight(): boolean {
|
|
71
|
+
return interactiveElicitationDepth > 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
39
74
|
/**
|
|
40
75
|
* Returns the age (ms) of the oldest currently in-flight tool, or 0 if none.
|
|
41
76
|
*/
|
|
@@ -84,6 +119,7 @@ export function hasInteractiveToolInFlight(): boolean {
|
|
|
84
119
|
*/
|
|
85
120
|
export function clearInFlightTools(): void {
|
|
86
121
|
inFlightTools.clear();
|
|
122
|
+
interactiveElicitationDepth = 0;
|
|
87
123
|
}
|
|
88
124
|
|
|
89
125
|
// ─── Tool invocation error classification (#2883) ────────────────────────
|
|
@@ -97,6 +133,15 @@ export function clearInFlightTools(): void {
|
|
|
97
133
|
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
98
134
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
99
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Matches the runtime's "tool not registered" error. Unlike the deterministic
|
|
138
|
+
* invocation failures above, this one is usually transient: the workflow MCP
|
|
139
|
+
* server registers its tool surface asynchronously after session start, so a
|
|
140
|
+
* Unit's first tool call can race the registration. Callers should retry
|
|
141
|
+
* (bounded) instead of breaking the loop.
|
|
142
|
+
*/
|
|
143
|
+
const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
|
|
144
|
+
|
|
100
145
|
/**
|
|
101
146
|
* Returns true if the error message indicates a deterministic invocation or
|
|
102
147
|
* policy failure (as opposed to a normal tool execution error).
|
|
@@ -106,6 +151,15 @@ export function isToolInvocationError(errorMsg: string): boolean {
|
|
|
106
151
|
return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
|
|
107
152
|
}
|
|
108
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Returns true if the error message indicates the called tool was not on the
|
|
156
|
+
* session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
|
|
157
|
+
*/
|
|
158
|
+
export function isToolUnavailableError(errorMsg: string): boolean {
|
|
159
|
+
if (!errorMsg) return false;
|
|
160
|
+
return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
|
|
161
|
+
}
|
|
162
|
+
|
|
109
163
|
/**
|
|
110
164
|
* Returns true if the error message indicates the tool was skipped because
|
|
111
165
|
* a queued user message interrupted the turn (#3595). Retrying will produce
|
|
@@ -3,48 +3,27 @@ import {
|
|
|
3
3
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
4
4
|
getForbiddenGsdToolReason,
|
|
5
5
|
} from "./unit-tool-contracts.js";
|
|
6
|
+
import {
|
|
7
|
+
WORKFLOW_TOOL_ALIAS_PAIRS,
|
|
8
|
+
canonicalWorkflowSurfaceToolName,
|
|
9
|
+
isWorkflowSurfaceAliasTool,
|
|
10
|
+
stripMcpToolPrefix,
|
|
11
|
+
} from "./workflow-tool-surface.js";
|
|
6
12
|
|
|
7
13
|
export {
|
|
8
14
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
9
15
|
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
10
16
|
} from "./unit-tool-contracts.js";
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
gsd_slice_replan: "gsd_replan_slice",
|
|
22
|
-
gsd_complete_slice: "gsd_slice_complete",
|
|
23
|
-
gsd_milestone_complete: "gsd_complete_milestone",
|
|
24
|
-
gsd_milestone_validate: "gsd_validate_milestone",
|
|
25
|
-
gsd_roadmap_reassess: "gsd_reassess_roadmap",
|
|
26
|
-
gsd_complete_task: "gsd_task_complete",
|
|
27
|
-
gsd_reopen_task: "gsd_task_reopen",
|
|
28
|
-
gsd_reopen_slice: "gsd_slice_reopen",
|
|
29
|
-
gsd_reopen_milestone: "gsd_milestone_reopen",
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const EXECUTE_TASK_UNIT_TYPES = new Set([
|
|
33
|
-
"execute-task",
|
|
34
|
-
"execute-task-simple",
|
|
35
|
-
"reactive-execute",
|
|
36
|
-
]);
|
|
37
|
-
|
|
38
|
-
// These units own quality gates, but their completion handlers persist verdicts
|
|
39
|
-
// from artifact sections. gsd_save_gate_result belongs to gate-evaluate, so keep
|
|
40
|
-
// blocking it here with a calm redirect to the section-write path.
|
|
41
|
-
const SECTION_CLOSE_GATE_UNIT_TYPES = new Set([
|
|
42
|
-
"execute-task",
|
|
43
|
-
"execute-task-simple",
|
|
44
|
-
"reactive-execute",
|
|
45
|
-
"complete-slice",
|
|
46
|
-
"validate-milestone",
|
|
47
|
-
]);
|
|
18
|
+
// Scope-class membership is declared per unit in the Unit Registry (ADR-033).
|
|
19
|
+
// EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
|
|
20
|
+
// Set additionally includes scopeClass "section-close" — units whose completion
|
|
21
|
+
// handlers persist gate verdicts from artifact sections (gsd_save_gate_result
|
|
22
|
+
// belongs to gate-evaluate, so it is soft-blocked with a redirect below).
|
|
23
|
+
import {
|
|
24
|
+
EXECUTE_TASK_UNIT_TYPES,
|
|
25
|
+
SECTION_CLOSE_GATE_UNIT_TYPES,
|
|
26
|
+
} from "./unit-registry.js";
|
|
48
27
|
|
|
49
28
|
const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
|
|
50
29
|
"gsd_skip_slice",
|
|
@@ -55,7 +34,7 @@ const EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS = [
|
|
|
55
34
|
const SCOPED_GSD_LIFECYCLE_TOOLS = new Set(
|
|
56
35
|
[
|
|
57
36
|
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
58
|
-
...
|
|
37
|
+
...WORKFLOW_TOOL_ALIAS_PAIRS.map(({ canonical }) => canonical),
|
|
59
38
|
...EXTRA_SCOPED_GSD_LIFECYCLE_TOOLS,
|
|
60
39
|
]
|
|
61
40
|
.filter((tool) => tool.startsWith("gsd_"))
|
|
@@ -72,19 +51,12 @@ type AutoUnitToolScopeResult = {
|
|
|
72
51
|
displayReason?: string;
|
|
73
52
|
};
|
|
74
53
|
|
|
75
|
-
function stripMcpToolPrefix(toolName: string): string {
|
|
76
|
-
if (!toolName.startsWith("mcp__")) return toolName;
|
|
77
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
78
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
54
|
export function canonicalWorkflowToolName(toolName: string): string {
|
|
82
|
-
|
|
83
|
-
return WORKFLOW_TOOL_ALIASES[base] ?? base;
|
|
55
|
+
return canonicalWorkflowSurfaceToolName(toolName);
|
|
84
56
|
}
|
|
85
57
|
|
|
86
58
|
export function isWorkflowAliasTool(toolName: string): boolean {
|
|
87
|
-
return
|
|
59
|
+
return isWorkflowSurfaceAliasTool(toolName);
|
|
88
60
|
}
|
|
89
61
|
|
|
90
62
|
function hardBlockReason(unitType: string, what: string): string {
|
|
@@ -131,7 +103,7 @@ function isNativeWorkflowTool(toolName: string): boolean {
|
|
|
131
103
|
return stripMcpToolPrefix(toolName) === "Workflow";
|
|
132
104
|
}
|
|
133
105
|
|
|
134
|
-
function readStringField(input: unknown, camel: string, snake: string): string | undefined {
|
|
106
|
+
export function readStringField(input: unknown, camel: string, snake: string): string | undefined {
|
|
135
107
|
if (!input || typeof input !== "object") return undefined;
|
|
136
108
|
const record = input as Record<string, unknown>;
|
|
137
109
|
const value = record[camel] ?? record[snake];
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
18
18
|
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath, resolveMilestoneFile } from "./paths.js";
|
|
19
|
+
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
19
20
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
20
21
|
import { parseUnitId } from "./unit-id.js";
|
|
21
22
|
import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd-db.js";
|
|
22
23
|
import type { TaskRow } from "./db-task-slice-rows.js";
|
|
23
24
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
24
25
|
import type { GSDPreferences } from "./preferences-types.js";
|
|
25
|
-
import { extractVerdict } from "./verdict-parser.js";
|
|
26
26
|
import { isClosedStatus } from "./status-guards.js";
|
|
27
27
|
import { loadFile } from "./files.js";
|
|
28
28
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
@@ -269,28 +269,27 @@ async function runValidateMilestonePostCheck(
|
|
|
269
269
|
mid,
|
|
270
270
|
`${mid}-VALIDATION.md`,
|
|
271
271
|
);
|
|
272
|
-
|
|
272
|
+
const validationContent = await loadFile(validationFile);
|
|
273
|
+
if (validationContent !== null && validationContent.trim() === "") {
|
|
273
274
|
if (await reassessmentInvalidatedValidation()) {
|
|
274
275
|
clearValidationRetry();
|
|
275
276
|
return "continue";
|
|
276
277
|
}
|
|
277
278
|
return setToolFailureRetry(
|
|
278
|
-
"You must call gsd_validate_milestone to persist the validation results.
|
|
279
|
+
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md exists but is empty.",
|
|
279
280
|
);
|
|
280
281
|
}
|
|
281
282
|
|
|
282
|
-
const
|
|
283
|
-
if (!
|
|
283
|
+
const verdict = await resolveMilestoneValidationVerdict(s.basePath, mid);
|
|
284
|
+
if (!verdict) {
|
|
284
285
|
if (await reassessmentInvalidatedValidation()) {
|
|
285
286
|
clearValidationRetry();
|
|
286
287
|
return "continue";
|
|
287
288
|
}
|
|
288
289
|
return setToolFailureRetry(
|
|
289
|
-
"You must call gsd_validate_milestone to persist the validation results. VALIDATION.md
|
|
290
|
+
"You must call gsd_validate_milestone to persist the validation results. No VALIDATION.md was created.",
|
|
290
291
|
);
|
|
291
292
|
}
|
|
292
|
-
|
|
293
|
-
const verdict = extractVerdict(validationContent);
|
|
294
293
|
if (verdict === "needs-attention") {
|
|
295
294
|
ctx.ui.notify(
|
|
296
295
|
`Milestone ${mid} validation returned verdict=needs-attention. Pausing for human review.`,
|