gsd-pi 2.45.0 → 2.46.0-dev.cc9d310
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/dist/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/auto/phases.js +27 -42
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-start.js +2 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +5 -4
- package/dist/resources/extensions/gsd/auto.js +12 -57
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +15 -12
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +9 -9
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +5 -3
- package/dist/resources/extensions/gsd/gsd-db.js +16 -3
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +7 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +7 -0
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +30 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +27 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +32 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +4 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +37 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- 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 +17 -17
- 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-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.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 +2 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +20 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +30 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +24 -44
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-start.ts +1 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +8 -5
- package/src/resources/extensions/gsd/auto.ts +7 -83
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -12
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +9 -17
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +6 -3
- package/src/resources/extensions/gsd/gsd-db.ts +16 -3
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +7 -3
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -8
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +7 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +8 -0
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +5 -13
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +264 -228
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +317 -250
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +2 -8
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +42 -3
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -7
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +38 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +35 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +38 -1
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +4 -9
- package/src/resources/extensions/gsd/worktree-resolver.ts +37 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{wUzEX1U3CmFcMry2SUDJn → ZIDqryyYDroh_8AnaAOSG}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
// GSD Extension — Legacy Markdown to Engine Migration
|
|
2
|
+
// Converts legacy markdown-only projects to engine state by parsing
|
|
3
|
+
// existing ROADMAP.md, *-PLAN.md, and *-SUMMARY.md files.
|
|
4
|
+
// Populates data into the already-existing v10 schema tables.
|
|
5
|
+
|
|
6
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { _getAdapter, transaction } from "./gsd-db.js";
|
|
9
|
+
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
10
|
+
|
|
11
|
+
// ─── needsAutoMigration ───────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns true when engine tables are empty AND a .gsd/milestones/ directory
|
|
15
|
+
* with markdown files exists — signals that this is a legacy project that needs
|
|
16
|
+
* one-time migration from markdown to engine state.
|
|
17
|
+
*/
|
|
18
|
+
export function needsAutoMigration(basePath: string): boolean {
|
|
19
|
+
const db = _getAdapter();
|
|
20
|
+
if (!db) return false;
|
|
21
|
+
|
|
22
|
+
// If milestones table already has rows, migration already done
|
|
23
|
+
try {
|
|
24
|
+
const row = db.prepare("SELECT COUNT(*) as cnt FROM milestones").get();
|
|
25
|
+
if (row && (row["cnt"] as number) > 0) return false;
|
|
26
|
+
} catch {
|
|
27
|
+
// Table might not exist yet — that's fine, we can still migrate
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Check if .gsd/milestones/ directory exists
|
|
32
|
+
const milestonesDir = join(basePath, ".gsd", "milestones");
|
|
33
|
+
if (!existsSync(milestonesDir)) return false;
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ─── migrateFromMarkdown ──────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Migrate legacy markdown-only .gsd/ projects to engine DB state.
|
|
42
|
+
* Reads .gsd/milestones/<ID>/ directories and parses ROADMAP.md, *-PLAN.md
|
|
43
|
+
* files. All inserts are wrapped in a transaction.
|
|
44
|
+
*
|
|
45
|
+
* This function only INSERTs data into the already-existing v10 schema tables
|
|
46
|
+
* (milestones, slices, tasks). It does NOT create tables or run migrations.
|
|
47
|
+
*
|
|
48
|
+
* Handles all directory shapes:
|
|
49
|
+
* - No DB: caller is responsible for openDatabase + initSchema before calling
|
|
50
|
+
* - Stale DB (empty tables): inserts succeed normally
|
|
51
|
+
* - No markdown at all: returns early with stderr message
|
|
52
|
+
* - Orphaned summary files: logs warning, skips without crash
|
|
53
|
+
*/
|
|
54
|
+
export function migrateFromMarkdown(basePath: string): void {
|
|
55
|
+
const db = _getAdapter();
|
|
56
|
+
if (!db) {
|
|
57
|
+
process.stderr.write("workflow-migration: no database connection, cannot migrate\n");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const milestonesDir = join(basePath, ".gsd", "milestones");
|
|
62
|
+
if (!existsSync(milestonesDir)) {
|
|
63
|
+
process.stderr.write("workflow-migration: no .gsd/milestones/ directory found, nothing to migrate\n");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Discover milestone directories (any directory at the top level of milestones/)
|
|
68
|
+
let milestoneDirs: string[];
|
|
69
|
+
try {
|
|
70
|
+
milestoneDirs = readdirSync(milestonesDir, { withFileTypes: true })
|
|
71
|
+
.filter(e => e.isDirectory())
|
|
72
|
+
.map(e => e.name);
|
|
73
|
+
} catch {
|
|
74
|
+
process.stderr.write("workflow-migration: failed to read milestones directory\n");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (milestoneDirs.length === 0) {
|
|
79
|
+
process.stderr.write("workflow-migration: no milestone directories found in .gsd/milestones/\n");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Collect all data before the transaction
|
|
84
|
+
const migratedMilestoneIds: string[] = [];
|
|
85
|
+
|
|
86
|
+
interface MilestoneInsert {
|
|
87
|
+
id: string;
|
|
88
|
+
title: string;
|
|
89
|
+
status: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface SliceInsert {
|
|
93
|
+
id: string;
|
|
94
|
+
milestoneId: string;
|
|
95
|
+
title: string;
|
|
96
|
+
status: string;
|
|
97
|
+
risk: string;
|
|
98
|
+
sequence: number;
|
|
99
|
+
forceDone: boolean;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface TaskInsert {
|
|
103
|
+
id: string;
|
|
104
|
+
sliceId: string;
|
|
105
|
+
milestoneId: string;
|
|
106
|
+
title: string;
|
|
107
|
+
status: string;
|
|
108
|
+
sequence: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const milestoneInserts: MilestoneInsert[] = [];
|
|
112
|
+
const sliceInserts: SliceInsert[] = [];
|
|
113
|
+
const taskInserts: TaskInsert[] = [];
|
|
114
|
+
|
|
115
|
+
for (const mId of milestoneDirs) {
|
|
116
|
+
const mDir = join(milestonesDir, mId);
|
|
117
|
+
|
|
118
|
+
// Determine milestone status: done if a milestone-level SUMMARY.md exists
|
|
119
|
+
const milestoneSummaryPath = join(mDir, "SUMMARY.md");
|
|
120
|
+
const milestoneDone = existsSync(milestoneSummaryPath);
|
|
121
|
+
const milestoneStatus = milestoneDone ? "done" : "active";
|
|
122
|
+
|
|
123
|
+
// Parse ROADMAP.md for slices list
|
|
124
|
+
const roadmapPath = join(mDir, "ROADMAP.md");
|
|
125
|
+
let roadmapSlices: Array<{ id: string; title: string; done: boolean; risk: string }> = [];
|
|
126
|
+
|
|
127
|
+
if (existsSync(roadmapPath)) {
|
|
128
|
+
try {
|
|
129
|
+
const roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
130
|
+
const roadmap = parseRoadmap(roadmapContent);
|
|
131
|
+
|
|
132
|
+
// Extract milestone title from roadmap
|
|
133
|
+
const mTitle = roadmap.title || mId;
|
|
134
|
+
|
|
135
|
+
milestoneInserts.push({ id: mId, title: mTitle, status: milestoneStatus });
|
|
136
|
+
|
|
137
|
+
roadmapSlices = roadmap.slices.map(s => ({
|
|
138
|
+
id: s.id,
|
|
139
|
+
title: s.title,
|
|
140
|
+
done: s.done,
|
|
141
|
+
risk: s.risk || "low",
|
|
142
|
+
}));
|
|
143
|
+
} catch (err) {
|
|
144
|
+
process.stderr.write(`workflow-migration: failed to parse ROADMAP.md for ${mId}: ${(err as Error).message}\n`);
|
|
145
|
+
// Still add milestone with ID as title
|
|
146
|
+
milestoneInserts.push({ id: mId, title: mId, status: milestoneStatus });
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
// No ROADMAP.md — add milestone entry anyway using directory name
|
|
150
|
+
milestoneInserts.push({ id: mId, title: mId, status: milestoneStatus });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
migratedMilestoneIds.push(mId);
|
|
154
|
+
|
|
155
|
+
// Collect slices from ROADMAP + their tasks from PLAN files
|
|
156
|
+
const knownSliceIds = new Set(roadmapSlices.map(s => s.id));
|
|
157
|
+
|
|
158
|
+
for (let sIdx = 0; sIdx < roadmapSlices.length; sIdx++) {
|
|
159
|
+
const slice = roadmapSlices[sIdx];
|
|
160
|
+
// Per Pitfall #5: if milestone is done, force all child slices to done
|
|
161
|
+
const sliceStatus = milestoneDone ? "done" : (slice.done ? "done" : "pending");
|
|
162
|
+
|
|
163
|
+
sliceInserts.push({
|
|
164
|
+
id: slice.id,
|
|
165
|
+
milestoneId: mId,
|
|
166
|
+
title: slice.title,
|
|
167
|
+
status: sliceStatus,
|
|
168
|
+
risk: slice.risk,
|
|
169
|
+
sequence: sIdx,
|
|
170
|
+
forceDone: milestoneDone,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Read *-PLAN.md for this slice
|
|
174
|
+
const planPath = join(mDir, `${slice.id}-PLAN.md`);
|
|
175
|
+
if (existsSync(planPath)) {
|
|
176
|
+
try {
|
|
177
|
+
const planContent = readFileSync(planPath, "utf-8");
|
|
178
|
+
const plan = parsePlan(planContent);
|
|
179
|
+
|
|
180
|
+
for (let tIdx = 0; tIdx < plan.tasks.length; tIdx++) {
|
|
181
|
+
const task = plan.tasks[tIdx];
|
|
182
|
+
// Per Pitfall #5: if milestone is done, force all tasks to done
|
|
183
|
+
const taskStatus = milestoneDone ? "done" : (task.done ? "done" : "pending");
|
|
184
|
+
taskInserts.push({
|
|
185
|
+
id: task.id,
|
|
186
|
+
sliceId: slice.id,
|
|
187
|
+
milestoneId: mId,
|
|
188
|
+
title: task.title,
|
|
189
|
+
status: taskStatus,
|
|
190
|
+
sequence: tIdx,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
} catch (err) {
|
|
194
|
+
process.stderr.write(`workflow-migration: failed to parse ${slice.id}-PLAN.md for ${mId}: ${(err as Error).message}\n`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Check for orphaned summary files (summary for a slice not in ROADMAP)
|
|
200
|
+
try {
|
|
201
|
+
const files = readdirSync(mDir);
|
|
202
|
+
const summaryFiles = files.filter(f => f.endsWith("-SUMMARY.md") && f !== "SUMMARY.md");
|
|
203
|
+
for (const summaryFile of summaryFiles) {
|
|
204
|
+
const sliceId = summaryFile.replace("-SUMMARY.md", "");
|
|
205
|
+
if (!knownSliceIds.has(sliceId)) {
|
|
206
|
+
process.stderr.write(`workflow-migration: orphaned summary file ${summaryFile} in ${mId} (slice not found in ROADMAP.md), skipping\n`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
} catch {
|
|
210
|
+
// Non-fatal
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Execute all inserts atomically
|
|
215
|
+
const now = new Date().toISOString();
|
|
216
|
+
if (migratedMilestoneIds.length === 0) {
|
|
217
|
+
process.stderr.write("workflow-migration: no milestones collected, nothing to insert\n");
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const placeholders = migratedMilestoneIds.map(() => "?").join(",");
|
|
222
|
+
transaction(() => {
|
|
223
|
+
// Clear existing data to handle stale DB shape (DELETE ... IN (...))
|
|
224
|
+
db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...migratedMilestoneIds);
|
|
225
|
+
db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...migratedMilestoneIds);
|
|
226
|
+
db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...migratedMilestoneIds);
|
|
227
|
+
|
|
228
|
+
// Insert milestones
|
|
229
|
+
const insertMilestone = db.prepare("INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)");
|
|
230
|
+
for (const m of milestoneInserts) {
|
|
231
|
+
insertMilestone.run(m.id, m.title, m.status, now);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Insert slices (using v10 column names: depends, sequence)
|
|
235
|
+
const insertSlice = db.prepare(
|
|
236
|
+
"INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
|
|
237
|
+
);
|
|
238
|
+
for (const s of sliceInserts) {
|
|
239
|
+
insertSlice.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, now);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Insert tasks (using v10 column names: sequence, blocker_discovered, full_summary_md)
|
|
243
|
+
const insertTask = db.prepare(
|
|
244
|
+
"INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
|
245
|
+
);
|
|
246
|
+
for (const t of taskInserts) {
|
|
247
|
+
insertTask.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ─── validateMigration ────────────────────────────────────────────────────
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* D-14: Validate that engine state matches what markdown parsers report.
|
|
256
|
+
* Compares milestone count, slice count, task count, and status distributions.
|
|
257
|
+
* Logs each discrepancy to stderr but does NOT throw.
|
|
258
|
+
* Returns array of discrepancy strings (empty = clean migration).
|
|
259
|
+
*/
|
|
260
|
+
export function validateMigration(basePath: string): { discrepancies: string[] } {
|
|
261
|
+
const db = _getAdapter();
|
|
262
|
+
if (!db) {
|
|
263
|
+
return { discrepancies: ["No database connection for validation"] };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const discrepancies: string[] = [];
|
|
267
|
+
|
|
268
|
+
// Get engine counts
|
|
269
|
+
const engMilestones = db.prepare("SELECT COUNT(*) as cnt FROM milestones").get();
|
|
270
|
+
const engSlices = db.prepare("SELECT COUNT(*) as cnt FROM slices").get();
|
|
271
|
+
const engTasks = db.prepare("SELECT COUNT(*) as cnt FROM tasks").get();
|
|
272
|
+
|
|
273
|
+
const engineMilestoneCount = engMilestones ? (engMilestones["cnt"] as number) : 0;
|
|
274
|
+
const engineSliceCount = engSlices ? (engSlices["cnt"] as number) : 0;
|
|
275
|
+
const engineTaskCount = engTasks ? (engTasks["cnt"] as number) : 0;
|
|
276
|
+
|
|
277
|
+
// Count from markdown
|
|
278
|
+
const milestonesDir = join(basePath, ".gsd", "milestones");
|
|
279
|
+
if (!existsSync(milestonesDir)) {
|
|
280
|
+
return { discrepancies };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
let mdMilestoneCount = 0;
|
|
284
|
+
let mdSliceCount = 0;
|
|
285
|
+
let mdTaskCount = 0;
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
const milestoneDirs = readdirSync(milestonesDir, { withFileTypes: true })
|
|
289
|
+
.filter(e => e.isDirectory())
|
|
290
|
+
.map(e => e.name);
|
|
291
|
+
|
|
292
|
+
mdMilestoneCount = milestoneDirs.length;
|
|
293
|
+
|
|
294
|
+
for (const mId of milestoneDirs) {
|
|
295
|
+
const mDir = join(milestonesDir, mId);
|
|
296
|
+
const roadmapPath = join(mDir, "ROADMAP.md");
|
|
297
|
+
|
|
298
|
+
if (existsSync(roadmapPath)) {
|
|
299
|
+
try {
|
|
300
|
+
const content = readFileSync(roadmapPath, "utf-8");
|
|
301
|
+
const roadmap = parseRoadmap(content);
|
|
302
|
+
mdSliceCount += roadmap.slices.length;
|
|
303
|
+
|
|
304
|
+
for (const slice of roadmap.slices) {
|
|
305
|
+
const planPath = join(mDir, `${slice.id}-PLAN.md`);
|
|
306
|
+
if (existsSync(planPath)) {
|
|
307
|
+
try {
|
|
308
|
+
const planContent = readFileSync(planPath, "utf-8");
|
|
309
|
+
const plan = parsePlan(planContent);
|
|
310
|
+
mdTaskCount += plan.tasks.length;
|
|
311
|
+
} catch {
|
|
312
|
+
// Skip unreadable plan
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
} catch {
|
|
317
|
+
// Skip unreadable roadmap
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
} catch {
|
|
322
|
+
return { discrepancies: ["Failed to read markdown for validation"] };
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Compare counts
|
|
326
|
+
if (engineMilestoneCount !== mdMilestoneCount) {
|
|
327
|
+
const msg = `Milestone count mismatch: engine=${engineMilestoneCount}, markdown=${mdMilestoneCount}`;
|
|
328
|
+
discrepancies.push(msg);
|
|
329
|
+
process.stderr.write(`workflow-migration: ${msg}\n`);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (engineSliceCount !== mdSliceCount) {
|
|
333
|
+
const msg = `Slice count mismatch: engine=${engineSliceCount}, markdown=${mdSliceCount}`;
|
|
334
|
+
discrepancies.push(msg);
|
|
335
|
+
process.stderr.write(`workflow-migration: ${msg}\n`);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (engineTaskCount !== mdTaskCount) {
|
|
339
|
+
const msg = `Task count mismatch: engine=${engineTaskCount}, markdown=${mdTaskCount}`;
|
|
340
|
+
discrepancies.push(msg);
|
|
341
|
+
process.stderr.write(`workflow-migration: ${msg}\n`);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return { discrepancies };
|
|
345
|
+
}
|