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
|
@@ -12,16 +12,20 @@
|
|
|
12
12
|
* Also covers dependency expansion (range syntax) and edge cases.
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import { describe, test } from 'node:test';
|
|
16
|
-
import assert from 'node:assert/strict';
|
|
17
15
|
import { parseRoadmapSlices, expandDependencies } from '../roadmap-slices.ts';
|
|
16
|
+
import { createTestContext } from './test-helpers.ts';
|
|
17
|
+
|
|
18
|
+
const { assertEq, assertTrue, report } = createTestContext();
|
|
19
|
+
|
|
20
|
+
async function main(): Promise<void> {
|
|
21
|
+
|
|
18
22
|
// ═══════════════════════════════════════════════════════════════════════
|
|
19
23
|
// A. Standard machine-readable format (should always work)
|
|
20
24
|
// ═══════════════════════════════════════════════════════════════════════
|
|
21
25
|
|
|
26
|
+
console.log('\n=== A. Standard checkbox format ===');
|
|
22
27
|
|
|
23
|
-
|
|
24
|
-
test('A. Standard checkbox format', () => {
|
|
28
|
+
{
|
|
25
29
|
const content = [
|
|
26
30
|
'# M001: Test Project',
|
|
27
31
|
'',
|
|
@@ -36,27 +40,30 @@ test('A. Standard checkbox format', () => {
|
|
|
36
40
|
].join('\n');
|
|
37
41
|
|
|
38
42
|
const slices = parseRoadmapSlices(content);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
43
|
+
assertEq(slices.length, 3, 'standard format: 3 slices');
|
|
44
|
+
assertEq(slices[0].id, 'S01', 'S01 id');
|
|
45
|
+
assertEq(slices[0].title, 'First Slice', 'S01 title');
|
|
46
|
+
assertEq(slices[0].done, false, 'S01 not done');
|
|
47
|
+
assertEq(slices[0].risk, 'low', 'S01 risk');
|
|
48
|
+
assertEq(slices[0].depends.length, 0, 'S01 no deps');
|
|
49
|
+
|
|
50
|
+
assertEq(slices[1].id, 'S02', 'S02 id');
|
|
51
|
+
assertEq(slices[1].depends.length, 1, 'S02 has 1 dep');
|
|
52
|
+
assertEq(slices[1].depends[0], 'S01', 'S02 depends on S01');
|
|
53
|
+
|
|
54
|
+
assertEq(slices[2].id, 'S03', 'S03 id');
|
|
55
|
+
assertEq(slices[2].done, true, 'S03 is done');
|
|
56
|
+
assertEq(slices[2].risk, 'high', 'S03 risk');
|
|
57
|
+
assertEq(slices[2].depends.length, 2, 'S03 has 2 deps');
|
|
58
|
+
}
|
|
55
59
|
|
|
56
60
|
// ═══════════════════════════════════════════════════════════════════════
|
|
57
61
|
// B. Prose fallback: H2 with colon (the only format the old regex matched)
|
|
58
62
|
// ═══════════════════════════════════════════════════════════════════════
|
|
59
|
-
|
|
63
|
+
|
|
64
|
+
console.log('\n=== B. Prose fallback: H2 with colon ===');
|
|
65
|
+
|
|
66
|
+
{
|
|
60
67
|
const content = [
|
|
61
68
|
'# M001: Test',
|
|
62
69
|
'',
|
|
@@ -71,17 +78,20 @@ test('B. Prose fallback: H2 with colon', () => {
|
|
|
71
78
|
].join('\n');
|
|
72
79
|
|
|
73
80
|
const slices = parseRoadmapSlices(content);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
81
|
+
assertEq(slices.length, 2, 'prose H2 colon: 2 slices');
|
|
82
|
+
assertEq(slices[0].id, 'S01', 'S01 id');
|
|
83
|
+
assertEq(slices[0].title, 'Setup Foundation', 'S01 title');
|
|
84
|
+
assertEq(slices[1].id, 'S02', 'S02 id');
|
|
85
|
+
assertEq(slices[1].title, 'Core Features', 'S02 title');
|
|
86
|
+
}
|
|
80
87
|
|
|
81
88
|
// ═══════════════════════════════════════════════════════════════════════
|
|
82
89
|
// C. Regression #1248: H3 headers (the old regex only matched ##)
|
|
83
90
|
// ═══════════════════════════════════════════════════════════════════════
|
|
84
|
-
|
|
91
|
+
|
|
92
|
+
console.log('\n=== C. #1248: H3 headers ===');
|
|
93
|
+
|
|
94
|
+
{
|
|
85
95
|
const content = [
|
|
86
96
|
'# M001: Test',
|
|
87
97
|
'',
|
|
@@ -96,15 +106,18 @@ test('C. #1248: H3 headers', () => {
|
|
|
96
106
|
].join('\n');
|
|
97
107
|
|
|
98
108
|
const slices = parseRoadmapSlices(content);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
109
|
+
assertEq(slices.length, 2, '#1248 H3: 2 slices parsed');
|
|
110
|
+
assertEq(slices[0].id, 'S01', 'S01 from H3');
|
|
111
|
+
assertEq(slices[1].id, 'S02', 'S02 from H3');
|
|
112
|
+
}
|
|
103
113
|
|
|
104
114
|
// ═══════════════════════════════════════════════════════════════════════
|
|
105
115
|
// D. Regression #1248: H4 headers
|
|
106
116
|
// ═══════════════════════════════════════════════════════════════════════
|
|
107
|
-
|
|
117
|
+
|
|
118
|
+
console.log('\n=== D. #1248: H4 headers ===');
|
|
119
|
+
|
|
120
|
+
{
|
|
108
121
|
const content = [
|
|
109
122
|
'# M001: Test',
|
|
110
123
|
'',
|
|
@@ -115,13 +128,16 @@ test('D. #1248: H4 headers', () => {
|
|
|
115
128
|
].join('\n');
|
|
116
129
|
|
|
117
130
|
const slices = parseRoadmapSlices(content);
|
|
118
|
-
|
|
119
|
-
}
|
|
131
|
+
assertEq(slices.length, 2, '#1248 H4: 2 slices parsed');
|
|
132
|
+
}
|
|
120
133
|
|
|
121
134
|
// ═══════════════════════════════════════════════════════════════════════
|
|
122
135
|
// E. Regression #1248: H1 header (unusual but LLMs produce it)
|
|
123
136
|
// ═══════════════════════════════════════════════════════════════════════
|
|
124
|
-
|
|
137
|
+
|
|
138
|
+
console.log('\n=== E. #1248: H1 headers ===');
|
|
139
|
+
|
|
140
|
+
{
|
|
125
141
|
const content = [
|
|
126
142
|
'# S01: Setup Foundation',
|
|
127
143
|
'',
|
|
@@ -134,76 +150,97 @@ test('E. #1248: H1 headers', () => {
|
|
|
134
150
|
].join('\n');
|
|
135
151
|
|
|
136
152
|
const slices = parseRoadmapSlices(content);
|
|
137
|
-
|
|
138
|
-
}
|
|
153
|
+
assertEq(slices.length, 2, '#1248 H1: 2 slices parsed');
|
|
154
|
+
}
|
|
139
155
|
|
|
140
156
|
// ═══════════════════════════════════════════════════════════════════════
|
|
141
157
|
// F. Regression #1248: Bold-wrapped IDs
|
|
142
158
|
// ═══════════════════════════════════════════════════════════════════════
|
|
143
|
-
|
|
159
|
+
|
|
160
|
+
console.log('\n=== F. #1248: Bold-wrapped ===');
|
|
161
|
+
|
|
162
|
+
{
|
|
144
163
|
const content1 = '## **S01: Setup Foundation**\n\nDo stuff.\n\n## **S02: Features**\n\nMore stuff.\n';
|
|
145
164
|
const slices1 = parseRoadmapSlices(content1);
|
|
146
|
-
|
|
147
|
-
|
|
165
|
+
assertEq(slices1.length, 2, 'bold-wrapped: 2 slices');
|
|
166
|
+
assertEq(slices1[0].title, 'Setup Foundation', 'bold-wrapped: title extracted without bold');
|
|
148
167
|
|
|
149
168
|
const content2 = '## **S01**: Setup Foundation\n\n## **S02**: Features\n';
|
|
150
169
|
const slices2 = parseRoadmapSlices(content2);
|
|
151
|
-
|
|
152
|
-
}
|
|
170
|
+
assertEq(slices2.length, 2, 'bold ID only: 2 slices');
|
|
171
|
+
}
|
|
153
172
|
|
|
154
173
|
// ═══════════════════════════════════════════════════════════════════════
|
|
155
174
|
// G. Regression #1248: Dot separator
|
|
156
175
|
// ═══════════════════════════════════════════════════════════════════════
|
|
157
|
-
|
|
176
|
+
|
|
177
|
+
console.log('\n=== G. #1248: Dot separator ===');
|
|
178
|
+
|
|
179
|
+
{
|
|
158
180
|
const content = '## S01. Setup Foundation\n\n## S02. Core Features\n';
|
|
159
181
|
const slices = parseRoadmapSlices(content);
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
182
|
+
assertEq(slices.length, 2, 'dot separator: 2 slices');
|
|
183
|
+
assertEq(slices[0].title, 'Setup Foundation', 'dot separator: title');
|
|
184
|
+
}
|
|
163
185
|
|
|
164
186
|
// ═══════════════════════════════════════════════════════════════════════
|
|
165
187
|
// H. Regression #1248: Em dash separator
|
|
166
188
|
// ═══════════════════════════════════════════════════════════════════════
|
|
167
|
-
|
|
189
|
+
|
|
190
|
+
console.log('\n=== H. #1248: Em/en dash separators ===');
|
|
191
|
+
|
|
192
|
+
{
|
|
168
193
|
const content = '## S01 — Setup Foundation\n\n## S02 – Core Features\n';
|
|
169
194
|
const slices = parseRoadmapSlices(content);
|
|
170
|
-
|
|
171
|
-
}
|
|
195
|
+
assertEq(slices.length, 2, 'em/en dash: 2 slices');
|
|
196
|
+
}
|
|
172
197
|
|
|
173
198
|
// ═══════════════════════════════════════════════════════════════════════
|
|
174
199
|
// I. Regression #1248: Space-only separator (no punctuation)
|
|
175
200
|
// ═══════════════════════════════════════════════════════════════════════
|
|
176
|
-
|
|
201
|
+
|
|
202
|
+
console.log('\n=== I. #1248: Space-only separator ===');
|
|
203
|
+
|
|
204
|
+
{
|
|
177
205
|
const content = '## S01 Setup Foundation\n\n## S02 Core Features\n';
|
|
178
206
|
const slices = parseRoadmapSlices(content);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
207
|
+
assertEq(slices.length, 2, 'space-only: 2 slices');
|
|
208
|
+
assertEq(slices[0].title, 'Setup Foundation', 'space-only: title');
|
|
209
|
+
}
|
|
182
210
|
|
|
183
211
|
// ═══════════════════════════════════════════════════════════════════════
|
|
184
212
|
// J. Regression #1248: Non-zero-padded IDs
|
|
185
213
|
// ═══════════════════════════════════════════════════════════════════════
|
|
186
|
-
|
|
214
|
+
|
|
215
|
+
console.log('\n=== J. #1248: Non-zero-padded IDs ===');
|
|
216
|
+
|
|
217
|
+
{
|
|
187
218
|
const content = '## S1: Setup\n\n## S2: Features\n';
|
|
188
219
|
const slices = parseRoadmapSlices(content);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
220
|
+
assertEq(slices.length, 2, 'non-padded: 2 slices');
|
|
221
|
+
assertEq(slices[0].id, 'S1', 'non-padded: S1');
|
|
222
|
+
}
|
|
192
223
|
|
|
193
224
|
// ═══════════════════════════════════════════════════════════════════════
|
|
194
225
|
// K. Regression #1248: "Slice" prefix
|
|
195
226
|
// ═══════════════════════════════════════════════════════════════════════
|
|
196
|
-
|
|
227
|
+
|
|
228
|
+
console.log('\n=== K. #1248: "Slice" prefix ===');
|
|
229
|
+
|
|
230
|
+
{
|
|
197
231
|
const content = '## Slice S01: Setup Foundation\n\n## Slice S02: Core Features\n';
|
|
198
232
|
const slices = parseRoadmapSlices(content);
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
233
|
+
assertEq(slices.length, 2, 'Slice prefix: 2 slices');
|
|
234
|
+
assertEq(slices[0].id, 'S01', 'Slice prefix: S01');
|
|
235
|
+
}
|
|
202
236
|
|
|
203
237
|
// ═══════════════════════════════════════════════════════════════════════
|
|
204
238
|
// L. Prose with "Depends on:" line
|
|
205
239
|
// ═══════════════════════════════════════════════════════════════════════
|
|
206
|
-
|
|
240
|
+
|
|
241
|
+
console.log('\n=== L. Prose with Depends on: ===');
|
|
242
|
+
|
|
243
|
+
{
|
|
207
244
|
const content = [
|
|
208
245
|
'## S01: Foundation',
|
|
209
246
|
'',
|
|
@@ -217,17 +254,20 @@ test('L. Prose with Depends on:', () => {
|
|
|
217
254
|
].join('\n');
|
|
218
255
|
|
|
219
256
|
const slices = parseRoadmapSlices(content);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
257
|
+
assertEq(slices.length, 2, 'prose deps: 2 slices');
|
|
258
|
+
assertEq(slices[1].depends.length, 1, 'S02 has 1 dep');
|
|
259
|
+
assertEq(slices[1].depends[0], 'S01', 'S02 depends on S01');
|
|
260
|
+
}
|
|
224
261
|
|
|
225
262
|
// ═══════════════════════════════════════════════════════════════════════
|
|
226
263
|
// M. Empty / edge cases
|
|
227
264
|
// ═══════════════════════════════════════════════════════════════════════
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
265
|
+
|
|
266
|
+
console.log('\n=== M. Edge cases ===');
|
|
267
|
+
|
|
268
|
+
{
|
|
269
|
+
assertEq(parseRoadmapSlices('').length, 0, 'empty content → 0 slices');
|
|
270
|
+
assertEq(parseRoadmapSlices('# Just a title\n\nSome text.').length, 0, 'no slices at all → 0');
|
|
231
271
|
|
|
232
272
|
// Mixed format: ## Slices section with one checkbox + prose below
|
|
233
273
|
const mixed = [
|
|
@@ -241,69 +281,81 @@ test('M. Edge cases', () => {
|
|
|
241
281
|
].join('\n');
|
|
242
282
|
const mixedSlices = parseRoadmapSlices(mixed);
|
|
243
283
|
// The ## Slices section takes priority — prose headers outside it aren't picked up
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
284
|
+
assertEq(mixedSlices.length, 1, 'mixed: only 1 slice from ## Slices section');
|
|
285
|
+
assertEq(mixedSlices[0].id, 'S01', 'mixed: S01 from checkbox');
|
|
286
|
+
}
|
|
247
287
|
|
|
248
288
|
// ═══════════════════════════════════════════════════════════════════════
|
|
249
289
|
// N. Dependency range expansion
|
|
250
290
|
// ═══════════════════════════════════════════════════════════════════════
|
|
251
|
-
|
|
252
|
-
|
|
291
|
+
|
|
292
|
+
console.log('\n=== N. Dependency range expansion ===');
|
|
293
|
+
|
|
294
|
+
{
|
|
295
|
+
assertEq(
|
|
253
296
|
expandDependencies(['S01-S04']),
|
|
254
297
|
['S01', 'S02', 'S03', 'S04'],
|
|
255
298
|
'S01-S04 → 4 individual deps',
|
|
256
299
|
);
|
|
257
300
|
|
|
258
|
-
|
|
301
|
+
assertEq(
|
|
259
302
|
expandDependencies(['S01..S03']),
|
|
260
303
|
['S01', 'S02', 'S03'],
|
|
261
304
|
'S01..S03 → 3 individual deps',
|
|
262
305
|
);
|
|
263
306
|
|
|
264
|
-
|
|
307
|
+
assertEq(
|
|
265
308
|
expandDependencies(['S01']),
|
|
266
309
|
['S01'],
|
|
267
310
|
'single dep passes through',
|
|
268
311
|
);
|
|
269
312
|
|
|
270
|
-
|
|
313
|
+
assertEq(
|
|
271
314
|
expandDependencies(['S01', 'S03-S05']),
|
|
272
315
|
['S01', 'S03', 'S04', 'S05'],
|
|
273
316
|
'mixed single + range',
|
|
274
317
|
);
|
|
275
318
|
|
|
276
|
-
|
|
319
|
+
assertEq(
|
|
277
320
|
expandDependencies(['']),
|
|
278
321
|
[],
|
|
279
322
|
'empty string filtered out',
|
|
280
323
|
);
|
|
281
|
-
}
|
|
324
|
+
}
|
|
282
325
|
|
|
283
326
|
// ═══════════════════════════════════════════════════════════════════════
|
|
284
327
|
// O. No-separator colon-less: "S01:Title" (no space after colon)
|
|
285
328
|
// ═══════════════════════════════════════════════════════════════════════
|
|
286
|
-
|
|
329
|
+
|
|
330
|
+
console.log('\n=== O. No space after colon ===');
|
|
331
|
+
|
|
332
|
+
{
|
|
287
333
|
const content = '## S01:Foundation\n\n## S02:Features\n';
|
|
288
334
|
const slices = parseRoadmapSlices(content);
|
|
289
335
|
// The regex uses [:\s.—–-]* which allows colon with no space
|
|
290
|
-
|
|
291
|
-
}
|
|
336
|
+
assertEq(slices.length, 2, 'no-space-colon: 2 slices');
|
|
337
|
+
}
|
|
292
338
|
|
|
293
339
|
// ═══════════════════════════════════════════════════════════════════════
|
|
294
340
|
// P. Three-digit padded IDs
|
|
295
341
|
// ═══════════════════════════════════════════════════════════════════════
|
|
296
|
-
|
|
342
|
+
|
|
343
|
+
console.log('\n=== P. Three-digit padded IDs ===');
|
|
344
|
+
|
|
345
|
+
{
|
|
297
346
|
const content = '## S001: Foundation\n\n## S002: Features\n';
|
|
298
347
|
const slices = parseRoadmapSlices(content);
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
}
|
|
348
|
+
assertEq(slices.length, 2, 'three-digit: 2 slices');
|
|
349
|
+
assertEq(slices[0].id, 'S001', 'three-digit: S001');
|
|
350
|
+
}
|
|
302
351
|
|
|
303
352
|
// ═══════════════════════════════════════════════════════════════════════
|
|
304
353
|
// Q. Regression #1736: Table format under ## Slices
|
|
305
354
|
// ═══════════════════════════════════════════════════════════════════════
|
|
306
|
-
|
|
355
|
+
|
|
356
|
+
console.log('\n=== Q. #1736: Table format under ## Slices ===');
|
|
357
|
+
|
|
358
|
+
{
|
|
307
359
|
const content = [
|
|
308
360
|
'# M001: Test',
|
|
309
361
|
'',
|
|
@@ -319,19 +371,22 @@ test('Q. #1736: Table format under ## Slices', () => {
|
|
|
319
371
|
].join('\n');
|
|
320
372
|
|
|
321
373
|
const slices = parseRoadmapSlices(content);
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
374
|
+
assertEq(slices.length, 3, '#1736 table: 3 slices');
|
|
375
|
+
assertEq(slices[0].id, 'S01', '#1736 table: S01 id');
|
|
376
|
+
assertEq(slices[0].title, 'Setup Foundation', '#1736 table: S01 title');
|
|
377
|
+
assertEq(slices[0].done, true, '#1736 table: S01 done');
|
|
378
|
+
assertEq(slices[0].risk, 'low', '#1736 table: S01 risk');
|
|
379
|
+
assertEq(slices[1].done, false, '#1736 table: S02 not done');
|
|
380
|
+
assertEq(slices[2].done, true, '#1736 table: S03 done');
|
|
381
|
+
}
|
|
330
382
|
|
|
331
383
|
// ═══════════════════════════════════════════════════════════════════════
|
|
332
384
|
// R. Regression #1736: Table format under ## Slice Overview
|
|
333
385
|
// ═══════════════════════════════════════════════════════════════════════
|
|
334
|
-
|
|
386
|
+
|
|
387
|
+
console.log('\n=== R. #1736: Table format under ## Slice Overview ===');
|
|
388
|
+
|
|
389
|
+
{
|
|
335
390
|
const content = [
|
|
336
391
|
'# M002: Overview Heading',
|
|
337
392
|
'',
|
|
@@ -345,15 +400,18 @@ test('R. #1736: Table format under ## Slice Overview', () => {
|
|
|
345
400
|
].join('\n');
|
|
346
401
|
|
|
347
402
|
const slices = parseRoadmapSlices(content);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
}
|
|
403
|
+
assertEq(slices.length, 2, '#1736 overview: 2 slices');
|
|
404
|
+
assertEq(slices[0].done, true, '#1736 overview: S01 done');
|
|
405
|
+
assertEq(slices[1].done, false, '#1736 overview: S02 not done');
|
|
406
|
+
}
|
|
352
407
|
|
|
353
408
|
// ═══════════════════════════════════════════════════════════════════════
|
|
354
409
|
// S. Regression #1736: Table with Done/Complete text status
|
|
355
410
|
// ═══════════════════════════════════════════════════════════════════════
|
|
356
|
-
|
|
411
|
+
|
|
412
|
+
console.log('\n=== S. #1736: Table with text status ===');
|
|
413
|
+
|
|
414
|
+
{
|
|
357
415
|
const content = [
|
|
358
416
|
'# M003: Status Text',
|
|
359
417
|
'',
|
|
@@ -368,16 +426,19 @@ test('S. #1736: Table with text status', () => {
|
|
|
368
426
|
].join('\n');
|
|
369
427
|
|
|
370
428
|
const slices = parseRoadmapSlices(content);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
429
|
+
assertEq(slices.length, 3, '#1736 text status: 3 slices');
|
|
430
|
+
assertTrue(slices[0].done, '#1736 text status: Done = true');
|
|
431
|
+
assertTrue(!slices[1].done, '#1736 text status: Pending = false');
|
|
432
|
+
assertTrue(slices[2].done, '#1736 text status: Completed = true');
|
|
433
|
+
}
|
|
376
434
|
|
|
377
435
|
// ═══════════════════════════════════════════════════════════════════════
|
|
378
436
|
// T. Regression #1736: Checkbox format still works after table support
|
|
379
437
|
// ═══════════════════════════════════════════════════════════════════════
|
|
380
|
-
|
|
438
|
+
|
|
439
|
+
console.log('\n=== T. #1736: Checkbox format unchanged ===');
|
|
440
|
+
|
|
441
|
+
{
|
|
381
442
|
const content = [
|
|
382
443
|
'# M005: Unchanged',
|
|
383
444
|
'',
|
|
@@ -390,10 +451,16 @@ test('T. #1736: Checkbox format unchanged', () => {
|
|
|
390
451
|
].join('\n');
|
|
391
452
|
|
|
392
453
|
const slices = parseRoadmapSlices(content);
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}
|
|
398
|
-
|
|
454
|
+
assertEq(slices.length, 2, '#1736 checkbox compat: 2 slices');
|
|
455
|
+
assertEq(slices[0].done, true, '#1736 checkbox compat: S01 done');
|
|
456
|
+
assertEq(slices[0].demo, 'demo works.', '#1736 checkbox compat: demo');
|
|
457
|
+
assertEq(slices[1].done, false, '#1736 checkbox compat: S02 not done');
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
report();
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
main().catch((error) => {
|
|
464
|
+
console.error(error);
|
|
465
|
+
process.exit(1);
|
|
399
466
|
});
|