@elu-labs/elu 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/README.md +340 -2
  4. package/SECURITY.md +333 -0
  5. package/THIRD_PARTY_NOTICES.md +62 -0
  6. package/bin/elu-code.mjs +209 -0
  7. package/bin/elu.cjs +10 -0
  8. package/bin/start.cjs +6 -0
  9. package/docs/peer-network.md +257 -0
  10. package/docs/permissions.md +285 -0
  11. package/docs/vendors/antigravity.md +131 -0
  12. package/docs/vendors/claude.md +124 -0
  13. package/docs/vendors/codex.md +64 -0
  14. package/docs/vendors/grok.md +151 -0
  15. package/lib/acp-client.mjs +100 -0
  16. package/lib/adapters/agy.mjs +283 -0
  17. package/lib/adapters/claude.mjs +311 -0
  18. package/lib/adapters/codex.mjs +137 -0
  19. package/lib/adapters/grok.mjs +384 -0
  20. package/lib/adapters/index.mjs +13 -0
  21. package/lib/agents.mjs +77 -0
  22. package/lib/agy-hook.mjs +53 -0
  23. package/lib/approval-server.mjs +85 -0
  24. package/lib/approvals.mjs +128 -0
  25. package/lib/awake.mjs +45 -0
  26. package/lib/board.mjs +261 -0
  27. package/lib/bot-models.mjs +71 -0
  28. package/lib/bot-schedules.mjs +291 -0
  29. package/lib/bots.mjs +361 -0
  30. package/lib/changes.mjs +168 -0
  31. package/lib/checks.mjs +102 -0
  32. package/lib/conductor.mjs +337 -0
  33. package/lib/config.mjs +147 -0
  34. package/lib/conformance.mjs +109 -0
  35. package/lib/default-bots.mjs +150 -0
  36. package/lib/detect.mjs +108 -0
  37. package/lib/diff.mjs +217 -0
  38. package/lib/editor.mjs +165 -0
  39. package/lib/format.mjs +51 -0
  40. package/lib/git.mjs +173 -0
  41. package/lib/init.mjs +129 -0
  42. package/lib/install.mjs +130 -0
  43. package/lib/kanban.mjs +180 -0
  44. package/lib/mcp.mjs +79 -0
  45. package/lib/memory.mjs +35 -0
  46. package/lib/models.mjs +144 -0
  47. package/lib/modes.mjs +95 -0
  48. package/lib/never-list.mjs +110 -0
  49. package/lib/never-shims.mjs +311 -0
  50. package/lib/paste.mjs +56 -0
  51. package/lib/peer/a2a-http.mjs +166 -0
  52. package/lib/peer/a2a.mjs +357 -0
  53. package/lib/peer/asks.mjs +329 -0
  54. package/lib/peer/canonical.mjs +72 -0
  55. package/lib/peer/cli.mjs +154 -0
  56. package/lib/peer/daemon.mjs +525 -0
  57. package/lib/peer/identity.mjs +81 -0
  58. package/lib/peer/index.mjs +291 -0
  59. package/lib/peer/intake.mjs +207 -0
  60. package/lib/peer/invite.mjs +76 -0
  61. package/lib/peer/paths.mjs +7 -0
  62. package/lib/peer/peerdata.mjs +21 -0
  63. package/lib/peer/pictures.mjs +295 -0
  64. package/lib/peer/plans.mjs +182 -0
  65. package/lib/peer/relay.mjs +31 -0
  66. package/lib/peer/replies.mjs +128 -0
  67. package/lib/peer/roster.mjs +256 -0
  68. package/lib/peer/rpc.mjs +88 -0
  69. package/lib/peer/secrets.mjs +88 -0
  70. package/lib/peer/settings.mjs +45 -0
  71. package/lib/peer/shares.mjs +120 -0
  72. package/lib/peer/status.mjs +84 -0
  73. package/lib/peer/taskstore.mjs +108 -0
  74. package/lib/peer/transport.mjs +120 -0
  75. package/lib/pictures.mjs +104 -0
  76. package/lib/plan.mjs +238 -0
  77. package/lib/policy.mjs +98 -0
  78. package/lib/process.mjs +92 -0
  79. package/lib/project-settings.mjs +55 -0
  80. package/lib/project-trust.mjs +230 -0
  81. package/lib/projects.mjs +668 -0
  82. package/lib/publish.mjs +105 -0
  83. package/lib/runner.mjs +874 -0
  84. package/lib/sandbox.mjs +102 -0
  85. package/lib/schedules.mjs +270 -0
  86. package/lib/selection.mjs +202 -0
  87. package/lib/shell.mjs +101 -0
  88. package/lib/state.mjs +247 -0
  89. package/lib/terminal-bots.mjs +239 -0
  90. package/lib/terminal-commands.mjs +165 -0
  91. package/lib/terminal-plan.mjs +37 -0
  92. package/lib/terminal-visuals.mjs +270 -0
  93. package/lib/terminal.mjs +3181 -0
  94. package/lib/unit-file.mjs +17 -0
  95. package/lib/usage.mjs +249 -0
  96. package/lib/util.mjs +86 -0
  97. package/lib/vendor-check.mjs +96 -0
  98. package/lib/vendors.mjs +191 -0
  99. package/lib/workspace.mjs +168 -0
  100. package/lib/yaml.mjs +624 -0
  101. package/npm-shrinkwrap.json +827 -0
  102. package/package.json +70 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ELU Labs, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
package/README.md CHANGED
@@ -1,3 +1,341 @@
1
- # Temporary Holding Version
1
+ # ELU Code
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A full-screen terminal app that runs coding sessions on the AI command lines you already
4
+ use, with bots that review and do work, and teammates you can ask.
5
+
6
+ ![ELU Code on a made-up project, with stand-in vendors](docs/demo.gif)
7
+
8
+ ## Install
9
+
10
+ From your home folder, not inside a project you do not trust:
11
+
12
+ ```sh
13
+ npx -y @elu-labs/elu
14
+ ```
15
+
16
+ This opens ELU Code and installs the `elu` command; next time you type `elu`.
17
+
18
+ You need macOS or Linux, Node 22 or newer, Git, Claude Code signed in, and Codex installed
19
+ (no sign-in needed; its sandbox runs your project's checks):
20
+ `npm install --global @openai/codex`. Using Antigravity? Read
21
+ [its page](docs/vendors/antigravity.md) first. More in [Install details](#install-details).
22
+
23
+ ## Start
24
+
25
+ ```sh
26
+ elu
27
+ ```
28
+
29
+ The first start asks for a project name; later starts open your last project. Type a
30
+ message and press Enter. That starts a session: the model answers, or edits in a new Git
31
+ worktree on its own branch. Then the project's checks run and `@reviewer` reviews the
32
+ change. Nothing is pushed until you type `/publish` and confirm.
33
+
34
+ A worktree sits beside its repository, in a folder named after it with `.elu-code` added
35
+ (`shop.elu-code` beside `shop`). When a Task edits the project folder itself and the folder
36
+ has no commits yet, ELU Code first commits its files there as `Start project history`,
37
+ running `git init` if it needs to, and pushes nothing. A file that looks like a secret, such
38
+ as `.env`, stops it until `.gitignore` keeps that file out.
39
+
40
+ | Tab | What it shows |
41
+ | --- | --- |
42
+ | Sessions | Every session across your projects. The selected one is open beside the list. |
43
+ | Projects | Your projects. `n` makes one, `o` makes another the active one. |
44
+ | Kanban | The open project's tasks: To do, In progress, Needs you, Done. In a project shared with a team, the Tasks teammates' sessions are working on show under them, by teammate, to read only. |
45
+ | Chats | Your team's channels, your teammates and your bots. |
46
+ | Bots | Your bots. `n` makes one, Enter opens one. |
47
+ | Usage | Your vendor accounts and their plan usage. |
48
+
49
+ Click a tab's name. Or press Tab until the tab row is selected, choose with ← and →, and
50
+ press Enter.
51
+
52
+ ## Tasks
53
+
54
+ Ask for a change to code or files, or for work that needs planning, and the first reply is
55
+ a Task: a title, a description, the goal, the objectives that say when it is done, a
56
+ priority and a severity. Nothing is edited yet.
57
+
58
+ | Do | What happens |
59
+ | --- | --- |
60
+ | Esc, then `y` | Approves the Task. The work starts by itself. |
61
+ | Esc, then `n` | Rejects it. Nothing is changed. |
62
+ | Type a message | Changes the Task. The card shows the new revision. |
63
+
64
+ Typing `yes` and Enter approves too. A question gets a plain answer and no Task. A follow-up
65
+ inside an approved Task's goal starts at once; a new piece of work gets a Task of its own.
66
+ An approved Task gives its session its name, unless you named the session yourself.
67
+
68
+ On the Kanban tab a session with a Task shows as that Task: its title, how far it is, its
69
+ priority and its severity. One that waits for your approval is under Needs you. Enter opens
70
+ its session.
71
+
72
+ After you approve, the model splits the work into subtasks and changes them as it likes.
73
+ The card lists them as a checklist and marks the objectives the model reports met. The
74
+ Task is done when every objective is reported met and the turn, with its checks and
75
+ review, has ended. A new message opens it again.
76
+
77
+ ELU Code starts the edit only for a Task you approved. What the model can still do in its
78
+ first turn depends on the vendor and the mode:
79
+ [docs/permissions.md](docs/permissions.md#plan-first).
80
+
81
+ ## Commands
82
+
83
+ Type these in the message box. `/` alone lists every command, and `/help` explains the keys.
84
+
85
+ You can send a message at any time. One sent while the session is working waits in the chat and is sent by itself when that turn ends; several go together, in order. `↑` in the empty message box takes the newest one back so you can change it.
86
+
87
+ | Type | What it does |
88
+ | --- | --- |
89
+ | `/new` | Starts a new session |
90
+ | `/model sonnet` | Chooses the model of this session; `/model` alone lists them |
91
+ | `/permissions auto` | Sets what the model may do: `ask`, `auto` or `full` |
92
+ | `/place branch try-coupons` | Sets where a new session runs: `worktree`, `branch NAME` or `here` |
93
+ | `/bots add qa` | Keeps a bot in this session; `/bots remove qa` takes it out |
94
+ | `/agent add fable` | Adds another model to this session as an agent; write `@fable` and what to do. Words after the model say what it is for, and `--name NAME` names it: `/agent add sonnet you review my SQL --name sql` |
95
+ | `@pair is there a simpler way?` | Asks a bot. Your next messages in that session go to it too |
96
+ | `@model and what do you think?` | Writes to the session's model again |
97
+ | `/changes` | Shows what this session changed; `/chat` goes back |
98
+ | `/publish` | Shows the exact push and draft pull request, then asks you |
99
+ | `/stop` | Stops the running response. A message you sent while it ran is sent next; `/stop` again cancels that message |
100
+ | `/schedule` | Starts a session later or on a schedule, such as `daily 9:00` or `every 2h` |
101
+ | `/budget 5` | Limits this session to 5 dollars; `/budget off` removes the limit |
102
+ | `! git status` | Runs a shell command. In an open session the model gets the command and its output with your next message |
103
+ | `/quit` | Closes ELU Code. Sessions that are running or queued go on in the background; `elu conductor stop` stops them |
104
+
105
+ A schedule also runs while ELU Code is closed, through a login item, once ELU Code is
106
+ installed (not run through `npx`). On macOS, while an agent works or a schedule is on, ELU
107
+ Code stops the Mac from going to sleep on its own (`caffeinate -i`); the display can still
108
+ sleep. Schedules show in the Sessions tab under Scheduled: `p` pauses one and `x` deletes
109
+ it.
110
+
111
+ ## Permissions
112
+
113
+ Each session runs in one of three modes. `/permissions ask`, `auto` or `full` changes it,
114
+ and `/permissions default auto` sets what new sessions start with.
115
+
116
+ - **Ask for approval** (`ask`, the default): asks before outside edits, escapes, and internet.
117
+ Codex cannot ask you during a turn, so there these are refused and reported.
118
+ - **Approve for me** (`auto`): a reviewer model, not you, decides on escapes and internet.
119
+ On Grok Build, what its reviewer refuses then asks you.
120
+ - **Full access** (`full`): any file, any command, the internet.
121
+
122
+ When the model asks, `y` allows and `n` denies; `f` allows and gives that session Full access.
123
+ You can change the mode while a turn runs.
124
+
125
+ Bots that review, and a teammate's question, always run read only.
126
+ `/permissions folders add <path>` lets the model read one more folder of your home this
127
+ session.
128
+
129
+ On Claude Code, your own MCP servers (`claude mcp list`) are on for the model and for bots
130
+ that work, and their tools run without asking in every mode. Neither the sandbox nor the
131
+ never list below covers them, so a server can reach the internet and act on other services.
132
+ `/mcp off NAME` turns one off for the project. A teammate's question never gets them.
133
+
134
+ ELU Code does not push, merge, tag, deploy or publish by itself. `/publish` shows the exact
135
+ push and the draft pull request, waits for you, and refuses a default branch. The model is
136
+ told never to run those commands, and on Claude Code they are denied by rule; in Full access
137
+ that is a rule on the command's text, not a sandbox. Stand-in commands, first on every
138
+ session's PATH, also refuse them by name, inside a script too; a full path to the real
139
+ command gets past those. One exception: a bot that is allowed
140
+ to merge pull requests may run `gh pr merge`. Ask for approval still asks you first; in
141
+ Approve for me the reviewer model decides. `@elu` comes allowed; a bot you make is not.
142
+ Details:
143
+ [docs/permissions.md](docs/permissions.md), [SECURITY.md](SECURITY.md).
144
+
145
+ ## Bots
146
+
147
+ A bot is a model with a name and instructions. You write it once and use it in any session.
148
+ In a session a bot reviews each change, answers when you write `@name`, or does work of its
149
+ own.
150
+
151
+ Five come with the app. You can edit or remove any of them in the Bots tab.
152
+
153
+ | Bot | Runs on | What it does |
154
+ | --- | --- | --- |
155
+ | `@reviewer` | Claude, Opus | Reviews every change for correctness, security, performance and maintainability |
156
+ | `@lead` | Claude, Fable, with Opus helpers | When you write to it: plans the work, hands the pieces to helpers, and checks what they return |
157
+ | `@qa` | Claude, Opus | When you write to it: tests the change like a user, fixes what it finds, and verifies each fix |
158
+ | `@pair` | Codex, `gpt-6.1-sol`, high effort | A second model beside the working agent: says what it would challenge after each turn, and reviews each change |
159
+ | `@elu` | Claude, every hour | Finds issues in your live product with [ELU](https://elu.dev), then reviews and merges the fix pull request or writes the fix |
160
+
161
+ - A new session starts with `@reviewer`. `/bots add qa` adds another bot, and so does `@qa`
162
+ alone and then Enter.
163
+ - `@lead plan the refund change` gives a bot work. `@lead`, `@qa`, `@elu` and each bot you
164
+ make do the work you write to them, within the session's permissions; `@reviewer` and
165
+ `@pair` read and answer.
166
+ - After you write to a bot, your next messages in that session go to it too, until you name
167
+ another bot or start a message with `@model`. The title of the message box names who gets
168
+ the message. A bot you stop picks up where it stopped on your next message when it runs on
169
+ Claude Code or Grok Build; on the others its next turn starts from the chat. When it
170
+ cannot pick up, a line in the chat says so and the turn starts from the chat.
171
+ - To make a bot, open the Bots tab, press `n` and answer its questions. Enter on a bot
172
+ opens its page, where each row changes one thing: its model, its schedule, its MCP
173
+ servers, its instructions. How a bot goes about its work is in its instructions: write
174
+ there that it hands pieces to helpers, and on Claude Code it can start them.
175
+ - Each bot has a color: its name and its replies show in it. **Color** on its page changes
176
+ it, and so does `/bots color qa gold`. `/bots color qa random` picks another.
177
+ - `@elu` starts when it joins a session and then runs there every hour. Once ELU Code is
178
+ installed, it runs while ELU Code is closed too, through the login item that runs
179
+ schedules. `/bots schedule off elu` stops that in one session. It needs ELU connected:
180
+ `npx -y @elu-labs/cli --offer=promo` signs you up, or in, adds ELU to your web app and
181
+ connects your AI tools.
182
+
183
+ ## Teammates
184
+
185
+ Your computer can ask a teammate's, and theirs can ask yours. There is no ELU server:
186
+ the two connect directly over Hyperswarm.
187
+
188
+ ```sh
189
+ # on your computer
190
+ elu id --name sam # once: your name on the team
191
+ elu team create shop
192
+ elu peer on
193
+ elu invite # prints a code that works once, within 24 hours
194
+
195
+ # on your teammate's computer, in the project you may ask about
196
+ elu id --name kim
197
+ elu peer on
198
+ elu join CODE
199
+ ```
200
+
201
+ `elu peers` shows who is online. In the app, write to a teammate in the Chats tab, or
202
+ type `@kim where are the tax rates?` in any session. A teammate's question is answered
203
+ read only, from a project you shared. `elu share`, or `/share` in the app, shares the
204
+ project you are in. Adding a teammate shares one too: `elu invite` and `elu join` share
205
+ the folder you run them in when it is an ELU Code project (`--project PATH` names
206
+ another), and `/invite` and `/join` share the open project. The wire format is in
207
+ [docs/peer-network.md](docs/peer-network.md).
208
+
209
+ Teammates on a team a project is shared with also see the work in it: for each live
210
+ editing task, the first line of its request and the paths of the files it changed, and the
211
+ approved Tasks its sessions work on. `elu share --no-status`, in the project, turns that
212
+ off. [SECURITY.md](SECURITY.md#what-teammates-are-told) says exactly what is sent.
213
+
214
+ A message you type can carry pictures. Drag a screenshot into the message box, or write
215
+ its path, and it goes with the message: up to 4 pictures, 8 MB each. Your teammate's model
216
+ sees them when it answers.
217
+
218
+ In a channel, `/invite @kim` adds a teammate you already have. `/invite` alone makes a
219
+ code for someone new; the first time, it also makes your team, named after the open project.
220
+
221
+ ## Install details
222
+
223
+ Sessions run in the vendors' own unmodified command lines (Claude Code, Codex, Antigravity
224
+ and Grok Build), with your existing sign-in. ELU Code has no account and no telemetry, and
225
+ it never reads your Claude Code sign-in. The Usage tab shows Claude plan usage from what
226
+ Claude Code reports during your sessions. For Codex plan usage, ELU Code starts Codex's own
227
+ `app-server`, which asks with your Codex sign-in, whenever `codex` is installed: when you
228
+ open a project that is set up or send a message, at most once a minute while a session is
229
+ on screen, and from the Usage tab ([what is read and when](SECURITY.md#credentials)).
230
+
231
+ You need macOS or Linux, Node 22 or newer, Git, and Claude Code (`claude`) installed and
232
+ signed in: new projects and the built-in bots run on it. To run sessions on Codex
233
+ (`codex`), sign in to it and choose it with `/model`.
234
+
235
+ Codex must be installed even if your sessions run on Claude Code, but it does not need to
236
+ be signed in. ELU Code runs your project's checks and its pre-push hooks inside Codex's
237
+ sandbox (`codex sandbox`); without it the checks fail and `/publish` refuses. Install it
238
+ with `npm install --global @openai/codex`. To use a copy that is not on your PATH, set
239
+ `ELU_CODE_SANDBOX_HELPER` to its absolute path. On Linux that sandbox is bubblewrap:
240
+ install `bubblewrap` and, on Ubuntu 24.04, load the AppArmor profile in
241
+ [docs/permissions.md](docs/permissions.md#linux). The Linux tests run with both.
242
+
243
+ GitHub CLI (`gh`) is needed for draft pull requests, and for `@elu` to review and merge a
244
+ fix pull request.
245
+
246
+ The first run of `npx -y @elu-labs/elu` opens ELU Code and installs `elu` as a global
247
+ command: it prints the `npm install --global` line it runs, and uses `~/.local` when npm's
248
+ global folder cannot be written. To open ELU Code without installing anything, run
249
+ `ELU_NO_INSTALL=1 npx -y @elu-labs/elu`.
250
+
251
+ Run `npx -y @elu-labs/elu` from your home folder, not from inside a project you do not
252
+ trust: `npx` lets the folder it starts in decide what runs.
253
+
254
+ The Usage tab lists the vendor command lines ELU Code found and whether each is signed in.
255
+ Antigravity (`agy`) and Grok Build (`grok`) are checked once on each machine: your first
256
+ message to one starts the check by itself. It takes about seven short turns on that vendor
257
+ and a few minutes. Vendor notes: [docs/vendors](docs/vendors).
258
+
259
+ Google's FAQ says that using another app to reach Antigravity breaks its terms and can get
260
+ your account suspended or terminated. ELU Code wraps `agy`, so read
261
+ [docs/vendors/antigravity.md](docs/vendors/antigravity.md) before you send it a message.
262
+
263
+ ## Update and remove
264
+
265
+ ```sh
266
+ npx -y @elu-labs/elu@latest
267
+ ```
268
+
269
+ That installs the newest version where `elu` already is, and opens it. If peer mode is on,
270
+ restart it so it runs the new version: `elu peer off`, wait until `elu peer status` says
271
+ the daemon is stopped, then `elu peer on`.
272
+
273
+ To remove ELU Code, first delete your schedules in the app (Sessions tab, under Scheduled:
274
+ `x` on each one), so they no longer keep the Mac awake, and quit it with `/quit`.
275
+
276
+ Then remove the login item that runs schedules, and bots with a schedule such as `@elu`,
277
+ while ELU Code is closed, if there is one. On macOS, run
278
+ `launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/dev.elu-code.scheduler.plist`
279
+ and delete that file. On Linux, run `systemctl --user disable --now elu-code-scheduler.timer`
280
+ and delete `elu-code-scheduler.service` and `elu-code-scheduler.timer` in
281
+ `~/.config/systemd/user`.
282
+
283
+ Stop what still runs in the background:
284
+
285
+ ```sh
286
+ elu peer off # if peer mode is on
287
+ elu peer uninstall # if you made the peer daemon start at login
288
+ elu conductor stop # stops sessions that are still running
289
+ ```
290
+
291
+ In each project folder that is a Git repository, see what ELU Code would remove there,
292
+ then remove it:
293
+
294
+ ```sh
295
+ elu uninstall --dry-run
296
+ elu uninstall # asks before it removes anything
297
+ ```
298
+
299
+ That removes the project's run history in `.git/elu-code`, which can hold secrets a command
300
+ printed; its task worktrees, and their folder once it is empty; and what `elu init` or
301
+ `/setup` wrote: `.elu-code/config.yaml` and the marked part of `AGENTS.md` and `CLAUDE.md`.
302
+ It keeps the task branches. It stops at a worktree with changes you have not committed,
303
+ and at a worktree of another repository: remove those first, as below.
304
+
305
+ Last:
306
+
307
+ ```sh
308
+ npm uninstall --global @elu-labs/elu
309
+ ```
310
+
311
+ If `elu` is in `~/.local/bin`, add `--prefix "$HOME/.local"` to that line.
312
+
313
+ These stay, for you to delete:
314
+
315
+ - `~/.config/elu-code`: your bots, your projects, your peer identity, and the sessions of a
316
+ project whose folder is not a Git repository.
317
+ - `~/.local/share/elu-code`: the stand-in commands that refuse the never list.
318
+ - `~/.cache/elu`: an empty folder that held Claude Code's temporary files.
319
+ - `.elu-code/project.json` in each project folder, with the project's name, and any
320
+ setting saved beside it that `elu uninstall` did not list.
321
+ - Task worktrees in a repository that is not itself the project folder, which a session
322
+ edited. They sit beside that repository, in `shop.elu-code` for `shop`. In the
323
+ repository, `git worktree list` shows them and `git worktree remove PATH` removes one;
324
+ then delete the folder.
325
+ - Task branches, whose names start with `feat/task-`: `git branch -D NAME` in their
326
+ repository.
327
+
328
+ ## Help and contributing
329
+
330
+ - A question or a bug: [open an issue](https://github.com/ELU-Labs/elu/issues).
331
+ - A security problem: report it privately, as [SECURITY.md](SECURITY.md) says.
332
+ - A change to the code: [CONTRIBUTING.md](CONTRIBUTING.md).
333
+
334
+ ## Credits and license
335
+
336
+ MIT licensed. Sponsored by [ELU](https://elu.dev).
337
+
338
+ `@reviewer` is adapted from the code-review skill in Anthropic's knowledge-work-plugins
339
+ (Apache-2.0), and `@qa` from the qa skill in gstack by Garry Tan (MIT). The examples in
340
+ `test/fixtures/a2a/` come from the A2A specification (Apache-2.0). See
341
+ [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).