commandmate 0.11.4 → 0.12.1

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 (602) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +406 -314
  3. package/.next/app-path-routes-manifest.json +35 -26
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/react-loadable-manifest.json +8 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +66 -0
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  29. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  36. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  40. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  42. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/skills/[id]/route.js +1 -0
  52. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -0
  53. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -0
  54. package/.next/server/app/api/skills/route.js +1 -0
  55. package/.next/server/app/api/skills/route.js.nft.json +1 -0
  56. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
  57. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/todos/route.js +1 -1
  61. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  65. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  67. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  75. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  76. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  79. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  82. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  85. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  103. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -0
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -0
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -0
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -0
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -0
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -0
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -0
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -0
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -0
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -0
  184. package/.next/server/app/api/worktrees/[id]/skills/route.js +23 -0
  185. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -0
  186. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -0
  187. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/chat/page.js +2 -2
  209. package/.next/server/app/chat/page.js.nft.json +1 -1
  210. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  211. package/.next/server/app/login/page.js.nft.json +1 -1
  212. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/more/page.js +2 -2
  215. package/.next/server/app/more/page.js.nft.json +1 -1
  216. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/offline/page.js.nft.json +1 -1
  218. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/page.js +1 -1
  220. package/.next/server/app/page.js.nft.json +1 -1
  221. package/.next/server/app/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/repositories/page.js +1 -1
  224. package/.next/server/app/repositories/page.js.nft.json +1 -1
  225. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/review/page.js +1 -1
  227. package/.next/server/app/review/page.js.nft.json +1 -1
  228. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/sessions/page.js +1 -1
  230. package/.next/server/app/sessions/page.js.nft.json +1 -1
  231. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/skills/[skillId]/page.js +2 -0
  233. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -0
  234. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -0
  235. package/.next/server/app/skills/page.js +2 -0
  236. package/.next/server/app/skills/page.js.nft.json +1 -0
  237. package/.next/server/app/skills/page_client-reference-manifest.js +1 -0
  238. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  240. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/worktrees/[id]/page.js +9 -9
  242. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  243. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  245. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  246. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app-paths-manifest.json +35 -26
  248. package/.next/server/chunks/1117.js +1 -1
  249. package/.next/server/chunks/120.js +1 -0
  250. package/.next/server/chunks/1808.js +1 -0
  251. package/.next/server/chunks/186.js +1 -0
  252. package/.next/server/chunks/2119.js +1 -1
  253. package/.next/server/chunks/22.js +1 -0
  254. package/.next/server/chunks/2328.js +1 -0
  255. package/.next/server/chunks/2445.js +1 -1
  256. package/.next/server/chunks/3042.js +2 -0
  257. package/.next/server/chunks/3543.js +1 -1
  258. package/.next/server/chunks/3708.js +1 -0
  259. package/.next/server/chunks/3945.js +1 -1
  260. package/.next/server/chunks/5064.js +1 -0
  261. package/.next/server/chunks/5226.js +28 -0
  262. package/.next/server/chunks/5306.js +2 -0
  263. package/.next/server/chunks/5312.js +1 -0
  264. package/.next/server/chunks/5326.js +1 -0
  265. package/.next/server/chunks/5381.js +1 -1
  266. package/.next/server/chunks/5456.js +1 -0
  267. package/.next/server/chunks/5571.js +1 -1
  268. package/.next/server/chunks/5959.js +3 -3
  269. package/.next/server/chunks/6065.js +1 -0
  270. package/.next/server/chunks/6130.js +1 -0
  271. package/.next/server/chunks/6283.js +1 -1
  272. package/.next/server/chunks/6285.js +1 -1
  273. package/.next/server/chunks/646.js +6 -6
  274. package/.next/server/chunks/{9968.js → 7587.js} +1 -1
  275. package/.next/server/chunks/8584.js +1 -0
  276. package/.next/server/chunks/8681.js +1 -1
  277. package/.next/server/chunks/8807.js +950 -804
  278. package/.next/server/chunks/9123.js +1 -1
  279. package/.next/server/middleware-build-manifest.js +1 -1
  280. package/.next/server/middleware-manifest.json +5 -5
  281. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  282. package/.next/server/pages/500.html +1 -1
  283. package/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/static/ZYti9g9gICKnjtmkfvvB2/_buildManifest.js +1 -0
  285. package/.next/static/chunks/1668-7484081c45a44f89.js +1 -0
  286. package/.next/static/chunks/3418-7e47651340d940b0.js +1 -0
  287. package/.next/static/chunks/4027-0c529b322be7d4d8.js +1 -0
  288. package/.next/static/chunks/{4560-64b1461fd996127a.js → 4560-04e5aebcab96bfa1.js} +1 -1
  289. package/.next/static/chunks/6007-de36119357dcd418.js +1 -0
  290. package/.next/static/chunks/{6488-76295bf0184b101f.js → 6488-624d4b6d2d4cc236.js} +1 -1
  291. package/.next/static/chunks/{8965-872d8de254196cec.js → 6497-dc26c6c6b0b15adf.js} +1 -1
  292. package/.next/static/chunks/790-d8e6acd26e03679c.js +1 -0
  293. package/.next/static/chunks/8361.4bf062be2d2962f4.js +1 -0
  294. package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +1 -0
  295. package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +1 -0
  296. package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +1 -0
  297. package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +1 -0
  298. package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +1 -0
  299. package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +1 -0
  300. package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +1 -0
  301. package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +1 -0
  302. package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +1 -0
  303. package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +1 -0
  304. package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +1 -0
  305. package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +1 -0
  306. package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +1 -0
  307. package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +1 -0
  308. package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +1 -0
  309. package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +1 -0
  310. package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +1 -0
  311. package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +1 -0
  312. package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +1 -0
  313. package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +1 -0
  314. package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +1 -0
  315. package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +1 -0
  316. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
  317. package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +1 -0
  318. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +1 -0
  319. package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +1 -0
  320. package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +1 -0
  321. package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +1 -0
  322. package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +1 -0
  323. package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +1 -0
  324. package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +1 -0
  325. package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +1 -0
  326. package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +1 -0
  327. package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +1 -0
  328. package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +1 -0
  329. package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +1 -0
  330. package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +1 -0
  331. package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +1 -0
  332. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +1 -0
  333. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +1 -0
  334. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +1 -0
  335. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +1 -0
  336. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +1 -0
  337. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +1 -0
  338. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +1 -0
  339. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +1 -0
  340. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +1 -0
  341. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +1 -0
  342. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +1 -0
  343. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +1 -0
  344. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +1 -0
  345. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +1 -0
  346. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +1 -0
  347. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +1 -0
  348. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +1 -0
  397. package/.next/static/chunks/app/chat/{page-9ed2ffd98eb4ae18.js → page-9cf4ba62e21d9074.js} +1 -1
  398. package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +1 -0
  399. package/.next/static/chunks/app/more/{page-a496425bba427b48.js → page-082d4ae496f9a36e.js} +1 -1
  400. package/.next/static/chunks/app/{page-15bfd76bcf65842d.js → page-af457ca5876ed616.js} +1 -1
  401. package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +1 -0
  402. package/.next/static/chunks/app/repositories/{page-d214522ab8792ce7.js → page-75f0d70452c6b6c0.js} +1 -1
  403. package/.next/static/chunks/app/review/{page-1dadf0b5d7129598.js → page-f431d630097c2e85.js} +1 -1
  404. package/.next/static/chunks/app/sessions/{page-96f007d986c5f327.js → page-20f07a99db64d2ca.js} +1 -1
  405. package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +1 -0
  406. package/.next/static/chunks/app/skills/page-46242c428ee8bccf.js +1 -0
  407. package/.next/static/chunks/app/worktrees/[id]/page-7dd929bfc978742e.js +1 -0
  408. package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +1 -0
  409. package/.next/static/chunks/webpack-0f9275e279c058eb.js +1 -0
  410. package/.next/static/css/b4bdb1f3457fe9a7.css +1 -0
  411. package/.next/trace +11 -10
  412. package/.next/types/app/api/skills/[id]/route.ts +347 -0
  413. package/.next/types/app/api/skills/route.ts +347 -0
  414. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/install/route.ts +347 -0
  415. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/plan/route.ts +347 -0
  416. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.ts +347 -0
  417. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.ts +347 -0
  418. package/.next/types/app/api/worktrees/[id]/skills/route.ts +347 -0
  419. package/.next/types/app/skills/[skillId]/page.ts +84 -0
  420. package/.next/types/app/skills/page.ts +84 -0
  421. package/.next/types/routes.d.ts +11 -2
  422. package/.next/types/validator.ts +81 -0
  423. package/dist/cli/commands/skill-format.d.ts +28 -0
  424. package/dist/cli/commands/skill-format.d.ts.map +1 -0
  425. package/dist/cli/commands/skill-format.js +163 -0
  426. package/dist/cli/commands/skill-guards.d.ts +53 -0
  427. package/dist/cli/commands/skill-guards.d.ts.map +1 -0
  428. package/dist/cli/commands/skill-guards.js +188 -0
  429. package/dist/cli/commands/skill.d.ts +24 -0
  430. package/dist/cli/commands/skill.d.ts.map +1 -0
  431. package/dist/cli/commands/skill.js +365 -0
  432. package/dist/cli/docs/agent-operations.d.ts +1 -1
  433. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  434. package/dist/cli/docs/agent-operations.js +36 -0
  435. package/dist/cli/program.d.ts.map +1 -1
  436. package/dist/cli/program.js +11 -0
  437. package/dist/cli/types/api-responses.d.ts +215 -0
  438. package/dist/cli/types/api-responses.d.ts.map +1 -1
  439. package/dist/cli/types/index.d.ts +60 -0
  440. package/dist/cli/types/index.d.ts.map +1 -1
  441. package/dist/cli/types/index.js +23 -1
  442. package/dist/cli/utils/api-client.d.ts +19 -1
  443. package/dist/cli/utils/api-client.d.ts.map +1 -1
  444. package/dist/cli/utils/api-client.js +41 -4
  445. package/dist/server/server.js +57 -0
  446. package/dist/server/src/config/activity-bar-config.js +2 -0
  447. package/dist/server/src/config/git-status-config.js +83 -0
  448. package/dist/server/src/config/skill-security-config.js +139 -0
  449. package/dist/server/src/lib/cli-tools/antigravity.js +8 -13
  450. package/dist/server/src/lib/cli-tools/codex.js +8 -14
  451. package/dist/server/src/lib/cli-tools/copilot.js +12 -13
  452. package/dist/server/src/lib/cli-tools/gemini.js +8 -13
  453. package/dist/server/src/lib/cli-tools/opencode.js +8 -13
  454. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +174 -0
  455. package/dist/server/src/lib/cli-tools/vibe-local.js +12 -17
  456. package/dist/server/src/lib/db/migrations/index.js +8 -0
  457. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  458. package/dist/server/src/lib/db/migrations/v44-skill-operations.js +81 -0
  459. package/dist/server/src/lib/db/migrations/v45-skill-installations.js +59 -0
  460. package/dist/server/src/lib/db/migrations/v46-skill-installations-cascade.js +107 -0
  461. package/dist/server/src/lib/db/migrations/v47-skill-installations-roots.js +70 -0
  462. package/dist/server/src/lib/db/worktree-db.js +9 -4
  463. package/dist/server/src/lib/git/git-errors.js +336 -0
  464. package/dist/server/src/lib/git/git-exec.js +285 -0
  465. package/dist/server/src/lib/session-key-sender.js +11 -9
  466. package/dist/server/src/lib/skills/compatibility.js +194 -0
  467. package/dist/server/src/lib/skills/constants.js +252 -0
  468. package/dist/server/src/lib/skills/errors.js +82 -0
  469. package/dist/server/src/lib/skills/index.js +91 -0
  470. package/dist/server/src/lib/skills/install-apply.js +670 -0
  471. package/dist/server/src/lib/skills/install-plan.js +582 -0
  472. package/dist/server/src/lib/skills/installed-state.js +127 -0
  473. package/dist/server/src/lib/skills/integrity.js +225 -0
  474. package/dist/server/src/lib/skills/json-schema.js +365 -0
  475. package/dist/server/src/lib/skills/operation-audit.js +120 -0
  476. package/dist/server/src/lib/skills/operation-journal.js +286 -0
  477. package/dist/server/src/lib/skills/operation-lock.js +339 -0
  478. package/dist/server/src/lib/skills/operation-reconciler.js +107 -0
  479. package/dist/server/src/lib/skills/operation-store.js +153 -0
  480. package/dist/server/src/lib/skills/package-reader.js +495 -0
  481. package/dist/server/src/lib/skills/package-validator.js +451 -0
  482. package/dist/server/src/lib/skills/preview-diff.js +627 -0
  483. package/dist/server/src/lib/skills/safe-yaml.js +593 -0
  484. package/dist/server/src/lib/skills/schema.js +1248 -0
  485. package/dist/server/src/lib/skills/semver.js +193 -0
  486. package/dist/server/src/lib/skills/snapshot-store.js +334 -0
  487. package/dist/server/src/lib/skills/startup-reconcile.js +138 -0
  488. package/dist/server/src/lib/skills/uninstall-apply.js +495 -0
  489. package/dist/server/src/lib/skills/uninstall-plan.js +479 -0
  490. package/dist/server/src/types/skills.js +17 -0
  491. package/package.json +1 -1
  492. package/.next/server/chunks/129.js +0 -1
  493. package/.next/server/chunks/2478.js +0 -1
  494. package/.next/server/chunks/9886.js +0 -1
  495. package/.next/static/0_lnKsT0DH-MnHhnV5n-l/_buildManifest.js +0 -1
  496. package/.next/static/chunks/3165-87bf884f7f3d15cf.js +0 -1
  497. package/.next/static/chunks/6416.6756b7ad06dd96f7.js +0 -1
  498. package/.next/static/chunks/8676.57260a06f6554e7e.js +0 -1
  499. package/.next/static/chunks/app/api/app/update/route-7536041a7a89616d.js +0 -1
  500. package/.next/static/chunks/app/api/app/update-check/route-7536041a7a89616d.js +0 -1
  501. package/.next/static/chunks/app/api/assistant/conversation/route-7536041a7a89616d.js +0 -1
  502. package/.next/static/chunks/app/api/assistant/current-output/route-7536041a7a89616d.js +0 -1
  503. package/.next/static/chunks/app/api/assistant/messages/route-7536041a7a89616d.js +0 -1
  504. package/.next/static/chunks/app/api/assistant/session/route-7536041a7a89616d.js +0 -1
  505. package/.next/static/chunks/app/api/assistant/start/route-7536041a7a89616d.js +0 -1
  506. package/.next/static/chunks/app/api/assistant/terminal/route-7536041a7a89616d.js +0 -1
  507. package/.next/static/chunks/app/api/assistant/tools/route-7536041a7a89616d.js +0 -1
  508. package/.next/static/chunks/app/api/auth/login/route-7536041a7a89616d.js +0 -1
  509. package/.next/static/chunks/app/api/auth/logout/route-7536041a7a89616d.js +0 -1
  510. package/.next/static/chunks/app/api/auth/status/route-7536041a7a89616d.js +0 -1
  511. package/.next/static/chunks/app/api/daily-summary/route-7536041a7a89616d.js +0 -1
  512. package/.next/static/chunks/app/api/daily-summary/status/route-7536041a7a89616d.js +0 -1
  513. package/.next/static/chunks/app/api/external-apps/[id]/health/route-7536041a7a89616d.js +0 -1
  514. package/.next/static/chunks/app/api/external-apps/[id]/route-7536041a7a89616d.js +0 -1
  515. package/.next/static/chunks/app/api/external-apps/route-7536041a7a89616d.js +0 -1
  516. package/.next/static/chunks/app/api/hooks/claude-done/route-7536041a7a89616d.js +0 -1
  517. package/.next/static/chunks/app/api/ollama/models/route-7536041a7a89616d.js +0 -1
  518. package/.next/static/chunks/app/api/push/subscriptions/route-7536041a7a89616d.js +0 -1
  519. package/.next/static/chunks/app/api/push/vapid/route-7536041a7a89616d.js +0 -1
  520. package/.next/static/chunks/app/api/repositories/[id]/route-7536041a7a89616d.js +0 -1
  521. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
  522. package/.next/static/chunks/app/api/repositories/[id]/todos/route-7536041a7a89616d.js +0 -1
  523. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-7536041a7a89616d.js +0 -1
  524. package/.next/static/chunks/app/api/repositories/clone/route-7536041a7a89616d.js +0 -1
  525. package/.next/static/chunks/app/api/repositories/excluded/route-7536041a7a89616d.js +0 -1
  526. package/.next/static/chunks/app/api/repositories/restore/route-7536041a7a89616d.js +0 -1
  527. package/.next/static/chunks/app/api/repositories/route-7536041a7a89616d.js +0 -1
  528. package/.next/static/chunks/app/api/repositories/scan/route-7536041a7a89616d.js +0 -1
  529. package/.next/static/chunks/app/api/repositories/sync/route-7536041a7a89616d.js +0 -1
  530. package/.next/static/chunks/app/api/sidebar/group-order/route-7536041a7a89616d.js +0 -1
  531. package/.next/static/chunks/app/api/slash-commands/route-7536041a7a89616d.js +0 -1
  532. package/.next/static/chunks/app/api/templates/[id]/route-7536041a7a89616d.js +0 -1
  533. package/.next/static/chunks/app/api/templates/route-7536041a7a89616d.js +0 -1
  534. package/.next/static/chunks/app/api/todos/route-7536041a7a89616d.js +0 -1
  535. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-7536041a7a89616d.js +0 -1
  536. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-7536041a7a89616d.js +0 -1
  537. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-7536041a7a89616d.js +0 -1
  538. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-7536041a7a89616d.js +0 -1
  539. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-7536041a7a89616d.js +0 -1
  540. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-7536041a7a89616d.js +0 -1
  541. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-7536041a7a89616d.js +0 -1
  542. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-7536041a7a89616d.js +0 -1
  543. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-7536041a7a89616d.js +0 -1
  544. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-7536041a7a89616d.js +0 -1
  545. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-7536041a7a89616d.js +0 -1
  546. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-7536041a7a89616d.js +0 -1
  547. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-7536041a7a89616d.js +0 -1
  548. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-7536041a7a89616d.js +0 -1
  549. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-7536041a7a89616d.js +0 -1
  550. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-7536041a7a89616d.js +0 -1
  551. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-7536041a7a89616d.js +0 -1
  552. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-7536041a7a89616d.js +0 -1
  553. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-7536041a7a89616d.js +0 -1
  554. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-7536041a7a89616d.js +0 -1
  555. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-7536041a7a89616d.js +0 -1
  556. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-7536041a7a89616d.js +0 -1
  557. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-7536041a7a89616d.js +0 -1
  558. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-7536041a7a89616d.js +0 -1
  559. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-7536041a7a89616d.js +0 -1
  560. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-7536041a7a89616d.js +0 -1
  561. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-7536041a7a89616d.js +0 -1
  562. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-7536041a7a89616d.js +0 -1
  563. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-7536041a7a89616d.js +0 -1
  564. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-7536041a7a89616d.js +0 -1
  565. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-7536041a7a89616d.js +0 -1
  566. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-7536041a7a89616d.js +0 -1
  567. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-7536041a7a89616d.js +0 -1
  568. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-7536041a7a89616d.js +0 -1
  569. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-7536041a7a89616d.js +0 -1
  570. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-7536041a7a89616d.js +0 -1
  571. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-7536041a7a89616d.js +0 -1
  572. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-7536041a7a89616d.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-7536041a7a89616d.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-7536041a7a89616d.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-7536041a7a89616d.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/route-7536041a7a89616d.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-7536041a7a89616d.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-7536041a7a89616d.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-7536041a7a89616d.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/search/route-7536041a7a89616d.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/send/route-7536041a7a89616d.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-7536041a7a89616d.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-7536041a7a89616d.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-7536041a7a89616d.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-7536041a7a89616d.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-7536041a7a89616d.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-7536041a7a89616d.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-7536041a7a89616d.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-7536041a7a89616d.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-7536041a7a89616d.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-7536041a7a89616d.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-7536041a7a89616d.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/route-7536041a7a89616d.js +0 -1
  595. package/.next/static/chunks/app/manifest.webmanifest/route-7536041a7a89616d.js +0 -1
  596. package/.next/static/chunks/app/proxy/[...path]/route-7536041a7a89616d.js +0 -1
  597. package/.next/static/chunks/app/worktrees/[id]/page-9a4ce51e697baac6.js +0 -1
  598. package/.next/static/chunks/app/worktrees/[id]/terminal/page-ed4590b024edd8d6.js +0 -1
  599. package/.next/static/chunks/webpack-2e3739a831868daa.js +0 -1
  600. package/.next/static/css/d7e2e8d1b8d69d36.css +0 -1
  601. package/dist/server/src/lib/pasted-text-helper.js +0 -58
  602. /package/.next/static/{0_lnKsT0DH-MnHhnV5n-l → ZYti9g9gICKnjtmkfvvB2}/_ssgManifest.js +0 -0
@@ -0,0 +1,479 @@
1
+ "use strict";
2
+ /**
3
+ * Uninstall Plan: proving a Skill directory is safe to remove (Issue #1236)
4
+ *
5
+ * The inverse of #1233's install plan, and deliberately not its mirror image.
6
+ * An install may write into an empty destination; an uninstall must delete, and
7
+ * deletion is the one operation a user cannot undo from CommandMate. So this
8
+ * module answers a narrower question: *is every single file under the install
9
+ * root provably one that CommandMate wrote and that nobody has touched since?*
10
+ *
11
+ * Anything else — a locally edited file, a file the receipt never recorded, a
12
+ * recorded file that has gone missing, a symlink, an unreadable receipt, a scan
13
+ * that hit its bound — makes the plan non-removable. There is no partial
14
+ * uninstall: "delete the seven files we are sure about and leave the eighth"
15
+ * would silently destroy a Skill the user had customised while telling them the
16
+ * operation succeeded.
17
+ *
18
+ * The token contract is #1233's, reused rather than re-derived: the same TTL,
19
+ * the same single-use semantics, the same LRU bound, and the same
20
+ * {@link SkillPlanError} codes, so a drifting or replayed uninstall token is
21
+ * answered exactly like a drifting or replayed install token.
22
+ *
23
+ * Apply is {@link module:lib/skills/uninstall-apply}. This module never deletes.
24
+ *
25
+ * @module lib/skills/uninstall-plan
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.SKILL_UNINSTALL_PLAN_TOKEN_PATTERN = exports.SKILL_UNINSTALL_RELOAD_MESSAGE_KEYS = exports.SKILL_UNINSTALL_NEXT_ACTION_KEYS = exports.SKILL_UNINSTALL_REASON_MESSAGE_KEYS = exports.SkillUninstallReason = void 0;
29
+ exports.assessSkillUninstall = assessSkillUninstall;
30
+ exports.computeSkillUninstallBindingHash = computeSkillUninstallBindingHash;
31
+ exports.sweepSkillUninstallPlans = sweepSkillUninstallPlans;
32
+ exports.getSkillUninstallPlan = getSkillUninstallPlan;
33
+ exports.consumeSkillUninstallPlan = consumeSkillUninstallPlan;
34
+ exports.discardSkillUninstallPlan = discardSkillUninstallPlan;
35
+ exports.resetSkillUninstallPlanCacheForTesting = resetSkillUninstallPlanCacheForTesting;
36
+ exports.getSkillUninstallPlanCount = getSkillUninstallPlanCount;
37
+ exports.createSkillUninstallPlan = createSkillUninstallPlan;
38
+ exports.readSkillReceiptDigest = readSkillReceiptDigest;
39
+ const crypto_1 = require("crypto");
40
+ const constants_1 = require("../../lib/skills/constants");
41
+ const integrity_1 = require("../../lib/skills/integrity");
42
+ const install_plan_1 = require("../../lib/skills/install-plan");
43
+ const constants_2 = require("../../lib/skills/constants");
44
+ const preview_diff_1 = require("../../lib/skills/preview-diff");
45
+ /** Stable machine reasons, one per disposition plus the plan-level failures. */
46
+ exports.SkillUninstallReason = {
47
+ /** Recorded, unchanged, and therefore deletable. */
48
+ MANAGED_UNCHANGED: 'SKILL_UNINSTALL_MANAGED_UNCHANGED',
49
+ /** Recorded but locally edited. Deleting it would destroy the user's work. */
50
+ LOCAL_MODIFICATION: 'SKILL_UNINSTALL_LOCAL_MODIFICATION',
51
+ /** Recorded but absent, so the install is no longer the one the receipt describes. */
52
+ RECEIPT_ORPHAN: 'SKILL_UNINSTALL_RECEIPT_ORPHAN',
53
+ /** Present but unrecorded: a user file, or another tool's output. */
54
+ UNMANAGED_FILE: 'SKILL_UNINSTALL_UNMANAGED_FILE',
55
+ /** Present as a symlink, a directory entry or another non-regular entry. */
56
+ NOT_A_REGULAR_FILE: 'SKILL_UNINSTALL_NOT_A_REGULAR_FILE',
57
+ /** No install root exists at all. */
58
+ NOT_INSTALLED: 'SKILL_UNINSTALL_NOT_INSTALLED',
59
+ /** The install root exists but carries no CommandMate receipt. */
60
+ RECEIPT_MISSING: 'SKILL_UNINSTALL_RECEIPT_MISSING',
61
+ /** A receipt file exists but cannot be parsed. */
62
+ RECEIPT_UNREADABLE: 'SKILL_UNINSTALL_RECEIPT_UNREADABLE',
63
+ /** The receipt describes a different Skill than the one being uninstalled. */
64
+ RECEIPT_FOREIGN: 'SKILL_UNINSTALL_RECEIPT_FOREIGN',
65
+ /** The directory walk hit a bound, so absence of unknown files is unproven. */
66
+ TREE_SCAN_TRUNCATED: 'SKILL_UNINSTALL_TREE_SCAN_TRUNCATED',
67
+ };
68
+ /** i18n key explaining why one path cannot be removed (UX-07). */
69
+ exports.SKILL_UNINSTALL_REASON_MESSAGE_KEYS = {
70
+ [exports.SkillUninstallReason.MANAGED_UNCHANGED]: 'skills.uninstall.reason.managedUnchanged',
71
+ [exports.SkillUninstallReason.LOCAL_MODIFICATION]: 'skills.uninstall.reason.localModification',
72
+ [exports.SkillUninstallReason.RECEIPT_ORPHAN]: 'skills.uninstall.reason.receiptOrphan',
73
+ [exports.SkillUninstallReason.UNMANAGED_FILE]: 'skills.uninstall.reason.unmanagedFile',
74
+ [exports.SkillUninstallReason.NOT_A_REGULAR_FILE]: 'skills.uninstall.reason.notARegularFile',
75
+ [exports.SkillUninstallReason.NOT_INSTALLED]: 'skills.uninstall.reason.notInstalled',
76
+ [exports.SkillUninstallReason.RECEIPT_MISSING]: 'skills.uninstall.reason.receiptMissing',
77
+ [exports.SkillUninstallReason.RECEIPT_UNREADABLE]: 'skills.uninstall.reason.receiptUnreadable',
78
+ [exports.SkillUninstallReason.RECEIPT_FOREIGN]: 'skills.uninstall.reason.receiptForeign',
79
+ [exports.SkillUninstallReason.TREE_SCAN_TRUNCATED]: 'skills.uninstall.reason.treeScanTruncated',
80
+ };
81
+ /** i18n key for what the user should do next, per outcome (UX-07). */
82
+ exports.SKILL_UNINSTALL_NEXT_ACTION_KEYS = {
83
+ /** Every file checked out; the plan can be applied. */
84
+ removable: 'skills.uninstall.nextAction.removable',
85
+ /** Something is ambiguous, so nothing will be deleted until the user resolves it. */
86
+ blocked: 'skills.uninstall.nextAction.blocked',
87
+ succeeded: 'skills.uninstall.nextAction.succeeded',
88
+ committedReconciling: 'skills.uninstall.nextAction.committedReconciling',
89
+ failed: 'skills.uninstall.nextAction.failed',
90
+ };
91
+ /** i18n key per agent support level, so UI and CLI say the same thing (UX-01). */
92
+ exports.SKILL_UNINSTALL_RELOAD_MESSAGE_KEYS = {
93
+ native: 'skills.uninstall.reload.native',
94
+ commandmate_runtime: 'skills.uninstall.reload.commandmateRuntime',
95
+ unsupported: 'skills.uninstall.reload.unsupported',
96
+ unknown: 'skills.uninstall.reload.unknown',
97
+ };
98
+ function blocker(code, path) {
99
+ return { code, path, messageKey: exports.SKILL_UNINSTALL_REASON_MESSAGE_KEYS[code] };
100
+ }
101
+ const DISPOSITION_REASON = {
102
+ remove: exports.SkillUninstallReason.MANAGED_UNCHANGED,
103
+ modified: exports.SkillUninstallReason.LOCAL_MODIFICATION,
104
+ missing: exports.SkillUninstallReason.RECEIPT_ORPHAN,
105
+ unknown: exports.SkillUninstallReason.UNMANAGED_FILE,
106
+ };
107
+ /** Stat bucket each disposition counts towards. */
108
+ const DISPOSITION_STAT = {
109
+ remove: 'removable',
110
+ modified: 'modified',
111
+ missing: 'missing',
112
+ unknown: 'unknown',
113
+ };
114
+ /**
115
+ * Decide what uninstall would do to every path under the install root.
116
+ *
117
+ * The receipt is the ownership record, and it is read from the directory it
118
+ * describes rather than from the database: the index can be rebuilt from the
119
+ * receipt but never the other way round, and a delete that trusted the index
120
+ * would act on a claim instead of on evidence.
121
+ *
122
+ * The receipt does not list itself, so it is folded in here under its own
123
+ * on-disk digest. Without that it would read as an unmanaged file and every
124
+ * uninstall would block on the very file that authorises it.
125
+ */
126
+ function assessSkillUninstall(installRootAbs, skillId, options = {}) {
127
+ const installRoot = (0, preview_diff_1.skillInstallRootFor)(options.rootPrefix ?? constants_2.SKILL_INSTALL_ROOT_PREFIX, skillId);
128
+ const existing = options.existing ?? (0, preview_diff_1.readExistingSkillTree)(installRootAbs);
129
+ const currentTreeHash = (0, preview_diff_1.computeSkillTreeHash)(existing.files);
130
+ const empty = {
131
+ installRoot,
132
+ present: existing.present,
133
+ receipt: null,
134
+ receiptDigest: null,
135
+ entries: [],
136
+ blockers: [],
137
+ removable: false,
138
+ currentTreeHash,
139
+ stats: { removable: 0, modified: 0, missing: 0, unknown: 0, irregular: 0 },
140
+ };
141
+ if (!existing.present) {
142
+ return { ...empty, blockers: [blocker(exports.SkillUninstallReason.NOT_INSTALLED, installRoot)] };
143
+ }
144
+ const blockers = [];
145
+ if (existing.truncated) {
146
+ blockers.push(blocker(exports.SkillUninstallReason.TREE_SCAN_TRUNCATED, installRoot));
147
+ }
148
+ const receiptFile = existing.files.find((file) => file.path === install_plan_1.SKILL_RECEIPT_FILENAME);
149
+ const receipt = receiptFile ? (0, install_plan_1.parseInstalledReceipt)(receiptFile.bytes) : null;
150
+ if (!receiptFile) {
151
+ blockers.push(blocker(exports.SkillUninstallReason.RECEIPT_MISSING, `${installRoot}/${install_plan_1.SKILL_RECEIPT_FILENAME}`));
152
+ }
153
+ else if (receipt === null) {
154
+ blockers.push(blocker(exports.SkillUninstallReason.RECEIPT_UNREADABLE, `${installRoot}/${install_plan_1.SKILL_RECEIPT_FILENAME}`));
155
+ }
156
+ else if (receipt.skill_id !== skillId) {
157
+ blockers.push(blocker(exports.SkillUninstallReason.RECEIPT_FOREIGN, `${installRoot}/${install_plan_1.SKILL_RECEIPT_FILENAME}`));
158
+ }
159
+ // A receipt that cannot be trusted makes ownership unknowable for every path,
160
+ // so nothing below could promote a file to `remove` anyway.
161
+ const trustedReceipt = receiptFile && receipt !== null && receipt.skill_id === skillId ? receipt : null;
162
+ const recorded = new Map();
163
+ if (trustedReceipt && receiptFile) {
164
+ for (const file of trustedReceipt.files) {
165
+ recorded.set(file.path, {
166
+ sha256: file.sha256,
167
+ executable: file.executable,
168
+ size: file.size,
169
+ });
170
+ }
171
+ recorded.set(install_plan_1.SKILL_RECEIPT_FILENAME, {
172
+ sha256: receiptFile.sha256,
173
+ executable: false,
174
+ size: receiptFile.size,
175
+ });
176
+ }
177
+ const existingByPath = new Map(existing.files.map((file) => [file.path, file]));
178
+ const entries = [];
179
+ const stats = {
180
+ removable: 0,
181
+ modified: 0,
182
+ missing: 0,
183
+ unknown: 0,
184
+ irregular: 0,
185
+ };
186
+ for (const relative of [...new Set([...recorded.keys(), ...existingByPath.keys()])].sort()) {
187
+ const owned = recorded.get(relative) ?? null;
188
+ const onDisk = existingByPath.get(relative) ?? null;
189
+ let disposition;
190
+ if (owned === null)
191
+ disposition = 'unknown';
192
+ else if (onDisk === null)
193
+ disposition = 'missing';
194
+ else if ((0, integrity_1.digestMatches)(onDisk.sha256, owned.sha256) &&
195
+ onDisk.executable === owned.executable) {
196
+ disposition = 'remove';
197
+ }
198
+ else
199
+ disposition = 'modified';
200
+ const reason = DISPOSITION_REASON[disposition];
201
+ entries.push({
202
+ path: `${installRoot}/${relative}`,
203
+ relativePath: relative,
204
+ disposition,
205
+ reason,
206
+ generated: relative === install_plan_1.SKILL_RECEIPT_FILENAME,
207
+ recordedSha256: owned?.sha256 ?? null,
208
+ currentSha256: onDisk?.sha256 ?? null,
209
+ size: onDisk?.size ?? owned?.size ?? null,
210
+ executable: onDisk?.executable ?? owned?.executable ?? false,
211
+ });
212
+ stats[DISPOSITION_STAT[disposition]] += 1;
213
+ if (disposition !== 'remove') {
214
+ blockers.push(blocker(reason, `${installRoot}/${relative}`));
215
+ }
216
+ }
217
+ for (const irregular of existing.irregularPaths) {
218
+ const repoPath = irregular ? `${installRoot}/${irregular}` : installRoot;
219
+ entries.push({
220
+ path: repoPath,
221
+ relativePath: irregular,
222
+ disposition: 'irregular',
223
+ reason: exports.SkillUninstallReason.NOT_A_REGULAR_FILE,
224
+ generated: false,
225
+ recordedSha256: recorded.get(irregular)?.sha256 ?? null,
226
+ currentSha256: null,
227
+ size: null,
228
+ executable: false,
229
+ });
230
+ stats.irregular += 1;
231
+ blockers.push(blocker(exports.SkillUninstallReason.NOT_A_REGULAR_FILE, repoPath));
232
+ }
233
+ return {
234
+ installRoot,
235
+ present: true,
236
+ receipt: trustedReceipt,
237
+ receiptDigest: receiptFile?.sha256 ?? null,
238
+ entries: entries.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),
239
+ blockers,
240
+ removable: trustedReceipt !== null && blockers.length === 0,
241
+ currentTreeHash,
242
+ stats,
243
+ };
244
+ }
245
+ function canonicalJson(value) {
246
+ if (value === null || typeof value !== 'object')
247
+ return JSON.stringify(value) ?? 'null';
248
+ if (Array.isArray(value))
249
+ return `[${value.map(canonicalJson).join(',')}]`;
250
+ const entries = Object.entries(value)
251
+ .filter(([, v]) => v !== undefined)
252
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
253
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
254
+ }
255
+ /** Digest of a binding, used to compare two of them without leaking either. */
256
+ function computeSkillUninstallBindingHash(binding) {
257
+ return (0, crypto_1.createHash)('sha256').update(canonicalJson(binding)).digest('hex');
258
+ }
259
+ const cache = globalThis.__skillUninstallPlans ??
260
+ (globalThis.__skillUninstallPlans = { records: new Map() });
261
+ /** Token grammar. Anything else is rejected before the store is consulted. */
262
+ exports.SKILL_UNINSTALL_PLAN_TOKEN_PATTERN = /^[0-9a-f]{48}$/;
263
+ const SKILL_UNINSTALL_PLAN_TOKEN_BYTES = 24;
264
+ /**
265
+ * Drop every expired plan.
266
+ *
267
+ * @param keep Token to leave in place so its own lookup can still answer
268
+ * `EXPIRED` rather than the ambiguous `NOT_FOUND`
269
+ * @returns Number of plans dropped
270
+ */
271
+ function sweepExpired(now, keep) {
272
+ let dropped = 0;
273
+ for (const record of [...cache.records.values()]) {
274
+ if (record.token !== keep && now >= record.expiresAt) {
275
+ cache.records.delete(record.token);
276
+ dropped += 1;
277
+ }
278
+ }
279
+ return dropped;
280
+ }
281
+ function sweep(now) {
282
+ sweepExpired(now);
283
+ while (cache.records.size >= install_plan_1.SKILL_PLAN_MAX_ENTRIES) {
284
+ const oldest = [...cache.records.values()].sort((a, b) => a.createdAt - b.createdAt)[0];
285
+ if (!oldest)
286
+ break;
287
+ cache.records.delete(oldest.token);
288
+ }
289
+ }
290
+ /**
291
+ * Reclaim expired plans without creating one.
292
+ *
293
+ * The install cache's counterpart ({@link module:lib/skills/install-plan}).
294
+ * An uninstall plan pins no snapshot, but it does hold the assessed tree, and
295
+ * the two caches must not diverge in when they let go of it.
296
+ *
297
+ * @returns Number of plans dropped
298
+ */
299
+ function sweepSkillUninstallPlans(options = {}) {
300
+ return sweepExpired(options.now ?? Date.now());
301
+ }
302
+ function requireRecord(token, now) {
303
+ if (!exports.SKILL_UNINSTALL_PLAN_TOKEN_PATTERN.test(token)) {
304
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.NOT_FOUND);
305
+ }
306
+ const record = cache.records.get(token);
307
+ // Every token access reclaims the siblings that expired meanwhile, so a plan
308
+ // nobody applies is not held until the next plan is created.
309
+ sweepExpired(now, token);
310
+ if (!record)
311
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.NOT_FOUND);
312
+ const presented = Buffer.from(token, 'utf-8');
313
+ const stored = Buffer.from(record.token, 'utf-8');
314
+ if (presented.length !== stored.length || !(0, crypto_1.timingSafeEqual)(presented, stored)) {
315
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.NOT_FOUND);
316
+ }
317
+ if (now >= record.expiresAt) {
318
+ cache.records.delete(record.token);
319
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.EXPIRED);
320
+ }
321
+ if (record.consumedAt !== null)
322
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.CONSUMED);
323
+ return record;
324
+ }
325
+ /** Read a stored plan. Does not spend the token. */
326
+ function getSkillUninstallPlan(token, options = {}) {
327
+ return requireRecord(token, options.now ?? Date.now());
328
+ }
329
+ /**
330
+ * Spend a token.
331
+ *
332
+ * Binding equality is checked before staleness, so a token presented for the
333
+ * wrong target is never told anything about the right one. The receipt digest
334
+ * is part of the observation as well as of the binding: branch and tree hash
335
+ * would already catch a content change, but the digest is what proves this is
336
+ * still *the same install* rather than a reinstall that happens to be identical.
337
+ */
338
+ function consumeSkillUninstallPlan(token, expected, observed, options = {}) {
339
+ const now = options.now ?? Date.now();
340
+ const record = requireRecord(token, now);
341
+ const { binding } = record;
342
+ const sameActor = binding.actor.type === expected.actor.type && binding.actor.id === expected.actor.id;
343
+ if (!sameActor ||
344
+ binding.worktreeId !== expected.worktreeId ||
345
+ binding.skillId !== expected.skillId) {
346
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.BINDING_MISMATCH);
347
+ }
348
+ if (!record.dto.removable)
349
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.NOT_INSTALLABLE);
350
+ if (observed.branch !== binding.branch ||
351
+ observed.headCommit !== binding.headCommit ||
352
+ observed.currentTreeHash !== binding.currentTreeHash ||
353
+ observed.receiptDigest === null ||
354
+ !(0, integrity_1.digestMatches)(observed.receiptDigest, binding.receiptDigest)) {
355
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.STALE);
356
+ }
357
+ record.consumedAt = now;
358
+ return record;
359
+ }
360
+ /** Drop a plan. Safe to call twice. */
361
+ function discardSkillUninstallPlan(token) {
362
+ cache.records.delete(token);
363
+ }
364
+ /** @internal */
365
+ function resetSkillUninstallPlanCacheForTesting() {
366
+ cache.records.clear();
367
+ }
368
+ /** @internal Number of plans currently held. */
369
+ function getSkillUninstallPlanCount() {
370
+ return cache.records.size;
371
+ }
372
+ /**
373
+ * Assess the install root and register a plan under a fresh token.
374
+ *
375
+ * A non-removable assessment still produces a plan: the user is entitled to see
376
+ * *which* file is blocking and why, and #1233 established that a plan the apply
377
+ * step will refuse is more useful than an opaque error. Apply declines to spend
378
+ * such a token, so the preview cannot become a delete by accident.
379
+ *
380
+ * @throws SkillPlanError — `NOT_FOUND` when nothing is installed at the target.
381
+ */
382
+ function createSkillUninstallPlan(input) {
383
+ if (!constants_1.SKILL_ID_PATTERN.test(input.skillId) || input.skillId.length > constants_1.SKILL_ID_MAX_LENGTH) {
384
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.TARGET_UNSAFE);
385
+ }
386
+ const now = input.now ?? Date.now();
387
+ const assessment = assessSkillUninstall(input.installRootAbs, input.skillId);
388
+ if (!assessment.present) {
389
+ throw new install_plan_1.SkillPlanError(install_plan_1.SkillPlanErrorCode.NOT_FOUND);
390
+ }
391
+ const token = (0, crypto_1.randomBytes)(SKILL_UNINSTALL_PLAN_TOKEN_BYTES).toString('hex');
392
+ const expiresAt = now + install_plan_1.SKILL_PLAN_TTL_MS;
393
+ const receipt = assessment.receipt;
394
+ const receiptEntry = assessment.entries.find((entry) => entry.generated) ?? null;
395
+ const binding = {
396
+ actor: input.actor,
397
+ operation: 'uninstall',
398
+ worktreeId: input.worktree.id,
399
+ skillId: input.skillId,
400
+ version: receipt?.version ?? '',
401
+ receiptDigest: assessment.receiptDigest ?? '',
402
+ branch: input.git.branch,
403
+ headCommit: input.git.headCommit,
404
+ currentTreeHash: assessment.currentTreeHash,
405
+ };
406
+ const dto = {
407
+ token,
408
+ expiresAt: new Date(expiresAt).toISOString().replace(/\.\d{3}Z$/, 'Z'),
409
+ removable: assessment.removable,
410
+ blockers: assessment.blockers,
411
+ nextActionKey: assessment.removable
412
+ ? exports.SKILL_UNINSTALL_NEXT_ACTION_KEYS.removable
413
+ : exports.SKILL_UNINSTALL_NEXT_ACTION_KEYS.blocked,
414
+ target: {
415
+ worktreeId: input.worktree.id,
416
+ worktreeName: input.worktree.name,
417
+ repositoryName: input.worktree.repositoryName,
418
+ branch: input.git.branch,
419
+ headState: input.git.headState,
420
+ headCommit: input.git.headCommit,
421
+ workingTreeDirty: input.git.dirty,
422
+ installRoot: assessment.installRoot,
423
+ currentTreeHash: assessment.currentTreeHash,
424
+ },
425
+ skill: {
426
+ id: input.skillId,
427
+ version: receipt?.version ?? '',
428
+ source: receipt
429
+ ? { ...receipt.source }
430
+ : { repository: '', ref: '', commit: '' },
431
+ artifact: {
432
+ assetName: receipt?.artifact.asset_name ?? '',
433
+ sha256: receipt?.artifact.sha256 ?? '',
434
+ },
435
+ effectiveRisk: receipt?.effective_risk ?? 'low',
436
+ agents: (receipt?.agent_compatibility ?? []).map((entry) => ({
437
+ agent: entry.agent,
438
+ support: entry.support,
439
+ messageKey: exports.SKILL_UNINSTALL_RELOAD_MESSAGE_KEYS[entry.support],
440
+ })),
441
+ },
442
+ receipt: {
443
+ path: `${assessment.installRoot}/${install_plan_1.SKILL_RECEIPT_FILENAME}`,
444
+ sha256: assessment.receiptDigest ?? '',
445
+ size: receiptEntry?.size ?? 0,
446
+ },
447
+ removals: assessment.entries.filter((entry) => entry.disposition === 'remove'),
448
+ retained: assessment.entries.filter((entry) => entry.disposition !== 'remove'),
449
+ stats: assessment.stats,
450
+ };
451
+ const record = {
452
+ token,
453
+ binding,
454
+ bindingHash: computeSkillUninstallBindingHash(binding),
455
+ createdAt: now,
456
+ expiresAt,
457
+ consumedAt: null,
458
+ worktreePath: input.worktree.path,
459
+ // A blocked plan has no trusted receipt; apply refuses it before this is read.
460
+ receipt: receipt ?? {},
461
+ assessment,
462
+ dto,
463
+ };
464
+ sweep(now);
465
+ cache.records.set(token, record);
466
+ return record;
467
+ }
468
+ /**
469
+ * Digest of the receipt currently on disk, or null when there is none.
470
+ *
471
+ * Apply re-reads this immediately before spending the token, so a reinstall
472
+ * between plan and apply is drift rather than a silent substitution.
473
+ */
474
+ function readSkillReceiptDigest(existing) {
475
+ const file = existing.files.find((entry) => entry.path === install_plan_1.SKILL_RECEIPT_FILENAME);
476
+ if (!file)
477
+ return null;
478
+ return (0, install_plan_1.parseInstalledReceipt)(file.bytes) === null ? null : (0, integrity_1.computeSha256Hex)(file.bytes);
479
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * Agent Skills distribution contract types (Issue #1228)
4
+ *
5
+ * Canonical TypeScript shapes for the four documents of the distribution
6
+ * contract. See docs/design/agent-skills-distribution.md for the ADR that
7
+ * fixes the semantics of every field below.
8
+ *
9
+ * Ownership of each display field (Issue #1232):
10
+ * - manifest : capability, expected outcome, provider, license, permissions
11
+ * - catalog : version, changelog, resolved commit SHA, artifact info
12
+ * - inspection: scripts / executables / computed risk
13
+ * - receipt : what actually landed in the worktree
14
+ *
15
+ * @module types/skills
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.11.4",
3
+ "version": "0.12.1",
4
4
  "description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
5
5
  "keywords": [
6
6
  "claude-code",