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
|
@@ -53,37 +53,43 @@ function cleanup(dir: string): void {
|
|
|
53
53
|
|
|
54
54
|
// ─── hasGitTrackedGsdFiles ───────────────────────────────────────────
|
|
55
55
|
|
|
56
|
-
test("hasGitTrackedGsdFiles returns false when .gsd/ does not exist", (
|
|
56
|
+
test("hasGitTrackedGsdFiles returns false when .gsd/ does not exist", () => {
|
|
57
57
|
const dir = makeTempRepo();
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
try {
|
|
59
|
+
assert.equal(hasGitTrackedGsdFiles(dir), false);
|
|
60
|
+
} finally {
|
|
61
|
+
cleanup(dir);
|
|
62
|
+
}
|
|
61
63
|
});
|
|
62
64
|
|
|
63
|
-
test("hasGitTrackedGsdFiles returns true when .gsd/ has tracked files", (
|
|
65
|
+
test("hasGitTrackedGsdFiles returns true when .gsd/ has tracked files", () => {
|
|
64
66
|
const dir = makeTempRepo();
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
try {
|
|
68
|
+
mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
|
|
69
|
+
writeFileSync(join(dir, ".gsd", "PROJECT.md"), "# Test Project\n");
|
|
70
|
+
git(dir, "add", ".gsd/PROJECT.md");
|
|
71
|
+
git(dir, "commit", "-m", "add gsd");
|
|
72
|
+
assert.equal(hasGitTrackedGsdFiles(dir), true);
|
|
73
|
+
} finally {
|
|
74
|
+
cleanup(dir);
|
|
75
|
+
}
|
|
72
76
|
});
|
|
73
77
|
|
|
74
|
-
test("hasGitTrackedGsdFiles returns false when .gsd/ exists but is untracked", (
|
|
78
|
+
test("hasGitTrackedGsdFiles returns false when .gsd/ exists but is untracked", () => {
|
|
75
79
|
const dir = makeTempRepo();
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
try {
|
|
81
|
+
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
82
|
+
writeFileSync(join(dir, ".gsd", "STATE.md"), "state\n");
|
|
83
|
+
// Not git-added — should return false
|
|
84
|
+
assert.equal(hasGitTrackedGsdFiles(dir), false);
|
|
85
|
+
} finally {
|
|
86
|
+
cleanup(dir);
|
|
87
|
+
}
|
|
82
88
|
});
|
|
83
89
|
|
|
84
90
|
// ─── ensureGitignore — tracked .gsd/ protection ─────────────────────
|
|
85
91
|
|
|
86
|
-
test("ensureGitignore does NOT add .gsd when .gsd/ has tracked files (#1364)", (
|
|
92
|
+
test("ensureGitignore does NOT add .gsd when .gsd/ has tracked files (#1364)", () => {
|
|
87
93
|
const dir = makeTempRepo();
|
|
88
94
|
try {
|
|
89
95
|
// Set up .gsd/ with tracked files
|
|
@@ -112,7 +118,7 @@ test("ensureGitignore does NOT add .gsd when .gsd/ has tracked files (#1364)", (
|
|
|
112
118
|
}
|
|
113
119
|
});
|
|
114
120
|
|
|
115
|
-
test("ensureGitignore adds .gsd when .gsd/ has NO tracked files", (
|
|
121
|
+
test("ensureGitignore adds .gsd when .gsd/ has NO tracked files", () => {
|
|
116
122
|
const dir = makeTempRepo();
|
|
117
123
|
try {
|
|
118
124
|
// Run ensureGitignore (no .gsd/ at all)
|
|
@@ -130,18 +136,20 @@ test("ensureGitignore adds .gsd when .gsd/ has NO tracked files", (t) => {
|
|
|
130
136
|
}
|
|
131
137
|
});
|
|
132
138
|
|
|
133
|
-
test("ensureGitignore respects manageGitignore: false", (
|
|
139
|
+
test("ensureGitignore respects manageGitignore: false", () => {
|
|
134
140
|
const dir = makeTempRepo();
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
141
|
+
try {
|
|
142
|
+
const result = ensureGitignore(dir, { manageGitignore: false });
|
|
143
|
+
assert.equal(result, false);
|
|
144
|
+
assert.ok(!existsSync(join(dir, ".gitignore")), "Should not create .gitignore");
|
|
145
|
+
} finally {
|
|
146
|
+
cleanup(dir);
|
|
147
|
+
}
|
|
140
148
|
});
|
|
141
149
|
|
|
142
150
|
// ─── ensureGitignore — verify no tracked files become invisible ─────
|
|
143
151
|
|
|
144
|
-
test("ensureGitignore with tracked .gsd/ does not cause git to see files as deleted", (
|
|
152
|
+
test("ensureGitignore with tracked .gsd/ does not cause git to see files as deleted", () => {
|
|
145
153
|
const dir = makeTempRepo();
|
|
146
154
|
try {
|
|
147
155
|
// Create tracked .gsd/ files
|
|
@@ -175,7 +183,7 @@ test("ensureGitignore with tracked .gsd/ does not cause git to see files as dele
|
|
|
175
183
|
}
|
|
176
184
|
});
|
|
177
185
|
|
|
178
|
-
test("hasGitTrackedGsdFiles returns true (fail-safe) when git is not available", (
|
|
186
|
+
test("hasGitTrackedGsdFiles returns true (fail-safe) when git is not available", () => {
|
|
179
187
|
const dir = makeTempRepo();
|
|
180
188
|
try {
|
|
181
189
|
// Create and track .gsd/ files
|
|
@@ -199,7 +207,7 @@ test("hasGitTrackedGsdFiles returns true (fail-safe) when git is not available",
|
|
|
199
207
|
|
|
200
208
|
// ─── migrateToExternalState — tracked .gsd/ protection ──────────────
|
|
201
209
|
|
|
202
|
-
test("migrateToExternalState aborts when .gsd/ has tracked files (#1364)", (
|
|
210
|
+
test("migrateToExternalState aborts when .gsd/ has tracked files (#1364)", () => {
|
|
203
211
|
const dir = makeTempRepo();
|
|
204
212
|
try {
|
|
205
213
|
// Create tracked .gsd/ files
|
|
@@ -227,7 +235,7 @@ test("migrateToExternalState aborts when .gsd/ has tracked files (#1364)", (t) =
|
|
|
227
235
|
}
|
|
228
236
|
});
|
|
229
237
|
|
|
230
|
-
test("migrateToExternalState cleans git index so tracked files don't show as deleted (#1364 path 2)", (
|
|
238
|
+
test("migrateToExternalState cleans git index so tracked files don't show as deleted (#1364 path 2)", () => {
|
|
231
239
|
const dir = makeTempRepo();
|
|
232
240
|
try {
|
|
233
241
|
// Track .gsd/ files, then untrack them so migration proceeds
|
|
@@ -56,7 +56,7 @@ function makeStep(overrides: Partial<GraphStep> & { id: string }): GraphStep {
|
|
|
56
56
|
// ─── writeGraph + readGraph round-trip ───────────────────────────────────
|
|
57
57
|
|
|
58
58
|
describe("writeGraph + readGraph round-trip", () => {
|
|
59
|
-
it("preserves all fields including parentStepId and dependsOn", (
|
|
59
|
+
it("preserves all fields including parentStepId and dependsOn", () => {
|
|
60
60
|
const dir = makeTmpDir();
|
|
61
61
|
try {
|
|
62
62
|
const graph = makeGraph([
|
|
@@ -89,7 +89,7 @@ describe("writeGraph + readGraph round-trip", () => {
|
|
|
89
89
|
}
|
|
90
90
|
});
|
|
91
91
|
|
|
92
|
-
it("preserves startedAt and finishedAt fields", (
|
|
92
|
+
it("preserves startedAt and finishedAt fields", () => {
|
|
93
93
|
const dir = makeTmpDir();
|
|
94
94
|
try {
|
|
95
95
|
const graph = makeGraph([
|
|
@@ -110,7 +110,7 @@ describe("writeGraph + readGraph round-trip", () => {
|
|
|
110
110
|
}
|
|
111
111
|
});
|
|
112
112
|
|
|
113
|
-
it("creates directory if it does not exist", (
|
|
113
|
+
it("creates directory if it does not exist", () => {
|
|
114
114
|
const base = makeTmpDir();
|
|
115
115
|
const nested = join(base, "sub", "dir");
|
|
116
116
|
try {
|
|
@@ -129,53 +129,59 @@ describe("writeGraph + readGraph round-trip", () => {
|
|
|
129
129
|
// ─── readGraph error paths ───────────────────────────────────────────────
|
|
130
130
|
|
|
131
131
|
describe("readGraph error paths", () => {
|
|
132
|
-
it("throws with descriptive error when file is missing", (
|
|
132
|
+
it("throws with descriptive error when file is missing", () => {
|
|
133
133
|
const dir = makeTmpDir();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
134
|
+
try {
|
|
135
|
+
assert.throws(
|
|
136
|
+
() => readGraph(dir),
|
|
137
|
+
(err: Error) => {
|
|
138
|
+
assert.ok(err.message.includes("GRAPH.yaml not found"));
|
|
139
|
+
assert.ok(err.message.includes(dir));
|
|
140
|
+
return true;
|
|
141
|
+
},
|
|
142
|
+
);
|
|
143
|
+
} finally {
|
|
144
|
+
cleanupDir(dir);
|
|
145
|
+
}
|
|
144
146
|
});
|
|
145
147
|
|
|
146
|
-
it("throws with descriptive error when YAML is malformed (missing steps)", (
|
|
148
|
+
it("throws with descriptive error when YAML is malformed (missing steps)", () => {
|
|
147
149
|
const dir = makeTmpDir();
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
150
|
+
try {
|
|
151
|
+
writeFileSync(join(dir, "GRAPH.yaml"), "metadata:\n name: bad\n", "utf-8");
|
|
152
|
+
assert.throws(
|
|
153
|
+
() => readGraph(dir),
|
|
154
|
+
(err: Error) => {
|
|
155
|
+
assert.ok(err.message.includes("missing or invalid 'steps' array"));
|
|
156
|
+
return true;
|
|
157
|
+
},
|
|
158
|
+
);
|
|
159
|
+
} finally {
|
|
160
|
+
cleanupDir(dir);
|
|
161
|
+
}
|
|
158
162
|
});
|
|
159
163
|
|
|
160
|
-
it("throws when steps is not an array", (
|
|
164
|
+
it("throws when steps is not an array", () => {
|
|
161
165
|
const dir = makeTmpDir();
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
166
|
+
try {
|
|
167
|
+
writeFileSync(join(dir, "GRAPH.yaml"), "steps: not-an-array\nmetadata:\n name: bad\n", "utf-8");
|
|
168
|
+
assert.throws(
|
|
169
|
+
() => readGraph(dir),
|
|
170
|
+
(err: Error) => {
|
|
171
|
+
assert.ok(err.message.includes("missing or invalid 'steps' array"));
|
|
172
|
+
return true;
|
|
173
|
+
},
|
|
174
|
+
);
|
|
175
|
+
} finally {
|
|
176
|
+
cleanupDir(dir);
|
|
177
|
+
}
|
|
172
178
|
});
|
|
173
179
|
});
|
|
174
180
|
|
|
175
181
|
// ─── getNextPendingStep ──────────────────────────────────────────────────
|
|
176
182
|
|
|
177
183
|
describe("getNextPendingStep", () => {
|
|
178
|
-
it("returns first step with all deps complete", (
|
|
184
|
+
it("returns first step with all deps complete", () => {
|
|
179
185
|
const graph = makeGraph([
|
|
180
186
|
makeStep({ id: "a", status: "complete" }),
|
|
181
187
|
makeStep({ id: "b", dependsOn: ["a"] }),
|
|
@@ -186,7 +192,7 @@ describe("getNextPendingStep", () => {
|
|
|
186
192
|
assert.equal(next?.id, "b");
|
|
187
193
|
});
|
|
188
194
|
|
|
189
|
-
it("skips steps with incomplete deps", (
|
|
195
|
+
it("skips steps with incomplete deps", () => {
|
|
190
196
|
const graph = makeGraph([
|
|
191
197
|
makeStep({ id: "a" }),
|
|
192
198
|
makeStep({ id: "b", dependsOn: ["a"] }),
|
|
@@ -197,7 +203,7 @@ describe("getNextPendingStep", () => {
|
|
|
197
203
|
assert.equal(next?.id, "a");
|
|
198
204
|
});
|
|
199
205
|
|
|
200
|
-
it("returns null when all steps are complete", (
|
|
206
|
+
it("returns null when all steps are complete", () => {
|
|
201
207
|
const graph = makeGraph([
|
|
202
208
|
makeStep({ id: "a", status: "complete" }),
|
|
203
209
|
makeStep({ id: "b", status: "complete" }),
|
|
@@ -206,7 +212,7 @@ describe("getNextPendingStep", () => {
|
|
|
206
212
|
assert.equal(getNextPendingStep(graph), null);
|
|
207
213
|
});
|
|
208
214
|
|
|
209
|
-
it("returns null when all pending steps are blocked", (
|
|
215
|
+
it("returns null when all pending steps are blocked", () => {
|
|
210
216
|
const graph = makeGraph([
|
|
211
217
|
makeStep({ id: "a", status: "active" }), // not complete
|
|
212
218
|
makeStep({ id: "b", dependsOn: ["a"] }), // blocked
|
|
@@ -215,7 +221,7 @@ describe("getNextPendingStep", () => {
|
|
|
215
221
|
assert.equal(getNextPendingStep(graph), null);
|
|
216
222
|
});
|
|
217
223
|
|
|
218
|
-
it("returns first pending step with no deps when root steps exist", (
|
|
224
|
+
it("returns first pending step with no deps when root steps exist", () => {
|
|
219
225
|
const graph = makeGraph([
|
|
220
226
|
makeStep({ id: "a" }),
|
|
221
227
|
makeStep({ id: "b" }),
|
|
@@ -225,7 +231,7 @@ describe("getNextPendingStep", () => {
|
|
|
225
231
|
assert.equal(next?.id, "a");
|
|
226
232
|
});
|
|
227
233
|
|
|
228
|
-
it("skips expanded steps", (
|
|
234
|
+
it("skips expanded steps", () => {
|
|
229
235
|
const graph = makeGraph([
|
|
230
236
|
makeStep({ id: "a", status: "expanded" }),
|
|
231
237
|
makeStep({ id: "b" }),
|
|
@@ -239,7 +245,7 @@ describe("getNextPendingStep", () => {
|
|
|
239
245
|
// ─── markStepComplete ────────────────────────────────────────────────────
|
|
240
246
|
|
|
241
247
|
describe("markStepComplete", () => {
|
|
242
|
-
it("returns new graph with step status 'complete' (original unchanged)", (
|
|
248
|
+
it("returns new graph with step status 'complete' (original unchanged)", () => {
|
|
243
249
|
const original = makeGraph([
|
|
244
250
|
makeStep({ id: "a" }),
|
|
245
251
|
makeStep({ id: "b" }),
|
|
@@ -258,7 +264,7 @@ describe("markStepComplete", () => {
|
|
|
258
264
|
assert.equal(updated.steps[1].status, "pending");
|
|
259
265
|
});
|
|
260
266
|
|
|
261
|
-
it("sets finishedAt timestamp", (
|
|
267
|
+
it("sets finishedAt timestamp", () => {
|
|
262
268
|
const graph = makeGraph([makeStep({ id: "a" })]);
|
|
263
269
|
const updated = markStepComplete(graph, "a");
|
|
264
270
|
assert.ok(updated.steps[0].finishedAt);
|
|
@@ -266,7 +272,7 @@ describe("markStepComplete", () => {
|
|
|
266
272
|
assert.ok(!isNaN(Date.parse(updated.steps[0].finishedAt!)));
|
|
267
273
|
});
|
|
268
274
|
|
|
269
|
-
it("throws for unknown step ID", (
|
|
275
|
+
it("throws for unknown step ID", () => {
|
|
270
276
|
const graph = makeGraph([makeStep({ id: "a" })]);
|
|
271
277
|
assert.throws(
|
|
272
278
|
() => markStepComplete(graph, "nonexistent"),
|
|
@@ -278,7 +284,7 @@ describe("markStepComplete", () => {
|
|
|
278
284
|
);
|
|
279
285
|
});
|
|
280
286
|
|
|
281
|
-
it("preserves metadata in returned graph", (
|
|
287
|
+
it("preserves metadata in returned graph", () => {
|
|
282
288
|
const graph = makeGraph([makeStep({ id: "a" })], "my-workflow");
|
|
283
289
|
const updated = markStepComplete(graph, "a");
|
|
284
290
|
assert.equal(updated.metadata.name, "my-workflow");
|
|
@@ -289,7 +295,7 @@ describe("markStepComplete", () => {
|
|
|
289
295
|
// ─── expandIteration ─────────────────────────────────────────────────────
|
|
290
296
|
|
|
291
297
|
describe("expandIteration", () => {
|
|
292
|
-
it("creates instance steps with correct IDs (stepId--001, stepId--002)", (
|
|
298
|
+
it("creates instance steps with correct IDs (stepId--001, stepId--002)", () => {
|
|
293
299
|
const graph = makeGraph([
|
|
294
300
|
makeStep({ id: "iter-step", title: "Process items" }),
|
|
295
301
|
makeStep({ id: "final", dependsOn: ["iter-step"] }),
|
|
@@ -311,7 +317,7 @@ describe("expandIteration", () => {
|
|
|
311
317
|
assert.equal(expanded.steps[3].id, "iter-step--003");
|
|
312
318
|
});
|
|
313
319
|
|
|
314
|
-
it("marks parent step as 'expanded'", (
|
|
320
|
+
it("marks parent step as 'expanded'", () => {
|
|
315
321
|
const graph = makeGraph([
|
|
316
322
|
makeStep({ id: "iter", title: "Iterate" }),
|
|
317
323
|
]);
|
|
@@ -320,7 +326,7 @@ describe("expandIteration", () => {
|
|
|
320
326
|
assert.equal(expanded.steps[0].status, "expanded");
|
|
321
327
|
});
|
|
322
328
|
|
|
323
|
-
it("instance steps have correct titles, prompts, parentStepId, and deps", (
|
|
329
|
+
it("instance steps have correct titles, prompts, parentStepId, and deps", () => {
|
|
324
330
|
const graph = makeGraph([
|
|
325
331
|
makeStep({ id: "pre", status: "complete" }),
|
|
326
332
|
makeStep({ id: "iter", title: "Process", dependsOn: ["pre"] }),
|
|
@@ -346,7 +352,7 @@ describe("expandIteration", () => {
|
|
|
346
352
|
assert.equal(inst2.parentStepId, "iter");
|
|
347
353
|
});
|
|
348
354
|
|
|
349
|
-
it("rewrites downstream deps from parent ID to all instance IDs", (
|
|
355
|
+
it("rewrites downstream deps from parent ID to all instance IDs", () => {
|
|
350
356
|
const graph = makeGraph([
|
|
351
357
|
makeStep({ id: "iter", title: "Iterate" }),
|
|
352
358
|
makeStep({ id: "after", dependsOn: ["iter"] }),
|
|
@@ -364,7 +370,7 @@ describe("expandIteration", () => {
|
|
|
364
370
|
assert.deepStrictEqual(afterStep.dependsOn, ["iter--001", "iter--002"]);
|
|
365
371
|
});
|
|
366
372
|
|
|
367
|
-
it("preserves steps that don't depend on the parent", (
|
|
373
|
+
it("preserves steps that don't depend on the parent", () => {
|
|
368
374
|
const graph = makeGraph([
|
|
369
375
|
makeStep({ id: "unrelated" }),
|
|
370
376
|
makeStep({ id: "iter", title: "Iterate" }),
|
|
@@ -376,7 +382,7 @@ describe("expandIteration", () => {
|
|
|
376
382
|
assert.deepStrictEqual(unrelated.dependsOn, []);
|
|
377
383
|
});
|
|
378
384
|
|
|
379
|
-
it("throws for non-pending parent step", (
|
|
385
|
+
it("throws for non-pending parent step", () => {
|
|
380
386
|
const graph = makeGraph([
|
|
381
387
|
makeStep({ id: "iter", status: "complete" }),
|
|
382
388
|
]);
|
|
@@ -391,7 +397,7 @@ describe("expandIteration", () => {
|
|
|
391
397
|
);
|
|
392
398
|
});
|
|
393
399
|
|
|
394
|
-
it("throws for unknown step ID", (
|
|
400
|
+
it("throws for unknown step ID", () => {
|
|
395
401
|
const graph = makeGraph([makeStep({ id: "a" })]);
|
|
396
402
|
assert.throws(
|
|
397
403
|
() => expandIteration(graph, "nonexistent", ["a"], "{{item}}"),
|
|
@@ -403,7 +409,7 @@ describe("expandIteration", () => {
|
|
|
403
409
|
);
|
|
404
410
|
});
|
|
405
411
|
|
|
406
|
-
it("does not mutate the input graph", (
|
|
412
|
+
it("does not mutate the input graph", () => {
|
|
407
413
|
const graph = makeGraph([
|
|
408
414
|
makeStep({ id: "iter", title: "Iterate" }),
|
|
409
415
|
makeStep({ id: "after", dependsOn: ["iter"] }),
|
|
@@ -424,7 +430,7 @@ describe("expandIteration", () => {
|
|
|
424
430
|
// ─── initializeGraph ─────────────────────────────────────────────────────
|
|
425
431
|
|
|
426
432
|
describe("initializeGraph", () => {
|
|
427
|
-
it("converts a valid 3-step definition to graph with all pending steps", (
|
|
433
|
+
it("converts a valid 3-step definition to graph with all pending steps", () => {
|
|
428
434
|
const def: WorkflowDefinition = {
|
|
429
435
|
version: 1,
|
|
430
436
|
name: "test-workflow",
|
|
@@ -459,7 +465,7 @@ describe("initializeGraph", () => {
|
|
|
459
465
|
assert.deepStrictEqual(graph.steps[2].dependsOn, ["s1", "s2"]);
|
|
460
466
|
});
|
|
461
467
|
|
|
462
|
-
it("is also exported as graphFromDefinition (backward compat)", (
|
|
468
|
+
it("is also exported as graphFromDefinition (backward compat)", () => {
|
|
463
469
|
assert.equal(graphFromDefinition, initializeGraph);
|
|
464
470
|
});
|
|
465
471
|
});
|
|
@@ -467,7 +473,7 @@ describe("initializeGraph", () => {
|
|
|
467
473
|
// ─── Atomic write safety ─────────────────────────────────────────────────
|
|
468
474
|
|
|
469
475
|
describe("atomic write safety", () => {
|
|
470
|
-
it("final file exists and .tmp file does not exist after write", (
|
|
476
|
+
it("final file exists and .tmp file does not exist after write", () => {
|
|
471
477
|
const dir = makeTmpDir();
|
|
472
478
|
try {
|
|
473
479
|
const graph = makeGraph([makeStep({ id: "s1" })]);
|
|
@@ -480,7 +486,7 @@ describe("atomic write safety", () => {
|
|
|
480
486
|
}
|
|
481
487
|
});
|
|
482
488
|
|
|
483
|
-
it("YAML content is valid and parseable", (
|
|
489
|
+
it("YAML content is valid and parseable", () => {
|
|
484
490
|
const dir = makeTmpDir();
|
|
485
491
|
try {
|
|
486
492
|
const graph = makeGraph([makeStep({ id: "s1" })]);
|
|
@@ -501,7 +507,7 @@ describe("atomic write safety", () => {
|
|
|
501
507
|
// ─── YAML snake_case / camelCase boundary ────────────────────────────────
|
|
502
508
|
|
|
503
509
|
describe("YAML snake_case / camelCase boundary", () => {
|
|
504
|
-
it("writes snake_case to disk and reads back as camelCase", (
|
|
510
|
+
it("writes snake_case to disk and reads back as camelCase", () => {
|
|
505
511
|
const dir = makeTmpDir();
|
|
506
512
|
try {
|
|
507
513
|
const graph = makeGraph([
|
|
@@ -535,7 +541,7 @@ describe("YAML snake_case / camelCase boundary", () => {
|
|
|
535
541
|
}
|
|
536
542
|
});
|
|
537
543
|
|
|
538
|
-
it("omits optional fields from YAML when undefined", (
|
|
544
|
+
it("omits optional fields from YAML when undefined", () => {
|
|
539
545
|
const dir = makeTmpDir();
|
|
540
546
|
try {
|
|
541
547
|
const graph = makeGraph([
|
|
@@ -559,7 +565,7 @@ describe("YAML snake_case / camelCase boundary", () => {
|
|
|
559
565
|
// ─── Edge cases ──────────────────────────────────────────────────────────
|
|
560
566
|
|
|
561
567
|
describe("edge cases", () => {
|
|
562
|
-
it("handles empty items array in expandIteration", (
|
|
568
|
+
it("handles empty items array in expandIteration", () => {
|
|
563
569
|
const graph = makeGraph([
|
|
564
570
|
makeStep({ id: "iter" }),
|
|
565
571
|
]);
|
|
@@ -570,7 +576,7 @@ describe("edge cases", () => {
|
|
|
570
576
|
assert.equal(expanded.steps[0].status, "expanded");
|
|
571
577
|
});
|
|
572
578
|
|
|
573
|
-
it("handles graph with single step", (
|
|
579
|
+
it("handles graph with single step", () => {
|
|
574
580
|
const graph = makeGraph([makeStep({ id: "only" })]);
|
|
575
581
|
const next = getNextPendingStep(graph);
|
|
576
582
|
assert.equal(next?.id, "only");
|
|
@@ -579,7 +585,7 @@ describe("edge cases", () => {
|
|
|
579
585
|
assert.equal(getNextPendingStep(completed), null);
|
|
580
586
|
});
|
|
581
587
|
|
|
582
|
-
it("initializeGraph handles steps with empty requires", (
|
|
588
|
+
it("initializeGraph handles steps with empty requires", () => {
|
|
583
589
|
const def: WorkflowDefinition = {
|
|
584
590
|
version: 1,
|
|
585
591
|
name: "empty-requires",
|