commandmate 0.42.2 → 0.44.0

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 (624) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +176 -176
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  11. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update/route.js +2 -2
  14. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  15. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/app/update-check/route.js +1 -1
  17. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  18. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/capabilities/route.js +1 -1
  23. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  29. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  31. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  33. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  35. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  37. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  39. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/hooks/agent-event/route.js +103 -1
  41. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  42. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  44. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  45. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  47. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  48. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  50. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/push/escalation/route.js +1 -1
  53. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  54. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  56. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/push/vapid/route.js +1 -1
  58. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  59. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  61. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  62. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/relays/route.js +1 -1
  64. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  65. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  70. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/clone/route.js +1 -1
  73. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/restore/route.js +1 -1
  78. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/route.js +1 -1
  81. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/scan/route.js +1 -1
  84. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/sync/route.js +1 -1
  87. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  90. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  92. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  93. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  95. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  97. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/[id]/route.js +1 -1
  99. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/skills/installations/route.js +1 -1
  102. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  103. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/skills/operations/route.js +2 -2
  105. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  106. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/skills/reindex/route.js +1 -1
  108. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  109. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/skills/route.js +1 -1
  111. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  112. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/slash-commands/route.js +1 -1
  114. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  115. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  119. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  123. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  125. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  127. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  140. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
  142. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  143. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
  156. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  221. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +7 -7
  223. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  228. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  230. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  243. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/route.js +1 -103
  248. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
  251. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
  254. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
  257. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
  263. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  264. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +103 -1
  266. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  267. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  273. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  276. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  279. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  282. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  285. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  288. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  291. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  294. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  296. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  298. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  299. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  306. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  307. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  308. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  312. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  314. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  324. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  325. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  326. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  327. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  330. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  331. package/.next/server/app/api/worktrees/route.js +1 -1
  332. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  333. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  334. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  335. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  336. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  337. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  338. package/.next/server/app/page_client-reference-manifest.js +1 -1
  339. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  340. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  342. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  343. package/.next/server/app/sessions/page.js +1 -1
  344. package/.next/server/app/sessions/page.js.nft.json +1 -1
  345. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  346. package/.next/server/app/skills/[skillId]/page.js +1 -1
  347. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  348. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  349. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  350. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  351. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  352. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  353. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  354. package/.next/server/app/worktrees/[id]/page.js +9 -9
  355. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  356. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  357. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  358. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  359. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  360. package/.next/server/app-paths-manifest.json +34 -34
  361. package/.next/server/chunks/1068.js +1 -1
  362. package/.next/server/chunks/1210.js +1 -1
  363. package/.next/server/chunks/1501.js +3 -3
  364. package/.next/server/chunks/2119.js +1 -1
  365. package/.next/server/chunks/22.js +1 -1
  366. package/.next/server/chunks/2283.js +15 -0
  367. package/.next/server/chunks/2328.js +1 -1
  368. package/.next/server/chunks/2404.js +4 -3
  369. package/.next/server/chunks/2445.js +1 -1
  370. package/.next/server/chunks/252.js +1 -1
  371. package/.next/server/chunks/2816.js +1 -1
  372. package/.next/server/chunks/3543.js +1 -1
  373. package/.next/server/chunks/3730.js +1 -1
  374. package/.next/server/chunks/3945.js +1 -1
  375. package/.next/server/chunks/4207.js +3 -3
  376. package/.next/server/chunks/4802.js +1 -1
  377. package/.next/server/chunks/488.js +1 -0
  378. package/.next/server/chunks/5064.js +1 -1
  379. package/.next/server/chunks/5326.js +1 -1
  380. package/.next/server/chunks/5456.js +1 -1
  381. package/.next/server/chunks/5571.js +1 -1
  382. package/.next/server/chunks/5775.js +1 -1
  383. package/.next/server/chunks/611.js +1 -1
  384. package/.next/server/chunks/6130.js +1 -1
  385. package/.next/server/chunks/6285.js +1 -1
  386. package/.next/server/chunks/6401.js +1 -1
  387. package/.next/server/chunks/6474.js +14 -0
  388. package/.next/server/chunks/650.js +1 -1
  389. package/.next/server/chunks/6661.js +1 -1
  390. package/.next/server/chunks/6781.js +1 -1
  391. package/.next/server/chunks/6793.js +1 -1
  392. package/.next/server/chunks/6927.js +1 -0
  393. package/.next/server/chunks/7491.js +3 -0
  394. package/.next/server/chunks/7506.js +1 -1
  395. package/.next/server/chunks/7685.js +1 -1
  396. package/.next/server/chunks/7905.js +1 -1
  397. package/.next/server/chunks/8543.js +1 -1
  398. package/.next/server/chunks/8581.js +2 -2
  399. package/.next/server/chunks/8728.js +2 -2
  400. package/.next/server/chunks/8782.js +1 -0
  401. package/.next/server/chunks/8791.js +1 -1
  402. package/.next/server/chunks/8800.js +4 -3
  403. package/.next/server/chunks/8918.js +108 -6
  404. package/.next/server/chunks/9130.js +3 -3
  405. package/.next/server/chunks/{8052.js → 9353.js} +4 -2
  406. package/.next/server/chunks/9390.js +3 -0
  407. package/.next/server/chunks/9627.js +3 -3
  408. package/.next/server/chunks/967.js +1 -0
  409. package/.next/server/chunks/9731.js +3 -3
  410. package/.next/server/chunks/9882.js +3 -3
  411. package/.next/server/middleware-manifest.json +5 -5
  412. package/.next/server/pages/500.html +1 -1
  413. package/.next/server/pages-manifest.json +1 -1
  414. package/.next/server/server-reference-manifest.json +1 -1
  415. package/.next/server/src/middleware.js +2 -2
  416. package/.next/server/src/middleware.js.map +1 -1
  417. package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
  418. package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-340774f1a24f2b45.js} +1 -1
  419. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
  420. package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
  421. package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
  422. package/.next/static/chunks/8165-3853772f6ae1299b.js +1 -0
  423. package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
  424. package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
  425. package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
  426. package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-0fc249fb7de75a27.js} +1 -1
  427. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
  428. package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
  429. package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +1 -0
  430. package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
  431. package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
  432. package/.next/static/css/38070d879efa1371.css +1 -0
  433. package/.next/trace +13 -13
  434. package/README.md +58 -620
  435. package/dist/cli/commands/ask.d.ts.map +1 -1
  436. package/dist/cli/commands/ask.js +23 -149
  437. package/dist/cli/commands/capture.d.ts.map +1 -1
  438. package/dist/cli/commands/capture.js +11 -1
  439. package/dist/cli/commands/docs.d.ts.map +1 -1
  440. package/dist/cli/commands/docs.js +5 -0
  441. package/dist/cli/commands/remote.d.ts +24 -1
  442. package/dist/cli/commands/remote.d.ts.map +1 -1
  443. package/dist/cli/commands/remote.js +155 -6
  444. package/dist/cli/commands/reply.d.ts +40 -0
  445. package/dist/cli/commands/reply.d.ts.map +1 -0
  446. package/dist/cli/commands/reply.js +133 -0
  447. package/dist/cli/commands/respond.d.ts.map +1 -1
  448. package/dist/cli/commands/respond.js +255 -112
  449. package/dist/cli/commands/stop.d.ts.map +1 -1
  450. package/dist/cli/commands/stop.js +53 -1
  451. package/dist/cli/commands/sync.js +3 -3
  452. package/dist/cli/commands/wait.d.ts +5 -0
  453. package/dist/cli/commands/wait.d.ts.map +1 -1
  454. package/dist/cli/commands/wait.js +10 -1
  455. package/dist/cli/docs/agent-operations.d.ts +2 -2
  456. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  457. package/dist/cli/docs/agent-operations.js +13 -0
  458. package/dist/cli/docs/setup-guide.d.ts +14 -0
  459. package/dist/cli/docs/setup-guide.d.ts.map +1 -0
  460. package/dist/cli/docs/setup-guide.js +366 -0
  461. package/dist/cli/program.d.ts.map +1 -1
  462. package/dist/cli/program.js +4 -0
  463. package/dist/cli/types/api-responses.d.ts +11 -0
  464. package/dist/cli/types/api-responses.d.ts.map +1 -1
  465. package/dist/cli/types/index.d.ts +2 -0
  466. package/dist/cli/types/index.d.ts.map +1 -1
  467. package/dist/cli/utils/daemon.d.ts +42 -2
  468. package/dist/cli/utils/daemon.d.ts.map +1 -1
  469. package/dist/cli/utils/daemon.js +222 -40
  470. package/dist/cli/utils/docs-reader.d.ts +6 -0
  471. package/dist/cli/utils/docs-reader.d.ts.map +1 -1
  472. package/dist/cli/utils/docs-reader.js +14 -13
  473. package/dist/cli/utils/npm-runner.d.ts +12 -0
  474. package/dist/cli/utils/npm-runner.d.ts.map +1 -1
  475. package/dist/cli/utils/npm-runner.js +36 -0
  476. package/dist/cli/utils/process-inspect.d.ts +55 -0
  477. package/dist/cli/utils/process-inspect.d.ts.map +1 -0
  478. package/dist/cli/utils/process-inspect.js +214 -0
  479. package/dist/cli/utils/remote-pairing.d.ts +68 -0
  480. package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
  481. package/dist/cli/utils/remote-pairing.js +117 -0
  482. package/dist/cli/utils/reply-ledger.d.ts +95 -0
  483. package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
  484. package/dist/cli/utils/reply-ledger.js +187 -0
  485. package/dist/cli/utils/server-identity.d.ts +50 -0
  486. package/dist/cli/utils/server-identity.d.ts.map +1 -0
  487. package/dist/cli/utils/server-identity.js +118 -0
  488. package/dist/cli/utils/server-ready.d.ts +13 -0
  489. package/dist/cli/utils/server-ready.d.ts.map +1 -1
  490. package/dist/cli/utils/server-ready.js +16 -0
  491. package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
  492. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
  493. package/dist/lib/cli-tools/copilot-executable.js +21 -5
  494. package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
  495. package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
  496. package/dist/lib/cli-tools/opencode-executable.js +179 -0
  497. package/dist/lib/cli-tools/types.d.ts +1 -1
  498. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  499. package/dist/lib/cli-tools/types.js +5 -1
  500. package/dist/lib/detection/tools/verified-against.d.ts +15 -0
  501. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  502. package/dist/lib/detection/tools/verified-against.js +17 -1
  503. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  504. package/dist/lib/detection/version-probes.js +14 -1
  505. package/dist/lib/security/pairing-code.d.ts +2 -1
  506. package/dist/lib/security/pairing-code.d.ts.map +1 -1
  507. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
  508. package/dist/lib/session/tmux-session-surface.js +1 -1
  509. package/dist/server/locales/en/worktree.json +72 -20
  510. package/dist/server/locales/ja/worktree.json +72 -20
  511. package/dist/server/server.js +23 -0
  512. package/dist/server/src/config/cli-tool-timing-config.js +19 -1
  513. package/dist/server/src/config/detection-evidence-config.js +3 -0
  514. package/dist/server/src/config/image-extensions.js +1 -0
  515. package/dist/server/src/config/schedule-config.js +55 -1
  516. package/dist/server/src/lib/auto-yes-poller.js +69 -4
  517. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
  518. package/dist/server/src/lib/cli-tools/base.js +6 -2
  519. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
  520. package/dist/server/src/lib/cli-tools/command-code.js +81 -2
  521. package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
  522. package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
  523. package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
  524. package/dist/server/src/lib/cli-tools/index.js +3 -1
  525. package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
  526. package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
  527. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  528. package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
  529. package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
  530. package/dist/server/src/lib/cli-tools/opencode.js +29 -5
  531. package/dist/server/src/lib/cli-tools/types.js +5 -1
  532. package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
  533. package/dist/server/src/lib/cmate-parser.js +12 -0
  534. package/dist/server/src/lib/cmate-validator.js +13 -1
  535. package/dist/server/src/lib/detection/cli-patterns.js +172 -3
  536. package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
  537. package/dist/server/src/lib/detection/status-detector.js +10 -1
  538. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
  539. package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
  540. package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
  541. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
  542. package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
  543. package/dist/server/src/lib/detection/tools/registry.js +2 -0
  544. package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
  545. package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
  546. package/dist/server/src/lib/detection/upstream-faults.js +8 -0
  547. package/dist/server/src/lib/detection/version-probes.js +14 -1
  548. package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
  549. package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
  550. package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
  551. package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
  552. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
  553. package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
  554. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
  555. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
  556. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
  557. package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
  558. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
  559. package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
  560. package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
  561. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
  562. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
  563. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
  564. package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
  565. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
  566. package/dist/server/src/lib/hooks/sources/registry.js +2 -0
  567. package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
  568. package/dist/server/src/lib/job-executor.js +2 -1
  569. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
  570. package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
  571. package/dist/server/src/lib/relay/relay-delivery.js +4 -1
  572. package/dist/server/src/lib/session/agent-event-state.js +24 -0
  573. package/dist/server/src/lib/session/claude-executor.js +186 -12
  574. package/dist/server/src/lib/session/claude-session.js +131 -15
  575. package/dist/server/src/lib/session/current-output-builder.js +27 -3
  576. package/dist/server/src/lib/session/send-user-message.js +4 -0
  577. package/dist/server/src/lib/session/session-start-error.js +20 -0
  578. package/dist/server/src/lib/session/structured-prompt.js +54 -0
  579. package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
  580. package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
  581. package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
  582. package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
  583. package/dist/server/src/lib/tmux/tmux.js +73 -2
  584. package/dist/server/src/lib/verification/env-clean-gate.js +281 -10
  585. package/dist/server/src/lib/verification/gate-runner.js +29 -2
  586. package/dist/server/src/lib/verification/scope-gate.js +58 -4
  587. package/dist/server/src/types/cli-tool-contracts.js +10 -2
  588. package/dist/types/cli-tool-contracts.d.ts +16 -5
  589. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  590. package/dist/types/cli-tool-contracts.js +10 -2
  591. package/docs/en/architecture.md +722 -0
  592. package/docs/en/user-guide/agents-guide.md +306 -0
  593. package/docs/en/user-guide/cli-setup-guide.md +676 -0
  594. package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
  595. package/docs/en/user-guide/commands-guide.md +467 -0
  596. package/docs/en/user-guide/quick-start.md +231 -0
  597. package/docs/en/user-guide/webapp-guide.md +1020 -0
  598. package/docs/en/user-guide/workflow-examples.md +463 -0
  599. package/package.json +19 -7
  600. package/release-notes/0.43.0.json +130 -0
  601. package/release-notes/0.44.0.json +82 -0
  602. package/scripts/hooks/cmate-agent-event.sh +14 -0
  603. package/scripts/opencode-v2/launch.sh +226 -0
  604. package/.next/server/chunks/1990.js +0 -103
  605. package/.next/server/chunks/3707.js +0 -15
  606. package/.next/server/chunks/4443.js +0 -3
  607. package/.next/server/chunks/5164.js +0 -1
  608. package/.next/server/chunks/5742.js +0 -1
  609. package/.next/server/chunks/7004.js +0 -1
  610. package/.next/server/chunks/8673.js +0 -14
  611. package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
  612. package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
  613. package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
  614. package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
  615. package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
  616. package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
  617. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
  618. package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
  619. package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
  620. package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
  621. package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
  622. package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
  623. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
  624. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
@@ -0,0 +1,722 @@
1
+ [日本語版](../architecture.md)
2
+
3
+ # CommandMate Architecture
4
+
5
+ > Architecture design document for a development companion tool that opens Claude Code / tmux sessions per git worktree and allows chat operations from a smartphone browser.
6
+
7
+ This document defines the technical architecture of **CommandMate**.
8
+
9
+ - What processes/components make up the system
10
+ - How Claude CLI / tmux / Web UI cooperate
11
+ - Which responsibilities belong to which layer
12
+
13
+ It serves as a guide during implementation.
14
+
15
+ ---
16
+
17
+ ## 0. Scope & Notation
18
+
19
+ - Scope: The entire `CommandMate` application
20
+ - Next.js (App Router) based Web UI
21
+ - Node.js API / WebSocket server
22
+ - tmux + Claude CLI session management
23
+ - SQLite / local FS persistence
24
+ - Out of scope:
25
+ - Claude model behavior
26
+ - Specific integration implementations with other tools (mySwiftAgent / myAgentDesk, etc.)
27
+
28
+ Naming / Terminology:
29
+
30
+ - **worktree**: A branch directory managed as a git worktree
31
+ - **worktreeId**: A URL-safe identifier (e.g., `feature-foo`)
32
+ - **tmux session**: A tmux session named `cw_{worktreeId}`
33
+ - **Stop hook**: A completion hook set via Claude CLI's `CLAUDE_HOOKS_STOP`
34
+
35
+ ---
36
+
37
+ ## 1. System Goals
38
+
39
+ ### 1.1 Goals
40
+
41
+ - Manage **independent Claude CLI sessions** per git worktree
42
+ - Provide a **per-branch chat UI** accessible from smartphone or PC browsers
43
+ - Use Stop hooks for **event-driven updates** without polling for the latest responses
44
+ - Safely store conversation history / detailed logs locally
45
+
46
+ ### 1.2 Non-goals
47
+
48
+ - Operating as a multi-user SaaS (this is for local developers)
49
+ - Public exposure across security boundaries / multi-tenant operation
50
+
51
+ ### 1.3 Implemented Features
52
+
53
+ - **CLI Tool Support** (Implemented in Issue #4, extended in Issue #368/#379/#545)
54
+ - Supports 7 tools: Claude Code, Codex CLI, Gemini CLI, Vibe-Local (Ollama), OpenCode, GitHub Copilot, Antigravity (the authority is `CLI_TOOL_IDS` in `src/lib/cli-tools/types.ts`)
55
+ - Extensible design via Strategy pattern
56
+ - Select 2-4 agents per worktree (`selected_agents` column)
57
+ - Vibe-Local supports Ollama model selection (`vibe_local_model` column)
58
+
59
+ ---
60
+
61
+ ## 2. Context & Assumptions
62
+
63
+ ### 2.1 Prerequisites
64
+
65
+ - Runs on the developer's local machine
66
+ - macOS / Linux assumed (tmux / Claude CLI must be available)
67
+ - Claude CLI is installed and:
68
+ - Can be launched with the `claude` command
69
+ - Supports setting `CLAUDE_HOOKS_STOP`
70
+ - Multiple branch directories are managed via git worktree
71
+
72
+ ### 2.2 Execution Modes
73
+
74
+ - **Local mode (default)**
75
+ - `MCBD_BIND = 127.0.0.1`
76
+ - Connections from the same machine only
77
+ - **LAN access mode (optional)**
78
+ - `CM_BIND = 0.0.0.0`
79
+ - Reverse proxy authentication recommended (details: `docs/security-guide.md`)
80
+ - Accessible from smartphones on the same network
81
+
82
+ ---
83
+
84
+ ## 3. High-level Architecture
85
+
86
+ ### 3.1 Component Diagram
87
+
88
+ ```mermaid
89
+ graph TD
90
+ subgraph Browser["Smartphone/PC Browser"]
91
+ UI_A[Screen A: Worktree List]
92
+ UI_B[Screen B: Chat Screen]
93
+ UI_C[Screen C: Log Viewer]
94
+ UI_WS[WebSocket Client]
95
+ end
96
+
97
+ subgraph Next["Next.js / Node.js Application"]
98
+ App["Next.js UI (App Router)"]
99
+ API_Send[/POST /api/worktrees/:id/send/]
100
+ API_WT[/GET /api/worktrees/ .../]
101
+ API_Hook[/POST /api/hooks/claude-done/]
102
+ API_Logs[/GET /api/worktrees/:id/logs/ .../]
103
+ WS_Server[WebSocket Server]
104
+ DB[(SQLite db.sqlite)]
105
+ end
106
+
107
+ subgraph TmuxClaude["tmux / Claude CLI"]
108
+ T[(tmux server)]
109
+ S1[tmux session: cw_main]
110
+ S2[tmux session: cw_feature-foo]
111
+ CL1[Claude CLI Process]
112
+ end
113
+
114
+ subgraph FS["Local Filesystem"]
115
+ Logs[".claude_logs/ (Markdown logs)"]
116
+ end
117
+
118
+ UI_A --> App
119
+ UI_B --> App
120
+ UI_C --> App
121
+ UI_WS <---> WS_Server
122
+
123
+ App --> API_WT
124
+ App --> API_Send
125
+ App --> API_Logs
126
+
127
+ API_Send --> T
128
+ API_Hook --> T
129
+
130
+ API_WT --> DB
131
+ API_Logs --> Logs
132
+ API_Hook --> DB
133
+ API_Hook --> Logs
134
+ API_Hook --> WS_Server
135
+
136
+ CL1 -->|"Stop hook"| API_Hook
137
+ ```
138
+
139
+ ### 3.2 Processes & Ports
140
+
141
+ - **Next.js / Node.js process**
142
+ - Port: MCBD_PORT (e.g., 3000)
143
+ - Bind: MCBD_BIND (127.0.0.1 or 0.0.0.0)
144
+ - Features:
145
+ - HTTP server (UI, API Routes)
146
+ - WebSocket server
147
+ - SQLite connection
148
+ - **tmux server**
149
+ - Uses the existing tmux server on the system
150
+ - Launches CLI tools in sessions named `cw_{worktreeId}`
151
+ - **CLI tool process (Claude Code / Codex CLI)**
152
+ - The selected CLI tool runs within each tmux session
153
+ - Sends completion notifications via the command set in `CLAUDE_HOOKS_STOP` (for Claude Code)
154
+
155
+ ---
156
+
157
+ ## 4. Data Model
158
+
159
+ ### 4.1 Worktree
160
+
161
+ ```typescript
162
+ interface Worktree {
163
+ id: string; // URL-safe ID ("main", "feature-foo", etc.)
164
+ name: string; // Display name ("main", "feature/foo", etc.)
165
+ path: string; // Absolute path "/path/to/root/feature/foo"
166
+ lastMessageSummary?: string; // Summary of the last message
167
+ updatedAt?: Date; // Timestamp of last message
168
+ }
169
+ ```
170
+
171
+ - **id**: Identifier normalized to a URL-parameter-safe format
172
+ - Example: `feature/foo` → `feature-foo`
173
+ - **path**: Absolute path based on `MCBD_ROOT_DIR`
174
+ - **updatedAt**: Used for sorting the worktree list by last update time
175
+
176
+ ### 4.2 ChatMessage
177
+
178
+ ```typescript
179
+ type ChatRole = "user" | "claude";
180
+
181
+ interface ChatMessage {
182
+ id: string; // UUID
183
+ worktreeId: string; // Worktree.id
184
+ role: ChatRole;
185
+ content: string; // Full text for UI display
186
+ summary?: string; // Optional short summary
187
+ timestamp: Date;
188
+ logFileName?: string; // Corresponding Markdown log file name
189
+ requestId?: string; // Future extension: 1 send = 1 UUID
190
+ }
191
+ ```
192
+
193
+ - **content**: Text displayed directly in the chat UI (prompt/response).
194
+ - **summary**: Summary for `Worktree.lastMessageSummary` (optional).
195
+ - **logFileName**: Link to the detailed log file in `.claude_logs/`.
196
+
197
+ ### 4.3 WorktreeSessionState
198
+
199
+ ```typescript
200
+ interface WorktreeSessionState {
201
+ worktreeId: string;
202
+ lastCapturedLine: number; // Last line count obtained via tmux capture-pane
203
+ }
204
+ ```
205
+
206
+ - On Stop hook, the entire scrollback is captured via `tmux capture-pane`.
207
+ - Lines after `lastCapturedLine` are treated as "new output" for differential extraction.
208
+
209
+ ---
210
+
211
+ ## 5. Core Flows
212
+
213
+ ### 5.1 Startup & Worktree Scan
214
+
215
+ 1. On app startup, scan git worktrees based on `MCBD_ROOT_DIR`.
216
+ 2. Store/update Worktree records in the DB based on the scanned worktree information.
217
+ 3. If existing `cw_{worktreeId}` tmux sessions exist, reconcile them with Worktrees (optional).
218
+
219
+ ### 5.2 Message Send Flow (UI → Claude)
220
+
221
+ **Overview**
222
+
223
+ ```mermaid
224
+ sequenceDiagram
225
+ participant UI as UI (Screen B)
226
+ participant API as API_Send
227
+ participant T as tmux
228
+ participant CL as Claude CLI
229
+
230
+ UI->>API: POST /api/worktrees/:id/send { message }
231
+ API->>T: Check session existence (cw_{worktreeId})
232
+ alt No session
233
+ API->>T: tmux new-session (cw_{worktreeId})
234
+ API->>T: export CLAUDE_HOOKS_STOP=...
235
+ API->>T: Start claude
236
+ end
237
+ API->>T: tmux send-keys "message"
238
+ API-->>UI: 202 Accepted (send complete)
239
+ Note over UI: Display "Sending..." bubble
240
+ ```
241
+
242
+ **Detailed Steps**
243
+
244
+ 1. UI (Screen B) sends `POST /api/worktrees/:id/send` with `{ message }`.
245
+ 2. API:
246
+ - Retrieves the Worktree from worktreeId and references the path.
247
+ - Checks session existence with `tmux has-session -t cw_{worktreeId}`.
248
+ - If not found, executes UC-2 (lazy startup flow, described below).
249
+ 3. Sends the message to Claude CLI with `tmux send-keys -t cw_{worktreeId} "<message>" C-m`.
250
+ 4. API responds immediately with 202 (Accepted). The UI displays the user's message plus a "Sending..." bubble.
251
+
252
+ ### 5.3 Stop Hook Processing Flow (Claude → API → Logs/DB)
253
+
254
+ ```mermaid
255
+ sequenceDiagram
256
+ participant CL as Claude CLI
257
+ participant Hook as CLAUDE_HOOKS_STOP
258
+ participant API as API_Hook
259
+ participant T as tmux
260
+ participant DB as SQLite
261
+ participant FS as .claude_logs
262
+ participant WS as WebSocket
263
+
264
+ CL-->>Hook: Completion hook invocation
265
+ Hook->>API: POST /api/hooks/claude-done { worktreeId }
266
+ API->>T: tmux capture-pane (capture full scrollback)
267
+ API->>API: Differential extraction (lines after lastCapturedLine)
268
+ API->>FS: Save as Markdown log
269
+ API->>DB: Update ChatMessage and Worktree.updatedAt
270
+ API->>WS: Publish new ChatMessage
271
+ ```
272
+
273
+ **Detailed Steps**
274
+
275
+ 1. When Claude CLI completes processing, it executes the command set in `CLAUDE_HOOKS_STOP`.
276
+ - Example:
277
+ ```
278
+ HOOK_COMMAND="curl -X POST http://localhost:3000/api/hooks/claude-done \
279
+ -H 'Content-Type: application/json' \
280
+ -d '{\"worktreeId\":\"{worktreeId}\"}'"
281
+ export CLAUDE_HOOKS_STOP="${HOOK_COMMAND}"
282
+ ```
283
+ 2. `API_Hook` receives `POST /api/hooks/claude-done`:
284
+ - Reads `WorktreeSessionState.lastCapturedLine` (default 0).
285
+ - Captures scrollback with `tmux capture-pane -p -S -10000 -t cw_{worktreeId}`.
286
+ 3. Counts lines in the captured text:
287
+ - Extracts only lines after `lastCapturedLine` as "new output".
288
+ - Future extension: If markers (`### REQUEST {id} START/END`) are introduced, only that range can be extracted.
289
+ 4. Saves the extracted diff as Markdown under `.claude_logs/`.
290
+ 5. Creates a `ChatMessage` record (`role = "claude"`) with the linked `logFileName`.
291
+ 6. Updates `Worktree.lastMessageSummary` and `updatedAt`.
292
+ 7. Publishes the new `ChatMessage` via WebSocket to all clients viewing the relevant worktree.
293
+
294
+ ### 5.4 WebSocket Flow
295
+
296
+ - Clients subscribe by specifying a `worktreeId` upon connection.
297
+ - The server manages rooms/channels per `worktreeId`.
298
+ - When a new `ChatMessage` is saved, it broadcasts to all clients subscribed to that `worktreeId`.
299
+
300
+ Message format example:
301
+ ```json
302
+ {
303
+ "type": "chat_message_created",
304
+ "worktreeId": "feature-foo",
305
+ "message": {
306
+ "id": "uuid",
307
+ "role": "claude",
308
+ "content": "Claude's response...",
309
+ "timestamp": "2025-11-16T03:00:00.000Z",
310
+ "logFileName": "20251116-030000-feature-foo-bd2f8c3d.md"
311
+ }
312
+ }
313
+ ```
314
+
315
+ ### 5.5 Error / Recovery Flow
316
+
317
+ **When Stop hook doesn't arrive**
318
+
319
+ - UI side:
320
+ - If "Sending..." isn't replaced after a set period (e.g., 120 seconds), display a warning bubble.
321
+ - Server side:
322
+ - Log a timeout in the Hook API (implementation-dependent).
323
+ - Manual checking of `.claude_logs/` or tmux state is expected.
324
+
325
+ **When tmux session / Claude process crashes**
326
+
327
+ - During `API_Send`, check tmux session / process state with `tmux has-session`.
328
+ - If no session / Claude not found, restart via UC-2.
329
+ - Re-set `CLAUDE_HOOKS_STOP` when restarting Claude CLI.
330
+
331
+ ---
332
+
333
+ ## 6. tmux & CLI Tool Integration
334
+
335
+ ### 6.1 Session Naming Convention
336
+
337
+ - Session name: `mcbd-{ns}-{cliToolId}-{worktreeId}[-{suffix}]` (Issue #2866)
338
+ - `{ns}` is a per-server namespace (8 hex digits, stored in the DB), so two servers with the same worktree ID never share a session name
339
+ - A legacy `mcbd-{cliToolId}-{worktreeId}[-{suffix}]` session is adopted by the server and keeps its legacy name
340
+ - Names are built and split in one place: `src/lib/cli-tools/session-name.ts` (`resolveSessionName` / `parseSessionName`)
341
+ - The ns lives in the server's DB, so the CLI cannot compute it. The server publishes `tmuxSessionNamespace` at the top level of `GET /api/worktrees` and the name actually in use as `agentInstances[].sessionName` on `GET /api/worktrees/[id]` (Issue #2867)
342
+ - Example:
343
+ - Claude: `mcbd-0a1b2c3d-claude-feature-foo` (legacy: `mcbd-claude-feature-foo`)
344
+ - One session per worktree is maintained.
345
+ - Note: Migration from old naming convention `cw_{worktreeId}`: Implemented in Issue #4
346
+
347
+ ### 6.1.5 CLI Tool Abstraction Layer (Implemented in Issue #4)
348
+
349
+ **Design Pattern:**
350
+ - CLI tool abstraction via Strategy pattern
351
+ - `BaseCLITool` abstract class defines the common interface:
352
+ ```typescript
353
+ abstract class BaseCLITool {
354
+ abstract id: CLIToolType;
355
+ abstract name: string;
356
+ abstract command: string;
357
+
358
+ abstract isInstalled(): Promise<boolean>;
359
+ abstract isRunning(worktreeId: string): Promise<boolean>;
360
+ abstract startSession(worktreeId: string, worktreePath: string): Promise<void>;
361
+ abstract sendMessage(worktreeId: string, message: string): Promise<void>;
362
+ abstract killSession(worktreeId: string): Promise<boolean>;
363
+ getSessionName(worktreeId: string): string;
364
+ }
365
+ ```
366
+
367
+ **Implementation Classes:**
368
+ - `ClaudeTool` - Claude Code CLI
369
+ - `CodexTool` - Codex CLI
370
+ - `GeminiTool` - Gemini CLI (Issue #368)
371
+ - `VibeLocalTool` - Vibe-Local / Ollama (Issue #368)
372
+ - `OpenCodeTool` - OpenCode (Issue #379)
373
+ - `CopilotTool` - GitHub Copilot CLI (Issue #545)
374
+
375
+ **Management:**
376
+ - `CLIToolManager` singleton class manages each tool instance
377
+ - Retrieves the appropriate tool based on the worktree's `cliToolId`
378
+
379
+ **Benefits:**
380
+ - Easy to add new CLI tools (just extend `BaseCLITool`)
381
+ - API layer depends only on abstract interfaces, not specific implementations
382
+ - Encapsulates tool-specific logic
383
+
384
+ ### 6.2 UC-2: Lazy Session Startup Flow
385
+
386
+ ```bash
387
+ # {sessionName} = cw_{worktreeId}
388
+ # {worktreePath} = /path/to/root/feature/foo
389
+ tmux new-session -d -s "{sessionName}" -c "{worktreePath}"
390
+
391
+ HOOK_COMMAND="curl -X POST http://localhost:3000/api/hooks/claude-done \
392
+ -H 'Content-Type: application/json' \
393
+ -d '{\"worktreeId\":\"{worktreeId}\"}'"
394
+
395
+ tmux send-keys -t "{sessionName}" "export CLAUDE_HOOKS_STOP='${HOOK_COMMAND}'" C-m
396
+ tmux send-keys -t "{sessionName}" "claude" C-m
397
+ ```
398
+
399
+ - The wrapper for executing tmux commands directly from the API is organized in `src/lib/tmux.ts`.
400
+
401
+ ### 6.3 Health Monitoring (Variable Intensity)
402
+
403
+ - Simple implementation: Only check "session existence".
404
+ - For more robustness:
405
+ - `tmux list-panes -F "#{pane_pid}"` → Use `ps` to verify the PID is `claude`.
406
+ - If in prompt state (claude has exited), re-set `CLAUDE_HOOKS_STOP` + restart claude.
407
+
408
+ ---
409
+
410
+ ## 7. Persistence
411
+
412
+ ### 7.1 SQLite (db.sqlite)
413
+
414
+ - Storage location example: `~/.mycodebranchdesk/db.sqlite`
415
+ - Tables (conceptual):
416
+ - **worktrees**:
417
+ - id, name, path, last_message_summary, updated_at
418
+ - **cli_tool_id** (added: Issue #4, extended in #379/#545/#988) - CLI tool to use ('claude' | 'codex' | 'gemini' | 'vibe-local' | 'opencode' | 'copilot' | 'antigravity')
419
+ - **selected_agents** (added: Issue #368) - Selected 2-4 agents (JSON array, e.g., '["claude","vibe-local"]')
420
+ - **vibe_local_model** (added: Issue #368) - Ollama model name for Vibe-Local (nullable)
421
+ - repository_path, repository_name, description
422
+ - last_user_message, last_user_message_at
423
+ - favorite, status, link
424
+ - **chat_messages**:
425
+ - id, worktree_id, role, content, summary, timestamp, log_file_name, request_id
426
+ - message_type, prompt_data
427
+ - **session_states**:
428
+ - worktree_id, last_captured_line
429
+
430
+ ### 7.2 Markdown Logs (.claude_logs/)
431
+
432
+ - A `.claude_logs/` directory is created directly under each worktree directory.
433
+ - File naming convention:
434
+
435
+ `{YYYYMMDD}-{HHmmss}-{worktreeId}-{uuid}.md`
436
+
437
+ - Content example:
438
+ ```markdown
439
+ # CommandMate Log
440
+
441
+ ## Worktree
442
+ feature/foo
443
+
444
+ ## Timestamp
445
+ 2025-11-16T03:00:00Z
446
+
447
+ ## User
448
+
449
+ <User's prompt>
450
+
451
+ ## Claude
452
+
453
+ <Claude's full response>
454
+ ```
455
+
456
+ - Deletion policy:
457
+ - v1 does not perform automatic deletion; future cleanup via CLI is under consideration.
458
+
459
+ ---
460
+
461
+ ## 8. Configuration
462
+
463
+ ### 8.1 Environment Variables (Planned)
464
+
465
+ - `MCBD_ROOT_DIR` (required)
466
+ - Root directory for git worktree management
467
+ - `MCBD_PORT` (optional, default: 3000)
468
+ - `MCBD_BIND` (optional, default: 127.0.0.1)
469
+ - Potentially added in the future:
470
+ - `MCBD_DB_PATH` (storage location for db.sqlite)
471
+ - `MCBD_LOG_LEVEL` (log output level)
472
+
473
+ A `.env.example` file is expected to be included in the repository.
474
+
475
+ ---
476
+
477
+ ## 9. Security Model
478
+
479
+ ### 9.1 Local Mode
480
+
481
+ - Default is `MCBD_BIND=127.0.0.1`
482
+ - Access is limited to the same machine.
483
+ - Security risk is essentially dependent on the OS user.
484
+
485
+ ### 9.2 LAN Access Mode
486
+
487
+ - When `CM_BIND=0.0.0.0`, access from any device on the same LAN is possible
488
+ - Reverse proxy authentication (Nginx / Caddy, etc.) is recommended (details: `docs/security-guide.md`)
489
+ - HTTPS / TLS termination is delegated to the reverse proxy
490
+
491
+ ---
492
+
493
+ ## 10. Extensibility & Future Work
494
+
495
+ ### 10.1 Stop Hook Extension
496
+
497
+ - Future design allows including `requestId` in the Stop hook payload:
498
+
499
+ ```json
500
+ { "worktreeId": "{worktreeId}", "requestId": "{requestId}" }
501
+ ```
502
+
503
+ - By embedding it in `ChatMessage.requestId` and log names, you can more precisely trace "which request this response belongs to."
504
+
505
+ ### 10.2 Multi-LLM / Multi-Session ✅ Implemented (Issue #4, extended in #368/#379/#545)
506
+
507
+ **Implementation:**
508
+ - Supports 7 tools: Claude Code / Codex / Gemini / Vibe-Local / OpenCode / GitHub Copilot / Antigravity
509
+ - Each worktree manages its CLI tool via the `cliToolId` field
510
+ - Abstraction via Strategy pattern:
511
+ - `BaseCLITool` abstract class
512
+ - `ClaudeTool` / `CodexTool` / `GeminiTool` / `VibeLocalTool` / `OpenCodeTool` / `CopilotTool` / `AntigravityTool` implementation classes
513
+ - `CLIToolManager` singleton for managing tool instances
514
+ - Database schema: `worktrees.cli_tool_id` column (default: 'claude')
515
+ - Supported APIs:
516
+ - `POST /api/worktrees/:id/send` - Send message
517
+ - `POST /api/worktrees/:id/respond` - Respond to prompt
518
+ - `POST /api/worktrees/:id/kill-session` - Kill session
519
+ - `GET /api/worktrees` - List worktrees (including session state)
520
+
521
+ **Future Extensions:**
522
+ - To add other CLIs, implement by extending `BaseCLITool`
523
+ - If Stop hook specifications differ, handle within each tool class
524
+
525
+ ### 10.3 Real-Time Status Detection ✅ Implemented (Issue #31)
526
+
527
+ **Implementation:**
528
+ - Real-time detection of CLI tool state by directly parsing terminal output
529
+ - Visual status indicators displayed in the sidebar
530
+ - Polling updates every 2 seconds
531
+
532
+ **Status Types:**
533
+
534
+ | Status | Display | Detection Condition |
535
+ |--------|---------|---------------------|
536
+ | `idle` | Gray ● | Session not started |
537
+ | `ready` | Green ● | Input prompt `❯` displayed |
538
+ | `running` | Blue spinner | Thinking indicator detected |
539
+ | `waiting` | Yellow ● | Interactive prompt detected |
540
+
541
+ **Detection Logic:**
542
+ 1. Capture terminal output via `captureSessionOutput()`
543
+ 2. Strip ANSI escape codes
544
+ 3. Filter empty lines and extract the last 15 lines
545
+ 4. Pattern match in priority order:
546
+ - Interactive prompt → `waiting`
547
+ - Thinking indicator (`✻ Thinking…`) → `running`
548
+ - Input prompt (`❯`) → `ready`
549
+ - Otherwise → `running` (assumed processing)
550
+
551
+ **Related Files:**
552
+ - `src/config/status-colors.ts` - Centralized status color management
553
+ - `src/lib/cli-patterns.ts` - CLI tool-specific pattern definitions
554
+ - `src/lib/prompt-detector.ts` - Prompt detection
555
+ - `src/types/sidebar.ts` - Status determination logic
556
+
557
+ For details, see [Status Indicator](./features/sidebar-status-indicator.md).
558
+
559
+ ### 10.4 Repository Deletion ✅ Implemented (Issue #69)
560
+
561
+ **Implementation:**
562
+ - API endpoint and UI for deleting registered repositories
563
+ - Batch cleanup of related worktrees, sessions, and pollers
564
+ - Centralized session stop processing via Facade pattern
565
+
566
+ **API:**
567
+ - `DELETE /api/repositories` - Delete repository (specify `repositoryPath` in request body)
568
+
569
+ **Request/Response:**
570
+ ```json
571
+ // Request
572
+ { "repositoryPath": "/path/to/repository" }
573
+
574
+ // Response (200 OK)
575
+ {
576
+ "success": true,
577
+ "deletedWorktreeCount": 3,
578
+ "warnings": []
579
+ }
580
+ ```
581
+
582
+ **Error Responses:**
583
+
584
+ | Status | Condition |
585
+ |--------|-----------|
586
+ | 400 | `repositoryPath` not specified |
587
+ | 404 | Repository does not exist |
588
+
589
+ **Deletion Flow:**
590
+ 1. Get all worktree IDs belonging to the repository
591
+ 2. Kill tmux sessions for each worktree (if kill fails, record in warnings and continue)
592
+ 3. Stop response-pollers
593
+ 4. Clean up WebSocket subscription state
594
+ 5. CASCADE delete worktree records from DB
595
+ 6. Broadcast `repository_deleted` event
596
+
597
+ **Gradual Error Handling:**
598
+ - DB deletion continues even when session kill fails
599
+ - Failure information is returned in the `warnings` array
600
+
601
+ **UI Implementation:**
602
+ - Delete button (×) appears on hover over repository filter chips
603
+ - Confirmation dialog requires typing "delete"
604
+ - Warning icon (⚠️) displayed for repositories set via `WORKTREE_REPOS` environment variable
605
+
606
+ **Related Files:**
607
+ - `src/lib/session-cleanup.ts` - Session/poller stop Facade
608
+ - `src/app/api/repositories/route.ts` - DELETE endpoint
609
+ - `src/lib/db.ts` - `getWorktreeIdsByRepository()`, `deleteRepositoryWorktrees()`
610
+ - `src/lib/ws-server.ts` - `cleanupRooms()`
611
+
612
+ ### 10.5 Observability
613
+
614
+ - For the future:
615
+ - Response time (latency) measurement
616
+ - Error rates
617
+ - Per-session history metrics
618
+ - Extension fields in ChatMessage and Worktree for metadata to enable visualization.
619
+
620
+ ---
621
+
622
+ ## 11. UI Layout Architecture (PC, Issue #727 / #730 / #747)
623
+
624
+ > **Note**: The legacy desktop left-pane model (history / files / memo, MobileTabBar) introduced in #600 has been replaced by the ActivityBar model described in this chapter. Reorganizing the older descriptions is out of scope here.
625
+
626
+ This chapter covers the **responsibility boundaries, state ownership, and data flow** of the top-level PC UI layout (why the structure exists and who owns which state). Visual layout, interactions (keyboard / Tooltip), and the component catalog are owned by [./UI_UX_GUIDE.md](./UI_UX_GUIDE.md) as the single source of truth and are not duplicated here.
627
+
628
+ ### 11.1 Component Responsibilities and State Ownership
629
+
630
+ - **ActivityBar** (`src/components/worktree/ActivityBar.tsx`): A fully controlled component that **does not own** the activity-selection state. It receives `active` / `onToggle` as props and renders `ACTIVITIES` from `@/config/activity-bar-config` (the 6 activities: Files / Git / Notes / Schedules / Agent / Timer). The one exception is the sidebar toggle at the top (Issue #747), which reads `{ isOpen, toggle }` directly from `useSidebarContext()` and is placed outside the `role="tablist"` so it does not interfere with tab keyboard navigation.
631
+ - **ActivityPane** (`ActivityPane.tsx`): A stateless, table-driven dispatcher. It picks exactly one node — `activities[active]` — from the parent-built `ActivityContentMap` (`Partial<Record<ActivityId, ReactNode>>`) and renders it through an `ErrorBoundary`. Because a single `active` key resolves to a single node, **rendering multiple activities simultaneously is structurally impossible**.
632
+ - **TerminalContainer** (`TerminalContainer.tsx`, Issue #730): Wraps a `terminal` slot (always rendered) and an optional `history` slot. Since Issue #744, the top-level History column is no longer rendered on PC; History was moved inside each terminal split (see §12). The `history` prop and the `useHistoryPaneState` wiring are kept for backward compatibility with the #730 single-column layout.
633
+ - **WorktreeDesktopLayout** (`WorktreeDesktopLayout.tsx`, Issue #730): A **2-column layout** of ActivityPane and the Right pane. Issue #730 simplified it from 4 columns to 2 (History moved into the TerminalContainer in the Right pane, and the ActivityBar moved to full-height rendering in the parent). When `activityPane === null`, both the activity column and its boundary PaneResizer are hidden.
634
+ - **PaneResizer** (`PaneResizer.tsx`): A generic resizer that owns only transient drag state. It **only reports a pixel delta via `onResize(delta)`**; the parent decides the final pane width. It is reused for both the Activity↔Right boundary in WorktreeDesktopLayout and the History↔Terminal boundary in TerminalContainer.
635
+
636
+ ### 11.2 State Owners (Custom Hooks)
637
+
638
+ - **useActivityBarState** (`src/hooks/useActivityBarState.ts`): The single source of truth for the `active` state. It persists to `commandmate.worktree.activeActivity`, but the **closed state (null) is intentionally not persisted** (only the last selected activity is stored so it reopens on revisit). On invalid/missing values it falls back to `DEFAULT_ACTIVITY = 'files'`; the initial render is deterministically `DEFAULT_ACTIVITY` and the localStorage read happens in a post-mount `useEffect` (to avoid hydration mismatch).
639
+ - **SidebarContext** (`src/contexts/SidebarContext.tsx`): Owns the sidebar `isOpen` via `useReducer`. The ActivityBar hamburger (Issue #747) reads this context directly, forming a separate data-flow path from the props-based activity selection.
640
+
641
+ The orchestrator (`WorktreeDetailRefactored.tsx`) calls `useActivityBarState`, builds the `ActivityContentMap`, and wires ActivityBar / ActivityPane / WorktreeDesktopLayout together.
642
+
643
+ ### 11.3 Data-Flow Diagram
644
+
645
+ ```mermaid
646
+ graph TD
647
+ Parent["WorktreeDetailRefactored<br/>(orchestrator)"]
648
+ ActState["useActivityBarState<br/>(owns active / localStorage)"]
649
+ SideCtx["SidebarContext<br/>(owns isOpen)"]
650
+ Bar["ActivityBar<br/>(stateless)"]
651
+ Pane["ActivityPane<br/>(table-driven dispatch)"]
652
+ Layout["WorktreeDesktopLayout<br/>(2 columns + PaneResizer)"]
653
+ Term["TerminalContainer<br/>(terminal + optional history)"]
654
+
655
+ ActState -->|active| Parent
656
+ Parent -->|onToggle| ActState
657
+ Parent -->|active / onToggle| Bar
658
+ Bar -->|"sidebar toggle (Issue #747)"| SideCtx
659
+ Parent -->|"activityPane (nullable)"| Layout
660
+ Parent -->|"ActivityContentMap"| Pane
661
+ Pane --> Layout
662
+ Layout -->|rightPane| Term
663
+ ```
664
+
665
+ > **Forward reference**: The per-agent (per-CLI) session status indicator is already implemented in Issue #743 / #749 / #751 (per-split header status and the DesktopHeader agent status row). It is out of scope for this chapter and may be documented later (optional).
666
+
667
+ ---
668
+
669
+ ## 12. TerminalSplits Strategy (PC, Issue #728 / #736 / #744)
670
+
671
+ This chapter covers the PC terminal's 1–3 splits and the per-(worktreeId, cliToolId) fan-out polling strategy that runs independently per split.
672
+
673
+ ### 12.1 Split State Management (useTerminalSplits)
674
+
675
+ - The state owner is `src/hooks/useTerminalSplits.ts` (Issue #728). It is **intentionally kept out of** the VS Code-style layout reducer (activityBar / historyPane, etc.) to avoid action bloat.
676
+ - Constants (`src/config/terminal-split-config.ts`): `MIN_SPLITS = 1`, `MAX_SPLITS = 3`, `DEFAULT_SPLIT_CONFIG = { splits: [{ cliToolId: 'claude' }], widths: [1] }`.
677
+ - Persistence is **per worktree** (splits + widths are stored in localStorage under `getTerminalSplitsStorageKey(worktreeId)`). On a worktreeId change the state is reloaded and `focusedSplitIndex` is reset to 0.
678
+ - On load, the config is validated by `isValidSplitConfig` (`splits.length ∈ [1, 3]`, `widths.length === splits.length`, each width finite and positive); on failure it falls back to `DEFAULT_SPLIT_CONFIG` (defense against external edits / stale data).
679
+ - **Same-CLI duplicate-selection guard**: `setSplitCliTool` rejects the change if another split already uses that CLI, and `availableCliTools(idx)` returns a list excluding in-use CLIs (the UI `<select>` disables those options). Because the number of CLI types (6) exceeds `MAX_SPLITS` (3), `addSplit`'s unused-CLI assignment never runs out.
680
+
681
+ ### 12.2 per-(worktreeId, cliToolId) Fan-out Polling (useTerminalPanePolling)
682
+
683
+ - Each `TerminalSplitPaneContent` owns one instance of `src/hooks/useTerminalPanePolling.ts` and calls `GET /api/worktrees/{worktreeId}/current-output?cliTool={cliToolId}` **independently** (split 0 = Claude and split 1 = Codex poll on their own).
684
+ - Owned state: `output` / `isRunning` / `isThinking` / `isSelectionListActive` / `attaching` (true until the first successful fetch) / `autoScroll` (per pane) / prompt. Auto-Yes state and History messages are global at activeCliTab scope, so they are **intentionally not owned** here.
685
+ - **Stale-response discard (2 axes)**: a `requestId` incremented on every fetch, and an `inFlightCliToolRef` that records the current CLI on every render, are compared at response time; any response that does not match (out-of-order or CLI-switch crossing) is discarded. A response whose server-provided `cliToolId` differs from the requested CLI is also discarded.
686
+ - The polling cadence switches on `isRunning` (`ACTIVE_POLLING_INTERVAL_MS = 2000` / `IDLE_POLLING_INTERVAL_MS = 5000`). Ticks where `document.visibilityState === 'hidden'` are skipped, and a single re-fetch runs when visibility is restored (polling stops in the background).
687
+ - On a change of `compositeKey = {worktreeId}::{cliToolId}`, `requestId` is bumped, output / prompt are cleared, and the pane returns to the `attaching` state (treated as a fresh attach).
688
+
689
+ ### 12.3 per-split Message History and Namespace Separation
690
+
691
+ - **useSplitMessages** (`src/hooks/useSplitMessages.ts`, Issue #744): Each split independently fetches `GET /api/worktrees/{worktreeId}/messages?cliTool={cliToolId}` (`SPLIT_MESSAGES_POLL_INTERVAL_MS = 5000`). The parent's `state.messages` is already filtered to activeCliTab, so it cannot be reused to show split A=Claude and split B=Codex at the same time. The stale-guard is identical in form to useTerminalPanePolling.
692
+ - **makeHistoryNamespace** (`src/lib/terminal-highlight.ts`, Issue #744): `CSS.highlights` is a global Map keyed by name, so multiple HistoryPanes using the same namespace (`HISTORY_SEARCH_NAMESPACE`) would clobber each other's search highlights. `makeHistoryNamespace(splitIndex)` returns a namespace suffixed by the split index (`history-search-{idx}`, etc.) so each split keeps its highlights under a distinct registry key, avoiding collisions. `applyHistoryHighlights` and friends default to the shared namespace when the `namespace` argument is omitted, so Mobile / single-pane calls are unchanged (backward compatible).
693
+
694
+ ### 12.4 Difference from the Mobile Path
695
+
696
+ - On Mobile, `MobileTerminalTab` owns a **single instance** of `useTerminalPanePolling` and mounts it only while the terminal tab is shown (polling only the one CLI corresponding to activeCliTab).
697
+ - Issue #736 removed the terminal reducer slice, so both PC and Mobile obtain output from `useTerminalPanePolling`. The difference is that PC starts up to `MAX_SPLITS` (3) instances **in parallel**, one per split.
698
+
699
+ ### 12.5 Data-Flow Diagram
700
+
701
+ ```mermaid
702
+ graph TD
703
+ Splits["useTerminalSplits<br/>(owns splits / widths / focusedSplitIndex)"]
704
+ Container["TerminalSplitContainer<br/>(delegates each split via renderPane)"]
705
+ P0["TerminalSplitPaneContent[0]<br/>cliTool=claude"]
706
+ P1["TerminalSplitPaneContent[1]<br/>cliTool=codex"]
707
+ Poll0["useTerminalPanePolling"]
708
+ Msg0["useSplitMessages"]
709
+ Poll1["useTerminalPanePolling"]
710
+ API0["/current-output?cliTool=claude"]
711
+ API0b["/messages?cliTool=claude"]
712
+ API1["/current-output?cliTool=codex"]
713
+
714
+ Splits --> Container
715
+ Container --> P0
716
+ Container --> P1
717
+ P0 --> Poll0 --> API0
718
+ P0 --> Msg0 --> API0b
719
+ P1 --> Poll1 --> API1
720
+ ```
721
+
722
+ > **Note**: The History pane's visibility / width is shared across all splits via `useHistoryPaneState` in the MVP (per-split independent toggle / width is a future extension).