gsd-pi 2.65.0 → 2.66.0-dev.6c91c1f
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/mcp-server.js +6 -2
- package/dist/resources/extensions/browser-tools/capture.js +20 -1
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
- package/dist/resources/extensions/gsd/auto/finalize-timeout.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +2 -2
- package/dist/resources/extensions/gsd/auto/phases.js +48 -5
- package/dist/resources/extensions/gsd/auto/run-unit.js +13 -2
- package/dist/resources/extensions/gsd/auto/session.js +4 -0
- package/dist/resources/extensions/gsd/auto/types.js +2 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +2 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +99 -9
- package/dist/resources/extensions/gsd/auto-model-selection.js +7 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +17 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +40 -22
- package/dist/resources/extensions/gsd/auto-start.js +175 -12
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +10 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +29 -7
- package/dist/resources/extensions/gsd/auto.js +21 -15
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -3
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +31 -1
- package/dist/resources/extensions/gsd/commands/context.js +8 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -2
- package/dist/resources/extensions/gsd/commands-extensions.js +1 -1
- package/dist/resources/extensions/gsd/config-overlay.js +312 -0
- package/dist/resources/extensions/gsd/db-writer.js +13 -3
- package/dist/resources/extensions/gsd/detection.js +1 -1
- package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -0
- package/dist/resources/extensions/gsd/doctor.js +2 -1
- package/dist/resources/extensions/gsd/files.js +17 -0
- package/dist/resources/extensions/gsd/gitignore.js +1 -0
- package/dist/resources/extensions/gsd/gsd-db.js +47 -4
- package/dist/resources/extensions/gsd/guided-flow.js +220 -29
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/json-persistence.js +5 -2
- package/dist/resources/extensions/gsd/md-importer.js +14 -7
- package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
- package/dist/resources/extensions/gsd/notification-widget.js +2 -1
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +17 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +26 -5
- package/dist/resources/extensions/gsd/preferences-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +45 -1
- package/dist/resources/extensions/gsd/preferences.js +9 -2
- package/dist/resources/extensions/gsd/preparation.js +1092 -0
- package/dist/resources/extensions/gsd/prompt-validation.js +67 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +2 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
- package/dist/resources/extensions/gsd/quick.js +19 -15
- package/dist/resources/extensions/gsd/reactive-graph.js +12 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +24 -5
- package/dist/resources/extensions/gsd/safety/content-validator.js +3 -3
- package/dist/resources/extensions/gsd/session-lock.js +23 -1
- package/dist/resources/extensions/gsd/state.js +115 -28
- package/dist/resources/extensions/gsd/templates/context-enhanced.md +138 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -3
- package/dist/resources/extensions/gsd/tools/complete-slice.js +27 -6
- package/dist/resources/extensions/gsd/tools/complete-task.js +31 -7
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -5
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +5 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +119 -0
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +30 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +18 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +33 -16
- package/dist/resources/extensions/gsd/undo.js +3 -2
- package/dist/resources/extensions/gsd/workflow-events.js +1 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +7 -9
- package/dist/resources/extensions/gsd/workflow-reconcile.js +100 -9
- package/dist/resources/extensions/gsd/workflow-templates.js +11 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +5 -2
- package/dist/resources/extensions/gsd/worktree.js +9 -0
- package/dist/resources/extensions/shared/interview-ui.js +1 -1
- package/dist/resources/extensions/subagent/agents.js +19 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +1 -1
- 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/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/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/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/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 +2 -2
- 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 +11 -11
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/chunks/7471.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/6502.8874bcae249c02e1.js +9 -0
- 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-0c485498795110d6.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-a1c1e452c6b32d04.js → webpack-9fed74684e1c5bb1.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +30 -19
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +51 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +9 -9
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +10 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +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 +20 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +15 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.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 +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +80 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +37 -25
- package/packages/pi-coding-agent/src/core/sdk.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +20 -4
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +27 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +16 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +5 -0
- package/packages/pi-tui/dist/components/image.d.ts +2 -0
- package/packages/pi-tui/dist/components/image.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/image.js +4 -0
- package/packages/pi-tui/dist/components/image.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
- package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/image.test.js +32 -0
- package/packages/pi-tui/dist/components/image.test.js.map +1 -0
- package/packages/pi-tui/src/components/image.test.ts +36 -0
- package/packages/pi-tui/src/components/image.ts +5 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/capture.ts +19 -1
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +93 -0
- package/src/resources/extensions/gsd/auto/finalize-timeout.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop.ts +2 -2
- package/src/resources/extensions/gsd/auto/phases.ts +68 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +12 -2
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto/types.ts +5 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +2 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +110 -9
- package/src/resources/extensions/gsd/auto-model-selection.ts +7 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +16 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +31 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +29 -23
- package/src/resources/extensions/gsd/auto-start.ts +188 -10
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +28 -7
- package/src/resources/extensions/gsd/auto.ts +19 -8
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +16 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +5 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -1
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +36 -1
- package/src/resources/extensions/gsd/commands/context.ts +7 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +26 -2
- package/src/resources/extensions/gsd/commands-extensions.ts +1 -1
- package/src/resources/extensions/gsd/config-overlay.ts +331 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -3
- package/src/resources/extensions/gsd/detection.ts +1 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -1
- package/src/resources/extensions/gsd/files.ts +19 -0
- package/src/resources/extensions/gsd/gitignore.ts +1 -0
- package/src/resources/extensions/gsd/gsd-db.ts +46 -4
- package/src/resources/extensions/gsd/guided-flow.ts +254 -30
- package/src/resources/extensions/gsd/index.ts +1 -0
- package/src/resources/extensions/gsd/json-persistence.ts +6 -3
- package/src/resources/extensions/gsd/md-importer.ts +13 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
- package/src/resources/extensions/gsd/notification-widget.ts +2 -1
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +19 -11
- package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -7
- package/src/resources/extensions/gsd/preferences-types.ts +25 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +45 -1
- package/src/resources/extensions/gsd/preferences.ts +9 -2
- package/src/resources/extensions/gsd/preparation.ts +1419 -0
- package/src/resources/extensions/gsd/prompt-validation.ts +88 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +3 -3
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-prepared.md +424 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +6 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +23 -0
- package/src/resources/extensions/gsd/prompts/queue.md +2 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +2 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +56 -23
- package/src/resources/extensions/gsd/quick.ts +20 -15
- package/src/resources/extensions/gsd/reactive-graph.ts +18 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +21 -5
- package/src/resources/extensions/gsd/safety/content-validator.ts +3 -3
- package/src/resources/extensions/gsd/session-lock.ts +17 -1
- package/src/resources/extensions/gsd/state.ts +115 -26
- package/src/resources/extensions/gsd/templates/context-enhanced.md +138 -0
- package/src/resources/extensions/gsd/tests/adversarial-review-fixes.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +33 -2
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +11 -9
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +28 -30
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/integration-prepared-discussion.test.ts +525 -0
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +11 -10
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +284 -20
- package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/preparation.test.ts +1211 -0
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/prompt-builder.test.ts +669 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +6 -7
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +16 -17
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +13 -9
- package/src/resources/extensions/gsd/tests/worktree.test.ts +26 -9
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +127 -2
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +13 -3
- package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -6
- package/src/resources/extensions/gsd/tools/complete-task.ts +29 -7
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +11 -9
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +5 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +27 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +17 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +37 -17
- package/src/resources/extensions/gsd/types.ts +4 -0
- package/src/resources/extensions/gsd/undo.ts +3 -2
- package/src/resources/extensions/gsd/workflow-events.ts +5 -3
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +7 -8
- package/src/resources/extensions/gsd/workflow-reconcile.ts +109 -8
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +4 -2
- package/src/resources/extensions/gsd/worktree.ts +10 -0
- package/src/resources/extensions/shared/interview-ui.ts +1 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +8 -10
- package/src/resources/extensions/subagent/agents.ts +30 -6
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.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/{MRM3OSYIAa4HMDqVGQ9nt → _X1i-S7l1jZfb7lmIZozb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → _X1i-S7l1jZfb7lmIZozb}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3670 — needs-remediation verdict forces re-validation
|
|
3
|
+
*
|
|
4
|
+
* When validation returns needs-remediation, the state machine must route
|
|
5
|
+
* back to validating-milestone instead of completing-milestone. Without this,
|
|
6
|
+
* dispatch blocks completion for needs-remediation while state derives
|
|
7
|
+
* completing-milestone, creating a permanent deadlock.
|
|
8
|
+
*
|
|
9
|
+
* This structural test verifies the verdict === 'needs-remediation' guard
|
|
10
|
+
* exists at all three derivation paths in state.ts.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { describe, test } from 'node:test';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
|
|
22
|
+
const source = readFileSync(join(__dirname, '..', 'state.ts'), 'utf-8');
|
|
23
|
+
|
|
24
|
+
describe('needs-remediation revalidation guard (#3670)', () => {
|
|
25
|
+
test('verdict === needs-remediation guard exists in state.ts', () => {
|
|
26
|
+
const matches = source.match(/verdict\s*===\s*['"]needs-remediation['"]/g);
|
|
27
|
+
assert.ok(matches, 'verdict === "needs-remediation" check must exist in state.ts');
|
|
28
|
+
assert.ok(matches.length >= 2,
|
|
29
|
+
`Expected at least 2 needs-remediation guards (deriveStateFromDb + _deriveStateImpl), found ${matches.length}`);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('needsRevalidation variable is derived from verdict', () => {
|
|
33
|
+
assert.match(source, /needsRevalidation.*=.*verdict\s*===\s*['"]needs-remediation['"]/,
|
|
34
|
+
'needsRevalidation should incorporate verdict === "needs-remediation"');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('deriveStateFromDb path uses needs-remediation guard', () => {
|
|
38
|
+
assert.match(source, /!validationTerminal\s*\|\|\s*verdict\s*===\s*['"]needs-remediation['"]/,
|
|
39
|
+
'deriveStateFromDb should check !validationTerminal || verdict === "needs-remediation"');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('extractVerdict is called on validation content', () => {
|
|
43
|
+
const extractCalls = source.match(/extractVerdict\(validationContent\)/g);
|
|
44
|
+
assert.ok(extractCalls, 'extractVerdict should be called on validation content');
|
|
45
|
+
assert.ok(extractCalls.length >= 2,
|
|
46
|
+
`Expected at least 2 extractVerdict calls, found ${extractCalls.length}`);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3578 — note captures marked as executed
|
|
3
|
+
*
|
|
4
|
+
* Note-classified captures were stuck in "resolved but not executed" limbo
|
|
5
|
+
* because executeTriageResolutions only handled inject/replan/defer. The fix
|
|
6
|
+
* adds a filter for classification === "note" and calls markCaptureExecuted
|
|
7
|
+
* for each matching capture.
|
|
8
|
+
*
|
|
9
|
+
* Structural verification test — reads source to confirm the note filter
|
|
10
|
+
* and markCaptureExecuted call exist.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { describe, test } from 'node:test';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = dirname(__filename);
|
|
21
|
+
|
|
22
|
+
const source = readFileSync(join(__dirname, '..', 'triage-resolution.ts'), 'utf-8');
|
|
23
|
+
|
|
24
|
+
describe('note captures executed in triage resolution (#3578)', () => {
|
|
25
|
+
test('markCaptureExecuted is imported', () => {
|
|
26
|
+
assert.match(source, /markCaptureExecuted/,
|
|
27
|
+
'markCaptureExecuted should be imported');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('note classification filter exists', () => {
|
|
31
|
+
assert.match(source, /classification\s*===\s*"note"/,
|
|
32
|
+
'filter should check classification === "note"');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('note filter checks resolved status and not-executed', () => {
|
|
36
|
+
assert.match(source, /status\s*===\s*"resolved"\s*&&\s*!c\.executed\s*&&\s*c\.classification\s*===\s*"note"/,
|
|
37
|
+
'filter should check resolved + not-executed + note classification');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('markCaptureExecuted is called for note captures', () => {
|
|
41
|
+
// The source should call markCaptureExecuted for note captures
|
|
42
|
+
const noteSection = source.slice(source.indexOf('classification === "note"'));
|
|
43
|
+
assert.match(noteSection, /markCaptureExecuted\(basePath,\s*cap\.id\)/,
|
|
44
|
+
'markCaptureExecuted should be called for note captures');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// GSD2 — Tests for auditOrphanedMilestoneBranches bootstrap audit
|
|
2
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, realpathSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
8
|
+
|
|
9
|
+
import { auditOrphanedMilestoneBranches } from "../auto-start.ts";
|
|
10
|
+
import { openDatabase, closeDatabase, insertMilestone, updateMilestoneStatus } from "../gsd-db.ts";
|
|
11
|
+
|
|
12
|
+
function run(cmd: string, cwd: string): string {
|
|
13
|
+
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Create a temp git repo with .gsd structure and DB. */
|
|
17
|
+
function createRepo(): string {
|
|
18
|
+
const dir = realpathSync(mkdtempSync(join(tmpdir(), "orphan-audit-test-")));
|
|
19
|
+
run("git init", dir);
|
|
20
|
+
run("git config user.email test@test.com", dir);
|
|
21
|
+
run("git config user.name Test", dir);
|
|
22
|
+
|
|
23
|
+
writeFileSync(join(dir, "README.md"), "# test\n");
|
|
24
|
+
run("git add .", dir);
|
|
25
|
+
run("git commit -m init", dir);
|
|
26
|
+
run("git branch -M main", dir);
|
|
27
|
+
|
|
28
|
+
// Create .gsd structure on disk (not tracked in git)
|
|
29
|
+
mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true });
|
|
30
|
+
|
|
31
|
+
return dir;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe("auditOrphanedMilestoneBranches", () => {
|
|
35
|
+
let dir: string;
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
dir = createRepo();
|
|
39
|
+
openDatabase(join(dir, ".gsd", "gsd.db"));
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
closeDatabase();
|
|
44
|
+
rmSync(dir, { recursive: true, force: true });
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("no milestone branches → no-op", () => {
|
|
48
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
49
|
+
assert.deepStrictEqual(result.recovered, []);
|
|
50
|
+
assert.deepStrictEqual(result.warnings, []);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("skips in none isolation mode", () => {
|
|
54
|
+
// Create a milestone branch that would otherwise be detected
|
|
55
|
+
run("git branch milestone/M001", dir);
|
|
56
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
57
|
+
|
|
58
|
+
const result = auditOrphanedMilestoneBranches(dir, "none");
|
|
59
|
+
assert.deepStrictEqual(result.recovered, []);
|
|
60
|
+
assert.deepStrictEqual(result.warnings, []);
|
|
61
|
+
|
|
62
|
+
// Branch should still exist
|
|
63
|
+
const branches = run("git branch --list milestone/M001", dir);
|
|
64
|
+
assert.ok(branches.includes("milestone/M001"), "branch should be preserved in none mode");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("deletes merged branch for completed milestone", () => {
|
|
68
|
+
// Create milestone branch from main (so it's already merged)
|
|
69
|
+
run("git branch milestone/M001", dir);
|
|
70
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
71
|
+
|
|
72
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
73
|
+
|
|
74
|
+
assert.ok(result.recovered.length > 0, "should have recovered actions");
|
|
75
|
+
assert.ok(
|
|
76
|
+
result.recovered.some(r => r.includes("Deleted merged branch milestone/M001")),
|
|
77
|
+
"should report branch deletion",
|
|
78
|
+
);
|
|
79
|
+
assert.deepStrictEqual(result.warnings, []);
|
|
80
|
+
|
|
81
|
+
// Branch should be gone
|
|
82
|
+
const branches = run("git branch --list milestone/M001", dir);
|
|
83
|
+
assert.deepStrictEqual(branches, "", "branch should be deleted");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("warns about unmerged branch for completed milestone", () => {
|
|
87
|
+
// Create milestone branch with divergent commits (not merged into main)
|
|
88
|
+
run("git checkout -b milestone/M001", dir);
|
|
89
|
+
writeFileSync(join(dir, "feature.txt"), "new feature\n");
|
|
90
|
+
run("git add feature.txt", dir);
|
|
91
|
+
run("git commit -m \"add feature on milestone branch\"", dir);
|
|
92
|
+
run("git checkout main", dir);
|
|
93
|
+
|
|
94
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
95
|
+
|
|
96
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
97
|
+
|
|
98
|
+
assert.deepStrictEqual(result.recovered, [], "should not delete unmerged branch");
|
|
99
|
+
assert.ok(result.warnings.length > 0, "should have warnings");
|
|
100
|
+
assert.ok(
|
|
101
|
+
result.warnings.some(w => w.includes("NOT merged")),
|
|
102
|
+
"should warn about unmerged branch",
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// Branch should still exist (data safety)
|
|
106
|
+
const branches = run("git branch --list milestone/M001", dir);
|
|
107
|
+
assert.ok(branches.includes("milestone/M001"), "unmerged branch must be preserved");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("skips active (non-complete) milestone branches", () => {
|
|
111
|
+
run("git branch milestone/M001", dir);
|
|
112
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
113
|
+
|
|
114
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
115
|
+
|
|
116
|
+
assert.deepStrictEqual(result.recovered, []);
|
|
117
|
+
assert.deepStrictEqual(result.warnings, []);
|
|
118
|
+
|
|
119
|
+
// Branch should still exist
|
|
120
|
+
const branches = run("git branch --list milestone/M001", dir);
|
|
121
|
+
assert.ok(branches.includes("milestone/M001"), "active milestone branch should be preserved");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("cleans up orphaned worktree directory for merged milestone", () => {
|
|
125
|
+
// Create milestone branch (merged — same as main)
|
|
126
|
+
run("git branch milestone/M001", dir);
|
|
127
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
128
|
+
|
|
129
|
+
// Create orphaned worktree directory
|
|
130
|
+
const wtDir = join(dir, ".gsd", "worktrees", "M001");
|
|
131
|
+
mkdirSync(wtDir, { recursive: true });
|
|
132
|
+
writeFileSync(join(wtDir, "leftover.txt"), "orphaned file\n");
|
|
133
|
+
|
|
134
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
135
|
+
|
|
136
|
+
assert.ok(result.recovered.length > 0, "should have recovered actions");
|
|
137
|
+
assert.ok(
|
|
138
|
+
result.recovered.some(r => r.includes("worktree directory")),
|
|
139
|
+
"should report worktree cleanup",
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
// Worktree directory should be cleaned up
|
|
143
|
+
assert.ok(!existsSync(wtDir), "orphaned worktree directory should be removed");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("handles multiple milestones with mixed states", () => {
|
|
147
|
+
// M001: complete, branch merged → should clean up
|
|
148
|
+
run("git branch milestone/M001", dir);
|
|
149
|
+
insertMilestone({ id: "M001", title: "First", status: "complete" });
|
|
150
|
+
|
|
151
|
+
// M002: active, branch exists → should skip
|
|
152
|
+
run("git branch milestone/M002", dir);
|
|
153
|
+
insertMilestone({ id: "M002", title: "Second", status: "active" });
|
|
154
|
+
|
|
155
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
156
|
+
|
|
157
|
+
// M001 should be cleaned up
|
|
158
|
+
assert.ok(
|
|
159
|
+
result.recovered.some(r => r.includes("M001")),
|
|
160
|
+
"should clean up completed M001",
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
// M002 should not be touched
|
|
164
|
+
const branches = run("git branch --list milestone/M002", dir);
|
|
165
|
+
assert.ok(branches.includes("milestone/M002"), "active M002 branch should be preserved");
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("works in branch isolation mode", () => {
|
|
169
|
+
run("git branch milestone/M001", dir);
|
|
170
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
171
|
+
|
|
172
|
+
const result = auditOrphanedMilestoneBranches(dir, "branch");
|
|
173
|
+
|
|
174
|
+
assert.ok(result.recovered.length > 0, "should work in branch mode too");
|
|
175
|
+
assert.ok(
|
|
176
|
+
result.recovered.some(r => r.includes("Deleted merged branch")),
|
|
177
|
+
"should delete branch in branch mode",
|
|
178
|
+
);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("handles milestone in DB but no branch (no-op)", () => {
|
|
182
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
183
|
+
|
|
184
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
185
|
+
|
|
186
|
+
assert.deepStrictEqual(result.recovered, []);
|
|
187
|
+
assert.deepStrictEqual(result.warnings, []);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel research slices dispatch — structural tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies the dispatch rule and prompt builder exist with correct structure.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import test from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { join, dirname } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
|
|
13
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
|
|
15
|
+
const dispatchSrc = readFileSync(join(__dirname, "..", "auto-dispatch.ts"), "utf-8");
|
|
16
|
+
const promptsSrc = readFileSync(join(__dirname, "..", "auto-prompts.ts"), "utf-8");
|
|
17
|
+
const templatePath = join(__dirname, "..", "prompts", "parallel-research-slices.md");
|
|
18
|
+
const templateSrc = readFileSync(templatePath, "utf-8");
|
|
19
|
+
|
|
20
|
+
// ─── Dispatch rule ────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
test("dispatch: parallel-research-slices rule exists", () => {
|
|
23
|
+
assert.ok(
|
|
24
|
+
dispatchSrc.includes("parallel-research-slices"),
|
|
25
|
+
"dispatch table should have parallel-research-slices rule",
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("dispatch: parallel-research-slices requires 2+ slices", () => {
|
|
30
|
+
assert.ok(
|
|
31
|
+
dispatchSrc.includes("researchReadySlices.length < 2"),
|
|
32
|
+
"rule should require at least 2 slices for parallel dispatch",
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("dispatch: parallel-research-slices respects skip_research", () => {
|
|
37
|
+
const ruleIdx = dispatchSrc.indexOf("parallel-research-slices");
|
|
38
|
+
const ruleBlock = dispatchSrc.slice(ruleIdx, ruleIdx + 500);
|
|
39
|
+
assert.ok(
|
|
40
|
+
ruleBlock.includes("skip_research") || dispatchSrc.slice(ruleIdx - 300, ruleIdx).includes("skip_research"),
|
|
41
|
+
"rule should check skip_research preference",
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// ─── Prompt builder ───────────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
test("prompt: buildParallelResearchSlicesPrompt exported", () => {
|
|
48
|
+
assert.ok(
|
|
49
|
+
promptsSrc.includes("export async function buildParallelResearchSlicesPrompt"),
|
|
50
|
+
"buildParallelResearchSlicesPrompt should be exported",
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("prompt: builds per-slice subagent prompts", () => {
|
|
55
|
+
assert.ok(
|
|
56
|
+
promptsSrc.includes("buildResearchSlicePrompt"),
|
|
57
|
+
"parallel prompt builder should delegate to per-slice research prompts",
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// ─── Template ─────────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
test("template: parallel-research-slices.md has required variables", () => {
|
|
64
|
+
assert.ok(templateSrc.includes("{{sliceCount}}"), "template should use sliceCount");
|
|
65
|
+
assert.ok(templateSrc.includes("{{mid}}"), "template should use mid");
|
|
66
|
+
assert.ok(templateSrc.includes("{{subagentPrompts}}"), "template should use subagentPrompts");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// ─── Validate milestone prompt ────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
test("template: validate-milestone uses parallel reviewers", () => {
|
|
72
|
+
const validateSrc = readFileSync(join(__dirname, "..", "prompts", "validate-milestone.md"), "utf-8");
|
|
73
|
+
assert.ok(
|
|
74
|
+
validateSrc.includes("Reviewer A") && validateSrc.includes("Reviewer B") && validateSrc.includes("Reviewer C"),
|
|
75
|
+
"validate-milestone should dispatch 3 parallel reviewers",
|
|
76
|
+
);
|
|
77
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3671 — isGhostMilestone detects phantom queued rows
|
|
3
|
+
*
|
|
4
|
+
* gsd_milestone_generate_id inserts a DB row with status "queued" as a side
|
|
5
|
+
* effect. If the milestone is never planned, isGhostMilestone previously
|
|
6
|
+
* returned false for any milestone with a DB row, blocking the state machine.
|
|
7
|
+
*
|
|
8
|
+
* The fix makes isGhostMilestone treat a "queued" DB row with no disk
|
|
9
|
+
* artifacts (CONTEXT, ROADMAP, SUMMARY) as a ghost.
|
|
10
|
+
*
|
|
11
|
+
* This structural test verifies the dbRow.status === 'queued' guard exists.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { describe, test } from 'node:test';
|
|
15
|
+
import assert from 'node:assert/strict';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
|
|
20
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
21
|
+
const __dirname = dirname(__filename);
|
|
22
|
+
|
|
23
|
+
const source = readFileSync(join(__dirname, '..', 'state.ts'), 'utf-8');
|
|
24
|
+
|
|
25
|
+
describe('isGhostMilestone phantom queued detection (#3671)', () => {
|
|
26
|
+
test('isGhostMilestone function exists', () => {
|
|
27
|
+
assert.match(source, /export function isGhostMilestone\(/,
|
|
28
|
+
'isGhostMilestone should be exported');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('checks dbRow.status === queued', () => {
|
|
32
|
+
assert.match(source, /dbRow\.status\s*===\s*['"]queued['"]/,
|
|
33
|
+
'isGhostMilestone should check dbRow.status === "queued"');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('checks for CONTEXT disk artifact', () => {
|
|
37
|
+
assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']CONTEXT["']\)/,
|
|
38
|
+
'should check for CONTEXT file');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('checks for ROADMAP disk artifact', () => {
|
|
42
|
+
assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']ROADMAP["']\)/,
|
|
43
|
+
'should check for ROADMAP file');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('checks for SUMMARY disk artifact', () => {
|
|
47
|
+
assert.match(source, /resolveMilestoneFile\(basePath,\s*mid,\s*["']SUMMARY["']\)/,
|
|
48
|
+
'should check for SUMMARY file');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('returns !hasContent for queued rows (ghost if no artifacts)', () => {
|
|
52
|
+
assert.match(source, /return !hasContent/,
|
|
53
|
+
'should return !hasContent for queued phantom milestones');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3695 — insertMilestone defaults status to "queued"
|
|
3
|
+
*
|
|
4
|
+
* Milestones were being auto-created with status "active", causing phantom
|
|
5
|
+
* milestones to appear as active work. The fix defaults to "queued" so
|
|
6
|
+
* new milestones must be explicitly activated.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, test } from 'node:test';
|
|
10
|
+
import assert from 'node:assert/strict';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
|
|
18
|
+
const dbSrc = readFileSync(
|
|
19
|
+
join(__dirname, '..', 'gsd-db.ts'),
|
|
20
|
+
'utf-8',
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
describe('insertMilestone defaults status to queued (#3695)', () => {
|
|
24
|
+
test('insertMilestone function exists', () => {
|
|
25
|
+
assert.match(dbSrc, /export function insertMilestone\(/,
|
|
26
|
+
'insertMilestone should be exported from gsd-db.ts');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('default status is "queued" not "active"', () => {
|
|
30
|
+
// The status parameter should default to "queued" via nullish coalescing
|
|
31
|
+
assert.match(dbSrc, /m\.status\s*\?\?\s*"queued"/,
|
|
32
|
+
'insertMilestone should default status to "queued"');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('comment explains the rationale', () => {
|
|
36
|
+
assert.match(dbSrc, /never auto-create milestones as "active"/i,
|
|
37
|
+
'should have a comment explaining why default is queued');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3626 / #3649 — pre-execution-checks false positives
|
|
3
|
+
*
|
|
4
|
+
* Two sources of false positives were fixed:
|
|
5
|
+
* 1. normalizeFilePath did not strip backtick wrapping from LLM-generated
|
|
6
|
+
* paths like `src/foo.ts`, causing file-existence checks to fail (#3649).
|
|
7
|
+
* 2. checkFilePathConsistency checked both task.files and task.inputs, but
|
|
8
|
+
* task.files ("files likely touched") intentionally includes files that
|
|
9
|
+
* will be created by the task, so they don't need to pre-exist (#3626).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it } from 'node:test'
|
|
13
|
+
import assert from 'node:assert/strict'
|
|
14
|
+
import { normalizeFilePath, checkFilePathConsistency } from '../pre-execution-checks.ts'
|
|
15
|
+
import { readFileSync } from 'node:fs'
|
|
16
|
+
import { resolve } from 'node:path'
|
|
17
|
+
|
|
18
|
+
const src = readFileSync(
|
|
19
|
+
resolve(process.cwd(), 'src', 'resources', 'extensions', 'gsd', 'pre-execution-checks.ts'),
|
|
20
|
+
'utf-8',
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
describe('normalizeFilePath backtick stripping (#3649)', () => {
|
|
24
|
+
it('strips backticks from file paths', () => {
|
|
25
|
+
assert.equal(normalizeFilePath('`src/foo.ts`'), 'src/foo.ts')
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('strips backticks even when mixed with other normalization', () => {
|
|
29
|
+
assert.equal(normalizeFilePath('`./src//bar.ts`'), 'src/bar.ts')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('leaves normal paths unchanged', () => {
|
|
33
|
+
assert.equal(normalizeFilePath('src/foo.ts'), 'src/foo.ts')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('handles empty string', () => {
|
|
37
|
+
assert.equal(normalizeFilePath(''), '')
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
describe('checkFilePathConsistency checks task.inputs not task.files (#3626)', () => {
|
|
42
|
+
it('source uses only task.inputs in filesToCheck', () => {
|
|
43
|
+
// Verify the fix structurally: the spread should be [...task.inputs] only
|
|
44
|
+
const fnStart = src.indexOf('export function checkFilePathConsistency(')
|
|
45
|
+
assert.ok(fnStart !== -1, 'checkFilePathConsistency function must exist')
|
|
46
|
+
|
|
47
|
+
// Find the filesToCheck assignment
|
|
48
|
+
const filesToCheckLine = src.indexOf('filesToCheck', fnStart)
|
|
49
|
+
assert.ok(filesToCheckLine !== -1, 'filesToCheck assignment must exist')
|
|
50
|
+
|
|
51
|
+
// Extract the line
|
|
52
|
+
const lineEnd = src.indexOf('\n', filesToCheckLine)
|
|
53
|
+
const line = src.slice(filesToCheckLine, lineEnd)
|
|
54
|
+
|
|
55
|
+
// Must include task.inputs
|
|
56
|
+
assert.ok(
|
|
57
|
+
line.includes('task.inputs'),
|
|
58
|
+
'filesToCheck must reference task.inputs',
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
// Must NOT include task.files
|
|
62
|
+
assert.ok(
|
|
63
|
+
!line.includes('task.files'),
|
|
64
|
+
'filesToCheck must NOT reference task.files — files likely touched include ' +
|
|
65
|
+
'files the task will create, so they do not need to pre-exist',
|
|
66
|
+
)
|
|
67
|
+
})
|
|
68
|
+
})
|