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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
|
|
2
|
+
|
|
1
3
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
2
4
|
|
|
3
5
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -12,7 +14,7 @@ import { clearPathCache } from "../paths.js";
|
|
|
12
14
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
|
|
13
15
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
14
16
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
15
|
-
import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
|
|
17
|
+
import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
|
|
16
18
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
17
19
|
import { resolveProjectRoot } from "../worktree.js";
|
|
18
20
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
@@ -56,6 +58,24 @@ function resolveAgentEndBasePath(): string | undefined {
|
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
export function _buildAbortedPauseContext(lastMsg: { errorMessage?: unknown }): {
|
|
62
|
+
message: string;
|
|
63
|
+
category: "aborted";
|
|
64
|
+
isTransient: true;
|
|
65
|
+
} {
|
|
66
|
+
const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
|
|
67
|
+
return {
|
|
68
|
+
message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
|
|
69
|
+
category: "aborted",
|
|
70
|
+
isTransient: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function isUserInitiatedAbortMessage(message: string | undefined | null): boolean {
|
|
75
|
+
if (!message) return false;
|
|
76
|
+
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
77
|
+
}
|
|
78
|
+
|
|
59
79
|
async function pauseTransientWithBackoff(
|
|
60
80
|
cls: ErrorClass,
|
|
61
81
|
pi: ExtensionAPI,
|
|
@@ -159,7 +179,7 @@ export async function handleAgentEnd(
|
|
|
159
179
|
return;
|
|
160
180
|
}
|
|
161
181
|
|
|
162
|
-
await pauseAuto(ctx, pi);
|
|
182
|
+
await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg as { errorMessage?: unknown }));
|
|
163
183
|
return;
|
|
164
184
|
}
|
|
165
185
|
if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
|
|
@@ -167,6 +187,14 @@ export async function handleAgentEnd(
|
|
|
167
187
|
// is in the assistant message text content. Fall back to content when
|
|
168
188
|
// errorMessage looks uninformative.
|
|
169
189
|
const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
|
|
190
|
+
if (isUserInitiatedAbortMessage(rawErrorMsg)) {
|
|
191
|
+
resolveAgentEndCancelled({
|
|
192
|
+
message: rawErrorMsg,
|
|
193
|
+
category: "aborted",
|
|
194
|
+
isTransient: false,
|
|
195
|
+
});
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
170
198
|
const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
|
|
171
199
|
// #3588: When errorMessage is uninformative, extract the real error from
|
|
172
200
|
// 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 type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
3
5
|
import { Text } from "@gsd/pi-tui";
|
|
@@ -8,6 +10,7 @@ import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./
|
|
|
8
10
|
import { StringEnum } from "@gsd/pi-ai";
|
|
9
11
|
import { logError } from "../workflow-logger.js";
|
|
10
12
|
import { getErrorMessage } from "../error-utils.js";
|
|
13
|
+
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
11
14
|
|
|
12
15
|
async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
|
|
13
16
|
return import("../tools/workflow-tool-executors.js");
|
|
@@ -19,11 +22,19 @@ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow
|
|
|
19
22
|
*/
|
|
20
23
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
|
|
21
24
|
function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canonicalName: string): void {
|
|
25
|
+
const execute = typeof toolDef.execute === "function"
|
|
26
|
+
? async (...args: any[]) => {
|
|
27
|
+
incrementLegacyTelemetry("legacy.mcpAliasUsed");
|
|
28
|
+
return toolDef.execute(...args);
|
|
29
|
+
}
|
|
30
|
+
: toolDef.execute;
|
|
31
|
+
|
|
22
32
|
pi.registerTool({
|
|
23
33
|
...toolDef,
|
|
24
34
|
name: aliasName,
|
|
25
35
|
description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
|
|
26
36
|
promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
|
|
37
|
+
execute,
|
|
27
38
|
});
|
|
28
39
|
}
|
|
29
40
|
|
|
@@ -7,7 +7,7 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
7
7
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
8
8
|
|
|
9
9
|
import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
10
|
-
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
10
|
+
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
11
11
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
12
12
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
13
13
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -22,6 +22,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
|
|
|
22
22
|
import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
23
23
|
import { initNotificationStore } from "../notification-store.js";
|
|
24
24
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
25
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
25
26
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
26
27
|
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
27
28
|
|
|
@@ -64,6 +65,16 @@ async function applyDisabledModelProviderPolicy(ctx: ExtensionContext): Promise<
|
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
export function resolveNotificationStoreBasePath(cwd: string = process.cwd()): string {
|
|
69
|
+
return resolveWorktreeProjectRoot(cwd);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function initSessionNotifications(ctx: ExtensionContext): void {
|
|
73
|
+
initNotificationStore(resolveNotificationStoreBasePath());
|
|
74
|
+
installNotifyInterceptor(ctx);
|
|
75
|
+
initNotificationWidget(ctx);
|
|
76
|
+
}
|
|
77
|
+
|
|
67
78
|
async function writeContextModeCompactionSnapshot(basePath: string): Promise<void> {
|
|
68
79
|
try {
|
|
69
80
|
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
@@ -101,9 +112,7 @@ export function registerHooks(
|
|
|
101
112
|
ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
|
|
102
113
|
): void {
|
|
103
114
|
pi.on("session_start", async (_event, ctx) => {
|
|
104
|
-
|
|
105
|
-
installNotifyInterceptor(ctx);
|
|
106
|
-
initNotificationWidget(ctx);
|
|
115
|
+
initSessionNotifications(ctx);
|
|
107
116
|
if (!isAutoActive()) {
|
|
108
117
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
109
118
|
initHealthWidget(ctx);
|
|
@@ -156,8 +165,7 @@ export function registerHooks(
|
|
|
156
165
|
});
|
|
157
166
|
|
|
158
167
|
pi.on("session_switch", async (_event, ctx) => {
|
|
159
|
-
|
|
160
|
-
installNotifyInterceptor(ctx);
|
|
168
|
+
initSessionNotifications(ctx);
|
|
161
169
|
resetWriteGateState(process.cwd());
|
|
162
170
|
resetToolCallLoopGuard();
|
|
163
171
|
await resetAskUserQuestionsTurnCache();
|
|
@@ -474,6 +482,22 @@ export function registerHooks(
|
|
|
474
482
|
}
|
|
475
483
|
}
|
|
476
484
|
|
|
485
|
+
// ── Worktree-isolation write gate (#5199) ────────────────────────────
|
|
486
|
+
// Block planning-write tools from landing code at the project root when
|
|
487
|
+
// git.isolation=worktree but auto-mode hasn't created the milestone
|
|
488
|
+
// worktree yet. Without this, writes silently orphan outside git history.
|
|
489
|
+
if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
|
|
490
|
+
const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
|
|
491
|
+
const wtGuard = shouldBlockWorktreeWrite(
|
|
492
|
+
event.toolName,
|
|
493
|
+
event.input.path,
|
|
494
|
+
wtBasePath,
|
|
495
|
+
isAutoActive(),
|
|
496
|
+
dash.currentUnit?.type,
|
|
497
|
+
);
|
|
498
|
+
if (wtGuard.block) return wtGuard;
|
|
499
|
+
}
|
|
500
|
+
|
|
477
501
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
478
502
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
479
503
|
if (isToolCallEventType("write", event)) {
|
|
@@ -1,10 +1,12 @@
|
|
|
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
|
|
|
4
4
|
import { minimatch } from "minimatch";
|
|
5
5
|
|
|
6
|
+
import { getIsolationMode } from "../preferences.js";
|
|
6
7
|
import type { ToolsPolicy } from "../unit-context-manifest.js";
|
|
7
8
|
import { logWarning } from "../workflow-logger.js";
|
|
9
|
+
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
@@ -882,3 +884,135 @@ export function shouldBlockPlanningUnit(
|
|
|
882
884
|
// avoids breaking gsd_* MCP tools or future safe additions.
|
|
883
885
|
return { block: false };
|
|
884
886
|
}
|
|
887
|
+
|
|
888
|
+
// ─── Worktree isolation write gate (#5199) ────────────────────────────────
|
|
889
|
+
//
|
|
890
|
+
// When `git.isolation: worktree` is configured, the per-unit commit pipeline
|
|
891
|
+
// only runs inside the auto-mode loop (`auto-post-unit.ts`). If the LLM
|
|
892
|
+
// authors code at the project root before auto-mode is started, those writes
|
|
893
|
+
// land in the working tree but never reach a commit — they're silently
|
|
894
|
+
// orphaned outside git history. This guard blocks those writes at the
|
|
895
|
+
// tool_call seam so the agent receives a clear error instead.
|
|
896
|
+
|
|
897
|
+
const WORKTREE_GATE_BOOTSTRAP_UNITS = new Set([
|
|
898
|
+
"discuss-milestone",
|
|
899
|
+
"plan-milestone",
|
|
900
|
+
"init",
|
|
901
|
+
]);
|
|
902
|
+
|
|
903
|
+
function realpathOrResolve(p: string): string {
|
|
904
|
+
const abs = resolve(p);
|
|
905
|
+
try {
|
|
906
|
+
return realpathSync(abs);
|
|
907
|
+
} catch {
|
|
908
|
+
// Path doesn't exist (yet) — realpath the deepest existing ancestor so
|
|
909
|
+
// platforms where /tmp -> /private/tmp don't break containment checks.
|
|
910
|
+
let dir = abs;
|
|
911
|
+
const tail: string[] = [];
|
|
912
|
+
while (dir && dir !== resolve(dir, "..")) {
|
|
913
|
+
try {
|
|
914
|
+
const real = realpathSync(dir);
|
|
915
|
+
return tail.length ? join(real, ...tail.reverse()) : real;
|
|
916
|
+
} catch {
|
|
917
|
+
const idx = dir.lastIndexOf(sep);
|
|
918
|
+
if (idx <= 0) break;
|
|
919
|
+
tail.push(dir.slice(idx + 1));
|
|
920
|
+
dir = dir.slice(0, idx) || sep;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
return abs;
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
function isPathContained(target: string, container: string): boolean {
|
|
928
|
+
if (target === container) return true;
|
|
929
|
+
return target.startsWith(container.endsWith(sep) ? container : container + sep);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* Block planning-write tool calls that would land code at the project root
|
|
934
|
+
* while `git.isolation: worktree` is in effect and auto-mode hasn't created
|
|
935
|
+
* (or flipped cwd into) the milestone worktree.
|
|
936
|
+
*
|
|
937
|
+
* Pure / unit-testable. Callers in `register-hooks.ts` supply the resolved
|
|
938
|
+
* project root and current auto liveness; this function does no I/O beyond
|
|
939
|
+
* realpath resolution.
|
|
940
|
+
*
|
|
941
|
+
* Allow rules (in order):
|
|
942
|
+
* 1. Tool isn't a planning-write (write/edit/multi_edit/notebook_edit).
|
|
943
|
+
* 2. `GSD_DISABLE_WORKTREE_WRITE_GUARD=1` self-hosting bypass.
|
|
944
|
+
* 3. Isolation mode is not "worktree".
|
|
945
|
+
* 4. Active unit is a bootstrap unit (discuss-milestone/plan-milestone/init).
|
|
946
|
+
* 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
|
|
947
|
+
* 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
|
|
948
|
+
* worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
|
|
949
|
+
* 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
|
|
950
|
+
*
|
|
951
|
+
* Otherwise: block with a message that points the agent at `/gsd` to start
|
|
952
|
+
* auto-mode.
|
|
953
|
+
*/
|
|
954
|
+
export function shouldBlockWorktreeWrite(
|
|
955
|
+
toolName: string,
|
|
956
|
+
targetPath: string,
|
|
957
|
+
effectiveBasePath: string,
|
|
958
|
+
isAutoLive: boolean,
|
|
959
|
+
currentUnitType?: string | null,
|
|
960
|
+
): { block: boolean; reason?: string } {
|
|
961
|
+
const tool = canonicalToolName(toolName);
|
|
962
|
+
if (!PLANNING_WRITE_TOOLS.has(tool)) return { block: false };
|
|
963
|
+
if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1") return { block: false };
|
|
964
|
+
if (getIsolationMode(effectiveBasePath) !== "worktree") return { block: false };
|
|
965
|
+
if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType)) return { block: false };
|
|
966
|
+
|
|
967
|
+
if (!targetPath) {
|
|
968
|
+
return {
|
|
969
|
+
block: true,
|
|
970
|
+
reason: [
|
|
971
|
+
`HARD BLOCK: ${tool} called with empty path while \`git.isolation: worktree\` is configured`,
|
|
972
|
+
`and auto-mode is not active. Refusing to allow writes that cannot be located.`,
|
|
973
|
+
].join(" "),
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
// Resolve the target relative to the project root, then realpath to defeat
|
|
978
|
+
// symlink-based escapes and prefix tricks (e.g. .gsd/worktrees-extra/).
|
|
979
|
+
const projectRoot = resolveWorktreeProjectRoot(effectiveBasePath);
|
|
980
|
+
const absTarget = isAbsolute(targetPath) ? targetPath : resolve(projectRoot, targetPath);
|
|
981
|
+
const realTarget = realpathOrResolve(absTarget);
|
|
982
|
+
const realRoot = realpathOrResolve(projectRoot);
|
|
983
|
+
const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
|
|
984
|
+
const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
|
|
985
|
+
|
|
986
|
+
// Allow writes inside the legitimate worktrees subtree.
|
|
987
|
+
if (isPathContained(realTarget, realWorktreesDir)) return { block: false };
|
|
988
|
+
|
|
989
|
+
// Allow writes to .gsd/ planning artifacts, but reject siblings whose name
|
|
990
|
+
// starts with "worktrees" (the worktrees-extra prefix trick — case 4).
|
|
991
|
+
if (isPathContained(realTarget, realGsd)) {
|
|
992
|
+
const rel = relative(realGsd, realTarget);
|
|
993
|
+
const firstSeg = rel.split(/[\/\\]/)[0] ?? "";
|
|
994
|
+
if (!firstSeg.startsWith("worktrees")) return { block: false };
|
|
995
|
+
// fall through: looks like worktrees<something> sibling — block
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
// Auto is live and the caller is operating inside a worktree path —
|
|
999
|
+
// host tool's write happens in worktree context; let it through.
|
|
1000
|
+
if (isAutoLive && isGsdWorktreePath(effectiveBasePath)) return { block: false };
|
|
1001
|
+
|
|
1002
|
+
// Block. Provide enough context that the agent can self-correct.
|
|
1003
|
+
const displayTarget = isPathContained(realTarget, realRoot)
|
|
1004
|
+
? relative(realRoot, realTarget) || "."
|
|
1005
|
+
: realTarget;
|
|
1006
|
+
return {
|
|
1007
|
+
block: true,
|
|
1008
|
+
reason: [
|
|
1009
|
+
`HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
|
|
1010
|
+
`not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
|
|
1011
|
+
`Code edits at the project root would be lost — only the auto-mode commit pipeline`,
|
|
1012
|
+
`(auto-post-unit) commits work, and it never runs outside the loop.`,
|
|
1013
|
+
`Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
|
|
1014
|
+
`then write inside it. To disable this guard for self-hosting development, set`,
|
|
1015
|
+
`GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
|
|
1016
|
+
].join(" "),
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Ship command for creating pull requests from GSD milestone evidence.
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* GSD Command — /gsd ship
|
|
3
6
|
*
|
|
@@ -18,6 +21,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
18
21
|
import { formatDuration } from "../shared/format-utils.js";
|
|
19
22
|
import { parseEvalReviewFrontmatter, type Verdict } from "./eval-review-schema.js";
|
|
20
23
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
24
|
+
import { buildPrEvidence } from "./pr-evidence.js";
|
|
21
25
|
|
|
22
26
|
function git(basePath: string, args: readonly string[]): string {
|
|
23
27
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
@@ -32,11 +36,6 @@ function isValidRefName(name: string): boolean {
|
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
interface PRContent {
|
|
36
|
-
title: string;
|
|
37
|
-
body: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
39
|
function listSliceIds(basePath: string, milestoneId: string): string[] {
|
|
41
40
|
// Slices live at <milestoneDir>/slices/<sliceId>/ with canonical S\d+ IDs.
|
|
42
41
|
// Use resolveSlicePath with a probe to find the real slices directory root.
|
|
@@ -148,74 +147,48 @@ export async function checkSliceEvalReview(
|
|
|
148
147
|
};
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
function generatePRContent(basePath: string, milestoneId: string, milestoneTitle: string)
|
|
152
|
-
const title = `feat: ${milestoneTitle || milestoneId}`;
|
|
153
|
-
|
|
154
|
-
const sections: string[] = [];
|
|
155
|
-
|
|
156
|
-
// TL;DR
|
|
157
|
-
sections.push("## TL;DR\n");
|
|
158
|
-
sections.push(`**What:** Ship milestone ${milestoneId} — ${milestoneTitle || "(untitled)"}`);
|
|
159
|
-
sections.push(`**Why:** Milestone work complete, ready for review.`);
|
|
160
|
-
sections.push(`**How:** See slice summaries below.\n`);
|
|
161
|
-
|
|
162
|
-
// What — slice summaries
|
|
150
|
+
function generatePRContent(basePath: string, milestoneId: string, milestoneTitle: string) {
|
|
163
151
|
const summaries = collectSliceSummaries(basePath, milestoneId);
|
|
164
|
-
|
|
165
|
-
sections.push("## What\n");
|
|
166
|
-
sections.push(summaries.join("\n\n"));
|
|
167
|
-
sections.push("");
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Roadmap status
|
|
152
|
+
const roadmapItems: string[] = [];
|
|
171
153
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
172
154
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
173
155
|
try {
|
|
174
156
|
const roadmap = readFileSync(roadmapPath, "utf-8");
|
|
175
157
|
const checkboxLines = roadmap.split("\n").filter((l) => /^\s*-\s*\[[ x]\]/.test(l));
|
|
176
|
-
|
|
177
|
-
sections.push("## Roadmap\n");
|
|
178
|
-
sections.push(checkboxLines.join("\n"));
|
|
179
|
-
sections.push("");
|
|
180
|
-
}
|
|
158
|
+
roadmapItems.push(...checkboxLines);
|
|
181
159
|
} catch {
|
|
182
160
|
// non-fatal
|
|
183
161
|
}
|
|
184
162
|
}
|
|
185
163
|
|
|
186
|
-
|
|
164
|
+
const metrics: string[] = [];
|
|
187
165
|
const ledger = getLedger();
|
|
188
166
|
const units = ledger?.units ?? loadLedgerFromDisk(basePath)?.units ?? [];
|
|
189
167
|
if (units.length > 0) {
|
|
190
168
|
const totals = getProjectTotals(units);
|
|
191
169
|
const byModel = aggregateByModel(units);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
sections.push(`- **Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
170
|
+
metrics.push(`**Units executed:** ${units.length}`);
|
|
171
|
+
metrics.push(`**Total cost:** ${formatCost(totals.cost)}`);
|
|
172
|
+
metrics.push(`**Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
|
|
196
173
|
if (totals.duration > 0) {
|
|
197
|
-
|
|
174
|
+
metrics.push(`**Duration:** ${formatDuration(totals.duration)}`);
|
|
198
175
|
}
|
|
199
176
|
if (byModel.length > 0) {
|
|
200
|
-
|
|
177
|
+
metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
|
|
201
178
|
}
|
|
202
|
-
sections.push("");
|
|
203
179
|
}
|
|
204
180
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
sections.push("*This PR was prepared with AI assistance (GSD auto-mode).*");
|
|
217
|
-
|
|
218
|
-
return { title, body: sections.join("\n") };
|
|
181
|
+
return buildPrEvidence({
|
|
182
|
+
milestoneId,
|
|
183
|
+
milestoneTitle,
|
|
184
|
+
changeType: "feat",
|
|
185
|
+
summaries,
|
|
186
|
+
roadmapItems,
|
|
187
|
+
metrics,
|
|
188
|
+
testsRun: ["Run `npm run verify:pr` before marking this PR ready."],
|
|
189
|
+
rollbackNotes: ["Revert the merge commit or close the PR before merge if review finds a regression."],
|
|
190
|
+
how: "Generated from GSD milestone slice summaries, roadmap status, and local metrics.",
|
|
191
|
+
});
|
|
219
192
|
}
|
|
220
193
|
|
|
221
194
|
export async function handleShip(
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Workflow template commands for starting, listing, and dispatching workflows.
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* GSD Workflow Template Commands — /gsd start, /gsd templates
|
|
3
6
|
*
|
|
@@ -15,6 +18,7 @@ import {
|
|
|
15
18
|
getTemplateInfo,
|
|
16
19
|
loadWorkflowTemplate,
|
|
17
20
|
loadRegistry,
|
|
21
|
+
isLegacyWorkflowMode,
|
|
18
22
|
type TemplateMatch,
|
|
19
23
|
} from "./workflow-templates.js";
|
|
20
24
|
import { loadPrompt } from "./prompt-loader.js";
|
|
@@ -24,6 +28,8 @@ import { isAutoActive, isAutoPaused } from "./auto.js";
|
|
|
24
28
|
import { getErrorMessage } from "./error-utils.js";
|
|
25
29
|
import { resolvePlugin, type WorkflowPlugin } from "./workflow-plugins.js";
|
|
26
30
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
31
|
+
import { formatRecommendedProcessPaths } from "./process-task-path.js";
|
|
32
|
+
import { incrementLegacyTelemetry } from "./legacy-telemetry.js";
|
|
27
33
|
|
|
28
34
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
29
35
|
|
|
@@ -328,6 +334,9 @@ export async function handleStart(
|
|
|
328
334
|
" /gsd start bugfix fix login button not responding\n" +
|
|
329
335
|
" /gsd start spike evaluate auth libraries\n" +
|
|
330
336
|
" /gsd start hotfix critical: API returns 500\n\n" +
|
|
337
|
+
"Recommended task paths:\n" +
|
|
338
|
+
formatRecommendedProcessPaths() +
|
|
339
|
+
"\n\n" +
|
|
331
340
|
"Flags:\n" +
|
|
332
341
|
" --dry-run Preview what would happen without executing\n" +
|
|
333
342
|
" --issue <ref> Link to a GitHub issue\n\n" +
|
|
@@ -484,6 +493,9 @@ export async function handleStart(
|
|
|
484
493
|
if (artifactDir) infoLines.push(`Artifacts: ${artifactDir}`);
|
|
485
494
|
infoLines.push(`Branch: ${actualBranch}`);
|
|
486
495
|
ctx.ui.notify(infoLines.join("\n"), "info");
|
|
496
|
+
if (isLegacyWorkflowMode(template.mode)) {
|
|
497
|
+
incrementLegacyTelemetry("legacy.workflowEngineUsed");
|
|
498
|
+
}
|
|
487
499
|
|
|
488
500
|
const prompt = loadPrompt("workflow-start", {
|
|
489
501
|
templateId,
|
|
@@ -649,6 +661,7 @@ export function dispatchMarkdownPhasePlugin(
|
|
|
649
661
|
if (artifactDir) infoLines.push(`Artifacts: ${artifactDir}`);
|
|
650
662
|
infoLines.push(`Branch: ${actualBranch}`);
|
|
651
663
|
ctx.ui.notify(infoLines.join("\n"), "info");
|
|
664
|
+
incrementLegacyTelemetry("legacy.workflowEngineUsed");
|
|
652
665
|
|
|
653
666
|
const prompt = loadPrompt("workflow-start", {
|
|
654
667
|
templateId,
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Multi-format loader that handles:
|
|
5
|
-
* 1. New format: component.yaml + SKILL.md/AGENT.md
|
|
6
|
-
* 2. Legacy skill format: SKILL.md with YAML frontmatter
|
|
7
|
-
* 3. Legacy agent format: .md with YAML frontmatter (name, description, tools, model)
|
|
8
|
-
*
|
|
9
|
-
* Auto-detects format by checking for component.yaml first, then falling back
|
|
10
|
-
* to legacy formats based on file naming conventions.
|
|
11
|
-
*/
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Loads modern component.yaml definitions and legacy skill/agent formats.
|
|
12
3
|
|
|
13
4
|
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
14
5
|
import { basename, dirname, join } from 'node:path';
|
|
15
6
|
import { parse as parseYaml } from 'yaml';
|
|
16
7
|
import { parseFrontmatter } from '@gsd/pi-coding-agent';
|
|
8
|
+
import { incrementLegacyTelemetry } from './legacy-telemetry.js';
|
|
17
9
|
import type {
|
|
18
10
|
Component,
|
|
19
11
|
ComponentApiVersion,
|
|
@@ -270,6 +262,7 @@ function loadFromLegacySkill(
|
|
|
270
262
|
enabled: true,
|
|
271
263
|
};
|
|
272
264
|
|
|
265
|
+
incrementLegacyTelemetry('legacy.componentFormatUsed');
|
|
273
266
|
return { component, diagnostics };
|
|
274
267
|
}
|
|
275
268
|
|
|
@@ -345,6 +338,7 @@ function loadFromLegacyAgent(
|
|
|
345
338
|
enabled: true,
|
|
346
339
|
};
|
|
347
340
|
|
|
341
|
+
incrementLegacyTelemetry('legacy.componentFormatUsed');
|
|
348
342
|
return { component, diagnostics };
|
|
349
343
|
}
|
|
350
344
|
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
markStepActive,
|
|
30
30
|
markStepComplete,
|
|
31
31
|
expandIteration,
|
|
32
|
+
isTerminalStepStatus,
|
|
32
33
|
type WorkflowGraph,
|
|
33
34
|
} from "./graph.js";
|
|
34
35
|
import { injectContext } from "./context-injector.js";
|
|
@@ -40,6 +41,24 @@ import { withFileLock } from "./file-lock.js";
|
|
|
40
41
|
// Re-export for downstream consumers
|
|
41
42
|
export { readFrozenDefinition } from "./definition-io.js";
|
|
42
43
|
|
|
44
|
+
function formatBlockedWorkflowReason(graph: WorkflowGraph): string {
|
|
45
|
+
const statusById = new Map(graph.steps.map((step) => [step.id, step.status]));
|
|
46
|
+
const blockedSteps = graph.steps
|
|
47
|
+
.filter((step) => step.status === "pending")
|
|
48
|
+
.map((step) => {
|
|
49
|
+
const blockers = step.dependsOn
|
|
50
|
+
.filter((depId) => !isTerminalStepStatus(statusById.get(depId)))
|
|
51
|
+
.map((depId) => `${depId} (${statusById.get(depId) ?? "missing"})`);
|
|
52
|
+
return blockers.length > 0
|
|
53
|
+
? `${step.id} waiting on ${blockers.join(", ")}`
|
|
54
|
+
: `${step.id} has no runnable dependency path`;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return blockedSteps.length > 0
|
|
58
|
+
? `Workflow blocked: no pending steps are ready. Blocked steps: ${blockedSteps.join("; ")}`
|
|
59
|
+
: "Workflow blocked: no pending steps are ready.";
|
|
60
|
+
}
|
|
61
|
+
|
|
43
62
|
export class CustomWorkflowEngine implements WorkflowEngine {
|
|
44
63
|
readonly engineId = "custom";
|
|
45
64
|
private readonly runDir: string;
|
|
@@ -110,6 +129,16 @@ export class CustomWorkflowEngine implements WorkflowEngine {
|
|
|
110
129
|
let next = getNextPendingStep(graph);
|
|
111
130
|
|
|
112
131
|
if (!next) {
|
|
132
|
+
const allDone = graph.steps.every(
|
|
133
|
+
(step) => step.status === "complete" || step.status === "expanded",
|
|
134
|
+
);
|
|
135
|
+
if (!allDone) {
|
|
136
|
+
return {
|
|
137
|
+
action: "stop",
|
|
138
|
+
reason: formatBlockedWorkflowReason(graph),
|
|
139
|
+
level: "error",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
113
142
|
return {
|
|
114
143
|
action: "stop",
|
|
115
144
|
reason: "All steps complete",
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Normalized SQLite adapter wrapper used by the GSD database facade.
|
|
3
|
+
|
|
4
|
+
export interface DbStatement {
|
|
5
|
+
run(...params: unknown[]): unknown;
|
|
6
|
+
get(...params: unknown[]): Record<string, unknown> | undefined;
|
|
7
|
+
all(...params: unknown[]): Record<string, unknown>[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface DbAdapter {
|
|
11
|
+
exec(sql: string): void;
|
|
12
|
+
prepare(sql: string): DbStatement;
|
|
13
|
+
close(): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function normalizeDbRow(row: unknown): Record<string, unknown> | undefined {
|
|
17
|
+
if (row == null) return undefined;
|
|
18
|
+
if (Object.getPrototypeOf(row) === null) {
|
|
19
|
+
return { ...(row as Record<string, unknown>) };
|
|
20
|
+
}
|
|
21
|
+
return row as Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function normalizeDbRows(rows: unknown[]): Record<string, unknown>[] {
|
|
25
|
+
return rows.map((row) => normalizeDbRow(row)!);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function createDbAdapter(rawDb: unknown): DbAdapter {
|
|
29
|
+
const db = rawDb as {
|
|
30
|
+
exec(sql: string): void;
|
|
31
|
+
prepare(sql: string): {
|
|
32
|
+
run(...args: unknown[]): unknown;
|
|
33
|
+
get(...args: unknown[]): unknown;
|
|
34
|
+
all(...args: unknown[]): unknown[];
|
|
35
|
+
};
|
|
36
|
+
close(): void;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const stmtCache = new Map<string, DbStatement>();
|
|
40
|
+
|
|
41
|
+
function wrapStmt(raw: {
|
|
42
|
+
run(...args: unknown[]): unknown;
|
|
43
|
+
get(...args: unknown[]): unknown;
|
|
44
|
+
all(...args: unknown[]): unknown[];
|
|
45
|
+
}): DbStatement {
|
|
46
|
+
return {
|
|
47
|
+
run(...params: unknown[]): unknown {
|
|
48
|
+
return raw.run(...params);
|
|
49
|
+
},
|
|
50
|
+
get(...params: unknown[]): Record<string, unknown> | undefined {
|
|
51
|
+
return normalizeDbRow(raw.get(...params));
|
|
52
|
+
},
|
|
53
|
+
all(...params: unknown[]): Record<string, unknown>[] {
|
|
54
|
+
return normalizeDbRows(raw.all(...params));
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
exec(sql: string): void {
|
|
61
|
+
db.exec(sql);
|
|
62
|
+
},
|
|
63
|
+
prepare(sql: string): DbStatement {
|
|
64
|
+
let cached = stmtCache.get(sql);
|
|
65
|
+
if (cached) return cached;
|
|
66
|
+
cached = wrapStmt(db.prepare(sql));
|
|
67
|
+
stmtCache.set(sql, cached);
|
|
68
|
+
return cached;
|
|
69
|
+
},
|
|
70
|
+
close(): void {
|
|
71
|
+
stmtCache.clear();
|
|
72
|
+
db.close();
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|