gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.710c06e97

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 (644) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/github-sync/templates.js +90 -74
  3. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  4. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +365 -522
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  7. package/dist/resources/extensions/gsd/auto/phases.js +55 -6
  8. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
  9. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  10. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  29. package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
  30. package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
  31. package/dist/resources/extensions/gsd/auto-recovery.js +72 -55
  32. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  33. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  34. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  35. package/dist/resources/extensions/gsd/auto.js +159 -2
  36. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
  37. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  38. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -6
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  40. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  41. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  42. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  43. package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
  44. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  45. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  46. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  47. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  48. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  49. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  50. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  51. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  52. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  53. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  54. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  55. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  56. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  57. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  58. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  59. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  60. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  61. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  62. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  63. package/dist/resources/extensions/gsd/escalation.js +2 -0
  64. package/dist/resources/extensions/gsd/graph.js +9 -3
  65. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  66. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  67. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  68. package/dist/resources/extensions/gsd/model-router.js +9 -6
  69. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  70. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  71. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  73. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  74. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  77. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  78. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  80. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  82. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  83. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  84. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  85. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  88. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  89. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  90. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  91. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  92. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  93. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  94. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  95. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  96. package/dist/resources/extensions/gsd/state.js +4 -0
  97. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  98. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  99. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
  100. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  101. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  102. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  103. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  104. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  105. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  106. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  107. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  108. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  109. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  110. package/dist/web/standalone/.next/BUILD_ID +1 -1
  111. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  112. package/dist/web/standalone/.next/build-manifest.json +3 -3
  113. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  114. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  115. package/dist/web/standalone/.next/required-server-files.json +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/index.html +1 -1
  197. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  204. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  205. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  206. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  209. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  210. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  211. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  213. package/dist/web/standalone/package.json +1 -0
  214. package/dist/web/standalone/server.js +1 -1
  215. package/package.json +15 -6
  216. package/packages/contracts/dist/index.d.ts +3 -0
  217. package/packages/contracts/dist/index.d.ts.map +1 -0
  218. package/packages/contracts/dist/index.js +5 -0
  219. package/packages/contracts/dist/index.js.map +1 -0
  220. package/packages/contracts/dist/rpc.d.ts +549 -0
  221. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  222. package/packages/contracts/dist/rpc.js +53 -0
  223. package/packages/contracts/dist/rpc.js.map +1 -0
  224. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  225. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  226. package/packages/contracts/dist/rpc.test.js +47 -0
  227. package/packages/contracts/dist/rpc.test.js.map +1 -0
  228. package/packages/contracts/dist/workflow.d.ts +180 -0
  229. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  230. package/packages/contracts/dist/workflow.js +201 -0
  231. package/packages/contracts/dist/workflow.js.map +1 -0
  232. package/packages/contracts/package.json +39 -0
  233. package/packages/contracts/src/index.ts +5 -0
  234. package/packages/contracts/src/rpc.test.ts +72 -0
  235. package/packages/contracts/src/rpc.ts +286 -0
  236. package/packages/contracts/src/workflow.ts +213 -0
  237. package/packages/contracts/tsconfig.json +25 -0
  238. package/packages/daemon/package.json +3 -2
  239. package/packages/daemon/src/event-bridge.test.ts +2 -1
  240. package/packages/daemon/src/event-bridge.ts +1 -1
  241. package/packages/daemon/src/event-formatter.test.ts +1 -2
  242. package/packages/daemon/src/event-formatter.ts +1 -2
  243. package/packages/daemon/src/session-manager.ts +2 -2
  244. package/packages/daemon/src/types.ts +3 -18
  245. package/packages/mcp-server/dist/server.d.ts +13 -0
  246. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  247. package/packages/mcp-server/dist/server.js +77 -0
  248. package/packages/mcp-server/dist/server.js.map +1 -1
  249. package/packages/mcp-server/dist/session-manager.js +1 -1
  250. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  251. package/packages/mcp-server/dist/types.d.ts +3 -11
  252. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  253. package/packages/mcp-server/dist/types.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -40
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -2
  259. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  260. package/packages/mcp-server/src/server.ts +99 -1
  261. package/packages/mcp-server/src/session-manager.ts +2 -2
  262. package/packages/mcp-server/src/types.ts +7 -18
  263. package/packages/mcp-server/src/workflow-tools.ts +2 -40
  264. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  265. package/packages/native/package.json +1 -1
  266. package/packages/pi-agent-core/package.json +1 -1
  267. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  268. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  270. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  271. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models/index.js +8 -0
  273. package/packages/pi-ai/dist/models/index.js.map +1 -1
  274. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  275. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  276. package/packages/pi-ai/dist/providers/fake.js +319 -0
  277. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  278. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  279. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  280. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  281. package/packages/pi-ai/package.json +1 -1
  282. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  283. package/packages/pi-ai/src/models/index.ts +9 -0
  284. package/packages/pi-ai/src/providers/fake.ts +376 -0
  285. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  286. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  287. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  289. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  291. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  293. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  296. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +22 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +8 -8
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +48 -15
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  335. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  336. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  342. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  347. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  352. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  353. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  354. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +27 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  356. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  357. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  359. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  360. package/packages/pi-coding-agent/package.json +2 -1
  361. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  362. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  363. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  364. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +37 -2
  365. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  366. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  367. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +8 -8
  368. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  369. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  370. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +50 -15
  371. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  372. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -0
  373. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  374. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  375. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
  376. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  377. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  378. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  379. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  380. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +40 -0
  381. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  383. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  384. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  385. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  386. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  387. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  388. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  389. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  390. package/packages/pi-tui/dist/index.d.ts +1 -0
  391. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  392. package/packages/pi-tui/dist/index.js +2 -0
  393. package/packages/pi-tui/dist/index.js.map +1 -1
  394. package/packages/pi-tui/dist/style.d.ts +41 -0
  395. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  396. package/packages/pi-tui/dist/style.js +158 -0
  397. package/packages/pi-tui/dist/style.js.map +1 -0
  398. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  399. package/packages/pi-tui/dist/tui.js +1 -0
  400. package/packages/pi-tui/dist/tui.js.map +1 -1
  401. package/packages/pi-tui/package.json +1 -1
  402. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  403. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  404. package/packages/pi-tui/src/index.ts +9 -0
  405. package/packages/pi-tui/src/style.ts +225 -0
  406. package/packages/pi-tui/src/tui.ts +1 -0
  407. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  408. package/packages/rpc-client/README.md +3 -3
  409. package/packages/rpc-client/dist/index.d.ts +1 -1
  410. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  411. package/packages/rpc-client/dist/index.js.map +1 -1
  412. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  413. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  414. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  415. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  416. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  417. package/packages/rpc-client/dist/rpc-types.js +3 -11
  418. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  419. package/packages/rpc-client/package.json +4 -1
  420. package/packages/rpc-client/src/index.ts +1 -1
  421. package/packages/rpc-client/src/rpc-client.ts +3 -6
  422. package/packages/rpc-client/src/rpc-types.ts +3 -398
  423. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  424. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  425. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  426. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  427. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  428. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  429. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  430. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  431. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  432. package/pkg/package.json +1 -1
  433. package/src/resources/extensions/github-sync/templates.ts +93 -88
  434. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  435. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  436. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  437. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  438. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  439. package/src/resources/extensions/gsd/auto/loop.ts +416 -596
  440. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  441. package/src/resources/extensions/gsd/auto/phases.ts +82 -8
  442. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  443. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  444. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  445. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  446. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  447. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  448. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  449. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  450. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  451. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  452. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  453. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  454. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  455. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  456. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  457. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  458. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  459. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  460. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  461. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  462. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  463. package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
  464. package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
  465. package/src/resources/extensions/gsd/auto-recovery.ts +67 -53
  466. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  467. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  468. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  469. package/src/resources/extensions/gsd/auto.ts +167 -1
  470. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
  471. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  472. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +30 -6
  473. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  474. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  475. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  476. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  477. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  478. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  479. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  480. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  481. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  482. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  483. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  484. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  485. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  486. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  487. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  488. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  489. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  490. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  491. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  492. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  493. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  494. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  495. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  496. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  497. package/src/resources/extensions/gsd/escalation.ts +3 -1
  498. package/src/resources/extensions/gsd/graph.ts +12 -5
  499. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  500. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  501. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  502. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  503. package/src/resources/extensions/gsd/model-router.ts +10 -6
  504. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  505. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  506. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  507. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  508. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  509. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  510. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  511. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  512. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  513. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  514. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  515. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  516. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  517. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  518. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  519. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  520. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  521. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  522. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  523. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  524. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  525. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  526. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  527. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  528. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  529. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  530. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  531. package/src/resources/extensions/gsd/state.ts +6 -3
  532. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
  533. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
  534. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
  535. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  536. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  537. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +45 -0
  538. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  539. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  540. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  541. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  542. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  543. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  544. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  545. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
  546. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  547. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  548. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  549. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  550. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  551. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  552. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  553. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  554. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  555. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  556. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  557. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  558. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  559. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  560. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  561. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  562. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  563. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  564. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  565. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  566. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  567. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  568. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  569. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  570. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  571. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  572. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  573. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  574. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  575. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  576. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  577. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  578. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  579. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  580. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  581. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  582. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  583. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  584. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  585. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  586. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  587. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  588. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  589. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  590. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  591. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  592. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  593. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  594. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  595. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  596. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  597. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  598. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  599. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  600. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  601. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  602. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
  603. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  604. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  605. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  606. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  607. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  608. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  609. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  610. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  611. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  612. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  613. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  614. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  615. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  616. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  617. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  618. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  619. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  620. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  621. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  622. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
  623. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  624. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  625. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  626. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  627. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  628. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  629. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  630. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  631. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
  632. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  633. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  634. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  635. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  636. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  637. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  638. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  639. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  640. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  641. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  642. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  643. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → CaMwumvGbBPZrJicfsCzV}/_buildManifest.js +0 -0
  644. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → CaMwumvGbBPZrJicfsCzV}/_ssgManifest.js +0 -0
@@ -1,3 +1,5 @@
1
+ // GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
2
+
1
3
  import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
2
4
 
3
5
  import { logWarning } from "../workflow-logger.js";
@@ -12,7 +14,7 @@ import { clearPathCache } from "../paths.js";
12
14
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
13
15
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
14
16
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
15
- import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
17
+ import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
16
18
  import { resolveModelId } from "../auto-model-selection.js";
17
19
  import { resolveProjectRoot } from "../worktree.js";
18
20
  import { clearDiscussionFlowState } from "./write-gate.js";
@@ -56,6 +58,24 @@ function resolveAgentEndBasePath(): string | undefined {
56
58
  }
57
59
  }
58
60
 
61
+ export function _buildAbortedPauseContext(lastMsg: { errorMessage?: unknown }): {
62
+ message: string;
63
+ category: "aborted";
64
+ isTransient: true;
65
+ } {
66
+ const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
67
+ return {
68
+ message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
69
+ category: "aborted",
70
+ isTransient: true,
71
+ };
72
+ }
73
+
74
+ export function isUserInitiatedAbortMessage(message: string | undefined | null): boolean {
75
+ if (!message) return false;
76
+ return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
77
+ }
78
+
59
79
  async function pauseTransientWithBackoff(
60
80
  cls: ErrorClass,
61
81
  pi: ExtensionAPI,
@@ -159,7 +179,7 @@ export async function handleAgentEnd(
159
179
  return;
160
180
  }
161
181
 
162
- await pauseAuto(ctx, pi);
182
+ await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg as { errorMessage?: unknown }));
163
183
  return;
164
184
  }
165
185
  if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
@@ -167,6 +187,14 @@ export async function handleAgentEnd(
167
187
  // is in the assistant message text content. Fall back to content when
168
188
  // errorMessage looks uninformative.
169
189
  const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
190
+ if (isUserInitiatedAbortMessage(rawErrorMsg)) {
191
+ resolveAgentEndCancelled({
192
+ message: rawErrorMsg,
193
+ category: "aborted",
194
+ isTransient: false,
195
+ });
196
+ return;
197
+ }
170
198
  const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
171
199
  // #3588: When errorMessage is uninformative, extract the real error from
172
200
  // 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 type { ExtensionAPI } from "@gsd/pi-coding-agent";
3
5
  import { Text } from "@gsd/pi-tui";
@@ -8,6 +10,7 @@ import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./
8
10
  import { StringEnum } from "@gsd/pi-ai";
9
11
  import { logError } from "../workflow-logger.js";
10
12
  import { getErrorMessage } from "../error-utils.js";
13
+ import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
11
14
 
12
15
  async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow-tool-executors.js")> {
13
16
  return import("../tools/workflow-tool-executors.js");
@@ -19,11 +22,19 @@ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow
19
22
  */
20
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
21
24
  function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canonicalName: string): void {
25
+ const execute = typeof toolDef.execute === "function"
26
+ ? async (...args: any[]) => {
27
+ incrementLegacyTelemetry("legacy.mcpAliasUsed");
28
+ return toolDef.execute(...args);
29
+ }
30
+ : toolDef.execute;
31
+
22
32
  pi.registerTool({
23
33
  ...toolDef,
24
34
  name: aliasName,
25
35
  description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
26
36
  promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
37
+ execute,
27
38
  });
28
39
  }
29
40
 
@@ -7,7 +7,7 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
7
7
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
8
8
 
9
9
  import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
10
- import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
10
+ import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
11
11
  import { resolveManifest } from "../unit-context-manifest.js";
12
12
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
13
13
  import { loadFile, saveFile, formatContinue } from "../files.js";
@@ -22,6 +22,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
22
22
  import { installNotifyInterceptor } from "./notify-interceptor.js";
23
23
  import { initNotificationStore } from "../notification-store.js";
24
24
  import { initNotificationWidget } from "../notification-widget.js";
25
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
25
26
  import { extractSubagentAgentClasses } from "./subagent-input.js";
26
27
  import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
27
28
 
@@ -64,6 +65,16 @@ async function applyDisabledModelProviderPolicy(ctx: ExtensionContext): Promise<
64
65
  }
65
66
  }
66
67
 
68
+ export function resolveNotificationStoreBasePath(cwd: string = process.cwd()): string {
69
+ return resolveWorktreeProjectRoot(cwd);
70
+ }
71
+
72
+ function initSessionNotifications(ctx: ExtensionContext): void {
73
+ initNotificationStore(resolveNotificationStoreBasePath());
74
+ installNotifyInterceptor(ctx);
75
+ initNotificationWidget(ctx);
76
+ }
77
+
67
78
  async function writeContextModeCompactionSnapshot(basePath: string): Promise<void> {
68
79
  try {
69
80
  const { loadEffectiveGSDPreferences } = await import("../preferences.js");
@@ -101,9 +112,7 @@ export function registerHooks(
101
112
  ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
102
113
  ): void {
103
114
  pi.on("session_start", async (_event, ctx) => {
104
- initNotificationStore(process.cwd());
105
- installNotifyInterceptor(ctx);
106
- initNotificationWidget(ctx);
115
+ initSessionNotifications(ctx);
107
116
  if (!isAutoActive()) {
108
117
  const { initHealthWidget } = await import("../health-widget.js");
109
118
  initHealthWidget(ctx);
@@ -156,8 +165,7 @@ export function registerHooks(
156
165
  });
157
166
 
158
167
  pi.on("session_switch", async (_event, ctx) => {
159
- initNotificationStore(process.cwd());
160
- installNotifyInterceptor(ctx);
168
+ initSessionNotifications(ctx);
161
169
  resetWriteGateState(process.cwd());
162
170
  resetToolCallLoopGuard();
163
171
  await resetAskUserQuestionsTurnCache();
@@ -474,6 +482,22 @@ export function registerHooks(
474
482
  }
475
483
  }
476
484
 
485
+ // ── Worktree-isolation write gate (#5199) ────────────────────────────
486
+ // Block planning-write tools from landing code at the project root when
487
+ // git.isolation=worktree but auto-mode hasn't created the milestone
488
+ // worktree yet. Without this, writes silently orphan outside git history.
489
+ if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
490
+ const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
491
+ const wtGuard = shouldBlockWorktreeWrite(
492
+ event.toolName,
493
+ event.input.path,
494
+ wtBasePath,
495
+ isAutoActive(),
496
+ dash.currentUnit?.type,
497
+ );
498
+ if (wtGuard.block) return wtGuard;
499
+ }
500
+
477
501
  // ── Single-writer engine: block direct writes to STATE.md ──────────
478
502
  // Covers write, edit, and bash tools to prevent bypass vectors.
479
503
  if (isToolCallEventType("write", event)) {
@@ -1,10 +1,12 @@
1
- import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
2
2
  import { isAbsolute, join, relative, resolve, sep } from "node:path";
3
3
 
4
4
  import { minimatch } from "minimatch";
5
5
 
6
+ import { getIsolationMode } from "../preferences.js";
6
7
  import type { ToolsPolicy } from "../unit-context-manifest.js";
7
8
  import { logWarning } from "../workflow-logger.js";
9
+ import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
8
10
 
9
11
  /**
10
12
  * Regex matching milestone CONTEXT.md file names in both legacy M001
@@ -882,3 +884,135 @@ export function shouldBlockPlanningUnit(
882
884
  // avoids breaking gsd_* MCP tools or future safe additions.
883
885
  return { block: false };
884
886
  }
887
+
888
+ // ─── Worktree isolation write gate (#5199) ────────────────────────────────
889
+ //
890
+ // When `git.isolation: worktree` is configured, the per-unit commit pipeline
891
+ // only runs inside the auto-mode loop (`auto-post-unit.ts`). If the LLM
892
+ // authors code at the project root before auto-mode is started, those writes
893
+ // land in the working tree but never reach a commit — they're silently
894
+ // orphaned outside git history. This guard blocks those writes at the
895
+ // tool_call seam so the agent receives a clear error instead.
896
+
897
+ const WORKTREE_GATE_BOOTSTRAP_UNITS = new Set([
898
+ "discuss-milestone",
899
+ "plan-milestone",
900
+ "init",
901
+ ]);
902
+
903
+ function realpathOrResolve(p: string): string {
904
+ const abs = resolve(p);
905
+ try {
906
+ return realpathSync(abs);
907
+ } catch {
908
+ // Path doesn't exist (yet) — realpath the deepest existing ancestor so
909
+ // platforms where /tmp -> /private/tmp don't break containment checks.
910
+ let dir = abs;
911
+ const tail: string[] = [];
912
+ while (dir && dir !== resolve(dir, "..")) {
913
+ try {
914
+ const real = realpathSync(dir);
915
+ return tail.length ? join(real, ...tail.reverse()) : real;
916
+ } catch {
917
+ const idx = dir.lastIndexOf(sep);
918
+ if (idx <= 0) break;
919
+ tail.push(dir.slice(idx + 1));
920
+ dir = dir.slice(0, idx) || sep;
921
+ }
922
+ }
923
+ return abs;
924
+ }
925
+ }
926
+
927
+ function isPathContained(target: string, container: string): boolean {
928
+ if (target === container) return true;
929
+ return target.startsWith(container.endsWith(sep) ? container : container + sep);
930
+ }
931
+
932
+ /**
933
+ * Block planning-write tool calls that would land code at the project root
934
+ * while `git.isolation: worktree` is in effect and auto-mode hasn't created
935
+ * (or flipped cwd into) the milestone worktree.
936
+ *
937
+ * Pure / unit-testable. Callers in `register-hooks.ts` supply the resolved
938
+ * project root and current auto liveness; this function does no I/O beyond
939
+ * realpath resolution.
940
+ *
941
+ * Allow rules (in order):
942
+ * 1. Tool isn't a planning-write (write/edit/multi_edit/notebook_edit).
943
+ * 2. `GSD_DISABLE_WORKTREE_WRITE_GUARD=1` self-hosting bypass.
944
+ * 3. Isolation mode is not "worktree".
945
+ * 4. Active unit is a bootstrap unit (discuss-milestone/plan-milestone/init).
946
+ * 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
947
+ * 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
948
+ * worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
949
+ * 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
950
+ *
951
+ * Otherwise: block with a message that points the agent at `/gsd` to start
952
+ * auto-mode.
953
+ */
954
+ export function shouldBlockWorktreeWrite(
955
+ toolName: string,
956
+ targetPath: string,
957
+ effectiveBasePath: string,
958
+ isAutoLive: boolean,
959
+ currentUnitType?: string | null,
960
+ ): { block: boolean; reason?: string } {
961
+ const tool = canonicalToolName(toolName);
962
+ if (!PLANNING_WRITE_TOOLS.has(tool)) return { block: false };
963
+ if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1") return { block: false };
964
+ if (getIsolationMode(effectiveBasePath) !== "worktree") return { block: false };
965
+ if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType)) return { block: false };
966
+
967
+ if (!targetPath) {
968
+ return {
969
+ block: true,
970
+ reason: [
971
+ `HARD BLOCK: ${tool} called with empty path while \`git.isolation: worktree\` is configured`,
972
+ `and auto-mode is not active. Refusing to allow writes that cannot be located.`,
973
+ ].join(" "),
974
+ };
975
+ }
976
+
977
+ // Resolve the target relative to the project root, then realpath to defeat
978
+ // symlink-based escapes and prefix tricks (e.g. .gsd/worktrees-extra/).
979
+ const projectRoot = resolveWorktreeProjectRoot(effectiveBasePath);
980
+ const absTarget = isAbsolute(targetPath) ? targetPath : resolve(projectRoot, targetPath);
981
+ const realTarget = realpathOrResolve(absTarget);
982
+ const realRoot = realpathOrResolve(projectRoot);
983
+ const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
984
+ const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
985
+
986
+ // Allow writes inside the legitimate worktrees subtree.
987
+ if (isPathContained(realTarget, realWorktreesDir)) return { block: false };
988
+
989
+ // Allow writes to .gsd/ planning artifacts, but reject siblings whose name
990
+ // starts with "worktrees" (the worktrees-extra prefix trick — case 4).
991
+ if (isPathContained(realTarget, realGsd)) {
992
+ const rel = relative(realGsd, realTarget);
993
+ const firstSeg = rel.split(/[\/\\]/)[0] ?? "";
994
+ if (!firstSeg.startsWith("worktrees")) return { block: false };
995
+ // fall through: looks like worktrees<something> sibling — block
996
+ }
997
+
998
+ // Auto is live and the caller is operating inside a worktree path —
999
+ // host tool's write happens in worktree context; let it through.
1000
+ if (isAutoLive && isGsdWorktreePath(effectiveBasePath)) return { block: false };
1001
+
1002
+ // Block. Provide enough context that the agent can self-correct.
1003
+ const displayTarget = isPathContained(realTarget, realRoot)
1004
+ ? relative(realRoot, realTarget) || "."
1005
+ : realTarget;
1006
+ return {
1007
+ block: true,
1008
+ reason: [
1009
+ `HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
1010
+ `not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
1011
+ `Code edits at the project root would be lost — only the auto-mode commit pipeline`,
1012
+ `(auto-post-unit) commits work, and it never runs outside the loop.`,
1013
+ `Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
1014
+ `then write inside it. To disable this guard for self-hosting development, set`,
1015
+ `GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
1016
+ ].join(" "),
1017
+ };
1018
+ }
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Ship command for creating pull requests from GSD milestone evidence.
3
+
1
4
  /**
2
5
  * GSD Command — /gsd ship
3
6
  *
@@ -18,6 +21,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
18
21
  import { formatDuration } from "../shared/format-utils.js";
19
22
  import { parseEvalReviewFrontmatter, type Verdict } from "./eval-review-schema.js";
20
23
  import { currentDirectoryRoot } from "./commands/context.js";
24
+ import { buildPrEvidence } from "./pr-evidence.js";
21
25
 
22
26
  function git(basePath: string, args: readonly string[]): string {
23
27
  return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
@@ -32,11 +36,6 @@ function isValidRefName(name: string): boolean {
32
36
  }
33
37
  }
34
38
 
35
- interface PRContent {
36
- title: string;
37
- body: string;
38
- }
39
-
40
39
  function listSliceIds(basePath: string, milestoneId: string): string[] {
41
40
  // Slices live at <milestoneDir>/slices/<sliceId>/ with canonical S\d+ IDs.
42
41
  // Use resolveSlicePath with a probe to find the real slices directory root.
@@ -148,74 +147,48 @@ export async function checkSliceEvalReview(
148
147
  };
149
148
  }
150
149
 
151
- function generatePRContent(basePath: string, milestoneId: string, milestoneTitle: string): PRContent {
152
- const title = `feat: ${milestoneTitle || milestoneId}`;
153
-
154
- const sections: string[] = [];
155
-
156
- // TL;DR
157
- sections.push("## TL;DR\n");
158
- sections.push(`**What:** Ship milestone ${milestoneId} — ${milestoneTitle || "(untitled)"}`);
159
- sections.push(`**Why:** Milestone work complete, ready for review.`);
160
- sections.push(`**How:** See slice summaries below.\n`);
161
-
162
- // What — slice summaries
150
+ function generatePRContent(basePath: string, milestoneId: string, milestoneTitle: string) {
163
151
  const summaries = collectSliceSummaries(basePath, milestoneId);
164
- if (summaries.length > 0) {
165
- sections.push("## What\n");
166
- sections.push(summaries.join("\n\n"));
167
- sections.push("");
168
- }
169
-
170
- // Roadmap status
152
+ const roadmapItems: string[] = [];
171
153
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
172
154
  if (roadmapPath && existsSync(roadmapPath)) {
173
155
  try {
174
156
  const roadmap = readFileSync(roadmapPath, "utf-8");
175
157
  const checkboxLines = roadmap.split("\n").filter((l) => /^\s*-\s*\[[ x]\]/.test(l));
176
- if (checkboxLines.length > 0) {
177
- sections.push("## Roadmap\n");
178
- sections.push(checkboxLines.join("\n"));
179
- sections.push("");
180
- }
158
+ roadmapItems.push(...checkboxLines);
181
159
  } catch {
182
160
  // non-fatal
183
161
  }
184
162
  }
185
163
 
186
- // Metrics
164
+ const metrics: string[] = [];
187
165
  const ledger = getLedger();
188
166
  const units = ledger?.units ?? loadLedgerFromDisk(basePath)?.units ?? [];
189
167
  if (units.length > 0) {
190
168
  const totals = getProjectTotals(units);
191
169
  const byModel = aggregateByModel(units);
192
- sections.push("## Metrics\n");
193
- sections.push(`- **Units executed:** ${units.length}`);
194
- sections.push(`- **Total cost:** ${formatCost(totals.cost)}`);
195
- sections.push(`- **Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
170
+ metrics.push(`**Units executed:** ${units.length}`);
171
+ metrics.push(`**Total cost:** ${formatCost(totals.cost)}`);
172
+ metrics.push(`**Tokens:** ${formatTokenCount(totals.tokens.input)} input / ${formatTokenCount(totals.tokens.output)} output`);
196
173
  if (totals.duration > 0) {
197
- sections.push(`- **Duration:** ${formatDuration(totals.duration)}`);
174
+ metrics.push(`**Duration:** ${formatDuration(totals.duration)}`);
198
175
  }
199
176
  if (byModel.length > 0) {
200
- sections.push(`- **Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
177
+ metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
201
178
  }
202
- sections.push("");
203
179
  }
204
180
 
205
- // Change type checklist
206
- sections.push("## Change type\n");
207
- sections.push("- [x] `feat` — New feature or capability");
208
- sections.push("- [ ] `fix` — Bug fix");
209
- sections.push("- [ ] `refactor` — Code restructuring");
210
- sections.push("- [ ] `test` — Adding or updating tests");
211
- sections.push("- [ ] `docs` — Documentation only");
212
- sections.push("- [ ] `chore` Build, CI, or tooling changes\n");
213
-
214
- // AI disclosure
215
- sections.push("---\n");
216
- sections.push("*This PR was prepared with AI assistance (GSD auto-mode).*");
217
-
218
- return { title, body: sections.join("\n") };
181
+ return buildPrEvidence({
182
+ milestoneId,
183
+ milestoneTitle,
184
+ changeType: "feat",
185
+ summaries,
186
+ roadmapItems,
187
+ metrics,
188
+ testsRun: ["Run `npm run verify:pr` before marking this PR ready."],
189
+ rollbackNotes: ["Revert the merge commit or close the PR before merge if review finds a regression."],
190
+ how: "Generated from GSD milestone slice summaries, roadmap status, and local metrics.",
191
+ });
219
192
  }
220
193
 
221
194
  export async function handleShip(
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Workflow template commands for starting, listing, and dispatching workflows.
3
+
1
4
  /**
2
5
  * GSD Workflow Template Commands — /gsd start, /gsd templates
3
6
  *
@@ -15,6 +18,7 @@ import {
15
18
  getTemplateInfo,
16
19
  loadWorkflowTemplate,
17
20
  loadRegistry,
21
+ isLegacyWorkflowMode,
18
22
  type TemplateMatch,
19
23
  } from "./workflow-templates.js";
20
24
  import { loadPrompt } from "./prompt-loader.js";
@@ -24,6 +28,8 @@ import { isAutoActive, isAutoPaused } from "./auto.js";
24
28
  import { getErrorMessage } from "./error-utils.js";
25
29
  import { resolvePlugin, type WorkflowPlugin } from "./workflow-plugins.js";
26
30
  import { currentDirectoryRoot } from "./commands/context.js";
31
+ import { formatRecommendedProcessPaths } from "./process-task-path.js";
32
+ import { incrementLegacyTelemetry } from "./legacy-telemetry.js";
27
33
 
28
34
  // ─── Helpers ─────────────────────────────────────────────────────────────────
29
35
 
@@ -328,6 +334,9 @@ export async function handleStart(
328
334
  " /gsd start bugfix fix login button not responding\n" +
329
335
  " /gsd start spike evaluate auth libraries\n" +
330
336
  " /gsd start hotfix critical: API returns 500\n\n" +
337
+ "Recommended task paths:\n" +
338
+ formatRecommendedProcessPaths() +
339
+ "\n\n" +
331
340
  "Flags:\n" +
332
341
  " --dry-run Preview what would happen without executing\n" +
333
342
  " --issue <ref> Link to a GitHub issue\n\n" +
@@ -484,6 +493,9 @@ export async function handleStart(
484
493
  if (artifactDir) infoLines.push(`Artifacts: ${artifactDir}`);
485
494
  infoLines.push(`Branch: ${actualBranch}`);
486
495
  ctx.ui.notify(infoLines.join("\n"), "info");
496
+ if (isLegacyWorkflowMode(template.mode)) {
497
+ incrementLegacyTelemetry("legacy.workflowEngineUsed");
498
+ }
487
499
 
488
500
  const prompt = loadPrompt("workflow-start", {
489
501
  templateId,
@@ -649,6 +661,7 @@ export function dispatchMarkdownPhasePlugin(
649
661
  if (artifactDir) infoLines.push(`Artifacts: ${artifactDir}`);
650
662
  infoLines.push(`Branch: ${actualBranch}`);
651
663
  ctx.ui.notify(infoLines.join("\n"), "info");
664
+ incrementLegacyTelemetry("legacy.workflowEngineUsed");
652
665
 
653
666
  const prompt = loadPrompt("workflow-start", {
654
667
  templateId,
@@ -1,19 +1,11 @@
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
 
13
4
  import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
14
5
  import { basename, dirname, join } from 'node:path';
15
6
  import { parse as parseYaml } from 'yaml';
16
7
  import { parseFrontmatter } from '@gsd/pi-coding-agent';
8
+ import { incrementLegacyTelemetry } from './legacy-telemetry.js';
17
9
  import type {
18
10
  Component,
19
11
  ComponentApiVersion,
@@ -270,6 +262,7 @@ function loadFromLegacySkill(
270
262
  enabled: true,
271
263
  };
272
264
 
265
+ incrementLegacyTelemetry('legacy.componentFormatUsed');
273
266
  return { component, diagnostics };
274
267
  }
275
268
 
@@ -345,6 +338,7 @@ function loadFromLegacyAgent(
345
338
  enabled: true,
346
339
  };
347
340
 
341
+ incrementLegacyTelemetry('legacy.componentFormatUsed');
348
342
  return { component, diagnostics };
349
343
  }
350
344
 
@@ -29,6 +29,7 @@ import {
29
29
  markStepActive,
30
30
  markStepComplete,
31
31
  expandIteration,
32
+ isTerminalStepStatus,
32
33
  type WorkflowGraph,
33
34
  } from "./graph.js";
34
35
  import { injectContext } from "./context-injector.js";
@@ -40,6 +41,24 @@ import { withFileLock } from "./file-lock.js";
40
41
  // Re-export for downstream consumers
41
42
  export { readFrozenDefinition } from "./definition-io.js";
42
43
 
44
+ function formatBlockedWorkflowReason(graph: WorkflowGraph): string {
45
+ const statusById = new Map(graph.steps.map((step) => [step.id, step.status]));
46
+ const blockedSteps = graph.steps
47
+ .filter((step) => step.status === "pending")
48
+ .map((step) => {
49
+ const blockers = step.dependsOn
50
+ .filter((depId) => !isTerminalStepStatus(statusById.get(depId)))
51
+ .map((depId) => `${depId} (${statusById.get(depId) ?? "missing"})`);
52
+ return blockers.length > 0
53
+ ? `${step.id} waiting on ${blockers.join(", ")}`
54
+ : `${step.id} has no runnable dependency path`;
55
+ });
56
+
57
+ return blockedSteps.length > 0
58
+ ? `Workflow blocked: no pending steps are ready. Blocked steps: ${blockedSteps.join("; ")}`
59
+ : "Workflow blocked: no pending steps are ready.";
60
+ }
61
+
43
62
  export class CustomWorkflowEngine implements WorkflowEngine {
44
63
  readonly engineId = "custom";
45
64
  private readonly runDir: string;
@@ -110,6 +129,16 @@ export class CustomWorkflowEngine implements WorkflowEngine {
110
129
  let next = getNextPendingStep(graph);
111
130
 
112
131
  if (!next) {
132
+ const allDone = graph.steps.every(
133
+ (step) => step.status === "complete" || step.status === "expanded",
134
+ );
135
+ if (!allDone) {
136
+ return {
137
+ action: "stop",
138
+ reason: formatBlockedWorkflowReason(graph),
139
+ level: "error",
140
+ };
141
+ }
113
142
  return {
114
143
  action: "stop",
115
144
  reason: "All steps complete",
@@ -0,0 +1,75 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Normalized SQLite adapter wrapper used by the GSD database facade.
3
+
4
+ export interface DbStatement {
5
+ run(...params: unknown[]): unknown;
6
+ get(...params: unknown[]): Record<string, unknown> | undefined;
7
+ all(...params: unknown[]): Record<string, unknown>[];
8
+ }
9
+
10
+ export interface DbAdapter {
11
+ exec(sql: string): void;
12
+ prepare(sql: string): DbStatement;
13
+ close(): void;
14
+ }
15
+
16
+ export function normalizeDbRow(row: unknown): Record<string, unknown> | undefined {
17
+ if (row == null) return undefined;
18
+ if (Object.getPrototypeOf(row) === null) {
19
+ return { ...(row as Record<string, unknown>) };
20
+ }
21
+ return row as Record<string, unknown>;
22
+ }
23
+
24
+ export function normalizeDbRows(rows: unknown[]): Record<string, unknown>[] {
25
+ return rows.map((row) => normalizeDbRow(row)!);
26
+ }
27
+
28
+ export function createDbAdapter(rawDb: unknown): DbAdapter {
29
+ const db = rawDb as {
30
+ exec(sql: string): void;
31
+ prepare(sql: string): {
32
+ run(...args: unknown[]): unknown;
33
+ get(...args: unknown[]): unknown;
34
+ all(...args: unknown[]): unknown[];
35
+ };
36
+ close(): void;
37
+ };
38
+
39
+ const stmtCache = new Map<string, DbStatement>();
40
+
41
+ function wrapStmt(raw: {
42
+ run(...args: unknown[]): unknown;
43
+ get(...args: unknown[]): unknown;
44
+ all(...args: unknown[]): unknown[];
45
+ }): DbStatement {
46
+ return {
47
+ run(...params: unknown[]): unknown {
48
+ return raw.run(...params);
49
+ },
50
+ get(...params: unknown[]): Record<string, unknown> | undefined {
51
+ return normalizeDbRow(raw.get(...params));
52
+ },
53
+ all(...params: unknown[]): Record<string, unknown>[] {
54
+ return normalizeDbRows(raw.all(...params));
55
+ },
56
+ };
57
+ }
58
+
59
+ return {
60
+ exec(sql: string): void {
61
+ db.exec(sql);
62
+ },
63
+ prepare(sql: string): DbStatement {
64
+ let cached = stmtCache.get(sql);
65
+ if (cached) return cached;
66
+ cached = wrapStmt(db.prepare(sql));
67
+ stmtCache.set(sql, cached);
68
+ return cached;
69
+ },
70
+ close(): void {
71
+ stmtCache.clear();
72
+ db.close();
73
+ },
74
+ };
75
+ }