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
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate-milestone handler — the core operation behind gsd_validate_milestone.
|
|
3
|
+
*
|
|
4
|
+
* Persists milestone validation results to the assessments table,
|
|
5
|
+
* renders VALIDATION.md to disk, and invalidates caches.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
transaction,
|
|
12
|
+
_getAdapter,
|
|
13
|
+
} from "../gsd-db.js";
|
|
14
|
+
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
15
|
+
import { saveFile, clearParseCache } from "../files.js";
|
|
16
|
+
import { invalidateStateCache } from "../state.js";
|
|
17
|
+
|
|
18
|
+
export interface ValidateMilestoneParams {
|
|
19
|
+
milestoneId: string;
|
|
20
|
+
verdict: "pass" | "needs-attention" | "needs-remediation";
|
|
21
|
+
remediationRound: number;
|
|
22
|
+
successCriteriaChecklist: string;
|
|
23
|
+
sliceDeliveryAudit: string;
|
|
24
|
+
crossSliceIntegration: string;
|
|
25
|
+
requirementCoverage: string;
|
|
26
|
+
verdictRationale: string;
|
|
27
|
+
remediationPlan?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ValidateMilestoneResult {
|
|
31
|
+
milestoneId: string;
|
|
32
|
+
verdict: string;
|
|
33
|
+
validationPath: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function renderValidationMarkdown(params: ValidateMilestoneParams): string {
|
|
37
|
+
let md = `---
|
|
38
|
+
verdict: ${params.verdict}
|
|
39
|
+
remediation_round: ${params.remediationRound}
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# Milestone Validation: ${params.milestoneId}
|
|
43
|
+
|
|
44
|
+
## Success Criteria Checklist
|
|
45
|
+
${params.successCriteriaChecklist}
|
|
46
|
+
|
|
47
|
+
## Slice Delivery Audit
|
|
48
|
+
${params.sliceDeliveryAudit}
|
|
49
|
+
|
|
50
|
+
## Cross-Slice Integration
|
|
51
|
+
${params.crossSliceIntegration}
|
|
52
|
+
|
|
53
|
+
## Requirement Coverage
|
|
54
|
+
${params.requirementCoverage}
|
|
55
|
+
|
|
56
|
+
## Verdict Rationale
|
|
57
|
+
${params.verdictRationale}
|
|
58
|
+
`;
|
|
59
|
+
|
|
60
|
+
if (params.verdict === "needs-remediation" && params.remediationPlan) {
|
|
61
|
+
md += `\n## Remediation Plan\n${params.remediationPlan}\n`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return md;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function handleValidateMilestone(
|
|
68
|
+
params: ValidateMilestoneParams,
|
|
69
|
+
basePath: string,
|
|
70
|
+
): Promise<ValidateMilestoneResult | { error: string }> {
|
|
71
|
+
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
72
|
+
return { error: "milestoneId is required and must be a non-empty string" };
|
|
73
|
+
}
|
|
74
|
+
const validVerdicts = ["pass", "needs-attention", "needs-remediation"];
|
|
75
|
+
if (!validVerdicts.includes(params.verdict)) {
|
|
76
|
+
return { error: `verdict must be one of: ${validVerdicts.join(", ")}` };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ── Filesystem render ──────────────────────────────────────────────────
|
|
80
|
+
const validationMd = renderValidationMarkdown(params);
|
|
81
|
+
|
|
82
|
+
let validationPath: string;
|
|
83
|
+
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
84
|
+
if (milestoneDir) {
|
|
85
|
+
validationPath = join(milestoneDir, `${params.milestoneId}-VALIDATION.md`);
|
|
86
|
+
} else {
|
|
87
|
+
const gsdDir = join(basePath, ".gsd");
|
|
88
|
+
const manualDir = join(gsdDir, "milestones", params.milestoneId);
|
|
89
|
+
validationPath = join(manualDir, `${params.milestoneId}-VALIDATION.md`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
await saveFile(validationPath, validationMd);
|
|
94
|
+
} catch (renderErr) {
|
|
95
|
+
process.stderr.write(
|
|
96
|
+
`gsd-db: validate_milestone — disk render failed: ${(renderErr as Error).message}\n`,
|
|
97
|
+
);
|
|
98
|
+
return { error: `disk render failed: ${(renderErr as Error).message}` };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ── DB write — store in assessments table ──────────────────────────────
|
|
102
|
+
const validatedAt = new Date().toISOString();
|
|
103
|
+
|
|
104
|
+
transaction(() => {
|
|
105
|
+
const adapter = _getAdapter()!;
|
|
106
|
+
adapter.prepare(
|
|
107
|
+
`INSERT OR REPLACE INTO assessments (path, milestone_id, slice_id, task_id, status, scope, full_content, created_at)
|
|
108
|
+
VALUES (:path, :mid, NULL, NULL, :verdict, 'milestone-validation', :content, :created_at)`,
|
|
109
|
+
).run({
|
|
110
|
+
":path": validationPath,
|
|
111
|
+
":mid": params.milestoneId,
|
|
112
|
+
":verdict": params.verdict,
|
|
113
|
+
":content": validationMd,
|
|
114
|
+
":created_at": validatedAt,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
invalidateStateCache();
|
|
119
|
+
clearPathCache();
|
|
120
|
+
clearParseCache();
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
milestoneId: params.milestoneId,
|
|
124
|
+
verdict: params.verdict,
|
|
125
|
+
validationPath,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
@@ -520,6 +520,10 @@ export interface CompleteTaskParams {
|
|
|
520
520
|
verdict: string;
|
|
521
521
|
durationMs: number;
|
|
522
522
|
}>;
|
|
523
|
+
/** Optional caller-provided identity for audit trail */
|
|
524
|
+
actorName?: string;
|
|
525
|
+
/** Optional caller-provided reason this action was triggered */
|
|
526
|
+
triggerReason?: string;
|
|
523
527
|
}
|
|
524
528
|
|
|
525
529
|
// ─── Complete Slice Params (gsd_complete_slice tool input) ───────────────
|
|
@@ -548,4 +552,8 @@ export interface CompleteSliceParams {
|
|
|
548
552
|
requires: Array<{ slice: string; provides: string }>;
|
|
549
553
|
affects: string[];
|
|
550
554
|
drillDownPaths: string[];
|
|
555
|
+
/** Optional caller-provided identity for audit trail */
|
|
556
|
+
actorName?: string;
|
|
557
|
+
/** Optional caller-provided reason this action was triggered */
|
|
558
|
+
triggerReason?: string;
|
|
551
559
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// GSD Extension — Unit Ownership
|
|
2
|
+
// Opt-in per-unit ownership claims for multi-agent safety.
|
|
3
|
+
//
|
|
4
|
+
// An agent can claim a unit (task, slice) before working on it.
|
|
5
|
+
// complete-task and complete-slice enforce ownership when claims exist.
|
|
6
|
+
// If no claim file is present, ownership is not enforced (backward compatible).
|
|
7
|
+
//
|
|
8
|
+
// Claim file location: .gsd/unit-claims.json
|
|
9
|
+
// Unit key format:
|
|
10
|
+
// task: "<milestoneId>/<sliceId>/<taskId>"
|
|
11
|
+
// slice: "<milestoneId>/<sliceId>"
|
|
12
|
+
//
|
|
13
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
14
|
+
|
|
15
|
+
import { existsSync, readFileSync, mkdirSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
18
|
+
|
|
19
|
+
// ─── Types ───────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
export interface UnitClaim {
|
|
22
|
+
agent: string;
|
|
23
|
+
claimed_at: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type ClaimsMap = Record<string, UnitClaim>;
|
|
27
|
+
|
|
28
|
+
// ─── Key Builders ────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
export function taskUnitKey(milestoneId: string, sliceId: string, taskId: string): string {
|
|
31
|
+
return `${milestoneId}/${sliceId}/${taskId}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function sliceUnitKey(milestoneId: string, sliceId: string): string {
|
|
35
|
+
return `${milestoneId}/${sliceId}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ─── File Path ───────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
function claimsPath(basePath: string): string {
|
|
41
|
+
return join(basePath, ".gsd", "unit-claims.json");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ─── Read Claims ─────────────────────────────────────────────────────────
|
|
45
|
+
|
|
46
|
+
function readClaims(basePath: string): ClaimsMap | null {
|
|
47
|
+
const path = claimsPath(basePath);
|
|
48
|
+
if (!existsSync(path)) return null;
|
|
49
|
+
try {
|
|
50
|
+
return JSON.parse(readFileSync(path, "utf-8")) as ClaimsMap;
|
|
51
|
+
} catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Claim a unit for an agent.
|
|
60
|
+
* Overwrites any existing claim for this unit (last writer wins).
|
|
61
|
+
*/
|
|
62
|
+
export function claimUnit(basePath: string, unitKey: string, agentName: string): void {
|
|
63
|
+
const claims = readClaims(basePath) ?? {};
|
|
64
|
+
claims[unitKey] = { agent: agentName, claimed_at: new Date().toISOString() };
|
|
65
|
+
const dir = join(basePath, ".gsd");
|
|
66
|
+
mkdirSync(dir, { recursive: true });
|
|
67
|
+
atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Release a unit claim (remove it from the claims map).
|
|
72
|
+
*/
|
|
73
|
+
export function releaseUnit(basePath: string, unitKey: string): void {
|
|
74
|
+
const claims = readClaims(basePath);
|
|
75
|
+
if (!claims || !(unitKey in claims)) return;
|
|
76
|
+
delete claims[unitKey];
|
|
77
|
+
atomicWriteSync(claimsPath(basePath), JSON.stringify(claims, null, 2) + "\n");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the current owner of a unit, or null if unclaimed / no claims file.
|
|
82
|
+
*/
|
|
83
|
+
export function getOwner(basePath: string, unitKey: string): string | null {
|
|
84
|
+
const claims = readClaims(basePath);
|
|
85
|
+
if (!claims) return null;
|
|
86
|
+
return claims[unitKey]?.agent ?? null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Check if an actor is authorized to operate on a unit.
|
|
91
|
+
* Returns null if ownership passes (or is unclaimed / no file).
|
|
92
|
+
* Returns an error string if a different agent owns the unit.
|
|
93
|
+
*/
|
|
94
|
+
export function checkOwnership(
|
|
95
|
+
basePath: string,
|
|
96
|
+
unitKey: string,
|
|
97
|
+
actorName: string | undefined,
|
|
98
|
+
): string | null {
|
|
99
|
+
if (!actorName) return null; // no actor identity provided — opt-in, so allow
|
|
100
|
+
const owner = getOwner(basePath, unitKey);
|
|
101
|
+
if (owner === null) return null; // unit unclaimed or no claims file
|
|
102
|
+
if (owner === actorName) return null; // actor is the owner
|
|
103
|
+
return `Unit ${unitKey} is owned by ${owner}, not ${actorName}`;
|
|
104
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
|
+
|
|
6
|
+
// ─── Session ID ───────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Engine-generated session ID — stable for the lifetime of this process.
|
|
10
|
+
* Agents can reference this to correlate all events from one run.
|
|
11
|
+
*/
|
|
12
|
+
const ENGINE_SESSION_ID: string = randomUUID();
|
|
13
|
+
|
|
14
|
+
export function getSessionId(): string {
|
|
15
|
+
return ENGINE_SESSION_ID;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ─── Event Types ─────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
export interface WorkflowEvent {
|
|
21
|
+
cmd: string; // e.g. "complete_task"
|
|
22
|
+
params: Record<string, unknown>;
|
|
23
|
+
ts: string; // ISO 8601
|
|
24
|
+
hash: string; // content hash (hex, 16 chars)
|
|
25
|
+
actor: "agent" | "system";
|
|
26
|
+
actor_name?: string; // e.g. "executor-agent-01" — caller-provided identity
|
|
27
|
+
trigger_reason?: string; // e.g. "plan-phase complete" — caller-provided causation
|
|
28
|
+
session_id: string; // engine-generated UUID, stable per process lifetime
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ─── appendEvent ─────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Append one event to .gsd/event-log.jsonl.
|
|
35
|
+
* Computes a content hash from cmd+params (deterministic, independent of ts/actor/session).
|
|
36
|
+
* Creates .gsd directory if needed.
|
|
37
|
+
*/
|
|
38
|
+
export function appendEvent(
|
|
39
|
+
basePath: string,
|
|
40
|
+
event: Omit<WorkflowEvent, "hash" | "session_id"> & { actor_name?: string; trigger_reason?: string },
|
|
41
|
+
): void {
|
|
42
|
+
const hash = createHash("sha256")
|
|
43
|
+
.update(JSON.stringify({ cmd: event.cmd, params: event.params, ts: event.ts }))
|
|
44
|
+
.digest("hex")
|
|
45
|
+
.slice(0, 16);
|
|
46
|
+
|
|
47
|
+
const fullEvent: WorkflowEvent = {
|
|
48
|
+
...event,
|
|
49
|
+
hash,
|
|
50
|
+
session_id: ENGINE_SESSION_ID,
|
|
51
|
+
};
|
|
52
|
+
const dir = join(basePath, ".gsd");
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
appendFileSync(join(dir, "event-log.jsonl"), JSON.stringify(fullEvent) + "\n", "utf-8");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ─── readEvents ──────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Read all events from a JSONL file.
|
|
61
|
+
* Returns empty array if file doesn't exist.
|
|
62
|
+
* Corrupted lines are skipped with stderr warning.
|
|
63
|
+
*/
|
|
64
|
+
export function readEvents(logPath: string): WorkflowEvent[] {
|
|
65
|
+
if (!existsSync(logPath)) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const content = readFileSync(logPath, "utf-8");
|
|
70
|
+
const lines = content.split("\n").filter((l) => l.length > 0);
|
|
71
|
+
const events: WorkflowEvent[] = [];
|
|
72
|
+
|
|
73
|
+
for (const line of lines) {
|
|
74
|
+
try {
|
|
75
|
+
events.push(JSON.parse(line) as WorkflowEvent);
|
|
76
|
+
} catch {
|
|
77
|
+
process.stderr.write(`workflow-events: skipping corrupted event line: ${line.slice(0, 80)}\n`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return events;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ─── findForkPoint ───────────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Find the index of the last common event between two logs by comparing hashes.
|
|
88
|
+
* Returns -1 if the first events differ (completely diverged).
|
|
89
|
+
* If one log is a prefix of the other, returns length of shorter - 1.
|
|
90
|
+
*/
|
|
91
|
+
export function findForkPoint(
|
|
92
|
+
logA: WorkflowEvent[],
|
|
93
|
+
logB: WorkflowEvent[],
|
|
94
|
+
): number {
|
|
95
|
+
const minLen = Math.min(logA.length, logB.length);
|
|
96
|
+
let lastCommon = -1;
|
|
97
|
+
|
|
98
|
+
for (let i = 0; i < minLen; i++) {
|
|
99
|
+
if (logA[i]!.hash === logB[i]!.hash) {
|
|
100
|
+
lastCommon = i;
|
|
101
|
+
} else {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return lastCommon;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ─── compactMilestoneEvents ─────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Archive a milestone's events from the active log to a separate file.
|
|
113
|
+
* Active log retains only events from other milestones.
|
|
114
|
+
* Archived file is kept on disk for forensics.
|
|
115
|
+
*
|
|
116
|
+
* @param basePath - Project root (parent of .gsd/)
|
|
117
|
+
* @param milestoneId - The milestone whose events should be archived
|
|
118
|
+
* @returns { archived: number } — count of events moved to archive
|
|
119
|
+
*/
|
|
120
|
+
export function compactMilestoneEvents(
|
|
121
|
+
basePath: string,
|
|
122
|
+
milestoneId: string,
|
|
123
|
+
): { archived: number } {
|
|
124
|
+
const logPath = join(basePath, ".gsd", "event-log.jsonl");
|
|
125
|
+
const archivePath = join(basePath, ".gsd", `event-log-${milestoneId}.jsonl.archived`);
|
|
126
|
+
|
|
127
|
+
const allEvents = readEvents(logPath);
|
|
128
|
+
const toArchive = allEvents.filter(
|
|
129
|
+
(e) => (e.params as { milestoneId?: string }).milestoneId === milestoneId,
|
|
130
|
+
);
|
|
131
|
+
const remaining = allEvents.filter(
|
|
132
|
+
(e) => (e.params as { milestoneId?: string }).milestoneId !== milestoneId,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
if (toArchive.length === 0) {
|
|
136
|
+
return { archived: 0 };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Write archived events to .jsonl.archived file (crash-safe)
|
|
140
|
+
atomicWriteSync(
|
|
141
|
+
archivePath,
|
|
142
|
+
toArchive.map((e) => JSON.stringify(e)).join("\n") + "\n",
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Truncate active log to remaining events only
|
|
146
|
+
atomicWriteSync(
|
|
147
|
+
logPath,
|
|
148
|
+
remaining.length > 0
|
|
149
|
+
? remaining.map((e) => JSON.stringify(e)).join("\n") + "\n"
|
|
150
|
+
: "",
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
return { archived: toArchive.length };
|
|
154
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// GSD Extension — Workflow Logger
|
|
2
|
+
// Centralized warning/error accumulator for the workflow engine pipeline.
|
|
3
|
+
// Captures structured entries that the auto-loop can drain after each unit
|
|
4
|
+
// to surface root causes for stuck loops, silent degradation, and blocked writes.
|
|
5
|
+
// All entries are also persisted to .gsd/audit-log.jsonl for post-mortem analysis.
|
|
6
|
+
//
|
|
7
|
+
// Stderr policy: every logWarning/logError call writes immediately to stderr
|
|
8
|
+
// for terminal visibility. This is intentional — unlike debug-logger (which is
|
|
9
|
+
// opt-in and zero-overhead when disabled), workflow-logger covers operational
|
|
10
|
+
// warnings/errors that should always be visible. There is no disable flag.
|
|
11
|
+
//
|
|
12
|
+
// Singleton safety: _buffer is module-level and shared across all calls within
|
|
13
|
+
// a process. The auto-loop must call _resetLogs() (or drainAndSummarize()) at
|
|
14
|
+
// the start of each unit to prevent log bleed between units running in the same
|
|
15
|
+
// Node process.
|
|
16
|
+
|
|
17
|
+
import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
|
|
20
|
+
// ─── Types ──────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export type LogSeverity = "warn" | "error";
|
|
23
|
+
|
|
24
|
+
export type LogComponent =
|
|
25
|
+
| "engine" // WorkflowEngine afterCommand side effects
|
|
26
|
+
| "projection" // Projection rendering
|
|
27
|
+
| "manifest" // Manifest write
|
|
28
|
+
| "event-log" // Event append
|
|
29
|
+
| "intercept" // Write intercept / tool-call blocks
|
|
30
|
+
| "migration" // Auto-migration from markdown
|
|
31
|
+
| "state" // deriveState fallback/degradation
|
|
32
|
+
| "tool" // Tool handler errors
|
|
33
|
+
| "compaction" // Event compaction
|
|
34
|
+
| "reconcile"; // Worktree reconciliation
|
|
35
|
+
|
|
36
|
+
export interface LogEntry {
|
|
37
|
+
ts: string;
|
|
38
|
+
severity: LogSeverity;
|
|
39
|
+
component: LogComponent;
|
|
40
|
+
message: string;
|
|
41
|
+
/** Optional structured context (file path, command name, etc.) */
|
|
42
|
+
context?: Record<string, string>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ─── Buffer & Persistent Audit ──────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
const MAX_BUFFER = 100;
|
|
48
|
+
let _buffer: LogEntry[] = [];
|
|
49
|
+
let _auditBasePath: string | null = null;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Set the base path for persistent audit log writes.
|
|
53
|
+
* Should be called once at engine init with the project root.
|
|
54
|
+
* Until set, log entries are buffered in-memory only.
|
|
55
|
+
*/
|
|
56
|
+
export function setLogBasePath(basePath: string): void {
|
|
57
|
+
_auditBasePath = basePath;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ─── Public API ─────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Record a warning. Also writes to stderr for terminal visibility.
|
|
64
|
+
*/
|
|
65
|
+
export function logWarning(
|
|
66
|
+
component: LogComponent,
|
|
67
|
+
message: string,
|
|
68
|
+
context?: Record<string, string>,
|
|
69
|
+
): void {
|
|
70
|
+
_push("warn", component, message, context);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Record an error. Also writes to stderr for terminal visibility.
|
|
75
|
+
*/
|
|
76
|
+
export function logError(
|
|
77
|
+
component: LogComponent,
|
|
78
|
+
message: string,
|
|
79
|
+
context?: Record<string, string>,
|
|
80
|
+
): void {
|
|
81
|
+
_push("error", component, message, context);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Drain all accumulated entries and clear the buffer.
|
|
86
|
+
* Returns entries oldest-first.
|
|
87
|
+
*
|
|
88
|
+
* WARNING: Call summarizeLogs() or drainAndSummarize() BEFORE calling this
|
|
89
|
+
* if you need a summary — drainLogs() clears the buffer immediately.
|
|
90
|
+
*/
|
|
91
|
+
export function drainLogs(): LogEntry[] {
|
|
92
|
+
const entries = _buffer;
|
|
93
|
+
_buffer = [];
|
|
94
|
+
return entries;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Atomically summarize then drain — the safe way to consume logs.
|
|
99
|
+
* Use this in the auto-loop instead of calling summarizeLogs() + drainLogs()
|
|
100
|
+
* separately to avoid the ordering footgun.
|
|
101
|
+
*/
|
|
102
|
+
export function drainAndSummarize(): { logs: LogEntry[]; summary: string | null } {
|
|
103
|
+
const summary = summarizeLogs();
|
|
104
|
+
const logs = drainLogs();
|
|
105
|
+
return { logs, summary };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Peek at current entries without clearing.
|
|
110
|
+
*/
|
|
111
|
+
export function peekLogs(): readonly LogEntry[] {
|
|
112
|
+
return _buffer;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Returns true if the buffer contains any error-severity entries.
|
|
117
|
+
*/
|
|
118
|
+
export function hasErrors(): boolean {
|
|
119
|
+
return _buffer.some((e) => e.severity === "error");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Returns true if the buffer contains any warn-severity entries.
|
|
124
|
+
* Use hasAnyIssues() if you want to check for either severity.
|
|
125
|
+
*/
|
|
126
|
+
export function hasWarnings(): boolean {
|
|
127
|
+
return _buffer.some((e) => e.severity === "warn");
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Returns true if the buffer contains any entries (warn or error).
|
|
132
|
+
*/
|
|
133
|
+
export function hasAnyIssues(): boolean {
|
|
134
|
+
return _buffer.length > 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get a one-line summary of accumulated issues for stuck detection messages.
|
|
139
|
+
* Returns null if no entries.
|
|
140
|
+
*
|
|
141
|
+
* Must be called BEFORE drainLogs() — use drainAndSummarize() for safe ordering.
|
|
142
|
+
*/
|
|
143
|
+
export function summarizeLogs(): string | null {
|
|
144
|
+
if (_buffer.length === 0) return null;
|
|
145
|
+
const errors = _buffer.filter((e) => e.severity === "error");
|
|
146
|
+
const warns = _buffer.filter((e) => e.severity === "warn");
|
|
147
|
+
|
|
148
|
+
const parts: string[] = [];
|
|
149
|
+
if (errors.length > 0) {
|
|
150
|
+
parts.push(`${errors.length} error(s): ${errors.map((e) => e.message).join("; ")}`);
|
|
151
|
+
}
|
|
152
|
+
if (warns.length > 0) {
|
|
153
|
+
parts.push(`${warns.length} warning(s): ${warns.map((e) => e.message).join("; ")}`);
|
|
154
|
+
}
|
|
155
|
+
return parts.join(" | ");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Format entries for display (used by auto-loop post-unit notification).
|
|
160
|
+
* Note: context fields are not included in the formatted output.
|
|
161
|
+
*/
|
|
162
|
+
export function formatForNotification(entries: readonly LogEntry[]): string {
|
|
163
|
+
if (entries.length === 0) return "";
|
|
164
|
+
if (entries.length === 1) {
|
|
165
|
+
const e = entries[0];
|
|
166
|
+
return `[${e.component}] ${e.message}`;
|
|
167
|
+
}
|
|
168
|
+
return entries
|
|
169
|
+
.map((e) => `[${e.component}] ${e.message}`)
|
|
170
|
+
.join("\n");
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Read all entries from the persistent audit log.
|
|
175
|
+
* Returns empty array if no basePath is set or the file doesn't exist.
|
|
176
|
+
*/
|
|
177
|
+
export function readAuditLog(basePath?: string): LogEntry[] {
|
|
178
|
+
const bp = basePath ?? _auditBasePath;
|
|
179
|
+
if (!bp) return [];
|
|
180
|
+
const auditPath = join(bp, ".gsd", "audit-log.jsonl");
|
|
181
|
+
if (!existsSync(auditPath)) return [];
|
|
182
|
+
try {
|
|
183
|
+
const content = readFileSync(auditPath, "utf-8");
|
|
184
|
+
return content
|
|
185
|
+
.split("\n")
|
|
186
|
+
.filter((l) => l.length > 0)
|
|
187
|
+
.map((l) => {
|
|
188
|
+
try { return JSON.parse(l) as LogEntry; } catch { return null; }
|
|
189
|
+
})
|
|
190
|
+
.filter((e): e is LogEntry => e !== null);
|
|
191
|
+
} catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Reset buffer. Call at the start of each auto-loop unit to prevent log bleed
|
|
198
|
+
* between units running in the same process. Also used in tests via _resetLogs().
|
|
199
|
+
*/
|
|
200
|
+
export function _resetLogs(): void {
|
|
201
|
+
_buffer = [];
|
|
202
|
+
_auditBasePath = null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ─── Internal ───────────────────────────────────────────────────────────
|
|
206
|
+
|
|
207
|
+
function _push(
|
|
208
|
+
severity: LogSeverity,
|
|
209
|
+
component: LogComponent,
|
|
210
|
+
message: string,
|
|
211
|
+
context?: Record<string, string>,
|
|
212
|
+
): void {
|
|
213
|
+
const entry: LogEntry = {
|
|
214
|
+
ts: new Date().toISOString(),
|
|
215
|
+
severity,
|
|
216
|
+
component,
|
|
217
|
+
message,
|
|
218
|
+
...(context ? { context } : {}),
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Always forward to stderr so terminal watchers see it (see module header for policy)
|
|
222
|
+
const prefix = severity === "error" ? "ERROR" : "WARN";
|
|
223
|
+
const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
|
|
224
|
+
process.stderr.write(`[gsd:${component}] ${prefix}: ${message}${ctxStr}\n`);
|
|
225
|
+
|
|
226
|
+
// Buffer for auto-loop to drain
|
|
227
|
+
_buffer.push(entry);
|
|
228
|
+
if (_buffer.length > MAX_BUFFER) {
|
|
229
|
+
_buffer.shift();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Persist to .gsd/audit-log.jsonl so entries survive context resets
|
|
233
|
+
if (_auditBasePath) {
|
|
234
|
+
try {
|
|
235
|
+
const auditDir = join(_auditBasePath, ".gsd");
|
|
236
|
+
mkdirSync(auditDir, { recursive: true });
|
|
237
|
+
appendFileSync(join(auditDir, "audit-log.jsonl"), JSON.stringify(entry) + "\n", "utf-8");
|
|
238
|
+
} catch (auditErr) {
|
|
239
|
+
// Best-effort — never let audit write failures bubble up
|
|
240
|
+
process.stderr.write(`[gsd:audit] failed to persist log entry: ${(auditErr as Error).message}\n`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|