@opengsd/gsd-pi 1.2.0-dev.84c56d87 → 1.2.0-dev.8e6112e9
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/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/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 +174 -69
- 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 +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 +35 -15
- 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 +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +145 -50
- 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/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/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +5 -3
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- 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/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 +11 -8
- 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/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- 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 +9 -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/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/safety/destructive-confirmation.js +108 -0
- 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/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 +40 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- 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 +45 -3
- 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/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 +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 +6 -6
- 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/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/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/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 +13 -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 +55 -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/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-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 +12 -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-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/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/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/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 +452 -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/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 +419 -221
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +460 -261
- 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/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/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/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/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/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- 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/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +63 -18
- 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/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/tests/gsd-browser-launch-config.test.mjs +40 -1
- 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 +193 -71
- 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 +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 +36 -18
- 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 +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +163 -55
- 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/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/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +5 -3
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- 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/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 +13 -10
- 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/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- 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 +9 -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/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/safety/destructive-confirmation.ts +134 -0
- 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 +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- 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/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/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-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 +36 -0
- 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 +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/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/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/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/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 +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-project-config.test.ts +3 -1
- 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/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- 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/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 +45 -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/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/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/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 +60 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- 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 +54 -3
- 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/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/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{AOpDeK_gJHU8OZjRo31gQ → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
4
4
|
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
|
|
5
5
|
import { invalidateStateCache } from "../state.js";
|
|
6
6
|
import { renderTaskPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -110,7 +110,7 @@ export async function handlePlanTask(rawParams, basePath) {
|
|
|
110
110
|
clearParseCache();
|
|
111
111
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
112
112
|
try {
|
|
113
|
-
await
|
|
113
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
114
114
|
writeManifest(basePath);
|
|
115
115
|
appendEvent(basePath, {
|
|
116
116
|
cmd: "plan-task",
|
|
@@ -6,7 +6,7 @@ import { isNonEmptyString } from "../validation.js";
|
|
|
6
6
|
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertSlice, updateSliceFields, insertAssessment, deleteAssessmentByScope, deleteSlice, } from "../gsd-db.js";
|
|
7
7
|
import { invalidateStateCache } from "../state.js";
|
|
8
8
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
9
|
-
import {
|
|
9
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
10
10
|
import { writeManifest } from "../workflow-manifest.js";
|
|
11
11
|
import { appendEvent } from "../workflow-events.js";
|
|
12
12
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -234,7 +234,7 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
234
234
|
clearParseCache();
|
|
235
235
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
236
236
|
try {
|
|
237
|
-
await
|
|
237
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
238
238
|
writeManifest(basePath);
|
|
239
239
|
appendEvent(basePath, {
|
|
240
240
|
cmd: "reassess-roadmap",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { getMilestoneSlices, getSliceTasks, reopenMilestoneCascade, } from "../gsd-db.js";
|
|
11
11
|
import { invalidateStateCache } from "../state.js";
|
|
12
|
-
import {
|
|
12
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
13
13
|
import { writeManifest } from "../workflow-manifest.js";
|
|
14
14
|
import { appendEvent } from "../workflow-events.js";
|
|
15
15
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -74,7 +74,7 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
74
74
|
clearPathCache();
|
|
75
75
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
76
76
|
try {
|
|
77
|
-
await
|
|
77
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
78
78
|
writeManifest(basePath);
|
|
79
79
|
appendEvent(basePath, {
|
|
80
80
|
cmd: "reopen-milestone",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
12
12
|
import { getSliceTasks, reopenSliceCascade, } from "../gsd-db.js";
|
|
13
13
|
import { invalidateStateCache } from "../state.js";
|
|
14
|
-
import {
|
|
14
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
15
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
16
16
|
import { appendEvent } from "../workflow-events.js";
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -72,7 +72,7 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
72
72
|
clearPathCache();
|
|
73
73
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
74
74
|
try {
|
|
75
|
-
await
|
|
75
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
76
76
|
writeManifest(basePath);
|
|
77
77
|
appendEvent(basePath, {
|
|
78
78
|
cmd: "reopen-slice",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { getMilestone, getSlice, getTask, updateTaskStatus, transaction, } from "../gsd-db.js";
|
|
12
12
|
import { invalidateStateCache } from "../state.js";
|
|
13
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
|
-
import {
|
|
14
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
15
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
16
16
|
import { appendEvent } from "../workflow-events.js";
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -83,7 +83,7 @@ export async function handleReopenTask(params, basePath) {
|
|
|
83
83
|
clearPathCache();
|
|
84
84
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
85
85
|
try {
|
|
86
|
-
await
|
|
86
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
87
87
|
writeManifest(basePath);
|
|
88
88
|
appendEvent(basePath, {
|
|
89
89
|
cmd: "reopen-task",
|
|
@@ -4,7 +4,7 @@ import { invalidateStateCache } from "../state.js";
|
|
|
4
4
|
import { isClosedStatus } from "../status-guards.js";
|
|
5
5
|
import { isNonEmptyString } from "../validation.js";
|
|
6
6
|
import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -162,7 +162,7 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
162
162
|
clearParseCache();
|
|
163
163
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
164
164
|
try {
|
|
165
|
-
await
|
|
165
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
166
166
|
writeManifest(basePath);
|
|
167
167
|
appendEvent(basePath, {
|
|
168
168
|
cmd: "replan-slice",
|
|
@@ -6,9 +6,10 @@ import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot, should
|
|
|
6
6
|
import { getActiveRequirements, getAllMilestones, getMilestone, getSliceStatusSummary, getSliceTaskCounts, insertMilestone, insertAssessment, insertGateRun, readTransaction, saveGateResult, upsertQualityGate, } from "../gsd-db.js";
|
|
7
7
|
import { GATE_REGISTRY } from "../gate-registry.js";
|
|
8
8
|
import { generateRequirementsMd, saveArtifactToDb } from "../db-writer.js";
|
|
9
|
-
import { clearPathCache, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
9
|
+
import { clearPathCache, normalizeRealPath, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
10
10
|
import { saveFile, clearParseCache } from "../files.js";
|
|
11
11
|
import { unlinkSync } from "node:fs";
|
|
12
|
+
import { hostname } from "node:os";
|
|
12
13
|
import { join } from "node:path";
|
|
13
14
|
import { handleCompleteMilestone } from "./complete-milestone.js";
|
|
14
15
|
import { handleCompleteTask } from "./complete-task.js";
|
|
@@ -25,9 +26,11 @@ import { logError, logWarning } from "../workflow-logger.js";
|
|
|
25
26
|
import { invalidateStateCache } from "../state.js";
|
|
26
27
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
27
28
|
import { parseProject } from "../schemas/parsers.js";
|
|
28
|
-
import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
|
|
29
|
+
import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
|
|
29
30
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
30
31
|
import { prepareUatRun, saveUatAttemptArtifact, } from "../uat-run.js";
|
|
32
|
+
import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
|
|
33
|
+
import { claimMilestoneLease, releaseMilestoneLease, getMilestoneLease, refreshMilestoneLease, milestoneLeaseTtlSeconds, } from "../db/milestone-leases.js";
|
|
31
34
|
export const SUPPORTED_SUMMARY_ARTIFACT_TYPES = [
|
|
32
35
|
"SUMMARY",
|
|
33
36
|
"RESEARCH",
|
|
@@ -61,6 +64,19 @@ function blockIfWrongAutoUnit(requiredUnitType, operation) {
|
|
|
61
64
|
isError: true,
|
|
62
65
|
};
|
|
63
66
|
}
|
|
67
|
+
function milestoneLeaseConflictResult(milestoneId, byWorker, expiresAt) {
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: "text", text: `Milestone ${milestoneId} is currently leased by ${byWorker}. Retry after ${expiresAt}.` }],
|
|
70
|
+
details: {
|
|
71
|
+
operation: "plan_milestone",
|
|
72
|
+
error: "milestone_lease_conflict",
|
|
73
|
+
milestoneId,
|
|
74
|
+
byWorker,
|
|
75
|
+
expiresAt,
|
|
76
|
+
},
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
64
80
|
function registerProjectMilestoneSequence(content) {
|
|
65
81
|
const parsed = parseProject(content);
|
|
66
82
|
const registered = [];
|
|
@@ -1066,7 +1082,45 @@ export async function executePlanMilestone(params, basePath = process.cwd()) {
|
|
|
1066
1082
|
isError: true,
|
|
1067
1083
|
};
|
|
1068
1084
|
}
|
|
1085
|
+
let workerId = null;
|
|
1086
|
+
let acquiredToken = null;
|
|
1087
|
+
let leaseRefreshTimer;
|
|
1069
1088
|
try {
|
|
1089
|
+
// Re-read at the gate so a peer-created milestone is not treated as fresh.
|
|
1090
|
+
const milestoneExists = getMilestone(params.milestoneId) !== null;
|
|
1091
|
+
if (milestoneExists) {
|
|
1092
|
+
const heldLease = getMilestoneLease(params.milestoneId);
|
|
1093
|
+
if (heldLease?.status === "held" && Date.parse(heldLease.expires_at) > Date.now()) {
|
|
1094
|
+
const holder = getAutoWorker(heldLease.worker_id);
|
|
1095
|
+
// Let the one-shot claim path recover stale same-process worker rows.
|
|
1096
|
+
const projectRoot = normalizeRealPath(basePath);
|
|
1097
|
+
const isOurAutoLease = isAutoActive() && heldLease.worker_id === autoSession.workerId;
|
|
1098
|
+
const holderIsOneShotReentrantPeer = !isAutoActive()
|
|
1099
|
+
&& !!holder
|
|
1100
|
+
&& holder.host === hostname()
|
|
1101
|
+
&& holder.pid === process.pid
|
|
1102
|
+
&& holder.project_root_realpath === projectRoot;
|
|
1103
|
+
if (holder?.status === "active" && !isOurAutoLease && !holderIsOneShotReentrantPeer) {
|
|
1104
|
+
return milestoneLeaseConflictResult(params.milestoneId, heldLease.worker_id, heldLease.expires_at);
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
// Fresh creation cannot claim a lease because the FK row does not exist.
|
|
1109
|
+
// In-process auto already owns its lease; re-claiming would bump its token.
|
|
1110
|
+
if (!isAutoActive() && milestoneExists) {
|
|
1111
|
+
workerId = registerAutoWorker({ projectRootRealpath: normalizeRealPath(basePath) });
|
|
1112
|
+
const lease = claimMilestoneLease(workerId, params.milestoneId);
|
|
1113
|
+
if (!lease.ok) {
|
|
1114
|
+
return milestoneLeaseConflictResult(params.milestoneId, lease.byWorker, lease.expiresAt);
|
|
1115
|
+
}
|
|
1116
|
+
acquiredToken = lease.token;
|
|
1117
|
+
const leaseRefreshMs = (milestoneLeaseTtlSeconds() / 2) * 1000;
|
|
1118
|
+
leaseRefreshTimer = setInterval(() => {
|
|
1119
|
+
if (acquiredToken !== null && workerId !== null) {
|
|
1120
|
+
refreshMilestoneLease(workerId, params.milestoneId, acquiredToken);
|
|
1121
|
+
}
|
|
1122
|
+
}, leaseRefreshMs);
|
|
1123
|
+
}
|
|
1070
1124
|
const result = await handlePlanMilestone(params, basePath);
|
|
1071
1125
|
if ("error" in result) {
|
|
1072
1126
|
return {
|
|
@@ -1093,6 +1147,17 @@ export async function executePlanMilestone(params, basePath = process.cwd()) {
|
|
|
1093
1147
|
isError: true,
|
|
1094
1148
|
};
|
|
1095
1149
|
}
|
|
1150
|
+
finally {
|
|
1151
|
+
if (leaseRefreshTimer !== undefined) {
|
|
1152
|
+
clearInterval(leaseRefreshTimer);
|
|
1153
|
+
}
|
|
1154
|
+
if (workerId !== null && acquiredToken !== null) {
|
|
1155
|
+
releaseMilestoneLease(workerId, params.milestoneId, acquiredToken);
|
|
1156
|
+
}
|
|
1157
|
+
if (workerId !== null) {
|
|
1158
|
+
markWorkerStopping(workerId);
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1096
1161
|
}
|
|
1097
1162
|
export async function executePlanSlice(params, basePath = process.cwd()) {
|
|
1098
1163
|
const dbAvailable = await ensureDbOpen(basePath);
|
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
|
|
3
3
|
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
4
|
-
import { extractUatType } from "./files.js";
|
|
4
|
+
import { extractUatType, UAT_TYPE_KEYWORDS } from "./files.js";
|
|
5
5
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
6
6
|
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
7
|
-
export const UAT_TYPES =
|
|
8
|
-
"artifact-driven",
|
|
9
|
-
"browser-executable",
|
|
10
|
-
"runtime-executable",
|
|
11
|
-
"live-runtime",
|
|
12
|
-
"mixed",
|
|
13
|
-
"human-experience",
|
|
14
|
-
];
|
|
7
|
+
export const UAT_TYPES = UAT_TYPE_KEYWORDS;
|
|
15
8
|
export const UAT_MODE_POLICIES = {
|
|
16
9
|
"artifact-driven": {
|
|
17
10
|
browserTools: false,
|
|
@@ -56,23 +49,55 @@ export function isUatType(value) {
|
|
|
56
49
|
export function getDeclaredUatType(content) {
|
|
57
50
|
return extractUatType(content) ?? "artifact-driven";
|
|
58
51
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
52
|
+
/** Self-contained browser UAT harnesses that manage server lifecycle internally. */
|
|
53
|
+
const SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE = /\b(?:npm run test:uat|node\s+(?:--check\s+\S+\s+&&\s+)*tests\/browser\/search-uat\.mjs|npx playwright test(?:\s+\S+)?)\b/i;
|
|
54
|
+
export function hasSelfContainedRuntimeUatCommand(content) {
|
|
55
|
+
return SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE.test(content);
|
|
56
|
+
}
|
|
57
|
+
function resolveEffectiveUatTypeFromPolicy(declaredType, browserRequired, content) {
|
|
58
|
+
let effectiveType = declaredType === "artifact-driven" && browserRequired
|
|
63
59
|
? "browser-executable"
|
|
64
60
|
: declaredType;
|
|
61
|
+
// M006/S01 regression: specs often declare browser-executable with localhost
|
|
62
|
+
// preconditions while the Evidence section names a runtime harness such as
|
|
63
|
+
// `npm run test:uat`. Interactive browser_* checks then race a fixed port
|
|
64
|
+
// against the script's own ephemeral server — run the harness instead.
|
|
65
|
+
if (effectiveType === "browser-executable" &&
|
|
66
|
+
hasSelfContainedRuntimeUatCommand(content)) {
|
|
67
|
+
effectiveType = "runtime-executable";
|
|
68
|
+
}
|
|
69
|
+
return effectiveType;
|
|
70
|
+
}
|
|
71
|
+
export function classifyUatContent(content) {
|
|
72
|
+
return classifyUatContentForRun(content);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Classify UAT mode for run-uat dispatch. Supplemental context (slice summary,
|
|
76
|
+
* verification excerpts) can name a self-contained harness even when the UAT
|
|
77
|
+
* file only documents a separate server command such as `npm run test:server`.
|
|
78
|
+
*/
|
|
79
|
+
export function classifyUatContentForRun(content, supplementalContext = "") {
|
|
80
|
+
const parsedType = extractUatType(content);
|
|
81
|
+
const declaredType = parsedType ?? "artifact-driven";
|
|
82
|
+
const browserRequired = hasBrowserRequiredText(content);
|
|
83
|
+
const combinedForHarness = supplementalContext.trim()
|
|
84
|
+
? `${content}\n\n${supplementalContext}`
|
|
85
|
+
: content;
|
|
86
|
+
const effectiveType = resolveEffectiveUatTypeFromPolicy(declaredType, browserRequired, combinedForHarness);
|
|
65
87
|
return {
|
|
66
88
|
declaredType,
|
|
89
|
+
modeDeclared: parsedType !== undefined,
|
|
67
90
|
effectiveType,
|
|
68
91
|
browserRequired,
|
|
69
92
|
shouldDispatchByDefault: effectiveType !== "artifact-driven" || browserRequired,
|
|
70
93
|
};
|
|
71
94
|
}
|
|
72
|
-
export function
|
|
73
|
-
const policy = classifyUatContent(content);
|
|
95
|
+
export function escalatesArtifactUatToBrowser(policy) {
|
|
74
96
|
return policy.declaredType === "artifact-driven" && policy.browserRequired;
|
|
75
97
|
}
|
|
98
|
+
export function shouldEscalateArtifactUatToBrowser(content) {
|
|
99
|
+
return escalatesArtifactUatToBrowser(classifyUatContent(content));
|
|
100
|
+
}
|
|
76
101
|
export function resolveEffectiveUatType(content) {
|
|
77
102
|
return classifyUatContent(content).effectiveType;
|
|
78
103
|
}
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
// owned by the unit, not in the composer. Reviews must enforce this — it
|
|
37
37
|
// is the difference between an orchestrator and a runaway DSL.
|
|
38
38
|
import { resolveManifest, } from "./unit-context-manifest.js";
|
|
39
|
+
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
39
40
|
/**
|
|
40
41
|
* Produce the inlined-context portion of a unit's system prompt by
|
|
41
42
|
* walking the manifest's `artifacts.inline` list in order and calling
|
|
@@ -122,6 +123,70 @@ export function composeContextModeInstructions(unitType, opts) {
|
|
|
122
123
|
guidance,
|
|
123
124
|
].join("\n");
|
|
124
125
|
}
|
|
126
|
+
const TOOL_SURFACE_GUIDANCE_BY_UNIT = {
|
|
127
|
+
"run-uat": "Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
|
|
128
|
+
"complete-slice": "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Capture learnings through `gsd_capture_thought` (or MCP-scoped `mcp__…__gsd_capture_thought`), not bare `capture_thought`, when workflow MCP tools are presented. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
129
|
+
"gate-evaluate": "Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
|
|
130
|
+
"reactive-execute": "Dispatch only **worker** subagents via `subagent`. Do not call `gsd_task_complete` from this parent batch — each worker owns its task completion. If a failed task left no summary, call `gsd_summary_save` with `blocker_discovered: true`.",
|
|
131
|
+
"execute-task": "Complete only this task via `gsd_task_complete`. Do not call `gsd_slice_complete`, `gsd_validate_milestone`, or `gsd_complete_milestone` — the orchestrator owns phase transitions.",
|
|
132
|
+
"validate-milestone": "Dispatch reviewer subagents in parallel, then persist the verdict via `gsd_validate_milestone`. Do not query `.gsd/gsd.db` directly — use `gsd_milestone_status` and inlined context.",
|
|
133
|
+
"complete-milestone": "Persist completion only through `gsd_complete_milestone` after verification passes. Do not query `.gsd/gsd.db` directly. Do not write `.gsd/PROJECT.md` or `.gsd/REQUIREMENTS.md` by hand — use `gsd_summary_save` and `gsd_requirement_update`.",
|
|
134
|
+
"replan-slice": "Persist replans through `gsd_replan_slice` only. Do not edit `PLAN.md` or task plans directly.",
|
|
135
|
+
"plan-slice": "Persist planning through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner** for reconnaissance — not implementation agents. Do not edit user source files outside `.gsd/**`.",
|
|
136
|
+
"refine-slice": "Persist refinements through `gsd_plan_slice` only. Dispatch subagents only to **scout** or **planner**. Do not edit user source files outside `.gsd/**`.",
|
|
137
|
+
"plan-milestone": "Persist milestone planning through `gsd_plan_milestone` / `gsd_plan_slice`. Do not edit user source files outside `.gsd/**`.",
|
|
138
|
+
"research-slice": "Dispatch subagents only to **scout** or **planner** for reconnaissance. Do not edit user source files outside `.gsd/**`.",
|
|
139
|
+
};
|
|
140
|
+
function guidanceForToolsPolicy(policy) {
|
|
141
|
+
switch (policy.mode) {
|
|
142
|
+
case "planning":
|
|
143
|
+
return "Writes are restricted to `.gsd/**` under the working directory — do not edit user source files. `bash` is limited to read-only investigation commands. Do not dispatch subagents. For human elicitation, use workflow MCP `ask_user_questions` when available — not native `AskUserQuestion`.";
|
|
144
|
+
case "planning-dispatch": {
|
|
145
|
+
const agents = policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ");
|
|
146
|
+
return `Writes are restricted to \`.gsd/**\`. Dispatch subagents only to: ${agents}. Do not edit user source files.`;
|
|
147
|
+
}
|
|
148
|
+
case "docs":
|
|
149
|
+
return "Writes are restricted to `.gsd/**` and project documentation paths (`docs/`, `README*`, `CHANGELOG.md`, root `*.md`). Do not edit application source.";
|
|
150
|
+
case "verification": {
|
|
151
|
+
const subagentLine = policy.allowedSubagents?.length
|
|
152
|
+
? ` Dispatch subagents only to: ${policy.allowedSubagents.map((agent) => `**${agent}**`).join(", ")}.`
|
|
153
|
+
: " Do not dispatch subagents.";
|
|
154
|
+
return `\`bash\` is limited to build/test verification commands. Writes restricted to \`.gsd/**\`.${subagentLine}`;
|
|
155
|
+
}
|
|
156
|
+
default:
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function formatForbiddenWorkflowToolsLine(unitType, unitGuidance) {
|
|
161
|
+
const forbidden = getUnitToolSurfaceContract(unitType)?.forbiddenGsdTools;
|
|
162
|
+
if (!forbidden)
|
|
163
|
+
return null;
|
|
164
|
+
const names = Object.keys(forbidden).filter((name) => !unitGuidance?.includes(`\`${name}\``));
|
|
165
|
+
if (names.length === 0)
|
|
166
|
+
return null;
|
|
167
|
+
return `Do not call ${names.map((name) => `\`${name}\``).join(", ")} in this unit.`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Render upfront tool-surface guidance for a unit type. Unknown units and
|
|
171
|
+
* unrestricted (`tools.mode: "all"`) units omit the block unless they have
|
|
172
|
+
* unit-specific closeout guidance registered above.
|
|
173
|
+
*/
|
|
174
|
+
export function composeToolSurfaceInstructions(unitType, opts) {
|
|
175
|
+
const manifest = resolveManifest(unitType);
|
|
176
|
+
if (!manifest)
|
|
177
|
+
return "";
|
|
178
|
+
const unitGuidance = TOOL_SURFACE_GUIDANCE_BY_UNIT[unitType];
|
|
179
|
+
const policyGuidance = unitGuidance ? null : guidanceForToolsPolicy(manifest.tools);
|
|
180
|
+
const forbiddenLine = formatForbiddenWorkflowToolsLine(unitType, unitGuidance);
|
|
181
|
+
const parts = [unitGuidance, policyGuidance, forbiddenLine].filter((part) => typeof part === "string" && part.length > 0);
|
|
182
|
+
if (parts.length === 0)
|
|
183
|
+
return "";
|
|
184
|
+
const body = parts.join(" ");
|
|
185
|
+
if (opts.renderMode === "nested") {
|
|
186
|
+
return `Tool surface: ${body}`;
|
|
187
|
+
}
|
|
188
|
+
return ["## Tool Surface", "", body].join("\n");
|
|
189
|
+
}
|
|
125
190
|
const SECTION_SEPARATOR = "\n\n---\n\n";
|
|
126
191
|
/**
|
|
127
192
|
* Compose all manifest-declared context for a unit type using the v2
|
|
@@ -173,15 +173,19 @@ export const UNIT_REGISTRY = {
|
|
|
173
173
|
phaseChain: ["completion"],
|
|
174
174
|
toolContract: {
|
|
175
175
|
allowedGsdTools: [
|
|
176
|
+
"gsd_exec",
|
|
176
177
|
"gsd_slice_complete",
|
|
177
178
|
"gsd_task_reopen",
|
|
178
179
|
"gsd_replan_slice",
|
|
179
180
|
"gsd_decision_save",
|
|
181
|
+
"gsd_capture_thought",
|
|
180
182
|
"gsd_requirement_update",
|
|
181
183
|
"gsd_summary_save",
|
|
182
184
|
"subagent",
|
|
183
185
|
],
|
|
184
186
|
requiredWorkflowTools: [
|
|
187
|
+
"gsd_exec",
|
|
188
|
+
"gsd_capture_thought",
|
|
185
189
|
"gsd_slice_complete",
|
|
186
190
|
"gsd_task_reopen",
|
|
187
191
|
"gsd_replan_slice",
|
|
@@ -207,8 +211,21 @@ export const UNIT_REGISTRY = {
|
|
|
207
211
|
scopeClass: "execute-task",
|
|
208
212
|
phaseChain: ["execution"],
|
|
209
213
|
toolContract: {
|
|
210
|
-
allowedGsdTools: [
|
|
211
|
-
|
|
214
|
+
allowedGsdTools: [
|
|
215
|
+
"gsd_task_complete",
|
|
216
|
+
"gsd_exec",
|
|
217
|
+
"gsd_exec_search",
|
|
218
|
+
"gsd_resume",
|
|
219
|
+
"gsd_capture_thought",
|
|
220
|
+
"gsd_decision_save",
|
|
221
|
+
],
|
|
222
|
+
requiredWorkflowTools: [
|
|
223
|
+
"gsd_task_complete",
|
|
224
|
+
"gsd_exec",
|
|
225
|
+
"gsd_exec_search",
|
|
226
|
+
"gsd_resume",
|
|
227
|
+
"gsd_capture_thought",
|
|
228
|
+
],
|
|
212
229
|
},
|
|
213
230
|
},
|
|
214
231
|
"execute-task-simple": {
|
|
@@ -216,8 +233,21 @@ export const UNIT_REGISTRY = {
|
|
|
216
233
|
scopeClass: "execute-task",
|
|
217
234
|
phaseChain: ["execution_simple", "execution"],
|
|
218
235
|
toolContract: {
|
|
219
|
-
allowedGsdTools: [
|
|
220
|
-
|
|
236
|
+
allowedGsdTools: [
|
|
237
|
+
"gsd_task_complete",
|
|
238
|
+
"gsd_exec",
|
|
239
|
+
"gsd_exec_search",
|
|
240
|
+
"gsd_resume",
|
|
241
|
+
"gsd_capture_thought",
|
|
242
|
+
"gsd_decision_save",
|
|
243
|
+
],
|
|
244
|
+
requiredWorkflowTools: [
|
|
245
|
+
"gsd_task_complete",
|
|
246
|
+
"gsd_exec",
|
|
247
|
+
"gsd_exec_search",
|
|
248
|
+
"gsd_resume",
|
|
249
|
+
"gsd_capture_thought",
|
|
250
|
+
],
|
|
221
251
|
},
|
|
222
252
|
},
|
|
223
253
|
"reactive-execute": {
|
|
@@ -128,7 +128,7 @@ export function isValidMilestoneVerdict(verdict) {
|
|
|
128
128
|
* Extract the UAT type from content, defaulting to `"artifact-driven"`.
|
|
129
129
|
*
|
|
130
130
|
* The `"artifact-driven"` fallback is the original default used throughout
|
|
131
|
-
* the codebase when a UAT file
|
|
131
|
+
* the codebase when a UAT file has no parseable UAT mode declaration.
|
|
132
132
|
*/
|
|
133
133
|
export function getUatType(content) {
|
|
134
134
|
return getDeclaredUatType(content);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Host-owned verification verdict policy for auto-mode units.
|
|
3
|
+
export const NO_HOST_CHECKS_FAILURE_CONTEXT = "No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
|
|
3
4
|
export function decideVerificationVerdict(unitType, result) {
|
|
4
5
|
if (unitType === "execute-task" && result.discoverySource === "task-plan-prose" && result.checks.length === 0) {
|
|
5
6
|
return {
|
|
@@ -14,7 +15,7 @@ export function decideVerificationVerdict(unitType, result) {
|
|
|
14
15
|
passed: false,
|
|
15
16
|
reason: "no-host-checks",
|
|
16
17
|
retryable: false,
|
|
17
|
-
failureContext:
|
|
18
|
+
failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
21
|
if (!result.passed) {
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
6
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
7
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
8
|
+
import { normalizeWorkflowEventCommand } from "./workflow-event-vocabulary.js";
|
|
9
|
+
export const WORKFLOW_EVENT_LOG_FILENAME = "event-log.jsonl";
|
|
10
|
+
export function resolveWorkflowEventLedgerLocation(basePath, originalProjectRoot) {
|
|
11
|
+
const contract = resolveGsdPathContract(basePath, originalProjectRoot);
|
|
12
|
+
return {
|
|
13
|
+
projectRoot: contract.projectRoot,
|
|
14
|
+
workRoot: contract.workRoot,
|
|
15
|
+
projectGsd: contract.projectGsd,
|
|
16
|
+
worktreeGsd: contract.worktreeGsd,
|
|
17
|
+
projectLogPath: join(contract.projectGsd, WORKFLOW_EVENT_LOG_FILENAME),
|
|
18
|
+
worktreeLogPath: contract.worktreeGsd
|
|
19
|
+
? join(contract.worktreeGsd, WORKFLOW_EVENT_LOG_FILENAME)
|
|
20
|
+
: null,
|
|
21
|
+
isWorktree: contract.isWorktree,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function workflowEventLogPath(basePath) {
|
|
25
|
+
return resolveWorkflowEventLedgerLocation(basePath).projectLogPath;
|
|
26
|
+
}
|
|
27
|
+
export function workflowEventArchivePath(basePath, milestoneId) {
|
|
28
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
29
|
+
return join(location.projectGsd, `event-log-${milestoneId}.jsonl.archived`);
|
|
30
|
+
}
|
|
31
|
+
export function readWorktreeEventLogPath(worktreeBasePath) {
|
|
32
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
33
|
+
return location.worktreeLogPath ?? location.projectLogPath;
|
|
34
|
+
}
|
|
35
|
+
export function buildWorkflowEvent(event, sessionId) {
|
|
36
|
+
const hash = createHash("sha256")
|
|
37
|
+
.update(JSON.stringify({ cmd: event.cmd, params: event.params }))
|
|
38
|
+
.digest("hex")
|
|
39
|
+
.slice(0, 16);
|
|
40
|
+
return {
|
|
41
|
+
v: 2,
|
|
42
|
+
...event,
|
|
43
|
+
hash,
|
|
44
|
+
session_id: sessionId,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function appendWorkflowEvent(basePath, event, sessionId) {
|
|
48
|
+
const fullEvent = buildWorkflowEvent(event, sessionId);
|
|
49
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
50
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
51
|
+
appendFileSync(location.projectLogPath, `${JSON.stringify(fullEvent)}\n`, "utf-8");
|
|
52
|
+
emitWorkflowEventAudit(location.projectRoot, fullEvent);
|
|
53
|
+
return fullEvent;
|
|
54
|
+
}
|
|
55
|
+
export function writeWorkflowEventLog(basePath, events) {
|
|
56
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
57
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
58
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
59
|
+
atomicWriteSync(location.projectLogPath, content);
|
|
60
|
+
}
|
|
61
|
+
export function writeWorktreeEventLog(worktreeBasePath, events) {
|
|
62
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
63
|
+
const logPath = location.worktreeLogPath ?? location.projectLogPath;
|
|
64
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
65
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
66
|
+
atomicWriteSync(logPath, content);
|
|
67
|
+
}
|
|
68
|
+
function emitWorkflowEventAudit(basePath, event) {
|
|
69
|
+
if (!isUnifiedAuditEnabled())
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const normalized = normalizeWorkflowEventCommand(event.cmd) ?? "unknown";
|
|
73
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
74
|
+
traceId: event.session_id,
|
|
75
|
+
category: "orchestration",
|
|
76
|
+
type: `workflow-event-${normalized}`,
|
|
77
|
+
payload: {
|
|
78
|
+
cmd: event.cmd,
|
|
79
|
+
params: event.params,
|
|
80
|
+
actor: event.actor,
|
|
81
|
+
actorName: event.actor_name,
|
|
82
|
+
triggerReason: event.trigger_reason,
|
|
83
|
+
eventTs: event.ts,
|
|
84
|
+
hash: event.hash,
|
|
85
|
+
},
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Best-effort: audit projection must never block the workflow event ledger.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function normalizeWorkflowEventCommand(cmd) {
|
|
2
|
+
return typeof cmd === "string" ? cmd.replace(/-/g, "_") : null;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Workflow progress events are keyed by the domain entity they mutate.
|
|
6
|
+
* Keep command aliases and conflict identity in this module so replay,
|
|
7
|
+
* conflict detection, and tests do not each grow their own vocabulary.
|
|
8
|
+
*/
|
|
9
|
+
export function workflowEventEntityKey(event) {
|
|
10
|
+
const p = event.params;
|
|
11
|
+
const cmd = normalizeWorkflowEventCommand(event.cmd);
|
|
12
|
+
if (!cmd)
|
|
13
|
+
return null;
|
|
14
|
+
switch (cmd) {
|
|
15
|
+
case "complete_task":
|
|
16
|
+
case "start_task":
|
|
17
|
+
case "skip_task":
|
|
18
|
+
case "report_blocker":
|
|
19
|
+
case "record_verification":
|
|
20
|
+
case "plan_task":
|
|
21
|
+
return typeof p["taskId"] === "string"
|
|
22
|
+
? { type: "task", id: p["taskId"] }
|
|
23
|
+
: null;
|
|
24
|
+
case "complete_slice":
|
|
25
|
+
case "replan_slice":
|
|
26
|
+
return typeof p["sliceId"] === "string"
|
|
27
|
+
? { type: "slice", id: p["sliceId"] }
|
|
28
|
+
: null;
|
|
29
|
+
case "plan_slice":
|
|
30
|
+
return typeof p["sliceId"] === "string"
|
|
31
|
+
? { type: "slice_plan", id: p["sliceId"] }
|
|
32
|
+
: null;
|
|
33
|
+
case "complete_milestone":
|
|
34
|
+
case "plan_milestone":
|
|
35
|
+
return typeof p["milestoneId"] === "string"
|
|
36
|
+
? { type: "milestone", id: p["milestoneId"] }
|
|
37
|
+
: null;
|
|
38
|
+
case "save_decision":
|
|
39
|
+
if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
|
|
40
|
+
return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
default:
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|