gsd-pi 2.43.0-dev.5717b75 → 2.43.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -23
- package/dist/cli.js +3 -18
- package/dist/loader.js +1 -3
- package/dist/resource-loader.js +6 -39
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +4 -52
- package/dist/resources/extensions/async-jobs/await-tool.js +0 -5
- package/dist/resources/extensions/async-jobs/index.js +0 -2
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/phases.js +3 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +20 -18
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +113 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +151 -107
- package/dist/resources/extensions/gsd/auto-recovery.js +82 -135
- package/dist/resources/extensions/gsd/auto-start.js +11 -8
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +32 -17
- package/dist/resources/extensions/gsd/auto.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +546 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -11
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +62 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/detection.js +0 -19
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -29
- package/dist/resources/extensions/gsd/doctor-checks.js +29 -42
- package/dist/resources/extensions/gsd/doctor-providers.js +0 -10
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/forensics.js +0 -84
- package/dist/resources/extensions/gsd/git-service.js +69 -3
- package/dist/resources/extensions/gsd/gsd-db.js +783 -201
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +871 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +0 -1
- package/dist/resources/extensions/gsd/preferences.js +8 -59
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/forensics.md +0 -2
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -4
- package/dist/resources/extensions/gsd/reactive-graph.js +22 -3
- package/dist/resources/extensions/gsd/repo-identity.js +5 -46
- package/dist/resources/extensions/gsd/service-tier.js +4 -13
- package/dist/resources/extensions/gsd/session-lock.js +2 -2
- package/dist/resources/extensions/gsd/state.js +456 -12
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +203 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +153 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +15 -10
- package/dist/resources/extensions/gsd/workspace-index.js +37 -24
- package/dist/resources/extensions/gsd/worktree-resolver.js +2 -2
- package/dist/resources/extensions/gsd/worktree.js +2 -2
- package/dist/resources/extensions/mcp-client/index.js +1 -2
- package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- 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 +12 -12
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-fdab67f7802d7832.js → main-app-2f2ee7b85712c2bd.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +3 -10
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -8
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +2 -6
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +0 -60
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -18
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +0 -23
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +11 -63
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +6 -20
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +5 -6
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +0 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.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 +10 -30
- 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/agent-session.ts +1 -7
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +0 -68
- package/packages/pi-coding-agent/src/core/auth-storage.ts +2 -5
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -18
- package/packages/pi-coding-agent/src/core/lsp/client.ts +0 -29
- package/packages/pi-coding-agent/src/core/package-manager.ts +58 -99
- package/packages/pi-coding-agent/src/core/resource-loader.ts +6 -24
- package/packages/pi-coding-agent/src/core/system-prompt.ts +5 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +0 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +11 -31
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +4 -40
- package/src/resources/extensions/async-jobs/await-tool.test.ts +0 -47
- package/src/resources/extensions/async-jobs/await-tool.ts +0 -5
- package/src/resources/extensions/async-jobs/index.ts +0 -1
- package/src/resources/extensions/async-jobs/job-manager.ts +0 -2
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +3 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +17 -17
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +129 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +138 -106
- package/src/resources/extensions/gsd/auto-recovery.ts +76 -142
- package/src/resources/extensions/gsd/auto-start.ts +10 -7
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +33 -16
- package/src/resources/extensions/gsd/auto.ts +0 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +606 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -13
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +71 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/detection.ts +0 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +14 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +26 -43
- package/src/resources/extensions/gsd/doctor-providers.ts +0 -13
- package/src/resources/extensions/gsd/doctor-types.ts +0 -24
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/forensics.ts +0 -92
- package/src/resources/extensions/gsd/git-service.ts +72 -2
- package/src/resources/extensions/gsd/gitignore.ts +1 -1
- package/src/resources/extensions/gsd/gsd-db.ts +1125 -378
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1107 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +0 -3
- package/src/resources/extensions/gsd/preferences.ts +6 -62
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/forensics.md +0 -2
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -4
- package/src/resources/extensions/gsd/reactive-graph.ts +23 -3
- package/src/resources/extensions/gsd/repo-identity.ts +5 -48
- package/src/resources/extensions/gsd/service-tier.ts +4 -17
- package/src/resources/extensions/gsd/session-lock.ts +2 -2
- package/src/resources/extensions/gsd/state.ts +518 -11
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +69 -31
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +590 -2
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
- package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +460 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal.test.ts +127 -82
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +82 -73
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1204 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +265 -0
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +1 -30
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +3 -56
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +263 -156
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +78 -35
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +74 -81
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +2 -1
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +244 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +189 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +16 -11
- package/src/resources/extensions/gsd/workspace-index.ts +39 -27
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -2
- package/src/resources/extensions/gsd/worktree.ts +2 -2
- package/src/resources/extensions/mcp-client/index.ts +1 -5
- package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +0 -122
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +0 -151
- /package/dist/web/standalone/.next/static/{5ULZcR9XhHFzlAZFiSKRl → ROB0u-QKZQlfuGPZ47tud}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{5ULZcR9XhHFzlAZFiSKRl → ROB0u-QKZQlfuGPZ47tud}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -24,29 +24,6 @@ One command. Walk away. Come back to a built project with clean git history.
|
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
## What's New in v2.42.0
|
|
28
|
-
|
|
29
|
-
### New Features
|
|
30
|
-
|
|
31
|
-
- **Declarative workflow engine** — define YAML workflows that execute through auto-loop, enabling repeatable multi-step automations without code. (#2024)
|
|
32
|
-
- **Unified rule registry & event journal** — centralized rule registry, event journal with query tool, and standardized tool naming convention. (#1928)
|
|
33
|
-
- **PR risk checker** — CI classifies changed files by system area and surfaces risk level on pull requests. (#1930)
|
|
34
|
-
- **`/gsd fast`** — toggle service tier for supported models, enabling prioritized API routing for faster responses. (#1862)
|
|
35
|
-
- **Web mode CLI flags** — `--host`, `--port`, and `--allowed-origins` flags give full control over the web server bind address and CORS policy. (#1873)
|
|
36
|
-
- **ADR attribution** — architecture decision records now distinguish human, agent, and collaborative authorship. (#1830)
|
|
37
|
-
|
|
38
|
-
### Key Fixes
|
|
39
|
-
|
|
40
|
-
- **Node v24 web boot** — resolved `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING` that prevented `gsd --web` from starting on Node v24. (#1864)
|
|
41
|
-
- **Worktree health check for all ecosystems** — broadened from JS-only to 17+ ecosystems (Rust, Go, Python, Java, etc.). (#1860)
|
|
42
|
-
- **Doctor roadmap atomicity** — roadmap checkbox gating now checks summary on disk, not issue detection, preventing false unchecks. (#1915)
|
|
43
|
-
- **Windows path handling** — 8.3 short path resolution, backslash normalization in bash commands, PowerShell browser launch, and parenthesis escaping. (#1960, #1863, #1870, #1872)
|
|
44
|
-
- **Auth token persistence** — web UI auth token survives page refreshes via sessionStorage. (#1877)
|
|
45
|
-
- **German/non-English locale git errors** — git commands now force `LC_ALL=C` to prevent locale-dependent parse failures.
|
|
46
|
-
- **Orphan web server process** — stale web server processes on port 3000 are now cleaned up automatically.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
27
|
## What's New in v2.41.0
|
|
51
28
|
|
|
52
29
|
### New Features
|
package/dist/cli.js
CHANGED
|
@@ -14,14 +14,6 @@ import { parseCliArgs as parseWebCliArgs, runWebCliBranch, migrateLegacyFlatSess
|
|
|
14
14
|
import { stopWebMode } from './web-mode.js';
|
|
15
15
|
import { getProjectSessionsDir } from './project-sessions.js';
|
|
16
16
|
import { markStartup, printStartupTimings } from './startup-timings.js';
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// V8 compile cache — Node 22+ can cache compiled bytecode across runs,
|
|
19
|
-
// eliminating repeated parse/compile overhead for unchanged modules.
|
|
20
|
-
// Must be set early so dynamic imports (extensions, lazy subcommands) benefit.
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
if (parseInt(process.versions.node) >= 22) {
|
|
23
|
-
process.env.NODE_COMPILE_CACHE ??= join(agentDir, '.compile-cache');
|
|
24
|
-
}
|
|
25
17
|
function exitIfManagedResourcesAreNewer(currentAgentDir) {
|
|
26
18
|
const currentVersion = process.env.GSD_VERSION || '0.0.0';
|
|
27
19
|
const managedVersion = getNewerManagedResourceVersion(currentAgentDir, currentVersion);
|
|
@@ -469,14 +461,8 @@ const sessionManager = cliFlags._selectedSessionPath
|
|
|
469
461
|
exitIfManagedResourcesAreNewer(agentDir);
|
|
470
462
|
initResources(agentDir);
|
|
471
463
|
markStartup('initResources');
|
|
472
|
-
// Overlap resource loading with session manager setup — both are independent.
|
|
473
|
-
// resourceLoader.reload() is the most expensive step (jiti compilation), so
|
|
474
|
-
// starting it early shaves ~50-200ms off interactive startup.
|
|
475
464
|
const resourceLoader = buildResourceLoader(agentDir);
|
|
476
|
-
|
|
477
|
-
// While resources load, let session manager finish any async I/O it needs.
|
|
478
|
-
// Then await the resource promise before creating the agent session.
|
|
479
|
-
await resourceLoadPromise;
|
|
465
|
+
await resourceLoader.reload();
|
|
480
466
|
markStartup('resourceLoader.reload');
|
|
481
467
|
const { session, extensionsResult } = await createAgentSession({
|
|
482
468
|
authStorage,
|
|
@@ -544,9 +530,8 @@ if (!process.stdin.isTTY) {
|
|
|
544
530
|
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
545
531
|
process.exit(1);
|
|
546
532
|
}
|
|
547
|
-
// Welcome screen — shown on every fresh interactive session before TUI takes over
|
|
548
|
-
|
|
549
|
-
if (!process.env.GSD_FIRST_RUN_BANNER) {
|
|
533
|
+
// Welcome screen — shown on every fresh interactive session before TUI takes over
|
|
534
|
+
{
|
|
550
535
|
const { printWelcomeScreen } = await import('./welcome-screen.js');
|
|
551
536
|
printWelcomeScreen({
|
|
552
537
|
version: process.env.GSD_VERSION || '0.0.0',
|
package/dist/loader.js
CHANGED
|
@@ -42,8 +42,7 @@ const pkgDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'pkg');
|
|
|
42
42
|
process.env.PI_PACKAGE_DIR = pkgDir;
|
|
43
43
|
process.env.PI_SKIP_VERSION_CHECK = '1'; // GSD runs its own update check in cli.ts — suppress pi's
|
|
44
44
|
process.title = 'gsd';
|
|
45
|
-
// Print branded banner on first launch (before ~/.gsd/ exists)
|
|
46
|
-
// Set GSD_FIRST_RUN_BANNER so cli.ts skips the duplicate welcome screen.
|
|
45
|
+
// Print branded banner on first launch (before ~/.gsd/ exists)
|
|
47
46
|
if (!existsSync(appRoot)) {
|
|
48
47
|
const cyan = '\x1b[36m';
|
|
49
48
|
const green = '\x1b[32m';
|
|
@@ -54,7 +53,6 @@ if (!existsSync(appRoot)) {
|
|
|
54
53
|
'\n' +
|
|
55
54
|
` Get Shit Done ${dim}v${gsdVersion}${reset}\n` +
|
|
56
55
|
` ${green}Welcome.${reset} Setting up your environment...\n\n`);
|
|
57
|
-
process.env.GSD_FIRST_RUN_BANNER = '1';
|
|
58
56
|
}
|
|
59
57
|
// GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/
|
|
60
58
|
process.env.GSD_CODING_AGENT_DIR = agentDir;
|
package/dist/resource-loader.js
CHANGED
|
@@ -48,25 +48,14 @@ function getBundledGsdVersion() {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
function writeManagedResourceManifest(agentDir) {
|
|
51
|
-
// Record root-level files
|
|
52
|
-
//
|
|
53
|
-
// that get removed or moved.
|
|
51
|
+
// Record root-level files currently in the bundled extensions source so that
|
|
52
|
+
// future upgrades can detect and prune any that get removed or moved.
|
|
54
53
|
let installedExtensionRootFiles = [];
|
|
55
|
-
let installedExtensionDirs = [];
|
|
56
54
|
try {
|
|
57
55
|
if (existsSync(bundledExtensionsDir)) {
|
|
58
|
-
|
|
59
|
-
installedExtensionRootFiles = entries
|
|
56
|
+
installedExtensionRootFiles = readdirSync(bundledExtensionsDir, { withFileTypes: true })
|
|
60
57
|
.filter(e => e.isFile())
|
|
61
58
|
.map(e => e.name);
|
|
62
|
-
installedExtensionDirs = entries
|
|
63
|
-
.filter(e => e.isDirectory())
|
|
64
|
-
.filter(e => {
|
|
65
|
-
// Only track directories that are actual extensions (contain index.js or index.ts)
|
|
66
|
-
const dirPath = join(bundledExtensionsDir, e.name);
|
|
67
|
-
return existsSync(join(dirPath, 'index.js')) || existsSync(join(dirPath, 'index.ts'));
|
|
68
|
-
})
|
|
69
|
-
.map(e => e.name);
|
|
70
59
|
}
|
|
71
60
|
}
|
|
72
61
|
catch { /* non-fatal */ }
|
|
@@ -75,7 +64,6 @@ function writeManagedResourceManifest(agentDir) {
|
|
|
75
64
|
syncedAt: Date.now(),
|
|
76
65
|
contentHash: computeResourceFingerprint(),
|
|
77
66
|
installedExtensionRootFiles,
|
|
78
|
-
installedExtensionDirs,
|
|
79
67
|
};
|
|
80
68
|
writeFileSync(getManagedResourceManifestPath(agentDir), JSON.stringify(manifest));
|
|
81
69
|
}
|
|
@@ -296,20 +284,16 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
296
284
|
return;
|
|
297
285
|
// Current bundled root-level files (what the new version provides)
|
|
298
286
|
const currentSourceFiles = new Set();
|
|
299
|
-
// Current bundled subdirectory extensions
|
|
300
|
-
const currentSourceDirs = new Set();
|
|
301
287
|
try {
|
|
302
288
|
if (existsSync(bundledExtensionsDir)) {
|
|
303
289
|
for (const e of readdirSync(bundledExtensionsDir, { withFileTypes: true })) {
|
|
304
290
|
if (e.isFile())
|
|
305
291
|
currentSourceFiles.add(e.name);
|
|
306
|
-
if (e.isDirectory())
|
|
307
|
-
currentSourceDirs.add(e.name);
|
|
308
292
|
}
|
|
309
293
|
}
|
|
310
294
|
}
|
|
311
295
|
catch { /* non-fatal */ }
|
|
312
|
-
const
|
|
296
|
+
const removeIfStale = (fileName) => {
|
|
313
297
|
if (currentSourceFiles.has(fileName))
|
|
314
298
|
return; // still in bundle, not stale
|
|
315
299
|
const stale = join(extensionsDir, fileName);
|
|
@@ -319,33 +303,17 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
319
303
|
}
|
|
320
304
|
catch { /* non-fatal */ }
|
|
321
305
|
};
|
|
322
|
-
const removeDirIfStale = (dirName) => {
|
|
323
|
-
if (currentSourceDirs.has(dirName))
|
|
324
|
-
return; // still in bundle, not stale
|
|
325
|
-
const stale = join(extensionsDir, dirName);
|
|
326
|
-
try {
|
|
327
|
-
if (existsSync(stale))
|
|
328
|
-
rmSync(stale, { recursive: true, force: true });
|
|
329
|
-
}
|
|
330
|
-
catch { /* non-fatal */ }
|
|
331
|
-
};
|
|
332
306
|
if (manifest?.installedExtensionRootFiles) {
|
|
333
307
|
// Manifest-based: remove previously-installed root files that are no longer bundled
|
|
334
308
|
for (const prevFile of manifest.installedExtensionRootFiles) {
|
|
335
|
-
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
if (manifest?.installedExtensionDirs) {
|
|
339
|
-
// Manifest-based: remove previously-installed subdirectory extensions that are no longer bundled
|
|
340
|
-
for (const prevDir of manifest.installedExtensionDirs) {
|
|
341
|
-
removeDirIfStale(prevDir);
|
|
309
|
+
removeIfStale(prevFile);
|
|
342
310
|
}
|
|
343
311
|
}
|
|
344
312
|
// Always remove known stale files regardless of manifest state.
|
|
345
313
|
// These were installed by pre-manifest versions so they may not appear in
|
|
346
314
|
// installedExtensionRootFiles even when a manifest exists.
|
|
347
315
|
// env-utils.js was moved from extensions/ root → gsd/ in v2.39.x (#1634)
|
|
348
|
-
|
|
316
|
+
removeIfStale('env-utils.js');
|
|
349
317
|
}
|
|
350
318
|
/**
|
|
351
319
|
* Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
|
|
@@ -448,6 +416,5 @@ export function buildResourceLoader(agentDir) {
|
|
|
448
416
|
return new DefaultResourceLoader({
|
|
449
417
|
agentDir,
|
|
450
418
|
additionalExtensionPaths: piExtensionPaths,
|
|
451
|
-
bundledExtensionNames: bundledKeys,
|
|
452
419
|
});
|
|
453
420
|
}
|
|
@@ -83,15 +83,6 @@ export function createAsyncBashTool(getManager, getCwd) {
|
|
|
83
83
|
*/
|
|
84
84
|
function executeBashInBackground(command, cwd, signal, timeout) {
|
|
85
85
|
return new Promise((resolve, reject) => {
|
|
86
|
-
let settled = false;
|
|
87
|
-
const safeResolve = (value) => { if (!settled) {
|
|
88
|
-
settled = true;
|
|
89
|
-
resolve(value);
|
|
90
|
-
} };
|
|
91
|
-
const safeReject = (err) => { if (!settled) {
|
|
92
|
-
settled = true;
|
|
93
|
-
reject(err);
|
|
94
|
-
} };
|
|
95
86
|
const { shell, args } = getShellConfig();
|
|
96
87
|
const resolvedCommand = sanitizeCommand(command);
|
|
97
88
|
const child = spawn(shell, [...args, resolvedCommand], {
|
|
@@ -102,42 +93,11 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
102
93
|
});
|
|
103
94
|
let timedOut = false;
|
|
104
95
|
let timeoutHandle;
|
|
105
|
-
let sigkillHandle;
|
|
106
|
-
let hardDeadlineHandle;
|
|
107
|
-
/** Grace period (ms) between SIGTERM and SIGKILL. */
|
|
108
|
-
const SIGKILL_GRACE_MS = 5_000;
|
|
109
|
-
/** Hard deadline (ms) after SIGKILL to force-resolve the promise. */
|
|
110
|
-
const HARD_DEADLINE_MS = 3_000;
|
|
111
96
|
if (timeout !== undefined && timeout > 0) {
|
|
112
97
|
timeoutHandle = setTimeout(() => {
|
|
113
98
|
timedOut = true;
|
|
114
99
|
if (child.pid)
|
|
115
100
|
killTree(child.pid);
|
|
116
|
-
// If the process ignores SIGTERM, escalate to SIGKILL
|
|
117
|
-
sigkillHandle = setTimeout(() => {
|
|
118
|
-
if (child.pid) {
|
|
119
|
-
try {
|
|
120
|
-
process.kill(-child.pid, "SIGKILL");
|
|
121
|
-
}
|
|
122
|
-
catch { /* ignore */ }
|
|
123
|
-
try {
|
|
124
|
-
process.kill(child.pid, "SIGKILL");
|
|
125
|
-
}
|
|
126
|
-
catch { /* ignore */ }
|
|
127
|
-
}
|
|
128
|
-
// Hard deadline: if even SIGKILL doesn't trigger 'close',
|
|
129
|
-
// force-resolve so the job doesn't hang forever (#2186).
|
|
130
|
-
hardDeadlineHandle = setTimeout(() => {
|
|
131
|
-
const output = Buffer.concat(chunks).toString("utf-8");
|
|
132
|
-
safeResolve(output
|
|
133
|
-
? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
|
|
134
|
-
: `Command timed out after ${timeout} seconds (force-killed)`);
|
|
135
|
-
}, HARD_DEADLINE_MS);
|
|
136
|
-
if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
|
|
137
|
-
hardDeadlineHandle.unref();
|
|
138
|
-
}, SIGKILL_GRACE_MS);
|
|
139
|
-
if (typeof sigkillHandle === "object" && "unref" in sigkillHandle)
|
|
140
|
-
sigkillHandle.unref();
|
|
141
101
|
}, timeout * 1000);
|
|
142
102
|
}
|
|
143
103
|
const chunks = [];
|
|
@@ -179,31 +139,23 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
179
139
|
child.on("error", (err) => {
|
|
180
140
|
if (timeoutHandle)
|
|
181
141
|
clearTimeout(timeoutHandle);
|
|
182
|
-
if (sigkillHandle)
|
|
183
|
-
clearTimeout(sigkillHandle);
|
|
184
|
-
if (hardDeadlineHandle)
|
|
185
|
-
clearTimeout(hardDeadlineHandle);
|
|
186
142
|
signal.removeEventListener("abort", onAbort);
|
|
187
|
-
|
|
143
|
+
reject(err);
|
|
188
144
|
});
|
|
189
145
|
child.on("close", (code) => {
|
|
190
146
|
if (timeoutHandle)
|
|
191
147
|
clearTimeout(timeoutHandle);
|
|
192
|
-
if (sigkillHandle)
|
|
193
|
-
clearTimeout(sigkillHandle);
|
|
194
|
-
if (hardDeadlineHandle)
|
|
195
|
-
clearTimeout(hardDeadlineHandle);
|
|
196
148
|
signal.removeEventListener("abort", onAbort);
|
|
197
149
|
if (spillStream)
|
|
198
150
|
spillStream.end();
|
|
199
151
|
if (signal.aborted) {
|
|
200
152
|
const output = Buffer.concat(chunks).toString("utf-8");
|
|
201
|
-
|
|
153
|
+
resolve(output ? `${output}\n\nCommand aborted` : "Command aborted");
|
|
202
154
|
return;
|
|
203
155
|
}
|
|
204
156
|
if (timedOut) {
|
|
205
157
|
const output = Buffer.concat(chunks).toString("utf-8");
|
|
206
|
-
|
|
158
|
+
resolve(output ? `${output}\n\nCommand timed out after ${timeout} seconds` : `Command timed out after ${timeout} seconds`);
|
|
207
159
|
return;
|
|
208
160
|
}
|
|
209
161
|
const fullOutput = Buffer.concat(chunks).toString("utf-8");
|
|
@@ -224,7 +176,7 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
224
176
|
if (code !== 0 && code !== null) {
|
|
225
177
|
text += `\n\nCommand exited with code ${code}`;
|
|
226
178
|
}
|
|
227
|
-
|
|
179
|
+
resolve(text);
|
|
228
180
|
});
|
|
229
181
|
});
|
|
230
182
|
}
|
|
@@ -54,11 +54,6 @@ export function createAwaitTool(getManager) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
// Mark all watched jobs as awaited upfront so the onJobComplete
|
|
58
|
-
// callback (which fires synchronously in the promise .then()) knows
|
|
59
|
-
// to suppress the follow-up message.
|
|
60
|
-
for (const j of watched)
|
|
61
|
-
j.awaited = true;
|
|
62
57
|
// If all watched jobs are already done, return immediately
|
|
63
58
|
const running = watched.filter((j) => j.status === "running");
|
|
64
59
|
if (running.length === 0) {
|
|
@@ -34,8 +34,6 @@ export default function AsyncJobs(pi) {
|
|
|
34
34
|
latestCwd = ctx.cwd;
|
|
35
35
|
manager = new AsyncJobManager({
|
|
36
36
|
onJobComplete: (job) => {
|
|
37
|
-
if (job.awaited)
|
|
38
|
-
return;
|
|
39
37
|
const statusEmoji = job.status === "completed" ? "done" : "error";
|
|
40
38
|
const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(1);
|
|
41
39
|
const output = job.status === "completed"
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readdirSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { loadFile,
|
|
12
|
+
import { loadFile, parseSummary } from "../gsd/files.js";
|
|
13
|
+
import { parseRoadmap, parsePlan } from "../gsd/parsers-legacy.js";
|
|
13
14
|
import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, } from "../gsd/paths.js";
|
|
14
15
|
import { debugLog } from "../gsd/debug-logger.js";
|
|
15
16
|
import { loadEffectiveGSDPreferences } from "../gsd/preferences.js";
|
|
@@ -165,7 +165,9 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
165
165
|
midTitle = state.activeMilestone?.title;
|
|
166
166
|
if (mid) {
|
|
167
167
|
if (deps.getIsolationMode() !== "none") {
|
|
168
|
-
deps.captureIntegrationBranch(s.basePath, mid
|
|
168
|
+
deps.captureIntegrationBranch(s.basePath, mid, {
|
|
169
|
+
commitDocs: prefs?.git?.commit_docs,
|
|
170
|
+
});
|
|
169
171
|
}
|
|
170
172
|
deps.resolver.enterMilestone(mid, ctx.ui);
|
|
171
173
|
}
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
import { getCurrentBranch } from "./worktree.js";
|
|
9
9
|
import { getActiveHook } from "./post-unit-hooks.js";
|
|
10
10
|
import { getLedger, getProjectTotals } from "./metrics.js";
|
|
11
|
-
import {
|
|
12
|
-
import { parseRoadmap, parsePlan } from "./files.js";
|
|
11
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
13
12
|
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
14
13
|
import { execFileSync } from "node:child_process";
|
|
15
14
|
import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
@@ -192,24 +191,26 @@ export function estimateTimeRemaining() {
|
|
|
192
191
|
let cachedSliceProgress = null;
|
|
193
192
|
export function updateSliceProgressCache(base, mid, activeSid) {
|
|
194
193
|
try {
|
|
195
|
-
|
|
196
|
-
if (
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
194
|
+
let normSlices;
|
|
195
|
+
if (isDbAvailable()) {
|
|
196
|
+
normSlices = getMilestoneSlices(mid).map(s => ({ id: s.id, done: s.status === "complete", title: s.title }));
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
normSlices = [];
|
|
200
|
+
}
|
|
200
201
|
let activeSliceTasks = null;
|
|
201
202
|
let taskDetails = null;
|
|
202
203
|
if (activeSid) {
|
|
203
204
|
try {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
205
|
+
if (isDbAvailable()) {
|
|
206
|
+
const dbTasks = getSliceTasks(mid, activeSid);
|
|
207
|
+
if (dbTasks.length > 0) {
|
|
208
|
+
activeSliceTasks = {
|
|
209
|
+
done: dbTasks.filter(t => t.status === "complete" || t.status === "done").length,
|
|
210
|
+
total: dbTasks.length,
|
|
211
|
+
};
|
|
212
|
+
taskDetails = dbTasks.map(t => ({ id: t.id, title: t.title, done: t.status === "complete" || t.status === "done" }));
|
|
213
|
+
}
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
216
|
catch {
|
|
@@ -217,8 +218,8 @@ export function updateSliceProgressCache(base, mid, activeSid) {
|
|
|
217
218
|
}
|
|
218
219
|
}
|
|
219
220
|
cachedSliceProgress = {
|
|
220
|
-
done:
|
|
221
|
-
total:
|
|
221
|
+
done: normSlices.filter(s => s.done).length,
|
|
222
|
+
total: normSlices.length,
|
|
222
223
|
milestoneId: mid,
|
|
223
224
|
activeSliceTasks,
|
|
224
225
|
taskDetails,
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* Resolves phase name → unit type + prompt, creates a session, and sends the message.
|
|
4
4
|
*/
|
|
5
5
|
import { deriveState } from "./state.js";
|
|
6
|
-
import { loadFile
|
|
7
|
-
import {
|
|
6
|
+
import { loadFile } from "./files.js";
|
|
7
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
8
|
+
import { resolveSliceFile, relSliceFile, } from "./paths.js";
|
|
8
9
|
import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
|
|
9
10
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
10
11
|
import { pauseAuto } from "./auto.js";
|
|
@@ -117,19 +118,20 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
|
|
|
117
118
|
}
|
|
118
119
|
case "reassess":
|
|
119
120
|
case "reassess-roadmap": {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
121
|
+
// DB primary path — get completed slices
|
|
122
|
+
let completedSliceIds = [];
|
|
123
|
+
if (isDbAvailable()) {
|
|
124
|
+
completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
ctx.ui.notify("Cannot dispatch reassess-roadmap: DB unavailable.", "warning");
|
|
124
128
|
return;
|
|
125
129
|
}
|
|
126
|
-
|
|
127
|
-
const completedSlices = roadmap.slices.filter(s => s.done);
|
|
128
|
-
if (completedSlices.length === 0) {
|
|
130
|
+
if (completedSliceIds.length === 0) {
|
|
129
131
|
ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
|
|
130
132
|
return;
|
|
131
133
|
}
|
|
132
|
-
const completedSliceId =
|
|
134
|
+
const completedSliceId = completedSliceIds[completedSliceIds.length - 1];
|
|
133
135
|
unitType = "reassess-roadmap";
|
|
134
136
|
unitId = `${mid}/${completedSliceId}`;
|
|
135
137
|
prompt = await buildReassessRoadmapPrompt(mid, midTitle, completedSliceId, base);
|
|
@@ -141,19 +143,19 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
|
|
|
141
143
|
// incomplete) slice. After slice completion, state.activeSlice advances
|
|
142
144
|
// to the next incomplete slice, so we find the last done slice from the
|
|
143
145
|
// roadmap instead (#1693).
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
let uatCompletedSliceIds = [];
|
|
147
|
+
if (isDbAvailable()) {
|
|
148
|
+
uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
ctx.ui.notify("Cannot dispatch run-uat: DB unavailable.", "warning");
|
|
148
152
|
return;
|
|
149
153
|
}
|
|
150
|
-
|
|
151
|
-
const completedSlices = roadmap.slices.filter(s => s.done);
|
|
152
|
-
if (completedSlices.length === 0) {
|
|
154
|
+
if (uatCompletedSliceIds.length === 0) {
|
|
153
155
|
ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
|
|
154
156
|
return;
|
|
155
157
|
}
|
|
156
|
-
const sid =
|
|
158
|
+
const sid = uatCompletedSliceIds[uatCompletedSliceIds.length - 1];
|
|
157
159
|
const uatFile = resolveSliceFile(base, mid, sid, "UAT");
|
|
158
160
|
if (!uatFile) {
|
|
159
161
|
ctx.ui.notify("Cannot dispatch run-uat: no UAT file found.", "warning");
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* data structure that is inspectable, testable per-rule, and extensible
|
|
9
9
|
* without modifying orchestration code.
|
|
10
10
|
*/
|
|
11
|
-
import { loadFile, loadActiveOverrides
|
|
11
|
+
import { loadFile, loadActiveOverrides } from "./files.js";
|
|
12
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
12
13
|
import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
13
14
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
14
15
|
import { join } from "node:path";
|
|
@@ -92,12 +93,18 @@ export const DISPATCH_RULES = [
|
|
|
92
93
|
if (!prefs?.uat_dispatch)
|
|
93
94
|
return null;
|
|
94
95
|
const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
// DB-first: get completed slices from DB
|
|
97
|
+
let completedSliceIds;
|
|
98
|
+
if (isDbAvailable()) {
|
|
99
|
+
completedSliceIds = getMilestoneSlices(mid)
|
|
100
|
+
.filter(s => s.status === "complete")
|
|
101
|
+
.map(s => s.id);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
97
104
|
return null;
|
|
98
|
-
|
|
99
|
-
for (const
|
|
100
|
-
const resultFile = resolveSliceFile(basePath, mid,
|
|
105
|
+
}
|
|
106
|
+
for (const sliceId of completedSliceIds) {
|
|
107
|
+
const resultFile = resolveSliceFile(basePath, mid, sliceId, "UAT-RESULT");
|
|
101
108
|
if (!resultFile)
|
|
102
109
|
continue;
|
|
103
110
|
const content = await loadFile(resultFile);
|
|
@@ -108,7 +115,7 @@ export const DISPATCH_RULES = [
|
|
|
108
115
|
if (verdict && verdict !== "pass" && verdict !== "passed") {
|
|
109
116
|
return {
|
|
110
117
|
action: "stop",
|
|
111
|
-
reason: `UAT verdict for ${
|
|
118
|
+
reason: `UAT verdict for ${sliceId} is "${verdict}" — blocking progression until resolved.\nReview the UAT result and update the verdict to PASS, or re-run /gsd auto after fixing.`,
|
|
112
119
|
level: "warning",
|
|
113
120
|
};
|
|
114
121
|
}
|
|
@@ -376,15 +383,19 @@ export const DISPATCH_RULES = [
|
|
|
376
383
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files before
|
|
377
384
|
// allowing milestone validation. If any slice lacks a summary, the milestone
|
|
378
385
|
// is not genuinely complete — something skipped earlier slices.
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
386
|
+
let sliceIds;
|
|
387
|
+
if (isDbAvailable()) {
|
|
388
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
sliceIds = [];
|
|
392
|
+
}
|
|
393
|
+
if (sliceIds.length > 0) {
|
|
383
394
|
const missingSlices = [];
|
|
384
|
-
for (const
|
|
385
|
-
const summaryPath = resolveSliceFile(basePath, mid,
|
|
395
|
+
for (const sid of sliceIds) {
|
|
396
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
386
397
|
if (!summaryPath || !existsSync(summaryPath)) {
|
|
387
|
-
missingSlices.push(
|
|
398
|
+
missingSlices.push(sid);
|
|
388
399
|
}
|
|
389
400
|
}
|
|
390
401
|
if (missingSlices.length > 0) {
|
|
@@ -430,15 +441,19 @@ export const DISPATCH_RULES = [
|
|
|
430
441
|
if (state.phase !== "completing-milestone")
|
|
431
442
|
return null;
|
|
432
443
|
// Safety guard (#1368): verify all roadmap slices have SUMMARY files.
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
444
|
+
let sliceIds;
|
|
445
|
+
if (isDbAvailable()) {
|
|
446
|
+
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
sliceIds = [];
|
|
450
|
+
}
|
|
451
|
+
if (sliceIds.length > 0) {
|
|
437
452
|
const missingSlices = [];
|
|
438
|
-
for (const
|
|
439
|
-
const summaryPath = resolveSliceFile(basePath, mid,
|
|
453
|
+
for (const sid of sliceIds) {
|
|
454
|
+
const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
|
|
440
455
|
if (!summaryPath || !existsSync(summaryPath)) {
|
|
441
|
-
missingSlices.push(
|
|
456
|
+
missingSlices.push(sid);
|
|
442
457
|
}
|
|
443
458
|
}
|
|
444
459
|
if (missingSlices.length > 0) {
|