gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.710c06e97
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/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +90 -74
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +365 -522
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +55 -6
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +72 -55
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
- package/dist/resources/extensions/gsd/auto.js +159 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/graph.js +9 -3
- package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- package/dist/web/standalone/.next/server/chunks/6897.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/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
- package/dist/web/standalone/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +15 -6
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -40
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.ts +2 -40
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
- package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/fake-model.js +27 -0
- package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/index.js +8 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
- package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/fake.js +319 -0
- package/packages/pi-ai/dist/providers/fake.js.map +1 -0
- package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
- package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/index.ts +9 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -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 +5 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -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 +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +22 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +8 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -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 +11 -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/tool-card-cleanup-and-success-runtime.test.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -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 +48 -15
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.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 +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -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 +54 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +27 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +37 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +8 -8
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +50 -15
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +40 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +1 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -0
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/style.d.ts +41 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +158 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +1 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
- package/packages/pi-tui/src/index.ts +9 -0
- package/packages/pi-tui/src/style.ts +225 -0
- package/packages/pi-tui/src/tui.ts +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +18 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +93 -88
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +416 -596
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +82 -8
- package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +67 -53
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
- package/src/resources/extensions/gsd/auto.ts +167 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +30 -6
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/graph.ts +12 -5
- package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → CaMwumvGbBPZrJicfsCzV}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → CaMwumvGbBPZrJicfsCzV}/_ssgManifest.js +0 -0
|
@@ -31,7 +31,7 @@ import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-m
|
|
|
31
31
|
import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
|
|
32
32
|
import { resetHookState, runPreDispatchHooks, restoreHookState, clearPersistedHookState, } from "./post-unit-hooks.js";
|
|
33
33
|
import { runGSDDoctor, rebuildState } from "./doctor.js";
|
|
34
|
-
import { preDispatchHealthGate, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
|
|
34
|
+
import { preDispatchHealthGate, recordHealthSnapshot, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
|
|
35
35
|
import { clearSkillSnapshot } from "./skill-discovery.js";
|
|
36
36
|
import { captureAvailableSkills, resetSkillTelemetry, } from "./skill-telemetry.js";
|
|
37
37
|
import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
|
|
@@ -43,7 +43,7 @@ import { isAbsolute, join } from "node:path";
|
|
|
43
43
|
import { pathToFileURL } from "node:url";
|
|
44
44
|
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
45
45
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
46
|
-
import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, } from "./worktree.js";
|
|
46
|
+
import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
|
|
47
47
|
import { GitServiceImpl } from "./git-service.js";
|
|
48
48
|
import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
|
|
49
49
|
import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
|
|
@@ -82,6 +82,7 @@ import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSess
|
|
|
82
82
|
import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
83
83
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
84
84
|
import { validateDirectory } from "./validate-directory.js";
|
|
85
|
+
import { createAutoOrchestrator } from "./auto/orchestrator.js";
|
|
85
86
|
import { WorktreeResolver, } from "./worktree-resolver.js";
|
|
86
87
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
87
88
|
export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
|
|
@@ -904,6 +905,12 @@ export async function stopAuto(ctx, pi, reason) {
|
|
|
904
905
|
// changes the user made between sessions (#4959 / CodeRabbit).
|
|
905
906
|
if (pi)
|
|
906
907
|
clearToolBaseline(pi);
|
|
908
|
+
try {
|
|
909
|
+
await s.orchestration?.stop(reason ?? "stop");
|
|
910
|
+
}
|
|
911
|
+
catch (err) {
|
|
912
|
+
debugLog("stop-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
|
|
913
|
+
}
|
|
907
914
|
// Reset all session state in one call
|
|
908
915
|
s.reset();
|
|
909
916
|
}
|
|
@@ -953,6 +960,7 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
953
960
|
activeRunDir: s.activeRunDir,
|
|
954
961
|
autoStartTime: s.autoStartTime,
|
|
955
962
|
milestoneLock: s.sessionMilestoneLock ?? undefined,
|
|
963
|
+
pauseReason: _errorContext?.message,
|
|
956
964
|
};
|
|
957
965
|
setRuntimeKv("global", "", PAUSED_SESSION_KV_KEY, pausedMeta);
|
|
958
966
|
}
|
|
@@ -992,6 +1000,12 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
|
|
|
992
1000
|
// Unblock pending unitPromise so autoLoop exits cleanly (#1799)
|
|
993
1001
|
resolveAgentEnd({ messages: [] });
|
|
994
1002
|
_resetPendingResolve();
|
|
1003
|
+
try {
|
|
1004
|
+
await s.orchestration?.stop("pause");
|
|
1005
|
+
}
|
|
1006
|
+
catch (err) {
|
|
1007
|
+
debugLog("pause-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
|
|
1008
|
+
}
|
|
995
1009
|
s.active = false;
|
|
996
1010
|
s.paused = true;
|
|
997
1011
|
deactivateGSD();
|
|
@@ -1041,6 +1055,132 @@ function buildResolverDeps() {
|
|
|
1041
1055
|
function buildResolver() {
|
|
1042
1056
|
return new WorktreeResolver(s, buildResolverDeps());
|
|
1043
1057
|
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Thin entry glue for the new Auto Orchestration module.
|
|
1060
|
+
*
|
|
1061
|
+
* This intentionally wires only dispatch + error notification today, with
|
|
1062
|
+
* no behavior changes to the existing auto loop. It provides a concrete seam
|
|
1063
|
+
* the next refactor steps can adopt incrementally.
|
|
1064
|
+
*/
|
|
1065
|
+
export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
|
|
1066
|
+
const flowId = `auto-orchestrator-${Date.now()}`;
|
|
1067
|
+
let seq = 0;
|
|
1068
|
+
const deps = {
|
|
1069
|
+
dispatch: {
|
|
1070
|
+
async decideNextUnit() {
|
|
1071
|
+
const state = await deriveState(dispatchBasePath);
|
|
1072
|
+
const active = state.activeMilestone;
|
|
1073
|
+
if (!active)
|
|
1074
|
+
return null;
|
|
1075
|
+
const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
|
|
1076
|
+
const action = await resolveDispatch({
|
|
1077
|
+
basePath: dispatchBasePath,
|
|
1078
|
+
mid: active.id,
|
|
1079
|
+
midTitle: active.title,
|
|
1080
|
+
state,
|
|
1081
|
+
prefs,
|
|
1082
|
+
});
|
|
1083
|
+
if (action.action !== "dispatch")
|
|
1084
|
+
return null;
|
|
1085
|
+
return {
|
|
1086
|
+
unitType: action.unitType,
|
|
1087
|
+
unitId: action.unitId,
|
|
1088
|
+
reason: action.matchedRule ?? "dispatch",
|
|
1089
|
+
preconditions: [],
|
|
1090
|
+
};
|
|
1091
|
+
},
|
|
1092
|
+
},
|
|
1093
|
+
recovery: {
|
|
1094
|
+
async classifyAndRecover(input) {
|
|
1095
|
+
const reason = input.error instanceof Error ? input.error.message : String(input.error ?? "unknown auto error");
|
|
1096
|
+
return { action: "escalate", reason };
|
|
1097
|
+
},
|
|
1098
|
+
},
|
|
1099
|
+
worktree: {
|
|
1100
|
+
async prepareForUnit() { },
|
|
1101
|
+
async syncAfterUnit() { },
|
|
1102
|
+
async cleanupOnStop() { },
|
|
1103
|
+
},
|
|
1104
|
+
health: {
|
|
1105
|
+
async preAdvanceGate() {
|
|
1106
|
+
const gate = await preDispatchHealthGate(dispatchBasePath);
|
|
1107
|
+
return {
|
|
1108
|
+
allow: gate.proceed,
|
|
1109
|
+
reason: gate.reason,
|
|
1110
|
+
};
|
|
1111
|
+
},
|
|
1112
|
+
async postAdvanceRecord(result) {
|
|
1113
|
+
if (result.kind === "error") {
|
|
1114
|
+
recordHealthSnapshot(1, 0, 0, [{
|
|
1115
|
+
code: "orchestration-error",
|
|
1116
|
+
message: result.reason ?? "orchestration error",
|
|
1117
|
+
severity: "error",
|
|
1118
|
+
unitId: "orchestration",
|
|
1119
|
+
}], [], "orchestration");
|
|
1120
|
+
}
|
|
1121
|
+
else if (result.kind === "blocked") {
|
|
1122
|
+
recordHealthSnapshot(0, 1, 0, [{
|
|
1123
|
+
code: "orchestration-blocked",
|
|
1124
|
+
message: result.reason ?? "orchestration blocked",
|
|
1125
|
+
severity: "warning",
|
|
1126
|
+
unitId: "orchestration",
|
|
1127
|
+
}], [], "orchestration");
|
|
1128
|
+
}
|
|
1129
|
+
},
|
|
1130
|
+
},
|
|
1131
|
+
runtime: {
|
|
1132
|
+
async ensureLockOwnership() {
|
|
1133
|
+
const status = getSessionLockStatus(runtimeBasePath);
|
|
1134
|
+
if (!status.valid || status.failureReason === "pid-mismatch") {
|
|
1135
|
+
throw new Error("session lock held by another process");
|
|
1136
|
+
}
|
|
1137
|
+
},
|
|
1138
|
+
async journalTransition(event) {
|
|
1139
|
+
const eventType = event.name === "start"
|
|
1140
|
+
? "iteration-start"
|
|
1141
|
+
: event.name === "resume"
|
|
1142
|
+
? "iteration-start"
|
|
1143
|
+
: event.name === "advance"
|
|
1144
|
+
? "dispatch-match"
|
|
1145
|
+
: event.name === "advance-blocked"
|
|
1146
|
+
? "guard-block"
|
|
1147
|
+
: event.name === "advance-stopped"
|
|
1148
|
+
? "dispatch-stop"
|
|
1149
|
+
: event.name === "advance-error"
|
|
1150
|
+
? "iteration-end"
|
|
1151
|
+
: event.name === "advance-paused" || event.name === "advance-retry"
|
|
1152
|
+
? "guard-block"
|
|
1153
|
+
: event.name === "stop"
|
|
1154
|
+
? "terminal"
|
|
1155
|
+
: "iteration-end";
|
|
1156
|
+
_emitJournalEvent(runtimeBasePath, {
|
|
1157
|
+
ts: new Date().toISOString(),
|
|
1158
|
+
flowId,
|
|
1159
|
+
seq: ++seq,
|
|
1160
|
+
eventType,
|
|
1161
|
+
data: {
|
|
1162
|
+
source: "auto-orchestrator",
|
|
1163
|
+
name: event.name,
|
|
1164
|
+
reason: event.reason,
|
|
1165
|
+
unitType: event.unitType,
|
|
1166
|
+
unitId: event.unitId,
|
|
1167
|
+
},
|
|
1168
|
+
});
|
|
1169
|
+
},
|
|
1170
|
+
},
|
|
1171
|
+
notifications: {
|
|
1172
|
+
async notifyLifecycle(event) {
|
|
1173
|
+
if (event.name === "error") {
|
|
1174
|
+
ctx.ui.notify(event.detail ?? "auto orchestration error", "error");
|
|
1175
|
+
}
|
|
1176
|
+
},
|
|
1177
|
+
},
|
|
1178
|
+
};
|
|
1179
|
+
return createAutoOrchestrator(deps);
|
|
1180
|
+
}
|
|
1181
|
+
function ensureOrchestrationModule(ctx, pi, basePath) {
|
|
1182
|
+
s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
|
|
1183
|
+
}
|
|
1044
1184
|
/**
|
|
1045
1185
|
* Build the LoopDeps object from auto.ts private scope.
|
|
1046
1186
|
* This bundles all private functions that autoLoop needs without exporting them.
|
|
@@ -1398,6 +1538,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1398
1538
|
// s.basePath may have been updated to a worktree path by enterMilestone.
|
|
1399
1539
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
1400
1540
|
}
|
|
1541
|
+
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
1401
1542
|
registerSigtermHandler(lockBase());
|
|
1402
1543
|
ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
|
|
1403
1544
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
@@ -1457,6 +1598,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1457
1598
|
clearPausedSession("paused-session DB cleanup failed (resume activation)");
|
|
1458
1599
|
}
|
|
1459
1600
|
pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
|
|
1601
|
+
try {
|
|
1602
|
+
await s.orchestration?.resume();
|
|
1603
|
+
}
|
|
1604
|
+
catch (err) {
|
|
1605
|
+
debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
|
|
1606
|
+
}
|
|
1460
1607
|
startAutoCommandPolling(s.basePath);
|
|
1461
1608
|
await runAutoLoopWithUok({
|
|
1462
1609
|
ctx,
|
|
@@ -1482,6 +1629,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1482
1629
|
// Build scope after bootstrap has populated s.basePath / s.originalBasePath /
|
|
1483
1630
|
// s.currentMilestoneId (including worktree setup inside bootstrapAutoSession).
|
|
1484
1631
|
rebuildScope(s.basePath, s.currentMilestoneId);
|
|
1632
|
+
ensureOrchestrationModule(ctx, pi, s.basePath || base);
|
|
1485
1633
|
captureProjectRootEnv(s.originalBasePath || s.basePath);
|
|
1486
1634
|
registerAutoWorkerForSession(s);
|
|
1487
1635
|
try {
|
|
@@ -1492,6 +1640,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1492
1640
|
logWarning("engine", `cmux sync failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
|
|
1493
1641
|
}
|
|
1494
1642
|
pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: requestedStepMode ? "Step-mode started." : "Auto-mode started.", level: "progress" });
|
|
1643
|
+
try {
|
|
1644
|
+
await s.orchestration?.start({ basePath: s.basePath, trigger: "auto-loop" });
|
|
1645
|
+
}
|
|
1646
|
+
catch (err) {
|
|
1647
|
+
debugLog("start-orchestration-start", { error: err instanceof Error ? err.message : String(err) });
|
|
1648
|
+
}
|
|
1495
1649
|
startAutoCommandPolling(s.basePath);
|
|
1496
1650
|
// Dispatch the first unit
|
|
1497
1651
|
await runAutoLoopWithUok({
|
|
@@ -1576,6 +1730,9 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
|
|
|
1576
1730
|
s.pendingQuickTasks = [];
|
|
1577
1731
|
}
|
|
1578
1732
|
s.basePath = targetBasePath;
|
|
1733
|
+
if (!s.orchestration) {
|
|
1734
|
+
ensureOrchestrationModule(ctx, pi, s.basePath);
|
|
1735
|
+
}
|
|
1579
1736
|
const hookUnitType = `hook/${hookName}`;
|
|
1580
1737
|
const hookStartedAt = Date.now();
|
|
1581
1738
|
s.currentUnit = {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
|
|
1
2
|
import { logWarning } from "../workflow-logger.js";
|
|
2
3
|
import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
|
|
3
4
|
import { clearPathCache } from "../paths.js";
|
|
4
5
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
|
|
5
6
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
6
7
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
7
|
-
import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
|
|
8
|
+
import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
|
|
8
9
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
9
10
|
import { resolveProjectRoot } from "../worktree.js";
|
|
10
11
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
@@ -39,6 +40,19 @@ function resolveAgentEndBasePath() {
|
|
|
39
40
|
return undefined;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
43
|
+
export function _buildAbortedPauseContext(lastMsg) {
|
|
44
|
+
const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
|
|
45
|
+
return {
|
|
46
|
+
message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
|
|
47
|
+
category: "aborted",
|
|
48
|
+
isTransient: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function isUserInitiatedAbortMessage(message) {
|
|
52
|
+
if (!message)
|
|
53
|
+
return false;
|
|
54
|
+
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
55
|
+
}
|
|
42
56
|
async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
|
|
43
57
|
retryState.consecutiveTransientCount += 1;
|
|
44
58
|
const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
|
|
@@ -134,7 +148,7 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
134
148
|
}
|
|
135
149
|
return;
|
|
136
150
|
}
|
|
137
|
-
await pauseAuto(ctx, pi);
|
|
151
|
+
await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg));
|
|
138
152
|
return;
|
|
139
153
|
}
|
|
140
154
|
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
|
|
@@ -142,6 +156,14 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
142
156
|
// is in the assistant message text content. Fall back to content when
|
|
143
157
|
// errorMessage looks uninformative.
|
|
144
158
|
const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
|
|
159
|
+
if (isUserInitiatedAbortMessage(rawErrorMsg)) {
|
|
160
|
+
resolveAgentEndCancelled({
|
|
161
|
+
message: rawErrorMsg,
|
|
162
|
+
category: "aborted",
|
|
163
|
+
isTransient: false,
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
145
167
|
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
146
168
|
// #3588: When errorMessage is uninformative, extract the real error from
|
|
147
169
|
// the assistant message text content for display purposes only.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Registers DB-backed GSD workflow tools and compatibility aliases.
|
|
1
3
|
import { Type } from "@sinclair/typebox";
|
|
2
4
|
import { Text } from "@gsd/pi-tui";
|
|
3
5
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
@@ -5,6 +7,7 @@ import { ensureDbOpen } from "./dynamic-tools.js";
|
|
|
5
7
|
import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
|
|
6
8
|
import { StringEnum } from "@gsd/pi-ai";
|
|
7
9
|
import { logError } from "../workflow-logger.js";
|
|
10
|
+
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
8
11
|
async function loadWorkflowExecutors() {
|
|
9
12
|
return import("../tools/workflow-tool-executors.js");
|
|
10
13
|
}
|
|
@@ -14,11 +17,18 @@ async function loadWorkflowExecutors() {
|
|
|
14
17
|
*/
|
|
15
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
|
|
16
19
|
function registerAlias(pi, toolDef, aliasName, canonicalName) {
|
|
20
|
+
const execute = typeof toolDef.execute === "function"
|
|
21
|
+
? async (...args) => {
|
|
22
|
+
incrementLegacyTelemetry("legacy.mcpAliasUsed");
|
|
23
|
+
return toolDef.execute(...args);
|
|
24
|
+
}
|
|
25
|
+
: toolDef.execute;
|
|
17
26
|
pi.registerTool({
|
|
18
27
|
...toolDef,
|
|
19
28
|
name: aliasName,
|
|
20
29
|
description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
|
|
21
30
|
promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
|
|
31
|
+
execute,
|
|
22
32
|
});
|
|
23
33
|
}
|
|
24
34
|
function requirementRootWriteGuard(operation) {
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
3
3
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
4
4
|
import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
5
|
-
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
5
|
+
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
6
6
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
7
7
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
8
8
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -16,6 +16,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
16
16
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
17
17
|
import { initNotificationStore } from "../notification-store.js";
|
|
18
18
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
19
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
19
20
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
20
21
|
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
21
22
|
// Skip the welcome screen on the very first session_start — cli.ts already
|
|
@@ -51,6 +52,14 @@ async function applyDisabledModelProviderPolicy(ctx) {
|
|
|
51
52
|
// Non-fatal: keep default provider visibility if preferences cannot be loaded.
|
|
52
53
|
}
|
|
53
54
|
}
|
|
55
|
+
export function resolveNotificationStoreBasePath(cwd = process.cwd()) {
|
|
56
|
+
return resolveWorktreeProjectRoot(cwd);
|
|
57
|
+
}
|
|
58
|
+
function initSessionNotifications(ctx) {
|
|
59
|
+
initNotificationStore(resolveNotificationStoreBasePath());
|
|
60
|
+
installNotifyInterceptor(ctx);
|
|
61
|
+
initNotificationWidget(ctx);
|
|
62
|
+
}
|
|
54
63
|
async function writeContextModeCompactionSnapshot(basePath) {
|
|
55
64
|
try {
|
|
56
65
|
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
@@ -81,9 +90,7 @@ async function writeContextModeCompactionSnapshot(basePath) {
|
|
|
81
90
|
}
|
|
82
91
|
export function registerHooks(pi, ecosystemHandlers) {
|
|
83
92
|
pi.on("session_start", async (_event, ctx) => {
|
|
84
|
-
|
|
85
|
-
installNotifyInterceptor(ctx);
|
|
86
|
-
initNotificationWidget(ctx);
|
|
93
|
+
initSessionNotifications(ctx);
|
|
87
94
|
if (!isAutoActive()) {
|
|
88
95
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
89
96
|
initHealthWidget(ctx);
|
|
@@ -135,8 +142,7 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
135
142
|
}
|
|
136
143
|
});
|
|
137
144
|
pi.on("session_switch", async (_event, ctx) => {
|
|
138
|
-
|
|
139
|
-
installNotifyInterceptor(ctx);
|
|
145
|
+
initSessionNotifications(ctx);
|
|
140
146
|
resetWriteGateState(process.cwd());
|
|
141
147
|
resetToolCallLoopGuard();
|
|
142
148
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -426,6 +432,16 @@ export function registerHooks(pi, ecosystemHandlers) {
|
|
|
426
432
|
return planningGuard;
|
|
427
433
|
}
|
|
428
434
|
}
|
|
435
|
+
// ── Worktree-isolation write gate (#5199) ────────────────────────────
|
|
436
|
+
// Block planning-write tools from landing code at the project root when
|
|
437
|
+
// git.isolation=worktree but auto-mode hasn't created the milestone
|
|
438
|
+
// worktree yet. Without this, writes silently orphan outside git history.
|
|
439
|
+
if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
|
|
440
|
+
const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
|
|
441
|
+
const wtGuard = shouldBlockWorktreeWrite(event.toolName, event.input.path, wtBasePath, isAutoActive(), dash.currentUnit?.type);
|
|
442
|
+
if (wtGuard.block)
|
|
443
|
+
return wtGuard;
|
|
444
|
+
}
|
|
429
445
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
430
446
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
431
447
|
if (isToolCallEventType("write", event)) {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
3
|
import { minimatch } from "minimatch";
|
|
4
|
+
import { getIsolationMode } from "../preferences.js";
|
|
4
5
|
import { logWarning } from "../workflow-logger.js";
|
|
6
|
+
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
5
7
|
/**
|
|
6
8
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
7
9
|
* and unique M001-abc123 formats. Exported so regex-hardening tests
|
|
@@ -728,3 +730,129 @@ export function shouldBlockPlanningUnit(toolName, pathOrCommand, basePath, unitT
|
|
|
728
730
|
// avoids breaking gsd_* MCP tools or future safe additions.
|
|
729
731
|
return { block: false };
|
|
730
732
|
}
|
|
733
|
+
// ─── Worktree isolation write gate (#5199) ────────────────────────────────
|
|
734
|
+
//
|
|
735
|
+
// When `git.isolation: worktree` is configured, the per-unit commit pipeline
|
|
736
|
+
// only runs inside the auto-mode loop (`auto-post-unit.ts`). If the LLM
|
|
737
|
+
// authors code at the project root before auto-mode is started, those writes
|
|
738
|
+
// land in the working tree but never reach a commit — they're silently
|
|
739
|
+
// orphaned outside git history. This guard blocks those writes at the
|
|
740
|
+
// tool_call seam so the agent receives a clear error instead.
|
|
741
|
+
const WORKTREE_GATE_BOOTSTRAP_UNITS = new Set([
|
|
742
|
+
"discuss-milestone",
|
|
743
|
+
"plan-milestone",
|
|
744
|
+
"init",
|
|
745
|
+
]);
|
|
746
|
+
function realpathOrResolve(p) {
|
|
747
|
+
const abs = resolve(p);
|
|
748
|
+
try {
|
|
749
|
+
return realpathSync(abs);
|
|
750
|
+
}
|
|
751
|
+
catch {
|
|
752
|
+
// Path doesn't exist (yet) — realpath the deepest existing ancestor so
|
|
753
|
+
// platforms where /tmp -> /private/tmp don't break containment checks.
|
|
754
|
+
let dir = abs;
|
|
755
|
+
const tail = [];
|
|
756
|
+
while (dir && dir !== resolve(dir, "..")) {
|
|
757
|
+
try {
|
|
758
|
+
const real = realpathSync(dir);
|
|
759
|
+
return tail.length ? join(real, ...tail.reverse()) : real;
|
|
760
|
+
}
|
|
761
|
+
catch {
|
|
762
|
+
const idx = dir.lastIndexOf(sep);
|
|
763
|
+
if (idx <= 0)
|
|
764
|
+
break;
|
|
765
|
+
tail.push(dir.slice(idx + 1));
|
|
766
|
+
dir = dir.slice(0, idx) || sep;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
return abs;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
function isPathContained(target, container) {
|
|
773
|
+
if (target === container)
|
|
774
|
+
return true;
|
|
775
|
+
return target.startsWith(container.endsWith(sep) ? container : container + sep);
|
|
776
|
+
}
|
|
777
|
+
/**
|
|
778
|
+
* Block planning-write tool calls that would land code at the project root
|
|
779
|
+
* while `git.isolation: worktree` is in effect and auto-mode hasn't created
|
|
780
|
+
* (or flipped cwd into) the milestone worktree.
|
|
781
|
+
*
|
|
782
|
+
* Pure / unit-testable. Callers in `register-hooks.ts` supply the resolved
|
|
783
|
+
* project root and current auto liveness; this function does no I/O beyond
|
|
784
|
+
* realpath resolution.
|
|
785
|
+
*
|
|
786
|
+
* Allow rules (in order):
|
|
787
|
+
* 1. Tool isn't a planning-write (write/edit/multi_edit/notebook_edit).
|
|
788
|
+
* 2. `GSD_DISABLE_WORKTREE_WRITE_GUARD=1` self-hosting bypass.
|
|
789
|
+
* 3. Isolation mode is not "worktree".
|
|
790
|
+
* 4. Active unit is a bootstrap unit (discuss-milestone/plan-milestone/init).
|
|
791
|
+
* 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
|
|
792
|
+
* 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
|
|
793
|
+
* worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
|
|
794
|
+
* 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
|
|
795
|
+
*
|
|
796
|
+
* Otherwise: block with a message that points the agent at `/gsd` to start
|
|
797
|
+
* auto-mode.
|
|
798
|
+
*/
|
|
799
|
+
export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath, isAutoLive, currentUnitType) {
|
|
800
|
+
const tool = canonicalToolName(toolName);
|
|
801
|
+
if (!PLANNING_WRITE_TOOLS.has(tool))
|
|
802
|
+
return { block: false };
|
|
803
|
+
if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1")
|
|
804
|
+
return { block: false };
|
|
805
|
+
if (getIsolationMode(effectiveBasePath) !== "worktree")
|
|
806
|
+
return { block: false };
|
|
807
|
+
if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType))
|
|
808
|
+
return { block: false };
|
|
809
|
+
if (!targetPath) {
|
|
810
|
+
return {
|
|
811
|
+
block: true,
|
|
812
|
+
reason: [
|
|
813
|
+
`HARD BLOCK: ${tool} called with empty path while \`git.isolation: worktree\` is configured`,
|
|
814
|
+
`and auto-mode is not active. Refusing to allow writes that cannot be located.`,
|
|
815
|
+
].join(" "),
|
|
816
|
+
};
|
|
817
|
+
}
|
|
818
|
+
// Resolve the target relative to the project root, then realpath to defeat
|
|
819
|
+
// symlink-based escapes and prefix tricks (e.g. .gsd/worktrees-extra/).
|
|
820
|
+
const projectRoot = resolveWorktreeProjectRoot(effectiveBasePath);
|
|
821
|
+
const absTarget = isAbsolute(targetPath) ? targetPath : resolve(projectRoot, targetPath);
|
|
822
|
+
const realTarget = realpathOrResolve(absTarget);
|
|
823
|
+
const realRoot = realpathOrResolve(projectRoot);
|
|
824
|
+
const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
|
|
825
|
+
const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
|
|
826
|
+
// Allow writes inside the legitimate worktrees subtree.
|
|
827
|
+
if (isPathContained(realTarget, realWorktreesDir))
|
|
828
|
+
return { block: false };
|
|
829
|
+
// Allow writes to .gsd/ planning artifacts, but reject siblings whose name
|
|
830
|
+
// starts with "worktrees" (the worktrees-extra prefix trick — case 4).
|
|
831
|
+
if (isPathContained(realTarget, realGsd)) {
|
|
832
|
+
const rel = relative(realGsd, realTarget);
|
|
833
|
+
const firstSeg = rel.split(/[\/\\]/)[0] ?? "";
|
|
834
|
+
if (!firstSeg.startsWith("worktrees"))
|
|
835
|
+
return { block: false };
|
|
836
|
+
// fall through: looks like worktrees<something> sibling — block
|
|
837
|
+
}
|
|
838
|
+
// Auto is live and the caller is operating inside a worktree path —
|
|
839
|
+
// host tool's write happens in worktree context; let it through.
|
|
840
|
+
if (isAutoLive && isGsdWorktreePath(effectiveBasePath))
|
|
841
|
+
return { block: false };
|
|
842
|
+
// Block. Provide enough context that the agent can self-correct.
|
|
843
|
+
const displayTarget = isPathContained(realTarget, realRoot)
|
|
844
|
+
? relative(realRoot, realTarget) || "."
|
|
845
|
+
: realTarget;
|
|
846
|
+
return {
|
|
847
|
+
block: true,
|
|
848
|
+
reason: [
|
|
849
|
+
`HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
|
|
850
|
+
`not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
|
|
851
|
+
`Code edits at the project root would be lost — only the auto-mode commit pipeline`,
|
|
852
|
+
`(auto-post-unit) commits work, and it never runs outside the loop.`,
|
|
853
|
+
`Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
|
|
854
|
+
`then write inside it. To disable this guard for self-hosting development, set`,
|
|
855
|
+
`GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
|
|
856
|
+
].join(" "),
|
|
857
|
+
};
|
|
858
|
+
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Creates a PR from milestone artifacts: generates title + body from
|
|
5
|
-
* roadmap, slice summaries, and metrics, then opens via `gh pr create`.
|
|
6
|
-
*/
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Ship command for creating pull requests from GSD milestone evidence.
|
|
7
3
|
import { execFileSync } from "node:child_process";
|
|
8
4
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
9
5
|
import { readFile } from "node:fs/promises";
|
|
@@ -14,6 +10,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
14
10
|
import { formatDuration } from "../shared/format-utils.js";
|
|
15
11
|
import { parseEvalReviewFrontmatter } from "./eval-review-schema.js";
|
|
16
12
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
13
|
+
import { buildPrEvidence } from "./pr-evidence.js";
|
|
17
14
|
function git(basePath, args) {
|
|
18
15
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
19
16
|
}
|
|
@@ -114,66 +111,46 @@ export async function checkSliceEvalReview(basePath, milestoneId, sliceId) {
|
|
|
114
111
|
};
|
|
115
112
|
}
|
|
116
113
|
function generatePRContent(basePath, milestoneId, milestoneTitle) {
|
|
117
|
-
const title = `feat: ${milestoneTitle || milestoneId}`;
|
|
118
|
-
const sections = [];
|
|
119
|
-
// TL;DR
|
|
120
|
-
sections.push("## TL;DR\n");
|
|
121
|
-
sections.push(`**What:** Ship milestone ${milestoneId} — ${milestoneTitle || "(untitled)"}`);
|
|
122
|
-
sections.push(`**Why:** Milestone work complete, ready for review.`);
|
|
123
|
-
sections.push(`**How:** See slice summaries below.\n`);
|
|
124
|
-
// What — slice summaries
|
|
125
114
|
const summaries = collectSliceSummaries(basePath, milestoneId);
|
|
126
|
-
|
|
127
|
-
sections.push("## What\n");
|
|
128
|
-
sections.push(summaries.join("\n\n"));
|
|
129
|
-
sections.push("");
|
|
130
|
-
}
|
|
131
|
-
// Roadmap status
|
|
115
|
+
const roadmapItems = [];
|
|
132
116
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
133
117
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
134
118
|
try {
|
|
135
119
|
const roadmap = readFileSync(roadmapPath, "utf-8");
|
|
136
120
|
const checkboxLines = roadmap.split("\n").filter((l) => /^\s*-\s*\[[ x]\]/.test(l));
|
|
137
|
-
|
|
138
|
-
sections.push("## Roadmap\n");
|
|
139
|
-
sections.push(checkboxLines.join("\n"));
|
|
140
|
-
sections.push("");
|
|
141
|
-
}
|
|
121
|
+
roadmapItems.push(...checkboxLines);
|
|
142
122
|
}
|
|
143
123
|
catch {
|
|
144
124
|
// non-fatal
|
|
145
125
|
}
|
|
146
126
|
}
|
|
147
|
-
|
|
127
|
+
const metrics = [];
|
|
148
128
|
const ledger = getLedger();
|
|
149
129
|
const units = ledger?.units ?? loadLedgerFromDisk(basePath)?.units ?? [];
|
|
150
130
|
if (units.length > 0) {
|
|
151
131
|
const totals = getProjectTotals(units);
|
|
152
132
|
const byModel = aggregateByModel(units);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
sections.push(`- **Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
133
|
+
metrics.push(`**Units executed:** ${units.length}`);
|
|
134
|
+
metrics.push(`**Total cost:** ${formatCost(totals.cost)}`);
|
|
135
|
+
metrics.push(`**Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
157
136
|
if (totals.duration > 0) {
|
|
158
|
-
|
|
137
|
+
metrics.push(`**Duration:** ${formatDuration(totals.duration)}`);
|
|
159
138
|
}
|
|
160
139
|
if (byModel.length > 0) {
|
|
161
|
-
|
|
140
|
+
metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
|
|
162
141
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
sections.push("*This PR was prepared with AI assistance (GSD auto-mode).*");
|
|
176
|
-
return { title, body: sections.join("\n") };
|
|
142
|
+
}
|
|
143
|
+
return buildPrEvidence({
|
|
144
|
+
milestoneId,
|
|
145
|
+
milestoneTitle,
|
|
146
|
+
changeType: "feat",
|
|
147
|
+
summaries,
|
|
148
|
+
roadmapItems,
|
|
149
|
+
metrics,
|
|
150
|
+
testsRun: ["Run `npm run verify:pr` before marking this PR ready."],
|
|
151
|
+
rollbackNotes: ["Revert the merge commit or close the PR before merge if review finds a regression."],
|
|
152
|
+
how: "Generated from GSD milestone slice summaries, roadmap status, and local metrics.",
|
|
153
|
+
});
|
|
177
154
|
}
|
|
178
155
|
export async function handleShip(args, ctx, _pi) {
|
|
179
156
|
const basePath = currentDirectoryRoot();
|