gsd-pi 2.82.0 → 3.0.0
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 +51 -32
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +19 -6
- package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
- package/dist/resources/extensions/gsd/auto/phases.js +90 -31
- package/dist/resources/extensions/gsd/auto/session.js +4 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
- package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
- package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-verification.js +45 -26
- package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
- package/dist/resources/extensions/gsd/auto.js +178 -63
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -2
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +3 -3
- package/dist/resources/extensions/gsd/git-service.js +45 -3
- package/dist/resources/extensions/gsd/gsd-db.js +21 -6
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +101 -116
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +3 -3
- package/dist/resources/extensions/gsd/status-guards.js +11 -0
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +68 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- 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 +9 -9
- 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 +5 -5
- 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.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +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 +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- 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 +2 -5
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -7
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +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 +9 -9
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- 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/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/package.json +6 -5
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +5 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +6 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +22 -6
- package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
- package/src/resources/extensions/gsd/auto/phases.ts +104 -38
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
- package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-verification.ts +58 -36
- package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
- package/src/resources/extensions/gsd/auto.ts +187 -61
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -2
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +3 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +3 -3
- package/src/resources/extensions/gsd/git-service.ts +51 -4
- package/src/resources/extensions/gsd/gsd-db.ts +21 -6
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +134 -133
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +3 -3
- package/src/resources/extensions/gsd/status-guards.ts +13 -0
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +78 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
|
@@ -47,6 +47,118 @@ export function queryDecisions(opts) {
|
|
|
47
47
|
return [];
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Internal: shared core for the two memory-sourced decision queries. Reads
|
|
52
|
+
* memory rows tagged with `sourceDecisionId` and reconstructs `Decision[]`
|
|
53
|
+
* from their `structured_fields` JSON.
|
|
54
|
+
*
|
|
55
|
+
* @param includeSuperseded — when false, drops rows whose
|
|
56
|
+
* `structured_fields.superseded_by` is non-null. The supersedes-chain is
|
|
57
|
+
* captured by the backfill (`memory-backfill.ts`) and kept in sync by
|
|
58
|
+
* the backfill's drift auto-heal pass.
|
|
59
|
+
*/
|
|
60
|
+
function readDecisionsFromMemories(opts, includeSuperseded) {
|
|
61
|
+
if (!isDbAvailable())
|
|
62
|
+
return [];
|
|
63
|
+
const adapter = _getAdapter();
|
|
64
|
+
if (!adapter)
|
|
65
|
+
return [];
|
|
66
|
+
try {
|
|
67
|
+
const clauses = [
|
|
68
|
+
"category = 'architecture'",
|
|
69
|
+
"structured_fields LIKE '%\"sourceDecisionId\":\"%'",
|
|
70
|
+
];
|
|
71
|
+
const params = {};
|
|
72
|
+
if (opts?.milestoneId) {
|
|
73
|
+
// when_context is a free-text JSON value; substring match preserves the
|
|
74
|
+
// semantics of `when_context LIKE '%milestoneId%'` on the legacy table.
|
|
75
|
+
clauses.push("json_extract(structured_fields, '$.when_context') LIKE :milestone_pattern");
|
|
76
|
+
params[':milestone_pattern'] = `%${opts.milestoneId}%`;
|
|
77
|
+
}
|
|
78
|
+
if (opts?.scope) {
|
|
79
|
+
// Stage 1 used `json_extract` in main (post-merge); preserve that
|
|
80
|
+
// style here. Exact equality on the JSON value avoids the prefix
|
|
81
|
+
// collision risk LIKE patterns had (scope=M001 vs scope=M001-S01).
|
|
82
|
+
clauses.push("json_extract(structured_fields, '$.scope') = :scope");
|
|
83
|
+
params[':scope'] = opts.scope;
|
|
84
|
+
}
|
|
85
|
+
const sql = `SELECT seq, structured_fields FROM memories WHERE ${clauses.join(' AND ')} ORDER BY seq`;
|
|
86
|
+
const rows = adapter.prepare(sql).all(params);
|
|
87
|
+
const decisions = [];
|
|
88
|
+
for (const row of rows) {
|
|
89
|
+
const seq = row['seq'];
|
|
90
|
+
const sfRaw = row['structured_fields'];
|
|
91
|
+
if (!sfRaw)
|
|
92
|
+
continue;
|
|
93
|
+
let sf;
|
|
94
|
+
try {
|
|
95
|
+
sf = JSON.parse(sfRaw);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const sourceId = sf['sourceDecisionId'];
|
|
101
|
+
if (typeof sourceId !== 'string' || sourceId.length === 0)
|
|
102
|
+
continue;
|
|
103
|
+
// Decision-level superseded status lives in structured_fields.superseded_by
|
|
104
|
+
// (written by mirrorDecisionToMemory / memory-backfill.ts). The top-level
|
|
105
|
+
// memories.superseded_by column is intentionally never set for decision mirrors,
|
|
106
|
+
// so active-only filtering must be done here in the JS loop.
|
|
107
|
+
const supersededBy = typeof sf['superseded_by'] === 'string' ? sf['superseded_by'] : null;
|
|
108
|
+
if (!includeSuperseded && supersededBy)
|
|
109
|
+
continue;
|
|
110
|
+
decisions.push({
|
|
111
|
+
seq,
|
|
112
|
+
id: sourceId,
|
|
113
|
+
when_context: typeof sf['when_context'] === 'string' ? sf['when_context'] : '',
|
|
114
|
+
scope: typeof sf['scope'] === 'string' ? sf['scope'] : '',
|
|
115
|
+
decision: typeof sf['decision'] === 'string' ? sf['decision'] : '',
|
|
116
|
+
choice: typeof sf['choice'] === 'string' ? sf['choice'] : '',
|
|
117
|
+
rationale: typeof sf['rationale'] === 'string' ? sf['rationale'] : '',
|
|
118
|
+
revisable: typeof sf['revisable'] === 'string' ? sf['revisable'] : '',
|
|
119
|
+
made_by: (typeof sf['made_by'] === 'string' ? sf['made_by'] : 'agent'),
|
|
120
|
+
superseded_by: supersededBy,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return decisions;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* ADR-013 Phase 6 cutover (Stage 1): read **active** decisions from the
|
|
131
|
+
* `memories` table instead of the legacy `decisions` table. Returns the
|
|
132
|
+
* same `Decision[]` shape as `queryDecisions` so downstream formatters
|
|
133
|
+
* work unchanged.
|
|
134
|
+
*
|
|
135
|
+
* Filter semantics match `queryDecisions` exactly:
|
|
136
|
+
* - active only (skips rows where `structured_fields.superseded_by` is set)
|
|
137
|
+
* - `milestoneId`: substring match on `structured_fields.when_context`
|
|
138
|
+
* - `scope`: exact match on `structured_fields.scope`
|
|
139
|
+
*
|
|
140
|
+
* Used by the prompt-inline path (`inlineDecisionsFromDb` in
|
|
141
|
+
* `auto-prompts.ts`). For the projection regen (which renders superseded
|
|
142
|
+
* rows too), see `getAllDecisionsFromMemories`.
|
|
143
|
+
*/
|
|
144
|
+
export function queryDecisionsFromMemories(opts) {
|
|
145
|
+
return readDecisionsFromMemories(opts, /* includeSuperseded */ false);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* ADR-013 Phase 6 cutover (Stage 2a): read **all** decisions (active +
|
|
149
|
+
* superseded) from the `memories` table. Used by the DECISIONS.md
|
|
150
|
+
* projection regen in `saveDecisionToDb`, which must render the full
|
|
151
|
+
* supersedes-chain for the canonical register format.
|
|
152
|
+
*
|
|
153
|
+
* Equivalent to `SELECT * FROM decisions ORDER BY seq` over the legacy
|
|
154
|
+
* table — but sourced from memories so the legacy table can be retired
|
|
155
|
+
* in Stage 3. Includes `superseded_by` reconstructed from
|
|
156
|
+
* `structured_fields.superseded_by` (populated by the backfill's drift
|
|
157
|
+
* auto-heal pass).
|
|
158
|
+
*/
|
|
159
|
+
export function getAllDecisionsFromMemories() {
|
|
160
|
+
return readDecisionsFromMemories(undefined, /* includeSuperseded */ true);
|
|
161
|
+
}
|
|
50
162
|
/**
|
|
51
163
|
* Query active (non-superseded) requirements with optional filters.
|
|
52
164
|
* - milestoneId: combined with sliceId for precise filtering (e.g. %M005/S01%)
|
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
import { emitJournalEvent, queryJournal, } from "./journal.js";
|
|
24
24
|
import { readFileSync, unlinkSync, existsSync } from "node:fs";
|
|
25
25
|
import { join } from "node:path";
|
|
26
|
-
import { findStaleWorkerForProject, getAllAutoWorkers, } from "./db/auto-workers.js";
|
|
26
|
+
import { findStaleWorkerForProject, getAllAutoWorkers, markWorkerCrashed, markWorkerStopping, } from "./db/auto-workers.js";
|
|
27
|
+
import { forceReleaseLeasesForWorker } from "./db/milestone-leases.js";
|
|
28
|
+
import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
|
|
27
29
|
import { getRuntimeKv, setRuntimeKv, deleteRuntimeKv } from "./db/runtime-kv.js";
|
|
28
30
|
import { _getAdapter, isDbAvailable } from "./gsd-db.js";
|
|
29
31
|
import { gsdRoot, normalizeRealPath } from "./paths.js";
|
|
@@ -34,6 +36,16 @@ const SESSION_FILE_KV_KEY = "session_file";
|
|
|
34
36
|
function lockPath(basePath) {
|
|
35
37
|
return join(gsdRoot(basePath), effectiveLockFile());
|
|
36
38
|
}
|
|
39
|
+
function clearLegacyLockFile(basePath) {
|
|
40
|
+
try {
|
|
41
|
+
const p = lockPath(basePath);
|
|
42
|
+
if (existsSync(p))
|
|
43
|
+
unlinkSync(p);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Best-effort.
|
|
47
|
+
}
|
|
48
|
+
}
|
|
37
49
|
function readLegacyLock(basePath) {
|
|
38
50
|
try {
|
|
39
51
|
const p = lockPath(basePath);
|
|
@@ -166,21 +178,47 @@ export function writeLock(basePath, unitType, unitId, sessionFile) {
|
|
|
166
178
|
* stale session-file pointer.
|
|
167
179
|
*/
|
|
168
180
|
export function clearLock(basePath) {
|
|
181
|
+
clearLegacyLockFile(basePath);
|
|
182
|
+
if (!isDbAvailable())
|
|
183
|
+
return;
|
|
169
184
|
try {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
185
|
+
const projectRoot = normalizeRealPath(basePath);
|
|
186
|
+
const staleWorker = findStaleWorkerForProject(projectRoot);
|
|
187
|
+
if (staleWorker) {
|
|
188
|
+
markWorkerCrashed(staleWorker.worker_id);
|
|
189
|
+
forceReleaseLeasesForWorker(staleWorker.worker_id);
|
|
190
|
+
deleteRuntimeKv("worker", staleWorker.worker_id, SESSION_FILE_KV_KEY);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const worker = findActiveWorkerForCurrentProcess(projectRoot);
|
|
194
|
+
if (worker)
|
|
195
|
+
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
196
|
+
const stale = findStaleWorkerForProject(projectRoot);
|
|
197
|
+
if (stale) {
|
|
198
|
+
markWorkerStopping(stale.worker_id);
|
|
199
|
+
deleteRuntimeKv("worker", stale.worker_id, SESSION_FILE_KV_KEY);
|
|
200
|
+
}
|
|
173
201
|
}
|
|
174
202
|
catch {
|
|
175
203
|
// Best-effort.
|
|
176
204
|
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Clear a stale DB-backed worker lock after readCrashLock/findStaleWorkerForProject
|
|
208
|
+
* has identified a dead worker. Unlike clearLock(), this targets the stale
|
|
209
|
+
* worker row instead of the current process's active worker.
|
|
210
|
+
*/
|
|
211
|
+
export function clearStaleWorkerLock(basePath) {
|
|
212
|
+
clearLegacyLockFile(basePath);
|
|
177
213
|
if (!isDbAvailable())
|
|
178
214
|
return;
|
|
179
215
|
try {
|
|
180
216
|
const projectRoot = normalizeRealPath(basePath);
|
|
181
|
-
const worker =
|
|
217
|
+
const worker = findStaleWorkerForProject(projectRoot);
|
|
182
218
|
if (!worker)
|
|
183
219
|
return;
|
|
220
|
+
markLatestActiveForWorkerCanceled(worker.worker_id, "crash-recovered");
|
|
221
|
+
markWorkerCrashed(worker.worker_id);
|
|
184
222
|
deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
|
|
185
223
|
}
|
|
186
224
|
catch {
|
|
@@ -193,6 +193,30 @@ export function releaseMilestoneLease(workerId, milestoneId, fencingToken) {
|
|
|
193
193
|
return changes === 1;
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Force-release all held leases for a worker.
|
|
198
|
+
*
|
|
199
|
+
* Used by crash recovery once PID liveness has confirmed the worker is dead.
|
|
200
|
+
* No fencing token is required because this path is cleanup-only for a
|
|
201
|
+
* non-running process.
|
|
202
|
+
*/
|
|
203
|
+
export function forceReleaseLeasesForWorker(workerId) {
|
|
204
|
+
if (!isDbAvailable())
|
|
205
|
+
return 0;
|
|
206
|
+
const db = _getAdapter();
|
|
207
|
+
let changes = 0;
|
|
208
|
+
transaction(() => {
|
|
209
|
+
const result = db.prepare(`UPDATE milestone_leases
|
|
210
|
+
SET status = 'released'
|
|
211
|
+
WHERE worker_id = :worker_id
|
|
212
|
+
AND status = 'held'`).run({ ":worker_id": workerId });
|
|
213
|
+
changes =
|
|
214
|
+
typeof result.changes === "number"
|
|
215
|
+
? result.changes
|
|
216
|
+
: 0;
|
|
217
|
+
});
|
|
218
|
+
return changes;
|
|
219
|
+
}
|
|
196
220
|
/**
|
|
197
221
|
* Read current lease row for diagnostics. Returns null if no row exists.
|
|
198
222
|
*/
|
|
@@ -391,16 +391,17 @@ export function getRecentUnitKeysForProjectRoot(projectRootRealpath, limit = 20)
|
|
|
391
391
|
if (!isDbAvailable())
|
|
392
392
|
return [];
|
|
393
393
|
const db = _getAdapter();
|
|
394
|
-
const rows = db.prepare(`SELECT ud.unit_id
|
|
394
|
+
const rows = db.prepare(`SELECT ud.unit_type, ud.unit_id
|
|
395
395
|
FROM unit_dispatches ud
|
|
396
396
|
INNER JOIN workers w ON w.worker_id = ud.worker_id
|
|
397
397
|
WHERE w.project_root_realpath = :project_root_realpath
|
|
398
|
+
AND w.status != 'crashed'
|
|
398
399
|
ORDER BY ud.started_at DESC, ud.id DESC
|
|
399
400
|
LIMIT :limit`).all({
|
|
400
401
|
":project_root_realpath": projectRootRealpath,
|
|
401
402
|
":limit": limit,
|
|
402
403
|
});
|
|
403
|
-
return rows.reverse().map((r) => ({ key: r.unit_id }));
|
|
404
|
+
return rows.reverse().map((r) => ({ key: `${r.unit_type}/${r.unit_id}` }));
|
|
404
405
|
}
|
|
405
406
|
/**
|
|
406
407
|
* Fetch dispatches for a milestone filtered by status. Useful for janitors
|
|
@@ -210,16 +210,62 @@ export async function nextDecisionId() {
|
|
|
210
210
|
return 'D001';
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
|
-
/**
|
|
214
|
-
|
|
213
|
+
/**
|
|
214
|
+
* ADR-013 Stage 3: compute the next `D###` identifier across both the legacy
|
|
215
|
+
* `decisions` table AND the `memories.structured_fields.sourceDecisionId`
|
|
216
|
+
* surface. Returns the max numeric suffix from either side + 1, three-digit
|
|
217
|
+
* padded.
|
|
218
|
+
*
|
|
219
|
+
* Used by `saveDecisionToDb` once writes to the `decisions` table stop —
|
|
220
|
+
* new decisions live only in memories, but historical IDs sit in both
|
|
221
|
+
* places during the cutover bake. The cross-surface max keeps IDs
|
|
222
|
+
* monotonic and avoids collisions on the next save.
|
|
223
|
+
*/
|
|
224
|
+
function nextDecisionIdAcrossSurfaces(adapter) {
|
|
215
225
|
if (!adapter)
|
|
216
226
|
return 'D001';
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
227
|
+
let maxNum = 0;
|
|
228
|
+
// Legacy table — best-effort.
|
|
229
|
+
try {
|
|
230
|
+
const row = adapter
|
|
231
|
+
.prepare('SELECT MAX(CAST(SUBSTR(id, 2) AS INTEGER)) as max_num FROM decisions')
|
|
232
|
+
.get();
|
|
233
|
+
const candidate = row ? row['max_num'] : null;
|
|
234
|
+
if (typeof candidate === 'number' && Number.isFinite(candidate)) {
|
|
235
|
+
maxNum = Math.max(maxNum, candidate);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// fall through to memory-only
|
|
240
|
+
}
|
|
241
|
+
// Memory surface: scan structuredFields.sourceDecisionId for D### values.
|
|
242
|
+
// SQLite LIKE on the JSON-stringified field is sufficient — rows tagged
|
|
243
|
+
// with sourceDecisionId are bounded by the decisions count.
|
|
244
|
+
try {
|
|
245
|
+
const rows = adapter
|
|
246
|
+
.prepare("SELECT structured_fields FROM memories WHERE structured_fields LIKE '%\"sourceDecisionId\":\"D%'")
|
|
247
|
+
.all();
|
|
248
|
+
for (const row of rows) {
|
|
249
|
+
if (!row.structured_fields)
|
|
250
|
+
continue;
|
|
251
|
+
let sf;
|
|
252
|
+
try {
|
|
253
|
+
sf = JSON.parse(row.structured_fields);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const sourceId = sf['sourceDecisionId'];
|
|
259
|
+
if (typeof sourceId !== 'string' || !sourceId.startsWith('D'))
|
|
260
|
+
continue;
|
|
261
|
+
const num = parseInt(sourceId.slice(1), 10);
|
|
262
|
+
if (Number.isFinite(num) && num > maxNum)
|
|
263
|
+
maxNum = num;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// best-effort
|
|
268
|
+
}
|
|
223
269
|
const next = maxNum + 1;
|
|
224
270
|
return `D${String(next).padStart(3, '0')}`;
|
|
225
271
|
}
|
|
@@ -376,38 +422,55 @@ export async function saveDecisionToDb(fields, basePath) {
|
|
|
376
422
|
try {
|
|
377
423
|
const db = await import('./gsd-db.js');
|
|
378
424
|
const adapter = db._getAdapter();
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
425
|
+
const normalized = {
|
|
426
|
+
...fields,
|
|
427
|
+
when_context: fields.when_context ?? '',
|
|
428
|
+
revisable: fields.revisable ?? 'Yes',
|
|
429
|
+
made_by: fields.made_by ?? 'agent',
|
|
430
|
+
source: fields.source ?? 'discussion',
|
|
431
|
+
};
|
|
432
|
+
// ADR-013 Stage 3 (destructive): writes to the `decisions` table stop
|
|
433
|
+
// here. New decisions live only in the `memories` table; the projection
|
|
434
|
+
// regen below sources from memories (Stage 2a). The decisions table
|
|
435
|
+
// remains for backwards-compat reads (queryDecisions, md-importer,
|
|
436
|
+
// commands-inspect, workflow-manifest) until #5756 drops it.
|
|
437
|
+
//
|
|
438
|
+
// Reversal: a code revert of this change restores the upsertDecision
|
|
439
|
+
// call. Memory rows written between merge and revert stay durable; the
|
|
440
|
+
// legacy table simply doesn't grow during the cutover window.
|
|
441
|
+
const id = nextDecisionIdAcrossSurfaces(adapter);
|
|
442
|
+
// The mirror-to-memories write is what persists the new decision. Must
|
|
443
|
+
// run before the projection regen — the regen sources from memories
|
|
444
|
+
// (Stage 2a) and would otherwise miss the just-saved decision. Pass
|
|
445
|
+
// the normalized field set so defaults (revisable, made_by, source)
|
|
446
|
+
// are recorded on the memory row.
|
|
447
|
+
await mirrorDecisionToMemory(id, normalized);
|
|
448
|
+
// Fetch all decisions (including superseded for the full register).
|
|
449
|
+
// ADR-013 Stage 2a: source from the `memories` table. The Phase 5
|
|
450
|
+
// dual-write keeps memories in sync with each decision save; the backfill
|
|
451
|
+
// (memory-backfill.ts) absorbs the historical chain and drift-heals
|
|
452
|
+
// superseded_by on every session start.
|
|
453
|
+
const { getAllDecisionsFromMemories } = await import('./context-store.js');
|
|
454
|
+
let allDecisions = getAllDecisionsFromMemories();
|
|
455
|
+
if (!allDecisions.some(d => d.id === id)) {
|
|
456
|
+
logWarning('projection', 'just-saved decision missing from memories after mirror; injecting fallback for projection', {
|
|
457
|
+
fn: 'saveDecisionToDb',
|
|
458
|
+
decisionId: id,
|
|
392
459
|
});
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
revisable: row['revisable'],
|
|
408
|
-
made_by: row['made_by'] ?? 'agent',
|
|
409
|
-
superseded_by: row['superseded_by'] ?? null,
|
|
410
|
-
}));
|
|
460
|
+
const nextSeq = allDecisions.reduce((max, d) => Math.max(max, d.seq ?? 0), 0) + 1;
|
|
461
|
+
const fallback = {
|
|
462
|
+
seq: nextSeq,
|
|
463
|
+
id,
|
|
464
|
+
when_context: normalized.when_context,
|
|
465
|
+
scope: normalized.scope,
|
|
466
|
+
decision: normalized.decision,
|
|
467
|
+
choice: normalized.choice,
|
|
468
|
+
rationale: normalized.rationale,
|
|
469
|
+
revisable: normalized.revisable,
|
|
470
|
+
made_by: normalized.made_by,
|
|
471
|
+
superseded_by: null,
|
|
472
|
+
};
|
|
473
|
+
allDecisions = [...allDecisions, fallback];
|
|
411
474
|
}
|
|
412
475
|
const filePath = resolveGsdRootFile(basePath, 'DECISIONS');
|
|
413
476
|
// Check if existing DECISIONS.md has freeform (non-table) content.
|
|
@@ -460,51 +523,6 @@ export async function saveDecisionToDb(fields, basePath) {
|
|
|
460
523
|
invalidateStateCache();
|
|
461
524
|
clearPathCache();
|
|
462
525
|
clearParseCache();
|
|
463
|
-
// ADR-013 dual-write: keep the memory store in sync with every decision
|
|
464
|
-
// persisted via the legacy gsd_save_decision path. Without this, prompts
|
|
465
|
-
// that still call gsd_save_decision (discuss.md, plan-milestone.md,
|
|
466
|
-
// plan-slice.md, et al.) would create decisions rows invisible to
|
|
467
|
-
// memory_query and loadMemoryBlock.
|
|
468
|
-
// Best-effort — never throw, never roll back the decision on failure.
|
|
469
|
-
try {
|
|
470
|
-
const { createMemory } = await import('./memory-store.js');
|
|
471
|
-
const decisionText = (fields.decision ?? '').trim();
|
|
472
|
-
const choiceText = (fields.choice ?? '').trim();
|
|
473
|
-
const rationaleText = (fields.rationale ?? '').trim();
|
|
474
|
-
const contentParts = [];
|
|
475
|
-
if (decisionText)
|
|
476
|
-
contentParts.push(decisionText);
|
|
477
|
-
if (choiceText)
|
|
478
|
-
contentParts.push(`Chose: ${choiceText}.`);
|
|
479
|
-
if (rationaleText)
|
|
480
|
-
contentParts.push(`Rationale: ${rationaleText}.`);
|
|
481
|
-
const content = contentParts.join(' ').slice(0, 600);
|
|
482
|
-
if (content) {
|
|
483
|
-
createMemory({
|
|
484
|
-
category: 'architecture',
|
|
485
|
-
content,
|
|
486
|
-
scope: fields.scope || 'project',
|
|
487
|
-
confidence: 0.85,
|
|
488
|
-
structuredFields: {
|
|
489
|
-
sourceDecisionId: id,
|
|
490
|
-
when_context: fields.when_context ?? '',
|
|
491
|
-
scope: fields.scope,
|
|
492
|
-
decision: fields.decision,
|
|
493
|
-
choice: fields.choice,
|
|
494
|
-
rationale: fields.rationale,
|
|
495
|
-
made_by: fields.made_by ?? 'agent',
|
|
496
|
-
revisable: fields.revisable ?? '',
|
|
497
|
-
},
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
catch (mirrorErr) {
|
|
502
|
-
logError('manifest', 'memory-store mirror write failed (non-fatal)', {
|
|
503
|
-
fn: 'saveDecisionToDb',
|
|
504
|
-
decisionId: id,
|
|
505
|
-
error: String(mirrorErr.message),
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
526
|
return { id };
|
|
509
527
|
}
|
|
510
528
|
catch (err) {
|
|
@@ -515,6 +533,54 @@ export async function saveDecisionToDb(fields, basePath) {
|
|
|
515
533
|
release();
|
|
516
534
|
}
|
|
517
535
|
}
|
|
536
|
+
/**
|
|
537
|
+
* ADR-013 dual-write — mirror a freshly-saved decision into the `memories`
|
|
538
|
+
* table so the memory store remains the single source of truth for the
|
|
539
|
+
* DECISIONS.md projection (Stage 2a) and for prompt-inline reads (Stage 1).
|
|
540
|
+
*
|
|
541
|
+
* Best-effort mirror: logs failures without throwing to avoid blocking saves.
|
|
542
|
+
* Caller invokes this AFTER the decisions-table write completes and
|
|
543
|
+
* BEFORE the projection regen — the regen sources from memories and would
|
|
544
|
+
* otherwise miss the just-saved decision.
|
|
545
|
+
*/
|
|
546
|
+
async function mirrorDecisionToMemory(id, normalizedFields) {
|
|
547
|
+
try {
|
|
548
|
+
const { createMemory } = await import('./memory-store.js');
|
|
549
|
+
const { synthesizeDecisionMemoryContent } = await import('./memory-backfill.js');
|
|
550
|
+
const content = synthesizeDecisionMemoryContent(normalizedFields);
|
|
551
|
+
if (!content)
|
|
552
|
+
return false;
|
|
553
|
+
createMemory({
|
|
554
|
+
category: 'architecture',
|
|
555
|
+
content,
|
|
556
|
+
scope: normalizedFields.scope || 'project',
|
|
557
|
+
confidence: 0.85,
|
|
558
|
+
structuredFields: {
|
|
559
|
+
sourceDecisionId: id,
|
|
560
|
+
when_context: normalizedFields.when_context,
|
|
561
|
+
scope: normalizedFields.scope,
|
|
562
|
+
decision: normalizedFields.decision,
|
|
563
|
+
choice: normalizedFields.choice,
|
|
564
|
+
rationale: normalizedFields.rationale,
|
|
565
|
+
made_by: normalizedFields.made_by,
|
|
566
|
+
revisable: normalizedFields.revisable,
|
|
567
|
+
// New decisions are always written as active; md-importer can later
|
|
568
|
+
// set superseded_by on the source decision row, and the backfill's
|
|
569
|
+
// drift auto-heal pass propagates that update to this memory.
|
|
570
|
+
superseded_by: null,
|
|
571
|
+
},
|
|
572
|
+
});
|
|
573
|
+
return true;
|
|
574
|
+
}
|
|
575
|
+
catch (mirrorErr) {
|
|
576
|
+
logError('manifest', 'memory-store mirror write failed', {
|
|
577
|
+
fn: 'saveDecisionToDb',
|
|
578
|
+
decisionId: id,
|
|
579
|
+
error: String(mirrorErr.message),
|
|
580
|
+
});
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
518
584
|
/**
|
|
519
585
|
* Extract a milestone/slice reference from a deferral decision.
|
|
520
586
|
*
|
|
@@ -4,7 +4,7 @@ import { findMilestoneIds } from "./guided-flow.js";
|
|
|
4
4
|
import { parseUnitId } from "./unit-id.js";
|
|
5
5
|
import { isDbAvailable, getMilestoneSlices, getMilestone } from "./gsd-db.js";
|
|
6
6
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
7
|
-
import { isClosedStatus } from "./status-guards.js";
|
|
7
|
+
import { isClosedStatus, isSkippedForDispatch } from "./status-guards.js";
|
|
8
8
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
9
9
|
import { readFileSync } from "node:fs";
|
|
10
10
|
const SLICE_DISPATCH_TYPES = new Set([
|
|
@@ -49,7 +49,7 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
49
49
|
// DB-backed projects must not treat SUMMARY.md as authoritative.
|
|
50
50
|
if (isDbAvailable()) {
|
|
51
51
|
const milestoneRow = getMilestone(mid);
|
|
52
|
-
if (milestoneRow &&
|
|
52
|
+
if (milestoneRow && isSkippedForDispatch(milestoneRow.status))
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
@@ -100,7 +100,7 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
100
100
|
|
|
101
101
|
- `skill_rules`: situational rules with a human-readable `when` trigger and one or more of `use`, `prefer`, or `avoid`.
|
|
102
102
|
|
|
103
|
-
- `custom_instructions`: extra durable instructions related to skill use. For operational project knowledge
|
|
103
|
+
- `custom_instructions`: extra durable instructions related to skill use. For operational project knowledge, use `.gsd/KNOWLEDGE.md` instead. Rules are file-canonical; patterns and lessons are persisted to the `memories` table and projected back into `KNOWLEDGE.md` on the next session start.
|
|
104
104
|
|
|
105
105
|
- `language`: preferred response language for all GSD interactions. Accepts any language name or code — `"Chinese"`, `"zh"`, `"German"`, `"de"`, `"日本語"`, etc. When set, GSD injects "Always respond in \<language\>" into every agent's system prompt, including after `/clear`. Quickest way to set it: `/gsd language <name>`. To clear: `/gsd language off`.
|
|
106
106
|
|