gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -12
- package/dist/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +63 -77
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
- package/dist/resources/extensions/gsd/auto.js +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +17 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +6 -6
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +6 -6
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +2 -1
- package/packages/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
- package/src/resources/extensions/gsd/auto.ts +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +82 -103
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -47
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
- package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -64,17 +64,12 @@ export async function buildBeforeAgentStartResult(
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
knowledgeBlock = `\n\n[PROJECT KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${content}`;
|
|
74
|
-
}
|
|
75
|
-
} catch {
|
|
76
|
-
// skip
|
|
77
|
-
}
|
|
67
|
+
const { block: knowledgeBlock, globalSizeKb } = loadKnowledgeBlock(gsdHome, process.cwd());
|
|
68
|
+
if (globalSizeKb > 4) {
|
|
69
|
+
ctx.ui.notify(
|
|
70
|
+
`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`,
|
|
71
|
+
"warning",
|
|
72
|
+
);
|
|
78
73
|
}
|
|
79
74
|
|
|
80
75
|
let memoryBlock = "";
|
|
@@ -126,6 +121,48 @@ export async function buildBeforeAgentStartResult(
|
|
|
126
121
|
};
|
|
127
122
|
}
|
|
128
123
|
|
|
124
|
+
export function loadKnowledgeBlock(gsdHomeDir: string, cwd: string): { block: string; globalSizeKb: number } {
|
|
125
|
+
// 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
|
|
126
|
+
let globalKnowledge = "";
|
|
127
|
+
let globalSizeKb = 0;
|
|
128
|
+
const globalKnowledgePath = join(gsdHomeDir, "agent", "KNOWLEDGE.md");
|
|
129
|
+
if (existsSync(globalKnowledgePath)) {
|
|
130
|
+
try {
|
|
131
|
+
const content = readFileSync(globalKnowledgePath, "utf-8").trim();
|
|
132
|
+
if (content) {
|
|
133
|
+
globalSizeKb = Buffer.byteLength(content, "utf-8") / 1024;
|
|
134
|
+
globalKnowledge = content;
|
|
135
|
+
}
|
|
136
|
+
} catch {
|
|
137
|
+
// skip
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 2. Project knowledge (.gsd/KNOWLEDGE.md) — project-specific
|
|
142
|
+
let projectKnowledge = "";
|
|
143
|
+
const knowledgePath = resolveGsdRootFile(cwd, "KNOWLEDGE");
|
|
144
|
+
if (existsSync(knowledgePath)) {
|
|
145
|
+
try {
|
|
146
|
+
const content = readFileSync(knowledgePath, "utf-8").trim();
|
|
147
|
+
if (content) projectKnowledge = content;
|
|
148
|
+
} catch {
|
|
149
|
+
// skip
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!globalKnowledge && !projectKnowledge) {
|
|
154
|
+
return { block: "", globalSizeKb: 0 };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const parts: string[] = [];
|
|
158
|
+
if (globalKnowledge) parts.push(`## Global Knowledge\n\n${globalKnowledge}`);
|
|
159
|
+
if (projectKnowledge) parts.push(`## Project Knowledge\n\n${projectKnowledge}`);
|
|
160
|
+
return {
|
|
161
|
+
block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${parts.join("\n\n")}`,
|
|
162
|
+
globalSizeKb,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
129
166
|
function buildWorktreeContextBlock(): string {
|
|
130
167
|
const worktreeName = getActiveWorktreeName();
|
|
131
168
|
const worktreeMainCwd = getWorktreeOriginalCwd();
|
|
@@ -15,7 +15,7 @@ export interface GsdCommandDefinition {
|
|
|
15
15
|
type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
|
|
16
16
|
|
|
17
17
|
export const GSD_COMMAND_DESCRIPTION =
|
|
18
|
-
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast";
|
|
18
|
+
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink";
|
|
19
19
|
|
|
20
20
|
export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
21
21
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
@@ -68,6 +68,8 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
68
68
|
{ cmd: "templates", desc: "List available workflow templates" },
|
|
69
69
|
{ cmd: "extensions", desc: "Manage extensions (list, enable, disable, info)" },
|
|
70
70
|
{ cmd: "fast", desc: "Toggle OpenAI service tier (on/off/flex/status)" },
|
|
71
|
+
{ cmd: "mcp", desc: "MCP server status and connectivity check (status, check <server>)" },
|
|
72
|
+
{ cmd: "rethink", desc: "Conversational project reorganization — reorder, park, discard, add milestones" },
|
|
71
73
|
{ cmd: "workflow", desc: "Custom workflow lifecycle (new, run, list, validate, pause, resume)" },
|
|
72
74
|
];
|
|
73
75
|
|
|
@@ -187,6 +189,10 @@ const NESTED_COMPLETIONS: CompletionMap = {
|
|
|
187
189
|
{ cmd: "flex", desc: "Flex tier (0.5x cost, slower)" },
|
|
188
190
|
{ cmd: "status", desc: "Show current service tier setting" },
|
|
189
191
|
],
|
|
192
|
+
mcp: [
|
|
193
|
+
{ cmd: "status", desc: "Show all MCP server statuses (default)" },
|
|
194
|
+
{ cmd: "check", desc: "Detailed status for a specific server" },
|
|
195
|
+
],
|
|
190
196
|
doctor: [
|
|
191
197
|
{ cmd: "fix", desc: "Auto-fix detected issues" },
|
|
192
198
|
{ cmd: "heal", desc: "AI-driven deep healing" },
|
|
@@ -47,15 +47,10 @@ export async function guardRemoteSession(
|
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
const unitsMsg = remote.completedUnits != null
|
|
51
|
-
? `${remote.completedUnits} units completed`
|
|
52
|
-
: "";
|
|
53
|
-
|
|
54
50
|
const choice = await showNextAction(ctx, {
|
|
55
51
|
title: `Auto-mode is running in another terminal (PID ${remote.pid})`,
|
|
56
52
|
summary: [
|
|
57
53
|
`Currently executing: ${unitLabel}`,
|
|
58
|
-
...(unitsMsg ? [unitsMsg] : []),
|
|
59
54
|
...(remote.startedAt ? [`Started: ${remote.startedAt}`] : []),
|
|
60
55
|
],
|
|
61
56
|
actions: [
|
|
@@ -36,6 +36,7 @@ export function showHelp(ctx: ExtensionCommandContext): void {
|
|
|
36
36
|
" /gsd triage Classify and route pending captures",
|
|
37
37
|
" /gsd skip <unit> Prevent a unit from auto-mode dispatch",
|
|
38
38
|
" /gsd undo Revert last completed unit [--force]",
|
|
39
|
+
" /gsd rethink Conversational project reorganization — reorder, park, discard, add milestones",
|
|
39
40
|
" /gsd park [id] Park a milestone — skip without deleting [reason]",
|
|
40
41
|
" /gsd unpark [id] Reactivate a parked milestone",
|
|
41
42
|
"",
|
|
@@ -53,6 +54,7 @@ export function showHelp(ctx: ExtensionCommandContext): void {
|
|
|
53
54
|
" /gsd hooks Show post-unit hook configuration",
|
|
54
55
|
" /gsd extensions Manage extensions [list|enable|disable|info]",
|
|
55
56
|
" /gsd fast Toggle OpenAI service tier [on|off|flex|status]",
|
|
57
|
+
" /gsd mcp MCP server status and connectivity [status|check <server>]",
|
|
56
58
|
"",
|
|
57
59
|
"MAINTENANCE",
|
|
58
60
|
" /gsd doctor Diagnose and repair .gsd/ state [audit|fix|heal] [scope]",
|
|
@@ -191,10 +191,20 @@ Examples:
|
|
|
191
191
|
await handleFast(trimmed.replace(/^fast\s*/, "").trim(), ctx);
|
|
192
192
|
return true;
|
|
193
193
|
}
|
|
194
|
+
if (trimmed === "mcp" || trimmed.startsWith("mcp ")) {
|
|
195
|
+
const { handleMcpStatus } = await import("../../commands-mcp-status.js");
|
|
196
|
+
await handleMcpStatus(trimmed.replace(/^mcp\s*/, "").trim(), ctx);
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
194
199
|
if (trimmed === "extensions" || trimmed.startsWith("extensions ")) {
|
|
195
200
|
const { handleExtensions } = await import("../../commands-extensions.js");
|
|
196
201
|
await handleExtensions(trimmed.replace(/^extensions\s*/, "").trim(), ctx);
|
|
197
202
|
return true;
|
|
198
203
|
}
|
|
204
|
+
if (trimmed === "rethink") {
|
|
205
|
+
const { handleRethink } = await import("../../rethink.js");
|
|
206
|
+
await handleRethink(trimmed, ctx, pi);
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
199
209
|
return false;
|
|
200
210
|
}
|
|
@@ -63,7 +63,7 @@ export async function handleParallelCommand(trimmed: string, _ctx: ExtensionComm
|
|
|
63
63
|
}
|
|
64
64
|
const lines = ["# Parallel Workers\n"];
|
|
65
65
|
for (const worker of workers) {
|
|
66
|
-
lines.push(`- **${worker.milestoneId}** (${worker.title}) — ${worker.state} —
|
|
66
|
+
lines.push(`- **${worker.milestoneId}** (${worker.title}) — ${worker.state} — $${worker.cost.toFixed(2)}`);
|
|
67
67
|
}
|
|
68
68
|
const state = getOrchestratorState();
|
|
69
69
|
if (state) {
|
|
@@ -188,6 +188,14 @@ export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionComma
|
|
|
188
188
|
return true;
|
|
189
189
|
}
|
|
190
190
|
if (trimmed === "quick" || trimmed.startsWith("quick ")) {
|
|
191
|
+
if (isAutoActive()) {
|
|
192
|
+
ctx.ui.notify(
|
|
193
|
+
"/gsd quick cannot run while auto-mode is active.\n" +
|
|
194
|
+
"Stop auto-mode first with /gsd stop, then run /gsd quick.",
|
|
195
|
+
"error",
|
|
196
|
+
);
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
191
199
|
await handleQuick(trimmed.replace(/^quick\s*/, "").trim(), ctx, pi);
|
|
192
200
|
return true;
|
|
193
201
|
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Status — `/gsd mcp` command handler.
|
|
3
|
+
*
|
|
4
|
+
* Shows configured MCP servers, their connection status, and available tools.
|
|
5
|
+
*
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* /gsd mcp — Overview of all servers (alias: /gsd mcp status)
|
|
8
|
+
* /gsd mcp status — Same as bare /gsd mcp
|
|
9
|
+
* /gsd mcp check <srv> — Detailed status for a specific server
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
13
|
+
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
|
|
17
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export interface McpServerStatus {
|
|
20
|
+
name: string;
|
|
21
|
+
transport: "stdio" | "http" | "unknown";
|
|
22
|
+
connected: boolean;
|
|
23
|
+
toolCount: number;
|
|
24
|
+
error: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface McpServerDetail extends McpServerStatus {
|
|
28
|
+
tools: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ─── Config reader (standalone — does not import mcp-client internals) ──────
|
|
32
|
+
|
|
33
|
+
interface McpServerRawConfig {
|
|
34
|
+
name: string;
|
|
35
|
+
transport: "stdio" | "http" | "unknown";
|
|
36
|
+
command?: string;
|
|
37
|
+
args?: string[];
|
|
38
|
+
url?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function readMcpConfigs(): McpServerRawConfig[] {
|
|
42
|
+
const servers: McpServerRawConfig[] = [];
|
|
43
|
+
const seen = new Set<string>();
|
|
44
|
+
const configPaths = [
|
|
45
|
+
join(process.cwd(), ".mcp.json"),
|
|
46
|
+
join(process.cwd(), ".gsd", "mcp.json"),
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
for (const configPath of configPaths) {
|
|
50
|
+
try {
|
|
51
|
+
if (!existsSync(configPath)) continue;
|
|
52
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
53
|
+
const data = JSON.parse(raw) as Record<string, unknown>;
|
|
54
|
+
const mcpServers = (data.mcpServers ?? data.servers) as
|
|
55
|
+
| Record<string, Record<string, unknown>>
|
|
56
|
+
| undefined;
|
|
57
|
+
if (!mcpServers || typeof mcpServers !== "object") continue;
|
|
58
|
+
|
|
59
|
+
for (const [name, config] of Object.entries(mcpServers)) {
|
|
60
|
+
if (seen.has(name)) continue;
|
|
61
|
+
seen.add(name);
|
|
62
|
+
|
|
63
|
+
const hasCommand = typeof config.command === "string";
|
|
64
|
+
const hasUrl = typeof config.url === "string";
|
|
65
|
+
const transport: McpServerRawConfig["transport"] = hasCommand
|
|
66
|
+
? "stdio"
|
|
67
|
+
: hasUrl
|
|
68
|
+
? "http"
|
|
69
|
+
: "unknown";
|
|
70
|
+
|
|
71
|
+
servers.push({
|
|
72
|
+
name,
|
|
73
|
+
transport,
|
|
74
|
+
...(hasCommand && {
|
|
75
|
+
command: config.command as string,
|
|
76
|
+
args: Array.isArray(config.args) ? (config.args as string[]) : undefined,
|
|
77
|
+
}),
|
|
78
|
+
...(hasUrl && { url: config.url as string }),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
// Non-fatal — config file may not exist or be malformed
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return servers;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ─── Formatters (exported for testing) ──────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
export function formatMcpStatusReport(servers: McpServerStatus[]): string {
|
|
92
|
+
if (servers.length === 0) {
|
|
93
|
+
return [
|
|
94
|
+
"No MCP servers configured.",
|
|
95
|
+
"",
|
|
96
|
+
"Add servers to .mcp.json or .gsd/mcp.json to enable MCP integrations.",
|
|
97
|
+
"See: https://modelcontextprotocol.io/quickstart",
|
|
98
|
+
].join("\n");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const lines: string[] = [`MCP Server Status — ${servers.length} server(s)\n`];
|
|
102
|
+
|
|
103
|
+
for (const s of servers) {
|
|
104
|
+
const icon = s.error ? "✗" : s.connected ? "✓" : "○";
|
|
105
|
+
const status = s.error
|
|
106
|
+
? `error: ${s.error}`
|
|
107
|
+
: s.connected
|
|
108
|
+
? `connected — ${s.toolCount} tools`
|
|
109
|
+
: "disconnected";
|
|
110
|
+
lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
lines.push("");
|
|
114
|
+
lines.push("Use /gsd mcp check <server> for details on a specific server.");
|
|
115
|
+
lines.push("Use mcp_discover to connect and list tools for a server.");
|
|
116
|
+
|
|
117
|
+
return lines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function formatMcpServerDetail(server: McpServerDetail): string {
|
|
121
|
+
const lines: string[] = [`MCP Server: ${server.name}\n`];
|
|
122
|
+
|
|
123
|
+
lines.push(` Transport: ${server.transport}`);
|
|
124
|
+
|
|
125
|
+
if (server.error) {
|
|
126
|
+
lines.push(` Status: error`);
|
|
127
|
+
lines.push(` Error: ${server.error}`);
|
|
128
|
+
} else if (server.connected) {
|
|
129
|
+
lines.push(` Status: connected`);
|
|
130
|
+
lines.push(` Tools: ${server.toolCount}`);
|
|
131
|
+
if (server.tools.length > 0) {
|
|
132
|
+
lines.push("");
|
|
133
|
+
lines.push(" Available tools:");
|
|
134
|
+
for (const tool of server.tools) {
|
|
135
|
+
lines.push(` - ${tool}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
lines.push(` Status: disconnected`);
|
|
140
|
+
lines.push("");
|
|
141
|
+
lines.push(` Run mcp_discover("${server.name}") to connect and list tools.`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return lines.join("\n");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ─── Command handler ────────────────────────────────────────────────────────
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Handle `/gsd mcp [status|check <server>]`.
|
|
151
|
+
*/
|
|
152
|
+
export async function handleMcpStatus(
|
|
153
|
+
args: string,
|
|
154
|
+
ctx: ExtensionCommandContext,
|
|
155
|
+
): Promise<void> {
|
|
156
|
+
const trimmed = args.trim().toLowerCase();
|
|
157
|
+
const configs = readMcpConfigs();
|
|
158
|
+
|
|
159
|
+
// /gsd mcp check <server>
|
|
160
|
+
if (trimmed.startsWith("check ")) {
|
|
161
|
+
const serverName = args.trim().slice("check ".length).trim();
|
|
162
|
+
const config = configs.find((c) => c.name === serverName);
|
|
163
|
+
if (!config) {
|
|
164
|
+
const available = configs.map((c) => c.name).join(", ") || "(none)";
|
|
165
|
+
ctx.ui.notify(
|
|
166
|
+
`Unknown MCP server: "${serverName}"\n\nAvailable: ${available}`,
|
|
167
|
+
"warning",
|
|
168
|
+
);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Try to get connection/tool info from the mcp-client module if available
|
|
173
|
+
let connected = false;
|
|
174
|
+
let toolNames: string[] = [];
|
|
175
|
+
let error: string | undefined;
|
|
176
|
+
try {
|
|
177
|
+
const mcpClient = await import("../mcp-client/index.js");
|
|
178
|
+
// Access the module's connection state if exported; fall back gracefully
|
|
179
|
+
const mod = mcpClient as Record<string, unknown>;
|
|
180
|
+
if (typeof mod.getConnectionStatus === "function") {
|
|
181
|
+
const status = (mod.getConnectionStatus as (name: string) => { connected: boolean; tools: string[]; error?: string })(serverName);
|
|
182
|
+
connected = status.connected;
|
|
183
|
+
toolNames = status.tools;
|
|
184
|
+
error = status.error;
|
|
185
|
+
}
|
|
186
|
+
} catch {
|
|
187
|
+
// mcp-client may not expose status helpers — that's fine
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
ctx.ui.notify(
|
|
191
|
+
formatMcpServerDetail({
|
|
192
|
+
name: config.name,
|
|
193
|
+
transport: config.transport,
|
|
194
|
+
connected,
|
|
195
|
+
toolCount: toolNames.length,
|
|
196
|
+
tools: toolNames,
|
|
197
|
+
error,
|
|
198
|
+
}),
|
|
199
|
+
"info",
|
|
200
|
+
);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// /gsd mcp or /gsd mcp status
|
|
205
|
+
if (!trimmed || trimmed === "status") {
|
|
206
|
+
// Build status for each server
|
|
207
|
+
const statuses: McpServerStatus[] = [];
|
|
208
|
+
|
|
209
|
+
for (const config of configs) {
|
|
210
|
+
let connected = false;
|
|
211
|
+
let toolCount = 0;
|
|
212
|
+
let error: string | undefined;
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
const mcpClient = await import("../mcp-client/index.js");
|
|
216
|
+
const mod = mcpClient as Record<string, unknown>;
|
|
217
|
+
if (typeof mod.getConnectionStatus === "function") {
|
|
218
|
+
const status = (mod.getConnectionStatus as (name: string) => { connected: boolean; tools: string[]; error?: string })(config.name);
|
|
219
|
+
connected = status.connected;
|
|
220
|
+
toolCount = status.tools.length;
|
|
221
|
+
error = status.error;
|
|
222
|
+
}
|
|
223
|
+
} catch {
|
|
224
|
+
// Fall back to unknown state
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
statuses.push({
|
|
228
|
+
name: config.name,
|
|
229
|
+
transport: config.transport,
|
|
230
|
+
connected,
|
|
231
|
+
toolCount,
|
|
232
|
+
error,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
ctx.ui.notify(formatMcpStatusReport(statuses), "info");
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Unknown subcommand
|
|
241
|
+
ctx.ui.notify(
|
|
242
|
+
"Usage: /gsd mcp [status|check <server>]\n\n" +
|
|
243
|
+
" status Show all MCP server statuses (default)\n" +
|
|
244
|
+
" check <server> Detailed status for a specific server",
|
|
245
|
+
"warning",
|
|
246
|
+
);
|
|
247
|
+
}
|
|
@@ -23,7 +23,6 @@ export interface LockData {
|
|
|
23
23
|
unitType: string;
|
|
24
24
|
unitId: string;
|
|
25
25
|
unitStartedAt: string;
|
|
26
|
-
completedUnits: number;
|
|
27
26
|
/** Path to the pi session JSONL file that was active when this unit started. */
|
|
28
27
|
sessionFile?: string;
|
|
29
28
|
}
|
|
@@ -37,7 +36,6 @@ export function writeLock(
|
|
|
37
36
|
basePath: string,
|
|
38
37
|
unitType: string,
|
|
39
38
|
unitId: string,
|
|
40
|
-
completedUnits: number,
|
|
41
39
|
sessionFile?: string,
|
|
42
40
|
): void {
|
|
43
41
|
try {
|
|
@@ -47,7 +45,6 @@ export function writeLock(
|
|
|
47
45
|
unitType,
|
|
48
46
|
unitId,
|
|
49
47
|
unitStartedAt: new Date().toISOString(),
|
|
50
|
-
completedUnits,
|
|
51
48
|
sessionFile,
|
|
52
49
|
};
|
|
53
50
|
const lp = lockPath(basePath);
|
|
@@ -102,12 +99,11 @@ export function formatCrashInfo(lock: LockData): string {
|
|
|
102
99
|
`Previous auto-mode session was interrupted.`,
|
|
103
100
|
` Was executing: ${lock.unitType} (${lock.unitId})`,
|
|
104
101
|
` Started at: ${lock.unitStartedAt}`,
|
|
105
|
-
` Units completed before crash: ${lock.completedUnits}`,
|
|
106
102
|
` PID: ${lock.pid}`,
|
|
107
103
|
];
|
|
108
104
|
|
|
109
105
|
// Add recovery guidance based on what was happening when it crashed
|
|
110
|
-
if (lock.unitType === "starting" && lock.unitId === "bootstrap"
|
|
106
|
+
if (lock.unitType === "starting" && lock.unitId === "bootstrap") {
|
|
111
107
|
lines.push(`No work was lost. Run /gsd auto to restart.`);
|
|
112
108
|
} else if (lock.unitType.includes("research") || lock.unitType.includes("plan")) {
|
|
113
109
|
lines.push(`The ${lock.unitType} unit may be incomplete. Run /gsd auto to re-run it.`);
|
|
@@ -99,18 +99,11 @@ export class GSDDashboardOverlay {
|
|
|
99
99
|
const currentUnit = dashData.currentUnit
|
|
100
100
|
? `${dashData.currentUnit.type}:${dashData.currentUnit.id}:${dashData.currentUnit.startedAt}`
|
|
101
101
|
: "-";
|
|
102
|
-
const lastCompleted = dashData.completedUnits.length > 0
|
|
103
|
-
? dashData.completedUnits[dashData.completedUnits.length - 1]
|
|
104
|
-
: null;
|
|
105
|
-
const completedKey = lastCompleted
|
|
106
|
-
? `${dashData.completedUnits.length}:${lastCompleted.type}:${lastCompleted.id}:${lastCompleted.finishedAt}`
|
|
107
|
-
: "0";
|
|
108
102
|
return [
|
|
109
103
|
base,
|
|
110
104
|
dashData.active ? "1" : "0",
|
|
111
105
|
dashData.paused ? "1" : "0",
|
|
112
106
|
currentUnit,
|
|
113
|
-
completedKey,
|
|
114
107
|
].join("|");
|
|
115
108
|
}
|
|
116
109
|
|
|
@@ -458,49 +451,6 @@ export class GSDDashboardOverlay {
|
|
|
458
451
|
lines.push(centered(th.fg("dim", "No active milestone.")));
|
|
459
452
|
}
|
|
460
453
|
|
|
461
|
-
if (this.dashData.completedUnits.length > 0) {
|
|
462
|
-
lines.push(blank());
|
|
463
|
-
lines.push(hr());
|
|
464
|
-
lines.push(row(th.fg("text", th.bold("Completed"))));
|
|
465
|
-
lines.push(blank());
|
|
466
|
-
|
|
467
|
-
// Build ledger lookup for budget indicators (last entry wins for retries)
|
|
468
|
-
const ledgerLookup = new Map<string, UnitMetrics>();
|
|
469
|
-
const currentLedger = getLedger();
|
|
470
|
-
if (currentLedger) {
|
|
471
|
-
for (const lu of currentLedger.units) {
|
|
472
|
-
ledgerLookup.set(`${lu.type}:${lu.id}`, lu);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
const recent = [...this.dashData.completedUnits].reverse().slice(0, 10);
|
|
477
|
-
for (const u of recent) {
|
|
478
|
-
// Budget indicators from ledger — use warning glyph for pressured units
|
|
479
|
-
const ledgerEntry = ledgerLookup.get(`${u.type}:${u.id}`);
|
|
480
|
-
const hadPressure = ledgerEntry?.continueHereFired === true;
|
|
481
|
-
const hadTruncation = (ledgerEntry?.truncationSections ?? 0) > 0;
|
|
482
|
-
const unitGlyph = hadPressure
|
|
483
|
-
? th.fg(STATUS_COLOR.warning, STATUS_GLYPH.warning)
|
|
484
|
-
: th.fg(STATUS_COLOR.done, STATUS_GLYPH.done);
|
|
485
|
-
const left = ` ${unitGlyph} ${th.fg("muted", unitLabel(u.type))} ${th.fg("muted", u.id)}`;
|
|
486
|
-
|
|
487
|
-
let budgetMarkers = "";
|
|
488
|
-
if (hadTruncation) {
|
|
489
|
-
budgetMarkers += th.fg("warning", ` ▼${ledgerEntry!.truncationSections}`);
|
|
490
|
-
}
|
|
491
|
-
if (hadPressure) {
|
|
492
|
-
budgetMarkers += th.fg("error", " → wrap-up");
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
const right = th.fg("dim", formatDuration(u.finishedAt - u.startedAt));
|
|
496
|
-
lines.push(row(joinColumns(`${left}${budgetMarkers}`, right, contentWidth)));
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
if (this.dashData.completedUnits.length > 10) {
|
|
500
|
-
lines.push(row(th.fg("dim", ` ...and ${this.dashData.completedUnits.length - 10} more`)));
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
454
|
const ledger = getLedger();
|
|
505
455
|
if (ledger && ledger.units.length > 0) {
|
|
506
456
|
const totals = getProjectTotals(ledger.units);
|
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
// parseDecisionsTable() and parseRequirementsSections() with field fidelity.
|
|
10
10
|
|
|
11
11
|
import { join, resolve } from 'node:path';
|
|
12
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
12
|
+
import { readFileSync, existsSync, statSync } from 'node:fs';
|
|
13
13
|
import type { Decision, Requirement } from './types.js';
|
|
14
14
|
import { resolveGsdRootFile } from './paths.js';
|
|
15
15
|
import { saveFile } from './files.js';
|
|
16
16
|
import { GSDError, GSD_STALE_STATE, GSD_IO_ERROR } from './errors.js';
|
|
17
|
+
import { logWarning, logError } from './workflow-logger.js';
|
|
17
18
|
import { invalidateStateCache } from './state.js';
|
|
18
19
|
import { clearPathCache } from './paths.js';
|
|
19
20
|
import { clearParseCache } from './files.js';
|
|
@@ -221,7 +222,7 @@ export async function nextDecisionId(): Promise<string> {
|
|
|
221
222
|
const next = maxNum + 1;
|
|
222
223
|
return `D${String(next).padStart(3, '0')}`;
|
|
223
224
|
} catch (err) {
|
|
224
|
-
|
|
225
|
+
logError('manifest', 'nextDecisionId failed', { fn: 'nextDecisionId', error: String((err as Error).message) });
|
|
225
226
|
return 'D001';
|
|
226
227
|
}
|
|
227
228
|
}
|
|
@@ -311,9 +312,7 @@ export async function saveDecisionToDb(
|
|
|
311
312
|
try {
|
|
312
313
|
await saveFile(filePath, md);
|
|
313
314
|
} catch (diskErr) {
|
|
314
|
-
|
|
315
|
-
`gsd-db: saveDecisionToDb — disk write failed, rolling back DB row: ${(diskErr as Error).message}\n`,
|
|
316
|
-
);
|
|
315
|
+
logError('manifest', 'disk write failed, rolling back DB row', { fn: 'saveDecisionToDb', error: String((diskErr as Error).message) });
|
|
317
316
|
adapter?.prepare('DELETE FROM decisions WHERE id = :id').run({ ':id': id });
|
|
318
317
|
throw diskErr;
|
|
319
318
|
}
|
|
@@ -325,7 +324,7 @@ export async function saveDecisionToDb(
|
|
|
325
324
|
|
|
326
325
|
return { id };
|
|
327
326
|
} catch (err) {
|
|
328
|
-
|
|
327
|
+
logError('manifest', 'saveDecisionToDb failed', { fn: 'saveDecisionToDb', error: String((err as Error).message) });
|
|
329
328
|
throw err;
|
|
330
329
|
}
|
|
331
330
|
}
|
|
@@ -388,9 +387,7 @@ export async function updateRequirementInDb(
|
|
|
388
387
|
try {
|
|
389
388
|
await saveFile(filePath, md);
|
|
390
389
|
} catch (diskErr) {
|
|
391
|
-
|
|
392
|
-
`gsd-db: updateRequirementInDb — disk write failed, reverting DB row: ${(diskErr as Error).message}\n`,
|
|
393
|
-
);
|
|
390
|
+
logError('manifest', 'disk write failed, reverting DB row', { fn: 'updateRequirementInDb', error: String((diskErr as Error).message) });
|
|
394
391
|
db.upsertRequirement(existing);
|
|
395
392
|
throw diskErr;
|
|
396
393
|
}
|
|
@@ -400,7 +397,7 @@ export async function updateRequirementInDb(
|
|
|
400
397
|
clearPathCache();
|
|
401
398
|
clearParseCache();
|
|
402
399
|
} catch (err) {
|
|
403
|
-
|
|
400
|
+
logError('manifest', 'updateRequirementInDb failed', { fn: 'updateRequirementInDb', error: String((err as Error).message) });
|
|
404
401
|
throw err;
|
|
405
402
|
}
|
|
406
403
|
}
|
|
@@ -428,30 +425,47 @@ export async function saveArtifactToDb(
|
|
|
428
425
|
try {
|
|
429
426
|
const db = await import('./gsd-db.js');
|
|
430
427
|
|
|
428
|
+
// Guard against path traversal before any reads/writes
|
|
429
|
+
const gsdDir = resolve(basePath, '.gsd');
|
|
430
|
+
const fullPath = resolve(basePath, '.gsd', opts.path);
|
|
431
|
+
if (!fullPath.startsWith(gsdDir)) {
|
|
432
|
+
throw new GSDError(GSD_IO_ERROR, `saveArtifactToDb: path escapes .gsd/ directory: ${opts.path}`);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Shrinkage guard: if the file already exists and the new content is
|
|
436
|
+
// significantly smaller (<50%), preserve the richer file on disk and
|
|
437
|
+
// store its content in the DB instead of the abbreviated version.
|
|
438
|
+
let dbContent = opts.content;
|
|
439
|
+
let skipDiskWrite = false;
|
|
440
|
+
if (existsSync(fullPath)) {
|
|
441
|
+
const existingSize = statSync(fullPath).size;
|
|
442
|
+
const newSize = Buffer.byteLength(opts.content, 'utf-8');
|
|
443
|
+
if (existingSize > 0 && newSize < existingSize * 0.5) {
|
|
444
|
+
logWarning('manifest', `new content (${newSize}B) is <50% of existing file (${existingSize}B), preserving disk file`, { fn: 'saveArtifactToDb', path: opts.path });
|
|
445
|
+
dbContent = readFileSync(fullPath, 'utf-8');
|
|
446
|
+
skipDiskWrite = true;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
431
450
|
db.insertArtifact({
|
|
432
451
|
path: opts.path,
|
|
433
452
|
artifact_type: opts.artifact_type,
|
|
434
453
|
milestone_id: opts.milestone_id ?? null,
|
|
435
454
|
slice_id: opts.slice_id ?? null,
|
|
436
455
|
task_id: opts.task_id ?? null,
|
|
437
|
-
full_content:
|
|
456
|
+
full_content: dbContent,
|
|
438
457
|
});
|
|
439
458
|
|
|
440
|
-
// Write the file to disk (
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
`gsd-db: saveArtifactToDb — disk write failed, rolling back DB row: ${(diskErr as Error).message}\n`,
|
|
451
|
-
);
|
|
452
|
-
const rollbackAdapter = db._getAdapter();
|
|
453
|
-
rollbackAdapter?.prepare('DELETE FROM artifacts WHERE path = :path').run({ ':path': opts.path });
|
|
454
|
-
throw diskErr;
|
|
459
|
+
// Write the file to disk (only if we're not preserving a richer existing file)
|
|
460
|
+
if (!skipDiskWrite) {
|
|
461
|
+
try {
|
|
462
|
+
await saveFile(fullPath, opts.content);
|
|
463
|
+
} catch (diskErr) {
|
|
464
|
+
logError('manifest', 'disk write failed, rolling back DB row', { fn: 'saveArtifactToDb', error: String((diskErr as Error).message) });
|
|
465
|
+
const rollbackAdapter = db._getAdapter();
|
|
466
|
+
rollbackAdapter?.prepare('DELETE FROM artifacts WHERE path = :path').run({ ':path': opts.path });
|
|
467
|
+
throw diskErr;
|
|
468
|
+
}
|
|
455
469
|
}
|
|
456
470
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
457
471
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
@@ -459,7 +473,7 @@ export async function saveArtifactToDb(
|
|
|
459
473
|
clearPathCache();
|
|
460
474
|
clearParseCache();
|
|
461
475
|
} catch (err) {
|
|
462
|
-
|
|
476
|
+
logError('manifest', 'saveArtifactToDb failed', { fn: 'saveArtifactToDb', error: String((err as Error).message) });
|
|
463
477
|
throw err;
|
|
464
478
|
}
|
|
465
479
|
}
|