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-environment-worktree.test.ts — Worktree-aware dependency checks (#2303).
|
|
3
5
|
*
|
|
@@ -19,10 +21,6 @@ import {
|
|
|
19
21
|
environmentResultsToDoctorIssues,
|
|
20
22
|
checkEnvironmentHealth,
|
|
21
23
|
} from "../doctor-environment.ts";
|
|
22
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
23
|
-
|
|
24
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
25
|
-
|
|
26
24
|
/** Create a directory tree with files. */
|
|
27
25
|
function createDir(files: Record<string, string> = {}): string {
|
|
28
26
|
const dir = mkdtempSync(join(tmpdir(), "gsd-wt-env-"));
|
|
@@ -34,13 +32,12 @@ function createDir(files: Record<string, string> = {}): string {
|
|
|
34
32
|
return dir;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
async
|
|
35
|
+
describe('doctor-environment-worktree', async () => {
|
|
38
36
|
const cleanups: string[] = [];
|
|
39
37
|
|
|
40
38
|
try {
|
|
41
39
|
// ── Reproduction: worktree path without node_modules ───────────────
|
|
42
|
-
|
|
43
|
-
{
|
|
40
|
+
test('worktree: missing node_modules should NOT error when project root has them', () => {
|
|
44
41
|
// Simulate project root with node_modules
|
|
45
42
|
const projectRoot = createDir({
|
|
46
43
|
"package.json": JSON.stringify({ name: "test-project" }),
|
|
@@ -62,15 +59,14 @@ async function main(): Promise<void> {
|
|
|
62
59
|
|
|
63
60
|
// Before fix: this would return status "error" with "node_modules missing"
|
|
64
61
|
// After fix: should return "ok" because project root has node_modules
|
|
65
|
-
|
|
62
|
+
assert.ok(
|
|
66
63
|
depsCheck === undefined || depsCheck.status !== "error",
|
|
67
64
|
"worktree should not report env_dependencies error when project root has node_modules",
|
|
68
65
|
);
|
|
69
|
-
}
|
|
66
|
+
});
|
|
70
67
|
|
|
71
68
|
// ── Worktree with NO node_modules anywhere should still error ──────
|
|
72
|
-
|
|
73
|
-
{
|
|
69
|
+
test('worktree: missing node_modules everywhere should still error', () => {
|
|
74
70
|
const projectRoot = createDir({
|
|
75
71
|
"package.json": JSON.stringify({ name: "test-project" }),
|
|
76
72
|
});
|
|
@@ -86,13 +82,12 @@ async function main(): Promise<void> {
|
|
|
86
82
|
|
|
87
83
|
const results = runEnvironmentChecks(worktreeDir);
|
|
88
84
|
const depsCheck = results.find(r => r.name === "dependencies");
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
85
|
+
assert.ok(depsCheck !== undefined, "dependencies check still runs in worktree");
|
|
86
|
+
assert.deepStrictEqual(depsCheck!.status, "error", "reports error when node_modules missing everywhere");
|
|
87
|
+
});
|
|
92
88
|
|
|
93
89
|
// ── Worktree env_dependencies not in doctor issues ──────────────────
|
|
94
|
-
|
|
95
|
-
{
|
|
90
|
+
test('worktree: checkEnvironmentHealth should not add env_dependencies for valid worktree', async () => {
|
|
96
91
|
const projectRoot = createDir({
|
|
97
92
|
"package.json": JSON.stringify({ name: "test-project" }),
|
|
98
93
|
});
|
|
@@ -109,29 +104,27 @@ async function main(): Promise<void> {
|
|
|
109
104
|
const issues: any[] = [];
|
|
110
105
|
await checkEnvironmentHealth(worktreeDir, issues);
|
|
111
106
|
const depIssue = issues.find(i => i.code === "env_dependencies");
|
|
112
|
-
|
|
107
|
+
assert.deepStrictEqual(
|
|
113
108
|
depIssue,
|
|
114
109
|
undefined,
|
|
115
110
|
"no env_dependencies issue for worktree with project root node_modules",
|
|
116
111
|
);
|
|
117
|
-
}
|
|
112
|
+
});
|
|
118
113
|
|
|
119
114
|
// ── Non-worktree path still catches missing node_modules ───────────
|
|
120
|
-
|
|
121
|
-
{
|
|
115
|
+
test('non-worktree: missing node_modules still detected', () => {
|
|
122
116
|
const dir = createDir({
|
|
123
117
|
"package.json": JSON.stringify({ name: "test" }),
|
|
124
118
|
});
|
|
125
119
|
cleanups.push(dir);
|
|
126
120
|
const results = runEnvironmentChecks(dir);
|
|
127
121
|
const depsCheck = results.find(r => r.name === "dependencies");
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
122
|
+
assert.ok(depsCheck !== undefined, "dependencies check runs");
|
|
123
|
+
assert.deepStrictEqual(depsCheck!.status, "error", "missing node_modules is an error for non-worktree");
|
|
124
|
+
});
|
|
131
125
|
|
|
132
126
|
// ── GSD_WORKTREE env var detection ─────────────────────────────────
|
|
133
|
-
|
|
134
|
-
{
|
|
127
|
+
test('GSD_WORKTREE env: should resolve project root node_modules', () => {
|
|
135
128
|
const projectRoot = createDir({
|
|
136
129
|
"package.json": JSON.stringify({ name: "test-project" }),
|
|
137
130
|
});
|
|
@@ -150,7 +143,7 @@ async function main(): Promise<void> {
|
|
|
150
143
|
process.env.GSD_WORKTREE = projectRoot;
|
|
151
144
|
const results = runEnvironmentChecks(someDir);
|
|
152
145
|
const depsCheck = results.find(r => r.name === "dependencies");
|
|
153
|
-
|
|
146
|
+
assert.ok(
|
|
154
147
|
depsCheck === undefined || depsCheck.status !== "error",
|
|
155
148
|
"GSD_WORKTREE env allows fallback to project root node_modules",
|
|
156
149
|
);
|
|
@@ -161,15 +154,11 @@ async function main(): Promise<void> {
|
|
|
161
154
|
process.env.GSD_WORKTREE = origEnv;
|
|
162
155
|
}
|
|
163
156
|
}
|
|
164
|
-
}
|
|
157
|
+
});
|
|
165
158
|
|
|
166
159
|
} finally {
|
|
167
160
|
for (const dir of cleanups) {
|
|
168
161
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
169
162
|
}
|
|
170
163
|
}
|
|
171
|
-
|
|
172
|
-
report();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
main();
|
|
164
|
+
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
/**
|
|
2
4
|
* doctor-environment.test.ts — Tests for environment health checks (#1221).
|
|
3
5
|
*
|
|
@@ -25,10 +27,6 @@ import {
|
|
|
25
27
|
checkEnvironmentHealth,
|
|
26
28
|
type EnvironmentCheckResult,
|
|
27
29
|
} from "../doctor-environment.ts";
|
|
28
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
29
|
-
|
|
30
|
-
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
31
|
-
|
|
32
30
|
function createProjectDir(files: Record<string, string> = {}): string {
|
|
33
31
|
const dir = mkdtempSync(join(tmpdir(), "gsd-env-test-"));
|
|
34
32
|
for (const [name, content] of Object.entries(files)) {
|
|
@@ -39,34 +37,31 @@ function createProjectDir(files: Record<string, string> = {}): string {
|
|
|
39
37
|
return dir;
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
async
|
|
40
|
+
describe('doctor-environment', async () => {
|
|
43
41
|
const cleanups: string[] = [];
|
|
44
42
|
|
|
45
43
|
try {
|
|
46
44
|
// ── Node Version Check ─────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
{
|
|
45
|
+
test('env: no package.json returns empty', () => {
|
|
49
46
|
const dir = createProjectDir();
|
|
50
47
|
cleanups.push(dir);
|
|
51
48
|
const results = runEnvironmentChecks(dir);
|
|
52
49
|
// No package.json → no node checks
|
|
53
50
|
const nodeCheck = results.find(r => r.name === "node_version");
|
|
54
|
-
|
|
55
|
-
}
|
|
51
|
+
assert.deepStrictEqual(nodeCheck, undefined, "no node version check without package.json");
|
|
52
|
+
});
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
{
|
|
54
|
+
test('env: package.json without engines returns no node check', () => {
|
|
59
55
|
const dir = createProjectDir({
|
|
60
56
|
"package.json": JSON.stringify({ name: "test", version: "1.0.0" }),
|
|
61
57
|
});
|
|
62
58
|
cleanups.push(dir);
|
|
63
59
|
const results = runEnvironmentChecks(dir);
|
|
64
60
|
const nodeCheck = results.find(r => r.name === "node_version");
|
|
65
|
-
|
|
66
|
-
}
|
|
61
|
+
assert.deepStrictEqual(nodeCheck, undefined, "no node version check without engines field");
|
|
62
|
+
});
|
|
67
63
|
|
|
68
|
-
|
|
69
|
-
{
|
|
64
|
+
test('env: package.json with engines returns node check', () => {
|
|
70
65
|
const dir = createProjectDir({
|
|
71
66
|
"package.json": JSON.stringify({
|
|
72
67
|
name: "test",
|
|
@@ -77,27 +72,25 @@ async function main(): Promise<void> {
|
|
|
77
72
|
cleanups.push(dir);
|
|
78
73
|
const results = runEnvironmentChecks(dir);
|
|
79
74
|
const nodeCheck = results.find(r => r.name === "node_version");
|
|
80
|
-
|
|
75
|
+
assert.ok(nodeCheck !== undefined, "node version check runs with engines field");
|
|
81
76
|
// Current node should be >= 18 in CI
|
|
82
|
-
|
|
83
|
-
}
|
|
77
|
+
assert.deepStrictEqual(nodeCheck!.status, "ok", "node version meets requirement");
|
|
78
|
+
});
|
|
84
79
|
|
|
85
80
|
// ── Dependencies Check ─────────────────────────────────────────────
|
|
86
|
-
|
|
87
|
-
{
|
|
81
|
+
test('env: missing node_modules detected', () => {
|
|
88
82
|
const dir = createProjectDir({
|
|
89
83
|
"package.json": JSON.stringify({ name: "test" }),
|
|
90
84
|
});
|
|
91
85
|
cleanups.push(dir);
|
|
92
86
|
const results = runEnvironmentChecks(dir);
|
|
93
87
|
const depsCheck = results.find(r => r.name === "dependencies");
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
88
|
+
assert.ok(depsCheck !== undefined, "dependencies check runs");
|
|
89
|
+
assert.deepStrictEqual(depsCheck!.status, "error", "missing node_modules is an error");
|
|
90
|
+
assert.ok(depsCheck!.message.includes("node_modules missing"), "reports missing node_modules");
|
|
91
|
+
});
|
|
98
92
|
|
|
99
|
-
|
|
100
|
-
{
|
|
93
|
+
test('env: existing node_modules detected', () => {
|
|
101
94
|
const dir = createProjectDir({
|
|
102
95
|
"package.json": JSON.stringify({ name: "test" }),
|
|
103
96
|
});
|
|
@@ -105,25 +98,23 @@ async function main(): Promise<void> {
|
|
|
105
98
|
cleanups.push(dir);
|
|
106
99
|
const results = runEnvironmentChecks(dir);
|
|
107
100
|
const depsCheck = results.find(r => r.name === "dependencies");
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
101
|
+
assert.ok(depsCheck !== undefined, "dependencies check runs");
|
|
102
|
+
assert.deepStrictEqual(depsCheck!.status, "ok", "existing node_modules is ok");
|
|
103
|
+
});
|
|
111
104
|
|
|
112
105
|
// ── Env File Check ─────────────────────────────────────────────────
|
|
113
|
-
|
|
114
|
-
{
|
|
106
|
+
test('env: .env.example without .env detected', () => {
|
|
115
107
|
const dir = createProjectDir({
|
|
116
108
|
".env.example": "DB_URL=xxx\nAPI_KEY=xxx\n",
|
|
117
109
|
});
|
|
118
110
|
cleanups.push(dir);
|
|
119
111
|
const results = runEnvironmentChecks(dir);
|
|
120
112
|
const envCheck = results.find(r => r.name === "env_file");
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
113
|
+
assert.ok(envCheck !== undefined, "env file check runs");
|
|
114
|
+
assert.deepStrictEqual(envCheck!.status, "warning", "missing .env is a warning");
|
|
115
|
+
});
|
|
124
116
|
|
|
125
|
-
|
|
126
|
-
{
|
|
117
|
+
test('env: .env.example with .env is ok', () => {
|
|
127
118
|
const dir = createProjectDir({
|
|
128
119
|
".env.example": "DB_URL=xxx\n",
|
|
129
120
|
".env": "DB_URL=postgres://localhost/test\n",
|
|
@@ -131,12 +122,11 @@ async function main(): Promise<void> {
|
|
|
131
122
|
cleanups.push(dir);
|
|
132
123
|
const results = runEnvironmentChecks(dir);
|
|
133
124
|
const envCheck = results.find(r => r.name === "env_file");
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
125
|
+
assert.ok(envCheck !== undefined, "env file check runs");
|
|
126
|
+
assert.deepStrictEqual(envCheck!.status, "ok", "present .env is ok");
|
|
127
|
+
});
|
|
137
128
|
|
|
138
|
-
|
|
139
|
-
{
|
|
129
|
+
test('env: .env.example with .env.local is ok', () => {
|
|
140
130
|
const dir = createProjectDir({
|
|
141
131
|
".env.example": "DB_URL=xxx\n",
|
|
142
132
|
".env.local": "DB_URL=postgres://localhost/test\n",
|
|
@@ -144,25 +134,23 @@ async function main(): Promise<void> {
|
|
|
144
134
|
cleanups.push(dir);
|
|
145
135
|
const results = runEnvironmentChecks(dir);
|
|
146
136
|
const envCheck = results.find(r => r.name === "env_file");
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
137
|
+
assert.ok(envCheck !== undefined, "env file check runs");
|
|
138
|
+
assert.deepStrictEqual(envCheck!.status, "ok", ".env.local counts as present");
|
|
139
|
+
});
|
|
150
140
|
|
|
151
141
|
// ── Disk Space Check ───────────────────────────────────────────────
|
|
152
|
-
console.log("\n=== env: disk space check returns result ===");
|
|
153
142
|
if (process.platform !== "win32") {
|
|
154
143
|
const dir = createProjectDir();
|
|
155
144
|
cleanups.push(dir);
|
|
156
145
|
const results = runEnvironmentChecks(dir);
|
|
157
146
|
const diskCheck = results.find(r => r.name === "disk_space");
|
|
158
|
-
|
|
147
|
+
assert.ok(diskCheck !== undefined, "disk space check runs on unix");
|
|
159
148
|
// Should be ok on dev machines with reasonable disk
|
|
160
|
-
|
|
149
|
+
assert.ok(diskCheck!.status === "ok" || diskCheck!.status === "warning", "disk check returns valid status");
|
|
161
150
|
}
|
|
162
151
|
|
|
163
152
|
// ── Project Tools Check ────────────────────────────────────────────
|
|
164
|
-
|
|
165
|
-
{
|
|
153
|
+
test('env: detects missing python when pyproject.toml exists', () => {
|
|
166
154
|
const dir = createProjectDir({
|
|
167
155
|
"package.json": JSON.stringify({ name: "test" }),
|
|
168
156
|
"pyproject.toml": "[build-system]\nrequires = ['setuptools']\n",
|
|
@@ -173,11 +161,10 @@ async function main(): Promise<void> {
|
|
|
173
161
|
const pythonCheck = results.find(r => r.name === "python");
|
|
174
162
|
// Python is likely installed on CI/dev machines, so just verify the check runs
|
|
175
163
|
// without error — the result depends on the system
|
|
176
|
-
|
|
177
|
-
}
|
|
164
|
+
assert.ok(true, "python check runs without error");
|
|
165
|
+
});
|
|
178
166
|
|
|
179
|
-
|
|
180
|
-
{
|
|
167
|
+
test('env: detects Cargo.toml', () => {
|
|
181
168
|
const dir = createProjectDir({
|
|
182
169
|
"package.json": JSON.stringify({ name: "test" }),
|
|
183
170
|
"Cargo.toml": "[package]\nname = 'test'\n",
|
|
@@ -186,12 +173,11 @@ async function main(): Promise<void> {
|
|
|
186
173
|
cleanups.push(dir);
|
|
187
174
|
const results = runEnvironmentChecks(dir);
|
|
188
175
|
// Just verify it runs without error
|
|
189
|
-
|
|
190
|
-
}
|
|
176
|
+
assert.ok(true, "cargo check runs without error");
|
|
177
|
+
});
|
|
191
178
|
|
|
192
179
|
// ── Docker Check ───────────────────────────────────────────────────
|
|
193
|
-
|
|
194
|
-
{
|
|
180
|
+
test('env: no docker check without Dockerfile', () => {
|
|
195
181
|
const dir = createProjectDir({
|
|
196
182
|
"package.json": JSON.stringify({ name: "test" }),
|
|
197
183
|
});
|
|
@@ -199,11 +185,10 @@ async function main(): Promise<void> {
|
|
|
199
185
|
cleanups.push(dir);
|
|
200
186
|
const results = runEnvironmentChecks(dir);
|
|
201
187
|
const dockerCheck = results.find(r => r.name === "docker");
|
|
202
|
-
|
|
203
|
-
}
|
|
188
|
+
assert.deepStrictEqual(dockerCheck, undefined, "no docker check without Dockerfile");
|
|
189
|
+
});
|
|
204
190
|
|
|
205
|
-
|
|
206
|
-
{
|
|
191
|
+
test('env: docker check with Dockerfile', () => {
|
|
207
192
|
const dir = createProjectDir({
|
|
208
193
|
"package.json": JSON.stringify({ name: "test" }),
|
|
209
194
|
"Dockerfile": "FROM node:22\n",
|
|
@@ -213,12 +198,11 @@ async function main(): Promise<void> {
|
|
|
213
198
|
const results = runEnvironmentChecks(dir);
|
|
214
199
|
const dockerCheck = results.find(r => r.name === "docker");
|
|
215
200
|
// Docker may or may not be installed on the test machine
|
|
216
|
-
|
|
217
|
-
}
|
|
201
|
+
assert.ok(dockerCheck !== undefined, "docker check runs when Dockerfile present");
|
|
202
|
+
});
|
|
218
203
|
|
|
219
204
|
// ── Doctor Issue Conversion ────────────────────────────────────────
|
|
220
|
-
|
|
221
|
-
{
|
|
205
|
+
test('env: converts results to doctor issues', () => {
|
|
222
206
|
const results: EnvironmentCheckResult[] = [
|
|
223
207
|
{ name: "node_version", status: "ok", message: "Node.js v22.0.0" },
|
|
224
208
|
{ name: "dependencies", status: "error", message: "node_modules missing" },
|
|
@@ -226,16 +210,15 @@ async function main(): Promise<void> {
|
|
|
226
210
|
];
|
|
227
211
|
|
|
228
212
|
const issues = environmentResultsToDoctorIssues(results);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
213
|
+
assert.deepStrictEqual(issues.length, 2, "only non-ok results converted");
|
|
214
|
+
assert.deepStrictEqual(issues[0]!.severity, "error", "error severity preserved");
|
|
215
|
+
assert.deepStrictEqual(issues[0]!.code, "env_dependencies", "code prefixed with env_");
|
|
216
|
+
assert.deepStrictEqual(issues[1]!.severity, "warning", "warning severity preserved");
|
|
217
|
+
assert.ok(issues[1]!.message.includes("Copy .env.example"), "detail included in message");
|
|
218
|
+
});
|
|
235
219
|
|
|
236
220
|
// ── checkEnvironmentHealth integration ──────────────────────────────
|
|
237
|
-
|
|
238
|
-
{
|
|
221
|
+
test('env: checkEnvironmentHealth adds issues to array', async () => {
|
|
239
222
|
const dir = createProjectDir({
|
|
240
223
|
"package.json": JSON.stringify({ name: "test" }),
|
|
241
224
|
});
|
|
@@ -244,12 +227,11 @@ async function main(): Promise<void> {
|
|
|
244
227
|
const issues: any[] = [];
|
|
245
228
|
await checkEnvironmentHealth(dir, issues);
|
|
246
229
|
// Should have at least the missing node_modules issue
|
|
247
|
-
|
|
248
|
-
}
|
|
230
|
+
assert.ok(issues.some(i => i.code === "env_dependencies"), "environment issues added to array");
|
|
231
|
+
});
|
|
249
232
|
|
|
250
233
|
// ── Report Formatting ──────────────────────────────────────────────
|
|
251
|
-
|
|
252
|
-
{
|
|
234
|
+
test('env: formatEnvironmentReport', () => {
|
|
253
235
|
const results: EnvironmentCheckResult[] = [
|
|
254
236
|
{ name: "node_version", status: "ok", message: "Node.js v22.0.0" },
|
|
255
237
|
{ name: "dependencies", status: "error", message: "node_modules missing", detail: "Run npm install" },
|
|
@@ -257,32 +239,29 @@ async function main(): Promise<void> {
|
|
|
257
239
|
];
|
|
258
240
|
|
|
259
241
|
const report = formatEnvironmentReport(results);
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
242
|
+
assert.ok(report.includes("Environment Health:"), "has header");
|
|
243
|
+
assert.ok(report.includes("Node.js v22.0.0"), "includes ok result");
|
|
244
|
+
assert.ok(report.includes("node_modules missing"), "includes error result");
|
|
245
|
+
assert.ok(report.includes("Run npm install"), "includes detail for errors");
|
|
246
|
+
});
|
|
265
247
|
|
|
266
|
-
|
|
267
|
-
{
|
|
248
|
+
test('env: formatEnvironmentReport empty', () => {
|
|
268
249
|
const report = formatEnvironmentReport([]);
|
|
269
|
-
|
|
270
|
-
}
|
|
250
|
+
assert.deepStrictEqual(report, "No environment checks applicable.", "empty report message");
|
|
251
|
+
});
|
|
271
252
|
|
|
272
253
|
// ── Full environment checks include git remote ─────────────────────
|
|
273
|
-
|
|
274
|
-
{
|
|
254
|
+
test('env: runFullEnvironmentChecks includes git remote', () => {
|
|
275
255
|
// runFullEnvironmentChecks adds git remote check
|
|
276
256
|
// We can't easily test this without a real git repo, but verify it doesn't throw
|
|
277
257
|
const dir = createProjectDir();
|
|
278
258
|
cleanups.push(dir);
|
|
279
259
|
const results = runFullEnvironmentChecks(dir);
|
|
280
260
|
// No git repo → no remote check, but should not throw
|
|
281
|
-
|
|
282
|
-
}
|
|
261
|
+
assert.ok(true, "runFullEnvironmentChecks does not throw on non-git dir");
|
|
262
|
+
});
|
|
283
263
|
|
|
284
264
|
// ── Port Detection from package.json ───────────────────────────────
|
|
285
|
-
console.log("\n=== env: port detection from scripts ===");
|
|
286
265
|
if (process.platform !== "win32") {
|
|
287
266
|
const dir = createProjectDir({
|
|
288
267
|
"package.json": JSON.stringify({
|
|
@@ -299,7 +278,7 @@ async function main(): Promise<void> {
|
|
|
299
278
|
// Port 3456 is unlikely to be in use, so no conflicts expected
|
|
300
279
|
const portConflicts = results.filter(r => r.name === "port_conflict");
|
|
301
280
|
// Just verify it ran without error
|
|
302
|
-
|
|
281
|
+
assert.ok(true, "port check with script-detected ports runs without error");
|
|
303
282
|
}
|
|
304
283
|
|
|
305
284
|
} finally {
|
|
@@ -307,8 +286,4 @@ async function main(): Promise<void> {
|
|
|
307
286
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
308
287
|
}
|
|
309
288
|
}
|
|
310
|
-
|
|
311
|
-
report();
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
main();
|
|
289
|
+
});
|
|
@@ -76,56 +76,53 @@ const REMOVED_CODES = [
|
|
|
76
76
|
"slice_checked_missing_uat",
|
|
77
77
|
];
|
|
78
78
|
|
|
79
|
-
test("fixLevel:task — no reconciliation issue codes are reported", async () => {
|
|
79
|
+
test("fixLevel:task — no reconciliation issue codes are reported", async (t) => {
|
|
80
80
|
const tmp = makeTmp("task-level");
|
|
81
|
-
|
|
82
|
-
buildScaffold(tmp);
|
|
81
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
buildScaffold(tmp);
|
|
85
84
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
85
|
+
const report = await runGSDDoctor(tmp, { fix: true, fixLevel: "task" });
|
|
86
|
+
|
|
87
|
+
const codes = report.issues.map(i => i.code);
|
|
88
|
+
for (const removed of REMOVED_CODES) {
|
|
89
|
+
assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
|
|
92
90
|
}
|
|
93
91
|
});
|
|
94
92
|
|
|
95
|
-
test("fixLevel:all — no reconciliation issue codes are reported", async () => {
|
|
93
|
+
test("fixLevel:all — no reconciliation issue codes are reported", async (t) => {
|
|
96
94
|
const tmp = makeTmp("all-level");
|
|
97
|
-
|
|
98
|
-
buildScaffold(tmp);
|
|
99
|
-
|
|
100
|
-
const report = await runGSDDoctor(tmp, { fix: true });
|
|
95
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
101
96
|
|
|
102
|
-
|
|
103
|
-
for (const removed of REMOVED_CODES) {
|
|
104
|
-
assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
|
|
105
|
-
}
|
|
97
|
+
buildScaffold(tmp);
|
|
106
98
|
|
|
107
|
-
|
|
108
|
-
const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
|
|
109
|
-
assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub");
|
|
99
|
+
const report = await runGSDDoctor(tmp, { fix: true });
|
|
110
100
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
assert.ok(
|
|
114
|
-
} finally {
|
|
115
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
101
|
+
const codes = report.issues.map(i => i.code);
|
|
102
|
+
for (const removed of REMOVED_CODES) {
|
|
103
|
+
assert.ok(!codes.includes(removed as any), `should NOT report removed code: ${removed}`);
|
|
116
104
|
}
|
|
105
|
+
|
|
106
|
+
// Summary and UAT stubs should NOT be created (no reconciliation)
|
|
107
|
+
const sliceSummaryPath = join(tmp, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md");
|
|
108
|
+
assert.ok(!existsSync(sliceSummaryPath), "should NOT have created summary stub");
|
|
109
|
+
|
|
110
|
+
// Roadmap should remain unchecked (no reconciliation)
|
|
111
|
+
const roadmapContent = readFileSync(join(tmp, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "utf8");
|
|
112
|
+
assert.ok(roadmapContent.includes("- [ ] **S01"), "roadmap should remain unchecked");
|
|
117
113
|
});
|
|
118
114
|
|
|
119
|
-
test("fixLevel:all — delimiter_in_title still fixable", async () => {
|
|
115
|
+
test("fixLevel:all — delimiter_in_title still fixable", async (t) => {
|
|
120
116
|
const tmp = makeTmp("delimiter-fix");
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
117
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
118
|
+
|
|
119
|
+
const gsd = join(tmp, ".gsd");
|
|
120
|
+
const m = join(gsd, "milestones", "M001");
|
|
121
|
+
const s = join(m, "slices", "S01", "tasks");
|
|
122
|
+
mkdirSync(s, { recursive: true });
|
|
126
123
|
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
// Roadmap with em dash in milestone title (should still be fixable)
|
|
125
|
+
writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Foundation \u2014 Build Core
|
|
129
126
|
|
|
130
127
|
## Slices
|
|
131
128
|
|
|
@@ -133,7 +130,7 @@ test("fixLevel:all — delimiter_in_title still fixable", async () => {
|
|
|
133
130
|
> Demo
|
|
134
131
|
`);
|
|
135
132
|
|
|
136
|
-
|
|
133
|
+
writeFileSync(join(m, "slices", "S01", "S01-PLAN.md"), `# S01: Test Slice
|
|
137
134
|
|
|
138
135
|
**Goal:** test
|
|
139
136
|
|
|
@@ -142,13 +139,10 @@ test("fixLevel:all — delimiter_in_title still fixable", async () => {
|
|
|
142
139
|
- [ ] **T01: Do stuff** \`est:5m\`
|
|
143
140
|
`);
|
|
144
141
|
|
|
145
|
-
|
|
142
|
+
const report = await runGSDDoctor(tmp, { fix: true });
|
|
146
143
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
} finally {
|
|
152
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
153
|
-
}
|
|
144
|
+
const delimiterIssues = report.issues.filter(i => i.code === "delimiter_in_title");
|
|
145
|
+
// The milestone-level delimiter is auto-fixed, but the report may or may not include it
|
|
146
|
+
// depending on whether it was fixed successfully. Just verify it ran without crashing.
|
|
147
|
+
assert.ok(report.issues !== undefined, "doctor produces a report");
|
|
154
148
|
});
|