gsd-pi 2.49.0 → 2.50.0-dev.d210a87

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 (679) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +26 -0
  3. package/dist/headless-ui.js +12 -2
  4. package/dist/headless.js +29 -13
  5. package/dist/loader.js +4 -0
  6. package/dist/resource-loader.d.ts +4 -1
  7. package/dist/resource-loader.js +138 -3
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +3 -1
  9. package/dist/resources/extensions/bg-shell/interaction.js +3 -1
  10. package/dist/resources/extensions/bg-shell/process-manager.js +4 -1
  11. package/dist/resources/extensions/claude-code-cli/partial-builder.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/infra-errors.js +1 -0
  13. package/dist/resources/extensions/gsd/auto/phases.js +27 -12
  14. package/dist/resources/extensions/gsd/auto/resolve.js +2 -2
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -2
  16. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  17. package/dist/resources/extensions/gsd/auto-artifact-paths.js +8 -10
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +28 -6
  19. package/dist/resources/extensions/gsd/auto-dispatch.js +113 -74
  20. package/dist/resources/extensions/gsd/auto-observability.js +54 -0
  21. package/dist/resources/extensions/gsd/auto-post-unit.js +53 -99
  22. package/dist/resources/extensions/gsd/auto-prompts.js +155 -17
  23. package/dist/resources/extensions/gsd/auto-recovery.js +79 -205
  24. package/dist/resources/extensions/gsd/auto-start.js +4 -31
  25. package/dist/resources/extensions/gsd/auto-timers.js +2 -2
  26. package/dist/resources/extensions/gsd/auto-utils.js +20 -0
  27. package/dist/resources/extensions/gsd/auto-verification.js +4 -7
  28. package/dist/resources/extensions/gsd/auto-worktree.js +257 -113
  29. package/dist/resources/extensions/gsd/auto.js +22 -10
  30. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -0
  31. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +24 -1
  32. package/dist/resources/extensions/gsd/branch-patterns.js +13 -0
  33. package/dist/resources/extensions/gsd/crash-recovery.js +6 -2
  34. package/dist/resources/extensions/gsd/custom-execution-policy.js +3 -2
  35. package/dist/resources/extensions/gsd/custom-verification.js +3 -1
  36. package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -2
  37. package/dist/resources/extensions/gsd/dashboard-overlay.js +4 -0
  38. package/dist/resources/extensions/gsd/detection.js +589 -3
  39. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -1
  40. package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  41. package/dist/resources/extensions/gsd/doctor-checks.js +5 -1234
  42. package/dist/resources/extensions/gsd/doctor-engine-checks.js +168 -0
  43. package/dist/resources/extensions/gsd/doctor-environment.js +28 -7
  44. package/dist/resources/extensions/gsd/doctor-git-checks.js +405 -0
  45. package/dist/resources/extensions/gsd/doctor-global-checks.js +74 -0
  46. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +600 -0
  47. package/dist/resources/extensions/gsd/doctor.js +9 -1
  48. package/dist/resources/extensions/gsd/extension-manifest.json +1 -1
  49. package/dist/resources/extensions/gsd/files.js +5 -1
  50. package/dist/resources/extensions/gsd/git-service.js +9 -10
  51. package/dist/resources/extensions/gsd/gsd-db.js +124 -1
  52. package/dist/resources/extensions/gsd/guided-flow-queue.js +10 -11
  53. package/dist/resources/extensions/gsd/guided-flow.js +10 -0
  54. package/dist/resources/extensions/gsd/init-wizard.js +9 -1
  55. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -5
  56. package/dist/resources/extensions/gsd/model-router.js +25 -0
  57. package/dist/resources/extensions/gsd/notifications.js +23 -0
  58. package/dist/resources/extensions/gsd/observability-validator.js +422 -0
  59. package/dist/resources/extensions/gsd/preferences-skills.js +11 -5
  60. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  61. package/dist/resources/extensions/gsd/preferences-validation.js +64 -0
  62. package/dist/resources/extensions/gsd/preferences.js +3 -0
  63. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
  64. package/dist/resources/extensions/gsd/prompts/complete-slice.md +9 -8
  65. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -13
  66. package/dist/resources/extensions/gsd/prompts/forensics.md +19 -8
  67. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
  68. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  69. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  70. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  71. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  72. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  73. package/dist/resources/extensions/gsd/prompts/plan-slice.md +8 -3
  74. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
  75. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  77. package/dist/resources/extensions/gsd/provider-error-pause.js +8 -0
  78. package/dist/resources/extensions/gsd/repo-identity.js +29 -0
  79. package/dist/resources/extensions/gsd/roadmap-mutations.js +110 -0
  80. package/dist/resources/extensions/gsd/roadmap-slices.js +2 -2
  81. package/dist/resources/extensions/gsd/rtk-status.js +43 -0
  82. package/dist/resources/extensions/gsd/rule-registry.js +10 -11
  83. package/dist/resources/extensions/gsd/session-forensics.js +13 -14
  84. package/dist/resources/extensions/gsd/session-lock.js +67 -56
  85. package/dist/resources/extensions/gsd/skill-catalog.js +1026 -0
  86. package/dist/resources/extensions/gsd/skill-discovery.js +3 -2
  87. package/dist/resources/extensions/gsd/skill-health.js +2 -2
  88. package/dist/resources/extensions/gsd/skill-telemetry.js +15 -5
  89. package/dist/resources/extensions/gsd/state.js +51 -12
  90. package/dist/resources/extensions/gsd/templates/milestone-summary.md +8 -0
  91. package/dist/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  92. package/dist/resources/extensions/gsd/templates/plan.md +16 -0
  93. package/dist/resources/extensions/gsd/templates/preferences.md +2 -0
  94. package/dist/resources/extensions/gsd/templates/roadmap.md +13 -0
  95. package/dist/resources/extensions/gsd/templates/slice-summary.md +9 -0
  96. package/dist/resources/extensions/gsd/templates/task-plan.md +24 -0
  97. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  98. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -1
  99. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -3
  100. package/dist/resources/extensions/gsd/undo.js +8 -7
  101. package/dist/resources/extensions/gsd/unit-runtime.js +2 -1
  102. package/dist/resources/extensions/gsd/verdict-parser.js +84 -0
  103. package/dist/resources/extensions/gsd/verification-gate.js +3 -1
  104. package/dist/resources/extensions/gsd/worktree-resolver.js +24 -0
  105. package/dist/resources/extensions/gsd/worktree.js +3 -2
  106. package/dist/resources/extensions/remote-questions/config.js +3 -5
  107. package/dist/resources/extensions/search-the-web/native-search.js +8 -3
  108. package/dist/resources/extensions/search-the-web/tool-search.js +19 -2
  109. package/dist/resources/extensions/shared/rtk-session-stats.js +189 -0
  110. package/dist/resources/extensions/shared/rtk.js +100 -0
  111. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
  112. package/dist/rtk.d.ts +52 -0
  113. package/dist/rtk.js +332 -0
  114. package/dist/web/standalone/.next/BUILD_ID +1 -1
  115. package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -19
  116. package/dist/web/standalone/.next/build-manifest.json +4 -4
  117. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  118. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  119. package/dist/web/standalone/.next/required-server-files.json +3 -3
  120. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  121. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  122. package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  125. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  133. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/experimental/route.js +3 -0
  171. package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +1 -0
  172. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -0
  173. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/preferences/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -26
  213. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  222. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  243. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  246. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  252. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js.nft.json +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/index.html +1 -1
  267. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  268. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  270. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  272. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  273. package/dist/web/standalone/.next/server/app/page.js +2 -2
  274. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  275. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -19
  277. package/dist/web/standalone/.next/server/chunks/2229.js +12 -0
  278. package/dist/web/standalone/.next/server/chunks/2331.js +25 -0
  279. package/dist/web/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
  280. package/dist/web/standalone/.next/server/chunks/5822.js +2 -0
  281. package/dist/web/standalone/.next/server/chunks/7471.js +13 -0
  282. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  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 +3 -3
  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 +2 -2
  290. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  291. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  292. package/dist/web/standalone/.next/static/chunks/{485.243af25f0cdf50d6.js → 2008.817d0885545aaea9.js} +6 -6
  293. package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +9 -0
  294. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +1 -0
  295. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  296. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  299. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  300. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +1 -0
  301. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +1 -0
  302. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +1 -0
  303. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +1 -0
  304. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +1 -0
  305. package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +1 -0
  307. package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +1 -0
  308. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +1 -0
  309. package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +1 -0
  310. package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +1 -0
  311. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +1 -0
  312. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +1 -0
  313. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +1 -0
  314. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +1 -0
  315. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +1 -0
  316. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +1 -0
  317. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +1 -0
  318. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +1 -0
  319. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +1 -0
  320. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +1 -0
  321. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +1 -0
  322. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +1 -0
  323. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +1 -0
  324. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +1 -0
  325. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +1 -0
  326. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +1 -0
  327. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +1 -0
  328. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +1 -0
  329. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +1 -0
  330. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +1 -0
  331. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +1 -0
  332. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +1 -0
  333. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +1 -0
  334. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +1 -0
  335. package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +1 -0
  336. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +1 -0
  337. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  338. package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +1 -0
  339. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  340. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +1 -0
  341. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +1 -0
  342. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  343. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +1 -0
  344. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +1 -0
  345. package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +1 -0
  346. package/dist/web/standalone/.next/static/css/de141508b083f922.css +1 -0
  347. package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +1 -0
  348. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  349. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  350. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  351. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  352. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  353. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  354. package/dist/web/standalone/server.js +1 -1
  355. package/package.json +1 -1
  356. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  357. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  358. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  359. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  360. package/packages/pi-ai/dist/providers/openai-codex-responses.js +39 -10
  361. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  362. package/packages/pi-ai/dist/types.d.ts +1 -0
  363. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  364. package/packages/pi-ai/dist/types.js.map +1 -1
  365. package/packages/pi-ai/src/providers/openai-codex-responses.ts +39 -8
  366. package/packages/pi-ai/src/types.ts +1 -1
  367. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -0
  368. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -0
  370. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +3 -1
  372. package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/bash-executor.js +10 -1
  374. package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/blob-store.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/blob-store.js +8 -3
  377. package/packages/pi-coding-agent/dist/core/blob-store.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/discovery-cache.js +9 -2
  380. package/packages/pi-coding-agent/dist/core/discovery-cache.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  382. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
  385. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/core/extensions/runner.js +13 -0
  387. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +19 -1
  389. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
  392. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +8 -0
  393. package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/package-manager.js +8 -1
  396. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -1
  398. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/skills.d.ts +11 -1
  400. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/skills.js +30 -8
  402. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  405. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  406. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  407. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/index.js +1 -1
  409. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +3 -2
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -36
  415. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +5 -0
  417. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +12 -0
  419. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +2 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/rpc/jsonl.d.ts.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js +5 -0
  425. package/packages/pi-coding-agent/dist/modes/rpc/jsonl.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +0 -1
  428. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
  430. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  431. package/packages/pi-coding-agent/package.json +1 -1
  432. package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
  433. package/packages/pi-coding-agent/src/core/bash-executor.ts +10 -2
  434. package/packages/pi-coding-agent/src/core/blob-store.ts +6 -3
  435. package/packages/pi-coding-agent/src/core/discovery-cache.ts +9 -2
  436. package/packages/pi-coding-agent/src/core/extensions/index.ts +2 -0
  437. package/packages/pi-coding-agent/src/core/extensions/runner.ts +18 -0
  438. package/packages/pi-coding-agent/src/core/extensions/types.ts +21 -0
  439. package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +9 -0
  440. package/packages/pi-coding-agent/src/core/package-manager.ts +10 -1
  441. package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -1
  442. package/packages/pi-coding-agent/src/core/skills.ts +35 -10
  443. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  444. package/packages/pi-coding-agent/src/index.ts +4 -0
  445. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +3 -2
  446. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -36
  447. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +15 -0
  448. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +2 -1
  449. package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +6 -0
  450. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +0 -2
  451. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -2
  452. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  453. package/pkg/dist/modes/interactive/theme/themes.js +2 -1
  454. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  455. package/pkg/package.json +1 -1
  456. package/scripts/postinstall.js +163 -6
  457. package/src/resources/extensions/async-jobs/async-bash-tool.ts +3 -1
  458. package/src/resources/extensions/bg-shell/interaction.ts +3 -1
  459. package/src/resources/extensions/bg-shell/process-manager.ts +4 -1
  460. package/src/resources/extensions/claude-code-cli/partial-builder.ts +5 -0
  461. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +105 -0
  462. package/src/resources/extensions/gsd/auto/infra-errors.ts +1 -0
  463. package/src/resources/extensions/gsd/auto/phases.ts +25 -12
  464. package/src/resources/extensions/gsd/auto/resolve.ts +3 -3
  465. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -2
  466. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  467. package/src/resources/extensions/gsd/auto/types.ts +13 -0
  468. package/src/resources/extensions/gsd/auto-artifact-paths.ts +19 -21
  469. package/src/resources/extensions/gsd/auto-dashboard.ts +36 -5
  470. package/src/resources/extensions/gsd/auto-dispatch.ts +122 -71
  471. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  472. package/src/resources/extensions/gsd/auto-observability.ts +72 -0
  473. package/src/resources/extensions/gsd/auto-post-unit.ts +73 -110
  474. package/src/resources/extensions/gsd/auto-prompts.ts +159 -17
  475. package/src/resources/extensions/gsd/auto-recovery.ts +80 -221
  476. package/src/resources/extensions/gsd/auto-start.ts +7 -27
  477. package/src/resources/extensions/gsd/auto-timers.ts +2 -2
  478. package/src/resources/extensions/gsd/auto-utils.ts +25 -0
  479. package/src/resources/extensions/gsd/auto-verification.ts +4 -7
  480. package/src/resources/extensions/gsd/auto-worktree.ts +305 -108
  481. package/src/resources/extensions/gsd/auto.ts +26 -15
  482. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +93 -0
  483. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -0
  484. package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
  485. package/src/resources/extensions/gsd/crash-recovery.ts +6 -2
  486. package/src/resources/extensions/gsd/custom-execution-policy.ts +3 -2
  487. package/src/resources/extensions/gsd/custom-verification.ts +3 -1
  488. package/src/resources/extensions/gsd/custom-workflow-engine.ts +3 -2
  489. package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -0
  490. package/src/resources/extensions/gsd/detection.ts +662 -3
  491. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -1
  492. package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -0
  493. package/src/resources/extensions/gsd/doctor-checks.ts +5 -1291
  494. package/src/resources/extensions/gsd/doctor-engine-checks.ts +182 -0
  495. package/src/resources/extensions/gsd/doctor-environment.ts +30 -7
  496. package/src/resources/extensions/gsd/doctor-git-checks.ts +415 -0
  497. package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
  498. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +626 -0
  499. package/src/resources/extensions/gsd/doctor.ts +9 -1
  500. package/src/resources/extensions/gsd/extension-manifest.json +1 -1
  501. package/src/resources/extensions/gsd/files.ts +6 -1
  502. package/src/resources/extensions/gsd/git-service.ts +7 -15
  503. package/src/resources/extensions/gsd/gsd-db.ts +150 -2
  504. package/src/resources/extensions/gsd/guided-flow-queue.ts +11 -12
  505. package/src/resources/extensions/gsd/guided-flow.ts +11 -0
  506. package/src/resources/extensions/gsd/init-wizard.ts +9 -1
  507. package/src/resources/extensions/gsd/markdown-renderer.ts +37 -4
  508. package/src/resources/extensions/gsd/model-router.ts +25 -0
  509. package/src/resources/extensions/gsd/notifications.ts +23 -0
  510. package/src/resources/extensions/gsd/observability-validator.ts +456 -0
  511. package/src/resources/extensions/gsd/preferences-skills.ts +11 -5
  512. package/src/resources/extensions/gsd/preferences-types.ts +25 -1
  513. package/src/resources/extensions/gsd/preferences-validation.ts +63 -0
  514. package/src/resources/extensions/gsd/preferences.ts +3 -0
  515. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -8
  516. package/src/resources/extensions/gsd/prompts/complete-slice.md +9 -8
  517. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -13
  518. package/src/resources/extensions/gsd/prompts/forensics.md +19 -8
  519. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
  520. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  521. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  522. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  523. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
  524. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  525. package/src/resources/extensions/gsd/prompts/plan-slice.md +8 -3
  526. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +3 -0
  527. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  528. package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -1
  529. package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
  530. package/src/resources/extensions/gsd/repo-identity.ts +28 -0
  531. package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
  532. package/src/resources/extensions/gsd/roadmap-slices.ts +2 -2
  533. package/src/resources/extensions/gsd/rtk-status.ts +53 -0
  534. package/src/resources/extensions/gsd/rule-registry.ts +10 -11
  535. package/src/resources/extensions/gsd/session-forensics.ts +13 -14
  536. package/src/resources/extensions/gsd/session-lock.ts +92 -64
  537. package/src/resources/extensions/gsd/skill-catalog.ts +1085 -0
  538. package/src/resources/extensions/gsd/skill-discovery.ts +3 -2
  539. package/src/resources/extensions/gsd/skill-health.ts +2 -2
  540. package/src/resources/extensions/gsd/skill-telemetry.ts +15 -5
  541. package/src/resources/extensions/gsd/state.ts +54 -10
  542. package/src/resources/extensions/gsd/templates/milestone-summary.md +8 -0
  543. package/src/resources/extensions/gsd/templates/milestone-validation.md +12 -0
  544. package/src/resources/extensions/gsd/templates/plan.md +16 -0
  545. package/src/resources/extensions/gsd/templates/preferences.md +2 -0
  546. package/src/resources/extensions/gsd/templates/roadmap.md +13 -0
  547. package/src/resources/extensions/gsd/templates/slice-summary.md +9 -0
  548. package/src/resources/extensions/gsd/templates/task-plan.md +24 -0
  549. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +2 -2
  550. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +16 -0
  551. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
  552. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -0
  553. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -81
  554. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
  555. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  556. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  557. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +9 -12
  558. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +5 -3
  559. package/src/resources/extensions/gsd/tests/custom-verification.test.ts +33 -0
  560. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -3
  561. package/src/resources/extensions/gsd/tests/detection.test.ts +838 -0
  562. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +28 -9
  563. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +115 -1
  564. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +65 -1
  565. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +50 -0
  566. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +97 -0
  567. package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +189 -0
  568. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
  569. package/src/resources/extensions/gsd/tests/git-service.test.ts +49 -0
  570. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
  571. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +63 -0
  572. package/src/resources/extensions/gsd/tests/infra-error.test.ts +12 -2
  573. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +39 -0
  574. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  575. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  576. package/src/resources/extensions/gsd/tests/model-router.test.ts +40 -0
  577. package/src/resources/extensions/gsd/tests/notifications.test.ts +28 -6
  578. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
  579. package/src/resources/extensions/gsd/tests/preferences.test.ts +50 -0
  580. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +347 -0
  581. package/src/resources/extensions/gsd/tests/queue-completed-milestone-perf.test.ts +155 -0
  582. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +40 -0
  583. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
  584. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +2 -1
  585. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +32 -0
  586. package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
  587. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +4 -5
  588. package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
  589. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +26 -0
  590. package/src/resources/extensions/gsd/tests/run-uat.test.ts +166 -16
  591. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +223 -0
  592. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
  593. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +44 -4
  594. package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
  595. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +24 -0
  596. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  597. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
  598. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +2 -1
  599. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -16
  600. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +67 -0
  601. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +1 -1
  602. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +204 -0
  603. package/src/resources/extensions/gsd/tools/plan-slice.ts +16 -0
  604. package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -3
  605. package/src/resources/extensions/gsd/types.ts +32 -0
  606. package/src/resources/extensions/gsd/undo.ts +8 -7
  607. package/src/resources/extensions/gsd/unit-runtime.ts +2 -1
  608. package/src/resources/extensions/gsd/verdict-parser.ts +95 -0
  609. package/src/resources/extensions/gsd/verification-gate.ts +3 -3
  610. package/src/resources/extensions/gsd/worktree-resolver.ts +31 -0
  611. package/src/resources/extensions/gsd/worktree.ts +3 -2
  612. package/src/resources/extensions/remote-questions/config.ts +3 -5
  613. package/src/resources/extensions/search-the-web/native-search.ts +8 -3
  614. package/src/resources/extensions/search-the-web/tool-search.ts +22 -2
  615. package/src/resources/extensions/shared/rtk-session-stats.ts +249 -0
  616. package/src/resources/extensions/shared/rtk.ts +120 -0
  617. package/src/resources/skills/github-workflows/references/gh/SKILL.md +22 -1
  618. package/dist/resources/extensions/gsd/auto-worktree-sync.js +0 -191
  619. package/dist/resources/extensions/gsd/resource-version.js +0 -97
  620. package/dist/web/standalone/.next/server/chunks/229.js +0 -12
  621. package/dist/web/standalone/.next/server/chunks/441.js +0 -2
  622. package/dist/web/standalone/.next/server/chunks/471.js +0 -13
  623. package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +0 -9
  624. package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +0 -1
  625. package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +0 -1
  626. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +0 -1
  627. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +0 -1
  628. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +0 -1
  629. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +0 -1
  630. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +0 -1
  633. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +0 -1
  634. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +0 -1
  635. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +0 -1
  636. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +0 -1
  637. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +0 -1
  638. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +0 -1
  639. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +0 -1
  640. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +0 -1
  642. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +0 -1
  644. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +0 -1
  645. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +0 -1
  646. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +0 -1
  647. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +0 -1
  648. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +0 -1
  649. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +0 -1
  650. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +0 -1
  653. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +0 -1
  656. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +0 -1
  657. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +0 -1
  658. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +0 -1
  659. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +0 -1
  660. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +0 -1
  661. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +0 -1
  662. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +0 -1
  663. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +0 -1
  664. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +0 -1
  665. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +0 -1
  666. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  667. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +0 -1
  668. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +0 -1
  669. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  670. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +0 -1
  671. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +0 -1
  672. package/dist/web/standalone/.next/static/chunks/webpack-0a4cd455ec4197d2.js +0 -1
  673. package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +0 -1
  674. package/dist/web/standalone/.next/static/gj-y5hikmhS--NT8Web6M/_buildManifest.js +0 -1
  675. package/packages/pi-ai/pnpm-lock.yaml +0 -2022
  676. package/packages/pi-coding-agent/pnpm-lock.yaml +0 -454
  677. package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -234
  678. package/src/resources/extensions/gsd/resource-version.ts +0 -101
  679. /package/dist/web/standalone/.next/static/{gj-y5hikmhS--NT8Web6M → yJIyd5cXPNpmXTv18ZlyC}/_ssgManifest.js +0 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Pre-dispatch observability checks for auto-mode units.
3
+ * Validates plan/summary file quality and builds repair instructions
4
+ * for the agent to fix gaps before proceeding with the unit.
5
+ */
6
+
7
+ import type { ExtensionContext } from "@gsd/pi-coding-agent";
8
+ import {
9
+ validatePlanBoundary,
10
+ validateExecuteBoundary,
11
+ validateCompleteBoundary,
12
+ formatValidationIssues,
13
+ } from "./observability-validator.js";
14
+ import type { ValidationIssue } from "./observability-validator.js";
15
+ import { parseUnitId } from "./unit-id.js";
16
+
17
+ export async function collectObservabilityWarnings(
18
+ ctx: ExtensionContext,
19
+ basePath: string,
20
+ unitType: string,
21
+ unitId: string,
22
+ ): Promise<ValidationIssue[]> {
23
+ // Hook units have custom artifacts — skip standard observability checks
24
+ if (unitType.startsWith("hook/")) return [];
25
+
26
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
27
+
28
+ if (!mid || !sid) return [];
29
+
30
+ let issues = [] as Awaited<ReturnType<typeof validatePlanBoundary>>;
31
+
32
+ if (unitType === "plan-slice") {
33
+ issues = await validatePlanBoundary(basePath, mid, sid);
34
+ } else if (unitType === "execute-task" && tid) {
35
+ issues = await validateExecuteBoundary(basePath, mid, sid, tid);
36
+ } else if (unitType === "complete-slice") {
37
+ issues = await validateCompleteBoundary(basePath, mid, sid);
38
+ }
39
+
40
+ if (issues.length > 0) {
41
+ ctx.ui.notify(
42
+ `Observability check (${unitType}) found ${issues.length} warning${issues.length === 1 ? "" : "s"}:\n${formatValidationIssues(issues)}`,
43
+ "warning",
44
+ );
45
+ }
46
+
47
+ return issues;
48
+ }
49
+
50
+ export function buildObservabilityRepairBlock(issues: ValidationIssue[]): string {
51
+ if (issues.length === 0) return "";
52
+ const items = issues.map(issue => {
53
+ const fileName = issue.file.split("/").pop() || issue.file;
54
+ let line = `- **${fileName}**: ${issue.message}`;
55
+ if (issue.suggestion) line += ` → ${issue.suggestion}`;
56
+ return line;
57
+ });
58
+ return [
59
+ "",
60
+ "---",
61
+ "",
62
+ "## Pre-flight: Observability gaps to fix FIRST",
63
+ "",
64
+ "The following issues were detected in plan/summary files for this unit.",
65
+ "**Read each flagged file, apply the fix described, then proceed with the unit.**",
66
+ "",
67
+ ...items,
68
+ "",
69
+ "---",
70
+ "",
71
+ ].join("\n");
72
+ }
@@ -23,6 +23,7 @@ import {
23
23
  buildTaskFileName,
24
24
  } from "./paths.js";
25
25
  import { invalidateAllCaches } from "./cache.js";
26
+ import { parseUnitId } from "./unit-id.js";
26
27
  import { closeoutUnit, type CloseoutOptions } from "./auto-unit-closeout.js";
27
28
  import {
28
29
  autoCommitCurrentBranch,
@@ -33,7 +34,7 @@ import {
33
34
  resolveExpectedArtifactPath,
34
35
  } from "./auto-recovery.js";
35
36
  import { regenerateIfMissing } from "./workflow-projections.js";
36
- import { syncStateToProjectRoot } from "./auto-worktree-sync.js";
37
+ import { syncStateToProjectRoot } from "./auto-worktree.js";
37
38
  import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
38
39
  import { renderPlanCheckboxes } from "./markdown-renderer.js";
39
40
  import { consumeSignal } from "./session-status-io.js";
@@ -46,8 +47,29 @@ import {
46
47
  } from "./post-unit-hooks.js";
47
48
  import { hasPendingCaptures, loadPendingCaptures } from "./captures.js";
48
49
  import { debugLog } from "./debug-logger.js";
49
- import type { AutoSession } from "./auto/session.js";
50
-
50
+ import { runSafely } from "./auto-utils.js";
51
+ import type { AutoSession, SidecarItem } from "./auto/session.js";
52
+
53
+
54
+ /** Enqueue a sidecar item (hook, triage, or quick-task) for the main loop to
55
+ * drain via runUnit. Logs the enqueue event and notifies the UI. */
56
+ function enqueueSidecar(
57
+ s: AutoSession,
58
+ ctx: ExtensionContext,
59
+ entry: SidecarItem,
60
+ debugExtra: Record<string, unknown>,
61
+ notification?: string,
62
+ ): "continue" {
63
+ s.sidecarQueue.push(entry);
64
+ debugLog("postUnitPostVerification", {
65
+ phase: "sidecar-enqueue",
66
+ kind: entry.kind,
67
+ unitId: entry.unitId,
68
+ ...debugExtra,
69
+ });
70
+ if (notification) ctx.ui.notify(notification, "info");
71
+ return "continue";
72
+ }
51
73
  /** Unit types that only touch `.gsd/` internal state files (no code changes).
52
74
  * Auto-commit is skipped for these — their state files are picked up by the
53
75
  * next actual task commit via `smartStage()`. */
@@ -84,6 +106,15 @@ export interface RogueFileWrite {
84
106
  * in postUnitPostVerification() eventually ingests rogue files, but explicit
85
107
  * detection provides immediate diagnostics so operators know the prompt failed.
86
108
  */
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ function hasNonEmptyFields(row: Record<string, any> | null, fields: string[]): boolean {
111
+ if (!row) return false;
112
+ return fields.some(f => String(row[f] || "").trim().length > 0);
113
+ }
114
+
115
+ const MILESTONE_PLANNING_FIELDS = ["title", "vision", "requirement_coverage", "boundary_map_markdown"];
116
+ const SLICE_PLANNING_FIELDS = ["title", "demo", "risk", "depends"];
117
+
87
118
  export function detectRogueFileWrites(
88
119
  unitType: string,
89
120
  unitId: string,
@@ -91,11 +122,10 @@ export function detectRogueFileWrites(
91
122
  ): RogueFileWrite[] {
92
123
  if (!isDbAvailable()) return [];
93
124
 
94
- const parts = unitId.split("/");
125
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
95
126
  const rogues: RogueFileWrite[] = [];
96
127
 
97
128
  if (unitType === "execute-task") {
98
- const [mid, sid, tid] = parts;
99
129
  if (!mid || !sid || !tid) return [];
100
130
 
101
131
  const summaryPath = resolveTaskFile(basePath, mid, sid, tid, "SUMMARY");
@@ -106,7 +136,6 @@ export function detectRogueFileWrites(
106
136
  rogues.push({ path: summaryPath, unitType, unitId });
107
137
  }
108
138
  } else if (unitType === "complete-slice") {
109
- const [mid, sid] = parts;
110
139
  if (!mid || !sid) return [];
111
140
 
112
141
  const summaryPath = resolveSliceFile(basePath, mid, sid, "SUMMARY");
@@ -117,37 +146,25 @@ export function detectRogueFileWrites(
117
146
  rogues.push({ path: summaryPath, unitType, unitId });
118
147
  }
119
148
  } else if (unitType === "plan-milestone") {
120
- const [mid] = parts;
121
149
  if (!mid) return [];
122
150
 
123
151
  const roadmapPath = resolveMilestoneFile(basePath, mid, "ROADMAP");
124
152
  if (!roadmapPath || !existsSync(roadmapPath)) return [];
125
153
 
126
154
  const dbRow = getMilestone(mid);
127
- const hasPlanningState = !!dbRow && (
128
- String(dbRow.title || "").trim().length > 0 ||
129
- String(dbRow.vision || "").trim().length > 0 ||
130
- String(dbRow.requirement_coverage || "").trim().length > 0 ||
131
- String(dbRow.boundary_map_markdown || "").trim().length > 0
132
- );
155
+ const hasPlanningState = hasNonEmptyFields(dbRow, MILESTONE_PLANNING_FIELDS);
133
156
 
134
157
  if (!hasPlanningState) {
135
158
  rogues.push({ path: roadmapPath, unitType, unitId });
136
159
  }
137
160
  } else if (unitType === "plan-slice" || unitType === "replan-slice") {
138
- const [mid, sid] = parts;
139
161
  if (!mid || !sid) return [];
140
162
 
141
163
  const planPath = resolveSliceFile(basePath, mid, sid, "PLAN");
142
164
  if (!planPath || !existsSync(planPath)) return [];
143
165
 
144
166
  const dbRow = getSlice(mid, sid);
145
- const hasPlanningState = !!dbRow && (
146
- String(dbRow.title || "").trim().length > 0 ||
147
- String(dbRow.demo || "").trim().length > 0 ||
148
- String(dbRow.risk || "").trim().length > 0 ||
149
- String(dbRow.depends || "").trim().length > 0
150
- );
167
+ const hasPlanningState = hasNonEmptyFields(dbRow, SLICE_PLANNING_FIELDS);
151
168
 
152
169
  if (!hasPlanningState) {
153
170
  rogues.push({ path: planPath, unitType, unitId });
@@ -159,7 +176,6 @@ export function detectRogueFileWrites(
159
176
  rogues.push({ path: replanPath, unitType, unitId });
160
177
  }
161
178
  } else if (unitType === "reassess-roadmap") {
162
- const [mid, sid] = parts;
163
179
  if (!mid || !sid) return [];
164
180
 
165
181
  const assessPath = resolveSliceFile(basePath, mid, sid, "ASSESSMENT");
@@ -176,7 +192,6 @@ export function detectRogueFileWrites(
176
192
  }
177
193
  }
178
194
  } else if (unitType === "plan-task") {
179
- const [mid, sid, tid] = parts;
180
195
  if (!mid || !sid || !tid) return [];
181
196
 
182
197
  const taskPlanPath = resolveTaskFile(basePath, mid, sid, tid, "PLAN");
@@ -245,12 +260,12 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
245
260
 
246
261
  // Auto-commit
247
262
  if (s.currentUnit) {
263
+ const unit = s.currentUnit;
248
264
  try {
249
265
  let taskContext: TaskCommitContext | undefined;
250
266
 
251
267
  if (s.currentUnit.type === "execute-task") {
252
- const parts = s.currentUnit.id.split("/");
253
- const [mid, sid, tid] = parts;
268
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(s.currentUnit.id);
254
269
  if (mid && sid && tid) {
255
270
  const summaryPath = resolveTaskFile(s.basePath, mid, sid, tid, "SUMMARY");
256
271
  if (summaryPath) {
@@ -304,65 +319,56 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
304
319
  }
305
320
 
306
321
  // GitHub sync (non-blocking, opt-in)
307
- try {
322
+ await runSafely("postUnit", "github-sync", async () => {
308
323
  const { runGitHubSync } = await import("../github-sync/sync.js");
309
- await runGitHubSync(s.basePath, s.currentUnit.type, s.currentUnit.id);
310
- } catch (e) {
311
- debugLog("postUnit", { phase: "github-sync", error: String(e) });
312
- }
324
+ await runGitHubSync(s.basePath, unit.type, unit.id);
325
+ });
313
326
 
314
327
  // Prune dead bg-shell processes
315
- try {
328
+ await runSafely("postUnit", "prune-bg-shell", async () => {
316
329
  const { pruneDeadProcesses } = await import("../bg-shell/process-manager.js");
317
330
  pruneDeadProcesses();
318
- } catch (e) {
319
- debugLog("postUnit", { phase: "prune-bg-shell", error: String(e) });
320
- }
331
+ });
321
332
 
322
333
  // Tear down browser between units to prevent Chrome process accumulation (#1733)
323
- try {
334
+ await runSafely("postUnit", "browser-teardown", async () => {
324
335
  const { getBrowser } = await import("../browser-tools/state.js");
325
336
  if (getBrowser()) {
326
337
  const { closeBrowser } = await import("../browser-tools/lifecycle.js");
327
338
  await closeBrowser();
328
339
  debugLog("postUnit", { phase: "browser-teardown", status: "closed" });
329
340
  }
330
- } catch (e) {
331
- debugLog("postUnit", { phase: "browser-teardown", error: String(e) });
332
- }
341
+ });
333
342
 
334
343
  // Sync worktree state back to project root (skipped for lightweight sidecars)
335
344
  if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
336
- try {
337
- syncStateToProjectRoot(s.basePath, s.originalBasePath, s.currentMilestoneId);
338
- } catch (e) {
339
- debugLog("postUnit", { phase: "worktree-sync", error: String(e) });
340
- }
345
+ await runSafely("postUnit", "worktree-sync", () => {
346
+ syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
347
+ });
341
348
  }
342
349
 
343
350
  // Rewrite-docs completion
344
351
  if (s.currentUnit.type === "rewrite-docs") {
345
- try {
352
+ await runSafely("postUnit", "rewrite-docs-resolve", async () => {
346
353
  await resolveAllOverrides(s.basePath);
354
+ // Reset both disk and in-memory counters. Disk counter is authoritative
355
+ // (survives restarts); in-memory is kept in sync for the current session.
356
+ const { setRewriteCount } = await import("./auto-dispatch.js");
357
+ setRewriteCount(s.basePath, 0);
347
358
  s.rewriteAttemptCount = 0;
348
359
  ctx.ui.notify("Override(s) resolved — rewrite-docs completed.", "info");
349
- } catch (e) {
350
- debugLog("postUnit", { phase: "rewrite-docs-resolve", error: String(e) });
351
- }
360
+ });
352
361
  }
353
362
 
354
363
  // Reactive state cleanup on slice completion
355
364
  if (s.currentUnit.type === "complete-slice") {
356
- try {
357
- const parts = s.currentUnit.id.split("/");
358
- const [mid, sid] = parts;
365
+ await runSafely("postUnit", "reactive-state-cleanup", async () => {
366
+ const { milestone: mid, slice: sid } = parseUnitId(unit.id);
359
367
  if (mid && sid) {
360
368
  const { clearReactiveState } = await import("./reactive-graph.js");
361
369
  clearReactiveState(s.basePath, mid, sid);
362
370
  }
363
- } catch (e) {
364
- debugLog("postUnit", { phase: "reactive-state-cleanup", error: String(e) });
365
- }
371
+ });
366
372
  }
367
373
 
368
374
  // Post-triage: execute actionable resolutions
@@ -440,8 +446,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
440
446
  // from DB data before giving up (e.g. research-slice produces PLAN from engine).
441
447
  if (!triggerArtifactVerified) {
442
448
  try {
443
- const parts = s.currentUnit.id.split("/");
444
- const [mid, sid] = parts;
449
+ const { milestone: mid, slice: sid } = parseUnitId(s.currentUnit.id);
445
450
  if (mid && sid) {
446
451
  const regenerated = regenerateIfMissing(s.basePath, mid, sid, "PLAN");
447
452
  if (regenerated) {
@@ -511,23 +516,11 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
511
516
  }
512
517
  persistHookState(s.basePath);
513
518
 
514
- s.sidecarQueue.push({
515
- kind: "hook",
516
- unitType: hookUnit.unitType,
517
- unitId: hookUnit.unitId,
518
- prompt: hookUnit.prompt,
519
- model: hookUnit.model,
520
- });
521
-
522
- debugLog("postUnitPostVerification", {
523
- phase: "sidecar-enqueue",
524
- kind: "hook",
525
- unitType: hookUnit.unitType,
526
- unitId: hookUnit.unitId,
527
- hookName: hookUnit.hookName,
528
- });
529
-
530
- return "continue";
519
+ return enqueueSidecar(
520
+ s, ctx,
521
+ { kind: "hook", unitType: hookUnit.unitType, unitId: hookUnit.unitId, prompt: hookUnit.prompt, model: hookUnit.model },
522
+ { hookName: hookUnit.hookName },
523
+ );
531
524
  }
532
525
 
533
526
  // Check if a hook requested a retry of the trigger unit
@@ -541,8 +534,7 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
541
534
 
542
535
  // ── State reset: undo the completion so deriveState re-derives the unit ──
543
536
  try {
544
- const parts = trigger.unitId.split("/");
545
- const [mid, sid, tid] = parts;
537
+ const { milestone: mid, slice: sid, task: tid } = parseUnitId(trigger.unitId);
546
538
 
547
539
  // 1. Reset task status in DB and re-render plan checkboxes
548
540
  if (mid && sid && tid) {
@@ -627,26 +619,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
627
619
  }
628
620
 
629
621
  const triageUnitId = `${mid}/${sid}/triage`;
630
- s.sidecarQueue.push({
631
- kind: "triage",
632
- unitType: "triage-captures",
633
- unitId: triageUnitId,
634
- prompt,
635
- });
636
-
637
- debugLog("postUnitPostVerification", {
638
- phase: "sidecar-enqueue",
639
- kind: "triage",
640
- unitId: triageUnitId,
641
- pendingCount: pending.length,
642
- });
643
-
644
- ctx.ui.notify(
622
+ return enqueueSidecar(
623
+ s, ctx,
624
+ { kind: "triage", unitType: "triage-captures", unitId: triageUnitId, prompt },
625
+ { pendingCount: pending.length },
645
626
  `Triaging ${pending.length} pending capture${pending.length === 1 ? "" : "s"}...`,
646
- "info",
647
627
  );
648
-
649
- return "continue";
650
628
  }
651
629
  }
652
630
  }
@@ -675,27 +653,12 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
675
653
  markCaptureExecuted(s.basePath, capture.id);
676
654
 
677
655
  const qtUnitId = `${s.currentMilestoneId}/${capture.id}`;
678
- s.sidecarQueue.push({
679
- kind: "quick-task",
680
- unitType: "quick-task",
681
- unitId: qtUnitId,
682
- prompt,
683
- captureId: capture.id,
684
- });
685
-
686
- debugLog("postUnitPostVerification", {
687
- phase: "sidecar-enqueue",
688
- kind: "quick-task",
689
- unitId: qtUnitId,
690
- captureId: capture.id,
691
- });
692
-
693
- ctx.ui.notify(
656
+ return enqueueSidecar(
657
+ s, ctx,
658
+ { kind: "quick-task", unitType: "quick-task", unitId: qtUnitId, prompt, captureId: capture.id },
659
+ { captureId: capture.id },
694
660
  `Executing quick-task: ${capture.id} — "${capture.text}"`,
695
- "info",
696
661
  );
697
-
698
- return "continue";
699
662
  } catch (e) {
700
663
  debugLog("postUnit", { phase: "quick-task-dispatch", error: String(e) });
701
664
  }
@@ -6,8 +6,9 @@
6
6
  * utility.
7
7
  */
8
8
 
9
- import { loadFile, parseContinue, parseSummary, extractUatType, loadActiveOverrides, formatOverridesSection, parseTaskPlanFile } from "./files.js";
9
+ import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection, parseTaskPlanFile } from "./files.js";
10
10
  import type { Override, UatType } from "./files.js";
11
+ import { hasVerdict, getUatType } from "./verdict-parser.js";
11
12
  import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
12
13
  import {
13
14
  resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
@@ -23,6 +24,7 @@ import { getLoadedSkills, type Skill } from "@gsd/pi-coding-agent";
23
24
  import { join, basename } from "node:path";
24
25
  import { existsSync } from "node:fs";
25
26
  import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
27
+ import { getPendingGates } from "./gsd-db.js";
26
28
  import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
27
29
 
28
30
  // ─── Preamble Cap ─────────────────────────────────────────────────────────────
@@ -419,9 +421,17 @@ function resolvePreferredSkillNames(
419
421
  .map(skill => normalizeSkillReference(skill.name));
420
422
  }
421
423
 
424
+ /** Skill names must be lowercase alphanumeric with hyphens — reject anything else
425
+ * to prevent prompt injection via crafted directory names. */
426
+ const SAFE_SKILL_NAME = /^[a-z0-9][a-z0-9-]*$/;
427
+
422
428
  function formatSkillActivationBlock(skillNames: string[]): string {
423
- if (skillNames.length === 0) return "";
424
- const calls = skillNames.map(name => `Call Skill('${name}')`).join('. ');
429
+ const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
430
+ if (safe.length === 0) return "";
431
+ // Use explicit parameter syntax so LLMs pass { skill: "..." } instead of { name: "..." }.
432
+ // The function-call-like syntax `Skill('name')` led LLMs to infer a positional
433
+ // parameter name, causing tool validation failures — see #2224.
434
+ const calls = safe.map(name => `Call Skill({ skill: '${name}' })`).join('. ');
425
435
  return `<skill_activation>${calls}.</skill_activation>`;
426
436
  }
427
437
 
@@ -772,12 +782,17 @@ export async function checkNeedsRunUat(
772
782
  if (!uatFile) return null;
773
783
  const uatContent = await loadFile(uatFile);
774
784
  if (!uatContent) return null;
775
- const uatResultFile = resolveSliceFile(base, mid, sid, "UAT-RESULT");
776
- if (uatResultFile) {
777
- const hasResult = !!(await loadFile(uatResultFile));
778
- if (hasResult) return null;
785
+ // If the UAT file already contains a verdict, UAT has been run — skip
786
+ if (hasVerdict(uatContent)) return null;
787
+ // Also check the ASSESSMENT file — the run-uat prompt writes the verdict
788
+ // there (via gsd_summary_save artifact_type:"ASSESSMENT"), not into the
789
+ // UAT spec file. Without this check the unit re-dispatches indefinitely.
790
+ const assessmentFile = resolveSliceFile(base, mid, sid, "ASSESSMENT");
791
+ if (assessmentFile) {
792
+ const assessmentContent = await loadFile(assessmentFile);
793
+ if (assessmentContent && hasVerdict(assessmentContent)) return null;
779
794
  }
780
- const uatType = extractUatType(uatContent) ?? "artifact-driven";
795
+ const uatType = getUatType(uatContent);
781
796
  return { sliceId: sid, uatType };
782
797
  }
783
798
  }
@@ -799,12 +814,16 @@ export async function checkNeedsRunUat(
799
814
  if (!uatFileFb) return null;
800
815
  const uatContentFb = await loadFile(uatFileFb);
801
816
  if (!uatContentFb) return null;
802
- const uatResultFb = resolveSliceFile(base, mid, uatSid, "UAT-RESULT");
803
- if (uatResultFb) {
804
- const hasResultFb = !!(await loadFile(uatResultFb));
805
- if (hasResultFb) return null;
817
+ // If the UAT file already contains a verdict, UAT has been run — skip
818
+ if (hasVerdict(uatContentFb)) return null;
819
+ // Also check the ASSESSMENT file for the file-based fallback path (same
820
+ // reason as the DB path above — verdict lives in ASSESSMENT, not UAT).
821
+ const assessmentFileFb = resolveSliceFile(base, mid, uatSid, "ASSESSMENT");
822
+ if (assessmentFileFb) {
823
+ const assessmentContentFb = await loadFile(assessmentFileFb);
824
+ if (assessmentContentFb && hasVerdict(assessmentContentFb)) return null;
806
825
  }
807
- const uatTypeFb = extractUatType(uatContentFb) ?? "artifact-driven";
826
+ const uatTypeFb = getUatType(uatContentFb);
808
827
  return { sliceId: uatSid, uatType: uatTypeFb };
809
828
  }
810
829
 
@@ -1326,6 +1345,24 @@ export async function buildValidateMilestonePrompt(
1326
1345
  const inlined: string[] = [];
1327
1346
  inlined.push(await inlineFile(roadmapPath, roadmapRel, "Milestone Roadmap"));
1328
1347
 
1348
+ // Inline verification classes from planning (if available in DB)
1349
+ try {
1350
+ const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
1351
+ if (isDbAvailable()) {
1352
+ const milestone = getMilestone(mid);
1353
+ if (milestone) {
1354
+ const classes: string[] = [];
1355
+ if (milestone.verification_contract) classes.push(`- **Contract:** ${milestone.verification_contract}`);
1356
+ if (milestone.verification_integration) classes.push(`- **Integration:** ${milestone.verification_integration}`);
1357
+ if (milestone.verification_operational) classes.push(`- **Operational:** ${milestone.verification_operational}`);
1358
+ if (milestone.verification_uat) classes.push(`- **UAT:** ${milestone.verification_uat}`);
1359
+ if (classes.length > 0) {
1360
+ inlined.push(`### Verification Classes (from planning)\n\nThese verification tiers were defined during milestone planning. Each non-empty class must be checked for evidence during validation.\n\n${classes.join("\n")}`);
1361
+ }
1362
+ }
1363
+ }
1364
+ } catch { /* fall through */ }
1365
+
1329
1366
  // Inline all slice summaries and UAT results
1330
1367
  let valSliceIds: string[] = [];
1331
1368
  try {
@@ -1349,12 +1386,27 @@ export async function buildValidateMilestonePrompt(
1349
1386
  const summaryRel = relSliceFile(base, mid, sid, "SUMMARY");
1350
1387
  inlined.push(await inlineFile(summaryPath, summaryRel, `${sid} Summary`));
1351
1388
 
1352
- const uatPath = resolveSliceFile(base, mid, sid, "UAT-RESULT");
1353
- const uatRel = relSliceFile(base, mid, sid, "UAT-RESULT");
1389
+ const uatPath = resolveSliceFile(base, mid, sid, "UAT");
1390
+ const uatRel = relSliceFile(base, mid, sid, "UAT");
1354
1391
  const uatInline = await inlineFileOptional(uatPath, uatRel, `${sid} UAT Result`);
1355
1392
  if (uatInline) inlined.push(uatInline);
1356
1393
  }
1357
1394
 
1395
+ // Aggregate unresolved follow-ups and known limitations across slices
1396
+ const outstandingItems: string[] = [];
1397
+ for (const sid of valSliceIds) {
1398
+ const summaryPath = resolveSliceFile(base, mid, sid, "SUMMARY");
1399
+ if (!summaryPath) continue;
1400
+ const content = await loadFile(summaryPath);
1401
+ if (!content) continue;
1402
+ const summary = parseSummary(content);
1403
+ if (summary.followUps) outstandingItems.push(`- **${sid} Follow-ups:** ${summary.followUps.trim()}`);
1404
+ if (summary.knownLimitations) outstandingItems.push(`- **${sid} Known Limitations:** ${summary.knownLimitations.trim()}`);
1405
+ }
1406
+ if (outstandingItems.length > 0) {
1407
+ inlined.push(`### Outstanding Items (aggregated from slice summaries)\n\nThese follow-ups and known limitations were documented during slice completion but have not been resolved.\n\n${outstandingItems.join('\n')}`);
1408
+ }
1409
+
1358
1410
  // Inline existing VALIDATION file if this is a re-validation round
1359
1411
  const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
1360
1412
  const validationRel = relMilestoneFile(base, mid, "VALIDATION");
@@ -1501,8 +1553,8 @@ export async function buildRunUatPrompt(
1501
1553
 
1502
1554
  const inlinedContext = capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`);
1503
1555
 
1504
- const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT-RESULT"));
1505
- const uatType = extractUatType(uatContent) ?? "artifact-driven";
1556
+ const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT"));
1557
+ const uatType = getUatType(uatContent);
1506
1558
 
1507
1559
  return loadPrompt("run-uat", {
1508
1560
  workingDirectory: base,
@@ -1659,6 +1711,96 @@ export async function buildReactiveExecutePrompt(
1659
1711
  });
1660
1712
  }
1661
1713
 
1714
+ // ─── Gate Evaluation ──────────────────────────────────────────────────────
1715
+
1716
+ const GATE_QUESTIONS: Record<string, { question: string; guidance: string }> = {
1717
+ Q3: {
1718
+ question: "How can this be exploited?",
1719
+ guidance: [
1720
+ "Identify abuse scenarios: parameter tampering, replay attacks, privilege escalation.",
1721
+ "Map data exposure risks: PII, tokens, secrets accessible through this slice.",
1722
+ "Define input trust boundaries: untrusted user input reaching DB, API, or filesystem.",
1723
+ "If none apply, return verdict 'omitted' with rationale explaining why.",
1724
+ ].join("\n"),
1725
+ },
1726
+ Q4: {
1727
+ question: "What existing promises does this break?",
1728
+ guidance: [
1729
+ "List which existing requirements (R001, R003, etc.) are touched by this slice.",
1730
+ "Identify what must be re-tested after shipping.",
1731
+ "Flag decisions that should be revisited given the new scope.",
1732
+ "If no existing requirements are affected, return verdict 'omitted'.",
1733
+ ].join("\n"),
1734
+ },
1735
+ };
1736
+
1737
+ export async function buildGateEvaluatePrompt(
1738
+ mid: string, midTitle: string, sid: string, sTitle: string,
1739
+ base: string,
1740
+ ): Promise<string> {
1741
+ const pending = getPendingGates(mid, sid, "slice");
1742
+
1743
+ // Load the slice plan for context
1744
+ const planFile = resolveSliceFile(base, mid, sid, "PLAN");
1745
+ const planContent = planFile ? (await loadFile(planFile)) ?? "(plan file empty)" : "(plan file not found)";
1746
+
1747
+ // Build per-gate subagent prompts
1748
+ const subagentSections: string[] = [];
1749
+ const gateListLines: string[] = [];
1750
+
1751
+ for (const gate of pending) {
1752
+ const meta = GATE_QUESTIONS[gate.gate_id];
1753
+ if (!meta) continue;
1754
+
1755
+ gateListLines.push(`- **${gate.gate_id}**: ${meta.question}`);
1756
+
1757
+ const subPrompt = [
1758
+ `You are evaluating quality gate **${gate.gate_id}** for slice ${sid} (${sTitle}).`,
1759
+ "",
1760
+ `## Question: ${meta.question}`,
1761
+ "",
1762
+ meta.guidance,
1763
+ "",
1764
+ "## Slice Plan",
1765
+ "",
1766
+ planContent,
1767
+ "",
1768
+ "## Instructions",
1769
+ "",
1770
+ "Analyze the slice plan above and answer the gate question.",
1771
+ `Call the \`gsd_save_gate_result\` tool with:`,
1772
+ `- \`milestoneId\`: "${mid}"`,
1773
+ `- \`sliceId\`: "${sid}"`,
1774
+ `- \`gateId\`: "${gate.gate_id}"`,
1775
+ "- `verdict`: \"pass\" (no concerns), \"flag\" (concerns found), or \"omitted\" (not applicable)",
1776
+ "- `rationale`: one-sentence justification",
1777
+ "- `findings`: detailed markdown findings (or empty if omitted)",
1778
+ ].join("\n");
1779
+
1780
+ subagentSections.push([
1781
+ `### ${gate.gate_id}: ${meta.question}`,
1782
+ "",
1783
+ "Use this as the prompt for a `subagent` call:",
1784
+ "",
1785
+ "```",
1786
+ subPrompt,
1787
+ "```",
1788
+ ].join("\n"));
1789
+ }
1790
+
1791
+ return loadPrompt("gate-evaluate", {
1792
+ workingDirectory: base,
1793
+ milestoneId: mid,
1794
+ milestoneTitle: midTitle,
1795
+ sliceId: sid,
1796
+ sliceTitle: sTitle,
1797
+ slicePlanContent: planContent,
1798
+ gateCount: String(pending.length),
1799
+ gateList: gateListLines.join("\n"),
1800
+ subagentPrompts: subagentSections.join("\n\n---\n\n"),
1801
+ });
1802
+ }
1803
+
1662
1804
  export async function buildRewriteDocsPrompt(
1663
1805
  mid: string, midTitle: string,
1664
1806
  activeSlice: { id: string; title: string } | null,