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
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// Tests the RuleRegistry class, UnifiedRule types, singleton accessors,
|
|
4
4
|
// and evaluation methods using mock rules.
|
|
5
5
|
|
|
6
|
-
import assert from 'node:assert/strict';
|
|
7
6
|
import { test, describe, beforeEach } from "node:test";
|
|
7
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
8
8
|
import {
|
|
9
9
|
RuleRegistry,
|
|
10
10
|
getRegistry,
|
|
@@ -64,7 +64,9 @@ function makeContext(phase: string): DispatchContext {
|
|
|
64
64
|
// ─── Tests ────────────────────────────────────────────────────────────────
|
|
65
65
|
|
|
66
66
|
describe("RuleRegistry", () => {
|
|
67
|
-
|
|
67
|
+
const { assertEq, assertTrue } = createTestContext();
|
|
68
|
+
|
|
69
|
+
beforeEach(() => {
|
|
68
70
|
resetRegistry();
|
|
69
71
|
});
|
|
70
72
|
|
|
@@ -79,10 +81,10 @@ describe("RuleRegistry", () => {
|
|
|
79
81
|
|
|
80
82
|
// At minimum, dispatch rules are returned (hook rules depend on prefs)
|
|
81
83
|
const dispatchRules = listed.filter(r => r.when === "dispatch");
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
assertEq(dispatchRules.length, 3, "listRules returns 3 dispatch rules");
|
|
85
|
+
assertEq(dispatchRules[0].name, "rule-a", "first rule name is rule-a");
|
|
86
|
+
assertEq(dispatchRules[1].name, "rule-b", "second rule name is rule-b");
|
|
87
|
+
assertEq(dispatchRules[2].name, "rule-c", "third rule name is rule-c");
|
|
86
88
|
});
|
|
87
89
|
|
|
88
90
|
test("listRules returns correct fields on each rule", () => {
|
|
@@ -93,12 +95,12 @@ describe("RuleRegistry", () => {
|
|
|
93
95
|
const listed = registry.listRules();
|
|
94
96
|
const rule = listed.find(r => r.name === "check-fields")!;
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
assertTrue(rule !== undefined, "rule found by name");
|
|
99
|
+
assertEq(rule.when, "dispatch", "when field is dispatch");
|
|
100
|
+
assertEq(rule.evaluation, "first-match", "evaluation is first-match");
|
|
101
|
+
assertTrue(typeof rule.where === "function", "where is a function");
|
|
102
|
+
assertTrue(typeof rule.then === "function", "then is a function");
|
|
103
|
+
assertEq(rule.description, "Mock rule for planning", "description is set");
|
|
102
104
|
});
|
|
103
105
|
|
|
104
106
|
test("evaluateDispatch returns first matching rule", async () => {
|
|
@@ -111,10 +113,10 @@ describe("RuleRegistry", () => {
|
|
|
111
113
|
const ctx = makeContext("executing");
|
|
112
114
|
const result = await registry.evaluateDispatch(ctx);
|
|
113
115
|
|
|
114
|
-
|
|
116
|
+
assertEq(result.action, "dispatch", "result is a dispatch action");
|
|
115
117
|
if (result.action === "dispatch") {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
+
assertEq(result.unitType, "test-executing", "matched the executing rule");
|
|
119
|
+
assertEq(result.prompt, "Prompt for executing", "prompt from matched rule");
|
|
118
120
|
}
|
|
119
121
|
});
|
|
120
122
|
|
|
@@ -126,9 +128,9 @@ describe("RuleRegistry", () => {
|
|
|
126
128
|
const ctx = makeContext("blocked");
|
|
127
129
|
const result = await registry.evaluateDispatch(ctx);
|
|
128
130
|
|
|
129
|
-
|
|
131
|
+
assertEq(result.action, "stop", "result is a stop action");
|
|
130
132
|
if (result.action === "stop") {
|
|
131
|
-
|
|
133
|
+
assertTrue(result.reason.includes("blocked"), "stop reason mentions phase");
|
|
132
134
|
}
|
|
133
135
|
});
|
|
134
136
|
|
|
@@ -157,9 +159,9 @@ describe("RuleRegistry", () => {
|
|
|
157
159
|
const ctx = makeContext("planning");
|
|
158
160
|
const result = await registry.evaluateDispatch(ctx);
|
|
159
161
|
|
|
160
|
-
|
|
162
|
+
assertEq(result.action, "dispatch", "async dispatch resolved");
|
|
161
163
|
if (result.action === "dispatch") {
|
|
162
|
-
|
|
164
|
+
assertEq(result.unitType, "async-test", "async rule matched");
|
|
163
165
|
}
|
|
164
166
|
});
|
|
165
167
|
|
|
@@ -186,11 +188,11 @@ describe("RuleRegistry", () => {
|
|
|
186
188
|
// Reset
|
|
187
189
|
registry.resetState();
|
|
188
190
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
assertEq(registry.getActiveHook(), null, "activeHook cleared");
|
|
192
|
+
assertEq(registry.hookQueue.length, 0, "hookQueue cleared");
|
|
193
|
+
assertEq(registry.cycleCounts.size, 0, "cycleCounts cleared");
|
|
194
|
+
assertEq(registry.isRetryPending(), false, "retryPending cleared");
|
|
195
|
+
assertEq(registry.consumeRetryTrigger(), null, "retryTrigger cleared");
|
|
194
196
|
});
|
|
195
197
|
|
|
196
198
|
test("singleton getRegistry throws when not initialized", () => {
|
|
@@ -199,9 +201,9 @@ describe("RuleRegistry", () => {
|
|
|
199
201
|
getRegistry();
|
|
200
202
|
} catch (e: any) {
|
|
201
203
|
threw = true;
|
|
202
|
-
|
|
204
|
+
assertTrue(e.message.includes("not initialized"), "error mentions not initialized");
|
|
203
205
|
}
|
|
204
|
-
|
|
206
|
+
assertTrue(threw, "getRegistry threw");
|
|
205
207
|
});
|
|
206
208
|
|
|
207
209
|
test("setRegistry / getRegistry round-trips", () => {
|
|
@@ -209,20 +211,20 @@ describe("RuleRegistry", () => {
|
|
|
209
211
|
setRegistry(registry);
|
|
210
212
|
|
|
211
213
|
const retrieved = getRegistry();
|
|
212
|
-
|
|
214
|
+
assertEq(retrieved, registry, "getRegistry returns the same instance");
|
|
213
215
|
|
|
214
216
|
const listed = retrieved.listRules().filter(r => r.when === "dispatch");
|
|
215
|
-
|
|
216
|
-
|
|
217
|
+
assertEq(listed.length, 1, "singleton has 1 dispatch rule");
|
|
218
|
+
assertEq(listed[0].name, "singleton-test", "rule name matches");
|
|
217
219
|
});
|
|
218
220
|
|
|
219
221
|
test("initRegistry creates and sets singleton", () => {
|
|
220
222
|
const rules = [mockDispatchRule("init-test", "executing")];
|
|
221
223
|
const registry = initRegistry(rules);
|
|
222
224
|
|
|
223
|
-
|
|
225
|
+
assertEq(getRegistry(), registry, "initRegistry sets the singleton");
|
|
224
226
|
const listed = getRegistry().listRules().filter(r => r.when === "dispatch");
|
|
225
|
-
|
|
227
|
+
assertEq(listed.length, 1, "singleton has the rule");
|
|
226
228
|
});
|
|
227
229
|
|
|
228
230
|
test("evaluateDispatch respects rule order (first match wins)", async () => {
|
|
@@ -256,9 +258,9 @@ describe("RuleRegistry", () => {
|
|
|
256
258
|
const ctx = makeContext("planning");
|
|
257
259
|
const result = await registry.evaluateDispatch(ctx);
|
|
258
260
|
|
|
259
|
-
|
|
261
|
+
assertEq(result.action, "dispatch", "dispatch action returned");
|
|
260
262
|
if (result.action === "dispatch") {
|
|
261
|
-
|
|
263
|
+
assertEq(result.unitType, "first-wins", "first rule won over second");
|
|
262
264
|
}
|
|
263
265
|
});
|
|
264
266
|
|
|
@@ -266,18 +268,18 @@ describe("RuleRegistry", () => {
|
|
|
266
268
|
|
|
267
269
|
test("convertDispatchRules produces correct count of UnifiedRule objects", () => {
|
|
268
270
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
269
|
-
|
|
271
|
+
assertEq(converted.length, DISPATCH_RULES.length, `convertDispatchRules produces ${DISPATCH_RULES.length} rules`);
|
|
270
272
|
});
|
|
271
273
|
|
|
272
274
|
test("each converted rule has correct when, evaluation, and original name", () => {
|
|
273
275
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
274
276
|
for (let i = 0; i < converted.length; i++) {
|
|
275
277
|
const rule = converted[i];
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
278
|
+
assertEq(rule.when, "dispatch", `rule ${i} has when:"dispatch"`);
|
|
279
|
+
assertEq(rule.evaluation, "first-match", `rule ${i} has evaluation:"first-match"`);
|
|
280
|
+
assertEq(rule.name, DISPATCH_RULES[i].name, `rule ${i} preserves name "${DISPATCH_RULES[i].name}"`);
|
|
281
|
+
assertTrue(typeof rule.where === "function", `rule ${i} has a where function`);
|
|
282
|
+
assertTrue(typeof rule.then === "function", `rule ${i} has a then function`);
|
|
281
283
|
}
|
|
282
284
|
});
|
|
283
285
|
|
|
@@ -285,7 +287,7 @@ describe("RuleRegistry", () => {
|
|
|
285
287
|
const converted = convertDispatchRules(DISPATCH_RULES);
|
|
286
288
|
const registry = new RuleRegistry(converted);
|
|
287
289
|
const listed = registry.listRules().filter(r => r.when === "dispatch");
|
|
288
|
-
|
|
290
|
+
assertEq(listed.length, DISPATCH_RULES.length, `listRules returns ${DISPATCH_RULES.length} dispatch rules`);
|
|
289
291
|
});
|
|
290
292
|
|
|
291
293
|
test("rule names from listRules match getDispatchRuleNames in exact order", () => {
|
|
@@ -296,9 +298,9 @@ describe("RuleRegistry", () => {
|
|
|
296
298
|
.map(r => r.name);
|
|
297
299
|
const originalNames = getDispatchRuleNames();
|
|
298
300
|
|
|
299
|
-
|
|
301
|
+
assertEq(listedNames.length, originalNames.length, "same number of names");
|
|
300
302
|
for (let i = 0; i < originalNames.length; i++) {
|
|
301
|
-
|
|
303
|
+
assertEq(listedNames[i], originalNames[i], `name at index ${i} matches: "${originalNames[i]}"`);
|
|
302
304
|
}
|
|
303
305
|
});
|
|
304
306
|
|
|
@@ -307,18 +309,18 @@ describe("RuleRegistry", () => {
|
|
|
307
309
|
test("getOrCreateRegistry lazily creates a registry with empty dispatch rules", () => {
|
|
308
310
|
// After resetRegistry(), getRegistry() would throw. getOrCreateRegistry() should not.
|
|
309
311
|
const registry = getOrCreateRegistry();
|
|
310
|
-
|
|
312
|
+
assertTrue(registry instanceof RuleRegistry, "returns a RuleRegistry instance");
|
|
311
313
|
const dispatchRules = registry.listRules().filter(r => r.when === "dispatch");
|
|
312
|
-
|
|
314
|
+
assertEq(dispatchRules.length, 0, "lazily-created registry has 0 dispatch rules");
|
|
313
315
|
});
|
|
314
316
|
|
|
315
317
|
test("getOrCreateRegistry returns existing registry when initialized", () => {
|
|
316
318
|
const rules = [mockDispatchRule("explicit-init", "planning")];
|
|
317
319
|
const explicit = initRegistry(rules);
|
|
318
320
|
const lazy = getOrCreateRegistry();
|
|
319
|
-
|
|
321
|
+
assertEq(lazy, explicit, "getOrCreateRegistry returns the same singleton as initRegistry");
|
|
320
322
|
const dispatchRules = lazy.listRules().filter(r => r.when === "dispatch");
|
|
321
|
-
|
|
323
|
+
assertEq(dispatchRules.length, 1, "singleton has the explicitly initialized dispatch rule");
|
|
322
324
|
});
|
|
323
325
|
|
|
324
326
|
// ── Hook-derived rules in listRules ────────────────────────────────
|
|
@@ -331,9 +333,9 @@ describe("RuleRegistry", () => {
|
|
|
331
333
|
const preDispatchRules = allRules.filter(r => r.when === "pre-dispatch");
|
|
332
334
|
|
|
333
335
|
// No preferences file = no hooks
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
336
|
+
assertEq(postUnitRules.length, 0, "no post-unit rules when no hooks configured");
|
|
337
|
+
assertEq(preDispatchRules.length, 0, "no pre-dispatch rules when no hooks configured");
|
|
338
|
+
assertEq(allRules.length, DISPATCH_RULES.length, "total rules equals dispatch rules only");
|
|
337
339
|
});
|
|
338
340
|
|
|
339
341
|
test("listRules dispatch rules appear first, hooks after", () => {
|
|
@@ -343,8 +345,8 @@ describe("RuleRegistry", () => {
|
|
|
343
345
|
|
|
344
346
|
// Verify dispatch rules come first (indices 0..N-1)
|
|
345
347
|
for (let i = 0; i < converted.length; i++) {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
+
assertEq(allRules[i].when, "dispatch", `rule at index ${i} is a dispatch rule`);
|
|
349
|
+
assertEq(allRules[i].name, converted[i].name, `dispatch rule at index ${i} has correct name`);
|
|
348
350
|
}
|
|
349
351
|
});
|
|
350
352
|
|
|
@@ -353,34 +355,34 @@ describe("RuleRegistry", () => {
|
|
|
353
355
|
test("evaluatePostUnit returns null for hook-on-hook prevention", () => {
|
|
354
356
|
const registry = new RuleRegistry([]);
|
|
355
357
|
const result = registry.evaluatePostUnit("hook/code-review", "M001/S01/T01", "/tmp/test");
|
|
356
|
-
|
|
358
|
+
assertEq(result, null, "hook units don't trigger other hooks");
|
|
357
359
|
});
|
|
358
360
|
|
|
359
361
|
test("evaluatePostUnit returns null for triage-captures", () => {
|
|
360
362
|
const registry = new RuleRegistry([]);
|
|
361
363
|
const result = registry.evaluatePostUnit("triage-captures", "M001/S01/T01", "/tmp/test");
|
|
362
|
-
|
|
364
|
+
assertEq(result, null, "triage-captures skipped");
|
|
363
365
|
});
|
|
364
366
|
|
|
365
367
|
test("evaluatePostUnit returns null for quick-task", () => {
|
|
366
368
|
const registry = new RuleRegistry([]);
|
|
367
369
|
const result = registry.evaluatePostUnit("quick-task", "M001/S01/T01", "/tmp/test");
|
|
368
|
-
|
|
370
|
+
assertEq(result, null, "quick-task skipped");
|
|
369
371
|
});
|
|
370
372
|
|
|
371
373
|
test("evaluatePreDispatch bypasses hook units", () => {
|
|
372
374
|
const registry = new RuleRegistry([]);
|
|
373
375
|
const result = registry.evaluatePreDispatch("hook/review", "M001/S01/T01", "prompt", "/tmp/test");
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
376
|
+
assertEq(result.action, "proceed", "hook units always proceed");
|
|
377
|
+
assertEq(result.prompt, "prompt", "prompt unchanged");
|
|
378
|
+
assertEq(result.firedHooks.length, 0, "no hooks fired");
|
|
377
379
|
});
|
|
378
380
|
|
|
379
381
|
test("evaluatePreDispatch proceeds with empty hooks", () => {
|
|
380
382
|
const registry = new RuleRegistry([]);
|
|
381
383
|
const result = registry.evaluatePreDispatch("execute-task", "M001/S01/T01", "original prompt", "/tmp/test");
|
|
382
|
-
|
|
383
|
-
|
|
384
|
+
assertEq(result.action, "proceed", "proceeds when no hooks");
|
|
385
|
+
assertEq(result.prompt, "original prompt", "prompt unchanged");
|
|
384
386
|
});
|
|
385
387
|
|
|
386
388
|
// ── matchedRule provenance (S02 journal support) ───────────────────
|
|
@@ -393,8 +395,8 @@ describe("RuleRegistry", () => {
|
|
|
393
395
|
const ctx = makeContext("planning");
|
|
394
396
|
const result = await registry.evaluateDispatch(ctx);
|
|
395
397
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
+
assertEq(result.action, "dispatch", "result is a dispatch action");
|
|
399
|
+
assertEq(result.matchedRule, "my-planning-rule", "matchedRule is the rule name");
|
|
398
400
|
});
|
|
399
401
|
|
|
400
402
|
test("evaluateDispatch result includes matchedRule '<no-match>' on fallback stop", async () => {
|
|
@@ -405,7 +407,7 @@ describe("RuleRegistry", () => {
|
|
|
405
407
|
const ctx = makeContext("some-unknown-phase");
|
|
406
408
|
const result = await registry.evaluateDispatch(ctx);
|
|
407
409
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
+
assertEq(result.action, "stop", "result is a stop action");
|
|
411
|
+
assertEq(result.matchedRule, "<no-match>", "matchedRule is '<no-match>' on fallback");
|
|
410
412
|
});
|
|
411
413
|
});
|