gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.c5f2443b3
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 +55 -70
- 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 +359 -523
- 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/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 +3 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +45 -52
- 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 +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -5
- 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 +4 -0
- 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/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 +76 -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/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 +13 -13
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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 +13 -13
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-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/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +9 -2
- 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/contracts/tsconfig.tsbuildinfo +1 -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/package.json +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -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/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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -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 +31 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- 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/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
- 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 +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
- 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/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +8 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +8 -2
- 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/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +59 -84
- 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 +411 -598
- 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/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 +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +42 -50
- 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 +14 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -5
- 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 +6 -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/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 +124 -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 +32 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -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-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 +38 -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 +12 -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.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/forensics-prompt-rendering.test.ts +36 -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.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/worktree-submodule-safety.test.ts +17 -33
- 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/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 → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
|
@@ -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
|
+
});
|
|
@@ -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 });
|
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Unit tests for auto-mode custom-engine iteration-data adapter.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import type { GSDState } from "../types.ts";
|
|
8
|
+
import { buildCustomEngineIterationData } from "../auto/workflow-custom-engine-iteration.ts";
|
|
9
|
+
|
|
10
|
+
test("buildCustomEngineIterationData derives state from canonical project root", async () => {
|
|
11
|
+
const roots: string[] = [];
|
|
12
|
+
|
|
13
|
+
await buildCustomEngineIterationData({
|
|
14
|
+
step: { unitType: "engine-task", unitId: "E001", prompt: "Run engine task" },
|
|
15
|
+
basePath: "/worktree",
|
|
16
|
+
canonicalProjectRoot: "/project",
|
|
17
|
+
currentMilestoneId: "M001",
|
|
18
|
+
deriveState: async root => {
|
|
19
|
+
roots.push(root);
|
|
20
|
+
return { phase: "executing" } as GSDState;
|
|
21
|
+
},
|
|
22
|
+
logPostDerive: () => {},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
assert.deepEqual(roots, ["/project"]);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("buildCustomEngineIterationData maps engine step into iteration data", async () => {
|
|
29
|
+
const state = {
|
|
30
|
+
phase: "executing",
|
|
31
|
+
activeMilestone: { id: "M001", title: "Milestone 1" },
|
|
32
|
+
} as GSDState;
|
|
33
|
+
|
|
34
|
+
const iterData = await buildCustomEngineIterationData({
|
|
35
|
+
step: { unitType: "engine-task", unitId: "E001", prompt: "Run engine task" },
|
|
36
|
+
basePath: "/worktree",
|
|
37
|
+
canonicalProjectRoot: "/project",
|
|
38
|
+
currentMilestoneId: "M001",
|
|
39
|
+
deriveState: async () => state,
|
|
40
|
+
logPostDerive: () => {},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
assert.equal(iterData.unitType, "engine-task");
|
|
44
|
+
assert.equal(iterData.unitId, "E001");
|
|
45
|
+
assert.equal(iterData.prompt, "Run engine task");
|
|
46
|
+
assert.equal(iterData.finalPrompt, "Run engine task");
|
|
47
|
+
assert.equal(iterData.pauseAfterUatDispatch, false);
|
|
48
|
+
assert.equal(iterData.state, state);
|
|
49
|
+
assert.equal(iterData.mid, "M001");
|
|
50
|
+
assert.equal(iterData.midTitle, "Workflow");
|
|
51
|
+
assert.equal(iterData.isRetry, false);
|
|
52
|
+
assert.equal(iterData.previousTier, undefined);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("buildCustomEngineIterationData defaults milestone id to workflow", async () => {
|
|
56
|
+
const iterData = await buildCustomEngineIterationData({
|
|
57
|
+
step: { unitType: "engine-task", unitId: "E001", prompt: "Run engine task" },
|
|
58
|
+
basePath: "/worktree",
|
|
59
|
+
canonicalProjectRoot: "/project",
|
|
60
|
+
currentMilestoneId: null,
|
|
61
|
+
deriveState: async () => ({ phase: "executing" }) as GSDState,
|
|
62
|
+
logPostDerive: () => {},
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
assert.equal(iterData.mid, "workflow");
|
|
66
|
+
assert.equal(iterData.midTitle, "Workflow");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("buildCustomEngineIterationData logs active unit details", async () => {
|
|
70
|
+
const logs: unknown[] = [];
|
|
71
|
+
|
|
72
|
+
await buildCustomEngineIterationData({
|
|
73
|
+
step: { unitType: "engine-task", unitId: "E001", prompt: "Run engine task" },
|
|
74
|
+
basePath: "/worktree",
|
|
75
|
+
canonicalProjectRoot: "/project",
|
|
76
|
+
currentMilestoneId: "M001",
|
|
77
|
+
deriveState: async () => ({
|
|
78
|
+
phase: "planning",
|
|
79
|
+
activeMilestone: { id: "M001", title: "Milestone 1" },
|
|
80
|
+
activeSlice: { id: "S01" },
|
|
81
|
+
activeTask: { id: "T01" },
|
|
82
|
+
}) as GSDState,
|
|
83
|
+
logPostDerive: details => logs.push(details),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
assert.deepEqual(logs, [{
|
|
87
|
+
site: "custom-engine-gsd-state",
|
|
88
|
+
basePath: "/worktree",
|
|
89
|
+
canonicalProjectRoot: "/project",
|
|
90
|
+
derivedPhase: "planning",
|
|
91
|
+
activeUnit: "T01",
|
|
92
|
+
}]);
|
|
93
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Unit tests for custom-engine reconcile outcome side-effect adapter.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
handleCustomEngineReconcileOutcome,
|
|
9
|
+
type HandleCustomEngineReconcileOutcomeDeps,
|
|
10
|
+
} from "../auto/workflow-custom-engine-reconcile-outcome.ts";
|
|
11
|
+
|
|
12
|
+
function makeDeps(): {
|
|
13
|
+
deps: HandleCustomEngineReconcileOutcomeDeps;
|
|
14
|
+
calls: unknown[];
|
|
15
|
+
} {
|
|
16
|
+
const calls: unknown[] = [];
|
|
17
|
+
const deps: HandleCustomEngineReconcileOutcomeDeps = {
|
|
18
|
+
stopAuto: async reason => {
|
|
19
|
+
calls.push(["stopAuto", reason]);
|
|
20
|
+
},
|
|
21
|
+
pauseAuto: async () => {
|
|
22
|
+
calls.push(["pauseAuto"]);
|
|
23
|
+
},
|
|
24
|
+
report: (action, details) => calls.push(["report", action, details]),
|
|
25
|
+
finishTurn: (status, failureClass, error) => calls.push(["finishTurn", status, failureClass, error]),
|
|
26
|
+
};
|
|
27
|
+
return { deps, calls };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
test("handleCustomEngineReconcileOutcome stops completed workflow", async () => {
|
|
31
|
+
const { deps, calls } = makeDeps();
|
|
32
|
+
|
|
33
|
+
const flow = await handleCustomEngineReconcileOutcome({
|
|
34
|
+
outcome: {
|
|
35
|
+
decision: { action: "complete-workflow", stopReason: "Workflow complete" },
|
|
36
|
+
},
|
|
37
|
+
unitType: "execute-task",
|
|
38
|
+
unitId: "T01",
|
|
39
|
+
deps,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
assert.deepEqual(flow, { action: "break" });
|
|
43
|
+
assert.deepEqual(calls, [
|
|
44
|
+
["stopAuto", "Workflow complete"],
|
|
45
|
+
["report", "milestone-complete", { unitType: "execute-task", unitId: "T01" }],
|
|
46
|
+
["finishTurn", "completed", undefined, undefined],
|
|
47
|
+
]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("handleCustomEngineReconcileOutcome pauses for manual attention", async () => {
|
|
51
|
+
const { deps, calls } = makeDeps();
|
|
52
|
+
|
|
53
|
+
const flow = await handleCustomEngineReconcileOutcome({
|
|
54
|
+
outcome: {
|
|
55
|
+
decision: { action: "pause" },
|
|
56
|
+
},
|
|
57
|
+
unitType: "verify-slice",
|
|
58
|
+
unitId: "S01",
|
|
59
|
+
deps,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
assert.deepEqual(flow, { action: "break" });
|
|
63
|
+
assert.deepEqual(calls, [
|
|
64
|
+
["pauseAuto"],
|
|
65
|
+
["report", "pause", { unitType: "verify-slice", unitId: "S01" }],
|
|
66
|
+
["finishTurn", "paused", "manual-attention", undefined],
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("handleCustomEngineReconcileOutcome stops with reconcile reason", async () => {
|
|
71
|
+
const { deps, calls } = makeDeps();
|
|
72
|
+
|
|
73
|
+
const flow = await handleCustomEngineReconcileOutcome({
|
|
74
|
+
outcome: {
|
|
75
|
+
decision: { action: "stop", reason: "blocked" },
|
|
76
|
+
reason: "blocked",
|
|
77
|
+
},
|
|
78
|
+
unitType: "complete-slice",
|
|
79
|
+
unitId: "S01",
|
|
80
|
+
deps,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
assert.deepEqual(flow, { action: "break" });
|
|
84
|
+
assert.deepEqual(calls, [
|
|
85
|
+
["stopAuto", "blocked"],
|
|
86
|
+
["report", "stop", { unitType: "complete-slice", unitId: "S01", reason: "blocked" }],
|
|
87
|
+
["finishTurn", "stopped", "manual-attention", "blocked"],
|
|
88
|
+
]);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("handleCustomEngineReconcileOutcome continues after completed unit", async () => {
|
|
92
|
+
const { deps, calls } = makeDeps();
|
|
93
|
+
|
|
94
|
+
const flow = await handleCustomEngineReconcileOutcome({
|
|
95
|
+
outcome: {
|
|
96
|
+
decision: { action: "continue" },
|
|
97
|
+
},
|
|
98
|
+
unitType: "research-slice",
|
|
99
|
+
unitId: "S01",
|
|
100
|
+
deps,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
assert.deepEqual(flow, { action: "continue" });
|
|
104
|
+
assert.deepEqual(calls, [
|
|
105
|
+
["report", "continue", { unitType: "research-slice", unitId: "S01" }],
|
|
106
|
+
["finishTurn", "completed", undefined, undefined],
|
|
107
|
+
]);
|
|
108
|
+
});
|