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.
- package/LICENSE +94 -0
- package/README.md +163 -0
- package/bin/agor-daemon.js +20 -0
- package/bin/agor.js +14 -0
- package/dist/cli/base-command.d.ts +29 -0
- package/dist/cli/base-command.js +41 -0
- package/dist/cli/commands/board/add-session.d.ts +15 -0
- package/dist/cli/commands/board/add-session.js +102 -0
- package/dist/cli/commands/board/list.d.ts +14 -0
- package/dist/cli/commands/board/list.js +74 -0
- package/dist/cli/commands/config/clear.d.ts +13 -0
- package/dist/cli/commands/config/clear.js +21 -0
- package/dist/cli/commands/config/get.d.ts +13 -0
- package/dist/cli/commands/config/get.js +41 -0
- package/dist/cli/commands/config/index.d.ts +13 -0
- package/dist/cli/commands/config/index.js +118 -0
- package/dist/cli/commands/config/set.d.ts +14 -0
- package/dist/cli/commands/config/set.js +50 -0
- package/dist/cli/commands/config/unset.d.ts +13 -0
- package/dist/cli/commands/config/unset.js +35 -0
- package/dist/cli/commands/daemon/index.d.ts +13 -0
- package/dist/cli/commands/daemon/index.js +65 -0
- package/dist/cli/commands/daemon/logs.d.ts +13 -0
- package/dist/cli/commands/daemon/logs.js +78 -0
- package/dist/cli/commands/daemon/restart.d.ts +13 -0
- package/dist/cli/commands/daemon/restart.js +177 -0
- package/dist/cli/commands/daemon/start.d.ts +13 -0
- package/dist/cli/commands/daemon/start.js +193 -0
- package/dist/cli/commands/daemon/status.d.ts +13 -0
- package/dist/cli/commands/daemon/status.js +93 -0
- package/dist/cli/commands/daemon/stop.d.ts +13 -0
- package/dist/cli/commands/daemon/stop.js +108 -0
- package/dist/cli/commands/init.d.ts +44 -0
- package/dist/cli/commands/init.js +459 -0
- package/dist/cli/commands/mcp/add.d.ts +26 -0
- package/dist/cli/commands/mcp/add.js +162 -0
- package/dist/cli/commands/mcp/list.d.ts +16 -0
- package/dist/cli/commands/mcp/list.js +89 -0
- package/dist/cli/commands/mcp/remove.d.ts +17 -0
- package/dist/cli/commands/mcp/remove.js +86 -0
- package/dist/cli/commands/mcp/show.d.ts +14 -0
- package/dist/cli/commands/mcp/show.js +131 -0
- package/dist/cli/commands/repo/add.d.ts +16 -0
- package/dist/cli/commands/repo/add.js +105 -0
- package/dist/cli/commands/repo/list.d.ts +17 -0
- package/dist/cli/commands/repo/list.js +99 -0
- package/dist/cli/commands/repo/rm.d.ts +17 -0
- package/dist/cli/commands/repo/rm.js +126 -0
- package/dist/cli/commands/repo/worktree/add.d.ts +21 -0
- package/dist/cli/commands/repo/worktree/add.js +145 -0
- package/dist/cli/commands/repo/worktree/list.d.ts +21 -0
- package/dist/cli/commands/repo/worktree/list.js +136 -0
- package/dist/cli/commands/session/list.d.ts +30 -0
- package/dist/cli/commands/session/list.js +204 -0
- package/dist/cli/commands/session/load-claude.d.ts +16 -0
- package/dist/cli/commands/session/load-claude.js +211 -0
- package/dist/cli/commands/user/create-admin.d.ts +13 -0
- package/dist/cli/commands/user/create-admin.js +65 -0
- package/dist/cli/commands/user/create.d.ts +16 -0
- package/dist/cli/commands/user/create.js +126 -0
- package/dist/cli/commands/user/delete.d.ts +16 -0
- package/dist/cli/commands/user/delete.js +77 -0
- package/dist/cli/commands/user/list.d.ts +13 -0
- package/dist/cli/commands/user/list.js +78 -0
- package/dist/cli/commands/user/update.d.ts +19 -0
- package/dist/cli/commands/user/update.js +149 -0
- package/dist/cli/hooks/command-not-found.d.ts +9 -0
- package/dist/cli/hooks/command-not-found.js +14 -0
- package/dist/cli/lib/banner.d.ts +25 -0
- package/dist/cli/lib/banner.js +25 -0
- package/dist/cli/lib/context.d.ts +27 -0
- package/dist/cli/lib/context.js +32 -0
- package/dist/cli/lib/daemon-manager.d.ts +48 -0
- package/dist/cli/lib/daemon-manager.js +109 -0
- package/dist/cli/lib/help.d.ts +13 -0
- package/dist/cli/lib/help.js +46 -0
- package/dist/core/agentic-tool-B_gFNpk5.d.ts +33 -0
- package/dist/core/agentic-tool-DsyX8diw.d.cts +33 -0
- package/dist/core/api/index.cjs +98 -0
- package/dist/core/api/index.d.cts +174 -0
- package/dist/core/api/index.d.ts +174 -0
- package/dist/core/api/index.js +62 -0
- package/dist/core/board-comment-BUm0fpmD.d.cts +134 -0
- package/dist/core/board-comment-gC_-twPx.d.ts +134 -0
- package/dist/core/claude/index.cjs +673 -0
- package/dist/core/claude/index.d.cts +124 -0
- package/dist/core/claude/index.d.ts +124 -0
- package/dist/core/claude/index.js +629 -0
- package/dist/core/config/browser.cjs +165 -0
- package/dist/core/config/browser.d.cts +289 -0
- package/dist/core/config/browser.d.ts +289 -0
- package/dist/core/config/browser.js +131 -0
- package/dist/core/config/index.cjs +518 -0
- package/dist/core/config/index.d.cts +246 -0
- package/dist/core/config/index.d.ts +246 -0
- package/dist/core/config/index.js +451 -0
- package/dist/core/db/index.cjs +3726 -0
- package/dist/core/db/index.d.cts +631 -0
- package/dist/core/db/index.d.ts +631 -0
- package/dist/core/db/index.js +3649 -0
- package/dist/core/dist/agentic-tool-B_gFNpk5.d.ts +33 -0
- package/dist/core/dist/agentic-tool-DsyX8diw.d.cts +33 -0
- package/dist/core/dist/api/index.cjs +98 -0
- package/dist/core/dist/api/index.d.cts +174 -0
- package/dist/core/dist/api/index.d.ts +174 -0
- package/dist/core/dist/api/index.js +62 -0
- package/dist/core/dist/board-comment-BUm0fpmD.d.cts +134 -0
- package/dist/core/dist/board-comment-gC_-twPx.d.ts +134 -0
- package/dist/core/dist/claude/index.cjs +673 -0
- package/dist/core/dist/claude/index.d.cts +124 -0
- package/dist/core/dist/claude/index.d.ts +124 -0
- package/dist/core/dist/claude/index.js +629 -0
- package/dist/core/dist/config/browser.cjs +165 -0
- package/dist/core/dist/config/browser.d.cts +289 -0
- package/dist/core/dist/config/browser.d.ts +289 -0
- package/dist/core/dist/config/browser.js +131 -0
- package/dist/core/dist/config/index.cjs +518 -0
- package/dist/core/dist/config/index.d.cts +246 -0
- package/dist/core/dist/config/index.d.ts +246 -0
- package/dist/core/dist/config/index.js +451 -0
- package/dist/core/dist/db/index.cjs +3726 -0
- package/dist/core/dist/db/index.d.cts +631 -0
- package/dist/core/dist/db/index.d.ts +631 -0
- package/dist/core/dist/db/index.js +3649 -0
- package/dist/core/dist/environment/variable-resolver.cjs +92 -0
- package/dist/core/dist/environment/variable-resolver.d.cts +52 -0
- package/dist/core/dist/environment/variable-resolver.d.ts +52 -0
- package/dist/core/dist/environment/variable-resolver.js +53 -0
- package/dist/core/dist/feathers/index.cjs +66 -0
- package/dist/core/dist/feathers/index.d.cts +7 -0
- package/dist/core/dist/feathers/index.d.ts +7 -0
- package/dist/core/dist/feathers/index.js +25 -0
- package/dist/core/dist/feathers-BzHEPnpl.d.cts +228 -0
- package/dist/core/dist/feathers-BzHEPnpl.d.ts +228 -0
- package/dist/core/dist/git/index.cjs +302 -0
- package/dist/core/dist/git/index.d.cts +137 -0
- package/dist/core/dist/git/index.d.ts +137 -0
- package/dist/core/dist/git/index.js +260 -0
- package/dist/core/dist/id-DMqyogFB.d.cts +131 -0
- package/dist/core/dist/id-DMqyogFB.d.ts +131 -0
- package/dist/core/dist/index.cjs +4653 -0
- package/dist/core/dist/index.d.cts +23 -0
- package/dist/core/dist/index.d.ts +23 -0
- package/dist/core/dist/index.js +4509 -0
- package/dist/core/dist/message-BoxZISHg.d.cts +120 -0
- package/dist/core/dist/message-DvBzHu7V.d.ts +120 -0
- package/dist/core/dist/permissions/index.cjs +112 -0
- package/dist/core/dist/permissions/index.d.cts +81 -0
- package/dist/core/dist/permissions/index.d.ts +81 -0
- package/dist/core/dist/permissions/index.js +85 -0
- package/dist/core/dist/repo-3CUrCRbq.d.cts +405 -0
- package/dist/core/dist/repo-CnvJ0B6-.d.ts +405 -0
- package/dist/core/dist/session-BPjJlVdZ.d.cts +429 -0
- package/dist/core/dist/session-wAzjHatv.d.ts +429 -0
- package/dist/core/dist/task-BIEgT1DK.d.cts +163 -0
- package/dist/core/dist/task-DuIfiUbW.d.ts +163 -0
- package/dist/core/dist/templates/handlebars-helpers.cjs +156 -0
- package/dist/core/dist/templates/handlebars-helpers.d.cts +45 -0
- package/dist/core/dist/templates/handlebars-helpers.d.ts +45 -0
- package/dist/core/dist/templates/handlebars-helpers.js +119 -0
- package/dist/core/dist/tools/claude/models.cjs +70 -0
- package/dist/core/dist/tools/claude/models.d.cts +27 -0
- package/dist/core/dist/tools/claude/models.d.ts +27 -0
- package/dist/core/dist/tools/claude/models.js +44 -0
- package/dist/core/dist/tools/index.cjs +3367 -0
- package/dist/core/dist/tools/index.d.cts +967 -0
- package/dist/core/dist/tools/index.d.ts +967 -0
- package/dist/core/dist/tools/index.js +3314 -0
- package/dist/core/dist/tools/models.cjs +119 -0
- package/dist/core/dist/tools/models.d.cts +47 -0
- package/dist/core/dist/tools/models.d.ts +47 -0
- package/dist/core/dist/tools/models.js +86 -0
- package/dist/core/dist/types/index.cjs +152 -0
- package/dist/core/dist/types/index.d.cts +214 -0
- package/dist/core/dist/types/index.d.ts +214 -0
- package/dist/core/dist/types/index.js +112 -0
- package/dist/core/dist/user-BmL3kFol.d.ts +50 -0
- package/dist/core/dist/user-eUuKj7yM.d.cts +50 -0
- package/dist/core/dist/utils/pricing.cjs +102 -0
- package/dist/core/dist/utils/pricing.d.cts +43 -0
- package/dist/core/dist/utils/pricing.d.ts +43 -0
- package/dist/core/dist/utils/pricing.js +75 -0
- package/dist/core/dist/worktrees-BzIxB1U6.d.cts +2745 -0
- package/dist/core/dist/worktrees-CYem1ya2.d.ts +2745 -0
- package/dist/core/environment/variable-resolver.cjs +92 -0
- package/dist/core/environment/variable-resolver.d.cts +52 -0
- package/dist/core/environment/variable-resolver.d.ts +52 -0
- package/dist/core/environment/variable-resolver.js +53 -0
- package/dist/core/feathers/index.cjs +66 -0
- package/dist/core/feathers/index.d.cts +7 -0
- package/dist/core/feathers/index.d.ts +7 -0
- package/dist/core/feathers/index.js +25 -0
- package/dist/core/feathers-BzHEPnpl.d.cts +228 -0
- package/dist/core/feathers-BzHEPnpl.d.ts +228 -0
- package/dist/core/git/index.cjs +302 -0
- package/dist/core/git/index.d.cts +137 -0
- package/dist/core/git/index.d.ts +137 -0
- package/dist/core/git/index.js +260 -0
- package/dist/core/id-DMqyogFB.d.cts +131 -0
- package/dist/core/id-DMqyogFB.d.ts +131 -0
- package/dist/core/index.cjs +4653 -0
- package/dist/core/index.d.cts +23 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.js +4509 -0
- package/dist/core/message-BoxZISHg.d.cts +120 -0
- package/dist/core/message-DvBzHu7V.d.ts +120 -0
- package/dist/core/package.json +133 -0
- package/dist/core/permissions/index.cjs +112 -0
- package/dist/core/permissions/index.d.cts +81 -0
- package/dist/core/permissions/index.d.ts +81 -0
- package/dist/core/permissions/index.js +85 -0
- package/dist/core/repo-3CUrCRbq.d.cts +405 -0
- package/dist/core/repo-CnvJ0B6-.d.ts +405 -0
- package/dist/core/session-BPjJlVdZ.d.cts +429 -0
- package/dist/core/session-wAzjHatv.d.ts +429 -0
- package/dist/core/task-BIEgT1DK.d.cts +163 -0
- package/dist/core/task-DuIfiUbW.d.ts +163 -0
- package/dist/core/templates/handlebars-helpers.cjs +156 -0
- package/dist/core/templates/handlebars-helpers.d.cts +45 -0
- package/dist/core/templates/handlebars-helpers.d.ts +45 -0
- package/dist/core/templates/handlebars-helpers.js +119 -0
- package/dist/core/tools/claude/models.cjs +70 -0
- package/dist/core/tools/claude/models.d.cts +27 -0
- package/dist/core/tools/claude/models.d.ts +27 -0
- package/dist/core/tools/claude/models.js +44 -0
- package/dist/core/tools/index.cjs +3367 -0
- package/dist/core/tools/index.d.cts +967 -0
- package/dist/core/tools/index.d.ts +967 -0
- package/dist/core/tools/index.js +3314 -0
- package/dist/core/tools/models.cjs +119 -0
- package/dist/core/tools/models.d.cts +47 -0
- package/dist/core/tools/models.d.ts +47 -0
- package/dist/core/tools/models.js +86 -0
- package/dist/core/types/index.cjs +152 -0
- package/dist/core/types/index.d.cts +214 -0
- package/dist/core/types/index.d.ts +214 -0
- package/dist/core/types/index.js +112 -0
- package/dist/core/user-BmL3kFol.d.ts +50 -0
- package/dist/core/user-eUuKj7yM.d.cts +50 -0
- package/dist/core/utils/pricing.cjs +102 -0
- package/dist/core/utils/pricing.d.cts +43 -0
- package/dist/core/utils/pricing.d.ts +43 -0
- package/dist/core/utils/pricing.js +75 -0
- package/dist/core/worktrees-BzIxB1U6.d.cts +2745 -0
- package/dist/core/worktrees-CYem1ya2.d.ts +2745 -0
- package/dist/daemon/adapters/drizzle.d.ts +114 -0
- package/dist/daemon/adapters/drizzle.js +219 -0
- package/dist/daemon/declarations.d.ts +101 -0
- package/dist/daemon/declarations.js +0 -0
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.js +4093 -0
- package/dist/daemon/mcp/routes.d.ts +15 -0
- package/dist/daemon/mcp/routes.js +641 -0
- package/dist/daemon/mcp/tokens.d.ts +50 -0
- package/dist/daemon/mcp/tokens.js +85 -0
- package/dist/daemon/services/board-comments.d.ts +97 -0
- package/dist/daemon/services/board-comments.js +326 -0
- package/dist/daemon/services/board-objects.d.ts +71 -0
- package/dist/daemon/services/board-objects.js +117 -0
- package/dist/daemon/services/boards.d.ts +64 -0
- package/dist/daemon/services/boards.js +286 -0
- package/dist/daemon/services/config.d.ts +35 -0
- package/dist/daemon/services/config.js +68 -0
- package/dist/daemon/services/context.d.ts +55 -0
- package/dist/daemon/services/context.js +113 -0
- package/dist/daemon/services/health-monitor.d.ts +58 -0
- package/dist/daemon/services/health-monitor.js +158 -0
- package/dist/daemon/services/mcp-servers.d.ts +42 -0
- package/dist/daemon/services/mcp-servers.js +275 -0
- package/dist/daemon/services/messages.d.ts +49 -0
- package/dist/daemon/services/messages.js +269 -0
- package/dist/daemon/services/repos.d.ts +61 -0
- package/dist/daemon/services/repos.js +350 -0
- package/dist/daemon/services/session-mcp-servers.d.ts +56 -0
- package/dist/daemon/services/session-mcp-servers.js +51 -0
- package/dist/daemon/services/sessions.d.ts +64 -0
- package/dist/daemon/services/sessions.js +398 -0
- package/dist/daemon/services/tasks.d.ts +55 -0
- package/dist/daemon/services/tasks.js +318 -0
- package/dist/daemon/services/terminals.d.ts +75 -0
- package/dist/daemon/services/terminals.js +110 -0
- package/dist/daemon/services/users.d.ts +98 -0
- package/dist/daemon/services/users.js +177 -0
- package/dist/daemon/services/worktrees.d.ts +98 -0
- package/dist/daemon/services/worktrees.js +719 -0
- package/dist/daemon/strategies/anonymous.d.ts +20 -0
- package/dist/daemon/strategies/anonymous.js +32 -0
- package/dist/ui/assets/cc-CYmbalCD.png +0 -0
- package/dist/ui/assets/codex-4sLD1mVS.png +0 -0
- package/dist/ui/assets/cursor-BUy5pFVL.png +0 -0
- package/dist/ui/assets/gemini-ajOb7iAl.png +0 -0
- package/dist/ui/assets/index-Dc4ELxry.css +32 -0
- package/dist/ui/assets/index-KfIu8v4V.js +578 -0
- package/dist/ui/favicon.png +0 -0
- package/dist/ui/index.html +26 -0
- package/dist/ui/vite.svg +1 -0
- 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
|
+
[](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
|
+

|
|
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
|
+

|
|
47
|
+
|
|
48
|
+
<p align="center"><em>Task-centric conversation UI</em></p>
|
|
49
|
+
|
|
50
|
+
</td>
|
|
51
|
+
<td width="50%">
|
|
52
|
+
|
|
53
|
+

|
|
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
|
+

|
|
63
|
+
|
|
64
|
+
<p align="center"><em>Session creation with agent selection</em></p>
|
|
65
|
+
|
|
66
|
+
</td>
|
|
67
|
+
<td width="50%">
|
|
68
|
+
|
|
69
|
+

|
|
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 };
|