@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
|
@@ -98,7 +98,13 @@ export const UNIT_REGISTRY = {
|
|
|
98
98
|
scopeClass: "standard",
|
|
99
99
|
phaseChain: ["research"],
|
|
100
100
|
toolContract: {
|
|
101
|
-
allowedGsdTools: [
|
|
101
|
+
allowedGsdTools: [
|
|
102
|
+
"gsd_summary_save",
|
|
103
|
+
"gsd_decision_save",
|
|
104
|
+
"gsd_exec",
|
|
105
|
+
"gsd_exec_search",
|
|
106
|
+
"gsd_resume",
|
|
107
|
+
],
|
|
102
108
|
requiredWorkflowTools: ["gsd_summary_save"],
|
|
103
109
|
},
|
|
104
110
|
},
|
|
@@ -154,7 +160,15 @@ export const UNIT_REGISTRY = {
|
|
|
154
160
|
scopeClass: "section-close",
|
|
155
161
|
phaseChain: ["validation", "planning"],
|
|
156
162
|
toolContract: {
|
|
157
|
-
allowedGsdTools: [
|
|
163
|
+
allowedGsdTools: [
|
|
164
|
+
"gsd_milestone_status",
|
|
165
|
+
"gsd_exec",
|
|
166
|
+
"gsd_exec_search",
|
|
167
|
+
"gsd_resume",
|
|
168
|
+
"gsd_validate_milestone",
|
|
169
|
+
"gsd_reassess_roadmap",
|
|
170
|
+
"subagent",
|
|
171
|
+
],
|
|
158
172
|
requiredWorkflowTools: ["gsd_milestone_status", "gsd_validate_milestone", "gsd_reassess_roadmap"],
|
|
159
173
|
},
|
|
160
174
|
},
|
|
@@ -165,6 +179,9 @@ export const UNIT_REGISTRY = {
|
|
|
165
179
|
toolContract: {
|
|
166
180
|
allowedGsdTools: [
|
|
167
181
|
"gsd_milestone_status",
|
|
182
|
+
"gsd_exec",
|
|
183
|
+
"gsd_exec_search",
|
|
184
|
+
"gsd_resume",
|
|
168
185
|
"gsd_requirement_update",
|
|
169
186
|
"gsd_summary_save",
|
|
170
187
|
"gsd_complete_milestone",
|
|
@@ -244,6 +261,8 @@ export const UNIT_REGISTRY = {
|
|
|
244
261
|
allowedGsdTools: [
|
|
245
262
|
"gsd_milestone_status",
|
|
246
263
|
"gsd_exec",
|
|
264
|
+
"gsd_exec_search",
|
|
265
|
+
"gsd_resume",
|
|
247
266
|
"gsd_slice_complete",
|
|
248
267
|
"gsd_task_reopen",
|
|
249
268
|
"gsd_replan_slice",
|
|
@@ -326,7 +345,13 @@ export const UNIT_REGISTRY = {
|
|
|
326
345
|
scopeClass: "execute-task",
|
|
327
346
|
phaseChain: ["execution"],
|
|
328
347
|
toolContract: {
|
|
329
|
-
allowedGsdTools: [
|
|
348
|
+
allowedGsdTools: [
|
|
349
|
+
"gsd_milestone_status",
|
|
350
|
+
"gsd_task_complete",
|
|
351
|
+
"gsd_exec",
|
|
352
|
+
"gsd_summary_save",
|
|
353
|
+
"gsd_decision_save",
|
|
354
|
+
],
|
|
330
355
|
requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
|
|
331
356
|
},
|
|
332
357
|
},
|
|
@@ -413,12 +438,15 @@ export const UNIT_REGISTRY = {
|
|
|
413
438
|
requiredWorkflowTools: ["ask_user_questions"],
|
|
414
439
|
},
|
|
415
440
|
},
|
|
441
|
+
// research-project dispatches 4 parallel scout subagents (Task calls); each scout
|
|
442
|
+
// writes one file under .gsd/research/ directly. The parent coordinator does not
|
|
443
|
+
// call gsd_summary_save or gsd_decision_save — the scouts own their own output.
|
|
416
444
|
"research-project": {
|
|
417
445
|
kind: "primary",
|
|
418
446
|
scopeClass: "standard",
|
|
419
447
|
phaseChain: ["research"],
|
|
420
448
|
toolContract: {
|
|
421
|
-
allowedGsdTools: [
|
|
449
|
+
allowedGsdTools: [],
|
|
422
450
|
requiredWorkflowTools: [],
|
|
423
451
|
},
|
|
424
452
|
},
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Block new workflow entry when completed milestone branches are still unmerged.
|
|
3
3
|
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
|
|
4
6
|
import {
|
|
5
7
|
nativeBranchExists,
|
|
6
8
|
nativeDetectMainBranch,
|
|
@@ -12,17 +14,23 @@ import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
|
12
14
|
import { getAllMilestones } from "./gsd-db.js";
|
|
13
15
|
import { resolveMilestoneIntegrationBranch } from "./git-service.js";
|
|
14
16
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
15
|
-
import { captureRootDirtySnapshot, type RootDirtyEntry } from "./root-write-leak-guard.js";
|
|
16
17
|
import { isClosedStatus } from "./status-guards.js";
|
|
17
18
|
|
|
19
|
+
export interface UnmergedMilestoneDirtyEntry {
|
|
20
|
+
path: string;
|
|
21
|
+
status: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
18
24
|
export interface UnmergedMilestoneBlocker {
|
|
19
25
|
milestoneId: string;
|
|
20
26
|
branch: string;
|
|
21
27
|
integrationBranch: string;
|
|
22
28
|
files: string[];
|
|
23
|
-
dirtyOverlap:
|
|
29
|
+
dirtyOverlap: UnmergedMilestoneDirtyEntry[];
|
|
24
30
|
}
|
|
25
31
|
|
|
32
|
+
type UnmergedMilestoneDirtySnapshot = Map<string, UnmergedMilestoneDirtyEntry>;
|
|
33
|
+
|
|
26
34
|
const BLOCKED_COMMANDS = new Set([
|
|
27
35
|
"auto",
|
|
28
36
|
"next",
|
|
@@ -67,6 +75,32 @@ function isRuntimePath(path: string): boolean {
|
|
|
67
75
|
return path === ".gsd" || path.startsWith(".gsd/");
|
|
68
76
|
}
|
|
69
77
|
|
|
78
|
+
function captureDirtyPathStatusSnapshot(rootPath: string): UnmergedMilestoneDirtySnapshot {
|
|
79
|
+
const snapshot: UnmergedMilestoneDirtySnapshot = new Map();
|
|
80
|
+
let status = "";
|
|
81
|
+
try {
|
|
82
|
+
status = execFileSync("git", ["status", "--porcelain", "--untracked-files=all"], {
|
|
83
|
+
cwd: rootPath,
|
|
84
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
85
|
+
encoding: "utf-8",
|
|
86
|
+
});
|
|
87
|
+
} catch {
|
|
88
|
+
return snapshot;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
for (const line of status.split("\n")) {
|
|
92
|
+
if (!line.trim()) continue;
|
|
93
|
+
const code = line.slice(0, 2);
|
|
94
|
+
const path = line.slice(3).replace(/^"|"$/g, "");
|
|
95
|
+
if (!path || isRuntimePath(path)) continue;
|
|
96
|
+
snapshot.set(path, {
|
|
97
|
+
path,
|
|
98
|
+
status: code.trim() || code,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return snapshot;
|
|
102
|
+
}
|
|
103
|
+
|
|
70
104
|
function formatCommandLabel(attemptedCommand: string): string {
|
|
71
105
|
const trimmed = attemptedCommand.trim();
|
|
72
106
|
return trimmed ? `/gsd ${trimmed}` : "/gsd";
|
|
@@ -132,7 +166,7 @@ export async function findUnmergedCompletedMilestones(base: string): Promise<Unm
|
|
|
132
166
|
await ensureDbOpen(base);
|
|
133
167
|
|
|
134
168
|
const blockers: UnmergedMilestoneBlocker[] = [];
|
|
135
|
-
|
|
169
|
+
let dirtyByPath: UnmergedMilestoneDirtySnapshot | null = null;
|
|
136
170
|
|
|
137
171
|
for (const milestone of getAllMilestones()) {
|
|
138
172
|
if (!isClosedStatus(milestone.status)) continue;
|
|
@@ -158,14 +192,16 @@ export async function findUnmergedCompletedMilestones(base: string): Promise<Unm
|
|
|
158
192
|
const uniqueFiles = [...new Set(files)].sort();
|
|
159
193
|
if (uniqueFiles.length === 0) continue;
|
|
160
194
|
|
|
195
|
+
if (!dirtyByPath) dirtyByPath = captureDirtyPathStatusSnapshot(base);
|
|
196
|
+
const dirtySnapshot = dirtyByPath;
|
|
161
197
|
blockers.push({
|
|
162
198
|
milestoneId: milestone.id,
|
|
163
199
|
branch,
|
|
164
200
|
integrationBranch,
|
|
165
201
|
files: uniqueFiles,
|
|
166
202
|
dirtyOverlap: uniqueFiles
|
|
167
|
-
.map((path) =>
|
|
168
|
-
.filter((entry): entry is
|
|
203
|
+
.map((path) => dirtySnapshot.get(path))
|
|
204
|
+
.filter((entry): entry is UnmergedMilestoneDirtyEntry => Boolean(entry)),
|
|
169
205
|
});
|
|
170
206
|
}
|
|
171
207
|
|
|
@@ -7,7 +7,7 @@ import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
|
7
7
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
8
|
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
9
9
|
import { getIsolationMode } from "./preferences.js";
|
|
10
|
-
import { deriveState } from "./state.js";
|
|
10
|
+
import { deriveState, invalidateStateCache } from "./state.js";
|
|
11
11
|
import type { GSDState } from "./types.js";
|
|
12
12
|
import { detectWorktreeName } from "./worktree.js";
|
|
13
13
|
|
|
@@ -133,12 +133,7 @@ export function formatValidationBlockedMessage(
|
|
|
133
133
|
].join("\n\n");
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
base: string,
|
|
138
|
-
attemptedCommand = "",
|
|
139
|
-
): Promise<string | null> {
|
|
140
|
-
await ensureDbOpen(base);
|
|
141
|
-
refreshWorkflowDatabaseFromDisk();
|
|
136
|
+
async function deriveValidationBlockState(base: string): Promise<GSDState> {
|
|
142
137
|
let state = await deriveState(base);
|
|
143
138
|
|
|
144
139
|
if (
|
|
@@ -153,5 +148,16 @@ export async function getValidationBlockMessageForBase(
|
|
|
153
148
|
}
|
|
154
149
|
}
|
|
155
150
|
|
|
151
|
+
return state;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function getValidationBlockMessageForBase(
|
|
155
|
+
base: string,
|
|
156
|
+
attemptedCommand = "",
|
|
157
|
+
): Promise<string | null> {
|
|
158
|
+
await ensureDbOpen(base);
|
|
159
|
+
refreshWorkflowDatabaseFromDisk();
|
|
160
|
+
invalidateStateCache();
|
|
161
|
+
const state = await deriveValidationBlockState(base);
|
|
156
162
|
return formatValidationBlockedMessage(state, attemptedCommand);
|
|
157
163
|
}
|
|
@@ -244,6 +244,14 @@ export function formatFailureContext(result: VerificationResult): string {
|
|
|
244
244
|
return header + body;
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
+
export function formatFailureSignature(result: VerificationResult): string {
|
|
248
|
+
return result.checks
|
|
249
|
+
.filter((check) => check.exitCode !== 0)
|
|
250
|
+
.map((check) => `${check.command.trim()}#${check.exitCode}`)
|
|
251
|
+
.sort()
|
|
252
|
+
.join("\n");
|
|
253
|
+
}
|
|
254
|
+
|
|
247
255
|
// ─── Gate Execution ─────────────────────────────────────────────────────────
|
|
248
256
|
|
|
249
257
|
/** Characters that indicate shell control syntax when unquoted in a command string. */
|
|
@@ -414,9 +414,12 @@ function restoreArtifactProjections(basePath: string, manifest: StateManifest):
|
|
|
414
414
|
if (manifest.artifacts === undefined) return;
|
|
415
415
|
|
|
416
416
|
for (const artifact of manifest.artifacts) {
|
|
417
|
+
const content = artifact.full_content ?? "";
|
|
418
|
+
if (content === "") continue;
|
|
419
|
+
|
|
417
420
|
atomicWriteSync(
|
|
418
421
|
artifactProjectionPath(basePath, artifact.path),
|
|
419
|
-
|
|
422
|
+
content,
|
|
420
423
|
);
|
|
421
424
|
}
|
|
422
425
|
}
|
|
@@ -451,16 +451,14 @@ export async function renderStateProjection(basePath: string): Promise<void> {
|
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
-
// ───
|
|
454
|
+
// ─── renderMilestoneShellProjections ─────────────────────────────────────
|
|
455
455
|
|
|
456
456
|
/**
|
|
457
|
-
* Regenerate
|
|
458
|
-
*
|
|
457
|
+
* Regenerate milestone-level projections (roadmap, top-level views, STATE.md).
|
|
458
|
+
* Does not touch slice PLAN.md or task SUMMARY.md — those have authoritative
|
|
459
|
+
* renderers in plan-slice / complete-task.
|
|
459
460
|
*/
|
|
460
|
-
export async function
|
|
461
|
-
// Delegate to the authoritative roadmap renderer — the reduced
|
|
462
|
-
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
463
|
-
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
461
|
+
export async function renderMilestoneShellProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
464
462
|
try {
|
|
465
463
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
466
464
|
} catch (err) {
|
|
@@ -476,6 +474,21 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
476
474
|
} catch (err) {
|
|
477
475
|
logWarning("projection", `renderTopLevelQueueFromDb failed: ${(err as Error).message}`);
|
|
478
476
|
}
|
|
477
|
+
try {
|
|
478
|
+
await renderStateProjection(basePath);
|
|
479
|
+
} catch (err) {
|
|
480
|
+
logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ─── renderAllProjections ───────────────────────────────────────────────
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Regenerate all projection files for a milestone from DB state.
|
|
488
|
+
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
489
|
+
*/
|
|
490
|
+
export async function renderAllProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
491
|
+
await renderMilestoneShellProjections(basePath, milestoneId);
|
|
479
492
|
|
|
480
493
|
// Query all slices for this milestone
|
|
481
494
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
@@ -498,13 +511,6 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
498
511
|
}
|
|
499
512
|
}
|
|
500
513
|
}
|
|
501
|
-
|
|
502
|
-
// Render STATE.md
|
|
503
|
-
try {
|
|
504
|
-
await renderStateProjection(basePath);
|
|
505
|
-
} catch (err) {
|
|
506
|
-
logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
|
|
507
|
-
}
|
|
508
514
|
}
|
|
509
515
|
|
|
510
516
|
// ─── regenerateIfMissing ────────────────────────────────────────────────
|
|
@@ -7,6 +7,7 @@ import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
|
7
7
|
import { isSafeToAutoResolve } from "./auto-worktree.js";
|
|
8
8
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
9
9
|
import {
|
|
10
|
+
listMergeStateBlockers,
|
|
10
11
|
probeGitConflictState,
|
|
11
12
|
reconcileGitConflictsOnSignal,
|
|
12
13
|
type GitConflictProbeResult,
|
|
@@ -30,6 +31,9 @@ export type WorkspaceGitReadyResult =
|
|
|
30
31
|
targets: string[];
|
|
31
32
|
};
|
|
32
33
|
|
|
34
|
+
const CLEAN_TARGET_CACHE_TTL_MS = 10_000;
|
|
35
|
+
const cleanTargetProbeCache = new Map<string, number>();
|
|
36
|
+
|
|
33
37
|
function normalizeTargetPath(path: string): string {
|
|
34
38
|
try {
|
|
35
39
|
return realpathSync(path);
|
|
@@ -110,6 +114,25 @@ function formatBlockReason(
|
|
|
110
114
|
|
|
111
115
|
async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyResult> {
|
|
112
116
|
const fixesApplied: string[] = [];
|
|
117
|
+
const cacheKey = normalizeTargetPath(target);
|
|
118
|
+
const cachedCleanAt = cleanTargetProbeCache.get(cacheKey);
|
|
119
|
+
if (cachedCleanAt !== undefined) {
|
|
120
|
+
if (Date.now() - cachedCleanAt < CLEAN_TARGET_CACHE_TTL_MS) {
|
|
121
|
+
// Merge-state markers (MERGE_HEAD, rebase-apply, rebase-merge) are the most
|
|
122
|
+
// common way a repo transitions from clean to dirty within the TTL window,
|
|
123
|
+
// including when a non-git folder is initialized as a repo mid-TTL and a
|
|
124
|
+
// merge immediately introduces conflicts. Check them here — they are pure
|
|
125
|
+
// existsSync calls with no git subprocess — and fall through to a full probe
|
|
126
|
+
// only when markers are present.
|
|
127
|
+
if (listMergeStateBlockers(cacheKey).length === 0) {
|
|
128
|
+
return { ok: true, fixesApplied };
|
|
129
|
+
}
|
|
130
|
+
cleanTargetProbeCache.delete(cacheKey);
|
|
131
|
+
} else {
|
|
132
|
+
cleanTargetProbeCache.delete(cacheKey);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
113
136
|
let probe = probeGitConflictState(target);
|
|
114
137
|
|
|
115
138
|
for (let attempt = 0; attempt < 3 && probe.status === "dirty"; attempt++) {
|
|
@@ -129,6 +152,7 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
|
|
|
129
152
|
}
|
|
130
153
|
|
|
131
154
|
if (probe.status === "unknown") {
|
|
155
|
+
cleanTargetProbeCache.delete(cacheKey);
|
|
132
156
|
return {
|
|
133
157
|
ok: false,
|
|
134
158
|
reason: formatBlockReason("unrecoverable", [], [target]),
|
|
@@ -141,6 +165,7 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
|
|
|
141
165
|
|
|
142
166
|
const conflictedPaths = productConflictPaths(probe);
|
|
143
167
|
if (conflictedPaths.length > 0 || probe.checkFailures.length > 0) {
|
|
168
|
+
cleanTargetProbeCache.delete(cacheKey);
|
|
144
169
|
return {
|
|
145
170
|
ok: false,
|
|
146
171
|
reason: formatBlockReason("product-conflicts", conflictedPaths, [target]),
|
|
@@ -151,6 +176,12 @@ async function ensureTargetGitReady(target: string): Promise<WorkspaceGitReadyRe
|
|
|
151
176
|
};
|
|
152
177
|
}
|
|
153
178
|
|
|
179
|
+
if (probe.status === "clean") {
|
|
180
|
+
cleanTargetProbeCache.set(cacheKey, Date.now());
|
|
181
|
+
} else {
|
|
182
|
+
cleanTargetProbeCache.delete(cacheKey);
|
|
183
|
+
}
|
|
184
|
+
|
|
154
185
|
return { ok: true, fixesApplied };
|
|
155
186
|
}
|
|
156
187
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* 4. remove() — git worktree remove + branch cleanup
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
22
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync } from "node:fs";
|
|
23
23
|
import { execFileSync } from "node:child_process";
|
|
24
24
|
import { join, resolve, sep } from "node:path";
|
|
25
25
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
nativeGetCurrentBranch,
|
|
38
38
|
nativeIsAncestor,
|
|
39
39
|
nativeLogOneline,
|
|
40
|
+
nativeMergeAbort,
|
|
40
41
|
nativeMergeSquash,
|
|
41
42
|
nativeWorktreeAdd,
|
|
42
43
|
nativeWorktreeList,
|
|
@@ -87,6 +88,34 @@ function deleteBranchIfPresent(basePath: string, branch: string, warningPrefix:
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
function cleanupFailedSquashMergeState(basePath: string): void {
|
|
92
|
+
try {
|
|
93
|
+
nativeMergeAbort(basePath);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
// Squash conflicts may not create MERGE_HEAD; this is expected.
|
|
96
|
+
logWarning("worktree", `merge abort skipped: ${(e as Error).message}`);
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
execFileSync("git", ["reset", "--merge"], {
|
|
100
|
+
cwd: basePath,
|
|
101
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
102
|
+
encoding: "utf-8",
|
|
103
|
+
});
|
|
104
|
+
} catch (e) {
|
|
105
|
+
logWarning("worktree", `failed squash merge reset failed: ${(e as Error).message}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const gitDir = resolveGitDir(basePath);
|
|
109
|
+
for (const marker of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
110
|
+
try {
|
|
111
|
+
const markerPath = join(gitDir, marker);
|
|
112
|
+
if (existsSync(markerPath)) unlinkSync(markerPath);
|
|
113
|
+
} catch (e) {
|
|
114
|
+
logWarning("worktree", `failed squash merge marker cleanup failed (${marker}): ${(e as Error).message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
90
119
|
// ─── Path Helpers ──────────────────────────────────────────────────────────
|
|
91
120
|
|
|
92
121
|
function normalizePathForComparison(path: string): string {
|
|
@@ -1086,6 +1115,17 @@ export function mergeWorktreeToMain(
|
|
|
1086
1115
|
|
|
1087
1116
|
const result = nativeMergeSquash(basePath, branch);
|
|
1088
1117
|
if (!result.success) {
|
|
1118
|
+
const dirtyWorkingTree = result.conflicts.includes("__dirty_working_tree__");
|
|
1119
|
+
if (!dirtyWorkingTree) {
|
|
1120
|
+
cleanupFailedSquashMergeState(basePath);
|
|
1121
|
+
}
|
|
1122
|
+
if (!dirtyWorkingTree && branch.startsWith("milestone/")) {
|
|
1123
|
+
try {
|
|
1124
|
+
removeWorktree(basePath, name, { branch, deleteBranch: true, force: true });
|
|
1125
|
+
} catch (e) {
|
|
1126
|
+
logWarning("worktree", `failed milestone branch cleanup after squash merge failure: ${(e as Error).message}`);
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1089
1129
|
throw new GSDError(GSD_MERGE_CONFLICT, `Merge conflicts detected in: ${result.conflicts.join(", ")}`);
|
|
1090
1130
|
}
|
|
1091
1131
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2772],{72772:(e,s,t)=>{t.r(s),t.d(s,{Roadmap:()=>p});var d=t(18870),r=t(20607),a=t(53348),n=t(32457),l=t(62970),i=t(92893),c=t(78070),o=t(18833),x=t(93058),m=t(46054);let u=({status:e,size:s="default"})=>{let t="large"===s?"h-5 w-5":"h-4 w-4";return"done"===e?(0,d.jsx)(r.A,{className:(0,o.cn)(t,"text-success")}):"in-progress"===e?(0,d.jsx)(a.A,{className:(0,o.cn)(t,"text-warning")}):"parked"===e?(0,d.jsx)(n.A,{className:(0,o.cn)(t,"text-muted-foreground")}):(0,d.jsx)(l.A,{className:(0,o.cn)(t,"text-muted-foreground")})},h=({risk:e})=>(0,d.jsxs)("span",{className:(0,o.cn)("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-medium uppercase","high"===e&&"bg-destructive/20 text-destructive","medium"===e&&"bg-warning/20 text-warning","low"===e&&"bg-muted text-muted-foreground"),children:["high"===e&&(0,d.jsx)(i.A,{className:"h-2.5 w-2.5"}),e]});function p(){let e=(0,x.gF)(),s=(0,x.Gr)(e),t=s?.milestones??[],r=s?.active??{},a=e.live.freshness.workspace.stale?"stale":e.live.freshness.workspace.status;return(0,d.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,d.jsxs)("div",{className:"border-b border-border px-6 py-3",children:[(0,d.jsx)("h1",{className:"text-lg font-semibold",children:"Roadmap"}),(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:"Project milestone structure with slices and dependencies"}),(0,d.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground","data-testid":"roadmap-workspace-freshness",children:["Workspace freshness: ",a]})]}),(0,d.jsxs)("div",{className:"flex-1 overflow-y-auto p-6",children:["loading"===e.bootStatus&&(0,d.jsx)("div",{className:"py-8 text-center text-sm text-muted-foreground",children:"Loading workspace…"}),"ready"===e.bootStatus&&0===t.length&&(0,d.jsxs)("div",{className:"py-8 text-center text-sm text-muted-foreground",children:["No milestones found. Create a milestone with ",(0,d.jsx)("code",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-xs",children:"/gsd"})," to get started."]}),(0,d.jsx)("div",{className:"space-y-6",children:t.map(e=>{let s=(0,m.Jq)(e,r),t=e.slices.filter(e=>e.done).length,a=e.slices.reduce((e,s)=>e+s.tasks.length,0),n=e.slices.reduce((e,s)=>e+s.tasks.filter(e=>e.done).length,0);return(0,d.jsxs)("div",{className:"rounded-md border border-border bg-card",children:[(0,d.jsxs)("div",{className:(0,o.cn)("flex items-center gap-3 border-b border-border px-4 py-3","in-progress"===s&&"bg-accent/30"),children:[(0,d.jsx)(u,{status:s,size:"large"}),(0,d.jsx)("div",{className:"flex-1",children:(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:e.id}),(0,d.jsx)(c.A,{className:"h-3 w-3 text-muted-foreground"}),(0,d.jsx)("span",{className:"font-semibold",children:e.title})]})}),(0,d.jsxs)("div",{className:"text-right",children:[(0,d.jsxs)("div",{className:"text-sm font-medium",children:[t,"/",e.slices.length," slices"]}),(0,d.jsxs)("div",{className:"text-xs text-muted-foreground",children:[n,"/",a," tasks"]})]})]}),(0,d.jsx)("div",{className:"divide-y divide-border",children:e.slices.map(s=>{let t=(0,m.z3)(e.id,s,r),a=s.tasks.filter(e=>e.done).length,n=s.tasks.length;return(0,d.jsxs)("div",{className:(0,o.cn)("flex items-center gap-3 px-4 py-2.5","in-progress"===t&&"bg-accent/20","pending"===t&&"opacity-70","parked"===t&&"opacity-70"),children:[(0,d.jsx)("div",{className:"w-4"}),(0,d.jsx)(u,{status:t}),(0,d.jsx)("div",{className:"flex-1",children:(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"font-mono text-xs text-muted-foreground",children:s.id}),(0,d.jsx)("span",{className:"text-sm",children:s.title}),s.risk&&(0,d.jsx)(h,{risk:s.risk}),s.depends&&s.depends.length>0&&(0,d.jsxs)("span",{className:"text-[10px] text-muted-foreground",children:["depends on ",s.depends.join(", ")]})]})}),(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsx)("div",{className:"w-24",children:(0,d.jsx)("div",{className:"h-1 w-full rounded-full bg-accent",children:(0,d.jsx)("div",{className:"h-full rounded-full bg-foreground/70 transition-[width]",style:{width:n>0?`${a/n*100}%`:"0%"}})})}),(0,d.jsxs)("span",{className:"w-12 text-right text-xs text-muted-foreground",children:[a,"/",n]})]})]},`${e.id}-${s.id}`)})})]},e.id)})})]})]})}}}]);
|