@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
- package/dist/resources/extensions/gsd/auto-start.js +26 -8
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +52 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +17 -21
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- 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 +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-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/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- 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 +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- 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 +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- 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 +50 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- 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/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +468 -269
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
- package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
- package/src/resources/extensions/gsd/auto-start.ts +27 -11
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +64 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +19 -22
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -58,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
|
|
|
58
58
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
59
59
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
60
60
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
61
|
-
import {
|
|
61
|
+
import {
|
|
62
|
+
classifyUatContentForRun,
|
|
63
|
+
shouldDispatchUatForContent,
|
|
64
|
+
type UatType,
|
|
65
|
+
} from "./uat-policy.js";
|
|
62
66
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
63
67
|
|
|
64
68
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
@@ -972,7 +976,7 @@ export async function inlineDecisionsFromDb(
|
|
|
972
976
|
|
|
973
977
|
/**
|
|
974
978
|
* Inline requirements with optional milestone and slice scoping from the DB.
|
|
975
|
-
* Falls back to filesystem via inlineGsdRootFile when DB unavailable
|
|
979
|
+
* Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
|
|
976
980
|
*/
|
|
977
981
|
export async function inlineRequirementsFromDb(
|
|
978
982
|
base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
|
|
@@ -982,14 +986,28 @@ export async function inlineRequirementsFromDb(
|
|
|
982
986
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
983
987
|
if (isDbAvailable()) {
|
|
984
988
|
const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
|
|
985
|
-
|
|
989
|
+
let requirements = queryRequirements({ milestoneId, sliceId });
|
|
990
|
+
let broadenedScope = false;
|
|
991
|
+
if (requirements.length === 0 && sliceId) {
|
|
992
|
+
requirements = queryRequirements({ milestoneId });
|
|
993
|
+
broadenedScope = true;
|
|
994
|
+
}
|
|
995
|
+
if (requirements.length === 0 && milestoneId) {
|
|
996
|
+
requirements = queryRequirements({ status: "active" });
|
|
997
|
+
broadenedScope = true;
|
|
998
|
+
}
|
|
986
999
|
if (requirements.length > 0) {
|
|
987
|
-
// Use compact format for non-full levels
|
|
988
|
-
|
|
1000
|
+
// Use compact format for non-full levels, milestone-scoped calls, and
|
|
1001
|
+
// any cascade stage that broadened past the originally requested scope —
|
|
1002
|
+
// a slice-scoped "full" call that fell through to the project-wide
|
|
1003
|
+
// active fallback must not format those rows as full requirements.
|
|
1004
|
+
const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
|
|
1005
|
+
const formatted = useCompact
|
|
989
1006
|
? formatRequirementsCompact(requirements)
|
|
990
1007
|
: formatRequirementsForPrompt(requirements);
|
|
991
1008
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
992
1009
|
}
|
|
1010
|
+
return null;
|
|
993
1011
|
}
|
|
994
1012
|
} catch (err) {
|
|
995
1013
|
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1445,6 +1463,40 @@ export async function checkNeedsReassessment(
|
|
|
1445
1463
|
* - No UAT file exists for the slice
|
|
1446
1464
|
* - UAT result file already exists (idempotent — already ran)
|
|
1447
1465
|
*/
|
|
1466
|
+
/**
|
|
1467
|
+
* Resolve the effective UAT mode for the dispatch gate the same way
|
|
1468
|
+
* `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
|
|
1469
|
+
* supplemental context, so a `browser-executable` UAT whose slice references a
|
|
1470
|
+
* self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
|
|
1471
|
+
* playwright test`) is promoted to `runtime-executable` for the gate too.
|
|
1472
|
+
*
|
|
1473
|
+
* Without this, `checkNeedsRunUat` returns `browser-executable` while the
|
|
1474
|
+
* prompt instructs runtime-only execution, causing the dispatch gate to
|
|
1475
|
+
* require browser tools / warm up the browser daemon (or stop dispatch when
|
|
1476
|
+
* browser MCP is unavailable) for UAT runs that never touch the browser. See
|
|
1477
|
+
* cursor[bot] review on PR #696 for the M007/S01 regression.
|
|
1478
|
+
*/
|
|
1479
|
+
async function resolveRunUatEffectiveType(
|
|
1480
|
+
base: string,
|
|
1481
|
+
mid: string,
|
|
1482
|
+
sliceId: string,
|
|
1483
|
+
uatContent: string,
|
|
1484
|
+
): Promise<UatType> {
|
|
1485
|
+
let summaryContent = "";
|
|
1486
|
+
try {
|
|
1487
|
+
const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
|
|
1488
|
+
if (summaryPath) {
|
|
1489
|
+
summaryContent = (await loadFile(summaryPath)) ?? "";
|
|
1490
|
+
}
|
|
1491
|
+
} catch (err) {
|
|
1492
|
+
logWarning(
|
|
1493
|
+
"prompt",
|
|
1494
|
+
`resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1495
|
+
);
|
|
1496
|
+
}
|
|
1497
|
+
return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1448
1500
|
export async function checkNeedsRunUat(
|
|
1449
1501
|
base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
|
|
1450
1502
|
): Promise<{ sliceId: string; uatType: UatType } | null> {
|
|
@@ -1473,7 +1525,8 @@ export async function checkNeedsRunUat(
|
|
|
1473
1525
|
if (assessmentContent && hasVerdict(assessmentContent)) continue;
|
|
1474
1526
|
}
|
|
1475
1527
|
if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
|
|
1476
|
-
|
|
1528
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1529
|
+
return { sliceId: sid, uatType };
|
|
1477
1530
|
}
|
|
1478
1531
|
return null;
|
|
1479
1532
|
}
|
|
@@ -1506,7 +1559,8 @@ export async function checkNeedsRunUat(
|
|
|
1506
1559
|
if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
|
|
1507
1560
|
}
|
|
1508
1561
|
if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
|
|
1509
|
-
|
|
1562
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1563
|
+
return { sliceId: uatSid, uatType };
|
|
1510
1564
|
}
|
|
1511
1565
|
return null;
|
|
1512
1566
|
}
|
|
@@ -3560,15 +3614,30 @@ export async function buildRunUatPrompt(
|
|
|
3560
3614
|
null,
|
|
3561
3615
|
cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
|
|
3562
3616
|
);
|
|
3617
|
+
const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
|
|
3618
|
+
const uatType = uatPolicy.effectiveType;
|
|
3619
|
+
const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
|
|
3620
|
+
? [
|
|
3621
|
+
"## Runtime harness override",
|
|
3622
|
+
"",
|
|
3623
|
+
"This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
|
|
3624
|
+
"Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
|
|
3625
|
+
"Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
|
|
3626
|
+
"Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
|
|
3627
|
+
"When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
|
|
3628
|
+
"",
|
|
3629
|
+
].join("\n")
|
|
3630
|
+
: "";
|
|
3563
3631
|
const inlinedContext = prependContextModeToBlock(
|
|
3564
3632
|
"run-uat",
|
|
3565
3633
|
base,
|
|
3566
|
-
|
|
3634
|
+
runtimeHarnessOverride
|
|
3635
|
+
? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
|
|
3636
|
+
: cappedInlinedContext,
|
|
3567
3637
|
);
|
|
3568
3638
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
3569
3639
|
|
|
3570
3640
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
3571
|
-
const uatType = resolveEffectiveUatType(uatContent);
|
|
3572
3641
|
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
3573
3642
|
|
|
3574
3643
|
return loadPrompt("run-uat", {
|
|
@@ -28,6 +28,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
|
|
|
28
28
|
import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
|
|
29
29
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
30
30
|
import { gsdRoot, resolveMilestoneFile } from "./paths.js";
|
|
31
|
+
import { milestoneEntryBlockedGuidance } from "./guidance.js";
|
|
31
32
|
import { invalidateAllCaches } from "./cache.js";
|
|
32
33
|
import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
|
|
33
34
|
import {
|
|
@@ -1270,11 +1271,29 @@ export async function bootstrapAutoSession(
|
|
|
1270
1271
|
}
|
|
1271
1272
|
}
|
|
1272
1273
|
|
|
1273
|
-
const
|
|
1274
|
-
|
|
1274
|
+
const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
|
|
1275
|
+
const lockedActiveMilestone =
|
|
1276
|
+
requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
|
|
1277
|
+
let blockingStrandedRecoveryAction: OrphanAuditAction | null;
|
|
1278
|
+
if (lockedActiveMilestone) {
|
|
1279
|
+
// Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
|
|
1280
|
+
// stranded work must not block this milestone's resumption, and the
|
|
1281
|
+
// downstream `strandedRecoveryAction` (used for currentMilestoneId,
|
|
1282
|
+
// setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
|
|
1283
|
+
// the locked milestone only. Falling back to the first sibling action
|
|
1284
|
+
// would mis-target adoption (#742).
|
|
1285
|
+
const lockMatch = strandedRecoveryActions.find(
|
|
1286
|
+
(action) => action.milestoneId === requestedMilestoneLock,
|
|
1287
|
+
) ?? null;
|
|
1288
|
+
blockingStrandedRecoveryAction = lockMatch;
|
|
1289
|
+
strandedRecoveryAction = lockMatch;
|
|
1290
|
+
} else if (state.activeMilestone) {
|
|
1291
|
+
blockingStrandedRecoveryAction = strandedRecoveryActions.find(
|
|
1275
1292
|
(action) => action.milestoneId !== state.activeMilestone?.id,
|
|
1276
|
-
) ?? strandedRecoveryAction
|
|
1277
|
-
|
|
1293
|
+
) ?? strandedRecoveryAction;
|
|
1294
|
+
} else {
|
|
1295
|
+
blockingStrandedRecoveryAction = strandedRecoveryAction;
|
|
1296
|
+
}
|
|
1278
1297
|
|
|
1279
1298
|
if (blockingStrandedRecoveryAction) {
|
|
1280
1299
|
if (!state.activeMilestone) {
|
|
@@ -1296,6 +1315,8 @@ export async function bootstrapAutoSession(
|
|
|
1296
1315
|
formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
|
|
1297
1316
|
"info",
|
|
1298
1317
|
);
|
|
1318
|
+
} else if (lockedActiveMilestone) {
|
|
1319
|
+
strandedRecoveryAction = null;
|
|
1299
1320
|
}
|
|
1300
1321
|
|
|
1301
1322
|
if (
|
|
@@ -1645,14 +1666,9 @@ export async function bootstrapAutoSession(
|
|
|
1645
1666
|
`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
|
|
1646
1667
|
"error",
|
|
1647
1668
|
);
|
|
1648
|
-
} else if (enterResult.reason === "creation-failed") {
|
|
1649
|
-
ctx.ui.notify(
|
|
1650
|
-
`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
|
|
1651
|
-
"error",
|
|
1652
|
-
);
|
|
1653
|
-
} else if (enterResult.reason === "isolation-degraded") {
|
|
1669
|
+
} else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
|
|
1654
1670
|
ctx.ui.notify(
|
|
1655
|
-
|
|
1671
|
+
milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
|
|
1656
1672
|
"error",
|
|
1657
1673
|
);
|
|
1658
1674
|
} else if (enterResult.reason === "invalid-milestone-id") {
|
|
@@ -33,6 +33,24 @@ export interface UnitActivitySnapshot {
|
|
|
33
33
|
assistantMessages: number;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
export interface AutoUnitCloseoutRequest {
|
|
37
|
+
ctx: ExtensionContext;
|
|
38
|
+
basePath: string;
|
|
39
|
+
unitType: string;
|
|
40
|
+
unitId: string;
|
|
41
|
+
startedAt: number;
|
|
42
|
+
opts?: CloseoutOptions;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface AutoUnitCloseoutResult {
|
|
46
|
+
activityFile?: string;
|
|
47
|
+
gitTransactionRecorded: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type GitTransactionCloseoutOptions =
|
|
51
|
+
Required<Pick<CloseoutOptions, "traceId" | "turnId" | "gitAction" | "gitStatus">>
|
|
52
|
+
& Pick<CloseoutOptions, "gitPush" | "gitError">;
|
|
53
|
+
|
|
36
54
|
export const GHOST_COMPLETION_MAX_ELAPSED_MS = 500;
|
|
37
55
|
|
|
38
56
|
export function snapshotUnitActivity(
|
|
@@ -76,25 +94,27 @@ export function isSuspiciousGhostCompletion(
|
|
|
76
94
|
}
|
|
77
95
|
|
|
78
96
|
/**
|
|
79
|
-
* Snapshot metrics, save activity log,
|
|
80
|
-
* for a completed unit.
|
|
97
|
+
* Snapshot metrics, save activity log, extract memories, and record the git
|
|
98
|
+
* transaction for a completed auto-mode unit.
|
|
81
99
|
*/
|
|
82
|
-
export async function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
100
|
+
export async function closeoutAutoUnit(
|
|
101
|
+
request: AutoUnitCloseoutRequest,
|
|
102
|
+
): Promise<AutoUnitCloseoutResult> {
|
|
103
|
+
const modelId = request.ctx.model?.id ?? "unknown";
|
|
104
|
+
snapshotUnitMetrics(
|
|
105
|
+
request.ctx,
|
|
106
|
+
request.unitType,
|
|
107
|
+
request.unitId,
|
|
108
|
+
request.startedAt,
|
|
109
|
+
modelId,
|
|
110
|
+
request.opts,
|
|
111
|
+
);
|
|
112
|
+
const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
|
|
93
113
|
|
|
94
114
|
if (activityFile) {
|
|
95
115
|
try {
|
|
96
|
-
const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import(
|
|
97
|
-
const llmCallFn = buildMemoryLLMCall(ctx);
|
|
116
|
+
const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
|
|
117
|
+
const llmCallFn = buildMemoryLLMCall(request.ctx);
|
|
98
118
|
if (llmCallFn) {
|
|
99
119
|
// Awaited: a fire-and-forget here lets memory-extractor writes land in
|
|
100
120
|
// .gsd/ after closeoutUnit returns but before the milestone merge
|
|
@@ -103,11 +123,11 @@ export async function closeoutUnit(
|
|
|
103
123
|
// bounded by the extractor's LLM call, which is the acceptable price
|
|
104
124
|
// for not racing the merge boundary.
|
|
105
125
|
try {
|
|
106
|
-
await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
|
|
126
|
+
await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
|
|
107
127
|
} catch (err) {
|
|
108
128
|
logWarning(
|
|
109
129
|
"engine",
|
|
110
|
-
`memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`,
|
|
130
|
+
`memory extraction failed for ${request.unitType}/${request.unitId}: ${(err as Error).message}`,
|
|
111
131
|
);
|
|
112
132
|
}
|
|
113
133
|
}
|
|
@@ -116,23 +136,58 @@ export async function closeoutUnit(
|
|
|
116
136
|
}
|
|
117
137
|
}
|
|
118
138
|
|
|
119
|
-
|
|
139
|
+
const gitTransaction = resolveGitTransactionOptions(request.opts);
|
|
140
|
+
|
|
141
|
+
if (gitTransaction) {
|
|
120
142
|
writeTurnGitTransaction({
|
|
121
|
-
basePath,
|
|
122
|
-
traceId:
|
|
123
|
-
turnId:
|
|
124
|
-
unitType,
|
|
125
|
-
unitId,
|
|
143
|
+
basePath: request.basePath,
|
|
144
|
+
traceId: gitTransaction.traceId,
|
|
145
|
+
turnId: gitTransaction.turnId,
|
|
146
|
+
unitType: request.unitType,
|
|
147
|
+
unitId: request.unitId,
|
|
126
148
|
stage: "record",
|
|
127
|
-
action:
|
|
128
|
-
push:
|
|
129
|
-
status:
|
|
130
|
-
error:
|
|
149
|
+
action: gitTransaction.gitAction,
|
|
150
|
+
push: gitTransaction.gitPush === true,
|
|
151
|
+
status: gitTransaction.gitStatus,
|
|
152
|
+
error: gitTransaction.gitError,
|
|
131
153
|
metadata: {
|
|
132
154
|
activityFile,
|
|
133
155
|
},
|
|
134
156
|
});
|
|
135
157
|
}
|
|
136
158
|
|
|
137
|
-
return
|
|
159
|
+
return {
|
|
160
|
+
...(activityFile ? { activityFile } : {}),
|
|
161
|
+
gitTransactionRecorded: Boolean(gitTransaction),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function resolveGitTransactionOptions(
|
|
166
|
+
opts: CloseoutOptions | undefined,
|
|
167
|
+
): GitTransactionCloseoutOptions | null {
|
|
168
|
+
if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus) return null;
|
|
169
|
+
return {
|
|
170
|
+
traceId: opts.traceId,
|
|
171
|
+
turnId: opts.turnId,
|
|
172
|
+
gitAction: opts.gitAction,
|
|
173
|
+
gitStatus: opts.gitStatus,
|
|
174
|
+
gitPush: opts.gitPush,
|
|
175
|
+
gitError: opts.gitError,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Compatibility wrapper for existing auto-loop callers. New code should prefer
|
|
181
|
+
* closeoutAutoUnit so the closeout request and result stay explicit.
|
|
182
|
+
*/
|
|
183
|
+
export async function closeoutUnit(
|
|
184
|
+
ctx: ExtensionContext,
|
|
185
|
+
basePath: string,
|
|
186
|
+
unitType: string,
|
|
187
|
+
unitId: string,
|
|
188
|
+
startedAt: number,
|
|
189
|
+
opts?: CloseoutOptions,
|
|
190
|
+
): Promise<string | undefined> {
|
|
191
|
+
const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
|
|
192
|
+
return result.activityFile;
|
|
138
193
|
}
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
} from "./unit-tool-contracts.js";
|
|
6
6
|
import {
|
|
7
7
|
WORKFLOW_TOOL_ALIAS_PAIRS,
|
|
8
|
-
canonicalWorkflowSurfaceToolName,
|
|
9
8
|
isWorkflowSurfaceAliasTool,
|
|
10
9
|
stripMcpToolPrefix,
|
|
11
10
|
} from "./workflow-tool-surface.js";
|
|
11
|
+
import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
|
|
12
12
|
|
|
13
13
|
export {
|
|
14
14
|
AUTO_UNIT_SCOPED_TOOLS,
|
|
@@ -51,9 +51,9 @@ type AutoUnitToolScopeResult = {
|
|
|
51
51
|
displayReason?: string;
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
54
|
+
// Normalizer seam lives in engine-hook-contract.ts; re-exported here for
|
|
55
|
+
// existing scope importers.
|
|
56
|
+
export { canonicalWorkflowToolName };
|
|
57
57
|
|
|
58
58
|
export function isWorkflowAliasTool(toolName: string): boolean {
|
|
59
59
|
return isWorkflowSurfaceAliasTool(toolName);
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
18
|
-
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath
|
|
18
|
+
import { gsdProjectionRoot, resolveSliceFile, resolveSlicePath } from "./paths.js";
|
|
19
19
|
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
20
20
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
@@ -25,8 +25,6 @@ import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
|
25
25
|
import type { GSDPreferences } from "./preferences-types.js";
|
|
26
26
|
import { isClosedStatus } from "./status-guards.js";
|
|
27
27
|
import { loadFile } from "./files.js";
|
|
28
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
29
|
-
import { isMilestoneComplete } from "./state.js";
|
|
30
28
|
import {
|
|
31
29
|
runVerificationGate,
|
|
32
30
|
runVerificationGateForTargets,
|
|
@@ -52,6 +50,7 @@ import { getSlice } from "./gsd-db.js";
|
|
|
52
50
|
import { getLedger } from "./metrics.js";
|
|
53
51
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
54
52
|
import { formatPostUnitStatusCard } from "./auto-status-message.js";
|
|
53
|
+
import { detectWebApp } from "./web-app-uat.js";
|
|
55
54
|
|
|
56
55
|
export interface VerificationContext {
|
|
57
56
|
s: AutoSession;
|
|
@@ -373,29 +372,13 @@ async function runValidateMilestonePostCheck(
|
|
|
373
372
|
* DB-backed projects are authoritative (#4094 peer review); falls back to
|
|
374
373
|
* roadmap parsing only when the DB is unavailable.
|
|
375
374
|
*/
|
|
376
|
-
async function countIncompleteSlices(
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Filesystem fallback: parse the roadmap markdown.
|
|
387
|
-
try {
|
|
388
|
-
const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
389
|
-
if (!roadmapFile) return 1;
|
|
390
|
-
const roadmapContent = await loadFile(roadmapFile);
|
|
391
|
-
if (!roadmapContent) return 1;
|
|
392
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
393
|
-
if (roadmap.slices.length === 0) return 1;
|
|
394
|
-
return isMilestoneComplete(roadmap) ? 0 : 1;
|
|
395
|
-
} catch {
|
|
396
|
-
// Parsing failures should not cause false-positive pauses.
|
|
397
|
-
return 1;
|
|
398
|
-
}
|
|
375
|
+
async function countIncompleteSlices(_basePath: string, milestoneId: string): Promise<number> {
|
|
376
|
+
// DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
|
|
377
|
+
// rows means "unknown" — do not pause.
|
|
378
|
+
if (!isDbAvailable()) return 1;
|
|
379
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
380
|
+
if (slices.length === 0) return 1;
|
|
381
|
+
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
399
382
|
}
|
|
400
383
|
|
|
401
384
|
/**
|
|
@@ -805,17 +788,32 @@ export async function runPostUnitVerification(
|
|
|
805
788
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
806
789
|
s.pendingVerificationRetry = null;
|
|
807
790
|
return "continue";
|
|
791
|
+
} else if (
|
|
792
|
+
verdict.reason === "no-host-checks" &&
|
|
793
|
+
taskAlreadyComplete &&
|
|
794
|
+
detectWebApp(s.basePath) &&
|
|
795
|
+
!result.runtimeErrors?.some((e) => e.blocking)
|
|
796
|
+
) {
|
|
797
|
+
s.verificationRetryCount.delete(retryKey);
|
|
798
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
799
|
+
s.pendingVerificationRetry = null;
|
|
800
|
+
ctx.ui.notify(
|
|
801
|
+
"No task-level host verification command was found for a completed browser-facing task; continuing so slice UAT can verify the UI with browser tools.",
|
|
802
|
+
"warning",
|
|
803
|
+
);
|
|
804
|
+
return "continue";
|
|
808
805
|
} else if (verdict.reason === "no-host-checks") {
|
|
809
806
|
s.verificationRetryCount.delete(retryKey);
|
|
810
807
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
811
808
|
s.pendingVerificationRetry = null;
|
|
809
|
+
const pauseMessage = `Verification failed: ${verdict.failureContext}`;
|
|
812
810
|
ctx.ui.notify(
|
|
813
|
-
|
|
811
|
+
`Verification gate FAILED — ${verdict.failureContext}`,
|
|
814
812
|
"error",
|
|
815
813
|
);
|
|
816
814
|
process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
|
|
817
815
|
await pauseAuto(ctx, pi, {
|
|
818
|
-
message:
|
|
816
|
+
message: pauseMessage,
|
|
819
817
|
category: "unknown",
|
|
820
818
|
});
|
|
821
819
|
return "pause";
|
|
@@ -972,6 +972,14 @@ function _resolveIntegrationBranchForReuse(
|
|
|
972
972
|
}
|
|
973
973
|
}
|
|
974
974
|
|
|
975
|
+
function safeCwd(fallback: string): string {
|
|
976
|
+
try {
|
|
977
|
+
return process.cwd();
|
|
978
|
+
} catch {
|
|
979
|
+
return fallback;
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
|
|
975
983
|
/**
|
|
976
984
|
* When reusing an existing milestone branch, fast-forward it onto the
|
|
977
985
|
* integration branch when that's safe (branch is a strict ancestor of
|
|
@@ -1155,7 +1163,7 @@ export function teardownAutoWorktree(
|
|
|
1155
1163
|
|
|
1156
1164
|
const branch = autoWorktreeBranch(milestoneId);
|
|
1157
1165
|
const { preserveBranch = false, preserveWorktree = false } = opts;
|
|
1158
|
-
const previousCwd =
|
|
1166
|
+
const previousCwd = safeCwd(originalBasePath);
|
|
1159
1167
|
|
|
1160
1168
|
// Wrap the entire teardown body in a single try/finally so activeWorkspace
|
|
1161
1169
|
// is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
|
|
@@ -1250,7 +1258,7 @@ export function teardownAutoWorktree(
|
|
|
1250
1258
|
* still works after process restart when module state has been reset.
|
|
1251
1259
|
*/
|
|
1252
1260
|
export function isInAutoWorktree(basePath: string): boolean {
|
|
1253
|
-
const targetPath = isGsdWorktreePath(basePath) ? basePath :
|
|
1261
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
|
|
1254
1262
|
if (!isGsdWorktreePath(targetPath)) return false;
|
|
1255
1263
|
|
|
1256
1264
|
const storedBase = getAutoWorktreeOriginalBase();
|
|
@@ -2229,6 +2237,11 @@ export function mergeMilestoneToMain(
|
|
|
2229
2237
|
process.chdir(originalBasePath_);
|
|
2230
2238
|
} catch (err) {
|
|
2231
2239
|
logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2240
|
+
debugLog("mergeMilestoneToMain", {
|
|
2241
|
+
phase: "post-merge-chdir-failed",
|
|
2242
|
+
target: originalBasePath_,
|
|
2243
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2244
|
+
});
|
|
2232
2245
|
}
|
|
2233
2246
|
};
|
|
2234
2247
|
|
|
@@ -859,6 +859,20 @@ export function _warnIfWorktreeMissingForTest(
|
|
|
859
859
|
return false;
|
|
860
860
|
}
|
|
861
861
|
|
|
862
|
+
export function anchorProcessCwdForAutoResume(basePath: string): boolean {
|
|
863
|
+
try {
|
|
864
|
+
process.chdir(basePath);
|
|
865
|
+
return true;
|
|
866
|
+
} catch (err) {
|
|
867
|
+
logWarning(
|
|
868
|
+
"session",
|
|
869
|
+
`resume cwd anchor failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
870
|
+
{ file: "auto.ts", basePath },
|
|
871
|
+
);
|
|
872
|
+
return false;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
862
876
|
export function isAutoPaused(): boolean {
|
|
863
877
|
return s.paused;
|
|
864
878
|
}
|
|
@@ -924,6 +938,14 @@ export function setCurrentDispatchedModelId(model: { provider: string; id: strin
|
|
|
924
938
|
s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
|
|
925
939
|
}
|
|
926
940
|
|
|
941
|
+
/**
|
|
942
|
+
* Update the active unit model after runtime recovery switches models mid-unit.
|
|
943
|
+
* The next session restore path reads this field before dispatching again.
|
|
944
|
+
*/
|
|
945
|
+
export function setCurrentUnitModelForRecovery(model: any | null): void {
|
|
946
|
+
s.currentUnitModel = model;
|
|
947
|
+
}
|
|
948
|
+
|
|
927
949
|
// Tool tracking — delegates to auto-tool-tracking.ts
|
|
928
950
|
export function markToolStart(toolCallId: string, toolName?: string): void {
|
|
929
951
|
_markToolStart(toolCallId, s.active, toolName);
|
|
@@ -1000,6 +1022,41 @@ export function stopAutoRemote(projectRoot: string): {
|
|
|
1000
1022
|
}
|
|
1001
1023
|
}
|
|
1002
1024
|
|
|
1025
|
+
/**
|
|
1026
|
+
* Force-stop a remote auto-mode session before stealing its lock.
|
|
1027
|
+
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
1028
|
+
* this path is only for the explicit "Force start" action.
|
|
1029
|
+
*/
|
|
1030
|
+
export function forceStopAutoRemote(projectRoot: string): {
|
|
1031
|
+
found: boolean;
|
|
1032
|
+
pid?: number;
|
|
1033
|
+
error?: string;
|
|
1034
|
+
} {
|
|
1035
|
+
const lock = readCrashLock(projectRoot);
|
|
1036
|
+
if (!lock) return { found: false };
|
|
1037
|
+
|
|
1038
|
+
if (lock.pid === process.pid) {
|
|
1039
|
+
clearLock(projectRoot);
|
|
1040
|
+
return { found: false };
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
if (!isLockProcessAlive(lock)) {
|
|
1044
|
+
clearLock(projectRoot);
|
|
1045
|
+
return { found: false };
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
try {
|
|
1049
|
+
process.kill(lock.pid, "SIGTERM");
|
|
1050
|
+
if (isLockProcessAlive(lock)) {
|
|
1051
|
+
process.kill(lock.pid, "SIGKILL");
|
|
1052
|
+
}
|
|
1053
|
+
clearLock(projectRoot);
|
|
1054
|
+
return { found: true, pid: lock.pid };
|
|
1055
|
+
} catch (err) {
|
|
1056
|
+
return { found: false, error: (err as Error).message };
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1003
1060
|
/**
|
|
1004
1061
|
* Check if a remote auto-mode session is running (from a different process).
|
|
1005
1062
|
* Reads the crash lock, checks PID liveness, and returns session details.
|
|
@@ -1117,6 +1174,10 @@ function pauseAutoUnitIdentityMatches(expected: PauseAutoUnitIdentity | null): b
|
|
|
1117
1174
|
s.currentUnit.startedAt === expected.startedAt;
|
|
1118
1175
|
}
|
|
1119
1176
|
|
|
1177
|
+
function shouldPreserveCoordinationForPause(errorContext?: ErrorContext): boolean {
|
|
1178
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1120
1181
|
function setLifecycleOutcome(
|
|
1121
1182
|
ctx: ExtensionContext | undefined,
|
|
1122
1183
|
input: {
|
|
@@ -2077,7 +2138,7 @@ export async function pauseAuto(
|
|
|
2077
2138
|
clearLock(lockBase());
|
|
2078
2139
|
}
|
|
2079
2140
|
|
|
2080
|
-
if (s.workerId) {
|
|
2141
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
2081
2142
|
try {
|
|
2082
2143
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
2083
2144
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -2400,7 +2461,7 @@ export async function startAuto(
|
|
|
2400
2461
|
const pid = freshStartAssessment.lock?.pid;
|
|
2401
2462
|
ctx.ui.notify(
|
|
2402
2463
|
pid
|
|
2403
|
-
? `Another auto-mode session (PID ${pid}) appears to be running.\
|
|
2464
|
+
? `Another auto-mode session (PID ${pid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
|
|
2404
2465
|
: "Another auto-mode session appears to be running.",
|
|
2405
2466
|
"error",
|
|
2406
2467
|
);
|
|
@@ -2595,6 +2656,7 @@ export async function startAuto(
|
|
|
2595
2656
|
}
|
|
2596
2657
|
// ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
|
|
2597
2658
|
buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
|
|
2659
|
+
anchorProcessCwdForAutoResume(s.basePath || base);
|
|
2598
2660
|
// Rebuild scope now that s.basePath reflects the actual worktree (or project root).
|
|
2599
2661
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
2600
2662
|
// Ensure the workflow-logger audit log is pinned to the project root
|