@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.822c9439
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/headless-events.js +7 -5
- package/dist/mcp-server.js +2 -1
- package/dist/resource-loader.d.ts +9 -5
- package/dist/resource-loader.js +114 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- 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/stream-adapter.js +3 -2
- 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 +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +12 -12
- 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 +14 -1
- package/dist/resources/extensions/gsd/auto.js +37 -1
- 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 +23 -6
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -59
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- 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/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/queries.js +26 -0
- 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-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- 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 +2 -1
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +6 -3
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- 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/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- 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 +1 -1
- 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 +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state.js +5 -0
- 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/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 +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- 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 +42 -16
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +7 -20
- 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/web-app-uat.js +45 -8
- 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-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.js +8 -1
- 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 +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- 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 +11 -11
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +11 -11
- 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/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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -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 +5 -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 +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +10 -5
- 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/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/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 +99 -38
- 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/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.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 +239 -153
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +256 -145
- 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/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- 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/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- 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/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +3 -2
- 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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +12 -14
- 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 +14 -1
- package/src/resources/extensions/gsd/auto.ts +44 -1
- 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 +23 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +211 -59
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- 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/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/queries.ts +37 -0
- 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-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- 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 +4 -3
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +21 -26
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- 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/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- 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 +1 -1
- 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 +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +5 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- 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/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- 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/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +20 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +19 -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 +76 -0
- 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 +112 -29
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- 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/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 +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- 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 +62 -16
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +7 -20
- 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/web-app-uat.ts +51 -8
- 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-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.ts +7 -1
- 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 +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- 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/{2p9Rv9pQflAxCBbGVI2vb → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
|
@@ -18,7 +18,7 @@ import { deriveState } from "./state.js";
|
|
|
18
18
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
19
19
|
import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
|
|
20
20
|
import { loadPrompt } from "./prompt-loader.js";
|
|
21
|
-
import { isAwaitingUserInput } from "./
|
|
21
|
+
import { isAwaitingUserInput } from "./consent-question.js";
|
|
22
22
|
import {
|
|
23
23
|
resolveMilestonePath,
|
|
24
24
|
resolveSliceFile,
|
|
@@ -51,8 +51,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
|
51
51
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
52
52
|
import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
53
53
|
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
54
|
-
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
55
|
-
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
54
|
+
import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
|
|
56
55
|
import { consumeSignal } from "./session-status-io.js";
|
|
57
56
|
import {
|
|
58
57
|
checkPostUnitHooks,
|
|
@@ -96,6 +95,7 @@ import {
|
|
|
96
95
|
} from "./project-research-policy.js";
|
|
97
96
|
import { validateArtifact } from "./schemas/validate.js";
|
|
98
97
|
import { verificationRetryKey } from "./auto/verification-retry-policy.js";
|
|
98
|
+
import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
|
|
99
99
|
import { getLedger } from "./metrics.js";
|
|
100
100
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
101
101
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
@@ -901,7 +901,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
|
|
|
901
901
|
"discuss-milestone",
|
|
902
902
|
"research-decision",
|
|
903
903
|
]);
|
|
904
|
-
export { isAwaitingUserInput } from "./
|
|
904
|
+
export { isAwaitingUserInput } from "./consent-question.js";
|
|
905
905
|
|
|
906
906
|
function artifactValidationKind(unitType: string): "project" | "requirements" | null {
|
|
907
907
|
if (unitType === "discuss-project") return "project";
|
|
@@ -990,11 +990,13 @@ async function repairCompleteSliceRoadmapProjection(
|
|
|
990
990
|
return false;
|
|
991
991
|
}
|
|
992
992
|
|
|
993
|
+
// Stale-render detection (ADR-017): the DB already says the slice is closed;
|
|
994
|
+
// this only checks whether the rendered ROADMAP projection reflects it, to
|
|
995
|
+
// decide whether a repair re-render is needed.
|
|
993
996
|
const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
|
|
994
997
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
995
998
|
try {
|
|
996
|
-
|
|
997
|
-
if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
|
|
999
|
+
if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
|
|
998
1000
|
return false;
|
|
999
1001
|
}
|
|
1000
1002
|
} catch (err) {
|
|
@@ -2023,16 +2025,30 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2023
2025
|
);
|
|
2024
2026
|
} else if (!triggerArtifactVerified) {
|
|
2025
2027
|
if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
|
|
2026
|
-
// Tool-unavailable is the
|
|
2027
|
-
//
|
|
2028
|
-
//
|
|
2029
|
-
//
|
|
2030
|
-
|
|
2028
|
+
// Tool-unavailable is transient: the workflow MCP server registers
|
|
2029
|
+
// its surface asynchronously, so a Unit's first call can race the
|
|
2030
|
+
// registration. Retry with escalating delay, bounded at 3 attempts.
|
|
2031
|
+
// ponytail: MAX constant so the guard, log, and display all agree
|
|
2032
|
+
const MAX_TOOL_UNAVAIL_RETRIES = 3;
|
|
2033
|
+
if (s.toolUnavailableRetries >= MAX_TOOL_UNAVAIL_RETRIES) {
|
|
2034
|
+
debugLog("postUnit", { phase: "tool-unavailable-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, retries: s.toolUnavailableRetries });
|
|
2035
|
+
ctx.ui.notify(
|
|
2036
|
+
`Tool unavailable for ${s.currentUnit.type} after ${MAX_TOOL_UNAVAIL_RETRIES} retries: ${s.lastToolInvocationError}. MCP server may not be starting — pausing auto-mode.`,
|
|
2037
|
+
"error",
|
|
2038
|
+
);
|
|
2039
|
+
s.lastToolInvocationError = null;
|
|
2040
|
+
await pauseAuto(ctx, pi);
|
|
2041
|
+
return "dispatched";
|
|
2042
|
+
}
|
|
2043
|
+
s.toolUnavailableRetries++;
|
|
2044
|
+
const delayMs = s.toolUnavailableRetries * 1000;
|
|
2045
|
+
debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError, attempt: s.toolUnavailableRetries, delayMs });
|
|
2031
2046
|
ctx.ui.notify(
|
|
2032
|
-
`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}.
|
|
2047
|
+
`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Waiting ${delayMs}ms for MCP server — retry ${s.toolUnavailableRetries}/${MAX_TOOL_UNAVAIL_RETRIES}.`,
|
|
2033
2048
|
"warning",
|
|
2034
2049
|
);
|
|
2035
2050
|
s.lastToolInvocationError = null;
|
|
2051
|
+
await new Promise(r => setTimeout(r, delayMs));
|
|
2036
2052
|
} else if (s.lastToolInvocationError) {
|
|
2037
2053
|
const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
|
|
2038
2054
|
const errMsg = isUserSkip
|
|
@@ -2159,6 +2175,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2159
2175
|
}
|
|
2160
2176
|
}
|
|
2161
2177
|
s.exhaustedVerificationUnits.add(retryKey);
|
|
2178
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2162
2179
|
debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
2163
2180
|
ctx.ui.notify(
|
|
2164
2181
|
`${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`,
|
|
@@ -2168,6 +2185,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2168
2185
|
return "dispatched";
|
|
2169
2186
|
}
|
|
2170
2187
|
s.verificationRetryCount.set(retryKey, attempt);
|
|
2188
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2171
2189
|
s.pendingVerificationRetry = {
|
|
2172
2190
|
unitId: s.currentUnit.id,
|
|
2173
2191
|
failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
|
|
@@ -2189,8 +2207,11 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2189
2207
|
if (s.pendingVerificationRetry?.unitId === s.currentUnit.id) {
|
|
2190
2208
|
s.pendingVerificationRetry = null;
|
|
2191
2209
|
}
|
|
2210
|
+
s.toolUnavailableRetries = 0;
|
|
2192
2211
|
s.verificationRetryCount.delete(retryKey);
|
|
2193
2212
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
2213
|
+
s.exhaustedVerificationUnits.delete(retryKey);
|
|
2214
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2194
2215
|
|
|
2195
2216
|
if (s.currentUnit.type === "complete-milestone") {
|
|
2196
2217
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
composeContextModeInstructions,
|
|
41
41
|
composeContractedUnitContext,
|
|
42
42
|
composeInlinedContext,
|
|
43
|
+
composeToolSurfaceInstructions,
|
|
43
44
|
composeUnitContext,
|
|
44
45
|
type ArtifactResolver,
|
|
45
46
|
type ComposedUnitContextBlock,
|
|
@@ -57,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
|
|
|
57
58
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
58
59
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
59
60
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
60
|
-
import {
|
|
61
|
+
import {
|
|
62
|
+
classifyUatContentForRun,
|
|
63
|
+
shouldDispatchUatForContent,
|
|
64
|
+
type UatType,
|
|
65
|
+
} from "./uat-policy.js";
|
|
61
66
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
62
67
|
|
|
63
68
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
@@ -292,10 +297,12 @@ function prependContextModeToBlock(
|
|
|
292
297
|
block: string,
|
|
293
298
|
renderMode: ContextModeRenderMode = "standalone",
|
|
294
299
|
): string {
|
|
300
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
295
301
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
296
|
-
|
|
297
|
-
if (!
|
|
298
|
-
return
|
|
302
|
+
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
303
|
+
if (!guidance) return block;
|
|
304
|
+
if (!block.trim()) return guidance;
|
|
305
|
+
return `${guidance}\n\n${block}`;
|
|
299
306
|
}
|
|
300
307
|
|
|
301
308
|
function requireUnitPromptContextContract(unitType: string): UnitPromptContextContract {
|
|
@@ -969,7 +976,7 @@ export async function inlineDecisionsFromDb(
|
|
|
969
976
|
|
|
970
977
|
/**
|
|
971
978
|
* Inline requirements with optional milestone and slice scoping from the DB.
|
|
972
|
-
* Falls back to filesystem via inlineGsdRootFile when DB unavailable
|
|
979
|
+
* Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
|
|
973
980
|
*/
|
|
974
981
|
export async function inlineRequirementsFromDb(
|
|
975
982
|
base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
|
|
@@ -979,14 +986,28 @@ export async function inlineRequirementsFromDb(
|
|
|
979
986
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
980
987
|
if (isDbAvailable()) {
|
|
981
988
|
const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
|
|
982
|
-
|
|
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
|
+
}
|
|
983
999
|
if (requirements.length > 0) {
|
|
984
|
-
// Use compact format for non-full levels
|
|
985
|
-
|
|
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
|
|
986
1006
|
? formatRequirementsCompact(requirements)
|
|
987
1007
|
: formatRequirementsForPrompt(requirements);
|
|
988
1008
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
989
1009
|
}
|
|
1010
|
+
return null;
|
|
990
1011
|
}
|
|
991
1012
|
} catch (err) {
|
|
992
1013
|
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1442,6 +1463,40 @@ export async function checkNeedsReassessment(
|
|
|
1442
1463
|
* - No UAT file exists for the slice
|
|
1443
1464
|
* - UAT result file already exists (idempotent — already ran)
|
|
1444
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
|
+
|
|
1445
1500
|
export async function checkNeedsRunUat(
|
|
1446
1501
|
base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
|
|
1447
1502
|
): Promise<{ sliceId: string; uatType: UatType } | null> {
|
|
@@ -1470,7 +1525,8 @@ export async function checkNeedsRunUat(
|
|
|
1470
1525
|
if (assessmentContent && hasVerdict(assessmentContent)) continue;
|
|
1471
1526
|
}
|
|
1472
1527
|
if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
|
|
1473
|
-
|
|
1528
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1529
|
+
return { sliceId: sid, uatType };
|
|
1474
1530
|
}
|
|
1475
1531
|
return null;
|
|
1476
1532
|
}
|
|
@@ -1503,7 +1559,8 @@ export async function checkNeedsRunUat(
|
|
|
1503
1559
|
if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
|
|
1504
1560
|
}
|
|
1505
1561
|
if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
|
|
1506
|
-
|
|
1562
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1563
|
+
return { sliceId: uatSid, uatType };
|
|
1507
1564
|
}
|
|
1508
1565
|
return null;
|
|
1509
1566
|
}
|
|
@@ -3557,15 +3614,30 @@ export async function buildRunUatPrompt(
|
|
|
3557
3614
|
null,
|
|
3558
3615
|
cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
|
|
3559
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
|
+
: "";
|
|
3560
3631
|
const inlinedContext = prependContextModeToBlock(
|
|
3561
3632
|
"run-uat",
|
|
3562
3633
|
base,
|
|
3563
|
-
|
|
3634
|
+
runtimeHarnessOverride
|
|
3635
|
+
? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
|
|
3636
|
+
: cappedInlinedContext,
|
|
3564
3637
|
);
|
|
3565
3638
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
3566
3639
|
|
|
3567
3640
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
3568
|
-
const uatType = resolveEffectiveUatType(uatContent);
|
|
3569
3641
|
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
3570
3642
|
|
|
3571
3643
|
return loadPrompt("run-uat", {
|
|
@@ -3850,18 +3922,22 @@ export async function buildReactiveExecutePrompt(
|
|
|
3850
3922
|
const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
|
|
3851
3923
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
|
|
3852
3924
|
|
|
3853
|
-
const prompt =
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3925
|
+
const prompt = prependContextModeToBlock(
|
|
3926
|
+
"reactive-execute",
|
|
3927
|
+
base,
|
|
3928
|
+
loadPrompt("reactive-execute", {
|
|
3929
|
+
workingDirectory: base,
|
|
3930
|
+
milestoneId: mid,
|
|
3931
|
+
milestoneTitle: midTitle,
|
|
3932
|
+
sliceId: sid,
|
|
3933
|
+
sliceTitle: sTitle,
|
|
3934
|
+
graphContext,
|
|
3935
|
+
readyTaskCount: String(readyTaskIds.length),
|
|
3936
|
+
readyTaskList: readyTaskListLines.join("\n"),
|
|
3937
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
3938
|
+
inlinedTemplates,
|
|
3939
|
+
}),
|
|
3940
|
+
);
|
|
3865
3941
|
emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
|
|
3866
3942
|
return prompt;
|
|
3867
3943
|
}
|
|
@@ -4040,17 +4116,21 @@ export async function buildGateEvaluatePrompt(
|
|
|
4040
4116
|
].join("\n"));
|
|
4041
4117
|
}
|
|
4042
4118
|
|
|
4043
|
-
return
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4051
|
-
|
|
4052
|
-
|
|
4053
|
-
|
|
4119
|
+
return prependContextModeToBlock(
|
|
4120
|
+
"gate-evaluate",
|
|
4121
|
+
base,
|
|
4122
|
+
loadPrompt("gate-evaluate", {
|
|
4123
|
+
workingDirectory: base,
|
|
4124
|
+
milestoneId: mid,
|
|
4125
|
+
milestoneTitle: midTitle,
|
|
4126
|
+
sliceId: sid,
|
|
4127
|
+
sliceTitle: sTitle,
|
|
4128
|
+
slicePlanContent: planContent,
|
|
4129
|
+
gateCount: String(pending.length),
|
|
4130
|
+
gateList: gateListLines.join("\n"),
|
|
4131
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
4132
|
+
}),
|
|
4133
|
+
);
|
|
4054
4134
|
}
|
|
4055
4135
|
|
|
4056
4136
|
export async function buildRewriteDocsPrompt(
|
|
@@ -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 {
|
|
@@ -994,12 +995,14 @@ export async function bootstrapAutoSession(
|
|
|
994
995
|
// phase-specific planning model for a discuss turn (#2829).
|
|
995
996
|
//
|
|
996
997
|
// Precedence:
|
|
997
|
-
// 1) Explicit session override via /gsd model (this session)
|
|
998
|
-
// 2)
|
|
999
|
-
// 3)
|
|
998
|
+
// 1) Explicit session override via /gsd model or /gsd auto --model (this session)
|
|
999
|
+
// 2) GSD model preferences from PREFERENCES.md (validated against live auth)
|
|
1000
|
+
// 3) Current session model from settings/session restore (if provider ready)
|
|
1000
1001
|
//
|
|
1001
|
-
//
|
|
1002
|
-
//
|
|
1002
|
+
// PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
|
|
1003
|
+
// does not stick on claude-code/claude-sonnet-4-6 when the user configured
|
|
1004
|
+
// models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
|
|
1005
|
+
// still skip PREFERENCES.md entirely (#4122).
|
|
1003
1006
|
//
|
|
1004
1007
|
// Exception (#4122): when the session provider is a custom provider declared
|
|
1005
1008
|
// in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
|
|
@@ -1011,7 +1014,7 @@ export async function bootstrapAutoSession(
|
|
|
1011
1014
|
const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
|
|
1012
1015
|
const preferredModel = sessionProviderIsCustom
|
|
1013
1016
|
? null
|
|
1014
|
-
: resolveDefaultSessionModel(ctx.model?.provider);
|
|
1017
|
+
: resolveDefaultSessionModel(ctx.model?.provider, base);
|
|
1015
1018
|
// Validate the preferred model against the live registry + provider auth so
|
|
1016
1019
|
// an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
|
|
1017
1020
|
// start-model snapshot. Without this, every subsequent unit would try to
|
|
@@ -1041,8 +1044,8 @@ export async function bootstrapAutoSession(
|
|
|
1041
1044
|
: null;
|
|
1042
1045
|
const startThinkingSnapshot = pi.getThinkingLevel();
|
|
1043
1046
|
const startModelSnapshot = manualSessionOverride
|
|
1044
|
-
?? currentSessionModel
|
|
1045
1047
|
?? validatedPreferredModel
|
|
1048
|
+
?? currentSessionModel
|
|
1046
1049
|
?? null;
|
|
1047
1050
|
|
|
1048
1051
|
try {
|
|
@@ -1643,14 +1646,9 @@ export async function bootstrapAutoSession(
|
|
|
1643
1646
|
`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
|
|
1644
1647
|
"error",
|
|
1645
1648
|
);
|
|
1646
|
-
} else if (enterResult.reason === "creation-failed") {
|
|
1647
|
-
ctx.ui.notify(
|
|
1648
|
-
`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
|
|
1649
|
-
"error",
|
|
1650
|
-
);
|
|
1651
|
-
} else if (enterResult.reason === "isolation-degraded") {
|
|
1649
|
+
} else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
|
|
1652
1650
|
ctx.ui.notify(
|
|
1653
|
-
|
|
1651
|
+
milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
|
|
1654
1652
|
"error",
|
|
1655
1653
|
);
|
|
1656
1654
|
} 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);
|