brindle 0.3.3__tar.gz → 0.3.5__tar.gz
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.
- {brindle-0.3.3 → brindle-0.3.5}/.gitignore +4 -0
- {brindle-0.3.3 → brindle-0.3.5}/PKG-INFO +47 -24
- {brindle-0.3.3 → brindle-0.3.5}/README.md +46 -23
- {brindle-0.3.3 → brindle-0.3.5}/pyproject.toml +1 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/agents.py +255 -20
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/antigravity.py +8 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/autopilot.py +335 -41
- brindle-0.3.5/src/brindle/builtin_agents/developer-fable.md +7 -0
- brindle-0.3.5/src/brindle/builtin_agents/developer-gemini.md +7 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/developer-heavy.md +2 -2
- brindle-0.3.5/src/brindle/builtin_agents/reviewer-codex.md +30 -0
- brindle-0.3.5/src/brindle/builtin_agents/reviewer-gemini.md +30 -0
- brindle-0.3.5/src/brindle/builtin_agents/reviewer-local.md +29 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/reviewer.md +8 -3
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/supervisor.md +6 -4
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/cli.py +112 -15
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/config.py +30 -10
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/cost_estimate.py +8 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/cull.py +11 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/db.py +75 -3
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/events.py +76 -11
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/git.py +68 -4
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/keystore.py +14 -3
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/mcp_server.py +39 -11
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/model_availability.py +5 -2
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pane_auth.py +5 -4
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pipeline.py +35 -4
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/policy.py +15 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/learning.py +1 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/team_events.py +1 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/team_policy.py +8 -4
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/providers.py +42 -2
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/sessions.py +2 -2
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/tasks.py +25 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/tmux.py +4 -1
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/usage.py +62 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/view.py +2 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/watch.py +4 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/watch_costs.py +86 -9
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/workspaces.py +70 -3
- brindle-0.3.3/src/brindle/builtin_agents/reviewer-codex.md +0 -23
- brindle-0.3.3/src/brindle/builtin_agents/reviewer-local.md +0 -25
- {brindle-0.3.3 → brindle-0.3.5}/LICENSE +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/SCHEDULE-A +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/__init__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/__main__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/account.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/airgap.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/budget.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/__init__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/backend-auditor.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/developer-codex.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/developer-light.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/developer-local.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/developer.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/qa.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_agents/subagent.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_rules/__init__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_rules/security/backend.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_rules/style/minimal-diff.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/builtin_rules/tests/only.md +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/ci_adapters.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/ci_client.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/ci_federation.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/ci_hosts.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/codemap.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/codex_hook.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/company_identity.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/company_login.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/conflicts.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/cost.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/demo.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/detect.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/doctor.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/escapes.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/gates.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/guardrails.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/history.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/identity_lock.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/inbox.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/keys_cmds.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/launch_health.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/learned_rules.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/learning.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/legacy.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/model_access.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/__init__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/client.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/loop.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/permissions.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/runner.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/serve.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/native/tools.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/permissions.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/plugins.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pool.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pricing.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/__init__.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/_files.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/account.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/audit_chain.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/audit_export.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/auth.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/brief_learning.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/cost_centers.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/credentials.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/features.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/keys.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/license.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/loopback.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/managed_models.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/org_profiles.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/orgkey.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/rollout.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/settings_sync.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/pro/status.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/procs.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/profiles.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/quota.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/repo_cmds.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/repos.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/rewind.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/rule_checks.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/savings.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/scratch.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/secrets.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/self_serve.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/services.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/sidebar_follow.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/signin_pause.py +0 -0
- {brindle-0.3.3 → brindle-0.3.5}/src/brindle/status_cache.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: brindle
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: Run coding agents in parallel, each on its own git branch, with a supervisor that delegates, reviews, and merges
|
|
5
5
|
Project-URL: Homepage, https://pawdelta.com/brindle/
|
|
6
6
|
Project-URL: Documentation, https://pawdelta.com/brindle/docs/recommended-use
|
|
@@ -89,7 +89,7 @@ uv tool install --editable ~/Projects/brindle # or from a local checkout
|
|
|
89
89
|
brindle drives Claude Code, so you need that too (`npm install -g @anthropic-ai/claude-code`).
|
|
90
90
|
|
|
91
91
|
`brindle --version` prints the installed version; the tmux status bar of every brindle
|
|
92
|
-
session shows it too (`brindle 0.3.
|
|
92
|
+
session shows it too (`brindle 0.3.5`). A session started before an upgrade keeps
|
|
93
93
|
running the old code, and shows the old number, until you restart it.
|
|
94
94
|
|
|
95
95
|
## Quick start
|
|
@@ -118,11 +118,11 @@ a writable home) and, in a repo, what's set up for it, and says what to do about
|
|
|
118
118
|
anything missing. Bare `brindle` runs the essential ones (tmux, the chat's CLI)
|
|
119
119
|
before it launches anything.
|
|
120
120
|
|
|
121
|
-
That's it. `brindle` opens a
|
|
122
|
-
narrow sidebar on the left showing every
|
|
123
|
-
who's
|
|
124
|
-
|
|
125
|
-
branches
|
|
121
|
+
That's it. Bare `brindle` opens a fresh interactive developer chat (Claude Code)
|
|
122
|
+
in your repo (with autopilot off), with a narrow sidebar on the left showing every
|
|
123
|
+
agent: who's working, who's idle, and who's waiting for your approval. To launch an
|
|
124
|
+
autopilot supervisor that splits work between parallel workers, reviews, and merges
|
|
125
|
+
their branches toward verified milestones, run `brindle supervisor`. It starts in under a second.
|
|
126
126
|
|
|
127
127
|
**The sidebar follows you.** There's one sidebar pane per session root, not
|
|
128
128
|
one per window: switch to any other brindle window or session (⏎ in the
|
|
@@ -242,7 +242,7 @@ for mechanical edits and a Codex reviewer for a second model's opinion.
|
|
|
242
242
|
|
|
243
243
|
## Autopilot
|
|
244
244
|
|
|
245
|
-
`brindle` starts the supervisor with autopilot on. Tell it what we're building,
|
|
245
|
+
`brindle supervisor` starts the supervisor with autopilot on (or `brindle start -a supervisor`). Tell it what we're building,
|
|
246
246
|
or put the goal in `.brindle/goals.md`, and it works like a project manager:
|
|
247
247
|
|
|
248
248
|
1. **Goal and milestones.** The goal is split into milestones, and each one has
|
|
@@ -337,7 +337,8 @@ your own status line prints, so what you see doesn't change.
|
|
|
337
337
|
|
|
338
338
|
| | |
|
|
339
339
|
|---|---|
|
|
340
|
-
| `brindle` | a fresh
|
|
340
|
+
| `brindle` | a fresh developer chat here (autopilot off), dashboard alongside |
|
|
341
|
+
| `brindle supervisor` | start an explicit autopilot supervisor chat to coordinate parallel workers and milestones |
|
|
341
342
|
| `brindle init` | detect setup and test commands, write `.brindle/config.json`, check tools |
|
|
342
343
|
| `brindle demo [--local]` | watch brindle finish a tiny practice repo: parallel workers, reviews, gated merges |
|
|
343
344
|
| `brindle new BRANCH [-b BASE] [-a PROFILE] [-p PROMPT]` | worktree + branch + agent |
|
|
@@ -346,6 +347,7 @@ your own status line prints, so what you see doesn't change.
|
|
|
346
347
|
| `brindle start [-a PROFILE] [-p PROMPT] [--no-watch] [--no-autopilot] [-b BRANCH] [-w PATH]` | the same, with options; `-b`/`-w` run it in that branch's worktree (created if needed, or the one you already made), which gets the repo's `.brindle` config |
|
|
347
348
|
| `brindle handover --to BRANCH\|PATH [-n NOTE]` | hand the session to a new supervisor there: goal and milestones, workers, queued tasks and your note move across; the old one is paused |
|
|
348
349
|
| `brindle autopilot [on\|off\|check]` | the goal's progress; turn autopilot on or off; run the checks now |
|
|
350
|
+
| `brindle audit-decision FINDING [-r RATIONALE]` | record acceptance of an audit finding with rationale so subsequent audits respect it |
|
|
349
351
|
| `brindle delegation [conservative\|balanced\|fast]` | how readily the supervisor delegates: fewest tokens, the default, or quickest |
|
|
350
352
|
| `brindle transfer [REPO] [--from SESSION] [-b BRANCH]` | move a scratch session's work into a real repo |
|
|
351
353
|
| `brindle ls [--all]` | workspaces and agents |
|
|
@@ -407,6 +409,7 @@ knowing them helps when you tell the supervisor how to work.
|
|
|
407
409
|
| `approve_plan` | supervisor | approve a worker's plan, or send it back with feedback (`approved=false`) |
|
|
408
410
|
| `complete_subagent` | supervisor | record the result of a `subagent`-profile task |
|
|
409
411
|
| `set_goal` / `get_progress` / `check_milestone` | supervisor | autopilot's goal, its progress, and running the checks |
|
|
412
|
+
| `record_audit_decision` | supervisor | record acceptance of an audit finding with rationale so subsequent audits respect it |
|
|
410
413
|
| `need_user` | supervisor | stop autopilot and ask you a question |
|
|
411
414
|
| `transfer_to_repo` | supervisor | move a scratch session's work into a repository |
|
|
412
415
|
| `handover` | supervisor | hand the session to a new supervisor on another branch or worktree, with a note |
|
|
@@ -528,7 +531,7 @@ Autopilot, merge gates and cleanup:
|
|
|
528
531
|
| `max_agents` | `4` | workers running at once per session (`0`: no cap) |
|
|
529
532
|
| `check_timeout` | `900` | seconds each check may take |
|
|
530
533
|
| `check_concurrency` | `2` | check runs at once on this machine, across branches; the rest wait their turn (`0`: no cap). A run far past its last duration is reported to the supervisor |
|
|
531
|
-
| `fable_escalation` | on, unless the worker runs on a cloud account (Bedrock, Vertex or Foundry) | retry a failed heavy task once on `developer-heavy`
|
|
534
|
+
| `fable_escalation` | on, unless the worker runs on a cloud account (Bedrock, Vertex or Foundry) | retry a failed heavy task once on `developer-heavy` before handing it to you; `true` turns it on for a cloud account, `false` off |
|
|
532
535
|
| `usage_limit` | `90` | autopilot stops pushing on at this % of your Claude usage limit |
|
|
533
536
|
| `limit_cooldown_minutes` | `300` for Antigravity | how long a provider that hit its limit counts as unavailable |
|
|
534
537
|
| `graphify` | if the graph is there | point agents at the repo's [graphify](https://github.com/safishamsi/graphify) code map (`false` turns it off) |
|
|
@@ -581,27 +584,30 @@ When a workspace is created (including from the pool), brindle starts one contai
|
|
|
581
584
|
|
|
582
585
|
### Routing by weight
|
|
583
586
|
|
|
584
|
-
The supervisor sizes a task and passes `weight` (`"light"`, `"medium"
|
|
585
|
-
`"heavy"`
|
|
587
|
+
The supervisor sizes a task and passes `weight` (`"light"`, `"medium"`,
|
|
588
|
+
`"heavy"` or `"advanced"`, with `"reasoning"` and `"complex"` accepted as aliases) to
|
|
589
|
+
`assign`/`handoff`; brindle picks an available profile for that tier.
|
|
586
590
|
Light is small, well-specified, mechanical work (docs, renames, simple tests);
|
|
587
|
-
medium is a normal feature or bugfix in one area; heavy is design
|
|
588
|
-
cross-cutting
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
591
|
+
medium is a normal feature or bugfix in one area; heavy is architecture design,
|
|
592
|
+
broad cross-cutting refactors, or subtle bugs; advanced is complex, long-running
|
|
593
|
+
system-design and implementation tasks. The `routing`
|
|
594
|
+
config maps each tier to profile names: the first is the tier's baseline, the
|
|
595
|
+
rest are candidates hosted learning may pick instead (defaults shown; set one
|
|
596
|
+
tier and the others keep theirs):
|
|
592
597
|
|
|
593
598
|
```json
|
|
594
599
|
{
|
|
595
600
|
"routing": {
|
|
596
|
-
"light":
|
|
597
|
-
"medium":
|
|
598
|
-
"heavy":
|
|
601
|
+
"light": ["developer-light", "developer", "developer-codex", "developer-local"],
|
|
602
|
+
"medium": ["developer", "developer-codex", "developer-heavy"],
|
|
603
|
+
"heavy": ["developer-heavy", "developer-gemini", "developer", "developer-codex"],
|
|
604
|
+
"advanced": ["developer-fable", "developer-heavy", "developer-gemini"]
|
|
599
605
|
}
|
|
600
606
|
}
|
|
601
607
|
```
|
|
602
608
|
|
|
603
|
-
No tier prefers another provider for its own sake: all-Claude
|
|
604
|
-
be what works best for you, and that's for the learner to find out.
|
|
609
|
+
No tier prefers another provider for its own sake: all-Claude, all-Codex or
|
|
610
|
+
all-Gemini may be what works best for you, and that's for the learner to find out.
|
|
605
611
|
|
|
606
612
|
Routing merges per tier in this order: built-in defaults, `~/.brindle/config.json`
|
|
607
613
|
(every repo), the repo's `.brindle/config.json` (shared with the team), then
|
|
@@ -619,8 +625,9 @@ each tier. Unknown profile names are skipped; doctor and the routing reply
|
|
|
619
625
|
report the missing name and the file that supplied it.
|
|
620
626
|
|
|
621
627
|
`developer-light` runs on Claude Haiku at low effort; `developer` on your Claude
|
|
622
|
-
Code default model; `developer-codex` on Codex; `developer-heavy` on Claude
|
|
623
|
-
at high effort
|
|
628
|
+
Code default model; `developer-codex` on Codex; `developer-heavy` on Claude Opus
|
|
629
|
+
at high effort; `developer-gemini` on Google Antigravity (Gemini) with high effort
|
|
630
|
+
(Tier 3); `developer-fable` on Claude Fable at high effort (Tier 4 advanced).
|
|
624
631
|
A profile is skipped when its CLI isn't installed (`claude`, `codex`, `agy`), the
|
|
625
632
|
local model server isn't answering, or its provider is at your `usage_limit`. If
|
|
626
633
|
hosted learning is on it chooses among the profiles left; otherwise the first
|
|
@@ -1437,6 +1444,22 @@ A profile chooses between the two with `auth`:
|
|
|
1437
1444
|
|
|
1438
1445
|
Your org's `deny_personal_keys` (Enterprise) still applies on top of `auth`.
|
|
1439
1446
|
|
|
1447
|
+
#### Running unattended on API keys
|
|
1448
|
+
|
|
1449
|
+
When running long, unattended autopilot sessions with API keys:
|
|
1450
|
+
|
|
1451
|
+
- **Quota, token and cost measurements per provider**:
|
|
1452
|
+
- Autopilot's automatic usage pause (`usage_limit: 90`) relies on the percentage numbers emitted by Claude Code's status line under subscription plans. Under API-key billing (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`), the CLIs report no subscription percentage, so subscription usage pause thresholds do not trigger; manage spend via provider account budget limits or brindle budget policies.
|
|
1453
|
+
- Token and cost tracking: Token counts and cost estimates are captured from Claude and Codex transcripts. Antigravity (`agy`) currently has **no token/cost measurements**, so budget policies and cost tracking cannot monitor Antigravity spend; enforce usage caps directly in Google AI Studio or your Google Cloud project billing settings.
|
|
1454
|
+
- **Runtime auth failure handling and provider differences**:
|
|
1455
|
+
- **Claude and Antigravity**: Runtime authentication failures (such as 401/403, revoked API keys, or credit/billing errors) are intercepted via StopFailure and exit hooks. Brindle marks the worker as failed, alerts the supervisor, invalidates cached sign-in checks, and pauses autopilot with a `Credentials need attention` notice rather than cycling idle nudges.
|
|
1456
|
+
- **Codex (unsupported runtime auth detection)**: Codex CLI turn completion (`agent-turn-complete`) does not classify auth errors at runtime. If an OpenAI API key expires or is rejected, Codex workers will not automatically transition to `failed` or trigger an autopilot credential pause. When running Codex workers unattended, monitor their progress via `brindle watch` or check tmux panes; if an auth failure occurs, manually restart or rotate keys.
|
|
1457
|
+
- **Supervisor credential refresh and key rotation**:
|
|
1458
|
+
- **Recovering failed/blocked workers**: When an agent fails on an expired key or autopilot pauses with a credential error, export the fresh key (or update `brindle keys set`), then run `brindle continue`. This unpauses the session and relaunches paused/failed agents with the new credentials. The replacement credentials are automatically synced to the session credential store, dynamically refreshed by the supervisor's launcher on all subsequent worker delegations (`assign`/`handoff`).
|
|
1459
|
+
- **Proactive rotation in live sessions**: Exporting a new key while an active session is healthy does not restart running workers or the supervisor (running `brindle continue` on an active healthy session simply reattaches to tmux without restarting workers). To proactively rotate credentials for the entire session and all running workers: run `brindle stop` -> update credentials in your environment or via `brindle keys set` -> run `brindle continue`.
|
|
1460
|
+
- **Precedence**: Newly stored keys (`brindle keys set`) or session credentials updated during recovery take effect dynamically for all new panes, overriding stale launcher environments. For profile-level overrides, an explicit profile key (`env.NAME`) takes precedence over default provider credentials.
|
|
1461
|
+
- **Antigravity permissions prerequisite**: Antigravity (`agy`) does not support approving shell commands solely via external hooks. With `GEMINI_API_KEY`, unattended agy workers will still stall on approval prompts unless permissions are pre-populated in `settings.json` (see Permissions) or run with `agy_approvals: "brindle"` under `permission_policy: "on"` (`--dangerously-skip-permissions`).
|
|
1462
|
+
|
|
1440
1463
|
### Cheap workers
|
|
1441
1464
|
|
|
1442
1465
|
By default a Claude Code worker loads everything your own `claude` does: your
|
|
@@ -59,7 +59,7 @@ uv tool install --editable ~/Projects/brindle # or from a local checkout
|
|
|
59
59
|
brindle drives Claude Code, so you need that too (`npm install -g @anthropic-ai/claude-code`).
|
|
60
60
|
|
|
61
61
|
`brindle --version` prints the installed version; the tmux status bar of every brindle
|
|
62
|
-
session shows it too (`brindle 0.3.
|
|
62
|
+
session shows it too (`brindle 0.3.5`). A session started before an upgrade keeps
|
|
63
63
|
running the old code, and shows the old number, until you restart it.
|
|
64
64
|
|
|
65
65
|
## Quick start
|
|
@@ -88,11 +88,11 @@ a writable home) and, in a repo, what's set up for it, and says what to do about
|
|
|
88
88
|
anything missing. Bare `brindle` runs the essential ones (tmux, the chat's CLI)
|
|
89
89
|
before it launches anything.
|
|
90
90
|
|
|
91
|
-
That's it. `brindle` opens a
|
|
92
|
-
narrow sidebar on the left showing every
|
|
93
|
-
who's
|
|
94
|
-
|
|
95
|
-
branches
|
|
91
|
+
That's it. Bare `brindle` opens a fresh interactive developer chat (Claude Code)
|
|
92
|
+
in your repo (with autopilot off), with a narrow sidebar on the left showing every
|
|
93
|
+
agent: who's working, who's idle, and who's waiting for your approval. To launch an
|
|
94
|
+
autopilot supervisor that splits work between parallel workers, reviews, and merges
|
|
95
|
+
their branches toward verified milestones, run `brindle supervisor`. It starts in under a second.
|
|
96
96
|
|
|
97
97
|
**The sidebar follows you.** There's one sidebar pane per session root, not
|
|
98
98
|
one per window: switch to any other brindle window or session (⏎ in the
|
|
@@ -212,7 +212,7 @@ for mechanical edits and a Codex reviewer for a second model's opinion.
|
|
|
212
212
|
|
|
213
213
|
## Autopilot
|
|
214
214
|
|
|
215
|
-
`brindle` starts the supervisor with autopilot on. Tell it what we're building,
|
|
215
|
+
`brindle supervisor` starts the supervisor with autopilot on (or `brindle start -a supervisor`). Tell it what we're building,
|
|
216
216
|
or put the goal in `.brindle/goals.md`, and it works like a project manager:
|
|
217
217
|
|
|
218
218
|
1. **Goal and milestones.** The goal is split into milestones, and each one has
|
|
@@ -307,7 +307,8 @@ your own status line prints, so what you see doesn't change.
|
|
|
307
307
|
|
|
308
308
|
| | |
|
|
309
309
|
|---|---|
|
|
310
|
-
| `brindle` | a fresh
|
|
310
|
+
| `brindle` | a fresh developer chat here (autopilot off), dashboard alongside |
|
|
311
|
+
| `brindle supervisor` | start an explicit autopilot supervisor chat to coordinate parallel workers and milestones |
|
|
311
312
|
| `brindle init` | detect setup and test commands, write `.brindle/config.json`, check tools |
|
|
312
313
|
| `brindle demo [--local]` | watch brindle finish a tiny practice repo: parallel workers, reviews, gated merges |
|
|
313
314
|
| `brindle new BRANCH [-b BASE] [-a PROFILE] [-p PROMPT]` | worktree + branch + agent |
|
|
@@ -316,6 +317,7 @@ your own status line prints, so what you see doesn't change.
|
|
|
316
317
|
| `brindle start [-a PROFILE] [-p PROMPT] [--no-watch] [--no-autopilot] [-b BRANCH] [-w PATH]` | the same, with options; `-b`/`-w` run it in that branch's worktree (created if needed, or the one you already made), which gets the repo's `.brindle` config |
|
|
317
318
|
| `brindle handover --to BRANCH\|PATH [-n NOTE]` | hand the session to a new supervisor there: goal and milestones, workers, queued tasks and your note move across; the old one is paused |
|
|
318
319
|
| `brindle autopilot [on\|off\|check]` | the goal's progress; turn autopilot on or off; run the checks now |
|
|
320
|
+
| `brindle audit-decision FINDING [-r RATIONALE]` | record acceptance of an audit finding with rationale so subsequent audits respect it |
|
|
319
321
|
| `brindle delegation [conservative\|balanced\|fast]` | how readily the supervisor delegates: fewest tokens, the default, or quickest |
|
|
320
322
|
| `brindle transfer [REPO] [--from SESSION] [-b BRANCH]` | move a scratch session's work into a real repo |
|
|
321
323
|
| `brindle ls [--all]` | workspaces and agents |
|
|
@@ -377,6 +379,7 @@ knowing them helps when you tell the supervisor how to work.
|
|
|
377
379
|
| `approve_plan` | supervisor | approve a worker's plan, or send it back with feedback (`approved=false`) |
|
|
378
380
|
| `complete_subagent` | supervisor | record the result of a `subagent`-profile task |
|
|
379
381
|
| `set_goal` / `get_progress` / `check_milestone` | supervisor | autopilot's goal, its progress, and running the checks |
|
|
382
|
+
| `record_audit_decision` | supervisor | record acceptance of an audit finding with rationale so subsequent audits respect it |
|
|
380
383
|
| `need_user` | supervisor | stop autopilot and ask you a question |
|
|
381
384
|
| `transfer_to_repo` | supervisor | move a scratch session's work into a repository |
|
|
382
385
|
| `handover` | supervisor | hand the session to a new supervisor on another branch or worktree, with a note |
|
|
@@ -498,7 +501,7 @@ Autopilot, merge gates and cleanup:
|
|
|
498
501
|
| `max_agents` | `4` | workers running at once per session (`0`: no cap) |
|
|
499
502
|
| `check_timeout` | `900` | seconds each check may take |
|
|
500
503
|
| `check_concurrency` | `2` | check runs at once on this machine, across branches; the rest wait their turn (`0`: no cap). A run far past its last duration is reported to the supervisor |
|
|
501
|
-
| `fable_escalation` | on, unless the worker runs on a cloud account (Bedrock, Vertex or Foundry) | retry a failed heavy task once on `developer-heavy`
|
|
504
|
+
| `fable_escalation` | on, unless the worker runs on a cloud account (Bedrock, Vertex or Foundry) | retry a failed heavy task once on `developer-heavy` before handing it to you; `true` turns it on for a cloud account, `false` off |
|
|
502
505
|
| `usage_limit` | `90` | autopilot stops pushing on at this % of your Claude usage limit |
|
|
503
506
|
| `limit_cooldown_minutes` | `300` for Antigravity | how long a provider that hit its limit counts as unavailable |
|
|
504
507
|
| `graphify` | if the graph is there | point agents at the repo's [graphify](https://github.com/safishamsi/graphify) code map (`false` turns it off) |
|
|
@@ -551,27 +554,30 @@ When a workspace is created (including from the pool), brindle starts one contai
|
|
|
551
554
|
|
|
552
555
|
### Routing by weight
|
|
553
556
|
|
|
554
|
-
The supervisor sizes a task and passes `weight` (`"light"`, `"medium"
|
|
555
|
-
`"heavy"`
|
|
557
|
+
The supervisor sizes a task and passes `weight` (`"light"`, `"medium"`,
|
|
558
|
+
`"heavy"` or `"advanced"`, with `"reasoning"` and `"complex"` accepted as aliases) to
|
|
559
|
+
`assign`/`handoff`; brindle picks an available profile for that tier.
|
|
556
560
|
Light is small, well-specified, mechanical work (docs, renames, simple tests);
|
|
557
|
-
medium is a normal feature or bugfix in one area; heavy is design
|
|
558
|
-
cross-cutting
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
561
|
+
medium is a normal feature or bugfix in one area; heavy is architecture design,
|
|
562
|
+
broad cross-cutting refactors, or subtle bugs; advanced is complex, long-running
|
|
563
|
+
system-design and implementation tasks. The `routing`
|
|
564
|
+
config maps each tier to profile names: the first is the tier's baseline, the
|
|
565
|
+
rest are candidates hosted learning may pick instead (defaults shown; set one
|
|
566
|
+
tier and the others keep theirs):
|
|
562
567
|
|
|
563
568
|
```json
|
|
564
569
|
{
|
|
565
570
|
"routing": {
|
|
566
|
-
"light":
|
|
567
|
-
"medium":
|
|
568
|
-
"heavy":
|
|
571
|
+
"light": ["developer-light", "developer", "developer-codex", "developer-local"],
|
|
572
|
+
"medium": ["developer", "developer-codex", "developer-heavy"],
|
|
573
|
+
"heavy": ["developer-heavy", "developer-gemini", "developer", "developer-codex"],
|
|
574
|
+
"advanced": ["developer-fable", "developer-heavy", "developer-gemini"]
|
|
569
575
|
}
|
|
570
576
|
}
|
|
571
577
|
```
|
|
572
578
|
|
|
573
|
-
No tier prefers another provider for its own sake: all-Claude
|
|
574
|
-
be what works best for you, and that's for the learner to find out.
|
|
579
|
+
No tier prefers another provider for its own sake: all-Claude, all-Codex or
|
|
580
|
+
all-Gemini may be what works best for you, and that's for the learner to find out.
|
|
575
581
|
|
|
576
582
|
Routing merges per tier in this order: built-in defaults, `~/.brindle/config.json`
|
|
577
583
|
(every repo), the repo's `.brindle/config.json` (shared with the team), then
|
|
@@ -589,8 +595,9 @@ each tier. Unknown profile names are skipped; doctor and the routing reply
|
|
|
589
595
|
report the missing name and the file that supplied it.
|
|
590
596
|
|
|
591
597
|
`developer-light` runs on Claude Haiku at low effort; `developer` on your Claude
|
|
592
|
-
Code default model; `developer-codex` on Codex; `developer-heavy` on Claude
|
|
593
|
-
at high effort
|
|
598
|
+
Code default model; `developer-codex` on Codex; `developer-heavy` on Claude Opus
|
|
599
|
+
at high effort; `developer-gemini` on Google Antigravity (Gemini) with high effort
|
|
600
|
+
(Tier 3); `developer-fable` on Claude Fable at high effort (Tier 4 advanced).
|
|
594
601
|
A profile is skipped when its CLI isn't installed (`claude`, `codex`, `agy`), the
|
|
595
602
|
local model server isn't answering, or its provider is at your `usage_limit`. If
|
|
596
603
|
hosted learning is on it chooses among the profiles left; otherwise the first
|
|
@@ -1407,6 +1414,22 @@ A profile chooses between the two with `auth`:
|
|
|
1407
1414
|
|
|
1408
1415
|
Your org's `deny_personal_keys` (Enterprise) still applies on top of `auth`.
|
|
1409
1416
|
|
|
1417
|
+
#### Running unattended on API keys
|
|
1418
|
+
|
|
1419
|
+
When running long, unattended autopilot sessions with API keys:
|
|
1420
|
+
|
|
1421
|
+
- **Quota, token and cost measurements per provider**:
|
|
1422
|
+
- Autopilot's automatic usage pause (`usage_limit: 90`) relies on the percentage numbers emitted by Claude Code's status line under subscription plans. Under API-key billing (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`), the CLIs report no subscription percentage, so subscription usage pause thresholds do not trigger; manage spend via provider account budget limits or brindle budget policies.
|
|
1423
|
+
- Token and cost tracking: Token counts and cost estimates are captured from Claude and Codex transcripts. Antigravity (`agy`) currently has **no token/cost measurements**, so budget policies and cost tracking cannot monitor Antigravity spend; enforce usage caps directly in Google AI Studio or your Google Cloud project billing settings.
|
|
1424
|
+
- **Runtime auth failure handling and provider differences**:
|
|
1425
|
+
- **Claude and Antigravity**: Runtime authentication failures (such as 401/403, revoked API keys, or credit/billing errors) are intercepted via StopFailure and exit hooks. Brindle marks the worker as failed, alerts the supervisor, invalidates cached sign-in checks, and pauses autopilot with a `Credentials need attention` notice rather than cycling idle nudges.
|
|
1426
|
+
- **Codex (unsupported runtime auth detection)**: Codex CLI turn completion (`agent-turn-complete`) does not classify auth errors at runtime. If an OpenAI API key expires or is rejected, Codex workers will not automatically transition to `failed` or trigger an autopilot credential pause. When running Codex workers unattended, monitor their progress via `brindle watch` or check tmux panes; if an auth failure occurs, manually restart or rotate keys.
|
|
1427
|
+
- **Supervisor credential refresh and key rotation**:
|
|
1428
|
+
- **Recovering failed/blocked workers**: When an agent fails on an expired key or autopilot pauses with a credential error, export the fresh key (or update `brindle keys set`), then run `brindle continue`. This unpauses the session and relaunches paused/failed agents with the new credentials. The replacement credentials are automatically synced to the session credential store, dynamically refreshed by the supervisor's launcher on all subsequent worker delegations (`assign`/`handoff`).
|
|
1429
|
+
- **Proactive rotation in live sessions**: Exporting a new key while an active session is healthy does not restart running workers or the supervisor (running `brindle continue` on an active healthy session simply reattaches to tmux without restarting workers). To proactively rotate credentials for the entire session and all running workers: run `brindle stop` -> update credentials in your environment or via `brindle keys set` -> run `brindle continue`.
|
|
1430
|
+
- **Precedence**: Newly stored keys (`brindle keys set`) or session credentials updated during recovery take effect dynamically for all new panes, overriding stale launcher environments. For profile-level overrides, an explicit profile key (`env.NAME`) takes precedence over default provider credentials.
|
|
1431
|
+
- **Antigravity permissions prerequisite**: Antigravity (`agy`) does not support approving shell commands solely via external hooks. With `GEMINI_API_KEY`, unattended agy workers will still stall on approval prompts unless permissions are pre-populated in `settings.json` (see Permissions) or run with `agy_approvals: "brindle"` under `permission_policy: "on"` (`--dangerously-skip-permissions`).
|
|
1432
|
+
|
|
1410
1433
|
### Cheap workers
|
|
1411
1434
|
|
|
1412
1435
|
By default a Claude Code worker loads everything your own `claude` does: your
|