@bill10/agent-007 0.6.4000 → 0.6.5000
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/.env.example +6 -4
- package/README.md +15 -14
- package/VERSION +1 -1
- package/bin/agent-007.js +2 -2
- package/package.json +3 -2
- package/server/claude-trust.js +14 -2
- package/server/pty.js +4 -2
- package/server.js +3 -2
package/.env.example
CHANGED
|
@@ -46,9 +46,11 @@
|
|
|
46
46
|
# runs anywhere, and every job-board worker gets a brand-new worktree. By default
|
|
47
47
|
# the app accepts it for board workers (it adds the worktree to ~/.claude.json
|
|
48
48
|
# before the spawn, and answers "Yes" if the dialog still appears), so queued
|
|
49
|
-
# jobs start on their own.
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
49
|
+
# jobs start on their own. Codex asks the same, and its board workers are
|
|
50
|
+
# started with that one worktree trusted for the run (-c projects=...; nothing
|
|
51
|
+
# is written to ~/.codex/config.toml). A trusted worktree loads that repo's own
|
|
52
|
+
# .claude/settings.json, or Codex's project config, hooks and exec policies:
|
|
53
|
+
# its hooks run, and its permission allow rules can pre-approve what a strict
|
|
54
|
+
# board mode would ask about. 0/false/off/no keeps the dialog for both.
|
|
53
55
|
# Hand-started agents always keep it.
|
|
54
56
|
# TRUST_BOARD_WORKTREES=0
|
package/README.md
CHANGED
|
@@ -3,14 +3,23 @@
|
|
|
3
3
|
[](https://github.com/bill10/agent-007/actions/workflows/test-ubuntu.yml)
|
|
4
4
|
[](https://github.com/bill10/agent-007/actions/workflows/test-windows.yml)
|
|
5
5
|
|
|
6
|
-
**
|
|
7
|
-
|
|
8
|
-
Agents run in parallel, each in its own git worktree; one boss agent runs the board for you; and a pixel office shows who's working and who's waiting on you.
|
|
6
|
+
**From web terminals for your coding agents to a self-running agent company.**
|
|
9
7
|
|
|
10
8
|

|
|
11
9
|
|
|
12
10
|
*Recorded from the running app. If the capture does not load, there is a [still screenshot](docs/screenshot.png).*
|
|
13
11
|
|
|
12
|
+
Use it as far along as you need:
|
|
13
|
+
|
|
14
|
+
1. **One task: one agent in a web terminal.** Start Claude Code, Codex or any CLI agent in the browser. Add a repo once; every agent gets its own git worktree and branch, so you never set one up by hand.
|
|
15
|
+
2. **Many tasks across projects: many terminals, one window.** Every repo and every agent in one place, with live terminals, a file explorer, inline diffs, and a pixel office where each agent faces its screen while it works and turns to you when it needs you.
|
|
16
|
+
3. **Stop watching them: a job board.** Put tasks on the board and Claude Code or Codex workers pick them up, each in its own worktree, and move them To do -> In progress -> Review on their own, landing as a pull request (or a summary, for work that isn't code). Cards can run on a cron schedule, and agents can post cards and message each other.
|
|
17
|
+
4. **Stop posting jobs: give Billion a goal.** Billion is one always-on agent that plans, posts the jobs, reviews what comes back and merges the PRs. It only asks you about money, access or anything irreversible.
|
|
18
|
+
|
|
19
|
+
Claude Code, Codex, any terminal agent is supported -- use your existing subscriptions, no extra charge.
|
|
20
|
+
|
|
21
|
+
It runs locally on your machine, so agents work while it is on and awake. Billion's plan and memory live in a git repo, so it picks up where it left off after a restart. Every worker is a real terminal you can open and type into, from your phone too ([remote access](docs/REMOTE.md)).
|
|
22
|
+
|
|
14
23
|
## Quick Start
|
|
15
24
|
|
|
16
25
|
```bash
|
|
@@ -45,22 +54,14 @@ Uncomment what you want, then restart. The ones people change:
|
|
|
45
54
|
| `HOST=0.0.0.0` + `ALLOWED_ORIGINS=<tailnet name>` | Reach it from your phone or another machine (behind Tailscale only, see [docs/REMOTE.md](docs/REMOTE.md)) |
|
|
46
55
|
| `CLAUDE_PERMISSION_MODE` | Mode Claude Code agents start in, e.g. `bypassPermissions` |
|
|
47
56
|
| `CODEX_PERMISSION_MODE` | The same for Codex |
|
|
48
|
-
| `TRUST_BOARD_WORKTREES=0` | Keeps Claude Code's folder-trust prompt for job board workers |
|
|
57
|
+
| `TRUST_BOARD_WORKTREES=0` | Keeps Claude Code's and Codex's folder-trust prompt for job board workers |
|
|
49
58
|
| `PORT` | Port to listen on (default `7007`) |
|
|
50
59
|
|
|
51
60
|
Highest wins: command-line flags (`--port`), then environment variables, then
|
|
52
61
|
a `.env` in the directory you start it from, then `~/.agent-007/.env`. The full
|
|
53
62
|
list is in [Configuration](#configuration) and `--help`.
|
|
54
63
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- **A job board, not a babysitting job** -- Each card gets a fresh agent on its own worktree and branch. It moves To do -> In progress -> Review on its own and lands as a pull request (or a summary, for work that isn't code). Cards can also run on a cron schedule.
|
|
58
|
-
- **Billion, the one agent you talk to** -- Give it a mission and it plans, posts cards, reviews what comes back, merges PRs and answers its workers' permission requests. It comes to you only for money, access, anything irreversible and real forks in direction.
|
|
59
|
-
- **Your agents, your subscriptions** -- Claude Code, Codex, any terminal agent is supported -- use your existing subscriptions, no extra charge.
|
|
60
|
-
- **See everything at a glance** -- Every agent gets a desk in the pixel office: facing the screen while it works, turning to face you when it needs you. One window for every repo, with live terminals, a file explorer and inline diffs.
|
|
61
|
-
- **Agents that talk to each other** -- Tell one to "add that to the job board" or "ask Viper what it changed", and it does it over MCP.
|
|
62
|
-
|
|
63
|
-
Everything else -- scheduled jobs, phone layout, voice input, themes, and the details and caveats of each feature -- is in [docs/FEATURES.md](docs/FEATURES.md).
|
|
64
|
+
The details and caveats of every feature -- phone layout, voice input, themes and more -- are in [docs/FEATURES.md](docs/FEATURES.md).
|
|
64
65
|
|
|
65
66
|
## Keyboard Shortcuts
|
|
66
67
|
|
|
@@ -120,7 +121,7 @@ ALLOWED_ORIGINS=mac-mini.tailXXXX.ts.net npm start # Allow a remote browser or
|
|
|
120
121
|
| `AGENT_MESSAGING` | *(guarded)* | `open` lets any of your agents message any other. By default an agent that asks before acting cannot message one that never asks |
|
|
121
122
|
| `BILLION` | *(on)* | `0` (or `false`/`off`/`no`) turns Billion off. It is also off whenever user accounts exist, since it would belong to everyone |
|
|
122
123
|
| `BILLION_DIR` | `~/.agent-007/billion` | Billion's own folder and git repo. Point it at a new or empty folder |
|
|
123
|
-
| `TRUST_BOARD_WORKTREES` | *(on)* | Board-dispatched Claude Code workers skip the workspace-trust dialog, so queued jobs start unattended. That also lets the repo's own `.claude/settings.json` hooks and
|
|
124
|
+
| `TRUST_BOARD_WORKTREES` | *(on)* | Board-dispatched Claude Code and Codex workers skip the workspace-trust dialog, so queued jobs start unattended. That also lets the repo's own `.claude/settings.json` (or Codex project config, hooks and exec policies) apply without asking. `0` (or `false`/`off`/`no`) keeps the dialog. Hand-started agents always keep it |
|
|
124
125
|
|
|
125
126
|
> **Running remotely?** The server spawns real shells, so never expose it to the
|
|
126
127
|
> open internet. See [docs/REMOTE.md](docs/REMOTE.md) for the recommended
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.6.
|
|
1
|
+
0.6.5.0
|
package/bin/agent-007.js
CHANGED
|
@@ -41,8 +41,8 @@ Settings (default in brackets):
|
|
|
41
41
|
AGENT_MESSAGING open = any agent may message any other [guarded]
|
|
42
42
|
BILLION 0 turns off Billion, the always-on agent [on]
|
|
43
43
|
BILLION_DIR Billion's folder and repo [~/.agent-007/billion]
|
|
44
|
-
TRUST_BOARD_WORKTREES 0 keeps Claude Code's folder-trust
|
|
45
|
-
board workers [on]
|
|
44
|
+
TRUST_BOARD_WORKTREES 0 keeps Claude Code's and Codex's folder-trust
|
|
45
|
+
prompt for job board workers [on]
|
|
46
46
|
|
|
47
47
|
Set them in the environment, in ~/.agent-007/.env (\`agent-007 init\` writes it,
|
|
48
48
|
every setting explained and commented out), or in a .env in the current
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bill10/agent-007",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.6.5000",
|
|
4
|
+
"description": "From web terminals for your coding agents to a self-running agent company: Claude Code and Codex in parallel git worktrees, a job board they pick work from, and one agent that runs the board from a goal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"coding-agents",
|
|
53
53
|
"ai-agents",
|
|
54
54
|
"agent-orchestration",
|
|
55
|
+
"autonomous-agents",
|
|
55
56
|
"parallel-agents",
|
|
56
57
|
"git-worktree",
|
|
57
58
|
"job-board",
|
package/server/claude-trust.js
CHANGED
|
@@ -18,14 +18,26 @@ import { join } from 'path';
|
|
|
18
18
|
import { sessionAgentFromCommand } from '../lib/jobs.js';
|
|
19
19
|
import { envSwitchOn } from '../lib/helpers.js';
|
|
20
20
|
|
|
21
|
-
// Board-dispatched Claude Code workers only, and on unless
|
|
21
|
+
// Board-dispatched Claude Code and Codex workers only, and on unless
|
|
22
22
|
// TRUST_BOARD_WORKTREES says otherwise (0/false/off/no). Hand-started agents
|
|
23
23
|
// keep the dialog.
|
|
24
24
|
export function autoTrusts({ spawnedBy, worktreePath, command }, env = process.env) {
|
|
25
|
-
return spawnedBy === 'board' && !!worktreePath && sessionAgentFromCommand(command)
|
|
25
|
+
return spawnedBy === 'board' && !!worktreePath && ['claude', 'codex'].includes(sessionAgentFromCommand(command))
|
|
26
26
|
&& envSwitchOn(env.TRUST_BOARD_WORKTREES);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
// Codex asks "Do you trust the contents of this directory?" in a new worktree
|
|
30
|
+
// too, and records the answer as [projects."<path>"] trust_level in
|
|
31
|
+
// ~/.codex/config.toml. A -c override does the same for this one run and
|
|
32
|
+
// writes nothing: an inline table merges with the user's own [projects]
|
|
33
|
+
// (verified against codex-cli 0.154), and unlike a dotted key it survives the
|
|
34
|
+
// dot in ~/.agent-007. A JSON string is a valid TOML basic string.
|
|
35
|
+
export function codexTrustArgs(folder) {
|
|
36
|
+
let path = folder;
|
|
37
|
+
try { path = realpathSync(folder); } catch {}
|
|
38
|
+
return ['-c', `projects={${JSON.stringify(path)}={trust_level="trusted"}}`];
|
|
39
|
+
}
|
|
40
|
+
|
|
29
41
|
const isRecord = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
30
42
|
|
|
31
43
|
// True when the entry is there afterwards. Never throws. Workers inherit the
|
package/server/pty.js
CHANGED
|
@@ -14,6 +14,7 @@ import { broadcastJobs } from './jobs.js';
|
|
|
14
14
|
import { flushMessages, dropMessages } from './messages.js';
|
|
15
15
|
import { sessionAgentFromCommand, permissionFlagsFromCommand } from '../lib/jobs.js';
|
|
16
16
|
import { trustDialogKey } from './billion.js';
|
|
17
|
+
import { codexTrustArgs } from './claude-trust.js';
|
|
17
18
|
import { dropApprovals } from './approvals.js';
|
|
18
19
|
|
|
19
20
|
// Regex constants for output filtering (shared, not recreated per event)
|
|
@@ -234,7 +235,8 @@ export function createSessionFromConfig({ sessionId, name, color, command, repoP
|
|
|
234
235
|
// would put a live board credential on disk for terminals that have no way to
|
|
235
236
|
// use it — a plain `bash` tab does not need one.
|
|
236
237
|
const mcpConfigPath = takesMcpConfig(file) ? writeMcpConfig(sessionId, agentToken) : null;
|
|
237
|
-
const
|
|
238
|
+
const codexTrust = autoTrust && sessionAgentFromCommand(command) === 'codex';
|
|
239
|
+
const mcpArgs = withMcpConfig(file, codexTrust ? [...codexTrustArgs(worktreePath), ...args] : args, mcpConfigPath);
|
|
238
240
|
// A worker on one of Billion's cards asks Billion before it asks a person
|
|
239
241
|
// (server/approvals.js) — where the CLI can be hooked, which today is
|
|
240
242
|
// Claude Code only. Recorded as whether the hook actually went in.
|
|
@@ -308,7 +310,7 @@ export function createSessionFromConfig({ sessionId, name, color, command, repoP
|
|
|
308
310
|
spawnedBy: spawnedBy || 'user',
|
|
309
311
|
jobId: jobId || null, // job this session was dispatched for, if any
|
|
310
312
|
isBillion: !!isBillion, // the one agent you talk to (server/billion.js)
|
|
311
|
-
answersTrust: !!(isBillion || autoTrust), // see answerTrustDialog
|
|
313
|
+
answersTrust: !!(isBillion || (autoTrust && !codexTrust)), // see answerTrustDialog; Codex's flag leaves nothing to answer
|
|
312
314
|
approvalsToBillion: hooked, // its permission dialogs go to Billion first
|
|
313
315
|
exited: false,
|
|
314
316
|
stateCheckInterval: null,
|
package/server.js
CHANGED
|
@@ -32,7 +32,7 @@ import { setupRoutes } from './server/http.js';
|
|
|
32
32
|
import { startDispatcher, stopDispatcher, boardSettings } from './server/jobs.js';
|
|
33
33
|
import { orphans, config } from './server/state.js';
|
|
34
34
|
import { sweepMcpConfigs } from './server/agent-mcp.js';
|
|
35
|
-
import { withDefaultPermission, envPermissionMode, PERMISSION_MODES, ENV_PERMISSION_MODE } from './lib/jobs.js';
|
|
35
|
+
import { withDefaultPermission, envPermissionMode, PERMISSION_MODES, ENV_PERMISSION_MODE, sessionAgentFromCommand } from './lib/jobs.js';
|
|
36
36
|
import { BILLION_NAME, billionEnabled, billionRuns, billionDir, ensureBillionRepo, refreshCharter, suggestProjectsDir, billionCommand, noClaudeCommand } from './server/billion.js';
|
|
37
37
|
import { commandExists, missingCommandMessage } from './server/command-path.js';
|
|
38
38
|
import { parseCommand } from './lib/helpers.js';
|
|
@@ -100,8 +100,9 @@ async function createSession(command, name, repoPath, customBranch, ownerId, met
|
|
|
100
100
|
|
|
101
101
|
// A board worker's worktree is brand new, so Claude Code would stop at its
|
|
102
102
|
// workspace-trust dialog until someone clicked (server/claude-trust.js).
|
|
103
|
+
// Codex's is skipped by a flag instead (server/pty.js).
|
|
103
104
|
const autoTrust = autoTrusts({ spawnedBy: meta.spawnedBy, worktreePath, command });
|
|
104
|
-
if (autoTrust) trustClaudeFolder(worktreePath);
|
|
105
|
+
if (autoTrust && sessionAgentFromCommand(command) === 'claude') trustClaudeFolder(worktreePath);
|
|
105
106
|
|
|
106
107
|
const result = createSessionFromConfig({
|
|
107
108
|
sessionId, name: agentName, color, command,
|