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
|
@@ -25,9 +25,9 @@ import {
|
|
|
25
25
|
isSessionLockHeld,
|
|
26
26
|
} from '../session-lock.ts';
|
|
27
27
|
import { gsdRoot } from '../paths.ts';
|
|
28
|
-
import {
|
|
28
|
+
import { describe, test } from 'node:test';
|
|
29
|
+
import assert from 'node:assert/strict';
|
|
29
30
|
|
|
30
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
31
31
|
const require = createRequire(import.meta.url);
|
|
32
32
|
|
|
33
33
|
function hasProperLockfile(): boolean {
|
|
@@ -41,7 +41,7 @@ function hasProperLockfile(): boolean {
|
|
|
41
41
|
|
|
42
42
|
const properLockfileAvailable = hasProperLockfile();
|
|
43
43
|
|
|
44
|
-
async
|
|
44
|
+
describe('session-lock-regression', async () => {
|
|
45
45
|
|
|
46
46
|
// ─── 1. Basic acquire/release lifecycle ───────────────────────────────
|
|
47
47
|
console.log('\n=== 1. acquire → validate → release lifecycle ===');
|
|
@@ -51,22 +51,22 @@ async function main(): Promise<void> {
|
|
|
51
51
|
|
|
52
52
|
try {
|
|
53
53
|
const result = acquireSessionLock(base);
|
|
54
|
-
|
|
54
|
+
assert.ok(result.acquired, 'lock acquired successfully');
|
|
55
55
|
|
|
56
56
|
const valid = validateSessionLock(base);
|
|
57
|
-
|
|
57
|
+
assert.ok(valid, 'lock validates after acquisition');
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
assert.ok(isSessionLockHeld(base), 'isSessionLockHeld returns true');
|
|
60
60
|
|
|
61
61
|
releaseSessionLock(base);
|
|
62
62
|
|
|
63
63
|
// After release, the lock file should be cleaned up
|
|
64
64
|
const lockFile = join(gsdRoot(base), 'auto.lock');
|
|
65
|
-
|
|
65
|
+
assert.ok(!existsSync(lockFile), 'lock file removed after release');
|
|
66
66
|
|
|
67
67
|
// The .gsd.lock/ directory should be cleaned up
|
|
68
68
|
const lockDir = gsdRoot(base) + '.lock';
|
|
69
|
-
|
|
69
|
+
assert.ok(!existsSync(lockDir), '.gsd.lock/ directory removed after release (#1245)');
|
|
70
70
|
} finally {
|
|
71
71
|
rmSync(base, { recursive: true, force: true });
|
|
72
72
|
}
|
|
@@ -88,7 +88,7 @@ async function main(): Promise<void> {
|
|
|
88
88
|
} catch {
|
|
89
89
|
threw = true;
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
assert.ok(!threw, 'double release does not throw');
|
|
92
92
|
} finally {
|
|
93
93
|
rmSync(base, { recursive: true, force: true });
|
|
94
94
|
}
|
|
@@ -103,16 +103,15 @@ async function main(): Promise<void> {
|
|
|
103
103
|
try {
|
|
104
104
|
acquireSessionLock(base);
|
|
105
105
|
|
|
106
|
-
updateSessionLock(base, 'execute-task', 'M001/S01/T01',
|
|
106
|
+
updateSessionLock(base, 'execute-task', 'M001/S01/T01', '/tmp/session.json');
|
|
107
107
|
|
|
108
108
|
const data = readSessionLockData(base);
|
|
109
|
-
|
|
109
|
+
assert.ok(data !== null, 'lock data readable after update');
|
|
110
110
|
if (data) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
assertEq(data.sessionFile, '/tmp/session.json', 'lock data has session file');
|
|
111
|
+
assert.deepStrictEqual(data.pid, process.pid, 'lock data has correct PID');
|
|
112
|
+
assert.deepStrictEqual(data.unitType, 'execute-task', 'lock data has correct unit type');
|
|
113
|
+
assert.deepStrictEqual(data.unitId, 'M001/S01/T01', 'lock data has correct unit ID');
|
|
114
|
+
assert.deepStrictEqual(data.sessionFile, '/tmp/session.json', 'lock data has session file');
|
|
116
115
|
}
|
|
117
116
|
|
|
118
117
|
releaseSessionLock(base);
|
|
@@ -136,13 +135,12 @@ async function main(): Promise<void> {
|
|
|
136
135
|
unitType: 'execute-task',
|
|
137
136
|
unitId: 'M001/S01/T01',
|
|
138
137
|
unitStartedAt: new Date(Date.now() - 3600000).toISOString(),
|
|
139
|
-
completedUnits: 3,
|
|
140
138
|
};
|
|
141
139
|
writeFileSync(lockFile, JSON.stringify(staleLock, null, 2));
|
|
142
140
|
|
|
143
141
|
// Should be able to acquire despite the stale lock
|
|
144
142
|
const result = acquireSessionLock(base);
|
|
145
|
-
|
|
143
|
+
assert.ok(result.acquired, '#1245: stale lock from dead PID → re-acquirable');
|
|
146
144
|
|
|
147
145
|
releaseSessionLock(base);
|
|
148
146
|
} finally {
|
|
@@ -158,7 +156,7 @@ async function main(): Promise<void> {
|
|
|
158
156
|
|
|
159
157
|
try {
|
|
160
158
|
const data = readSessionLockData(base);
|
|
161
|
-
|
|
159
|
+
assert.deepStrictEqual(data, null, 'no lock file → null');
|
|
162
160
|
} finally {
|
|
163
161
|
rmSync(base, { recursive: true, force: true });
|
|
164
162
|
}
|
|
@@ -176,7 +174,7 @@ async function main(): Promise<void> {
|
|
|
176
174
|
// Multiple validations should all return true (regression for #1257)
|
|
177
175
|
for (let i = 0; i < 5; i++) {
|
|
178
176
|
const valid = validateSessionLock(base);
|
|
179
|
-
|
|
177
|
+
assert.ok(valid, `#1257: validation ${i + 1} returns true for own lock`);
|
|
180
178
|
}
|
|
181
179
|
|
|
182
180
|
releaseSessionLock(base);
|
|
@@ -196,7 +194,7 @@ async function main(): Promise<void> {
|
|
|
196
194
|
writeFileSync(lockFile, 'NOT VALID JSON {{{');
|
|
197
195
|
|
|
198
196
|
const data = readSessionLockData(base);
|
|
199
|
-
|
|
197
|
+
assert.deepStrictEqual(data, null, 'corrupt JSON → null');
|
|
200
198
|
} finally {
|
|
201
199
|
rmSync(base, { recursive: true, force: true });
|
|
202
200
|
}
|
|
@@ -210,9 +208,9 @@ async function main(): Promise<void> {
|
|
|
210
208
|
|
|
211
209
|
try {
|
|
212
210
|
const status = getSessionLockStatus(base);
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
211
|
+
assert.deepStrictEqual(status.valid, false, 'missing lock metadata is invalid');
|
|
212
|
+
assert.deepStrictEqual(status.failureReason, 'missing-metadata', 'missing metadata reason is surfaced');
|
|
213
|
+
assert.deepStrictEqual(status.expectedPid, process.pid, 'expected PID is included');
|
|
216
214
|
} finally {
|
|
217
215
|
rmSync(base, { recursive: true, force: true });
|
|
218
216
|
}
|
|
@@ -233,14 +231,13 @@ async function main(): Promise<void> {
|
|
|
233
231
|
unitType: 'execute-task',
|
|
234
232
|
unitId: 'M001/S01/T01',
|
|
235
233
|
unitStartedAt: new Date().toISOString(),
|
|
236
|
-
completedUnits: 0,
|
|
237
234
|
}, null, 2));
|
|
238
235
|
|
|
239
236
|
const status = getSessionLockStatus(base);
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
237
|
+
assert.deepStrictEqual(status.valid, false, 'foreign PID lock is invalid');
|
|
238
|
+
assert.deepStrictEqual(status.failureReason, 'pid-mismatch', 'PID mismatch reason is surfaced');
|
|
239
|
+
assert.deepStrictEqual(status.existingPid, foreignPid, 'existing PID is included');
|
|
240
|
+
assert.deepStrictEqual(status.expectedPid, process.pid, 'expected PID is included');
|
|
244
241
|
} finally {
|
|
245
242
|
rmSync(base, { recursive: true, force: true });
|
|
246
243
|
}
|
|
@@ -254,11 +251,11 @@ async function main(): Promise<void> {
|
|
|
254
251
|
|
|
255
252
|
try {
|
|
256
253
|
const r1 = acquireSessionLock(base);
|
|
257
|
-
|
|
254
|
+
assert.ok(r1.acquired, 'first acquisition');
|
|
258
255
|
releaseSessionLock(base);
|
|
259
256
|
|
|
260
257
|
const r2 = acquireSessionLock(base);
|
|
261
|
-
|
|
258
|
+
assert.ok(r2.acquired, 're-acquisition after release');
|
|
262
259
|
releaseSessionLock(base);
|
|
263
260
|
} finally {
|
|
264
261
|
rmSync(base, { recursive: true, force: true });
|
|
@@ -273,13 +270,13 @@ async function main(): Promise<void> {
|
|
|
273
270
|
|
|
274
271
|
try {
|
|
275
272
|
const r1 = acquireSessionLock(base);
|
|
276
|
-
|
|
273
|
+
assert.ok(r1.acquired, 'first acquisition succeeds');
|
|
277
274
|
|
|
278
275
|
const r2 = acquireSessionLock(base);
|
|
279
|
-
|
|
276
|
+
assert.ok(r2.acquired, 're-entrant acquisition succeeds');
|
|
280
277
|
|
|
281
278
|
const valid = validateSessionLock(base);
|
|
282
|
-
|
|
279
|
+
assert.ok(valid, 're-entrant acquisition does not corrupt validation state');
|
|
283
280
|
|
|
284
281
|
releaseSessionLock(base);
|
|
285
282
|
} finally {
|
|
@@ -295,31 +292,24 @@ async function main(): Promise<void> {
|
|
|
295
292
|
|
|
296
293
|
try {
|
|
297
294
|
const r1 = acquireSessionLock(base);
|
|
298
|
-
|
|
295
|
+
assert.ok(r1.acquired, 'first acquisition succeeds');
|
|
299
296
|
|
|
300
297
|
const lockDir = gsdRoot(base) + '.lock';
|
|
301
298
|
if (properLockfileAvailable) {
|
|
302
|
-
|
|
299
|
+
assert.ok(existsSync(lockDir), '.gsd.lock/ exists after first acquisition');
|
|
303
300
|
}
|
|
304
301
|
|
|
305
302
|
const r2 = acquireSessionLock(base);
|
|
306
|
-
|
|
303
|
+
assert.ok(r2.acquired, 'second acquisition succeeds');
|
|
307
304
|
if (properLockfileAvailable) {
|
|
308
|
-
|
|
305
|
+
assert.ok(existsSync(lockDir), '.gsd.lock/ exists after re-entrant acquisition');
|
|
309
306
|
}
|
|
310
|
-
|
|
307
|
+
assert.ok(validateSessionLock(base), 'lock remains valid after re-entrant acquisition');
|
|
311
308
|
|
|
312
309
|
releaseSessionLock(base);
|
|
313
|
-
|
|
310
|
+
assert.ok(!existsSync(lockDir), '.gsd.lock/ is removed after release');
|
|
314
311
|
} finally {
|
|
315
312
|
rmSync(base, { recursive: true, force: true });
|
|
316
313
|
}
|
|
317
314
|
}
|
|
318
|
-
|
|
319
|
-
report();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
main().catch((error) => {
|
|
323
|
-
console.error(error);
|
|
324
|
-
process.exit(1);
|
|
325
315
|
});
|
|
@@ -14,9 +14,9 @@ import {
|
|
|
14
14
|
getAllMilestones,
|
|
15
15
|
_getAdapter,
|
|
16
16
|
} from '../gsd-db.ts';
|
|
17
|
-
import {
|
|
17
|
+
import { describe, test } from 'node:test';
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
18
19
|
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
20
|
|
|
21
21
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
22
22
|
|
|
@@ -30,14 +30,14 @@ function cleanup(dir: string): void {
|
|
|
30
30
|
|
|
31
31
|
// ─── Tests ────────────────────────────────────────────────────────────────
|
|
32
32
|
|
|
33
|
-
async
|
|
33
|
+
describe('shared-wal', async () => {
|
|
34
34
|
// ─── Test (a): resolveProjectRootDbPath returns project root DB for worktree path ───
|
|
35
35
|
console.log('\n=== shared-wal: resolve worktree path to project root DB ===');
|
|
36
36
|
{
|
|
37
37
|
const projectRoot = '/home/user/myproject';
|
|
38
38
|
const worktreePath = join(projectRoot, '.gsd', 'worktrees', 'M001');
|
|
39
39
|
const result = resolveProjectRootDbPath(worktreePath);
|
|
40
|
-
|
|
40
|
+
assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
|
|
41
41
|
'worktree path resolves to project root DB');
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -46,7 +46,7 @@ async function main() {
|
|
|
46
46
|
{
|
|
47
47
|
const projectRoot = '/home/user/myproject';
|
|
48
48
|
const result = resolveProjectRootDbPath(projectRoot);
|
|
49
|
-
|
|
49
|
+
assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
|
|
50
50
|
'project root path stays at project root DB');
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -56,7 +56,7 @@ async function main() {
|
|
|
56
56
|
const projectRoot = '/home/user/myproject';
|
|
57
57
|
const nestedPath = join(projectRoot, '.gsd', 'worktrees', 'M002', 'src', 'lib');
|
|
58
58
|
const result = resolveProjectRootDbPath(nestedPath);
|
|
59
|
-
|
|
59
|
+
assert.deepStrictEqual(result, join(projectRoot, '.gsd', 'gsd.db'),
|
|
60
60
|
'nested worktree subdir resolves to project root DB');
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -64,7 +64,7 @@ async function main() {
|
|
|
64
64
|
console.log('\n=== shared-wal: resolve forward-slash path ===');
|
|
65
65
|
{
|
|
66
66
|
const result = resolveProjectRootDbPath('/proj/.gsd/worktrees/M001');
|
|
67
|
-
|
|
67
|
+
assert.deepStrictEqual(result, join('/proj', '.gsd', 'gsd.db'),
|
|
68
68
|
'forward-slash worktree path resolves correctly');
|
|
69
69
|
}
|
|
70
70
|
|
|
@@ -99,9 +99,9 @@ async function main() {
|
|
|
99
99
|
|
|
100
100
|
// Verify all 3 milestones are visible
|
|
101
101
|
const all = getAllMilestones();
|
|
102
|
-
|
|
102
|
+
assert.deepStrictEqual(all.length, 3, 'concurrent: all 3 milestones visible');
|
|
103
103
|
const ids = all.map(m => m.id).sort();
|
|
104
|
-
|
|
104
|
+
assert.deepStrictEqual(ids, ['M001', 'M002', 'M003'], 'concurrent: correct IDs');
|
|
105
105
|
|
|
106
106
|
closeDatabase();
|
|
107
107
|
} finally {
|
|
@@ -132,7 +132,7 @@ async function main() {
|
|
|
132
132
|
// Connection 2: write M002, verify sees M001
|
|
133
133
|
openDatabase(dbPath);
|
|
134
134
|
const afterConn2Before = getAllMilestones();
|
|
135
|
-
|
|
135
|
+
assert.ok(afterConn2Before.some(m => m.id === 'M001'),
|
|
136
136
|
'rawconc: conn2 sees M001 from conn1');
|
|
137
137
|
insertMilestone({ id: 'M002', title: 'Writer 2', status: 'active' });
|
|
138
138
|
closeDatabase();
|
|
@@ -140,16 +140,16 @@ async function main() {
|
|
|
140
140
|
// Connection 3: write M003, verify sees M001 + M002
|
|
141
141
|
openDatabase(dbPath);
|
|
142
142
|
const afterConn3Before = getAllMilestones();
|
|
143
|
-
|
|
143
|
+
assert.ok(afterConn3Before.some(m => m.id === 'M001'),
|
|
144
144
|
'rawconc: conn3 sees M001');
|
|
145
|
-
|
|
145
|
+
assert.ok(afterConn3Before.some(m => m.id === 'M002'),
|
|
146
146
|
'rawconc: conn3 sees M002');
|
|
147
147
|
insertMilestone({ id: 'M003', title: 'Writer 3', status: 'active' });
|
|
148
148
|
|
|
149
149
|
// Final read: all 3 visible
|
|
150
150
|
const finalAll = getAllMilestones();
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
assert.deepStrictEqual(finalAll.length, 3, 'rawconc: all 3 milestones visible');
|
|
152
|
+
assert.deepStrictEqual(
|
|
153
153
|
finalAll.map(m => m.id).sort(),
|
|
154
154
|
['M001', 'M002', 'M003'],
|
|
155
155
|
'rawconc: all IDs present',
|
|
@@ -177,7 +177,7 @@ async function main() {
|
|
|
177
177
|
|
|
178
178
|
// Verify it committed
|
|
179
179
|
const all = getAllMilestones();
|
|
180
|
-
|
|
180
|
+
assert.deepStrictEqual(all.length, 1, 'busy: M001 committed via transaction');
|
|
181
181
|
|
|
182
182
|
// Verify transaction rolls back on error
|
|
183
183
|
let errorCaught = false;
|
|
@@ -188,17 +188,17 @@ async function main() {
|
|
|
188
188
|
});
|
|
189
189
|
} catch (err) {
|
|
190
190
|
errorCaught = true;
|
|
191
|
-
|
|
191
|
+
assert.ok(
|
|
192
192
|
(err as Error).message.includes('Simulated failure'),
|
|
193
193
|
'busy: error propagated from transaction',
|
|
194
194
|
);
|
|
195
195
|
}
|
|
196
|
-
|
|
196
|
+
assert.ok(errorCaught, 'busy: transaction threw on error');
|
|
197
197
|
|
|
198
198
|
// M002 should NOT be visible (rolled back)
|
|
199
199
|
const afterRollback = getAllMilestones();
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
assert.deepStrictEqual(afterRollback.length, 1, 'busy: M002 rolled back — still only 1 milestone');
|
|
201
|
+
assert.deepStrictEqual(afterRollback[0]!.id, 'M001', 'busy: only M001 survives');
|
|
202
202
|
|
|
203
203
|
closeDatabase();
|
|
204
204
|
} finally {
|
|
@@ -206,11 +206,4 @@ async function main() {
|
|
|
206
206
|
cleanup(tmp);
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
|
-
|
|
210
|
-
report();
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
main().catch((error) => {
|
|
214
|
-
console.error(error);
|
|
215
|
-
process.exit(1);
|
|
216
209
|
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sqlite-unavailable-gate.test.ts — #2419
|
|
3
|
+
*
|
|
4
|
+
* When the SQLite provider fails to open, bootstrapAutoSession must
|
|
5
|
+
* refuse to start auto-mode. Otherwise gsd_task_complete returns
|
|
6
|
+
* "db_unavailable", artifact retry re-dispatches the same task, and
|
|
7
|
+
* the session loops forever.
|
|
8
|
+
*
|
|
9
|
+
* This test verifies the gate by reading auto-start.ts source and
|
|
10
|
+
* confirming the pattern: after the DB lifecycle block, if the DB
|
|
11
|
+
* file exists on disk but isDbAvailable() still returns false after
|
|
12
|
+
* the open attempt, bootstrap must abort with an error notification.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
18
|
+
|
|
19
|
+
const { assertTrue, report } = createTestContext();
|
|
20
|
+
|
|
21
|
+
const srcPath = join(import.meta.dirname, "..", "auto-start.ts");
|
|
22
|
+
const src = readFileSync(srcPath, "utf-8");
|
|
23
|
+
|
|
24
|
+
console.log("\n=== #2419: SQLite unavailable gate in auto-start.ts ===");
|
|
25
|
+
|
|
26
|
+
// The DB lifecycle section tries to open the DB. After those try/catch
|
|
27
|
+
// blocks, there must be a HARD GATE: if the DB file exists on disk but
|
|
28
|
+
// isDbAvailable() is still false (open failed), bootstrap must abort
|
|
29
|
+
// by calling releaseLockAndReturn() with an error notification.
|
|
30
|
+
|
|
31
|
+
const dbLifecycleIdx = src.indexOf("DB lifecycle");
|
|
32
|
+
assertTrue(dbLifecycleIdx > 0, "auto-start.ts has a DB lifecycle section");
|
|
33
|
+
|
|
34
|
+
const afterDbLifecycle = src.slice(dbLifecycleIdx);
|
|
35
|
+
|
|
36
|
+
// Find the second isDbAvailable check — the one AFTER the open attempts.
|
|
37
|
+
// The first check at line ~543 tries to open the DB.
|
|
38
|
+
// There must be a SECOND check that gates bootstrap if it's still unavailable.
|
|
39
|
+
const firstCheck = afterDbLifecycle.indexOf("isDbAvailable()");
|
|
40
|
+
assertTrue(firstCheck > 0, "DB lifecycle section has isDbAvailable() check");
|
|
41
|
+
|
|
42
|
+
const afterFirstCheck = afterDbLifecycle.slice(firstCheck + "isDbAvailable()".length);
|
|
43
|
+
const secondCheck = afterFirstCheck.indexOf("isDbAvailable()");
|
|
44
|
+
|
|
45
|
+
assertTrue(
|
|
46
|
+
secondCheck > 0,
|
|
47
|
+
"auto-start.ts has a SECOND isDbAvailable() check after the open attempt — this is the gate (#2419)",
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// The second check must lead to releaseLockAndReturn (abort bootstrap)
|
|
51
|
+
if (secondCheck > 0) {
|
|
52
|
+
const gateRegion = afterFirstCheck.slice(secondCheck, secondCheck + 500);
|
|
53
|
+
assertTrue(
|
|
54
|
+
gateRegion.includes("releaseLockAndReturn"),
|
|
55
|
+
"The DB availability gate calls releaseLockAndReturn() to abort bootstrap (#2419)",
|
|
56
|
+
);
|
|
57
|
+
assertTrue(
|
|
58
|
+
/database|sqlite|db.*unavailable/i.test(gateRegion),
|
|
59
|
+
"The DB availability gate includes a user-facing error message about the database (#2419)",
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
report();
|
|
@@ -19,9 +19,9 @@ import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
|
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { tmpdir } from "node:os";
|
|
21
21
|
import { recoverTimedOutUnit, type RecoveryContext } from "../auto-timeout-recovery.ts";
|
|
22
|
-
import {
|
|
22
|
+
import { test } from 'node:test';
|
|
23
|
+
import assert from 'node:assert/strict';
|
|
23
24
|
|
|
24
|
-
const { assertTrue, report } = createTestContext();
|
|
25
25
|
|
|
26
26
|
// Minimal mock for ExtensionContext — only the fields recoverTimedOutUnit touches.
|
|
27
27
|
function makeMockCtx() {
|
|
@@ -55,12 +55,12 @@ function makeMockPi() {
|
|
|
55
55
|
await recoverTimedOutUnit(ctx, pi, "execute-task", "M001/S01/T01", "idle", emptyRctx);
|
|
56
56
|
} catch (err: any) {
|
|
57
57
|
crashed = true;
|
|
58
|
-
|
|
58
|
+
assert.ok(
|
|
59
59
|
err.message.includes("path") || err.message.includes("string") || err.code === "ERR_INVALID_ARG_TYPE",
|
|
60
60
|
`should crash with path/type error, got: ${err.message}`,
|
|
61
61
|
);
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
assert.ok(crashed, "should crash when basePath is undefined (reproduces #1855)");
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// ═══ #1855: valid RecoveryContext does not crash ═════════════════════════════
|
|
@@ -90,13 +90,11 @@ function makeMockPi() {
|
|
|
90
90
|
crashed = true;
|
|
91
91
|
console.error(` Unexpected crash: ${err.message}`);
|
|
92
92
|
}
|
|
93
|
-
|
|
93
|
+
assert.ok(!crashed, "should not crash with valid basePath");
|
|
94
94
|
// With no runtime record on disk and recoveryAttempts=0, the function
|
|
95
95
|
// should attempt steering recovery (sendMessage) and return "recovered".
|
|
96
|
-
|
|
96
|
+
assert.ok(result === "recovered", `should return 'recovered', got '${result}'`);
|
|
97
97
|
} finally {
|
|
98
98
|
rmSync(base, { recursive: true, force: true });
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
|
|
102
|
-
report();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stop-auto-merge-back.test.ts — Regression test for #2317.
|
|
3
|
+
*
|
|
4
|
+
* When auto-mode stops after a milestone is complete, stopAuto should trigger
|
|
5
|
+
* merge-back (mergeAndExit) instead of just exiting the worktree with
|
|
6
|
+
* preserveBranch: true. Otherwise milestone code stays stranded on the
|
|
7
|
+
* worktree branch and never reaches main.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import test from "node:test";
|
|
11
|
+
import assert from "node:assert/strict";
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
|
|
15
|
+
// ─── Source analysis: stopAuto calls mergeAndExit for complete milestones ────
|
|
16
|
+
|
|
17
|
+
const autoSrcPath = join(import.meta.dirname, "..", "auto.ts");
|
|
18
|
+
const autoSrc = readFileSync(autoSrcPath, "utf-8");
|
|
19
|
+
|
|
20
|
+
test("#2317: stopAuto should check milestone completion status before choosing exit strategy", () => {
|
|
21
|
+
// stopAuto Step 4 should NOT unconditionally call exitMilestone(preserveBranch: true).
|
|
22
|
+
// It should check if the milestone is complete and call mergeAndExit instead.
|
|
23
|
+
|
|
24
|
+
// Find the Step 4 section
|
|
25
|
+
const step4Idx = autoSrc.indexOf("Step 4: Auto-worktree exit");
|
|
26
|
+
assert.ok(step4Idx !== -1, "Step 4 comment exists in stopAuto");
|
|
27
|
+
|
|
28
|
+
// Extract a reasonable window around Step 4 (up to Step 5)
|
|
29
|
+
const step5Idx = autoSrc.indexOf("Step 5:", step4Idx);
|
|
30
|
+
const step4Block = autoSrc.slice(step4Idx, step5Idx);
|
|
31
|
+
|
|
32
|
+
// The fix: Step 4 should call mergeAndExit when milestone is complete
|
|
33
|
+
assert.ok(
|
|
34
|
+
step4Block.includes("mergeAndExit"),
|
|
35
|
+
"Step 4 should call mergeAndExit for completed milestones",
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("#2317: stopAuto should detect milestone completion via SUMMARY file or DB", () => {
|
|
40
|
+
const step4Idx = autoSrc.indexOf("Step 4: Auto-worktree exit");
|
|
41
|
+
const step5Idx = autoSrc.indexOf("Step 5:", step4Idx);
|
|
42
|
+
const step4Block = autoSrc.slice(step4Idx, step5Idx);
|
|
43
|
+
|
|
44
|
+
// Should check completion status — either via SUMMARY file, DB getMilestone, or phase
|
|
45
|
+
const checksCompletion =
|
|
46
|
+
step4Block.includes("SUMMARY") ||
|
|
47
|
+
step4Block.includes("getMilestone") ||
|
|
48
|
+
step4Block.includes("complete") ||
|
|
49
|
+
step4Block.includes("isMilestoneComplete");
|
|
50
|
+
|
|
51
|
+
assert.ok(
|
|
52
|
+
checksCompletion,
|
|
53
|
+
"Step 4 should check if milestone is complete before deciding exit strategy",
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("#2317: stopAuto still preserves branch for incomplete milestones", () => {
|
|
58
|
+
const step4Idx = autoSrc.indexOf("Step 4: Auto-worktree exit");
|
|
59
|
+
const step5Idx = autoSrc.indexOf("Step 5:", step4Idx);
|
|
60
|
+
const step4Block = autoSrc.slice(step4Idx, step5Idx);
|
|
61
|
+
|
|
62
|
+
// preserveBranch should still be used as fallback for non-complete milestones
|
|
63
|
+
assert.ok(
|
|
64
|
+
step4Block.includes("preserveBranch"),
|
|
65
|
+
"Step 4 should still preserve branch for incomplete milestones (fallback path)",
|
|
66
|
+
);
|
|
67
|
+
});
|
|
@@ -64,7 +64,7 @@ test("stopAutoRemote cleans up stale lock (dead PID) and returns found:false", (
|
|
|
64
64
|
const base = makeTmpBase();
|
|
65
65
|
try {
|
|
66
66
|
// Write a lock with a PID that doesn't exist
|
|
67
|
-
writeLock(base, "execute-task", "M001/S01/T01"
|
|
67
|
+
writeLock(base, "execute-task", "M001/S01/T01");
|
|
68
68
|
// Overwrite PID to a dead one
|
|
69
69
|
const lock = readCrashLock(base)!;
|
|
70
70
|
const staleData = { ...lock, pid: 999999999 };
|
|
@@ -111,7 +111,6 @@ test("stopAutoRemote sends SIGTERM to a live process and returns found:true", {
|
|
|
111
111
|
unitType: "execute-task",
|
|
112
112
|
unitId: "M001/S01/T01",
|
|
113
113
|
unitStartedAt: new Date().toISOString(),
|
|
114
|
-
completedUnits: 0,
|
|
115
114
|
};
|
|
116
115
|
writeFileSync(join(base, ".gsd", "auto.lock"), JSON.stringify(lockData, null, 2), "utf-8");
|
|
117
116
|
|
|
@@ -143,7 +142,7 @@ test("lock file should be discoverable at project root, not worktree path", () =
|
|
|
143
142
|
|
|
144
143
|
try {
|
|
145
144
|
// Simulate: auto-mode writes lock to project root (the fix)
|
|
146
|
-
writeLock(projectRoot, "execute-task", "M001/S01/T01"
|
|
145
|
+
writeLock(projectRoot, "execute-task", "M001/S01/T01");
|
|
147
146
|
|
|
148
147
|
// Second terminal checks project root — should find the lock
|
|
149
148
|
const lock = readCrashLock(projectRoot);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #2358: Survivor branch recovery skipped in phase=complete.
|
|
3
|
+
*
|
|
4
|
+
* When bootstrapAutoSession finds a survivor milestone branch and the derived
|
|
5
|
+
* state phase is "complete", recovery/finalization is skipped entirely because
|
|
6
|
+
* the survivor branch detection only triggers when phase === "pre-planning".
|
|
7
|
+
* The milestone finalization (merge, cleanup) never runs, leaving the worktree
|
|
8
|
+
* and branch alive.
|
|
9
|
+
*
|
|
10
|
+
* The fix broadens the survivor branch detection to also check phase === "complete",
|
|
11
|
+
* and adds a finalization path that runs mergeAndExit before falling through to
|
|
12
|
+
* the normal "complete" handling.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
16
|
+
|
|
17
|
+
const { assertTrue, assertEq, report } = createTestContext();
|
|
18
|
+
|
|
19
|
+
// ═══ Test: survivor branch detection conditions ══════════════════════════════
|
|
20
|
+
|
|
21
|
+
// The survivor branch detection block in auto-start.ts checks:
|
|
22
|
+
// state.activeMilestone &&
|
|
23
|
+
// state.phase === "pre-planning" && // <-- BUG: too restrictive
|
|
24
|
+
// shouldUseWorktreeIsolation() &&
|
|
25
|
+
// !detectWorktreeName(base) &&
|
|
26
|
+
// !base.includes(...)
|
|
27
|
+
//
|
|
28
|
+
// The fix should also include state.phase === "complete".
|
|
29
|
+
|
|
30
|
+
{
|
|
31
|
+
console.log("\n=== #2358: survivor branch should be detected in phase=complete ===");
|
|
32
|
+
|
|
33
|
+
// Simulate the condition check before the fix (only pre-planning)
|
|
34
|
+
const phasesBeforeFix = ["pre-planning"];
|
|
35
|
+
const phasesAfterFix = ["pre-planning", "complete"];
|
|
36
|
+
|
|
37
|
+
const testPhase = "complete";
|
|
38
|
+
|
|
39
|
+
const detectedBefore = phasesBeforeFix.includes(testPhase);
|
|
40
|
+
assertEq(detectedBefore, false, "before fix: phase=complete should NOT trigger survivor detection");
|
|
41
|
+
|
|
42
|
+
const detectedAfter = phasesAfterFix.includes(testPhase);
|
|
43
|
+
assertEq(detectedAfter, true, "after fix: phase=complete SHOULD trigger survivor detection");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ═══ Test: pre-planning survivor detection still works ═══════════════════════
|
|
47
|
+
|
|
48
|
+
{
|
|
49
|
+
console.log("\n=== #2358: pre-planning survivor detection is not broken ===");
|
|
50
|
+
|
|
51
|
+
const phasesAfterFix = ["pre-planning", "complete"];
|
|
52
|
+
const testPhase = "pre-planning";
|
|
53
|
+
|
|
54
|
+
const detected = phasesAfterFix.includes(testPhase);
|
|
55
|
+
assertEq(detected, true, "pre-planning should still trigger survivor detection after fix");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ═══ Test: other phases do NOT trigger survivor detection ════════════════════
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
console.log("\n=== #2358: other phases should NOT trigger survivor detection ===");
|
|
62
|
+
|
|
63
|
+
const phasesAfterFix = ["pre-planning", "complete"];
|
|
64
|
+
|
|
65
|
+
for (const phase of ["planning", "executing", "blocked", "needs-discussion"]) {
|
|
66
|
+
const detected = phasesAfterFix.includes(phase);
|
|
67
|
+
assertEq(detected, false, `phase=${phase} should NOT trigger survivor detection`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ═══ Test: phase=complete + hasSurvivorBranch should trigger finalization ═════
|
|
72
|
+
|
|
73
|
+
{
|
|
74
|
+
console.log("\n=== #2358: phase=complete + survivor branch triggers finalization path ===");
|
|
75
|
+
|
|
76
|
+
// Simulate the decision logic after the fix:
|
|
77
|
+
// if (hasSurvivorBranch && state.phase === "complete") -> finalize
|
|
78
|
+
// if (hasSurvivorBranch && state.phase === "needs-discussion") -> discuss
|
|
79
|
+
// if (!hasSurvivorBranch && state.phase === "complete") -> showSmartEntry
|
|
80
|
+
|
|
81
|
+
const scenarios = [
|
|
82
|
+
{ hasSurvivorBranch: true, phase: "complete", expected: "finalize" },
|
|
83
|
+
{ hasSurvivorBranch: true, phase: "needs-discussion", expected: "discuss" },
|
|
84
|
+
{ hasSurvivorBranch: true, phase: "pre-planning", expected: "continue" },
|
|
85
|
+
{ hasSurvivorBranch: false, phase: "complete", expected: "showSmartEntry" },
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
for (const { hasSurvivorBranch, phase, expected } of scenarios) {
|
|
89
|
+
let result: string;
|
|
90
|
+
if (hasSurvivorBranch && phase === "complete") {
|
|
91
|
+
result = "finalize";
|
|
92
|
+
} else if (hasSurvivorBranch && phase === "needs-discussion") {
|
|
93
|
+
result = "discuss";
|
|
94
|
+
} else if (!hasSurvivorBranch && (!phase || phase === "complete")) {
|
|
95
|
+
result = "showSmartEntry";
|
|
96
|
+
} else {
|
|
97
|
+
result = "continue";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
assertEq(
|
|
101
|
+
result,
|
|
102
|
+
expected,
|
|
103
|
+
`hasSurvivorBranch=${hasSurvivorBranch}, phase=${phase} -> expected ${expected}, got ${result}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
report();
|