agor-live 0.3.7

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 (297) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +163 -0
  3. package/bin/agor-daemon.js +20 -0
  4. package/bin/agor.js +14 -0
  5. package/dist/cli/base-command.d.ts +29 -0
  6. package/dist/cli/base-command.js +41 -0
  7. package/dist/cli/commands/board/add-session.d.ts +15 -0
  8. package/dist/cli/commands/board/add-session.js +102 -0
  9. package/dist/cli/commands/board/list.d.ts +14 -0
  10. package/dist/cli/commands/board/list.js +74 -0
  11. package/dist/cli/commands/config/clear.d.ts +13 -0
  12. package/dist/cli/commands/config/clear.js +21 -0
  13. package/dist/cli/commands/config/get.d.ts +13 -0
  14. package/dist/cli/commands/config/get.js +41 -0
  15. package/dist/cli/commands/config/index.d.ts +13 -0
  16. package/dist/cli/commands/config/index.js +118 -0
  17. package/dist/cli/commands/config/set.d.ts +14 -0
  18. package/dist/cli/commands/config/set.js +50 -0
  19. package/dist/cli/commands/config/unset.d.ts +13 -0
  20. package/dist/cli/commands/config/unset.js +35 -0
  21. package/dist/cli/commands/daemon/index.d.ts +13 -0
  22. package/dist/cli/commands/daemon/index.js +65 -0
  23. package/dist/cli/commands/daemon/logs.d.ts +13 -0
  24. package/dist/cli/commands/daemon/logs.js +78 -0
  25. package/dist/cli/commands/daemon/restart.d.ts +13 -0
  26. package/dist/cli/commands/daemon/restart.js +177 -0
  27. package/dist/cli/commands/daemon/start.d.ts +13 -0
  28. package/dist/cli/commands/daemon/start.js +193 -0
  29. package/dist/cli/commands/daemon/status.d.ts +13 -0
  30. package/dist/cli/commands/daemon/status.js +93 -0
  31. package/dist/cli/commands/daemon/stop.d.ts +13 -0
  32. package/dist/cli/commands/daemon/stop.js +108 -0
  33. package/dist/cli/commands/init.d.ts +44 -0
  34. package/dist/cli/commands/init.js +459 -0
  35. package/dist/cli/commands/mcp/add.d.ts +26 -0
  36. package/dist/cli/commands/mcp/add.js +162 -0
  37. package/dist/cli/commands/mcp/list.d.ts +16 -0
  38. package/dist/cli/commands/mcp/list.js +89 -0
  39. package/dist/cli/commands/mcp/remove.d.ts +17 -0
  40. package/dist/cli/commands/mcp/remove.js +86 -0
  41. package/dist/cli/commands/mcp/show.d.ts +14 -0
  42. package/dist/cli/commands/mcp/show.js +131 -0
  43. package/dist/cli/commands/repo/add.d.ts +16 -0
  44. package/dist/cli/commands/repo/add.js +105 -0
  45. package/dist/cli/commands/repo/list.d.ts +17 -0
  46. package/dist/cli/commands/repo/list.js +99 -0
  47. package/dist/cli/commands/repo/rm.d.ts +17 -0
  48. package/dist/cli/commands/repo/rm.js +126 -0
  49. package/dist/cli/commands/repo/worktree/add.d.ts +21 -0
  50. package/dist/cli/commands/repo/worktree/add.js +145 -0
  51. package/dist/cli/commands/repo/worktree/list.d.ts +21 -0
  52. package/dist/cli/commands/repo/worktree/list.js +136 -0
  53. package/dist/cli/commands/session/list.d.ts +30 -0
  54. package/dist/cli/commands/session/list.js +204 -0
  55. package/dist/cli/commands/session/load-claude.d.ts +16 -0
  56. package/dist/cli/commands/session/load-claude.js +211 -0
  57. package/dist/cli/commands/user/create-admin.d.ts +13 -0
  58. package/dist/cli/commands/user/create-admin.js +65 -0
  59. package/dist/cli/commands/user/create.d.ts +16 -0
  60. package/dist/cli/commands/user/create.js +126 -0
  61. package/dist/cli/commands/user/delete.d.ts +16 -0
  62. package/dist/cli/commands/user/delete.js +77 -0
  63. package/dist/cli/commands/user/list.d.ts +13 -0
  64. package/dist/cli/commands/user/list.js +78 -0
  65. package/dist/cli/commands/user/update.d.ts +19 -0
  66. package/dist/cli/commands/user/update.js +149 -0
  67. package/dist/cli/hooks/command-not-found.d.ts +9 -0
  68. package/dist/cli/hooks/command-not-found.js +14 -0
  69. package/dist/cli/lib/banner.d.ts +25 -0
  70. package/dist/cli/lib/banner.js +25 -0
  71. package/dist/cli/lib/context.d.ts +27 -0
  72. package/dist/cli/lib/context.js +32 -0
  73. package/dist/cli/lib/daemon-manager.d.ts +48 -0
  74. package/dist/cli/lib/daemon-manager.js +109 -0
  75. package/dist/cli/lib/help.d.ts +13 -0
  76. package/dist/cli/lib/help.js +46 -0
  77. package/dist/core/agentic-tool-B_gFNpk5.d.ts +33 -0
  78. package/dist/core/agentic-tool-DsyX8diw.d.cts +33 -0
  79. package/dist/core/api/index.cjs +98 -0
  80. package/dist/core/api/index.d.cts +174 -0
  81. package/dist/core/api/index.d.ts +174 -0
  82. package/dist/core/api/index.js +62 -0
  83. package/dist/core/board-comment-BUm0fpmD.d.cts +134 -0
  84. package/dist/core/board-comment-gC_-twPx.d.ts +134 -0
  85. package/dist/core/claude/index.cjs +673 -0
  86. package/dist/core/claude/index.d.cts +124 -0
  87. package/dist/core/claude/index.d.ts +124 -0
  88. package/dist/core/claude/index.js +629 -0
  89. package/dist/core/config/browser.cjs +165 -0
  90. package/dist/core/config/browser.d.cts +289 -0
  91. package/dist/core/config/browser.d.ts +289 -0
  92. package/dist/core/config/browser.js +131 -0
  93. package/dist/core/config/index.cjs +518 -0
  94. package/dist/core/config/index.d.cts +246 -0
  95. package/dist/core/config/index.d.ts +246 -0
  96. package/dist/core/config/index.js +451 -0
  97. package/dist/core/db/index.cjs +3726 -0
  98. package/dist/core/db/index.d.cts +631 -0
  99. package/dist/core/db/index.d.ts +631 -0
  100. package/dist/core/db/index.js +3649 -0
  101. package/dist/core/dist/agentic-tool-B_gFNpk5.d.ts +33 -0
  102. package/dist/core/dist/agentic-tool-DsyX8diw.d.cts +33 -0
  103. package/dist/core/dist/api/index.cjs +98 -0
  104. package/dist/core/dist/api/index.d.cts +174 -0
  105. package/dist/core/dist/api/index.d.ts +174 -0
  106. package/dist/core/dist/api/index.js +62 -0
  107. package/dist/core/dist/board-comment-BUm0fpmD.d.cts +134 -0
  108. package/dist/core/dist/board-comment-gC_-twPx.d.ts +134 -0
  109. package/dist/core/dist/claude/index.cjs +673 -0
  110. package/dist/core/dist/claude/index.d.cts +124 -0
  111. package/dist/core/dist/claude/index.d.ts +124 -0
  112. package/dist/core/dist/claude/index.js +629 -0
  113. package/dist/core/dist/config/browser.cjs +165 -0
  114. package/dist/core/dist/config/browser.d.cts +289 -0
  115. package/dist/core/dist/config/browser.d.ts +289 -0
  116. package/dist/core/dist/config/browser.js +131 -0
  117. package/dist/core/dist/config/index.cjs +518 -0
  118. package/dist/core/dist/config/index.d.cts +246 -0
  119. package/dist/core/dist/config/index.d.ts +246 -0
  120. package/dist/core/dist/config/index.js +451 -0
  121. package/dist/core/dist/db/index.cjs +3726 -0
  122. package/dist/core/dist/db/index.d.cts +631 -0
  123. package/dist/core/dist/db/index.d.ts +631 -0
  124. package/dist/core/dist/db/index.js +3649 -0
  125. package/dist/core/dist/environment/variable-resolver.cjs +92 -0
  126. package/dist/core/dist/environment/variable-resolver.d.cts +52 -0
  127. package/dist/core/dist/environment/variable-resolver.d.ts +52 -0
  128. package/dist/core/dist/environment/variable-resolver.js +53 -0
  129. package/dist/core/dist/feathers/index.cjs +66 -0
  130. package/dist/core/dist/feathers/index.d.cts +7 -0
  131. package/dist/core/dist/feathers/index.d.ts +7 -0
  132. package/dist/core/dist/feathers/index.js +25 -0
  133. package/dist/core/dist/feathers-BzHEPnpl.d.cts +228 -0
  134. package/dist/core/dist/feathers-BzHEPnpl.d.ts +228 -0
  135. package/dist/core/dist/git/index.cjs +302 -0
  136. package/dist/core/dist/git/index.d.cts +137 -0
  137. package/dist/core/dist/git/index.d.ts +137 -0
  138. package/dist/core/dist/git/index.js +260 -0
  139. package/dist/core/dist/id-DMqyogFB.d.cts +131 -0
  140. package/dist/core/dist/id-DMqyogFB.d.ts +131 -0
  141. package/dist/core/dist/index.cjs +4653 -0
  142. package/dist/core/dist/index.d.cts +23 -0
  143. package/dist/core/dist/index.d.ts +23 -0
  144. package/dist/core/dist/index.js +4509 -0
  145. package/dist/core/dist/message-BoxZISHg.d.cts +120 -0
  146. package/dist/core/dist/message-DvBzHu7V.d.ts +120 -0
  147. package/dist/core/dist/permissions/index.cjs +112 -0
  148. package/dist/core/dist/permissions/index.d.cts +81 -0
  149. package/dist/core/dist/permissions/index.d.ts +81 -0
  150. package/dist/core/dist/permissions/index.js +85 -0
  151. package/dist/core/dist/repo-3CUrCRbq.d.cts +405 -0
  152. package/dist/core/dist/repo-CnvJ0B6-.d.ts +405 -0
  153. package/dist/core/dist/session-BPjJlVdZ.d.cts +429 -0
  154. package/dist/core/dist/session-wAzjHatv.d.ts +429 -0
  155. package/dist/core/dist/task-BIEgT1DK.d.cts +163 -0
  156. package/dist/core/dist/task-DuIfiUbW.d.ts +163 -0
  157. package/dist/core/dist/templates/handlebars-helpers.cjs +156 -0
  158. package/dist/core/dist/templates/handlebars-helpers.d.cts +45 -0
  159. package/dist/core/dist/templates/handlebars-helpers.d.ts +45 -0
  160. package/dist/core/dist/templates/handlebars-helpers.js +119 -0
  161. package/dist/core/dist/tools/claude/models.cjs +70 -0
  162. package/dist/core/dist/tools/claude/models.d.cts +27 -0
  163. package/dist/core/dist/tools/claude/models.d.ts +27 -0
  164. package/dist/core/dist/tools/claude/models.js +44 -0
  165. package/dist/core/dist/tools/index.cjs +3367 -0
  166. package/dist/core/dist/tools/index.d.cts +967 -0
  167. package/dist/core/dist/tools/index.d.ts +967 -0
  168. package/dist/core/dist/tools/index.js +3314 -0
  169. package/dist/core/dist/tools/models.cjs +119 -0
  170. package/dist/core/dist/tools/models.d.cts +47 -0
  171. package/dist/core/dist/tools/models.d.ts +47 -0
  172. package/dist/core/dist/tools/models.js +86 -0
  173. package/dist/core/dist/types/index.cjs +152 -0
  174. package/dist/core/dist/types/index.d.cts +214 -0
  175. package/dist/core/dist/types/index.d.ts +214 -0
  176. package/dist/core/dist/types/index.js +112 -0
  177. package/dist/core/dist/user-BmL3kFol.d.ts +50 -0
  178. package/dist/core/dist/user-eUuKj7yM.d.cts +50 -0
  179. package/dist/core/dist/utils/pricing.cjs +102 -0
  180. package/dist/core/dist/utils/pricing.d.cts +43 -0
  181. package/dist/core/dist/utils/pricing.d.ts +43 -0
  182. package/dist/core/dist/utils/pricing.js +75 -0
  183. package/dist/core/dist/worktrees-BzIxB1U6.d.cts +2745 -0
  184. package/dist/core/dist/worktrees-CYem1ya2.d.ts +2745 -0
  185. package/dist/core/environment/variable-resolver.cjs +92 -0
  186. package/dist/core/environment/variable-resolver.d.cts +52 -0
  187. package/dist/core/environment/variable-resolver.d.ts +52 -0
  188. package/dist/core/environment/variable-resolver.js +53 -0
  189. package/dist/core/feathers/index.cjs +66 -0
  190. package/dist/core/feathers/index.d.cts +7 -0
  191. package/dist/core/feathers/index.d.ts +7 -0
  192. package/dist/core/feathers/index.js +25 -0
  193. package/dist/core/feathers-BzHEPnpl.d.cts +228 -0
  194. package/dist/core/feathers-BzHEPnpl.d.ts +228 -0
  195. package/dist/core/git/index.cjs +302 -0
  196. package/dist/core/git/index.d.cts +137 -0
  197. package/dist/core/git/index.d.ts +137 -0
  198. package/dist/core/git/index.js +260 -0
  199. package/dist/core/id-DMqyogFB.d.cts +131 -0
  200. package/dist/core/id-DMqyogFB.d.ts +131 -0
  201. package/dist/core/index.cjs +4653 -0
  202. package/dist/core/index.d.cts +23 -0
  203. package/dist/core/index.d.ts +23 -0
  204. package/dist/core/index.js +4509 -0
  205. package/dist/core/message-BoxZISHg.d.cts +120 -0
  206. package/dist/core/message-DvBzHu7V.d.ts +120 -0
  207. package/dist/core/package.json +133 -0
  208. package/dist/core/permissions/index.cjs +112 -0
  209. package/dist/core/permissions/index.d.cts +81 -0
  210. package/dist/core/permissions/index.d.ts +81 -0
  211. package/dist/core/permissions/index.js +85 -0
  212. package/dist/core/repo-3CUrCRbq.d.cts +405 -0
  213. package/dist/core/repo-CnvJ0B6-.d.ts +405 -0
  214. package/dist/core/session-BPjJlVdZ.d.cts +429 -0
  215. package/dist/core/session-wAzjHatv.d.ts +429 -0
  216. package/dist/core/task-BIEgT1DK.d.cts +163 -0
  217. package/dist/core/task-DuIfiUbW.d.ts +163 -0
  218. package/dist/core/templates/handlebars-helpers.cjs +156 -0
  219. package/dist/core/templates/handlebars-helpers.d.cts +45 -0
  220. package/dist/core/templates/handlebars-helpers.d.ts +45 -0
  221. package/dist/core/templates/handlebars-helpers.js +119 -0
  222. package/dist/core/tools/claude/models.cjs +70 -0
  223. package/dist/core/tools/claude/models.d.cts +27 -0
  224. package/dist/core/tools/claude/models.d.ts +27 -0
  225. package/dist/core/tools/claude/models.js +44 -0
  226. package/dist/core/tools/index.cjs +3367 -0
  227. package/dist/core/tools/index.d.cts +967 -0
  228. package/dist/core/tools/index.d.ts +967 -0
  229. package/dist/core/tools/index.js +3314 -0
  230. package/dist/core/tools/models.cjs +119 -0
  231. package/dist/core/tools/models.d.cts +47 -0
  232. package/dist/core/tools/models.d.ts +47 -0
  233. package/dist/core/tools/models.js +86 -0
  234. package/dist/core/types/index.cjs +152 -0
  235. package/dist/core/types/index.d.cts +214 -0
  236. package/dist/core/types/index.d.ts +214 -0
  237. package/dist/core/types/index.js +112 -0
  238. package/dist/core/user-BmL3kFol.d.ts +50 -0
  239. package/dist/core/user-eUuKj7yM.d.cts +50 -0
  240. package/dist/core/utils/pricing.cjs +102 -0
  241. package/dist/core/utils/pricing.d.cts +43 -0
  242. package/dist/core/utils/pricing.d.ts +43 -0
  243. package/dist/core/utils/pricing.js +75 -0
  244. package/dist/core/worktrees-BzIxB1U6.d.cts +2745 -0
  245. package/dist/core/worktrees-CYem1ya2.d.ts +2745 -0
  246. package/dist/daemon/adapters/drizzle.d.ts +114 -0
  247. package/dist/daemon/adapters/drizzle.js +219 -0
  248. package/dist/daemon/declarations.d.ts +101 -0
  249. package/dist/daemon/declarations.js +0 -0
  250. package/dist/daemon/index.d.ts +2 -0
  251. package/dist/daemon/index.js +4093 -0
  252. package/dist/daemon/mcp/routes.d.ts +15 -0
  253. package/dist/daemon/mcp/routes.js +641 -0
  254. package/dist/daemon/mcp/tokens.d.ts +50 -0
  255. package/dist/daemon/mcp/tokens.js +85 -0
  256. package/dist/daemon/services/board-comments.d.ts +97 -0
  257. package/dist/daemon/services/board-comments.js +326 -0
  258. package/dist/daemon/services/board-objects.d.ts +71 -0
  259. package/dist/daemon/services/board-objects.js +117 -0
  260. package/dist/daemon/services/boards.d.ts +64 -0
  261. package/dist/daemon/services/boards.js +286 -0
  262. package/dist/daemon/services/config.d.ts +35 -0
  263. package/dist/daemon/services/config.js +68 -0
  264. package/dist/daemon/services/context.d.ts +55 -0
  265. package/dist/daemon/services/context.js +113 -0
  266. package/dist/daemon/services/health-monitor.d.ts +58 -0
  267. package/dist/daemon/services/health-monitor.js +158 -0
  268. package/dist/daemon/services/mcp-servers.d.ts +42 -0
  269. package/dist/daemon/services/mcp-servers.js +275 -0
  270. package/dist/daemon/services/messages.d.ts +49 -0
  271. package/dist/daemon/services/messages.js +269 -0
  272. package/dist/daemon/services/repos.d.ts +61 -0
  273. package/dist/daemon/services/repos.js +350 -0
  274. package/dist/daemon/services/session-mcp-servers.d.ts +56 -0
  275. package/dist/daemon/services/session-mcp-servers.js +51 -0
  276. package/dist/daemon/services/sessions.d.ts +64 -0
  277. package/dist/daemon/services/sessions.js +398 -0
  278. package/dist/daemon/services/tasks.d.ts +55 -0
  279. package/dist/daemon/services/tasks.js +318 -0
  280. package/dist/daemon/services/terminals.d.ts +75 -0
  281. package/dist/daemon/services/terminals.js +110 -0
  282. package/dist/daemon/services/users.d.ts +98 -0
  283. package/dist/daemon/services/users.js +177 -0
  284. package/dist/daemon/services/worktrees.d.ts +98 -0
  285. package/dist/daemon/services/worktrees.js +719 -0
  286. package/dist/daemon/strategies/anonymous.d.ts +20 -0
  287. package/dist/daemon/strategies/anonymous.js +32 -0
  288. package/dist/ui/assets/cc-CYmbalCD.png +0 -0
  289. package/dist/ui/assets/codex-4sLD1mVS.png +0 -0
  290. package/dist/ui/assets/cursor-BUy5pFVL.png +0 -0
  291. package/dist/ui/assets/gemini-ajOb7iAl.png +0 -0
  292. package/dist/ui/assets/index-Dc4ELxry.css +32 -0
  293. package/dist/ui/assets/index-KfIu8v4V.js +578 -0
  294. package/dist/ui/favicon.png +0 -0
  295. package/dist/ui/index.html +26 -0
  296. package/dist/ui/vite.svg +1 -0
  297. package/package.json +90 -0
package/LICENSE ADDED
@@ -0,0 +1,94 @@
1
+ Business Source License 1.1
2
+
3
+ License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
4
+ "Business Source License" is a trademark of MariaDB Corporation Ab.
5
+
6
+ ---
7
+
8
+ Parameters
9
+
10
+ Licensor: Maxime Beauchemin
11
+ Licensed Work: Agor
12
+ The Licensed Work is (c) 2025 Maxime Beauchemin
13
+ Additional Use Grant: None
14
+ Change Date: 2029-01-15
15
+ Change License: Apache License, Version 2.0
16
+
17
+ ---
18
+
19
+ Terms
20
+
21
+ The Licensor hereby grants you the right to copy, modify, create derivative
22
+ works, redistribute, and make non-production use of the Licensed Work. The
23
+ Licensor may make an Additional Use Grant, above, permitting limited
24
+ production use.
25
+
26
+ Effective on the Change Date, or the fourth anniversary of the first publicly
27
+ available distribution of a specific version of the Licensed Work under this
28
+ License, whichever comes first, the Licensor hereby grants you rights under
29
+ the terms of the Change License, and the rights granted in the paragraph
30
+ above terminate.
31
+
32
+ If your use of the Licensed Work does not comply with the requirements
33
+ currently in effect as described in this License, you must purchase a
34
+ commercial license from the Licensor, its affiliated entities, or authorized
35
+ resellers, or you must refrain from using the Licensed Work.
36
+
37
+ All copies of the original and modified Licensed Work, and derivative works
38
+ of the Licensed Work, are subject to this License. This License applies
39
+ separately for each version of the Licensed Work and the Change Date may vary
40
+ for each version of the Licensed Work released by Licensor.
41
+
42
+ You must conspicuously display this License on each original or modified copy
43
+ of the Licensed Work. If you receive the Licensed Work in original or
44
+ modified form from a third party, the terms and conditions set forth in this
45
+ License apply to your use of that work.
46
+
47
+ Any use of the Licensed Work in violation of this License will automatically
48
+ terminate your rights under this License for the current and all other
49
+ versions of the Licensed Work.
50
+
51
+ This License does not grant you any right in any trademark or logo of
52
+ Licensor or its affiliates (provided that you may use a trademark or logo of
53
+ Licensor as expressly required by this License).
54
+
55
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
56
+ AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
57
+ EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
58
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
59
+ TITLE.
60
+
61
+ MariaDB hereby grants you permission to use this License's text to license
62
+ your works, and to refer to it using the trademark "Business Source License",
63
+ as long as you comply with the Covenants of Licensor below.
64
+
65
+ ---
66
+
67
+ Covenants of Licensor
68
+
69
+ In consideration of the right to use this License's text and the "Business
70
+ Source License" name and trademark, Licensor covenants to MariaDB, and to all
71
+ other recipients of the licensed work to be provided by Licensor:
72
+
73
+ 1. To specify as the Change License the GPL Version 2.0 or any later version,
74
+ or a license that is compatible with GPL Version 2.0 or a later version,
75
+ where "compatible" means that software provided under the Change License can
76
+ be included in a program with software provided under GPL Version 2.0 or a
77
+ later version. Licensor may specify additional Change Licenses without
78
+ limitation.
79
+
80
+ 2. To either: (a) specify an additional grant of rights to use that does not
81
+ impose any additional restriction on the right granted in this License, as
82
+ the Additional Use Grant; or (b) insert the text "None".
83
+
84
+ 3. To specify a Change Date.
85
+
86
+ 4. Not to modify this License in any other way.
87
+
88
+ ---
89
+
90
+ Notice
91
+
92
+ The Business Source License (this document, or the "License") is not an Open
93
+ Source license. However, the Licensed Work will eventually be made available
94
+ under an Open Source License, as stated in this License.
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ <img src="https://github.com/user-attachments/assets/e34f3d25-71dd-4084-8f3e-4f1c73381c66" alt="Agor Logo" width="320" />
2
+
3
+ # Agor
4
+
5
+ Orchestrate Claude Code, Codex, and Gemini sessions on a multiplayer canvas. Manage git worktrees, track AI conversations, and visualize your team's agentic work in real-time.
6
+
7
+ **[Docs](https://mistercrunch.github.io/agor/)** | **[Discussions](https://github.com/mistercrunch/agor/discussions)**
8
+
9
+ ---
10
+
11
+ ## Quick Start
12
+
13
+ **Install globally (recommended):**
14
+
15
+ ```bash
16
+ npm install -g agor-live
17
+ agor daemon start
18
+ agor ui open
19
+ ```
20
+
21
+ **Or try in Codespaces** (for team collaboration with public URL):
22
+
23
+ [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/mistercrunch/agor?quickstart=1&devcontainer_path=.devcontainer%2Fplayground%2Fdevcontainer.json)
24
+
25
+ **Or run with Docker** (for contributing):
26
+
27
+ ```bash
28
+ docker compose up
29
+ # Open http://localhost:5173
30
+ # Login: admin@agor.live / admin
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Screenshots
36
+
37
+ ![Agor Hero](apps/agor-docs/public/hero.png)
38
+
39
+ _Multiplayer spatial canvas with zones, real-time cursors, and session organization_
40
+
41
+ <div align="center">
42
+ <table>
43
+ <tr>
44
+ <td width="50%">
45
+
46
+ ![Conversation View](apps/agor-docs/public/screenshots/conversation_full_page.png)
47
+
48
+ <p align="center"><em>Task-centric conversation UI</em></p>
49
+
50
+ </td>
51
+ <td width="50%">
52
+
53
+ ![Settings Modal](apps/agor-docs/public/screenshots/settings_modal.png)
54
+
55
+ <p align="center"><em>MCP server and worktree management</em></p>
56
+
57
+ </td>
58
+ </tr>
59
+ <tr>
60
+ <td width="50%">
61
+
62
+ ![Create Session Modal](apps/agor-docs/public/screenshots/create_session_modal.png)
63
+
64
+ <p align="center"><em>Session creation with agent selection</em></p>
65
+
66
+ </td>
67
+ <td width="50%">
68
+
69
+ ![Zone Trigger Modal](apps/agor-docs/public/screenshots/zone_trigger_modal.png)
70
+
71
+ <p align="center"><em>Zone trigger configuration</em></p>
72
+
73
+ </td>
74
+ </tr>
75
+ </table>
76
+ </div>
77
+
78
+ ---
79
+
80
+ ## What It Does
81
+
82
+ - **Agent orchestration** - Run Claude Code, Codex, Gemini from one interface
83
+ - **Git worktree management** - Isolated workspaces per session, no branch conflicts
84
+ - **Real-time board** - Drag sessions around, organize by project/phase/zone
85
+ - **Session tracking** - Every AI conversation is stored, searchable, forkable
86
+ - **MCP integration** - Configure MCP servers once, use across all agents
87
+ - **Multiplayer** - See teammates' sessions, share environments, async handoffs
88
+
89
+ ---
90
+
91
+ ## Core Concepts
92
+
93
+ **Sessions** - Container for agent interactions with git state, tasks, genealogy
94
+ **Worktrees** - Git worktrees managed by Agor, isolated per session
95
+ **Boards** - Spatial canvas for organizing sessions (like Trello for AI work)
96
+ **Zones** - Areas on board that trigger templated prompts when sessions dropped
97
+ **Tasks** - User prompts tracked as first-class work units
98
+
99
+ ---
100
+
101
+ ## Architecture
102
+
103
+ ```
104
+ Frontend (React + Ant Design)
105
+ ↓ WebSocket
106
+ Daemon (FeathersJS)
107
+
108
+ Database (LibSQL) + Git Worktrees
109
+
110
+ Agent SDKs (Claude, Codex, Gemini)
111
+ ```
112
+
113
+ **Stack:** FeathersJS, Drizzle ORM, LibSQL, React Flow, Ant Design
114
+
115
+ See [Architecture Guide](https://mistercrunch.github.io/agor/guide/architecture) for details.
116
+
117
+ ---
118
+
119
+ ## Key Features
120
+
121
+ ### Git Worktree Management
122
+
123
+ Every session maps to a git worktree - no more branch conflicts when running parallel AI work.
124
+
125
+ ### Environment Management
126
+
127
+ Start/stop dev servers per worktree. Each gets unique ports. Share running environments with teammates via URL.
128
+
129
+ ### Zone Triggers
130
+
131
+ Drop sessions on zones to trigger templated workflows (analyze → develop → review → deploy).
132
+
133
+ ### Session Genealogy
134
+
135
+ Fork sessions to explore alternatives. Spawn subsessions with fresh context. Full ancestry tracking.
136
+
137
+ ### Multi-Agent Support
138
+
139
+ Swap between Claude/Codex/Gemini mid-task. Compare outputs. Hand off when one model stalls.
140
+
141
+ ---
142
+
143
+ ## Development
144
+
145
+ ```bash
146
+ # Terminal 1: Daemon
147
+ cd apps/agor-daemon && pnpm dev # :3030
148
+
149
+ # Terminal 2: UI
150
+ cd apps/agor-ui && pnpm dev # :5173
151
+ ```
152
+
153
+ See [CLAUDE.md](CLAUDE.md) for dev workflow and [PROJECT.md](PROJECT.md) for roadmap.
154
+
155
+ ---
156
+
157
+ ## Roadmap
158
+
159
+ - Match CLI-native features as SDKs evolve
160
+ - Bring Your Own IDE (VSCode/Cursor remote connection)
161
+ - Session forking UI with genealogy visualization
162
+ - Automated reports after task completion
163
+ - Context management system (modular markdown files)
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Agor Daemon Entry Point (Production)
5
+ *
6
+ * This entry point loads the bundled daemon from dist/daemon.
7
+ * The daemon is compiled from apps/agor-daemon and bundled during build.
8
+ */
9
+
10
+ import path from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+
13
+ // Get directory of this file
14
+ const dirname = path.dirname(fileURLToPath(import.meta.url));
15
+
16
+ // Daemon is bundled in dist/daemon relative to bin/
17
+ const daemonPath = path.resolve(dirname, '../dist/daemon/index.js');
18
+
19
+ // Import and run the daemon
20
+ await import(daemonPath);
package/bin/agor.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Agor CLI Entry Point (Production)
5
+ *
6
+ * This entry point loads the bundled CLI from dist/cli.
7
+ * The CLI commands are compiled from apps/agor-cli and bundled during build.
8
+ */
9
+
10
+ import { execute } from '@oclif/core';
11
+
12
+ // oclif will resolve commands relative to this file
13
+ // Commands are at ../dist/cli/commands (configured in package.json)
14
+ await execute({ development: false, dir: import.meta.url });
@@ -0,0 +1,29 @@
1
+ import { AgorClient } from '@agor/core/api';
2
+ import { Command } from '@oclif/core';
3
+
4
+ /**
5
+ * Base Command - Shared logic for all Agor CLI commands
6
+ *
7
+ * Reduces boilerplate by providing common functionality like daemon connection checking.
8
+ */
9
+
10
+ /**
11
+ * Base command with daemon connection utilities
12
+ */
13
+ declare abstract class BaseCommand extends Command {
14
+ protected daemonUrl: string | null;
15
+ /**
16
+ * Connect to daemon (checks if running first)
17
+ *
18
+ * @returns Feathers client instance
19
+ */
20
+ protected connectToDaemon(): Promise<AgorClient>;
21
+ /**
22
+ * Cleanup client connection
23
+ *
24
+ * Ensures socket is properly closed to prevent hanging processes
25
+ */
26
+ protected cleanupClient(client: AgorClient): Promise<void>;
27
+ }
28
+
29
+ export { BaseCommand };
@@ -0,0 +1,41 @@
1
+ // src/base-command.ts
2
+ import { createClient, isDaemonRunning } from "@agor/core/api";
3
+ import { getDaemonUrl } from "@agor/core/config";
4
+ import { Command } from "@oclif/core";
5
+ import chalk from "chalk";
6
+ var BaseCommand = class extends Command {
7
+ daemonUrl = null;
8
+ /**
9
+ * Connect to daemon (checks if running first)
10
+ *
11
+ * @returns Feathers client instance
12
+ */
13
+ async connectToDaemon() {
14
+ this.daemonUrl = await getDaemonUrl();
15
+ const running = await isDaemonRunning(this.daemonUrl);
16
+ if (!running) {
17
+ this.log(
18
+ chalk.red("\u2717 Daemon not running") + "\n\n" + chalk.bold("To start the daemon:") + "\n " + chalk.cyan("cd apps/agor-daemon && pnpm dev") + "\n\n" + chalk.bold("To configure daemon URL:") + "\n " + chalk.cyan("agor config set daemon.url <url>") + "\n " + chalk.gray(`Current: ${this.daemonUrl}`)
19
+ );
20
+ this.exit(1);
21
+ }
22
+ return createClient(this.daemonUrl, true, { verbose: false });
23
+ }
24
+ /**
25
+ * Cleanup client connection
26
+ *
27
+ * Ensures socket is properly closed to prevent hanging processes
28
+ */
29
+ async cleanupClient(client) {
30
+ await new Promise((resolve) => {
31
+ client.io.once("disconnect", () => resolve());
32
+ client.io.removeAllListeners("connect");
33
+ client.io.removeAllListeners("connect_error");
34
+ client.io.close();
35
+ setTimeout(resolve, 1e3);
36
+ });
37
+ }
38
+ };
39
+ export {
40
+ BaseCommand
41
+ };
@@ -0,0 +1,15 @@
1
+ import * as _oclif_core_interfaces from '@oclif/core/interfaces';
2
+ import { Command } from '@oclif/core';
3
+
4
+ declare class BoardAddSession extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ boardId: _oclif_core_interfaces.Arg<string, Record<string, unknown>>;
9
+ sessionId: _oclif_core_interfaces.Arg<string, Record<string, unknown>>;
10
+ };
11
+ run(): Promise<void>;
12
+ private cleanup;
13
+ }
14
+
15
+ export { BoardAddSession as default };
@@ -0,0 +1,102 @@
1
+ // src/commands/board/add-session.ts
2
+ import { createClient } from "@agor/core/api";
3
+ import { Args, Command } from "@oclif/core";
4
+ import chalk from "chalk";
5
+ var BoardAddSession = class _BoardAddSession extends Command {
6
+ static description = "Add a session's worktree to a board (sessions are organized through worktrees)";
7
+ static examples = [
8
+ "<%= config.bin %> <%= command.id %> default 0199b86c",
9
+ "<%= config.bin %> <%= command.id %> 0199b850 0199b86c-10ab-7409-b053-38b62327e695"
10
+ ];
11
+ static args = {
12
+ boardId: Args.string({
13
+ description: "Board ID or slug",
14
+ required: true
15
+ }),
16
+ sessionId: Args.string({
17
+ description: "Session ID (short or full)",
18
+ required: true
19
+ })
20
+ };
21
+ async run() {
22
+ const { args } = await this.parse(_BoardAddSession);
23
+ const client = createClient();
24
+ try {
25
+ const boardsResult = await client.service("boards").find();
26
+ const boards = Array.isArray(boardsResult) ? boardsResult : boardsResult.data;
27
+ const board = boards.find(
28
+ (b) => b.board_id === args.boardId || b.board_id.startsWith(args.boardId) || b.slug === args.boardId
29
+ );
30
+ if (!board) {
31
+ this.log(chalk.red(`\u2717 Board not found: ${args.boardId}`));
32
+ await this.cleanup(client);
33
+ process.exit(1);
34
+ }
35
+ const sessionsResult = await client.service("sessions").find();
36
+ const sessions = Array.isArray(sessionsResult) ? sessionsResult : sessionsResult.data;
37
+ const session = sessions.find(
38
+ (s) => s.session_id === args.sessionId || s.session_id.startsWith(args.sessionId)
39
+ );
40
+ if (!session) {
41
+ this.log(chalk.red(`\u2717 Session not found: ${args.sessionId}`));
42
+ await this.cleanup(client);
43
+ process.exit(1);
44
+ }
45
+ if (!session.worktree_id) {
46
+ this.log(chalk.red(`\u2717 Session has no worktree associated`));
47
+ await this.cleanup(client);
48
+ process.exit(1);
49
+ }
50
+ const worktreesResult = await client.service("worktrees").find();
51
+ const worktrees = Array.isArray(worktreesResult) ? worktreesResult : worktreesResult.data;
52
+ const worktree = worktrees.find((w) => w.worktree_id === session.worktree_id);
53
+ if (!worktree) {
54
+ this.log(chalk.red(`\u2717 Worktree not found for session`));
55
+ await this.cleanup(client);
56
+ process.exit(1);
57
+ }
58
+ const boardObjectsResult = await client.service("board-objects").find({
59
+ query: {
60
+ board_id: board.board_id
61
+ }
62
+ });
63
+ const boardObjects = Array.isArray(boardObjectsResult) ? boardObjectsResult : boardObjectsResult.data;
64
+ const existingObject = boardObjects.find(
65
+ (bo) => bo.worktree_id === worktree.worktree_id
66
+ );
67
+ if (existingObject) {
68
+ this.log(chalk.yellow(`\u26A0 Worktree "${worktree.name}" already on board "${board.name}"`));
69
+ await this.cleanup(client);
70
+ return;
71
+ }
72
+ await client.service("board-objects").create({
73
+ board_id: board.board_id,
74
+ worktree_id: worktree.worktree_id,
75
+ position: { x: 100, y: 100 }
76
+ });
77
+ this.log(
78
+ chalk.green(
79
+ `\u2713 Added worktree "${worktree.name}" (containing session ${session.session_id.substring(0, 8)}) to board "${board.name}"`
80
+ )
81
+ );
82
+ } catch (error) {
83
+ this.log(chalk.red("\u2717 Failed to add session to board"));
84
+ if (error instanceof Error) {
85
+ this.log(chalk.red(error.message));
86
+ }
87
+ await this.cleanup(client);
88
+ process.exit(1);
89
+ }
90
+ await this.cleanup(client);
91
+ }
92
+ async cleanup(client) {
93
+ await new Promise((resolve) => {
94
+ client.io.once("disconnect", () => resolve());
95
+ client.io.close();
96
+ setTimeout(() => resolve(), 1e3);
97
+ });
98
+ }
99
+ };
100
+ export {
101
+ BoardAddSession as default
102
+ };
@@ -0,0 +1,14 @@
1
+ import { Command } from '@oclif/core';
2
+
3
+ /**
4
+ * List all boards
5
+ */
6
+
7
+ declare class BoardList extends Command {
8
+ static description: string;
9
+ static examples: string[];
10
+ run(): Promise<void>;
11
+ private cleanup;
12
+ }
13
+
14
+ export { BoardList as default };
@@ -0,0 +1,74 @@
1
+ // src/commands/board/list.ts
2
+ import { createClient, isDaemonRunning } from "@agor/core/api";
3
+ import { getDaemonUrl } from "@agor/core/config";
4
+ import { Command } from "@oclif/core";
5
+ import chalk from "chalk";
6
+ import Table from "cli-table3";
7
+ var BoardList = class extends Command {
8
+ static description = "List all boards";
9
+ static examples = ["<%= config.bin %> <%= command.id %>"];
10
+ async run() {
11
+ const daemonUrl = await getDaemonUrl();
12
+ const running = await isDaemonRunning(daemonUrl);
13
+ if (!running) {
14
+ this.log(
15
+ chalk.red("\u2717 Daemon not running") + "\n\n" + chalk.bold("To start the daemon:") + "\n " + chalk.cyan("cd apps/agor-daemon && pnpm dev") + "\n\n" + chalk.bold("To configure daemon URL:") + "\n " + chalk.cyan("agor config set daemon.url <url>") + "\n " + chalk.gray(`Current: ${daemonUrl}`)
16
+ );
17
+ this.exit(1);
18
+ }
19
+ const client = createClient(daemonUrl, true, { verbose: false });
20
+ try {
21
+ const result = await client.service("boards").find();
22
+ const boards = Array.isArray(result) ? result : result.data;
23
+ if (boards.length === 0) {
24
+ this.log(chalk.yellow("No boards found."));
25
+ await this.cleanup(client);
26
+ return;
27
+ }
28
+ const boardObjectsResult = await client.service("board-objects").find();
29
+ const boardObjects = Array.isArray(boardObjectsResult) ? boardObjectsResult : boardObjectsResult.data;
30
+ const table = new Table({
31
+ head: [
32
+ chalk.cyan("ID"),
33
+ chalk.cyan("Name"),
34
+ chalk.cyan("Worktrees"),
35
+ chalk.cyan("Description"),
36
+ chalk.cyan("Created")
37
+ ],
38
+ colWidths: [12, 20, 12, 40, 12],
39
+ wordWrap: true
40
+ });
41
+ for (const board of boards) {
42
+ const worktreeCount = boardObjects.filter((bo) => bo.board_id === board.board_id).length;
43
+ table.push([
44
+ board.board_id.substring(0, 8),
45
+ `${board.icon || "\u{1F4CB}"} ${board.name}`,
46
+ worktreeCount.toString(),
47
+ board.description || "",
48
+ new Date(board.created_at).toLocaleDateString()
49
+ ]);
50
+ }
51
+ this.log(table.toString());
52
+ this.log(chalk.gray(`
53
+ Total: ${boards.length} board(s)`));
54
+ } catch (error) {
55
+ this.log(chalk.red("\u2717 Failed to fetch boards"));
56
+ if (error instanceof Error) {
57
+ this.log(chalk.red(error.message));
58
+ }
59
+ await this.cleanup(client);
60
+ process.exit(1);
61
+ }
62
+ await this.cleanup(client);
63
+ }
64
+ async cleanup(client) {
65
+ await new Promise((resolve) => {
66
+ client.io.once("disconnect", () => resolve());
67
+ client.io.close();
68
+ setTimeout(() => resolve(), 1e3);
69
+ });
70
+ }
71
+ };
72
+ export {
73
+ BoardList as default
74
+ };
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+
3
+ /**
4
+ * `agor config clear` - Clear all active context
5
+ */
6
+
7
+ declare class ConfigClear extends Command {
8
+ static description: string;
9
+ static examples: string[];
10
+ run(): Promise<void>;
11
+ }
12
+
13
+ export { ConfigClear as default };
@@ -0,0 +1,21 @@
1
+ // src/commands/config/clear.ts
2
+ import { clearContext } from "@agor/core/config";
3
+ import { Command } from "@oclif/core";
4
+ import chalk from "chalk";
5
+ var ConfigClear = class extends Command {
6
+ static description = "Clear all active context";
7
+ static examples = ["<%= config.bin %> <%= command.id %>"];
8
+ async run() {
9
+ try {
10
+ await clearContext();
11
+ this.log(`${chalk.green("\u2713")} Cleared all active context`);
12
+ } catch (error) {
13
+ this.error(
14
+ `Failed to clear config: ${error instanceof Error ? error.message : String(error)}`
15
+ );
16
+ }
17
+ }
18
+ };
19
+ export {
20
+ ConfigClear as default
21
+ };
@@ -0,0 +1,13 @@
1
+ import * as _oclif_core_interfaces from '@oclif/core/interfaces';
2
+ import { Command } from '@oclif/core';
3
+
4
+ declare class ConfigGet extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ key: _oclif_core_interfaces.Arg<string, Record<string, unknown>>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+
13
+ export { ConfigGet as default };
@@ -0,0 +1,41 @@
1
+ // src/commands/config/get.ts
2
+ import { getConfigValue, getContext } from "@agor/core/config";
3
+ import { Args, Command } from "@oclif/core";
4
+ var ConfigGet = class _ConfigGet extends Command {
5
+ static description = "Get a configuration value";
6
+ static examples = [
7
+ "<%= config.bin %> <%= command.id %> board",
8
+ "<%= config.bin %> <%= command.id %> session",
9
+ "<%= config.bin %> <%= command.id %> credentials.ANTHROPIC_API_KEY",
10
+ "<%= config.bin %> <%= command.id %> daemon.port"
11
+ ];
12
+ static args = {
13
+ key: Args.string({
14
+ description: "Configuration key (e.g., board, daemon.port, credentials.ANTHROPIC_API_KEY)",
15
+ required: true
16
+ })
17
+ };
18
+ async run() {
19
+ const { args } = await this.parse(_ConfigGet);
20
+ const key = args.key;
21
+ try {
22
+ let value;
23
+ const contextKeys = ["board", "session", "repo", "agent"];
24
+ if (contextKeys.includes(key)) {
25
+ value = await getContext(key);
26
+ } else {
27
+ value = await getConfigValue(key);
28
+ }
29
+ if (value !== void 0) {
30
+ this.log(String(value));
31
+ } else {
32
+ process.exit(1);
33
+ }
34
+ } catch (error) {
35
+ this.error(`Failed to get config: ${error instanceof Error ? error.message : String(error)}`);
36
+ }
37
+ }
38
+ };
39
+ export {
40
+ ConfigGet as default
41
+ };
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+
3
+ /**
4
+ * `agor config` - Show all configuration and active context
5
+ */
6
+
7
+ declare class ConfigIndex extends Command {
8
+ static description: string;
9
+ static examples: string[];
10
+ run(): Promise<void>;
11
+ }
12
+
13
+ export { ConfigIndex as default };