@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- 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/bg-shell/utilities.js +3 -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 +30 -4
- 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 +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- 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 +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- 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/captures.js +4 -6
- 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 +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +26 -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 +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -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 +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +23 -5
- 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/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- 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 +2 -2
- 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 +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- 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 +6 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -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/tool-surface-readiness.js +56 -0
- 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 +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- 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-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- 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/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- 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-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- 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 +13 -13
- 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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +2 -2
- 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/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/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 +9 -1
- 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 +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +116 -39
- 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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/bg-shell/utilities.ts +3 -0
- 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 +34 -4
- 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 +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- 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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- 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/captures.ts +4 -6
- 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 +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +37 -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 +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -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 +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -28
- 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/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- 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 +2 -2
- 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 +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- 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 +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -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/auto-start-orphan-bootstrap.test.ts +236 -0
- 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/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- 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/db-writer.test.ts +15 -4
- 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 +148 -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 +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -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/notification-store.test.ts +32 -0
- 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/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- 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-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -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-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -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-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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 +76 -0
- 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 +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- 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-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- 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/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- 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-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- 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/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -16,7 +16,8 @@ import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
|
16
16
|
import { isClosedStatus } from "../status-guards.js";
|
|
17
17
|
import { saveFile, clearParseCache } from "../files.js";
|
|
18
18
|
import { invalidateStateCache } from "../state.js";
|
|
19
|
-
import {
|
|
19
|
+
import { stripIdPrefix } from "../workflow-projections.js";
|
|
20
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
20
21
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
22
|
import { appendEvent } from "../workflow-events.js";
|
|
22
23
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -166,7 +167,7 @@ export async function handleCompleteMilestone(params, basePath) {
|
|
|
166
167
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
167
168
|
// the event log entry (critical for worktree reconciliation).
|
|
168
169
|
try {
|
|
169
|
-
await
|
|
170
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
170
171
|
}
|
|
171
172
|
catch (projErr) {
|
|
172
173
|
logWarning("tool", `complete-milestone projection warning: ${projErr.message}`);
|
|
@@ -17,12 +17,11 @@ import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../path
|
|
|
17
17
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
18
18
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
19
19
|
import { saveFile, clearParseCache } from "../files.js";
|
|
20
|
-
import {
|
|
20
|
+
import { classifyUatContent, escalatesArtifactUatToBrowser } from "../uat-policy.js";
|
|
21
21
|
import { invalidateStateCache } from "../state.js";
|
|
22
|
-
import { renderRoadmapFromDb } from "../markdown-renderer.js";
|
|
23
|
-
import { parseRoadmap } from "../parsers-legacy.js";
|
|
22
|
+
import { renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "../markdown-renderer.js";
|
|
24
23
|
import { isStaleWrite } from "../auto/turn-epoch.js";
|
|
25
|
-
import {
|
|
24
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
26
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
27
26
|
import { appendEvent } from "../workflow-events.js";
|
|
28
27
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -55,9 +54,11 @@ function hasCompleteSliceArtifactContract(basePath, milestoneId, sliceId) {
|
|
|
55
54
|
join(gsdProjectionRoot(basePath), "milestones", milestoneId, `${milestoneId}-ROADMAP.md`);
|
|
56
55
|
if (!existsSync(roadmapPath))
|
|
57
56
|
return false;
|
|
57
|
+
// Projection-completeness check (ADR-017): the DB has already recorded the
|
|
58
|
+
// duplicate completion; this only verifies the rendered markdown artifacts
|
|
59
|
+
// exist and reflect it, deciding whether re-rendering is needed.
|
|
58
60
|
try {
|
|
59
|
-
|
|
60
|
-
return roadmap.slices.some((slice) => slice.id === sliceId && slice.done);
|
|
61
|
+
return roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sliceId);
|
|
61
62
|
}
|
|
62
63
|
catch {
|
|
63
64
|
return false;
|
|
@@ -288,10 +289,18 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
288
289
|
// `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
|
|
289
290
|
// browser-executable receive browser tools (UAT_MODE_POLICIES).
|
|
290
291
|
const uatContent = params.uatContent || "";
|
|
291
|
-
const
|
|
292
|
-
if (
|
|
292
|
+
const uatPolicy = classifyUatContent(uatContent);
|
|
293
|
+
if (escalatesArtifactUatToBrowser(uatPolicy)) {
|
|
294
|
+
// Distinguish an explicit artifact-driven declaration from a missing or
|
|
295
|
+
// unparseable one that merely *defaulted* to artifact-driven — telling an
|
|
296
|
+
// agent it "declared artifact-driven" when its declaration simply failed
|
|
297
|
+
// to parse sends it into a rewrite loop with the same unparseable format.
|
|
298
|
+
const staticOnlyClause = `which only runs static/file checks and would defer the browser work to a human`;
|
|
299
|
+
const modeClause = uatPolicy.modeDeclared
|
|
300
|
+
? `declares "UAT mode: artifact-driven", ${staticOnlyClause}`
|
|
301
|
+
: `has no parseable UAT mode declaration in its "## UAT Type" section (the declaration must be a bullet exactly like "- UAT mode: browser-executable"), so it defaults to "artifact-driven", ${staticOnlyClause}`;
|
|
293
302
|
return {
|
|
294
|
-
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but
|
|
303
|
+
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but ${modeClause}. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
|
|
295
304
|
};
|
|
296
305
|
}
|
|
297
306
|
// ── Atomic completion cascade (guards + writes in one transaction) ───────
|
|
@@ -388,8 +397,9 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
388
397
|
await saveFile(uatPath, uatMd);
|
|
389
398
|
const roadmap = await renderRoadmapFromDb(artifactBasePath, params.milestoneId);
|
|
390
399
|
clearParseCache();
|
|
391
|
-
|
|
392
|
-
|
|
400
|
+
// Render verification (ADR-017): confirms the just-written projection
|
|
401
|
+
// reflects the DB completion; the DB row is already committed.
|
|
402
|
+
if (!roadmapRenderMarksSliceDone(roadmap.content, params.sliceId)) {
|
|
393
403
|
throw new Error(`roadmap render did not mark ${params.milestoneId}/${params.sliceId} complete`);
|
|
394
404
|
}
|
|
395
405
|
}
|
|
@@ -438,7 +448,7 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
438
448
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
439
449
|
// the event log entry (critical for worktree reconciliation).
|
|
440
450
|
try {
|
|
441
|
-
await
|
|
451
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
442
452
|
}
|
|
443
453
|
catch (projErr) {
|
|
444
454
|
logWarning("tool", `complete-slice projection warning for ${params.milestoneId}/${params.sliceId}: ${projErr.message}`);
|
|
@@ -18,7 +18,8 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
18
18
|
import { saveFile, clearParseCache } from "../files.js";
|
|
19
19
|
import { invalidateStateCache } from "../state.js";
|
|
20
20
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
21
|
-
import {
|
|
21
|
+
import { renderSummaryContent } from "../workflow-projections.js";
|
|
22
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
22
23
|
import { writeManifest } from "../workflow-manifest.js";
|
|
23
24
|
import { appendEvent } from "../workflow-events.js";
|
|
24
25
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -358,7 +359,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
358
359
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
359
360
|
// the event log entry (critical for worktree reconciliation).
|
|
360
361
|
try {
|
|
361
|
-
await
|
|
362
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
362
363
|
}
|
|
363
364
|
catch (projErr) {
|
|
364
365
|
logWarning("tool", `complete-task projection warning: ${projErr.message}`);
|
|
@@ -4,7 +4,7 @@ import { EXEC_DEFAULTS, runExecSandbox, } from "../exec-sandbox.js";
|
|
|
4
4
|
import { realpathSync } from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { isContextModeEnabled } from "../preferences-types.js";
|
|
7
|
-
import {
|
|
7
|
+
import { projectRootFromWorktreePath } from "../worktree-root.js";
|
|
8
8
|
import { contextModeDisabledResult } from "./context-mode-tool-result.js";
|
|
9
9
|
const UAT_EXEC_INTENTS = [
|
|
10
10
|
"uat-artifact-check",
|
|
@@ -142,13 +142,10 @@ function normalizeScanPath(value) {
|
|
|
142
142
|
}
|
|
143
143
|
function parseWorktreeBase(baseDir) {
|
|
144
144
|
const normalizedBase = normalizeScanPath(baseDir);
|
|
145
|
-
const
|
|
146
|
-
if (!
|
|
145
|
+
const originalRoot = projectRootFromWorktreePath(normalizedBase);
|
|
146
|
+
if (!originalRoot)
|
|
147
147
|
return null;
|
|
148
|
-
return {
|
|
149
|
-
originalRoot: normalizedBase.slice(0, segment.gsdIdx),
|
|
150
|
-
worktreeRoot: normalizedBase,
|
|
151
|
-
};
|
|
148
|
+
return { originalRoot, worktreeRoot: normalizedBase };
|
|
152
149
|
}
|
|
153
150
|
function pathInside(parent, target) {
|
|
154
151
|
const parentWithSep = parent.endsWith("/") ? parent : `${parent}/`;
|
|
@@ -345,6 +342,7 @@ function formatResult(result) {
|
|
|
345
342
|
exit_code: result.exit_code,
|
|
346
343
|
signal: result.signal,
|
|
347
344
|
timed_out: result.timed_out,
|
|
345
|
+
force_resolved: result.force_resolved,
|
|
348
346
|
duration_ms: result.duration_ms,
|
|
349
347
|
stdout_bytes: result.stdout_bytes,
|
|
350
348
|
stderr_bytes: result.stderr_bytes,
|
|
@@ -358,6 +356,10 @@ function formatResult(result) {
|
|
|
358
356
|
};
|
|
359
357
|
}
|
|
360
358
|
function formatExit(result) {
|
|
359
|
+
// force_resolved means a non-closing (D-state) child was force-resolved past its
|
|
360
|
+
// hard deadline rather than observed exiting; distinguish it from a clean timeout.
|
|
361
|
+
if (result.force_resolved)
|
|
362
|
+
return "timeout(force-killed)";
|
|
361
363
|
if (result.timed_out)
|
|
362
364
|
return "timeout";
|
|
363
365
|
if (result.signal)
|
|
@@ -7,12 +7,13 @@ import { getGateIdsForTurn } from "../gate-registry.js";
|
|
|
7
7
|
import { transaction, getMilestone, getSlice, getSliceTasks, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, setSliceSketchFlag, deleteTask, deleteArtifactByPath, } from "../gsd-db.js";
|
|
8
8
|
import { invalidateStateCache } from "../state.js";
|
|
9
9
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
10
|
-
import {
|
|
10
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
11
11
|
import { writeManifest } from "../workflow-manifest.js";
|
|
12
12
|
import { appendEvent } from "../workflow-events.js";
|
|
13
13
|
import { logWarning } from "../workflow-logger.js";
|
|
14
14
|
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
15
|
-
import {
|
|
15
|
+
import { runTaskPathChecks } from "../pre-execution-checks.js";
|
|
16
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
16
17
|
import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
|
|
17
18
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
18
19
|
import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets } from "../repository-registry.js";
|
|
@@ -193,11 +194,16 @@ function validateTaskPathsBeforePersist(params, basePath, defaultTargets, allowe
|
|
|
193
194
|
const additionalRoots = allowedRoots
|
|
194
195
|
.map((root) => resolve(root))
|
|
195
196
|
.filter((root) => root !== baseRoot);
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
const resolvedCanonicalRoot = resolve(resolveWorktreeProjectRoot(basePath));
|
|
198
|
+
const canonicalProjectRoot = resolvedCanonicalRoot !== baseRoot ? resolvedCanonicalRoot : undefined;
|
|
199
|
+
const hasContext = additionalRoots.length > 0 || canonicalProjectRoot !== undefined;
|
|
200
|
+
const context = hasContext
|
|
201
|
+
? {
|
|
202
|
+
...(additionalRoots.length > 0 ? { additionalRoots } : {}),
|
|
203
|
+
...(canonicalProjectRoot !== undefined ? { canonicalProjectRoot } : {}),
|
|
204
|
+
}
|
|
205
|
+
: undefined;
|
|
206
|
+
const checks = runTaskPathChecks(taskRows, basePath, context);
|
|
201
207
|
const blocking = checks.filter((check) => !check.passed && check.blocking);
|
|
202
208
|
if (blocking.length === 0)
|
|
203
209
|
return null;
|
|
@@ -361,7 +367,7 @@ export async function handlePlanSlice(rawParams, basePath) {
|
|
|
361
367
|
clearParseCache();
|
|
362
368
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
363
369
|
try {
|
|
364
|
-
await
|
|
370
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
365
371
|
writeManifest(basePath);
|
|
366
372
|
appendEvent(basePath, {
|
|
367
373
|
cmd: "plan-slice",
|
|
@@ -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,16 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
|
|
3
|
-
import {
|
|
3
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
4
|
+
import { extractUatType, UAT_TYPE_KEYWORDS } from "./files.js";
|
|
4
5
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
5
6
|
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
6
|
-
export const UAT_TYPES =
|
|
7
|
-
"artifact-driven",
|
|
8
|
-
"browser-executable",
|
|
9
|
-
"runtime-executable",
|
|
10
|
-
"live-runtime",
|
|
11
|
-
"mixed",
|
|
12
|
-
"human-experience",
|
|
13
|
-
];
|
|
7
|
+
export const UAT_TYPES = UAT_TYPE_KEYWORDS;
|
|
14
8
|
export const UAT_MODE_POLICIES = {
|
|
15
9
|
"artifact-driven": {
|
|
16
10
|
browserTools: false,
|
|
@@ -55,23 +49,55 @@ export function isUatType(value) {
|
|
|
55
49
|
export function getDeclaredUatType(content) {
|
|
56
50
|
return extractUatType(content) ?? "artifact-driven";
|
|
57
51
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
62
59
|
? "browser-executable"
|
|
63
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);
|
|
64
87
|
return {
|
|
65
88
|
declaredType,
|
|
89
|
+
modeDeclared: parsedType !== undefined,
|
|
66
90
|
effectiveType,
|
|
67
91
|
browserRequired,
|
|
68
92
|
shouldDispatchByDefault: effectiveType !== "artifact-driven" || browserRequired,
|
|
69
93
|
};
|
|
70
94
|
}
|
|
71
|
-
export function
|
|
72
|
-
const policy = classifyUatContent(content);
|
|
95
|
+
export function escalatesArtifactUatToBrowser(policy) {
|
|
73
96
|
return policy.declaredType === "artifact-driven" && policy.browserRequired;
|
|
74
97
|
}
|
|
98
|
+
export function shouldEscalateArtifactUatToBrowser(content) {
|
|
99
|
+
return escalatesArtifactUatToBrowser(classifyUatContent(content));
|
|
100
|
+
}
|
|
75
101
|
export function resolveEffectiveUatType(content) {
|
|
76
102
|
return classifyUatContent(content).effectiveType;
|
|
77
103
|
}
|
|
@@ -84,7 +110,7 @@ export function uatTypeIncludesBrowser(uatType) {
|
|
|
84
110
|
export function isUatBrowserToolName(toolName) {
|
|
85
111
|
const parsed = parseMcpToolName(toolName);
|
|
86
112
|
const canonicalName = parsed?.toolName ?? toolName;
|
|
87
|
-
if (canonicalName
|
|
113
|
+
if (hasBrowserContractPrefix(canonicalName))
|
|
88
114
|
return true;
|
|
89
115
|
return parsed?.toolName === "*" && parsed.serverName.toLowerCase().includes("browser");
|
|
90
116
|
}
|