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.
- package/dist/cli/commands/admin/add-to-worktree-group.d.ts +2 -0
- package/dist/cli/commands/admin/add-to-worktree-group.js +22 -8
- package/dist/cli/commands/admin/create-symlink.d.ts +2 -0
- package/dist/cli/commands/admin/create-symlink.js +25 -10
- package/dist/cli/commands/admin/create-worktree-group.d.ts +2 -0
- package/dist/cli/commands/admin/create-worktree-group.js +22 -6
- package/dist/cli/commands/admin/delete-user.d.ts +2 -0
- package/dist/cli/commands/admin/delete-user.js +23 -9
- package/dist/cli/commands/admin/delete-worktree-group.d.ts +2 -0
- package/dist/cli/commands/admin/delete-worktree-group.js +25 -9
- package/dist/cli/commands/admin/ensure-user.d.ts +2 -0
- package/dist/cli/commands/admin/ensure-user.js +30 -10
- package/dist/cli/commands/admin/remove-from-worktree-group.d.ts +2 -0
- package/dist/cli/commands/admin/remove-from-worktree-group.js +23 -9
- package/dist/cli/commands/admin/remove-symlink.d.ts +2 -0
- package/dist/cli/commands/admin/remove-symlink.js +23 -8
- package/dist/cli/commands/admin/sync-unix.d.ts +8 -4
- package/dist/cli/commands/admin/sync-unix.js +446 -139
- package/dist/cli/commands/admin/sync-user-symlinks.d.ts +2 -0
- package/dist/cli/commands/admin/sync-user-symlinks.js +24 -7
- package/dist/core/api/index.d.cts +8 -8
- package/dist/core/api/index.d.ts +8 -8
- package/dist/core/{board-B2Z7GiJs.d.cts → board-BGkmgUH3.d.cts} +1 -1
- package/dist/core/{board-C_w2_4Zm.d.ts → board-CKJQAhxz.d.ts} +1 -1
- package/dist/core/{board-comment-CaUiaZB5.d.cts → board-comment-D9NA4gOJ.d.cts} +1 -1
- package/dist/core/{board-comment-BCrDUioT.d.ts → board-comment-rH4c6eVl.d.ts} +1 -1
- package/dist/core/claude/index.cjs +8 -0
- package/dist/core/claude/index.d.cts +3 -3
- package/dist/core/claude/index.d.ts +3 -3
- package/dist/core/claude/index.js +8 -0
- package/dist/core/{client-C0m4gTNP.d.ts → client-By3Q6aQA.d.ts} +40 -4
- package/dist/core/{client-DTvy8AsA.d.cts → client-KDgnPBwr.d.cts} +40 -4
- package/dist/core/config/browser.d.cts +6 -2
- package/dist/core/config/browser.d.ts +6 -2
- package/dist/core/config/index.cjs +51 -0
- package/dist/core/config/index.d.cts +50 -8
- package/dist/core/config/index.d.ts +50 -8
- package/dist/core/config/index.js +48 -0
- package/dist/core/db/index.cjs +11 -0
- package/dist/core/db/index.d.cts +47 -11
- package/dist/core/db/index.d.ts +47 -11
- package/dist/core/db/index.js +11 -0
- package/dist/core/drizzle/postgres/0008_add_repos_unix_group.sql +6 -0
- package/dist/core/drizzle/postgres/meta/_journal.json +7 -0
- package/dist/core/drizzle/sqlite/0020_add_repos_unix_group.sql +6 -0
- package/dist/core/drizzle/sqlite/meta/_journal.json +7 -0
- package/dist/core/environment/variable-resolver.d.cts +2 -2
- package/dist/core/environment/variable-resolver.d.ts +2 -2
- package/dist/core/git/index.cjs +181 -22
- package/dist/core/git/index.d.cts +3 -0
- package/dist/core/git/index.d.ts +3 -0
- package/dist/core/git/index.js +171 -12
- package/dist/core/{id-DMqyogFB.d.cts → id-BwPJtWxW.d.cts} +10 -1
- package/dist/core/{id-DMqyogFB.d.ts → id-BwPJtWxW.d.ts} +10 -1
- package/dist/core/index.cjs +848 -51
- package/dist/core/index.d.cts +12 -12
- package/dist/core/index.d.ts +12 -12
- package/dist/core/index.js +834 -52
- package/dist/core/lib/feathers-validation.cjs +22 -0
- package/dist/core/lib/feathers-validation.d.cts +7 -0
- package/dist/core/lib/feathers-validation.d.ts +7 -0
- package/dist/core/lib/feathers-validation.js +22 -0
- package/dist/core/{mcp-DSOuQVMG.d.ts → mcp-C-LwrhHt.d.ts} +1 -1
- package/dist/core/{mcp-DkU4JIC7.d.cts → mcp-oU9TGu_S.d.cts} +1 -1
- package/dist/core/{message-jqh1J_89.d.cts → message-BFjPtffm.d.cts} +1 -1
- package/dist/core/{message-DsJfWcNC.d.ts → message-Di6ZwIjG.d.ts} +1 -1
- package/dist/core/models/index.cjs +12 -1
- package/dist/core/models/index.d.cts +4 -1
- package/dist/core/models/index.d.ts +4 -1
- package/dist/core/models/index.js +12 -1
- package/dist/core/permissions/index.d.cts +2 -2
- package/dist/core/permissions/index.d.ts +2 -2
- package/dist/core/{repo-iiGdqI89.d.ts → repo-DbOIBw1c.d.cts} +19 -5
- package/dist/core/{repo-B_5-1Rbq.d.cts → repo-DkEPOBbI.d.ts} +19 -5
- package/dist/core/seed/index.cjs +2223 -52
- package/dist/core/seed/index.d.cts +1 -1
- package/dist/core/seed/index.d.ts +1 -1
- package/dist/core/seed/index.js +2207 -37
- package/dist/core/{session-DNQuNe8l.d.cts → session-DE9tT7Cm.d.cts} +1 -1
- package/dist/core/{session-MSmLRIxg.d.ts → session-DrzT_Csl.d.ts} +1 -1
- package/dist/core/{task-Ct74zwxQ.d.ts → task-D0i_mU9u.d.ts} +1 -1
- package/dist/core/{task-aE2IEwMQ.d.cts → task-D5cWUcAY.d.cts} +1 -1
- package/dist/core/templates/session-context.d.cts +3 -3
- package/dist/core/templates/session-context.d.ts +3 -3
- package/dist/core/tools/mcp/jwt-auth.d.cts +2 -2
- package/dist/core/tools/mcp/jwt-auth.d.ts +2 -2
- package/dist/core/types/index.d.cts +11 -11
- package/dist/core/types/index.d.ts +11 -11
- package/dist/core/unix/index.cjs +1008 -48
- package/dist/core/unix/index.d.cts +444 -52
- package/dist/core/unix/index.d.ts +444 -52
- package/dist/core/unix/index.js +995 -47
- package/dist/core/{user-BkP2saWK.d.ts → user-CMQOATsn.d.ts} +2 -2
- package/dist/core/{user-1-Yd2Hix.d.cts → user-zv1BTkAp.d.cts} +2 -2
- package/dist/core/utils/permission-mode-mapper.d.cts +2 -2
- package/dist/core/utils/permission-mode-mapper.d.ts +2 -2
- package/dist/daemon/index.js +311 -116
- package/dist/daemon/services/repos.d.ts +7 -0
- package/dist/daemon/services/repos.js +37 -2
- package/dist/daemon/services/terminals.js +117 -75
- package/dist/daemon/services/unix-integration.d.ts +1 -0
- package/dist/daemon/services/unix-integration.js +3 -1
- package/dist/daemon/services/worktree-owners.js +28 -4
- package/dist/executor/handlers/sdk/base-executor.d.ts +1 -1
- package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/base-executor.js +2 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +2 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.js +4 -2
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +6 -35
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/prompt-service.js +18 -149
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts +1 -0
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/query-builder.js +8 -1
- package/dist/executor/sdk-handlers/codex/models.d.ts +5 -1
- package/dist/executor/sdk-handlers/codex/models.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/models.js +12 -2
- package/dist/executor/sdk-handlers/opencode/client.d.ts +108 -0
- package/dist/executor/sdk-handlers/opencode/client.d.ts.map +1 -0
- package/dist/executor/sdk-handlers/opencode/client.js +366 -0
- package/dist/ui/assets/{_basePickBy-DMrA2UBq.js → _basePickBy-CSYiZMse.js} +1 -1
- package/dist/ui/assets/_basePickBy-CSYiZMse.js.gz +0 -0
- package/dist/ui/assets/{_baseUniq-DfeKfoi5.js → _baseUniq-DvtGUhEt.js} +1 -1
- package/dist/ui/assets/_baseUniq-DvtGUhEt.js.gz +0 -0
- package/dist/ui/assets/{arc-COihOExQ.js → arc-BRr5j3D1.js} +1 -1
- package/dist/ui/assets/arc-BRr5j3D1.js.gz +0 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-Dh9Y1lpA.js → architectureDiagram-VXUJARFQ-ebBOi_gK.js} +1 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-ebBOi_gK.js.gz +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-DmhO-9GG.js → blockDiagram-VD42YOAC-DxejLyQ-.js} +1 -1
- package/dist/ui/assets/blockDiagram-VD42YOAC-DxejLyQ-.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-GWzw3hUe.js → c4Diagram-YG6GDRKO-DFKl-efs.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-DFKl-efs.js.gz +0 -0
- package/dist/ui/assets/channel-D2mEA-Bx.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-DHjZozeY.js → chunk-4BX2VUAB-jMOQ1WDz.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-CzT5_rQs.js → chunk-55IACEB6-D1M6UwZY.js} +1 -1
- package/dist/ui/assets/{chunk-B4BG7PRW-BI7tsYTf.js → chunk-B4BG7PRW-COzn6OFE.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-COzn6OFE.js.gz +0 -0
- package/dist/ui/assets/{chunk-DI55MBZ5-CaeHia7B.js → chunk-DI55MBZ5-6QssijTz.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-6QssijTz.js.gz +0 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-D4XpMA5J.js → chunk-FMBD7UC4-BnG1D5CH.js} +1 -1
- package/dist/ui/assets/{chunk-QN33PNHL-M3muhamw.js → chunk-QN33PNHL-C6hCjMzw.js} +1 -1
- package/dist/ui/assets/{chunk-QZHKN3VN-Cd-EqjIc.js → chunk-QZHKN3VN-CKLJgdZH.js} +1 -1
- package/dist/ui/assets/{chunk-TZMSLE5B-CeGmvyG4.js → chunk-TZMSLE5B-DYJXqHip.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-DYJXqHip.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-CQUXqjFU.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CQUXqjFU.js +1 -0
- package/dist/ui/assets/clone-DLz_t3PG.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-DWVeqF4E.js → cose-bilkent-S5V4N54A-DBdRhd2a.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-DBdRhd2a.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-Drcpoogc.js → dagre-6UL2VRFP-BURrt6xz.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-BURrt6xz.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-DhjMaKx8.js → diagram-PSM6KHXK-yPFDWvxo.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-yPFDWvxo.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-rznnOwEg.js → diagram-QEK2KX5R-DQP7GvBM.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-DQP7GvBM.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-B6ANwV6f.js → diagram-S2PKOQOG-Ceh9L5Ft.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-Ceh9L5Ft.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-DFauwyhe.js → erDiagram-Q2GNP2WA-BGBdyrlr.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-BGBdyrlr.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-DTZrS570.js → flowDiagram-NV44I4VS-BXuoem71.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-BXuoem71.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-D3WfTah6.js → ganttDiagram-LVOFAZNH-D96TAOYN.js} +1 -1
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-D96TAOYN.js.gz +0 -0
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-D_qGOTCz.js → gitGraphDiagram-NY62KEGX-CsUtGEJW.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CsUtGEJW.js.gz +0 -0
- package/dist/ui/assets/{graph-CSzBsFCf.js → graph-DmuZZZ0O.js} +1 -1
- package/dist/ui/assets/graph-DmuZZZ0O.js.gz +0 -0
- package/dist/ui/assets/{index-B8J_dCmD.js → index-DPUzz4vA.js} +212 -212
- package/dist/ui/assets/index-DPUzz4vA.js.gz +0 -0
- package/dist/ui/assets/{infoDiagram-ER5ION4S-CFy9rNRq.js → infoDiagram-ER5ION4S-DcxAd1Yp.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CNKnT6H_.js → journeyDiagram-XKPGCS4Q-CFtlwkTr.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CFtlwkTr.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CI79vQJo.js → kanban-definition-3W4ZIXB7-B74pWt6y.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-B74pWt6y.js.gz +0 -0
- package/dist/ui/assets/{layout-Ca7tbZ8Q.js → layout-DpFHdru9.js} +1 -1
- package/dist/ui/assets/layout-DpFHdru9.js.gz +0 -0
- package/dist/ui/assets/{linear-zhivmWSN.js → linear-yVuUIGbC.js} +1 -1
- package/dist/ui/assets/linear-yVuUIGbC.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-CJibjqo3.js → mermaid.core-CbMbakdH.js} +5 -5
- package/dist/ui/assets/mermaid.core-CbMbakdH.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-Bp2_St3w.js → mindmap-definition-VGOIOE7T-XYo0CUDk.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-XYo0CUDk.js.gz +0 -0
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-BcDk4l3F.js → pieDiagram-ADFJNKIX-b64mzYsL.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-b64mzYsL.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-DZAU4umx.js → quadrantDiagram-AYHSOK5B-CzbNszXu.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-CzbNszXu.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-iT39TNxt.js → requirementDiagram-UZGBJVZJ-ftflJl3O.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-ftflJl3O.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-rZFAR-Mw.js → sankeyDiagram-TZEHDZUN-8PGribEE.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-8PGribEE.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-WaQuG71V.js → sequenceDiagram-WL72ISMW-B14pbZEr.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-B14pbZEr.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-DhTWu848.js → stateDiagram-FKZM4ZOC-Ddx2Kkc3.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-Ddx2Kkc3.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-ppKXpQQ4.js +1 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-CQI3TYGs.js → timeline-definition-IT6M3QCI-bS_0u_jC.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-bS_0u_jC.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-DX1wuI5d.js → treemap-KMMF4GRG-CZHIJMKL.js} +1 -1
- package/dist/ui/assets/{treemap-KMMF4GRG-DX1wuI5d.js.gz → treemap-KMMF4GRG-CZHIJMKL.js.gz} +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-Dc89CZjQ.js → xychartDiagram-PRI3JC2R-DOTWxgqQ.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-DOTWxgqQ.js.gz +0 -0
- package/dist/ui/index.html +2 -2
- package/package.json +2 -2
- package/dist/ui/assets/_basePickBy-DMrA2UBq.js.gz +0 -0
- package/dist/ui/assets/_baseUniq-DfeKfoi5.js.gz +0 -0
- package/dist/ui/assets/arc-COihOExQ.js.gz +0 -0
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-Dh9Y1lpA.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-DmhO-9GG.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-GWzw3hUe.js.gz +0 -0
- package/dist/ui/assets/channel-B2VqS1IB.js +0 -1
- package/dist/ui/assets/chunk-B4BG7PRW-BI7tsYTf.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-CaeHia7B.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-CeGmvyG4.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-87L6YkKc.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-87L6YkKc.js +0 -1
- package/dist/ui/assets/clone-BsP0qV6M.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-DWVeqF4E.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-Drcpoogc.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-DhjMaKx8.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-rznnOwEg.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-B6ANwV6f.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-DFauwyhe.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-DTZrS570.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-D3WfTah6.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-D_qGOTCz.js.gz +0 -0
- package/dist/ui/assets/graph-CSzBsFCf.js.gz +0 -0
- package/dist/ui/assets/index-B8J_dCmD.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CNKnT6H_.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-CI79vQJo.js.gz +0 -0
- package/dist/ui/assets/layout-Ca7tbZ8Q.js.gz +0 -0
- package/dist/ui/assets/linear-zhivmWSN.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-CJibjqo3.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-Bp2_St3w.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-BcDk4l3F.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DZAU4umx.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-iT39TNxt.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-rZFAR-Mw.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-WaQuG71V.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-DhTWu848.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DgyTzobH.js +0 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-CQI3TYGs.js.gz +0 -0
- 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 {
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
51
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
51
|
+
await executor.exec(UnixUserCommands.deleteUserWithHome(username));
|
|
38
52
|
this.log(`\u2705 Deleted Unix user ${username} and home directory`);
|
|
39
53
|
} else {
|
|
40
|
-
|
|
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 {
|
|
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 = [
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
this.log(
|
|
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
|
-
|
|
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 {
|
|
3
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.log(
|
|
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
|
-
|
|
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: "
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
|