gsd-pi 2.44.0 → 2.45.0-dev.6b9da3e
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 +30 -12
- package/dist/resources/extensions/gsd/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +37 -36
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +31 -2
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +9 -6
- package/dist/resources/extensions/gsd/auto.js +30 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +156 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +34 -16
- package/dist/resources/extensions/gsd/doctor.js +8 -0
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +12 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/preferences.js +9 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/rethink.md +78 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/state.js +41 -3
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +32 -2
- package/dist/resources/extensions/gsd/worktree-resolver.js +6 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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 +2 -2
- 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_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 +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 -4
- 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 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +6 -6
- 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 +6 -6
- 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 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- 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/middleware.js +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +20 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.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 +17 -8
- 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.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -1
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/phases.ts +46 -48
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +39 -2
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -6
- package/src/resources/extensions/gsd/auto.ts +37 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +148 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/db-writer.ts +39 -17
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +16 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/preferences.ts +11 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/rethink.md +78 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/state.ts +41 -1
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +43 -2
- package/src/resources/extensions/gsd/worktree-resolver.ts +7 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → rzO54ZboyINyEt7cVM_uS}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createTestContext } from './test-helpers.ts';
|
|
2
1
|
import { parseMemoryResponse, _resetExtractionState } from '../memory-extractor.ts';
|
|
3
2
|
import {
|
|
4
3
|
openDatabase,
|
|
@@ -10,15 +9,14 @@ import {
|
|
|
10
9
|
getActiveMemoriesRanked,
|
|
11
10
|
} from '../memory-store.ts';
|
|
12
11
|
import type { MemoryAction } from '../memory-store.ts';
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
import { describe, test, beforeEach, afterEach } from 'node:test';
|
|
13
|
+
import assert from 'node:assert/strict';
|
|
15
14
|
|
|
16
15
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
17
16
|
// memory-extractor: parse valid JSON response
|
|
18
17
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
{
|
|
19
|
+
test('memory-extractor: parse valid JSON', () => {
|
|
22
20
|
const response = JSON.stringify([
|
|
23
21
|
{ action: 'CREATE', category: 'gotcha', content: 'esbuild drops binaries', confidence: 0.85 },
|
|
24
22
|
{ action: 'REINFORCE', id: 'MEM001' },
|
|
@@ -27,56 +25,52 @@ console.log('\n=== memory-extractor: parse valid JSON ===');
|
|
|
27
25
|
]);
|
|
28
26
|
|
|
29
27
|
const actions = parseMemoryResponse(response);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
28
|
+
assert.deepStrictEqual(actions.length, 4, 'should parse 4 actions');
|
|
29
|
+
assert.deepStrictEqual(actions[0].action, 'CREATE', 'first action should be CREATE');
|
|
30
|
+
assert.deepStrictEqual((actions[0] as any).category, 'gotcha', 'CREATE category');
|
|
31
|
+
assert.deepStrictEqual((actions[0] as any).confidence, 0.85, 'CREATE confidence');
|
|
32
|
+
assert.deepStrictEqual(actions[1].action, 'REINFORCE', 'second action should be REINFORCE');
|
|
33
|
+
assert.deepStrictEqual(actions[2].action, 'UPDATE', 'third action should be UPDATE');
|
|
34
|
+
assert.deepStrictEqual(actions[3].action, 'SUPERSEDE', 'fourth action should be SUPERSEDE');
|
|
35
|
+
});
|
|
38
36
|
|
|
39
37
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
40
38
|
// memory-extractor: parse fenced JSON response
|
|
41
39
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
{
|
|
41
|
+
test('memory-extractor: parse fenced JSON', () => {
|
|
45
42
|
const response = '```json\n[\n {"action": "CREATE", "category": "convention", "content": "test memory"}\n]\n```';
|
|
46
43
|
|
|
47
44
|
const actions = parseMemoryResponse(response);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
45
|
+
assert.deepStrictEqual(actions.length, 1, 'should parse 1 action from fenced JSON');
|
|
46
|
+
assert.deepStrictEqual(actions[0].action, 'CREATE', 'action should be CREATE');
|
|
47
|
+
});
|
|
51
48
|
|
|
52
49
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
53
50
|
// memory-extractor: parse empty array response
|
|
54
51
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
{
|
|
53
|
+
test('memory-extractor: parse empty array', () => {
|
|
58
54
|
const actions = parseMemoryResponse('[]');
|
|
59
|
-
|
|
60
|
-
}
|
|
55
|
+
assert.deepStrictEqual(actions.length, 0, 'empty array should parse to empty actions');
|
|
56
|
+
});
|
|
61
57
|
|
|
62
58
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
63
59
|
// memory-extractor: parse malformed response
|
|
64
60
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
62
|
+
test('memory-extractor: malformed responses', () => {
|
|
63
|
+
assert.deepStrictEqual(parseMemoryResponse('not json at all'), [], 'garbage text should return []');
|
|
64
|
+
assert.deepStrictEqual(parseMemoryResponse('{"action": "CREATE"}'), [], 'non-array should return []');
|
|
65
|
+
assert.deepStrictEqual(parseMemoryResponse(''), [], 'empty string should return []');
|
|
66
|
+
assert.deepStrictEqual(parseMemoryResponse('```\nbroken\n```'), [], 'fenced non-JSON should return []');
|
|
67
|
+
});
|
|
73
68
|
|
|
74
69
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
75
70
|
// memory-extractor: validation of required fields
|
|
76
71
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
{
|
|
73
|
+
test('memory-extractor: field validation', () => {
|
|
80
74
|
const response = JSON.stringify([
|
|
81
75
|
// Valid CREATE
|
|
82
76
|
{ action: 'CREATE', category: 'gotcha', content: 'valid' },
|
|
@@ -103,19 +97,18 @@ console.log('\n=== memory-extractor: field validation ===');
|
|
|
103
97
|
]);
|
|
104
98
|
|
|
105
99
|
const actions = parseMemoryResponse(response);
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
100
|
+
assert.deepStrictEqual(actions.length, 4, 'should only accept 4 valid actions');
|
|
101
|
+
assert.deepStrictEqual(actions[0].action, 'CREATE', 'first valid is CREATE');
|
|
102
|
+
assert.deepStrictEqual(actions[1].action, 'REINFORCE', 'second valid is REINFORCE');
|
|
103
|
+
assert.deepStrictEqual(actions[2].action, 'UPDATE', 'third valid is UPDATE');
|
|
104
|
+
assert.deepStrictEqual(actions[3].action, 'SUPERSEDE', 'fourth valid is SUPERSEDE');
|
|
105
|
+
});
|
|
112
106
|
|
|
113
107
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
114
108
|
// Integration: applyMemoryActions with mixed actions
|
|
115
109
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
116
110
|
|
|
117
|
-
|
|
118
|
-
{
|
|
111
|
+
test('integration: mixed action lifecycle', () => {
|
|
119
112
|
openDatabase(':memory:');
|
|
120
113
|
|
|
121
114
|
// Phase 1: Create initial memories
|
|
@@ -126,7 +119,7 @@ console.log('\n=== integration: mixed action lifecycle ===');
|
|
|
126
119
|
], 'plan-slice', 'M001/S01');
|
|
127
120
|
|
|
128
121
|
let active = getActiveMemoriesRanked(30);
|
|
129
|
-
|
|
122
|
+
assert.deepStrictEqual(active.length, 3, 'phase 1: 3 active memories');
|
|
130
123
|
|
|
131
124
|
// Phase 2: Reinforce one, update another, create new
|
|
132
125
|
applyMemoryActions([
|
|
@@ -136,13 +129,13 @@ console.log('\n=== integration: mixed action lifecycle ===');
|
|
|
136
129
|
], 'execute-task', 'M001/S01/T01');
|
|
137
130
|
|
|
138
131
|
active = getActiveMemoriesRanked(30);
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
assert.deepStrictEqual(active.length, 4, 'phase 2: 4 active memories');
|
|
133
|
+
assert.deepStrictEqual(
|
|
141
134
|
active.find(m => m.id === 'MEM001')?.content,
|
|
142
135
|
'npm run build requires tsc --noEmit first',
|
|
143
136
|
'MEM001 content should be updated',
|
|
144
137
|
);
|
|
145
|
-
|
|
138
|
+
assert.deepStrictEqual(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
|
|
146
139
|
|
|
147
140
|
// Phase 3: Supersede MEM001 with MEM005
|
|
148
141
|
applyMemoryActions([
|
|
@@ -151,30 +144,28 @@ console.log('\n=== integration: mixed action lifecycle ===');
|
|
|
151
144
|
], 'execute-task', 'M001/S01/T02');
|
|
152
145
|
|
|
153
146
|
active = getActiveMemoriesRanked(30);
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
147
|
+
assert.deepStrictEqual(active.length, 4, 'phase 3: 4 active (1 superseded, 1 created)');
|
|
148
|
+
assert.ok(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
|
|
149
|
+
assert.ok(!!active.find(m => m.id === 'MEM005'), 'MEM005 should be active');
|
|
157
150
|
|
|
158
151
|
// Verify ranking: MEM003 (0.85) > MEM005 (0.9) but MEM002 has 1 hit
|
|
159
152
|
// MEM002: 0.8 * (1 + 1*0.1) = 0.88
|
|
160
153
|
// MEM003: 0.85 * 1.0 = 0.85
|
|
161
154
|
// MEM005: 0.9 * 1.0 = 0.9
|
|
162
155
|
// MEM004: 0.75 * 1.0 = 0.75
|
|
163
|
-
|
|
164
|
-
|
|
156
|
+
assert.deepStrictEqual(active[0].id, 'MEM005', 'MEM005 should rank first (0.9)');
|
|
157
|
+
assert.deepStrictEqual(active[1].id, 'MEM002', 'MEM002 should rank second (0.88)');
|
|
165
158
|
|
|
166
159
|
closeDatabase();
|
|
167
|
-
}
|
|
160
|
+
});
|
|
168
161
|
|
|
169
162
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
170
163
|
// memory-extractor: _resetExtractionState
|
|
171
164
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
172
165
|
|
|
173
|
-
|
|
174
|
-
{
|
|
166
|
+
test('memory-extractor: reset extraction state', () => {
|
|
175
167
|
// Just verify it doesn't throw
|
|
176
168
|
_resetExtractionState();
|
|
177
|
-
|
|
178
|
-
}
|
|
169
|
+
assert.ok(true, '_resetExtractionState should not throw');
|
|
170
|
+
});
|
|
179
171
|
|
|
180
|
-
report();
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createTestContext } from './test-helpers.ts';
|
|
2
1
|
import {
|
|
3
2
|
openDatabase,
|
|
4
3
|
closeDatabase,
|
|
@@ -21,94 +20,90 @@ import {
|
|
|
21
20
|
formatMemoriesForPrompt,
|
|
22
21
|
} from '../memory-store.ts';
|
|
23
22
|
import type { MemoryAction } from '../memory-store.ts';
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
import { describe, test, beforeEach, afterEach } from 'node:test';
|
|
24
|
+
import assert from 'node:assert/strict';
|
|
26
25
|
|
|
27
26
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
28
27
|
// memory-store: fallback when DB not open
|
|
29
28
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
{
|
|
30
|
+
test('memory-store: fallback returns empty when DB not open', () => {
|
|
33
31
|
closeDatabase();
|
|
34
|
-
|
|
32
|
+
assert.ok(!isDbAvailable(), 'DB should not be available');
|
|
35
33
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
34
|
+
assert.deepStrictEqual(getActiveMemories(), [], 'getActiveMemories returns [] when DB closed');
|
|
35
|
+
assert.deepStrictEqual(getActiveMemoriesRanked(), [], 'getActiveMemoriesRanked returns [] when DB closed');
|
|
36
|
+
assert.deepStrictEqual(nextMemoryId(), 'MEM001', 'nextMemoryId returns MEM001 when DB closed');
|
|
37
|
+
assert.deepStrictEqual(createMemory({ category: 'test', content: 'test' }), null, 'createMemory returns null when DB closed');
|
|
38
|
+
assert.ok(!reinforceMemory('MEM001'), 'reinforceMemory returns false when DB closed');
|
|
39
|
+
assert.ok(!isUnitProcessed('test/key'), 'isUnitProcessed returns false when DB closed');
|
|
40
|
+
});
|
|
43
41
|
|
|
44
42
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
45
43
|
// memory-store: CRUD operations
|
|
46
44
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
{
|
|
46
|
+
test('memory-store: create and query memories', () => {
|
|
50
47
|
openDatabase(':memory:');
|
|
51
48
|
|
|
52
49
|
// Create memories
|
|
53
50
|
const id1 = createMemory({ category: 'gotcha', content: 'esbuild drops .node binaries' });
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
assert.ok(id1 !== null, 'createMemory should return an ID');
|
|
52
|
+
assert.deepStrictEqual(id1, 'MEM001', 'first memory ID should be MEM001');
|
|
56
53
|
|
|
57
54
|
const id2 = createMemory({ category: 'convention', content: 'use :memory: for tests', confidence: 0.9 });
|
|
58
|
-
|
|
55
|
+
assert.deepStrictEqual(id2, 'MEM002', 'second memory ID should be MEM002');
|
|
59
56
|
|
|
60
57
|
const id3 = createMemory({ category: 'architecture', content: 'extensions discovered from src/resources/' });
|
|
61
|
-
|
|
58
|
+
assert.deepStrictEqual(id3, 'MEM003', 'third memory ID should be MEM003');
|
|
62
59
|
|
|
63
60
|
// Query all active
|
|
64
61
|
const active = getActiveMemories();
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
assert.deepStrictEqual(active.length, 3, 'should have 3 active memories');
|
|
63
|
+
assert.deepStrictEqual(active[0].category, 'gotcha', 'first memory category');
|
|
64
|
+
assert.deepStrictEqual(active[0].content, 'esbuild drops .node binaries', 'first memory content');
|
|
65
|
+
assert.deepStrictEqual(active[1].confidence, 0.9, 'second memory confidence');
|
|
69
66
|
|
|
70
67
|
closeDatabase();
|
|
71
|
-
}
|
|
68
|
+
});
|
|
72
69
|
|
|
73
70
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
74
71
|
// memory-store: update and reinforce
|
|
75
72
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
76
73
|
|
|
77
|
-
|
|
78
|
-
{
|
|
74
|
+
test('memory-store: update and reinforce', () => {
|
|
79
75
|
openDatabase(':memory:');
|
|
80
76
|
|
|
81
77
|
createMemory({ category: 'gotcha', content: 'original content' });
|
|
82
78
|
|
|
83
79
|
// Update content
|
|
84
80
|
const updated = updateMemoryContent('MEM001', 'revised content', 0.95);
|
|
85
|
-
|
|
81
|
+
assert.ok(updated, 'updateMemoryContent should return true');
|
|
86
82
|
|
|
87
83
|
const active = getActiveMemories();
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
assert.deepStrictEqual(active[0].content, 'revised content', 'content should be updated');
|
|
85
|
+
assert.deepStrictEqual(active[0].confidence, 0.95, 'confidence should be updated');
|
|
90
86
|
|
|
91
87
|
// Reinforce
|
|
92
88
|
const reinforced = reinforceMemory('MEM001');
|
|
93
|
-
|
|
89
|
+
assert.ok(reinforced, 'reinforceMemory should return true');
|
|
94
90
|
|
|
95
91
|
const after = getActiveMemories();
|
|
96
|
-
|
|
92
|
+
assert.deepStrictEqual(after[0].hit_count, 1, 'hit_count should be 1 after reinforce');
|
|
97
93
|
|
|
98
94
|
// Reinforce again
|
|
99
95
|
reinforceMemory('MEM001');
|
|
100
96
|
const after2 = getActiveMemories();
|
|
101
|
-
|
|
97
|
+
assert.deepStrictEqual(after2[0].hit_count, 2, 'hit_count should be 2 after second reinforce');
|
|
102
98
|
|
|
103
99
|
closeDatabase();
|
|
104
|
-
}
|
|
100
|
+
});
|
|
105
101
|
|
|
106
102
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
107
103
|
// memory-store: supersede
|
|
108
104
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
109
105
|
|
|
110
|
-
|
|
111
|
-
{
|
|
106
|
+
test('memory-store: supersede', () => {
|
|
112
107
|
openDatabase(':memory:');
|
|
113
108
|
|
|
114
109
|
createMemory({ category: 'convention', content: 'old convention' });
|
|
@@ -117,18 +112,17 @@ console.log('\n=== memory-store: supersede ===');
|
|
|
117
112
|
supersedeMemory('MEM001', 'MEM002');
|
|
118
113
|
|
|
119
114
|
const active = getActiveMemories();
|
|
120
|
-
|
|
121
|
-
|
|
115
|
+
assert.deepStrictEqual(active.length, 1, 'should have 1 active memory after supersede');
|
|
116
|
+
assert.deepStrictEqual(active[0].id, 'MEM002', 'active memory should be MEM002');
|
|
122
117
|
|
|
123
118
|
closeDatabase();
|
|
124
|
-
}
|
|
119
|
+
});
|
|
125
120
|
|
|
126
121
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
127
122
|
// memory-store: ranked query ordering
|
|
128
123
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
129
124
|
|
|
130
|
-
|
|
131
|
-
{
|
|
125
|
+
test('memory-store: ranked query ordering', () => {
|
|
132
126
|
openDatabase(':memory:');
|
|
133
127
|
|
|
134
128
|
// Low confidence, no hits
|
|
@@ -142,45 +136,43 @@ console.log('\n=== memory-store: ranked query ordering ===');
|
|
|
142
136
|
for (let i = 0; i < 10; i++) reinforceMemory('MEM003');
|
|
143
137
|
|
|
144
138
|
const ranked = getActiveMemoriesRanked(10);
|
|
145
|
-
|
|
139
|
+
assert.deepStrictEqual(ranked.length, 3, 'should have 3 ranked memories');
|
|
146
140
|
// MEM003: 0.7 * (1 + 10*0.1) = 0.7 * 2.0 = 1.4
|
|
147
141
|
// MEM002: 0.95 * (1 + 0*0.1) = 0.95
|
|
148
142
|
// MEM001: 0.5 * (1 + 0*0.1) = 0.5
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
143
|
+
assert.deepStrictEqual(ranked[0].id, 'MEM003', 'highest ranked should be MEM003 (reinforced)');
|
|
144
|
+
assert.deepStrictEqual(ranked[1].id, 'MEM002', 'second ranked should be MEM002 (high confidence)');
|
|
145
|
+
assert.deepStrictEqual(ranked[2].id, 'MEM001', 'lowest ranked should be MEM001');
|
|
152
146
|
|
|
153
147
|
// Test limit
|
|
154
148
|
const limited = getActiveMemoriesRanked(2);
|
|
155
|
-
|
|
149
|
+
assert.deepStrictEqual(limited.length, 2, 'limit should cap results');
|
|
156
150
|
|
|
157
151
|
closeDatabase();
|
|
158
|
-
}
|
|
152
|
+
});
|
|
159
153
|
|
|
160
154
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
161
155
|
// memory-store: processed unit tracking
|
|
162
156
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
163
157
|
|
|
164
|
-
|
|
165
|
-
{
|
|
158
|
+
test('memory-store: processed unit tracking', () => {
|
|
166
159
|
openDatabase(':memory:');
|
|
167
160
|
|
|
168
|
-
|
|
161
|
+
assert.ok(!isUnitProcessed('execute-task/M001/S01/T01'), 'should not be processed initially');
|
|
169
162
|
|
|
170
163
|
markUnitProcessed('execute-task/M001/S01/T01', '/path/to/activity.jsonl');
|
|
171
164
|
|
|
172
|
-
|
|
173
|
-
|
|
165
|
+
assert.ok(isUnitProcessed('execute-task/M001/S01/T01'), 'should be processed after marking');
|
|
166
|
+
assert.ok(!isUnitProcessed('execute-task/M001/S01/T02'), 'different key should not be processed');
|
|
174
167
|
|
|
175
168
|
closeDatabase();
|
|
176
|
-
}
|
|
169
|
+
});
|
|
177
170
|
|
|
178
171
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
179
172
|
// memory-store: enforce memory cap
|
|
180
173
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
181
174
|
|
|
182
|
-
|
|
183
|
-
{
|
|
175
|
+
test('memory-store: enforce memory cap', () => {
|
|
184
176
|
openDatabase(':memory:');
|
|
185
177
|
|
|
186
178
|
// Create 5 memories with varying confidence
|
|
@@ -194,23 +186,22 @@ console.log('\n=== memory-store: enforce memory cap ===');
|
|
|
194
186
|
enforceMemoryCap(3);
|
|
195
187
|
|
|
196
188
|
const active = getActiveMemories();
|
|
197
|
-
|
|
189
|
+
assert.deepStrictEqual(active.length, 3, 'should have 3 active memories after cap enforcement');
|
|
198
190
|
|
|
199
191
|
// The 2 lowest-ranked (MEM003=0.3 and MEM002=0.5) should be superseded
|
|
200
192
|
const ids = active.map(m => m.id).sort();
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
193
|
+
assert.ok(ids.includes('MEM001'), 'MEM001 (0.9) should survive');
|
|
194
|
+
assert.ok(ids.includes('MEM004'), 'MEM004 (0.95) should survive');
|
|
195
|
+
assert.ok(ids.includes('MEM005'), 'MEM005 (0.7) should survive');
|
|
204
196
|
|
|
205
197
|
closeDatabase();
|
|
206
|
-
}
|
|
198
|
+
});
|
|
207
199
|
|
|
208
200
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
209
201
|
// memory-store: applyMemoryActions transaction
|
|
210
202
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
211
203
|
|
|
212
|
-
|
|
213
|
-
{
|
|
204
|
+
test('memory-store: applyMemoryActions', () => {
|
|
214
205
|
openDatabase(':memory:');
|
|
215
206
|
|
|
216
207
|
const actions: MemoryAction[] = [
|
|
@@ -221,7 +212,7 @@ console.log('\n=== memory-store: applyMemoryActions ===');
|
|
|
221
212
|
applyMemoryActions(actions, 'execute-task', 'M001/S01/T01');
|
|
222
213
|
|
|
223
214
|
let active = getActiveMemories();
|
|
224
|
-
|
|
215
|
+
assert.deepStrictEqual(active.length, 2, 'should have 2 memories after CREATE actions');
|
|
225
216
|
|
|
226
217
|
// Now apply UPDATE + REINFORCE
|
|
227
218
|
const updateActions: MemoryAction[] = [
|
|
@@ -232,8 +223,8 @@ console.log('\n=== memory-store: applyMemoryActions ===');
|
|
|
232
223
|
applyMemoryActions(updateActions, 'execute-task', 'M001/S01/T02');
|
|
233
224
|
|
|
234
225
|
active = getActiveMemories();
|
|
235
|
-
|
|
236
|
-
|
|
226
|
+
assert.deepStrictEqual(active.find(m => m.id === 'MEM001')?.content, 'updated gotcha', 'MEM001 should be updated');
|
|
227
|
+
assert.deepStrictEqual(active.find(m => m.id === 'MEM002')?.hit_count, 1, 'MEM002 should be reinforced');
|
|
237
228
|
|
|
238
229
|
// SUPERSEDE
|
|
239
230
|
const supersedeActions: MemoryAction[] = [
|
|
@@ -244,19 +235,18 @@ console.log('\n=== memory-store: applyMemoryActions ===');
|
|
|
244
235
|
applyMemoryActions(supersedeActions, 'execute-task', 'M001/S01/T03');
|
|
245
236
|
|
|
246
237
|
active = getActiveMemories();
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
238
|
+
assert.deepStrictEqual(active.length, 2, 'should have 2 active after supersede');
|
|
239
|
+
assert.ok(!active.find(m => m.id === 'MEM001'), 'MEM001 should be superseded');
|
|
240
|
+
assert.ok(!!active.find(m => m.id === 'MEM003'), 'MEM003 should be active');
|
|
250
241
|
|
|
251
242
|
closeDatabase();
|
|
252
|
-
}
|
|
243
|
+
});
|
|
253
244
|
|
|
254
245
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
255
246
|
// memory-store: formatMemoriesForPrompt
|
|
256
247
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
257
248
|
|
|
258
|
-
|
|
259
|
-
{
|
|
249
|
+
test('memory-store: formatMemoriesForPrompt', () => {
|
|
260
250
|
openDatabase(':memory:');
|
|
261
251
|
|
|
262
252
|
createMemory({ category: 'gotcha', content: 'esbuild drops .node binaries' });
|
|
@@ -267,18 +257,18 @@ console.log('\n=== memory-store: formatMemoriesForPrompt ===');
|
|
|
267
257
|
const memories = getActiveMemoriesRanked(30);
|
|
268
258
|
const formatted = formatMemoriesForPrompt(memories);
|
|
269
259
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
260
|
+
assert.ok(formatted.includes('## Project Memory (auto-learned)'), 'should have header');
|
|
261
|
+
assert.ok(formatted.includes('### Gotcha'), 'should have gotcha category');
|
|
262
|
+
assert.ok(formatted.includes('### Convention'), 'should have convention category');
|
|
263
|
+
assert.ok(formatted.includes('### Architecture'), 'should have architecture category');
|
|
264
|
+
assert.ok(formatted.includes('- esbuild drops .node binaries'), 'should have gotcha content');
|
|
265
|
+
assert.ok(formatted.includes('- use :memory: for tests'), 'should have convention content');
|
|
276
266
|
|
|
277
267
|
// Test empty memories
|
|
278
268
|
closeDatabase();
|
|
279
269
|
openDatabase(':memory:');
|
|
280
270
|
const emptyFormatted = formatMemoriesForPrompt([]);
|
|
281
|
-
|
|
271
|
+
assert.deepStrictEqual(emptyFormatted, '', 'empty memories should return empty string');
|
|
282
272
|
|
|
283
273
|
// Test token budget truncation
|
|
284
274
|
closeDatabase();
|
|
@@ -288,58 +278,55 @@ console.log('\n=== memory-store: formatMemoriesForPrompt ===');
|
|
|
288
278
|
}
|
|
289
279
|
const budgetMemories = getActiveMemoriesRanked(30);
|
|
290
280
|
const truncated = formatMemoriesForPrompt(budgetMemories, 500);
|
|
291
|
-
|
|
281
|
+
assert.ok(truncated.length < 2500, `formatted length ${truncated.length} should be under budget`);
|
|
292
282
|
|
|
293
283
|
closeDatabase();
|
|
294
|
-
}
|
|
284
|
+
});
|
|
295
285
|
|
|
296
286
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
297
287
|
// memory-store: ID generation
|
|
298
288
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
299
289
|
|
|
300
|
-
|
|
301
|
-
{
|
|
290
|
+
test('memory-store: ID generation', () => {
|
|
302
291
|
openDatabase(':memory:');
|
|
303
292
|
|
|
304
|
-
|
|
293
|
+
assert.deepStrictEqual(nextMemoryId(), 'MEM001', 'first ID should be MEM001');
|
|
305
294
|
|
|
306
295
|
createMemory({ category: 'test', content: 'test' });
|
|
307
|
-
|
|
296
|
+
assert.deepStrictEqual(nextMemoryId(), 'MEM002', 'after first create, next should be MEM002');
|
|
308
297
|
|
|
309
298
|
// Create several more
|
|
310
299
|
for (let i = 0; i < 98; i++) createMemory({ category: 'test', content: `test ${i}` });
|
|
311
|
-
|
|
300
|
+
assert.deepStrictEqual(nextMemoryId(), 'MEM100', 'after 99 creates, next should be MEM100');
|
|
312
301
|
|
|
313
302
|
closeDatabase();
|
|
314
|
-
}
|
|
303
|
+
});
|
|
315
304
|
|
|
316
305
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
317
306
|
// memory-store: schema migration (v2 → v3)
|
|
318
307
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
319
308
|
|
|
320
|
-
|
|
321
|
-
{
|
|
309
|
+
test('memory-store: schema includes memories table', () => {
|
|
322
310
|
openDatabase(':memory:');
|
|
323
311
|
|
|
324
312
|
const adapter = _getAdapter()!;
|
|
325
313
|
|
|
326
314
|
// Verify memories table exists
|
|
327
315
|
const memCount = adapter.prepare('SELECT count(*) as cnt FROM memories').get();
|
|
328
|
-
|
|
316
|
+
assert.deepStrictEqual(memCount?.['cnt'], 0, 'memories table should exist and be empty');
|
|
329
317
|
|
|
330
318
|
// Verify memory_processed_units table exists
|
|
331
319
|
const procCount = adapter.prepare('SELECT count(*) as cnt FROM memory_processed_units').get();
|
|
332
|
-
|
|
320
|
+
assert.deepStrictEqual(procCount?.['cnt'], 0, 'memory_processed_units table should exist and be empty');
|
|
333
321
|
|
|
334
322
|
// Verify active_memories view exists
|
|
335
323
|
const viewCount = adapter.prepare('SELECT count(*) as cnt FROM active_memories').get();
|
|
336
|
-
|
|
324
|
+
assert.deepStrictEqual(viewCount?.['cnt'], 0, 'active_memories view should exist');
|
|
337
325
|
|
|
338
326
|
// Verify schema version is 10 (after M001 planning migrations)
|
|
339
327
|
const version = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
340
|
-
|
|
328
|
+
assert.deepStrictEqual(version?.['v'], 10, 'schema version should be 10');
|
|
341
329
|
|
|
342
330
|
closeDatabase();
|
|
343
|
-
}
|
|
331
|
+
});
|
|
344
332
|
|
|
345
|
-
report();
|