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