gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.0aaa4fc17
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/GSD-WORKFLOW.md +2 -2
- 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 +394 -520
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +92 -36
- 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-post-unit.js +10 -10
- package/dist/resources/extensions/gsd/auto-prompts.js +279 -4
- 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/clean-root-preflight.js +42 -4
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- 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/crash-recovery.js +56 -10
- 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/detection.js +106 -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 +63 -12
- 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/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -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/planning-path-scope.js +26 -0
- 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 -31
- 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 +47 -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/safety/evidence-collector.js +10 -2
- 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/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -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/unit-runtime.js +11 -0
- 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/gsd/worktree-manager.js +16 -14
- 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 +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 +13 -13
- 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/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- 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/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.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/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -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/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- 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/GSD-WORKFLOW.md +2 -2
- 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 +11 -3
- package/src/resources/extensions/gsd/auto/loop.ts +461 -599
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +124 -36
- 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-post-unit.ts +10 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +286 -4
- 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/clean-root-preflight.ts +41 -3
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- 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/crash-recovery.ts +67 -10
- 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/detection.ts +128 -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 +66 -12
- 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/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- 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/planning-path-scope.ts +35 -0
- 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 -31
- 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 +47 -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/safety/evidence-collector.ts +11 -2
- 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 +118 -1
- 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/clean-root-preflight.test.ts +88 -2
- 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/crash-handler-secondary.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- 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/detection.test.ts +140 -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/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- 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 +77 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -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/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -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/unit-runtime.test.ts +7 -0
- 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-health-dispatch.test.ts +37 -6
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- 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/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- 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/unit-runtime.ts +14 -0
- 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/gsd/worktree-manager.ts +15 -4
- 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 → YRK7-Es93MwpIn3VL35K0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → YRK7-Es93MwpIn3VL35K0}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Golden-fixture equivalence tests pinning PR-body output for buildPrEvidence and formatSwarmLanePRBody.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
|
|
10
|
+
import { buildPrEvidence, type PrEvidenceInput } from "../pr-evidence.ts";
|
|
11
|
+
import {
|
|
12
|
+
formatSwarmLanePRBody,
|
|
13
|
+
type SwarmLanePRData,
|
|
14
|
+
} from "../../github-sync/templates.ts";
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const FIXTURES_DIR = join(__dirname, "fixtures", "pr-body");
|
|
18
|
+
|
|
19
|
+
const UPDATE = process.env.UPDATE_GOLDENS === "1";
|
|
20
|
+
|
|
21
|
+
function compareGolden(name: string, actual: string): void {
|
|
22
|
+
const path = join(FIXTURES_DIR, name);
|
|
23
|
+
if (UPDATE) {
|
|
24
|
+
writeFileSync(path, actual, "utf8");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const expected = readFileSync(path, "utf8");
|
|
28
|
+
assert.equal(actual, expected, `golden mismatch for ${name}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const SHIP_BASIC: PrEvidenceInput = {
|
|
32
|
+
milestoneId: "M001",
|
|
33
|
+
milestoneTitle: "Authentication",
|
|
34
|
+
changeType: "feat",
|
|
35
|
+
linkedIssue: "Closes #123",
|
|
36
|
+
summaries: ["### S01\nImplemented login flow."],
|
|
37
|
+
roadmapItems: ["- [x] **S01: Login**"],
|
|
38
|
+
metrics: ["**Units executed:** 3"],
|
|
39
|
+
testsRun: ["npm test", "npm run typecheck:extensions"],
|
|
40
|
+
why: "Users need to authenticate before accessing protected resources.",
|
|
41
|
+
how: "Added password hash check and session token issuance.",
|
|
42
|
+
rollbackNotes: ["Revert the merge commit."],
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const SHIP_EMPTY_OPTIONALS: PrEvidenceInput = {
|
|
46
|
+
milestoneId: "M001",
|
|
47
|
+
milestoneTitle: "Authentication",
|
|
48
|
+
changeType: "feat",
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const SWARM_WITH_BLOCKERS: SwarmLanePRData = {
|
|
52
|
+
lane: {
|
|
53
|
+
id: "writer",
|
|
54
|
+
branch: "lane/single-writer",
|
|
55
|
+
owner: "@owner",
|
|
56
|
+
latestCommit: "abc1234",
|
|
57
|
+
changedContracts: ["WriterToken"],
|
|
58
|
+
testEvidence: ["npm run typecheck:extensions"],
|
|
59
|
+
blockers: ["Awaiting state-lane writer-sequence merge", "Parity report incomplete"],
|
|
60
|
+
},
|
|
61
|
+
impactArea: "Single-writer UOK metadata.",
|
|
62
|
+
transitionRisks: ["Writer token lifecycle regression"],
|
|
63
|
+
rollbackPlan: ["Disable writer sequence enrichment"],
|
|
64
|
+
linkedIssue: 123,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const SWARM_NO_BLOCKERS: SwarmLanePRData = {
|
|
68
|
+
lane: {
|
|
69
|
+
id: "writer",
|
|
70
|
+
branch: "lane/single-writer",
|
|
71
|
+
owner: "@owner",
|
|
72
|
+
latestCommit: "abc1234",
|
|
73
|
+
changedContracts: ["WriterToken"],
|
|
74
|
+
testEvidence: ["npm run typecheck:extensions"],
|
|
75
|
+
},
|
|
76
|
+
impactArea: "Single-writer UOK metadata.",
|
|
77
|
+
transitionRisks: ["Writer token lifecycle regression"],
|
|
78
|
+
rollbackPlan: ["Disable writer sequence enrichment"],
|
|
79
|
+
linkedIssue: 123,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
test("pr-evidence golden: commands-ship basic", () => {
|
|
83
|
+
compareGolden("commands-ship-basic.md", buildPrEvidence(SHIP_BASIC).body);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("pr-evidence golden: commands-ship empty optionals", () => {
|
|
87
|
+
compareGolden("commands-ship-empty-optionals.md", buildPrEvidence(SHIP_EMPTY_OPTIONALS).body);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("pr-evidence golden: swarm-lane with blockers", () => {
|
|
91
|
+
const body = formatSwarmLanePRBody(SWARM_WITH_BLOCKERS);
|
|
92
|
+
compareGolden("swarm-lane-with-blockers.md", body);
|
|
93
|
+
// Cross-check: top-level ## Blockers heading must appear (regression guard
|
|
94
|
+
// for the silent-drop fixed in this PR).
|
|
95
|
+
assert.ok(body.includes("\n## Blockers\n"), "swarm-lane body must emit a top-level ## Blockers heading");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("pr-evidence golden: swarm-lane no blockers (no Blockers heading)", () => {
|
|
99
|
+
const body = formatSwarmLanePRBody(SWARM_NO_BLOCKERS);
|
|
100
|
+
compareGolden("swarm-lane-no-blockers.md", body);
|
|
101
|
+
assert.ok(!body.includes("## Blockers"), "swarm-lane body without blockers must not emit ## Blockers heading");
|
|
102
|
+
});
|
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
|
|
8
|
+
import { buildCompleteMilestonePrompt, buildPlanMilestonePrompt } from "../auto-prompts.ts";
|
|
9
|
+
|
|
10
|
+
function git(cwd: string, args: string[]): string {
|
|
11
|
+
return execFileSync("git", args, {
|
|
12
|
+
cwd,
|
|
13
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
14
|
+
encoding: "utf-8",
|
|
15
|
+
env: { ...process.env, GIT_AUTHOR_NAME: "Test User", GIT_AUTHOR_EMAIL: "test@example.com", GIT_COMMITTER_NAME: "Test User", GIT_COMMITTER_EMAIL: "test@example.com" },
|
|
16
|
+
}).trim();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function makeRepo(files: Record<string, string>): string {
|
|
20
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-right-size-"));
|
|
21
|
+
git(base, ["init", "-b", "main"]);
|
|
22
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
23
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"), "# Context\n\nTest milestone.");
|
|
24
|
+
for (const [path, content] of Object.entries(files)) {
|
|
25
|
+
const abs = join(base, path);
|
|
26
|
+
mkdirSync(join(abs, ".."), { recursive: true });
|
|
27
|
+
writeFileSync(abs, content);
|
|
28
|
+
}
|
|
29
|
+
git(base, ["add", "."]);
|
|
30
|
+
git(base, ["commit", "-m", "init"]);
|
|
31
|
+
return base;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function writeCompleteMilestoneFiles(base: string, validation: string): void {
|
|
35
|
+
const dir = join(base, ".gsd", "milestones", "M001");
|
|
36
|
+
mkdirSync(join(dir, "slices", "S01"), { recursive: true });
|
|
37
|
+
writeFileSync(join(dir, "M001-ROADMAP.md"), "# M001\n\n## Slices\n- [x] **S01: One** `risk:low` `depends:[]`\n > Done\n");
|
|
38
|
+
writeFileSync(join(dir, "M001-VALIDATION.md"), validation);
|
|
39
|
+
writeFileSync(join(dir, "slices", "S01", "S01-SUMMARY.md"), "# S01 Summary\n\n**Verification:** passed\n");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function validationMetadata(): string {
|
|
43
|
+
return [
|
|
44
|
+
"validation_metadata:",
|
|
45
|
+
" covered_artifacts:",
|
|
46
|
+
" - `.gsd/milestones/M001/M001-VALIDATION.md`",
|
|
47
|
+
" - `.gsd/milestones/M001/M001-ROADMAP.md`",
|
|
48
|
+
" - `.gsd/milestones/M001/slices/S01/S01-SUMMARY.md`",
|
|
49
|
+
].join("\n");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
test("plan-milestone prompt includes tiny untyped project classification and one-slice guidance", async () => {
|
|
53
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
54
|
+
try {
|
|
55
|
+
const prompt = await buildPlanMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
56
|
+
assert.match(prompt, /\*\*Kind:\*\* untyped-existing/);
|
|
57
|
+
assert.match(prompt, /\*\*Content files:\*\* 1/);
|
|
58
|
+
assert.match(prompt, /`index\.html`/);
|
|
59
|
+
assert.match(prompt, /Prefer exactly one slice/);
|
|
60
|
+
} finally {
|
|
61
|
+
rmSync(base, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("plan-milestone prompt includes small untyped project 1-2 slice guidance", async () => {
|
|
66
|
+
const base = makeRepo({
|
|
67
|
+
"index.html": "html",
|
|
68
|
+
"README.md": "readme",
|
|
69
|
+
"styles.css": "body {}",
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
const prompt = await buildPlanMilestonePrompt("M001", "Polish static files", base, "minimal");
|
|
73
|
+
assert.match(prompt, /\*\*Kind:\*\* untyped-existing/);
|
|
74
|
+
assert.match(prompt, /\*\*Content files:\*\* 3/);
|
|
75
|
+
assert.match(prompt, /Prefer 1-2 slices/);
|
|
76
|
+
} finally {
|
|
77
|
+
rmSync(base, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("plan-milestone prompt keeps normal guidance for typed projects", async () => {
|
|
82
|
+
const base = makeRepo({
|
|
83
|
+
"package.json": "{\"scripts\":{\"test\":\"node --test\"}}\n",
|
|
84
|
+
"src/index.js": "console.log('ok');\n",
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
const prompt = await buildPlanMilestonePrompt("M001", "Update app", base, "minimal");
|
|
88
|
+
assert.match(prompt, /\*\*Kind:\*\* typed-existing/);
|
|
89
|
+
assert.match(prompt, /Use normal ecosystem-aware planning guidance/);
|
|
90
|
+
assert.doesNotMatch(prompt, /Prefer exactly one slice/);
|
|
91
|
+
} finally {
|
|
92
|
+
rmSync(base, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("workflow docs no longer contain blanket 4-10 slice guidance", () => {
|
|
97
|
+
const docs = readFileSync(join(process.cwd(), "src", "resources", "GSD-WORKFLOW.md"), "utf-8");
|
|
98
|
+
assert.doesNotMatch(docs, /4-10 slices/);
|
|
99
|
+
assert.match(docs, /1-10 slices/);
|
|
100
|
+
assert.match(docs, /single-file/);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("prompt templates carry right-sized planning and closeout mode guidance", () => {
|
|
104
|
+
const planTemplate = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "prompts", "plan-milestone.md"), "utf-8");
|
|
105
|
+
const completeTemplate = readFileSync(join(process.cwd(), "src", "resources", "extensions", "gsd", "prompts", "complete-milestone.md"), "utf-8");
|
|
106
|
+
|
|
107
|
+
assert.match(planTemplate, /Use 1-10 slices, sized to the work/);
|
|
108
|
+
assert.match(planTemplate, /tiny\/single-file\/static work should usually be one slice/);
|
|
109
|
+
assert.match(planTemplate, /untyped-existing/);
|
|
110
|
+
assert.match(completeTemplate, /Closeout Review Mode/);
|
|
111
|
+
assert.match(completeTemplate, /passing validation artifact is present/);
|
|
112
|
+
assert.doesNotMatch(completeTemplate, /^### Delegate Review Work/m);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("complete-milestone prompt trusts passing validation artifact", async () => {
|
|
116
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
117
|
+
try {
|
|
118
|
+
writeCompleteMilestoneFiles(base, `---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\n${validationMetadata()}\n\nAll checks passed.`);
|
|
119
|
+
const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
120
|
+
assert.match(prompt, /Passing Validation Artifact/);
|
|
121
|
+
assert.match(prompt, /Treat it as authoritative/);
|
|
122
|
+
assert.match(prompt, /Do not delegate fresh reviewer\/security\/tester audits/);
|
|
123
|
+
assert.match(prompt, /All checks passed/);
|
|
124
|
+
} finally {
|
|
125
|
+
rmSync(base, { recursive: true, force: true });
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("complete-milestone prompt trusts centralized markdown body pass verdict", async () => {
|
|
130
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
131
|
+
try {
|
|
132
|
+
writeCompleteMilestoneFiles(base, `# Validation\n\n**Verdict:** PASS\n\n${validationMetadata()}\n\nAll checks passed.`);
|
|
133
|
+
const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
134
|
+
assert.match(prompt, /Passing Validation Artifact/);
|
|
135
|
+
assert.match(prompt, /Treat it as authoritative/);
|
|
136
|
+
assert.match(prompt, /Do not delegate fresh reviewer\/security\/tester audits/);
|
|
137
|
+
} finally {
|
|
138
|
+
rmSync(base, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("complete-milestone prompt does not trust stale pass validation without metadata", async () => {
|
|
143
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
144
|
+
try {
|
|
145
|
+
writeCompleteMilestoneFiles(base, "---\nverdict: pass\nremediation_round: 0\n---\n\n# Validation\nAll checks passed.");
|
|
146
|
+
const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
147
|
+
assert.match(prompt, /Validation Requires Attention/);
|
|
148
|
+
assert.match(prompt, /missing freshness metadata/);
|
|
149
|
+
assert.doesNotMatch(prompt, /Passing Validation Artifact/);
|
|
150
|
+
} finally {
|
|
151
|
+
rmSync(base, { recursive: true, force: true });
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("complete-milestone prompt does not trust pass validation missing current summary coverage", async () => {
|
|
156
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
157
|
+
try {
|
|
158
|
+
writeCompleteMilestoneFiles(base, [
|
|
159
|
+
"---",
|
|
160
|
+
"verdict: pass",
|
|
161
|
+
"remediation_round: 0",
|
|
162
|
+
"---",
|
|
163
|
+
"",
|
|
164
|
+
"# Validation",
|
|
165
|
+
"validation_metadata:",
|
|
166
|
+
" covered_artifacts:",
|
|
167
|
+
" - `.gsd/milestones/M001/M001-VALIDATION.md`",
|
|
168
|
+
" - `.gsd/milestones/M001/M001-ROADMAP.md`",
|
|
169
|
+
"",
|
|
170
|
+
"All checks passed.",
|
|
171
|
+
].join("\n"));
|
|
172
|
+
const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
173
|
+
assert.match(prompt, /Validation Requires Attention/);
|
|
174
|
+
assert.match(prompt, /does not cover current milestone artifacts/);
|
|
175
|
+
assert.doesNotMatch(prompt, /Passing Validation Artifact/);
|
|
176
|
+
} finally {
|
|
177
|
+
rmSync(base, { recursive: true, force: true });
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("complete-milestone prompt keeps deeper review path without passing validation", async () => {
|
|
182
|
+
const base = makeRepo({ "index.html": "<!doctype html>\n<title>Test</title>\n" });
|
|
183
|
+
try {
|
|
184
|
+
writeCompleteMilestoneFiles(base, "---\nverdict: needs-attention\nremediation_round: 0\n---\n\n# Validation\nFix gaps.");
|
|
185
|
+
const prompt = await buildCompleteMilestonePrompt("M001", "Polish static page", base, "minimal");
|
|
186
|
+
assert.match(prompt, /Validation Requires Attention/);
|
|
187
|
+
assert.match(prompt, /verdict `needs-attention`/);
|
|
188
|
+
assert.match(prompt, /Use `subagent` for review work needing fresh context/i);
|
|
189
|
+
} finally {
|
|
190
|
+
rmSync(base, { recursive: true, force: true });
|
|
191
|
+
}
|
|
192
|
+
});
|