commandmate 0.1.0 → 0.1.6

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 (337) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-build-manifest.json +72 -0
  3. package/.next/app-path-routes-manifest.json +1 -0
  4. package/.next/build-manifest.json +32 -0
  5. package/.next/cache/.tsbuildinfo +1 -0
  6. package/.next/cache/config.json +7 -0
  7. package/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/.next/cache/webpack/client-production/1.pack +0 -0
  9. package/.next/cache/webpack/client-production/2.pack +0 -0
  10. package/.next/cache/webpack/client-production/index.pack +0 -0
  11. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  12. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  13. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  14. package/.next/cache/webpack/server-production/0.pack +0 -0
  15. package/.next/cache/webpack/server-production/index.pack +0 -0
  16. package/.next/export-marker.json +1 -0
  17. package/.next/images-manifest.json +1 -0
  18. package/.next/next-minimal-server.js.nft.json +1 -0
  19. package/.next/next-server.js.nft.json +1 -0
  20. package/.next/package.json +1 -0
  21. package/.next/prerender-manifest.json +1 -0
  22. package/.next/react-loadable-manifest.json +249 -0
  23. package/.next/required-server-files.json +1 -0
  24. package/.next/routes-manifest.json +1 -0
  25. package/.next/server/app/_not-found/page.js +1 -0
  26. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  27. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/_not-found.html +1 -0
  29. package/.next/server/app/_not-found.meta +6 -0
  30. package/.next/server/app/_not-found.rsc +10 -0
  31. package/.next/server/app/api/external-apps/[id]/health/route.js +45 -0
  32. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -0
  33. package/.next/server/app/api/external-apps/[id]/route.js +45 -0
  34. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -0
  35. package/.next/server/app/api/external-apps/route.js +45 -0
  36. package/.next/server/app/api/external-apps/route.js.nft.json +1 -0
  37. package/.next/server/app/api/hooks/claude-done/route.js +19 -0
  38. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -0
  39. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -0
  40. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -0
  41. package/.next/server/app/api/repositories/clone/route.js +1 -0
  42. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -0
  43. package/.next/server/app/api/repositories/route.js +1 -0
  44. package/.next/server/app/api/repositories/route.js.nft.json +1 -0
  45. package/.next/server/app/api/repositories/scan/route.js +1 -0
  46. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -0
  47. package/.next/server/app/api/repositories/sync/route.js +1 -0
  48. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -0
  49. package/.next/server/app/api/slash-commands/route.js +1 -0
  50. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -0
  51. package/.next/server/app/api/slash-commands.body +1 -0
  52. package/.next/server/app/api/slash-commands.meta +1 -0
  53. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -0
  54. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -0
  55. package/.next/server/app/api/worktrees/[id]/capture/route.js +2 -0
  56. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -0
  57. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -0
  58. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -0
  59. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -0
  60. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -0
  61. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -0
  62. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -0
  63. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -0
  64. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -0
  65. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -0
  66. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -0
  67. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -0
  68. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -0
  69. package/.next/server/app/api/worktrees/[id]/logs/route.js +19 -0
  70. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -0
  71. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -0
  72. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -0
  73. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -0
  74. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -0
  75. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -0
  76. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -0
  77. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -0
  78. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -0
  79. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -0
  80. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -0
  81. package/.next/server/app/api/worktrees/[id]/route.js +1 -0
  82. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -0
  83. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -0
  84. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -0
  85. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -0
  86. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -0
  87. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -0
  88. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -0
  89. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -0
  90. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -0
  91. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -0
  92. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -0
  93. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -0
  94. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -0
  95. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -0
  96. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -0
  97. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -0
  98. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -0
  99. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -0
  100. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -0
  101. package/.next/server/app/api/worktrees/route.js +1 -0
  102. package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
  103. package/.next/server/app/apple-icon.png/route.js +1 -0
  104. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -0
  105. package/.next/server/app/apple-icon.png.body +0 -0
  106. package/.next/server/app/apple-icon.png.meta +1 -0
  107. package/.next/server/app/icon.png/route.js +1 -0
  108. package/.next/server/app/icon.png/route.js.nft.json +1 -0
  109. package/.next/server/app/icon.png.body +0 -0
  110. package/.next/server/app/icon.png.meta +1 -0
  111. package/.next/server/app/index.html +9 -0
  112. package/.next/server/app/index.meta +5 -0
  113. package/.next/server/app/index.rsc +8 -0
  114. package/.next/server/app/page.js +16 -0
  115. package/.next/server/app/page.js.nft.json +1 -0
  116. package/.next/server/app/page_client-reference-manifest.js +1 -0
  117. package/.next/server/app/proxy/[...path]/route.js +45 -0
  118. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -0
  119. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -0
  120. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -0
  121. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -0
  122. package/.next/server/app/worktrees/[id]/page.js +21 -0
  123. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -0
  124. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -0
  125. package/.next/server/app/worktrees/[id]/simple-terminal/page.js +4 -0
  126. package/.next/server/app/worktrees/[id]/simple-terminal/page.js.nft.json +1 -0
  127. package/.next/server/app/worktrees/[id]/simple-terminal/page_client-reference-manifest.js +1 -0
  128. package/.next/server/app/worktrees/[id]/terminal/page.js +6 -0
  129. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -0
  130. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -0
  131. package/.next/server/app-paths-manifest.json +46 -0
  132. package/.next/server/chunks/1318.js +29 -0
  133. package/.next/server/chunks/1528.js +1 -0
  134. package/.next/server/chunks/1682.js +6 -0
  135. package/.next/server/chunks/2518.js +12 -0
  136. package/.next/server/chunks/3053.js +1 -0
  137. package/.next/server/chunks/3673.js +1 -0
  138. package/.next/server/chunks/3853.js +1 -0
  139. package/.next/server/chunks/434.js +1 -0
  140. package/.next/server/chunks/4471.js +2 -0
  141. package/.next/server/chunks/4893.js +2 -0
  142. package/.next/server/chunks/5972.js +12 -0
  143. package/.next/server/chunks/6550.js +1 -0
  144. package/.next/server/chunks/6621.js +1 -0
  145. package/.next/server/chunks/7213.js +1 -0
  146. package/.next/server/chunks/7425.js +500 -0
  147. package/.next/server/chunks/8585.js +1 -0
  148. package/.next/server/chunks/8887.js +1 -0
  149. package/.next/server/chunks/8948.js +2 -0
  150. package/.next/server/chunks/9703.js +31 -0
  151. package/.next/server/chunks/9723.js +19 -0
  152. package/.next/server/chunks/font-manifest.json +1 -0
  153. package/.next/server/edge-runtime-webpack.js +2 -0
  154. package/.next/server/edge-runtime-webpack.js.map +1 -0
  155. package/.next/server/font-manifest.json +1 -0
  156. package/.next/server/functions-config-manifest.json +1 -0
  157. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  158. package/.next/server/middleware-build-manifest.js +1 -0
  159. package/.next/server/middleware-manifest.json +32 -0
  160. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  161. package/.next/server/next-font-manifest.js +1 -0
  162. package/.next/server/next-font-manifest.json +1 -0
  163. package/.next/server/pages/404.html +1 -0
  164. package/.next/server/pages/500.html +1 -0
  165. package/.next/server/pages/_app.js +1 -0
  166. package/.next/server/pages/_app.js.nft.json +1 -0
  167. package/.next/server/pages/_document.js +1 -0
  168. package/.next/server/pages/_document.js.nft.json +1 -0
  169. package/.next/server/pages/_error.js +1 -0
  170. package/.next/server/pages/_error.js.nft.json +1 -0
  171. package/.next/server/pages-manifest.json +1 -0
  172. package/.next/server/server-reference-manifest.js +1 -0
  173. package/.next/server/server-reference-manifest.json +1 -0
  174. package/.next/server/src/middleware.js +14 -0
  175. package/.next/server/src/middleware.js.map +1 -0
  176. package/.next/server/webpack-runtime.js +1 -0
  177. package/.next/static/chunks/0dbeb660.3e800dfbd28be3bd.js +53 -0
  178. package/.next/static/chunks/1015.0eaa4da7f61149bc.js +59 -0
  179. package/.next/static/chunks/1098.49268c9fe1b028fa.js +1 -0
  180. package/.next/static/chunks/13.feeafc7cc620f8c4.js +1 -0
  181. package/.next/static/chunks/1423.7b1e8bf760d28078.js +1 -0
  182. package/.next/static/chunks/1582.9f8590f71ff798ca.js +55 -0
  183. package/.next/static/chunks/1817.a66d96cedb761daa.js +262 -0
  184. package/.next/static/chunks/2117-d845c2cd62e344a6.js +2 -0
  185. package/.next/static/chunks/2398.0b21e4eb7006a230.js +93 -0
  186. package/.next/static/chunks/2526.8ac62b527c9ab703.js +43 -0
  187. package/.next/static/chunks/2626.2125083a1ff3b80a.js +29 -0
  188. package/.next/static/chunks/2689.720a4874b02d4211.js +174 -0
  189. package/.next/static/chunks/2853-d11a80b03c9a1640.js +1 -0
  190. package/.next/static/chunks/2957-327e43ef4c12808f.js +1 -0
  191. package/.next/static/chunks/2cdb6380.35626fc6e41bbba4.js +136 -0
  192. package/.next/static/chunks/30d07d85-393352a92199f695.js +3 -0
  193. package/.next/static/chunks/3559.f073f72c4466ce0e.js +1 -0
  194. package/.next/static/chunks/3574.7a94c27e6a496a56.js +63 -0
  195. package/.next/static/chunks/383.20683891c9a5f2c4.js +4 -0
  196. package/.next/static/chunks/3843.3fdda732987f7bb8.js +1 -0
  197. package/.next/static/chunks/3852.822389f445c9b427.js +1 -0
  198. package/.next/static/chunks/3991.4bc063cb5be3a86c.js +1 -0
  199. package/.next/static/chunks/4212.52c1bb34fc97d0d0.js +131 -0
  200. package/.next/static/chunks/4327.3b84aa049900fdeb.js +60 -0
  201. package/.next/static/chunks/4362.7bd6f0282e49d79b.js +1 -0
  202. package/.next/static/chunks/4721.40615a5f4f32b5fb.js +1 -0
  203. package/.next/static/chunks/4851-45df4d388db5623f.js +1 -0
  204. package/.next/static/chunks/5112.17318d1c6b28044b.js +1 -0
  205. package/.next/static/chunks/5126.93fa4e797d609286.js +56 -0
  206. package/.next/static/chunks/5387.47590ac4ef66c864.js +5 -0
  207. package/.next/static/chunks/5813.4483664ba482beb1.js +1 -0
  208. package/.next/static/chunks/6143.1450875bd03a2366.js +36 -0
  209. package/.next/static/chunks/6406.9653f0d41ab85059.js +1 -0
  210. package/.next/static/chunks/656.d72f25ce819bd77e.js +149 -0
  211. package/.next/static/chunks/6678.492e73ca42b2a273.js +62 -0
  212. package/.next/static/chunks/6725-f7607851b7d57eb1.js +1 -0
  213. package/.next/static/chunks/6792.3c01ac4dda4b5c6d.js +1 -0
  214. package/.next/static/chunks/7004.808cbf327ef5955e.js +1 -0
  215. package/.next/static/chunks/7290.09ef84cf94f90c4d.js +1 -0
  216. package/.next/static/chunks/7415.6b481c2baf363262.js +148 -0
  217. package/.next/static/chunks/7648-325564a6e12a3257.js +1 -0
  218. package/.next/static/chunks/7665.47fccad04449a8f9.js +215 -0
  219. package/.next/static/chunks/7753.6bdce86b7fde3d10.js +166 -0
  220. package/.next/static/chunks/8125.245a9df052d274fb.js +1 -0
  221. package/.next/static/chunks/816-7e340dad784be28c.js +1 -0
  222. package/.next/static/chunks/8288.4883743fa40672e2.js +24 -0
  223. package/.next/static/chunks/8522.1607e96011c66877.js +1 -0
  224. package/.next/static/chunks/8772.863c564498d88487.js +1 -0
  225. package/.next/static/chunks/8841.dadeb1ece8e46004.js +1 -0
  226. package/.next/static/chunks/8885.f8d9912b40d74811.js +1 -0
  227. package/.next/static/chunks/90542734.c1553d0fe7fc14fc.js +1 -0
  228. package/.next/static/chunks/9365-733d8c05712d2888.js +1 -0
  229. package/.next/static/chunks/9552.b7dfb7903ead934b.js +1 -0
  230. package/.next/static/chunks/9834.295b45635ce04f5e.js +24 -0
  231. package/.next/static/chunks/app/_not-found/page-a9d04e58c81115ec.js +1 -0
  232. package/.next/static/chunks/app/layout-37e55f11dcc8b1bf.js +1 -0
  233. package/.next/static/chunks/app/page-9cd00de9cc0abc43.js +1 -0
  234. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9e5adf57cbbbdf05.js +1 -0
  235. package/.next/static/chunks/app/worktrees/[id]/page-8c6676303b63fdaf.js +1 -0
  236. package/.next/static/chunks/app/worktrees/[id]/simple-terminal/page-16feb3e86e42f4d1.js +1 -0
  237. package/.next/static/chunks/app/worktrees/[id]/terminal/page-be802baffc84dbd2.js +1 -0
  238. package/.next/static/chunks/d3ac728e.6c9c508274d4d2d5.js +1 -0
  239. package/.next/static/chunks/fd9d1056-bbe86e4ae099d5cd.js +1 -0
  240. package/.next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
  241. package/.next/static/chunks/main-a960f4a5e1a2f598.js +1 -0
  242. package/.next/static/chunks/main-app-420d93e43682fee5.js +1 -0
  243. package/.next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
  244. package/.next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
  245. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  246. package/.next/static/chunks/webpack-3fc79fab9bb738d7.js +1 -0
  247. package/.next/static/css/5eacd01f773eed7f.css +11 -0
  248. package/.next/static/css/85fa6dafca566008.css +1 -0
  249. package/.next/static/css/e174aa24f94ce607.css +3 -0
  250. package/.next/static/pQTquVjewvoJa7BML07ip/_buildManifest.js +1 -0
  251. package/.next/static/pQTquVjewvoJa7BML07ip/_ssgManifest.js +1 -0
  252. package/.next/trace +5 -0
  253. package/.next/types/app/api/external-apps/[id]/health/route.ts +343 -0
  254. package/.next/types/app/api/external-apps/[id]/route.ts +343 -0
  255. package/.next/types/app/api/external-apps/route.ts +343 -0
  256. package/.next/types/app/api/hooks/claude-done/route.ts +343 -0
  257. package/.next/types/app/api/repositories/clone/[jobId]/route.ts +343 -0
  258. package/.next/types/app/api/repositories/clone/route.ts +343 -0
  259. package/.next/types/app/api/repositories/route.ts +343 -0
  260. package/.next/types/app/api/repositories/scan/route.ts +343 -0
  261. package/.next/types/app/api/repositories/sync/route.ts +343 -0
  262. package/.next/types/app/api/slash-commands/route.ts +343 -0
  263. package/.next/types/app/api/worktrees/[id]/auto-yes/route.ts +343 -0
  264. package/.next/types/app/api/worktrees/[id]/capture/route.ts +343 -0
  265. package/.next/types/app/api/worktrees/[id]/cli-tool/route.ts +343 -0
  266. package/.next/types/app/api/worktrees/[id]/current-output/route.ts +343 -0
  267. package/.next/types/app/api/worktrees/[id]/files/[...path]/route.ts +343 -0
  268. package/.next/types/app/api/worktrees/[id]/interrupt/route.ts +343 -0
  269. package/.next/types/app/api/worktrees/[id]/kill-session/route.ts +343 -0
  270. package/.next/types/app/api/worktrees/[id]/logs/[filename]/route.ts +343 -0
  271. package/.next/types/app/api/worktrees/[id]/logs/route.ts +343 -0
  272. package/.next/types/app/api/worktrees/[id]/memos/[memoId]/route.ts +343 -0
  273. package/.next/types/app/api/worktrees/[id]/memos/route.ts +343 -0
  274. package/.next/types/app/api/worktrees/[id]/messages/route.ts +343 -0
  275. package/.next/types/app/api/worktrees/[id]/prompt-response/route.ts +343 -0
  276. package/.next/types/app/api/worktrees/[id]/respond/route.ts +343 -0
  277. package/.next/types/app/api/worktrees/[id]/route.ts +343 -0
  278. package/.next/types/app/api/worktrees/[id]/search/route.ts +343 -0
  279. package/.next/types/app/api/worktrees/[id]/send/route.ts +343 -0
  280. package/.next/types/app/api/worktrees/[id]/slash-commands/route.ts +343 -0
  281. package/.next/types/app/api/worktrees/[id]/start-polling/route.ts +343 -0
  282. package/.next/types/app/api/worktrees/[id]/terminal/route.ts +343 -0
  283. package/.next/types/app/api/worktrees/[id]/tree/[...path]/route.ts +343 -0
  284. package/.next/types/app/api/worktrees/[id]/tree/route.ts +343 -0
  285. package/.next/types/app/api/worktrees/[id]/upload/[...path]/route.ts +343 -0
  286. package/.next/types/app/api/worktrees/[id]/viewed/route.ts +343 -0
  287. package/.next/types/app/api/worktrees/route.ts +343 -0
  288. package/.next/types/app/page.ts +79 -0
  289. package/.next/types/app/proxy/[...path]/route.ts +343 -0
  290. package/.next/types/app/worktrees/[id]/files/[...path]/page.ts +79 -0
  291. package/.next/types/app/worktrees/[id]/page.ts +79 -0
  292. package/.next/types/app/worktrees/[id]/simple-terminal/page.ts +79 -0
  293. package/.next/types/app/worktrees/[id]/terminal/page.ts +79 -0
  294. package/.next/types/package.json +1 -0
  295. package/README.md +25 -20
  296. package/dist/cli/commands/start.d.ts.map +1 -1
  297. package/dist/cli/commands/start.js +4 -1
  298. package/dist/cli/utils/daemon.d.ts.map +1 -1
  299. package/dist/cli/utils/daemon.js +4 -2
  300. package/dist/cli/utils/paths.d.ts +25 -0
  301. package/dist/cli/utils/paths.d.ts.map +1 -0
  302. package/dist/cli/utils/paths.js +35 -0
  303. package/dist/server/server.js +123 -0
  304. package/dist/server/src/lib/claude-output.js +33 -0
  305. package/dist/server/src/lib/claude-session.js +312 -0
  306. package/dist/server/src/lib/cli-patterns.js +137 -0
  307. package/dist/server/src/lib/cli-session.js +73 -0
  308. package/dist/server/src/lib/cli-tools/base.js +51 -0
  309. package/dist/server/src/lib/cli-tools/claude.js +65 -0
  310. package/dist/server/src/lib/cli-tools/codex.js +132 -0
  311. package/dist/server/src/lib/cli-tools/gemini.js +122 -0
  312. package/dist/server/src/lib/cli-tools/index.js +22 -0
  313. package/dist/server/src/lib/cli-tools/manager.js +143 -0
  314. package/dist/server/src/lib/cli-tools/types.js +5 -0
  315. package/dist/server/src/lib/conversation-logger.js +25 -0
  316. package/dist/server/src/lib/db-instance.js +51 -0
  317. package/dist/server/src/lib/db-migrations.js +777 -0
  318. package/dist/server/src/lib/db.js +835 -0
  319. package/dist/server/src/lib/env.js +179 -0
  320. package/dist/server/src/lib/log-manager.js +234 -0
  321. package/dist/server/src/lib/logger.js +232 -0
  322. package/dist/server/src/lib/prompt-detector.js +285 -0
  323. package/dist/server/src/lib/response-poller.js +638 -0
  324. package/dist/server/src/lib/tmux.js +299 -0
  325. package/dist/server/src/lib/worktrees.js +231 -0
  326. package/dist/server/src/lib/ws-server.js +323 -0
  327. package/dist/server/src/types/clone.js +39 -0
  328. package/dist/server/src/types/conversation.js +9 -0
  329. package/dist/server/src/types/external-apps.js +6 -0
  330. package/dist/server/src/types/infinite-messages.js +65 -0
  331. package/dist/server/src/types/markdown-editor.js +94 -0
  332. package/dist/server/src/types/models.js +5 -0
  333. package/dist/server/src/types/sidebar.js +89 -0
  334. package/dist/server/src/types/slash-commands.js +47 -0
  335. package/dist/server/src/types/ui-actions.js +8 -0
  336. package/dist/server/src/types/ui-state.js +62 -0
  337. package/package.json +14 -6
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocket Server for Real-time Communication
4
+ * Manages WebSocket connections and room-based message broadcasting
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.setupWebSocket = setupWebSocket;
8
+ exports.broadcast = broadcast;
9
+ exports.broadcastMessage = broadcastMessage;
10
+ exports.cleanupRooms = cleanupRooms;
11
+ exports.closeWebSocket = closeWebSocket;
12
+ const ws_1 = require("ws");
13
+ // Global state
14
+ let wss = null;
15
+ const clients = new Map();
16
+ const rooms = new Map();
17
+ /**
18
+ * Setup WebSocket server on HTTP server
19
+ *
20
+ * @param server - HTTP server instance
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const server = createServer();
25
+ * setupWebSocket(server);
26
+ * server.listen(3000);
27
+ * ```
28
+ */
29
+ function setupWebSocket(server) {
30
+ wss = new ws_1.WebSocketServer({ server });
31
+ // Handle WebSocket server errors (e.g., invalid frames from clients)
32
+ wss.on('error', (error) => {
33
+ console.error('[WS Server] Error:', error.message);
34
+ });
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36
+ wss.on('connection', (ws, req) => {
37
+ // Connection logging removed to reduce noise
38
+ // Initialize client info
39
+ const clientInfo = {
40
+ ws,
41
+ worktreeIds: new Set(),
42
+ };
43
+ clients.set(ws, clientInfo);
44
+ // Handle underlying socket errors (catches invalid frame errors earlier)
45
+ // Force destroy the socket on error to prevent further frame processing
46
+ const socket = ws._socket;
47
+ if (socket) {
48
+ socket.on('error', (err) => {
49
+ // Suppress common mobile browser disconnect errors
50
+ const isExpectedError = err.code === 'WS_ERR_INVALID_CLOSE_CODE' ||
51
+ err.message?.includes('Invalid WebSocket frame') ||
52
+ err.message?.includes('write after end') ||
53
+ err.message?.includes('ECONNRESET') ||
54
+ err.message?.includes('EPIPE');
55
+ if (!isExpectedError) {
56
+ console.error('[WS Socket] Error:', err.message);
57
+ }
58
+ // Immediately destroy the socket to prevent further errors
59
+ try {
60
+ if (socket.destroy)
61
+ socket.destroy();
62
+ }
63
+ catch {
64
+ // Socket may already be destroyed
65
+ }
66
+ handleDisconnect(ws);
67
+ });
68
+ }
69
+ // Handle messages
70
+ ws.on('message', (data) => {
71
+ try {
72
+ const message = JSON.parse(data.toString());
73
+ handleMessage(ws, message);
74
+ }
75
+ catch (parseError) {
76
+ console.error('Error parsing WebSocket message:', parseError);
77
+ // Don't close connection on parse error, just log it
78
+ }
79
+ });
80
+ // Handle disconnection - silently clean up
81
+ ws.on('close', () => {
82
+ handleDisconnect(ws);
83
+ });
84
+ // Handle errors (including invalid close codes from mobile browsers)
85
+ ws.on('error', (error) => {
86
+ // Suppress noisy errors from mobile browser disconnects
87
+ const isExpectedError = error.code === 'WS_ERR_INVALID_CLOSE_CODE' ||
88
+ error.message?.includes('Invalid WebSocket frame') ||
89
+ error.message?.includes('write after end');
90
+ if (!isExpectedError) {
91
+ console.error('[WS] WebSocket error:', error.message);
92
+ }
93
+ // Immediately terminate to prevent further errors
94
+ try {
95
+ ws.terminate();
96
+ }
97
+ catch {
98
+ // WebSocket may already be closed
99
+ }
100
+ handleDisconnect(ws);
101
+ });
102
+ });
103
+ console.log('WebSocket server initialized');
104
+ }
105
+ /**
106
+ * Handle incoming WebSocket message
107
+ */
108
+ function handleMessage(ws, message) {
109
+ switch (message.type) {
110
+ case 'subscribe':
111
+ handleSubscribe(ws, message.worktreeId);
112
+ break;
113
+ case 'unsubscribe':
114
+ handleUnsubscribe(ws, message.worktreeId);
115
+ break;
116
+ case 'broadcast':
117
+ handleBroadcast(message.worktreeId, message.data);
118
+ break;
119
+ default:
120
+ console.warn('Unknown message type:', message);
121
+ }
122
+ }
123
+ /**
124
+ * Subscribe client to a worktree room
125
+ */
126
+ function handleSubscribe(ws, worktreeId) {
127
+ const clientInfo = clients.get(ws);
128
+ if (!clientInfo) {
129
+ console.log(`[WS] handleSubscribe: clientInfo not found for worktreeId: ${worktreeId}`);
130
+ return;
131
+ }
132
+ // Add worktreeId to client's subscriptions
133
+ clientInfo.worktreeIds.add(worktreeId);
134
+ // Add client to room
135
+ if (!rooms.has(worktreeId)) {
136
+ rooms.set(worktreeId, new Set());
137
+ }
138
+ const room = rooms.get(worktreeId);
139
+ room.add(ws);
140
+ console.log(`Client subscribed to worktree: ${worktreeId}, room size: ${room.size}, ws readyState: ${ws.readyState}`);
141
+ }
142
+ /**
143
+ * Unsubscribe client from a worktree room
144
+ */
145
+ function handleUnsubscribe(ws, worktreeId) {
146
+ const clientInfo = clients.get(ws);
147
+ if (!clientInfo)
148
+ return;
149
+ // Remove worktreeId from client's subscriptions
150
+ clientInfo.worktreeIds.delete(worktreeId);
151
+ // Remove client from room
152
+ const room = rooms.get(worktreeId);
153
+ if (room) {
154
+ room.delete(ws);
155
+ // Clean up empty rooms
156
+ if (room.size === 0) {
157
+ rooms.delete(worktreeId);
158
+ }
159
+ }
160
+ console.log(`Client unsubscribed from worktree: ${worktreeId}`);
161
+ }
162
+ /**
163
+ * Broadcast message to all clients in a worktree room
164
+ */
165
+ function handleBroadcast(worktreeId, data) {
166
+ const room = rooms.get(worktreeId);
167
+ console.log(`[WS] handleBroadcast called for ${worktreeId}, room size: ${room?.size || 0}`);
168
+ if (!room) {
169
+ console.log(`[WS] No room found for ${worktreeId}`);
170
+ return;
171
+ }
172
+ if (room.size === 0) {
173
+ console.log(`[WS] Room for ${worktreeId} is empty`);
174
+ return;
175
+ }
176
+ try {
177
+ const message = JSON.stringify({
178
+ type: 'broadcast',
179
+ worktreeId,
180
+ data,
181
+ });
182
+ let successCount = 0;
183
+ let errorCount = 0;
184
+ room.forEach((client) => {
185
+ if (client.readyState === ws_1.WebSocket.OPEN) {
186
+ try {
187
+ client.send(message);
188
+ successCount++;
189
+ }
190
+ catch (sendError) {
191
+ errorCount++;
192
+ console.error(`Error sending WebSocket message to client:`, sendError);
193
+ }
194
+ }
195
+ });
196
+ console.log(`Broadcast to worktree ${worktreeId}: ${successCount}/${room.size} clients (${errorCount} errors)`);
197
+ }
198
+ catch (broadcastError) {
199
+ console.error(`Error broadcasting to worktree ${worktreeId}:`, broadcastError);
200
+ // Try to broadcast with sanitized data
201
+ try {
202
+ const sanitizedMessage = JSON.stringify({
203
+ type: 'broadcast',
204
+ worktreeId,
205
+ data: { error: 'Message encoding error' },
206
+ });
207
+ room.forEach((client) => {
208
+ if (client.readyState === ws_1.WebSocket.OPEN) {
209
+ try {
210
+ client.send(sanitizedMessage);
211
+ }
212
+ catch {
213
+ // Silent fail for fallback
214
+ }
215
+ }
216
+ });
217
+ }
218
+ catch (fallbackError) {
219
+ console.error('Failed to send fallback message:', fallbackError);
220
+ }
221
+ }
222
+ }
223
+ /**
224
+ * Handle client disconnection
225
+ */
226
+ function handleDisconnect(ws) {
227
+ const clientInfo = clients.get(ws);
228
+ if (!clientInfo)
229
+ return;
230
+ // Remove client from all rooms
231
+ clientInfo.worktreeIds.forEach((worktreeId) => {
232
+ const room = rooms.get(worktreeId);
233
+ if (room) {
234
+ room.delete(ws);
235
+ // Clean up empty rooms
236
+ if (room.size === 0) {
237
+ rooms.delete(worktreeId);
238
+ }
239
+ }
240
+ });
241
+ // Remove client from clients map
242
+ clients.delete(ws);
243
+ }
244
+ /**
245
+ * Broadcast message to a specific worktree room (for API use)
246
+ *
247
+ * @param worktreeId - Worktree identifier
248
+ * @param data - Data to broadcast
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * broadcast('feature-foo', { type: 'message', content: 'New message' });
253
+ * ```
254
+ */
255
+ function broadcast(worktreeId, data) {
256
+ handleBroadcast(worktreeId, data);
257
+ }
258
+ /**
259
+ * Broadcast message with type to a specific worktree room
260
+ *
261
+ * @param type - Message type
262
+ * @param data - Data to broadcast (should include worktreeId)
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * broadcastMessage('message', { worktreeId: 'feature-foo', message: {...} });
267
+ * ```
268
+ */
269
+ function broadcastMessage(type, data) {
270
+ if (data.worktreeId) {
271
+ handleBroadcast(data.worktreeId, { type, ...data });
272
+ }
273
+ else {
274
+ console.warn('broadcastMessage called without worktreeId');
275
+ }
276
+ }
277
+ /**
278
+ * Clean up WebSocket rooms for deleted worktrees
279
+ * Removes rooms from the rooms map (clients will naturally disconnect or resubscribe)
280
+ *
281
+ * @param worktreeIds - Array of worktree IDs to clean up
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * cleanupRooms(['wt-1', 'wt-2', 'wt-3']);
286
+ * ```
287
+ */
288
+ function cleanupRooms(worktreeIds) {
289
+ for (const worktreeId of worktreeIds) {
290
+ const room = rooms.get(worktreeId);
291
+ if (room) {
292
+ // Unsubscribe all clients from this room
293
+ room.forEach((ws) => {
294
+ const clientInfo = clients.get(ws);
295
+ if (clientInfo) {
296
+ clientInfo.worktreeIds.delete(worktreeId);
297
+ }
298
+ });
299
+ // Delete the room
300
+ rooms.delete(worktreeId);
301
+ console.log(`[WS] Cleaned up room for worktree: ${worktreeId}`);
302
+ }
303
+ }
304
+ }
305
+ /**
306
+ * Close WebSocket server
307
+ * Used for testing and graceful shutdown
308
+ */
309
+ function closeWebSocket() {
310
+ if (wss) {
311
+ // Close all client connections
312
+ clients.forEach((clientInfo) => {
313
+ clientInfo.ws.close();
314
+ });
315
+ // Clear state
316
+ clients.clear();
317
+ rooms.clear();
318
+ // Close server
319
+ wss.close();
320
+ wss = null;
321
+ console.log('WebSocket server closed');
322
+ }
323
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * Clone URL Registration Types
4
+ * Issue #71: Clone URL registration feature
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isCloneJobStatus = isCloneJobStatus;
8
+ exports.isCloneError = isCloneError;
9
+ exports.isValidationError = isValidationError;
10
+ // Type guards
11
+ /**
12
+ * Check if value is a valid CloneJobStatus
13
+ */
14
+ function isCloneJobStatus(value) {
15
+ return (typeof value === 'string' &&
16
+ ['pending', 'running', 'completed', 'failed', 'cancelled'].includes(value));
17
+ }
18
+ /**
19
+ * Check if value is a valid CloneError
20
+ */
21
+ function isCloneError(value) {
22
+ if (!value || typeof value !== 'object') {
23
+ return false;
24
+ }
25
+ const obj = value;
26
+ const validCategories = ['validation', 'network', 'auth', 'filesystem', 'git', 'system'];
27
+ return (typeof obj.category === 'string' &&
28
+ validCategories.includes(obj.category) &&
29
+ typeof obj.code === 'string' &&
30
+ typeof obj.message === 'string' &&
31
+ typeof obj.recoverable === 'boolean' &&
32
+ typeof obj.suggestedAction === 'string');
33
+ }
34
+ /**
35
+ * Check if error is a validation error
36
+ */
37
+ function isValidationError(error) {
38
+ return error.category === 'validation';
39
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Conversation Pair Types
4
+ *
5
+ * Types for grouping user-assistant message pairs in the UI layer.
6
+ * These types are used to display conversation history with 1:1 correspondence
7
+ * between user inputs and assistant responses.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for external apps module
4
+ * Issue #42: Proxy routing for multiple frontend applications
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for infinite message loading functionality
4
+ *
5
+ * Used by useInfiniteMessages hook and related components.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createInfiniteMessagesError = createInfiniteMessagesError;
9
+ /**
10
+ * Creates a structured InfiniteMessagesError from an unknown error
11
+ *
12
+ * @param options - Error creation options
13
+ * @returns Structured error object
14
+ */
15
+ function createInfiniteMessagesError(options) {
16
+ const { error, defaultMessage = 'An error occurred' } = options;
17
+ // Handle TypeError (typically network errors)
18
+ if (error instanceof TypeError && error.message.includes('fetch')) {
19
+ return {
20
+ code: 'NETWORK_ERROR',
21
+ message: 'Network error occurred. Please check your connection.',
22
+ retryable: true,
23
+ originalError: error,
24
+ };
25
+ }
26
+ // Handle Response objects (server errors)
27
+ if (error instanceof Response) {
28
+ if (error.status >= 500) {
29
+ return {
30
+ code: 'SERVER_ERROR',
31
+ message: 'Server error occurred. Please try again later.',
32
+ retryable: true,
33
+ };
34
+ }
35
+ return {
36
+ code: 'UNKNOWN',
37
+ message: `Request failed with status ${error.status}`,
38
+ retryable: error.status !== 404,
39
+ };
40
+ }
41
+ // Handle SyntaxError (parse errors)
42
+ if (error instanceof SyntaxError) {
43
+ return {
44
+ code: 'PARSE_ERROR',
45
+ message: 'Failed to parse response. Please try again.',
46
+ retryable: true,
47
+ originalError: error,
48
+ };
49
+ }
50
+ // Handle generic Error objects
51
+ if (error instanceof Error) {
52
+ return {
53
+ code: 'UNKNOWN',
54
+ message: error.message || defaultMessage,
55
+ retryable: true,
56
+ originalError: error,
57
+ };
58
+ }
59
+ // Handle unknown error types
60
+ return {
61
+ code: 'UNKNOWN',
62
+ message: defaultMessage,
63
+ retryable: true,
64
+ };
65
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for markdown editor feature
4
+ *
5
+ * @module types/markdown-editor
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_LAYOUT_STATE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
9
+ exports.isValidSplitRatio = isValidSplitRatio;
10
+ exports.isValidBoolean = isValidBoolean;
11
+ /**
12
+ * View mode strategies lookup
13
+ */
14
+ exports.VIEW_MODE_STRATEGIES = {
15
+ split: {
16
+ showEditor: true,
17
+ showPreview: true,
18
+ editorWidth: 'w-1/2',
19
+ previewWidth: 'w-1/2',
20
+ },
21
+ editor: {
22
+ showEditor: true,
23
+ showPreview: false,
24
+ editorWidth: 'w-full',
25
+ previewWidth: 'w-0',
26
+ },
27
+ preview: {
28
+ showEditor: false,
29
+ showPreview: true,
30
+ editorWidth: 'w-0',
31
+ previewWidth: 'w-full',
32
+ },
33
+ };
34
+ /**
35
+ * Local storage key for view mode persistence
36
+ */
37
+ exports.LOCAL_STORAGE_KEY = 'commandmate:md-editor-view-mode';
38
+ /**
39
+ * Local storage key for split ratio persistence
40
+ */
41
+ exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = 'commandmate:md-editor-split-ratio';
42
+ /**
43
+ * Local storage key for maximized state persistence
44
+ */
45
+ exports.LOCAL_STORAGE_KEY_MAXIMIZED = 'commandmate:md-editor-maximized';
46
+ /**
47
+ * Default debounce delay for preview updates (in milliseconds)
48
+ */
49
+ exports.PREVIEW_DEBOUNCE_MS = 300;
50
+ /**
51
+ * File size thresholds
52
+ */
53
+ exports.FILE_SIZE_LIMITS = {
54
+ /** Warning threshold (500KB) */
55
+ WARNING_THRESHOLD: 500 * 1024,
56
+ /** Maximum file size (1MB) */
57
+ MAX_SIZE: 1024 * 1024,
58
+ };
59
+ /**
60
+ * Default split ratio (50:50)
61
+ */
62
+ exports.DEFAULT_SPLIT_RATIO = 0.5;
63
+ /**
64
+ * Minimum split ratio (10%)
65
+ */
66
+ exports.MIN_SPLIT_RATIO = 0.1;
67
+ /**
68
+ * Maximum split ratio (90%)
69
+ */
70
+ exports.MAX_SPLIT_RATIO = 0.9;
71
+ /**
72
+ * Default editor layout state
73
+ */
74
+ exports.DEFAULT_LAYOUT_STATE = {
75
+ viewMode: 'split',
76
+ isMaximized: false,
77
+ splitRatio: exports.DEFAULT_SPLIT_RATIO,
78
+ };
79
+ /**
80
+ * Validate split ratio value
81
+ * @param value - Value to validate
82
+ * @returns true if valid split ratio (0.1-0.9)
83
+ */
84
+ function isValidSplitRatio(value) {
85
+ return typeof value === 'number' && value >= exports.MIN_SPLIT_RATIO && value <= exports.MAX_SPLIT_RATIO;
86
+ }
87
+ /**
88
+ * Validate boolean value from localStorage
89
+ * @param value - Value to validate
90
+ * @returns true if valid boolean
91
+ */
92
+ function isValidBoolean(value) {
93
+ return typeof value === 'boolean';
94
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * Data models for myCodeBranchDesk
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * Sidebar Type Definitions
4
+ *
5
+ * Types for sidebar components and branch status display
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.calculateHasUnread = calculateHasUnread;
9
+ exports.toBranchItem = toBranchItem;
10
+ /**
11
+ * Determine branch status from Worktree data
12
+ *
13
+ * Status priority:
14
+ * - waiting: Claude asked a yes/no prompt, waiting for user's answer (green dot)
15
+ * - running: Claude is actively processing user's request (spinner)
16
+ * - ready: Session running, waiting for user's new message (green dot)
17
+ * - idle: Session not running (gray dot)
18
+ */
19
+ function determineBranchStatus(worktree) {
20
+ // Check CLI-specific status first
21
+ const claudeStatus = worktree.sessionStatusByCli?.claude;
22
+ if (claudeStatus) {
23
+ if (claudeStatus.isWaitingForResponse) {
24
+ return 'waiting';
25
+ }
26
+ if (claudeStatus.isProcessing) {
27
+ return 'running';
28
+ }
29
+ // Session running but not processing = ready (waiting for user to type new message)
30
+ if (claudeStatus.isRunning) {
31
+ return 'ready';
32
+ }
33
+ }
34
+ // Fall back to legacy status fields
35
+ if (worktree.isWaitingForResponse) {
36
+ return 'waiting';
37
+ }
38
+ if (worktree.isProcessing) {
39
+ return 'running';
40
+ }
41
+ // Session running but not processing = ready
42
+ if (worktree.isSessionRunning) {
43
+ return 'ready';
44
+ }
45
+ return 'idle';
46
+ }
47
+ /**
48
+ * Calculate whether a worktree has unread messages
49
+ *
50
+ * hasUnread is true when:
51
+ * - There is at least one assistant message (lastAssistantMessageAt exists)
52
+ * - AND the user has never viewed this worktree (lastViewedAt is null)
53
+ * OR the last assistant message is newer than the last view
54
+ *
55
+ * @param worktree - Source worktree data
56
+ * @returns true if there are unread messages
57
+ */
58
+ function calculateHasUnread(worktree) {
59
+ // No assistant messages = no unread
60
+ if (!worktree.lastAssistantMessageAt) {
61
+ return false;
62
+ }
63
+ // Never viewed but has assistant message = unread
64
+ if (!worktree.lastViewedAt) {
65
+ return true;
66
+ }
67
+ // Compare timestamps: unread if assistant message is newer than last view
68
+ return new Date(worktree.lastAssistantMessageAt) > new Date(worktree.lastViewedAt);
69
+ }
70
+ /**
71
+ * Convert Worktree to SidebarBranchItem for display
72
+ *
73
+ * @param worktree - Source worktree data
74
+ * @returns SidebarBranchItem for sidebar display
75
+ */
76
+ function toBranchItem(worktree) {
77
+ const status = determineBranchStatus(worktree);
78
+ // Use new hasUnread logic based on lastAssistantMessageAt and lastViewedAt
79
+ const hasUnread = calculateHasUnread(worktree);
80
+ return {
81
+ id: worktree.id,
82
+ name: worktree.name,
83
+ repositoryName: worktree.repositoryName,
84
+ status,
85
+ hasUnread,
86
+ lastActivity: worktree.updatedAt,
87
+ description: worktree.description,
88
+ };
89
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * Slash Command Types
4
+ *
5
+ * Type definitions for slash commands loaded from .claude/commands/*.md
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.COMMAND_CATEGORIES = exports.CATEGORY_LABELS = void 0;
9
+ /**
10
+ * Category labels for display
11
+ */
12
+ exports.CATEGORY_LABELS = {
13
+ planning: 'Planning',
14
+ development: 'Development',
15
+ review: 'Review',
16
+ documentation: 'Documentation',
17
+ workflow: 'Workflow',
18
+ // Standard command category labels (Issue #56)
19
+ 'standard-session': 'Standard (Session)',
20
+ 'standard-config': 'Standard (Config)',
21
+ 'standard-monitor': 'Standard (Monitor)',
22
+ 'standard-git': 'Standard (Git)',
23
+ 'standard-util': 'Standard (Utility)',
24
+ };
25
+ /**
26
+ * Command to category mapping
27
+ * Maps command names to their categories
28
+ */
29
+ exports.COMMAND_CATEGORIES = {
30
+ // Planning commands
31
+ 'work-plan': 'planning',
32
+ 'issue-create': 'planning',
33
+ 'issue-split': 'planning',
34
+ 'design-policy': 'planning',
35
+ // Development commands
36
+ 'tdd-impl': 'development',
37
+ 'bug-fix': 'development',
38
+ 'refactoring': 'development',
39
+ // Review commands
40
+ 'architecture-review': 'review',
41
+ 'acceptance-test': 'review',
42
+ // Documentation commands
43
+ 'progress-report': 'documentation',
44
+ // Workflow commands
45
+ 'create-pr': 'workflow',
46
+ 'pm-auto-dev': 'workflow',
47
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * UI Action Type Definitions
4
+ *
5
+ * Defines all actions that can modify the WorktreeUIState
6
+ * Based on Issue #13 UX Improvement design specification (Section 16.3)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });