gsd-pi 2.79.0 → 2.80.0-dev.96f4d89d5

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 (773) hide show
  1. package/README.md +94 -47
  2. package/dist/loader.js +0 -0
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/github-sync/templates.js +90 -74
  5. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  6. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +365 -522
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  9. package/dist/resources/extensions/gsd/auto/phases.js +61 -7
  10. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
  11. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  30. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  31. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
  33. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  34. package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
  35. package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
  36. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  37. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  38. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  39. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  40. package/dist/resources/extensions/gsd/auto.js +159 -2
  41. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
  42. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  43. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  44. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
  46. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  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/custom-workflow-engine.js +25 -1
  51. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  52. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  53. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  54. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  55. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  56. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  57. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  58. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  60. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  61. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  62. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  63. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  64. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  65. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  66. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  67. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  68. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  69. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  70. package/dist/resources/extensions/gsd/escalation.js +2 -0
  71. package/dist/resources/extensions/gsd/graph.js +9 -3
  72. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  73. package/dist/resources/extensions/gsd/guided-flow.js +40 -0
  74. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  76. package/dist/resources/extensions/gsd/model-router.js +9 -6
  77. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  78. package/dist/resources/extensions/gsd/paths.js +5 -1
  79. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  80. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  81. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  82. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  83. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  84. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  90. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  91. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  93. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  94. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  95. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  96. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  97. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  99. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  100. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  101. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  102. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  103. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  104. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  105. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  106. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  107. package/dist/resources/extensions/gsd/state.js +4 -0
  108. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  110. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
  111. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  112. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  113. package/dist/resources/extensions/gsd/uok/audit.js +23 -9
  114. package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
  115. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
  116. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  117. package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
  118. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  119. package/dist/resources/extensions/gsd/uok/timeline.js +125 -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/shared/gsd-phase-state.js +45 -3
  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 +9 -9
  130. package/dist/web/standalone/.next/build-manifest.json +4 -4
  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 +4 -4
  134. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  135. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  145. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  164. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  207. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  209. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  213. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  221. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  231. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  253. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  258. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  264. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  270. package/dist/web/standalone/.next/server/app/index.html +1 -1
  271. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  272. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  273. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  274. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  275. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  276. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  277. package/dist/web/standalone/.next/server/app/page.js +2 -2
  278. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  280. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  281. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  282. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  283. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/middleware.js +2 -2
  286. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  288. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  289. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  290. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  291. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  292. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  293. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  294. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  298. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  299. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  300. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  301. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  302. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  303. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  304. package/dist/web/standalone/package.json +1 -0
  305. package/dist/web/standalone/server.js +1 -1
  306. package/package.json +15 -6
  307. package/packages/contracts/dist/index.d.ts +3 -0
  308. package/packages/contracts/dist/index.d.ts.map +1 -0
  309. package/packages/contracts/dist/index.js +5 -0
  310. package/packages/contracts/dist/index.js.map +1 -0
  311. package/packages/contracts/dist/rpc.d.ts +549 -0
  312. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  313. package/packages/contracts/dist/rpc.js +53 -0
  314. package/packages/contracts/dist/rpc.js.map +1 -0
  315. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  316. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  317. package/packages/contracts/dist/rpc.test.js +47 -0
  318. package/packages/contracts/dist/rpc.test.js.map +1 -0
  319. package/packages/contracts/dist/workflow.d.ts +180 -0
  320. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  321. package/packages/contracts/dist/workflow.js +201 -0
  322. package/packages/contracts/dist/workflow.js.map +1 -0
  323. package/packages/contracts/package.json +39 -0
  324. package/packages/contracts/src/index.ts +5 -0
  325. package/packages/contracts/src/rpc.test.ts +72 -0
  326. package/packages/contracts/src/rpc.ts +286 -0
  327. package/packages/contracts/src/workflow.ts +213 -0
  328. package/packages/contracts/tsconfig.json +25 -0
  329. package/packages/daemon/package.json +3 -2
  330. package/packages/daemon/src/event-bridge.test.ts +2 -1
  331. package/packages/daemon/src/event-bridge.ts +1 -1
  332. package/packages/daemon/src/event-formatter.test.ts +1 -2
  333. package/packages/daemon/src/event-formatter.ts +1 -2
  334. package/packages/daemon/src/session-manager.ts +2 -2
  335. package/packages/daemon/src/types.ts +3 -18
  336. package/packages/mcp-server/dist/server.d.ts +13 -0
  337. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  338. package/packages/mcp-server/dist/server.js +77 -0
  339. package/packages/mcp-server/dist/server.js.map +1 -1
  340. package/packages/mcp-server/dist/session-manager.js +1 -1
  341. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  342. package/packages/mcp-server/dist/types.d.ts +3 -11
  343. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  344. package/packages/mcp-server/dist/types.js.map +1 -1
  345. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  346. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  347. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  348. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  349. package/packages/mcp-server/package.json +3 -2
  350. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  351. package/packages/mcp-server/src/server.ts +99 -1
  352. package/packages/mcp-server/src/session-manager.ts +2 -2
  353. package/packages/mcp-server/src/types.ts +7 -18
  354. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  355. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  356. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  357. package/packages/native/package.json +1 -1
  358. package/packages/pi-agent-core/package.json +1 -1
  359. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  360. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  361. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  362. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  363. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  364. package/packages/pi-ai/dist/models/index.js +8 -0
  365. package/packages/pi-ai/dist/models/index.js.map +1 -1
  366. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  367. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  368. package/packages/pi-ai/dist/providers/fake.js +319 -0
  369. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  370. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  371. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  372. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  373. package/packages/pi-ai/package.json +1 -1
  374. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  375. package/packages/pi-ai/src/models/index.ts +9 -0
  376. package/packages/pi-ai/src/providers/fake.ts +376 -0
  377. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  378. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  379. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  381. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  383. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  385. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  388. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +22 -0
  390. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +8 -8
  400. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  402. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  406. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +48 -15
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -0
  413. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  415. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  417. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  419. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
  424. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  427. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  428. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  429. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  431. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  433. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  435. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  441. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  442. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  443. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  445. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  446. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +27 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  448. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  449. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  450. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  451. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  452. package/packages/pi-coding-agent/package.json +2 -1
  453. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  454. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  455. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  456. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +37 -2
  457. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  458. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  459. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +8 -8
  460. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  461. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  462. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +50 -15
  463. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  464. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  466. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  467. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
  468. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  469. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  470. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  471. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  472. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +40 -0
  473. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  474. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  475. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  476. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  477. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  478. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  479. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  480. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  481. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  482. package/packages/pi-tui/dist/index.d.ts +1 -0
  483. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  484. package/packages/pi-tui/dist/index.js +2 -0
  485. package/packages/pi-tui/dist/index.js.map +1 -1
  486. package/packages/pi-tui/dist/style.d.ts +41 -0
  487. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  488. package/packages/pi-tui/dist/style.js +158 -0
  489. package/packages/pi-tui/dist/style.js.map +1 -0
  490. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  491. package/packages/pi-tui/dist/tui.js +1 -0
  492. package/packages/pi-tui/dist/tui.js.map +1 -1
  493. package/packages/pi-tui/package.json +1 -1
  494. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  495. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  496. package/packages/pi-tui/src/index.ts +9 -0
  497. package/packages/pi-tui/src/style.ts +225 -0
  498. package/packages/pi-tui/src/tui.ts +1 -0
  499. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  500. package/packages/rpc-client/README.md +3 -3
  501. package/packages/rpc-client/dist/index.d.ts +1 -1
  502. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  503. package/packages/rpc-client/dist/index.js.map +1 -1
  504. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  505. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  506. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  507. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  508. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  509. package/packages/rpc-client/dist/rpc-types.js +3 -11
  510. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  511. package/packages/rpc-client/package.json +4 -1
  512. package/packages/rpc-client/src/index.ts +1 -1
  513. package/packages/rpc-client/src/rpc-client.ts +3 -6
  514. package/packages/rpc-client/src/rpc-types.ts +3 -398
  515. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  516. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  517. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  518. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  519. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  520. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  521. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  522. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  523. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  524. package/pkg/package.json +1 -1
  525. package/src/resources/extensions/github-sync/templates.ts +93 -88
  526. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  527. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  528. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  529. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  530. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  531. package/src/resources/extensions/gsd/auto/loop.ts +416 -596
  532. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  533. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  534. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  535. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  536. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  537. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  538. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  539. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  540. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  541. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  542. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  543. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  544. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  545. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  546. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  547. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  548. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  549. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  550. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  551. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  552. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  553. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  554. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  555. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  556. package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
  557. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  558. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  559. package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
  560. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  561. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  562. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  563. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  564. package/src/resources/extensions/gsd/auto.ts +167 -1
  565. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
  566. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  567. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  568. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
  569. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  570. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
  571. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  572. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  573. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  574. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  575. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  576. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  577. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  578. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  579. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  580. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  581. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  582. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  583. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  584. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  585. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  586. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  587. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  588. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  589. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  590. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  591. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  592. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  593. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  594. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  595. package/src/resources/extensions/gsd/escalation.ts +3 -1
  596. package/src/resources/extensions/gsd/graph.ts +12 -5
  597. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  598. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  599. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  600. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  601. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  602. package/src/resources/extensions/gsd/model-router.ts +10 -6
  603. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  604. package/src/resources/extensions/gsd/paths.ts +6 -1
  605. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  606. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  607. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  608. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  609. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  610. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  611. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  612. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  613. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  614. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  615. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  616. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  617. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  618. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  619. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  620. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  621. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  622. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  623. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  624. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  625. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  626. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  627. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  628. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  629. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  630. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  631. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  632. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  633. package/src/resources/extensions/gsd/state.ts +6 -3
  634. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
  635. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
  636. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
  637. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  638. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  639. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
  640. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  641. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  642. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  643. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  644. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  645. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  646. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  647. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  648. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  649. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  650. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  651. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
  652. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  653. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  654. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  655. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  656. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  657. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  658. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  659. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  660. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  661. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  662. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  663. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  664. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  665. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  666. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  667. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  668. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  669. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  670. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  671. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  672. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  673. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  674. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  675. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  676. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  677. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  678. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  679. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  680. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  681. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  682. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  683. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  684. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  685. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  686. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  687. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  688. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  689. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  690. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  691. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  692. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  693. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  694. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  695. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  696. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  697. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  698. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  699. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  700. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  701. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  702. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  703. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  704. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  705. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  706. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  707. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  708. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  709. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  710. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  711. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  712. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  713. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  714. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  715. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  716. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  717. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  718. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  719. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  720. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  721. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  722. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  723. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  724. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  725. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  726. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  727. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  728. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  729. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  730. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  731. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  732. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  733. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  734. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  735. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  736. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  737. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  738. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  739. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  740. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  741. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  742. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  743. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  744. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  745. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  746. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  747. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  748. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  749. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  750. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  751. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  752. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  753. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  754. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  755. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  756. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  757. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  758. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  759. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  760. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  761. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  762. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  763. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  764. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  765. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  766. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  767. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  768. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  769. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  770. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  771. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  772. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → y7d--cnc6Cibuva-Lzzw_}/_buildManifest.js +0 -0
  773. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → y7d--cnc6Cibuva-Lzzw_}/_ssgManifest.js +0 -0
@@ -1,10 +1,11 @@
1
+ // GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
1
2
  import { logWarning } from "../workflow-logger.js";
2
3
  import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
3
4
  import { clearPathCache } from "../paths.js";
4
5
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
5
6
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
6
7
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
7
- import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
8
+ import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
8
9
  import { resolveModelId } from "../auto-model-selection.js";
9
10
  import { resolveProjectRoot } from "../worktree.js";
10
11
  import { clearDiscussionFlowState } from "./write-gate.js";
@@ -39,6 +40,19 @@ function resolveAgentEndBasePath() {
39
40
  return undefined;
40
41
  }
41
42
  }
43
+ export function _buildAbortedPauseContext(lastMsg) {
44
+ const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
45
+ return {
46
+ message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
47
+ category: "aborted",
48
+ isTransient: true,
49
+ };
50
+ }
51
+ export function isUserInitiatedAbortMessage(message) {
52
+ if (!message)
53
+ return false;
54
+ return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
55
+ }
42
56
  async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
43
57
  retryState.consecutiveTransientCount += 1;
44
58
  const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
@@ -134,7 +148,7 @@ export async function handleAgentEnd(pi, event, ctx) {
134
148
  }
135
149
  return;
136
150
  }
137
- await pauseAuto(ctx, pi);
151
+ await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg));
138
152
  return;
139
153
  }
140
154
  if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
@@ -142,6 +156,14 @@ export async function handleAgentEnd(pi, event, ctx) {
142
156
  // is in the assistant message text content. Fall back to content when
143
157
  // errorMessage looks uninformative.
144
158
  const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
159
+ if (isUserInitiatedAbortMessage(rawErrorMsg)) {
160
+ resolveAgentEndCancelled({
161
+ message: rawErrorMsg,
162
+ category: "aborted",
163
+ isTransient: false,
164
+ });
165
+ return;
166
+ }
145
167
  const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
146
168
  // #3588: When errorMessage is uninformative, extract the real error from
147
169
  // the assistant message text content for display purposes only.
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers DB-backed GSD workflow tools and compatibility aliases.
1
3
  import { Type } from "@sinclair/typebox";
2
4
  import { Text } from "@gsd/pi-tui";
3
5
  import { loadEffectiveGSDPreferences } from "../preferences.js";
@@ -5,6 +7,7 @@ import { ensureDbOpen } from "./dynamic-tools.js";
5
7
  import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
6
8
  import { StringEnum } from "@gsd/pi-ai";
7
9
  import { logError } from "../workflow-logger.js";
10
+ import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
8
11
  async function loadWorkflowExecutors() {
9
12
  return import("../tools/workflow-tool-executors.js");
10
13
  }
@@ -14,11 +17,18 @@ async function loadWorkflowExecutors() {
14
17
  */
15
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
16
19
  function registerAlias(pi, toolDef, aliasName, canonicalName) {
20
+ const execute = typeof toolDef.execute === "function"
21
+ ? async (...args) => {
22
+ incrementLegacyTelemetry("legacy.mcpAliasUsed");
23
+ return toolDef.execute(...args);
24
+ }
25
+ : toolDef.execute;
17
26
  pi.registerTool({
18
27
  ...toolDef,
19
28
  name: aliasName,
20
29
  description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
21
30
  promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
31
+ execute,
22
32
  });
23
33
  }
24
34
  function requirementRootWriteGuard(operation) {
@@ -1,7 +1,7 @@
1
1
  // GSD2 — Exec (context-mode) tool registration.
2
2
  //
3
- // Exposes the `gsd_exec` tool over MCP. Opt-in: disabled unless
4
- // `context_mode.enabled: true` is set in preferences.
3
+ // Exposes the Context Mode runtime tools in-process. Default-on; opt out with
4
+ // `context_mode.enabled: false` in preferences.
5
5
  import { Type } from "@sinclair/typebox";
6
6
  export function registerExecTools(pi) {
7
7
  pi.registerTool({
@@ -16,6 +16,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
16
16
  import { installNotifyInterceptor } from "./notify-interceptor.js";
17
17
  import { initNotificationStore } from "../notification-store.js";
18
18
  import { initNotificationWidget } from "../notification-widget.js";
19
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
19
20
  import { extractSubagentAgentClasses } from "./subagent-input.js";
20
21
  import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
21
22
  // Skip the welcome screen on the very first session_start — cli.ts already
@@ -51,11 +52,45 @@ async function applyDisabledModelProviderPolicy(ctx) {
51
52
  // Non-fatal: keep default provider visibility if preferences cannot be loaded.
52
53
  }
53
54
  }
55
+ export function resolveNotificationStoreBasePath(cwd = process.cwd()) {
56
+ return resolveWorktreeProjectRoot(cwd);
57
+ }
58
+ function initSessionNotifications(ctx) {
59
+ initNotificationStore(resolveNotificationStoreBasePath());
60
+ installNotifyInterceptor(ctx);
61
+ initNotificationWidget(ctx);
62
+ }
63
+ async function writeContextModeCompactionSnapshot(basePath) {
64
+ try {
65
+ const { loadEffectiveGSDPreferences } = await import("../preferences.js");
66
+ const { isContextModeEnabled } = await import("../preferences-types.js");
67
+ const prefs = loadEffectiveGSDPreferences(basePath);
68
+ if (!isContextModeEnabled(prefs?.preferences))
69
+ return;
70
+ const { writeCompactionSnapshot } = await import("../compaction-snapshot.js");
71
+ const { ensureDbOpen } = await import("./dynamic-tools.js");
72
+ await ensureDbOpen(basePath);
73
+ let activeContext = null;
74
+ try {
75
+ const state = await deriveGsdState(basePath);
76
+ if (state.activeMilestone && state.activeSlice && state.activeTask) {
77
+ activeContext =
78
+ `Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
79
+ (state.activeTask.title ? ` - ${state.activeTask.title}` : "");
80
+ }
81
+ }
82
+ catch {
83
+ /* non-fatal */
84
+ }
85
+ writeCompactionSnapshot(basePath, { activeContext });
86
+ }
87
+ catch (err) {
88
+ safetyLogWarning("context-mode", `failed to write compaction snapshot: ${err instanceof Error ? err.message : String(err)}`);
89
+ }
90
+ }
54
91
  export function registerHooks(pi, ecosystemHandlers) {
55
92
  pi.on("session_start", async (_event, ctx) => {
56
- initNotificationStore(process.cwd());
57
- installNotifyInterceptor(ctx);
58
- initNotificationWidget(ctx);
93
+ initSessionNotifications(ctx);
59
94
  if (!isAutoActive()) {
60
95
  const { initHealthWidget } = await import("../health-widget.js");
61
96
  initHealthWidget(ctx);
@@ -107,8 +142,7 @@ export function registerHooks(pi, ecosystemHandlers) {
107
142
  }
108
143
  });
109
144
  pi.on("session_switch", async (_event, ctx) => {
110
- initNotificationStore(process.cwd());
111
- installNotifyInterceptor(ctx);
145
+ initSessionNotifications(ctx);
112
146
  resetWriteGateState(process.cwd());
113
147
  resetToolCallLoopGuard();
114
148
  await resetAskUserQuestionsTurnCache();
@@ -138,7 +172,7 @@ export function registerHooks(pi, ecosystemHandlers) {
138
172
  const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
139
173
  await getEcosystemReadyPromise();
140
174
  const beforeAgentBasePath = process.cwd();
141
- const pendingApprovalGate = getPendingGate();
175
+ const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
142
176
  if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
143
177
  markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
144
178
  const milestoneId = extractDepthVerificationMilestoneId(pendingApprovalGate);
@@ -204,15 +238,18 @@ export function registerHooks(pi, ecosystemHandlers) {
204
238
  }
205
239
  });
206
240
  pi.on("session_before_compact", async () => {
241
+ const basePath = process.cwd();
242
+ // Context Mode is default-on. Write the resumable snapshot before any
243
+ // active-auto cancel return so auto sessions still leave re-entry context.
244
+ await writeContextModeCompactionSnapshot(basePath);
207
245
  // Only cancel compaction while auto-mode is actively running.
208
246
  // Paused auto-mode should allow compaction — the user may be doing
209
247
  // interactive work (#3165).
210
248
  if (isAutoActive()) {
211
249
  return { cancel: true };
212
250
  }
213
- const basePath = process.cwd();
214
251
  const { ensureDbOpen } = await import("./dynamic-tools.js");
215
- await ensureDbOpen();
252
+ await ensureDbOpen(basePath);
216
253
  const state = await deriveGsdState(basePath);
217
254
  if (!state.activeMilestone || !state.activeSlice)
218
255
  return;
@@ -256,41 +293,6 @@ export function registerHooks(pi, ecosystemHandlers) {
256
293
  : `Resume ${phaseLabel} work for slice ${state.activeSlice.id}.`,
257
294
  }));
258
295
  });
259
- // Context-mode snapshot: write .gsd/last-snapshot.md before compaction so
260
- // agents can call gsd_resume (or Read the file) to re-orient. Opt-in via
261
- // preferences.context_mode.enabled. Runs after the auto-cancel handler
262
- // above — if that one returned cancel:true, pi still fires us but the
263
- // compaction won't actually happen; the snapshot is still useful then,
264
- // since auto may pause and resume later.
265
- pi.on("session_before_compact", async () => {
266
- try {
267
- const { loadEffectiveGSDPreferences } = await import("../preferences.js");
268
- const { isContextModeEnabled } = await import("../preferences-types.js");
269
- const prefs = loadEffectiveGSDPreferences();
270
- if (!isContextModeEnabled(prefs?.preferences))
271
- return;
272
- const { writeCompactionSnapshot } = await import("../compaction-snapshot.js");
273
- const { ensureDbOpen } = await import("./dynamic-tools.js");
274
- await ensureDbOpen();
275
- const basePath = process.cwd();
276
- let activeContext = null;
277
- try {
278
- const state = await deriveGsdState(basePath);
279
- if (state.activeMilestone && state.activeSlice && state.activeTask) {
280
- activeContext =
281
- `Active: ${state.activeMilestone.id} / ${state.activeSlice.id} / ${state.activeTask.id}` +
282
- (state.activeTask.title ? ` — ${state.activeTask.title}` : "");
283
- }
284
- }
285
- catch {
286
- /* non-fatal */
287
- }
288
- writeCompactionSnapshot(basePath, { activeContext });
289
- }
290
- catch (err) {
291
- safetyLogWarning("context-mode", `failed to write compaction snapshot: ${err instanceof Error ? err.message : String(err)}`);
292
- }
293
- });
294
296
  pi.on("message_update", async (event, ctx) => {
295
297
  if (approvalQuestionAbortInFlight)
296
298
  return;
@@ -367,15 +369,15 @@ export function registerHooks(pi, ecosystemHandlers) {
367
369
  // ── Discussion gate enforcement: block tool calls while gate is pending ──
368
370
  // If ask_user_questions was called with a gate ID but hasn't been confirmed,
369
371
  // block all non-read-only tool calls to prevent the model from skipping gates.
370
- if (getPendingGate()) {
372
+ if (getPendingGate(discussionBasePath)) {
371
373
  const milestoneId = await getDiscussionMilestoneIdFor(discussionBasePath);
372
374
  if (isToolCallEventType("bash", event)) {
373
- const bashGuard = shouldBlockPendingGateBash(event.input.command, milestoneId, isQueuePhaseActive());
375
+ const bashGuard = shouldBlockPendingGateBash(event.input.command, milestoneId, isQueuePhaseActive(discussionBasePath), discussionBasePath);
374
376
  if (bashGuard.block)
375
377
  return bashGuard;
376
378
  }
377
379
  else {
378
- const gateGuard = shouldBlockPendingGate(toolName, milestoneId, isQueuePhaseActive());
380
+ const gateGuard = shouldBlockPendingGate(toolName, milestoneId, isQueuePhaseActive(discussionBasePath), discussionBasePath);
379
381
  if (gateGuard.block)
380
382
  return gateGuard;
381
383
  }
@@ -384,7 +386,7 @@ export function registerHooks(pi, ecosystemHandlers) {
384
386
  // When /gsd queue is active, the agent should only create milestones,
385
387
  // not execute work. Block write/edit to non-.gsd/ paths and bash commands
386
388
  // that would modify files.
387
- if (isQueuePhaseActive()) {
389
+ if (isQueuePhaseActive(discussionBasePath)) {
388
390
  let queueInput = "";
389
391
  if (isToolCallEventType("write", event)) {
390
392
  queueInput = event.input.path;
@@ -449,7 +451,7 @@ export function registerHooks(pi, ecosystemHandlers) {
449
451
  }
450
452
  if (!isToolCallEventType("write", event))
451
453
  return;
452
- const result = shouldBlockContextWrite(event.toolName, event.input.path, await getDiscussionMilestoneIdFor(discussionBasePath), isQueuePhaseActive());
454
+ const result = shouldBlockContextWrite(event.toolName, event.input.path, await getDiscussionMilestoneIdFor(discussionBasePath), isQueuePhaseActive(discussionBasePath), discussionBasePath);
453
455
  if (result.block)
454
456
  return result;
455
457
  });
@@ -504,7 +506,7 @@ export function registerHooks(pi, ecosystemHandlers) {
504
506
  return;
505
507
  const basePath = process.cwd();
506
508
  const milestoneId = await getDiscussionMilestoneIdFor(basePath);
507
- const queueActive = isQueuePhaseActive();
509
+ const queueActive = isQueuePhaseActive(basePath);
508
510
  const details = event.details;
509
511
  // ── Discussion gate enforcement: handle gate question responses ──
510
512
  // If the result is cancelled or has no response, the pending gate stays active
@@ -512,7 +514,7 @@ export function registerHooks(pi, ecosystemHandlers) {
512
514
  // If the user responded at all (even "needs adjustment"), clear the pending gate
513
515
  // because the user engaged — the prompt handles the re-ask-after-adjustment flow.
514
516
  const questions = event.input?.questions ?? [];
515
- const currentPendingGate = getPendingGate();
517
+ const currentPendingGate = getPendingGate(basePath);
516
518
  if (currentPendingGate) {
517
519
  if (details?.cancelled || !details?.response) {
518
520
  // Gate stays pending. Direct the agent to the most reliable recovery
@@ -298,8 +298,8 @@ export function getPendingGate(basePath = process.cwd()) {
298
298
  * Returns { block: true, reason } if the tool should be blocked.
299
299
  * ask_user_questions itself is allowed so the model can re-ask the gate.
300
300
  */
301
- export function shouldBlockPendingGate(toolName, milestoneId, queuePhaseActive) {
302
- return shouldBlockPendingGateInSnapshot(currentWriteGateSnapshot(), toolName, milestoneId, queuePhaseActive);
301
+ export function shouldBlockPendingGate(toolName, milestoneId, queuePhaseActive, basePath = process.cwd()) {
302
+ return shouldBlockPendingGateInSnapshot(currentWriteGateSnapshot(basePath), toolName, milestoneId, queuePhaseActive);
303
303
  }
304
304
  export function shouldBlockPendingGateInSnapshot(snapshot, toolName, _milestoneId, _queuePhaseActive) {
305
305
  if (!snapshot.pendingGateId)
@@ -322,8 +322,8 @@ export function shouldBlockPendingGateInSnapshot(snapshot, toolName, _milestoneI
322
322
  * Check whether a bash command should be blocked because a discussion gate is pending.
323
323
  * All bash is blocked while waiting for confirmation so the question stays visible.
324
324
  */
325
- export function shouldBlockPendingGateBash(command, milestoneId, queuePhaseActive) {
326
- return shouldBlockPendingGateBashInSnapshot(currentWriteGateSnapshot(), command, milestoneId, queuePhaseActive);
325
+ export function shouldBlockPendingGateBash(command, milestoneId, queuePhaseActive, basePath = process.cwd()) {
326
+ return shouldBlockPendingGateBashInSnapshot(currentWriteGateSnapshot(basePath), command, milestoneId, queuePhaseActive);
327
327
  }
328
328
  export function shouldBlockPendingGateBashInSnapshot(snapshot, command, _milestoneId, _queuePhaseActive) {
329
329
  if (!snapshot.pendingGateId)
@@ -363,7 +363,7 @@ export function isDepthConfirmationAnswer(selected, options) {
363
363
  // Returning false prevents any free-form string from unlocking the gate.
364
364
  return false;
365
365
  }
366
- export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queuePhaseActive) {
366
+ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queuePhaseActive, basePath = process.cwd()) {
367
367
  if (toolName !== "write")
368
368
  return { block: false };
369
369
  if (!MILESTONE_CONTEXT_RE.test(inputPath))
@@ -379,7 +379,7 @@ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queue
379
379
  ].join(" "),
380
380
  };
381
381
  }
382
- if (isMilestoneDepthVerified(targetMilestoneId))
382
+ if (isMilestoneDepthVerified(targetMilestoneId, basePath))
383
383
  return { block: false };
384
384
  return {
385
385
  block: true,
@@ -397,8 +397,8 @@ export function shouldBlockContextWrite(toolName, inputPath, milestoneId, _queue
397
397
  * Slice-level CONTEXT artifacts are allowed; milestone-level CONTEXT writes
398
398
  * require the milestone to be depth-verified first.
399
399
  */
400
- export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceId) {
401
- return shouldBlockContextArtifactSaveInSnapshot(currentWriteGateSnapshot(), artifactType, milestoneId, sliceId);
400
+ export function shouldBlockContextArtifactSave(artifactType, milestoneId, sliceId, basePath = process.cwd()) {
401
+ return shouldBlockContextArtifactSaveInSnapshot(currentWriteGateSnapshot(basePath), artifactType, milestoneId, sliceId);
402
402
  }
403
403
  export function shouldBlockContextArtifactSaveInSnapshot(snapshot, artifactType, milestoneId, sliceId) {
404
404
  if (artifactType !== "CONTEXT")
@@ -57,7 +57,7 @@ export function currentDirectoryRoot() {
57
57
  cwd = process.cwd();
58
58
  }
59
59
  catch {
60
- cwd = process.env.HOME ?? "/";
60
+ cwd = homedir();
61
61
  }
62
62
  }
63
63
  const result = validateDirectory(cwd);
@@ -1,9 +1,5 @@
1
- /**
2
- * GSD Command /gsd ship
3
- *
4
- * Creates a PR from milestone artifacts: generates title + body from
5
- * roadmap, slice summaries, and metrics, then opens via `gh pr create`.
6
- */
1
+ // Project/App: GSD-2
2
+ // File Purpose: Ship command for creating pull requests from GSD milestone evidence.
7
3
  import { execFileSync } from "node:child_process";
8
4
  import { existsSync, readFileSync, readdirSync } from "node:fs";
9
5
  import { readFile } from "node:fs/promises";
@@ -14,6 +10,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
14
10
  import { formatDuration } from "../shared/format-utils.js";
15
11
  import { parseEvalReviewFrontmatter } from "./eval-review-schema.js";
16
12
  import { currentDirectoryRoot } from "./commands/context.js";
13
+ import { buildPrEvidence } from "./pr-evidence.js";
17
14
  function git(basePath, args) {
18
15
  return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
19
16
  }
@@ -114,66 +111,46 @@ export async function checkSliceEvalReview(basePath, milestoneId, sliceId) {
114
111
  };
115
112
  }
116
113
  function generatePRContent(basePath, milestoneId, milestoneTitle) {
117
- const title = `feat: ${milestoneTitle || milestoneId}`;
118
- const sections = [];
119
- // TL;DR
120
- sections.push("## TL;DR\n");
121
- sections.push(`**What:** Ship milestone ${milestoneId} — ${milestoneTitle || "(untitled)"}`);
122
- sections.push(`**Why:** Milestone work complete, ready for review.`);
123
- sections.push(`**How:** See slice summaries below.\n`);
124
- // What — slice summaries
125
114
  const summaries = collectSliceSummaries(basePath, milestoneId);
126
- if (summaries.length > 0) {
127
- sections.push("## What\n");
128
- sections.push(summaries.join("\n\n"));
129
- sections.push("");
130
- }
131
- // Roadmap status
115
+ const roadmapItems = [];
132
116
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
133
117
  if (roadmapPath && existsSync(roadmapPath)) {
134
118
  try {
135
119
  const roadmap = readFileSync(roadmapPath, "utf-8");
136
120
  const checkboxLines = roadmap.split("\n").filter((l) => /^\s*-\s*\[[ x]\]/.test(l));
137
- if (checkboxLines.length > 0) {
138
- sections.push("## Roadmap\n");
139
- sections.push(checkboxLines.join("\n"));
140
- sections.push("");
141
- }
121
+ roadmapItems.push(...checkboxLines);
142
122
  }
143
123
  catch {
144
124
  // non-fatal
145
125
  }
146
126
  }
147
- // Metrics
127
+ const metrics = [];
148
128
  const ledger = getLedger();
149
129
  const units = ledger?.units ?? loadLedgerFromDisk(basePath)?.units ?? [];
150
130
  if (units.length > 0) {
151
131
  const totals = getProjectTotals(units);
152
132
  const byModel = aggregateByModel(units);
153
- sections.push("## Metrics\n");
154
- sections.push(`- **Units executed:** ${units.length}`);
155
- sections.push(`- **Total cost:** ${formatCost(totals.cost)}`);
156
- sections.push(`- **Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
133
+ metrics.push(`**Units executed:** ${units.length}`);
134
+ metrics.push(`**Total cost:** ${formatCost(totals.cost)}`);
135
+ metrics.push(`**Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
157
136
  if (totals.duration > 0) {
158
- sections.push(`- **Duration:** ${formatDuration(totals.duration)}`);
137
+ metrics.push(`**Duration:** ${formatDuration(totals.duration)}`);
159
138
  }
160
139
  if (byModel.length > 0) {
161
- sections.push(`- **Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
140
+ metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
162
141
  }
163
- sections.push("");
164
- }
165
- // Change type checklist
166
- sections.push("## Change type\n");
167
- sections.push("- [x] `feat` — New feature or capability");
168
- sections.push("- [ ] `fix` — Bug fix");
169
- sections.push("- [ ] `refactor` — Code restructuring");
170
- sections.push("- [ ] `test` — Adding or updating tests");
171
- sections.push("- [ ] `docs` Documentation only");
172
- sections.push("- [ ] `chore` Build, CI, or tooling changes\n");
173
- // AI disclosure
174
- sections.push("---\n");
175
- sections.push("*This PR was prepared with AI assistance (GSD auto-mode).*");
176
- return { title, body: sections.join("\n") };
142
+ }
143
+ return buildPrEvidence({
144
+ milestoneId,
145
+ milestoneTitle,
146
+ changeType: "feat",
147
+ summaries,
148
+ roadmapItems,
149
+ metrics,
150
+ testsRun: ["Run `npm run verify:pr` before marking this PR ready."],
151
+ rollbackNotes: ["Revert the merge commit or close the PR before merge if review finds a regression."],
152
+ how: "Generated from GSD milestone slice summaries, roadmap status, and local metrics.",
153
+ });
177
154
  }
178
155
  export async function handleShip(args, ctx, _pi) {
179
156
  const basePath = currentDirectoryRoot();
@@ -1,12 +1,8 @@
1
- /**
2
- * GSD Workflow Template Commands /gsd start, /gsd templates
3
- *
4
- * Handles the `/gsd start [template] [description]` and `/gsd templates` commands.
5
- * Resolves templates by name or auto-detection, then dispatches the workflow prompt.
6
- */
1
+ // Project/App: GSD-2
2
+ // File Purpose: Workflow template commands for starting, listing, and dispatching workflows.
7
3
  import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
8
4
  import { join } from "node:path";
9
- import { resolveByName, autoDetect, listTemplates, getTemplateInfo, loadWorkflowTemplate, loadRegistry, } from "./workflow-templates.js";
5
+ import { resolveByName, autoDetect, listTemplates, getTemplateInfo, loadWorkflowTemplate, loadRegistry, isLegacyWorkflowMode, } from "./workflow-templates.js";
10
6
  import { loadPrompt } from "./prompt-loader.js";
11
7
  import { gsdRoot } from "./paths.js";
12
8
  import { createGitService, runGit } from "./git-service.js";
@@ -14,6 +10,8 @@ import { isAutoActive, isAutoPaused } from "./auto.js";
14
10
  import { getErrorMessage } from "./error-utils.js";
15
11
  import { resolvePlugin } from "./workflow-plugins.js";
16
12
  import { currentDirectoryRoot } from "./commands/context.js";
13
+ import { formatRecommendedProcessPaths } from "./process-task-path.js";
14
+ import { incrementLegacyTelemetry } from "./legacy-telemetry.js";
17
15
  // ─── Helpers ─────────────────────────────────────────────────────────────────
18
16
  /**
19
17
  * Generate a URL-friendly slug from text.
@@ -244,6 +242,9 @@ export async function handleStart(args, ctx, pi) {
244
242
  " /gsd start bugfix fix login button not responding\n" +
245
243
  " /gsd start spike evaluate auth libraries\n" +
246
244
  " /gsd start hotfix critical: API returns 500\n\n" +
245
+ "Recommended task paths:\n" +
246
+ formatRecommendedProcessPaths() +
247
+ "\n\n" +
247
248
  "Flags:\n" +
248
249
  " --dry-run Preview what would happen without executing\n" +
249
250
  " --issue <ref> Link to a GitHub issue\n\n" +
@@ -364,6 +365,9 @@ export async function handleStart(args, ctx, pi) {
364
365
  infoLines.push(`Artifacts: ${artifactDir}`);
365
366
  infoLines.push(`Branch: ${actualBranch}`);
366
367
  ctx.ui.notify(infoLines.join("\n"), "info");
368
+ if (isLegacyWorkflowMode(template.mode)) {
369
+ incrementLegacyTelemetry("legacy.workflowEngineUsed");
370
+ }
367
371
  const prompt = loadPrompt("workflow-start", {
368
372
  templateId,
369
373
  templateName: template.name,
@@ -491,6 +495,7 @@ export function dispatchMarkdownPhasePlugin(plugin, description, ctx, pi) {
491
495
  infoLines.push(`Artifacts: ${artifactDir}`);
492
496
  infoLines.push(`Branch: ${actualBranch}`);
493
497
  ctx.ui.notify(infoLines.join("\n"), "info");
498
+ incrementLegacyTelemetry("legacy.workflowEngineUsed");
494
499
  const prompt = loadPrompt("workflow-start", {
495
500
  templateId,
496
501
  templateName: plugin.meta.displayName,
@@ -1,18 +1,10 @@
1
- /**
2
- * Component Loader
3
- *
4
- * Multi-format loader that handles:
5
- * 1. New format: component.yaml + SKILL.md/AGENT.md
6
- * 2. Legacy skill format: SKILL.md with YAML frontmatter
7
- * 3. Legacy agent format: .md with YAML frontmatter (name, description, tools, model)
8
- *
9
- * Auto-detects format by checking for component.yaml first, then falling back
10
- * to legacy formats based on file naming conventions.
11
- */
1
+ // Project/App: GSD-2
2
+ // File Purpose: Loads modern component.yaml definitions and legacy skill/agent formats.
12
3
  import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
13
4
  import { basename, dirname, join } from 'node:path';
14
5
  import { parse as parseYaml } from 'yaml';
15
6
  import { parseFrontmatter } from '@gsd/pi-coding-agent';
7
+ import { incrementLegacyTelemetry } from './legacy-telemetry.js';
16
8
  import { validateComponentName, validateComponentDescription, computeComponentId, } from './component-types.js';
17
9
  const SUPPORTED_COMPONENT_KINDS = ['skill', 'agent'];
18
10
  const SUPPORTED_API_VERSIONS = ['gsd/v1'];
@@ -183,6 +175,7 @@ function loadFromLegacySkill(filePath, dir, source) {
183
175
  format: 'skill-md',
184
176
  enabled: true,
185
177
  };
178
+ incrementLegacyTelemetry('legacy.componentFormatUsed');
186
179
  return { component, diagnostics };
187
180
  }
188
181
  function loadFromLegacyAgent(filePath, source) {
@@ -235,6 +228,7 @@ function loadFromLegacyAgent(filePath, source) {
235
228
  format: 'agent-md',
236
229
  enabled: true,
237
230
  };
231
+ incrementLegacyTelemetry('legacy.componentFormatUsed');
238
232
  return { component, diagnostics };
239
233
  }
240
234
  // ============================================================================
@@ -13,13 +13,29 @@
13
13
  */
14
14
  import { readFileSync } from "node:fs";
15
15
  import { join } from "node:path";
16
- import { readGraph, writeGraph, getNextPendingStep, markStepActive, markStepComplete, expandIteration, } from "./graph.js";
16
+ import { readGraph, writeGraph, getNextPendingStep, markStepActive, markStepComplete, expandIteration, isTerminalStepStatus, } from "./graph.js";
17
17
  import { injectContext } from "./context-injector.js";
18
18
  import { readFrozenDefinition } from "./definition-io.js";
19
19
  import { parseUnitId } from "./unit-id.js";
20
20
  import { withFileLock } from "./file-lock.js";
21
21
  // Re-export for downstream consumers
22
22
  export { readFrozenDefinition } from "./definition-io.js";
23
+ function formatBlockedWorkflowReason(graph) {
24
+ const statusById = new Map(graph.steps.map((step) => [step.id, step.status]));
25
+ const blockedSteps = graph.steps
26
+ .filter((step) => step.status === "pending")
27
+ .map((step) => {
28
+ const blockers = step.dependsOn
29
+ .filter((depId) => !isTerminalStepStatus(statusById.get(depId)))
30
+ .map((depId) => `${depId} (${statusById.get(depId) ?? "missing"})`);
31
+ return blockers.length > 0
32
+ ? `${step.id} waiting on ${blockers.join(", ")}`
33
+ : `${step.id} has no runnable dependency path`;
34
+ });
35
+ return blockedSteps.length > 0
36
+ ? `Workflow blocked: no pending steps are ready. Blocked steps: ${blockedSteps.join("; ")}`
37
+ : "Workflow blocked: no pending steps are ready.";
38
+ }
23
39
  export class CustomWorkflowEngine {
24
40
  engineId = "custom";
25
41
  runDir;
@@ -78,6 +94,14 @@ export class CustomWorkflowEngine {
78
94
  }
79
95
  let next = getNextPendingStep(graph);
80
96
  if (!next) {
97
+ const allDone = graph.steps.every((step) => step.status === "complete" || step.status === "expanded");
98
+ if (!allDone) {
99
+ return {
100
+ action: "stop",
101
+ reason: formatBlockedWorkflowReason(graph),
102
+ level: "error",
103
+ };
104
+ }
81
105
  return {
82
106
  action: "stop",
83
107
  reason: "All steps complete",
@@ -0,0 +1,47 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Normalized SQLite adapter wrapper used by the GSD database facade.
3
+ export function normalizeDbRow(row) {
4
+ if (row == null)
5
+ return undefined;
6
+ if (Object.getPrototypeOf(row) === null) {
7
+ return { ...row };
8
+ }
9
+ return row;
10
+ }
11
+ export function normalizeDbRows(rows) {
12
+ return rows.map((row) => normalizeDbRow(row));
13
+ }
14
+ export function createDbAdapter(rawDb) {
15
+ const db = rawDb;
16
+ const stmtCache = new Map();
17
+ function wrapStmt(raw) {
18
+ return {
19
+ run(...params) {
20
+ return raw.run(...params);
21
+ },
22
+ get(...params) {
23
+ return normalizeDbRow(raw.get(...params));
24
+ },
25
+ all(...params) {
26
+ return normalizeDbRows(raw.all(...params));
27
+ },
28
+ };
29
+ }
30
+ return {
31
+ exec(sql) {
32
+ db.exec(sql);
33
+ },
34
+ prepare(sql) {
35
+ let cached = stmtCache.get(sql);
36
+ if (cached)
37
+ return cached;
38
+ cached = wrapStmt(db.prepare(sql));
39
+ stmtCache.set(sql, cached);
40
+ return cached;
41
+ },
42
+ close() {
43
+ stmtCache.clear();
44
+ db.close();
45
+ },
46
+ };
47
+ }