gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
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/help-text.js +1 -1
- package/dist/loader.js +34 -0
- 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 +63 -77
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- 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 +14 -10
- package/dist/resources/extensions/gsd/auto.js +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -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/context.js +0 -4
- 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/parallel.js +1 -1
- 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/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +17 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.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/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- 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/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +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 +12 -12
- 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 +2 -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/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.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/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.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/lifecycle-hooks.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- 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-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.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/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- 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/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- 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 +17 -11
- package/src/resources/extensions/gsd/auto.ts +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -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/context.ts +0 -5
- 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/parallel.ts +1 -1
- 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/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.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/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- 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/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- 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 +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- 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 +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- 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 +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- 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 +82 -103
- 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 +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- 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 +81 -94
- 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/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
- 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/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- 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/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -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 -47
- 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/stop-auto-remote.test.ts +2 -3
- 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/sync-lock.test.ts +122 -0
- 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-ownership.test.ts +175 -0
- 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-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
- 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-journal-events.test.ts +220 -0
- 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/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -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_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Tests registry loading, template resolution, auto-detection, and listing.
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { test } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
6
7
|
import {
|
|
7
8
|
loadRegistry,
|
|
8
9
|
resolveByName,
|
|
@@ -12,7 +13,6 @@ import {
|
|
|
12
13
|
loadWorkflowTemplate,
|
|
13
14
|
} from '../workflow-templates.ts';
|
|
14
15
|
|
|
15
|
-
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
16
16
|
|
|
17
17
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
18
|
// Registry Loading
|
|
@@ -22,23 +22,23 @@ console.log('\n── Registry Loading ──');
|
|
|
22
22
|
|
|
23
23
|
{
|
|
24
24
|
const registry = loadRegistry();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
assert.ok(registry !== null, 'Registry should load');
|
|
26
|
+
assert.deepStrictEqual(registry.version, 1, 'Registry version should be 1');
|
|
27
|
+
assert.ok(Object.keys(registry.templates).length >= 8, 'Should have at least 8 templates');
|
|
28
28
|
|
|
29
29
|
// Verify required template keys exist
|
|
30
30
|
const expectedIds = ['full-project', 'bugfix', 'small-feature', 'refactor', 'spike', 'hotfix', 'security-audit', 'dep-upgrade'];
|
|
31
31
|
for (const id of expectedIds) {
|
|
32
|
-
|
|
32
|
+
assert.ok(id in registry.templates, `Template "${id}" should exist in registry`);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// Verify each template has required fields
|
|
36
36
|
for (const [id, entry] of Object.entries(registry.templates)) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
assert.ok(typeof entry.name === 'string' && entry.name.length > 0, `${id}: name should be non-empty string`);
|
|
38
|
+
assert.ok(typeof entry.description === 'string' && entry.description.length > 0, `${id}: description should be non-empty`);
|
|
39
|
+
assert.ok(typeof entry.file === 'string' && entry.file.endsWith('.md'), `${id}: file should be a .md path`);
|
|
40
|
+
assert.ok(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array`);
|
|
41
|
+
assert.ok(Array.isArray(entry.triggers) && entry.triggers.length > 0, `${id}: triggers should be non-empty array`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -51,31 +51,31 @@ console.log('\n── Resolve by Name ──');
|
|
|
51
51
|
{
|
|
52
52
|
// Exact match
|
|
53
53
|
const bugfix = resolveByName('bugfix');
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
assert.ok(bugfix !== null, 'Should resolve "bugfix"');
|
|
55
|
+
assert.deepStrictEqual(bugfix!.id, 'bugfix', 'ID should be "bugfix"');
|
|
56
|
+
assert.deepStrictEqual(bugfix!.confidence, 'exact', 'Exact name should have exact confidence');
|
|
57
57
|
|
|
58
58
|
// Case-insensitive name match
|
|
59
59
|
const spike = resolveByName('Research Spike');
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
assert.ok(spike !== null, 'Should resolve "Research Spike" by name');
|
|
61
|
+
assert.deepStrictEqual(spike!.id, 'spike', 'Should resolve to spike');
|
|
62
62
|
|
|
63
63
|
// Alias match
|
|
64
64
|
const bug = resolveByName('bug');
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
assert.ok(bug !== null, 'Should resolve "bug" alias');
|
|
66
|
+
assert.deepStrictEqual(bug!.id, 'bugfix', 'Alias "bug" should map to bugfix');
|
|
67
67
|
|
|
68
68
|
const feat = resolveByName('feat');
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
assert.ok(feat !== null, 'Should resolve "feat" alias');
|
|
70
|
+
assert.deepStrictEqual(feat!.id, 'small-feature', 'Alias "feat" should map to small-feature');
|
|
71
71
|
|
|
72
72
|
const deps = resolveByName('deps');
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
assert.ok(deps !== null, 'Should resolve "deps" alias');
|
|
74
|
+
assert.deepStrictEqual(deps!.id, 'dep-upgrade', 'Alias "deps" should map to dep-upgrade');
|
|
75
75
|
|
|
76
76
|
// No match
|
|
77
77
|
const missing = resolveByName('nonexistent-template');
|
|
78
|
-
|
|
78
|
+
assert.ok(missing === null, 'Should return null for unknown template');
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -87,32 +87,32 @@ console.log('\n── Auto-Detection ──');
|
|
|
87
87
|
{
|
|
88
88
|
// Should detect bugfix from "fix" keyword
|
|
89
89
|
const fixMatches = autoDetect('fix the login button');
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
assert.ok(fixMatches.length > 0, 'Should detect matches for "fix the login button"');
|
|
91
|
+
assert.ok(fixMatches.some(m => m.id === 'bugfix'), 'Should include bugfix in matches');
|
|
92
92
|
|
|
93
93
|
// Should detect spike from "research" keyword
|
|
94
94
|
const researchMatches = autoDetect('research authentication libraries');
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
assert.ok(researchMatches.length > 0, 'Should detect matches for "research"');
|
|
96
|
+
assert.ok(researchMatches.some(m => m.id === 'spike'), 'Should include spike in matches');
|
|
97
97
|
|
|
98
98
|
// Should detect hotfix from "urgent" keyword
|
|
99
99
|
const urgentMatches = autoDetect('urgent production is down');
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
assert.ok(urgentMatches.length > 0, 'Should detect matches for "urgent"');
|
|
101
|
+
assert.ok(urgentMatches.some(m => m.id === 'hotfix'), 'Should include hotfix in matches');
|
|
102
102
|
|
|
103
103
|
// Should detect dep-upgrade from "upgrade" keyword
|
|
104
104
|
const upgradeMatches = autoDetect('upgrade react to v19');
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
assert.ok(upgradeMatches.length > 0, 'Should detect matches for "upgrade"');
|
|
106
|
+
assert.ok(upgradeMatches.some(m => m.id === 'dep-upgrade'), 'Should include dep-upgrade in matches');
|
|
107
107
|
|
|
108
108
|
// Multi-word triggers should score higher
|
|
109
109
|
const projectMatches = autoDetect('create a new project from scratch');
|
|
110
110
|
const projectMatch = projectMatches.find(m => m.id === 'full-project');
|
|
111
|
-
|
|
111
|
+
assert.ok(projectMatch !== undefined, 'Should detect full-project for "from scratch"');
|
|
112
112
|
|
|
113
113
|
// Empty input should return no matches
|
|
114
114
|
const emptyMatches = autoDetect('');
|
|
115
|
-
|
|
115
|
+
assert.deepStrictEqual(emptyMatches.length, 0, 'Empty input should return no matches');
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -123,11 +123,11 @@ console.log('\n── List Templates ──');
|
|
|
123
123
|
|
|
124
124
|
{
|
|
125
125
|
const output = listTemplates();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
126
|
+
assert.ok(output.includes('Workflow Templates'), 'Should have header');
|
|
127
|
+
assert.ok(output.includes('bugfix'), 'Should list bugfix');
|
|
128
|
+
assert.ok(output.includes('spike'), 'Should list spike');
|
|
129
|
+
assert.ok(output.includes('hotfix'), 'Should list hotfix');
|
|
130
|
+
assert.ok(output.includes('/gsd start'), 'Should include usage hint');
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -138,13 +138,13 @@ console.log('\n── Template Info ──');
|
|
|
138
138
|
|
|
139
139
|
{
|
|
140
140
|
const info = getTemplateInfo('bugfix');
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
141
|
+
assert.ok(info !== null, 'Should return info for bugfix');
|
|
142
|
+
assert.ok(info!.includes('Bug Fix'), 'Should include template name');
|
|
143
|
+
assert.ok(info!.includes('triage'), 'Should include phase names');
|
|
144
|
+
assert.ok(info!.includes('Triggers'), 'Should include triggers section');
|
|
145
145
|
|
|
146
146
|
const missing = getTemplateInfo('nonexistent');
|
|
147
|
-
|
|
147
|
+
assert.ok(missing === null, 'Should return null for unknown template');
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -155,19 +155,17 @@ console.log('\n── Load Workflow Template ──');
|
|
|
155
155
|
|
|
156
156
|
{
|
|
157
157
|
const content = loadWorkflowTemplate('bugfix');
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
assert.ok(content !== null, 'Should load bugfix template');
|
|
159
|
+
assert.ok(content!.includes('Bugfix Workflow'), 'Should contain workflow title');
|
|
160
|
+
assert.ok(content!.includes('Phase 1: Triage'), 'Should contain triage phase');
|
|
161
|
+
assert.ok(content!.includes('Phase 4: Ship'), 'Should contain ship phase');
|
|
162
162
|
|
|
163
163
|
const hotfixContent = loadWorkflowTemplate('hotfix');
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
assert.ok(hotfixContent !== null, 'Should load hotfix template');
|
|
165
|
+
assert.ok(hotfixContent!.includes('Hotfix Workflow'), 'Should contain hotfix title');
|
|
166
166
|
|
|
167
167
|
const missingContent = loadWorkflowTemplate('nonexistent');
|
|
168
|
-
|
|
168
|
+
assert.ok(missingContent === null, 'Should return null for unknown template');
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
172
|
-
|
|
173
|
-
report();
|
|
@@ -14,12 +14,10 @@ import { join } from "node:path";
|
|
|
14
14
|
import { tmpdir } from "node:os";
|
|
15
15
|
import { execSync } from "node:child_process";
|
|
16
16
|
import { describe, it, after } from "node:test";
|
|
17
|
+
import assert from 'node:assert/strict';
|
|
17
18
|
|
|
18
19
|
import { resolveGitDir } from "../worktree-manager.ts";
|
|
19
20
|
import { detectWorktreeName, captureIntegrationBranch } from "../worktree.ts";
|
|
20
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
21
|
-
|
|
22
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
23
21
|
|
|
24
22
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
25
23
|
|
|
@@ -40,7 +38,6 @@ describe("worktree-bugfix", () => {
|
|
|
40
38
|
const dirs: string[] = [];
|
|
41
39
|
after(() => {
|
|
42
40
|
for (const d of dirs) rmSync(d, { recursive: true, force: true });
|
|
43
|
-
report();
|
|
44
41
|
});
|
|
45
42
|
|
|
46
43
|
it("resolveGitDir returns .git directory in normal repo", () => {
|
|
@@ -48,8 +45,8 @@ describe("worktree-bugfix", () => {
|
|
|
48
45
|
dirs.push(repo);
|
|
49
46
|
initRepo(repo);
|
|
50
47
|
const gitDir = resolveGitDir(repo);
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
assert.ok(gitDir.endsWith(".git"), "ends with .git");
|
|
49
|
+
assert.ok(existsSync(gitDir), ".git dir exists");
|
|
53
50
|
});
|
|
54
51
|
|
|
55
52
|
it("resolveGitDir follows gitdir: pointer in worktree", () => {
|
|
@@ -65,18 +62,18 @@ describe("worktree-bugfix", () => {
|
|
|
65
62
|
writeFileSync(join(wtDir, ".git"), `gitdir: ${realGitDir}\n`);
|
|
66
63
|
|
|
67
64
|
const resolved = resolveGitDir(wtDir);
|
|
68
|
-
|
|
65
|
+
assert.deepStrictEqual(resolved, realGitDir, "resolves to real git dir");
|
|
69
66
|
});
|
|
70
67
|
|
|
71
68
|
it("resolveGitDir returns default when .git doesn't exist", () => {
|
|
72
69
|
const noGit = mkdtempSync(join(tmpdir(), "gsd-wt-fix-"));
|
|
73
70
|
dirs.push(noGit);
|
|
74
71
|
const gitDir = resolveGitDir(noGit);
|
|
75
|
-
|
|
72
|
+
assert.ok(gitDir.endsWith(".git"), "returns default .git path");
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
it("detectWorktreeName returns name for worktree path", () => {
|
|
79
|
-
|
|
76
|
+
assert.deepStrictEqual(
|
|
80
77
|
detectWorktreeName("/project/.gsd/worktrees/M005"),
|
|
81
78
|
"M005",
|
|
82
79
|
"detects worktree name",
|
|
@@ -84,7 +81,7 @@ describe("worktree-bugfix", () => {
|
|
|
84
81
|
});
|
|
85
82
|
|
|
86
83
|
it("detectWorktreeName returns null for normal repo", () => {
|
|
87
|
-
|
|
84
|
+
assert.deepStrictEqual(
|
|
88
85
|
detectWorktreeName("/project"),
|
|
89
86
|
null,
|
|
90
87
|
"null for non-worktree path",
|
|
@@ -106,7 +103,7 @@ describe("worktree-bugfix", () => {
|
|
|
106
103
|
// captureIntegrationBranch should be a no-op — no META.json written
|
|
107
104
|
const metaPath = join(wtPath, ".gsd", "milestones", "M005", "M005-META.json");
|
|
108
105
|
captureIntegrationBranch(wtPath, "M005");
|
|
109
|
-
|
|
106
|
+
assert.ok(!existsSync(metaPath), "no META.json written in worktree");
|
|
110
107
|
});
|
|
111
108
|
|
|
112
109
|
it("detectWorktreeName prevents pull in worktree context", () => {
|
|
@@ -114,7 +111,7 @@ describe("worktree-bugfix", () => {
|
|
|
114
111
|
// the caller should skip pull/fetch operations
|
|
115
112
|
const inWorktree = detectWorktreeName("/project/.gsd/worktrees/M006");
|
|
116
113
|
const inNormal = detectWorktreeName("/project");
|
|
117
|
-
|
|
118
|
-
|
|
114
|
+
assert.ok(inWorktree !== null, "worktree detected → skip pull");
|
|
115
|
+
assert.ok(inNormal === null, "normal repo → allow pull");
|
|
119
116
|
});
|
|
120
117
|
});
|
|
@@ -29,9 +29,9 @@ import {
|
|
|
29
29
|
isDbAvailable,
|
|
30
30
|
} from "../gsd-db.ts";
|
|
31
31
|
|
|
32
|
-
import {
|
|
32
|
+
import { describe, test } from 'node:test';
|
|
33
|
+
import assert from 'node:assert/strict';
|
|
33
34
|
|
|
34
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
35
35
|
|
|
36
36
|
function run(command: string, cwd: string): string {
|
|
37
37
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
@@ -49,7 +49,7 @@ function createTempRepo(): string {
|
|
|
49
49
|
return dir;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
async
|
|
52
|
+
describe('worktree-db-integration', async () => {
|
|
53
53
|
const savedCwd = process.cwd();
|
|
54
54
|
const tempDirs: string[] = [];
|
|
55
55
|
|
|
@@ -82,7 +82,7 @@ async function main(): Promise<void> {
|
|
|
82
82
|
const wtPath = createAutoWorktree(tempDir, "M004");
|
|
83
83
|
|
|
84
84
|
const worktreeDbPath = join(worktreePath(tempDir, "M004"), ".gsd", "gsd.db");
|
|
85
|
-
|
|
85
|
+
assert.ok(
|
|
86
86
|
existsSync(worktreeDbPath),
|
|
87
87
|
"gsd.db exists in worktree .gsd after createAutoWorktree",
|
|
88
88
|
);
|
|
@@ -107,10 +107,10 @@ async function main(): Promise<void> {
|
|
|
107
107
|
console.error(" Unexpected throw:", err);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
assert.ok(!threw, "createAutoWorktree does not throw when no source DB");
|
|
111
111
|
|
|
112
112
|
const worktreeDbPath = join(worktreePath(tempDir, "M004"), ".gsd", "gsd.db");
|
|
113
|
-
|
|
113
|
+
assert.ok(
|
|
114
114
|
!existsSync(worktreeDbPath),
|
|
115
115
|
"gsd.db is absent in worktree when source had none",
|
|
116
116
|
);
|
|
@@ -145,7 +145,7 @@ async function main(): Promise<void> {
|
|
|
145
145
|
|
|
146
146
|
// Reconcile worktree → main
|
|
147
147
|
const result = reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
148
|
-
|
|
148
|
+
assert.ok(result.decisions >= 1, "reconcile reports at least 1 decision merged");
|
|
149
149
|
|
|
150
150
|
// Open main DB and verify the row is present
|
|
151
151
|
openDatabase(mainDbPath);
|
|
@@ -153,7 +153,7 @@ async function main(): Promise<void> {
|
|
|
153
153
|
closeDatabase();
|
|
154
154
|
|
|
155
155
|
const found = decisions.some((d) => d.id === "D-WT-001");
|
|
156
|
-
|
|
156
|
+
assert.ok(found, "worktree decision D-WT-001 present in main DB after reconcile");
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
// ─── Test 4: reconcile non-fatal when both paths nonexistent ─────
|
|
@@ -165,7 +165,7 @@ async function main(): Promise<void> {
|
|
|
165
165
|
} catch {
|
|
166
166
|
threw = true;
|
|
167
167
|
}
|
|
168
|
-
|
|
168
|
+
assert.ok(!threw, "reconcileWorktreeDb does not throw when worktree DB is absent");
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
// ─── Test 5: failure path observable via stderr (diagnostic) ─────
|
|
@@ -181,10 +181,10 @@ async function main(): Promise<void> {
|
|
|
181
181
|
closeDatabase();
|
|
182
182
|
|
|
183
183
|
const result = reconcileWorktreeDb(mainDbPath, "/definitely/does/not/exist.db");
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
assert.deepStrictEqual(result.decisions, 0, "decisions is 0 when worktree DB absent");
|
|
185
|
+
assert.deepStrictEqual(result.requirements, 0, "requirements is 0 when worktree DB absent");
|
|
186
|
+
assert.deepStrictEqual(result.artifacts, 0, "artifacts is 0 when worktree DB absent");
|
|
187
|
+
assert.deepStrictEqual(result.conflicts.length, 0, "conflicts is empty when worktree DB absent");
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
} finally {
|
|
@@ -199,8 +199,4 @@ async function main(): Promise<void> {
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
-
|
|
203
|
-
report();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
main();
|
|
202
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
2
3
|
import * as fs from 'node:fs';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
5
|
import * as os from 'node:os';
|
|
@@ -16,7 +17,6 @@ import {
|
|
|
16
17
|
reconcileWorktreeDb,
|
|
17
18
|
} from '../gsd-db.ts';
|
|
18
19
|
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
20
|
|
|
21
21
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
22
22
|
// Helpers
|
|
@@ -91,18 +91,18 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
91
91
|
closeDatabase();
|
|
92
92
|
|
|
93
93
|
const result = copyWorktreeDb(srcDb, destDb);
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
assert.ok(result === true, 'copyWorktreeDb returns true on success');
|
|
95
|
+
assert.ok(fs.existsSync(destDb), 'dest DB file exists after copy');
|
|
96
96
|
|
|
97
97
|
// Open the copy and verify data is queryable
|
|
98
98
|
openDatabase(destDb);
|
|
99
99
|
const d = getDecisionById('D001');
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
assert.ok(d !== null, 'decision queryable in copied DB');
|
|
101
|
+
assert.deepStrictEqual(d?.choice, 'node:sqlite', 'decision data preserved in copy');
|
|
102
102
|
|
|
103
103
|
const r = getRequirementById('R001');
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
assert.ok(r !== null, 'requirement queryable in copied DB');
|
|
105
|
+
assert.deepStrictEqual(r?.description, 'Must store decisions', 'requirement data preserved in copy');
|
|
106
106
|
|
|
107
107
|
cleanup(srcDir, destDir);
|
|
108
108
|
}
|
|
@@ -123,9 +123,9 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
123
123
|
|
|
124
124
|
copyWorktreeDb(srcDb, destDb);
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
assert.ok(fs.existsSync(destDb), 'DB file copied');
|
|
127
|
+
assert.ok(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
|
|
128
|
+
assert.ok(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
|
|
129
129
|
|
|
130
130
|
cleanup(srcDir, destDir);
|
|
131
131
|
}
|
|
@@ -134,7 +134,7 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
134
134
|
{
|
|
135
135
|
const destDir = tempDir();
|
|
136
136
|
const result = copyWorktreeDb('/nonexistent/path/gsd.db', path.join(destDir, 'gsd.db'));
|
|
137
|
-
|
|
137
|
+
assert.deepStrictEqual(result, false, 'returns false for missing source');
|
|
138
138
|
cleanup(destDir);
|
|
139
139
|
}
|
|
140
140
|
|
|
@@ -149,8 +149,8 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
149
149
|
closeDatabase();
|
|
150
150
|
|
|
151
151
|
const result = copyWorktreeDb(srcDb, deepDest);
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
assert.ok(result === true, 'copyWorktreeDb succeeds with nested dest');
|
|
153
|
+
assert.ok(fs.existsSync(deepDest), 'DB file created at deeply nested path');
|
|
154
154
|
|
|
155
155
|
cleanup(srcDir, destDir);
|
|
156
156
|
}
|
|
@@ -192,10 +192,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
192
192
|
openDatabase(mainDb);
|
|
193
193
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
194
194
|
|
|
195
|
-
|
|
195
|
+
assert.ok(result.decisions > 0, 'decisions merged count > 0');
|
|
196
196
|
const d2 = getDecisionById('D002');
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
assert.ok(d2 !== null, 'D002 from worktree now in main');
|
|
198
|
+
assert.deepStrictEqual(d2?.choice, 'WAL', 'D002 data correct after merge');
|
|
199
199
|
|
|
200
200
|
cleanup(mainDir, wtDir);
|
|
201
201
|
}
|
|
@@ -231,10 +231,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
231
231
|
openDatabase(mainDb);
|
|
232
232
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
assert.ok(result.requirements > 0, 'requirements merged count > 0');
|
|
235
235
|
const r2 = getRequirementById('R002');
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
assert.ok(r2 !== null, 'R002 from worktree now in main');
|
|
237
|
+
assert.deepStrictEqual(r2?.description, 'Must be fast', 'R002 data correct after merge');
|
|
238
238
|
|
|
239
239
|
cleanup(mainDir, wtDir);
|
|
240
240
|
}
|
|
@@ -264,11 +264,11 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
264
264
|
openDatabase(mainDb);
|
|
265
265
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
assert.ok(result.artifacts > 0, 'artifacts merged count > 0');
|
|
268
268
|
const adapter = _getAdapter()!;
|
|
269
269
|
const row = adapter.prepare('SELECT * FROM artifacts WHERE path = ?').get('docs/api.md');
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
assert.ok(row !== null, 'artifact from worktree now in main');
|
|
271
|
+
assert.deepStrictEqual(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
|
|
272
272
|
|
|
273
273
|
cleanup(mainDir, wtDir);
|
|
274
274
|
}
|
|
@@ -305,15 +305,15 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
305
305
|
openDatabase(mainDb);
|
|
306
306
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
307
307
|
|
|
308
|
-
|
|
309
|
-
|
|
308
|
+
assert.ok(result.conflicts.length > 0, 'conflicts detected');
|
|
309
|
+
assert.ok(
|
|
310
310
|
result.conflicts.some(c => c.includes('D001')),
|
|
311
311
|
'conflict mentions D001',
|
|
312
312
|
);
|
|
313
313
|
|
|
314
314
|
// Worktree-wins: D001 should now have worktree's value
|
|
315
315
|
const d1 = getDecisionById('D001');
|
|
316
|
-
|
|
316
|
+
assert.deepStrictEqual(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
|
|
317
317
|
|
|
318
318
|
cleanup(mainDir, wtDir);
|
|
319
319
|
}
|
|
@@ -326,10 +326,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
326
326
|
seedMainDb(mainDb);
|
|
327
327
|
|
|
328
328
|
const result = reconcileWorktreeDb(mainDb, '/nonexistent/worktree.db');
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
329
|
+
assert.deepStrictEqual(result.decisions, 0, 'no decisions merged for missing worktree DB');
|
|
330
|
+
assert.deepStrictEqual(result.requirements, 0, 'no requirements merged for missing worktree DB');
|
|
331
|
+
assert.deepStrictEqual(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
|
|
332
|
+
assert.deepStrictEqual(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
|
|
333
333
|
|
|
334
334
|
cleanup(mainDir);
|
|
335
335
|
}
|
|
@@ -366,9 +366,9 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
366
366
|
|
|
367
367
|
openDatabase(mainDb);
|
|
368
368
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
369
|
-
|
|
369
|
+
assert.ok(result.decisions > 0, 'reconciliation works with spaces in path');
|
|
370
370
|
const d3 = getDecisionById('D003');
|
|
371
|
-
|
|
371
|
+
assert.ok(d3 !== null, 'D003 merged from worktree with spaces in path');
|
|
372
372
|
|
|
373
373
|
cleanup(baseDir);
|
|
374
374
|
}
|
|
@@ -388,7 +388,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
388
388
|
reconcileWorktreeDb(mainDb, wtDb);
|
|
389
389
|
|
|
390
390
|
// Verify main DB is still fully usable after DETACH
|
|
391
|
-
|
|
391
|
+
assert.ok(isDbAvailable(), 'DB still available after reconciliation');
|
|
392
392
|
|
|
393
393
|
insertDecision({
|
|
394
394
|
id: 'D099',
|
|
@@ -403,8 +403,8 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
403
403
|
});
|
|
404
404
|
|
|
405
405
|
const d99 = getDecisionById('D099');
|
|
406
|
-
|
|
407
|
-
|
|
406
|
+
assert.ok(d99 !== null, 'can insert and query after reconciliation');
|
|
407
|
+
assert.deepStrictEqual(d99?.choice, 'works', 'post-reconcile data correct');
|
|
408
408
|
|
|
409
409
|
// Verify no "wt" database still attached
|
|
410
410
|
const adapter = _getAdapter()!;
|
|
@@ -415,7 +415,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
415
415
|
} catch {
|
|
416
416
|
// Expected — wt should be detached
|
|
417
417
|
}
|
|
418
|
-
|
|
418
|
+
assert.ok(!wtAccessible, 'wt database is detached after reconciliation');
|
|
419
419
|
|
|
420
420
|
cleanup(mainDir, wtDir);
|
|
421
421
|
}
|
|
@@ -436,11 +436,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
436
436
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
437
437
|
|
|
438
438
|
// Should still report counts for the existing rows (INSERT OR REPLACE touches them)
|
|
439
|
-
|
|
440
|
-
|
|
439
|
+
assert.ok(result.conflicts.length === 0, 'no conflicts when DBs are identical');
|
|
440
|
+
assert.ok(isDbAvailable(), 'DB usable after no-change reconciliation');
|
|
441
441
|
|
|
442
442
|
cleanup(mainDir, wtDir);
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
// ─── Final Report ──────────────────────────────────────────────────────────
|
|
446
|
-
report();
|