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.
Files changed (742) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/GSD-WORKFLOW.md +2 -2
  3. package/dist/resources/extensions/github-sync/templates.js +90 -74
  4. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  6. package/dist/resources/extensions/gsd/auto/loop.js +394 -520
  7. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  8. package/dist/resources/extensions/gsd/auto/phases.js +92 -36
  9. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
  10. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  30. package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
  31. package/dist/resources/extensions/gsd/auto-dispatch.js +10 -0
  32. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -10
  33. package/dist/resources/extensions/gsd/auto-prompts.js +279 -4
  34. package/dist/resources/extensions/gsd/auto-recovery.js +198 -59
  35. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  36. package/dist/resources/extensions/gsd/auto-start.js +2 -3
  37. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  38. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  39. package/dist/resources/extensions/gsd/auto.js +168 -3
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -6
  43. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  44. package/dist/resources/extensions/gsd/clean-root-preflight.js +42 -4
  45. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  46. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  47. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  48. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  49. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  50. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
  52. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  53. package/dist/resources/extensions/gsd/db-base-schema.js +351 -0
  54. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  55. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  56. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  57. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  58. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  59. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +410 -0
  62. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  63. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  64. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  65. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  66. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  67. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  68. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  69. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  70. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  71. package/dist/resources/extensions/gsd/detection.js +106 -0
  72. package/dist/resources/extensions/gsd/escalation.js +2 -0
  73. package/dist/resources/extensions/gsd/graph.js +9 -3
  74. package/dist/resources/extensions/gsd/gsd-db.js +316 -1520
  75. package/dist/resources/extensions/gsd/guided-flow.js +63 -12
  76. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  77. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  78. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  79. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  80. package/dist/resources/extensions/gsd/model-router.js +9 -6
  81. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  82. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  83. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  84. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  85. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  86. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  87. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  88. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -31
  89. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  90. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  91. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  92. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  93. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  94. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  95. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  96. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  97. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  98. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  99. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  100. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  101. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  102. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  103. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  104. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  105. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  106. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  107. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  108. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  109. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  110. package/dist/resources/extensions/gsd/state.js +4 -0
  111. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  112. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  113. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  114. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  115. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
  116. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  117. package/dist/resources/extensions/gsd/unit-runtime.js +11 -0
  118. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  119. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  120. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  121. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  122. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  123. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  124. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  125. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  126. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  127. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  128. package/dist/web/standalone/.next/BUILD_ID +1 -1
  129. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  130. package/dist/web/standalone/.next/build-manifest.json +3 -3
  131. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  132. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  133. package/dist/web/standalone/.next/required-server-files.json +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/index.html +1 -1
  215. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  222. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  223. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  224. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  227. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  228. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  229. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  231. package/dist/web/standalone/package.json +1 -0
  232. package/dist/web/standalone/server.js +1 -1
  233. package/package.json +18 -7
  234. package/packages/contracts/dist/index.d.ts +3 -0
  235. package/packages/contracts/dist/index.d.ts.map +1 -0
  236. package/packages/contracts/dist/index.js +5 -0
  237. package/packages/contracts/dist/index.js.map +1 -0
  238. package/packages/contracts/dist/rpc.d.ts +549 -0
  239. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  240. package/packages/contracts/dist/rpc.js +53 -0
  241. package/packages/contracts/dist/rpc.js.map +1 -0
  242. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  243. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  244. package/packages/contracts/dist/rpc.test.js +47 -0
  245. package/packages/contracts/dist/rpc.test.js.map +1 -0
  246. package/packages/contracts/dist/workflow.d.ts +180 -0
  247. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  248. package/packages/contracts/dist/workflow.js +201 -0
  249. package/packages/contracts/dist/workflow.js.map +1 -0
  250. package/packages/contracts/package.json +39 -0
  251. package/packages/contracts/src/index.ts +5 -0
  252. package/packages/contracts/src/rpc.test.ts +72 -0
  253. package/packages/contracts/src/rpc.ts +286 -0
  254. package/packages/contracts/src/workflow.ts +213 -0
  255. package/packages/contracts/tsconfig.json +25 -0
  256. package/packages/daemon/package.json +3 -2
  257. package/packages/daemon/src/event-bridge.test.ts +2 -1
  258. package/packages/daemon/src/event-bridge.ts +1 -1
  259. package/packages/daemon/src/event-formatter.test.ts +1 -2
  260. package/packages/daemon/src/event-formatter.ts +1 -2
  261. package/packages/daemon/src/session-manager.ts +2 -2
  262. package/packages/daemon/src/types.ts +3 -18
  263. package/packages/mcp-server/dist/server.d.ts +13 -0
  264. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  265. package/packages/mcp-server/dist/server.js +77 -0
  266. package/packages/mcp-server/dist/server.js.map +1 -1
  267. package/packages/mcp-server/dist/session-manager.js +1 -1
  268. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  269. package/packages/mcp-server/dist/types.d.ts +3 -11
  270. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  271. package/packages/mcp-server/dist/types.js.map +1 -1
  272. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  273. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  274. package/packages/mcp-server/dist/workflow-tools.js +2 -40
  275. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  276. package/packages/mcp-server/package.json +3 -2
  277. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  278. package/packages/mcp-server/src/server.ts +99 -1
  279. package/packages/mcp-server/src/session-manager.ts +2 -2
  280. package/packages/mcp-server/src/types.ts +7 -18
  281. package/packages/mcp-server/src/workflow-tools.ts +2 -40
  282. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  283. package/packages/native/package.json +1 -1
  284. package/packages/pi-agent-core/package.json +1 -1
  285. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  286. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  287. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  288. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  289. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/models/index.js +8 -0
  291. package/packages/pi-ai/dist/models/index.js.map +1 -1
  292. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  293. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  294. package/packages/pi-ai/dist/providers/fake.js +319 -0
  295. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  296. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  297. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  298. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  299. package/packages/pi-ai/package.json +1 -1
  300. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  301. package/packages/pi-ai/src/models/index.ts +9 -0
  302. package/packages/pi-ai/src/providers/fake.ts +376 -0
  303. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  304. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  305. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +74 -0
  306. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  308. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  310. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  312. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  314. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  315. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/extensions/runner.js +14 -1
  318. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +97 -0
  320. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  323. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  325. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  330. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +67 -14
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +27 -6
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +16 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +112 -18
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +60 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  364. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  366. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
  371. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  374. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  376. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  382. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  389. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  390. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  391. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  393. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  398. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  399. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  401. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  402. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  403. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
  405. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  407. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  408. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  409. package/packages/pi-coding-agent/package.json +2 -1
  410. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +87 -0
  411. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  412. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  413. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +108 -0
  414. package/packages/pi-coding-agent/src/core/extensions/runner.ts +16 -1
  415. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  416. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  417. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  418. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  419. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +100 -16
  420. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  421. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  422. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  423. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
  424. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  425. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -9
  426. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +124 -18
  427. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  428. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -1
  429. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  430. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  431. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
  432. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  433. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  434. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  435. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  436. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  437. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
  438. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  439. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  440. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
  441. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  442. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  443. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  444. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  445. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  446. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  447. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  448. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  449. package/packages/pi-tui/dist/index.d.ts +1 -0
  450. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  451. package/packages/pi-tui/dist/index.js +2 -0
  452. package/packages/pi-tui/dist/index.js.map +1 -1
  453. package/packages/pi-tui/dist/style.d.ts +41 -0
  454. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  455. package/packages/pi-tui/dist/style.js +158 -0
  456. package/packages/pi-tui/dist/style.js.map +1 -0
  457. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  458. package/packages/pi-tui/dist/tui.js +1 -0
  459. package/packages/pi-tui/dist/tui.js.map +1 -1
  460. package/packages/pi-tui/package.json +1 -1
  461. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  462. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  463. package/packages/pi-tui/src/index.ts +9 -0
  464. package/packages/pi-tui/src/style.ts +225 -0
  465. package/packages/pi-tui/src/tui.ts +1 -0
  466. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  467. package/packages/rpc-client/README.md +3 -3
  468. package/packages/rpc-client/dist/index.d.ts +1 -1
  469. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  470. package/packages/rpc-client/dist/index.js.map +1 -1
  471. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  472. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  473. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  474. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  475. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  476. package/packages/rpc-client/dist/rpc-types.js +3 -11
  477. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  478. package/packages/rpc-client/package.json +4 -1
  479. package/packages/rpc-client/src/index.ts +1 -1
  480. package/packages/rpc-client/src/rpc-client.ts +3 -6
  481. package/packages/rpc-client/src/rpc-types.ts +3 -398
  482. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  483. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  484. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  485. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  486. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  487. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  488. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  489. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  490. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  491. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  492. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  493. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  494. package/pkg/package.json +1 -1
  495. package/src/resources/GSD-WORKFLOW.md +2 -2
  496. package/src/resources/extensions/github-sync/templates.ts +93 -88
  497. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  498. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  499. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  500. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  501. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -3
  502. package/src/resources/extensions/gsd/auto/loop.ts +461 -599
  503. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  504. package/src/resources/extensions/gsd/auto/phases.ts +124 -36
  505. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  506. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  507. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  508. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  509. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  510. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  511. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  512. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  513. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  514. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  515. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  516. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  517. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  518. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  519. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  520. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  521. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  522. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  523. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  524. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  525. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  526. package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
  527. package/src/resources/extensions/gsd/auto-dispatch.ts +17 -0
  528. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -10
  529. package/src/resources/extensions/gsd/auto-prompts.ts +286 -4
  530. package/src/resources/extensions/gsd/auto-recovery.ts +194 -56
  531. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  532. package/src/resources/extensions/gsd/auto-start.ts +7 -6
  533. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  534. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  535. package/src/resources/extensions/gsd/auto.ts +179 -2
  536. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
  537. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  538. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +30 -6
  539. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  540. package/src/resources/extensions/gsd/clean-root-preflight.ts +41 -3
  541. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  542. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  543. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  544. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  545. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  546. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  547. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  548. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  549. package/src/resources/extensions/gsd/db-base-schema.ts +383 -0
  550. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  551. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  552. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  553. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  554. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  555. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  556. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  557. package/src/resources/extensions/gsd/db-migration-steps.ts +451 -0
  558. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  559. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  560. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  561. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  562. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  563. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  564. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  565. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  566. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  567. package/src/resources/extensions/gsd/detection.ts +128 -0
  568. package/src/resources/extensions/gsd/escalation.ts +3 -1
  569. package/src/resources/extensions/gsd/graph.ts +12 -5
  570. package/src/resources/extensions/gsd/gsd-db.ts +379 -1660
  571. package/src/resources/extensions/gsd/guided-flow.ts +66 -12
  572. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  573. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  574. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  575. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  576. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  577. package/src/resources/extensions/gsd/model-router.ts +10 -6
  578. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  579. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  580. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  581. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  582. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  583. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  584. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  585. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -31
  586. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  587. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  588. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  589. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  590. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  591. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  592. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  593. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  594. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  595. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  596. package/src/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  597. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  598. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  599. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  600. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  601. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  602. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  603. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  604. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  605. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  606. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  607. package/src/resources/extensions/gsd/state.ts +6 -3
  608. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
  609. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
  610. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +118 -1
  611. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  612. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  613. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +170 -1
  614. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  615. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  616. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +88 -2
  617. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  618. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  619. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  620. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  621. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  622. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  623. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +55 -0
  624. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  625. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
  626. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  627. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  628. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  629. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  630. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  631. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  632. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  633. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  634. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  635. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  636. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  637. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  638. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  639. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  640. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  641. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  642. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  643. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  644. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  645. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  646. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  647. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  648. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  649. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  650. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  651. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  652. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  653. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  654. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  655. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  656. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  657. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +139 -0
  658. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  659. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  660. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  661. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  662. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  663. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  664. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  665. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  666. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  667. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  668. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  669. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  670. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  671. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  672. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  673. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  674. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  675. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  676. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  677. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +77 -0
  678. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  679. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  680. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  681. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  682. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  683. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  684. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  685. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  686. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  687. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  688. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -0
  689. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +46 -2
  690. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  691. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
  692. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +7 -0
  693. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  694. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  695. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  696. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  697. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  698. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  699. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  700. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  701. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  702. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  703. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  704. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  705. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  706. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  707. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  708. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  709. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  710. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  711. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  712. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  713. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
  714. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  715. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  716. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  717. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  718. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +37 -6
  719. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  720. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  721. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  722. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  723. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  724. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  725. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  726. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  727. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
  728. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  729. package/src/resources/extensions/gsd/unit-runtime.ts +14 -0
  730. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  731. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  732. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  733. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  734. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  735. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  736. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  737. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  738. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  739. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  740. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  741. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → YRK7-Es93MwpIn3VL35K0}/_buildManifest.js +0 -0
  742. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → YRK7-Es93MwpIn3VL35K0}/_ssgManifest.js +0 -0
@@ -16,7 +16,7 @@ import { invalidateAllCaches } from "./cache.js";
16
16
  import { startAutoDetached } from "./auto.js";
17
17
  import { clearLock } from "./crash-recovery.js";
18
18
  import { assessInterruptedSession, formatInterruptedSessionRunningMessage, formatInterruptedSessionSummary, } from "./interrupted-session.js";
19
- import { listUnitRuntimeRecords, clearUnitRuntimeRecord } from "./unit-runtime.js";
19
+ import { listUnitRuntimeRecords, clearUnitRuntimeRecord, isInFlightRuntimePhase } from "./unit-runtime.js";
20
20
  import { resolveExpectedArtifactPath } from "./auto.js";
21
21
  import { gsdHome } from "./gsd-home.js";
22
22
  import { gsdRoot, milestonesDir, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile, relMilestoneFile, relSliceFile, clearPathCache, } from "./paths.js";
@@ -71,6 +71,19 @@ export function verifyExpectedArtifactForScope(scope, unitType, unitId) {
71
71
  export function resolveExpectedArtifactPathForScope(scope, unitType, unitId) {
72
72
  return resolveExpectedArtifactPath(unitType, unitId, scope.workspace.projectRoot);
73
73
  }
74
+ async function runQuickTaskChoice(ctx, pi) {
75
+ if (!ctx.hasUI) {
76
+ ctx.ui.notify("Run /gsd quick <task> for small bounded work, or /gsd do <task> for natural-language routing.", "info");
77
+ return;
78
+ }
79
+ const task = (await ctx.ui.input("Quick task", "Describe the small task to run with /gsd quick"))?.trim();
80
+ if (!task) {
81
+ ctx.ui.notify("Quick task cancelled.", "info");
82
+ return;
83
+ }
84
+ const { handleQuick } = await import("./quick.js");
85
+ await handleQuick(task, ctx, pi);
86
+ }
74
87
  /**
75
88
  * Scope-based overload of isGhostMilestone.
76
89
  * Binds basePath and milestoneId from the scope, ensuring path resolution
@@ -1469,8 +1482,8 @@ function selfHealRuntimeRecords(basePath, ctx) {
1469
1482
  cleared++;
1470
1483
  continue;
1471
1484
  }
1472
- // Clear records stuck in dispatched or timeout phase (process died mid-unit)
1473
- if (phase === "dispatched" || phase === "timeout") {
1485
+ // Clear records stuck in an in-flight phase (process died mid-unit).
1486
+ if (isInFlightRuntimePhase(phase)) {
1474
1487
  clearUnitRuntimeRecord(basePath, unitType, unitId);
1475
1488
  cleared++;
1476
1489
  }
@@ -1695,6 +1708,20 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1695
1708
  return;
1696
1709
  }
1697
1710
  }
1711
+ if (interrupted.classification !== "recoverable") {
1712
+ try {
1713
+ const { autoImportMarkdownHierarchyIfDbMismatch } = await import("./migration-auto-check.js");
1714
+ const result = await autoImportMarkdownHierarchyIfDbMismatch(basePath);
1715
+ if (result.action === "imported") {
1716
+ ctx.ui.notify(`Recovered migrated planning state into gsd.db (${result.reason}): ${result.afterDb.milestones} milestone(s), ${result.afterDb.slices} slice(s), ${result.afterDb.tasks} task(s).`, "info");
1717
+ }
1718
+ }
1719
+ catch (err) {
1720
+ const message = err instanceof Error ? err.message : String(err);
1721
+ ctx.ui.notify(`GSD could not auto-import existing planning state into gsd.db: ${message}`, "warning");
1722
+ logWarning("guided", `planning state auto-import failed: ${message}`, { file: "guided-flow.ts" });
1723
+ }
1724
+ }
1698
1725
  // Always derive from the project root — the assessment may have derived
1699
1726
  // state from a worktree path that was cleaned up in the stale branch above.
1700
1727
  const state = await deriveState(basePath);
@@ -1716,8 +1743,8 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1716
1743
  // standard wizard below.
1717
1744
  {
1718
1745
  const prefs = loadEffectiveGSDPreferences(basePath)?.preferences;
1719
- const { hasPendingDeepStage } = await import("./auto-dispatch.js");
1720
- if (hasPendingDeepStage(prefs, basePath)) {
1746
+ const { shouldRunDeepProjectSetup } = await import("./auto-dispatch.js");
1747
+ if (shouldRunDeepProjectSetup(state, prefs, basePath)) {
1721
1748
  await startDeepProjectSetupForeground(ctx, pi, basePath, stepMode);
1722
1749
  return;
1723
1750
  }
@@ -1780,16 +1807,24 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1780
1807
  title: "GSD — Get Shit Done",
1781
1808
  summary: ["No active milestone."],
1782
1809
  actions: [
1810
+ {
1811
+ id: "quick_task",
1812
+ label: "Quick task",
1813
+ description: "For small bounded work, run /gsd quick <task> or /gsd do <task>.",
1814
+ recommended: true,
1815
+ },
1783
1816
  {
1784
1817
  id: "new_milestone",
1785
1818
  label: "Create next milestone",
1786
- description: "Define what to build next.",
1787
- recommended: true,
1819
+ description: "Define a larger body of work with planning artifacts.",
1788
1820
  },
1789
1821
  ],
1790
1822
  notYetMessage: "Run /gsd when ready.",
1791
1823
  });
1792
- if (choice === "new_milestone") {
1824
+ if (choice === "quick_task") {
1825
+ await runQuickTaskChoice(ctx, pi);
1826
+ }
1827
+ else if (choice === "new_milestone") {
1793
1828
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1794
1829
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1795
1830
  }
@@ -1809,11 +1844,16 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1809
1844
  title: `GSD — ${milestoneId}: ${milestoneTitle}`,
1810
1845
  summary: ["All milestones complete."],
1811
1846
  actions: [
1847
+ {
1848
+ id: "quick_task",
1849
+ label: "Quick task",
1850
+ description: "Do a small bounded task without opening a milestone.",
1851
+ recommended: true,
1852
+ },
1812
1853
  {
1813
1854
  id: "new_milestone",
1814
1855
  label: "Start new milestone",
1815
1856
  description: "Define and plan the next milestone.",
1816
- recommended: true,
1817
1857
  },
1818
1858
  {
1819
1859
  id: "status",
@@ -1823,7 +1863,10 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1823
1863
  ],
1824
1864
  notYetMessage: "Run /gsd when ready.",
1825
1865
  });
1826
- if (choice === "new_milestone") {
1866
+ if (choice === "quick_task") {
1867
+ await runQuickTaskChoice(ctx, pi);
1868
+ }
1869
+ else if (choice === "new_milestone") {
1827
1870
  const milestoneIds = findMilestoneIds(basePath);
1828
1871
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1829
1872
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
@@ -1916,13 +1959,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1916
1959
  const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
1917
1960
  const hasContext = !!(contextFile && await loadFile(contextFile));
1918
1961
  const actions = [
1962
+ {
1963
+ id: "quick_task",
1964
+ label: "Quick task instead",
1965
+ description: "Use this when the work is small and should not become a milestone.",
1966
+ recommended: true,
1967
+ },
1919
1968
  {
1920
1969
  id: "plan",
1921
1970
  label: "Create roadmap",
1922
1971
  description: hasContext
1923
1972
  ? "Context captured. Decompose into slices with a boundary map."
1924
1973
  : "Decompose the milestone into slices with a boundary map.",
1925
- recommended: true,
1926
1974
  },
1927
1975
  ...(!hasContext ? [{
1928
1976
  id: "discuss",
@@ -1946,7 +1994,10 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1946
1994
  actions,
1947
1995
  notYetMessage: "Run /gsd when ready.",
1948
1996
  });
1949
- if (choice === "plan") {
1997
+ if (choice === "quick_task") {
1998
+ await runQuickTaskChoice(ctx, pi);
1999
+ }
2000
+ else if (choice === "plan") {
1950
2001
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1951
2002
  await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone");
1952
2003
  }
@@ -0,0 +1,70 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Runtime counters for telemetry-gated legacy compatibility paths.
3
+ import { mkdirSync, writeFileSync } from "node:fs";
4
+ import { dirname } from "node:path";
5
+ import { logWarning } from "./workflow-logger.js";
6
+ const COUNTERS = [
7
+ "legacy.markdownFallbackUsed",
8
+ "legacy.workflowEngineUsed",
9
+ "legacy.uokFallbackUsed",
10
+ "legacy.mcpAliasUsed",
11
+ "legacy.componentFormatUsed",
12
+ "legacy.providerDefaultUsed",
13
+ ];
14
+ const values = Object.fromEntries(COUNTERS.map((counter) => [counter, 0]));
15
+ const warnedCounters = new Set();
16
+ const DIAGNOSTICS = {
17
+ "legacy.markdownFallbackUsed": "Deprecated markdown state fallback used; migrate projects to DB-authoritative state before removing markdown derivation.",
18
+ "legacy.workflowEngineUsed": "Deprecated workflow engine path used; prefer auto-milestone workflow templates before removing legacy engines.",
19
+ "legacy.uokFallbackUsed": "Deprecated UOK fallback path used; resolve UOK kernel blockers before removing parity fallback wrappers.",
20
+ "legacy.mcpAliasUsed": "Deprecated MCP alias tool used; update callers to the canonical gsd_* tool name before alias removal.",
21
+ "legacy.componentFormatUsed": "Deprecated component format loaded; migrate skills/agents to component.yaml before removing legacy loaders.",
22
+ "legacy.providerDefaultUsed": "Provider-specific default fallback used without an explicit available model; configure provider-aware model preferences before removing defaults.",
23
+ };
24
+ process.once("beforeExit", persistLegacyTelemetry);
25
+ export function incrementLegacyTelemetry(counter, amount = 1) {
26
+ if (!Number.isFinite(amount) || amount <= 0)
27
+ return;
28
+ values[counter] += amount;
29
+ emitLegacyDiagnostic(counter);
30
+ persistLegacyTelemetry();
31
+ }
32
+ export function getLegacyTelemetry() {
33
+ return { ...values };
34
+ }
35
+ export function resetLegacyTelemetry() {
36
+ for (const counter of COUNTERS) {
37
+ values[counter] = 0;
38
+ }
39
+ warnedCounters.clear();
40
+ }
41
+ export function listLegacyTelemetryCounters() {
42
+ return [...COUNTERS];
43
+ }
44
+ export function getLegacyTelemetryReport() {
45
+ return {
46
+ ts: new Date().toISOString(),
47
+ counters: getLegacyTelemetry(),
48
+ };
49
+ }
50
+ export function persistLegacyTelemetrySnapshot() {
51
+ persistLegacyTelemetry();
52
+ }
53
+ function emitLegacyDiagnostic(counter) {
54
+ if (warnedCounters.has(counter))
55
+ return;
56
+ warnedCounters.add(counter);
57
+ logWarning("migration", DIAGNOSTICS[counter], { counter });
58
+ }
59
+ function persistLegacyTelemetry() {
60
+ const outputPath = process.env.GSD_LEGACY_TELEMETRY_FILE?.trim();
61
+ if (!outputPath)
62
+ return;
63
+ try {
64
+ mkdirSync(dirname(outputPath), { recursive: true });
65
+ writeFileSync(outputPath, `${JSON.stringify(getLegacyTelemetryReport(), null, 2)}\n`, "utf-8");
66
+ }
67
+ catch {
68
+ // Legacy cleanup telemetry must never block runtime paths.
69
+ }
70
+ }
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Markdown projection renderer for GSD workflow database rows.
1
3
  // GSD Markdown Renderer — DB → Markdown file generation
2
4
  //
3
5
  // Transforms DB state into correct markdown files on disk.
@@ -15,6 +15,43 @@ import { fileURLToPath } from "node:url";
15
15
  import { showNextAction } from "../../shared/tui.js";
16
16
  import { validatePlanningDirectory, parsePlanningDirectory, transformToGSD, generatePreview, writeGSDDirectory, } from "./index.js";
17
17
  import { homedir } from "node:os";
18
+ import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
19
+ import { clearEngineHierarchy, transaction } from "../gsd-db.js";
20
+ import { migrateFromMarkdown } from "../md-importer.js";
21
+ import { invalidateStateCache } from "../state.js";
22
+ function assertMigrationImportMatchesPreview(imported, preview) {
23
+ const mismatches = [];
24
+ if (imported.hierarchy.milestones !== preview.milestoneCount) {
25
+ mismatches.push(`milestones ${imported.hierarchy.milestones}/${preview.milestoneCount}`);
26
+ }
27
+ if (imported.hierarchy.slices !== preview.totalSlices) {
28
+ mismatches.push(`slices ${imported.hierarchy.slices}/${preview.totalSlices}`);
29
+ }
30
+ if (imported.hierarchy.tasks !== preview.totalTasks) {
31
+ mismatches.push(`tasks ${imported.hierarchy.tasks}/${preview.totalTasks}`);
32
+ }
33
+ if (imported.requirements !== preview.requirements.total) {
34
+ mismatches.push(`requirements ${imported.requirements}/${preview.requirements.total}`);
35
+ }
36
+ if (mismatches.length > 0) {
37
+ throw new Error(`migration DB import verification failed: ${mismatches.join(", ")}`);
38
+ }
39
+ }
40
+ export async function importWrittenMigrationToDb(basePath, preview) {
41
+ const opened = await ensureDbOpen(basePath);
42
+ if (!opened) {
43
+ throw new Error(`failed to open or create the GSD database at ${basePath}`);
44
+ }
45
+ const counts = transaction(() => {
46
+ clearEngineHierarchy();
47
+ const imported = migrateFromMarkdown(basePath);
48
+ if (preview)
49
+ assertMigrationImportMatchesPreview(imported, preview);
50
+ return imported;
51
+ });
52
+ invalidateStateCache();
53
+ return counts;
54
+ }
18
55
  /** Format preview stats for embedding in the review prompt. */
19
56
  function formatPreviewStats(preview) {
20
57
  const lines = [
@@ -126,12 +163,14 @@ export async function handleMigrate(args, ctx, pi) {
126
163
  ctx.ui.notify("Writing .gsd directory…", "info");
127
164
  const result = await writeGSDDirectory(project, process.cwd());
128
165
  const gsdPath = gsdRoot(process.cwd());
129
- ctx.ui.notify(`✓ Migration complete ${result.paths.length} file(s) written to .gsd/`, "info");
166
+ const imported = await importWrittenMigrationToDb(process.cwd(), preview);
167
+ ctx.ui.notify(`✓ Migration complete — ${result.paths.length} file(s) written to .gsd/ and ${imported.hierarchy.milestones}M/${imported.hierarchy.slices}S/${imported.hierarchy.tasks}T imported to the database`, "info");
130
168
  // ── Post-write review offer ────────────────────────────────────────────────
131
169
  const reviewChoice = await showNextAction(ctx, {
132
170
  title: "Migration written",
133
171
  summary: [
134
172
  `${result.paths.length} files written to .gsd/`,
173
+ `${imported.hierarchy.milestones} milestone(s), ${imported.hierarchy.slices} slice(s), and ${imported.hierarchy.tasks} task(s) imported to gsd.db`,
135
174
  "",
136
175
  "The agent can now review the migrated output against GSD-2 standards —",
137
176
  "checking structure, content quality, deriveState() round-trip, and",
@@ -0,0 +1,87 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
3
+ import { clearEngineHierarchy, getAllMilestones, getMilestoneSlices, getSliceTasks, isDbAvailable, transaction, } from "./gsd-db.js";
4
+ import { migrateHierarchyToDb } from "./md-importer.js";
5
+ import { parsePlan, parseRoadmap } from "./parsers-legacy.js";
6
+ import { milestonesDir, resolveMilestoneFile, resolveSliceFile, } from "./paths.js";
7
+ import { invalidateStateCache } from "./state.js";
8
+ function zeroCounts() {
9
+ return { milestones: 0, slices: 0, tasks: 0 };
10
+ }
11
+ function sameCounts(a, b) {
12
+ return a.milestones === b.milestones && a.slices === b.slices && a.tasks === b.tasks;
13
+ }
14
+ export function countMarkdownHierarchy(basePath) {
15
+ const root = milestonesDir(basePath);
16
+ if (!existsSync(root))
17
+ return zeroCounts();
18
+ const counts = zeroCounts();
19
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
20
+ if (!entry.isDirectory() || !/^M\d+/.test(entry.name))
21
+ continue;
22
+ counts.milestones++;
23
+ const roadmapPath = resolveMilestoneFile(basePath, entry.name, "ROADMAP");
24
+ if (!roadmapPath || !existsSync(roadmapPath))
25
+ continue;
26
+ const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
27
+ counts.slices += roadmap.slices.length;
28
+ for (const slice of roadmap.slices) {
29
+ const planPath = resolveSliceFile(basePath, entry.name, slice.id, "PLAN");
30
+ if (!planPath || !existsSync(planPath))
31
+ continue;
32
+ const plan = parsePlan(readFileSync(planPath, "utf-8"));
33
+ counts.tasks += plan.tasks.length;
34
+ }
35
+ }
36
+ return counts;
37
+ }
38
+ export function countDbHierarchy() {
39
+ if (!isDbAvailable())
40
+ return zeroCounts();
41
+ const counts = zeroCounts();
42
+ const milestones = getAllMilestones();
43
+ counts.milestones = milestones.length;
44
+ for (const milestone of milestones) {
45
+ const slices = getMilestoneSlices(milestone.id);
46
+ counts.slices += slices.length;
47
+ for (const slice of slices) {
48
+ counts.tasks += getSliceTasks(milestone.id, slice.id).length;
49
+ }
50
+ }
51
+ return counts;
52
+ }
53
+ export async function autoImportMarkdownHierarchyIfDbMismatch(basePath) {
54
+ const markdown = countMarkdownHierarchy(basePath);
55
+ if (sameCounts(markdown, zeroCounts())) {
56
+ return {
57
+ action: "none",
58
+ reason: "no-markdown",
59
+ markdown,
60
+ beforeDb: zeroCounts(),
61
+ afterDb: zeroCounts(),
62
+ };
63
+ }
64
+ const opened = await ensureDbOpen(basePath);
65
+ if (!opened || !isDbAvailable()) {
66
+ throw new Error(`failed to open or create the GSD database at ${basePath}`);
67
+ }
68
+ const beforeDb = countDbHierarchy();
69
+ if (sameCounts(markdown, beforeDb)) {
70
+ return { action: "none", reason: "in-sync", markdown, beforeDb, afterDb: beforeDb };
71
+ }
72
+ const reason = sameCounts(beforeDb, zeroCounts()) ? "db-empty" : "count-mismatch";
73
+ const imported = transaction(() => {
74
+ clearEngineHierarchy();
75
+ return migrateHierarchyToDb(basePath);
76
+ });
77
+ invalidateStateCache();
78
+ const afterDb = {
79
+ milestones: imported.milestones,
80
+ slices: imported.slices,
81
+ tasks: imported.tasks,
82
+ };
83
+ if (!sameCounts(markdown, afterDb)) {
84
+ throw new Error(`migration auto-import verification failed: markdown ${markdown.milestones}M/${markdown.slices}S/${markdown.tasks}T, db ${afterDb.milestones}M/${afterDb.slices}S/${afterDb.tasks}T`);
85
+ }
86
+ return { action: "imported", reason, markdown, beforeDb, afterDb };
87
+ }
@@ -1,9 +1,9 @@
1
- // GSD Extension — Dynamic Model Router
2
- // Maps complexity tiers to models, enforcing downgrade-only semantics.
3
- // The user's configured model is always the ceiling.
1
+ // Project/App: GSD-2
2
+ // File Purpose: Routes work to appropriate models while preserving configured ceilings.
4
3
  import { tierOrdinal } from "./complexity-classifier.js";
5
4
  import { getProviderCapabilities } from "@gsd/pi-ai";
6
5
  import { getToolCompatibility } from "@gsd/pi-coding-agent";
6
+ import { incrementLegacyTelemetry } from "./legacy-telemetry.js";
7
7
  // ─── Known Model Tiers ───────────────────────────────────────────────────────
8
8
  // Maps known model IDs to their capability tier. Used when tier_models is not
9
9
  // explicitly configured to pick the best available model for each tier.
@@ -474,13 +474,16 @@ export function resolveModelForTier(tier, availableModelIds, routingConfigOrCros
474
474
  : crossProvider ?? routingConfig.cross_provider !== false;
475
475
  // No available models known — return canonical fallback
476
476
  if (availableModelIds.length === 0) {
477
+ incrementLegacyTelemetry("legacy.providerDefaultUsed");
477
478
  return canonicalModelForTier(tier);
478
479
  }
479
480
  // Cross-provider tier search
480
481
  const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
481
- return resolved
482
- ? normalizeResolvedTierModelId(resolved, tier, routingConfig)
483
- : canonicalModelForTier(tier);
482
+ if (resolved) {
483
+ return normalizeResolvedTierModelId(resolved, tier, routingConfig);
484
+ }
485
+ incrementLegacyTelemetry("legacy.providerDefaultUsed");
486
+ return canonicalModelForTier(tier);
484
487
  }
485
488
  // ─── Internal ────────────────────────────────────────────────────────────────
486
489
  /**
@@ -21,14 +21,32 @@ export function buildNotificationWidgetLines() {
21
21
  return chip ? [` ${chip}`] : [];
22
22
  }
23
23
  const REFRESH_INTERVAL_MS = 30_000;
24
+ let notificationWidgetCleanup;
24
25
  export function initNotificationWidget(ctx) {
26
+ notificationWidgetCleanup?.();
27
+ notificationWidgetCleanup = undefined;
25
28
  if (!ctx.hasUI)
26
- return;
29
+ return () => { };
27
30
  const push = () => {
28
31
  const chip = buildNotificationChip();
29
32
  ctx.ui.setStatus(STATUS_KEY, chip.length > 0 ? chip : undefined);
30
33
  };
31
34
  push();
32
- onNotificationStoreChange(push);
33
- setInterval(push, REFRESH_INTERVAL_MS).unref?.();
35
+ const unsubscribe = onNotificationStoreChange(push);
36
+ const interval = setInterval(push, REFRESH_INTERVAL_MS);
37
+ interval.unref?.();
38
+ const cleanup = () => {
39
+ unsubscribe();
40
+ clearInterval(interval);
41
+ if (notificationWidgetCleanup === cleanup) {
42
+ ctx.ui.setStatus(STATUS_KEY, undefined);
43
+ notificationWidgetCleanup = undefined;
44
+ }
45
+ };
46
+ notificationWidgetCleanup = cleanup;
47
+ return cleanup;
48
+ }
49
+ export function _resetNotificationWidgetForTests() {
50
+ notificationWidgetCleanup?.();
51
+ notificationWidgetCleanup = undefined;
34
52
  }
@@ -0,0 +1,26 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+ import { normalizePlannedFileReference } from "./files.js";
3
+ function isInsideBase(basePath, candidate) {
4
+ const base = resolve(basePath);
5
+ const abs = resolve(candidate);
6
+ const rel = relative(base, abs);
7
+ return rel === "" || (!!rel && !rel.startsWith("..") && !isAbsolute(rel));
8
+ }
9
+ /**
10
+ * Planning IO fields are execution contracts. Absolute paths are only safe when
11
+ * they stay inside the active working directory; in worktree mode, an absolute
12
+ * path to the original checkout makes executors edit the wrong tree.
13
+ */
14
+ export function validatePlanningPathScope(basePath, fields) {
15
+ for (const { field, values } of fields) {
16
+ for (const raw of values) {
17
+ const candidate = normalizePlannedFileReference(raw);
18
+ if (!isAbsolute(candidate))
19
+ continue;
20
+ if (isInsideBase(basePath, candidate))
21
+ continue;
22
+ return `${field} contains absolute path outside working directory: ${candidate}. Use a path relative to ${basePath}.`;
23
+ }
24
+ }
25
+ return null;
26
+ }
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Post-execution validation checks for completed GSD task output.
1
3
  /**
2
4
  * Post-Execution Checks — Validate task output after execution completes.
3
5
  *
@@ -96,12 +98,25 @@ export function resolveImportPath(importPath, sourceFile, basePath) {
96
98
  if (existsSync(directPath)) {
97
99
  return { exists: true, resolvedPath: directPath };
98
100
  }
99
- // Only .js/.jsx/.mjs/.cjs imports legitimately fall through for the TS
100
- // ESM convention (.js .ts). Any other explicit extension (.css, .json,
101
- // .svg, images, fonts, .ts, .tsx, …) must stay unresolved when the direct
102
- // path is missing — otherwise a stray `./missing.css.ts` could shadow a
103
- // genuinely missing `./missing.css` import.
104
- if (![".js", ".jsx", ".mjs", ".cjs"].includes(explicitExt)) {
101
+ // Known concrete extensions that should NOT fall through to code-shadow
102
+ // probing when missing. This preserves the "missing.css must stay missing"
103
+ // guarantee while still allowing dotted module stems like ./route.server
104
+ // to resolve as ./route.server.ts.
105
+ const nonFallbackExtensions = new Set([
106
+ ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
107
+ ".json", ".css", ".scss", ".sass", ".less", ".styl",
108
+ ".svg", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif", ".ico", ".bmp",
109
+ ".woff", ".woff2", ".ttf", ".otf", ".eot",
110
+ ]);
111
+ const runtimeFallbackExtensions = new Set([".js", ".jsx", ".mjs", ".cjs"]);
112
+ const dottedStemFallbackExtensions = new Set([".server", ".client", ".webhook"]);
113
+ if (explicitExt !== "" &&
114
+ !runtimeFallbackExtensions.has(explicitExt) &&
115
+ !nonFallbackExtensions.has(explicitExt) &&
116
+ !dottedStemFallbackExtensions.has(explicitExt)) {
117
+ return { exists: false, resolvedPath: null };
118
+ }
119
+ if (nonFallbackExtensions.has(explicitExt) && !runtimeFallbackExtensions.has(explicitExt)) {
105
120
  return { exists: false, resolvedPath: null };
106
121
  }
107
122
  }
@@ -163,6 +178,12 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
163
178
  }
164
179
  const imports = extractRelativeImports(source);
165
180
  for (const { importPath, lineNum } of imports) {
181
+ // React Router generated +types modules may not exist on disk during
182
+ // post-exec checks (generated during framework build). Don't block task
183
+ // completion on these imports.
184
+ if (/^\.{1,2}\/\+types\//.test(importPath)) {
185
+ continue;
186
+ }
166
187
  const resolution = resolveImportPath(importPath, file, basePath);
167
188
  if (!resolution.exists) {
168
189
  results.push({
@@ -0,0 +1,117 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Shared pull request evidence generator for GSD shipping paths.
3
+ const CHANGE_TYPE_LABELS = {
4
+ feat: "New feature or capability",
5
+ fix: "Bug fix",
6
+ refactor: "Code restructuring",
7
+ test: "Adding or updating tests",
8
+ docs: "Documentation only",
9
+ chore: "Build, CI, or tooling changes",
10
+ };
11
+ // Per-item cap for user-supplied content. 2 KB gives slice titles plus
12
+ // descriptions room while still bounding malicious DoS-via-PR-body input.
13
+ const USER_CONTENT_CAP_BYTES = 2048;
14
+ const TRUNCATION_SUFFIX = " … [truncated]";
15
+ // Strips HTML comments, fake commit trailers (Co-Authored-By, Signed-off-by —
16
+ // case-insensitive on the trailer name), and caps total length. Designed to
17
+ // be a no-op for well-formed input; golden fixtures must remain byte-stable.
18
+ // Trailer lines are removed (not rejected) so that a single bad line in an
19
+ // otherwise legitimate description does not block the entire PR.
20
+ function sanitizeUserContent(s) {
21
+ if (!s)
22
+ return s;
23
+ // Strip HTML comments greedily across newlines.
24
+ let out = s.replace(/<!--[\s\S]*?-->/g, "");
25
+ // Drop lines that look like commit trailers we do not want forged.
26
+ out = out
27
+ .split("\n")
28
+ .filter((line) => !/^\s*(co-authored-by|signed-off-by)\s*:/i.test(line))
29
+ .join("\n");
30
+ if (Buffer.byteLength(out, "utf8") > USER_CONTENT_CAP_BYTES) {
31
+ const budget = USER_CONTENT_CAP_BYTES - Buffer.byteLength(TRUNCATION_SUFFIX, "utf8");
32
+ // Truncate by code units to stay safely under the byte budget for ASCII;
33
+ // for multibyte content we conservatively walk back until under budget.
34
+ let sliced = out.slice(0, Math.max(0, budget));
35
+ while (Buffer.byteLength(sliced, "utf8") > budget && sliced.length > 0) {
36
+ sliced = sliced.slice(0, -1);
37
+ }
38
+ out = sliced + TRUNCATION_SUFFIX;
39
+ }
40
+ return out;
41
+ }
42
+ // Strips HTML comments and fake trailers without applying the length cap.
43
+ // Used for short fields like linkedIssue where truncation would be confusing.
44
+ function sanitizeIssueRef(s) {
45
+ if (!s)
46
+ return s;
47
+ let out = s.replace(/<!--[\s\S]*?-->/g, "");
48
+ out = out
49
+ .split("\n")
50
+ .filter((line) => !/^\s*(co-authored-by|signed-off-by)\s*:/i.test(line))
51
+ .join("\n");
52
+ return out;
53
+ }
54
+ function normalizeList(values) {
55
+ return (values ?? [])
56
+ .map((value) => sanitizeUserContent(value).trim())
57
+ .filter(Boolean);
58
+ }
59
+ function changeTypeChecklist(selected) {
60
+ return Object.keys(CHANGE_TYPE_LABELS).map((type) => {
61
+ const checked = type === selected ? "x" : " ";
62
+ return `- [${checked}] \`${type}\` - ${CHANGE_TYPE_LABELS[type]}`;
63
+ });
64
+ }
65
+ function bulletList(values, fallback) {
66
+ if (values.length === 0)
67
+ return `- ${fallback}`;
68
+ return values.map((value) => `- ${value}`).join("\n");
69
+ }
70
+ export function buildPrEvidence(input) {
71
+ const subjectId = input.subjectId?.trim() || input.milestoneId;
72
+ const subjectKind = input.subjectKind ?? "milestone";
73
+ const subjectTitle = input.milestoneTitle?.trim() || subjectId;
74
+ const changeType = input.changeType ?? "feat";
75
+ const summaries = normalizeList(input.summaries);
76
+ const blockers = normalizeList(input.blockers);
77
+ const roadmapItems = normalizeList(input.roadmapItems);
78
+ const metrics = normalizeList(input.metrics);
79
+ const testsRun = normalizeList(input.testsRun);
80
+ const rollbackNotes = normalizeList(input.rollbackNotes);
81
+ // linkedIssue is sanitized but not length-capped: legitimate issue refs
82
+ // are short by nature, and truncating "Closes #123" would be unhelpful.
83
+ const linkedIssueRaw = input.linkedIssue ? sanitizeIssueRef(input.linkedIssue).trim() : "";
84
+ const linkedIssue = linkedIssueRaw || "Not specified. Add an issue link before marking this PR ready if CONTRIBUTING.md requires one.";
85
+ const why = (input.why ? sanitizeUserContent(input.why).trim() : "") || `${capitalize(subjectKind)} work is complete and ready for review.`;
86
+ const how = (input.how ? sanitizeUserContent(input.how).trim() : "") || "Generated from GSD evidence and local workflow artifacts.";
87
+ const title = `${changeType}: ${subjectTitle}`;
88
+ const sections = [
89
+ "## TL;DR",
90
+ "",
91
+ `**What:** Ship ${subjectKind} ${subjectId} - ${subjectTitle}`,
92
+ `**Why:** ${why}`,
93
+ `**How:** ${how}`,
94
+ "",
95
+ "## What",
96
+ "",
97
+ summaries.length > 0 ? summaries.join("\n\n") : `${capitalize(subjectKind)} ${subjectId} completed.`,
98
+ ];
99
+ if (blockers.length > 0) {
100
+ sections.push("", "## Blockers", "", blockers.map((blocker) => `- ${blocker}`).join("\n"));
101
+ }
102
+ sections.push("", "## Why", "", why, "", "## How", "", how, "", "## Linked Issue", "", linkedIssue);
103
+ if (roadmapItems.length > 0) {
104
+ sections.push("", "## Roadmap", "", roadmapItems.join("\n"));
105
+ }
106
+ if (metrics.length > 0) {
107
+ sections.push("", "## Metrics", "", bulletList(metrics, "No metrics recorded."));
108
+ }
109
+ sections.push("", "## Tests Run", "", bulletList(testsRun, "Not specified. Add exact verification commands before requesting review."), "", "## Change Type", "", ...changeTypeChecklist(changeType), "", "## Rollback And Compatibility", "", bulletList(rollbackNotes, "No behavior-changing rollback notes recorded."));
110
+ if (input.aiAssisted !== false) {
111
+ sections.push("", "## AI Assistance Disclosure", "", "This PR was prepared with AI assistance.");
112
+ }
113
+ return { title, body: sections.join("\n") };
114
+ }
115
+ function capitalize(value) {
116
+ return value.slice(0, 1).toUpperCase() + value.slice(1);
117
+ }
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Pre-execution validation checks for GSD task plans.
1
3
  /**
2
4
  * Pre-Execution Checks — Validate task plans before execution begins.
3
5
  *