@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.
- package/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/README.md +340 -2
- package/SECURITY.md +333 -0
- package/THIRD_PARTY_NOTICES.md +62 -0
- package/bin/elu-code.mjs +209 -0
- package/bin/elu.cjs +10 -0
- package/bin/start.cjs +6 -0
- package/docs/peer-network.md +257 -0
- package/docs/permissions.md +285 -0
- package/docs/vendors/antigravity.md +131 -0
- package/docs/vendors/claude.md +124 -0
- package/docs/vendors/codex.md +64 -0
- package/docs/vendors/grok.md +151 -0
- package/lib/acp-client.mjs +100 -0
- package/lib/adapters/agy.mjs +283 -0
- package/lib/adapters/claude.mjs +311 -0
- package/lib/adapters/codex.mjs +137 -0
- package/lib/adapters/grok.mjs +384 -0
- package/lib/adapters/index.mjs +13 -0
- package/lib/agents.mjs +77 -0
- package/lib/agy-hook.mjs +53 -0
- package/lib/approval-server.mjs +85 -0
- package/lib/approvals.mjs +128 -0
- package/lib/awake.mjs +45 -0
- package/lib/board.mjs +261 -0
- package/lib/bot-models.mjs +71 -0
- package/lib/bot-schedules.mjs +291 -0
- package/lib/bots.mjs +361 -0
- package/lib/changes.mjs +168 -0
- package/lib/checks.mjs +102 -0
- package/lib/conductor.mjs +337 -0
- package/lib/config.mjs +147 -0
- package/lib/conformance.mjs +109 -0
- package/lib/default-bots.mjs +150 -0
- package/lib/detect.mjs +108 -0
- package/lib/diff.mjs +217 -0
- package/lib/editor.mjs +165 -0
- package/lib/format.mjs +51 -0
- package/lib/git.mjs +173 -0
- package/lib/init.mjs +129 -0
- package/lib/install.mjs +130 -0
- package/lib/kanban.mjs +180 -0
- package/lib/mcp.mjs +79 -0
- package/lib/memory.mjs +35 -0
- package/lib/models.mjs +144 -0
- package/lib/modes.mjs +95 -0
- package/lib/never-list.mjs +110 -0
- package/lib/never-shims.mjs +311 -0
- package/lib/paste.mjs +56 -0
- package/lib/peer/a2a-http.mjs +166 -0
- package/lib/peer/a2a.mjs +357 -0
- package/lib/peer/asks.mjs +329 -0
- package/lib/peer/canonical.mjs +72 -0
- package/lib/peer/cli.mjs +154 -0
- package/lib/peer/daemon.mjs +525 -0
- package/lib/peer/identity.mjs +81 -0
- package/lib/peer/index.mjs +291 -0
- package/lib/peer/intake.mjs +207 -0
- package/lib/peer/invite.mjs +76 -0
- package/lib/peer/paths.mjs +7 -0
- package/lib/peer/peerdata.mjs +21 -0
- package/lib/peer/pictures.mjs +295 -0
- package/lib/peer/plans.mjs +182 -0
- package/lib/peer/relay.mjs +31 -0
- package/lib/peer/replies.mjs +128 -0
- package/lib/peer/roster.mjs +256 -0
- package/lib/peer/rpc.mjs +88 -0
- package/lib/peer/secrets.mjs +88 -0
- package/lib/peer/settings.mjs +45 -0
- package/lib/peer/shares.mjs +120 -0
- package/lib/peer/status.mjs +84 -0
- package/lib/peer/taskstore.mjs +108 -0
- package/lib/peer/transport.mjs +120 -0
- package/lib/pictures.mjs +104 -0
- package/lib/plan.mjs +238 -0
- package/lib/policy.mjs +98 -0
- package/lib/process.mjs +92 -0
- package/lib/project-settings.mjs +55 -0
- package/lib/project-trust.mjs +230 -0
- package/lib/projects.mjs +668 -0
- package/lib/publish.mjs +105 -0
- package/lib/runner.mjs +874 -0
- package/lib/sandbox.mjs +102 -0
- package/lib/schedules.mjs +270 -0
- package/lib/selection.mjs +202 -0
- package/lib/shell.mjs +101 -0
- package/lib/state.mjs +247 -0
- package/lib/terminal-bots.mjs +239 -0
- package/lib/terminal-commands.mjs +165 -0
- package/lib/terminal-plan.mjs +37 -0
- package/lib/terminal-visuals.mjs +270 -0
- package/lib/terminal.mjs +3181 -0
- package/lib/unit-file.mjs +17 -0
- package/lib/usage.mjs +249 -0
- package/lib/util.mjs +86 -0
- package/lib/vendor-check.mjs +96 -0
- package/lib/vendors.mjs +191 -0
- package/lib/workspace.mjs +168 -0
- package/lib/yaml.mjs +624 -0
- package/npm-shrinkwrap.json +827 -0
- 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
|
-
#
|
|
1
|
+
# ELU Code
|
|
2
2
|
|
|
3
|
-
|
|
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
|
+

|
|
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).
|