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
@@ -120,6 +120,240 @@ async function answerSolePendingDecision(client, worktreeId, body) {
120
120
  throw error;
121
121
  }
122
122
  }
123
+ /** Reason `/prompt-response` gives when no dialog is on screen any more. */
124
+ const PROMPT_NO_LONGER_ACTIVE = 'prompt_no_longer_active';
125
+ /**
126
+ * Issue #3125: what `--plan-review` takes. Restated rather than imported from
127
+ * `src/lib` (the CLI build does not reach it); the server validates the same set.
128
+ */
129
+ const PLAN_REVIEW_ACTIONS = ['comment', 'submit', 'approve', 'cancel'];
130
+ /** Reasons the server gives for a plan review answer it refused before any key. */
131
+ function isPlanReviewRefusal(reason) {
132
+ return reason.startsWith('plan_review_');
133
+ }
134
+ /** ` --instance <id>` as the caller spelled it, or nothing. */
135
+ function instanceFlag(instance) {
136
+ return instance ? ` --instance ${instance}` : '';
137
+ }
138
+ /**
139
+ * `textFollowUp` from a `/prompt-response` success (Issue #3093), read
140
+ * defensively: an older server omits it, and the route's mirror type is not
141
+ * this command's to widen.
142
+ */
143
+ function readTextFollowUp(result) {
144
+ const value = result?.textFollowUp;
145
+ if (typeof value !== 'object' || value === null)
146
+ return null;
147
+ const { optionNumber, optionLabel } = value;
148
+ if (typeof optionNumber !== 'number' || typeof optionLabel !== 'string')
149
+ return null;
150
+ return { optionNumber, optionLabel };
151
+ }
152
+ /** Argument checks; returns whether --default was chosen. A mocked `process.exit` returns, so nothing here stops early. */
153
+ function validateRespondArgs(worktreeId, answer, options) {
154
+ // [SEC4-04] Validate worktree ID
155
+ if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
156
+ console.error('Error: Invalid worktree ID format.');
157
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
158
+ }
159
+ // Validate agent if provided
160
+ if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
161
+ console.error('Error: Invalid agent.');
162
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
163
+ }
164
+ // Issue #868 / #2376: an instance id or a roster alias.
165
+ if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
166
+ console.error(instances_1.INSTANCE_SELECTOR_ERROR);
167
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
168
+ }
169
+ // Issue #1681: exactly one of <answer> / --default
170
+ const useDefault = options.default === true;
171
+ // Issue #3125: Command Code's plan review. `approve` / `cancel` take no text,
172
+ // `comment` needs it, and `submit` takes an optional comment to send first.
173
+ const planReview = options.planReview;
174
+ if (planReview !== undefined) {
175
+ if (!PLAN_REVIEW_ACTIONS.includes(planReview)) {
176
+ console.error(`Error: --plan-review must be one of: ${PLAN_REVIEW_ACTIONS.join(', ')}.`);
177
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
178
+ }
179
+ if (useDefault) {
180
+ console.error('Error: --plan-review and --default are mutually exclusive.');
181
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
182
+ }
183
+ if ((planReview === 'approve' || planReview === 'cancel') && answer !== undefined) {
184
+ console.error(`Error: --plan-review ${planReview} takes no <answer>.`);
185
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
186
+ }
187
+ if (planReview === 'comment' && (answer === undefined || !answer.trim())) {
188
+ console.error('Error: --plan-review comment needs the comment text as <answer>.');
189
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
190
+ }
191
+ return false;
192
+ }
193
+ if (useDefault && answer !== undefined) {
194
+ console.error('Error: <answer> and --default are mutually exclusive.');
195
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
196
+ }
197
+ if (!useDefault && (answer === undefined || !answer.trim())) {
198
+ console.error('Error: Answer cannot be empty. Provide an answer or --default.');
199
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
200
+ }
201
+ return useDefault;
202
+ }
203
+ /** The `/prompt-response` request body. */
204
+ function buildPromptResponseBody(useDefault, answer, agent, instanceId, planReview) {
205
+ // [DR2-06] Use prompt-response API with cliTool (not cliToolId)
206
+ const body = useDefault ? { useDefault: true } : { answer };
207
+ // Issue #3125: Command Code's plan review action.
208
+ if (planReview !== undefined) {
209
+ body.planReviewAction = planReview;
210
+ }
211
+ if (agent) {
212
+ body.cliTool = agent;
213
+ }
214
+ // Issue #868: target a specific agent instance
215
+ if (instanceId) {
216
+ body.instanceId = instanceId;
217
+ }
218
+ return body;
219
+ }
220
+ /** Reports a `success: false` result and sets the exit code. */
221
+ function reportFailedResponse(result, worktreeId, answer, useDefault, options) {
222
+ // [DR2-06] Check reason for failure
223
+ const reason = result.reason || 'unknown';
224
+ // Issue #1681 / #1726: these mean the server refused BEFORE sending,
225
+ // so the terminal is untouched — worth saying plainly, because the
226
+ // other reasons leave the answer's fate unknown. Issue #2486 adds
227
+ // `unsupported_dialog_layout`: a picker IS on screen but its layout
228
+ // could not be verified, and the server's message says what to do.
229
+ // Issue #3125 adds the `plan_review_*` refusals: the plan review overlay was
230
+ // read and the request did not fit its current focus, so nothing was typed.
231
+ const refusedBeforeSending = reason === 'unresolvable_answer' ||
232
+ reason === 'answer_out_of_range' ||
233
+ reason === 'unsupported_dialog_layout' ||
234
+ isPlanReviewRefusal(reason);
235
+ // Issue #1898: the verdict was addressed to the agent's own API and
236
+ // the POST did not land. Distinct from the two above — the answer was
237
+ // resolved and an attempt was made — and distinct from a keystroke,
238
+ // whose fate is never knowable.
239
+ if (reason === 'decision_not_delivered') {
240
+ console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
241
+ 'The dialog is still open; answer it in the terminal.');
242
+ process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
243
+ }
244
+ if (refusedBeforeSending) {
245
+ console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
246
+ // Issue #2583: the operator who lands here typed WORDS at a dialog
247
+ // that only takes a choice — a claude / agy Bash approval refused as
248
+ // free text, or #2573's "No, tell … what to do differently" row. The
249
+ // server's sentence ends with "answer with the option number", and
250
+ // this is that command with the ids already filled in, so the next
251
+ // step is a paste rather than a trip to the docs while a dialog sits
252
+ // open. Printed only for the reason that means "this answer could not
253
+ // be mapped onto a choice", and only when the answer was not already
254
+ // a number (where the number itself is what was wrong).
255
+ if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
256
+ const target = options.instance ? ` --instance ${options.instance}` : '';
257
+ console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
258
+ `(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
259
+ }
260
+ }
261
+ else {
262
+ console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
263
+ // Issue #3093: the usual way here is the second half of a "No, tell
264
+ // … what to do differently" answer — the row closed the dialog and
265
+ // the agent is waiting for the reason in its input box, which
266
+ // `respond` (dialogs only) cannot reach and `send` can.
267
+ if (reason === PROMPT_NO_LONGER_ACTIVE && !useDefault && answer !== undefined && !/^\d+$/.test(answer.trim())) {
268
+ console.error('Hint: no dialog is open, so this text was not delivered. If you just chose an option that asks ' +
269
+ 'for text (e.g. "No, tell … what to do differently"), the agent is waiting for it in its input box — ' +
270
+ `send it with \`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
271
+ }
272
+ }
273
+ // Issue #1726: an option number the agent's own payload does not offer
274
+ // is a bad argument, so it exits with the input-error code the rest of
275
+ // this command already uses for a malformed worktree id or agent.
276
+ process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
277
+ }
278
+ /**
279
+ * What was done on Command Code's plan review (Issue #3125), and the next step:
280
+ * a pinned comment is not delivered to the agent until the review is submitted.
281
+ */
282
+ function printPlanReviewOutcome(result, worktreeId, options) {
283
+ const planReview = result.planReview;
284
+ if (!planReview)
285
+ return;
286
+ const target = instanceFlag(options.instance);
287
+ switch (planReview.action) {
288
+ case 'comment':
289
+ console.log(`Plan review: pinned comment "${planReview.comment ?? ''}".`);
290
+ console.error(`Next: send the review with \`commandmate respond ${worktreeId} --plan-review submit${target}\` ` +
291
+ `(ctrl+r), or approve with \`--plan-review approve\` (comments go along as notes).`);
292
+ break;
293
+ case 'submit':
294
+ console.log(planReview.comment
295
+ ? `Plan review: pinned comment "${planReview.comment}" and submitted the review (ctrl+r).`
296
+ : 'Plan review: submitted the review (ctrl+r).');
297
+ break;
298
+ case 'approve':
299
+ if (planReview.phase === 'approve-choice') {
300
+ console.log(`Plan review: confirmed the approval (${planReview.approveChoice === 'discard-comments' ? 'discarding' : 'with'} the pending comments).`);
301
+ }
302
+ else {
303
+ console.log('Plan review: approved the plan (ctrl+a).');
304
+ if (planReview.pendingCommentsBefore > 0) {
305
+ console.error('Note: with pending comments Command Code may ask how to approve — confirm with ' +
306
+ `\`commandmate respond ${worktreeId} --plan-review approve${target}\` again, or go back with \`--plan-review cancel\`.`);
307
+ }
308
+ }
309
+ break;
310
+ case 'cancel':
311
+ console.log(planReview.phase === 'approve-choice'
312
+ ? 'Plan review: went back from the approval choice (esc).'
313
+ : 'Plan review: cancelled the plan (esc).');
314
+ if (planReview.phase !== 'approve-choice' && planReview.pendingCommentsBefore > 0) {
315
+ console.error(`Note: ${planReview.pendingCommentsBefore} pending comment(s) were discarded with it.`);
316
+ }
317
+ break;
318
+ }
319
+ }
320
+ /** Audit trail of which option was actually selected. */
321
+ function printResolvedAudit(result, answer) {
322
+ // Issue #1681: audit trail — print which option was actually selected.
323
+ const resolved = result?.resolved;
324
+ if (resolved) {
325
+ if (resolved.via === 'structured-decision') {
326
+ // Issue #1898: no key was sent. The verdict went to the agent's own
327
+ // API by decision id, which is the only way an opencode approval can
328
+ // be answered at all — worth saying, because "Response sent." on
329
+ // this path would read as "a 1 was typed into the pane".
330
+ console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
331
+ `option ${resolved.optionNumber}: ${resolved.optionLabel}`);
332
+ }
333
+ else if (resolved.via === 'structured-question') {
334
+ // Issue #2040: a question, answered over `POST /question/:id/reply`.
335
+ // What is printed is what reached the AGENT — the labels — rather
336
+ // than the number that was typed: `respond <id> 2` at a question is
337
+ // a position in the agent's own list, and an operator reconciling
338
+ // what they meant against what was sent needs the other end of that
339
+ // mapping. `freeText` prints the text for the same reason.
340
+ const chosen = resolved.optionLabels ?? [];
341
+ console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
342
+ (chosen.length > 0
343
+ ? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
344
+ : `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
345
+ }
346
+ else if (resolved.via === 'semantic') {
347
+ console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
348
+ }
349
+ else if (resolved.optionNumber !== undefined) {
350
+ console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
351
+ }
352
+ else {
353
+ console.log(`Selected default answer: ${resolved.optionLabel}`);
354
+ }
355
+ }
356
+ }
123
357
  function createRespondCommand() {
124
358
  const cmd = new commander_1.Command('respond');
125
359
  cmd
@@ -127,36 +361,14 @@ function createRespondCommand() {
127
361
  .argument('<worktree-id>', 'Worktree ID')
128
362
  .argument('[answer]', 'Response answer (yes, no, number, or free text)')
129
363
  .option('--default', "Select the prompt's default option (mutually exclusive with <answer>)")
364
+ .option('--plan-review <action>', 'Command Code plan review: comment | submit | approve | cancel ' +
365
+ '(text alone is a comment; submit takes an optional comment; approve/cancel take no <answer>)')
130
366
  .option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
131
367
  .option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
132
368
  .option('--token <token>', command_helpers_1.TOKEN_WARNING)
133
369
  .action(async (worktreeId, answer, options) => {
134
370
  try {
135
- // [SEC4-04] Validate worktree ID
136
- if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
137
- console.error('Error: Invalid worktree ID format.');
138
- process.exit(types_1.ExitCode.CONFIG_ERROR);
139
- }
140
- // Validate agent if provided
141
- if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
142
- console.error('Error: Invalid agent.');
143
- process.exit(types_1.ExitCode.CONFIG_ERROR);
144
- }
145
- // Issue #868 / #2376: an instance id or a roster alias.
146
- if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
147
- console.error(instances_1.INSTANCE_SELECTOR_ERROR);
148
- process.exit(types_1.ExitCode.CONFIG_ERROR);
149
- }
150
- // Issue #1681: exactly one of <answer> / --default
151
- const useDefault = options.default === true;
152
- if (useDefault && answer !== undefined) {
153
- console.error('Error: <answer> and --default are mutually exclusive.');
154
- process.exit(types_1.ExitCode.CONFIG_ERROR);
155
- }
156
- if (!useDefault && (answer === undefined || !answer.trim())) {
157
- console.error('Error: Answer cannot be empty. Provide an answer or --default.');
158
- process.exit(types_1.ExitCode.CONFIG_ERROR);
159
- }
371
+ const useDefault = validateRespondArgs(worktreeId, answer, options);
160
372
  const client = new api_client_1.ApiClient({ token: options.token });
161
373
  // Issue #1629: /prompt-response derives the session name from cliTool
162
374
  // and falls back to the worktree default, so `--instance codex` alone
@@ -168,15 +380,7 @@ function createRespondCommand() {
168
380
  const agent = target ? target.cliToolId : options.agent;
169
381
  // Issue #2376: the resolved id. /prompt-response reads instance ids.
170
382
  const instanceId = target?.instanceId;
171
- // [DR2-06] Use prompt-response API with cliTool (not cliToolId)
172
- const body = useDefault ? { useDefault: true } : { answer };
173
- if (agent) {
174
- body.cliTool = agent;
175
- }
176
- // Issue #868: target a specific agent instance
177
- if (instanceId) {
178
- body.instanceId = instanceId;
179
- }
383
+ const body = buildPromptResponseBody(useDefault, answer, agent, instanceId, options.planReview);
180
384
  // Issue #2040: for an agent that publishes per-decision ids (opencode
181
385
  // today, and only opencode), a bare `respond <worktree> 3` names the ONE
182
386
  // decision that agent is holding, and the number is resolved against
@@ -189,7 +393,11 @@ function createRespondCommand() {
189
393
  // the structured path refuses it (`answerStructuredDecision` says so in
190
394
  // as many words) — while Enter at a `keys` dialog is a real answer that
191
395
  // this command has always been able to give.
192
- const structured = !useDefault && (await addressesDecisionsById(client, worktreeId, agent, instanceId));
396
+ //
397
+ // Issue #3125: a plan review action names no decision, so it skips this.
398
+ const structured = !useDefault &&
399
+ options.planReview === undefined &&
400
+ (await addressesDecisionsById(client, worktreeId, agent, instanceId));
193
401
  let result = null;
194
402
  if (structured) {
195
403
  const outcome = await answerSolePendingDecision(client, worktreeId, body);
@@ -205,85 +413,20 @@ function createRespondCommand() {
205
413
  result = await client.post(`/api/worktrees/${worktreeId}/prompt-response`, body);
206
414
  }
207
415
  if (result && !result.success) {
208
- // [DR2-06] Check reason for failure
209
- const reason = result.reason || 'unknown';
210
- // Issue #1681 / #1726: these mean the server refused BEFORE sending,
211
- // so the terminal is untouched — worth saying plainly, because the
212
- // other reasons leave the answer's fate unknown. Issue #2486 adds
213
- // `unsupported_dialog_layout`: a picker IS on screen but its layout
214
- // could not be verified, and the server's message says what to do.
215
- const refusedBeforeSending = reason === 'unresolvable_answer' ||
216
- reason === 'answer_out_of_range' ||
217
- reason === 'unsupported_dialog_layout';
218
- // Issue #1898: the verdict was addressed to the agent's own API and
219
- // the POST did not land. Distinct from the two above — the answer was
220
- // resolved and an attempt was made — and distinct from a keystroke,
221
- // whose fate is never knowable.
222
- if (reason === 'decision_not_delivered') {
223
- console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
224
- 'The dialog is still open; answer it in the terminal.');
225
- process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
226
- }
227
- if (refusedBeforeSending) {
228
- console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
229
- // Issue #2583: the operator who lands here typed WORDS at a dialog
230
- // that only takes a choice — a claude / agy Bash approval refused as
231
- // free text, or #2573's "No, tell … what to do differently" row. The
232
- // server's sentence ends with "answer with the option number", and
233
- // this is that command with the ids already filled in, so the next
234
- // step is a paste rather than a trip to the docs while a dialog sits
235
- // open. Printed only for the reason that means "this answer could not
236
- // be mapped onto a choice", and only when the answer was not already
237
- // a number (where the number itself is what was wrong).
238
- if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
239
- const target = options.instance ? ` --instance ${options.instance}` : '';
240
- console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
241
- `(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
242
- }
243
- }
244
- else {
245
- console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
246
- }
247
- // Issue #1726: an option number the agent's own payload does not offer
248
- // is a bad argument, so it exits with the input-error code the rest of
249
- // this command already uses for a malformed worktree id or agent.
250
- process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
251
- }
252
- // Issue #1681: audit trail — print which option was actually selected.
253
- const resolved = result?.resolved;
254
- if (resolved) {
255
- if (resolved.via === 'structured-decision') {
256
- // Issue #1898: no key was sent. The verdict went to the agent's own
257
- // API by decision id, which is the only way an opencode approval can
258
- // be answered at all — worth saying, because "Response sent." on
259
- // this path would read as "a 1 was typed into the pane".
260
- console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
261
- `option ${resolved.optionNumber}: ${resolved.optionLabel}`);
262
- }
263
- else if (resolved.via === 'structured-question') {
264
- // Issue #2040: a question, answered over `POST /question/:id/reply`.
265
- // What is printed is what reached the AGENT — the labels — rather
266
- // than the number that was typed: `respond <id> 2` at a question is
267
- // a position in the agent's own list, and an operator reconciling
268
- // what they meant against what was sent needs the other end of that
269
- // mapping. `freeText` prints the text for the same reason.
270
- const chosen = resolved.optionLabels ?? [];
271
- console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
272
- (chosen.length > 0
273
- ? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
274
- : `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
275
- }
276
- else if (resolved.via === 'semantic') {
277
- console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
278
- }
279
- else if (resolved.optionNumber !== undefined) {
280
- console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
281
- }
282
- else {
283
- console.log(`Selected default answer: ${resolved.optionLabel}`);
284
- }
416
+ reportFailedResponse(result, worktreeId, answer, useDefault, options);
285
417
  }
418
+ printResolvedAudit(result, answer);
419
+ if (result && 'planReview' in result)
420
+ printPlanReviewOutcome(result, worktreeId, options);
286
421
  console.error('Response sent.');
422
+ // Issue #3093: the option just chosen continues as typed text, which the
423
+ // dialog no longer takes — name the command that does deliver it.
424
+ const followUp = readTextFollowUp(result);
425
+ if (followUp) {
426
+ console.error(`Next: option ${followUp.optionNumber} ("${followUp.optionLabel}") asks for your text, and the dialog ` +
427
+ 'is closed now, so `respond` cannot deliver it — send it with ' +
428
+ `\`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
429
+ }
287
430
  }
288
431
  catch (error) {
289
432
  (0, command_helpers_1.handleCommandError)(error);
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AASlE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFrE"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AA8ClE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GrE"}
@@ -14,7 +14,39 @@ const daemon_1 = require("../utils/daemon");
14
14
  const security_logger_1 = require("../utils/security-logger");
15
15
  const env_setup_1 = require("../utils/env-setup");
16
16
  const input_validators_1 = require("../utils/input-validators");
17
+ const server_ready_1 = require("../utils/server-ready");
18
+ const server_url_1 = require("../utils/server-url");
19
+ const process_inspect_1 = require("../utils/process-inspect");
17
20
  const logger = new logger_1.CLILogger();
21
+ /**
22
+ * Issue #3087: with nothing recorded to stop, make sure nothing answers on the configured port
23
+ * either. A server whose PID file is gone (an orphan from an earlier start, or a file removed by
24
+ * a failed run) still serves there, and "Status: Stopped" would be false. Such a process cannot
25
+ * be proven to be ours, so it is reported, never killed.
26
+ *
27
+ * Only the main server's .env port is known here; a worktree server's port is not re-derived.
28
+ *
29
+ * @returns true when the configured port is free
30
+ */
31
+ async function ensureConfiguredPortFree(daemonManager, serverLabel) {
32
+ const endpoint = (0, server_url_1.resolveServerEndpoint)(daemonManager.getEffectiveEnv());
33
+ const host = endpoint.bind === '0.0.0.0' ? '127.0.0.1' : endpoint.bind;
34
+ if (!(await (0, server_ready_1.isPortInUse)(host, endpoint.port))) {
35
+ return true;
36
+ }
37
+ const listeners = (0, process_inspect_1.describeListeners)(endpoint.port);
38
+ logger.error(`${serverLabel} has no running process on record, but something is answering on ${host}:${endpoint.port}` +
39
+ `${listeners ? `: ${listeners}` : ''}.`);
40
+ logger.info('It was not started through this PID file, so it was not stopped. ' +
41
+ 'If it is an earlier CommandMate server, stop it yourself (e.g. kill <PID>).');
42
+ (0, security_logger_1.logSecurityEvent)({
43
+ timestamp: new Date().toISOString(),
44
+ command: 'stop',
45
+ action: 'failure',
46
+ details: `Unrecorded listener on port ${endpoint.port}${listeners ? ` (${listeners})` : ''}`,
47
+ });
48
+ return false;
49
+ }
18
50
  /**
19
51
  * Execute stop command
20
52
  * Issue #125: Use getPidFilePath for correct path resolution
@@ -44,10 +76,30 @@ async function stopCommand(options) {
44
76
  const status = await daemonManager.getStatus();
45
77
  if (status === null) {
46
78
  logger.info(`${serverLabel} is not running (no PID file found)`);
47
- logger.info('Status: Stopped');
48
79
  }
49
80
  else {
50
81
  logger.info(`${serverLabel} is not running (stale PID file)`);
82
+ // Issue #3087: the recorded npm process can be gone while the server it launched still
83
+ // listens as an orphan. stop() finds that process group and stops it, and only reports
84
+ // failure when something is left behind.
85
+ if (!(await daemonManager.stop(options.force))) {
86
+ logger.error(`Failed to stop ${serverLabel}: its processes or port are still in use`);
87
+ (0, security_logger_1.logSecurityEvent)({
88
+ timestamp: new Date().toISOString(),
89
+ command: 'stop',
90
+ action: 'failure',
91
+ details: `Failed to stop orphaned server of PID ${status.pid ?? 'unknown'}${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
92
+ });
93
+ process.exit(types_1.ExitCode.STOP_FAILED);
94
+ return;
95
+ }
96
+ }
97
+ if (options.issue === undefined && !(await ensureConfiguredPortFree(daemonManager, serverLabel))) {
98
+ process.exit(types_1.ExitCode.STOP_FAILED);
99
+ return;
100
+ }
101
+ if (status === null) {
102
+ logger.info('Status: Stopped');
51
103
  }
52
104
  process.exit(types_1.ExitCode.SUCCESS);
53
105
  return;
@@ -39,9 +39,9 @@ function createSyncCommand() {
39
39
  }
40
40
  }
41
41
  catch (error) {
42
- // The route's only 400 is "No repositories configured..." — the server's
43
- // wording names the fix (WORKTREE_REPOS / CM_ROOT_DIR), so pass it
44
- // through instead of the generic "Bad request" mapping.
42
+ // The route's only 400 is "No repositories are registered yet..." — the
43
+ // server's wording names the fix (Web UI Add Repository / WORKTREE_REPOS),
44
+ // so pass it through instead of the generic "Bad request" mapping.
45
45
  if (error instanceof api_client_1.ApiError && error.statusCode === 400 && error.payload?.error) {
46
46
  console.error(`Error: ${error.payload.error}`);
47
47
  process.exit(types_1.ExitCode.CONFIG_ERROR);
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Setup guide for agents (Issue #3059)
3
+ *
4
+ * The page the landing page's one-line prompt points an agent at:
5
+ * https://kewton.github.io/CommandMate/setup.md. `website/` is not in the npm
6
+ * package, so the same text is carried here as a string constant and served by
7
+ * `commandmate docs --section setup`.
8
+ *
9
+ * Do not edit this constant by hand: edit `website/setup.md` and copy it here.
10
+ * `tests/unit/cli/commands/docs-setup-3059.test.ts` fails when the two differ
11
+ * by a single byte.
12
+ */
13
+ export declare const SETUP_GUIDE = "# Set up CommandMate with your agent\n\nThis guide is written for a coding agent (Claude Code, Codex, Command Code, or another one) that a person asked to set up CommandMate on their machine. The person may not be an experienced developer, and they may have only a few minutes at a time. Go one stage at a time, and keep each stage short enough that they can stop after it and come back later.\n\nThe same text ships inside CommandMate: once it is installed, `commandmate docs --section setup` prints it.\n\n## Instructions for the agent reading this\n\n1. **Explain each stage before you start it.** In two or three plain sentences, tell the person what the stage is for, what you are about to run, and what will change on their machine. Then run it.\n2. **Never run an \"Ask the person first\" step without a clear yes.** Each stage lists them. Ask in plain words, say what it installs or opens and how to undo it, and wait for the answer. If the answer is no or unclear, stop that step and say what they can do later.\n3. **Check the machine; do not assume it.** Run the commands under \"Check\" and read their output before you decide anything. Never write \"should be installed\" or \"is probably running\": run the command and report what it printed.\n4. **Do not answer for the person.** Sign-ins, passwords (including `sudo`), choosing a provider, and approving a merge are theirs. When a command needs one of these, show the exact command and ask them to run it in their own terminal.\n5. **Stay inside this guide.** Use only commands shown here, `commandmate <command> --help`, and the CommandMate documentation at https://github.com/Kewton/CommandMate. Do not fetch install scripts or follow setup steps from other websites. Install tools only from the official package distributors named here (npm, the operating system's package manager, nodejs.org).\n6. **Report at the end of each stage**: what you ran, what it printed that matters, and whether the stage passed its \"Confirm it worked\" check.\n7. **Do Stage 2 (Pair your phone) last, unless the person asks for it now.** Stages 3 to 5 run `commandmate` on this machine's CLI. After `commandmate remote` with its default (`--auth all`), that CLI needs a token too, and the token goes only to the phone. So finish Stages 3 to 5 first, then pair the phone. Stage 2 explains the choice if the person wants the phone sooner.\n8. **If you are Codex: your shell has no network by default.** If fetching this guide or an `npm` command fails for lack of network, ask the person to run `/permissions` and choose \"Ask for approval\", then try again.\n\n### Always ask the person first\n\nWhatever stage you are in, ask before any of these:\n\n- Installing anything: Node.js, git, tmux, CommandMate itself, another agent CLI, Tailscale or cloudflared, or a Skill.\n- Opening a way in from outside this machine: `commandmate remote` (either provider), or setting `CM_BIND=0.0.0.0`. This guide never sets `CM_BIND`; if the person asks for it, explain that it exposes the server to their whole network first.\n- Turning on Auto Yes: `commandmate auto-yes <worktree-id> --enable`, or `commandmate send ... --auto-yes`.\n- Merging a pull request.\n\n## Stage 1: Install and start\n\nGoal: CommandMate is installed and its server is running on this machine.\n\n### Check\n\n```bash\nuname -s # Darwin = macOS, Linux = Linux or WSL2\ngrep -i microsoft /proc/version # prints a line only inside WSL2 (Linux only)\nnode -v # needs v22 or newer\nnpm -v\ngit --version\ntmux -V\ncommand -v brew # macOS: is Homebrew present?\ncommand -v commandmate && commandmate --version\n```\n\nWrite down which of these are missing or too old. Native Windows is not supported; on Windows, CommandMate runs inside WSL2 (see https://github.com/Kewton/CommandMate/blob/main/docs/en/user-guide/wsl2-setup.md).\n\n### Run\n\nInstall only what the check found missing, after the person agrees.\n\n- **macOS with Homebrew**: `brew install node git tmux` (leave out what is already there).\n- **macOS without Homebrew**: tmux needs a package manager. Tell the person that, and let them decide whether to install Homebrew from its own official instructions. Do not install it for them. git alone can come from Apple's tools: `xcode-select --install`.\n- **Linux / WSL2 (Debian or Ubuntu)**: `sudo apt update && sudo apt install -y git tmux`. The `sudo` password is the person's to type. If `node -v` is missing or older than v22, the distribution's package is usually too old: tell the person and use the official Node.js download (https://nodejs.org/en/download) in the way they choose.\n\nThen install and start CommandMate:\n\n```bash\nnpm install -g commandmate # the global install: for daily use\ncommandmate --version\ncommandmate init --defaults # writes ~/.commandmate/.env; repositories go under ~/repos\ncommandmate start --daemon\n```\n\n**`npx commandmate@latest` versus the global install.** `npx commandmate@latest` is the one-line way for a person to try CommandMate in their own terminal: it asks its setup questions and opens the browser. It needs an interactive terminal, so when you run it from your tool it only prints help. Use the global install above when you are the one running the commands, and for anything the person will keep using.\n\n### Ask the person first\n\n- Each tool you are about to install (Node.js, git, tmux), and the exact command.\n- `npm install -g commandmate`.\n- If `~/.commandmate/.env` already exists, `commandmate init --defaults` stops with \".env file already exists\": CommandMate is already configured, so skip `init`. Do not add `--force` without asking: it replaces their settings.\n\n### Confirm it worked\n\n```bash\ncommandmate status # reports the server as running, with its URL\n```\n\nTell the person to open the URL it prints (by default http://localhost:3000) in their browser.\n\n### If it fails\n\n- `commandmate: command not found` after `npm install -g`: npm's global bin directory is not on `PATH`. Run `npm prefix -g` and show the person; the fix is in https://github.com/Kewton/CommandMate/blob/main/docs/en/user-guide/cli-setup-guide.md#command-not-found-error.\n- `EACCES` during `npm install -g`: do not retry with `sudo`. Show the person the \"Permission Error (EACCES)\" section of the same setup guide.\n- The port is already in use: `commandmate start --daemon --port 3001`, then `commandmate status`.\n- The server does not start: `commandmate status`, then `commandmate stop --force` and `commandmate start --daemon` again. Read what it prints rather than retrying blindly.\n\n## Stage 2: Pair your phone\n\nGoal: the person scans a QR code with their phone and sees CommandMate there.\n\n`commandmate remote` makes this server reachable from outside the machine through a provider, and prints a QR code that pairs one phone. There are two providers, and **the person chooses which one**:\n\n| | Tailscale (`--provider tailscale`) | Cloudflare (`--provider cloudflare`) |\n|---|---|---|\n| Who can reach it | Only devices signed in to the person's own Tailscale network (tailnet) | Anyone with the URL: it is a public address on the internet |\n| What protects it | The tailnet, plus CommandMate's token login | A one-time pairing code (single use, expires in 10 minutes by default), plus CommandMate's token login |\n| Needs | The Tailscale app on this machine and on the phone, both signed in to the same account, with HTTPS (Serve) available | `cloudflared` installed on this machine; no account |\n| Approval | No public-tunnel approval | A public tunnel: `--yes` only after the person agrees |\n\nExplain both in plain words and ask which one they want. If they cannot decide, Tailscale keeps the server off the public internet; Cloudflare needs fewer accounts.\n\n**When to do this stage.** By default (`--auth all`), once `commandmate remote` runs, the `commandmate` CLI on this machine also needs a token, and the token goes only to the phone. Stages 3 to 5 run on that CLI, so they stop working. Ask the person which they want:\n\n- **Pair the phone last (recommended).** Skip to Stage 3 now, and come back to this stage after Stage 5.\n- **Pair the phone now, and keep the CLI on this machine.** Add `--auth remote-only` to the `commandmate remote` command below. Only the phone's route then needs the token: every process on this machine, agents included, can operate CommandMate without logging in. Say that plainly before they choose it.\n\n### Check\n\n```bash\ncommandmate status # is the server running, and with authentication?\ncommandmate remote status # is a remote session already recorded?\ntailscale status # Tailscale: installed and signed in?\ncloudflared --version # Cloudflare: installed?\n```\n\n### Run\n\n1. Install the chosen provider if the check found it missing, after the person agrees:\n - **Cloudflare**: on macOS `brew install cloudflared`; on Linux, from Cloudflare's official package repository for their distribution.\n - **Tailscale**: the person installs the Tailscale app from Tailscale's official distribution on this machine and on their phone, and signs in themselves. Signing in is theirs to do.\n2. If `commandmate status` showed the server running, stop it first, so `remote` can start it again with authentication: `commandmate stop`.\n3. Publish and pair:\n\n```bash\ncommandmate remote --provider tailscale\n# or, only after the person agreed to a public URL:\ncommandmate remote --provider cloudflare --yes\n```\n\n`remote` starts the server itself, publishes it, and prints the QR code. Show the person the QR code and tell them to scan it with the phone's camera. If the output is too narrow for a QR code, it prints a URL instead: that URL contains the pairing code, so give it only to the person and do not save it to a file or a log.\n\nIf the QR code cannot be read, or scanning it does not get the person in, have them copy the pairing URL and paste it into the address bar of the phone's browser. Pasting the link into the address bar is the way that worked in the hands-on check; do not save the link to a file.\n\nTo get the link as text again without reopening the tunnel, run `commandmate remote pair` (or `commandmate remote pair --json` and read `pairingUrl`). The URL stays the same, and it works only while the code is unused.\n\n### Ask the person first\n\n- Which provider: Tailscale or Cloudflare.\n- Installing that provider.\n- Running `commandmate remote` at all: it opens a way in from outside this machine.\n- Pairing now or after Stage 5, and, if now, whether to add `--auth remote-only`.\n- `--yes`: only after they agreed to the public Cloudflare URL. Never add `--yes` to get past a question they have not answered.\n\n### Confirm it worked\n\n- The person says the phone opened CommandMate.\n- `commandmate remote status` shows `Pairing: consumed`.\n\nTo close the way in later: `commandmate remote stop`. The server keeps running.\n\n### If it fails\n\n- Exit 1, \"no provider is usable\": read the reason it prints. For Tailscale it is usually \"not connected\" (the person has not signed in) or \"no MagicDNS name\". Do not switch to Cloudflare without asking: that changes who can reach the machine.\n- Exit 2 without a terminal: Cloudflare needs `--yes`, or a server is running that `remote` has to restart. Ask the person, then run `commandmate stop` and try again.\n- Exit 2, \"a server with authentication is already running\": `commandmate stop`, then `commandmate remote` again.\n- The QR code is cut off in the agent's chat pane, or the person lost it, and it has not been used yet: run `commandmate remote pair`. The public URL stays the same and the earlier link stops working. The new code keeps the original expiry time.\n- The code expired or was already used: run `commandmate remote stop`, then `commandmate remote` again for a new QR code (`remote pair` prints nothing for a used or expired code). `--pairing-expires 30m` gives a slower person more time.\n- After pairing, the browser on this machine asks for a login and the CLI stops answering: that is the default `--auth all`. Do not look for a way to give the token to the CLI. Ask the person to choose: run `commandmate remote stop` and finish Stages 3 to 5 on this machine first, or pair again with `--auth remote-only` (every process on this machine can then operate CommandMate without logging in).\n\n## Stage 3: Add a second agent\n\nGoal: a second agent CLI, for example Command Code or Codex, can work in one of the person's repositories through CommandMate.\n\nBefore Stages 3 to 5: CommandMate needs at least one of the person's repositories registered. The CLI cannot register one; the person does it in the browser, under **Repositories \u2192 Add Repository**.\n\n### Check\n\n```bash\nclaude --version\ncodex --version\ncommandcode --version # Command Code\ncommandmate ls # the worktrees CommandMate knows about\n```\n\nIf `commandmate ls` lists nothing, the person has not registered a repository yet. CommandMate only manages repositories under `~/repos` (the `CM_ROOT_DIR` that `init` set). Ask the person to open **Repositories \u2192 Add Repository** in the browser and add one, or to tell you where their repository is so you can check whether it is under that directory. Then run `commandmate sync` and `commandmate ls` again.\n\n### Run\n\nInstall the CLI the person picked, after they agree:\n\n```bash\nnpm install -g command-code # Command Code; CommandMate runs it as `commandcode`\nnpm install -g @openai/codex # Codex\n```\n\nSigning in to the CLI is the person's: ask them to run `commandcode` (or `codex`) once in their own terminal and finish its sign-in. Then add it to a worktree and give it a first, small message:\n\n```bash\ncommandmate instances <worktree-id> add --agent command-code\ncommandmate instances <worktree-id>\ncommandmate send <worktree-id> \"Read the README and summarize this repository in three lines.\" --instance command-code\ncommandmate wait <worktree-id> --instance command-code --timeout 600\ncommandmate reply <worktree-id> --instance command-code\n```\n\nFor Codex, use `--agent codex` and `--instance codex`.\n\nThe first time Codex starts in a worktree it shows two confirmation screens. Show them to the person with `commandmate capture <worktree-id> --instance codex`; do not answer them yourself.\n\n- `Trust this folder?`: whether Codex may work in this folder.\n- `Hooks need review (5 hooks are new or changed)`: these hooks are not from the repository. CommandMate wrote them into `~/.codex/hooks.json` itself, marked with `# commandmate:agent-hooks`, and they only send Codex's events to CommandMate on localhost. Check this with `grep -n 'commandmate:agent-hooks' ~/.codex/hooks.json` before you say where they came from. If the person does not trust them, Codex still works, but CommandMate cannot receive Codex's state as events, so `wait` and the status shown in the browser are less accurate.\n\n### Ask the person first\n\n- Which CLI to add, and installing it.\n- The sign-in, which they do themselves.\n- Do not turn on Auto Yes (`--auto-yes`, `commandmate auto-yes --enable`) to get past the CLI's own confirmations. If it stops on a question, show the person with `commandmate capture <worktree-id> --instance command-code` and let them answer.\n\n### Confirm it worked\n\n- `commandmate instances <worktree-id>` lists the new instance.\n- `commandmate reply <worktree-id> --instance command-code` prints its answer.\n\n### If it fails\n\n- \"is not installed or not in PATH\": the message names the install command. Run `commandcode --version` to check, and ask before installing.\n- `wait` exits 10: the agent is waiting on a question (often its own sign-in or a permission). Show the person `commandmate capture <worktree-id> --instance command-code`.\n- `wait` exits 124: it timed out. Check `commandmate capture` before waiting again.\n- \"Worktree ID not found\": run `commandmate sync`, then `commandmate ls`, and copy the ID exactly.\n\n## Stage 4: Give your team a PM\n\nGoal: one session plans the work and hands tasks to the others. That session is the lead (the \"PM\"). Skills from CommandMate's official Catalog teach it the method.\n\n### Check\n\n```bash\ncommandmate skill list # what the Catalog offers\ncommandmate skill info cmate-orchestrate # versions, risk, compatibility\ncommandmate skill status cmate-orchestrate --worktree <worktree-id>\n```\n\n### Run\n\nPick the exact version from `skill info`, show the person the plan, and install after they agree:\n\n```bash\ncommandmate skill install cmate-orchestrate --worktree <worktree-id> --version <version> --dry-run\ncommandmate skill install cmate-orchestrate --worktree <worktree-id> --version <version> --yes --ack-risk cmate-orchestrate@<version>\n```\n\n`cmate-orchestrate` is a high-risk Skill: it needs `--ack-risk <skill-id>@<version>` in addition to `--yes`. A Skill that is not high-risk needs only `--yes`. The Skill lands in `.agents/skills/` and `.claude/skills/` of that worktree.\n\nAn agent reads its Skills when its session starts, so the lead session has to start again. Ask the person whether to restart it from the worktree screen; if they prefer the CLI, `commandmate instances <worktree-id> kill <instance-id>` stops it and the next `commandmate send` starts it again.\n\nThen ask the lead in plain words. For example, sent to the lead session (in Claude Code the Skill is also available as `/cmate-orchestrate`):\n\n```bash\ncommandmate send <worktree-id> \"Use the cmate-orchestrate skill to plan issues #12 and #13. Show me the plan; do not run anything that changes the repository yet.\" --instance claude\n```\n\nThe plan step changes nothing. Steps that change something run only when the person approves them.\n\nCommand Code's plan mode (Command Code only; this workaround can be removed once #3125 is fixed): if the lead enters plan mode, it stops on a REVIEW screen and CommandMate cannot send a comment to it from the CLI. When you only want a plan, ask in plain words as above and do not have the lead enter plan mode.\n\n### Ask the person first\n\n- Installing each Skill, after showing the `--dry-run` plan. Say plainly that `cmate-orchestrate` is marked high-risk and what `--ack-risk` acknowledges.\n- Restarting the lead session.\n- Every approval the lead asks for, and every merge. You never approve or merge on the person's behalf.\n\n### Confirm it worked\n\n- `commandmate skill status cmate-orchestrate --worktree <worktree-id>` reports it as installed.\n- The lead's reply (`commandmate reply <worktree-id> --instance claude`) shows a plan.\n\n### If it fails\n\n- `skill install` exits 2: `--version` is missing or does not exist. Copy it from `skill info`.\n- Exit 12: the install was not confirmed: no `--yes`, or a high-risk Skill without `--ack-risk`. Ask again rather than adding flags on your own.\n- Exit 11: the worktree has local changes in the way. Show the person `git status` in that worktree.\n- Exit 1: the server or the Catalog could not be reached. Check `commandmate status`.\n- The agent does not know the Skill: its session started before the install. Restart it.\n\n## Stage 5: Let checks decide what's done\n\nGoal: \"done\" means the repository's own checks passed, not that an agent said so.\n\n### Check\n\n```bash\nls .commandmate/verify.yaml # in the repository: are gates declared?\ncommandmate skill status cmate-verify --worktree <worktree-id>\n```\n\n### Run\n\n1. Declare the gates. Either install the `cmate-verify` Skill (as in Stage 4, after the person agrees) and ask the lead to write `.commandmate/verify.yaml` with it, or draft it from the repository's CI definitions:\n\n```bash\ncommandmate verify init --cwd <repository-path> --dry-run # print the draft, write nothing\ncommandmate verify init --cwd <repository-path> # write it (never overwrites)\n```\n\nShow the person the gates (lint, type check, tests and so on) and change them only with their agreement.\n\nBefore handing over a task that commits, check that git knows who is committing: `git config user.name` and `git config user.email` in the repository (a worker's commit fails when they are empty). If they are empty, ask the person for their name and email, and set them only with their answer. Do not let a worker invent a bot name. The person may also choose to have the worker leave the changes uncommitted.\n\n2. Run the gates once on the worktree as it is:\n\n```bash\ncommandmate verify <worktree-id>\n```\n\n3. Hand a task over under a contract, and let the gates judge it. A contract is a YAML file in the repository, `.commandmate/tasks/<name>.yaml`, that states the goal, the files the agent may change, and the checks that decide when it is done:\n\n```yaml\nversion: 1\ntitle: \"Issue #12: <one-line summary>\"\ngoal: |\n Implement issue #12. Commit when the work is done.\nscope:\n allow:\n - \"src/**\"\n - \"tests/**\"\nverify:\n gates: [lint, unit] # gate ids from .commandmate/verify.yaml\nsuccess:\n requireWorkEvidence: true\n requireScopeClean: true\n```\n\n```bash\ncommandmate send <worktree-id> --contract .commandmate/tasks/issue-12.yaml --instance command-code\ncommandmate wait <worktree-id> --instance command-code --verify\n```\n\n`wait --verify` exits **0** when every gate passed, **20** when a gate failed, and **21** when there is no work to judge (no commits and no changes).\n\n### Ask the person first\n\n- Installing `cmate-verify`, and writing `.commandmate/verify.yaml` into their repository.\n- Which gates to declare, and any later change to them.\n- Merging the result. A passed gate means the checks passed; whether to merge is still the person's decision.\n\n### Confirm it worked\n\n- `commandmate verify <worktree-id>` ends with exit 0, or with a gate failure the person recognizes as real.\n- `commandmate verify history` lists the run.\n\n### If it fails\n\n- `verify` exits 21 right away: the worktree has no work yet. That is expected before a task.\n- Exit 20: a gate failed. `commandmate verify show <run-id>` shows which one and the end of its log. Report it; do not weaken the gate to make it pass.\n- The contract is rejected (exit 2): it prints every problem, for example a gate id that is not in `verify.yaml`. Fix the contract, not the gates.\n\n## Where to read more\n\n- CommandMate on GitHub: https://github.com/Kewton/CommandMate\n- CLI operations guide, every flag and exit code: https://github.com/Kewton/CommandMate/blob/main/docs/en/user-guide/cli-operations-guide.md\n- The project site: https://kewton.github.io/CommandMate/\n";
14
+ //# sourceMappingURL=setup-guide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-guide.d.ts","sourceRoot":"","sources":["../../../src/cli/docs/setup-guide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,WAAW,wzsBA8VvB,CAAC"}