Fork me on GitHub
team

Configuration

What this is. Team reads one optional project-local file, .team/config.json. It overrides the bundled model selections used to dispatch body-loaded agents on Codex CLI and Antigravity CLI. Every other setting lives in the host’s own plugin configuration.

Where it lives

.team/config.json sits at the home project root — the project Team was pointed at when the run began. The same root is used for later slice worktrees and companion repositories. Team reads only that root’s file: it does not search ancestor directories and never creates the file for you.

The file is optional. Without it, dispatch uses the bundled selections. The repository ignores the whole .team/ directory, so a local override stays untracked. Pipeline state is separate and lives under docs/plans/<id>/.

What it configures

Model selection for the hosts that load an agent definition’s body instead of a native agent file. Claude Code’s named-agent dispatch reads native model: and effort: frontmatter and ignores this file entirely. OpenCode makes no model claim through it.

Bundled selections map each Claude tier to a host model:

Agent model: Codex model class Antigravity invocation tier
opus astra pro
sonnet sol flash
haiku luna flash_lite

At dispatch, Team resolves each Codex class to the newest model in that class that the running host offers and that supports the agent effort.

An override replaces individual bundled selections, not the whole map. Tiers you do not name keep their bundled value.

Schema

{
  "codex": {
    "sonnet": { "model": "terra", "reasoning_effort": "medium" }
  },
  "antigravity": {
    "sonnet": { "model": "flash" }
  }
}

Codex

model is a model class or a concrete catalog ID. It is not a Claude alias (opus, sonnet, haiku), fable, or inherit. A class name has only lowercase letters. A catalog ID belongs to class sol when its last hyphen-separated part is sol and the part before that is a numeric version. A concrete catalog ID pins one version, even when a newer model in its class exists. The optional reasoning_effort replaces the agent’s own effort; without it the agent’s effort is preserved. Accepted efforts: low, medium, high, xhigh, max, ultra.

Antigravity

model must be one of inherit, flash_lite, flash, or pro. Antigravity selects effort with the invocation tier, so there is no separate effort field. inherit deliberately chooses the parent session’s model.

How overrides are validated

Before the first dispatch — and again if the host’s provider or model configuration changes — Team reads the running host’s current capabilities. Codex exposes its model catalog and supported reasoning efforts; Antigravity exposes the invoke_subagent model enum.

Team rejects the file when it names an unknown host, tier, or field; omits model; uses a Claude alias as a Codex model; or selects a model, tier, or effort the host does not currently offer. A Codex class also fails when the catalog has no model in that class, when two models tie at the newest version, or when no model in the class supports the effort. A missing or invalid override is an error, never a silent fall back to a default. The resolver validates selections only — it does not query a provider or spawn an agent.

For the dispatch procedure and the full validation contract, see model selection and cross-host portability.

When validation runs

.team/config.json is validated at dispatch time, by the resolver, before a body-loaded model selection is applied. Nothing validates it ahead of a prompt: a present file that cannot be read, is not valid JSON, or fails the schema is reported when the first dispatch needs a selection, not before. An absent file is valid at every point.