gsd-pi 2.43.0-next.8 → 2.44.0-dev.0b97ffd
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/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +21 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +130 -51
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
- package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
- package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -11
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -10
- package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
- package/dist/resources/extensions/gsd/workspace-index.js +46 -15
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/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 +1 -1
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +18 -18
- 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.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/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +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 +4 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +11 -34
- package/packages/pi-coding-agent/dist/core/agent-session.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/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.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 +37 -0
- 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/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- 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/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.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/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/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.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/agent-session.ts +13 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +23 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- 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/auto-direct-dispatch.ts +22 -7
- package/src/resources/extensions/gsd/auto-prompts.ts +109 -42
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +16 -3
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
- package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
- package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-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-stash-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- 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.test.ts +152 -183
- 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/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/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/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- 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 +9 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -18
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -15
- package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
- package/src/resources/extensions/gsd/workspace-index.ts +49 -18
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
/**
|
|
2
4
|
* doctor-runtime.test.ts — Tests for doctor runtime health checks.
|
|
3
5
|
*
|
|
@@ -13,10 +15,6 @@ import { tmpdir } from "node:os";
|
|
|
13
15
|
import { execSync } from "node:child_process";
|
|
14
16
|
|
|
15
17
|
import { runGSDDoctor } from "../doctor.ts";
|
|
16
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
17
|
-
|
|
18
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
19
|
-
|
|
20
18
|
function run(cmd: string, cwd: string): string {
|
|
21
19
|
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
22
20
|
}
|
|
@@ -57,13 +55,12 @@ function createGitProject(): string {
|
|
|
57
55
|
return dir;
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
async
|
|
58
|
+
describe('doctor-runtime', async () => {
|
|
61
59
|
const cleanups: string[] = [];
|
|
62
60
|
|
|
63
61
|
try {
|
|
64
62
|
// ─── Test 1: Stale crash lock detection & fix ─────────────────────
|
|
65
|
-
|
|
66
|
-
{
|
|
63
|
+
test('stale_crash_lock', async () => {
|
|
67
64
|
const dir = createMinimalProject();
|
|
68
65
|
cleanups.push(dir);
|
|
69
66
|
|
|
@@ -80,29 +77,27 @@ async function main(): Promise<void> {
|
|
|
80
77
|
|
|
81
78
|
const detect = await runGSDDoctor(dir);
|
|
82
79
|
const lockIssues = detect.issues.filter(i => i.code === "stale_crash_lock");
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
assert.ok(lockIssues.length > 0, "detects stale crash lock");
|
|
81
|
+
assert.ok(lockIssues[0]?.message.includes("9999999"), "message includes PID");
|
|
82
|
+
assert.ok(lockIssues[0]?.fixable === true, "stale lock is fixable");
|
|
86
83
|
|
|
87
84
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
85
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("cleared stale auto.lock")), "fix clears stale lock");
|
|
86
|
+
assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock removed after fix");
|
|
87
|
+
});
|
|
91
88
|
|
|
92
89
|
// ─── Test 2: No false positive for missing lock ───────────────────
|
|
93
|
-
|
|
94
|
-
{
|
|
90
|
+
test('stale_crash_lock — no false positive', async () => {
|
|
95
91
|
const dir = createMinimalProject();
|
|
96
92
|
cleanups.push(dir);
|
|
97
93
|
|
|
98
94
|
const detect = await runGSDDoctor(dir);
|
|
99
95
|
const lockIssues = detect.issues.filter(i => i.code === "stale_crash_lock");
|
|
100
|
-
|
|
101
|
-
}
|
|
96
|
+
assert.deepStrictEqual(lockIssues.length, 0, "no stale lock issue when no lock file exists");
|
|
97
|
+
});
|
|
102
98
|
|
|
103
99
|
// ─── Test 3: Stale hook state detection & fix ─────────────────────
|
|
104
|
-
|
|
105
|
-
{
|
|
100
|
+
test('stale_hook_state', async () => {
|
|
106
101
|
const dir = createMinimalProject();
|
|
107
102
|
cleanups.push(dir);
|
|
108
103
|
|
|
@@ -118,20 +113,19 @@ async function main(): Promise<void> {
|
|
|
118
113
|
|
|
119
114
|
const detect = await runGSDDoctor(dir);
|
|
120
115
|
const hookIssues = detect.issues.filter(i => i.code === "stale_hook_state");
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
assert.ok(hookIssues.length > 0, "detects stale hook state");
|
|
117
|
+
assert.ok(hookIssues[0]?.message.includes("2 residual cycle count"), "message includes count");
|
|
123
118
|
|
|
124
119
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
125
|
-
|
|
120
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("cleared stale hook-state.json")), "fix clears hook state");
|
|
126
121
|
|
|
127
122
|
// Verify the file was cleaned
|
|
128
123
|
const content = JSON.parse(readFileSync(join(dir, ".gsd", "hook-state.json"), "utf-8"));
|
|
129
|
-
|
|
130
|
-
}
|
|
124
|
+
assert.deepStrictEqual(Object.keys(content.cycleCounts).length, 0, "hook state cycle counts cleared");
|
|
125
|
+
});
|
|
131
126
|
|
|
132
127
|
// ─── Test 4: Activity log bloat detection ─────────────────────────
|
|
133
|
-
|
|
134
|
-
{
|
|
128
|
+
test('activity_log_bloat', async () => {
|
|
135
129
|
const dir = createMinimalProject();
|
|
136
130
|
cleanups.push(dir);
|
|
137
131
|
|
|
@@ -144,39 +138,37 @@ async function main(): Promise<void> {
|
|
|
144
138
|
|
|
145
139
|
const detect = await runGSDDoctor(dir);
|
|
146
140
|
const bloatIssues = detect.issues.filter(i => i.code === "activity_log_bloat");
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
141
|
+
assert.ok(bloatIssues.length > 0, "detects activity log bloat");
|
|
142
|
+
assert.ok(bloatIssues[0]?.message.includes("510 files"), "message includes file count");
|
|
143
|
+
});
|
|
150
144
|
|
|
151
145
|
// ─── Test 5: STATE.md missing detection & fix ─────────────────────
|
|
152
|
-
|
|
153
|
-
{
|
|
146
|
+
test('state_file_missing', async () => {
|
|
154
147
|
const dir = createMinimalProject();
|
|
155
148
|
cleanups.push(dir);
|
|
156
149
|
|
|
157
150
|
// No STATE.md exists by default in our minimal setup
|
|
158
151
|
const stateFilePath = join(dir, ".gsd", "STATE.md");
|
|
159
|
-
|
|
152
|
+
assert.ok(!existsSync(stateFilePath), "STATE.md does not exist initially");
|
|
160
153
|
|
|
161
154
|
const detect = await runGSDDoctor(dir);
|
|
162
155
|
const stateIssues = detect.issues.filter(i => i.code === "state_file_missing");
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
156
|
+
assert.ok(stateIssues.length > 0, "detects missing STATE.md");
|
|
157
|
+
assert.ok(stateIssues[0]?.fixable === true, "missing STATE.md is fixable");
|
|
158
|
+
assert.deepStrictEqual(stateIssues[0]?.severity, "warning", "missing STATE.md is a warning (derived file)");
|
|
166
159
|
|
|
167
160
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
168
|
-
|
|
169
|
-
|
|
161
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("created STATE.md")), "fix creates STATE.md");
|
|
162
|
+
assert.ok(existsSync(stateFilePath), "STATE.md exists after fix");
|
|
170
163
|
|
|
171
164
|
// Verify content has expected structure
|
|
172
165
|
const content = readFileSync(stateFilePath, "utf-8");
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
166
|
+
assert.ok(content.includes("# GSD State"), "STATE.md has header");
|
|
167
|
+
assert.ok(content.includes("M001"), "STATE.md references milestone");
|
|
168
|
+
});
|
|
176
169
|
|
|
177
170
|
// ─── Test 6: STATE.md stale detection & fix ───────────────────────
|
|
178
|
-
|
|
179
|
-
{
|
|
171
|
+
test('state_file_stale', async () => {
|
|
180
172
|
const dir = createMinimalProject();
|
|
181
173
|
cleanups.push(dir);
|
|
182
174
|
|
|
@@ -202,21 +194,20 @@ None
|
|
|
202
194
|
|
|
203
195
|
const detect = await runGSDDoctor(dir);
|
|
204
196
|
const staleIssues = detect.issues.filter(i => i.code === "state_file_stale");
|
|
205
|
-
|
|
206
|
-
|
|
197
|
+
assert.ok(staleIssues.length > 0, "detects stale STATE.md");
|
|
198
|
+
assert.ok(staleIssues[0]?.message.includes("idle"), "message references old phase");
|
|
207
199
|
|
|
208
200
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
209
|
-
|
|
201
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("rebuilt STATE.md")), "fix rebuilds STATE.md");
|
|
210
202
|
|
|
211
203
|
// Verify updated content matches derived state
|
|
212
204
|
const content = readFileSync(stateFilePath, "utf-8");
|
|
213
|
-
|
|
214
|
-
}
|
|
205
|
+
assert.ok(content.includes("M001"), "rebuilt STATE.md references milestone");
|
|
206
|
+
});
|
|
215
207
|
|
|
216
208
|
// ─── Test 7: Gitignore missing patterns detection & fix ───────────
|
|
217
209
|
if (process.platform !== "win32") {
|
|
218
|
-
|
|
219
|
-
{
|
|
210
|
+
test('gitignore_missing_patterns', async () => {
|
|
220
211
|
const dir = createGitProject();
|
|
221
212
|
cleanups.push(dir);
|
|
222
213
|
|
|
@@ -230,24 +221,22 @@ None
|
|
|
230
221
|
|
|
231
222
|
const detect = await runGSDDoctor(dir);
|
|
232
223
|
const gitignoreIssues = detect.issues.filter(i => i.code === "gitignore_missing_patterns");
|
|
233
|
-
|
|
234
|
-
|
|
224
|
+
assert.ok(gitignoreIssues.length > 0, "detects missing gitignore patterns");
|
|
225
|
+
assert.ok(gitignoreIssues[0]?.message.includes(".gsd"), "message lists missing .gsd pattern");
|
|
235
226
|
|
|
236
227
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
237
|
-
|
|
228
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("added missing GSD runtime patterns")), "fix adds patterns");
|
|
238
229
|
|
|
239
230
|
// Verify .gsd entry was added (external state symlink)
|
|
240
231
|
const content = readFileSync(join(dir, ".gitignore"), "utf-8");
|
|
241
|
-
|
|
242
|
-
}
|
|
232
|
+
assert.ok(content.includes(".gsd"), "gitignore now has .gsd entry");
|
|
233
|
+
});
|
|
243
234
|
} else {
|
|
244
|
-
console.log("\n=== gitignore_missing_patterns (skipped on Windows) ===");
|
|
245
235
|
}
|
|
246
236
|
|
|
247
237
|
// ─── Test 8: No false positive when gitignore has blanket .gsd/ ───
|
|
248
238
|
if (process.platform !== "win32") {
|
|
249
|
-
|
|
250
|
-
{
|
|
239
|
+
test('gitignore — blanket .gsd/', async () => {
|
|
251
240
|
const dir = createGitProject();
|
|
252
241
|
cleanups.push(dir);
|
|
253
242
|
|
|
@@ -258,15 +247,13 @@ node_modules/
|
|
|
258
247
|
|
|
259
248
|
const detect = await runGSDDoctor(dir);
|
|
260
249
|
const gitignoreIssues = detect.issues.filter(i => i.code === "gitignore_missing_patterns");
|
|
261
|
-
|
|
262
|
-
}
|
|
250
|
+
assert.deepStrictEqual(gitignoreIssues.length, 0, "no missing patterns when blanket .gsd/ present");
|
|
251
|
+
});
|
|
263
252
|
} else {
|
|
264
|
-
console.log("\n=== gitignore — blanket .gsd/ (skipped on Windows) ===");
|
|
265
253
|
}
|
|
266
254
|
|
|
267
255
|
// ─── Test 9: Orphaned completed-units detection & fix ─────────────
|
|
268
|
-
|
|
269
|
-
{
|
|
256
|
+
test('orphaned_completed_units', async () => {
|
|
270
257
|
const dir = createMinimalProject();
|
|
271
258
|
cleanups.push(dir);
|
|
272
259
|
|
|
@@ -279,24 +266,23 @@ node_modules/
|
|
|
279
266
|
|
|
280
267
|
const detect = await runGSDDoctor(dir);
|
|
281
268
|
const orphanIssues = detect.issues.filter(i => i.code === "orphaned_completed_units");
|
|
282
|
-
|
|
283
|
-
|
|
269
|
+
assert.ok(orphanIssues.length > 0, "detects orphaned completed-unit keys");
|
|
270
|
+
assert.ok(orphanIssues[0]?.message.includes("2 completed-unit key"), "message includes count");
|
|
284
271
|
|
|
285
272
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
286
|
-
|
|
273
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("removed") && f.includes("orphaned")), "fix removes orphaned keys");
|
|
287
274
|
|
|
288
275
|
// Verify keys were cleaned
|
|
289
276
|
const content = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
|
|
290
|
-
|
|
291
|
-
}
|
|
277
|
+
assert.deepStrictEqual(content.length, 0, "all orphaned keys removed");
|
|
278
|
+
});
|
|
292
279
|
|
|
293
280
|
// ─── Test: Stranded lock directory detection & fix ────────────────
|
|
294
281
|
// Skip on Windows: proper-lockfile uses advisory file locking on Windows,
|
|
295
282
|
// not the directory-based mechanism. The .gsd.lock/ directory pattern is
|
|
296
283
|
// a POSIX-specific lockfile implementation detail.
|
|
297
284
|
if (process.platform !== "win32") {
|
|
298
|
-
|
|
299
|
-
{
|
|
285
|
+
test('stranded_lock_directory', async () => {
|
|
300
286
|
const dir = createMinimalProject();
|
|
301
287
|
cleanups.push(dir);
|
|
302
288
|
|
|
@@ -307,21 +293,20 @@ node_modules/
|
|
|
307
293
|
|
|
308
294
|
const detect = await runGSDDoctor(dir);
|
|
309
295
|
const strandedIssues = detect.issues.filter(i => i.code === "stranded_lock_directory");
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
296
|
+
assert.ok(strandedIssues.length > 0, "detects stranded lock directory");
|
|
297
|
+
assert.ok(strandedIssues[0]?.message.includes("lock directory"), "message describes stranded lock directory");
|
|
298
|
+
assert.ok(strandedIssues[0]?.fixable === true, "stranded lock dir is fixable");
|
|
313
299
|
|
|
314
300
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
315
|
-
|
|
301
|
+
assert.ok(
|
|
316
302
|
fixed.fixesApplied.some(f => f.includes("removed stranded lock directory")),
|
|
317
303
|
"fix removes stranded lock directory",
|
|
318
304
|
);
|
|
319
|
-
|
|
320
|
-
}
|
|
305
|
+
assert.ok(!existsSync(lockDir), "lock directory removed after fix");
|
|
306
|
+
});
|
|
321
307
|
|
|
322
308
|
// ─── Test: Stranded lock dir with live lock holder — NOT flagged ───
|
|
323
|
-
|
|
324
|
-
{
|
|
309
|
+
test('stranded_lock_directory (live holder not flagged)', async () => {
|
|
325
310
|
const dir = createMinimalProject();
|
|
326
311
|
cleanups.push(dir);
|
|
327
312
|
|
|
@@ -340,18 +325,16 @@ node_modules/
|
|
|
340
325
|
|
|
341
326
|
const detect = await runGSDDoctor(dir);
|
|
342
327
|
const strandedIssues = detect.issues.filter(i => i.code === "stranded_lock_directory");
|
|
343
|
-
|
|
344
|
-
}
|
|
328
|
+
assert.deepStrictEqual(strandedIssues.length, 0, "live lock holder: stranded_lock_directory NOT detected");
|
|
329
|
+
});
|
|
345
330
|
} else {
|
|
346
|
-
console.log("\n=== stranded_lock_directory (skipped on Windows) ===");
|
|
347
331
|
}
|
|
348
332
|
|
|
349
333
|
// ─── Test: orphaned_completed_units NOT auto-fixed at fixLevel="task" (#1809) ──
|
|
350
334
|
// Regression: task-level doctor was removing completed-unit keys whose artifacts
|
|
351
335
|
// were temporarily missing, causing deriveState to revert the user to S01 and
|
|
352
336
|
// effectively discarding hours of work.
|
|
353
|
-
|
|
354
|
-
{
|
|
337
|
+
test('orphaned_completed_units protected at fixLevel=task (#1809)', async () => {
|
|
355
338
|
const dir = createMinimalProject();
|
|
356
339
|
cleanups.push(dir);
|
|
357
340
|
|
|
@@ -366,33 +349,29 @@ node_modules/
|
|
|
366
349
|
// fixLevel="task" — the level used by auto-post-unit after every task
|
|
367
350
|
const taskLevelFix = await runGSDDoctor(dir, { fix: true, fixLevel: "task" });
|
|
368
351
|
const taskLevelOrphan = taskLevelFix.issues.filter(i => i.code === "orphaned_completed_units");
|
|
369
|
-
|
|
352
|
+
assert.ok(taskLevelOrphan.length > 0, "orphaned_completed_units detected at task fixLevel");
|
|
370
353
|
|
|
371
354
|
// Verify keys were NOT removed — the fix must be suppressed at task level
|
|
372
355
|
const afterTaskFix = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
|
|
373
|
-
|
|
374
|
-
|
|
356
|
+
assert.deepStrictEqual(afterTaskFix.length, 2, "completed-unit keys preserved at fixLevel=task (data loss prevention)");
|
|
357
|
+
assert.ok(
|
|
375
358
|
!taskLevelFix.fixesApplied.some(f => f.includes("orphaned")),
|
|
376
359
|
"no orphaned-units fix applied at fixLevel=task",
|
|
377
360
|
);
|
|
378
361
|
|
|
379
362
|
// fixLevel="all" (explicit manual doctor) — fix SHOULD apply
|
|
380
363
|
const allLevelFix = await runGSDDoctor(dir, { fix: true, fixLevel: "all" });
|
|
381
|
-
|
|
364
|
+
assert.ok(
|
|
382
365
|
allLevelFix.fixesApplied.some(f => f.includes("orphaned")),
|
|
383
366
|
"orphaned-units fix applied at fixLevel=all (manual doctor)",
|
|
384
367
|
);
|
|
385
368
|
const afterAllFix = JSON.parse(readFileSync(join(dir, ".gsd", "completed-units.json"), "utf-8"));
|
|
386
|
-
|
|
387
|
-
}
|
|
369
|
+
assert.deepStrictEqual(afterAllFix.length, 0, "orphaned keys removed at fixLevel=all");
|
|
370
|
+
});
|
|
388
371
|
|
|
389
372
|
} finally {
|
|
390
373
|
for (const dir of cleanups) {
|
|
391
374
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
392
375
|
}
|
|
393
376
|
}
|
|
394
|
-
|
|
395
|
-
report();
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
main();
|
|
377
|
+
});
|