gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.4ea7d80e7
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-dispatch.js +10 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +198 -59
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-start.js +2 -3
- 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 +168 -3
- 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-extract-learnings.js +17 -12
- 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 +351 -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 +410 -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 +316 -1520
- package/dist/resources/extensions/gsd/guided-flow.js +2 -2
- 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 +18 -7
- 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/chat-controller-ordering.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +14 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +97 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +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__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +67 -14
- 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/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
- 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 +27 -6
- 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 +16 -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 +112 -18
- 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 +60 -1
- 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/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.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 +48 -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/chat-controller-ordering.test.ts +87 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +108 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +16 -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__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +100 -16
- 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/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
- 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 +41 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +124 -18
- 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 +75 -1
- 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/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -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/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.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-dispatch.ts +17 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +194 -56
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-start.ts +7 -6
- 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 +179 -2
- 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-extract-learnings.ts +17 -12
- 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 +383 -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 +451 -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 +379 -1660
- package/src/resources/extensions/gsd/guided-flow.ts +2 -2
- 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 +170 -1
- 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-extract-learnings.test.ts +9 -0
- 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 +139 -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/has-pending-deep-stage.test.ts +33 -1
- 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/start-auto-detached.test.ts +46 -2
- 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/uok-plan-v2-wiring.test.ts +1 -1
- 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 → vIAZSyxIuvqNkCvXt9oqb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → vIAZSyxIuvqNkCvXt9oqb}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Hardening tests for buildPrEvidence — HTML-comment stripping, fake commit-trailer removal, and per-item length capping.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import { buildPrEvidence, type PrEvidenceInput } from "../pr-evidence.ts";
|
|
8
|
+
|
|
9
|
+
test("pr-evidence hardening: strips HTML comments from summaries", () => {
|
|
10
|
+
const evidence = buildPrEvidence({
|
|
11
|
+
milestoneId: "M001",
|
|
12
|
+
summaries: ["visible<!-- hidden secret -->tail"],
|
|
13
|
+
});
|
|
14
|
+
assert.ok(!evidence.body.includes("<!--"), "raw <!-- must not appear");
|
|
15
|
+
assert.ok(!evidence.body.includes("hidden secret"), "comment contents must be stripped");
|
|
16
|
+
assert.ok(evidence.body.includes("visibletail"), "non-comment text must remain");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("pr-evidence hardening: removes Co-Authored-By trailer from why", () => {
|
|
20
|
+
const evidence = buildPrEvidence({
|
|
21
|
+
milestoneId: "M001",
|
|
22
|
+
why: "Real reason here.\nCo-Authored-By: Evil <e@evil.com>\nMore reason.",
|
|
23
|
+
});
|
|
24
|
+
assert.ok(!evidence.body.includes("Evil <e@evil.com>"));
|
|
25
|
+
assert.ok(!/Co-Authored-By:/i.test(evidence.body));
|
|
26
|
+
assert.ok(evidence.body.includes("Real reason here."));
|
|
27
|
+
assert.ok(evidence.body.includes("More reason."));
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("pr-evidence hardening: removes Signed-off-by trailer from how", () => {
|
|
31
|
+
const evidence = buildPrEvidence({
|
|
32
|
+
milestoneId: "M001",
|
|
33
|
+
how: "Step one.\nSigned-off-by: Forged <f@x.com>\nStep two.",
|
|
34
|
+
});
|
|
35
|
+
assert.ok(!evidence.body.includes("Forged <f@x.com>"));
|
|
36
|
+
assert.ok(!/Signed-off-by:/i.test(evidence.body));
|
|
37
|
+
assert.ok(evidence.body.includes("Step one."));
|
|
38
|
+
assert.ok(evidence.body.includes("Step two."));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("pr-evidence hardening: trailer-name match is case-insensitive", () => {
|
|
42
|
+
const evidence = buildPrEvidence({
|
|
43
|
+
milestoneId: "M001",
|
|
44
|
+
why: "ok\nco-authored-by: lower <l@l.com>\nSIGNED-OFF-BY: upper <u@u.com>\nend",
|
|
45
|
+
});
|
|
46
|
+
assert.ok(!evidence.body.includes("lower <l@l.com>"));
|
|
47
|
+
assert.ok(!evidence.body.includes("upper <u@u.com>"));
|
|
48
|
+
assert.ok(evidence.body.includes("ok"));
|
|
49
|
+
assert.ok(evidence.body.includes("end"));
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("pr-evidence hardening: caps oversize summaries item with truncation suffix", () => {
|
|
53
|
+
const big = "A".repeat(5 * 1024); // 5 KB
|
|
54
|
+
const evidence = buildPrEvidence({
|
|
55
|
+
milestoneId: "M001",
|
|
56
|
+
summaries: [big],
|
|
57
|
+
});
|
|
58
|
+
// Find the truncated A-block in the body and assert it is bounded.
|
|
59
|
+
const lines = evidence.body.split("\n");
|
|
60
|
+
const longLine = lines.find((l) => l.startsWith("AAAA"));
|
|
61
|
+
assert.ok(longLine, "expected truncated A-line in body");
|
|
62
|
+
assert.ok(longLine!.endsWith(" … [truncated]"), "must end with truncation suffix");
|
|
63
|
+
assert.ok(
|
|
64
|
+
Buffer.byteLength(longLine!, "utf8") <= 2048,
|
|
65
|
+
`truncated item must be within 2 KB cap, got ${Buffer.byteLength(longLine!, "utf8")}`,
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("pr-evidence hardening: HTML comment split across summary items is preserved literally", () => {
|
|
70
|
+
// Documented behavior: each item is sanitized independently. A comment
|
|
71
|
+
// that begins in one item and closes in the next is NOT joined, so the
|
|
72
|
+
// open/close markers remain as literal text. This is intentional — joining
|
|
73
|
+
// items before sanitizing would let an attacker straddle items to inject
|
|
74
|
+
// an aligned comment that hides the second item from rendered view.
|
|
75
|
+
const evidence = buildPrEvidence({
|
|
76
|
+
milestoneId: "M001",
|
|
77
|
+
summaries: ["first item ends <!--", "--> second item begins"],
|
|
78
|
+
});
|
|
79
|
+
// The literal markers survive because each item was sanitized alone.
|
|
80
|
+
assert.ok(evidence.body.includes("<!--"), "open marker preserved as literal");
|
|
81
|
+
assert.ok(evidence.body.includes("-->"), "close marker preserved as literal");
|
|
82
|
+
assert.ok(evidence.body.includes("first item ends"));
|
|
83
|
+
assert.ok(evidence.body.includes("second item begins"));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("pr-evidence hardening: clean input is byte-identical to pre-hardening output", () => {
|
|
87
|
+
// This test is the contract that protects the golden fixtures: the
|
|
88
|
+
// sanitizer must be a true no-op for well-formed input. If this fails,
|
|
89
|
+
// there is a bug in the sanitizer (not in the goldens).
|
|
90
|
+
const cleanInput: PrEvidenceInput = {
|
|
91
|
+
milestoneId: "M001",
|
|
92
|
+
milestoneTitle: "Authentication",
|
|
93
|
+
changeType: "feat",
|
|
94
|
+
linkedIssue: "Closes #123",
|
|
95
|
+
summaries: ["### S01\nImplemented login flow."],
|
|
96
|
+
blockers: ["Awaiting design review"],
|
|
97
|
+
roadmapItems: ["- [x] **S01: Login**"],
|
|
98
|
+
metrics: ["**Units executed:** 3"],
|
|
99
|
+
testsRun: ["npm test", "npm run typecheck:extensions"],
|
|
100
|
+
why: "Users need to authenticate before accessing protected resources.",
|
|
101
|
+
how: "Added password hash check and session token issuance.",
|
|
102
|
+
rollbackNotes: ["Revert the merge commit."],
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const expected = [
|
|
106
|
+
"## TL;DR",
|
|
107
|
+
"",
|
|
108
|
+
"**What:** Ship milestone M001 - Authentication",
|
|
109
|
+
"**Why:** Users need to authenticate before accessing protected resources.",
|
|
110
|
+
"**How:** Added password hash check and session token issuance.",
|
|
111
|
+
"",
|
|
112
|
+
"## What",
|
|
113
|
+
"",
|
|
114
|
+
"### S01\nImplemented login flow.",
|
|
115
|
+
"",
|
|
116
|
+
"## Blockers",
|
|
117
|
+
"",
|
|
118
|
+
"- Awaiting design review",
|
|
119
|
+
"",
|
|
120
|
+
"## Why",
|
|
121
|
+
"",
|
|
122
|
+
"Users need to authenticate before accessing protected resources.",
|
|
123
|
+
"",
|
|
124
|
+
"## How",
|
|
125
|
+
"",
|
|
126
|
+
"Added password hash check and session token issuance.",
|
|
127
|
+
"",
|
|
128
|
+
"## Linked Issue",
|
|
129
|
+
"",
|
|
130
|
+
"Closes #123",
|
|
131
|
+
"",
|
|
132
|
+
"## Roadmap",
|
|
133
|
+
"",
|
|
134
|
+
"- [x] **S01: Login**",
|
|
135
|
+
"",
|
|
136
|
+
"## Metrics",
|
|
137
|
+
"",
|
|
138
|
+
"- **Units executed:** 3",
|
|
139
|
+
"",
|
|
140
|
+
"## Tests Run",
|
|
141
|
+
"",
|
|
142
|
+
"- npm test",
|
|
143
|
+
"- npm run typecheck:extensions",
|
|
144
|
+
"",
|
|
145
|
+
"## Change Type",
|
|
146
|
+
"",
|
|
147
|
+
"- [x] `feat` - New feature or capability",
|
|
148
|
+
"- [ ] `fix` - Bug fix",
|
|
149
|
+
"- [ ] `refactor` - Code restructuring",
|
|
150
|
+
"- [ ] `test` - Adding or updating tests",
|
|
151
|
+
"- [ ] `docs` - Documentation only",
|
|
152
|
+
"- [ ] `chore` - Build, CI, or tooling changes",
|
|
153
|
+
"",
|
|
154
|
+
"## Rollback And Compatibility",
|
|
155
|
+
"",
|
|
156
|
+
"- Revert the merge commit.",
|
|
157
|
+
"",
|
|
158
|
+
"## AI Assistance Disclosure",
|
|
159
|
+
"",
|
|
160
|
+
"This PR was prepared with AI assistance.",
|
|
161
|
+
].join("\n");
|
|
162
|
+
|
|
163
|
+
const actual = buildPrEvidence(cleanInput).body;
|
|
164
|
+
assert.equal(actual, expected, "clean input must produce byte-identical output (sanitizer is no-op)");
|
|
165
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests for the shared GSD pull request evidence generator.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import { buildPrEvidence, type PrChangeType } from "../pr-evidence.ts";
|
|
8
|
+
|
|
9
|
+
test("pr-evidence: generated body includes contribution-required sections", () => {
|
|
10
|
+
const evidence = buildPrEvidence({
|
|
11
|
+
milestoneId: "M001",
|
|
12
|
+
milestoneTitle: "Authentication",
|
|
13
|
+
linkedIssue: "Closes #123",
|
|
14
|
+
summaries: ["### S01\nImplemented login."],
|
|
15
|
+
roadmapItems: ["- [x] **S01: Login**"],
|
|
16
|
+
metrics: ["**Units executed:** 3"],
|
|
17
|
+
testsRun: ["npm test"],
|
|
18
|
+
rollbackNotes: ["Revert the merge commit."],
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
assert.equal(evidence.title, "feat: Authentication");
|
|
22
|
+
for (const section of [
|
|
23
|
+
"## TL;DR",
|
|
24
|
+
"## What",
|
|
25
|
+
"## Why",
|
|
26
|
+
"## How",
|
|
27
|
+
"## Linked Issue",
|
|
28
|
+
"## Tests Run",
|
|
29
|
+
"## Change Type",
|
|
30
|
+
"## Rollback And Compatibility",
|
|
31
|
+
"## AI Assistance Disclosure",
|
|
32
|
+
]) {
|
|
33
|
+
assert.ok(evidence.body.includes(section), `missing section: ${section}`);
|
|
34
|
+
}
|
|
35
|
+
assert.ok(evidence.body.includes("Closes #123"));
|
|
36
|
+
assert.ok(evidence.body.includes("npm test"));
|
|
37
|
+
assert.ok(evidence.body.includes("This PR was prepared with AI assistance."));
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("pr-evidence: every change type selects exactly one checklist row", () => {
|
|
41
|
+
const changeTypes: PrChangeType[] = ["feat", "fix", "refactor", "test", "docs", "chore"];
|
|
42
|
+
|
|
43
|
+
for (const changeType of changeTypes) {
|
|
44
|
+
const evidence = buildPrEvidence({ milestoneId: "M001", changeType });
|
|
45
|
+
const checkedRows = evidence.body.split("\n").filter((line) => line.startsWith("- [x] `"));
|
|
46
|
+
assert.deepEqual(checkedRows, [
|
|
47
|
+
`- [x] \`${changeType}\` - ${{
|
|
48
|
+
feat: "New feature or capability",
|
|
49
|
+
fix: "Bug fix",
|
|
50
|
+
refactor: "Code restructuring",
|
|
51
|
+
test: "Adding or updating tests",
|
|
52
|
+
docs: "Documentation only",
|
|
53
|
+
chore: "Build, CI, or tooling changes",
|
|
54
|
+
}[changeType]}`,
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("pr-evidence: missing issue, tests, and rollback data are explicit", () => {
|
|
60
|
+
const evidence = buildPrEvidence({ milestoneId: "M001", aiAssisted: false });
|
|
61
|
+
|
|
62
|
+
assert.ok(evidence.body.includes("Not specified. Add an issue link"));
|
|
63
|
+
assert.ok(evidence.body.includes("Not specified. Add exact verification commands"));
|
|
64
|
+
assert.ok(evidence.body.includes("No behavior-changing rollback notes recorded."));
|
|
65
|
+
assert.ok(!evidence.body.includes("## AI Assistance Disclosure"));
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("pr-evidence: subject metadata supports non-milestone PRs", () => {
|
|
69
|
+
const evidence = buildPrEvidence({
|
|
70
|
+
milestoneId: "M001",
|
|
71
|
+
subjectId: "S01",
|
|
72
|
+
subjectKind: "slice",
|
|
73
|
+
milestoneTitle: "Auth Slice",
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
assert.equal(evidence.title, "feat: Auth Slice");
|
|
77
|
+
assert.ok(evidence.body.includes("Ship slice S01 - Auth Slice"));
|
|
78
|
+
assert.ok(evidence.body.includes("Slice work is complete and ready for review."));
|
|
79
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests for canonical process recommendations by task size.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
formatRecommendedProcessPaths,
|
|
9
|
+
listRecommendedProcessPaths,
|
|
10
|
+
recommendProcessPath,
|
|
11
|
+
type ProcessTaskSize,
|
|
12
|
+
} from "../process-task-path.ts";
|
|
13
|
+
|
|
14
|
+
test("process task paths cover every Phase 7 task size with one command", () => {
|
|
15
|
+
const expected: ProcessTaskSize[] = [
|
|
16
|
+
"hotfix",
|
|
17
|
+
"bugfix",
|
|
18
|
+
"small-feature",
|
|
19
|
+
"large-feature",
|
|
20
|
+
"architecture-change",
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const paths = listRecommendedProcessPaths();
|
|
24
|
+
assert.deepEqual(paths.map((path) => path.taskSize), expected);
|
|
25
|
+
|
|
26
|
+
for (const taskSize of expected) {
|
|
27
|
+
const path = recommendProcessPath(taskSize);
|
|
28
|
+
assert.equal(path.taskSize, taskSize);
|
|
29
|
+
assert.ok(path.templateId.length > 0);
|
|
30
|
+
assert.match(path.command, /^\/gsd /);
|
|
31
|
+
assert.ok(path.phases.length > 0);
|
|
32
|
+
assert.ok(path.guidance.length > 0);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("process task paths route large work to the DB-backed milestone flow", () => {
|
|
37
|
+
const largeFeature = recommendProcessPath("large-feature");
|
|
38
|
+
assert.equal(largeFeature.templateId, "full-project");
|
|
39
|
+
assert.match(largeFeature.command, /\/gsd discuss/);
|
|
40
|
+
assert.match(largeFeature.command, /\/gsd auto/);
|
|
41
|
+
assert.match(largeFeature.guidance, /DB-backed milestone flow/);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("formatted process paths are stable for command help", () => {
|
|
45
|
+
const formatted = formatRecommendedProcessPaths();
|
|
46
|
+
assert.match(formatted, /hotfix\s+\/gsd start hotfix/);
|
|
47
|
+
assert.match(formatted, /bugfix\s+\/gsd start bugfix/);
|
|
48
|
+
assert.match(formatted, /small-feature\s+\/gsd start small-feature/);
|
|
49
|
+
assert.match(formatted, /large-feature\s+\/gsd discuss/);
|
|
50
|
+
assert.match(formatted, /architecture-change\s+\/gsd start refactor/);
|
|
51
|
+
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Regression test for #3696 — prompt step ordering and runtime fixes
|
|
3
3
|
*
|
|
4
4
|
* 1. complete-milestone.md: gsd_requirement_update (step 9) before
|
|
5
|
-
* gsd_complete_milestone
|
|
5
|
+
* gsd_complete_milestone, and completion remains the final durable write
|
|
6
6
|
* 2. complete-slice.md: uses gsd_requirement_update
|
|
7
7
|
* 3. register-extension.ts: _gsdEpipeGuard logs instead of re-throwing
|
|
8
8
|
* 4. register-hooks.ts: session_before_compact only checks isAutoActive
|
|
@@ -50,6 +50,21 @@ describe('prompt step ordering (#3696)', () => {
|
|
|
50
50
|
);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
+
test('project and learnings writes appear before gsd_complete_milestone', () => {
|
|
54
|
+
const projectMatch = completeMilestoneMd.match(/^\d+\.\s.*PROJECT\.md/m);
|
|
55
|
+
const learningsMatch = completeMilestoneMd.match(/^\d+\.\s.*Extract structured learnings/m);
|
|
56
|
+
const completeMilestoneMatch = completeMilestoneMd.match(/^\d+\.\s.*gsd_complete_milestone/m);
|
|
57
|
+
assert.ok(projectMatch, 'PROJECT.md update should appear in a numbered step');
|
|
58
|
+
assert.ok(learningsMatch, 'learnings extraction should appear in a numbered step');
|
|
59
|
+
assert.ok(completeMilestoneMatch, 'gsd_complete_milestone should appear in a numbered step');
|
|
60
|
+
|
|
61
|
+
const projectIdx = completeMilestoneMd.indexOf(projectMatch![0]);
|
|
62
|
+
const learningsIdx = completeMilestoneMd.indexOf(learningsMatch![0]);
|
|
63
|
+
const completeMilestoneIdx = completeMilestoneMd.indexOf(completeMilestoneMatch![0]);
|
|
64
|
+
assert.ok(projectIdx < completeMilestoneIdx, 'PROJECT.md update must happen before gsd_complete_milestone');
|
|
65
|
+
assert.ok(learningsIdx < completeMilestoneIdx, 'learnings extraction must happen before gsd_complete_milestone');
|
|
66
|
+
});
|
|
67
|
+
|
|
53
68
|
test('complete-slice.md uses gsd_requirement_update', () => {
|
|
54
69
|
assert.match(completeSliceMd, /gsd_requirement_update/,
|
|
55
70
|
'complete-slice.md should reference gsd_requirement_update');
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies the queue prompt renders compact discussion and write-gate guidance.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
test("queue prompt renders compact draft, verification, and persistence guidance", async (t) => {
|
|
11
|
+
const previousGsdHome = process.env.GSD_HOME;
|
|
12
|
+
const providedGsdHome = process.env.GSD_TEST_HOME;
|
|
13
|
+
const isolatedHome = providedGsdHome ?? mkdtempSync(join(tmpdir(), "gsd-queue-render-"));
|
|
14
|
+
process.env.GSD_HOME = isolatedHome;
|
|
15
|
+
t.after(() => {
|
|
16
|
+
if (previousGsdHome === undefined) delete process.env.GSD_HOME;
|
|
17
|
+
else process.env.GSD_HOME = previousGsdHome;
|
|
18
|
+
if (!providedGsdHome) rmSync(isolatedHome, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const { loadPrompt } = await import(`../prompt-loader.ts?test=${Date.now()}`);
|
|
22
|
+
const prompt = loadPrompt("queue", {
|
|
23
|
+
preamble: "Queue preamble.",
|
|
24
|
+
existingMilestonesContext: "No existing milestones.",
|
|
25
|
+
commitInstruction: "Commit queued milestone artifacts.",
|
|
26
|
+
inlinedTemplates: "## Context Template\n\nUse standard GSD context.",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
assert.match(prompt, /Draft Awareness/);
|
|
30
|
+
assert.match(prompt, /What do you want to add\?/);
|
|
31
|
+
assert.match(prompt, /Investigate between question rounds/);
|
|
32
|
+
assert.match(prompt, /Pre-Write Verification/);
|
|
33
|
+
assert.match(prompt, /depth_verification/);
|
|
34
|
+
assert.match(prompt, /gsd_milestone_generate_id/);
|
|
35
|
+
assert.match(prompt, /gsd_summary_save/);
|
|
36
|
+
assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
|
|
37
|
+
});
|
|
@@ -3,6 +3,8 @@ import assert from "node:assert/strict";
|
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
|
|
6
|
+
import { _withDetachedAutoKeepaliveForTest } from "../auto.ts";
|
|
7
|
+
|
|
6
8
|
const gsdDir = resolve(import.meta.dirname, "..");
|
|
7
9
|
|
|
8
10
|
function readGsdFile(relativePath: string): string {
|
|
@@ -102,8 +104,8 @@ test("startAutoDetached reports failures asynchronously (#3733)", () => {
|
|
|
102
104
|
"auto.ts should export startAutoDetached",
|
|
103
105
|
);
|
|
104
106
|
assert.ok(
|
|
105
|
-
autoSrc.includes("void startAuto(ctx, pi, base, verboseMode, options).catch"),
|
|
106
|
-
"startAutoDetached should launch startAuto without awaiting it",
|
|
107
|
+
autoSrc.includes("void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch"),
|
|
108
|
+
"startAutoDetached should launch startAuto without awaiting it and keep the process alive",
|
|
107
109
|
);
|
|
108
110
|
assert.ok(
|
|
109
111
|
autoSrc.includes("ctx.ui.notify(`Auto-start failed: ${message}`, \"error\")"),
|
|
@@ -111,6 +113,48 @@ test("startAutoDetached reports failures asynchronously (#3733)", () => {
|
|
|
111
113
|
);
|
|
112
114
|
});
|
|
113
115
|
|
|
116
|
+
test("detached auto-start keeps a ref'ed handle until the run settles", async () => {
|
|
117
|
+
const originalSetInterval = globalThis.setInterval;
|
|
118
|
+
const originalClearInterval = globalThis.clearInterval;
|
|
119
|
+
let intervalCreated = false;
|
|
120
|
+
let intervalCleared = false;
|
|
121
|
+
let createdHandle: NodeJS.Timeout | undefined;
|
|
122
|
+
let resolveRun!: () => void;
|
|
123
|
+
const run = new Promise<void>((resolve) => {
|
|
124
|
+
resolveRun = resolve;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
globalThis.setInterval = ((handler: TimerHandler, timeout?: number, ...args: unknown[]) => {
|
|
128
|
+
intervalCreated = true;
|
|
129
|
+
assert.equal(timeout, 30_000);
|
|
130
|
+
void handler;
|
|
131
|
+
void args;
|
|
132
|
+
createdHandle = originalSetInterval(() => {}, 1_000_000);
|
|
133
|
+
assert.equal(createdHandle.hasRef(), true, "detached auto keepalive must be ref'ed");
|
|
134
|
+
return createdHandle;
|
|
135
|
+
}) as unknown as typeof setInterval;
|
|
136
|
+
|
|
137
|
+
globalThis.clearInterval = ((handle?: NodeJS.Timeout | number | string) => {
|
|
138
|
+
if (handle === createdHandle) intervalCleared = true;
|
|
139
|
+
return originalClearInterval(handle);
|
|
140
|
+
}) as unknown as typeof clearInterval;
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const heldRun = _withDetachedAutoKeepaliveForTest(run);
|
|
144
|
+
assert.equal(intervalCreated, true, "keepalive interval should start immediately");
|
|
145
|
+
assert.equal(intervalCleared, false, "keepalive should remain active while auto-mode is running");
|
|
146
|
+
|
|
147
|
+
resolveRun();
|
|
148
|
+
await heldRun;
|
|
149
|
+
|
|
150
|
+
assert.equal(intervalCleared, true, "keepalive interval should clear when auto-mode settles");
|
|
151
|
+
} finally {
|
|
152
|
+
if (createdHandle) originalClearInterval(createdHandle);
|
|
153
|
+
globalThis.setInterval = originalSetInterval;
|
|
154
|
+
globalThis.clearInterval = originalClearInterval;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
114
158
|
test("detached auto-start preserves milestone lock across pause/stop cleanup (#3733)", () => {
|
|
115
159
|
const autoSrc = readGsdFile("auto.ts");
|
|
116
160
|
const sessionSrc = readGsdFile("auto/session.ts");
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// Each DB tool must register under its canonical gsd_concept_action name
|
|
4
|
-
// AND under a backward-compatible alias name.
|
|
5
|
-
// The alias must share the exact same execute function reference as the canonical tool.
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies canonical and alias DB tool registration plus legacy alias telemetry.
|
|
6
3
|
|
|
7
4
|
import { test } from 'node:test';
|
|
8
5
|
import assert from 'node:assert/strict';
|
|
9
6
|
import { registerDbTools } from '../bootstrap/db-tools.ts';
|
|
7
|
+
import { getLegacyTelemetry, resetLegacyTelemetry } from '../legacy-telemetry.ts';
|
|
10
8
|
|
|
11
9
|
|
|
12
10
|
// ─── Mock PI ──────────────────────────────────────────────────────────────────
|
|
@@ -66,9 +64,9 @@ for (const { canonical, alias } of RENAME_MAP) {
|
|
|
66
64
|
assert.ok(aliasTool !== undefined, `Alias tool "${alias}" should be registered`);
|
|
67
65
|
}
|
|
68
66
|
|
|
69
|
-
// ─── Execute function
|
|
67
|
+
// ─── Execute function wrapping ───────────────────────────────────────────────
|
|
70
68
|
|
|
71
|
-
console.log('\n── Tool naming: execute
|
|
69
|
+
console.log('\n── Tool naming: alias execute wrapper ──');
|
|
72
70
|
|
|
73
71
|
for (const { canonical, alias } of RENAME_MAP) {
|
|
74
72
|
const canonicalTool = pi.tools.find((t: any) => t.name === canonical);
|
|
@@ -76,12 +74,37 @@ for (const { canonical, alias } of RENAME_MAP) {
|
|
|
76
74
|
|
|
77
75
|
if (canonicalTool && aliasTool) {
|
|
78
76
|
assert.ok(
|
|
79
|
-
canonicalTool.execute
|
|
80
|
-
`"${
|
|
77
|
+
canonicalTool.execute !== aliasTool.execute,
|
|
78
|
+
`"${alias}" should wrap "${canonical}" so alias usage can be counted`,
|
|
81
79
|
);
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
|
|
83
|
+
test("alias execute increments legacy MCP alias telemetry before delegating", async () => {
|
|
84
|
+
const canonicalTool = pi.tools.find((t: any) => t.name === "gsd_decision_save");
|
|
85
|
+
const aliasTool = pi.tools.find((t: any) => t.name === "gsd_save_decision");
|
|
86
|
+
assert.ok(canonicalTool);
|
|
87
|
+
assert.ok(aliasTool);
|
|
88
|
+
|
|
89
|
+
const originalCanonicalExecute = canonicalTool.execute;
|
|
90
|
+
try {
|
|
91
|
+
resetLegacyTelemetry();
|
|
92
|
+
let delegated = false;
|
|
93
|
+
canonicalTool.execute = async () => {
|
|
94
|
+
delegated = true;
|
|
95
|
+
return { content: [{ type: "text", text: "ok" }], details: { ok: true } };
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
await aliasTool.execute("call-1", {}, undefined, undefined, undefined);
|
|
99
|
+
|
|
100
|
+
assert.equal(delegated, true);
|
|
101
|
+
assert.equal(getLegacyTelemetry()["legacy.mcpAliasUsed"], 1);
|
|
102
|
+
} finally {
|
|
103
|
+
canonicalTool.execute = originalCanonicalExecute;
|
|
104
|
+
resetLegacyTelemetry();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
85
108
|
// ─── Alias descriptions include "(alias for ...)" ───────────────────────────
|
|
86
109
|
|
|
87
110
|
console.log('\n── Tool naming: alias descriptions ──');
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
// GSD-2
|
|
2
|
-
//
|
|
3
|
-
// builder produces a prompt matching expectations.
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests unit context composer rendering, budgets, and reassess-roadmap prompt integration.
|
|
4
3
|
|
|
5
4
|
import test from "node:test";
|
|
6
5
|
import assert from "node:assert/strict";
|
|
@@ -122,9 +121,9 @@ test("Context Mode composer: standalone output starts with heading and includes
|
|
|
122
121
|
assert.ok(out.startsWith("## Context Mode"));
|
|
123
122
|
assert.match(out, /execution lane/i);
|
|
124
123
|
assert.match(out, /`gsd_exec`/);
|
|
125
|
-
assert.match(out, /noisy
|
|
124
|
+
assert.match(out, /noisy commands/);
|
|
126
125
|
assert.match(out, /`gsd_exec_search`/);
|
|
127
|
-
assert.match(out, /before
|
|
126
|
+
assert.match(out, /before reruns/);
|
|
128
127
|
assert.match(out, /`gsd_resume`/);
|
|
129
128
|
assert.match(out, /after compaction or resume/);
|
|
130
129
|
});
|
|
@@ -137,6 +136,7 @@ test("Context Mode composer: nested output is compact single sentence", () => {
|
|
|
137
136
|
assert.match(out, /`gsd_exec`/);
|
|
138
137
|
assert.match(out, /`gsd_exec_search`/);
|
|
139
138
|
assert.match(out, /`gsd_resume`/);
|
|
139
|
+
assert.ok(out.length < 180, `nested guidance should stay compact, got ${out.length} chars`);
|
|
140
140
|
});
|
|
141
141
|
|
|
142
142
|
// ─── Integration: migrated buildReassessRoadmapPrompt ─────────────────────
|
|
@@ -224,7 +224,7 @@ test("#4782 phase 2: buildReassessRoadmapPrompt emits composer-shaped context wi
|
|
|
224
224
|
|
|
225
225
|
const fakeBase: BaseResolverContext = {
|
|
226
226
|
unitType: "reassess-roadmap",
|
|
227
|
-
basePath:
|
|
227
|
+
basePath: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
|
|
228
228
|
milestoneId: "M001",
|
|
229
229
|
sliceId: "S01",
|
|
230
230
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies UOK kernel path selection and legacy fallback telemetry.
|
|
1
3
|
import test from "node:test";
|
|
2
4
|
import assert from "node:assert/strict";
|
|
3
5
|
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
@@ -11,6 +13,7 @@ import type { AutoSession } from "../auto/session.ts";
|
|
|
11
13
|
import type { LoopDeps } from "../auto/loop-deps.ts";
|
|
12
14
|
import { gsdRoot } from "../paths.ts";
|
|
13
15
|
import type { GSDPreferences } from "../preferences.ts";
|
|
16
|
+
import { getLegacyTelemetry, resetLegacyTelemetry } from "../legacy-telemetry.ts";
|
|
14
17
|
|
|
15
18
|
function makeBasePath(): string {
|
|
16
19
|
return mkdtempSync(join(tmpdir(), "gsd-uok-kernel-"));
|
|
@@ -86,6 +89,7 @@ function readParityEvents(basePath: string): Array<Record<string, unknown>> {
|
|
|
86
89
|
test("runAutoLoopWithUok uses kernel path by default and records uok-kernel parity", async () => {
|
|
87
90
|
const basePath = makeBasePath();
|
|
88
91
|
try {
|
|
92
|
+
resetLegacyTelemetry();
|
|
89
93
|
const args = makeArgs(basePath, {
|
|
90
94
|
uok: {
|
|
91
95
|
enabled: true,
|
|
@@ -109,7 +113,9 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
|
|
|
109
113
|
assert.equal(events[1]?.path, "uok-kernel");
|
|
110
114
|
assert.equal(events[1]?.phase, "exit");
|
|
111
115
|
assert.equal(events[1]?.status, "ok");
|
|
116
|
+
assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 0);
|
|
112
117
|
} finally {
|
|
118
|
+
resetLegacyTelemetry();
|
|
113
119
|
rmSync(basePath, { recursive: true, force: true });
|
|
114
120
|
}
|
|
115
121
|
});
|
|
@@ -117,6 +123,7 @@ test("runAutoLoopWithUok uses kernel path by default and records uok-kernel pari
|
|
|
117
123
|
test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabled", async () => {
|
|
118
124
|
const basePath = makeBasePath();
|
|
119
125
|
try {
|
|
126
|
+
resetLegacyTelemetry();
|
|
120
127
|
const args = makeArgs(basePath, {
|
|
121
128
|
uok: {
|
|
122
129
|
enabled: true,
|
|
@@ -134,7 +141,9 @@ test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabl
|
|
|
134
141
|
assert.equal(events[0]?.path, "legacy-fallback");
|
|
135
142
|
assert.equal(events[1]?.path, "legacy-fallback");
|
|
136
143
|
assert.equal(events[1]?.status, "ok");
|
|
144
|
+
assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 1);
|
|
137
145
|
} finally {
|
|
146
|
+
resetLegacyTelemetry();
|
|
138
147
|
rmSync(basePath, { recursive: true, force: true });
|
|
139
148
|
}
|
|
140
149
|
});
|
|
@@ -144,6 +153,7 @@ test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async
|
|
|
144
153
|
const previous = process.env.GSD_UOK_FORCE_LEGACY;
|
|
145
154
|
process.env.GSD_UOK_FORCE_LEGACY = "1";
|
|
146
155
|
try {
|
|
156
|
+
resetLegacyTelemetry();
|
|
147
157
|
const args = makeArgs(basePath, {
|
|
148
158
|
uok: {
|
|
149
159
|
enabled: true,
|
|
@@ -158,7 +168,9 @@ test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async
|
|
|
158
168
|
assert.equal(events.length, 2);
|
|
159
169
|
assert.equal(events[0]?.path, "legacy-fallback");
|
|
160
170
|
assert.equal(events[1]?.path, "legacy-fallback");
|
|
171
|
+
assert.equal(getLegacyTelemetry()["legacy.uokFallbackUsed"], 1);
|
|
161
172
|
} finally {
|
|
173
|
+
resetLegacyTelemetry();
|
|
162
174
|
if (previous === undefined) delete process.env.GSD_UOK_FORCE_LEGACY;
|
|
163
175
|
else process.env.GSD_UOK_FORCE_LEGACY = previous;
|
|
164
176
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -118,7 +118,7 @@ test("guided flow checks pending deep setup before plan-v2 gate", () => {
|
|
|
118
118
|
const source = readFileSync(join(gsdDir, "guided-flow.ts"), "utf-8");
|
|
119
119
|
const showSmartEntryIdx = source.indexOf("export async function showSmartEntry");
|
|
120
120
|
assert.notEqual(showSmartEntryIdx, -1);
|
|
121
|
-
const deepIdx = source.indexOf("
|
|
121
|
+
const deepIdx = source.indexOf("shouldRunDeepProjectSetup(state, prefs, basePath)", showSmartEntryIdx);
|
|
122
122
|
const planIdx = source.indexOf("runPlanV2Gate(ctx, basePath, state)", showSmartEntryIdx);
|
|
123
123
|
assert.ok(
|
|
124
124
|
deepIdx > -1 && planIdx > -1 && deepIdx < planIdx,
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Unit tests for custom-engine dispatch outcome side-effect adapter.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { handleCustomEngineDispatchOutcome } from "../auto/workflow-custom-engine-dispatch-outcome.ts";
|
|
8
|
+
|
|
9
|
+
test("handleCustomEngineDispatchOutcome stops auto on stop decision", async () => {
|
|
10
|
+
const calls: unknown[] = [];
|
|
11
|
+
|
|
12
|
+
const flow = await handleCustomEngineDispatchOutcome({
|
|
13
|
+
decision: { action: "stop", reason: "done" },
|
|
14
|
+
deps: {
|
|
15
|
+
stopAuto: async reason => {
|
|
16
|
+
calls.push(["stopAuto", reason]);
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
assert.deepEqual(flow, { action: "break" });
|
|
22
|
+
assert.deepEqual(calls, [["stopAuto", "done"]]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("handleCustomEngineDispatchOutcome continues on skip decision", async () => {
|
|
26
|
+
const calls: unknown[] = [];
|
|
27
|
+
|
|
28
|
+
const flow = await handleCustomEngineDispatchOutcome({
|
|
29
|
+
decision: { action: "skip" },
|
|
30
|
+
deps: {
|
|
31
|
+
stopAuto: async reason => {
|
|
32
|
+
calls.push(["stopAuto", reason]);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
assert.deepEqual(flow, { action: "continue" });
|
|
38
|
+
assert.deepEqual(calls, []);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("handleCustomEngineDispatchOutcome dispatches without side effects", async () => {
|
|
42
|
+
const calls: unknown[] = [];
|
|
43
|
+
|
|
44
|
+
const flow = await handleCustomEngineDispatchOutcome({
|
|
45
|
+
decision: { action: "dispatch" },
|
|
46
|
+
deps: {
|
|
47
|
+
stopAuto: async reason => {
|
|
48
|
+
calls.push(["stopAuto", reason]);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
assert.deepEqual(flow, { action: "dispatch" });
|
|
54
|
+
assert.deepEqual(calls, []);
|
|
55
|
+
});
|