team 0.1.0
The first release: set up, change and watch a project's team of AI agents from one file,
.agents/team.yaml. Runs on Node 22 or later, with no runtime dependencies.
Added
- The team file: a documented YAML subset with its own parser, validated field by field with line
numbers, and a fictional example atexamples/team.yaml. (#2, #11) team initandteam status: write the skeleton file and keep it out of git through
.git/info/exclude; print the file's seats against the running session, each difference with its
repair;--jsonprints the same facts as one JSON document (format: 1) for scripts. (#3, #33)- A seat whose own status line names another model than the file's is a status difference, with its
repair; a model id the map doesn't know, or another maker's model run through Claude Code, is
unread — a note, never a difference. (#30) team approve: record the file, its ceilings and its seats on this machine after a read-back and
a typed seat count;--showprints the approved copy. (#4, #5)team check: check one commit, a range or a pull request body against the signature rule;
forbidden lines and session links are refused by default; it runs on every pull request in this
repository's CI, against the repository's own team file and the seats that sign its history.
(#1, #8, #12)team doctor: check this machine for what the file needs — herdr, each CLI, login, launcher,
model, watch heartbeat;--loginchecks read-only that each declared CLI is signed in, using each
profile's login check, and answers no prompt. (#5, #33)team watch: report idle and blocked seats, unsent input and machine figures, and nudge the
operator only into an empty idle prompt;--no-nudgeand--no-notifyturn those off. (#6, #7,
#22)- Linux: the caller check and the watch's load, memory and swap figures are read from
/proc, so
teamanswers there as on macOS. (#29) - A stopped seat its owner starts by hand is watched like a parked one: prompts and unsent text are
reported, its idle is not, and it is never read as an agent the file doesn't hold; parked and
stopped follow RFC 0001. (#25) team upandteam down: start and stop the session and its seats, each with its caller rule;
staged launches, a wait for an empty idle prompt, trust and update screens read and never
answered;--dry-runprints the plan and changes nothing. (#5, #13, #14)team upandteam add: everymachine:start limit — load, memory, disk, free swap and swap
growth — is checked before each seat, and a breach refuses the launch, naming the figure and its
limit; a--dry-runprints the refusal too. (#26)- Launch profiles for
claude-code, Codex, Antigravity and Cursor: approval flags added only at
launch, rules delivered only into an empty idle prompt, screens read from recorded, sanitised
fixtures; a Codex permission dialog is reported for its owner and never answered. (#16, #17,
#18, #23, #24, #27) team addandteam remove: start one declared or temporary seat; stop a seat, then take it out
of the file —--keepleaves it stopped,--abandonis the owner's. (#19, #20)team worktree newandteam worktree remove: create a task worktree from an up-to-date base, or
remove its folder; a failed setup is kept and recorded, and the branch is never deleted. (#15)- A README that covers the file by example and every command with who may run it. (#9)
- A page per command in
docs/commands, every example run in CI. (#31) - Codex's profile reads a weekly quota from its status line:
weekly N% left, for the OpenAI account.
A line cut short of the number is not a figure. budgetsis an owner section: marks, freshness, and each account's reserve or floor. Acheck
command is resolved and hashed atteam approve.watch.quota_marksis read, with a warning.
A changed check file leaves that account unknown; it does not refuse the rest of the file.- A quota figure is kept per seat in the state file. The newest confirmed change counts. A first
sight does not replace it, and a reading from before its reset is dropped. team statusprints a budgets table, and the same rows in--json, when an account is named or
a reading is stored. Unknown and stale are shown as such. A row inside its reserve says so even
when the figure is still fresh.team watchreports a budget: each mark a window crosses, an account inside its reserve or floor
(to the owner), and an account that reads unknown while seats run on it (to the operator). The
accounts' check commands run in the watch loop, outside the pass: at most everybudgets.check_every,
ten seconds, an empty environment, and only when the approval covers them — their output is never
logged. The core parses each seat's quota line, and a reading the pass saw is saved, sostatus,
upandaddcount it.watch.checks: { budget: off }turns the report off.
Changed
- The whole
watchsection is an owner section, its timings included: an edit tointerval,
idle_first,idle_repeat,team_idle,nudge_waitorunsent_afterneeds a new approval, and
until the owner approves it the watch runs with the values of the approved copy — or with the
defaults when nothing was approved.watch.checkskeeps its own finer line inside the section.
A timing a seat changed without an approval shows its difference at the next pass, for the owner
to settle. A never-approved team runs on the defaults, whatever its file says. - The whole
budgetssection is an owner section too, its accounts and marks included: an edit to
a reserve, a floor,stale_after,check_everyor the accounts needs a new approval, and until
the owner approves it every reader — the watch's reports and its check cadence, the check
commands' own run,up's andadd's launch gate, andstatus's table — runs with the values of
the approved copy, or with the defaults (no accounts) when nothing was approved. A file never
approved runs no check at all. An unapproved edit silences nothing and unblocks nothing.
Fixed
- A seat that isn't
mode: sharedand works in worktrees starts in the lobby — the parent of
workspace.pathwith.lobbybeside the worktrees, insidetrustand outside every protected
checkout — never the project root, which holds the owner's uncommitted work;upandaddmake
it once, refuse a lobby outsidetrustor inside a protected checkout, and refuse a seat the file
aims at one. (#35) - Claude Code's permission stage is the dialog itself: the question with its "Esc to cancel · Tab to amend"
footer, or a Yes/No choice below the last rule. An idle seat that only quotes "Do you want to proceed?"
stays idle.