gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd

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 (693) hide show
  1. package/README.md +30 -12
  2. package/dist/cli.js +13 -1
  3. package/dist/help-text.js +24 -0
  4. package/dist/resources/extensions/bg-shell/overlay.js +3 -0
  5. package/dist/resources/extensions/github-sync/sync.js +2 -1
  6. package/dist/resources/extensions/gsd/auto/loop.js +0 -2
  7. package/dist/resources/extensions/gsd/auto/phases.js +7 -12
  8. package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
  9. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
  12. package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
  13. package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
  14. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  15. package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
  16. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
  17. package/dist/resources/extensions/gsd/auto-verification.js +5 -10
  18. package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
  19. package/dist/resources/extensions/gsd/auto.js +1 -4
  20. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
  21. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
  22. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  23. package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
  24. package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
  25. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  26. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  27. package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
  28. package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
  29. package/dist/resources/extensions/gsd/db-writer.js +95 -4
  30. package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
  31. package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
  32. package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
  33. package/dist/resources/extensions/gsd/doctor-types.js +0 -15
  34. package/dist/resources/extensions/gsd/doctor.js +46 -282
  35. package/dist/resources/extensions/gsd/file-watcher.js +5 -1
  36. package/dist/resources/extensions/gsd/files.js +14 -198
  37. package/dist/resources/extensions/gsd/git-service.js +4 -0
  38. package/dist/resources/extensions/gsd/gitignore.js +4 -0
  39. package/dist/resources/extensions/gsd/gsd-db.js +819 -197
  40. package/dist/resources/extensions/gsd/guided-flow.js +18 -8
  41. package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
  42. package/dist/resources/extensions/gsd/md-importer.js +182 -4
  43. package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
  44. package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
  45. package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
  46. package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
  47. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  48. package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
  49. package/dist/resources/extensions/gsd/preferences.js +1 -0
  50. package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  51. package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
  52. package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
  53. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  54. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  55. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  57. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  58. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  59. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  60. package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  61. package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
  62. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  63. package/dist/resources/extensions/gsd/state.js +484 -30
  64. package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
  65. package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
  66. package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
  67. package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
  68. package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
  69. package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
  70. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
  71. package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
  72. package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
  73. package/dist/resources/extensions/gsd/undo.js +197 -3
  74. package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
  75. package/dist/resources/extensions/gsd/workspace-index.js +63 -39
  76. package/dist/web/standalone/.next/BUILD_ID +1 -1
  77. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
  78. package/dist/web/standalone/.next/build-manifest.json +4 -4
  79. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  80. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  81. package/dist/web/standalone/.next/required-server-files.json +4 -4
  82. package/dist/web/standalone/.next/routes-manifest.json +6 -0
  83. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  84. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  86. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  94. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  96. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  97. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  98. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  100. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  103. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  148. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  154. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
  166. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
  167. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
  168. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  171. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  175. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/index.html +1 -1
  185. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  186. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  188. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  190. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  191. package/dist/web/standalone/.next/server/app/page.js +2 -2
  192. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
  194. package/dist/web/standalone/.next/server/chunks/229.js +3 -3
  195. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  196. package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
  197. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/middleware.js +2 -2
  200. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  202. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  203. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  204. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  205. package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
  206. package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
  207. package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
  208. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
  209. package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  210. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
  213. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
  216. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
  217. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
  218. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
  219. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
  223. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
  224. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
  225. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
  226. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
  227. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
  228. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
  229. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
  230. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
  231. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
  232. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
  233. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
  234. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
  235. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
  236. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
  238. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
  241. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
  247. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
  249. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
  250. package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
  251. package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
  252. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
  253. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
  254. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  255. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
  256. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
  257. package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
  258. package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
  259. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  260. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  261. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  262. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  263. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  264. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  265. package/dist/web/standalone/server.js +1 -1
  266. package/package.json +4 -4
  267. package/packages/pi-ai/dist/models.custom.d.ts +173 -0
  268. package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
  269. package/packages/pi-ai/dist/models.custom.js +170 -0
  270. package/packages/pi-ai/dist/models.custom.js.map +1 -0
  271. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  272. package/packages/pi-ai/dist/models.js +16 -1
  273. package/packages/pi-ai/dist/models.js.map +1 -1
  274. package/packages/pi-ai/dist/models.test.d.ts +2 -0
  275. package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
  276. package/packages/pi-ai/dist/models.test.js +67 -0
  277. package/packages/pi-ai/dist/models.test.js.map +1 -0
  278. package/packages/pi-ai/src/models.custom.ts +172 -0
  279. package/packages/pi-ai/src/models.test.ts +85 -0
  280. package/packages/pi-ai/src/models.ts +17 -1
  281. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
  282. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
  284. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  286. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
  288. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
  291. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
  294. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  296. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
  299. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
  301. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
  303. package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  305. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  306. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
  307. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  308. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
  310. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
  311. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
  312. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
  313. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  315. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
  317. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
  318. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
  319. package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
  320. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
  321. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
  323. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
  325. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
  327. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
  328. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
  329. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
  331. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
  333. package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
  334. package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
  335. package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
  336. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
  337. package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
  338. package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
  339. package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  341. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  342. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
  344. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  346. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  348. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/index.d.ts +3 -1
  350. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/index.js +1 -0
  352. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  354. package/packages/pi-coding-agent/dist/main.js +11 -199
  355. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
  363. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
  366. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
  370. package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
  373. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  375. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  376. package/packages/pi-coding-agent/package.json +1 -1
  377. package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
  378. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  379. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
  380. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
  381. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
  382. package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
  383. package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
  384. package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
  385. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  386. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
  387. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
  388. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
  389. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  390. package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
  391. package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
  392. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
  393. package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
  394. package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
  395. package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
  396. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  397. package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
  398. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  399. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  400. package/packages/pi-coding-agent/src/index.ts +7 -0
  401. package/packages/pi-coding-agent/src/main.ts +11 -232
  402. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
  403. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
  404. package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
  405. package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
  406. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
  407. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  408. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  409. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  410. package/pkg/dist/modes/interactive/theme/theme.js +8 -15
  411. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  412. package/pkg/package.json +1 -1
  413. package/src/resources/extensions/bg-shell/overlay.ts +4 -0
  414. package/src/resources/extensions/github-sync/sync.ts +2 -1
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
  416. package/src/resources/extensions/gsd/auto/loop.ts +0 -2
  417. package/src/resources/extensions/gsd/auto/phases.ts +7 -20
  418. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  419. package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
  420. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
  421. package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
  422. package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
  423. package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
  424. package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
  425. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  426. package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
  427. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
  428. package/src/resources/extensions/gsd/auto-verification.ts +4 -9
  429. package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
  430. package/src/resources/extensions/gsd/auto.ts +0 -9
  431. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
  432. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
  433. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
  434. package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
  435. package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
  436. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  437. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  438. package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
  439. package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
  440. package/src/resources/extensions/gsd/db-writer.ts +105 -4
  441. package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
  442. package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
  443. package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
  444. package/src/resources/extensions/gsd/doctor-types.ts +0 -23
  445. package/src/resources/extensions/gsd/doctor.ts +45 -295
  446. package/src/resources/extensions/gsd/file-watcher.ts +4 -1
  447. package/src/resources/extensions/gsd/files.ts +16 -220
  448. package/src/resources/extensions/gsd/git-service.ts +4 -0
  449. package/src/resources/extensions/gsd/gitignore.ts +4 -0
  450. package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
  451. package/src/resources/extensions/gsd/guided-flow.ts +20 -8
  452. package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
  453. package/src/resources/extensions/gsd/md-importer.ts +211 -2
  454. package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
  455. package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
  456. package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
  457. package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
  458. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  459. package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
  460. package/src/resources/extensions/gsd/preferences.ts +1 -0
  461. package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
  462. package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
  463. package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
  464. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
  465. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
  466. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
  467. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
  468. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
  469. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
  470. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
  471. package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
  472. package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
  473. package/src/resources/extensions/gsd/skill-health.ts +2 -1
  474. package/src/resources/extensions/gsd/state.ts +547 -29
  475. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  476. package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
  477. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  478. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
  479. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  480. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
  482. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  483. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  484. package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
  485. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
  486. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  487. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  488. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  489. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  490. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  491. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  492. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  493. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
  494. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
  495. package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
  496. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  497. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  498. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  499. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  500. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
  501. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  502. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  503. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  504. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
  505. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
  506. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  507. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  508. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  509. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  510. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
  511. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  512. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  513. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
  514. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  515. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
  516. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
  517. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  518. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
  519. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  520. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  521. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
  522. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  523. package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
  524. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  525. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  526. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  527. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  528. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
  529. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
  530. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  531. package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
  532. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  533. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  534. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  535. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  536. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
  537. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  538. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  539. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  540. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
  541. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  542. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  543. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  544. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  545. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
  546. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
  547. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
  548. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  549. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  550. package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
  551. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  552. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
  553. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  554. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  555. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  556. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
  557. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
  558. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  559. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  560. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  561. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  562. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  563. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  564. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  565. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  566. package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
  567. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  568. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
  571. package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
  572. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
  573. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  574. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
  575. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  576. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  577. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  578. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  579. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  580. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  581. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
  582. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  583. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
  584. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  585. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  586. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  587. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  588. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  589. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
  590. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
  591. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  592. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  593. package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
  594. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  595. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  596. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
  597. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  598. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  599. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  600. package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
  601. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  602. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  603. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
  604. package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
  605. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  606. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  607. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
  608. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
  609. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  610. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  611. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  612. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  613. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  614. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  615. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  616. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  617. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  618. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  619. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  620. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
  621. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  622. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  623. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  624. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  625. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  626. package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
  627. package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
  628. package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
  629. package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
  630. package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
  631. package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
  632. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
  633. package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
  634. package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
  635. package/src/resources/extensions/gsd/types.ts +50 -0
  636. package/src/resources/extensions/gsd/undo.ts +247 -3
  637. package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
  638. package/src/resources/extensions/gsd/workspace-index.ts +64 -46
  639. package/dist/resources/extensions/gsd/auto-observability.js +0 -56
  640. package/dist/resources/extensions/gsd/observability-validator.js +0 -422
  641. package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
  642. package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
  644. package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  645. package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
  646. package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
  647. package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
  648. package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
  649. package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
  650. package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
  651. package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
  652. package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
  653. package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
  656. package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
  657. package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
  658. package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
  659. package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
  660. package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
  661. package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
  662. package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
  663. package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
  664. package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
  665. package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
  666. package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
  667. package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
  668. package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
  669. package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
  670. package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
  671. package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
  672. package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
  673. package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
  674. package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
  675. package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
  676. package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
  677. package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
  678. package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
  679. package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
  680. package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
  681. package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
  682. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
  683. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
  684. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
  685. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
  686. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
  687. package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
  688. package/src/resources/extensions/gsd/auto-observability.ts +0 -74
  689. package/src/resources/extensions/gsd/observability-validator.ts +0 -456
  690. package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
  691. package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
  692. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
  693. /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
@@ -130,119 +130,119 @@ test("auto-loop 'all milestones complete' path merges before stopping (#962)", (
130
130
 
131
131
  // ─── Integration: single milestone completes → merged to main ────────────────
132
132
 
133
- test("single milestone worktree is merged to main when all complete (#962)", () => {
133
+ test("single milestone worktree is merged to main when all complete (#962)", (t) => {
134
134
  const savedCwd = process.cwd();
135
135
  let tempDir = "";
136
136
 
137
- try {
138
- tempDir = createTempRepo();
139
-
140
- // Set up a single milestone
141
- createMilestoneArtifacts(tempDir, "M001");
142
- run("git add .", tempDir);
143
- run('git commit -m "add milestone"', tempDir);
144
-
145
- // Create worktree and simulate work
146
- const wt = createAutoWorktree(tempDir, "M001");
147
- assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
148
-
149
- writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
150
- run("git add .", wt);
151
- run('git commit -m "feat(M001): add feature"', wt);
152
-
153
- // Simulate the fix: merge before stopping (what the "all complete" path now does)
154
- const roadmapPath = join(
155
- tempDir,
156
- ".gsd",
157
- "milestones",
158
- "M001",
159
- "M001-ROADMAP.md",
160
- );
161
- const roadmapContent = readFileSync(roadmapPath, "utf-8");
162
- const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
163
-
164
- // Verify work is on main
165
- assert.ok(
166
- existsSync(join(tempDir, "feature.ts")),
167
- "feature.ts should be on main after merge",
168
- );
169
- assert.equal(process.cwd(), tempDir, "cwd restored to project root");
170
- assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
171
- assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
172
-
173
- // Verify milestone branch was cleaned up
174
- const branches = run("git branch", tempDir);
175
- assert.ok(
176
- !branches.includes("milestone/M001"),
177
- "milestone branch should be deleted",
178
- );
179
-
180
- // Verify squash commit on main
181
- const log = run("git log --oneline -3", tempDir);
182
- assert.ok(
183
- log.includes("M001"),
184
- "squash commit on main should reference M001",
185
- );
186
-
187
- assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
188
- } finally {
137
+ t.after(() => {
189
138
  process.chdir(savedCwd);
190
139
  if (tempDir && existsSync(tempDir)) {
191
- rmSync(tempDir, { recursive: true, force: true });
140
+ rmSync(tempDir, { recursive: true, force: true });
192
141
  }
193
- }
142
+ });
143
+
144
+ tempDir = createTempRepo();
145
+
146
+ // Set up a single milestone
147
+ createMilestoneArtifacts(tempDir, "M001");
148
+ run("git add .", tempDir);
149
+ run('git commit -m "add milestone"', tempDir);
150
+
151
+ // Create worktree and simulate work
152
+ const wt = createAutoWorktree(tempDir, "M001");
153
+ assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
154
+
155
+ writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
156
+ run("git add .", wt);
157
+ run('git commit -m "feat(M001): add feature"', wt);
158
+
159
+ // Simulate the fix: merge before stopping (what the "all complete" path now does)
160
+ const roadmapPath = join(
161
+ tempDir,
162
+ ".gsd",
163
+ "milestones",
164
+ "M001",
165
+ "M001-ROADMAP.md",
166
+ );
167
+ const roadmapContent = readFileSync(roadmapPath, "utf-8");
168
+ const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
169
+
170
+ // Verify work is on main
171
+ assert.ok(
172
+ existsSync(join(tempDir, "feature.ts")),
173
+ "feature.ts should be on main after merge",
174
+ );
175
+ assert.equal(process.cwd(), tempDir, "cwd restored to project root");
176
+ assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
177
+ assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
178
+
179
+ // Verify milestone branch was cleaned up
180
+ const branches = run("git branch", tempDir);
181
+ assert.ok(
182
+ !branches.includes("milestone/M001"),
183
+ "milestone branch should be deleted",
184
+ );
185
+
186
+ // Verify squash commit on main
187
+ const log = run("git log --oneline -3", tempDir);
188
+ assert.ok(
189
+ log.includes("M001"),
190
+ "squash commit on main should reference M001",
191
+ );
192
+
193
+ assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
194
194
  });
195
195
 
196
196
  // ─── Integration: last of multiple milestones completes → merged ─────────────
197
197
 
198
- test("last milestone worktree is merged when it's the final one (#962)", () => {
198
+ test("last milestone worktree is merged when it's the final one (#962)", (t) => {
199
199
  const savedCwd = process.cwd();
200
200
  let tempDir = "";
201
201
 
202
- try {
203
- tempDir = createTempRepo();
204
-
205
- // Set up two milestones
206
- createMilestoneArtifacts(tempDir, "M001");
207
- createMilestoneArtifacts(tempDir, "M002");
208
- run("git add .", tempDir);
209
- run('git commit -m "add milestones"', tempDir);
210
-
211
- // Complete M001 first (merge it)
212
- const wt1 = createAutoWorktree(tempDir, "M001");
213
- writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
214
- run("git add .", wt1);
215
- run('git commit -m "feat(M001): m001 work"', wt1);
216
- const roadmap1 = readFileSync(
217
- join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
218
- "utf-8",
219
- );
220
- mergeMilestoneToMain(tempDir, "M001", roadmap1);
221
-
222
- // Now complete M002 (the LAST milestone — this is the #962 scenario)
223
- const wt2 = createAutoWorktree(tempDir, "M002");
224
- writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
225
- run("git add .", wt2);
226
- run('git commit -m "feat(M002): m002 work"', wt2);
227
- const roadmap2 = readFileSync(
228
- join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
229
- "utf-8",
230
- );
231
- mergeMilestoneToMain(tempDir, "M002", roadmap2);
232
-
233
- // Both features should now be on main
234
- assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
235
- assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
236
- assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
237
-
238
- // Both milestone branches should be cleaned up
239
- const branches = run("git branch", tempDir);
240
- assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
241
- assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
242
- } finally {
202
+ t.after(() => {
243
203
  process.chdir(savedCwd);
244
204
  if (tempDir && existsSync(tempDir)) {
245
- rmSync(tempDir, { recursive: true, force: true });
205
+ rmSync(tempDir, { recursive: true, force: true });
246
206
  }
247
- }
207
+ });
208
+
209
+ tempDir = createTempRepo();
210
+
211
+ // Set up two milestones
212
+ createMilestoneArtifacts(tempDir, "M001");
213
+ createMilestoneArtifacts(tempDir, "M002");
214
+ run("git add .", tempDir);
215
+ run('git commit -m "add milestones"', tempDir);
216
+
217
+ // Complete M001 first (merge it)
218
+ const wt1 = createAutoWorktree(tempDir, "M001");
219
+ writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
220
+ run("git add .", wt1);
221
+ run('git commit -m "feat(M001): m001 work"', wt1);
222
+ const roadmap1 = readFileSync(
223
+ join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
224
+ "utf-8",
225
+ );
226
+ mergeMilestoneToMain(tempDir, "M001", roadmap1);
227
+
228
+ // Now complete M002 (the LAST milestone — this is the #962 scenario)
229
+ const wt2 = createAutoWorktree(tempDir, "M002");
230
+ writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
231
+ run("git add .", wt2);
232
+ run('git commit -m "feat(M002): m002 work"', wt2);
233
+ const roadmap2 = readFileSync(
234
+ join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
235
+ "utf-8",
236
+ );
237
+ mergeMilestoneToMain(tempDir, "M002", roadmap2);
238
+
239
+ // Both features should now be on main
240
+ assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
241
+ assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
242
+ assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
243
+
244
+ // Both milestone branches should be cleaned up
245
+ const branches = run("git branch", tempDir);
246
+ assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
247
+ assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
248
248
  });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tests for atomic task closeout (#1650):
3
- * 1. Doctor unmarks task checkbox when summary is missing (instead of creating stub)
4
- * 2. markTaskUndoneInPlan correctly unchecks a task in the slice plan
3
+ * Doctor no longer does checkbox reconciliation (reconciliation removed in S06).
4
+ * This file retains only the non-reconciliation behavior tests.
5
5
  */
6
6
 
7
7
  import { mkdirSync, writeFileSync, readFileSync, rmSync, existsSync } from "node:fs";
@@ -10,7 +10,6 @@ import { tmpdir } from "node:os";
10
10
  import test from "node:test";
11
11
  import assert from "node:assert/strict";
12
12
  import { runGSDDoctor } from "../doctor.ts";
13
- import { markTaskUndoneInPlan } from "../roadmap-mutations.ts";
14
13
 
15
14
  function makeTmp(name: string): string {
16
15
  const dir = join(tmpdir(), `atomic-closeout-${name}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
@@ -18,121 +17,6 @@ function makeTmp(name: string): string {
18
17
  return dir;
19
18
  }
20
19
 
21
- // ── markTaskUndoneInPlan ─────────────────────────────────────────────────────
22
-
23
- test("markTaskUndoneInPlan unchecks a checked task", () => {
24
- const base = makeTmp("uncheck");
25
- const planPath = join(base, "PLAN.md");
26
- writeFileSync(planPath, `# S01: Demo
27
-
28
- ## Tasks
29
-
30
- - [x] **T01: First task** \`est:5m\`
31
- - [ ] **T02: Second task** \`est:10m\`
32
- `);
33
-
34
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
35
- assert.ok(changed, "should return true when plan was modified");
36
-
37
- const content = readFileSync(planPath, "utf-8");
38
- assert.ok(content.includes("- [ ] **T01:"), "T01 should be unchecked");
39
- assert.ok(content.includes("- [ ] **T02:"), "T02 should remain unchecked");
40
-
41
- rmSync(base, { recursive: true, force: true });
42
- });
43
-
44
- test("markTaskUndoneInPlan is idempotent on already-unchecked task", () => {
45
- const base = makeTmp("uncheck-noop");
46
- const planPath = join(base, "PLAN.md");
47
- writeFileSync(planPath, `# S01: Demo
48
-
49
- ## Tasks
50
-
51
- - [ ] **T01: First task** \`est:5m\`
52
- `);
53
-
54
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
55
- assert.ok(!changed, "should return false when no change needed");
56
-
57
- rmSync(base, { recursive: true, force: true });
58
- });
59
-
60
- test("markTaskUndoneInPlan handles indented checkboxes", () => {
61
- const base = makeTmp("uncheck-indent");
62
- const planPath = join(base, "PLAN.md");
63
- writeFileSync(planPath, `# S01: Demo
64
-
65
- ## Tasks
66
-
67
- - [x] **T01: First task** \`est:5m\`
68
- `);
69
-
70
- const changed = markTaskUndoneInPlan(base, planPath, "T01");
71
- assert.ok(changed, "should handle indented checkboxes");
72
-
73
- const content = readFileSync(planPath, "utf-8");
74
- assert.ok(content.includes("[ ] **T01:"), "T01 should be unchecked");
75
-
76
- rmSync(base, { recursive: true, force: true });
77
- });
78
-
79
- // ── Doctor: task_done_missing_summary unchecks instead of stubbing ────────────
80
-
81
- test("doctor unchecks task when checkbox is marked but summary is missing", async () => {
82
- const base = makeTmp("doctor-uncheck");
83
- const gsd = join(base, ".gsd");
84
- const m = join(gsd, "milestones", "M001");
85
- const s = join(m, "slices", "S01");
86
- const t = join(s, "tasks");
87
- mkdirSync(t, { recursive: true });
88
-
89
- writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Test
90
-
91
- ## Slices
92
-
93
- - [ ] **S01: Test Slice** \`risk:low\` \`depends:[]\`
94
- > Demo
95
- `);
96
-
97
- // Task is marked [x] in plan but has no summary file
98
- writeFileSync(join(s, "S01-PLAN.md"), `# S01: Test Slice
99
-
100
- **Goal:** test
101
-
102
- ## Tasks
103
-
104
- - [x] **T01: Do stuff** \`est:5m\`
105
- - [ ] **T02: Other stuff** \`est:5m\`
106
- `);
107
-
108
- // T02 has no summary either, but it's unchecked — should be left alone
109
-
110
- // Run doctor in diagnose mode first
111
- const diagnoseReport = await runGSDDoctor(base, { fix: false });
112
- const issue = diagnoseReport.issues.find(i => i.code === "task_done_missing_summary");
113
- assert.ok(issue, "should detect task_done_missing_summary");
114
- assert.equal(issue!.severity, "error");
115
-
116
- // Run doctor in fix mode
117
- const fixReport = await runGSDDoctor(base, { fix: true });
118
- const fixApplied = fixReport.fixesApplied.some(f => f.includes("unchecked T01"));
119
- assert.ok(fixApplied, "should have unchecked T01 in the fix log");
120
-
121
- // Verify the plan now has T01 unchecked
122
- const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
123
- assert.ok(planContent.includes("- [ ] **T01:"), "T01 should be unchecked after doctor fix");
124
- assert.ok(planContent.includes("- [ ] **T02:"), "T02 should remain unchecked");
125
-
126
- // Verify no stub summary was created
127
- const stubPath = join(t, "T01-SUMMARY.md");
128
- assert.ok(
129
- !existsSync(stubPath),
130
- "should NOT create a stub summary — task should re-execute instead",
131
- );
132
-
133
- rmSync(base, { recursive: true, force: true });
134
- });
135
-
136
20
  test("doctor does not touch task with checkbox AND summary both present", async () => {
137
21
  const base = makeTmp("doctor-ok");
138
22
  const gsd = join(base, ".gsd");
@@ -173,8 +57,12 @@ Done.
173
57
  `);
174
58
 
175
59
  const report = await runGSDDoctor(base, { fix: true });
176
- const hasTaskIssue = report.issues.some(i => i.code === "task_done_missing_summary");
177
- assert.ok(!hasTaskIssue, "should not flag task_done_missing_summary when both exist");
60
+ // Doctor should not produce any task_done_missing_summary issue (code removed)
61
+ const hasOldCode = report.issues.some(i =>
62
+ i.code === "task_done_missing_summary" as any ||
63
+ i.code === "task_summary_without_done_checkbox" as any
64
+ );
65
+ assert.ok(!hasOldCode, "should not produce removed reconciliation issue codes");
178
66
 
179
67
  // Plan should still have T01 checked
180
68
  const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
@@ -110,26 +110,24 @@ test("clearLock is safe when no lock file exists", () => {
110
110
  rmSync(dir, { recursive: true, force: true });
111
111
  });
112
112
 
113
- test("bootstrap cleanup releases session lock artifacts", () => {
113
+ test("bootstrap cleanup releases session lock artifacts", (t) => {
114
114
  const dir = mkdtempSync(join(tmpdir(), "gsd-lock-test-"));
115
115
  mkdirSync(join(dir, ".gsd"), { recursive: true });
116
116
 
117
- try {
118
- const result = acquireSessionLock(dir);
119
- assert.equal(result.acquired, true, "session lock should be acquired");
120
- assert.ok(existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should exist while lock is held");
121
- if (properLockfileAvailable) {
122
- assert.ok(existsSync(join(dir, ".gsd.lock")), ".gsd.lock should exist while lock is held");
123
- }
124
-
125
- releaseSessionLock(dir);
126
- clearLock(dir);
127
-
128
- assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
129
- assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
130
- } finally {
131
- rmSync(dir, { recursive: true, force: true });
117
+ t.after(() => rmSync(dir, { recursive: true, force: true }));
118
+
119
+ const result = acquireSessionLock(dir);
120
+ assert.equal(result.acquired, true, "session lock should be acquired");
121
+ assert.ok(existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should exist while lock is held");
122
+ if (properLockfileAvailable) {
123
+ assert.ok(existsSync(join(dir, ".gsd.lock")), ".gsd.lock should exist while lock is held");
132
124
  }
125
+
126
+ releaseSessionLock(dir);
127
+ clearLock(dir);
128
+
129
+ assert.ok(!existsSync(join(dir, ".gsd", "auto.lock")), "auto.lock should be removed by bootstrap cleanup");
130
+ assert.ok(!existsSync(join(dir, ".gsd.lock")), ".gsd.lock should be removed by bootstrap cleanup");
133
131
  });
134
132
 
135
133
  // ─── isLockProcessAlive detects live vs dead PIDs ────────────────────────
@@ -366,8 +366,6 @@ function makeMockDeps(
366
366
  runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
367
367
  getPriorSliceCompletionBlocker: () => null,
368
368
  getMainBranch: () => "main",
369
- collectObservabilityWarnings: async () => [],
370
- buildObservabilityRepairBlock: () => null,
371
369
  closeoutUnit: async () => {},
372
370
  verifyExpectedArtifact: () => true,
373
371
  clearUnitRuntimeRecord: () => {},
@@ -2069,7 +2067,7 @@ test("autoLoop stops when worktree has no .git for execute-task (#1833)", async
2069
2067
  );
2070
2068
  });
2071
2069
 
2072
- test("autoLoop stops when worktree has no project files for execute-task (#1833)", async () => {
2070
+ test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async () => {
2073
2071
  _resetPendingResolve();
2074
2072
 
2075
2073
  const ctx = makeMockCtx();
@@ -2078,10 +2076,17 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
2078
2076
  const pi = makeMockPi();
2079
2077
 
2080
2078
  const notifications: string[] = [];
2081
- ctx.ui.notify = (msg: string) => { notifications.push(msg); };
2082
-
2083
2079
  const s = makeLoopSession({ basePath: "/tmp/empty-worktree" });
2084
2080
 
2081
+ ctx.ui.notify = (msg: string) => {
2082
+ notifications.push(msg);
2083
+ // Terminate the loop after the greenfield warning fires,
2084
+ // so we don't hang waiting for dispatch resolution.
2085
+ if (msg.includes("greenfield")) {
2086
+ s.active = false;
2087
+ }
2088
+ };
2089
+
2085
2090
  const deps = makeMockDeps({
2086
2091
  deriveState: async () => {
2087
2092
  deps.callLog.push("deriveState");
@@ -2100,15 +2105,19 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
2100
2105
 
2101
2106
  await autoLoop(ctx, pi, s, deps);
2102
2107
 
2108
+ // Should NOT have stopped auto-mode due to health check — greenfield is allowed
2109
+ const stoppedForHealth = notifications.find(
2110
+ (n) => n.includes("Worktree health check failed"),
2111
+ );
2103
2112
  assert.ok(
2104
- deps.callLog.includes("stopAuto"),
2105
- "should stop auto-mode when worktree has no project files",
2113
+ !stoppedForHealth,
2114
+ "should not stop with health check failure for greenfield project",
2106
2115
  );
2107
- const healthNotification = notifications.find(
2108
- (n) => n.includes("Worktree health check failed") && n.includes("no recognized project files"),
2116
+ const greenfieldWarning = notifications.find(
2117
+ (n) => n.includes("no recognized project files") && n.includes("greenfield"),
2109
2118
  );
2110
2119
  assert.ok(
2111
- healthNotification,
2112
- "should notify about missing project files in worktree",
2120
+ greenfieldWarning,
2121
+ "should warn about greenfield project (no project files)",
2113
2122
  );
2114
2123
  });
@@ -51,93 +51,79 @@ function cleanup(base: string): void {
51
51
  try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
52
52
  }
53
53
 
54
- test("resolveMilestonePath returns null for missing milestone", () => {
54
+ test("resolveMilestonePath returns null for missing milestone", (t) => {
55
55
  const base = makeTmpBase();
56
56
  mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
57
- try {
58
- const result = resolveMilestonePath(base, "M999");
59
- assert.equal(result, null, "should return null for non-existent milestone");
60
- } finally {
61
- cleanup(base);
62
- }
57
+ t.after(() => cleanup(base));
58
+
59
+ const result = resolveMilestonePath(base, "M999");
60
+ assert.equal(result, null, "should return null for non-existent milestone");
63
61
  });
64
62
 
65
- test("resolveMilestonePath returns path for existing milestone", () => {
63
+ test("resolveMilestonePath returns path for existing milestone", (t) => {
66
64
  const base = makeTmpBase();
67
65
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
68
- try {
69
- const result = resolveMilestonePath(base, "M001");
70
- assert.ok(result, "should return a path for existing milestone");
71
- assert.ok(result.includes("M001"), "path should contain the milestone ID");
72
- } finally {
73
- cleanup(base);
74
- }
66
+ t.after(() => cleanup(base));
67
+
68
+ const result = resolveMilestonePath(base, "M001");
69
+ assert.ok(result, "should return a path for existing milestone");
70
+ assert.ok(result.includes("M001"), "path should contain the milestone ID");
75
71
  });
76
72
 
77
- test("resolveMilestoneFile returns null when no SUMMARY exists", () => {
73
+ test("resolveMilestoneFile returns null when no SUMMARY exists", (t) => {
78
74
  const base = makeTmpBase();
79
75
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
80
- try {
81
- const result = resolveMilestoneFile(base, "M001", "SUMMARY");
82
- assert.equal(result, null, "should return null when no SUMMARY file");
83
- } finally {
84
- cleanup(base);
85
- }
76
+ t.after(() => cleanup(base));
77
+
78
+ const result = resolveMilestoneFile(base, "M001", "SUMMARY");
79
+ assert.equal(result, null, "should return null when no SUMMARY file");
86
80
  });
87
81
 
88
- test("resolveMilestoneFile returns path when SUMMARY exists (completed)", () => {
82
+ test("resolveMilestoneFile returns path when SUMMARY exists (completed)", (t) => {
89
83
  const base = makeTmpBase();
90
84
  const mDir = join(base, ".gsd", "milestones", "M001");
91
85
  mkdirSync(mDir, { recursive: true });
92
86
  writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
93
- try {
94
- const result = resolveMilestoneFile(base, "M001", "SUMMARY");
95
- assert.ok(result, "should return a path when SUMMARY exists");
96
- assert.ok(result.includes("SUMMARY"), "path should reference SUMMARY");
97
- } finally {
98
- cleanup(base);
99
- }
87
+ t.after(() => cleanup(base));
88
+
89
+ const result = resolveMilestoneFile(base, "M001", "SUMMARY");
90
+ assert.ok(result, "should return a path when SUMMARY exists");
91
+ assert.ok(result.includes("SUMMARY"), "path should reference SUMMARY");
100
92
  });
101
93
 
102
94
  // ─── Combined validation logic (mirrors auto.ts resume guard) ───────────────
103
95
 
104
- test("stale milestone: missing dir means paused session should be discarded", () => {
96
+ test("stale milestone: missing dir means paused session should be discarded", (t) => {
105
97
  const base = makeTmpBase();
106
98
  mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
107
- try {
108
- const mDir = resolveMilestonePath(base, "M999");
109
- const summaryFile = resolveMilestoneFile(base, "M999", "SUMMARY");
110
- const isStale = !mDir || !!summaryFile;
111
- assert.ok(isStale, "milestone that doesn't exist should be detected as stale");
112
- } finally {
113
- cleanup(base);
114
- }
99
+ t.after(() => cleanup(base));
100
+
101
+ const mDir = resolveMilestonePath(base, "M999");
102
+ const summaryFile = resolveMilestoneFile(base, "M999", "SUMMARY");
103
+ const isStale = !mDir || !!summaryFile;
104
+ assert.ok(isStale, "milestone that doesn't exist should be detected as stale");
115
105
  });
116
106
 
117
- test("stale milestone: completed (has SUMMARY) means paused session should be discarded", () => {
107
+ test("stale milestone: completed (has SUMMARY) means paused session should be discarded", (t) => {
118
108
  const base = makeTmpBase();
119
109
  const mDir = join(base, ".gsd", "milestones", "M001");
120
110
  mkdirSync(mDir, { recursive: true });
121
111
  writeFileSync(join(mDir, "M001-SUMMARY.md"), "# Summary\nDone.");
122
- try {
123
- const dir = resolveMilestonePath(base, "M001");
124
- const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
125
- const isStale = !dir || !!summaryFile;
126
- assert.ok(isStale, "milestone with SUMMARY should be detected as stale");
127
- } finally {
128
- cleanup(base);
129
- }
112
+ t.after(() => cleanup(base));
113
+
114
+ const dir = resolveMilestonePath(base, "M001");
115
+ const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
116
+ const isStale = !dir || !!summaryFile;
117
+ assert.ok(isStale, "milestone with SUMMARY should be detected as stale");
130
118
  });
131
119
 
132
- test("valid milestone: exists and has no SUMMARY means paused session is valid", () => {
120
+ test("valid milestone: exists and has no SUMMARY means paused session is valid", (t) => {
133
121
  const base = makeTmpBase();
134
122
  mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
135
- try {
136
- const dir = resolveMilestonePath(base, "M001");
137
- const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
138
- const isStale = !dir || !!summaryFile;
139
- assert.ok(!isStale, "active milestone should not be detected as stale");
140
- } finally {
141
- cleanup(base);
142
- }
123
+ t.after(() => cleanup(base));
124
+
125
+ const dir = resolveMilestonePath(base, "M001");
126
+ const summaryFile = resolveMilestoneFile(base, "M001", "SUMMARY");
127
+ const isStale = !dir || !!summaryFile;
128
+ assert.ok(!isStale, "active milestone should not be detected as stale");
143
129
  });
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
6
6
 
7
7
  import { runGSDDoctor, selectDoctorScope, filterDoctorIssues } from "../doctor.js";
8
8
 
9
- test("auto-preflight scopes to active milestone, ignoring historical", async () => {
9
+ test("auto-preflight scopes to active milestone, ignoring historical", async (t) => {
10
10
  const tmpBase = mkdtempSync(join(tmpdir(), "gsd-auto-preflight-test-"));
11
11
  const gsd = join(tmpBase, ".gsd");
12
12
 
@@ -23,18 +23,16 @@ test("auto-preflight scopes to active milestone, ignoring historical", async ()
23
23
  writeFileSync(join(gsd, "milestones", "M009", "M009-ROADMAP.md"), `# M009: Active\n\n## Slices\n- [ ] **S01: Active Slice** \`risk:low\` \`depends:[]\`\n > After this: active works\n`);
24
24
  writeFileSync(join(gsd, "milestones", "M009", "slices", "S01", "S01-PLAN.md"), `# S01: Active Slice\n\n**Goal:** Active\n**Demo:** Active\n\n## Must-Haves\n- done\n\n## Tasks\n- [ ] **T01: Active Task** \`est:5m\`\n todo\n`);
25
25
 
26
- try {
27
- const scope = await selectDoctorScope(tmpBase);
28
- assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
26
+ t.after(() => rmSync(tmpBase, { recursive: true, force: true }));
29
27
 
30
- const scopedReport = await runGSDDoctor(tmpBase, { fix: false, scope });
31
- const scopedBlocking = filterDoctorIssues(scopedReport.issues, { scope, includeWarnings: false });
32
- assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
28
+ const scope = await selectDoctorScope(tmpBase);
29
+ assert.equal(scope, "M009/S01", "active scope selected instead of historical milestone");
33
30
 
34
- const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
35
- const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
36
- assert.ok(historicalWarnings.length > 0, "full repo still contains historical warning drift");
37
- } finally {
38
- rmSync(tmpBase, { recursive: true, force: true });
39
- }
31
+ const scopedReport = await runGSDDoctor(tmpBase, { fix: false, scope });
32
+ const scopedBlocking = filterDoctorIssues(scopedReport.issues, { scope, includeWarnings: false });
33
+ assert.equal(scopedBlocking.length, 0, "no blocking issues in active scope");
34
+
35
+ const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
36
+ const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
37
+ assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
40
38
  });