agor-live 0.9.2 → 0.9.3

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 (245) hide show
  1. package/dist/cli/commands/admin/add-to-worktree-group.d.ts +2 -0
  2. package/dist/cli/commands/admin/add-to-worktree-group.js +22 -8
  3. package/dist/cli/commands/admin/create-symlink.d.ts +2 -0
  4. package/dist/cli/commands/admin/create-symlink.js +25 -10
  5. package/dist/cli/commands/admin/create-worktree-group.d.ts +2 -0
  6. package/dist/cli/commands/admin/create-worktree-group.js +22 -6
  7. package/dist/cli/commands/admin/delete-user.d.ts +2 -0
  8. package/dist/cli/commands/admin/delete-user.js +23 -9
  9. package/dist/cli/commands/admin/delete-worktree-group.d.ts +2 -0
  10. package/dist/cli/commands/admin/delete-worktree-group.js +25 -9
  11. package/dist/cli/commands/admin/ensure-user.d.ts +2 -0
  12. package/dist/cli/commands/admin/ensure-user.js +30 -10
  13. package/dist/cli/commands/admin/remove-from-worktree-group.d.ts +2 -0
  14. package/dist/cli/commands/admin/remove-from-worktree-group.js +23 -9
  15. package/dist/cli/commands/admin/remove-symlink.d.ts +2 -0
  16. package/dist/cli/commands/admin/remove-symlink.js +23 -8
  17. package/dist/cli/commands/admin/sync-unix.d.ts +8 -4
  18. package/dist/cli/commands/admin/sync-unix.js +446 -139
  19. package/dist/cli/commands/admin/sync-user-symlinks.d.ts +2 -0
  20. package/dist/cli/commands/admin/sync-user-symlinks.js +24 -7
  21. package/dist/core/api/index.d.cts +8 -8
  22. package/dist/core/api/index.d.ts +8 -8
  23. package/dist/core/{board-B2Z7GiJs.d.cts → board-BGkmgUH3.d.cts} +1 -1
  24. package/dist/core/{board-C_w2_4Zm.d.ts → board-CKJQAhxz.d.ts} +1 -1
  25. package/dist/core/{board-comment-CaUiaZB5.d.cts → board-comment-D9NA4gOJ.d.cts} +1 -1
  26. package/dist/core/{board-comment-BCrDUioT.d.ts → board-comment-rH4c6eVl.d.ts} +1 -1
  27. package/dist/core/claude/index.cjs +8 -0
  28. package/dist/core/claude/index.d.cts +3 -3
  29. package/dist/core/claude/index.d.ts +3 -3
  30. package/dist/core/claude/index.js +8 -0
  31. package/dist/core/{client-C0m4gTNP.d.ts → client-By3Q6aQA.d.ts} +40 -4
  32. package/dist/core/{client-DTvy8AsA.d.cts → client-KDgnPBwr.d.cts} +40 -4
  33. package/dist/core/config/browser.d.cts +6 -2
  34. package/dist/core/config/browser.d.ts +6 -2
  35. package/dist/core/config/index.cjs +51 -0
  36. package/dist/core/config/index.d.cts +50 -8
  37. package/dist/core/config/index.d.ts +50 -8
  38. package/dist/core/config/index.js +48 -0
  39. package/dist/core/db/index.cjs +11 -0
  40. package/dist/core/db/index.d.cts +47 -11
  41. package/dist/core/db/index.d.ts +47 -11
  42. package/dist/core/db/index.js +11 -0
  43. package/dist/core/drizzle/postgres/0008_add_repos_unix_group.sql +6 -0
  44. package/dist/core/drizzle/postgres/meta/_journal.json +7 -0
  45. package/dist/core/drizzle/sqlite/0020_add_repos_unix_group.sql +6 -0
  46. package/dist/core/drizzle/sqlite/meta/_journal.json +7 -0
  47. package/dist/core/environment/variable-resolver.d.cts +2 -2
  48. package/dist/core/environment/variable-resolver.d.ts +2 -2
  49. package/dist/core/git/index.cjs +181 -22
  50. package/dist/core/git/index.d.cts +3 -0
  51. package/dist/core/git/index.d.ts +3 -0
  52. package/dist/core/git/index.js +171 -12
  53. package/dist/core/{id-DMqyogFB.d.cts → id-BwPJtWxW.d.cts} +10 -1
  54. package/dist/core/{id-DMqyogFB.d.ts → id-BwPJtWxW.d.ts} +10 -1
  55. package/dist/core/index.cjs +848 -51
  56. package/dist/core/index.d.cts +12 -12
  57. package/dist/core/index.d.ts +12 -12
  58. package/dist/core/index.js +834 -52
  59. package/dist/core/lib/feathers-validation.cjs +22 -0
  60. package/dist/core/lib/feathers-validation.d.cts +7 -0
  61. package/dist/core/lib/feathers-validation.d.ts +7 -0
  62. package/dist/core/lib/feathers-validation.js +22 -0
  63. package/dist/core/{mcp-DSOuQVMG.d.ts → mcp-C-LwrhHt.d.ts} +1 -1
  64. package/dist/core/{mcp-DkU4JIC7.d.cts → mcp-oU9TGu_S.d.cts} +1 -1
  65. package/dist/core/{message-jqh1J_89.d.cts → message-BFjPtffm.d.cts} +1 -1
  66. package/dist/core/{message-DsJfWcNC.d.ts → message-Di6ZwIjG.d.ts} +1 -1
  67. package/dist/core/models/index.cjs +12 -1
  68. package/dist/core/models/index.d.cts +4 -1
  69. package/dist/core/models/index.d.ts +4 -1
  70. package/dist/core/models/index.js +12 -1
  71. package/dist/core/permissions/index.d.cts +2 -2
  72. package/dist/core/permissions/index.d.ts +2 -2
  73. package/dist/core/{repo-iiGdqI89.d.ts → repo-DbOIBw1c.d.cts} +19 -5
  74. package/dist/core/{repo-B_5-1Rbq.d.cts → repo-DkEPOBbI.d.ts} +19 -5
  75. package/dist/core/seed/index.cjs +2223 -52
  76. package/dist/core/seed/index.d.cts +1 -1
  77. package/dist/core/seed/index.d.ts +1 -1
  78. package/dist/core/seed/index.js +2207 -37
  79. package/dist/core/{session-DNQuNe8l.d.cts → session-DE9tT7Cm.d.cts} +1 -1
  80. package/dist/core/{session-MSmLRIxg.d.ts → session-DrzT_Csl.d.ts} +1 -1
  81. package/dist/core/{task-Ct74zwxQ.d.ts → task-D0i_mU9u.d.ts} +1 -1
  82. package/dist/core/{task-aE2IEwMQ.d.cts → task-D5cWUcAY.d.cts} +1 -1
  83. package/dist/core/templates/session-context.d.cts +3 -3
  84. package/dist/core/templates/session-context.d.ts +3 -3
  85. package/dist/core/tools/mcp/jwt-auth.d.cts +2 -2
  86. package/dist/core/tools/mcp/jwt-auth.d.ts +2 -2
  87. package/dist/core/types/index.d.cts +11 -11
  88. package/dist/core/types/index.d.ts +11 -11
  89. package/dist/core/unix/index.cjs +1008 -48
  90. package/dist/core/unix/index.d.cts +444 -52
  91. package/dist/core/unix/index.d.ts +444 -52
  92. package/dist/core/unix/index.js +995 -47
  93. package/dist/core/{user-BkP2saWK.d.ts → user-CMQOATsn.d.ts} +2 -2
  94. package/dist/core/{user-1-Yd2Hix.d.cts → user-zv1BTkAp.d.cts} +2 -2
  95. package/dist/core/utils/permission-mode-mapper.d.cts +2 -2
  96. package/dist/core/utils/permission-mode-mapper.d.ts +2 -2
  97. package/dist/daemon/index.js +311 -116
  98. package/dist/daemon/services/repos.d.ts +7 -0
  99. package/dist/daemon/services/repos.js +37 -2
  100. package/dist/daemon/services/terminals.js +117 -75
  101. package/dist/daemon/services/unix-integration.d.ts +1 -0
  102. package/dist/daemon/services/unix-integration.js +3 -1
  103. package/dist/daemon/services/worktree-owners.js +28 -4
  104. package/dist/executor/handlers/sdk/base-executor.d.ts +1 -1
  105. package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
  106. package/dist/executor/handlers/sdk/base-executor.js +2 -1
  107. package/dist/executor/index.d.ts.map +1 -1
  108. package/dist/executor/index.js +2 -1
  109. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -1
  110. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
  111. package/dist/executor/sdk-handlers/claude/claude-tool.js +4 -2
  112. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +6 -35
  113. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
  114. package/dist/executor/sdk-handlers/claude/prompt-service.js +18 -149
  115. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +1 -0
  116. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  117. package/dist/executor/sdk-handlers/claude/query-builder.js +8 -1
  118. package/dist/executor/sdk-handlers/codex/models.d.ts +5 -1
  119. package/dist/executor/sdk-handlers/codex/models.d.ts.map +1 -1
  120. package/dist/executor/sdk-handlers/codex/models.js +12 -2
  121. package/dist/executor/sdk-handlers/opencode/client.d.ts +108 -0
  122. package/dist/executor/sdk-handlers/opencode/client.d.ts.map +1 -0
  123. package/dist/executor/sdk-handlers/opencode/client.js +366 -0
  124. package/dist/ui/assets/{_basePickBy-DMrA2UBq.js → _basePickBy-CSYiZMse.js} +1 -1
  125. package/dist/ui/assets/_basePickBy-CSYiZMse.js.gz +0 -0
  126. package/dist/ui/assets/{_baseUniq-DfeKfoi5.js → _baseUniq-DvtGUhEt.js} +1 -1
  127. package/dist/ui/assets/_baseUniq-DvtGUhEt.js.gz +0 -0
  128. package/dist/ui/assets/{arc-COihOExQ.js → arc-BRr5j3D1.js} +1 -1
  129. package/dist/ui/assets/arc-BRr5j3D1.js.gz +0 -0
  130. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-Dh9Y1lpA.js → architectureDiagram-VXUJARFQ-ebBOi_gK.js} +1 -1
  131. package/dist/ui/assets/architectureDiagram-VXUJARFQ-ebBOi_gK.js.gz +0 -0
  132. package/dist/ui/assets/{blockDiagram-VD42YOAC-DmhO-9GG.js → blockDiagram-VD42YOAC-DxejLyQ-.js} +1 -1
  133. package/dist/ui/assets/blockDiagram-VD42YOAC-DxejLyQ-.js.gz +0 -0
  134. package/dist/ui/assets/{c4Diagram-YG6GDRKO-GWzw3hUe.js → c4Diagram-YG6GDRKO-DFKl-efs.js} +1 -1
  135. package/dist/ui/assets/c4Diagram-YG6GDRKO-DFKl-efs.js.gz +0 -0
  136. package/dist/ui/assets/channel-D2mEA-Bx.js +1 -0
  137. package/dist/ui/assets/{chunk-4BX2VUAB-DHjZozeY.js → chunk-4BX2VUAB-jMOQ1WDz.js} +1 -1
  138. package/dist/ui/assets/{chunk-55IACEB6-CzT5_rQs.js → chunk-55IACEB6-D1M6UwZY.js} +1 -1
  139. package/dist/ui/assets/{chunk-B4BG7PRW-BI7tsYTf.js → chunk-B4BG7PRW-COzn6OFE.js} +1 -1
  140. package/dist/ui/assets/chunk-B4BG7PRW-COzn6OFE.js.gz +0 -0
  141. package/dist/ui/assets/{chunk-DI55MBZ5-CaeHia7B.js → chunk-DI55MBZ5-6QssijTz.js} +1 -1
  142. package/dist/ui/assets/chunk-DI55MBZ5-6QssijTz.js.gz +0 -0
  143. package/dist/ui/assets/{chunk-FMBD7UC4-D4XpMA5J.js → chunk-FMBD7UC4-BnG1D5CH.js} +1 -1
  144. package/dist/ui/assets/{chunk-QN33PNHL-M3muhamw.js → chunk-QN33PNHL-C6hCjMzw.js} +1 -1
  145. package/dist/ui/assets/{chunk-QZHKN3VN-Cd-EqjIc.js → chunk-QZHKN3VN-CKLJgdZH.js} +1 -1
  146. package/dist/ui/assets/{chunk-TZMSLE5B-CeGmvyG4.js → chunk-TZMSLE5B-DYJXqHip.js} +1 -1
  147. package/dist/ui/assets/chunk-TZMSLE5B-DYJXqHip.js.gz +0 -0
  148. package/dist/ui/assets/classDiagram-2ON5EDUG-CQUXqjFU.js +1 -0
  149. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CQUXqjFU.js +1 -0
  150. package/dist/ui/assets/clone-DLz_t3PG.js +1 -0
  151. package/dist/ui/assets/{cose-bilkent-S5V4N54A-DWVeqF4E.js → cose-bilkent-S5V4N54A-DBdRhd2a.js} +1 -1
  152. package/dist/ui/assets/cose-bilkent-S5V4N54A-DBdRhd2a.js.gz +0 -0
  153. package/dist/ui/assets/{dagre-6UL2VRFP-Drcpoogc.js → dagre-6UL2VRFP-BURrt6xz.js} +1 -1
  154. package/dist/ui/assets/dagre-6UL2VRFP-BURrt6xz.js.gz +0 -0
  155. package/dist/ui/assets/{diagram-PSM6KHXK-DhjMaKx8.js → diagram-PSM6KHXK-yPFDWvxo.js} +1 -1
  156. package/dist/ui/assets/diagram-PSM6KHXK-yPFDWvxo.js.gz +0 -0
  157. package/dist/ui/assets/{diagram-QEK2KX5R-rznnOwEg.js → diagram-QEK2KX5R-DQP7GvBM.js} +1 -1
  158. package/dist/ui/assets/diagram-QEK2KX5R-DQP7GvBM.js.gz +0 -0
  159. package/dist/ui/assets/{diagram-S2PKOQOG-B6ANwV6f.js → diagram-S2PKOQOG-Ceh9L5Ft.js} +1 -1
  160. package/dist/ui/assets/diagram-S2PKOQOG-Ceh9L5Ft.js.gz +0 -0
  161. package/dist/ui/assets/{erDiagram-Q2GNP2WA-DFauwyhe.js → erDiagram-Q2GNP2WA-BGBdyrlr.js} +1 -1
  162. package/dist/ui/assets/erDiagram-Q2GNP2WA-BGBdyrlr.js.gz +0 -0
  163. package/dist/ui/assets/{flowDiagram-NV44I4VS-DTZrS570.js → flowDiagram-NV44I4VS-BXuoem71.js} +1 -1
  164. package/dist/ui/assets/flowDiagram-NV44I4VS-BXuoem71.js.gz +0 -0
  165. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-D3WfTah6.js → ganttDiagram-LVOFAZNH-D96TAOYN.js} +1 -1
  166. package/dist/ui/assets/ganttDiagram-LVOFAZNH-D96TAOYN.js.gz +0 -0
  167. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-D_qGOTCz.js → gitGraphDiagram-NY62KEGX-CsUtGEJW.js} +1 -1
  168. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CsUtGEJW.js.gz +0 -0
  169. package/dist/ui/assets/{graph-CSzBsFCf.js → graph-DmuZZZ0O.js} +1 -1
  170. package/dist/ui/assets/graph-DmuZZZ0O.js.gz +0 -0
  171. package/dist/ui/assets/{index-B8J_dCmD.js → index-DPUzz4vA.js} +212 -212
  172. package/dist/ui/assets/index-DPUzz4vA.js.gz +0 -0
  173. package/dist/ui/assets/{infoDiagram-ER5ION4S-CFy9rNRq.js → infoDiagram-ER5ION4S-DcxAd1Yp.js} +1 -1
  174. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CNKnT6H_.js → journeyDiagram-XKPGCS4Q-CFtlwkTr.js} +1 -1
  175. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CFtlwkTr.js.gz +0 -0
  176. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CI79vQJo.js → kanban-definition-3W4ZIXB7-B74pWt6y.js} +1 -1
  177. package/dist/ui/assets/kanban-definition-3W4ZIXB7-B74pWt6y.js.gz +0 -0
  178. package/dist/ui/assets/{layout-Ca7tbZ8Q.js → layout-DpFHdru9.js} +1 -1
  179. package/dist/ui/assets/layout-DpFHdru9.js.gz +0 -0
  180. package/dist/ui/assets/{linear-zhivmWSN.js → linear-yVuUIGbC.js} +1 -1
  181. package/dist/ui/assets/linear-yVuUIGbC.js.gz +0 -0
  182. package/dist/ui/assets/{mermaid.core-CJibjqo3.js → mermaid.core-CbMbakdH.js} +5 -5
  183. package/dist/ui/assets/mermaid.core-CbMbakdH.js.gz +0 -0
  184. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-Bp2_St3w.js → mindmap-definition-VGOIOE7T-XYo0CUDk.js} +1 -1
  185. package/dist/ui/assets/mindmap-definition-VGOIOE7T-XYo0CUDk.js.gz +0 -0
  186. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BcDk4l3F.js → pieDiagram-ADFJNKIX-b64mzYsL.js} +1 -1
  187. package/dist/ui/assets/pieDiagram-ADFJNKIX-b64mzYsL.js.gz +0 -0
  188. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-DZAU4umx.js → quadrantDiagram-AYHSOK5B-CzbNszXu.js} +1 -1
  189. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-CzbNszXu.js.gz +0 -0
  190. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-iT39TNxt.js → requirementDiagram-UZGBJVZJ-ftflJl3O.js} +1 -1
  191. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-ftflJl3O.js.gz +0 -0
  192. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-rZFAR-Mw.js → sankeyDiagram-TZEHDZUN-8PGribEE.js} +1 -1
  193. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-8PGribEE.js.gz +0 -0
  194. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-WaQuG71V.js → sequenceDiagram-WL72ISMW-B14pbZEr.js} +1 -1
  195. package/dist/ui/assets/sequenceDiagram-WL72ISMW-B14pbZEr.js.gz +0 -0
  196. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-DhTWu848.js → stateDiagram-FKZM4ZOC-Ddx2Kkc3.js} +1 -1
  197. package/dist/ui/assets/stateDiagram-FKZM4ZOC-Ddx2Kkc3.js.gz +0 -0
  198. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-ppKXpQQ4.js +1 -0
  199. package/dist/ui/assets/{timeline-definition-IT6M3QCI-CQI3TYGs.js → timeline-definition-IT6M3QCI-bS_0u_jC.js} +1 -1
  200. package/dist/ui/assets/timeline-definition-IT6M3QCI-bS_0u_jC.js.gz +0 -0
  201. package/dist/ui/assets/{treemap-KMMF4GRG-DX1wuI5d.js → treemap-KMMF4GRG-CZHIJMKL.js} +1 -1
  202. package/dist/ui/assets/{treemap-KMMF4GRG-DX1wuI5d.js.gz → treemap-KMMF4GRG-CZHIJMKL.js.gz} +0 -0
  203. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-Dc89CZjQ.js → xychartDiagram-PRI3JC2R-DOTWxgqQ.js} +1 -1
  204. package/dist/ui/assets/xychartDiagram-PRI3JC2R-DOTWxgqQ.js.gz +0 -0
  205. package/dist/ui/index.html +2 -2
  206. package/package.json +2 -2
  207. package/dist/ui/assets/_basePickBy-DMrA2UBq.js.gz +0 -0
  208. package/dist/ui/assets/_baseUniq-DfeKfoi5.js.gz +0 -0
  209. package/dist/ui/assets/arc-COihOExQ.js.gz +0 -0
  210. package/dist/ui/assets/architectureDiagram-VXUJARFQ-Dh9Y1lpA.js.gz +0 -0
  211. package/dist/ui/assets/blockDiagram-VD42YOAC-DmhO-9GG.js.gz +0 -0
  212. package/dist/ui/assets/c4Diagram-YG6GDRKO-GWzw3hUe.js.gz +0 -0
  213. package/dist/ui/assets/channel-B2VqS1IB.js +0 -1
  214. package/dist/ui/assets/chunk-B4BG7PRW-BI7tsYTf.js.gz +0 -0
  215. package/dist/ui/assets/chunk-DI55MBZ5-CaeHia7B.js.gz +0 -0
  216. package/dist/ui/assets/chunk-TZMSLE5B-CeGmvyG4.js.gz +0 -0
  217. package/dist/ui/assets/classDiagram-2ON5EDUG-87L6YkKc.js +0 -1
  218. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-87L6YkKc.js +0 -1
  219. package/dist/ui/assets/clone-BsP0qV6M.js +0 -1
  220. package/dist/ui/assets/cose-bilkent-S5V4N54A-DWVeqF4E.js.gz +0 -0
  221. package/dist/ui/assets/dagre-6UL2VRFP-Drcpoogc.js.gz +0 -0
  222. package/dist/ui/assets/diagram-PSM6KHXK-DhjMaKx8.js.gz +0 -0
  223. package/dist/ui/assets/diagram-QEK2KX5R-rznnOwEg.js.gz +0 -0
  224. package/dist/ui/assets/diagram-S2PKOQOG-B6ANwV6f.js.gz +0 -0
  225. package/dist/ui/assets/erDiagram-Q2GNP2WA-DFauwyhe.js.gz +0 -0
  226. package/dist/ui/assets/flowDiagram-NV44I4VS-DTZrS570.js.gz +0 -0
  227. package/dist/ui/assets/ganttDiagram-LVOFAZNH-D3WfTah6.js.gz +0 -0
  228. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-D_qGOTCz.js.gz +0 -0
  229. package/dist/ui/assets/graph-CSzBsFCf.js.gz +0 -0
  230. package/dist/ui/assets/index-B8J_dCmD.js.gz +0 -0
  231. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CNKnT6H_.js.gz +0 -0
  232. package/dist/ui/assets/kanban-definition-3W4ZIXB7-CI79vQJo.js.gz +0 -0
  233. package/dist/ui/assets/layout-Ca7tbZ8Q.js.gz +0 -0
  234. package/dist/ui/assets/linear-zhivmWSN.js.gz +0 -0
  235. package/dist/ui/assets/mermaid.core-CJibjqo3.js.gz +0 -0
  236. package/dist/ui/assets/mindmap-definition-VGOIOE7T-Bp2_St3w.js.gz +0 -0
  237. package/dist/ui/assets/pieDiagram-ADFJNKIX-BcDk4l3F.js.gz +0 -0
  238. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DZAU4umx.js.gz +0 -0
  239. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-iT39TNxt.js.gz +0 -0
  240. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-rZFAR-Mw.js.gz +0 -0
  241. package/dist/ui/assets/sequenceDiagram-WL72ISMW-WaQuG71V.js.gz +0 -0
  242. package/dist/ui/assets/stateDiagram-FKZM4ZOC-DhTWu848.js.gz +0 -0
  243. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DgyTzobH.js +0 -1
  244. package/dist/ui/assets/timeline-definition-IT6M3QCI-CQI3TYGs.js.gz +0 -0
  245. package/dist/ui/assets/xychartDiagram-PRI3JC2R-Dc89CZjQ.js.gz +0 -0
@@ -7,6 +7,8 @@ declare class AddToWorktreeGroup extends Command {
7
7
  static flags: {
8
8
  username: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
9
  group: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
10
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
11
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -1,11 +1,11 @@
1
1
  // src/commands/admin/add-to-worktree-group.ts
2
- import { execSync } from "child_process";
3
- import { UnixGroupCommands } from "@agor/core/unix";
2
+ import { createAdminExecutor, UnixGroupCommands } from "@agor/core/unix";
4
3
  import { Command, Flags } from "@oclif/core";
5
4
  var AddToWorktreeGroup = class _AddToWorktreeGroup extends Command {
6
5
  static description = "Add a user to a worktree Unix group (admin only)";
7
6
  static examples = [
8
- "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447"
7
+ "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447",
8
+ "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447 --dry-run"
9
9
  ];
10
10
  static flags = {
11
11
  username: Flags.string({
@@ -17,19 +17,33 @@ var AddToWorktreeGroup = class _AddToWorktreeGroup extends Command {
17
17
  char: "g",
18
18
  description: "Unix group name (e.g., agor_wt_03b62447)",
19
19
  required: true
20
+ }),
21
+ "dry-run": Flags.boolean({
22
+ char: "n",
23
+ description: "Show what would be done without making changes",
24
+ default: false
25
+ }),
26
+ verbose: Flags.boolean({
27
+ char: "v",
28
+ description: "Show detailed output including command stdout/stderr",
29
+ default: false
20
30
  })
21
31
  };
22
32
  async run() {
23
33
  const { flags } = await this.parse(_AddToWorktreeGroup);
24
- const { username, group } = flags;
25
- try {
26
- execSync(UnixGroupCommands.isUserInGroup(username, group), { stdio: "ignore" });
34
+ const { username, group, verbose } = flags;
35
+ const dryRun = flags["dry-run"];
36
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
37
+ if (dryRun) {
38
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
39
+ }
40
+ const isInGroup = await executor.check(UnixGroupCommands.isUserInGroup(username, group));
41
+ if (isInGroup) {
27
42
  this.log(`\u2705 User ${username} is already in group ${group}`);
28
43
  return;
29
- } catch {
30
44
  }
31
45
  try {
32
- execSync(UnixGroupCommands.addUserToGroup(username, group), { stdio: "inherit" });
46
+ await executor.exec(UnixGroupCommands.addUserToGroup(username, group));
33
47
  this.log(`\u2705 Added user ${username} to group ${group}`);
34
48
  } catch (error) {
35
49
  this.error(`Failed to add user ${username} to group ${group}: ${error}`);
@@ -9,6 +9,8 @@ declare class CreateSymlink extends Command {
9
9
  'worktree-name': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
10
10
  'worktree-path': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
11
11
  'home-base': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
12
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
13
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
12
14
  };
13
15
  run(): Promise<void>;
14
16
  }
@@ -1,7 +1,7 @@
1
1
  // src/commands/admin/create-symlink.ts
2
- import { execSync } from "child_process";
3
2
  import {
4
3
  AGOR_HOME_BASE,
4
+ createAdminExecutor,
5
5
  getWorktreeSymlinkPath,
6
6
  isValidUnixUsername,
7
7
  SymlinkCommands
@@ -10,7 +10,8 @@ import { Command, Flags } from "@oclif/core";
10
10
  var CreateSymlink = class _CreateSymlink extends Command {
11
11
  static description = "Create a worktree symlink in user home directory (admin only)";
12
12
  static examples = [
13
- "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature --worktree-path /var/agor/worktrees/abc123"
13
+ "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature --worktree-path /var/agor/worktrees/abc123",
14
+ "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature --worktree-path /var/agor/worktrees/abc123 --dry-run"
14
15
  ];
15
16
  static flags = {
16
17
  username: Flags.string({
@@ -19,7 +20,7 @@ var CreateSymlink = class _CreateSymlink extends Command {
19
20
  required: true
20
21
  }),
21
22
  "worktree-name": Flags.string({
22
- char: "n",
23
+ char: "w",
23
24
  description: "Worktree name/slug (symlink name)",
24
25
  required: true
25
26
  }),
@@ -31,14 +32,29 @@ var CreateSymlink = class _CreateSymlink extends Command {
31
32
  "home-base": Flags.string({
32
33
  description: "Base directory for home directories",
33
34
  default: AGOR_HOME_BASE
35
+ }),
36
+ "dry-run": Flags.boolean({
37
+ char: "n",
38
+ description: "Show what would be done without making changes",
39
+ default: false
40
+ }),
41
+ verbose: Flags.boolean({
42
+ char: "v",
43
+ description: "Show detailed output including command stdout/stderr",
44
+ default: false
34
45
  })
35
46
  };
36
47
  async run() {
37
48
  const { flags } = await this.parse(_CreateSymlink);
38
- const { username } = flags;
49
+ const { username, verbose } = flags;
39
50
  const worktreeName = flags["worktree-name"];
40
51
  const worktreePath = flags["worktree-path"];
41
52
  const homeBase = flags["home-base"];
53
+ const dryRun = flags["dry-run"];
54
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
55
+ if (dryRun) {
56
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
57
+ }
42
58
  if (!isValidUnixUsername(username)) {
43
59
  this.error(`Invalid Unix username format: ${username}`);
44
60
  }
@@ -47,9 +63,8 @@ var CreateSymlink = class _CreateSymlink extends Command {
47
63
  }
48
64
  const linkPath = getWorktreeSymlinkPath(username, worktreeName, homeBase);
49
65
  try {
50
- const existingTarget = execSync(SymlinkCommands.readSymlink(linkPath), {
51
- encoding: "utf-8"
52
- }).trim();
66
+ const result = await executor.exec(SymlinkCommands.readSymlink(linkPath));
67
+ const existingTarget = result.stdout.trim();
53
68
  if (existingTarget === worktreePath) {
54
69
  this.log(`\u2705 Symlink already exists: ${linkPath} -> ${worktreePath}`);
55
70
  return;
@@ -58,9 +73,9 @@ var CreateSymlink = class _CreateSymlink extends Command {
58
73
  } catch {
59
74
  }
60
75
  try {
61
- execSync(SymlinkCommands.createSymlinkWithOwnership(worktreePath, linkPath, username), {
62
- stdio: "inherit"
63
- });
76
+ await executor.execAll(
77
+ SymlinkCommands.createSymlinkWithOwnership(worktreePath, linkPath, username)
78
+ );
64
79
  this.log(`\u2705 Created symlink: ${linkPath} -> ${worktreePath}`);
65
80
  } catch (error) {
66
81
  this.error(`Failed to create symlink: ${error}`);
@@ -6,6 +6,8 @@ declare class CreateWorktreeGroup extends Command {
6
6
  static examples: string[];
7
7
  static flags: {
8
8
  'worktree-id': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
10
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
9
11
  };
10
12
  run(): Promise<void>;
11
13
  }
@@ -1,6 +1,6 @@
1
1
  // src/commands/admin/create-worktree-group.ts
2
- import { execSync } from "child_process";
3
2
  import {
3
+ createAdminExecutor,
4
4
  generateWorktreeGroupName,
5
5
  isValidWorktreeGroupName,
6
6
  UnixGroupCommands
@@ -9,30 +9,46 @@ import { Command, Flags } from "@oclif/core";
9
9
  var CreateWorktreeGroup = class _CreateWorktreeGroup extends Command {
10
10
  static description = "Create a Unix group for a worktree (admin only)";
11
11
  static examples = [
12
- "<%= config.bin %> <%= command.id %> --worktree-id 03b62447-f2c6-4259-997b-d38ed1ddafed"
12
+ "<%= config.bin %> <%= command.id %> --worktree-id 03b62447-f2c6-4259-997b-d38ed1ddafed",
13
+ "<%= config.bin %> <%= command.id %> --worktree-id 03b62447-f2c6-4259-997b-d38ed1ddafed --dry-run"
13
14
  ];
14
15
  static flags = {
15
16
  "worktree-id": Flags.string({
16
17
  char: "w",
17
18
  description: "Worktree ID (full UUID)",
18
19
  required: true
20
+ }),
21
+ "dry-run": Flags.boolean({
22
+ char: "n",
23
+ description: "Show what would be done without making changes",
24
+ default: false
25
+ }),
26
+ verbose: Flags.boolean({
27
+ char: "v",
28
+ description: "Show detailed output including command stdout/stderr",
29
+ default: false
19
30
  })
20
31
  };
21
32
  async run() {
22
33
  const { flags } = await this.parse(_CreateWorktreeGroup);
23
34
  const worktreeId = flags["worktree-id"];
35
+ const dryRun = flags["dry-run"];
36
+ const verbose = flags.verbose;
37
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
38
+ if (dryRun) {
39
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
40
+ }
24
41
  const groupName = generateWorktreeGroupName(worktreeId);
25
42
  if (!isValidWorktreeGroupName(groupName)) {
26
43
  this.error(`Invalid group name format: ${groupName}`);
27
44
  }
28
- try {
29
- execSync(UnixGroupCommands.groupExists(groupName), { stdio: "ignore" });
45
+ const groupExists = await executor.check(UnixGroupCommands.groupExists(groupName));
46
+ if (groupExists) {
30
47
  this.log(`\u2705 Group ${groupName} already exists`);
31
48
  return;
32
- } catch {
33
49
  }
34
50
  try {
35
- execSync(UnixGroupCommands.createGroup(groupName), { stdio: "inherit" });
51
+ await executor.exec(UnixGroupCommands.createGroup(groupName));
36
52
  this.log(`\u2705 Created Unix group: ${groupName}`);
37
53
  } catch (error) {
38
54
  this.error(`Failed to create group ${groupName}: ${error}`);
@@ -7,6 +7,8 @@ declare class DeleteUser extends Command {
7
7
  static flags: {
8
8
  username: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
9
  'delete-home': _oclif_core_interfaces.BooleanFlag<boolean>;
10
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
11
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -1,12 +1,12 @@
1
1
  // src/commands/admin/delete-user.ts
2
- import { execSync } from "child_process";
3
- import { isValidUnixUsername, UnixUserCommands } from "@agor/core/unix";
2
+ import { createAdminExecutor, isValidUnixUsername, UnixUserCommands } from "@agor/core/unix";
4
3
  import { Command, Flags } from "@oclif/core";
5
4
  var DeleteUser = class _DeleteUser extends Command {
6
5
  static description = "Delete a Unix user (admin only)";
7
6
  static examples = [
8
7
  "<%= config.bin %> <%= command.id %> --username agor_03b62447",
9
- "<%= config.bin %> <%= command.id %> --username agor_03b62447 --delete-home"
8
+ "<%= config.bin %> <%= command.id %> --username agor_03b62447 --delete-home",
9
+ "<%= config.bin %> <%= command.id %> --username agor_03b62447 --dry-run"
10
10
  ];
11
11
  static flags = {
12
12
  username: Flags.string({
@@ -17,27 +17,41 @@ var DeleteUser = class _DeleteUser extends Command {
17
17
  "delete-home": Flags.boolean({
18
18
  description: "Also delete the user home directory",
19
19
  default: false
20
+ }),
21
+ "dry-run": Flags.boolean({
22
+ char: "n",
23
+ description: "Show what would be done without making changes",
24
+ default: false
25
+ }),
26
+ verbose: Flags.boolean({
27
+ char: "v",
28
+ description: "Show detailed output including command stdout/stderr",
29
+ default: false
20
30
  })
21
31
  };
22
32
  async run() {
23
33
  const { flags } = await this.parse(_DeleteUser);
24
- const { username } = flags;
34
+ const { username, verbose } = flags;
25
35
  const deleteHome = flags["delete-home"];
36
+ const dryRun = flags["dry-run"];
37
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
38
+ if (dryRun) {
39
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
40
+ }
26
41
  if (!isValidUnixUsername(username)) {
27
42
  this.error(`Invalid Unix username format: ${username}`);
28
43
  }
29
- try {
30
- execSync(UnixUserCommands.userExists(username), { stdio: "ignore" });
31
- } catch {
44
+ const userExists = await executor.check(UnixUserCommands.userExists(username));
45
+ if (!userExists) {
32
46
  this.log(`\u2705 Unix user ${username} does not exist (nothing to do)`);
33
47
  return;
34
48
  }
35
49
  try {
36
50
  if (deleteHome) {
37
- execSync(UnixUserCommands.deleteUserWithHome(username), { stdio: "inherit" });
51
+ await executor.exec(UnixUserCommands.deleteUserWithHome(username));
38
52
  this.log(`\u2705 Deleted Unix user ${username} and home directory`);
39
53
  } else {
40
- execSync(UnixUserCommands.deleteUser(username), { stdio: "inherit" });
54
+ await executor.exec(UnixUserCommands.deleteUser(username));
41
55
  this.log(`\u2705 Deleted Unix user ${username} (home directory preserved)`);
42
56
  }
43
57
  } catch (error) {
@@ -6,6 +6,8 @@ declare class DeleteWorktreeGroup extends Command {
6
6
  static examples: string[];
7
7
  static flags: {
8
8
  group: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
10
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
9
11
  };
10
12
  run(): Promise<void>;
11
13
  }
@@ -1,28 +1,44 @@
1
1
  // src/commands/admin/delete-worktree-group.ts
2
- import { execSync } from "child_process";
3
- import { UnixGroupCommands } from "@agor/core/unix";
2
+ import { createAdminExecutor, UnixGroupCommands } from "@agor/core/unix";
4
3
  import { Command, Flags } from "@oclif/core";
5
4
  var DeleteWorktreeGroup = class _DeleteWorktreeGroup extends Command {
6
5
  static description = "Delete a worktree Unix group (admin only)";
7
- static examples = ["<%= config.bin %> <%= command.id %> --group agor_wt_03b62447"];
6
+ static examples = [
7
+ "<%= config.bin %> <%= command.id %> --group agor_wt_03b62447",
8
+ "<%= config.bin %> <%= command.id %> --group agor_wt_03b62447 --dry-run"
9
+ ];
8
10
  static flags = {
9
11
  group: Flags.string({
10
12
  char: "g",
11
13
  description: "Unix group name to delete (e.g., agor_wt_03b62447)",
12
14
  required: true
15
+ }),
16
+ "dry-run": Flags.boolean({
17
+ char: "n",
18
+ description: "Show what would be done without making changes",
19
+ default: false
20
+ }),
21
+ verbose: Flags.boolean({
22
+ char: "v",
23
+ description: "Show detailed output including command stdout/stderr",
24
+ default: false
13
25
  })
14
26
  };
15
27
  async run() {
16
28
  const { flags } = await this.parse(_DeleteWorktreeGroup);
17
- const { group } = flags;
18
- try {
19
- execSync(UnixGroupCommands.groupExists(group), { stdio: "ignore" });
20
- } catch {
21
- this.log(`\u2705 Group ${group} doesn't exist`);
29
+ const { group, verbose } = flags;
30
+ const dryRun = flags["dry-run"];
31
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
32
+ if (dryRun) {
33
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
34
+ }
35
+ const groupExists = await executor.check(UnixGroupCommands.groupExists(group));
36
+ if (!groupExists) {
37
+ this.log(`\u2705 Group ${group} doesn't exist (nothing to do)`);
22
38
  return;
23
39
  }
24
40
  try {
25
- execSync(UnixGroupCommands.deleteGroup(group), { stdio: "inherit" });
41
+ await executor.exec(UnixGroupCommands.deleteGroup(group));
26
42
  this.log(`\u2705 Deleted Unix group: ${group}`);
27
43
  } catch (error) {
28
44
  this.error(`Failed to delete group ${group}: ${error}`);
@@ -7,6 +7,8 @@ declare class EnsureUser extends Command {
7
7
  static flags: {
8
8
  username: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
9
  'home-base': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
10
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
11
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -1,12 +1,17 @@
1
1
  // src/commands/admin/ensure-user.ts
2
- import { execSync } from "child_process";
3
- import { AGOR_HOME_BASE, isValidUnixUsername, UnixUserCommands } from "@agor/core/unix";
2
+ import {
3
+ AGOR_HOME_BASE,
4
+ createAdminExecutor,
5
+ isValidUnixUsername,
6
+ UnixUserCommands
7
+ } from "@agor/core/unix";
4
8
  import { Command, Flags } from "@oclif/core";
5
9
  var EnsureUser = class _EnsureUser extends Command {
6
10
  static description = "Ensure a Unix user exists with proper Agor setup (admin only)";
7
11
  static examples = [
8
12
  "<%= config.bin %> <%= command.id %> --username agor_03b62447",
9
- "<%= config.bin %> <%= command.id %> --username alice --home-base /home"
13
+ "<%= config.bin %> <%= command.id %> --username alice --home-base /home",
14
+ "<%= config.bin %> <%= command.id %> --username alice --dry-run"
10
15
  ];
11
16
  static flags = {
12
17
  username: Flags.string({
@@ -17,31 +22,46 @@ var EnsureUser = class _EnsureUser extends Command {
17
22
  "home-base": Flags.string({
18
23
  description: "Base directory for home directories",
19
24
  default: AGOR_HOME_BASE
25
+ }),
26
+ "dry-run": Flags.boolean({
27
+ char: "n",
28
+ description: "Show what would be done without making changes",
29
+ default: false
30
+ }),
31
+ verbose: Flags.boolean({
32
+ char: "v",
33
+ description: "Show detailed output including command stdout/stderr",
34
+ default: false
20
35
  })
21
36
  };
22
37
  async run() {
23
38
  const { flags } = await this.parse(_EnsureUser);
24
- const { username } = flags;
39
+ const { username, verbose } = flags;
25
40
  const homeBase = flags["home-base"];
41
+ const dryRun = flags["dry-run"];
42
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
43
+ if (dryRun) {
44
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
45
+ }
26
46
  if (!isValidUnixUsername(username)) {
27
47
  this.error(`Invalid Unix username format: ${username}`);
28
48
  }
29
- try {
30
- execSync(UnixUserCommands.userExists(username), { stdio: "ignore" });
49
+ const userExists = await executor.check(UnixUserCommands.userExists(username));
50
+ if (userExists) {
31
51
  this.log(`\u2705 Unix user ${username} already exists`);
32
52
  try {
33
- execSync(UnixUserCommands.setupWorktreesDir(username, homeBase), { stdio: "inherit" });
53
+ await executor.execAll(UnixUserCommands.setupWorktreesDir(username, homeBase));
34
54
  this.log(`\u2705 Ensured ~/agor/worktrees directory for ${username}`);
35
55
  } catch (error) {
36
56
  this.warn(`Failed to setup worktrees directory: ${error}`);
37
57
  }
38
58
  return;
39
- } catch {
40
59
  }
41
60
  try {
42
- execSync(UnixUserCommands.createUser(username, "/bin/bash", homeBase), { stdio: "inherit" });
61
+ this.log(`Creating Unix user: ${username}`);
62
+ await executor.exec(UnixUserCommands.createUser(username, "/bin/bash", homeBase));
43
63
  this.log(`\u2705 Created Unix user: ${username}`);
44
- execSync(UnixUserCommands.setupWorktreesDir(username, homeBase), { stdio: "inherit" });
64
+ await executor.execAll(UnixUserCommands.setupWorktreesDir(username, homeBase));
45
65
  this.log(`\u2705 Created ~/agor/worktrees directory for ${username}`);
46
66
  } catch (error) {
47
67
  this.error(`Failed to create user ${username}: ${error}`);
@@ -7,6 +7,8 @@ declare class RemoveFromWorktreeGroup extends Command {
7
7
  static flags: {
8
8
  username: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
9
  group: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
10
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
11
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
10
12
  };
11
13
  run(): Promise<void>;
12
14
  }
@@ -1,11 +1,11 @@
1
1
  // src/commands/admin/remove-from-worktree-group.ts
2
- import { execSync } from "child_process";
3
- import { UnixGroupCommands } from "@agor/core/unix";
2
+ import { createAdminExecutor, UnixGroupCommands } from "@agor/core/unix";
4
3
  import { Command, Flags } from "@oclif/core";
5
4
  var RemoveFromWorktreeGroup = class _RemoveFromWorktreeGroup extends Command {
6
5
  static description = "Remove a user from a worktree Unix group (admin only)";
7
6
  static examples = [
8
- "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447"
7
+ "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447",
8
+ "<%= config.bin %> <%= command.id %> --username alice --group agor_wt_03b62447 --dry-run"
9
9
  ];
10
10
  static flags = {
11
11
  username: Flags.string({
@@ -17,19 +17,33 @@ var RemoveFromWorktreeGroup = class _RemoveFromWorktreeGroup extends Command {
17
17
  char: "g",
18
18
  description: "Unix group name (e.g., agor_wt_03b62447)",
19
19
  required: true
20
+ }),
21
+ "dry-run": Flags.boolean({
22
+ char: "n",
23
+ description: "Show what would be done without making changes",
24
+ default: false
25
+ }),
26
+ verbose: Flags.boolean({
27
+ char: "v",
28
+ description: "Show detailed output including command stdout/stderr",
29
+ default: false
20
30
  })
21
31
  };
22
32
  async run() {
23
33
  const { flags } = await this.parse(_RemoveFromWorktreeGroup);
24
- const { username, group } = flags;
25
- try {
26
- execSync(UnixGroupCommands.isUserInGroup(username, group), { stdio: "ignore" });
27
- } catch {
28
- this.log(`\u2705 User ${username} is not in group ${group}`);
34
+ const { username, group, verbose } = flags;
35
+ const dryRun = flags["dry-run"];
36
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
37
+ if (dryRun) {
38
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
39
+ }
40
+ const isInGroup = await executor.check(UnixGroupCommands.isUserInGroup(username, group));
41
+ if (!isInGroup) {
42
+ this.log(`\u2705 User ${username} is not in group ${group} (nothing to do)`);
29
43
  return;
30
44
  }
31
45
  try {
32
- execSync(UnixGroupCommands.removeUserFromGroup(username, group), { stdio: "inherit" });
46
+ await executor.exec(UnixGroupCommands.removeUserFromGroup(username, group));
33
47
  this.log(`\u2705 Removed user ${username} from group ${group}`);
34
48
  } catch (error) {
35
49
  this.error(`Failed to remove user ${username} from group ${group}: ${error}`);
@@ -8,6 +8,8 @@ declare class RemoveSymlink extends Command {
8
8
  username: _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
9
9
  'worktree-name': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
10
10
  'home-base': _oclif_core_interfaces.OptionFlag<string, _oclif_core_interfaces.CustomOptions>;
11
+ 'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
12
+ verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
11
13
  };
12
14
  run(): Promise<void>;
13
15
  }
@@ -1,7 +1,7 @@
1
1
  // src/commands/admin/remove-symlink.ts
2
- import { execSync } from "child_process";
3
2
  import {
4
3
  AGOR_HOME_BASE,
4
+ createAdminExecutor,
5
5
  getWorktreeSymlinkPath,
6
6
  isValidUnixUsername,
7
7
  SymlinkCommands
@@ -10,7 +10,8 @@ import { Command, Flags } from "@oclif/core";
10
10
  var RemoveSymlink = class _RemoveSymlink extends Command {
11
11
  static description = "Remove a worktree symlink from user home directory (admin only)";
12
12
  static examples = [
13
- "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature"
13
+ "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature",
14
+ "<%= config.bin %> <%= command.id %> --username alice --worktree-name my-feature --dry-run"
14
15
  ];
15
16
  static flags = {
16
17
  username: Flags.string({
@@ -19,32 +20,46 @@ var RemoveSymlink = class _RemoveSymlink extends Command {
19
20
  required: true
20
21
  }),
21
22
  "worktree-name": Flags.string({
22
- char: "n",
23
+ char: "w",
23
24
  description: "Worktree name/slug (symlink name)",
24
25
  required: true
25
26
  }),
26
27
  "home-base": Flags.string({
27
28
  description: "Base directory for home directories",
28
29
  default: AGOR_HOME_BASE
30
+ }),
31
+ "dry-run": Flags.boolean({
32
+ char: "n",
33
+ description: "Show what would be done without making changes",
34
+ default: false
35
+ }),
36
+ verbose: Flags.boolean({
37
+ char: "v",
38
+ description: "Show detailed output including command stdout/stderr",
39
+ default: false
29
40
  })
30
41
  };
31
42
  async run() {
32
43
  const { flags } = await this.parse(_RemoveSymlink);
33
- const { username } = flags;
44
+ const { username, verbose } = flags;
34
45
  const worktreeName = flags["worktree-name"];
35
46
  const homeBase = flags["home-base"];
47
+ const dryRun = flags["dry-run"];
48
+ const executor = createAdminExecutor({ "dry-run": dryRun, verbose });
49
+ if (dryRun) {
50
+ this.log("\u{1F50D} Dry run mode - no changes will be made\n");
51
+ }
36
52
  if (!isValidUnixUsername(username)) {
37
53
  this.error(`Invalid Unix username format: ${username}`);
38
54
  }
39
55
  const linkPath = getWorktreeSymlinkPath(username, worktreeName, homeBase);
40
- try {
41
- execSync(SymlinkCommands.symlinkExists(linkPath), { stdio: "ignore" });
42
- } catch {
56
+ const symlinkExists = await executor.check(SymlinkCommands.symlinkExists(linkPath));
57
+ if (!symlinkExists) {
43
58
  this.log(`\u2705 Symlink does not exist: ${linkPath} (nothing to do)`);
44
59
  return;
45
60
  }
46
61
  try {
47
- execSync(SymlinkCommands.removeSymlink(linkPath), { stdio: "inherit" });
62
+ await executor.exec(SymlinkCommands.removeSymlink(linkPath));
48
63
  this.log(`\u2705 Removed symlink: ${linkPath}`);
49
64
  } catch (error) {
50
65
  this.error(`Failed to remove symlink: ${error}`);
@@ -7,13 +7,9 @@ declare class SyncUnix extends Command {
7
7
  static flags: {
8
8
  'dry-run': _oclif_core_interfaces.BooleanFlag<boolean>;
9
9
  verbose: _oclif_core_interfaces.BooleanFlag<boolean>;
10
- 'create-users': _oclif_core_interfaces.BooleanFlag<boolean>;
11
- 'sync-groups': _oclif_core_interfaces.BooleanFlag<boolean>;
12
- 'create-groups': _oclif_core_interfaces.BooleanFlag<boolean>;
13
10
  cleanup: _oclif_core_interfaces.BooleanFlag<boolean>;
14
11
  'cleanup-groups': _oclif_core_interfaces.BooleanFlag<boolean>;
15
12
  'cleanup-users': _oclif_core_interfaces.BooleanFlag<boolean>;
16
- 'repair-worktree-perms': _oclif_core_interfaces.BooleanFlag<boolean>;
17
13
  };
18
14
  /**
19
15
  * Check if a Unix user exists on the system
@@ -27,6 +23,10 @@ declare class SyncUnix extends Command {
27
23
  * Check if a Unix group exists
28
24
  */
29
25
  private groupExists;
26
+ /**
27
+ * Check if a Unix user is in a group
28
+ */
29
+ private isUserInGroup;
30
30
  /**
31
31
  * Create a Unix user (assumes running as root via sudo)
32
32
  */
@@ -55,6 +55,10 @@ declare class SyncUnix extends Command {
55
55
  * List all agor_wt_* groups on the system
56
56
  */
57
57
  private listWorktreeGroups;
58
+ /**
59
+ * List all agor_rp_* (repo) groups on the system
60
+ */
61
+ private listRepoGroups;
58
62
  run(): Promise<void>;
59
63
  }
60
64