gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
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 +30 -12
- package/dist/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +63 -77
- 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-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
- package/dist/resources/extensions/gsd/auto.js +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- 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 +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- 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 +17 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- 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 +5 -3
- 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/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- 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 +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -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 +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- 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 +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -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 +12 -12
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- 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 +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 +4 -4
- 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 +2 -2
- 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 +6 -6
- 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 +6 -6
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +12 -12
- 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-react-loadable-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/4024.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- 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/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +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/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -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/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.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/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.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/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.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 +13 -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 +40 -3
- 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/dist/core/resolve-config-value.test.js +34 -44
- 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 +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- 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/local-model-check.ts +45 -0
- 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 +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- 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-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
- package/src/resources/extensions/gsd/auto.ts +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- 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 +41 -27
- 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 +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -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 +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- 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 +5 -3
- 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/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- 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 +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- 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 +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +82 -103
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- 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 +24 -29
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- 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/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
- 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/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -47
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- 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/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- 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 +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -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 +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- 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 +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -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/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.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/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* 8. Discard milestone that has depends_on on others
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
+
import { describe, test } from 'node:test';
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
15
17
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
|
|
16
18
|
import { join } from 'node:path';
|
|
17
19
|
import { tmpdir } from 'node:os';
|
|
@@ -20,16 +22,6 @@ import { deriveState, invalidateStateCache } from '../state.ts';
|
|
|
20
22
|
import { clearPathCache } from '../paths.ts';
|
|
21
23
|
import { parkMilestone, unparkMilestone, discardMilestone } from '../milestone-actions.ts';
|
|
22
24
|
|
|
23
|
-
let passed = 0;
|
|
24
|
-
let failed = 0;
|
|
25
|
-
|
|
26
|
-
function assert(condition: boolean, message: string): void {
|
|
27
|
-
if (condition) { passed++; } else { failed++; console.error(` FAIL: ${message}`); }
|
|
28
|
-
}
|
|
29
|
-
function assertEq<T>(actual: T, expected: T, message: string): void {
|
|
30
|
-
if (JSON.stringify(actual) === JSON.stringify(expected)) { passed++; }
|
|
31
|
-
else { failed++; console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`); }
|
|
32
|
-
}
|
|
33
25
|
|
|
34
26
|
function createFixture(): string {
|
|
35
27
|
const b = mkdtempSync(join(tmpdir(), 'gsd-edge-'));
|
|
@@ -61,11 +53,10 @@ function createM(b: string, mid: string, opts?: { roadmap?: boolean; summary?: b
|
|
|
61
53
|
function clear(): void { clearPathCache(); invalidateStateCache(); }
|
|
62
54
|
function cleanup(b: string): void { rmSync(b, { recursive: true, force: true }); }
|
|
63
55
|
|
|
64
|
-
async function main(): Promise<void> {
|
|
65
|
-
|
|
66
56
|
// ─── EDGE 1: Discard breaks depends_on → downstream is BLOCKED ────────
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
|
|
58
|
+
describe('park-edge-cases', () => {
|
|
59
|
+
test('EDGE 1: Discard breaks depends_on chain', async () => {
|
|
69
60
|
const b = createFixture();
|
|
70
61
|
try {
|
|
71
62
|
createM(b, 'M001', { roadmap: true, summary: true }); // complete
|
|
@@ -78,17 +69,16 @@ async function main(): Promise<void> {
|
|
|
78
69
|
|
|
79
70
|
// M003 depends on M002 which no longer exists.
|
|
80
71
|
// M002 is not in completeMilestoneIds → dep is unmet → M003 stays pending
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
assert(s.blockers.length > 0, 'blockers list is not empty');
|
|
72
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 stays pending after dep discarded');
|
|
73
|
+
assert.deepStrictEqual(s.phase, 'blocked', 'system is blocked (unmet dep on deleted milestone)');
|
|
74
|
+
assert.ok(s.blockers.length > 0, 'blockers list is not empty');
|
|
84
75
|
} finally {
|
|
85
76
|
cleanup(b);
|
|
86
77
|
}
|
|
87
|
-
|
|
78
|
+
});
|
|
88
79
|
|
|
89
80
|
// ─── EDGE 2: Park blocks depends_on chain ────────────────────────────
|
|
90
|
-
|
|
91
|
-
{
|
|
81
|
+
test('EDGE 2: Park blocks depends_on chain', async () => {
|
|
92
82
|
const b = createFixture();
|
|
93
83
|
try {
|
|
94
84
|
createM(b, 'M001', { roadmap: true, summary: true });
|
|
@@ -98,17 +88,16 @@ async function main(): Promise<void> {
|
|
|
98
88
|
|
|
99
89
|
parkMilestone(b, 'M002', 'testing');
|
|
100
90
|
const s = await deriveState(b);
|
|
101
|
-
|
|
91
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 pending when M002 parked');
|
|
102
92
|
// System should be blocked since M003 deps unmet and M002 is parked
|
|
103
|
-
assert(s.activeMilestone === null, 'no active milestone (M002 parked, M003 dep-blocked)');
|
|
93
|
+
assert.ok(s.activeMilestone === null, 'no active milestone (M002 parked, M003 dep-blocked)');
|
|
104
94
|
} finally {
|
|
105
95
|
cleanup(b);
|
|
106
96
|
}
|
|
107
|
-
|
|
97
|
+
});
|
|
108
98
|
|
|
109
99
|
// ─── EDGE 3: Discard active, next (no deps) activates ────────────────
|
|
110
|
-
|
|
111
|
-
{
|
|
100
|
+
test('EDGE 3: Discard active → next activates', async () => {
|
|
112
101
|
const b = createFixture();
|
|
113
102
|
try {
|
|
114
103
|
createM(b, 'M001', { roadmap: true });
|
|
@@ -117,16 +106,15 @@ async function main(): Promise<void> {
|
|
|
117
106
|
|
|
118
107
|
discardMilestone(b, 'M001');
|
|
119
108
|
const s = await deriveState(b);
|
|
120
|
-
|
|
121
|
-
assert(s.phase !== 'blocked', 'not blocked');
|
|
109
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 becomes active');
|
|
110
|
+
assert.ok(s.phase !== 'blocked', 'not blocked');
|
|
122
111
|
} finally {
|
|
123
112
|
cleanup(b);
|
|
124
113
|
}
|
|
125
|
-
|
|
114
|
+
});
|
|
126
115
|
|
|
127
116
|
// ─── EDGE 4: Park all + discard all → clean pre-planning ─────────────
|
|
128
|
-
|
|
129
|
-
{
|
|
117
|
+
test('EDGE 4: Park all → discard all → clean state', async () => {
|
|
130
118
|
const b = createFixture();
|
|
131
119
|
try {
|
|
132
120
|
createM(b, 'M001', { roadmap: true });
|
|
@@ -138,30 +126,28 @@ async function main(): Promise<void> {
|
|
|
138
126
|
discardMilestone(b, 'M001');
|
|
139
127
|
discardMilestone(b, 'M002');
|
|
140
128
|
const s = await deriveState(b);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
assert(s.nextAction.includes('No milestones'), 'nextAction mentions no milestones');
|
|
129
|
+
assert.deepStrictEqual(s.activeMilestone, null, 'no active milestone');
|
|
130
|
+
assert.deepStrictEqual(s.phase, 'pre-planning', 'phase is pre-planning');
|
|
131
|
+
assert.deepStrictEqual(s.registry.length, 0, 'empty registry');
|
|
132
|
+
assert.ok(s.nextAction.includes('No milestones'), 'nextAction mentions no milestones');
|
|
145
133
|
} finally {
|
|
146
134
|
cleanup(b);
|
|
147
135
|
}
|
|
148
|
-
|
|
136
|
+
});
|
|
149
137
|
|
|
150
138
|
// ─── EDGE 5: Discard non-existent → graceful false ───────────────────
|
|
151
|
-
|
|
152
|
-
{
|
|
139
|
+
test('EDGE 5: Discard non-existent', () => {
|
|
153
140
|
const b = createFixture();
|
|
154
141
|
try {
|
|
155
142
|
const result = discardMilestone(b, 'M999');
|
|
156
|
-
assert(!result, 'returns false for non-existent');
|
|
143
|
+
assert.ok(!result, 'returns false for non-existent');
|
|
157
144
|
} finally {
|
|
158
145
|
cleanup(b);
|
|
159
146
|
}
|
|
160
|
-
|
|
147
|
+
});
|
|
161
148
|
|
|
162
149
|
// ─── EDGE 6: Queue order survives discards ───────────────────────────
|
|
163
|
-
|
|
164
|
-
{
|
|
150
|
+
test('EDGE 6: Queue order after discard', async () => {
|
|
165
151
|
const b = createFixture();
|
|
166
152
|
try {
|
|
167
153
|
createM(b, 'M001', { roadmap: true });
|
|
@@ -176,24 +162,23 @@ async function main(): Promise<void> {
|
|
|
176
162
|
|
|
177
163
|
// With custom queue order, M003 should be active first
|
|
178
164
|
let s = await deriveState(b);
|
|
179
|
-
|
|
165
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M003', 'M003 active (custom queue order)');
|
|
180
166
|
|
|
181
167
|
// Discard M003 → M001 should be next per queue order
|
|
182
168
|
discardMilestone(b, 'M003');
|
|
183
169
|
s = await deriveState(b);
|
|
184
|
-
|
|
170
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 active after M003 discarded');
|
|
185
171
|
|
|
186
172
|
// Verify queue order file was updated
|
|
187
173
|
const order = JSON.parse(readFileSync(join(b, '.gsd', 'QUEUE-ORDER.json'), 'utf-8'));
|
|
188
|
-
assert(!order.order.includes('M003'), 'M003 removed from QUEUE-ORDER.json');
|
|
174
|
+
assert.ok(!order.order.includes('M003'), 'M003 removed from QUEUE-ORDER.json');
|
|
189
175
|
} finally {
|
|
190
176
|
cleanup(b);
|
|
191
177
|
}
|
|
192
|
-
|
|
178
|
+
});
|
|
193
179
|
|
|
194
180
|
// ─── EDGE 7: Discard milestone that has deps on others ───────────────
|
|
195
|
-
|
|
196
|
-
{
|
|
181
|
+
test('EDGE 7: Discard a milestone that depends on others', async () => {
|
|
197
182
|
const b = createFixture();
|
|
198
183
|
try {
|
|
199
184
|
createM(b, 'M001', { roadmap: true });
|
|
@@ -203,23 +188,22 @@ async function main(): Promise<void> {
|
|
|
203
188
|
|
|
204
189
|
// M002 depends on M001, so M001 is active, M002 is pending
|
|
205
190
|
let s = await deriveState(b);
|
|
206
|
-
|
|
207
|
-
|
|
191
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 is active');
|
|
192
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M002')?.status, 'pending', 'M002 pending (dep on M001)');
|
|
208
193
|
|
|
209
194
|
// Discard M002 (the one WITH deps) — should be fine, M003 becomes pending
|
|
210
195
|
discardMilestone(b, 'M002');
|
|
211
196
|
s = await deriveState(b);
|
|
212
|
-
|
|
213
|
-
assert(!s.registry.some(e => e.id === 'M002'), 'M002 gone from registry');
|
|
214
|
-
|
|
197
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M001', 'M001 still active');
|
|
198
|
+
assert.ok(!s.registry.some(e => e.id === 'M002'), 'M002 gone from registry');
|
|
199
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'pending', 'M003 is pending (after M001)');
|
|
215
200
|
} finally {
|
|
216
201
|
cleanup(b);
|
|
217
202
|
}
|
|
218
|
-
|
|
203
|
+
});
|
|
219
204
|
|
|
220
205
|
// ─── EDGE 8: Park → Discard → state transitions ─────────────────────
|
|
221
|
-
|
|
222
|
-
{
|
|
206
|
+
test('EDGE 8: Park then discard same milestone', async () => {
|
|
223
207
|
const b = createFixture();
|
|
224
208
|
try {
|
|
225
209
|
createM(b, 'M001', { roadmap: true });
|
|
@@ -228,22 +212,21 @@ async function main(): Promise<void> {
|
|
|
228
212
|
|
|
229
213
|
parkMilestone(b, 'M001', 'temp');
|
|
230
214
|
let s = await deriveState(b);
|
|
231
|
-
|
|
215
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 active while M001 parked');
|
|
232
216
|
|
|
233
217
|
// Now discard the parked milestone
|
|
234
218
|
discardMilestone(b, 'M001');
|
|
235
219
|
s = await deriveState(b);
|
|
236
|
-
|
|
237
|
-
assert(!s.registry.some(e => e.id === 'M001'), 'M001 gone completely');
|
|
238
|
-
|
|
220
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M002', 'M002 still active');
|
|
221
|
+
assert.ok(!s.registry.some(e => e.id === 'M001'), 'M001 gone completely');
|
|
222
|
+
assert.deepStrictEqual(s.registry.length, 1, 'only M002 in registry');
|
|
239
223
|
} finally {
|
|
240
224
|
cleanup(b);
|
|
241
225
|
}
|
|
242
|
-
|
|
226
|
+
});
|
|
243
227
|
|
|
244
228
|
// ─── EDGE 9: Complete + parked + pending coexist ─────────────────────
|
|
245
|
-
|
|
246
|
-
{
|
|
229
|
+
test('EDGE 9: Mixed states — complete + parked + active', async () => {
|
|
247
230
|
const b = createFixture();
|
|
248
231
|
try {
|
|
249
232
|
createM(b, 'M001', { roadmap: true, summary: true }); // complete
|
|
@@ -254,23 +237,17 @@ async function main(): Promise<void> {
|
|
|
254
237
|
|
|
255
238
|
parkMilestone(b, 'M002', 'parked');
|
|
256
239
|
const s = await deriveState(b);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
240
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M001')?.status, 'complete', 'M001 complete');
|
|
241
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M002')?.status, 'parked', 'M002 parked');
|
|
242
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M003')?.status, 'active', 'M003 active');
|
|
243
|
+
assert.deepStrictEqual(s.registry.find(e => e.id === 'M004')?.status, 'pending', 'M004 pending');
|
|
244
|
+
assert.deepStrictEqual(s.activeMilestone?.id, 'M003', 'M003 is the active milestone');
|
|
245
|
+
assert.deepStrictEqual(s.progress?.milestones.done, 1, '1 done');
|
|
246
|
+
assert.deepStrictEqual(s.progress?.milestones.total, 4, '4 total');
|
|
264
247
|
} finally {
|
|
265
248
|
cleanup(b);
|
|
266
249
|
}
|
|
267
|
-
|
|
250
|
+
});
|
|
268
251
|
|
|
269
|
-
|
|
270
|
-
console.log(`\n${'='.repeat(50)}`);
|
|
271
|
-
console.log(`Results: ${passed} passed, ${failed} failed`);
|
|
272
|
-
if (failed > 0) process.exit(1);
|
|
273
|
-
else console.log('All edge cases passed!');
|
|
274
|
-
}
|
|
252
|
+
});
|
|
275
253
|
|
|
276
|
-
main().catch(e => { console.error(e); process.exit(1); });
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
|
|
2
4
|
import { join } from 'node:path';
|
|
3
5
|
import { tmpdir } from 'node:os';
|
|
@@ -6,26 +8,7 @@ import { deriveState, invalidateStateCache, getActiveMilestoneId } from '../stat
|
|
|
6
8
|
import { clearPathCache } from '../paths.ts';
|
|
7
9
|
import { parkMilestone, unparkMilestone, discardMilestone, isParked, getParkedReason } from '../milestone-actions.ts';
|
|
8
10
|
|
|
9
|
-
let passed = 0;
|
|
10
|
-
let failed = 0;
|
|
11
11
|
|
|
12
|
-
function assert(condition: boolean, message: string): void {
|
|
13
|
-
if (condition) {
|
|
14
|
-
passed++;
|
|
15
|
-
} else {
|
|
16
|
-
failed++;
|
|
17
|
-
console.error(` FAIL: ${message}`);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function assertEq<T>(actual: T, expected: T, message: string): void {
|
|
22
|
-
if (JSON.stringify(actual) === JSON.stringify(expected)) {
|
|
23
|
-
passed++;
|
|
24
|
-
} else {
|
|
25
|
-
failed++;
|
|
26
|
-
console.error(` FAIL: ${message} — expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
12
|
|
|
30
13
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
31
14
|
|
|
@@ -89,30 +72,28 @@ function clearCaches(): void {
|
|
|
89
72
|
// Tests
|
|
90
73
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
91
74
|
|
|
92
|
-
async function main(): Promise<void> {
|
|
93
|
-
|
|
94
75
|
// ─── Test 1: parkMilestone creates PARKED.md ──────────────────────────
|
|
95
|
-
|
|
96
|
-
|
|
76
|
+
|
|
77
|
+
describe('park-milestone', () => {
|
|
78
|
+
test('parkMilestone creates PARKED.md', () => {
|
|
97
79
|
const base = createFixtureBase();
|
|
98
80
|
try {
|
|
99
81
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
100
82
|
clearCaches();
|
|
101
83
|
|
|
102
84
|
const success = parkMilestone(base, 'M001', 'Priority shift');
|
|
103
|
-
assert(success, 'parkMilestone returns true');
|
|
104
|
-
assert(isParked(base, 'M001'), 'isParked returns true after parking');
|
|
85
|
+
assert.ok(success, 'parkMilestone returns true');
|
|
86
|
+
assert.ok(isParked(base, 'M001'), 'isParked returns true after parking');
|
|
105
87
|
|
|
106
88
|
const reason = getParkedReason(base, 'M001');
|
|
107
|
-
|
|
89
|
+
assert.deepStrictEqual(reason, 'Priority shift', 'reason matches');
|
|
108
90
|
} finally {
|
|
109
91
|
cleanup(base);
|
|
110
92
|
}
|
|
111
|
-
|
|
93
|
+
});
|
|
112
94
|
|
|
113
95
|
// ─── Test 2: parkMilestone is idempotent — fails if already parked ────
|
|
114
|
-
|
|
115
|
-
{
|
|
96
|
+
test('parkMilestone fails if already parked', () => {
|
|
116
97
|
const base = createFixtureBase();
|
|
117
98
|
try {
|
|
118
99
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -120,50 +101,47 @@ async function main(): Promise<void> {
|
|
|
120
101
|
|
|
121
102
|
parkMilestone(base, 'M001', 'First park');
|
|
122
103
|
const secondPark = parkMilestone(base, 'M001', 'Second park');
|
|
123
|
-
assert(!secondPark, 'second parkMilestone returns false');
|
|
124
|
-
|
|
104
|
+
assert.ok(!secondPark, 'second parkMilestone returns false');
|
|
105
|
+
assert.deepStrictEqual(getParkedReason(base, 'M001'), 'First park', 'reason unchanged from first park');
|
|
125
106
|
} finally {
|
|
126
107
|
cleanup(base);
|
|
127
108
|
}
|
|
128
|
-
|
|
109
|
+
});
|
|
129
110
|
|
|
130
111
|
// ─── Test 3: unparkMilestone removes PARKED.md ────────────────────────
|
|
131
|
-
|
|
132
|
-
{
|
|
112
|
+
test('unparkMilestone removes PARKED.md', () => {
|
|
133
113
|
const base = createFixtureBase();
|
|
134
114
|
try {
|
|
135
115
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
136
116
|
clearCaches();
|
|
137
117
|
|
|
138
118
|
parkMilestone(base, 'M001', 'Test reason');
|
|
139
|
-
assert(isParked(base, 'M001'), 'milestone is parked');
|
|
119
|
+
assert.ok(isParked(base, 'M001'), 'milestone is parked');
|
|
140
120
|
|
|
141
121
|
const success = unparkMilestone(base, 'M001');
|
|
142
|
-
assert(success, 'unparkMilestone returns true');
|
|
143
|
-
assert(!isParked(base, 'M001'), 'isParked returns false after unpark');
|
|
122
|
+
assert.ok(success, 'unparkMilestone returns true');
|
|
123
|
+
assert.ok(!isParked(base, 'M001'), 'isParked returns false after unpark');
|
|
144
124
|
} finally {
|
|
145
125
|
cleanup(base);
|
|
146
126
|
}
|
|
147
|
-
|
|
127
|
+
});
|
|
148
128
|
|
|
149
129
|
// ─── Test 4: unparkMilestone fails if not parked ──────────────────────
|
|
150
|
-
|
|
151
|
-
{
|
|
130
|
+
test('unparkMilestone fails if not parked', () => {
|
|
152
131
|
const base = createFixtureBase();
|
|
153
132
|
try {
|
|
154
133
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
155
134
|
clearCaches();
|
|
156
135
|
|
|
157
136
|
const result = unparkMilestone(base, 'M001');
|
|
158
|
-
assert(!result, 'unparkMilestone returns false when not parked');
|
|
137
|
+
assert.ok(!result, 'unparkMilestone returns false when not parked');
|
|
159
138
|
} finally {
|
|
160
139
|
cleanup(base);
|
|
161
140
|
}
|
|
162
|
-
|
|
141
|
+
});
|
|
163
142
|
|
|
164
143
|
// ─── Test 5: deriveState returns 'parked' status ──────────────────────
|
|
165
|
-
|
|
166
|
-
{
|
|
144
|
+
test('deriveState returns parked status', async () => {
|
|
167
145
|
const base = createFixtureBase();
|
|
168
146
|
try {
|
|
169
147
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -173,16 +151,15 @@ async function main(): Promise<void> {
|
|
|
173
151
|
|
|
174
152
|
const state = await deriveState(base);
|
|
175
153
|
const entry = state.registry.find(e => e.id === 'M001');
|
|
176
|
-
assert(!!entry, 'M001 in registry');
|
|
177
|
-
|
|
154
|
+
assert.ok(!!entry, 'M001 in registry');
|
|
155
|
+
assert.deepStrictEqual(entry?.status, 'parked', 'status is parked');
|
|
178
156
|
} finally {
|
|
179
157
|
cleanup(base);
|
|
180
158
|
}
|
|
181
|
-
|
|
159
|
+
});
|
|
182
160
|
|
|
183
161
|
// ─── Test 6: deriveState skips parked milestone for active ─────────────
|
|
184
|
-
|
|
185
|
-
{
|
|
162
|
+
test('deriveState skips parked milestone', async () => {
|
|
186
163
|
const base = createFixtureBase();
|
|
187
164
|
try {
|
|
188
165
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -191,29 +168,28 @@ async function main(): Promise<void> {
|
|
|
191
168
|
|
|
192
169
|
// Before park: M001 is active
|
|
193
170
|
const stateBefore = await deriveState(base);
|
|
194
|
-
|
|
171
|
+
assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M001', 'before park: M001 is active');
|
|
195
172
|
|
|
196
173
|
parkMilestone(base, 'M001', 'Testing');
|
|
197
174
|
|
|
198
175
|
// After park: M002 becomes active
|
|
199
176
|
const stateAfter = await deriveState(base);
|
|
200
|
-
|
|
177
|
+
assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M002', 'after park: M002 is active');
|
|
201
178
|
|
|
202
179
|
// M001 still in registry as parked
|
|
203
180
|
const m001 = stateAfter.registry.find(e => e.id === 'M001');
|
|
204
|
-
|
|
181
|
+
assert.deepStrictEqual(m001?.status, 'parked', 'M001 has parked status');
|
|
205
182
|
|
|
206
183
|
// M002 is active
|
|
207
184
|
const m002 = stateAfter.registry.find(e => e.id === 'M002');
|
|
208
|
-
|
|
185
|
+
assert.deepStrictEqual(m002?.status, 'active', 'M002 has active status');
|
|
209
186
|
} finally {
|
|
210
187
|
cleanup(base);
|
|
211
188
|
}
|
|
212
|
-
|
|
189
|
+
});
|
|
213
190
|
|
|
214
191
|
// ─── Test 7: getActiveMilestoneId skips parked ────────────────────────
|
|
215
|
-
|
|
216
|
-
{
|
|
192
|
+
test('getActiveMilestoneId skips parked', async () => {
|
|
217
193
|
const base = createFixtureBase();
|
|
218
194
|
try {
|
|
219
195
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -223,15 +199,14 @@ async function main(): Promise<void> {
|
|
|
223
199
|
parkMilestone(base, 'M001', 'Testing');
|
|
224
200
|
|
|
225
201
|
const activeId = await getActiveMilestoneId(base);
|
|
226
|
-
|
|
202
|
+
assert.deepStrictEqual(activeId, 'M002', 'getActiveMilestoneId returns M002');
|
|
227
203
|
} finally {
|
|
228
204
|
cleanup(base);
|
|
229
205
|
}
|
|
230
|
-
|
|
206
|
+
});
|
|
231
207
|
|
|
232
208
|
// ─── Test 8: Parked milestone does NOT satisfy depends_on ─────────────
|
|
233
|
-
|
|
234
|
-
{
|
|
209
|
+
test('Parked milestone does not satisfy depends_on', async () => {
|
|
235
210
|
const base = createFixtureBase();
|
|
236
211
|
try {
|
|
237
212
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -243,18 +218,17 @@ async function main(): Promise<void> {
|
|
|
243
218
|
const state = await deriveState(base);
|
|
244
219
|
// M001 is parked, M002 depends on M001 → M002 should be pending, not active
|
|
245
220
|
const m002 = state.registry.find(e => e.id === 'M002');
|
|
246
|
-
|
|
221
|
+
assert.deepStrictEqual(m002?.status, 'pending', 'M002 stays pending when M001 is parked');
|
|
247
222
|
|
|
248
223
|
// No active milestone (both are blocked/parked)
|
|
249
|
-
|
|
224
|
+
assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone');
|
|
250
225
|
} finally {
|
|
251
226
|
cleanup(base);
|
|
252
227
|
}
|
|
253
|
-
|
|
228
|
+
});
|
|
254
229
|
|
|
255
230
|
// ─── Test 9: Park then unpark restores correct status ─────────────────
|
|
256
|
-
|
|
257
|
-
{
|
|
231
|
+
test('Park then unpark restores status', async () => {
|
|
258
232
|
const base = createFixtureBase();
|
|
259
233
|
try {
|
|
260
234
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -264,43 +238,41 @@ async function main(): Promise<void> {
|
|
|
264
238
|
// Park M001
|
|
265
239
|
parkMilestone(base, 'M001', 'Testing');
|
|
266
240
|
const stateParked = await deriveState(base);
|
|
267
|
-
|
|
241
|
+
assert.deepStrictEqual(stateParked.activeMilestone?.id, 'M002', 'while parked: M002 is active');
|
|
268
242
|
|
|
269
243
|
// Unpark M001 — M001 should become active again (it's first in queue)
|
|
270
244
|
unparkMilestone(base, 'M001');
|
|
271
245
|
const stateUnparked = await deriveState(base);
|
|
272
|
-
|
|
273
|
-
|
|
246
|
+
assert.deepStrictEqual(stateUnparked.activeMilestone?.id, 'M001', 'after unpark: M001 is active again');
|
|
247
|
+
assert.deepStrictEqual(stateUnparked.registry.find(e => e.id === 'M001')?.status, 'active', 'M001 is active status');
|
|
274
248
|
} finally {
|
|
275
249
|
cleanup(base);
|
|
276
250
|
}
|
|
277
|
-
|
|
251
|
+
});
|
|
278
252
|
|
|
279
253
|
// ─── Test 10: discardMilestone removes directory ──────────────────────
|
|
280
|
-
|
|
281
|
-
{
|
|
254
|
+
test('discardMilestone removes directory', async () => {
|
|
282
255
|
const base = createFixtureBase();
|
|
283
256
|
try {
|
|
284
257
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
285
258
|
clearCaches();
|
|
286
259
|
|
|
287
260
|
const mDir = join(base, '.gsd', 'milestones', 'M001');
|
|
288
|
-
assert(existsSync(mDir), 'milestone dir exists before discard');
|
|
261
|
+
assert.ok(existsSync(mDir), 'milestone dir exists before discard');
|
|
289
262
|
|
|
290
263
|
const success = discardMilestone(base, 'M001');
|
|
291
|
-
assert(success, 'discardMilestone returns true');
|
|
292
|
-
assert(!existsSync(mDir), 'milestone dir removed after discard');
|
|
264
|
+
assert.ok(success, 'discardMilestone returns true');
|
|
265
|
+
assert.ok(!existsSync(mDir), 'milestone dir removed after discard');
|
|
293
266
|
|
|
294
267
|
const state = await deriveState(base);
|
|
295
|
-
assert(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
|
|
268
|
+
assert.ok(!state.registry.some(e => e.id === 'M001'), 'M001 not in registry after discard');
|
|
296
269
|
} finally {
|
|
297
270
|
cleanup(base);
|
|
298
271
|
}
|
|
299
|
-
|
|
272
|
+
});
|
|
300
273
|
|
|
301
274
|
// ─── Test 11: discardMilestone updates queue order ────────────────────
|
|
302
|
-
|
|
303
|
-
{
|
|
275
|
+
test('discardMilestone updates queue order', () => {
|
|
304
276
|
const base = createFixtureBase();
|
|
305
277
|
try {
|
|
306
278
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -315,16 +287,15 @@ async function main(): Promise<void> {
|
|
|
315
287
|
|
|
316
288
|
// Queue order should no longer include M001
|
|
317
289
|
const queueContent = JSON.parse(readFileSync(queuePath, 'utf-8'));
|
|
318
|
-
assert(!queueContent.order.includes('M001'), 'M001 removed from queue order');
|
|
319
|
-
assert(queueContent.order.includes('M002'), 'M002 still in queue order');
|
|
290
|
+
assert.ok(!queueContent.order.includes('M001'), 'M001 removed from queue order');
|
|
291
|
+
assert.ok(queueContent.order.includes('M002'), 'M002 still in queue order');
|
|
320
292
|
} finally {
|
|
321
293
|
cleanup(base);
|
|
322
294
|
}
|
|
323
|
-
|
|
295
|
+
});
|
|
324
296
|
|
|
325
297
|
// ─── Test 12: All milestones parked → no active milestone ─────────────
|
|
326
|
-
|
|
327
|
-
{
|
|
298
|
+
test('All milestones parked → no active', async () => {
|
|
328
299
|
const base = createFixtureBase();
|
|
329
300
|
try {
|
|
330
301
|
createMilestone(base, 'M001', { withRoadmap: true });
|
|
@@ -333,18 +304,17 @@ async function main(): Promise<void> {
|
|
|
333
304
|
parkMilestone(base, 'M001', 'Testing');
|
|
334
305
|
|
|
335
306
|
const state = await deriveState(base);
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
assert(state.registry.length === 1, 'registry still has 1 entry');
|
|
339
|
-
|
|
307
|
+
assert.deepStrictEqual(state.activeMilestone, null, 'no active milestone when all parked');
|
|
308
|
+
assert.deepStrictEqual(state.phase, 'pre-planning', 'phase is pre-planning');
|
|
309
|
+
assert.ok(state.registry.length === 1, 'registry still has 1 entry');
|
|
310
|
+
assert.deepStrictEqual(state.registry[0]?.status, 'parked', 'entry is parked');
|
|
340
311
|
} finally {
|
|
341
312
|
cleanup(base);
|
|
342
313
|
}
|
|
343
|
-
|
|
314
|
+
});
|
|
344
315
|
|
|
345
316
|
// ─── Test 13: Parked milestone without roadmap ────────────────────────
|
|
346
|
-
|
|
347
|
-
{
|
|
317
|
+
test('Park milestone without roadmap', async () => {
|
|
348
318
|
const base = createFixtureBase();
|
|
349
319
|
try {
|
|
350
320
|
createMilestone(base, 'M001'); // No roadmap
|
|
@@ -354,16 +324,15 @@ async function main(): Promise<void> {
|
|
|
354
324
|
parkMilestone(base, 'M001', 'Not ready yet');
|
|
355
325
|
|
|
356
326
|
const state = await deriveState(base);
|
|
357
|
-
|
|
358
|
-
|
|
327
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M002', 'M002 is active when M001 (no roadmap) is parked');
|
|
328
|
+
assert.deepStrictEqual(state.registry.find(e => e.id === 'M001')?.status, 'parked', 'M001 is parked');
|
|
359
329
|
} finally {
|
|
360
330
|
cleanup(base);
|
|
361
331
|
}
|
|
362
|
-
|
|
332
|
+
});
|
|
363
333
|
|
|
364
334
|
// ─── Test 14: Progress counts with parked milestone ───────────────────
|
|
365
|
-
|
|
366
|
-
{
|
|
335
|
+
test('Progress counts with parked', async () => {
|
|
367
336
|
const base = createFixtureBase();
|
|
368
337
|
try {
|
|
369
338
|
createMilestone(base, 'M001', { withRoadmap: true, withSummary: true }); // complete
|
|
@@ -374,28 +343,12 @@ async function main(): Promise<void> {
|
|
|
374
343
|
parkMilestone(base, 'M002', 'Parked');
|
|
375
344
|
|
|
376
345
|
const state = await deriveState(base);
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
346
|
+
assert.deepStrictEqual(state.progress?.milestones.done, 1, '1 complete milestone');
|
|
347
|
+
assert.deepStrictEqual(state.progress?.milestones.total, 3, '3 total milestones (including parked)');
|
|
348
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M003', 'M003 is active');
|
|
380
349
|
} finally {
|
|
381
350
|
cleanup(base);
|
|
382
351
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
386
|
-
// Results
|
|
387
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
388
|
-
|
|
389
|
-
console.log(`\n${'='.repeat(40)}`);
|
|
390
|
-
console.log(`Results: ${passed} passed, ${failed} failed`);
|
|
391
|
-
if (failed > 0) {
|
|
392
|
-
process.exit(1);
|
|
393
|
-
} else {
|
|
394
|
-
console.log('All tests passed ✓');
|
|
395
|
-
}
|
|
396
|
-
}
|
|
352
|
+
});
|
|
397
353
|
|
|
398
|
-
main().catch((error) => {
|
|
399
|
-
console.error(error);
|
|
400
|
-
process.exit(1);
|
|
401
354
|
});
|