gsd-pi 2.65.0 → 2.66.0-dev.1b4e601
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 +19 -19
- 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 +19 -19
- 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/dist/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +8 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/components/image.test.ts +36 -0
- package/packages/pi-tui/src/components/image.ts +5 -0
- package/packages/pi-tui/src/tui.ts +8 -2
- 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 → fcV2z87tmOazTEreFWNdG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{MRM3OSYIAa4HMDqVGQ9nt → fcV2z87tmOazTEreFWNdG}/_ssgManifest.js +0 -0
|
@@ -186,8 +186,10 @@ export async function handleReassessRoadmap(
|
|
|
186
186
|
});
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
// Insert new slices
|
|
190
|
-
|
|
189
|
+
// Insert new slices — assign sequence after existing slices (#3356)
|
|
190
|
+
const existingCount = getMilestoneSlices(params.milestoneId).length;
|
|
191
|
+
for (let i = 0; i < params.sliceChanges.added.length; i++) {
|
|
192
|
+
const added = params.sliceChanges.added[i]!;
|
|
191
193
|
insertSlice({
|
|
192
194
|
id: added.sliceId,
|
|
193
195
|
milestoneId: params.milestoneId,
|
|
@@ -196,6 +198,7 @@ export async function handleReassessRoadmap(
|
|
|
196
198
|
risk: added.risk,
|
|
197
199
|
depends: added.depends,
|
|
198
200
|
demo: added.demo ?? "",
|
|
201
|
+
sequence: existingCount + i + 1,
|
|
199
202
|
});
|
|
200
203
|
}
|
|
201
204
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// GSD — reopen-milestone tool handler
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* reopen-milestone handler — the core operation behind gsd_milestone_reopen.
|
|
5
|
+
*
|
|
6
|
+
* Resets a closed milestone back to "active", all of its slices to
|
|
7
|
+
* "in_progress", and all tasks to "pending". Cleans up stale filesystem
|
|
8
|
+
* artifacts so the DB-filesystem reconciler does not auto-correct
|
|
9
|
+
* entities back to "complete".
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
getMilestone,
|
|
14
|
+
getMilestoneSlices,
|
|
15
|
+
getSliceTasks,
|
|
16
|
+
updateMilestoneStatus,
|
|
17
|
+
updateSliceStatus,
|
|
18
|
+
updateTaskStatus,
|
|
19
|
+
transaction,
|
|
20
|
+
} from "../gsd-db.js";
|
|
21
|
+
import { invalidateStateCache } from "../state.js";
|
|
22
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
23
|
+
import { renderAllProjections } from "../workflow-projections.js";
|
|
24
|
+
import { writeManifest } from "../workflow-manifest.js";
|
|
25
|
+
import { appendEvent } from "../workflow-events.js";
|
|
26
|
+
import { logWarning } from "../workflow-logger.js";
|
|
27
|
+
import { debugLog } from "../debug-logger.js";
|
|
28
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
29
|
+
import { join } from "node:path";
|
|
30
|
+
import { resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache } from "../paths.js";
|
|
31
|
+
|
|
32
|
+
export interface ReopenMilestoneParams {
|
|
33
|
+
milestoneId: string;
|
|
34
|
+
reason?: string;
|
|
35
|
+
/** Optional caller-provided identity for audit trail */
|
|
36
|
+
actorName?: string;
|
|
37
|
+
/** Optional caller-provided reason this action was triggered */
|
|
38
|
+
triggerReason?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ReopenMilestoneResult {
|
|
42
|
+
milestoneId: string;
|
|
43
|
+
slicesReset: number;
|
|
44
|
+
tasksReset: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function handleReopenMilestone(
|
|
48
|
+
params: ReopenMilestoneParams,
|
|
49
|
+
basePath: string,
|
|
50
|
+
): Promise<ReopenMilestoneResult | { error: string }> {
|
|
51
|
+
// ── Validate required fields ────────────────────────────────────────────
|
|
52
|
+
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
53
|
+
return { error: "milestoneId is required and must be a non-empty string" };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
57
|
+
let guardError: string | null = null;
|
|
58
|
+
let slicesResetCount = 0;
|
|
59
|
+
let tasksResetCount = 0;
|
|
60
|
+
|
|
61
|
+
transaction(() => {
|
|
62
|
+
const milestone = getMilestone(params.milestoneId);
|
|
63
|
+
if (!milestone) {
|
|
64
|
+
guardError = `milestone not found: ${params.milestoneId}`;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!isClosedStatus(milestone.status)) {
|
|
68
|
+
guardError = `milestone ${params.milestoneId} is not closed (status: ${milestone.status}) — nothing to reopen`;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
updateMilestoneStatus(params.milestoneId, "active", null);
|
|
73
|
+
|
|
74
|
+
const slices = getMilestoneSlices(params.milestoneId);
|
|
75
|
+
slicesResetCount = slices.length;
|
|
76
|
+
|
|
77
|
+
for (const slice of slices) {
|
|
78
|
+
updateSliceStatus(params.milestoneId, slice.id, "in_progress");
|
|
79
|
+
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
80
|
+
tasksResetCount += tasks.length;
|
|
81
|
+
for (const task of tasks) {
|
|
82
|
+
updateTaskStatus(params.milestoneId, slice.id, task.id, "pending");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (guardError) {
|
|
88
|
+
return { error: guardError };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
92
|
+
invalidateStateCache();
|
|
93
|
+
|
|
94
|
+
// ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
|
|
95
|
+
// Without this, the DB-filesystem reconciler sees SUMMARY.md files and
|
|
96
|
+
// auto-corrects entities back to "complete", making reopen a no-op (#3161).
|
|
97
|
+
try {
|
|
98
|
+
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
99
|
+
if (milestoneDir) {
|
|
100
|
+
const milestoneSummary = join(milestoneDir, `${params.milestoneId}-SUMMARY.md`);
|
|
101
|
+
if (existsSync(milestoneSummary)) unlinkSync(milestoneSummary);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const slices = getMilestoneSlices(params.milestoneId);
|
|
105
|
+
for (const slice of slices) {
|
|
106
|
+
const sliceDir = resolveSlicePath(basePath, params.milestoneId, slice.id);
|
|
107
|
+
if (sliceDir) {
|
|
108
|
+
const sliceSummary = join(sliceDir, `${slice.id}-SUMMARY.md`);
|
|
109
|
+
if (existsSync(sliceSummary)) unlinkSync(sliceSummary);
|
|
110
|
+
const sliceUat = join(sliceDir, `${slice.id}-UAT.md`);
|
|
111
|
+
if (existsSync(sliceUat)) unlinkSync(sliceUat);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const tasksDir = resolveTasksDir(basePath, params.milestoneId, slice.id);
|
|
115
|
+
if (tasksDir) {
|
|
116
|
+
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
117
|
+
for (const task of tasks) {
|
|
118
|
+
const taskSummary = join(tasksDir, `${task.id}-SUMMARY.md`);
|
|
119
|
+
if (existsSync(taskSummary)) unlinkSync(taskSummary);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} catch (err) { debugLog("reopen-milestone-cleanup-failed", { milestoneId: params.milestoneId, error: String(err) }); }
|
|
124
|
+
clearPathCache();
|
|
125
|
+
|
|
126
|
+
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
127
|
+
try {
|
|
128
|
+
await renderAllProjections(basePath, params.milestoneId);
|
|
129
|
+
writeManifest(basePath);
|
|
130
|
+
appendEvent(basePath, {
|
|
131
|
+
cmd: "reopen-milestone",
|
|
132
|
+
params: {
|
|
133
|
+
milestoneId: params.milestoneId,
|
|
134
|
+
reason: params.reason ?? null,
|
|
135
|
+
slicesReset: slicesResetCount,
|
|
136
|
+
tasksReset: tasksResetCount,
|
|
137
|
+
},
|
|
138
|
+
ts: new Date().toISOString(),
|
|
139
|
+
actor: "agent",
|
|
140
|
+
actor_name: params.actorName,
|
|
141
|
+
trigger_reason: params.triggerReason,
|
|
142
|
+
});
|
|
143
|
+
} catch (hookErr) {
|
|
144
|
+
logWarning("tool", `reopen-milestone post-mutation hook warning: ${(hookErr as Error).message}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
milestoneId: params.milestoneId,
|
|
149
|
+
slicesReset: slicesResetCount,
|
|
150
|
+
tasksReset: tasksResetCount,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
@@ -25,6 +25,9 @@ import { renderAllProjections } from "../workflow-projections.js";
|
|
|
25
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
26
|
import { appendEvent } from "../workflow-events.js";
|
|
27
27
|
import { logWarning } from "../workflow-logger.js";
|
|
28
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
29
|
+
import { join } from "node:path";
|
|
30
|
+
import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
28
31
|
|
|
29
32
|
export interface ReopenSliceParams {
|
|
30
33
|
milestoneId: string;
|
|
@@ -96,6 +99,30 @@ export async function handleReopenSlice(
|
|
|
96
99
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
97
100
|
invalidateStateCache();
|
|
98
101
|
|
|
102
|
+
// ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
|
|
103
|
+
// Without this, the DB-filesystem reconciler sees SUMMARY.md files and
|
|
104
|
+
// auto-corrects tasks back to "complete", making reopen a no-op (#3161).
|
|
105
|
+
try {
|
|
106
|
+
const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
107
|
+
if (tasksDir) {
|
|
108
|
+
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
109
|
+
for (const task of tasks) {
|
|
110
|
+
const summaryPath = join(tasksDir, `${task.id}-SUMMARY.md`);
|
|
111
|
+
if (existsSync(summaryPath)) unlinkSync(summaryPath);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const sliceDir = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
|
|
115
|
+
if (sliceDir) {
|
|
116
|
+
const sliceSummary = join(sliceDir, `${params.sliceId}-SUMMARY.md`);
|
|
117
|
+
if (existsSync(sliceSummary)) unlinkSync(sliceSummary);
|
|
118
|
+
const sliceUat = join(sliceDir, `${params.sliceId}-UAT.md`);
|
|
119
|
+
if (existsSync(sliceUat)) unlinkSync(sliceUat);
|
|
120
|
+
}
|
|
121
|
+
} catch (cleanupErr) {
|
|
122
|
+
logWarning("tool", `reopen-slice artifact cleanup warning: ${(cleanupErr as Error).message}`);
|
|
123
|
+
}
|
|
124
|
+
clearPathCache();
|
|
125
|
+
|
|
99
126
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
100
127
|
try {
|
|
101
128
|
await renderAllProjections(basePath, params.milestoneId);
|
|
@@ -23,6 +23,9 @@ import { renderAllProjections } from "../workflow-projections.js";
|
|
|
23
23
|
import { writeManifest } from "../workflow-manifest.js";
|
|
24
24
|
import { appendEvent } from "../workflow-events.js";
|
|
25
25
|
import { logWarning } from "../workflow-logger.js";
|
|
26
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import { resolveTasksDir, clearPathCache } from "../paths.js";
|
|
26
29
|
|
|
27
30
|
export interface ReopenTaskParams {
|
|
28
31
|
milestoneId: string;
|
|
@@ -100,6 +103,20 @@ export async function handleReopenTask(
|
|
|
100
103
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
101
104
|
invalidateStateCache();
|
|
102
105
|
|
|
106
|
+
// ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
|
|
107
|
+
// Without this, the DB-filesystem reconciler sees the SUMMARY.md and
|
|
108
|
+
// auto-corrects the task back to "complete", making reopen a no-op (#3161).
|
|
109
|
+
try {
|
|
110
|
+
const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
111
|
+
if (tasksDir) {
|
|
112
|
+
const summaryPath = join(tasksDir, `${params.taskId}-SUMMARY.md`);
|
|
113
|
+
if (existsSync(summaryPath)) unlinkSync(summaryPath);
|
|
114
|
+
}
|
|
115
|
+
} catch (cleanupErr) {
|
|
116
|
+
logWarning("tool", `reopen-task artifact cleanup warning: ${(cleanupErr as Error).message}`);
|
|
117
|
+
}
|
|
118
|
+
clearPathCache();
|
|
119
|
+
|
|
103
120
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
104
121
|
try {
|
|
105
122
|
await renderAllProjections(basePath, params.milestoneId);
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* Also provides detectFileOverlap() for surfacing downstream impact on quick tasks.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { existsSync, mkdirSync, readFileSync,
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs";
|
|
14
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
14
15
|
import { join } from "node:path";
|
|
15
16
|
import { createRequire } from "node:module";
|
|
16
17
|
import { gsdRoot, milestonesDir } from "./paths.js";
|
|
@@ -65,10 +66,10 @@ export function executeInject(
|
|
|
65
66
|
const filesSection = content.indexOf("## Files Likely Touched");
|
|
66
67
|
if (filesSection !== -1) {
|
|
67
68
|
const updated = content.slice(0, filesSection) + newTask + "\n\n" + content.slice(filesSection);
|
|
68
|
-
|
|
69
|
+
atomicWriteSync(planPath, updated, "utf-8");
|
|
69
70
|
} else {
|
|
70
71
|
// No Files section — append at end
|
|
71
|
-
|
|
72
|
+
atomicWriteSync(planPath, content.trimEnd() + "\n\n" + newTask + "\n", "utf-8");
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
return newId;
|
|
@@ -105,7 +106,7 @@ export function executeReplan(
|
|
|
105
106
|
`will detect it and enter the replanning-slice phase.`,
|
|
106
107
|
].join("\n");
|
|
107
108
|
|
|
108
|
-
|
|
109
|
+
atomicWriteSync(triggerPath, content, "utf-8");
|
|
109
110
|
|
|
110
111
|
// Also write replan_triggered_at column for DB-backed detection
|
|
111
112
|
try {
|
|
@@ -183,7 +184,7 @@ export function executeBacktrack(
|
|
|
183
184
|
`3. Resume auto-mode — the state machine will re-enter discussion for the target`,
|
|
184
185
|
].join("\n");
|
|
185
186
|
|
|
186
|
-
|
|
187
|
+
atomicWriteSync(triggerPath, content, "utf-8");
|
|
187
188
|
|
|
188
189
|
// If we have a valid target, also reset that milestone's completion status
|
|
189
190
|
// so deriveState() will re-enter it as the active milestone.
|
|
@@ -194,7 +195,7 @@ export function executeBacktrack(
|
|
|
194
195
|
// Write a regression marker so the state machine knows this milestone
|
|
195
196
|
// needs re-discussion, not just re-execution
|
|
196
197
|
const regressionPath = join(targetDir, `${targetMilestoneId}-REGRESSION.md`);
|
|
197
|
-
|
|
198
|
+
atomicWriteSync(regressionPath, [
|
|
198
199
|
`# Milestone Regression`,
|
|
199
200
|
``,
|
|
200
201
|
`**From:** ${currentMilestoneId}`,
|
|
@@ -361,7 +362,7 @@ export function ensureDeferMilestoneDir(
|
|
|
361
362
|
``,
|
|
362
363
|
].join("\n");
|
|
363
364
|
|
|
364
|
-
|
|
365
|
+
atomicWriteSync(
|
|
365
366
|
join(msDir, `${targetMilestone}-CONTEXT-DRAFT.md`),
|
|
366
367
|
draftContent,
|
|
367
368
|
"utf-8",
|
|
@@ -479,15 +480,18 @@ export function executeTriageResolutions(
|
|
|
479
480
|
}
|
|
480
481
|
}
|
|
481
482
|
|
|
482
|
-
// Also process deferred
|
|
483
|
-
// milestone
|
|
484
|
-
|
|
485
|
-
|
|
483
|
+
// Also process deferred and milestone-class captures (#3542).
|
|
484
|
+
// A defer/milestone capture's "action" is the triage decision itself —
|
|
485
|
+
// once classified and resolved, the capture is done. The target milestone
|
|
486
|
+
// picks up the work naturally from its planning context.
|
|
487
|
+
const deferrable = loadAllCaptures(basePath).filter(
|
|
488
|
+
c => c.status === "resolved" && !c.executed &&
|
|
489
|
+
(c.classification === "defer" || (c.classification as string) === "milestone"),
|
|
486
490
|
);
|
|
487
|
-
if (
|
|
488
|
-
// Group
|
|
491
|
+
if (deferrable.length > 0) {
|
|
492
|
+
// Group captures that reference a specific milestone — create dirs as needed.
|
|
489
493
|
const byMilestone = new Map<string, CaptureEntry[]>();
|
|
490
|
-
for (const cap of
|
|
494
|
+
for (const cap of deferrable) {
|
|
491
495
|
const target = cap.resolution?.match(/\b(M\d{3}(?:-[a-z0-9]{6})?)\b/)?.[1];
|
|
492
496
|
if (target) {
|
|
493
497
|
const list = byMilestone.get(target) ?? [];
|
|
@@ -502,12 +506,28 @@ export function executeTriageResolutions(
|
|
|
502
506
|
if (created) {
|
|
503
507
|
result.deferredMilestones++;
|
|
504
508
|
result.actions.push(`Created milestone ${milestoneId} for ${captures.length} deferred capture(s)`);
|
|
505
|
-
for (const cap of captures) {
|
|
506
|
-
markCaptureExecuted(basePath, cap.id);
|
|
507
|
-
}
|
|
508
509
|
}
|
|
509
510
|
}
|
|
510
511
|
}
|
|
512
|
+
// Stamp ALL defer/milestone captures as executed (#3542 gaps 1-3).
|
|
513
|
+
// Previously only captures that triggered dir creation were stamped.
|
|
514
|
+
// Captures without a milestone ID in resolution text, or targeting an
|
|
515
|
+
// existing directory, were silently dropped — never stamped.
|
|
516
|
+
for (const cap of deferrable) {
|
|
517
|
+
if (!cap.executed) {
|
|
518
|
+
markCaptureExecuted(basePath, cap.id);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Mark note captures as executed — they're informational only, no action
|
|
524
|
+
// needed. Without this they stay in "resolved but not executed" limbo (#3578).
|
|
525
|
+
const notes = loadAllCaptures(basePath).filter(
|
|
526
|
+
c => c.status === "resolved" && !c.executed && c.classification === "note",
|
|
527
|
+
);
|
|
528
|
+
for (const cap of notes) {
|
|
529
|
+
markCaptureExecuted(basePath, cap.id);
|
|
530
|
+
result.actions.push(`Note acknowledged: ${cap.id} — "${cap.text}"`);
|
|
511
531
|
}
|
|
512
532
|
|
|
513
533
|
if (actionable.length === 0) return result;
|
|
@@ -453,6 +453,8 @@ export interface ParallelConfig {
|
|
|
453
453
|
budget_ceiling?: number;
|
|
454
454
|
merge_strategy: MergeStrategy;
|
|
455
455
|
auto_merge: AutoMergeMode;
|
|
456
|
+
/** Optional model override for parallel milestone workers (e.g. "claude-haiku-4-5"). */
|
|
457
|
+
worker_model?: string;
|
|
456
458
|
}
|
|
457
459
|
|
|
458
460
|
// ─── Reactive Task Execution Types ───────────────────────────────────────
|
|
@@ -479,6 +481,8 @@ export interface ReactiveExecutionConfig {
|
|
|
479
481
|
max_parallel: number;
|
|
480
482
|
/** Isolation mode for parallel tasks within a slice. Currently only "same-tree" is supported. */
|
|
481
483
|
isolation_mode: "same-tree";
|
|
484
|
+
/** Optional model override for subagents spawned during parallel execution. */
|
|
485
|
+
subagent_model?: string;
|
|
482
486
|
}
|
|
483
487
|
|
|
484
488
|
/** Per-slice reactive execution runtime state, persisted to disk. */
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
// handleResetSlice: Reset a slice and all its tasks, re-rendering plan + roadmap.
|
|
5
5
|
|
|
6
6
|
import type { ExtensionCommandContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
7
|
-
import { existsSync, readFileSync,
|
|
7
|
+
import { existsSync, readFileSync, unlinkSync, readdirSync } from "node:fs";
|
|
8
8
|
import { join, basename } from "node:path";
|
|
9
9
|
import { nativeRevertCommit, nativeRevertAbort } from "./native-git-bridge.js";
|
|
10
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
10
11
|
import { parseUnitId } from "./unit-id.js";
|
|
11
12
|
import { deriveState } from "./state.js";
|
|
12
13
|
import { invalidateAllCaches } from "./cache.js";
|
|
@@ -393,7 +394,7 @@ export function uncheckTaskInPlan(basePath: string, mid: string, sid: string, ti
|
|
|
393
394
|
const regex = new RegExp(`^(\\s*-\\s*)\\[x\\](\\s*\\**${tid}\\**[:\\s])`, "mi");
|
|
394
395
|
if (regex.test(content)) {
|
|
395
396
|
content = content.replace(regex, "$1[ ]$2");
|
|
396
|
-
|
|
397
|
+
atomicWriteSync(planFile, content);
|
|
397
398
|
return true;
|
|
398
399
|
}
|
|
399
400
|
return false;
|
|
@@ -19,10 +19,11 @@ export function getSessionId(): string {
|
|
|
19
19
|
// ─── Event Types ─────────────────────────────────────────────────────────
|
|
20
20
|
|
|
21
21
|
export interface WorkflowEvent {
|
|
22
|
-
|
|
22
|
+
v?: number; // schema version — omitted in v1 (legacy), 2 for current format
|
|
23
|
+
cmd: string; // e.g. "complete-task" (canonical: hyphens; legacy: underscores — both accepted by replay)
|
|
23
24
|
params: Record<string, unknown>;
|
|
24
|
-
ts: string;
|
|
25
|
-
hash: string;
|
|
25
|
+
ts: string; // ISO 8601
|
|
26
|
+
hash: string; // content hash (hex, 16 chars)
|
|
26
27
|
actor: "agent" | "system";
|
|
27
28
|
actor_name?: string; // e.g. "executor-agent-01" — caller-provided identity
|
|
28
29
|
trigger_reason?: string; // e.g. "plan-phase complete" — caller-provided causation
|
|
@@ -46,6 +47,7 @@ export function appendEvent(
|
|
|
46
47
|
.slice(0, 16);
|
|
47
48
|
|
|
48
49
|
const fullEvent: WorkflowEvent = {
|
|
50
|
+
v: 2,
|
|
49
51
|
...event,
|
|
50
52
|
hash,
|
|
51
53
|
session_id: ENGINE_SESSION_ID,
|
|
@@ -295,7 +295,7 @@ function _sanitizeForAudit(entry: LogEntry): LogEntry {
|
|
|
295
295
|
};
|
|
296
296
|
if (entry.context) {
|
|
297
297
|
// Allowlist: only persist known-safe structured keys
|
|
298
|
-
const SAFE_KEYS = new Set(["fn", "tool", "mid", "sid", "tid", "worktree"]);
|
|
298
|
+
const SAFE_KEYS = new Set(["fn", "tool", "mid", "sid", "tid", "worktree", "id", "error", "count"]);
|
|
299
299
|
const filtered: Record<string, string> = {};
|
|
300
300
|
for (const [k, v] of Object.entries(entry.context)) {
|
|
301
301
|
if (SAFE_KEYS.has(k)) {
|
|
@@ -16,6 +16,7 @@ import { atomicWriteSync } from "./atomic-write.js";
|
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { mkdirSync, existsSync } from "node:fs";
|
|
18
18
|
import { logWarning } from "./workflow-logger.js";
|
|
19
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
19
20
|
import { deriveState } from "./state.js";
|
|
20
21
|
import type { GSDState } from "./types.js";
|
|
21
22
|
|
|
@@ -55,7 +56,7 @@ export function renderPlanContent(sliceRow: SliceRow, taskRows: TaskRow[]): stri
|
|
|
55
56
|
lines.push("## Tasks");
|
|
56
57
|
|
|
57
58
|
for (const task of taskRows) {
|
|
58
|
-
const checkbox = task.status
|
|
59
|
+
const checkbox = isClosedStatus(task.status) ? "[x]" : "[ ]";
|
|
59
60
|
lines.push(`- ${checkbox} **${task.id}: ${task.title}** \u2014 ${task.description}`);
|
|
60
61
|
|
|
61
62
|
// Estimate subline (always present if non-empty)
|
|
@@ -125,7 +126,7 @@ export function renderRoadmapContent(milestoneRow: MilestoneRow, sliceRows: Slic
|
|
|
125
126
|
lines.push("|----|-------|------|---------|------|------------|");
|
|
126
127
|
|
|
127
128
|
for (const slice of sliceRows) {
|
|
128
|
-
const done = slice.status
|
|
129
|
+
const done = isClosedStatus(slice.status) ? "\u2705" : "\u2B1C";
|
|
129
130
|
|
|
130
131
|
// depends is already parsed to string[] by rowToSlice
|
|
131
132
|
let depends = "\u2014";
|
|
@@ -370,12 +371,10 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
370
371
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
371
372
|
|
|
372
373
|
for (const slice of sliceRows) {
|
|
373
|
-
//
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
logWarning("projection", `renderPlanProjection failed for ${milestoneId}/${slice.id}: ${(err as Error).message}`);
|
|
378
|
-
}
|
|
374
|
+
// PLAN.md is rendered by the authoritative markdown-renderer.js in
|
|
375
|
+
// plan-slice/replan-slice tools. Do NOT overwrite it here — the simplified
|
|
376
|
+
// projection is missing key sections (Must-Haves, Verification, Files
|
|
377
|
+
// Likely Touched) and corrupts multi-line task descriptions (#3651).
|
|
379
378
|
|
|
380
379
|
// Render SUMMARY.md for each completed task
|
|
381
380
|
const taskRows = getSliceTasks(milestoneId, slice.id);
|