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
|
@@ -19,13 +19,11 @@ import { clearActivityLogState } from "./activity-log.js";
|
|
|
19
19
|
import { synthesizeCrashRecovery, getDeepDiagnostic, } from "./session-forensics.js";
|
|
20
20
|
import { writeLock, clearLock, readCrashLock, isLockProcessAlive, } from "./crash-recovery.js";
|
|
21
21
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
22
|
-
import { clearUnitRuntimeRecord, readUnitRuntimeRecord, writeUnitRuntimeRecord, } from "./unit-runtime.js";
|
|
23
22
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, getIsolationMode, } from "./preferences.js";
|
|
24
23
|
import { sendDesktopNotification } from "./notifications.js";
|
|
25
24
|
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, } from "./auto-budget.js";
|
|
26
25
|
import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, } from "./auto-tool-tracking.js";
|
|
27
26
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
28
|
-
import { selfHealRuntimeRecords } from "./auto-recovery.js";
|
|
29
27
|
import { selectAndApplyModel, resolveModelId } from "./auto-model-selection.js";
|
|
30
28
|
import { syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree-sync.js";
|
|
31
29
|
import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
|
|
@@ -44,7 +42,7 @@ import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
|
44
42
|
import { createAutoWorktree, enterAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, } from "./auto-worktree.js";
|
|
45
43
|
import { pruneQueueOrder } from "./queue-order.js";
|
|
46
44
|
import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
|
|
47
|
-
import {
|
|
45
|
+
import { reconcileMergeState, } from "./auto-recovery.js";
|
|
48
46
|
import { resolveDispatch, DISPATCH_RULES } from "./auto-dispatch.js";
|
|
49
47
|
import { initRegistry, convertDispatchRules } from "./rule-registry.js";
|
|
50
48
|
import { emitJournalEvent as _emitJournalEvent } from "./journal.js";
|
|
@@ -82,11 +80,10 @@ const s = new AutoSession();
|
|
|
82
80
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
83
81
|
export function shouldUseWorktreeIsolation() {
|
|
84
82
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
85
|
-
if (prefs?.isolation === "
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return true; // default: worktree
|
|
83
|
+
if (prefs?.isolation === "worktree")
|
|
84
|
+
return true;
|
|
85
|
+
// Default is false — worktree isolation requires explicit opt-in
|
|
86
|
+
return false;
|
|
90
87
|
}
|
|
91
88
|
/** Crash recovery prompt — set by startAuto, consumed by the main loop */
|
|
92
89
|
/** Pending verification retry — set when gate fails with retries remaining, consumed by autoLoop */
|
|
@@ -146,7 +143,6 @@ export function getAutoDashboardData() {
|
|
|
146
143
|
? (s.autoStartTime > 0 ? Date.now() - s.autoStartTime : 0)
|
|
147
144
|
: 0,
|
|
148
145
|
currentUnit: s.currentUnit ? { ...s.currentUnit } : null,
|
|
149
|
-
completedUnits: [...s.completedUnits],
|
|
150
146
|
basePath: s.basePath,
|
|
151
147
|
totalCost: totals?.cost ?? 0,
|
|
152
148
|
totalTokens: totals?.tokens.total ?? 0,
|
|
@@ -245,7 +241,6 @@ export function checkRemoteAutoSession(projectRoot) {
|
|
|
245
241
|
unitType: lock.unitType,
|
|
246
242
|
unitId: lock.unitId,
|
|
247
243
|
startedAt: lock.startedAt,
|
|
248
|
-
completedUnits: lock.completedUnits,
|
|
249
244
|
};
|
|
250
245
|
}
|
|
251
246
|
export function isStepMode() {
|
|
@@ -270,16 +265,12 @@ function clearUnitTimeout() {
|
|
|
270
265
|
}
|
|
271
266
|
clearInFlightTools();
|
|
272
267
|
}
|
|
273
|
-
/** Build snapshot metric opts
|
|
274
|
-
function buildSnapshotOpts(
|
|
275
|
-
const runtime = s.currentUnit
|
|
276
|
-
? readUnitRuntimeRecord(s.basePath, unitType, unitId)
|
|
277
|
-
: null;
|
|
268
|
+
/** Build snapshot metric opts. */
|
|
269
|
+
function buildSnapshotOpts(_unitType, _unitId) {
|
|
278
270
|
return {
|
|
279
271
|
promptCharCount: s.lastPromptCharCount,
|
|
280
272
|
baselineCharCount: s.lastBaselineCharCount,
|
|
281
273
|
...(s.currentUnitRouting ?? {}),
|
|
282
|
-
...(runtime?.continueHereFired ? { continueHereFired: true } : {}),
|
|
283
274
|
};
|
|
284
275
|
}
|
|
285
276
|
function handleLostSessionLock(ctx, lockStatus) {
|
|
@@ -369,14 +360,41 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
369
360
|
debugLog("stop-cleanup-sigterm", { error: e instanceof Error ? e.message : String(e) });
|
|
370
361
|
}
|
|
371
362
|
// ── Step 4: Auto-worktree exit ──
|
|
363
|
+
// When the milestone is complete (has a SUMMARY), merge the worktree branch
|
|
364
|
+
// back to main so code isn't stranded on the worktree branch (#2317).
|
|
365
|
+
// For incomplete milestones, preserve the branch for later resumption.
|
|
372
366
|
try {
|
|
373
367
|
if (s.currentMilestoneId) {
|
|
374
368
|
const notifyCtx = ctx
|
|
375
369
|
? { notify: ctx.ui.notify.bind(ctx.ui) }
|
|
376
370
|
: { notify: () => { } };
|
|
377
|
-
buildResolver()
|
|
378
|
-
|
|
379
|
-
|
|
371
|
+
const resolver = buildResolver();
|
|
372
|
+
// Check if the milestone is complete — SUMMARY file is the authoritative signal.
|
|
373
|
+
let milestoneComplete = false;
|
|
374
|
+
try {
|
|
375
|
+
const summaryPath = resolveMilestoneFile(s.originalBasePath || s.basePath, s.currentMilestoneId, "SUMMARY");
|
|
376
|
+
if (!summaryPath) {
|
|
377
|
+
// Also check in the worktree path (SUMMARY may not be synced yet)
|
|
378
|
+
const wtSummaryPath = resolveMilestoneFile(s.basePath, s.currentMilestoneId, "SUMMARY");
|
|
379
|
+
milestoneComplete = wtSummaryPath !== null;
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
milestoneComplete = true;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// Non-fatal — fall through to preserveBranch path
|
|
387
|
+
}
|
|
388
|
+
if (milestoneComplete) {
|
|
389
|
+
// Milestone is complete — merge worktree branch back to main
|
|
390
|
+
resolver.mergeAndExit(s.currentMilestoneId, notifyCtx);
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
// Milestone still in progress — preserve branch for later resumption
|
|
394
|
+
resolver.exitMilestone(s.currentMilestoneId, notifyCtx, {
|
|
395
|
+
preserveBranch: true,
|
|
396
|
+
});
|
|
397
|
+
}
|
|
380
398
|
}
|
|
381
399
|
}
|
|
382
400
|
catch (e) {
|
|
@@ -560,12 +578,6 @@ export async function pauseAuto(ctx, _pi) {
|
|
|
560
578
|
catch {
|
|
561
579
|
// Non-fatal — best-effort closeout on pause
|
|
562
580
|
}
|
|
563
|
-
try {
|
|
564
|
-
clearUnitRuntimeRecord(s.basePath, s.currentUnit.type, s.currentUnit.id);
|
|
565
|
-
}
|
|
566
|
-
catch {
|
|
567
|
-
// Non-fatal
|
|
568
|
-
}
|
|
569
581
|
s.currentUnit = null;
|
|
570
582
|
}
|
|
571
583
|
if (lockBase()) {
|
|
@@ -684,9 +696,6 @@ function buildLoopDeps() {
|
|
|
684
696
|
getMainBranch,
|
|
685
697
|
// Unit closeout + runtime records
|
|
686
698
|
closeoutUnit,
|
|
687
|
-
verifyExpectedArtifact,
|
|
688
|
-
clearUnitRuntimeRecord,
|
|
689
|
-
writeUnitRuntimeRecord,
|
|
690
699
|
recordOutcome,
|
|
691
700
|
writeLock,
|
|
692
701
|
captureAvailableSkills,
|
|
@@ -835,15 +844,6 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
835
844
|
});
|
|
836
845
|
}
|
|
837
846
|
invalidateAllCaches();
|
|
838
|
-
// Clean stale runtime records left from the paused session
|
|
839
|
-
try {
|
|
840
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
841
|
-
}
|
|
842
|
-
catch (e) {
|
|
843
|
-
debugLog("resume-self-heal-runtime-failed", {
|
|
844
|
-
error: e instanceof Error ? e.message : String(e),
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
847
|
if (s.pausedSessionFile) {
|
|
848
848
|
const activityDir = join(gsdRoot(s.basePath), "activity");
|
|
849
849
|
const recovery = synthesizeCrashRecovery(s.basePath, s.currentUnit?.type ?? "unknown", s.currentUnit?.id ?? "unknown", s.pausedSessionFile ?? undefined, activityDir);
|
|
@@ -853,11 +853,9 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
853
853
|
}
|
|
854
854
|
s.pausedSessionFile = null;
|
|
855
855
|
}
|
|
856
|
-
updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown"
|
|
857
|
-
writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown"
|
|
856
|
+
updateSessionLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
|
|
857
|
+
writeLock(lockBase(), "resuming", s.currentMilestoneId ?? "unknown");
|
|
858
858
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", "progress");
|
|
859
|
-
// Clear orphaned runtime records from prior process deaths before entering the loop
|
|
860
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
861
859
|
await autoLoop(ctx, pi, s, buildLoopDeps());
|
|
862
860
|
cleanupAfterLoopExit(ctx);
|
|
863
861
|
return;
|
|
@@ -879,8 +877,6 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
879
877
|
// Best-effort only — sidebar sync must never block auto-mode startup
|
|
880
878
|
}
|
|
881
879
|
logCmuxEvent(loadEffectiveGSDPreferences()?.preferences, requestedStepMode ? "Step-mode started." : "Auto-mode started.", "progress");
|
|
882
|
-
// Clear orphaned runtime records from prior process deaths before entering the loop
|
|
883
|
-
await selfHealRuntimeRecords(s.basePath, ctx);
|
|
884
880
|
// Dispatch the first unit
|
|
885
881
|
await autoLoop(ctx, pi, s, buildLoopDeps());
|
|
886
882
|
cleanupAfterLoopExit(ctx);
|
|
@@ -979,7 +975,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
979
975
|
s.basePath = targetBasePath;
|
|
980
976
|
s.autoStartTime = Date.now();
|
|
981
977
|
s.currentUnit = null;
|
|
982
|
-
s.completedUnits = [];
|
|
983
978
|
s.pendingQuickTasks = [];
|
|
984
979
|
}
|
|
985
980
|
const hookUnitType = `hook/${hookName}`;
|
|
@@ -999,14 +994,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
999
994
|
id: triggerUnitId,
|
|
1000
995
|
startedAt: hookStartedAt,
|
|
1001
996
|
};
|
|
1002
|
-
writeUnitRuntimeRecord(s.basePath, hookUnitType, triggerUnitId, hookStartedAt, {
|
|
1003
|
-
phase: "dispatched",
|
|
1004
|
-
wrapupWarningSent: false,
|
|
1005
|
-
timeoutAt: null,
|
|
1006
|
-
lastProgressAt: hookStartedAt,
|
|
1007
|
-
progressCount: 0,
|
|
1008
|
-
lastProgressKind: "dispatch",
|
|
1009
|
-
});
|
|
1010
997
|
if (hookModel) {
|
|
1011
998
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
1012
999
|
const match = resolveModelId(hookModel, availableModels, ctx.model?.provider);
|
|
@@ -1024,7 +1011,7 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1024
1011
|
}
|
|
1025
1012
|
}
|
|
1026
1013
|
const sessionFile = ctx.sessionManager.getSessionFile();
|
|
1027
|
-
writeLock(lockBase(), hookUnitType, triggerUnitId,
|
|
1014
|
+
writeLock(lockBase(), hookUnitType, triggerUnitId, sessionFile);
|
|
1028
1015
|
clearUnitTimeout();
|
|
1029
1016
|
const supervisor = resolveAutoSupervisorConfig();
|
|
1030
1017
|
const hookHardTimeoutMs = (supervisor.hard_timeout_minutes ?? 30) * 60 * 1000;
|
|
@@ -1032,12 +1019,6 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1032
1019
|
s.unitTimeoutHandle = null;
|
|
1033
1020
|
if (!s.active)
|
|
1034
1021
|
return;
|
|
1035
|
-
if (s.currentUnit) {
|
|
1036
|
-
writeUnitRuntimeRecord(s.basePath, hookUnitType, triggerUnitId, hookStartedAt, {
|
|
1037
|
-
phase: "timeout",
|
|
1038
|
-
timeoutAt: Date.now(),
|
|
1039
|
-
});
|
|
1040
|
-
}
|
|
1041
1022
|
ctx.ui.notify(`Hook ${hookName} exceeded ${supervisor.hard_timeout_minutes ?? 30}min timeout. Pausing auto-mode.`, "warning");
|
|
1042
1023
|
resetHookState();
|
|
1043
1024
|
await pauseAuto(ctx, pi);
|
|
@@ -1060,4 +1041,5 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1060
1041
|
// Direct phase dispatch → auto-direct-dispatch.ts
|
|
1061
1042
|
export { dispatchDirectPhase } from "./auto-direct-dispatch.js";
|
|
1062
1043
|
// Re-export recovery functions for external consumers
|
|
1063
|
-
export {
|
|
1044
|
+
export { buildLoopRemediationSteps, } from "./auto-recovery.js";
|
|
1045
|
+
export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Text } from "@gsd/pi-tui";
|
|
2
3
|
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
3
4
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
4
5
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
6
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
7
|
+
import { logError } from "../workflow-logger.js";
|
|
5
8
|
/**
|
|
6
9
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
7
10
|
* The alias description and promptGuidelines direct the LLM to prefer the canonical name.
|
|
@@ -43,7 +46,7 @@ export function registerDbTools(pi) {
|
|
|
43
46
|
}
|
|
44
47
|
catch (err) {
|
|
45
48
|
const msg = err instanceof Error ? err.message : String(err);
|
|
46
|
-
|
|
49
|
+
logError("tool", `gsd_decision_save tool failed: ${msg}`, { tool: "gsd_decision_save", error: String(err) });
|
|
47
50
|
return {
|
|
48
51
|
content: [{ type: "text", text: `Error saving decision: ${msg}` }],
|
|
49
52
|
details: { operation: "save_decision", error: msg },
|
|
@@ -77,6 +80,26 @@ export function registerDbTools(pi) {
|
|
|
77
80
|
], { description: "Who made this decision: 'human' (user directed), 'agent' (LLM decided autonomously), or 'collaborative' (discussed and agreed). Default: 'agent'" })),
|
|
78
81
|
}),
|
|
79
82
|
execute: decisionSaveExecute,
|
|
83
|
+
renderCall(args, theme) {
|
|
84
|
+
let text = theme.fg("toolTitle", theme.bold("decision_save "));
|
|
85
|
+
if (args.scope)
|
|
86
|
+
text += theme.fg("accent", `[${args.scope}] `);
|
|
87
|
+
if (args.decision)
|
|
88
|
+
text += theme.fg("muted", args.decision);
|
|
89
|
+
if (args.choice)
|
|
90
|
+
text += theme.fg("dim", ` — ${args.choice}`);
|
|
91
|
+
return new Text(text, 0, 0);
|
|
92
|
+
},
|
|
93
|
+
renderResult(result, _options, theme) {
|
|
94
|
+
const d = result.details;
|
|
95
|
+
if (result.isError || d?.error) {
|
|
96
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
97
|
+
}
|
|
98
|
+
let text = theme.fg("success", `Decision ${d?.id ?? ""} saved`);
|
|
99
|
+
if (d?.id)
|
|
100
|
+
text += theme.fg("dim", ` → DECISIONS.md`);
|
|
101
|
+
return new Text(text, 0, 0);
|
|
102
|
+
},
|
|
80
103
|
};
|
|
81
104
|
pi.registerTool(decisionSaveTool);
|
|
82
105
|
registerAlias(pi, decisionSaveTool, "gsd_save_decision", "gsd_decision_save");
|
|
@@ -120,7 +143,7 @@ export function registerDbTools(pi) {
|
|
|
120
143
|
}
|
|
121
144
|
catch (err) {
|
|
122
145
|
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
-
|
|
146
|
+
logError("tool", `gsd_requirement_update tool failed: ${msg}`, { tool: "gsd_requirement_update", error: String(err) });
|
|
124
147
|
return {
|
|
125
148
|
content: [{ type: "text", text: `Error updating requirement: ${msg}` }],
|
|
126
149
|
details: { operation: "update_requirement", id: params.id, error: msg },
|
|
@@ -149,6 +172,24 @@ export function registerDbTools(pi) {
|
|
|
149
172
|
supporting_slices: Type.Optional(Type.String({ description: "Supporting slices" })),
|
|
150
173
|
}),
|
|
151
174
|
execute: requirementUpdateExecute,
|
|
175
|
+
renderCall(args, theme) {
|
|
176
|
+
let text = theme.fg("toolTitle", theme.bold("requirement_update "));
|
|
177
|
+
if (args.id)
|
|
178
|
+
text += theme.fg("accent", args.id);
|
|
179
|
+
const fields = ["status", "validation", "notes", "description"].filter((f) => args[f]);
|
|
180
|
+
if (fields.length > 0)
|
|
181
|
+
text += theme.fg("dim", ` (${fields.join(", ")})`);
|
|
182
|
+
return new Text(text, 0, 0);
|
|
183
|
+
},
|
|
184
|
+
renderResult(result, _options, theme) {
|
|
185
|
+
const d = result.details;
|
|
186
|
+
if (result.isError || d?.error) {
|
|
187
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
188
|
+
}
|
|
189
|
+
let text = theme.fg("success", `Requirement ${d?.id ?? ""} updated`);
|
|
190
|
+
text += theme.fg("dim", ` → REQUIREMENTS.md`);
|
|
191
|
+
return new Text(text, 0, 0);
|
|
192
|
+
},
|
|
152
193
|
};
|
|
153
194
|
pi.registerTool(requirementUpdateTool);
|
|
154
195
|
registerAlias(pi, requirementUpdateTool, "gsd_update_requirement", "gsd_requirement_update");
|
|
@@ -195,7 +236,7 @@ export function registerDbTools(pi) {
|
|
|
195
236
|
}
|
|
196
237
|
catch (err) {
|
|
197
238
|
const msg = err instanceof Error ? err.message : String(err);
|
|
198
|
-
|
|
239
|
+
logError("tool", `gsd_summary_save tool failed: ${msg}`, { tool: "gsd_summary_save", error: String(err) });
|
|
199
240
|
return {
|
|
200
241
|
content: [{ type: "text", text: `Error saving artifact: ${msg}` }],
|
|
201
242
|
details: { operation: "save_summary", error: msg },
|
|
@@ -222,6 +263,25 @@ export function registerDbTools(pi) {
|
|
|
222
263
|
content: Type.String({ description: "The full markdown content of the artifact" }),
|
|
223
264
|
}),
|
|
224
265
|
execute: summarySaveExecute,
|
|
266
|
+
renderCall(args, theme) {
|
|
267
|
+
let text = theme.fg("toolTitle", theme.bold("summary_save "));
|
|
268
|
+
if (args.artifact_type)
|
|
269
|
+
text += theme.fg("accent", args.artifact_type);
|
|
270
|
+
const path = [args.milestone_id, args.slice_id, args.task_id].filter(Boolean).join("/");
|
|
271
|
+
if (path)
|
|
272
|
+
text += theme.fg("dim", ` ${path}`);
|
|
273
|
+
return new Text(text, 0, 0);
|
|
274
|
+
},
|
|
275
|
+
renderResult(result, _options, theme) {
|
|
276
|
+
const d = result.details;
|
|
277
|
+
if (result.isError || d?.error) {
|
|
278
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
279
|
+
}
|
|
280
|
+
let text = theme.fg("success", `${d?.artifact_type ?? "Artifact"} saved`);
|
|
281
|
+
if (d?.path)
|
|
282
|
+
text += theme.fg("dim", ` → ${d.path}`);
|
|
283
|
+
return new Text(text, 0, 0);
|
|
284
|
+
},
|
|
225
285
|
};
|
|
226
286
|
pi.registerTool(summarySaveTool);
|
|
227
287
|
registerAlias(pi, summarySaveTool, "gsd_save_summary", "gsd_summary_save");
|
|
@@ -232,6 +292,7 @@ export function registerDbTools(pi) {
|
|
|
232
292
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
233
293
|
const reserved = claimReservedId();
|
|
234
294
|
if (reserved) {
|
|
295
|
+
await ensureMilestoneDbRow(reserved);
|
|
235
296
|
return {
|
|
236
297
|
content: [{ type: "text", text: reserved }],
|
|
237
298
|
details: { operation: "generate_milestone_id", id: reserved, source: "reserved" },
|
|
@@ -242,6 +303,7 @@ export function registerDbTools(pi) {
|
|
|
242
303
|
const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
|
|
243
304
|
const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
|
|
244
305
|
const newId = nextMilestoneId(allIds, uniqueEnabled);
|
|
306
|
+
await ensureMilestoneDbRow(newId);
|
|
245
307
|
return {
|
|
246
308
|
content: [{ type: "text", text: newId }],
|
|
247
309
|
details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled },
|
|
@@ -255,6 +317,24 @@ export function registerDbTools(pi) {
|
|
|
255
317
|
};
|
|
256
318
|
}
|
|
257
319
|
};
|
|
320
|
+
/**
|
|
321
|
+
* Insert a minimal DB row for a milestone ID so it's visible to the state
|
|
322
|
+
* machine. Uses INSERT OR IGNORE — safe to call even if gsd_plan_milestone
|
|
323
|
+
* later writes the full row. Silently skips if the DB isn't available yet
|
|
324
|
+
* (pre-migration).
|
|
325
|
+
*/
|
|
326
|
+
async function ensureMilestoneDbRow(milestoneId) {
|
|
327
|
+
const dbAvailable = await ensureDbOpen();
|
|
328
|
+
if (!dbAvailable)
|
|
329
|
+
return;
|
|
330
|
+
try {
|
|
331
|
+
const { insertMilestone } = await import("../gsd-db.js");
|
|
332
|
+
insertMilestone({ id: milestoneId, status: "queued" });
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// Non-fatal — the safety-net in deriveStateFromDb will catch this
|
|
336
|
+
}
|
|
337
|
+
}
|
|
258
338
|
const milestoneGenerateIdTool = {
|
|
259
339
|
name: "gsd_milestone_generate_id",
|
|
260
340
|
label: "Generate Milestone ID",
|
|
@@ -270,6 +350,19 @@ export function registerDbTools(pi) {
|
|
|
270
350
|
],
|
|
271
351
|
parameters: Type.Object({}),
|
|
272
352
|
execute: milestoneGenerateIdExecute,
|
|
353
|
+
renderCall(_args, theme) {
|
|
354
|
+
return new Text(theme.fg("toolTitle", theme.bold("milestone_generate_id")), 0, 0);
|
|
355
|
+
},
|
|
356
|
+
renderResult(result, _options, theme) {
|
|
357
|
+
const d = result.details;
|
|
358
|
+
if (result.isError || d?.error) {
|
|
359
|
+
return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
|
|
360
|
+
}
|
|
361
|
+
let text = theme.fg("success", `Generated ${d?.id ?? "ID"}`);
|
|
362
|
+
if (d?.source === "reserved")
|
|
363
|
+
text += theme.fg("dim", " (reserved)");
|
|
364
|
+
return new Text(text, 0, 0);
|
|
365
|
+
},
|
|
273
366
|
};
|
|
274
367
|
pi.registerTool(milestoneGenerateIdTool);
|
|
275
368
|
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
@@ -302,7 +395,7 @@ export function registerDbTools(pi) {
|
|
|
302
395
|
}
|
|
303
396
|
catch (err) {
|
|
304
397
|
const msg = err instanceof Error ? err.message : String(err);
|
|
305
|
-
|
|
398
|
+
logError("tool", `plan_milestone tool failed: ${msg}`, { tool: "gsd_plan_milestone", error: String(err) });
|
|
306
399
|
return {
|
|
307
400
|
content: [{ type: "text", text: `Error planning milestone: ${msg}` }],
|
|
308
401
|
details: { operation: "plan_milestone", error: msg },
|
|
@@ -391,7 +484,7 @@ export function registerDbTools(pi) {
|
|
|
391
484
|
}
|
|
392
485
|
catch (err) {
|
|
393
486
|
const msg = err instanceof Error ? err.message : String(err);
|
|
394
|
-
|
|
487
|
+
logError("tool", `plan_slice tool failed: ${msg}`, { tool: "gsd_plan_slice", error: String(err) });
|
|
395
488
|
return {
|
|
396
489
|
content: [{ type: "text", text: `Error planning slice: ${msg}` }],
|
|
397
490
|
details: { operation: "plan_slice", error: msg },
|
|
@@ -464,7 +557,7 @@ export function registerDbTools(pi) {
|
|
|
464
557
|
}
|
|
465
558
|
catch (err) {
|
|
466
559
|
const msg = err instanceof Error ? err.message : String(err);
|
|
467
|
-
|
|
560
|
+
logError("tool", `plan_task tool failed: ${msg}`, { tool: "gsd_plan_task", error: String(err) });
|
|
468
561
|
return {
|
|
469
562
|
content: [{ type: "text", text: `Error planning task: ${msg}` }],
|
|
470
563
|
details: { operation: "plan_task", error: msg },
|
|
@@ -530,7 +623,7 @@ export function registerDbTools(pi) {
|
|
|
530
623
|
}
|
|
531
624
|
catch (err) {
|
|
532
625
|
const msg = err instanceof Error ? err.message : String(err);
|
|
533
|
-
|
|
626
|
+
logError("tool", `complete_task tool failed: ${msg}`, { tool: "gsd_task_complete", error: String(err) });
|
|
534
627
|
return {
|
|
535
628
|
content: [{ type: "text", text: `Error completing task: ${msg}` }],
|
|
536
629
|
details: { operation: "complete_task", error: msg },
|
|
@@ -604,7 +697,7 @@ export function registerDbTools(pi) {
|
|
|
604
697
|
}
|
|
605
698
|
catch (err) {
|
|
606
699
|
const msg = err instanceof Error ? err.message : String(err);
|
|
607
|
-
|
|
700
|
+
logError("tool", `complete_slice tool failed: ${msg}`, { tool: "gsd_slice_complete", error: String(err) });
|
|
608
701
|
return {
|
|
609
702
|
content: [{ type: "text", text: `Error completing slice: ${msg}` }],
|
|
610
703
|
details: { operation: "complete_slice", error: msg },
|
|
@@ -696,7 +789,7 @@ export function registerDbTools(pi) {
|
|
|
696
789
|
}
|
|
697
790
|
catch (err) {
|
|
698
791
|
const msg = err instanceof Error ? err.message : String(err);
|
|
699
|
-
|
|
792
|
+
logError("tool", `complete_milestone tool failed: ${msg}`, { tool: "gsd_complete_milestone", error: String(err) });
|
|
700
793
|
return {
|
|
701
794
|
content: [{ type: "text", text: `Error completing milestone: ${msg}` }],
|
|
702
795
|
details: { operation: "complete_milestone", error: msg },
|
|
@@ -712,6 +805,7 @@ export function registerDbTools(pi) {
|
|
|
712
805
|
promptGuidelines: [
|
|
713
806
|
"Use gsd_complete_milestone when all slices in a milestone are finished and the milestone needs to be recorded.",
|
|
714
807
|
"All slices in the milestone must have status 'complete' — the handler validates this before proceeding.",
|
|
808
|
+
"verificationPassed must be explicitly set to true — the handler rejects completion if verification did not pass.",
|
|
715
809
|
"On success, returns summaryPath where the MILESTONE-SUMMARY.md was written.",
|
|
716
810
|
],
|
|
717
811
|
parameters: Type.Object({
|
|
@@ -727,11 +821,76 @@ export function registerDbTools(pi) {
|
|
|
727
821
|
lessonsLearned: Type.Array(Type.String(), { description: "Lessons learned during the milestone" }),
|
|
728
822
|
followUps: Type.Optional(Type.String({ description: "Follow-up items for future milestones" })),
|
|
729
823
|
deviations: Type.Optional(Type.String({ description: "Deviations from the original plan" })),
|
|
824
|
+
verificationPassed: Type.Boolean({ description: "Must be true — confirms that code change verification, success criteria, and definition of done checks all passed before completion" }),
|
|
730
825
|
}),
|
|
731
826
|
execute: milestoneCompleteExecute,
|
|
732
827
|
};
|
|
733
828
|
pi.registerTool(milestoneCompleteTool);
|
|
734
829
|
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
830
|
+
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
831
|
+
const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
832
|
+
const dbAvailable = await ensureDbOpen();
|
|
833
|
+
if (!dbAvailable) {
|
|
834
|
+
return {
|
|
835
|
+
content: [{ type: "text", text: "Error: GSD database is not available. Cannot validate milestone." }],
|
|
836
|
+
details: { operation: "validate_milestone", error: "db_unavailable" },
|
|
837
|
+
};
|
|
838
|
+
}
|
|
839
|
+
try {
|
|
840
|
+
const { handleValidateMilestone } = await import("../tools/validate-milestone.js");
|
|
841
|
+
const result = await handleValidateMilestone(params, process.cwd());
|
|
842
|
+
if ("error" in result) {
|
|
843
|
+
return {
|
|
844
|
+
content: [{ type: "text", text: `Error validating milestone: ${result.error}` }],
|
|
845
|
+
details: { operation: "validate_milestone", error: result.error },
|
|
846
|
+
};
|
|
847
|
+
}
|
|
848
|
+
return {
|
|
849
|
+
content: [{ type: "text", text: `Validated milestone ${result.milestoneId} — verdict: ${result.verdict}. Written to ${result.validationPath}` }],
|
|
850
|
+
details: {
|
|
851
|
+
operation: "validate_milestone",
|
|
852
|
+
milestoneId: result.milestoneId,
|
|
853
|
+
verdict: result.verdict,
|
|
854
|
+
validationPath: result.validationPath,
|
|
855
|
+
},
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
catch (err) {
|
|
859
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
860
|
+
logError("tool", `validate_milestone tool failed: ${msg}`, { tool: "gsd_validate_milestone", error: String(err) });
|
|
861
|
+
return {
|
|
862
|
+
content: [{ type: "text", text: `Error validating milestone: ${msg}` }],
|
|
863
|
+
details: { operation: "validate_milestone", error: msg },
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
};
|
|
867
|
+
const milestoneValidateTool = {
|
|
868
|
+
name: "gsd_validate_milestone",
|
|
869
|
+
label: "Validate Milestone",
|
|
870
|
+
description: "Validate a milestone before completion — persist validation results to the DB, render VALIDATION.md to disk. " +
|
|
871
|
+
"Records verdict (pass/needs-attention/needs-remediation) and rationale.",
|
|
872
|
+
promptSnippet: "Validate a GSD milestone (DB write + VALIDATION.md render)",
|
|
873
|
+
promptGuidelines: [
|
|
874
|
+
"Use gsd_validate_milestone when all slices are done and the milestone needs validation before completion.",
|
|
875
|
+
"Parameters: milestoneId, verdict, remediationRound, successCriteriaChecklist, sliceDeliveryAudit, crossSliceIntegration, requirementCoverage, verdictRationale, remediationPlan (optional).",
|
|
876
|
+
"If verdict is 'needs-remediation', also provide remediationPlan and use gsd_reassess_roadmap to add remediation slices to the roadmap.",
|
|
877
|
+
"On success, returns validationPath where VALIDATION.md was written.",
|
|
878
|
+
],
|
|
879
|
+
parameters: Type.Object({
|
|
880
|
+
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
881
|
+
verdict: StringEnum(["pass", "needs-attention", "needs-remediation"], { description: "Validation verdict" }),
|
|
882
|
+
remediationRound: Type.Number({ description: "Remediation round (0 for first validation)" }),
|
|
883
|
+
successCriteriaChecklist: Type.String({ description: "Markdown checklist of success criteria with pass/fail and evidence" }),
|
|
884
|
+
sliceDeliveryAudit: Type.String({ description: "Markdown table auditing each slice's claimed vs delivered output" }),
|
|
885
|
+
crossSliceIntegration: Type.String({ description: "Markdown describing any cross-slice boundary mismatches" }),
|
|
886
|
+
requirementCoverage: Type.String({ description: "Markdown describing any unaddressed requirements" }),
|
|
887
|
+
verdictRationale: Type.String({ description: "Why this verdict was chosen" }),
|
|
888
|
+
remediationPlan: Type.Optional(Type.String({ description: "Remediation plan (required if verdict is needs-remediation)" })),
|
|
889
|
+
}),
|
|
890
|
+
execute: milestoneValidateExecute,
|
|
891
|
+
};
|
|
892
|
+
pi.registerTool(milestoneValidateTool);
|
|
893
|
+
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
735
894
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
736
895
|
const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
737
896
|
const dbAvailable = await ensureDbOpen();
|
|
@@ -763,7 +922,7 @@ export function registerDbTools(pi) {
|
|
|
763
922
|
}
|
|
764
923
|
catch (err) {
|
|
765
924
|
const msg = err instanceof Error ? err.message : String(err);
|
|
766
|
-
|
|
925
|
+
logError("tool", `replan_slice tool failed: ${msg}`, { tool: "gsd_replan_slice", error: String(err) });
|
|
767
926
|
return {
|
|
768
927
|
content: [{ type: "text", text: `Error replanning slice: ${msg}` }],
|
|
769
928
|
details: { operation: "replan_slice", error: msg },
|
|
@@ -836,7 +995,7 @@ export function registerDbTools(pi) {
|
|
|
836
995
|
}
|
|
837
996
|
catch (err) {
|
|
838
997
|
const msg = err instanceof Error ? err.message : String(err);
|
|
839
|
-
|
|
998
|
+
logError("tool", `reassess_roadmap tool failed: ${msg}`, { tool: "gsd_reassess_roadmap", error: String(err) });
|
|
840
999
|
return {
|
|
841
1000
|
content: [{ type: "text", text: `Error reassessing roadmap: ${msg}` }],
|
|
842
1001
|
details: { operation: "reassess_roadmap", error: msg },
|
|
@@ -4,6 +4,7 @@ import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolve
|
|
|
4
4
|
import { buildBeforeAgentStartResult } from "./system-context.js";
|
|
5
5
|
import { handleAgentEnd } from "./agent-end-recovery.js";
|
|
6
6
|
import { isDepthVerified, isQueuePhaseActive, markDepthVerified, resetWriteGateState, shouldBlockContextWrite } from "./write-gate.js";
|
|
7
|
+
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
7
8
|
import { getDiscussionMilestoneId } from "../guided-flow.js";
|
|
8
9
|
import { loadToolApiKeys } from "../commands-config.js";
|
|
9
10
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -128,6 +129,23 @@ export function registerHooks(pi) {
|
|
|
128
129
|
if (loopCheck.block) {
|
|
129
130
|
return { block: true, reason: loopCheck.reason };
|
|
130
131
|
}
|
|
132
|
+
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
133
|
+
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
134
|
+
if (isToolCallEventType("write", event)) {
|
|
135
|
+
if (isBlockedStateFile(event.input.path)) {
|
|
136
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (isToolCallEventType("edit", event)) {
|
|
140
|
+
if (isBlockedStateFile(event.input.path)) {
|
|
141
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (isToolCallEventType("bash", event)) {
|
|
145
|
+
if (isBashWriteToStateFile(event.input.command)) {
|
|
146
|
+
return { block: true, reason: BLOCKED_WRITE_ERROR };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
131
149
|
if (!isToolCallEventType("write", event))
|
|
132
150
|
return;
|
|
133
151
|
const result = shouldBlockContextWrite(event.toolName, event.input.path, getDiscussionMilestoneId(), isDepthVerified(), isQueuePhaseActive());
|
|
@@ -45,18 +45,9 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
45
45
|
ctx.ui.notify(`GSD skill preferences: ${report.warnings.length} unresolved skill${report.warnings.length === 1 ? "" : "s"}: ${report.warnings.join(", ")}`, "warning");
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
const content = readFileSync(knowledgePath, "utf-8").trim();
|
|
53
|
-
if (content) {
|
|
54
|
-
knowledgeBlock = `\n\n[PROJECT KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${content}`;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// skip
|
|
59
|
-
}
|
|
48
|
+
const { block: knowledgeBlock, globalSizeKb } = loadKnowledgeBlock(gsdHome, process.cwd());
|
|
49
|
+
if (globalSizeKb > 4) {
|
|
50
|
+
ctx.ui.notify(`GSD: ~/.gsd/agent/KNOWLEDGE.md is ${globalSizeKb.toFixed(1)}KB — consider trimming to keep system prompt lean.`, "warning");
|
|
60
51
|
}
|
|
61
52
|
let memoryBlock = "";
|
|
62
53
|
try {
|
|
@@ -102,6 +93,49 @@ export async function buildBeforeAgentStartResult(event, ctx) {
|
|
|
102
93
|
: {}),
|
|
103
94
|
};
|
|
104
95
|
}
|
|
96
|
+
export function loadKnowledgeBlock(gsdHomeDir, cwd) {
|
|
97
|
+
// 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
|
|
98
|
+
let globalKnowledge = "";
|
|
99
|
+
let globalSizeKb = 0;
|
|
100
|
+
const globalKnowledgePath = join(gsdHomeDir, "agent", "KNOWLEDGE.md");
|
|
101
|
+
if (existsSync(globalKnowledgePath)) {
|
|
102
|
+
try {
|
|
103
|
+
const content = readFileSync(globalKnowledgePath, "utf-8").trim();
|
|
104
|
+
if (content) {
|
|
105
|
+
globalSizeKb = Buffer.byteLength(content, "utf-8") / 1024;
|
|
106
|
+
globalKnowledge = content;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// skip
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// 2. Project knowledge (.gsd/KNOWLEDGE.md) — project-specific
|
|
114
|
+
let projectKnowledge = "";
|
|
115
|
+
const knowledgePath = resolveGsdRootFile(cwd, "KNOWLEDGE");
|
|
116
|
+
if (existsSync(knowledgePath)) {
|
|
117
|
+
try {
|
|
118
|
+
const content = readFileSync(knowledgePath, "utf-8").trim();
|
|
119
|
+
if (content)
|
|
120
|
+
projectKnowledge = content;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!globalKnowledge && !projectKnowledge) {
|
|
127
|
+
return { block: "", globalSizeKb: 0 };
|
|
128
|
+
}
|
|
129
|
+
const parts = [];
|
|
130
|
+
if (globalKnowledge)
|
|
131
|
+
parts.push(`## Global Knowledge\n\n${globalKnowledge}`);
|
|
132
|
+
if (projectKnowledge)
|
|
133
|
+
parts.push(`## Project Knowledge\n\n${projectKnowledge}`);
|
|
134
|
+
return {
|
|
135
|
+
block: `\n\n[KNOWLEDGE — Rules, patterns, and lessons learned]\n\n${parts.join("\n\n")}`,
|
|
136
|
+
globalSizeKb,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
105
139
|
function buildWorktreeContextBlock() {
|
|
106
140
|
const worktreeName = getActiveWorktreeName();
|
|
107
141
|
const worktreeMainCwd = getWorktreeOriginalCwd();
|