commandmate 0.43.0 → 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 (480) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +209 -209
  3. package/.next/app-path-routes-manifest.json +36 -36
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  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.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  27. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  33. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  35. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  37. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  39. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  40. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  42. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  43. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  45. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  46. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  48. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/push/escalation/route.js +1 -1
  51. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  52. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  54. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/push/vapid/route.js +1 -1
  56. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  57. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  59. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  61. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/clone/route.js +1 -1
  69. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/restore/route.js +1 -1
  74. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/route.js +1 -1
  77. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  78. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/scan/route.js +1 -1
  80. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  81. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/sync/route.js +1 -1
  83. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  84. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  86. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  88. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  90. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  92. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/[id]/route.js +1 -1
  94. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  95. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/skills/installations/route.js +1 -1
  97. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  98. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/skills/operations/route.js +2 -2
  100. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  101. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/skills/reindex/route.js +1 -1
  103. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  104. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/skills/route.js +1 -1
  106. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  107. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  109. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  111. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  113. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  115. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  117. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  119. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  121. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  126. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  129. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  135. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  143. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  145. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  147. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +7 -7
  210. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  221. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  228. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  231. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  234. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  240. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  243. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  248. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  264. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  267. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  272. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  275. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  279. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  282. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  285. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  287. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  291. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  293. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  297. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  298. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  300. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  301. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  303. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  304. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  305. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  309. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  310. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  311. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  312. package/.next/server/app/api/worktrees/route.js +1 -1
  313. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  314. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  316. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  318. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  319. package/.next/server/app/page_client-reference-manifest.js +1 -1
  320. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  321. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  322. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  323. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  324. package/.next/server/app/sessions/page.js +1 -1
  325. package/.next/server/app/sessions/page.js.nft.json +1 -1
  326. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  327. package/.next/server/app/skills/[skillId]/page.js +1 -1
  328. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  329. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  330. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  331. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  332. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  333. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  334. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  335. package/.next/server/app/worktrees/[id]/page.js +3 -3
  336. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  337. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  338. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  339. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  340. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  341. package/.next/server/app-paths-manifest.json +36 -36
  342. package/.next/server/chunks/1501.js +3 -3
  343. package/.next/server/chunks/2119.js +1 -1
  344. package/.next/server/chunks/2283.js +15 -0
  345. package/.next/server/chunks/2328.js +1 -1
  346. package/.next/server/chunks/2445.js +1 -1
  347. package/.next/server/chunks/4207.js +1 -1
  348. package/.next/server/chunks/4802.js +1 -1
  349. package/.next/server/chunks/488.js +1 -0
  350. package/.next/server/chunks/5326.js +1 -1
  351. package/.next/server/chunks/5456.js +1 -1
  352. package/.next/server/chunks/611.js +1 -1
  353. package/.next/server/chunks/6130.js +1 -1
  354. package/.next/server/chunks/6401.js +1 -1
  355. package/.next/server/chunks/6474.js +14 -0
  356. package/.next/server/chunks/650.js +1 -0
  357. package/.next/server/chunks/6781.js +1 -1
  358. package/.next/server/chunks/{5742.js → 6927.js} +1 -1
  359. package/.next/server/chunks/7506.js +1 -1
  360. package/.next/server/chunks/7905.js +1 -1
  361. package/.next/server/chunks/8543.js +1 -1
  362. package/.next/server/chunks/8581.js +1 -1
  363. package/.next/server/chunks/8728.js +2 -2
  364. package/.next/server/chunks/8782.js +1 -0
  365. package/.next/server/chunks/8791.js +1 -1
  366. package/.next/server/chunks/8918.js +105 -3
  367. package/.next/server/chunks/9130.js +1 -1
  368. package/.next/server/chunks/9390.js +1 -1
  369. package/.next/server/chunks/967.js +1 -1
  370. package/.next/server/chunks/9731.js +3 -3
  371. package/.next/server/chunks/9882.js +2 -2
  372. package/.next/server/middleware-manifest.json +5 -5
  373. package/.next/server/pages/500.html +1 -1
  374. package/.next/server/pages-manifest.json +1 -1
  375. package/.next/server/server-reference-manifest.json +1 -1
  376. package/.next/server/src/middleware.js +2 -2
  377. package/.next/server/src/middleware.js.map +1 -1
  378. package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
  379. package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
  380. package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-340774f1a24f2b45.js} +1 -1
  381. package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
  382. package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
  383. package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
  384. package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
  385. package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
  386. package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
  387. package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
  388. package/.next/static/chunks/app/{layout-057c850cd0df978e.js → layout-0fc249fb7de75a27.js} +1 -1
  389. package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
  390. package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
  391. package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
  392. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
  393. package/.next/static/css/38070d879efa1371.css +1 -0
  394. package/.next/trace +13 -13
  395. package/README.md +58 -620
  396. package/dist/cli/commands/capture.d.ts.map +1 -1
  397. package/dist/cli/commands/capture.js +11 -1
  398. package/dist/cli/commands/docs.d.ts.map +1 -1
  399. package/dist/cli/commands/docs.js +5 -0
  400. package/dist/cli/commands/remote.d.ts +24 -1
  401. package/dist/cli/commands/remote.d.ts.map +1 -1
  402. package/dist/cli/commands/remote.js +155 -6
  403. package/dist/cli/commands/respond.d.ts.map +1 -1
  404. package/dist/cli/commands/respond.js +255 -112
  405. package/dist/cli/commands/stop.d.ts.map +1 -1
  406. package/dist/cli/commands/stop.js +53 -1
  407. package/dist/cli/commands/sync.js +3 -3
  408. package/dist/cli/docs/setup-guide.d.ts +14 -0
  409. package/dist/cli/docs/setup-guide.d.ts.map +1 -0
  410. package/dist/cli/docs/setup-guide.js +366 -0
  411. package/dist/cli/types/api-responses.d.ts +11 -0
  412. package/dist/cli/types/api-responses.d.ts.map +1 -1
  413. package/dist/cli/types/index.d.ts +2 -0
  414. package/dist/cli/types/index.d.ts.map +1 -1
  415. package/dist/cli/utils/daemon.d.ts +42 -2
  416. package/dist/cli/utils/daemon.d.ts.map +1 -1
  417. package/dist/cli/utils/daemon.js +222 -40
  418. package/dist/cli/utils/docs-reader.d.ts +6 -0
  419. package/dist/cli/utils/docs-reader.d.ts.map +1 -1
  420. package/dist/cli/utils/docs-reader.js +14 -13
  421. package/dist/cli/utils/npm-runner.d.ts +12 -0
  422. package/dist/cli/utils/npm-runner.d.ts.map +1 -1
  423. package/dist/cli/utils/npm-runner.js +36 -0
  424. package/dist/cli/utils/process-inspect.d.ts +55 -0
  425. package/dist/cli/utils/process-inspect.d.ts.map +1 -0
  426. package/dist/cli/utils/process-inspect.js +214 -0
  427. package/dist/cli/utils/remote-pairing.d.ts +68 -0
  428. package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
  429. package/dist/cli/utils/remote-pairing.js +117 -0
  430. package/dist/cli/utils/server-identity.d.ts +50 -0
  431. package/dist/cli/utils/server-identity.d.ts.map +1 -0
  432. package/dist/cli/utils/server-identity.js +118 -0
  433. package/dist/cli/utils/server-ready.d.ts +13 -0
  434. package/dist/cli/utils/server-ready.d.ts.map +1 -1
  435. package/dist/cli/utils/server-ready.js +16 -0
  436. package/dist/lib/security/pairing-code.d.ts +2 -1
  437. package/dist/lib/security/pairing-code.d.ts.map +1 -1
  438. package/dist/server/locales/en/worktree.json +28 -6
  439. package/dist/server/locales/ja/worktree.json +28 -6
  440. package/dist/server/src/config/image-extensions.js +1 -0
  441. package/dist/server/src/lib/auto-yes-poller.js +22 -0
  442. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
  443. package/dist/server/src/lib/cli-tools/command-code.js +27 -2
  444. package/dist/server/src/lib/detection/cli-patterns.js +94 -1
  445. package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
  446. package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
  447. package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
  448. package/dist/server/src/lib/session/claude-executor.js +2 -2
  449. package/dist/server/src/lib/session/claude-session.js +131 -15
  450. package/dist/server/src/lib/session/session-start-error.js +20 -0
  451. package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
  452. package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
  453. package/dist/server/src/lib/tmux/tmux.js +25 -0
  454. package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
  455. package/dist/server/src/lib/verification/gate-runner.js +29 -2
  456. package/dist/server/src/lib/verification/scope-gate.js +58 -4
  457. package/docs/en/architecture.md +722 -0
  458. package/docs/en/user-guide/agents-guide.md +306 -0
  459. package/docs/en/user-guide/cli-setup-guide.md +676 -0
  460. package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
  461. package/docs/en/user-guide/commands-guide.md +467 -0
  462. package/docs/en/user-guide/quick-start.md +231 -0
  463. package/docs/en/user-guide/webapp-guide.md +1020 -0
  464. package/docs/en/user-guide/workflow-examples.md +463 -0
  465. package/package.json +18 -7
  466. package/release-notes/0.44.0.json +82 -0
  467. package/.next/server/chunks/1990.js +0 -103
  468. package/.next/server/chunks/3707.js +0 -15
  469. package/.next/server/chunks/6491.js +0 -103
  470. package/.next/server/chunks/7004.js +0 -1
  471. package/.next/server/chunks/8673.js +0 -14
  472. package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
  473. package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
  474. package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
  475. package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
  476. package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
  477. package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
  478. package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
  479. /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
  480. /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
@@ -59,6 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
59
59
  exports.CLAUDE_END_TURN_STOP_REASON = exports.CLAUDE_HUMAN_PROMPT_SOURCES = exports.CLAUDE_HUMAN_ORIGIN_KIND = exports.CLAUDE_SLASH_COMMAND_PREFIX = exports.CLAUDE_THINKING_LABEL = exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH = exports.MAX_CLAUDE_TURN_BLOCKS = exports.CLAUDE_TURN_TRUNCATION_MARKER = exports.MAX_CLAUDE_TURN_BODY_LENGTH = exports.CLAUDE_PROJECTS_DIR_SEGMENTS = void 0;
60
60
  exports.claudeProjectSlug = claudeProjectSlug;
61
61
  exports.claudeSlashCommandPrompt = claudeSlashCommandPrompt;
62
+ exports.claudePastedContentPrompt = claudePastedContentPrompt;
62
63
  exports.readClaudeContentBlock = readClaudeContentBlock;
63
64
  exports.readClaudeTranscriptRecord = readClaudeTranscriptRecord;
64
65
  exports.parseClaudeTranscript = parseClaudeTranscript;
@@ -210,6 +211,37 @@ function claudeSlashCommandPrompt(text) {
210
211
  const args = CLAUDE_COMMAND_ARGS_PATTERN.exec(trimmed)?.[1].trim() ?? '';
211
212
  return args.length === 0 ? name : `${name} ${args}`;
212
213
  }
214
+ /**
215
+ * A paste's wrapper: `<pasted_content id="X">` … `</pasted_content id="X">`.
216
+ *
217
+ * The closing tag repeats the opening tag's id (`\1`), so a pair whose ids
218
+ * differ — or a tag only mentioned in prose — is not a wrapper and is left alone.
219
+ * One newline just inside each tag is the wrapper's own framing, not the body's.
220
+ */
221
+ const CLAUDE_PASTED_CONTENT_PATTERN = /<pasted_content id="([^"<>\s]+)">\n?([\s\S]*?)\n?<\/pasted_content id="\1">/g;
222
+ /**
223
+ * The text a person sent, with Claude Code's paste wrapper taken off (Issue #3102).
224
+ *
225
+ * Claude Code records a multi-line message that arrived as a paste — which is
226
+ * what CommandMate's tmux send looks like to it — with the body wrapped in
227
+ * `<pasted_content id="X">…</pasted_content id="X">`. `recordUserTurn` compares
228
+ * the transcript's text with the `/send` row (and a relay row) byte for byte, so
229
+ * the wrapper made every such prompt look like a different message and a second
230
+ * `user` row was written. Unwrapping here lets the existing adoption rules match.
231
+ *
232
+ * Every wrapper in the text is replaced by its body, including one inside a
233
+ * sentence the person typed around a paste. When the result is empty the original
234
+ * is returned, so this never turns a record into a blank prompt.
235
+ *
236
+ * @param text - The record's text, as {@link ClaudeTranscriptRecord.text} holds it
237
+ * @returns The text without wrappers, or `text` itself when there is none to remove
238
+ */
239
+ function claudePastedContentPrompt(text) {
240
+ if (!text.includes('<pasted_content id='))
241
+ return text;
242
+ const unwrapped = text.replace(CLAUDE_PASTED_CONTENT_PATTERN, (_match, _id, body) => body);
243
+ return unwrapped.trim().length === 0 ? text : unwrapped;
244
+ }
213
245
  /**
214
246
  * Read one `message.content` element.
215
247
  *
@@ -517,7 +549,7 @@ function createClaudeTurn(record, sessionId) {
517
549
  // A slash command's record is XML and the operator typed a line; #2265 puts
518
550
  // the line on the turn so that the `user` row reads `/release v0.30.1` and
519
551
  // the `/send` row holding those same bytes is adopted rather than doubled.
520
- promptText: claudeSlashCommandPrompt(record.text) ?? record.text,
552
+ promptText: claudeSlashCommandPrompt(record.text) ?? claudePastedContentPrompt(record.text),
521
553
  promptIsOperatorInput: isClaudeOperatorPromptRecord(record),
522
554
  blocks: [],
523
555
  assistantRecords: 0,
@@ -50,8 +50,8 @@ const opencode_executable_1 = require("../../lib/cli-tools/opencode-executable")
50
50
  exports.MAX_OUTPUT_SIZE = 10 * 1024 * 1024;
51
51
  /** Maximum output size stored in DB (100KB) */
52
52
  exports.MAX_STORED_OUTPUT_SIZE = 100 * 1024;
53
- /** Execution timeout in milliseconds (15 minutes) */
54
- exports.EXECUTION_TIMEOUT_MS = 15 * 60 * 1000;
53
+ /** Execution timeout in milliseconds (30 minutes, Issue #3107; was 15) */
54
+ exports.EXECUTION_TIMEOUT_MS = 30 * 60 * 1000;
55
55
  /** Maximum message length sent to claude -p */
56
56
  exports.MAX_MESSAGE_LENGTH = 10000;
57
57
  /** Allowed CLI tool identifiers for scheduled execution [DR2-002] derived from CLI_TOOL_IDS */
@@ -4,7 +4,7 @@
4
4
  * Manages Claude CLI sessions within tmux for each worktree
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.CLAUDE_PROMPT_POLL_INTERVAL = exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_POST_PROMPT_DELAY = exports.CLAUDE_INIT_POLL_INTERVAL = exports.CLAUDE_INIT_TIMEOUT = void 0;
7
+ exports.CLAUDE_PROMPT_POLL_INTERVAL = exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_TRUST_DIALOG_EXITED = exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK = exports.CLAUDE_POST_PROMPT_DELAY = exports.CLAUDE_INIT_POLL_INTERVAL = exports.CLAUDE_INIT_TIMEOUT = void 0;
8
8
  exports.clearCachedClaudePath = clearCachedClaudePath;
9
9
  exports.isSessionHealthy = isSessionHealthy;
10
10
  exports.getSessionName = getSessionName;
@@ -130,6 +130,122 @@ exports.CLAUDE_INIT_POLL_INTERVAL = 300;
130
130
  * @see Issue #152 - First message not being sent after session start
131
131
  */
132
132
  exports.CLAUDE_POST_PROMPT_DELAY = 500;
133
+ /**
134
+ * Polls (of CLAUDE_INIT_POLL_INTERVAL) a still-open trust dialog is given to
135
+ * close after being answered before it is answered again (Issue #3078). The
136
+ * measured close is ~950 ms (Issue #1637), so 10 polls = 3 s is not a race.
137
+ */
138
+ const TRUST_DIALOG_REANSWER_POLLS = 10;
139
+ /** Upper bound on trust dialog answers per session start (Issue #3078). */
140
+ const TRUST_DIALOG_MAX_ANSWERS = 3;
141
+ /**
142
+ * Polls a cursor move is given to show up on screen before the next one is
143
+ * sent (Issue #3089). 3 polls = ~900 ms: a TUI that is not taking keys yet
144
+ * swallows the move, and the next one goes in once the screen still shows the
145
+ * cursor off `Yes`.
146
+ */
147
+ const TRUST_DIALOG_MOVE_SETTLE_POLLS = 3;
148
+ /**
149
+ * Upper bound on single cursor moves per session start (Issue #3089). 20 moves
150
+ * at TRUST_DIALOG_MOVE_SETTLE_POLLS apart is ~18 s of a TUI that will not move its
151
+ * cursor; past that the start fails without ever pressing Enter.
152
+ */
153
+ const TRUST_DIALOG_MAX_MOVES = 20;
154
+ /** Reported when the cursor never reached `Yes` (Issue #3089). A fixed string, never captured output. */
155
+ exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK = 'trust dialog: cursor did not reach "Yes, I trust this folder"';
156
+ /** Reported when Claude Code quit from the trust dialog (Issue #3089). A fixed string, never captured output. */
157
+ exports.CLAUDE_TRUST_DIALOG_EXITED = 'trust dialog: Claude Code exited to the shell';
158
+ /**
159
+ * One poll's answer to the folder-trust dialog (Issue #201 / #3078 / #3089).
160
+ *
161
+ * Enter confirms whichever option the cursor is on, and since 2.1.259 that is
162
+ * `No, exit` by default (which quits Claude Code). So Enter is sent only when
163
+ * THIS screen shows the cursor on `Yes, I trust this folder`. Otherwise one
164
+ * move key goes in, and the screen is read again on a later poll: sending
165
+ * `Down Enter` together lost the `Down` to a TUI that was not taking keys yet
166
+ * and confirmed `No, exit` (Issue #3089). Both are bounded: Enter is repeated
167
+ * TRUST_DIALOG_REANSWER_POLLS apart up to TRUST_DIALOG_MAX_ANSWERS times for a
168
+ * dialog that outlives it, and a cursor that has not reached Yes after
169
+ * TRUST_DIALOG_MAX_MOVES moves fails the start without Enter.
170
+ *
171
+ * @param sessionName - tmux session name
172
+ * @param dialogScreen - ANSI-stripped pane output when the dialog is open, else null
173
+ * @param state - Mutated in place
174
+ * @throws {SessionStartFailedError} When the move budget is spent
175
+ */
176
+ async function answerTrustDialog(sessionName, dialogScreen, state) {
177
+ if (state.pollsSinceAnswer !== null)
178
+ state.pollsSinceAnswer++;
179
+ if (state.pollsSinceMove !== null)
180
+ state.pollsSinceMove++;
181
+ if (dialogScreen === null)
182
+ return;
183
+ if (!state.seen) {
184
+ state.seen = true;
185
+ state.shellTellsExit = await paneCommandIsAgent(sessionName);
186
+ }
187
+ const keys = (0, cli_patterns_1.resolveClaudeTrustDialogKeys)(dialogScreen);
188
+ if (keys === null)
189
+ return;
190
+ if (keys.length === 1) {
191
+ // Cursor on Yes, on this very screen: the Issue #201 Enter.
192
+ const due = state.pollsSinceAnswer === null ||
193
+ (state.pollsSinceAnswer >= TRUST_DIALOG_REANSWER_POLLS && state.answers < TRUST_DIALOG_MAX_ANSWERS);
194
+ if (!due)
195
+ return;
196
+ try {
197
+ await (0, tmux_1.sendKeys)(sessionName, '', true);
198
+ state.pollsSinceAnswer = 0;
199
+ state.answers++;
200
+ logger.info('trust-dialog-detected', { keys: 'Enter', attempt: state.answers });
201
+ }
202
+ catch {
203
+ // Left unhandled so a later poll answers the dialog again
204
+ }
205
+ return;
206
+ }
207
+ // Cursor off Yes: one move, then look again before anything else.
208
+ if (state.pollsSinceMove !== null && state.pollsSinceMove < TRUST_DIALOG_MOVE_SETTLE_POLLS)
209
+ return;
210
+ if (state.moves >= TRUST_DIALOG_MAX_MOVES) {
211
+ throw new session_start_error_1.SessionStartFailedError('Claude Code', sessionName, exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK);
212
+ }
213
+ try {
214
+ await (0, tmux_1.sendSpecialKeys)(sessionName, [keys[0]]);
215
+ state.pollsSinceMove = 0;
216
+ state.moves++;
217
+ logger.info('trust-dialog-cursor-move', { key: keys[0], attempt: state.moves });
218
+ }
219
+ catch {
220
+ // Left unhandled so a later poll moves the cursor again
221
+ }
222
+ }
223
+ /**
224
+ * Whether the pane's foreground process is a shell again (Issue #3089). A
225
+ * pane tmux cannot describe is not called exited; the start budget still
226
+ * bounds that case. Only asked when {@link TrustDialogState.shellTellsExit}.
227
+ *
228
+ * @param sessionName - tmux session name
229
+ */
230
+ async function hasReturnedToShell(sessionName) {
231
+ const command = await readPaneCommand(sessionName);
232
+ return command !== null && (0, cli_patterns_1.isShellPaneCommand)(command);
233
+ }
234
+ /** Whether the pane's foreground command is known and is not a shell (Issue #3089). */
235
+ async function paneCommandIsAgent(sessionName) {
236
+ const command = await readPaneCommand(sessionName);
237
+ return command !== null && !(0, cli_patterns_1.isShellPaneCommand)(command);
238
+ }
239
+ /** `#{pane_current_command}`, or null when it cannot be read. */
240
+ async function readPaneCommand(sessionName) {
241
+ try {
242
+ const command = await (0, tmux_1.getPaneCurrentCommand)(sessionName);
243
+ return typeof command === 'string' ? command : null;
244
+ }
245
+ catch {
246
+ return null;
247
+ }
248
+ }
133
249
  /**
134
250
  * Prompt wait timeout before message send (milliseconds)
135
251
  *
@@ -565,7 +681,8 @@ async function startClaudeSession(options) {
565
681
  const pollInterval = exports.CLAUDE_INIT_POLL_INTERVAL;
566
682
  const startTime = Date.now();
567
683
  let initialized = false;
568
- let trustDialogHandled = false;
684
+ // Issue #3078 / #3089: the trust dialog's progress this start.
685
+ const trust = { pollsSinceAnswer: null, pollsSinceMove: null, answers: 0, moves: 0, seen: false, shellTellsExit: false };
569
686
  while (Date.now() - startTime < maxWaitTime) {
570
687
  await new Promise((resolve) => setTimeout(resolve, pollInterval));
571
688
  // SF-001: Use getCleanPaneOutput helper (DRY)
@@ -579,28 +696,27 @@ async function startClaudeSession(options) {
579
696
  if (cleanOutput === null) {
580
697
  continue;
581
698
  }
699
+ // Issue #201 / #3078 / #3089: answer the folder-trust dialog. Checked
700
+ // BEFORE the prompt: the dialog's cursor row (`❯ No, exit`) wears the
701
+ // prompt glyph, so an open dialog is never read as a ready prompt.
702
+ const trustDialogOpen = (0, cli_patterns_1.isClaudeTrustDialogOpen)(cleanOutput);
703
+ await answerTrustDialog(sessionName, trustDialogOpen ? cleanOutput : null, trust);
582
704
  // Claude is ready when we see the prompt (DRY-001)
583
705
  // Use CLAUDE_PROMPT_PATTERN from cli-patterns.ts for consistency
584
706
  // Note: CLAUDE_SEPARATOR_PATTERN was removed from initialization check (Issue #187, P1-1)
585
- if (cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
707
+ if (!trustDialogOpen && cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
586
708
  // Wait for stability after prompt detection (CONS-007, DOC-001)
587
709
  await new Promise((resolve) => setTimeout(resolve, exports.CLAUDE_POST_PROMPT_DELAY));
588
710
  logger.info('claude-initialized-in');
589
711
  initialized = true;
590
712
  break;
591
713
  }
592
- // Issue #201: Detect trust dialog and auto-respond with Enter
593
- // Condition order: CLAUDE_PROMPT_PATTERN (above) is checked first for shortest path
594
- if (!trustDialogHandled && cli_patterns_1.CLAUDE_TRUST_DIALOG_PATTERN.test(cleanOutput)) {
595
- try {
596
- await (0, tmux_1.sendKeys)(sessionName, '', true);
597
- trustDialogHandled = true;
598
- logger.info('trust-dialog-detected');
599
- }
600
- catch {
601
- // Left unhandled so the next poll answers the dialog again
602
- }
603
- // Continue polling to wait for prompt detection
714
+ // Issue #3089: the dialog is gone and no prompt came up. If the pane is
715
+ // back at its shell, Claude Code quit (an Enter that landed on
716
+ // `No, exit`); nothing will ever draw a prompt, so fail now instead of
717
+ // spending the rest of the budget (and answering the shell).
718
+ if (!trustDialogOpen && trust.shellTellsExit && (await hasReturnedToShell(sessionName))) {
719
+ throw new session_start_error_1.SessionStartFailedError('Claude Code', sessionName, exports.CLAUDE_TRUST_DIALOG_EXITED);
604
720
  }
605
721
  // Issue #1637: fail fast on a start that cannot succeed. The budget is
606
722
  // 60s of patience for a *slow* start; a session already showing a
@@ -30,6 +30,7 @@
30
30
  */
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  exports.SessionStartUnavailableError = exports.SessionStartFailedError = exports.SessionStartTimeoutError = exports.SESSION_START_UNAVAILABLE_CODE = exports.SESSION_START_FAILED_CODE = exports.SESSION_STARTING_CODE = void 0;
33
+ exports.buildSessionExitedToShellMessage = buildSessionExitedToShellMessage;
33
34
  exports.isSessionStartTimeoutError = isSessionStartTimeoutError;
34
35
  exports.isSafeSessionStartError = isSafeSessionStartError;
35
36
  exports.isSessionStartUnavailableError = isSessionStartUnavailableError;
@@ -81,6 +82,25 @@ class SessionStartTimeoutError extends Error {
81
82
  }
82
83
  }
83
84
  exports.SessionStartTimeoutError = SessionStartTimeoutError;
85
+ /**
86
+ * The message for a start timeout whose pane is back at a shell (Issue #3093).
87
+ *
88
+ * {@link SessionStartTimeoutError} says "the process is still running, so this
89
+ * is a slow start … nothing needs repairing" — true for a slow cold start, and
90
+ * exactly wrong when the agent quit during startup (e.g. a trust dialog that
91
+ * was answered with "No, exit"): the reader was told to wait for a process that
92
+ * no longer exists. Built from the tool's display name and the session name
93
+ * only, for the same SEC-SF-002 reason as the classes in this module.
94
+ *
95
+ * @param toolName - Display name of the CLI tool (e.g. `Claude Code`)
96
+ * @param sessionName - tmux session whose pane is back at a shell
97
+ */
98
+ function buildSessionExitedToShellMessage(toolName, sessionName) {
99
+ return (`${toolName} exited before reaching its input prompt: the tmux session '${sessionName}' ` +
100
+ 'is back at a shell, so this is not a slow start and waiting will not help. The message ' +
101
+ 'was not delivered. Run `commandmate capture <worktree-id>` to see why it exited (for ' +
102
+ 'example a startup dialog answered with exit, or a missing login), fix that, then send again.');
103
+ }
84
104
  /**
85
105
  * The CLI tool printed an error that startup cannot recover from.
86
106
  *
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * State files an agent CLI writes into the worktree on its own (Issue #3126)
4
+ *
5
+ * Command Code leaves `.commandcode/settings.local.json` and
6
+ * `.commandcode/taste/**` behind in any folder it runs in. Counted as change,
7
+ * they made a contract's `requireScopeClean` fail on a worktree whose worker
8
+ * stayed inside `allow`, and made `work-evidence` pass on one nobody worked in.
9
+ *
10
+ * Unlike receipt-owned paths (#3092) there is no receipt to vouch for them, so
11
+ * the declaration below is the whole rule, and it names files, never a whole
12
+ * directory: `.commandcode/` also holds things a task may legitimately change,
13
+ * and allowing it wholesale would wave those through. Callers apply this to
14
+ * **untracked** entries only, as for #3092: a committed or tracked-and-modified
15
+ * file is history the branch carries.
16
+ *
17
+ * Only paths whose existence is confirmed are declared. Other agents (claude,
18
+ * codex, ...) are deliberately absent until someone has seen them write one.
19
+ *
20
+ * @module lib/skills/agent-state-paths
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.AGENT_STATE_DIR_PREFIXES = exports.AGENT_STATE_FILES = void 0;
24
+ exports.isAgentStatePath = isAgentStatePath;
25
+ exports.isAgentStateUntrackedEntry = isAgentStateUntrackedEntry;
26
+ /** Exact repository-relative files an agent CLI manages itself. */
27
+ exports.AGENT_STATE_FILES = ['.commandcode/settings.local.json'];
28
+ /** Directory prefixes (with trailing slash) an agent CLI manages itself. */
29
+ exports.AGENT_STATE_DIR_PREFIXES = ['.commandcode/taste/'];
30
+ /** Whether `path` is a declared agent-managed state path. */
31
+ function isAgentStatePath(path) {
32
+ if (exports.AGENT_STATE_FILES.includes(path))
33
+ return true;
34
+ return exports.AGENT_STATE_DIR_PREFIXES.some((prefix) => path.startsWith(prefix) && !path.slice(prefix.length).split('/').includes('..'));
35
+ }
36
+ /** Whether a porcelain record is an untracked file made only of such paths. */
37
+ function isAgentStateUntrackedEntry(entry) {
38
+ return entry.status === '??' && entry.paths.every(isAgentStatePath);
39
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Files CommandMate itself placed into a worktree by installing a Skill (Issue #3092)
4
+ *
5
+ * `skill install` leaves `.agents/skills/<id>/…` and `.claude/skills/<id>/…`
6
+ * untracked. Counted as change, those files made `work-evidence` pass on a
7
+ * worktree nobody had worked in (`uncommitted=74`), and made a contract's
8
+ * `requireScopeClean` fail on a worktree whose agent stayed inside `allow`.
9
+ *
10
+ * The answer is the receipt, and only the receipt. A path is reported as
11
+ * CommandMate-owned when **all** of the following hold, so that nothing the
12
+ * user or the agent wrote can be laundered through it into a false "no work":
13
+ *
14
+ * - a receipt parses at `.agents/skills/<id>/.commandmate-receipt.json`, and
15
+ * its `skill_id` is that directory's name;
16
+ * - the root it names is `<known install prefix>/<skill_id>` — a receipt
17
+ * claiming `src` or `.commandcode` as a root claims nothing;
18
+ * - the file is listed in the receipt's `files`, is a regular file, and its
19
+ * bytes still hash to the recorded `sha256`. A Skill file the agent edited
20
+ * is the agent's change and stays counted;
21
+ * - for the receipt itself in a secondary root: byte-identical to the
22
+ * primary's.
23
+ *
24
+ * Callers apply the result to **untracked** entries only. A committed or
25
+ * tracked-and-modified Skill file is history the branch carries, and judging
26
+ * it is unchanged by this module.
27
+ *
28
+ * @module lib/skills/receipt-owned-paths
29
+ */
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.collectSkillReceiptOwnedPaths = collectSkillReceiptOwnedPaths;
35
+ const crypto_1 = require("crypto");
36
+ const fs_1 = require("fs");
37
+ const path_1 = __importDefault(require("path"));
38
+ const constants_1 = require("../../lib/skills/constants");
39
+ const install_plan_1 = require("../../lib/skills/install-plan");
40
+ function sha256Hex(bytes) {
41
+ return (0, crypto_1.createHash)('sha256').update(bytes).digest('hex');
42
+ }
43
+ /** Read a regular file (never through a link), or null. */
44
+ function readRegularFile(absolute) {
45
+ try {
46
+ if (!(0, fs_1.lstatSync)(absolute).isFile())
47
+ return null;
48
+ return (0, fs_1.readFileSync)(absolute);
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ /** A receipt-relative payload path that cannot leave its root. */
55
+ function isSafeRelativePath(relative) {
56
+ if (relative === '' || relative.startsWith('/') || relative.includes('\\'))
57
+ return false;
58
+ return relative.split('/').every((segment) => segment !== '' && segment !== '.' && segment !== '..');
59
+ }
60
+ function isValidSkillId(skillId) {
61
+ return constants_1.SKILL_ID_PATTERN.test(skillId) && skillId.length <= constants_1.SKILL_ID_MAX_LENGTH;
62
+ }
63
+ /**
64
+ * Repository-relative POSIX paths of every untouched file a recorded Skill
65
+ * install placed in this worktree, receipts included.
66
+ *
67
+ * Never throws: an unreadable directory or receipt contributes nothing, which
68
+ * leaves those files counted exactly as before #3092.
69
+ */
70
+ function collectSkillReceiptOwnedPaths(worktreePath) {
71
+ const owned = new Set();
72
+ const primaryAbs = path_1.default.join(worktreePath, constants_1.SKILL_PRIMARY_INSTALL_ROOT_PREFIX);
73
+ let skillDirs;
74
+ try {
75
+ skillDirs = (0, fs_1.readdirSync)(primaryAbs);
76
+ }
77
+ catch {
78
+ return owned;
79
+ }
80
+ for (const skillId of skillDirs) {
81
+ if (!isValidSkillId(skillId))
82
+ continue;
83
+ const primaryRoot = `${constants_1.SKILL_PRIMARY_INSTALL_ROOT_PREFIX}/${skillId}`;
84
+ const receiptBytes = readRegularFile(path_1.default.join(worktreePath, primaryRoot, install_plan_1.SKILL_RECEIPT_FILENAME));
85
+ if (receiptBytes === null)
86
+ continue;
87
+ const receipt = (0, install_plan_1.parseInstalledReceipt)(receiptBytes);
88
+ if (receipt === null || receipt.skill_id !== skillId)
89
+ continue;
90
+ const allowedRoots = new Set(constants_1.SKILL_INSTALL_ROOT_PREFIXES.map((prefix) => `${prefix}/${skillId}`));
91
+ const roots = (0, install_plan_1.receiptInstallRoots)(receipt);
92
+ // The receipt that names the roots must live in the primary one.
93
+ if (roots[0] !== primaryRoot)
94
+ continue;
95
+ for (const root of roots) {
96
+ if (typeof root !== 'string' || !allowedRoots.has(root))
97
+ continue;
98
+ const rootReceipt = readRegularFile(path_1.default.join(worktreePath, root, install_plan_1.SKILL_RECEIPT_FILENAME));
99
+ if (rootReceipt !== null && rootReceipt.equals(receiptBytes)) {
100
+ owned.add(`${root}/${install_plan_1.SKILL_RECEIPT_FILENAME}`);
101
+ }
102
+ for (const file of receipt.files) {
103
+ if (!file ||
104
+ typeof file.path !== 'string' ||
105
+ typeof file.sha256 !== 'string' ||
106
+ !isSafeRelativePath(file.path) ||
107
+ file.path === install_plan_1.SKILL_RECEIPT_FILENAME) {
108
+ continue;
109
+ }
110
+ const bytes = readRegularFile(path_1.default.join(worktreePath, root, file.path));
111
+ if (bytes !== null && sha256Hex(bytes) === file.sha256.toLowerCase()) {
112
+ owned.add(`${root}/${file.path}`);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ return owned;
118
+ }
@@ -10,6 +10,7 @@ exports.reconcileSessionGeometry = reconcileSessionGeometry;
10
10
  exports.isTmuxAvailable = isTmuxAvailable;
11
11
  exports.hasSession = hasSession;
12
12
  exports.getSessionWorkingDirectory = getSessionWorkingDirectory;
13
+ exports.getPaneCurrentCommand = getPaneCurrentCommand;
13
14
  exports.listSessions = listSessions;
14
15
  exports.createSession = createSession;
15
16
  exports.sendKeys = sendKeys;
@@ -216,6 +217,27 @@ async function getSessionWorkingDirectory(sessionName) {
216
217
  return null;
217
218
  }
218
219
  }
220
+ /**
221
+ * The foreground command of a session's pane (`#{pane_current_command}`), or
222
+ * null when tmux cannot say (Issue #3089).
223
+ *
224
+ * Read by Claude's start wait to tell "the agent quit back to the shell" from
225
+ * "the agent is still drawing": once the agent has exited, the pane's
226
+ * foreground process is the login shell again (`bash`, `zsh`, `-zsh`, ...).
227
+ *
228
+ * @param sessionName - Target session name
229
+ * @returns The command name, or null when the session or tmux is unavailable
230
+ */
231
+ async function getPaneCurrentCommand(sessionName) {
232
+ try {
233
+ const { stdout } = await execFileAsync('tmux', ['display-message', '-p', '-t', exactTarget(sessionName), '#{pane_current_command}'], { timeout: DEFAULT_TIMEOUT });
234
+ const command = stdout.trim();
235
+ return command === '' ? null : command;
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
219
241
  /**
220
242
  * List all tmux sessions
221
243
  *
@@ -561,6 +583,9 @@ const ALLOWED_SPECIAL_KEYS = new Set([
561
583
  // (`COMMAND_CODE_NAVIGATION_KEY_VALUES`), so the route answers 400 for every
562
584
  // other tool — the same arrangement as `s` above.
563
585
  'C-a',
586
+ // Issue #3138: Command Code's plan review is submitted with ctrl+r; sent via
587
+ // sendSpecialKeys() like the other keys instead of a one-off sendKeys() call.
588
+ 'C-r',
564
589
  ]);
565
590
  /**
566
591
  * Type guard for "sendSpecialKeys() will actually deliver this key" (Issue #2032).