@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0-dev.5fc22c6f
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/README.md +11 -11
- package/dist/cli.js +17 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
- package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
- package/dist/resources/extensions/gsd/auto-start.js +4 -3
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
- package/dist/resources/extensions/gsd/auto.js +32 -10
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/engine.js +4 -1
- package/dist/resources/extensions/gsd/db/queries.js +39 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +55 -3
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
- package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
- package/dist/resources/extensions/gsd/git-service.js +61 -8
- package/dist/resources/extensions/gsd/gitignore.js +4 -1
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
- package/dist/resources/extensions/gsd/guided-flow.js +40 -2
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +3 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/metrics.js +4 -4
- package/dist/resources/extensions/gsd/migrate-external.js +22 -5
- package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
- package/dist/resources/extensions/gsd/preferences.js +29 -2
- package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
- package/dist/resources/extensions/gsd/state.js +12 -611
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
- package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
- package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
- package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/undo.js +43 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +11 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- 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 +9 -9
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page_client-reference-manifest.js +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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- 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/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -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 +25 -11
- 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-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- 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 +26 -841
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- 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 +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.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 +18 -0
- 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/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.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 +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
- package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
- package/src/resources/extensions/gsd/auto-start.ts +4 -3
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
- package/src/resources/extensions/gsd/auto.ts +36 -8
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/engine.ts +8 -1
- package/src/resources/extensions/gsd/db/queries.ts +40 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +61 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
- package/src/resources/extensions/gsd/doctor-types.ts +8 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
- package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
- package/src/resources/extensions/gsd/git-service.ts +70 -9
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
- package/src/resources/extensions/gsd/guided-flow.ts +45 -2
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +2 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/metrics.ts +4 -4
- package/src/resources/extensions/gsd/migrate-external.ts +17 -4
- package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
- package/src/resources/extensions/gsd/preferences.ts +38 -4
- package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
- package/src/resources/extensions/gsd/state.ts +32 -732
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
- package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
- package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
- package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/undo.ts +47 -6
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +11 -3
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
- package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Auto-mode artifact verification and worktree path fallbacks.
|
|
3
|
+
import { parseUnitId } from "./unit-id.js";
|
|
4
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
5
|
+
import { clearParseCache } from "./files.js";
|
|
6
|
+
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
7
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGatesForTurn, } from "./gsd-db.js";
|
|
8
|
+
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
9
|
+
import { isValidationTerminal } from "./state.js";
|
|
10
|
+
import { getErrorMessage } from "./error-utils.js";
|
|
11
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
12
|
+
import { resolveSlicePath, resolveSliceFile, resolveTasksDir, resolveTaskFiles, relSliceFile, resolveMilestoneFile, clearPathCache, resolveGsdRootFile, } from "./paths.js";
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
16
|
+
import { dirname, join, resolve } from "node:path";
|
|
17
|
+
import { resolveExpectedArtifactPath, resolveExistingSliceResearchPath, } from "./auto-artifact-paths.js";
|
|
18
|
+
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
19
|
+
import { hasVerdict } from "./verdict-parser.js";
|
|
20
|
+
import { validateArtifact } from "./schemas/validate.js";
|
|
21
|
+
import { getProjectResearchStatus } from "./project-research-policy.js";
|
|
22
|
+
import { isGsdWorktreePath } from "./worktree-root.js";
|
|
23
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
24
|
+
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
25
|
+
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
26
|
+
import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
|
|
27
|
+
import { proveMilestoneCloseout } from "./milestone-closeout-proof.js";
|
|
28
|
+
/**
|
|
29
|
+
* Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
|
|
30
|
+
* Production leaves this null so the real parseLegacyRoadmap runs; tests inject
|
|
31
|
+
* a throwing function to deterministically exercise the parse-failure catches.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
let _roadmapParserFn = null;
|
|
35
|
+
/**
|
|
36
|
+
* Inject an override for the legacy roadmap parser, returning a function that
|
|
37
|
+
* restores the default (real parser) behavior. No production caller.
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export function _setRoadmapParserFnForTests(fn) {
|
|
41
|
+
const previous = _roadmapParserFn;
|
|
42
|
+
_roadmapParserFn = fn;
|
|
43
|
+
return () => { _roadmapParserFn = previous; };
|
|
44
|
+
}
|
|
45
|
+
function parseRoadmapForRecovery(content) {
|
|
46
|
+
if (_roadmapParserFn)
|
|
47
|
+
return _roadmapParserFn(content);
|
|
48
|
+
return parseLegacyRoadmap(content);
|
|
49
|
+
}
|
|
50
|
+
/** Slice count for plan-milestone verification; shared by scoped and legacy paths. */
|
|
51
|
+
export function countPlanMilestoneRoadmapSlices(content) {
|
|
52
|
+
return parseRoadmapForRecovery(content).slices.length;
|
|
53
|
+
}
|
|
54
|
+
export function diagnoseWorktreeIntegrityFailure(basePath) {
|
|
55
|
+
if (!isGsdWorktreePath(basePath))
|
|
56
|
+
return null;
|
|
57
|
+
if (!existsSync(basePath)) {
|
|
58
|
+
return `Worktree integrity failure: ${basePath} does not exist. Repair or recreate the worktree before retrying.`;
|
|
59
|
+
}
|
|
60
|
+
const gitPath = join(basePath, ".git");
|
|
61
|
+
if (!existsSync(gitPath)) {
|
|
62
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (.git missing). Repair or recreate the worktree before retrying.`;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
execFileSync("git", ["rev-parse", "--git-dir"], {
|
|
66
|
+
cwd: basePath,
|
|
67
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
68
|
+
encoding: "utf-8",
|
|
69
|
+
});
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return `Worktree integrity failure: ${basePath} is not a valid git worktree (git rev-parse failed: ${getErrorMessage(err).split("\n")[0]}). Repair or recreate the worktree before retrying.`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function resolveArtifactVerificationBase(unitId, base) {
|
|
77
|
+
const { milestone } = parseUnitId(unitId);
|
|
78
|
+
if (!MILESTONE_ID_RE.test(milestone))
|
|
79
|
+
return base;
|
|
80
|
+
return resolveCanonicalMilestoneRoot(base, milestone);
|
|
81
|
+
}
|
|
82
|
+
function hasCapturedWorkflowPrefs(base) {
|
|
83
|
+
const prefsPath = resolveExpectedArtifactPath("workflow-preferences", "WORKFLOW-PREFS", base);
|
|
84
|
+
if (!prefsPath || !existsSync(prefsPath))
|
|
85
|
+
return false;
|
|
86
|
+
const content = readFileSync(prefsPath, "utf-8");
|
|
87
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
88
|
+
return !!match && /^workflow_prefs_captured:\s*true\s*$/m.test(match[1]);
|
|
89
|
+
}
|
|
90
|
+
function hasValidResearchDecision(base) {
|
|
91
|
+
const decisionPath = resolveExpectedArtifactPath("research-decision", "RESEARCH-DECISION", base);
|
|
92
|
+
if (!decisionPath || !existsSync(decisionPath))
|
|
93
|
+
return false;
|
|
94
|
+
try {
|
|
95
|
+
const cfg = JSON.parse(readFileSync(decisionPath, "utf-8"));
|
|
96
|
+
return cfg.decision === "research" || cfg.decision === "skip";
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function hasCompleteProjectResearch(base) {
|
|
103
|
+
return getProjectResearchStatus(base).complete;
|
|
104
|
+
}
|
|
105
|
+
function escapeRegExp(value) {
|
|
106
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
107
|
+
}
|
|
108
|
+
function hasCheckedTaskCompletionOnDisk(base, mid, sid, tid) {
|
|
109
|
+
const slicePath = resolveSlicePath(base, mid, sid);
|
|
110
|
+
if (!slicePath)
|
|
111
|
+
return false;
|
|
112
|
+
const planAbs = resolveSliceFile(base, mid, sid, "PLAN");
|
|
113
|
+
if (!planAbs || !existsSync(planAbs))
|
|
114
|
+
return false;
|
|
115
|
+
const planContent = readFileSync(planAbs, "utf-8");
|
|
116
|
+
const cbRe = new RegExp(`^\\s*-\\s+\\[[xX]\\]\\s+\\*\\*${escapeRegExp(tid)}(?:\\*\\*)?:`, "m");
|
|
117
|
+
return cbRe.test(planContent);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check whether the expected artifact(s) for a unit exist on disk.
|
|
121
|
+
* Returns true if all required artifacts exist, or if the unit type has no
|
|
122
|
+
* single verifiable artifact (e.g., replan-slice).
|
|
123
|
+
*/
|
|
124
|
+
export function verifyExpectedArtifact(unitType, unitId, base) {
|
|
125
|
+
if (unitType.startsWith("hook/"))
|
|
126
|
+
return true;
|
|
127
|
+
clearPathCache();
|
|
128
|
+
clearParseCache();
|
|
129
|
+
if (unitType === "rewrite-docs") {
|
|
130
|
+
const overridesPath = resolveGsdRootFile(base, "OVERRIDES");
|
|
131
|
+
if (!existsSync(overridesPath))
|
|
132
|
+
return true;
|
|
133
|
+
const content = readFileSync(overridesPath, "utf-8");
|
|
134
|
+
return !content.includes("**Scope:** active");
|
|
135
|
+
}
|
|
136
|
+
if (unitType === "workflow-preferences") {
|
|
137
|
+
return hasCapturedWorkflowPrefs(base);
|
|
138
|
+
}
|
|
139
|
+
if (unitType === "triage-captures") {
|
|
140
|
+
const pending = loadPendingCaptures(base);
|
|
141
|
+
if (pending.length === 0)
|
|
142
|
+
return true;
|
|
143
|
+
logWarning("recovery", `verify-fail triage-captures ${unitId}: ${pending.length} pending capture(s) remain in CAPTURES.md`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (unitType === "quick-task") {
|
|
147
|
+
const { slice: captureId } = parseUnitId(unitId);
|
|
148
|
+
const capture = captureId ? loadAllCaptures(base).find((entry) => entry.id === captureId) : undefined;
|
|
149
|
+
if (capture?.executed === true)
|
|
150
|
+
return true;
|
|
151
|
+
logWarning("recovery", `verify-fail quick-task ${unitId}: capture ${captureId ?? "(missing capture id)"} not found or not marked executed`);
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
if (unitType === "discuss-project") {
|
|
155
|
+
const projectPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
156
|
+
return !!projectPath && existsSync(projectPath) && validateArtifact(projectPath, "project").ok;
|
|
157
|
+
}
|
|
158
|
+
if (unitType === "discuss-requirements") {
|
|
159
|
+
const requirementsPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
160
|
+
return !!requirementsPath && existsSync(requirementsPath) && validateArtifact(requirementsPath, "requirements").ok;
|
|
161
|
+
}
|
|
162
|
+
if (unitType === "research-decision") {
|
|
163
|
+
return hasValidResearchDecision(base);
|
|
164
|
+
}
|
|
165
|
+
if (unitType === "research-project") {
|
|
166
|
+
return hasCompleteProjectResearch(base);
|
|
167
|
+
}
|
|
168
|
+
if (unitType === "reactive-execute") {
|
|
169
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
170
|
+
if (!mid || !sid || !batchPart)
|
|
171
|
+
return false;
|
|
172
|
+
const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
173
|
+
if (blockerPath && existsSync(blockerPath)) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
const slicePath = resolveSlicePath(base, mid, sid);
|
|
177
|
+
if (!slicePath)
|
|
178
|
+
return false;
|
|
179
|
+
const plusIdx = batchPart.indexOf("+");
|
|
180
|
+
if (plusIdx === -1) {
|
|
181
|
+
const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
|
|
182
|
+
const summaryFiles = resolveTaskFiles(tDir, "SUMMARY");
|
|
183
|
+
return summaryFiles.length > 0;
|
|
184
|
+
}
|
|
185
|
+
const batchIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
|
|
186
|
+
if (batchIds.length === 0)
|
|
187
|
+
return false;
|
|
188
|
+
const tDir = resolveTasksDir(base, mid, sid) ?? slicePath;
|
|
189
|
+
const existingSummaries = new Set(resolveTaskFiles(tDir, "SUMMARY").map((f) => f.replace(/-SUMMARY\.md$/i, "").toUpperCase()));
|
|
190
|
+
for (const tid of batchIds) {
|
|
191
|
+
if (!existingSummaries.has(tid.toUpperCase()))
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
if (unitType === "gate-evaluate") {
|
|
197
|
+
const { milestone: mid, slice: sid, task: batchPart } = parseUnitId(unitId);
|
|
198
|
+
if (!mid || !sid || !batchPart)
|
|
199
|
+
return false;
|
|
200
|
+
const plusIdx = batchPart.indexOf("+");
|
|
201
|
+
if (plusIdx === -1)
|
|
202
|
+
return true;
|
|
203
|
+
const gateIds = batchPart.slice(plusIdx + 1).split(",").filter(Boolean);
|
|
204
|
+
if (gateIds.length === 0)
|
|
205
|
+
return true;
|
|
206
|
+
try {
|
|
207
|
+
if (!isDbAvailable())
|
|
208
|
+
return false;
|
|
209
|
+
const pending = getPendingGatesForTurn(mid, sid, "gate-evaluate");
|
|
210
|
+
const pendingIds = new Set(pending.map((g) => g.gate_id));
|
|
211
|
+
for (const gid of gateIds) {
|
|
212
|
+
if (pendingIds.has(gid))
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
218
|
+
}
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
if (unitType === "research-slice" && unitId.endsWith("/parallel-research")) {
|
|
222
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
223
|
+
if (!mid)
|
|
224
|
+
return false;
|
|
225
|
+
const blockerPath = resolveExpectedArtifactPath(unitType, unitId, base);
|
|
226
|
+
if (blockerPath && existsSync(blockerPath)) {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
const roadmapFile = resolveExpectedArtifactPath("plan-milestone", mid, base);
|
|
230
|
+
if (!roadmapFile || !existsSync(roadmapFile)) {
|
|
231
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap missing`);
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const roadmap = parseRoadmapForRecovery(readFileSync(roadmapFile, "utf-8"));
|
|
236
|
+
const milestoneResearchFile = resolveExpectedArtifactPath("research-milestone", mid, base);
|
|
237
|
+
const hasMilestoneResearch = !!milestoneResearchFile && existsSync(milestoneResearchFile);
|
|
238
|
+
for (const slice of roadmap.slices) {
|
|
239
|
+
if (slice.done)
|
|
240
|
+
continue;
|
|
241
|
+
if (hasMilestoneResearch && slice.id === "S01")
|
|
242
|
+
continue;
|
|
243
|
+
const depsComplete = (slice.depends ?? []).every((depId) => {
|
|
244
|
+
const summaryPath = resolveExpectedArtifactPath("complete-slice", `${mid}/${depId}`, base);
|
|
245
|
+
return !!summaryPath && existsSync(summaryPath);
|
|
246
|
+
});
|
|
247
|
+
if (!depsComplete)
|
|
248
|
+
continue;
|
|
249
|
+
if (!resolveExistingSliceResearchPath(base, mid, slice.id)) {
|
|
250
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: slice ${slice.id} missing RESEARCH`);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
logWarning("recovery", `parallel-research verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const artifactBase = resolveArtifactVerificationBase(unitId, base);
|
|
262
|
+
let absPath = resolveExpectedArtifactPath(unitType, unitId, artifactBase);
|
|
263
|
+
if (!absPath || !existsSync(absPath)) {
|
|
264
|
+
const projectRoot = resolve(resolveWorktreeProjectRoot(artifactBase));
|
|
265
|
+
if (projectRoot && projectRoot !== artifactBase) {
|
|
266
|
+
const projectPath = resolveExpectedArtifactPath(unitType, unitId, projectRoot);
|
|
267
|
+
if (projectPath && existsSync(projectPath)) {
|
|
268
|
+
absPath = projectPath;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (!absPath) {
|
|
273
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: resolveExpectedArtifactPath returned null (no artifact contract registered for this unit type)`);
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
if (!existsSync(absPath)) {
|
|
277
|
+
const worktreeFailure = diagnoseWorktreeIntegrityFailure(artifactBase);
|
|
278
|
+
if (worktreeFailure) {
|
|
279
|
+
logError("recovery", `${worktreeFailure} Unit: ${unitType} ${unitId}.`);
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: existsSync false for ${absPath}`);
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
if (unitType === "validate-milestone") {
|
|
286
|
+
const validationContent = readFileSync(absPath, "utf-8");
|
|
287
|
+
if (!isValidationTerminal(validationContent)) {
|
|
288
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: validation not terminal (len=${validationContent.length}) at ${absPath}`);
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (unitType === "run-uat") {
|
|
293
|
+
const assessmentContent = readFileSync(absPath, "utf-8");
|
|
294
|
+
if (!hasVerdict(assessmentContent)) {
|
|
295
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: assessment missing verdict at ${absPath}`);
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (unitType === "plan-milestone") {
|
|
300
|
+
try {
|
|
301
|
+
if (countPlanMilestoneRoadmapSlices(readFileSync(absPath, "utf-8")) === 0) {
|
|
302
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (unitType === "plan-slice") {
|
|
312
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
313
|
+
if (mid && sid) {
|
|
314
|
+
try {
|
|
315
|
+
let taskIds = null;
|
|
316
|
+
let dbPrimary = false;
|
|
317
|
+
if (isDbAvailable()) {
|
|
318
|
+
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
319
|
+
if (refreshed) {
|
|
320
|
+
const tasks = getSliceTasks(mid, sid);
|
|
321
|
+
if (tasks.length > 0) {
|
|
322
|
+
taskIds = tasks.map(t => t.id);
|
|
323
|
+
dbPrimary = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (!taskIds) {
|
|
328
|
+
const planContent = readFileSync(absPath, "utf-8");
|
|
329
|
+
const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+/m.test(planContent);
|
|
330
|
+
const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
331
|
+
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
332
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
const plan = parseLegacyPlan(planContent);
|
|
336
|
+
if (plan.tasks.length > 0)
|
|
337
|
+
taskIds = plan.tasks.map((t) => t.id);
|
|
338
|
+
}
|
|
339
|
+
if (taskIds && taskIds.length > 0) {
|
|
340
|
+
const tasksDir = join(dirname(absPath), "tasks");
|
|
341
|
+
if (existsSync(tasksDir)) {
|
|
342
|
+
for (const tid of taskIds) {
|
|
343
|
+
const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
|
|
344
|
+
const taskSummaryFile = join(tasksDir, `${tid}-SUMMARY.md`);
|
|
345
|
+
if (!existsSync(taskPlanFile) && !existsSync(taskSummaryFile)) {
|
|
346
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: task artifact missing for ${tid}`);
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else if (!dbPrimary && !absPath.replace(/\\/g, "/").includes(`.gsd/${LAYOUT_SEGMENTS.level1}`)) {
|
|
352
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: tasks dir missing at ${tasksDir}`);
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (unitType === "execute-task") {
|
|
363
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
364
|
+
if (mid && sid && tid) {
|
|
365
|
+
const dbTask = getTask(mid, sid, tid);
|
|
366
|
+
if (dbTask) {
|
|
367
|
+
if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else if (!isDbAvailable()) {
|
|
372
|
+
if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid))
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (unitType === "complete-slice") {
|
|
381
|
+
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
382
|
+
if (mid && sid) {
|
|
383
|
+
const uatPath = resolveSliceFile(base, mid, sid, "UAT")
|
|
384
|
+
?? join(base, relSliceFile(base, mid, sid, "UAT"));
|
|
385
|
+
if (!existsSync(uatPath))
|
|
386
|
+
return false;
|
|
387
|
+
const dbSlice = getSlice(mid, sid);
|
|
388
|
+
if (dbSlice) {
|
|
389
|
+
if (dbSlice.status !== "complete")
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
else if (!isDbAvailable()) {
|
|
393
|
+
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
394
|
+
if (roadmapFile && existsSync(roadmapFile)) {
|
|
395
|
+
try {
|
|
396
|
+
const roadmapContent = readFileSync(roadmapFile, "utf-8");
|
|
397
|
+
const roadmap = parseRoadmapForRecovery(roadmapContent);
|
|
398
|
+
const slice = roadmap.slices.find((s) => s.id === sid);
|
|
399
|
+
if (slice && !slice.done)
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
catch (e) {
|
|
403
|
+
logWarning("recovery", `roadmap parse failed: ${e.message}`);
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (unitType === "complete-milestone") {
|
|
411
|
+
const { milestone: mid } = parseUnitId(unitId);
|
|
412
|
+
if (!mid)
|
|
413
|
+
return false;
|
|
414
|
+
const closeoutProof = proveMilestoneCloseout(mid, {
|
|
415
|
+
refreshFromDisk: true,
|
|
416
|
+
summaryArtifactBasePath: artifactBase,
|
|
417
|
+
implementationEvidence: {
|
|
418
|
+
basePath: base,
|
|
419
|
+
requirement: "not-absent",
|
|
420
|
+
},
|
|
421
|
+
});
|
|
422
|
+
if (!closeoutProof.ok) {
|
|
423
|
+
if (!isDbAvailable() && closeoutProof.reason === "db-unavailable") {
|
|
424
|
+
const summaryOutcome = classifyMilestoneSummaryContent(readFileSync(absPath, "utf-8"));
|
|
425
|
+
return summaryOutcome !== "failure" && hasImplementationArtifacts(base, mid) !== "absent";
|
|
426
|
+
}
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
@@ -78,6 +78,8 @@ export class AutoSession {
|
|
|
78
78
|
currentUnitRouting = null;
|
|
79
79
|
currentMilestoneId = null;
|
|
80
80
|
sourceObservations = new SourceObservationStore();
|
|
81
|
+
/** Live tool-surface snapshot for dashboard / runtime telemetry while auto is active. */
|
|
82
|
+
toolSurfaceSnapshot = null;
|
|
81
83
|
// ── Model state ──────────────────────────────────────────────────────────
|
|
82
84
|
autoModeStartModel = null;
|
|
83
85
|
/** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
|
|
@@ -122,6 +124,13 @@ export class AutoSession {
|
|
|
122
124
|
* the issues after MAX_PRE_EXEC_RETRIES re-attempts.
|
|
123
125
|
*/
|
|
124
126
|
preExecRetryCount = new Map();
|
|
127
|
+
/**
|
|
128
|
+
* Tracks how many times each slice unit has been re-dispatched to plan-slice
|
|
129
|
+
* because task plan files were missing. Keyed by unitId (e.g. "M001/S01").
|
|
130
|
+
* Separate from preExecRetryCount so pre-exec gate failures do not block or
|
|
131
|
+
* conflate with missing-task-plan recovery.
|
|
132
|
+
*/
|
|
133
|
+
missingTaskPlanRetryCount = new Map();
|
|
125
134
|
// ── Tool invocation errors (#2883) ──────────────────────────────────
|
|
126
135
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
127
136
|
* JSON arguments. Checked by postUnitPreVerification to break retry loops. */
|
|
@@ -270,6 +279,7 @@ export class AutoSession {
|
|
|
270
279
|
this.unitRecoveryCount.clear();
|
|
271
280
|
// Unit
|
|
272
281
|
this.clearCurrentUnit();
|
|
282
|
+
this.toolSurfaceSnapshot = null;
|
|
273
283
|
this.currentTraceId = null;
|
|
274
284
|
this.currentTurnId = null;
|
|
275
285
|
this.currentUnitRouting = null;
|
|
@@ -307,6 +317,7 @@ export class AutoSession {
|
|
|
307
317
|
this.consecutiveCompleteBootstraps = 0;
|
|
308
318
|
this.lastPreExecFailure = null;
|
|
309
319
|
this.preExecRetryCount.clear();
|
|
320
|
+
this.missingTaskPlanRetryCount.clear();
|
|
310
321
|
this.lastToolInvocationError = null;
|
|
311
322
|
this.toolUnavailableRetries = 0;
|
|
312
323
|
this.lastUnitAgentEndMessages = null;
|
|
@@ -25,7 +25,7 @@ export function decideVerificationRetry(input) {
|
|
|
25
25
|
return { action: "pause", reason: "missing-retry-context" };
|
|
26
26
|
}
|
|
27
27
|
const key = verificationRetryKey(unitType, retryInfo.unitId);
|
|
28
|
-
const failureHash = hashVerificationFailureContext(retryInfo.failureContext);
|
|
28
|
+
const failureHash = hashVerificationFailureContext(retryInfo.signature ?? retryInfo.failureContext);
|
|
29
29
|
if (input.previousFailureHash === failureHash) {
|
|
30
30
|
return {
|
|
31
31
|
action: "pause",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
import { gsdRoot, resolveDir, resolveFile, resolveMilestonePath, resolveMilestoneFile, resolveSliceFile, relMilestoneFile, relSliceFile, buildTaskFileName, resolveSlicePath, resolveTasksDir, dirIsMetaOnlyLegacyMilestone, } from "./paths.js";
|
|
9
9
|
import { milestoneIdToPhaseNum } from "./layout-policy.js";
|
|
10
10
|
import { parseUnitId } from "./unit-id.js";
|
|
11
|
-
import { dirname, join } from "node:path";
|
|
11
|
+
import { dirname, join, relative } from "node:path";
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
12
13
|
function resolveMilestoneArtifactPath(base, mid, suffix) {
|
|
13
14
|
const existing = resolveProjectedMilestoneFile(base, mid, suffix) ?? resolveProjectMilestoneFile(base, mid, suffix);
|
|
14
15
|
if (existing)
|
|
@@ -281,3 +282,29 @@ export function diagnoseExpectedArtifact(unitType, unitId, base) {
|
|
|
281
282
|
return null;
|
|
282
283
|
}
|
|
283
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Resolve slice RESEARCH with worktree projection first, then canonical
|
|
287
|
+
* project-root path. Shared by dispatch rules, execute-task prompts, and
|
|
288
|
+
* artifact verification.
|
|
289
|
+
*/
|
|
290
|
+
export function resolveSliceResearchLocation(basePath, mid, sid) {
|
|
291
|
+
const projectedFile = resolveSliceFile(basePath, mid, sid, "RESEARCH");
|
|
292
|
+
if (projectedFile) {
|
|
293
|
+
return {
|
|
294
|
+
absolutePath: projectedFile,
|
|
295
|
+
relativePath: relSliceFile(basePath, mid, sid, "RESEARCH"),
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
const canonicalPath = resolveExpectedArtifactPath("research-slice", `${mid}/${sid}`, basePath);
|
|
299
|
+
if (canonicalPath && existsSync(canonicalPath)) {
|
|
300
|
+
return {
|
|
301
|
+
absolutePath: canonicalPath,
|
|
302
|
+
relativePath: relative(basePath, canonicalPath),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return { absolutePath: null, relativePath: null };
|
|
306
|
+
}
|
|
307
|
+
/** Returns the absolute RESEARCH path when it exists, otherwise null. */
|
|
308
|
+
export function resolveExistingSliceResearchPath(basePath, mid, sid) {
|
|
309
|
+
return resolveSliceResearchLocation(basePath, mid, sid).absolutePath;
|
|
310
|
+
}
|
|
@@ -68,6 +68,10 @@ export function resolveCompactionThresholdPercent(raw) {
|
|
|
68
68
|
const value = typeof raw === "number" && Number.isFinite(raw) && raw >= 0.5 && raw <= 0.95 ? raw : 0.6;
|
|
69
69
|
return value <= 1 ? value * 100 : value;
|
|
70
70
|
}
|
|
71
|
-
export
|
|
71
|
+
export const HARD_CONTEXT_REROOT_THRESHOLD_PERCENT = 90;
|
|
72
|
+
export function shouldWarnStepSessionForContext(contextPercent, compactionThresholdPercent) {
|
|
72
73
|
return getContextPauseAction(contextPercent, resolveCompactionThresholdPercent(compactionThresholdPercent)) === "pause";
|
|
73
74
|
}
|
|
75
|
+
export function shouldRerootStepSessionForContext(contextPercent) {
|
|
76
|
+
return getContextPauseAction(contextPercent, HARD_CONTEXT_REROOT_THRESHOLD_PERCENT) === "pause";
|
|
77
|
+
}
|
|
@@ -40,7 +40,7 @@ import { detectWorktreeName } from "./worktree.js";
|
|
|
40
40
|
import { probeGitConflictState } from "./git-conflict-state.js";
|
|
41
41
|
import { runTurnGitAction } from "./git-service.js";
|
|
42
42
|
import { parseUnitId } from "./unit-id.js";
|
|
43
|
-
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
43
|
+
import { resolveExpectedArtifactPath, resolveExistingSliceResearchPath } from "./auto-artifact-paths.js";
|
|
44
44
|
import { formatCloseoutProofBlock, proveMilestoneCloseout, } from "./milestone-closeout-proof.js";
|
|
45
45
|
function resolveExistingExpectedArtifact(unitType, unitId, basePath) {
|
|
46
46
|
const artifactPath = resolveExpectedArtifactPath(unitType, unitId, basePath);
|
|
@@ -596,7 +596,7 @@ export const DISPATCH_RULES = [
|
|
|
596
596
|
},
|
|
597
597
|
},
|
|
598
598
|
{
|
|
599
|
-
name: "uat-verdict-gate (non-PASS
|
|
599
|
+
name: "uat-verdict-gate (non-PASS observed; closeout enforces)",
|
|
600
600
|
match: async ({ mid, basePath, prefs }) => {
|
|
601
601
|
// Only applies when UAT dispatch is enabled
|
|
602
602
|
if (!prefs?.uat_dispatch)
|
|
@@ -611,9 +611,9 @@ export const DISPATCH_RULES = [
|
|
|
611
611
|
continue;
|
|
612
612
|
const { verdict, uatType } = result;
|
|
613
613
|
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
614
|
-
//
|
|
615
|
-
// so follow-up slices can remediate, while
|
|
616
|
-
// enforces manual UAT PASS sign-off before closure.
|
|
614
|
+
// Observe non-PASS verdicts without hard-stopping auto-mode. Allow
|
|
615
|
+
// progression so follow-up slices can remediate, while
|
|
616
|
+
// complete-milestone still enforces manual UAT PASS sign-off before closure.
|
|
617
617
|
continue;
|
|
618
618
|
}
|
|
619
619
|
}
|
|
@@ -902,9 +902,19 @@ export const DISPATCH_RULES = [
|
|
|
902
902
|
const sliceContextFile = resolveSliceFile(basePath, mid, state.activeSlice.id, "CONTEXT");
|
|
903
903
|
if (sliceContextFile && existsSync(sliceContextFile))
|
|
904
904
|
return null; // discussion already done, proceed
|
|
905
|
+
const closedSliceIds = getClosedSliceIds(mid);
|
|
906
|
+
const justClosedSliceId = closedSliceIds[closedSliceIds.length - 1];
|
|
907
|
+
let priorVerdictWarning = "";
|
|
908
|
+
if (justClosedSliceId) {
|
|
909
|
+
const prior = await readUatGateVerdict(basePath, mid, justClosedSliceId);
|
|
910
|
+
if (prior && !isAcceptableUatVerdict(prior.verdict, prior.uatType)) {
|
|
911
|
+
priorVerdictWarning =
|
|
912
|
+
` Note: the slice just closed (${justClosedSliceId}) recorded a non-PASS UAT verdict (${prior.verdict.toUpperCase()}); review before continuing.`;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
905
915
|
return {
|
|
906
916
|
action: "stop",
|
|
907
|
-
reason: `Slice ${state.activeSlice.id} requires discussion before planning (require_slice_discussion is enabled). Run /gsd discuss to discuss this slice, then /gsd auto to resume
|
|
917
|
+
reason: `Slice ${state.activeSlice.id} requires discussion before planning (require_slice_discussion is enabled). Run /gsd discuss to discuss this slice, then /gsd auto to resume.${priorVerdictWarning}`,
|
|
908
918
|
level: "warning",
|
|
909
919
|
};
|
|
910
920
|
},
|
|
@@ -939,7 +949,7 @@ export const DISPATCH_RULES = [
|
|
|
939
949
|
if (slice.done)
|
|
940
950
|
continue;
|
|
941
951
|
// Skip if already has research
|
|
942
|
-
if (
|
|
952
|
+
if (resolveExistingSliceResearchPath(basePath, mid, slice.id))
|
|
943
953
|
continue;
|
|
944
954
|
// Skip if dependencies aren't done (check for SUMMARY files)
|
|
945
955
|
const depsComplete = slice.depends.every((depId) => !!resolveExistingExpectedArtifact("complete-slice", `${mid}/${depId}`, basePath));
|
|
@@ -980,9 +990,7 @@ export const DISPATCH_RULES = [
|
|
|
980
990
|
return missingSliceStop(mid, state.phase);
|
|
981
991
|
const sid = state.activeSlice.id;
|
|
982
992
|
const sTitle = state.activeSlice.title;
|
|
983
|
-
|
|
984
|
-
resolveSliceFile(basePath, mid, sid, "RESEARCH");
|
|
985
|
-
if (researchFile)
|
|
993
|
+
if (resolveExistingSliceResearchPath(basePath, mid, sid))
|
|
986
994
|
return null; // has research, fall through
|
|
987
995
|
return {
|
|
988
996
|
action: "dispatch",
|
|
@@ -1240,6 +1248,7 @@ export const DISPATCH_RULES = [
|
|
|
1240
1248
|
const sid = state.activeSlice.id;
|
|
1241
1249
|
const sTitle = state.activeSlice.title;
|
|
1242
1250
|
const tid = state.activeTask.id;
|
|
1251
|
+
const unitId = `${mid}/${sid}`;
|
|
1243
1252
|
const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
|
|
1244
1253
|
// Guard: if the slice plan exists but the individual task plan files are
|
|
1245
1254
|
// missing, the planner created S##-PLAN.md with task entries but never
|
|
@@ -1265,6 +1274,17 @@ export const DISPATCH_RULES = [
|
|
|
1265
1274
|
if ((!taskPlanPath || !existsSync(taskPlanPath)) &&
|
|
1266
1275
|
!existsSync(projectionTaskPlanPath) &&
|
|
1267
1276
|
!tasksEmbeddedInSlicePlan) {
|
|
1277
|
+
const MAX_MISSING_TASK_PLAN_RETRIES = 2;
|
|
1278
|
+
const retryCount = session?.missingTaskPlanRetryCount?.get(unitId) ?? 0;
|
|
1279
|
+
if (retryCount >= MAX_MISSING_TASK_PLAN_RETRIES) {
|
|
1280
|
+
session?.missingTaskPlanRetryCount?.delete(unitId);
|
|
1281
|
+
return {
|
|
1282
|
+
action: "stop",
|
|
1283
|
+
reason: `Missing task-plan recovery failed ${retryCount} times for ${unitId} - manual intervention required. Task plan ${tid} is still missing after regenerating the slice plan. Fix the task-plan files manually, then run /gsd auto to resume.`,
|
|
1284
|
+
level: "error",
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
session?.missingTaskPlanRetryCount?.set(unitId, retryCount + 1);
|
|
1268
1288
|
if (isDebugEnabled()) {
|
|
1269
1289
|
const expectedTaskPlanPath = join(artifactBasePath, relTaskFile(artifactBasePath, mid, sid, tid, "PLAN"));
|
|
1270
1290
|
const originalProjectRoot = session?.originalBasePath || basePath;
|
|
@@ -1288,10 +1308,11 @@ export const DISPATCH_RULES = [
|
|
|
1288
1308
|
return {
|
|
1289
1309
|
action: "dispatch",
|
|
1290
1310
|
unitType: "plan-slice",
|
|
1291
|
-
unitId
|
|
1311
|
+
unitId,
|
|
1292
1312
|
prompt: await buildPlanSlicePrompt(mid, midTitle, sid, sTitle, basePath, undefined, { sessionContextWindow, modelRegistry, sessionProvider }),
|
|
1293
1313
|
};
|
|
1294
1314
|
}
|
|
1315
|
+
session?.missingTaskPlanRetryCount?.delete(unitId);
|
|
1295
1316
|
return null;
|
|
1296
1317
|
},
|
|
1297
1318
|
},
|