gsd-pi 2.81.0 → 2.82.0-dev.20138ae42

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 (740) hide show
  1. package/README.md +64 -33
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  5. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  6. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  7. package/dist/resources/extensions/cmux/index.js +5 -0
  8. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  9. package/dist/resources/extensions/gsd/auto/loop.js +116 -13
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
  11. package/dist/resources/extensions/gsd/auto/phases.js +220 -98
  12. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  13. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  14. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  16. package/dist/resources/extensions/gsd/auto-dashboard.js +247 -178
  17. package/dist/resources/extensions/gsd/auto-dispatch.js +27 -17
  18. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  19. package/dist/resources/extensions/gsd/auto-post-unit.js +240 -128
  20. package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
  21. package/dist/resources/extensions/gsd/auto-recovery.js +34 -179
  22. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  23. package/dist/resources/extensions/gsd/auto-start.js +105 -35
  24. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  25. package/dist/resources/extensions/gsd/auto-verification.js +38 -26
  26. package/dist/resources/extensions/gsd/auto-worktree.js +119 -1
  27. package/dist/resources/extensions/gsd/auto.js +400 -108
  28. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +38 -12
  29. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +9 -8
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -4
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  32. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  33. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -2
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -1
  38. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  39. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  40. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  42. package/dist/resources/extensions/gsd/context-store.js +112 -0
  43. package/dist/resources/extensions/gsd/crash-recovery.js +31 -5
  44. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  45. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  46. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  47. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  48. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  49. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  50. package/dist/resources/extensions/gsd/doctor.js +2 -28
  51. package/dist/resources/extensions/gsd/export-html.js +27 -425
  52. package/dist/resources/extensions/gsd/git-service.js +41 -2
  53. package/dist/resources/extensions/gsd/gsd-db.js +8 -23
  54. package/dist/resources/extensions/gsd/guided-flow.js +93 -111
  55. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  56. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  57. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  58. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  59. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  60. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  61. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  62. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  63. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  64. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  65. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  66. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  67. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  68. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  69. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  70. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +62 -26
  74. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  75. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  76. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  77. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  80. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  83. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
  84. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -11
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  90. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  92. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  93. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  94. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  95. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  96. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  97. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +252 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +45 -0
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +82 -0
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  101. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  102. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  103. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  104. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  105. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  106. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  108. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  109. package/dist/resources/extensions/gsd/status-guards.js +4 -0
  110. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  111. package/dist/resources/extensions/gsd/templates/plan.md +8 -5
  112. package/dist/resources/extensions/gsd/templates/task-plan.md +4 -2
  113. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  114. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  115. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  116. package/dist/resources/extensions/gsd/tools/plan-slice.js +89 -14
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  118. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  119. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  120. package/dist/resources/extensions/gsd/validation.js +23 -1
  121. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  122. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  123. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  124. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  125. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  126. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  127. package/dist/resources/extensions/gsd/worktree-lifecycle.js +769 -319
  128. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  129. package/dist/resources/extensions/shared/html-shell.js +388 -0
  130. package/dist/resources/extensions/subagent/index.js +448 -78
  131. package/dist/resources/extensions/subagent/launch.js +77 -0
  132. package/dist/resources/extensions/subagent/run-store.js +148 -0
  133. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  134. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  135. package/dist/resources/extensions/visual-brief/index.js +5 -0
  136. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  137. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  138. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  139. package/dist/web/standalone/.next/BUILD_ID +1 -1
  140. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  141. package/dist/web/standalone/.next/build-manifest.json +4 -4
  142. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  143. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  144. package/dist/web/standalone/.next/required-server-files.json +3 -3
  145. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  146. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  156. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  166. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  185. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  215. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +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_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  221. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  237. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  241. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/index.html +1 -1
  251. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  252. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  253. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  254. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  256. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  257. package/dist/web/standalone/.next/server/app/page.js +2 -2
  258. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  259. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  261. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  262. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  263. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  264. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/middleware.js +2 -2
  267. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  269. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  270. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  271. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  272. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  273. package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
  274. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  275. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  276. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  277. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  278. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  279. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-9a4db269f9ed63ad.js} +1 -1
  280. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  281. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  282. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  283. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  284. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  285. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  286. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  287. package/dist/web/standalone/server.js +1 -1
  288. package/dist/welcome-screen.d.ts +0 -7
  289. package/dist/welcome-screen.js +60 -69
  290. package/package.json +6 -5
  291. package/packages/contracts/dist/rpc.test.js +7 -0
  292. package/packages/contracts/dist/rpc.test.js.map +1 -1
  293. package/packages/contracts/dist/workflow.d.ts +21 -0
  294. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  295. package/packages/contracts/dist/workflow.js +24 -0
  296. package/packages/contracts/dist/workflow.js.map +1 -1
  297. package/packages/contracts/src/rpc.test.ts +8 -0
  298. package/packages/contracts/src/workflow.ts +24 -0
  299. package/packages/daemon/package.json +2 -2
  300. package/packages/mcp-server/README.md +14 -3
  301. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  302. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  303. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  304. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  305. package/packages/mcp-server/package.json +2 -2
  306. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  307. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  308. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  309. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  310. package/packages/native/package.json +1 -1
  311. package/packages/native/tsconfig.json +2 -1
  312. package/packages/native/tsconfig.tsbuildinfo +1 -1
  313. package/packages/pi-agent-core/package.json +1 -1
  314. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  315. package/packages/pi-ai/dist/index.d.ts +2 -2
  316. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/index.js +1 -1
  318. package/packages/pi-ai/dist/index.js.map +1 -1
  319. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  320. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  321. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  322. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  323. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  324. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  325. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  326. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  327. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  329. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  330. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  331. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  332. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  333. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  334. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  335. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  336. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  337. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  338. package/packages/pi-ai/package.json +1 -1
  339. package/packages/pi-ai/src/index.ts +7 -2
  340. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  341. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  342. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  343. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  344. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  345. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  346. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  347. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  348. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  349. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  350. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  351. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  353. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  361. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  362. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  363. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  364. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  367. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  376. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  378. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  380. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  382. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +33 -42
  383. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  387. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  389. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  390. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  391. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  401. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  409. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  411. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  413. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  414. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  415. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  416. package/packages/pi-coding-agent/package.json +1 -1
  417. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  418. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  419. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  420. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  421. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  422. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  423. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  424. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  425. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  426. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  427. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  428. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +33 -44
  429. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  430. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  431. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  432. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  433. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  434. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  435. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  436. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  437. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  438. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  439. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  440. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  441. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  442. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  443. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  444. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  445. package/packages/pi-tui/dist/tui.js +5 -0
  446. package/packages/pi-tui/dist/tui.js.map +1 -1
  447. package/packages/pi-tui/package.json +1 -1
  448. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  449. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  450. package/packages/pi-tui/src/tui.ts +6 -0
  451. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  452. package/packages/rpc-client/package.json +1 -1
  453. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  454. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  455. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  456. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  457. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  458. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  459. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  460. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  461. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  462. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  463. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  464. package/pkg/package.json +1 -1
  465. package/src/resources/GSD-WORKFLOW.md +10 -1
  466. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  467. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  468. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  469. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  470. package/src/resources/extensions/cmux/index.ts +6 -0
  471. package/src/resources/extensions/gsd/auto/contracts.ts +59 -16
  472. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  473. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  474. package/src/resources/extensions/gsd/auto/loop.ts +121 -14
  475. package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
  476. package/src/resources/extensions/gsd/auto/phases.ts +180 -20
  477. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  478. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  479. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  480. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  481. package/src/resources/extensions/gsd/auto-dashboard.ts +301 -183
  482. package/src/resources/extensions/gsd/auto-dispatch.ts +29 -7
  483. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  484. package/src/resources/extensions/gsd/auto-post-unit.ts +273 -140
  485. package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
  486. package/src/resources/extensions/gsd/auto-recovery.ts +36 -209
  487. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  488. package/src/resources/extensions/gsd/auto-start.ts +114 -31
  489. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  490. package/src/resources/extensions/gsd/auto-verification.ts +46 -38
  491. package/src/resources/extensions/gsd/auto-worktree.ts +127 -1
  492. package/src/resources/extensions/gsd/auto.ts +441 -107
  493. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +54 -12
  494. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +9 -8
  495. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +16 -4
  496. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  497. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  498. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  499. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -3
  500. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  501. package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
  502. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -1
  503. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  504. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  505. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  506. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  507. package/src/resources/extensions/gsd/context-store.ts +120 -1
  508. package/src/resources/extensions/gsd/crash-recovery.ts +30 -4
  509. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  510. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  511. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  512. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  513. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  514. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  515. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  516. package/src/resources/extensions/gsd/doctor.ts +2 -27
  517. package/src/resources/extensions/gsd/export-html.ts +27 -427
  518. package/src/resources/extensions/gsd/git-service.ts +47 -1
  519. package/src/resources/extensions/gsd/gsd-db.ts +10 -23
  520. package/src/resources/extensions/gsd/guided-flow.ts +126 -128
  521. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  522. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  523. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  524. package/src/resources/extensions/gsd/journal.ts +2 -0
  525. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  526. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  527. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  528. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  529. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  530. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  531. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  532. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  533. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  534. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  535. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  536. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  537. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  538. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  539. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  540. package/src/resources/extensions/gsd/native-git-bridge.ts +68 -25
  541. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  542. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  543. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  544. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  545. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  546. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  547. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  548. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  549. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  550. package/src/resources/extensions/gsd/prompts/discuss-headless.md +28 -10
  551. package/src/resources/extensions/gsd/prompts/discuss.md +29 -11
  552. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  553. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  554. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  555. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  556. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  557. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  558. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  559. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  560. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  561. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  562. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  563. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  564. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +344 -0
  565. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
  566. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
  567. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  568. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  569. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  570. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  571. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  572. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  573. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  574. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  575. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  576. package/src/resources/extensions/gsd/status-guards.ts +5 -0
  577. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  578. package/src/resources/extensions/gsd/templates/plan.md +8 -5
  579. package/src/resources/extensions/gsd/templates/task-plan.md +4 -2
  580. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +170 -0
  582. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  583. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +783 -176
  584. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +487 -4
  585. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  586. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  587. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +12 -1
  588. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +15 -1
  589. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  590. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +19 -0
  591. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  592. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  593. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  594. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  595. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  596. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  597. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  598. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  599. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  600. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  601. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  602. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +43 -2
  603. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  604. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  605. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  606. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  607. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  608. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +79 -4
  609. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +83 -0
  610. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  611. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  612. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  613. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  614. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  615. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  616. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  617. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  618. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  619. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  620. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  621. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +17 -7
  622. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  623. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  624. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  625. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  626. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  627. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  628. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +129 -1
  629. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  630. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  631. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  632. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  633. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  634. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  635. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  636. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  637. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  638. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  639. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  640. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  641. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  642. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  643. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  644. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  645. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  646. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  647. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  648. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  649. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  650. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  651. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  652. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  653. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  654. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  655. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  656. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  657. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +225 -1
  658. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  659. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
  660. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  661. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  662. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  663. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  664. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  665. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  666. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +20 -1
  667. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  668. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +46 -2
  669. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  670. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  671. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  672. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +34 -0
  673. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  674. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  675. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  676. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1048 -0
  677. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  678. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  679. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  680. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  681. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  682. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +86 -7
  683. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  684. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  685. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  686. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +7 -1
  687. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  688. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  689. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  690. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +211 -59
  691. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  692. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  693. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +72 -0
  694. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  695. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  696. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  697. package/src/resources/extensions/gsd/tools/plan-slice.ts +98 -12
  698. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  699. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  700. package/src/resources/extensions/gsd/types.ts +1 -1
  701. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  702. package/src/resources/extensions/gsd/validation.ts +23 -1
  703. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  704. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  705. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  706. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  707. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  708. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  709. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  710. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1196 -518
  711. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  712. package/src/resources/extensions/shared/html-shell.ts +412 -0
  713. package/src/resources/extensions/subagent/index.ts +567 -103
  714. package/src/resources/extensions/subagent/launch.ts +131 -0
  715. package/src/resources/extensions/subagent/run-store.ts +218 -0
  716. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  717. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  718. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  719. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  720. package/src/resources/extensions/visual-brief/index.ts +8 -0
  721. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  722. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  723. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  724. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  725. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  726. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  727. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  728. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  729. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  730. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  731. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  732. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  733. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  734. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  735. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  736. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  737. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  738. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  739. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_buildManifest.js +0 -0
  740. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → xRy4LqKSNKdT7y6ATYyEl}/_ssgManifest.js +0 -0
@@ -296,7 +296,17 @@ export function formatProject(content) {
296
296
  */
297
297
  export function formatDecisions(content) {
298
298
  if (!content || !content.trim()) {
299
- return '# Decisions\n\n<!-- Append-only register of architectural and pattern decisions -->\n\n| ID | Decision | Rationale | Date |\n|----|----------|-----------|------|\n';
299
+ return [
300
+ '# Decisions Register',
301
+ '',
302
+ '<!-- Append-only. Never edit or remove existing rows.',
303
+ ' To reverse a decision, add a new row that supersedes it.',
304
+ ' Read this file at the start of any planning or research phase. -->',
305
+ '',
306
+ '| # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |',
307
+ '|---|------|-------|----------|--------|-----------|------------|---------|',
308
+ '',
309
+ ].join('\n');
300
310
  }
301
311
  return content.endsWith('\n') ? content : content + '\n';
302
312
  }
@@ -1,10 +1,8 @@
1
1
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
3
- import { clearEngineHierarchy, getAllMilestones, getMilestoneSlices, getSliceTasks, isDbAvailable, transaction, } from "./gsd-db.js";
4
- import { migrateHierarchyToDb } from "./md-importer.js";
3
+ import { getAllMilestones, getMilestoneSlices, getSliceTasks, isDbAvailable, } from "./gsd-db.js";
5
4
  import { parsePlan, parseRoadmap } from "./parsers-legacy.js";
6
5
  import { milestonesDir, resolveMilestoneFile, resolveSliceFile, } from "./paths.js";
7
- import { invalidateStateCache } from "./state.js";
8
6
  function zeroCounts() {
9
7
  return { milestones: 0, slices: 0, tasks: 0 };
10
8
  }
@@ -50,7 +48,7 @@ export function countDbHierarchy() {
50
48
  }
51
49
  return counts;
52
50
  }
53
- export async function autoImportMarkdownHierarchyIfDbMismatch(basePath) {
51
+ export async function checkMarkdownHierarchyAgainstDb(basePath) {
54
52
  const markdown = countMarkdownHierarchy(basePath);
55
53
  if (sameCounts(markdown, zeroCounts())) {
56
54
  return {
@@ -70,18 +68,15 @@ export async function autoImportMarkdownHierarchyIfDbMismatch(basePath) {
70
68
  return { action: "none", reason: "in-sync", markdown, beforeDb, afterDb: beforeDb };
71
69
  }
72
70
  const reason = sameCounts(beforeDb, zeroCounts()) ? "db-empty" : "count-mismatch";
73
- const imported = transaction(() => {
74
- clearEngineHierarchy();
75
- return migrateHierarchyToDb(basePath);
76
- });
77
- invalidateStateCache();
78
- const afterDb = {
79
- milestones: imported.milestones,
80
- slices: imported.slices,
81
- tasks: imported.tasks,
71
+ return {
72
+ action: "recovery-required",
73
+ reason,
74
+ markdown,
75
+ beforeDb,
76
+ afterDb: beforeDb,
77
+ recoveryCommand: "gsd recover",
78
+ message: `Markdown planning artifacts (${markdown.milestones}M/${markdown.slices}S/${markdown.tasks}T) ` +
79
+ `do not match the authoritative DB (${beforeDb.milestones}M/${beforeDb.slices}S/${beforeDb.tasks}T). ` +
80
+ "Runtime startup will not import markdown automatically; run explicit GSD recovery if markdown should repopulate the database.",
82
81
  };
83
- if (!sameCounts(markdown, afterDb)) {
84
- throw new Error(`migration auto-import verification failed: markdown ${markdown.milestones}M/${markdown.slices}S/${markdown.tasks}T, db ${afterDb.milestones}M/${afterDb.slices}S/${afterDb.tasks}T`);
85
- }
86
- return { action: "imported", reason, markdown, beforeDb, afterDb };
87
82
  }
@@ -19,6 +19,7 @@ import { deleteMilestone, getMilestone, isDbAvailable, updateMilestoneStatus } f
19
19
  import { removeWorktree } from "./worktree-manager.js";
20
20
  import { logWarning } from "./workflow-logger.js";
21
21
  import { isAutoActive } from "./auto.js";
22
+ import { isClosedStatus } from "./status-guards.js";
22
23
  /**
23
24
  * Writer-side assert for mutations that race with auto-mode's squash merge (#4704).
24
25
  * Auto-mode is confirmed not to call parkMilestone/discardMilestone/unparkMilestone
@@ -34,7 +35,7 @@ function assertNotAutoActive(action) {
34
35
  /**
35
36
  * Park a milestone — creates a PARKED.md marker file with reason and timestamp.
36
37
  * Parked milestones are skipped during active-milestone discovery but stay on disk.
37
- * Returns true if successfully parked, false if milestone not found or already parked.
38
+ * Returns true if successfully parked, false if milestone not found, already parked, or complete.
38
39
  */
39
40
  export function parkMilestone(basePath, milestoneId, reason) {
40
41
  assertNotAutoActive("park milestone");
@@ -42,9 +43,15 @@ export function parkMilestone(basePath, milestoneId, reason) {
42
43
  if (!mDir || !existsSync(mDir))
43
44
  return false;
44
45
  // Guard: do not park a completed milestone — it would corrupt depends_on satisfaction
45
- const summaryFile = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
46
- if (summaryFile)
46
+ const dbAvailable = isDbAvailable();
47
+ const milestone = dbAvailable ? getMilestone(milestoneId) : null;
48
+ if (milestone && isClosedStatus(milestone.status))
47
49
  return false;
50
+ if (!dbAvailable) {
51
+ const summaryFile = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
52
+ if (summaryFile)
53
+ return false;
54
+ }
48
55
  const parkedPath = join(mDir, buildMilestoneFileName(milestoneId, "PARKED"));
49
56
  if (existsSync(parkedPath))
50
57
  return false; // already parked
@@ -61,7 +68,7 @@ export function parkMilestone(basePath, milestoneId, reason) {
61
68
  ].join("\n");
62
69
  writeFileSync(parkedPath, content, "utf-8");
63
70
  // Sync DB status so deriveStateFromDb also skips this milestone (#2694)
64
- if (isDbAvailable()) {
71
+ if (dbAvailable) {
65
72
  try {
66
73
  updateMilestoneStatus(milestoneId, "parked");
67
74
  }
@@ -14,6 +14,8 @@ import { isInfrastructureError } from "./auto/infra-errors.js";
14
14
  // Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
15
15
  // caller explicitly opts into the native helper.
16
16
  const NATIVE_GSD_GIT_ENABLED = process.env.GSD_ENABLE_NATIVE_GSD_GIT === "1";
17
+ const TRANSIENT_GIT_RETRY_CODES = new Set(["ENOBUFS", "EAGAIN"]);
18
+ const GIT_RETRY_DELAY_MS = 200;
17
19
  // ─── Native Module Loading ──────────────────────────────────────────────────
18
20
  let nativeModule = null;
19
21
  let loadAttempted = false;
@@ -46,10 +48,42 @@ function gitExec(basePath, args, allowFailure = false) {
46
48
  env: GIT_NO_PROMPT_ENV,
47
49
  }).trim();
48
50
  }
49
- catch {
51
+ catch (err) {
50
52
  if (allowFailure)
51
53
  return "";
52
- throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}`);
54
+ throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}: ${getErrorMessage(err)}`);
55
+ }
56
+ }
57
+ /** sleepSync uses Atomics.wait for a blocking pause without busy-waiting; it blocks the current thread and requires Atomics.wait support. */
58
+ function sleepSync(ms) {
59
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
60
+ }
61
+ function isRetryableGitError(err) {
62
+ const code = isInfrastructureError(err)
63
+ ?? isInfrastructureError(err?.stderr ?? "");
64
+ return code !== null && TRANSIENT_GIT_RETRY_CODES.has(code);
65
+ }
66
+ function execGitFileSyncWithRetry(basePath, args, options) {
67
+ try {
68
+ return execFileSync("git", args, {
69
+ cwd: basePath,
70
+ stdio: ["ignore", "pipe", "pipe"],
71
+ encoding: "utf-8",
72
+ env: GIT_NO_PROMPT_ENV,
73
+ ...options,
74
+ }).trim();
75
+ }
76
+ catch (err) {
77
+ if (!isRetryableGitError(err))
78
+ throw err;
79
+ sleepSync(GIT_RETRY_DELAY_MS);
80
+ return execFileSync("git", args, {
81
+ cwd: basePath,
82
+ stdio: ["ignore", "pipe", "pipe"],
83
+ encoding: "utf-8",
84
+ env: GIT_NO_PROMPT_ENV,
85
+ ...options,
86
+ }).trim();
53
87
  }
54
88
  }
55
89
  /** Run a git command via execFileSync. Returns trimmed stdout. */
@@ -62,10 +96,10 @@ function gitFileExec(basePath, args, allowFailure = false) {
62
96
  env: GIT_NO_PROMPT_ENV,
63
97
  }).trim();
64
98
  }
65
- catch {
99
+ catch (err) {
66
100
  if (allowFailure)
67
101
  return "";
68
- throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}`);
102
+ throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}: ${getErrorMessage(err)}`);
69
103
  }
70
104
  }
71
105
  // ─── Existing Read Functions ──────────────────────────────────────────────
@@ -303,15 +337,20 @@ export function nativeDiffNameStatus(basePath, fromRef, toRef, pathspec, useMerg
303
337
  }
304
338
  /**
305
339
  * Get numstat diff between two refs.
340
+ * useMergeBase: if true, uses three-dot semantics.
306
341
  * Native: libgit2 patch line stats.
307
342
  * Fallback: `git diff --numstat`.
308
343
  */
309
- export function nativeDiffNumstat(basePath, fromRef, toRef) {
344
+ export function nativeDiffNumstat(basePath, fromRef, toRef, useMergeBase) {
310
345
  const native = loadNative();
311
- if (native) {
346
+ if (native && !useMergeBase) {
312
347
  return native.gitDiffNumstat(basePath, fromRef, toRef);
313
348
  }
314
- const result = gitExec(basePath, ["diff", "--numstat", fromRef, toRef], true);
349
+ const refspec = useMergeBase ? `${fromRef}...${toRef}` : undefined;
350
+ const args = refspec
351
+ ? ["diff", "--numstat", refspec]
352
+ : ["diff", "--numstat", fromRef, toRef];
353
+ const result = gitExec(basePath, args, true);
315
354
  if (!result)
316
355
  return [];
317
356
  return result.split("\n").filter(Boolean).map(line => {
@@ -551,21 +590,21 @@ export function nativeAddAll(basePath) {
551
590
  export function nativeAddTracked(basePath) {
552
591
  gitFileExec(basePath, ["add", "-u"]);
553
592
  }
554
- function isDotGsdIgnored(basePath) {
555
- for (const path of [".gsd", ".gsd/"]) {
556
- try {
557
- execFileSync("git", ["check-ignore", "-q", path], {
558
- cwd: basePath,
559
- stdio: "pipe",
560
- env: GIT_NO_PROMPT_ENV,
561
- });
562
- return true;
563
- }
564
- catch {
565
- // exit 1 means this form is not ignored; try the next variant
566
- }
593
+ export function nativeIsIgnored(basePath, path) {
594
+ try {
595
+ execFileSync("git", ["check-ignore", "-q", "--", path], {
596
+ cwd: basePath,
597
+ stdio: "pipe",
598
+ env: GIT_NO_PROMPT_ENV,
599
+ });
600
+ return true;
601
+ }
602
+ catch {
603
+ return false;
567
604
  }
568
- return false;
605
+ }
606
+ function isDotGsdIgnored(basePath) {
607
+ return [".gsd", ".gsd/"].some(path => nativeIsIgnored(basePath, path));
569
608
  }
570
609
  /**
571
610
  * Determine whether the project opts out of GSD-managed `.gitignore` via
@@ -777,13 +816,10 @@ export function nativeCommit(basePath, message, options) {
777
816
  const args = ["commit", "-F", "-"];
778
817
  if (options?.allowEmpty)
779
818
  args.push("--allow-empty");
780
- const result = execFileSync("git", args, {
781
- cwd: basePath,
819
+ const result = execGitFileSyncWithRetry(basePath, args, {
782
820
  stdio: ["pipe", "pipe", "pipe"],
783
- encoding: "utf-8",
784
- env: GIT_NO_PROMPT_ENV,
785
821
  input: message,
786
- }).trim();
822
+ });
787
823
  return result;
788
824
  }
789
825
  catch (err) {
@@ -1,11 +1,25 @@
1
- // GSD Extension — Notification History Overlay
2
- // Scrollable panel showing all persisted notifications with severity filtering.
3
- // Toggled with Ctrl+Alt+N (⌃⌥N on macOS), Ctrl+Shift+N fallback, or /gsd notifications.
4
- import { truncateToWidth, visibleWidth, wrapTextWithAnsi, matchesKey, Key } from "@gsd/pi-tui";
1
+ // Project/App: GSD-2
2
+ // File Purpose: Notification history overlay with severity filtering and width-safe TUI rendering.
3
+ import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
5
4
  import { readNotifications, markAllRead, clearNotifications, onNotificationStoreChange, } from "./notification-store.js";
6
5
  import { formattedShortcutPair } from "./shortcut-defs.js";
7
- import { padRight, joinColumns } from "../shared/mod.js";
8
- const FILTER_CYCLE = ["all", "error", "warning", "info"];
6
+ import { padRightVisible, renderFrame, renderKeyHints, rightAlign, wrapVisibleText, } from "./tui/render-kit.js";
7
+ const FILTER_CYCLE = ["all", "error", "warning", "success", "info"];
8
+ const OVERLAY_WIDTH = "58%";
9
+ const OVERLAY_MIN_WIDTH = 68;
10
+ const OVERLAY_MAX_HEIGHT_PERCENT = 52;
11
+ const OVERLAY_MARGIN = { top: 2, right: 2, bottom: 6, left: 2 };
12
+ export function notificationOverlayOptions() {
13
+ return {
14
+ width: OVERLAY_WIDTH,
15
+ minWidth: OVERLAY_MIN_WIDTH,
16
+ maxHeight: `${OVERLAY_MAX_HEIGHT_PERCENT}%`,
17
+ anchor: "top-center",
18
+ row: "24%",
19
+ margin: OVERLAY_MARGIN,
20
+ backdrop: true,
21
+ };
22
+ }
9
23
  function severityIcon(severity) {
10
24
  switch (severity) {
11
25
  case "error": return "✗";
@@ -15,15 +29,6 @@ function severityIcon(severity) {
15
29
  default: return "●";
16
30
  }
17
31
  }
18
- /** Column-aware word wrap using pi-tui's native wrapper (handles unicode/ANSI). */
19
- function wrapText(text, maxWidth) {
20
- if (maxWidth <= 0)
21
- return [text];
22
- const lines = wrapTextWithAnsi(text, maxWidth);
23
- // Safety clamp: if any line still exceeds maxWidth (e.g. unbreakable long token),
24
- // truncate it with an ellipsis so it cannot bleed past the box border.
25
- return lines.map((l) => visibleWidth(l) > maxWidth ? truncateToWidth(l, maxWidth, "…") : l);
26
- }
27
32
  function formatTimestamp(ts) {
28
33
  try {
29
34
  const d = new Date(ts);
@@ -155,12 +160,15 @@ export class GSDNotificationOverlay {
155
160
  return this.cachedLines;
156
161
  }
157
162
  const content = this.buildContentLines(width);
158
- const maxVisibleRows = Math.max(5, process.stdout.rows ? process.stdout.rows - 8 : 24) - 2;
163
+ const terminalRows = process.stdout.rows || 32;
164
+ const availableRows = Math.max(1, terminalRows - OVERLAY_MARGIN.top - OVERLAY_MARGIN.bottom);
165
+ const overlayRows = Math.min(availableRows, Math.max(1, Math.floor((terminalRows * OVERLAY_MAX_HEIGHT_PERCENT) / 100)));
166
+ const maxVisibleRows = Math.max(5, overlayRows - 2);
159
167
  const visibleContentRows = Math.min(content.length, maxVisibleRows);
160
168
  const maxScroll = Math.max(0, content.length - visibleContentRows);
161
169
  this.scrollOffset = Math.min(this.scrollOffset, maxScroll);
162
170
  const visibleContent = content.slice(this.scrollOffset, this.scrollOffset + visibleContentRows);
163
- const lines = this.wrapInBox(visibleContent, width);
171
+ const lines = renderFrame(this.theme, visibleContent, width);
164
172
  this.cachedWidth = width;
165
173
  this.cachedLines = lines;
166
174
  return lines;
@@ -192,30 +200,14 @@ export class GSDNotificationOverlay {
192
200
  this.tui.requestRender();
193
201
  }
194
202
  }
195
- wrapInBox(inner, width) {
196
- const th = this.theme;
197
- const border = (s) => th.fg("borderAccent", s);
198
- const innerWidth = width - 4;
199
- const lines = [];
200
- lines.push(border("╭" + "─".repeat(width - 2) + "╮"));
201
- for (const line of inner) {
202
- const truncated = truncateToWidth(line, innerWidth);
203
- const padWidth = Math.max(0, innerWidth - visibleWidth(truncated));
204
- lines.push(border("│") + " " + truncated + " ".repeat(padWidth) + " " + border("│"));
205
- }
206
- lines.push(border("╰" + "─".repeat(width - 2) + "╯"));
207
- return lines;
208
- }
209
203
  buildContentLines(width) {
210
204
  const th = this.theme;
211
- const shellWidth = width - 4;
212
- const contentWidth = Math.min(shellWidth, 128);
213
- const sidePad = Math.max(0, Math.floor((shellWidth - contentWidth) / 2));
214
- const leftMargin = " ".repeat(sidePad);
205
+ const shellWidth = Math.max(1, width - 4);
206
+ const contentWidth = shellWidth;
215
207
  const lines = [];
216
208
  const row = (content = "") => {
217
209
  const truncated = truncateToWidth(content, contentWidth);
218
- return leftMargin + padRight(truncated, contentWidth);
210
+ return padRightVisible(truncated, contentWidth);
219
211
  };
220
212
  const blank = () => row("");
221
213
  const hr = () => row(th.fg("dim", "─".repeat(contentWidth)));
@@ -223,13 +215,16 @@ export class GSDNotificationOverlay {
223
215
  const title = th.fg("accent", th.bold("Notifications"));
224
216
  const filterLabel = this.filter === "all"
225
217
  ? th.fg("dim", "all")
226
- : th.fg(this.filter === "error" ? "error" : this.filter === "warning" ? "warning" : "dim", this.filter);
218
+ : th.fg(this.filter === "error" ? "error"
219
+ : this.filter === "warning" ? "warning"
220
+ : this.filter === "success" ? "success"
221
+ : "dim", this.filter);
227
222
  const count = `${this.filteredEntries.length} entries`;
228
- lines.push(row(joinColumns(`${title} ${th.fg("dim", "filter:")} ${filterLabel}`, th.fg("dim", count), contentWidth)));
223
+ lines.push(row(rightAlign(`${title} ${th.fg("dim", "filter:")} ${filterLabel}`, th.fg("dim", count), contentWidth)));
229
224
  lines.push(hr());
230
225
  // Controls
231
226
  const closeShortcut = formattedShortcutPair("notifications");
232
- lines.push(row(th.fg("dim", `↑/↓ scroll f filter c clear Esc close (${closeShortcut})`)));
227
+ lines.push(row(renderKeyHints(th, ["↑/↓ scroll", "f filter", "c clear", `Esc/${closeShortcut} close`], contentWidth)));
233
228
  lines.push(blank());
234
229
  // Entries
235
230
  const filtered = this.filteredEntries;
@@ -254,7 +249,7 @@ export class GSDNotificationOverlay {
254
249
  const prefixWidth = visibleWidth(prefix);
255
250
  const msgMaxWidth = Math.max(10, contentWidth - prefixWidth);
256
251
  // Wrap long messages onto continuation lines indented to align with message start
257
- const msgLines = wrapText(entry.message, msgMaxWidth);
252
+ const msgLines = wrapVisibleText(entry.message, msgMaxWidth);
258
253
  const indent = " ".repeat(prefixWidth);
259
254
  for (let i = 0; i < msgLines.length; i++) {
260
255
  if (i === 0) {
@@ -7,9 +7,10 @@
7
7
  import { existsSync, readdirSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { spawnSync } from "node:child_process";
10
- import { loadFile } from "./files.js";
11
- import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
12
- import { mergeMilestoneToMain } from "./auto-worktree.js";
10
+ import { resolveGsdPathContract } from "./paths.js";
11
+ import { getAutoWorktreePath } from "./auto-worktree.js";
12
+ import { buildWorktreeLifecycleDeps } from "./auto.js";
13
+ import { mergeMilestoneStandalone, } from "./worktree-lifecycle.js";
13
14
  import { MergeConflictError } from "./git-service.js";
14
15
  import { removeSessionStatus } from "./session-status-io.js";
15
16
  import { getErrorMessage } from "./error-utils.js";
@@ -105,37 +106,42 @@ export function determineMergeOrder(workers, order = "sequential", basePath) {
105
106
  }
106
107
  /**
107
108
  * Attempt to merge a single milestone's worktree back to main.
108
- * Wraps mergeMilestoneToMain with error handling for parallel context.
109
+ *
110
+ * Routes through `WorktreeLifecycle.mergeMilestoneStandalone` so parallel
111
+ * callers get the same projection-finalize / roadmap-fallback / secondary-
112
+ * teardown invariants as the single-loop path. Closes the parallel-merge
113
+ * bypass that ADR-016 names (issue #5618).
109
114
  */
110
115
  export async function mergeCompletedMilestone(basePath, milestoneId) {
116
+ // Resolve the worktree path explicitly; parallel-merge has no AutoSession
117
+ // to read it from. Only use the worktree path when git actually knows
118
+ // about it (`getAutoWorktreePath` returns non-null). When the directory
119
+ // exists on disk but isn't a registered git worktree (e.g. a stale
120
+ // session-status marker dir), fall back to the project root and let the
121
+ // standalone's mode detection pick branch-mode or skipped — using the
122
+ // un-registered dir as `worktreeBasePath` would cause `getCurrentBranch`
123
+ // to fail with a "Worktree HEAD diverged" error.
124
+ const registeredWtPath = getAutoWorktreePath(basePath, milestoneId);
125
+ const worktreeBasePath = registeredWtPath ?? basePath;
126
+ let result;
111
127
  try {
112
- // Load the roadmap content (needed by mergeMilestoneToMain)
113
- const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
114
- if (!roadmapPath) {
115
- return {
116
- milestoneId,
117
- success: false,
118
- error: `No roadmap found for ${milestoneId}`,
119
- };
120
- }
121
- const roadmapContent = await loadFile(roadmapPath);
122
- if (!roadmapContent) {
123
- return {
124
- milestoneId,
125
- success: false,
126
- error: `Could not read roadmap for ${milestoneId}`,
127
- };
128
- }
129
- // Attempt the merge
130
- const result = mergeMilestoneToMain(basePath, milestoneId, roadmapContent);
131
- // Clean up parallel session status
132
- removeSessionStatus(basePath, milestoneId);
133
- return {
128
+ result = mergeMilestoneStandalone(buildWorktreeLifecycleDeps(), {
129
+ originalBasePath: basePath,
130
+ worktreeBasePath,
134
131
  milestoneId,
135
- success: true,
136
- commitMessage: result.commitMessage,
137
- pushed: result.pushed,
138
- };
132
+ // Parallel context never runs with degraded isolation — workers only
133
+ // exist when isolation succeeded. Pass `false` explicitly so the
134
+ // standalone's degraded-skip branch is not reached.
135
+ isolationDegraded: false,
136
+ notify: (msg, level) => {
137
+ // Surface user-visible messages from the standalone through the
138
+ // workflow logger so the parallel merge's progress is visible in
139
+ // the same channel as the rest of the parallel orchestration.
140
+ if (level === "error" || level === "warning") {
141
+ logWarning("parallel", `${milestoneId}: ${msg}`);
142
+ }
143
+ },
144
+ });
139
145
  }
140
146
  catch (err) {
141
147
  if (err instanceof MergeConflictError) {
@@ -152,6 +158,23 @@ export async function mergeCompletedMilestone(basePath, milestoneId) {
152
158
  error: getErrorMessage(err),
153
159
  };
154
160
  }
161
+ if (!result.merged) {
162
+ return {
163
+ milestoneId,
164
+ success: false,
165
+ error: result.mode === "skipped"
166
+ ? `Merge skipped for ${milestoneId} (mode=none or isolation degraded).`
167
+ : `No roadmap for ${milestoneId} — milestone branch preserved for manual merge.`,
168
+ };
169
+ }
170
+ // Clean up parallel session status — only on a real merge.
171
+ removeSessionStatus(basePath, milestoneId);
172
+ return {
173
+ milestoneId,
174
+ success: true,
175
+ commitMessage: result.commitMessage,
176
+ pushed: result.pushed,
177
+ };
155
178
  }
156
179
  /**
157
180
  * Merge all completed milestones in sequence.
@@ -1,12 +1,5 @@
1
- /**
2
- * GSD Parallel Monitor Overlay
3
- *
4
- * Full-screen TUI overlay showing real-time parallel worker progress.
5
- * Opened via `/gsd parallel watch`, Ctrl+Alt+P (⌃⌥P on macOS),
6
- * or Ctrl+Shift+P fallback.
7
- * Reads the same data sources as `scripts/parallel-monitor.mjs` but
8
- * renders as a native pi-tui overlay with theme integration.
9
- */
1
+ // Project/App: GSD-2
2
+ // File Purpose: Parallel worker monitor overlay with width-safe operations-console rendering.
10
3
  import { existsSync, statSync, readFileSync, openSync, readSync, closeSync, readdirSync } from "node:fs";
11
4
  import { join } from "node:path";
12
5
  import { spawnSync } from "node:child_process";
@@ -14,6 +7,7 @@ import { matchesKey, Key } from "@gsd/pi-tui";
14
7
  import { formatDuration } from "../shared/mod.js";
15
8
  import { formattedShortcutPair } from "./shortcut-defs.js";
16
9
  import { resolveGsdPathContract } from "./paths.js";
10
+ import { renderBar, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
17
11
  // ─── Data Helpers ─────────────────────────────────────────────────────────
18
12
  function readJsonSafe(filePath) {
19
13
  try {
@@ -226,17 +220,6 @@ function unitTypeLabel(unitType) {
226
220
  };
227
221
  return labels[unitType || ""] || (unitType || "---").toUpperCase().slice(0, 5);
228
222
  }
229
- function progressBar(done, total, width) {
230
- if (total === 0)
231
- return "░".repeat(width);
232
- const filled = Math.round((done / total) * width);
233
- return "█".repeat(filled) + "░".repeat(width - filled);
234
- }
235
- function healthGlyph(alive, heartbeatAge) {
236
- if (!alive)
237
- return "○";
238
- return "●";
239
- }
240
223
  // ─── Overlay Class ────────────────────────────────────────────────────────
241
224
  export class ParallelMonitorOverlay {
242
225
  tui;
@@ -247,6 +230,7 @@ export class ParallelMonitorOverlay {
247
230
  workers = [];
248
231
  events = [];
249
232
  cachedLines;
233
+ cachedWidth;
250
234
  scrollOffset = 0;
251
235
  disposed = false;
252
236
  resizeHandler = null;
@@ -279,6 +263,7 @@ export class ParallelMonitorOverlay {
279
263
  }
280
264
  this.events = this.events.slice(-10);
281
265
  this.cachedLines = undefined;
266
+ this.cachedWidth = undefined;
282
267
  this.tui.requestRender();
283
268
  }
284
269
  dispose() {
@@ -313,13 +298,14 @@ export class ParallelMonitorOverlay {
313
298
  }
314
299
  invalidate() {
315
300
  this.cachedLines = undefined;
301
+ this.cachedWidth = undefined;
316
302
  }
317
303
  render(width) {
318
- if (this.cachedLines)
304
+ if (this.cachedLines && this.cachedWidth === width)
319
305
  return this.cachedLines;
320
306
  const t = this.theme;
321
307
  const lines = [];
322
- const w = Math.max(width, 60);
308
+ const w = Math.max(1, width);
323
309
  // Header
324
310
  const totalCost = this.workers.reduce((s, wk) => s + wk.cost, 0);
325
311
  const aliveCount = this.workers.filter((wk) => wk.alive).length;
@@ -328,7 +314,7 @@ export class ParallelMonitorOverlay {
328
314
  lines.push(t.fg("muted", ` ${now} │ ${aliveCount}/${this.workers.length} alive │ Total: `) +
329
315
  t.bold(`$${totalCost.toFixed(2)}`) +
330
316
  t.fg("muted", " │ 5s refresh"));
331
- lines.push(t.fg("muted", "─".repeat(w)));
317
+ lines.push(renderBar(t, w));
332
318
  if (this.workers.length === 0) {
333
319
  lines.push("");
334
320
  lines.push(t.fg("warning", " No parallel workers found."));
@@ -339,7 +325,7 @@ export class ParallelMonitorOverlay {
339
325
  lines.push("");
340
326
  // Health + ID + state
341
327
  const healthColor = wk.alive ? "success" : "error";
342
- const glyph = healthGlyph(wk.alive, wk.heartbeatAge);
328
+ const glyph = statusGlyph(t, wk.alive ? "active" : "idle");
343
329
  const stateText = wk.alive
344
330
  ? t.fg("success", "RUNNING")
345
331
  : t.fg("error", t.bold("DEAD"));
@@ -374,21 +360,25 @@ export class ParallelMonitorOverlay {
374
360
  });
375
361
  lines.push(` ${t.fg("muted", "slices")} ${chips.join(" ")}`);
376
362
  // Task progress bar
377
- const bar = progressBar(wk.doneTasks, wk.totalTasks, 25);
363
+ const barWidth = Math.max(6, Math.min(25, w - 32));
364
+ const bar = renderProgressBar(t, wk.doneTasks, wk.totalTasks, barWidth, {
365
+ filledChar: "█",
366
+ emptyChar: "░",
367
+ emptyColor: "dim",
368
+ });
378
369
  const pct = wk.totalTasks > 0 ? Math.round((wk.doneTasks / wk.totalTasks) * 100) : 0;
379
- lines.push(` ${t.fg("muted", "tasks")} ${t.fg("success", bar)} ${wk.doneTasks}/${wk.totalTasks} ` +
370
+ lines.push(` ${t.fg("muted", "tasks")} ${bar} ${wk.doneTasks}/${wk.totalTasks} ` +
380
371
  t.fg("muted", `(${pct}%) │ slices done ${wk.doneSlices}/${wk.totalSlices}`));
381
372
  }
382
373
  // Errors
383
374
  for (const err of wk.errors.slice(-2)) {
384
- const truncated = err.length > w - 10 ? err.slice(0, w - 11) + "…" : err;
385
- lines.push(` ${t.fg("error", "⚠ " + truncated)}`);
375
+ lines.push(` ${t.fg("error", "! " + err)}`);
386
376
  }
387
377
  }
388
378
  }
389
379
  // Event feed
390
380
  lines.push("");
391
- lines.push(t.fg("muted", "─".repeat(w)));
381
+ lines.push(renderBar(t, w));
392
382
  lines.push(` ${t.bold("Recent Events")}`);
393
383
  if (this.events.length === 0) {
394
384
  lines.push(t.fg("muted", " No events yet..."));
@@ -396,8 +386,7 @@ export class ParallelMonitorOverlay {
396
386
  else {
397
387
  for (const evt of this.events.slice(-8)) {
398
388
  const mid = evt.match(/^✓ (M\d+)\//)?.[1] || "";
399
- const truncated = evt.length > w - 10 ? evt.slice(0, w - 11) + "" : evt;
400
- lines.push(` ${t.fg("muted", "│")} ${t.fg("accent", mid)} ${truncated.replace(/^✓ M\d+\//, "")}`);
389
+ lines.push(` ${t.fg("muted", "│")} ${t.fg("accent", mid)} ${evt.replace(/^✓ M\d+\//, "")}`);
401
390
  }
402
391
  }
403
392
  // Footer
@@ -411,13 +400,16 @@ export class ParallelMonitorOverlay {
411
400
  }
412
401
  lines.push(` ${t.bold("Total: $" + this.workers.reduce((s, wk) => s + wk.cost, 0).toFixed(2))}`);
413
402
  }
414
- lines.push(t.fg("muted", ` ESC/q/${formattedShortcutPair("parallel")} close↑↓ scroll`));
403
+ lines.push(renderKeyHints(t, [`ESC/q/${formattedShortcutPair("parallel")} close`, "↑↓ scroll"], w));
415
404
  // Apply scroll — use terminal rows as height estimate
416
405
  const termHeight = process.stdout.rows || 40;
417
406
  const maxScroll = Math.max(0, lines.length - termHeight);
418
407
  this.scrollOffset = Math.min(Math.max(this.scrollOffset, 0), maxScroll);
419
- const visible = lines.slice(this.scrollOffset, this.scrollOffset + termHeight);
408
+ const visible = lines
409
+ .slice(this.scrollOffset, this.scrollOffset + termHeight)
410
+ .map((line) => safeLine(line, w));
420
411
  this.cachedLines = visible;
412
+ this.cachedWidth = width;
421
413
  return visible;
422
414
  }
423
415
  }