@opengsd/gsd-pi 1.3.0-dev.65546769 → 1.3.0-dev.738160b9
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/cli.js +17 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- 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 +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +34 -20
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +29 -14
- package/dist/resources/extensions/gsd/auto-recovery.js +9 -510
- 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/auto.js +19 -10
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -13
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -21
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -19
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -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/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +17 -11
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- 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/engine.js +4 -1
- package/dist/resources/extensions/gsd/db/queries.js +60 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +55 -3
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
- 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 +53 -11
- 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 +61 -4
- package/dist/resources/extensions/gsd/gitignore.js +4 -1
- 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/migrate-external.js +11 -2
- 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-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/dist/resources/extensions/gsd/quick.js +45 -2
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/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/tools/plan-slice.js +59 -44
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -5
- 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 +36 -6
- 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 +126 -13
- 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 +10 -10
- 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 +10 -10
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- 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-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/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 +35 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/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/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +20 -2
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +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/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +25 -11
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +35 -24
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +41 -15
- package/src/resources/extensions/gsd/auto-recovery.ts +13 -511
- 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/auto.ts +23 -8
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +125 -12
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -21
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +52 -18
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -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/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -10
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- 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/engine.ts +8 -1
- package/src/resources/extensions/gsd/db/queries.ts +79 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +61 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
- 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/doctor-types.ts +3 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
- 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 +69 -5
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- 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/migrate-external.ts +8 -2
- 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-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/src/resources/extensions/gsd/quick.ts +43 -2
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/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-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- 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/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/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/doctor-scope-db-unavailable.test.ts +239 -2
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -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/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/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 +4 -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/plan-slice.test.ts +103 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- 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/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/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/register-hooks-loop-guard-auto.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +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 +208 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
- 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/uok-gitops-turn-action.test.ts +38 -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 +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +6 -5
- 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/tools/plan-slice.ts +60 -47
- package/src/resources/extensions/gsd/tools/plan-task.ts +30 -5
- 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 +36 -6
- 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 +141 -7
- 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 → 2A_WqqCS-EoYZxN9_v3d2}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BTKtGFF1Y-hvVJEGhBRo9 → 2A_WqqCS-EoYZxN9_v3d2}/_ssgManifest.js +0 -0
|
@@ -24,8 +24,8 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
24
24
|
* - Idempotent (per-row): each migrated memory carries
|
|
25
25
|
* `structured_fields.sourceKnowledgeId = "<P|L>NNN"`. Rows whose ID is
|
|
26
26
|
* already present in the memory store are skipped.
|
|
27
|
-
* - Best-effort: never throws.
|
|
28
|
-
* backfill cannot block
|
|
27
|
+
* - Best-effort: never throws. Failed memory inserts are logged and skipped;
|
|
28
|
+
* setup/read failures log and return 0 so backfill cannot block startup.
|
|
29
29
|
* - Rules (K###) are intentionally skipped — they remain manually maintained
|
|
30
30
|
* in `KNOWLEDGE.md` per ADR-013.
|
|
31
31
|
*
|
|
@@ -56,15 +56,22 @@ export function backfillKnowledgeToMemories(basePath) {
|
|
|
56
56
|
const matchPattern = `%"sourceKnowledgeId":"${synth.id}"%`;
|
|
57
57
|
if (checkExisting.get({ ":pattern": matchPattern }))
|
|
58
58
|
continue;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
try {
|
|
60
|
+
const id = createMemory({
|
|
61
|
+
category: synth.category,
|
|
62
|
+
content: synth.content,
|
|
63
|
+
scope: synth.scope,
|
|
64
|
+
confidence: 0.85,
|
|
65
|
+
structuredFields: synth.structuredFields,
|
|
66
|
+
});
|
|
67
|
+
if (id)
|
|
68
|
+
written += 1;
|
|
69
|
+
}
|
|
70
|
+
catch (rowErr) {
|
|
71
|
+
const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
|
|
72
|
+
logWarning("knowledge-backfill", `KNOWLEDGE.md -> memories backfill skipped ${synth.id}: ${message}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
68
75
|
}
|
|
69
76
|
return written;
|
|
70
77
|
}
|
|
@@ -40,8 +40,10 @@ export function dbPath(basePath) {
|
|
|
40
40
|
* Used by the renderer to derive the phase number from the DB's milestone_id.
|
|
41
41
|
*/
|
|
42
42
|
export function milestoneIdToPhaseNum(milestoneId) {
|
|
43
|
-
// No $ anchor: accepts bare (M012)
|
|
43
|
+
// No $ anchor: accepts bare (M012), team-suffixed (M012-abc123), and legacy numeric IDs.
|
|
44
44
|
const m = milestoneId.match(/^M0*(\d+)/i);
|
|
45
|
+
if (!m && /^\d+$/.test(milestoneId))
|
|
46
|
+
return Number.parseInt(milestoneId, 10);
|
|
45
47
|
return m ? Number.parseInt(m[1], 10) : 1;
|
|
46
48
|
}
|
|
47
49
|
/** Team-mode suffix from milestone ids like M001-abc123. */
|
|
@@ -12,7 +12,7 @@ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:
|
|
|
12
12
|
import { logWarning } from "./workflow-logger.js";
|
|
13
13
|
import { isClosedStatus } from "./status-guards.js";
|
|
14
14
|
import { dirname, join, relative } from "node:path";
|
|
15
|
-
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, } from "./gsd-db.js";
|
|
15
|
+
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
|
|
16
16
|
import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
|
|
17
17
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
18
18
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
@@ -518,13 +518,8 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
|
|
|
518
518
|
* @returns true if the roadmap was written, false on skip/error
|
|
519
519
|
*/
|
|
520
520
|
export async function renderRoadmapCheckboxes(basePath, milestoneId) {
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
process.stderr.write(`markdown-renderer: no slices found for milestone ${milestoneId}\n`);
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
await renderRoadmapFromDb(basePath, milestoneId);
|
|
527
|
-
return true;
|
|
521
|
+
const rendered = await renderRoadmapFromDb(basePath, milestoneId);
|
|
522
|
+
return !("skipped" in rendered);
|
|
528
523
|
}
|
|
529
524
|
/**
|
|
530
525
|
* Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
|
|
@@ -604,11 +599,15 @@ function isAutoRecoveryPlaceholderPlan(content) {
|
|
|
604
599
|
* projection (the 4S/0T-vs-5S/13T drift class). The artifacts table is an
|
|
605
600
|
* output sink, never a render input.
|
|
606
601
|
*
|
|
607
|
-
* @returns true if the plan was written, false
|
|
602
|
+
* @returns true if the plan was written, false when the DB slice has no tasks
|
|
603
|
+
* @throws when the DB connection is unavailable or the render write fails
|
|
608
604
|
*/
|
|
609
605
|
export async function renderPlanCheckboxes(basePath, milestoneId, sliceId, outputPath) {
|
|
610
606
|
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
611
607
|
if (tasks.length === 0) {
|
|
608
|
+
if (!isDbAvailable()) {
|
|
609
|
+
throw new Error(`database unavailable while rendering plan checkboxes for ${milestoneId}/${sliceId}`);
|
|
610
|
+
}
|
|
612
611
|
process.stderr.write(`markdown-renderer: no tasks found for ${milestoneId}/${sliceId}\n`);
|
|
613
612
|
return false;
|
|
614
613
|
}
|
|
@@ -33,8 +33,8 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
33
33
|
* decision is checked individually; only decisions whose id is already
|
|
34
34
|
* present in the memory store are skipped. A user-authored memory with
|
|
35
35
|
* their own `sourceDecisionId` does NOT abort the backfill.
|
|
36
|
-
* - Best-effort: never throws.
|
|
37
|
-
* backfill cannot block
|
|
36
|
+
* - Best-effort: never throws. Failed memory inserts are logged and skipped;
|
|
37
|
+
* setup/read failures log and return 0 so backfill cannot block startup.
|
|
38
38
|
* - Full migration (ADR-013 Stage 2a): both active and superseded rows are
|
|
39
39
|
* migrated. `structured_fields.superseded_by` preserves the supersedes
|
|
40
40
|
* chain so the DECISIONS.md projection regen can source from memories
|
|
@@ -117,25 +117,32 @@ export function backfillDecisionsToMemories() {
|
|
|
117
117
|
continue;
|
|
118
118
|
}
|
|
119
119
|
const content = synthesizeDecisionMemoryContent(row);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
120
|
+
try {
|
|
121
|
+
const id = createMemory({
|
|
122
|
+
category: "architecture",
|
|
123
|
+
content,
|
|
124
|
+
scope: row.scope || "project",
|
|
125
|
+
confidence: 0.85,
|
|
126
|
+
structuredFields: {
|
|
127
|
+
sourceDecisionId: row.id,
|
|
128
|
+
when_context: row.when_context,
|
|
129
|
+
scope: row.scope,
|
|
130
|
+
decision: row.decision,
|
|
131
|
+
choice: row.choice,
|
|
132
|
+
rationale: row.rationale,
|
|
133
|
+
made_by: row.made_by,
|
|
134
|
+
revisable: row.revisable,
|
|
135
|
+
superseded_by: row.superseded_by,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
if (id)
|
|
139
|
+
written += 1;
|
|
140
|
+
}
|
|
141
|
+
catch (rowErr) {
|
|
142
|
+
const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
|
|
143
|
+
logWarning("memory-backfill", `decisions->memories backfill skipped ${row.id}: ${message}`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
139
146
|
}
|
|
140
147
|
if (healed > 0) {
|
|
141
148
|
logWarning("memory-backfill", `decisions->memories drift healed: ${healed} row${healed === 1 ? "" : "s"} updated superseded_by`);
|
|
@@ -94,27 +94,48 @@ function getActiveDecisions() {
|
|
|
94
94
|
return [];
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
*/
|
|
103
|
-
function memoryHasSourceMarker(markerKey, value) {
|
|
97
|
+
function emptyMemorySourceMarkers() {
|
|
98
|
+
return { decisionIds: new Set(), knowledgeIds: new Set() };
|
|
99
|
+
}
|
|
100
|
+
function getMemorySourceMarkers() {
|
|
101
|
+
const markers = emptyMemorySourceMarkers();
|
|
104
102
|
if (!isDbAvailable())
|
|
105
|
-
return
|
|
103
|
+
return markers;
|
|
106
104
|
const adapter = _getAdapter();
|
|
107
105
|
if (!adapter)
|
|
108
|
-
return
|
|
106
|
+
return markers;
|
|
109
107
|
try {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
.
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
const rows = adapter
|
|
109
|
+
.prepare("SELECT structured_fields FROM memories WHERE structured_fields IS NOT NULL")
|
|
110
|
+
.all();
|
|
111
|
+
for (const row of rows) {
|
|
112
|
+
collectMemorySourceMarker(markers, row["structured_fields"]);
|
|
113
|
+
}
|
|
115
114
|
}
|
|
116
115
|
catch {
|
|
117
|
-
return
|
|
116
|
+
return markers;
|
|
117
|
+
}
|
|
118
|
+
return markers;
|
|
119
|
+
}
|
|
120
|
+
function collectMemorySourceMarker(markers, raw) {
|
|
121
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
122
|
+
return;
|
|
123
|
+
try {
|
|
124
|
+
const parsed = JSON.parse(raw);
|
|
125
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
126
|
+
return;
|
|
127
|
+
const fields = parsed;
|
|
128
|
+
const decisionId = fields["sourceDecisionId"];
|
|
129
|
+
if (typeof decisionId === "string" && decisionId.length > 0) {
|
|
130
|
+
markers.decisionIds.add(decisionId);
|
|
131
|
+
}
|
|
132
|
+
const knowledgeId = fields["sourceKnowledgeId"];
|
|
133
|
+
if (typeof knowledgeId === "string" && knowledgeId.length > 0) {
|
|
134
|
+
markers.knowledgeIds.add(knowledgeId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return;
|
|
118
139
|
}
|
|
119
140
|
}
|
|
120
141
|
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
@@ -127,10 +148,14 @@ const SAMPLE_LIMIT = 5;
|
|
|
127
148
|
export function scanConsolidationGaps(basePath) {
|
|
128
149
|
// ── Decisions ────────────────────────────────────────────────────────
|
|
129
150
|
const decisions = getActiveDecisions();
|
|
151
|
+
const knowledgeRows = parseKnowledgeRows(knowledgeMdContent(basePath));
|
|
152
|
+
const memorySourceMarkers = decisions.length > 0 || knowledgeRows.length > 0
|
|
153
|
+
? getMemorySourceMarkers()
|
|
154
|
+
: emptyMemorySourceMarkers();
|
|
130
155
|
const decisionSamples = [];
|
|
131
156
|
let decisionMigrated = 0;
|
|
132
157
|
for (const decision of decisions) {
|
|
133
|
-
if (
|
|
158
|
+
if (memorySourceMarkers.decisionIds.has(decision.id)) {
|
|
134
159
|
decisionMigrated += 1;
|
|
135
160
|
continue;
|
|
136
161
|
}
|
|
@@ -142,16 +167,14 @@ export function scanConsolidationGaps(basePath) {
|
|
|
142
167
|
}
|
|
143
168
|
}
|
|
144
169
|
// ── KNOWLEDGE.md ─────────────────────────────────────────────────────
|
|
145
|
-
const knowledgeRows = parseKnowledgeRows(knowledgeMdContent(basePath));
|
|
146
170
|
const knowledgeByTable = { rules: 0, patterns: 0, lessons: 0 };
|
|
147
171
|
const knowledgeSamples = [];
|
|
148
172
|
let knowledgeMigrated = 0;
|
|
149
173
|
for (const row of knowledgeRows) {
|
|
150
174
|
knowledgeByTable[row.table] += 1;
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
if (memoryHasSourceMarker("sourceKnowledgeId", row.id)) {
|
|
175
|
+
// KNOWLEDGE.md backfill writes `sourceKnowledgeId`; rows without that
|
|
176
|
+
// marker are still reported as consolidation gaps.
|
|
177
|
+
if (memorySourceMarkers.knowledgeIds.has(row.id)) {
|
|
155
178
|
knowledgeMigrated += 1;
|
|
156
179
|
continue;
|
|
157
180
|
}
|
|
@@ -17,7 +17,7 @@ import { join } from "node:path";
|
|
|
17
17
|
import { openSync, closeSync, unlinkSync, statSync, writeFileSync } from "node:fs";
|
|
18
18
|
import { gsdRoot } from "./paths.js";
|
|
19
19
|
import { getAndClearSkills } from "./skill-telemetry.js";
|
|
20
|
-
import { loadJsonFile, loadJsonFileOrNull,
|
|
20
|
+
import { loadJsonFile, loadJsonFileOrNull, saveJsonFileCompact } from "./json-persistence.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
22
22
|
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
23
23
|
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
@@ -636,7 +636,7 @@ export function pruneMetricsLedger(base, keepCount) {
|
|
|
636
636
|
return 0;
|
|
637
637
|
const removed = disk.units.length - keepCount;
|
|
638
638
|
disk.units = keepNewestUnits(disk.units, keepCount);
|
|
639
|
-
|
|
639
|
+
saveJsonFileCompact(metricsPath(base), disk);
|
|
640
640
|
// Keep the in-memory ledger in sync if it is loaded for this session.
|
|
641
641
|
if (ledger) {
|
|
642
642
|
ledger.units = keepNewestUnits(ledger.units, keepCount);
|
|
@@ -799,7 +799,7 @@ function saveLedger(base, data) {
|
|
|
799
799
|
: dataUnits;
|
|
800
800
|
merged.sort(compareUnitsByTime);
|
|
801
801
|
data.units = keepNewestUnits(merged);
|
|
802
|
-
|
|
802
|
+
saveJsonFileCompact(path, data);
|
|
803
803
|
}
|
|
804
804
|
finally {
|
|
805
805
|
releaseLock(lockPath);
|
|
@@ -813,6 +813,6 @@ function saveLedger(base, data) {
|
|
|
813
813
|
// read-merge-write sequence without mutual exclusion.
|
|
814
814
|
logWarning("fs", "saveLedger: lock not acquired — falling back to direct write (no merge)");
|
|
815
815
|
data.units = keepNewestUnits(data.units);
|
|
816
|
-
|
|
816
|
+
saveJsonFileCompact(path, data);
|
|
817
817
|
}
|
|
818
818
|
}
|
|
@@ -110,6 +110,7 @@ export function migrateToExternalState(basePath) {
|
|
|
110
110
|
}
|
|
111
111
|
// Copy contents to external dir, skipping worktrees/
|
|
112
112
|
const entries = readdirSync(migratingPath, { withFileTypes: true });
|
|
113
|
+
const copyFailures = [];
|
|
113
114
|
for (const entry of entries) {
|
|
114
115
|
if (entry.name === "worktrees")
|
|
115
116
|
continue; // worktrees stay local
|
|
@@ -123,10 +124,18 @@ export function migrateToExternalState(basePath) {
|
|
|
123
124
|
cpSync(src, dst, { force: true });
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
|
-
catch {
|
|
127
|
-
|
|
127
|
+
catch (copyErr) {
|
|
128
|
+
copyFailures.push(`${entry.name}: ${getErrorMessage(copyErr)}`);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
131
|
+
if (copyFailures.length > 0) {
|
|
132
|
+
try {
|
|
133
|
+
rmSync(localGsd, { force: true });
|
|
134
|
+
}
|
|
135
|
+
catch { /* may not exist */ }
|
|
136
|
+
renameSync(migratingPath, localGsd);
|
|
137
|
+
return { migrated: false, error: `Migration copy failed: ${copyFailures.join("; ")}` };
|
|
138
|
+
}
|
|
130
139
|
// Create symlink .gsd -> external path
|
|
131
140
|
symlinkSync(externalPath, localGsd, "junction");
|
|
132
141
|
// Verify the symlink resolves correctly before removing the backup (#1377).
|
|
@@ -45,6 +45,27 @@ function scanHasExtraIdentities(a, b) {
|
|
|
45
45
|
hasExtra(a.slices, b.slices) ||
|
|
46
46
|
hasExtra(a.tasks, b.tasks));
|
|
47
47
|
}
|
|
48
|
+
function paddedMilestoneId(id) {
|
|
49
|
+
return /^\d+$/.test(id) ? `M${id.padStart(3, "0")}` : null;
|
|
50
|
+
}
|
|
51
|
+
function replaceSetPrefix(values, from, to) {
|
|
52
|
+
for (const value of [...values]) {
|
|
53
|
+
if (value !== from && !value.startsWith(`${from}/`))
|
|
54
|
+
continue;
|
|
55
|
+
values.delete(value);
|
|
56
|
+
values.add(`${to}${value.slice(from.length)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function alignNumericMarkdownIdsWithDb(markdownScan, dbScan) {
|
|
60
|
+
for (const dbId of dbScan.milestones) {
|
|
61
|
+
const paddedId = paddedMilestoneId(dbId);
|
|
62
|
+
if (!paddedId || dbScan.milestones.has(paddedId) || !markdownScan.milestones.has(paddedId))
|
|
63
|
+
continue;
|
|
64
|
+
replaceSetPrefix(markdownScan.milestones, paddedId, dbId);
|
|
65
|
+
replaceSetPrefix(markdownScan.slices, paddedId, dbId);
|
|
66
|
+
replaceSetPrefix(markdownScan.tasks, paddedId, dbId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
48
69
|
/**
|
|
49
70
|
* True when the DB holds any milestone/slice/task identity the markdown lacks —
|
|
50
71
|
* i.e. a `/gsd recover --confirm` (markdown → DB) would DELETE authoritative DB
|
|
@@ -126,6 +147,7 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
|
|
|
126
147
|
refreshWorkflowDatabaseFromDisk();
|
|
127
148
|
const dbScan = scanDbHierarchy();
|
|
128
149
|
const beforeDb = dbScan.counts;
|
|
150
|
+
alignNumericMarkdownIdsWithDb(markdownScan, dbScan);
|
|
129
151
|
// Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
|
|
130
152
|
// a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
|
|
131
153
|
// queued DB row is inserted only at discussion handoff). Treating it as
|
|
@@ -123,7 +123,8 @@ export function clearReservedMilestoneIds() {
|
|
|
123
123
|
reservedMilestoneIds.clear();
|
|
124
124
|
}
|
|
125
125
|
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
126
|
-
function scanMilestoneIdsFromDir(dir) {
|
|
126
|
+
function scanMilestoneIdsFromDir(basePath, dir) {
|
|
127
|
+
const legacyNumericIds = idsWithLegacyNumericDirs(basePath);
|
|
127
128
|
return readdirSync(dir, { withFileTypes: true })
|
|
128
129
|
.filter((d) => d.isDirectory())
|
|
129
130
|
.map((d) => {
|
|
@@ -131,6 +132,12 @@ function scanMilestoneIdsFromDir(dir) {
|
|
|
131
132
|
if (MILESTONE_ID_RE.test(d.name)) {
|
|
132
133
|
return d.name;
|
|
133
134
|
}
|
|
135
|
+
// Legacy recovery/imports may contain bare numeric milestone directories
|
|
136
|
+
// (for example `milestones/15/15-ROADMAP.md`). The DB can preserve that
|
|
137
|
+
// id, and rebuild renders it, so drift scans must see it too.
|
|
138
|
+
if (/^\d+$/.test(d.name)) {
|
|
139
|
+
return d.name;
|
|
140
|
+
}
|
|
134
141
|
// Legacy layout: M001-abcdef-slug descriptor directories
|
|
135
142
|
const legacyMatch = d.name.match(/^(M\d{3}(?:-[a-z0-9]{6})?)-/);
|
|
136
143
|
if (legacyMatch) {
|
|
@@ -144,12 +151,35 @@ function scanMilestoneIdsFromDir(dir) {
|
|
|
144
151
|
if (MILESTONE_ID_RE.test(fromSlug)) {
|
|
145
152
|
return fromSlug;
|
|
146
153
|
}
|
|
154
|
+
const numericId = String(phaseNum);
|
|
155
|
+
if (legacyNumericIds.has(numericId)) {
|
|
156
|
+
return numericId;
|
|
157
|
+
}
|
|
147
158
|
return `M${String(phaseNum).padStart(3, "0")}`;
|
|
148
159
|
}
|
|
149
160
|
return null;
|
|
150
161
|
})
|
|
151
162
|
.filter((id) => id !== null);
|
|
152
163
|
}
|
|
164
|
+
function idsWithLegacyNumericDirs(basePath) {
|
|
165
|
+
const legacyDir = join(gsdProjectionRoot(basePath), "milestones");
|
|
166
|
+
const ids = new Set();
|
|
167
|
+
try {
|
|
168
|
+
for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
|
|
169
|
+
if (entry.isDirectory() && /^\d+$/.test(entry.name))
|
|
170
|
+
ids.add(entry.name);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
// A missing legacy directory is the common, benign case (nothing to
|
|
175
|
+
// consult). Only surface a real failure when the directory exists but
|
|
176
|
+
// could not be read.
|
|
177
|
+
if (existsSync(legacyDir)) {
|
|
178
|
+
logWarning("engine", `idsWithLegacyNumericDirs: ${legacyDir} exists but readdirSync failed — ${getErrorMessage(err)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return ids;
|
|
182
|
+
}
|
|
153
183
|
/** Scan the milestones directory and return IDs sorted by queue order (or numeric fallback). */
|
|
154
184
|
export function findMilestoneIds(basePath) {
|
|
155
185
|
const root = gsdProjectionRoot(basePath);
|
|
@@ -163,7 +193,7 @@ export function findMilestoneIds(basePath) {
|
|
|
163
193
|
const ids = new Set();
|
|
164
194
|
for (const dir of dirs) {
|
|
165
195
|
try {
|
|
166
|
-
for (const id of scanMilestoneIdsFromDir(dir))
|
|
196
|
+
for (const id of scanMilestoneIdsFromDir(basePath, dir))
|
|
167
197
|
ids.add(id);
|
|
168
198
|
}
|
|
169
199
|
catch (err) {
|
|
@@ -10,6 +10,8 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
10
10
|
import { resolveTasksDir } from "./paths.js";
|
|
11
11
|
/** Large enough for unbounded milestone-history git log scans in big repos. */
|
|
12
12
|
const GIT_LOG_MAX_BUFFER = 16 * 1024 * 1024;
|
|
13
|
+
const LOG_FIELD_SEPARATOR = "\x1f";
|
|
14
|
+
const LOG_RECORD_SEPARATOR = "\x1e";
|
|
13
15
|
/**
|
|
14
16
|
* Check whether a milestone produced implementation artifacts (non-`.gsd/`
|
|
15
17
|
* files) in git history. The primary signal is the branch diff against the
|
|
@@ -179,7 +181,7 @@ function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
|
|
|
179
181
|
// Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
|
|
180
182
|
// by depth when .gsd/ is tracked in git.
|
|
181
183
|
const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
182
|
-
"log", "--format=%H%x1f%B%
|
|
184
|
+
"log", "--full-diff", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
|
|
183
185
|
]);
|
|
184
186
|
if (!scoped.ok)
|
|
185
187
|
return scoped;
|
|
@@ -195,7 +197,7 @@ function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
|
|
|
195
197
|
// reintroducing the rolling-depth failure class removed in #4699 where
|
|
196
198
|
// milestone evidence aged out behind unrelated activity.
|
|
197
199
|
const unscoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
198
|
-
"log", "--format=%H%x1f%B%
|
|
200
|
+
"log", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD",
|
|
199
201
|
]);
|
|
200
202
|
if (!unscoped.ok)
|
|
201
203
|
return scoped.matched ? scoped : unscoped;
|
|
@@ -280,8 +282,7 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId)
|
|
|
280
282
|
continue;
|
|
281
283
|
if (commitMessageHasGsdTrailer(record.message))
|
|
282
284
|
continue;
|
|
283
|
-
const
|
|
284
|
-
const implementationFiles = commitFiles.map(normalizeRepoPath).filter(isImplementationPath);
|
|
285
|
+
const implementationFiles = record.files.map(normalizeRepoPath).filter(isImplementationPath);
|
|
285
286
|
if (implementationFiles.length === 0)
|
|
286
287
|
continue;
|
|
287
288
|
if (!implementationFiles.some((file) => hintSet.has(file)))
|
|
@@ -306,24 +307,28 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId)
|
|
|
306
307
|
}
|
|
307
308
|
}
|
|
308
309
|
function getCommitRecords(basePath) {
|
|
309
|
-
const logOutput = execFileSync("git", ["log", "--format=%H%x1f%P%x1f%cI%x1f%B%
|
|
310
|
+
const logOutput = execFileSync("git", ["log", "--name-only", "--format=%x1e%H%x1f%P%x1f%cI%x1f%B%x1f", "HEAD"], {
|
|
310
311
|
cwd: basePath,
|
|
311
312
|
stdio: ["ignore", "pipe", "pipe"],
|
|
312
313
|
encoding: "utf-8",
|
|
313
314
|
maxBuffer: GIT_LOG_MAX_BUFFER,
|
|
314
315
|
});
|
|
315
316
|
return logOutput
|
|
316
|
-
.split(
|
|
317
|
-
.map((record) => record.trim())
|
|
317
|
+
.split(LOG_RECORD_SEPARATOR)
|
|
318
318
|
.filter(Boolean)
|
|
319
319
|
.flatMap((record) => {
|
|
320
|
-
const parts = record.split(
|
|
321
|
-
if (parts.length <
|
|
320
|
+
const parts = record.split(LOG_FIELD_SEPARATOR);
|
|
321
|
+
if (parts.length < 5)
|
|
322
322
|
return [];
|
|
323
|
-
const [hash, parents, committedAt
|
|
324
|
-
|
|
323
|
+
const [hash, parents, committedAt] = parts;
|
|
324
|
+
const files = parseNameOnlyFiles(parts.at(-1) ?? "");
|
|
325
|
+
const message = parts.slice(3, -1).join(LOG_FIELD_SEPARATOR);
|
|
326
|
+
return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message, files }];
|
|
325
327
|
});
|
|
326
328
|
}
|
|
329
|
+
function parseNameOnlyFiles(rawFiles) {
|
|
330
|
+
return rawFiles.split(/\r?\n/).map((file) => file.trim()).filter(Boolean);
|
|
331
|
+
}
|
|
327
332
|
function isFullCommitSha(value) {
|
|
328
333
|
return /^[0-9a-f]{40}$/i.test(value);
|
|
329
334
|
}
|
|
@@ -336,23 +341,24 @@ function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
|
|
|
336
341
|
maxBuffer: GIT_LOG_MAX_BUFFER,
|
|
337
342
|
});
|
|
338
343
|
const records = logOutput
|
|
339
|
-
.split(
|
|
340
|
-
.map((record) => record.trim())
|
|
344
|
+
.split(LOG_RECORD_SEPARATOR)
|
|
341
345
|
.filter(Boolean)
|
|
342
346
|
.flatMap((record) => {
|
|
343
|
-
const
|
|
344
|
-
if (
|
|
347
|
+
const parts = record.split(LOG_FIELD_SEPARATOR);
|
|
348
|
+
if (parts.length < 3)
|
|
349
|
+
return [];
|
|
350
|
+
const hash = parts[0].trim();
|
|
351
|
+
if (!hash)
|
|
345
352
|
return [];
|
|
346
|
-
const
|
|
347
|
-
const message =
|
|
348
|
-
return [{
|
|
353
|
+
const files = parseNameOnlyFiles(parts.at(-1) ?? "");
|
|
354
|
+
const message = parts.slice(1, -1).join(LOG_FIELD_SEPARATOR);
|
|
355
|
+
return [{ message, files }];
|
|
349
356
|
});
|
|
350
357
|
const files = new Set();
|
|
351
358
|
let matched = false;
|
|
352
|
-
for (const {
|
|
359
|
+
for (const { message, files: commitFiles } of records) {
|
|
353
360
|
if (!commitMessageHasGsdTrailer(message))
|
|
354
361
|
continue;
|
|
355
|
-
const commitFiles = getChangedFilesForCommit(basePath, hash);
|
|
356
362
|
if (!commitMatchesMilestone(basePath, message, milestoneId, commitFiles))
|
|
357
363
|
continue;
|
|
358
364
|
matched = true;
|