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
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
|
|
4
2
|
import { join } from 'node:path';
|
|
5
3
|
import { tmpdir } from 'node:os';
|
|
@@ -8,7 +6,26 @@ import { deriveState, invalidateStateCache, getActiveMilestoneId } from '../stat
|
|
|
8
6
|
import { clearPathCache } from '../paths.ts';
|
|
9
7
|
import { parkMilestone, unparkMilestone, discardMilestone, isParked, getParkedReason } from '../milestone-actions.ts';
|
|
10
8
|
|
|
9
|
+
let passed = 0;
|
|
10
|
+
let failed = 0;
|
|
11
11
|
|
|
12
|
+
function assert(condition: boolean, message: string): void {
|
|
13
|
+
if (condition) {
|
|
14
|
+
passed++;
|
|
15
|
+
} else {
|
|
16
|
+
failed++;
|
|
17
|
+
console.error(` FAIL: ${message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function assertEq<T>(actual: T, expected: T, message: string): void {
|
|
22
|
+
if (JSON.stringify(actual) === JSON.stringify(expected)) {
|
|
23
|
+
passed++;
|
|
24
|
+
} else {
|
|
25
|
+
failed++;
|
|
26
|
+
console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
12
29
|
|
|
13
30
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
14
31
|
|
|
@@ -72,28 +89,30 @@ function clearCaches(): void {
|
|
|
72
89
|
// Tests
|
|
73
90
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
74
91
|
|
|
75
|
-
|
|
92
|
+
async function main(): Promise<void> {
|
|
76
93
|
|
|
77
|
-
|
|
78
|
-
|
|
94
|
+
// ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
|
|
95
|
+
console.log('\n=== parkMilestone creates PARKED.md ===');
|
|
96
|
+
{
|
|
79
97
|
const base = createFixtureBase();
|
|
80
98
|
try {
|
|
81
99
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
82
100
|
clearCaches();
|
|
83
101
|
|
|
84
102
|
const success = parkMilestone(base, 'M001', 'Priority shift');
|
|
85
|
-
assert
|
|
86
|
-
assert
|
|
103
|
+
assert(success, 'parkMilestone returns true');
|
|
104
|
+
assert(isParked(base, 'M001'), 'isParked returns true after parking');
|
|
87
105
|
|
|
88
106
|
const reason = getParkedReason(base, 'M001');
|
|
89
|
-
|
|
107
|
+
assertEq(reason, 'Priority shift', 'reason matches');
|
|
90
108
|
} finally {
|
|
91
109
|
cleanup(base);
|
|
92
110
|
}
|
|
93
|
-
}
|
|
111
|
+
}
|
|
94
112
|
|
|
95
113
|
// ─── Test 2: parkMilestone is idempotent — fails if already parked ────
|
|
96
|
-
|
|
114
|
+
console.log('\n=== parkMilestone fails if already parked ===');
|
|
115
|
+
{
|
|
97
116
|
const base = createFixtureBase();
|
|
98
117
|
try {
|
|
99
118
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -101,47 +120,50 @@ test('parkMilestone fails if already parked', () => {
|
|
|
101
120
|
|
|
102
121
|
parkMilestone(base, 'M001', 'First park');
|
|
103
122
|
const secondPark = parkMilestone(base, 'M001', 'Second park');
|
|
104
|
-
assert
|
|
105
|
-
|
|
123
|
+
assert(!secondPark, 'second parkMilestone returns false');
|
|
124
|
+
assertEq(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
|
|
106
125
|
} finally {
|
|
107
126
|
cleanup(base);
|
|
108
127
|
}
|
|
109
|
-
}
|
|
128
|
+
}
|
|
110
129
|
|
|
111
130
|
// ─── Test 3: unparkMilestone removes PARKED.md ────────────────────────
|
|
112
|
-
|
|
131
|
+
console.log('\n=== unparkMilestone removes PARKED.md ===');
|
|
132
|
+
{
|
|
113
133
|
const base = createFixtureBase();
|
|
114
134
|
try {
|
|
115
135
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
116
136
|
clearCaches();
|
|
117
137
|
|
|
118
138
|
parkMilestone(base, 'M001', 'Test reason');
|
|
119
|
-
assert
|
|
139
|
+
assert(isParked(base, 'M001'), 'milestone is parked');
|
|
120
140
|
|
|
121
141
|
const success = unparkMilestone(base, 'M001');
|
|
122
|
-
assert
|
|
123
|
-
assert
|
|
142
|
+
assert(success, 'unparkMilestone returns true');
|
|
143
|
+
assert(!isParked(base, 'M001'), 'isParked returns false after unpark');
|
|
124
144
|
} finally {
|
|
125
145
|
cleanup(base);
|
|
126
146
|
}
|
|
127
|
-
}
|
|
147
|
+
}
|
|
128
148
|
|
|
129
149
|
// ─── Test 4: unparkMilestone fails if not parked ──────────────────────
|
|
130
|
-
|
|
150
|
+
console.log('\n=== unparkMilestone fails if not parked ===');
|
|
151
|
+
{
|
|
131
152
|
const base = createFixtureBase();
|
|
132
153
|
try {
|
|
133
154
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
134
155
|
clearCaches();
|
|
135
156
|
|
|
136
157
|
const result = unparkMilestone(base, 'M001');
|
|
137
|
-
assert
|
|
158
|
+
assert(!result, 'unparkMilestone returns false when not parked');
|
|
138
159
|
} finally {
|
|
139
160
|
cleanup(base);
|
|
140
161
|
}
|
|
141
|
-
}
|
|
162
|
+
}
|
|
142
163
|
|
|
143
164
|
// ─── Test 5: deriveState returns 'parked' status ──────────────────────
|
|
144
|
-
|
|
165
|
+
console.log('\n=== deriveState returns parked status ===');
|
|
166
|
+
{
|
|
145
167
|
const base = createFixtureBase();
|
|
146
168
|
try {
|
|
147
169
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -151,15 +173,16 @@ test('deriveState returns parked status', async () => {
|
|
|
151
173
|
|
|
152
174
|
const state = await deriveState(base);
|
|
153
175
|
const entry = state.registry.find(e => e.id === 'M001');
|
|
154
|
-
assert
|
|
155
|
-
|
|
176
|
+
assert(!!entry, 'M001 in registry');
|
|
177
|
+
assertEq(entry?.status, 'parked', 'status is parked');
|
|
156
178
|
} finally {
|
|
157
179
|
cleanup(base);
|
|
158
180
|
}
|
|
159
|
-
}
|
|
181
|
+
}
|
|
160
182
|
|
|
161
183
|
// ─── Test 6: deriveState skips parked milestone for active ─────────────
|
|
162
|
-
|
|
184
|
+
console.log('\n=== deriveState skips parked milestone ===');
|
|
185
|
+
{
|
|
163
186
|
const base = createFixtureBase();
|
|
164
187
|
try {
|
|
165
188
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -168,28 +191,29 @@ test('deriveState skips parked milestone', async () => {
|
|
|
168
191
|
|
|
169
192
|
// Before park: M001 is active
|
|
170
193
|
const stateBefore = await deriveState(base);
|
|
171
|
-
|
|
194
|
+
assertEq(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
|
|
172
195
|
|
|
173
196
|
parkMilestone(base, 'M001', 'Testing');
|
|
174
197
|
|
|
175
198
|
// After park: M002 becomes active
|
|
176
199
|
const stateAfter = await deriveState(base);
|
|
177
|
-
|
|
200
|
+
assertEq(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
|
|
178
201
|
|
|
179
202
|
// M001 still in registry as parked
|
|
180
203
|
const m001 = stateAfter.registry.find(e => e.id === 'M001');
|
|
181
|
-
|
|
204
|
+
assertEq(m001?.status, 'parked', 'M001 has parked status');
|
|
182
205
|
|
|
183
206
|
// M002 is active
|
|
184
207
|
const m002 = stateAfter.registry.find(e => e.id === 'M002');
|
|
185
|
-
|
|
208
|
+
assertEq(m002?.status, 'active', 'M002 has active status');
|
|
186
209
|
} finally {
|
|
187
210
|
cleanup(base);
|
|
188
211
|
}
|
|
189
|
-
}
|
|
212
|
+
}
|
|
190
213
|
|
|
191
214
|
// ─── Test 7: getActiveMilestoneId skips parked ────────────────────────
|
|
192
|
-
|
|
215
|
+
console.log('\n=== getActiveMilestoneId skips parked ===');
|
|
216
|
+
{
|
|
193
217
|
const base = createFixtureBase();
|
|
194
218
|
try {
|
|
195
219
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -199,14 +223,15 @@ test('getActiveMilestoneId skips parked', async () => {
|
|
|
199
223
|
parkMilestone(base, 'M001', 'Testing');
|
|
200
224
|
|
|
201
225
|
const activeId = await getActiveMilestoneId(base);
|
|
202
|
-
|
|
226
|
+
assertEq(activeId, 'M002', 'getActiveMilestoneId returns M002');
|
|
203
227
|
} finally {
|
|
204
228
|
cleanup(base);
|
|
205
229
|
}
|
|
206
|
-
}
|
|
230
|
+
}
|
|
207
231
|
|
|
208
232
|
// ─── Test 8: Parked milestone does NOT satisfy depends_on ─────────────
|
|
209
|
-
|
|
233
|
+
console.log('\n=== Parked milestone does not satisfy depends_on ===');
|
|
234
|
+
{
|
|
210
235
|
const base = createFixtureBase();
|
|
211
236
|
try {
|
|
212
237
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -218,17 +243,18 @@ test('Parked milestone does not satisfy depends_on', async () => {
|
|
|
218
243
|
const state = await deriveState(base);
|
|
219
244
|
// M001 is parked, M002 depends on M001 → M002 should be pending, not active
|
|
220
245
|
const m002 = state.registry.find(e => e.id === 'M002');
|
|
221
|
-
|
|
246
|
+
assertEq(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
|
|
222
247
|
|
|
223
248
|
// No active milestone (both are blocked/parked)
|
|
224
|
-
|
|
249
|
+
assertEq(state.activeMilestone, null, 'no active milestone');
|
|
225
250
|
} finally {
|
|
226
251
|
cleanup(base);
|
|
227
252
|
}
|
|
228
|
-
}
|
|
253
|
+
}
|
|
229
254
|
|
|
230
255
|
// ─── Test 9: Park then unpark restores correct status ─────────────────
|
|
231
|
-
|
|
256
|
+
console.log('\n=== Park then unpark restores status ===');
|
|
257
|
+
{
|
|
232
258
|
const base = createFixtureBase();
|
|
233
259
|
try {
|
|
234
260
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -238,41 +264,43 @@ test('Park then unpark restores status', async () => {
|
|
|
238
264
|
// Park M001
|
|
239
265
|
parkMilestone(base, 'M001', 'Testing');
|
|
240
266
|
const stateParked = await deriveState(base);
|
|
241
|
-
|
|
267
|
+
assertEq(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
|
|
242
268
|
|
|
243
269
|
// Unpark M001 — M001 should become active again (it's first in queue)
|
|
244
270
|
unparkMilestone(base, 'M001');
|
|
245
271
|
const stateUnparked = await deriveState(base);
|
|
246
|
-
|
|
247
|
-
|
|
272
|
+
assertEq(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
|
|
273
|
+
assertEq(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
|
|
248
274
|
} finally {
|
|
249
275
|
cleanup(base);
|
|
250
276
|
}
|
|
251
|
-
}
|
|
277
|
+
}
|
|
252
278
|
|
|
253
279
|
// ─── Test 10: discardMilestone removes directory ──────────────────────
|
|
254
|
-
|
|
280
|
+
console.log('\n=== discardMilestone removes directory ===');
|
|
281
|
+
{
|
|
255
282
|
const base = createFixtureBase();
|
|
256
283
|
try {
|
|
257
284
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
258
285
|
clearCaches();
|
|
259
286
|
|
|
260
287
|
const mDir = join(base, '.gsd', 'milestones', 'M001');
|
|
261
|
-
assert
|
|
288
|
+
assert(existsSync(mDir), 'milestone dir exists before discard');
|
|
262
289
|
|
|
263
290
|
const success = discardMilestone(base, 'M001');
|
|
264
|
-
assert
|
|
265
|
-
assert
|
|
291
|
+
assert(success, 'discardMilestone returns true');
|
|
292
|
+
assert(!existsSync(mDir), 'milestone dir removed after discard');
|
|
266
293
|
|
|
267
294
|
const state = await deriveState(base);
|
|
268
|
-
assert
|
|
295
|
+
assert(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
|
|
269
296
|
} finally {
|
|
270
297
|
cleanup(base);
|
|
271
298
|
}
|
|
272
|
-
}
|
|
299
|
+
}
|
|
273
300
|
|
|
274
301
|
// ─── Test 11: discardMilestone updates queue order ────────────────────
|
|
275
|
-
|
|
302
|
+
console.log('\n=== discardMilestone updates queue order ===');
|
|
303
|
+
{
|
|
276
304
|
const base = createFixtureBase();
|
|
277
305
|
try {
|
|
278
306
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -287,15 +315,16 @@ test('discardMilestone updates queue order', () => {
|
|
|
287
315
|
|
|
288
316
|
// Queue order should no longer include M001
|
|
289
317
|
const queueContent = JSON.parse(readFileSync(queuePath, 'utf-8'));
|
|
290
|
-
assert
|
|
291
|
-
assert
|
|
318
|
+
assert(!queueContent.order.includes('M001'), 'M001 removed from queue order');
|
|
319
|
+
assert(queueContent.order.includes('M002'), 'M002 still in queue order');
|
|
292
320
|
} finally {
|
|
293
321
|
cleanup(base);
|
|
294
322
|
}
|
|
295
|
-
}
|
|
323
|
+
}
|
|
296
324
|
|
|
297
325
|
// ─── Test 12: All milestones parked → no active milestone ─────────────
|
|
298
|
-
|
|
326
|
+
console.log('\n=== All milestones parked → no active ===');
|
|
327
|
+
{
|
|
299
328
|
const base = createFixtureBase();
|
|
300
329
|
try {
|
|
301
330
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -304,17 +333,18 @@ test('All milestones parked → no active', async () => {
|
|
|
304
333
|
parkMilestone(base, 'M001', 'Testing');
|
|
305
334
|
|
|
306
335
|
const state = await deriveState(base);
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
assert
|
|
310
|
-
|
|
336
|
+
assertEq(state.activeMilestone, null, 'no active milestone when all parked');
|
|
337
|
+
assertEq(state.phase, 'pre-planning', 'phase is pre-planning');
|
|
338
|
+
assert(state.registry.length === 1, 'registry still has 1 entry');
|
|
339
|
+
assertEq(state.registry[0]?.status, 'parked', 'entry is parked');
|
|
311
340
|
} finally {
|
|
312
341
|
cleanup(base);
|
|
313
342
|
}
|
|
314
|
-
}
|
|
343
|
+
}
|
|
315
344
|
|
|
316
345
|
// ─── Test 13: Parked milestone without roadmap ────────────────────────
|
|
317
|
-
|
|
346
|
+
console.log('\n=== Park milestone without roadmap ===');
|
|
347
|
+
{
|
|
318
348
|
const base = createFixtureBase();
|
|
319
349
|
try {
|
|
320
350
|
createMilestone(base, 'M001'); // No roadmap
|
|
@@ -324,15 +354,16 @@ test('Park milestone without roadmap', async () => {
|
|
|
324
354
|
parkMilestone(base, 'M001', 'Not ready yet');
|
|
325
355
|
|
|
326
356
|
const state = await deriveState(base);
|
|
327
|
-
|
|
328
|
-
|
|
357
|
+
assertEq(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
|
|
358
|
+
assertEq(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
|
|
329
359
|
} finally {
|
|
330
360
|
cleanup(base);
|
|
331
361
|
}
|
|
332
|
-
}
|
|
362
|
+
}
|
|
333
363
|
|
|
334
364
|
// ─── Test 14: Progress counts with parked milestone ───────────────────
|
|
335
|
-
|
|
365
|
+
console.log('\n=== Progress counts with parked ===');
|
|
366
|
+
{
|
|
336
367
|
const base = createFixtureBase();
|
|
337
368
|
try {
|
|
338
369
|
createMilestone(base, 'M001', { withRoadmap: true, withSummary: true }); // complete
|
|
@@ -343,12 +374,28 @@ test('Progress counts with parked', async () => {
|
|
|
343
374
|
parkMilestone(base, 'M002', 'Parked');
|
|
344
375
|
|
|
345
376
|
const state = await deriveState(base);
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
377
|
+
assertEq(state.progress?.milestones.done, 1, '1 complete milestone');
|
|
378
|
+
assertEq(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
|
|
379
|
+
assertEq(state.activeMilestone?.id, 'M003', 'M003 is active');
|
|
349
380
|
} finally {
|
|
350
381
|
cleanup(base);
|
|
351
382
|
}
|
|
352
|
-
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
386
|
+
// Results
|
|
387
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
388
|
+
|
|
389
|
+
console.log(`\n${'='.repeat(40)}`);
|
|
390
|
+
console.log(`Results: ${passed} passed, ${failed} failed`);
|
|
391
|
+
if (failed > 0) {
|
|
392
|
+
process.exit(1);
|
|
393
|
+
} else {
|
|
394
|
+
console.log('All tests passed ✓');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
353
397
|
|
|
398
|
+
main().catch((error) => {
|
|
399
|
+
console.error(error);
|
|
400
|
+
process.exit(1);
|
|
354
401
|
});
|