@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.965d1788
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 +1 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +11 -2
- package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
- package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +12 -3
- package/dist/resources/extensions/gsd/auto/session.js +3 -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-dispatch.js +20 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +26 -11
- package/dist/resources/extensions/gsd/auto-recovery.js +6 -507
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +38 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +6 -1
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +16 -19
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +68 -10
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -10
- package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -3
- package/dist/resources/extensions/gsd/db/queries.js +60 -0
- package/dist/resources/extensions/gsd/db-workspace.js +55 -3
- package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +45 -9
- package/dist/resources/extensions/gsd/flat-phase-migration.js +45 -0
- package/dist/resources/extensions/gsd/forensics.js +2 -32
- package/dist/resources/extensions/gsd/git-service.js +5 -4
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
- package/dist/resources/extensions/gsd/health-widget.js +55 -29
- package/dist/resources/extensions/gsd/json-persistence.js +20 -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 +8 -9
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
- package/dist/resources/extensions/gsd/metrics.js +4 -4
- 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/milestone-implementation-evidence.js +26 -20
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/quick.js +45 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/session-forensics.js +11 -1
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -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 +45 -2
- 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 +2 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +43 -14
- package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
- package/dist/resources/extensions/gsd/undo.js +43 -6
- package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
- package/dist/resources/extensions/gsd/unit-registry.js +32 -4
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +33 -3
- package/dist/resources/extensions/gsd/validation-block-guard.js +9 -4
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +4 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +44 -2
- 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/visualizer/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/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/node-pty/build/Makefile +1 -1
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +1 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +2 -0
- 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/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/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 -829
- 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 +258 -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-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/README.md +1 -1
- package/packages/mcp-server/dist/server.d.ts +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +3 -3
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +34 -20
- 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/package.json +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/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/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/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +80 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
- package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
- package/src/resources/extensions/gsd/auto/session.ts +6 -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-dispatch.ts +21 -23
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +38 -12
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -508
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +43 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +6 -1
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -19
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +74 -10
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +14 -9
- package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +32 -3
- package/src/resources/extensions/gsd/db/queries.ts +79 -0
- package/src/resources/extensions/gsd/db-workspace.ts +61 -3
- package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/flat-phase-migration.ts +44 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -33
- package/src/resources/extensions/gsd/git-service.ts +6 -5
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
- package/src/resources/extensions/gsd/health-widget.ts +69 -32
- package/src/resources/extensions/gsd/json-persistence.ts +20 -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 +8 -11
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
- package/src/resources/extensions/gsd/metrics.ts +4 -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/milestone-implementation-evidence.ts +35 -21
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/quick.ts +43 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/session-forensics.ts +11 -1
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -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 +81 -7
- 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-recovery.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
- 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/complete-slice.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +55 -2
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +37 -2
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
- package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
- 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/knowledge-cold-start.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -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/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +195 -1
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +193 -14
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +53 -15
- package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
- package/src/resources/extensions/gsd/undo.ts +47 -6
- package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
- package/src/resources/extensions/gsd/unit-registry.ts +32 -4
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +41 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +13 -7
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +4 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -1
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
- package/dist/web/standalone/.next/static/chunks/webpack-f46ea08200a0227e.js +0 -1
- /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → -ji77QJck2IKIwrGza1Bs}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → -ji77QJck2IKIwrGza1Bs}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,7 @@ import { existsSync } from "node:fs";
|
|
|
13
13
|
import { transaction, getMilestone, getMilestoneSlices, getSliceTasks, getLatestAssessmentByScope, updateMilestoneStatus, } from "../gsd-db.js";
|
|
14
14
|
import { clearPathCache, relMilestoneFile } from "../paths.js";
|
|
15
15
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
16
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
16
|
+
import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
|
|
17
17
|
import { saveFile, clearParseCache } from "../files.js";
|
|
18
18
|
import { invalidateStateCache } from "../state.js";
|
|
19
19
|
import { stripIdPrefix } from "../workflow-projections.js";
|
|
@@ -118,7 +118,7 @@ export async function handleCompleteMilestone(params, basePath) {
|
|
|
118
118
|
guardError = `no slices found for milestone ${params.milestoneId}`;
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
|
-
const incompleteSlices = slices.filter(s => !isClosedStatus(s.status));
|
|
121
|
+
const incompleteSlices = slices.filter(s => !isClosedStatus(s.status) && !isDeferredStatus(s.status));
|
|
122
122
|
if (incompleteSlices.length > 0) {
|
|
123
123
|
const incompleteIds = incompleteSlices.map(s => `${s.id} (status: ${s.status})`).join(", ");
|
|
124
124
|
guardError = `incomplete slices: ${incompleteIds}`;
|
|
@@ -126,6 +126,8 @@ export async function handleCompleteMilestone(params, basePath) {
|
|
|
126
126
|
}
|
|
127
127
|
// Deep check: verify all tasks in all slices are complete
|
|
128
128
|
for (const slice of slices) {
|
|
129
|
+
if (isDeferredStatus(slice.status))
|
|
130
|
+
continue;
|
|
129
131
|
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
130
132
|
const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
|
|
131
133
|
if (incompleteTasks.length > 0) {
|
|
@@ -21,7 +21,7 @@ import { classifyUatContent, escalatesArtifactUatToBrowser } from "../uat-policy
|
|
|
21
21
|
import { invalidateStateCache } from "../state.js";
|
|
22
22
|
import { renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "../markdown-renderer.js";
|
|
23
23
|
import { isStaleWrite } from "../auto/turn-epoch.js";
|
|
24
|
-
import {
|
|
24
|
+
import { renderMilestoneShellProjections } from "../workflow-projections.js";
|
|
25
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
26
|
import { appendEvent } from "../workflow-events.js";
|
|
27
27
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -458,7 +458,7 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
458
458
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
459
459
|
// the event log entry (critical for worktree reconciliation).
|
|
460
460
|
try {
|
|
461
|
-
await
|
|
461
|
+
await renderMilestoneShellProjections(artifactBasePath, params.milestoneId);
|
|
462
462
|
}
|
|
463
463
|
catch (projErr) {
|
|
464
464
|
logWarning("tool", `complete-slice projection warning for ${params.milestoneId}/${params.sliceId}: ${projErr.message}`);
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Validates inputs, writes task row and rendered SUMMARY.md to DB in a
|
|
7
7
|
* transaction, then renders projections to disk and invalidates caches.
|
|
8
|
-
*
|
|
9
|
-
* back
|
|
8
|
+
* If the critical task summary / plan projection write fails, the DB
|
|
9
|
+
* completion is compensated back to pending so DB state does not drift ahead
|
|
10
|
+
* of PLAN.md.
|
|
10
11
|
*/
|
|
11
|
-
import { existsSync } from "node:fs";
|
|
12
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
12
13
|
import { join } from "node:path";
|
|
13
14
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
15
|
import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
|
|
16
|
+
import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
|
|
15
17
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
16
18
|
import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
17
19
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
@@ -19,8 +21,7 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
19
21
|
import { saveFile, clearParseCache } from "../files.js";
|
|
20
22
|
import { invalidateStateCache } from "../state.js";
|
|
21
23
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
22
|
-
import { renderSummaryContent } from "../workflow-projections.js";
|
|
23
|
-
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
24
|
+
import { renderMilestoneShellProjections, renderSummaryContent, } from "../workflow-projections.js";
|
|
24
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
25
26
|
import { appendEvent } from "../workflow-events.js";
|
|
26
27
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -60,7 +61,7 @@ async function repairMissingTaskSummaryProjection(artifactBasePath, taskRow) {
|
|
|
60
61
|
clearPathCache();
|
|
61
62
|
clearParseCache();
|
|
62
63
|
try {
|
|
63
|
-
await
|
|
64
|
+
await renderMilestoneShellProjections(artifactBasePath, taskRow.milestone_id);
|
|
64
65
|
}
|
|
65
66
|
catch (projErr) {
|
|
66
67
|
logWarning("tool", `complete-task repair projection warning: ${projErr.message}`);
|
|
@@ -181,6 +182,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
181
182
|
let guardError = null;
|
|
182
183
|
let summaryMd = "";
|
|
183
184
|
let repairTaskSummaryRow = null;
|
|
185
|
+
const rollbackDbPath = getWorkflowDatabasePath();
|
|
184
186
|
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
185
187
|
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
186
188
|
// ids, recommendation references a real id). If the payload is malformed
|
|
@@ -317,20 +319,48 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
317
319
|
if (guardError) {
|
|
318
320
|
return { error: guardError };
|
|
319
321
|
}
|
|
320
|
-
let projectionStale = false;
|
|
321
322
|
// Resolve and write summary to disk
|
|
322
323
|
const summaryPath = taskSummaryPath(artifactBasePath, params.milestoneId, params.sliceId, params.taskId);
|
|
323
324
|
try {
|
|
324
325
|
await saveFile(summaryPath, summaryMd);
|
|
325
326
|
// Toggle or regenerate the plan projection from DB. Missing projection
|
|
326
327
|
// files are rebuilt by the renderer instead of being skipped.
|
|
327
|
-
|
|
328
|
+
if (!ensureWorkflowDbAtPath(rollbackDbPath)) {
|
|
329
|
+
throw new Error(`database unavailable before plan projection render for ${params.milestoneId}/${params.sliceId}`);
|
|
330
|
+
}
|
|
331
|
+
const wrotePlan = await renderPlanCheckboxes(artifactBasePath, params.milestoneId, params.sliceId);
|
|
332
|
+
if (!wrotePlan) {
|
|
333
|
+
throw new Error(`plan projection write returned false for ${params.milestoneId}/${params.sliceId}`);
|
|
334
|
+
}
|
|
328
335
|
}
|
|
329
336
|
catch (renderErr) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
337
|
+
logWarning("projection", `complete_task projection write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}`, { error: renderErr.message });
|
|
338
|
+
let rollbackSucceeded = false;
|
|
339
|
+
try {
|
|
340
|
+
ensureWorkflowDbAtPath(rollbackDbPath);
|
|
341
|
+
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
342
|
+
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
|
|
343
|
+
invalidateStateCache();
|
|
344
|
+
rollbackSucceeded = true;
|
|
345
|
+
}
|
|
346
|
+
catch (rollbackErr) {
|
|
347
|
+
logWarning("projection", `complete_task rollback failed after projection write failure for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${rollbackErr.message}`);
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
if (existsSync(summaryPath))
|
|
351
|
+
unlinkSync(summaryPath);
|
|
352
|
+
}
|
|
353
|
+
catch (summaryErr) {
|
|
354
|
+
logWarning("projection", `complete_task could not remove SUMMARY.md after projection write failure for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${summaryErr.message}`);
|
|
355
|
+
}
|
|
356
|
+
// Clear path/parse caches regardless of rollback outcome so stale
|
|
357
|
+
// entries from the failed write attempt don't leak into subsequent calls.
|
|
358
|
+
clearPathCache();
|
|
359
|
+
clearParseCache();
|
|
360
|
+
const returnMsg = rollbackSucceeded
|
|
361
|
+
? `complete_task projection write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}; rolled completion back to pending`
|
|
362
|
+
: `complete_task projection write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}; rollback also failed — task may remain complete with stale plan`;
|
|
363
|
+
return { error: returnMsg };
|
|
334
364
|
}
|
|
335
365
|
// ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
|
|
336
366
|
// Each gate id maps to a specific params field via taskGateFieldForId.
|
|
@@ -435,7 +465,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
435
465
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
436
466
|
// the event log entry (critical for worktree reconciliation).
|
|
437
467
|
try {
|
|
438
|
-
await
|
|
468
|
+
await renderMilestoneShellProjections(artifactBasePath, params.milestoneId);
|
|
439
469
|
}
|
|
440
470
|
catch (projErr) {
|
|
441
471
|
logWarning("tool", `complete-task projection warning: ${projErr.message}`);
|
|
@@ -465,6 +495,5 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
465
495
|
milestoneId: params.milestoneId,
|
|
466
496
|
summaryPath,
|
|
467
497
|
...(escalationMetadata ? { escalation: escalationMetadata } : {}),
|
|
468
|
-
...(projectionStale ? { stale: true } : {}),
|
|
469
498
|
};
|
|
470
499
|
}
|
|
@@ -144,7 +144,7 @@ export async function executeGsdExec(params, deps) {
|
|
|
144
144
|
if (bashReferencesProjectRootOutsideWorktree(script, deps.baseDir)) {
|
|
145
145
|
return paramError("script references the original project root while running inside a milestone worktree; use the active worktree path or relative paths");
|
|
146
146
|
}
|
|
147
|
-
const opts = buildExecOptions(deps.baseDir, deps.preferences?.context_mode, { env: deps.env, now: deps.now, generateId: deps.generateId });
|
|
147
|
+
const opts = buildExecOptions(deps.baseDir, deps.preferences?.context_mode, { env: deps.env, now: deps.now, generateId: deps.generateId, signal: deps.signal });
|
|
148
148
|
const run = deps.run ?? runExecSandbox;
|
|
149
149
|
try {
|
|
150
150
|
const result = await run({
|
|
@@ -235,6 +235,7 @@ function formatResult(result) {
|
|
|
235
235
|
exit_code: result.exit_code,
|
|
236
236
|
signal: result.signal,
|
|
237
237
|
timed_out: result.timed_out,
|
|
238
|
+
aborted: result.aborted === true,
|
|
238
239
|
force_resolved: result.force_resolved,
|
|
239
240
|
duration_ms: result.duration_ms,
|
|
240
241
|
stdout_bytes: result.stdout_bytes,
|
|
@@ -245,12 +246,16 @@ function formatResult(result) {
|
|
|
245
246
|
stderr_path: result.stderr_path,
|
|
246
247
|
meta_path: result.meta_path,
|
|
247
248
|
},
|
|
248
|
-
isError: result.timed_out || result.signal !== null || result.exit_code !== 0,
|
|
249
|
+
isError: result.aborted === true || result.timed_out || result.signal !== null || result.exit_code !== 0,
|
|
249
250
|
};
|
|
250
251
|
}
|
|
251
252
|
function formatExit(result) {
|
|
252
253
|
// force_resolved means a non-closing (D-state) child was force-resolved past its
|
|
253
254
|
// hard deadline rather than observed exiting; distinguish it from a clean timeout.
|
|
255
|
+
if (result.aborted && result.force_resolved)
|
|
256
|
+
return "aborted(force-killed)";
|
|
257
|
+
if (result.aborted)
|
|
258
|
+
return "aborted";
|
|
254
259
|
if (result.force_resolved)
|
|
255
260
|
return "timeout(force-killed)";
|
|
256
261
|
if (result.timed_out)
|
|
@@ -13,6 +13,7 @@ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveSliceFile, resolveTa
|
|
|
13
13
|
import { sendDesktopNotification } from "./notifications.js";
|
|
14
14
|
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
15
15
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
16
|
+
import { UNIT_REGISTRY } from "./unit-registry.js";
|
|
16
17
|
/**
|
|
17
18
|
* Undo the last completed unit: revert git commits,
|
|
18
19
|
* delete summary artifacts, and uncheck the task in PLAN.
|
|
@@ -35,15 +36,19 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
35
36
|
ctx.ui.notify("Nothing to undo — no activity logs found.", "info");
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
|
-
// Extract unit type and ID from the most recent activity log filename
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// Extract unit type and ID from the most recent activity log filename.
|
|
40
|
+
// Both the unit type and the unit ID may contain hyphens, so anchor on the
|
|
41
|
+
// known unit-type vocabulary instead of guessing the unit-ID shape: a regex
|
|
42
|
+
// tuned to milestone-shaped IDs rejects project-level units whose IDs are
|
|
43
|
+
// symbolic (e.g. discuss-project uses PROJECT, workflow-preferences uses
|
|
44
|
+
// WORKFLOW-PREFS).
|
|
45
|
+
const parsed = parseActivityLogFilename(files[0]);
|
|
46
|
+
if (!parsed) {
|
|
42
47
|
ctx.ui.notify("Nothing to undo — could not parse latest activity log.", "warning");
|
|
43
48
|
return;
|
|
44
49
|
}
|
|
45
|
-
const unitType =
|
|
46
|
-
const unitId =
|
|
50
|
+
const unitType = parsed.unitType;
|
|
51
|
+
const unitId = parsed.unitId.replace(/-/g, "/");
|
|
47
52
|
if (!force) {
|
|
48
53
|
ctx.ui.notify(`Will undo: ${unitType} (${unitId})\n` +
|
|
49
54
|
`This will:\n` +
|
|
@@ -87,6 +92,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
87
92
|
if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
|
|
88
93
|
const [mid, sid, tid] = [milestone, slice, task];
|
|
89
94
|
planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
|
|
95
|
+
if (getTask(mid, sid, tid)) {
|
|
96
|
+
updateTaskStatus(mid, sid, tid, "pending");
|
|
97
|
+
await renderPlanCheckboxes(basePath, mid, sid);
|
|
98
|
+
planUpdated = true;
|
|
99
|
+
}
|
|
90
100
|
}
|
|
91
101
|
// 3. Try to revert git commits from activity log
|
|
92
102
|
let commitsReverted = 0;
|
|
@@ -318,6 +328,33 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
|
|
|
318
328
|
ctx.ui.notify(results.join("\n"), "success");
|
|
319
329
|
}
|
|
320
330
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
331
|
+
// Known unit types sorted longest-first so a more specific type (e.g.
|
|
332
|
+
// "execute-task-simple") matches before a prefix of it ("execute-task") when
|
|
333
|
+
// splitting "<seq>-<unitType>-<unitId>.jsonl".
|
|
334
|
+
const UNIT_TYPES_BY_LENGTH_DESC = Object.keys(UNIT_REGISTRY).sort((a, b) => b.length - a.length);
|
|
335
|
+
/**
|
|
336
|
+
* Parse an activity-log filename of the form `<seq>-<unitType>-<unitId>.jsonl`
|
|
337
|
+
* (the format written by activity-log.ts). Both the unit type and the unit ID
|
|
338
|
+
* may contain hyphens, so we anchor on the known unit-type vocabulary rather
|
|
339
|
+
* than guessing the ID shape. This keeps non-milestone IDs (e.g. PROJECT,
|
|
340
|
+
* WORKFLOW-PREFS) parseable. Returns null when the name has no sequence prefix
|
|
341
|
+
* or does not start with a recognised unit type.
|
|
342
|
+
*/
|
|
343
|
+
export function parseActivityLogFilename(filename) {
|
|
344
|
+
const seqMatch = filename.match(/^\d+-(.+)\.jsonl$/);
|
|
345
|
+
if (!seqMatch)
|
|
346
|
+
return null;
|
|
347
|
+
const rest = seqMatch[1];
|
|
348
|
+
for (const unitType of UNIT_TYPES_BY_LENGTH_DESC) {
|
|
349
|
+
const prefix = `${unitType}-`;
|
|
350
|
+
if (rest.startsWith(prefix)) {
|
|
351
|
+
const unitId = rest.slice(prefix.length);
|
|
352
|
+
if (unitId.length > 0)
|
|
353
|
+
return { unitType, unitId };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
321
358
|
export function uncheckTaskInPlan(basePath, mid, sid, tid) {
|
|
322
359
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
323
360
|
if (!slicePath)
|
|
@@ -92,13 +92,27 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE = {
|
|
|
92
92
|
orchestration: "Use `gsd_resume` before resuming orchestration, `gsd_exec_search` to reuse prior runs, and `gsd_exec` for noisy coordination checks.",
|
|
93
93
|
docs: "Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
|
|
94
94
|
};
|
|
95
|
-
// Per-unit overrides win over the lane default.
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
95
|
+
// Per-unit overrides win over the lane default. Some units intentionally run
|
|
96
|
+
// with narrower tool contracts than their shared Context Mode lane, so their
|
|
97
|
+
// guidance must name only tools the unit can actually call.
|
|
98
|
+
export const CONTEXT_MODE_GUIDANCE_BY_UNIT = {
|
|
99
|
+
"discuss-milestone": "Use `ask_user_questions` to continue the milestone interview, then persist outcomes with `gsd_summary_save`, `gsd_decision_save`, `gsd_requirement_save`, `gsd_requirement_update`, `gsd_plan_milestone`, or `gsd_milestone_generate_id` as appropriate.",
|
|
100
|
+
"discuss-slice": "Use `ask_user_questions` to continue the slice interview, then persist outcomes with `gsd_summary_save` or `gsd_decision_save` as appropriate.",
|
|
101
|
+
"discuss-project": "Use `ask_user_questions` to continue the project interview, then persist outcomes with `gsd_summary_save`, `gsd_decision_save`, or `gsd_requirement_save` as appropriate.",
|
|
102
|
+
"discuss-requirements": "Use `ask_user_questions` to continue the requirements interview, then persist outcomes with `gsd_requirement_save` or `gsd_summary_save` as appropriate.",
|
|
103
|
+
"replan-slice": "Use `gsd_replan_slice` to persist the revised slice plan, and `gsd_decision_save` for planning decisions that need durable rationale.",
|
|
104
|
+
"reassess-roadmap": "Use `gsd_milestone_status` to inspect current milestone state, then `gsd_reassess_roadmap` to persist the roadmap reassessment.",
|
|
101
105
|
"run-uat": "Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
|
|
106
|
+
"research-project": "Dispatch parallel scout subagents for stack, features, architecture, and pitfalls research; each writes one file under `.gsd/research/` (`STACK.md`, `FEATURES.md`, `ARCHITECTURE.md`, `PITFALLS.md`).",
|
|
107
|
+
"gate-evaluate": "Use `subagent` to dispatch tester agents, then persist each gate with `gsd_save_gate_result`; rely on testers for verification evidence.",
|
|
108
|
+
};
|
|
109
|
+
// Per-unit guidance for the nested render mode (renderMode: "nested"), used when this
|
|
110
|
+
// unit's Context Mode line is embedded into a subagent prompt — e.g. the tester prompts
|
|
111
|
+
// dispatched by gate-evaluate. Must instruct the subagent on what IT should do, not
|
|
112
|
+
// re-state the parent coordinator's dispatch instructions. Falls back to
|
|
113
|
+
// CONTEXT_MODE_GUIDANCE_BY_UNIT then the lane default when no nested entry exists.
|
|
114
|
+
export const CONTEXT_MODE_NESTED_GUIDANCE_BY_UNIT = {
|
|
115
|
+
"gate-evaluate": "Run verification checks to answer the gate question, then persist the verdict with `gsd_save_gate_result`.",
|
|
102
116
|
};
|
|
103
117
|
/**
|
|
104
118
|
* Render the Context Mode instruction lane for a unit type. Unknown unit
|
|
@@ -112,7 +126,9 @@ export function composeContextModeInstructions(unitType, opts) {
|
|
|
112
126
|
if (!manifest || manifest.contextMode === "none")
|
|
113
127
|
return "";
|
|
114
128
|
const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
|
|
115
|
-
const guidance =
|
|
129
|
+
const guidance = (opts.renderMode === "nested" ? CONTEXT_MODE_NESTED_GUIDANCE_BY_UNIT[unitType] : undefined)
|
|
130
|
+
?? CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType]
|
|
131
|
+
?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
|
|
116
132
|
if (opts.renderMode === "nested") {
|
|
117
133
|
return `Context Mode (${lane} lane): ${guidance}`;
|
|
118
134
|
}
|
|
@@ -51,7 +51,13 @@ export const UNIT_REGISTRY = {
|
|
|
51
51
|
scopeClass: "standard",
|
|
52
52
|
phaseChain: ["research"],
|
|
53
53
|
toolContract: {
|
|
54
|
-
allowedGsdTools: [
|
|
54
|
+
allowedGsdTools: [
|
|
55
|
+
"gsd_summary_save",
|
|
56
|
+
"gsd_decision_save",
|
|
57
|
+
"gsd_exec",
|
|
58
|
+
"gsd_exec_search",
|
|
59
|
+
"gsd_resume",
|
|
60
|
+
],
|
|
55
61
|
requiredWorkflowTools: ["gsd_summary_save"],
|
|
56
62
|
},
|
|
57
63
|
},
|
|
@@ -107,7 +113,15 @@ export const UNIT_REGISTRY = {
|
|
|
107
113
|
scopeClass: "section-close",
|
|
108
114
|
phaseChain: ["validation", "planning"],
|
|
109
115
|
toolContract: {
|
|
110
|
-
allowedGsdTools: [
|
|
116
|
+
allowedGsdTools: [
|
|
117
|
+
"gsd_milestone_status",
|
|
118
|
+
"gsd_exec",
|
|
119
|
+
"gsd_exec_search",
|
|
120
|
+
"gsd_resume",
|
|
121
|
+
"gsd_validate_milestone",
|
|
122
|
+
"gsd_reassess_roadmap",
|
|
123
|
+
"subagent",
|
|
124
|
+
],
|
|
111
125
|
requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
|
|
112
126
|
},
|
|
113
127
|
},
|
|
@@ -118,6 +132,9 @@ export const UNIT_REGISTRY = {
|
|
|
118
132
|
toolContract: {
|
|
119
133
|
allowedGsdTools: [
|
|
120
134
|
"gsd_milestone_status",
|
|
135
|
+
"gsd_exec",
|
|
136
|
+
"gsd_exec_search",
|
|
137
|
+
"gsd_resume",
|
|
121
138
|
"gsd_requirement_update",
|
|
122
139
|
"gsd_summary_save",
|
|
123
140
|
"gsd_complete_milestone",
|
|
@@ -197,6 +214,8 @@ export const UNIT_REGISTRY = {
|
|
|
197
214
|
allowedGsdTools: [
|
|
198
215
|
"gsd_milestone_status",
|
|
199
216
|
"gsd_exec",
|
|
217
|
+
"gsd_exec_search",
|
|
218
|
+
"gsd_resume",
|
|
200
219
|
"gsd_slice_complete",
|
|
201
220
|
"gsd_task_reopen",
|
|
202
221
|
"gsd_replan_slice",
|
|
@@ -279,7 +298,13 @@ export const UNIT_REGISTRY = {
|
|
|
279
298
|
scopeClass: "execute-task",
|
|
280
299
|
phaseChain: ["execution"],
|
|
281
300
|
toolContract: {
|
|
282
|
-
allowedGsdTools: [
|
|
301
|
+
allowedGsdTools: [
|
|
302
|
+
"gsd_milestone_status",
|
|
303
|
+
"gsd_task_complete",
|
|
304
|
+
"gsd_exec",
|
|
305
|
+
"gsd_summary_save",
|
|
306
|
+
"gsd_decision_save",
|
|
307
|
+
],
|
|
283
308
|
requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
|
|
284
309
|
},
|
|
285
310
|
},
|
|
@@ -366,12 +391,15 @@ export const UNIT_REGISTRY = {
|
|
|
366
391
|
requiredWorkflowTools: ["ask_user_questions"],
|
|
367
392
|
},
|
|
368
393
|
},
|
|
394
|
+
// research-project dispatches 4 parallel scout subagents (Task calls); each scout
|
|
395
|
+
// writes one file under .gsd/research/ directly. The parent coordinator does not
|
|
396
|
+
// call gsd_summary_save or gsd_decision_save — the scouts own their own output.
|
|
369
397
|
"research-project": {
|
|
370
398
|
kind: "primary",
|
|
371
399
|
scopeClass: "standard",
|
|
372
400
|
phaseChain: ["research"],
|
|
373
401
|
toolContract: {
|
|
374
|
-
allowedGsdTools: [
|
|
402
|
+
allowedGsdTools: [],
|
|
375
403
|
requiredWorkflowTools: [],
|
|
376
404
|
},
|
|
377
405
|
},
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Block new workflow entry when completed milestone branches are still unmerged.
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
3
4
|
import { nativeBranchExists, nativeDetectMainBranch, nativeDiffNumstat, nativeIsAncestor, } from "./native-git-bridge.js";
|
|
4
5
|
import { autoWorktreeBranch } from "./auto-worktree.js";
|
|
5
6
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
6
7
|
import { getAllMilestones } from "./gsd-db.js";
|
|
7
8
|
import { resolveMilestoneIntegrationBranch } from "./git-service.js";
|
|
8
9
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
9
|
-
import { captureRootDirtySnapshot } from "./root-write-leak-guard.js";
|
|
10
10
|
import { isClosedStatus } from "./status-guards.js";
|
|
11
11
|
const BLOCKED_COMMANDS = new Set([
|
|
12
12
|
"auto",
|
|
@@ -49,6 +49,33 @@ const UNMERGED_SAFE_PARALLEL_SUBCOMMANDS = new Set([
|
|
|
49
49
|
function isRuntimePath(path) {
|
|
50
50
|
return path === ".gsd" || path.startsWith(".gsd/");
|
|
51
51
|
}
|
|
52
|
+
function captureDirtyPathStatusSnapshot(rootPath) {
|
|
53
|
+
const snapshot = new Map();
|
|
54
|
+
let status = "";
|
|
55
|
+
try {
|
|
56
|
+
status = execFileSync("git", ["status", "--porcelain", "--untracked-files=all"], {
|
|
57
|
+
cwd: rootPath,
|
|
58
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
59
|
+
encoding: "utf-8",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return snapshot;
|
|
64
|
+
}
|
|
65
|
+
for (const line of status.split("\n")) {
|
|
66
|
+
if (!line.trim())
|
|
67
|
+
continue;
|
|
68
|
+
const code = line.slice(0, 2);
|
|
69
|
+
const path = line.slice(3).replace(/^"|"$/g, "");
|
|
70
|
+
if (!path || isRuntimePath(path))
|
|
71
|
+
continue;
|
|
72
|
+
snapshot.set(path, {
|
|
73
|
+
path,
|
|
74
|
+
status: code.trim() || code,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return snapshot;
|
|
78
|
+
}
|
|
52
79
|
function formatCommandLabel(attemptedCommand) {
|
|
53
80
|
const trimmed = attemptedCommand.trim();
|
|
54
81
|
return trimmed ? `/gsd ${trimmed}` : "/gsd";
|
|
@@ -109,7 +136,7 @@ export function isUnmergedMilestoneAllowedCommand(trimmed) {
|
|
|
109
136
|
export async function findUnmergedCompletedMilestones(base) {
|
|
110
137
|
await ensureDbOpen(base);
|
|
111
138
|
const blockers = [];
|
|
112
|
-
|
|
139
|
+
let dirtyByPath = null;
|
|
113
140
|
for (const milestone of getAllMilestones()) {
|
|
114
141
|
if (!isClosedStatus(milestone.status))
|
|
115
142
|
continue;
|
|
@@ -134,13 +161,16 @@ export async function findUnmergedCompletedMilestones(base) {
|
|
|
134
161
|
const uniqueFiles = [...new Set(files)].sort();
|
|
135
162
|
if (uniqueFiles.length === 0)
|
|
136
163
|
continue;
|
|
164
|
+
if (!dirtyByPath)
|
|
165
|
+
dirtyByPath = captureDirtyPathStatusSnapshot(base);
|
|
166
|
+
const dirtySnapshot = dirtyByPath;
|
|
137
167
|
blockers.push({
|
|
138
168
|
milestoneId: milestone.id,
|
|
139
169
|
branch,
|
|
140
170
|
integrationBranch,
|
|
141
171
|
files: uniqueFiles,
|
|
142
172
|
dirtyOverlap: uniqueFiles
|
|
143
|
-
.map((path) =>
|
|
173
|
+
.map((path) => dirtySnapshot.get(path))
|
|
144
174
|
.filter((entry) => Boolean(entry)),
|
|
145
175
|
});
|
|
146
176
|
}
|
|
@@ -5,7 +5,7 @@ import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
|
5
5
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
6
6
|
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
7
7
|
import { getIsolationMode } from "./preferences.js";
|
|
8
|
-
import { deriveState } from "./state.js";
|
|
8
|
+
import { deriveState, invalidateStateCache } from "./state.js";
|
|
9
9
|
import { detectWorktreeName } from "./worktree.js";
|
|
10
10
|
const VALIDATION_BLOCK_RE = /milestone validation returned needs-(?:attention|remediation)|validation verdict is needs-(?:attention|remediation)/i;
|
|
11
11
|
const VALIDATION_SAFE_DISPATCH_COMMANDS = new Set([
|
|
@@ -116,9 +116,7 @@ export function formatValidationBlockedMessage(state, attemptedCommand = "") {
|
|
|
116
116
|
...blockers,
|
|
117
117
|
].join("\n\n");
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
await ensureDbOpen(base);
|
|
121
|
-
refreshWorkflowDatabaseFromDisk();
|
|
119
|
+
async function deriveValidationBlockState(base) {
|
|
122
120
|
let state = await deriveState(base);
|
|
123
121
|
if (state.activeMilestone &&
|
|
124
122
|
getIsolationMode(base) === "worktree" &&
|
|
@@ -129,5 +127,12 @@ export async function getValidationBlockMessageForBase(base, attemptedCommand =
|
|
|
129
127
|
state = await deriveState(wtPath);
|
|
130
128
|
}
|
|
131
129
|
}
|
|
130
|
+
return state;
|
|
131
|
+
}
|
|
132
|
+
export async function getValidationBlockMessageForBase(base, attemptedCommand = "") {
|
|
133
|
+
await ensureDbOpen(base);
|
|
134
|
+
refreshWorkflowDatabaseFromDisk();
|
|
135
|
+
invalidateStateCache();
|
|
136
|
+
const state = await deriveValidationBlockState(base);
|
|
132
137
|
return formatValidationBlockedMessage(state, attemptedCommand);
|
|
133
138
|
}
|
|
@@ -201,6 +201,13 @@ export function formatFailureContext(result) {
|
|
|
201
201
|
}
|
|
202
202
|
return header + body;
|
|
203
203
|
}
|
|
204
|
+
export function formatFailureSignature(result) {
|
|
205
|
+
return result.checks
|
|
206
|
+
.filter((check) => check.exitCode !== 0)
|
|
207
|
+
.map((check) => `${check.command.trim()}#${check.exitCode}`)
|
|
208
|
+
.sort()
|
|
209
|
+
.join("\n");
|
|
210
|
+
}
|
|
204
211
|
// ─── Gate Execution ─────────────────────────────────────────────────────────
|
|
205
212
|
/** Characters that indicate shell control syntax when unquoted in a command string. */
|
|
206
213
|
const UNQUOTED_SHELL_CONTROL_CHARS = new Set([";", "<", ">"]);
|
|
@@ -317,7 +317,10 @@ function restoreArtifactProjections(basePath, manifest) {
|
|
|
317
317
|
if (manifest.artifacts === undefined)
|
|
318
318
|
return;
|
|
319
319
|
for (const artifact of manifest.artifacts) {
|
|
320
|
-
|
|
320
|
+
const content = artifact.full_content ?? "";
|
|
321
|
+
if (content === "")
|
|
322
|
+
continue;
|
|
323
|
+
atomicWriteSync(artifactProjectionPath(basePath, artifact.path), content);
|
|
321
324
|
}
|
|
322
325
|
}
|
|
323
326
|
// ─── bootstrapFromManifest ──────────────────────────────────────────────
|
|
@@ -399,15 +399,13 @@ export async function renderStateProjection(basePath) {
|
|
|
399
399
|
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
|
-
// ───
|
|
402
|
+
// ─── renderMilestoneShellProjections ─────────────────────────────────────
|
|
403
403
|
/**
|
|
404
|
-
* Regenerate
|
|
405
|
-
*
|
|
404
|
+
* Regenerate milestone-level projections (roadmap, top-level views, STATE.md).
|
|
405
|
+
* Does not touch slice PLAN.md or task SUMMARY.md — those have authoritative
|
|
406
|
+
* renderers in plan-slice / complete-task.
|
|
406
407
|
*/
|
|
407
|
-
export async function
|
|
408
|
-
// Delegate to the authoritative roadmap renderer — the reduced
|
|
409
|
-
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
410
|
-
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
408
|
+
export async function renderMilestoneShellProjections(basePath, milestoneId) {
|
|
411
409
|
try {
|
|
412
410
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
413
411
|
}
|
|
@@ -426,6 +424,20 @@ export async function renderAllProjections(basePath, milestoneId) {
|
|
|
426
424
|
catch (err) {
|
|
427
425
|
logWarning("projection", `renderTopLevelQueueFromDb failed: ${err.message}`);
|
|
428
426
|
}
|
|
427
|
+
try {
|
|
428
|
+
await renderStateProjection(basePath);
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// ─── renderAllProjections ───────────────────────────────────────────────
|
|
435
|
+
/**
|
|
436
|
+
* Regenerate all projection files for a milestone from DB state.
|
|
437
|
+
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
438
|
+
*/
|
|
439
|
+
export async function renderAllProjections(basePath, milestoneId) {
|
|
440
|
+
await renderMilestoneShellProjections(basePath, milestoneId);
|
|
429
441
|
// Query all slices for this milestone
|
|
430
442
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
431
443
|
for (const slice of sliceRows) {
|
|
@@ -445,13 +457,6 @@ export async function renderAllProjections(basePath, milestoneId) {
|
|
|
445
457
|
}
|
|
446
458
|
}
|
|
447
459
|
}
|
|
448
|
-
// Render STATE.md
|
|
449
|
-
try {
|
|
450
|
-
await renderStateProjection(basePath);
|
|
451
|
-
}
|
|
452
|
-
catch (err) {
|
|
453
|
-
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
454
|
-
}
|
|
455
460
|
}
|
|
456
461
|
// ─── regenerateIfMissing ────────────────────────────────────────────────
|
|
457
462
|
/**
|