gsd-pi 2.43.0-next.7 → 2.43.0-next.7-dev.4684f0e
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 +23 -0
- package/dist/cli.js +31 -4
- package/dist/help-text.js +24 -0
- package/dist/loader.js +3 -1
- package/dist/resource-loader.js +39 -6
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +52 -4
- package/dist/resources/extensions/async-jobs/await-tool.js +5 -0
- package/dist/resources/extensions/async-jobs/index.js +2 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +1 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +21 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +40 -23
- package/dist/resources/extensions/gsd/auto-prompts.js +133 -67
- package/dist/resources/extensions/gsd/auto-recovery.js +7 -6
- package/dist/resources/extensions/gsd/auto-start.js +8 -11
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +93 -15
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +65 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -5
- package/dist/resources/extensions/gsd/commands-maintenance.js +20 -4
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/detection.js +19 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
- package/dist/resources/extensions/gsd/doctor-checks.js +31 -1
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +10 -0
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/forensics.js +84 -0
- package/dist/resources/extensions/gsd/git-service.js +7 -69
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +21 -3
- package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +60 -8
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -2
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +5 -7
- package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
- package/dist/resources/extensions/gsd/repo-identity.js +46 -5
- package/dist/resources/extensions/gsd/service-tier.js +13 -4
- package/dist/resources/extensions/gsd/session-lock.js +2 -2
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +28 -18
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +4 -2
- package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
- package/dist/resources/extensions/gsd/workspace-index.js +46 -15
- 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 +2 -1
- 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 +16 -15
- 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 +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- 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 +5 -5
- 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 +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -15
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- 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/ZYERjwjiaf3Mhj69oy-Ms/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{api/bridge-terminal/input/route-d07a2c023f1aef1e.js → _global-error/page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{_global-error/page-d07a2c023f1aef1e.js → api/boot/route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/{resize/route-d07a2c023f1aef1e.js → input/route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/{boot/route-d07a2c023f1aef1e.js → bridge-terminal/resize/route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.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/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +10 -3
- package/package.json +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +29 -35
- 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 +6 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +60 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +98 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +92 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +63 -11
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +20 -6
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.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 +6 -5
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.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 +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.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 +30 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +33 -38
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +68 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +5 -2
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +107 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +112 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +99 -58
- package/packages/pi-coding-agent/src/core/resource-loader.ts +24 -6
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +6 -5
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +31 -11
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +40 -4
- package/src/resources/extensions/async-jobs/await-tool.test.ts +47 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +5 -0
- package/src/resources/extensions/async-jobs/index.ts +1 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +2 -0
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +1 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +22 -7
- package/src/resources/extensions/gsd/auto-post-unit.ts +41 -20
- package/src/resources/extensions/gsd/auto-prompts.ts +111 -60
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -6
- package/src/resources/extensions/gsd/auto-start.ts +7 -10
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +95 -16
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +69 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -5
- package/src/resources/extensions/gsd/commands-maintenance.ts +20 -5
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/detection.ts +19 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
- package/src/resources/extensions/gsd/doctor-checks.ts +32 -1
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +13 -0
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/forensics.ts +92 -0
- package/src/resources/extensions/gsd/git-service.ts +6 -72
- package/src/resources/extensions/gsd/gitignore.ts +5 -1
- package/src/resources/extensions/gsd/gsd-db.ts +22 -4
- package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +63 -6
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -2
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +5 -7
- package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
- package/src/resources/extensions/gsd/repo-identity.ts +48 -5
- package/src/resources/extensions/gsd/service-tier.ts +17 -4
- package/src/resources/extensions/gsd/session-lock.ts +2 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +29 -18
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +31 -69
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +15 -16
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/journal.test.ts +82 -127
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +73 -82
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +13 -9
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +56 -3
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +156 -263
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +36 -79
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +81 -74
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -2
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +7 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +7 -2
- package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
- package/src/resources/extensions/gsd/workspace-index.ts +49 -18
- package/src/resources/extensions/gsd/worktree-resolver.ts +2 -3
- package/src/resources/extensions/gsd/worktree.ts +2 -2
- package/src/resources/extensions/mcp-client/index.ts +5 -1
- package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/dist/web/standalone/.next/static/qv0BnFw5E5XGKT3M3q-42/_buildManifest.js +0 -1
- /package/dist/web/standalone/.next/static/{qv0BnFw5E5XGKT3M3q-42 → ZYERjwjiaf3Mhj69oy-Ms}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -24,6 +24,29 @@ 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
|
+
|
|
27
50
|
## What's New in v2.41.0
|
|
28
51
|
|
|
29
52
|
### New Features
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuthStorage, DefaultResourceLoader, ModelRegistry, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } from '@gsd/pi-coding-agent';
|
|
1
|
+
import { AuthStorage, DefaultResourceLoader, ModelRegistry, runPackageCommand, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } from '@gsd/pi-coding-agent';
|
|
2
2
|
import { readFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
|
|
@@ -14,6 +14,14 @@ 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
|
+
}
|
|
17
25
|
function exitIfManagedResourcesAreNewer(currentAgentDir) {
|
|
18
26
|
const currentVersion = process.env.GSD_VERSION || '0.0.0';
|
|
19
27
|
const managedVersion = getNewerManagedResourceVersion(currentAgentDir, currentVersion);
|
|
@@ -113,6 +121,18 @@ if (subcommand && process.argv.includes('--help')) {
|
|
|
113
121
|
process.exit(0);
|
|
114
122
|
}
|
|
115
123
|
}
|
|
124
|
+
const packageCommand = await runPackageCommand({
|
|
125
|
+
appName: 'gsd',
|
|
126
|
+
args: process.argv.slice(2),
|
|
127
|
+
cwd: process.cwd(),
|
|
128
|
+
agentDir,
|
|
129
|
+
stdout: process.stdout,
|
|
130
|
+
stderr: process.stderr,
|
|
131
|
+
allowedCommands: new Set(['install', 'remove', 'list']),
|
|
132
|
+
});
|
|
133
|
+
if (packageCommand.handled) {
|
|
134
|
+
process.exit(packageCommand.exitCode);
|
|
135
|
+
}
|
|
116
136
|
// `gsd config` — replay the setup wizard and exit
|
|
117
137
|
if (cliFlags.messages[0] === 'config') {
|
|
118
138
|
const authStorage = AuthStorage.create(authFilePath);
|
|
@@ -461,8 +481,14 @@ const sessionManager = cliFlags._selectedSessionPath
|
|
|
461
481
|
exitIfManagedResourcesAreNewer(agentDir);
|
|
462
482
|
initResources(agentDir);
|
|
463
483
|
markStartup('initResources');
|
|
484
|
+
// Overlap resource loading with session manager setup — both are independent.
|
|
485
|
+
// resourceLoader.reload() is the most expensive step (jiti compilation), so
|
|
486
|
+
// starting it early shaves ~50-200ms off interactive startup.
|
|
464
487
|
const resourceLoader = buildResourceLoader(agentDir);
|
|
465
|
-
|
|
488
|
+
const resourceLoadPromise = resourceLoader.reload();
|
|
489
|
+
// While resources load, let session manager finish any async I/O it needs.
|
|
490
|
+
// Then await the resource promise before creating the agent session.
|
|
491
|
+
await resourceLoadPromise;
|
|
466
492
|
markStartup('resourceLoader.reload');
|
|
467
493
|
const { session, extensionsResult } = await createAgentSession({
|
|
468
494
|
authStorage,
|
|
@@ -530,8 +556,9 @@ if (!process.stdin.isTTY) {
|
|
|
530
556
|
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
531
557
|
process.exit(1);
|
|
532
558
|
}
|
|
533
|
-
// Welcome screen — shown on every fresh interactive session before TUI takes over
|
|
534
|
-
|
|
559
|
+
// Welcome screen — shown on every fresh interactive session before TUI takes over.
|
|
560
|
+
// Skip when the first-run banner was already printed in loader.ts (prevents double banner).
|
|
561
|
+
if (!process.env.GSD_FIRST_RUN_BANNER) {
|
|
535
562
|
const { printWelcomeScreen } = await import('./welcome-screen.js');
|
|
536
563
|
printWelcomeScreen({
|
|
537
564
|
version: process.env.GSD_VERSION || '0.0.0',
|
package/dist/help-text.js
CHANGED
|
@@ -29,6 +29,27 @@ const SUBCOMMAND_HELP = {
|
|
|
29
29
|
'',
|
|
30
30
|
'Compare with --continue (-c) which always resumes the most recent session.',
|
|
31
31
|
].join('\n'),
|
|
32
|
+
install: [
|
|
33
|
+
'Usage: gsd install <source> [-l, --local]',
|
|
34
|
+
'',
|
|
35
|
+
'Install a package/extension source and run declared lifecycle hooks.',
|
|
36
|
+
'',
|
|
37
|
+
'Examples:',
|
|
38
|
+
' gsd install npm:@foo/bar',
|
|
39
|
+
' gsd install git:github.com/user/repo',
|
|
40
|
+
' gsd install https://github.com/user/repo',
|
|
41
|
+
' gsd install ./local/path',
|
|
42
|
+
].join('\n'),
|
|
43
|
+
remove: [
|
|
44
|
+
'Usage: gsd remove <source> [-l, --local]',
|
|
45
|
+
'',
|
|
46
|
+
'Remove an installed package source and its settings entry.',
|
|
47
|
+
].join('\n'),
|
|
48
|
+
list: [
|
|
49
|
+
'Usage: gsd list',
|
|
50
|
+
'',
|
|
51
|
+
'List installed package sources from user and project settings.',
|
|
52
|
+
].join('\n'),
|
|
32
53
|
worktree: [
|
|
33
54
|
'Usage: gsd worktree <command> [args]',
|
|
34
55
|
'',
|
|
@@ -122,6 +143,9 @@ export function printHelp(version) {
|
|
|
122
143
|
process.stdout.write(' --help, -h Print this help and exit\n');
|
|
123
144
|
process.stdout.write('\nSubcommands:\n');
|
|
124
145
|
process.stdout.write(' config Re-run the setup wizard\n');
|
|
146
|
+
process.stdout.write(' install <source> Install a package/extension source\n');
|
|
147
|
+
process.stdout.write(' remove <source> Remove an installed package source\n');
|
|
148
|
+
process.stdout.write(' list List installed package sources\n');
|
|
125
149
|
process.stdout.write(' update Update GSD to the latest version\n');
|
|
126
150
|
process.stdout.write(' sessions List and resume a past session\n');
|
|
127
151
|
process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
|
package/dist/loader.js
CHANGED
|
@@ -42,7 +42,8 @@ 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)
|
|
45
|
+
// Print branded banner on first launch (before ~/.gsd/ exists).
|
|
46
|
+
// Set GSD_FIRST_RUN_BANNER so cli.ts skips the duplicate welcome screen.
|
|
46
47
|
if (!existsSync(appRoot)) {
|
|
47
48
|
const cyan = '\x1b[36m';
|
|
48
49
|
const green = '\x1b[32m';
|
|
@@ -53,6 +54,7 @@ if (!existsSync(appRoot)) {
|
|
|
53
54
|
'\n' +
|
|
54
55
|
` Get Shit Done ${dim}v${gsdVersion}${reset}\n` +
|
|
55
56
|
` ${green}Welcome.${reset} Setting up your environment...\n\n`);
|
|
57
|
+
process.env.GSD_FIRST_RUN_BANNER = '1';
|
|
56
58
|
}
|
|
57
59
|
// GSD_CODING_AGENT_DIR — tells pi's getAgentDir() to return ~/.gsd/agent/ instead of ~/.gsd/agent/
|
|
58
60
|
process.env.GSD_CODING_AGENT_DIR = agentDir;
|
package/dist/resource-loader.js
CHANGED
|
@@ -48,14 +48,25 @@ function getBundledGsdVersion() {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
function writeManagedResourceManifest(agentDir) {
|
|
51
|
-
// Record root-level files
|
|
52
|
-
// future upgrades can detect and prune any
|
|
51
|
+
// Record root-level files and subdirectory extension names currently in the
|
|
52
|
+
// bundled extensions source so that future upgrades can detect and prune any
|
|
53
|
+
// that get removed or moved.
|
|
53
54
|
let installedExtensionRootFiles = [];
|
|
55
|
+
let installedExtensionDirs = [];
|
|
54
56
|
try {
|
|
55
57
|
if (existsSync(bundledExtensionsDir)) {
|
|
56
|
-
|
|
58
|
+
const entries = readdirSync(bundledExtensionsDir, { withFileTypes: true });
|
|
59
|
+
installedExtensionRootFiles = entries
|
|
57
60
|
.filter(e => e.isFile())
|
|
58
61
|
.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);
|
|
59
70
|
}
|
|
60
71
|
}
|
|
61
72
|
catch { /* non-fatal */ }
|
|
@@ -64,6 +75,7 @@ function writeManagedResourceManifest(agentDir) {
|
|
|
64
75
|
syncedAt: Date.now(),
|
|
65
76
|
contentHash: computeResourceFingerprint(),
|
|
66
77
|
installedExtensionRootFiles,
|
|
78
|
+
installedExtensionDirs,
|
|
67
79
|
};
|
|
68
80
|
writeFileSync(getManagedResourceManifestPath(agentDir), JSON.stringify(manifest));
|
|
69
81
|
}
|
|
@@ -284,16 +296,20 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
284
296
|
return;
|
|
285
297
|
// Current bundled root-level files (what the new version provides)
|
|
286
298
|
const currentSourceFiles = new Set();
|
|
299
|
+
// Current bundled subdirectory extensions
|
|
300
|
+
const currentSourceDirs = new Set();
|
|
287
301
|
try {
|
|
288
302
|
if (existsSync(bundledExtensionsDir)) {
|
|
289
303
|
for (const e of readdirSync(bundledExtensionsDir, { withFileTypes: true })) {
|
|
290
304
|
if (e.isFile())
|
|
291
305
|
currentSourceFiles.add(e.name);
|
|
306
|
+
if (e.isDirectory())
|
|
307
|
+
currentSourceDirs.add(e.name);
|
|
292
308
|
}
|
|
293
309
|
}
|
|
294
310
|
}
|
|
295
311
|
catch { /* non-fatal */ }
|
|
296
|
-
const
|
|
312
|
+
const removeFileIfStale = (fileName) => {
|
|
297
313
|
if (currentSourceFiles.has(fileName))
|
|
298
314
|
return; // still in bundle, not stale
|
|
299
315
|
const stale = join(extensionsDir, fileName);
|
|
@@ -303,17 +319,33 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
303
319
|
}
|
|
304
320
|
catch { /* non-fatal */ }
|
|
305
321
|
};
|
|
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
|
+
};
|
|
306
332
|
if (manifest?.installedExtensionRootFiles) {
|
|
307
333
|
// Manifest-based: remove previously-installed root files that are no longer bundled
|
|
308
334
|
for (const prevFile of manifest.installedExtensionRootFiles) {
|
|
309
|
-
|
|
335
|
+
removeFileIfStale(prevFile);
|
|
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);
|
|
310
342
|
}
|
|
311
343
|
}
|
|
312
344
|
// Always remove known stale files regardless of manifest state.
|
|
313
345
|
// These were installed by pre-manifest versions so they may not appear in
|
|
314
346
|
// installedExtensionRootFiles even when a manifest exists.
|
|
315
347
|
// env-utils.js was moved from extensions/ root → gsd/ in v2.39.x (#1634)
|
|
316
|
-
|
|
348
|
+
removeFileIfStale('env-utils.js');
|
|
317
349
|
}
|
|
318
350
|
/**
|
|
319
351
|
* Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
|
|
@@ -416,5 +448,6 @@ export function buildResourceLoader(agentDir) {
|
|
|
416
448
|
return new DefaultResourceLoader({
|
|
417
449
|
agentDir,
|
|
418
450
|
additionalExtensionPaths: piExtensionPaths,
|
|
451
|
+
bundledExtensionNames: bundledKeys,
|
|
419
452
|
});
|
|
420
453
|
}
|
|
@@ -83,6 +83,15 @@ 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
|
+
} };
|
|
86
95
|
const { shell, args } = getShellConfig();
|
|
87
96
|
const resolvedCommand = sanitizeCommand(command);
|
|
88
97
|
const child = spawn(shell, [...args, resolvedCommand], {
|
|
@@ -93,11 +102,42 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
93
102
|
});
|
|
94
103
|
let timedOut = false;
|
|
95
104
|
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;
|
|
96
111
|
if (timeout !== undefined && timeout > 0) {
|
|
97
112
|
timeoutHandle = setTimeout(() => {
|
|
98
113
|
timedOut = true;
|
|
99
114
|
if (child.pid)
|
|
100
115
|
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();
|
|
101
141
|
}, timeout * 1000);
|
|
102
142
|
}
|
|
103
143
|
const chunks = [];
|
|
@@ -139,23 +179,31 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
139
179
|
child.on("error", (err) => {
|
|
140
180
|
if (timeoutHandle)
|
|
141
181
|
clearTimeout(timeoutHandle);
|
|
182
|
+
if (sigkillHandle)
|
|
183
|
+
clearTimeout(sigkillHandle);
|
|
184
|
+
if (hardDeadlineHandle)
|
|
185
|
+
clearTimeout(hardDeadlineHandle);
|
|
142
186
|
signal.removeEventListener("abort", onAbort);
|
|
143
|
-
|
|
187
|
+
safeReject(err);
|
|
144
188
|
});
|
|
145
189
|
child.on("close", (code) => {
|
|
146
190
|
if (timeoutHandle)
|
|
147
191
|
clearTimeout(timeoutHandle);
|
|
192
|
+
if (sigkillHandle)
|
|
193
|
+
clearTimeout(sigkillHandle);
|
|
194
|
+
if (hardDeadlineHandle)
|
|
195
|
+
clearTimeout(hardDeadlineHandle);
|
|
148
196
|
signal.removeEventListener("abort", onAbort);
|
|
149
197
|
if (spillStream)
|
|
150
198
|
spillStream.end();
|
|
151
199
|
if (signal.aborted) {
|
|
152
200
|
const output = Buffer.concat(chunks).toString("utf-8");
|
|
153
|
-
|
|
201
|
+
safeResolve(output ? `${output}\n\nCommand aborted` : "Command aborted");
|
|
154
202
|
return;
|
|
155
203
|
}
|
|
156
204
|
if (timedOut) {
|
|
157
205
|
const output = Buffer.concat(chunks).toString("utf-8");
|
|
158
|
-
|
|
206
|
+
safeResolve(output ? `${output}\n\nCommand timed out after ${timeout} seconds` : `Command timed out after ${timeout} seconds`);
|
|
159
207
|
return;
|
|
160
208
|
}
|
|
161
209
|
const fullOutput = Buffer.concat(chunks).toString("utf-8");
|
|
@@ -176,7 +224,7 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
176
224
|
if (code !== 0 && code !== null) {
|
|
177
225
|
text += `\n\nCommand exited with code ${code}`;
|
|
178
226
|
}
|
|
179
|
-
|
|
227
|
+
safeResolve(text);
|
|
180
228
|
});
|
|
181
229
|
});
|
|
182
230
|
}
|
|
@@ -54,6 +54,11 @@ 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;
|
|
57
62
|
// If all watched jobs are already done, return immediately
|
|
58
63
|
const running = watched.filter((j) => j.status === "running");
|
|
59
64
|
if (running.length === 0) {
|
|
@@ -34,6 +34,8 @@ 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;
|
|
37
39
|
const statusEmoji = job.status === "completed" ? "done" : "error";
|
|
38
40
|
const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(1);
|
|
39
41
|
const output = job.status === "completed"
|
|
@@ -371,6 +371,9 @@ export class BgManagerOverlay {
|
|
|
371
371
|
inner.push(th.fg("dim", "↑↓ scroll · tab output · q back"));
|
|
372
372
|
return this.box(inner, width);
|
|
373
373
|
}
|
|
374
|
+
dispose() {
|
|
375
|
+
clearInterval(this.refreshTimer);
|
|
376
|
+
}
|
|
374
377
|
invalidate() {
|
|
375
378
|
this.cachedWidth = undefined;
|
|
376
379
|
this.cachedLines = undefined;
|
|
@@ -165,9 +165,7 @@ 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
|
|
169
|
-
commitDocs: prefs?.git?.commit_docs,
|
|
170
|
-
});
|
|
168
|
+
deps.captureIntegrationBranch(s.basePath, mid);
|
|
171
169
|
}
|
|
172
170
|
deps.resolver.enterMilestone(mid, ctx.ui);
|
|
173
171
|
}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { deriveState } from "./state.js";
|
|
6
6
|
import { loadFile } from "./files.js";
|
|
7
7
|
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
8
|
-
import {
|
|
8
|
+
import { parseRoadmap } from "./parsers-legacy.js";
|
|
9
|
+
import { resolveMilestoneFile, resolveSliceFile, relSliceFile, } from "./paths.js";
|
|
9
10
|
import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
|
|
10
11
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
11
12
|
import { pauseAuto } from "./auto.js";
|
|
@@ -118,14 +119,20 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
|
|
|
118
119
|
}
|
|
119
120
|
case "reassess":
|
|
120
121
|
case "reassess-roadmap": {
|
|
121
|
-
// DB primary path — get completed slices
|
|
122
|
+
// DB primary path — get completed slices, fall back to file parsing when DB has no data
|
|
122
123
|
let completedSliceIds = [];
|
|
123
124
|
if (isDbAvailable()) {
|
|
124
125
|
completedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
|
|
125
126
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
if (completedSliceIds.length === 0) {
|
|
128
|
+
// File-based fallback: parse roadmap checkboxes
|
|
129
|
+
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
130
|
+
if (roadmapPath) {
|
|
131
|
+
const roadmapContent = await loadFile(roadmapPath);
|
|
132
|
+
if (roadmapContent) {
|
|
133
|
+
completedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
129
136
|
}
|
|
130
137
|
if (completedSliceIds.length === 0) {
|
|
131
138
|
ctx.ui.notify("Cannot dispatch reassess-roadmap: no completed slices.", "warning");
|
|
@@ -147,9 +154,15 @@ export async function dispatchDirectPhase(ctx, pi, phase, base) {
|
|
|
147
154
|
if (isDbAvailable()) {
|
|
148
155
|
uatCompletedSliceIds = getMilestoneSlices(mid).filter(s => s.status === "complete").map(s => s.id);
|
|
149
156
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
157
|
+
if (uatCompletedSliceIds.length === 0) {
|
|
158
|
+
// File-based fallback: parse roadmap checkboxes
|
|
159
|
+
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
160
|
+
if (roadmapPath) {
|
|
161
|
+
const roadmapContent = await loadFile(roadmapPath);
|
|
162
|
+
if (roadmapContent) {
|
|
163
|
+
uatCompletedSliceIds = parseRoadmap(roadmapContent).slices.filter(s => s.done).map(s => s.id);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
153
166
|
}
|
|
154
167
|
if (uatCompletedSliceIds.length === 0) {
|
|
155
168
|
ctx.ui.notify("Cannot dispatch run-uat: no completed slices.", "warning");
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { deriveState } from "./state.js";
|
|
14
14
|
import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
|
|
15
15
|
import { loadPrompt } from "./prompt-loader.js";
|
|
16
|
-
import { resolveSliceFile,
|
|
16
|
+
import { resolveSliceFile, resolveTaskFile, resolveMilestoneFile, resolveTasksDir, buildTaskFileName, gsdRoot, } from "./paths.js";
|
|
17
17
|
import { invalidateAllCaches } from "./cache.js";
|
|
18
18
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
19
19
|
import { autoCommitCurrentBranch, } from "./worktree.js";
|
|
@@ -22,13 +22,13 @@ import { writeUnitRuntimeRecord, clearUnitRuntimeRecord } from "./unit-runtime.j
|
|
|
22
22
|
import { runGSDDoctor, rebuildState, summarizeDoctorIssues } from "./doctor.js";
|
|
23
23
|
import { recordHealthSnapshot, checkHealEscalation } from "./doctor-proactive.js";
|
|
24
24
|
import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
|
|
25
|
-
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus } from "./gsd-db.js";
|
|
25
|
+
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
|
|
26
26
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
27
27
|
import { consumeSignal } from "./session-status-io.js";
|
|
28
28
|
import { checkPostUnitHooks, isRetryPending, consumeRetryTrigger, persistHookState, resolveHookArtifactPath, } from "./post-unit-hooks.js";
|
|
29
29
|
import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
30
30
|
import { debugLog } from "./debug-logger.js";
|
|
31
|
-
import { existsSync, unlinkSync
|
|
31
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
32
32
|
import { join } from "node:path";
|
|
33
33
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
34
34
|
import { _resetHasChangesCache } from "./native-git-bridge.js";
|
|
@@ -101,6 +101,39 @@ export function detectRogueFileWrites(unitType, unitId, basePath) {
|
|
|
101
101
|
if (!hasPlanningState) {
|
|
102
102
|
rogues.push({ path: planPath, unitType, unitId });
|
|
103
103
|
}
|
|
104
|
+
// Also check for rogue REPLAN.md
|
|
105
|
+
const replanPath = resolveSliceFile(basePath, mid, sid, "REPLAN");
|
|
106
|
+
if (replanPath && existsSync(replanPath) && !hasPlanningState) {
|
|
107
|
+
rogues.push({ path: replanPath, unitType, unitId });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (unitType === "reassess-roadmap") {
|
|
111
|
+
const [mid, sid] = parts;
|
|
112
|
+
if (!mid || !sid)
|
|
113
|
+
return [];
|
|
114
|
+
const assessPath = resolveSliceFile(basePath, mid, sid, "ASSESSMENT");
|
|
115
|
+
if (!assessPath || !existsSync(assessPath))
|
|
116
|
+
return [];
|
|
117
|
+
// Assessment file exists on disk — check if DB knows about it via the artifacts table
|
|
118
|
+
const adapter = _getAdapter();
|
|
119
|
+
if (adapter) {
|
|
120
|
+
const row = adapter.prepare(`SELECT 1 FROM artifacts WHERE path LIKE :pattern AND artifact_type = 'ASSESSMENT' LIMIT 1`).get({ ":pattern": `%${sid}-ASSESSMENT.md` });
|
|
121
|
+
if (!row) {
|
|
122
|
+
rogues.push({ path: assessPath, unitType, unitId });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (unitType === "plan-task") {
|
|
127
|
+
const [mid, sid, tid] = parts;
|
|
128
|
+
if (!mid || !sid || !tid)
|
|
129
|
+
return [];
|
|
130
|
+
const taskPlanPath = resolveTaskFile(basePath, mid, sid, tid, "PLAN");
|
|
131
|
+
if (!taskPlanPath || !existsSync(taskPlanPath))
|
|
132
|
+
return [];
|
|
133
|
+
const dbRow = getTask(mid, sid, tid);
|
|
134
|
+
if (!dbRow) {
|
|
135
|
+
rogues.push({ path: taskPlanPath, unitType, unitId });
|
|
136
|
+
}
|
|
104
137
|
}
|
|
105
138
|
return rogues;
|
|
106
139
|
}
|
|
@@ -468,26 +501,10 @@ export async function postUnitPostVerification(pctx) {
|
|
|
468
501
|
updateTaskStatus(mid, sid, tid, "pending");
|
|
469
502
|
await renderPlanCheckboxes(s.basePath, mid, sid);
|
|
470
503
|
}
|
|
471
|
-
catch {
|
|
472
|
-
// DB
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
if (slicePath) {
|
|
476
|
-
const { readdirSync } = await import("node:fs");
|
|
477
|
-
const planCandidates = readdirSync(slicePath)
|
|
478
|
-
.filter((f) => f.includes("PLAN") && (f.startsWith(sid) || f.startsWith(`${sid}-`)));
|
|
479
|
-
if (planCandidates.length > 0) {
|
|
480
|
-
const planFile = join(slicePath, planCandidates[0]);
|
|
481
|
-
let content = readFileSync(planFile, "utf-8");
|
|
482
|
-
const regex = new RegExp(`^(\\s*-\\s*)\\[x\\](\\s*\\**${tid}\\**[:\\s])`, "mi");
|
|
483
|
-
if (regex.test(content)) {
|
|
484
|
-
content = content.replace(regex, "$1[ ]$2");
|
|
485
|
-
writeFileSync(planFile, content, "utf-8");
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
catch { /* non-fatal: file-based fallback failure */ }
|
|
504
|
+
catch (dbErr) {
|
|
505
|
+
// DB unavailable — fail explicitly rather than silently reverting to markdown mutation.
|
|
506
|
+
// Use 'gsd recover' to rebuild DB state from disk if needed.
|
|
507
|
+
process.stderr.write(`gsd: retry state-reset failed (DB unavailable): ${dbErr.message}. Run 'gsd recover' to reconcile.\n`);
|
|
491
508
|
}
|
|
492
509
|
}
|
|
493
510
|
// 2. Delete SUMMARY.md for the task
|