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
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection, parseTaskPlanFile } from "./files.js";
|
|
10
10
|
import type { Override, UatType } from "./files.js";
|
|
11
|
-
import { hasVerdict, getUatType } from "./verdict-parser.js";
|
|
11
|
+
import { hasVerdict, getUatType, extractVerdict } from "./verdict-parser.js";
|
|
12
12
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
13
13
|
import {
|
|
14
14
|
resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
|
|
@@ -39,6 +39,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
39
39
|
import { inlineGraphSubgraph } from "./graph-context.js";
|
|
40
40
|
import { buildExtractionStepsBlock } from "./commands-extract-learnings.js";
|
|
41
41
|
import { resolveSkillManifest, warnIfManifestHasMissingSkills } from "./skill-manifest.js";
|
|
42
|
+
import { classifyProject, type ProjectClassification } from "./detection.js";
|
|
42
43
|
|
|
43
44
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
44
45
|
|
|
@@ -80,6 +81,108 @@ function resolveSummaryBudgetChars(): number {
|
|
|
80
81
|
return resolvePromptBudgets().summaryBudgetChars;
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
function formatProjectClassificationForPlanning(classification: ProjectClassification): string {
|
|
85
|
+
const sampleFiles = classification.contentFiles.slice(0, 8);
|
|
86
|
+
const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
|
|
87
|
+
const lines = [
|
|
88
|
+
"### Project Classification",
|
|
89
|
+
"",
|
|
90
|
+
`- **Kind:** ${classification.kind}`,
|
|
91
|
+
`- **Content files:** ${classification.contentFiles.length}`,
|
|
92
|
+
`- **Sample files:** ${sample}`,
|
|
93
|
+
`- **Reason:** ${classification.reason}`,
|
|
94
|
+
"",
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
if (classification.kind === "untyped-existing") {
|
|
98
|
+
if (classification.contentFiles.length <= 2) {
|
|
99
|
+
lines.push(
|
|
100
|
+
"**Workflow sizing:** This is a tiny existing untyped project. Prefer exactly one slice unless the milestone request clearly spans multiple independent user-visible capabilities.",
|
|
101
|
+
);
|
|
102
|
+
} else if (classification.contentFiles.length <= 5) {
|
|
103
|
+
lines.push(
|
|
104
|
+
"**Workflow sizing:** This is a small existing untyped project. Prefer 1-2 slices unless the milestone request clearly spans multiple independent user-visible capabilities.",
|
|
105
|
+
);
|
|
106
|
+
} else {
|
|
107
|
+
lines.push(
|
|
108
|
+
"**Workflow sizing:** Existing untyped project. Use generic file-level workflow guidance and size slices by real capability boundaries, not by missing tooling markers.",
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
} else if (classification.kind === "greenfield") {
|
|
112
|
+
lines.push("**Workflow sizing:** No project content exists yet. Use normal greenfield sizing for the requested scope.");
|
|
113
|
+
} else if (classification.kind === "typed-existing") {
|
|
114
|
+
lines.push("**Workflow sizing:** Known project markers exist. Use normal ecosystem-aware planning guidance.");
|
|
115
|
+
} else {
|
|
116
|
+
lines.push("**Workflow sizing:** Invalid repository state. Planning should surface this as a blocker rather than inventing project structure.");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return lines.join("\n");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function normalizeArtifactRef(value: string): string {
|
|
123
|
+
return value.trim().replace(/^[-\s]+/, "").replace(/^["'`]+|["'`]+$/g, "").replaceAll("\\", "/").replace(/^\.\//, "");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function parseCoveredArtifacts(validationContent: string): Set<string> {
|
|
127
|
+
const covered = new Set<string>();
|
|
128
|
+
const lines = validationContent.split(/\r?\n/);
|
|
129
|
+
let inCoveredArtifacts = false;
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
if (/^\s*covered[-_]?artifacts\s*:/i.test(line)) {
|
|
132
|
+
inCoveredArtifacts = true;
|
|
133
|
+
const inline = line.split(/covered[-_]?artifacts\s*:/i)[1]?.trim();
|
|
134
|
+
if (inline && inline !== "[]") {
|
|
135
|
+
inline.replace(/^\[|\]$/g, "").split(",").map(normalizeArtifactRef).filter(Boolean).forEach((item) => covered.add(item));
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!inCoveredArtifacts) continue;
|
|
140
|
+
if (/^\S/.test(line) && !/^\s*-/.test(line)) break;
|
|
141
|
+
const item = line.match(/^\s*-\s*(.+)$/)?.[1];
|
|
142
|
+
if (item) covered.add(normalizeArtifactRef(item));
|
|
143
|
+
}
|
|
144
|
+
return covered;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function isValidationFreshOrApplicable(validationContent: string | null, currentArtifacts: string[]): boolean {
|
|
148
|
+
if (!validationContent) return false;
|
|
149
|
+
if (!/validation_metadata:/i.test(validationContent)) return false;
|
|
150
|
+
const coveredArtifacts = parseCoveredArtifacts(validationContent);
|
|
151
|
+
if (coveredArtifacts.size === 0) return false;
|
|
152
|
+
return currentArtifacts
|
|
153
|
+
.map(normalizeArtifactRef)
|
|
154
|
+
.filter(Boolean)
|
|
155
|
+
.every((artifact) => coveredArtifacts.has(artifact));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function formatCloseoutReviewInstructions(validationContent: string | null, validationRel: string, currentArtifacts: string[]): string {
|
|
159
|
+
const verdict = validationContent ? extractVerdict(validationContent) : null;
|
|
160
|
+
const validationFresh = isValidationFreshOrApplicable(validationContent, currentArtifacts);
|
|
161
|
+
if (verdict === "pass" && validationFresh) {
|
|
162
|
+
return [
|
|
163
|
+
"### Passing Validation Artifact",
|
|
164
|
+
"",
|
|
165
|
+
`A passing validation artifact is present at \`${validationRel}\`. Treat it as authoritative for success criteria, requirement coverage, verification classes, and cross-slice integration.`,
|
|
166
|
+
"",
|
|
167
|
+
"Do not delegate fresh reviewer/security/tester audits and do not redo the validation evidence review unless the artifact is internally inconsistent with the inlined summaries. Focus this unit on final milestone narrative, learnings, PROJECT/requirements updates, and `gsd_complete_milestone`.",
|
|
168
|
+
].join("\n");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (verdict) {
|
|
172
|
+
return [
|
|
173
|
+
"### Validation Requires Attention",
|
|
174
|
+
"",
|
|
175
|
+
`A validation artifact is present at \`${validationRel}\` with verdict \`${verdict}\`, but it is missing freshness metadata or does not cover current milestone artifacts. Do not treat the milestone as complete unless the issues are resolved and evidence supports completion.`,
|
|
176
|
+
].join("\n");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return [
|
|
180
|
+
"### No Passing Validation Artifact",
|
|
181
|
+
"",
|
|
182
|
+
`No passing validation artifact was found at \`${validationRel}\`. Use the full closeout review path before completion.`,
|
|
183
|
+
].join("\n");
|
|
184
|
+
}
|
|
185
|
+
|
|
83
186
|
function capPreamble(preamble: string): string {
|
|
84
187
|
// Cap inlined context at min(historical 30K ceiling, scaled inline budget).
|
|
85
188
|
// The ceiling preserves pre-fix behavior for large-window users; the scaled
|
|
@@ -275,6 +378,171 @@ export async function inlineFileSmart(
|
|
|
275
378
|
return `### ${label}\nSource: \`${relPath}\`\n\n${truncated}`;
|
|
276
379
|
}
|
|
277
380
|
|
|
381
|
+
function inlineCompactTemplate(name: "plan" | "task-summary" | "slice-summary", label: string): string {
|
|
382
|
+
const compact: Record<typeof name, string> = {
|
|
383
|
+
plan: [
|
|
384
|
+
"# {{sliceId}}: {{sliceTitle}}",
|
|
385
|
+
"",
|
|
386
|
+
"**Goal:** {{goal}}",
|
|
387
|
+
"**Demo:** {{demo}}",
|
|
388
|
+
"",
|
|
389
|
+
"## Must-Haves",
|
|
390
|
+
"- {{mustHave}}",
|
|
391
|
+
"",
|
|
392
|
+
"## Threat Surface",
|
|
393
|
+
"- Abuse: {{abuseScenarios}}",
|
|
394
|
+
"- Data exposure: {{sensitiveDataAccessible}}",
|
|
395
|
+
"- Input trust: {{untrustedInput}}",
|
|
396
|
+
"",
|
|
397
|
+
"## Requirement Impact",
|
|
398
|
+
"- Requirements touched: {{requirementIds}}",
|
|
399
|
+
"- Re-verify: {{whatMustBeRetested}}",
|
|
400
|
+
"- Decisions revisited: {{decisionIds}}",
|
|
401
|
+
"",
|
|
402
|
+
"## Proof Level",
|
|
403
|
+
"- This slice proves: {{contract | integration | operational | final-assembly}}",
|
|
404
|
+
"- Real runtime required: {{yes/no}}",
|
|
405
|
+
"- Human/UAT required: {{yes/no}}",
|
|
406
|
+
"",
|
|
407
|
+
"## Verification",
|
|
408
|
+
"- {{testFileOrCommand}}",
|
|
409
|
+
"",
|
|
410
|
+
"## Observability / Diagnostics",
|
|
411
|
+
"- Runtime signals: {{signalOrNone}}",
|
|
412
|
+
"- Inspection surfaces: {{surfaceOrNone}}",
|
|
413
|
+
"- Failure visibility: {{failureSignalOrNone}}",
|
|
414
|
+
"- Redaction constraints: {{secretOrPiiBoundaryOrNone}}",
|
|
415
|
+
"",
|
|
416
|
+
"## Integration Closure",
|
|
417
|
+
"- Upstream surfaces consumed: {{filesModulesContracts}}",
|
|
418
|
+
"- New wiring introduced: {{entrypointOrNone}}",
|
|
419
|
+
"- Remaining end-to-end work: {{listOrNothing}}",
|
|
420
|
+
"",
|
|
421
|
+
"## Tasks",
|
|
422
|
+
"- [ ] **T01: {{taskTitle}}** `est:{{estimate}}`",
|
|
423
|
+
" - Why: {{whyThisTaskExists}}",
|
|
424
|
+
" - Files: `{{filePath}}`",
|
|
425
|
+
" - Do: {{specificImplementationStepsAndConstraints}}",
|
|
426
|
+
" - Verify: {{testCommandOrRuntimeCheck}}",
|
|
427
|
+
" - Done when: {{measurableAcceptanceCondition}}",
|
|
428
|
+
"",
|
|
429
|
+
"## Files Likely Touched",
|
|
430
|
+
"- `{{filePath}}`",
|
|
431
|
+
].join("\n"),
|
|
432
|
+
"task-summary": [
|
|
433
|
+
"---",
|
|
434
|
+
"id: {{taskId}}",
|
|
435
|
+
"parent: {{sliceId}}",
|
|
436
|
+
"milestone: {{milestoneId}}",
|
|
437
|
+
"provides: [{{whatThisTaskProvides}}]",
|
|
438
|
+
"key_files: [{{filePath}}]",
|
|
439
|
+
"key_decisions: [{{decision}}]",
|
|
440
|
+
"patterns_established: [{{pattern}}]",
|
|
441
|
+
"observability_surfaces: [{{diagnosticOrNone}}]",
|
|
442
|
+
"duration: {{duration}}",
|
|
443
|
+
"verification_result: passed",
|
|
444
|
+
"completed_at: {{date}}",
|
|
445
|
+
"blocker_discovered: false",
|
|
446
|
+
"---",
|
|
447
|
+
"",
|
|
448
|
+
"# {{taskId}}: {{taskTitle}}",
|
|
449
|
+
"**{{oneLiner}}**",
|
|
450
|
+
"",
|
|
451
|
+
"## What Happened",
|
|
452
|
+
"{{narrative}}",
|
|
453
|
+
"",
|
|
454
|
+
"## Verification",
|
|
455
|
+
"{{whatWasVerifiedAndHow}}",
|
|
456
|
+
"",
|
|
457
|
+
"## Verification Evidence",
|
|
458
|
+
"| # | Command | Exit Code | Verdict | Duration |",
|
|
459
|
+
"|---|---------|-----------|---------|----------|",
|
|
460
|
+
"| {{row}} | {{command}} | {{exitCode}} | {{verdict}} | {{duration}} |",
|
|
461
|
+
"",
|
|
462
|
+
"## Diagnostics",
|
|
463
|
+
"{{diagnosticsOrNone}}",
|
|
464
|
+
"",
|
|
465
|
+
"## Deviations",
|
|
466
|
+
"{{deviationsFromPlan_OR_none}}",
|
|
467
|
+
"",
|
|
468
|
+
"## Known Issues",
|
|
469
|
+
"{{issuesDiscoveredButNotFixed_OR_none}}",
|
|
470
|
+
"",
|
|
471
|
+
"## Files Created/Modified",
|
|
472
|
+
"- `{{filePath}}` - {{description}}",
|
|
473
|
+
].join("\n"),
|
|
474
|
+
"slice-summary": [
|
|
475
|
+
"---",
|
|
476
|
+
"id: {{sliceId}}",
|
|
477
|
+
"parent: {{milestoneId}}",
|
|
478
|
+
"milestone: {{milestoneId}}",
|
|
479
|
+
"provides: [{{whatThisSliceProvides}}]",
|
|
480
|
+
"requires: []",
|
|
481
|
+
"affects: []",
|
|
482
|
+
"key_files: [{{filePath}}]",
|
|
483
|
+
"key_decisions: [{{decision}}]",
|
|
484
|
+
"patterns_established: [{{pattern}}]",
|
|
485
|
+
"observability_surfaces: [{{diagnosticOrNone}}]",
|
|
486
|
+
"drill_down_paths: [{{pathToTaskSummary}}]",
|
|
487
|
+
"duration: {{duration}}",
|
|
488
|
+
"verification_result: passed",
|
|
489
|
+
"completed_at: {{date}}",
|
|
490
|
+
"---",
|
|
491
|
+
"",
|
|
492
|
+
"# {{sliceId}}: {{sliceTitle}}",
|
|
493
|
+
"**{{oneLiner}}**",
|
|
494
|
+
"",
|
|
495
|
+
"## What Happened",
|
|
496
|
+
"{{narrative}}",
|
|
497
|
+
"",
|
|
498
|
+
"## Verification",
|
|
499
|
+
"{{whatWasVerifiedAcrossAllTasks}}",
|
|
500
|
+
"",
|
|
501
|
+
"## Requirements Advanced",
|
|
502
|
+
"- {{requirementId}} - {{howThisSliceAdvancedIt}}",
|
|
503
|
+
"",
|
|
504
|
+
"## Requirements Validated",
|
|
505
|
+
"- {{requirementId}} - {{whatProofNowMakesItValidated}}",
|
|
506
|
+
"",
|
|
507
|
+
"## New Requirements Surfaced",
|
|
508
|
+
"- {{newRequirementOr_none}}",
|
|
509
|
+
"",
|
|
510
|
+
"## Requirements Invalidated or Re-scoped",
|
|
511
|
+
"- {{requirementIdOr_none}} - {{whatChanged}}",
|
|
512
|
+
"",
|
|
513
|
+
"## Operational Readiness",
|
|
514
|
+
"- Health signal: {{healthSignalOrNA}}",
|
|
515
|
+
"- Failure signal: {{failureSignalOrNA}}",
|
|
516
|
+
"- Recovery: {{recoveryOrNA}}",
|
|
517
|
+
"- Monitoring gaps: {{gapsOrNone}}",
|
|
518
|
+
"",
|
|
519
|
+
"## Deviations",
|
|
520
|
+
"{{deviationsFromPlan_OR_none}}",
|
|
521
|
+
"",
|
|
522
|
+
"## Known Limitations",
|
|
523
|
+
"{{whatDoesntWorkYet_OR_whatWasDeferredToLaterSlices}}",
|
|
524
|
+
"",
|
|
525
|
+
"## Follow-ups",
|
|
526
|
+
"{{workDeferredOrDiscoveredDuringExecution_OR_none}}",
|
|
527
|
+
"",
|
|
528
|
+
"## Files Created/Modified",
|
|
529
|
+
"- `{{filePath}}` - {{description}}",
|
|
530
|
+
"",
|
|
531
|
+
"## Forward Intelligence",
|
|
532
|
+
"### What the next slice should know",
|
|
533
|
+
"- {{insightThatWouldHelpDownstreamWork}}",
|
|
534
|
+
"### What's fragile",
|
|
535
|
+
"- {{fragileAreaOrThinImplementation}} - {{whyItMatters}}",
|
|
536
|
+
"### Authoritative diagnostics",
|
|
537
|
+
"- {{whereAFutureAgentShouldLookFirst}} - {{whyThisSignalIsTrustworthy}}",
|
|
538
|
+
"### What assumptions changed",
|
|
539
|
+
"- {{originalAssumption}} - {{whatActuallyHappened}}",
|
|
540
|
+
].join("\n"),
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
return `${compact[name]}\n\n### Output Template: ${label}\nSource: \`templates/${name}.md\``;
|
|
544
|
+
}
|
|
545
|
+
|
|
278
546
|
/**
|
|
279
547
|
* Compact slice-summary excerpt for milestone-level closers (#4780).
|
|
280
548
|
*
|
|
@@ -1493,6 +1761,8 @@ export async function buildPlanMilestonePrompt(mid: string, midTitle: string, ba
|
|
|
1493
1761
|
const researchAnchor = readPhaseAnchor(base, mid, "research-milestone");
|
|
1494
1762
|
if (researchAnchor) inlined.push(formatAnchorForPrompt(researchAnchor));
|
|
1495
1763
|
|
|
1764
|
+
inlined.push(formatProjectClassificationForPlanning(classifyProject(base)));
|
|
1765
|
+
|
|
1496
1766
|
inlined.push(await inlineFile(contextPath, contextRel, "Milestone Context"));
|
|
1497
1767
|
const researchInline = await inlineFileOptional(researchPath, researchRel, "Milestone Research");
|
|
1498
1768
|
if (researchInline) inlined.push(researchInline);
|
|
@@ -1717,7 +1987,7 @@ async function renderSlicePrompt(options: {
|
|
|
1717
1987
|
const graphBlock = await inlineGraphSubgraph(base, `${sid} ${sTitle}`, { budget: 3000 });
|
|
1718
1988
|
if (graphBlock) inlined.push(graphBlock);
|
|
1719
1989
|
|
|
1720
|
-
inlined.push(inlineTemplate("plan", "Slice Plan"));
|
|
1990
|
+
inlined.push(level === "minimal" ? inlineCompactTemplate("plan", "Slice Plan") : inlineTemplate("plan", "Slice Plan"));
|
|
1721
1991
|
if (level === "full") {
|
|
1722
1992
|
inlined.push(inlineTemplate("task-plan", "Task Plan"));
|
|
1723
1993
|
}
|
|
@@ -1945,7 +2215,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
1945
2215
|
const graphBlockET = await inlineGraphSubgraph(base, `${tid} ${tTitle}`, { budget: 2000 });
|
|
1946
2216
|
|
|
1947
2217
|
const inlinedTemplates = inlineLevel === "minimal"
|
|
1948
|
-
?
|
|
2218
|
+
? inlineCompactTemplate("task-summary", "Task Summary")
|
|
1949
2219
|
: [
|
|
1950
2220
|
inlineTemplate("task-summary", "Task Summary"),
|
|
1951
2221
|
inlineTemplate("decisions", "Decisions"),
|
|
@@ -2091,7 +2361,9 @@ export async function buildCompleteSlicePrompt(
|
|
|
2091
2361
|
return blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
|
|
2092
2362
|
}
|
|
2093
2363
|
case "templates": {
|
|
2094
|
-
const parts = [
|
|
2364
|
+
const parts = [inlineLevel === "minimal"
|
|
2365
|
+
? inlineCompactTemplate("slice-summary", "Slice Summary")
|
|
2366
|
+
: inlineTemplate("slice-summary", "Slice Summary")];
|
|
2095
2367
|
if (inlineLevel !== "minimal") {
|
|
2096
2368
|
parts.push(inlineTemplate("uat", "UAT"));
|
|
2097
2369
|
}
|
|
@@ -2181,6 +2453,9 @@ export async function buildCompleteMilestonePrompt(
|
|
|
2181
2453
|
const inlineLevel = level ?? resolveInlineLevel();
|
|
2182
2454
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
2183
2455
|
const roadmapRel = relMilestoneFile(base, mid, "ROADMAP");
|
|
2456
|
+
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
2457
|
+
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
2458
|
+
const validationContent = validationPath ? await loadFile(validationPath) : null;
|
|
2184
2459
|
|
|
2185
2460
|
const inlined: string[] = [];
|
|
2186
2461
|
inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
|
|
@@ -2222,6 +2497,13 @@ export async function buildCompleteMilestonePrompt(
|
|
|
2222
2497
|
`### On-demand Slice Summaries\n\nExcerpted above. Read the full file for any slice when the excerpt's section heads don't carry enough narrative for the milestone summary you're drafting:\n\n${pathList}`,
|
|
2223
2498
|
);
|
|
2224
2499
|
}
|
|
2500
|
+
const validationContext = [
|
|
2501
|
+
formatCloseoutReviewInstructions(validationContent, validationRel, [validationRel, roadmapRel, ...summaryRelPaths]),
|
|
2502
|
+
];
|
|
2503
|
+
if (validationContent) {
|
|
2504
|
+
validationContext.push(`### Milestone Validation\nSource: \`${validationRel}\`\n\n${validationContent.trim()}`);
|
|
2505
|
+
}
|
|
2506
|
+
inlined.unshift(...validationContext);
|
|
2225
2507
|
|
|
2226
2508
|
// Inline root GSD files (skip for minimal — completion can read these if needed)
|
|
2227
2509
|
if (inlineLevel !== "minimal") {
|
|
@@ -14,7 +14,7 @@ import { appendEvent } from "./workflow-events.js";
|
|
|
14
14
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
15
15
|
import { clearParseCache } from "./files.js";
|
|
16
16
|
import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
|
|
17
|
-
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus, insertSlice, getMilestone } from "./gsd-db.js";
|
|
17
|
+
import { isDbAvailable, getTask, getSlice, getSliceTasks, getPendingGates, updateTaskStatus, updateSliceStatus, insertSlice, getMilestone, refreshOpenDatabaseFromDisk, getCompletedMilestoneTaskFileHints, getMilestoneCommitAttributionShas, recordMilestoneCommitAttribution } from "./gsd-db.js";
|
|
18
18
|
import { isValidationTerminal } from "./state.js";
|
|
19
19
|
import { getErrorMessage } from "./error-utils.js";
|
|
20
20
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
@@ -147,15 +147,29 @@ export function hasImplementationArtifacts(basePath: string, milestoneId?: strin
|
|
|
147
147
|
// milestone commits instead of treating the self-diff as proof of no work.
|
|
148
148
|
if (changedFiles.length === 0) {
|
|
149
149
|
if (milestoneId && currentBranch === integrationBranch) {
|
|
150
|
-
const
|
|
151
|
-
if (!
|
|
152
|
-
if (
|
|
150
|
+
const milestoneEvidence = getChangedFilesFromMilestoneEvidence(basePath, milestoneId);
|
|
151
|
+
if (!milestoneEvidence.ok) return "unknown";
|
|
152
|
+
if (milestoneEvidence.matched) return classifyImplementationFiles(milestoneEvidence.files);
|
|
153
153
|
}
|
|
154
154
|
if (currentBranch && currentBranch !== "HEAD") return "absent";
|
|
155
155
|
return "unknown";
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
const branchClassification = classifyImplementationFiles(changedFiles);
|
|
159
|
+
if (branchClassification === "present") return "present";
|
|
160
|
+
|
|
161
|
+
// A completing milestone branch can have a non-empty diff containing only
|
|
162
|
+
// .gsd/ closeout files after implementation commits already landed on the
|
|
163
|
+
// recorded integration branch. In that topology, the branch diff alone is
|
|
164
|
+
// insufficient; use the same milestone-tagged evidence fallback as the
|
|
165
|
+
// self-diff retry path before declaring the milestone implementation-free.
|
|
166
|
+
if (milestoneId) {
|
|
167
|
+
const milestoneEvidence = getChangedFilesFromMilestoneEvidence(basePath, milestoneId);
|
|
168
|
+
if (!milestoneEvidence.ok) return "unknown";
|
|
169
|
+
if (milestoneEvidence.matched) return classifyImplementationFiles(milestoneEvidence.files);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return "absent";
|
|
159
173
|
} catch (e) {
|
|
160
174
|
// Non-fatal — if git operations fail, return unknown so callers can decide
|
|
161
175
|
logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
|
|
@@ -185,6 +199,10 @@ function isImplementationPath(file: string): boolean {
|
|
|
185
199
|
return !file.startsWith(".gsd/") && !file.startsWith(".gsd\\");
|
|
186
200
|
}
|
|
187
201
|
|
|
202
|
+
function normalizeRepoPath(file: string): string {
|
|
203
|
+
return file.trim().replace(/\\/g, "/").replace(/^\.\/+/, "");
|
|
204
|
+
}
|
|
205
|
+
|
|
188
206
|
/**
|
|
189
207
|
* Detect the main/master branch name.
|
|
190
208
|
*/
|
|
@@ -263,7 +281,7 @@ function getChangedFilesFromMilestoneTaggedCommits(
|
|
|
263
281
|
"log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
|
|
264
282
|
]);
|
|
265
283
|
if (!scoped.ok) return scoped;
|
|
266
|
-
if (scoped.matched) return scoped;
|
|
284
|
+
if (scoped.matched && classifyImplementationFiles(scoped.files) === "present") return scoped;
|
|
267
285
|
|
|
268
286
|
// Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
|
|
269
287
|
// path-scoped scan matches no commits even though GSD-tagged commits
|
|
@@ -274,9 +292,137 @@ function getChangedFilesFromMilestoneTaggedCommits(
|
|
|
274
292
|
// Intentionally unbounded — symmetric with the primary scan, and avoids
|
|
275
293
|
// reintroducing the rolling-depth failure class removed in #4699 where
|
|
276
294
|
// milestone evidence aged out behind unrelated activity.
|
|
277
|
-
|
|
295
|
+
const unscoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
278
296
|
"log", "--format=%H%x1f%B%x1e", "HEAD",
|
|
279
297
|
]);
|
|
298
|
+
if (!unscoped.ok) return scoped.matched ? scoped : unscoped;
|
|
299
|
+
if (!unscoped.matched) return scoped;
|
|
300
|
+
|
|
301
|
+
return {
|
|
302
|
+
ok: true,
|
|
303
|
+
matched: true,
|
|
304
|
+
files: [...new Set([...scoped.files, ...unscoped.files])],
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function getChangedFilesFromMilestoneEvidence(
|
|
309
|
+
basePath: string,
|
|
310
|
+
milestoneId: string,
|
|
311
|
+
): { ok: boolean; matched: boolean; files: string[] } {
|
|
312
|
+
const tagged = getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId);
|
|
313
|
+
if (!tagged.ok) return tagged;
|
|
314
|
+
if (tagged.matched && classifyImplementationFiles(tagged.files) === "present") return tagged;
|
|
315
|
+
|
|
316
|
+
const attributed = getChangedFilesFromAttributedMilestoneCommits(basePath, milestoneId);
|
|
317
|
+
if (!attributed.ok) return tagged.matched ? tagged : attributed;
|
|
318
|
+
if (attributed.matched && classifyImplementationFiles(attributed.files) === "present") return attributed;
|
|
319
|
+
|
|
320
|
+
const backfilled = backfillChangedFilesFromUntaggedMilestoneCommits(basePath, milestoneId);
|
|
321
|
+
if (!backfilled.ok) return tagged.matched ? tagged : attributed.matched ? attributed : backfilled;
|
|
322
|
+
if (!backfilled.matched) {
|
|
323
|
+
if (tagged.matched) return tagged;
|
|
324
|
+
return attributed.matched ? attributed : backfilled;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
ok: true,
|
|
329
|
+
matched: true,
|
|
330
|
+
files: [...new Set([...tagged.files, ...attributed.files, ...backfilled.files])],
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function getChangedFilesFromAttributedMilestoneCommits(
|
|
335
|
+
basePath: string,
|
|
336
|
+
milestoneId: string,
|
|
337
|
+
): { ok: boolean; matched: boolean; files: string[] } {
|
|
338
|
+
try {
|
|
339
|
+
const shas = getMilestoneCommitAttributionShas(milestoneId);
|
|
340
|
+
if (shas.length === 0) return { ok: true, matched: false, files: [] };
|
|
341
|
+
|
|
342
|
+
const files = new Set<string>();
|
|
343
|
+
let matched = false;
|
|
344
|
+
for (const sha of shas) {
|
|
345
|
+
if (!isFullCommitSha(sha)) continue;
|
|
346
|
+
const commitFiles = getChangedFilesForCommit(basePath, sha);
|
|
347
|
+
if (commitFiles.length === 0) continue;
|
|
348
|
+
matched = true;
|
|
349
|
+
for (const file of commitFiles) files.add(file);
|
|
350
|
+
}
|
|
351
|
+
return { ok: true, matched, files: [...files] };
|
|
352
|
+
} catch (e) {
|
|
353
|
+
logWarning("recovery", `milestone attribution scan failed: ${(e as Error).message}`);
|
|
354
|
+
return { ok: false, matched: false, files: [] };
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function backfillChangedFilesFromUntaggedMilestoneCommits(
|
|
359
|
+
basePath: string,
|
|
360
|
+
milestoneId: string,
|
|
361
|
+
): { ok: boolean; matched: boolean; files: string[] } {
|
|
362
|
+
try {
|
|
363
|
+
const milestone = getMilestone(milestoneId);
|
|
364
|
+
const milestoneStartedAt = milestone?.created_at ? Math.floor(Date.parse(milestone.created_at) / 1000) * 1000 : NaN;
|
|
365
|
+
if (!Number.isFinite(milestoneStartedAt)) return { ok: true, matched: false, files: [] };
|
|
366
|
+
|
|
367
|
+
const taskFileHints = getCompletedMilestoneTaskFileHints(milestoneId);
|
|
368
|
+
if (taskFileHints.length === 0) return { ok: true, matched: false, files: [] };
|
|
369
|
+
|
|
370
|
+
const hintSet = new Set(taskFileHints.map(normalizeRepoPath).filter(Boolean));
|
|
371
|
+
if (hintSet.size === 0) return { ok: true, matched: false, files: [] };
|
|
372
|
+
|
|
373
|
+
const records = getCommitRecords(basePath);
|
|
374
|
+
const files = new Set<string>();
|
|
375
|
+
let matched = false;
|
|
376
|
+
for (const record of records) {
|
|
377
|
+
if (!isFullCommitSha(record.hash)) continue;
|
|
378
|
+
if (Date.parse(record.committedAt) < milestoneStartedAt) continue;
|
|
379
|
+
if (record.parents.trim().split(/\s+/).filter(Boolean).length > 1) continue;
|
|
380
|
+
if (commitMessageHasGsdTrailer(record.message)) continue;
|
|
381
|
+
|
|
382
|
+
const commitFiles = getChangedFilesForCommit(basePath, record.hash);
|
|
383
|
+
const implementationFiles = commitFiles.map(normalizeRepoPath).filter(isImplementationPath);
|
|
384
|
+
if (implementationFiles.length === 0) continue;
|
|
385
|
+
if (!implementationFiles.some((file) => hintSet.has(file))) continue;
|
|
386
|
+
|
|
387
|
+
matched = true;
|
|
388
|
+
for (const file of implementationFiles) files.add(file);
|
|
389
|
+
recordMilestoneCommitAttribution({
|
|
390
|
+
commitSha: record.hash,
|
|
391
|
+
milestoneId,
|
|
392
|
+
source: "backfill",
|
|
393
|
+
confidence: 0.8,
|
|
394
|
+
files: implementationFiles,
|
|
395
|
+
createdAt: new Date().toISOString(),
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return { ok: true, matched, files: [...files] };
|
|
400
|
+
} catch (e) {
|
|
401
|
+
logWarning("recovery", `milestone attribution backfill failed: ${(e as Error).message}`);
|
|
402
|
+
return { ok: false, matched: false, files: [] };
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function getCommitRecords(basePath: string): Array<{ hash: string; parents: string; committedAt: string; message: string }> {
|
|
407
|
+
const logOutput = execFileSync("git", ["log", "--format=%H%x1f%P%x1f%cI%x1f%B%x1e", "HEAD"], {
|
|
408
|
+
cwd: basePath,
|
|
409
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
410
|
+
encoding: "utf-8",
|
|
411
|
+
});
|
|
412
|
+
return logOutput
|
|
413
|
+
.split("\x1e")
|
|
414
|
+
.map((record) => record.trim())
|
|
415
|
+
.filter(Boolean)
|
|
416
|
+
.flatMap((record) => {
|
|
417
|
+
const parts = record.split("\x1f");
|
|
418
|
+
if (parts.length < 4) return [];
|
|
419
|
+
const [hash, parents, committedAt, ...messageParts] = parts;
|
|
420
|
+
return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message: messageParts.join("\x1f") }];
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
function isFullCommitSha(value: string): boolean {
|
|
425
|
+
return /^[0-9a-f]{40}$/i.test(value);
|
|
280
426
|
}
|
|
281
427
|
|
|
282
428
|
function scanGsdTaggedCommits(
|
|
@@ -588,65 +734,32 @@ export function verifyExpectedArtifact(
|
|
|
588
734
|
}
|
|
589
735
|
}
|
|
590
736
|
|
|
591
|
-
// plan-slice
|
|
592
|
-
//
|
|
593
|
-
//
|
|
594
|
-
// unit gets skipped — but deriveState still returns phase:"planning" because the
|
|
595
|
-
// plan has no tasks, creating an infinite skip loop (#699).
|
|
596
|
-
if (unitType === "plan-slice") {
|
|
597
|
-
const planContent = readFileSync(absPath, "utf-8");
|
|
598
|
-
// Accept checkbox-style (- [x] **T01: ...) or heading-style (### T01 -- / ### T01: / ### T01 —)
|
|
599
|
-
const hasCheckboxTask = /^- \[[xX ]\] \*\*T\d+:/m.test(planContent);
|
|
600
|
-
const hasHeadingTask = /^#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
601
|
-
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
602
|
-
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
603
|
-
return false;
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
// execute-task: DB status is authoritative. Fall back to checked-checkbox
|
|
608
|
-
// detection when the DB is unavailable (unmigrated projects), or when the
|
|
609
|
-
// disk artifacts already reflect completion but the DB replay is one beat
|
|
610
|
-
// behind the completion write.
|
|
611
|
-
if (unitType === "execute-task") {
|
|
612
|
-
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
613
|
-
if (mid && sid && tid) {
|
|
614
|
-
const dbTask = getTask(mid, sid, tid);
|
|
615
|
-
if (dbTask) {
|
|
616
|
-
if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
|
|
617
|
-
return false;
|
|
618
|
-
}
|
|
619
|
-
} else if (!isDbAvailable()) {
|
|
620
|
-
// LEGACY: Pre-migration fallback for projects without DB.
|
|
621
|
-
// Require a CHECKED checkbox — a bare heading or unchecked checkbox
|
|
622
|
-
// does not prove gsd_complete_task ran. Summary file on disk alone
|
|
623
|
-
// is not sufficient evidence (could be a rogue write) (#3607).
|
|
624
|
-
if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) return false;
|
|
625
|
-
} else {
|
|
626
|
-
// DB available but task row not found — completion tool never ran (#3607)
|
|
627
|
-
return false;
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// plan-slice must also produce individual task plan files for every task listed
|
|
633
|
-
// in the slice plan. Without this check, a plan-slice that wrote S{sid}-PLAN.md
|
|
634
|
-
// but omitted T{tid}-PLAN.md files would be marked complete, causing execute-task
|
|
635
|
-
// to dispatch with a missing task plan (see issue #739).
|
|
737
|
+
// plan-slice verification is DB-primary. The slice plan is a projection, so
|
|
738
|
+
// DB task rows prove the slice was planned even if the rendered markdown no
|
|
739
|
+
// longer uses legacy checkbox/heading syntax.
|
|
636
740
|
if (unitType === "plan-slice") {
|
|
637
741
|
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
638
742
|
if (mid && sid) {
|
|
639
743
|
try {
|
|
640
|
-
// DB primary path — get task IDs to verify task plan files exist
|
|
641
744
|
let taskIds: string[] | null = null;
|
|
642
745
|
if (isDbAvailable()) {
|
|
643
|
-
const
|
|
644
|
-
if (
|
|
746
|
+
const refreshed = refreshOpenDatabaseFromDisk();
|
|
747
|
+
if (refreshed) {
|
|
748
|
+
const tasks = getSliceTasks(mid, sid);
|
|
749
|
+
if (tasks.length > 0) taskIds = tasks.map(t => t.id);
|
|
750
|
+
}
|
|
645
751
|
}
|
|
646
752
|
|
|
647
753
|
if (!taskIds) {
|
|
648
|
-
// LEGACY: DB unavailable or no tasks in DB
|
|
754
|
+
// LEGACY: DB unavailable or no tasks in DB. Require actual task
|
|
755
|
+
// entries so an empty scaffold cannot advance the pipeline (#699).
|
|
649
756
|
const planContent = readFileSync(absPath, "utf-8");
|
|
757
|
+
const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+:/m.test(planContent);
|
|
758
|
+
const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
759
|
+
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
760
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
761
|
+
return false;
|
|
762
|
+
}
|
|
650
763
|
const plan = parseLegacyPlan(planContent);
|
|
651
764
|
if (plan.tasks.length > 0) taskIds = plan.tasks.map((t: { id: string }) => t.id);
|
|
652
765
|
}
|
|
@@ -672,6 +785,31 @@ export function verifyExpectedArtifact(
|
|
|
672
785
|
}
|
|
673
786
|
}
|
|
674
787
|
|
|
788
|
+
// execute-task: DB status is authoritative. Fall back to checked-checkbox
|
|
789
|
+
// detection when the DB is unavailable (unmigrated projects), or when the
|
|
790
|
+
// disk artifacts already reflect completion but the DB replay is one beat
|
|
791
|
+
// behind the completion write.
|
|
792
|
+
if (unitType === "execute-task") {
|
|
793
|
+
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
794
|
+
if (mid && sid && tid) {
|
|
795
|
+
const dbTask = getTask(mid, sid, tid);
|
|
796
|
+
if (dbTask) {
|
|
797
|
+
if (dbTask.status !== "complete" && dbTask.status !== "done" && !hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) {
|
|
798
|
+
return false;
|
|
799
|
+
}
|
|
800
|
+
} else if (!isDbAvailable()) {
|
|
801
|
+
// LEGACY: Pre-migration fallback for projects without DB.
|
|
802
|
+
// Require a CHECKED checkbox — a bare heading or unchecked checkbox
|
|
803
|
+
// does not prove gsd_complete_task ran. Summary file on disk alone
|
|
804
|
+
// is not sufficient evidence (could be a rogue write) (#3607).
|
|
805
|
+
if (!hasCheckedTaskCompletionOnDisk(base, mid, sid, tid)) return false;
|
|
806
|
+
} else {
|
|
807
|
+
// DB available but task row not found — completion tool never ran (#3607)
|
|
808
|
+
return false;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
675
813
|
// complete-slice: DB status is authoritative for whether the slice is done.
|
|
676
814
|
// Fall back to file-based check (roadmap [x]) when DB is unavailable.
|
|
677
815
|
if (unitType === "complete-slice") {
|