Your agents aren’t a collection of prompts.

They’re a team.

Build the team your code deserves.

One agent is easy.

Five agents are five configurations.

And suddenly you’re the orchestrator.

Stop configuring agents.

Start designing the team.

Add your people

Start with responsibilities.

Not prompts. Not providers. Not config files.

Jobs that need doing.

Give every job the right brain

The best model isn’t always the same model.

Give every role the intelligence it needs.

Make responsibilities explicit

Everyone knows what they own.

Fewer overlapping agents. Fewer conflicting changes. Less “who was supposed to do this?”

Give them tools

Give agents capabilities.

Not carte blanche.

Decide what every agent can see, change, run and ship.

Turn agents into a team

Agents become a team when relationships become explicit.

Who leads. Who builds. Who reviews. Who asks whom for help.

  • reports_to
  • delegates_to
  • reviews
  • consults
  • coordinates_with

One team.

Every harness.

agent-team.yamlsource of truth
version: 1
team:
  name: product
agents:
  - id: cto
    name: CTO
    model: { provider: anthropic, model: claude-opus-4-1 }
  - id: backend
    name: Backend
    model: { provider: openai, model: gpt-5.3-codex }
  - id: frontend
    name: Frontend
    model: { provider: anthropic, model: claude-sonnet-4-5 }
  - id: reviewer
    name: Reviewer
    model: { provider: openai, model: gpt-5.3 }
relationships:
  - { from: cto, to: backend, type: delegates_to }
  - { from: cto, to: frontend, type: delegates_to }
  - { from: reviewer, to: backend, type: reviews }
  - { from: reviewer, to: frontend, type: reviews }
  • Claude Code.claude/agents/*.md.claude/settings.jsonCLAUDE.md
  • Codex.codex/config.tomlAGENTS.md
  • OpenCodeopencode.json

Your team stays the same.

The harness becomes an implementation detail.

$ agent-team export --harness claude-code
agent-team.yamlunchanged
version: 1
team:
  name: product
agents:
  - id: cto
    name: CTO
    model: { provider: anthropic, model: claude-opus-4-1 }
  - id: backend
    name: Backend
    model: { provider: openai, model: gpt-5.3-codex }
  - id: frontend
    name: Frontend
    model: { provider: anthropic, model: claude-sonnet-4-5 }
  - id: reviewer
    name: Reviewer
    model: { provider: openai, model: gpt-5.3 }
relationships:
  - { from: cto, to: backend, type: delegates_to }
  • .claude/agents/backend.md
  • .claude/agents/frontend.md
  • .claude/agents/researcher.md
  • .claude/agents/reviewer.md
  • .claude/settings.json
  • CLAUDE.md
.claude/agents/backend.md
---
name: backend
description: 'Backend Engineer. Use for: API architecture; database changes; migrations; backend tests.'
tools: Read, Grep, Glob, Edit, Write, Bash
model: inherit
---

You are a backend engineer.

Implement services, APIs and data access. Validate inputs, handle errors explicitly and cover behaviour with tests.

## Responsibilities

- API architecture
- database changes
- migrations
- backend tests

## Team context

  • .codex/config.toml
  • AGENTS.md
.codex/config.toml
# Generated by agent-team from the portable team definition. Edit agent-team.yaml and re-export instead of editing this file.
# Default session: Backend (`backend`). Run another agent with `codex --profile <id>`.

model = "gpt-5.3-codex"
model_provider = "openai"
approval_policy = "on-request"
sandbox_mode = "workspace-write"

[sandbox_workspace_write]
network_access = false

[profiles.backend]
model = "gpt-5.3-codex"
model_provider = "openai"
approval_policy = "on-request"
sandbox_mode = "workspace-write"

[profiles.reviewer]
model = "gpt-5.3"
model_provider = "openai"
  • opencode.json
opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "model": "anthropic/claude-opus-4-1",
  "agent": {
    "cto": {
      "description": "CTO",
      "mode": "primary",
      "model": "anthropic/claude-opus-4-1",
      "prompt": "You are the technical lead of this team.\n\nOwn technical direction. Break work into well-scoped tasks and delegate implementation to the engineering agents.\n\n## Responsibilities\n\n- technical direction\n- task breakdown\n- final sign-off\n\n## Team context\n\n- Backend (`backend`) reports to you.\n- Frontend (`frontend`) reports to you.\n- Reviewer (`reviewer`) reports to you.\n- You delegate work to Backend (`backend`).\n- You delegate work to Frontend (`frontend`).\n- Researcher (`researcher`) reports to you.\n- You may delegate only to: Backend, Frontend (max delegation depth 2). Delegated work must return a result summary.",
      "tools": {
        "webfetch": false
      },
      "permission": {
        "edit": "allow",
        "bash": {
          "*": "ask",
          "git push*": "deny"
        },
        "webfetch": "ask"
      }

Tools change.

Your team shouldn’t have to.

Define the team. Not the harness.

  • CTOclaude-opus-4-1
  • Backendgpt-5.3-codex
  • Frontendclaude-sonnet-4-5
  • Reviewergpt-5.3
  • Researchergemini-2.5-pro
Claude Code.claude/agents/*.md .claude/settings.json CLAUDE.md
Codex.codex/config.toml AGENTS.md
OpenCodeopencode.json

Keep one portable definition of how your agents work together.

Validation

Know before you run.

Catch broken relationships, missing models and unsupported capabilities before your agents touch the repository.

This is configuration.

This is intent.

Humans think in teams.

Harnesses think in configuration.

Agent Team Maker translates between them.

Think of it as Terraform for agent teams.

  1. 01DefineAgent teamRoles, models, tools, permissions and relationships in the editor.
  2. 02ValidatePortable IRagent-team.yaml is checked for cycles, missing agents and bad models.
  3. 03CompileHarness adapterEach target translates the team and reports what it can’t represent.
  4. 04RunGenerated configurationUse it in Claude Code, Codex or OpenCode.

Your team definition is the source of truth. Harness configurations are compilation targets.

Built where the work happens.

Keyboard-first. Fast enough to become part of the workflow.

  1. aAdd agent
  2. mChoose model
  3. tConfigure tools
  4. rRelationships
  5. eExport
  6. Ctrl+SSave

Visual when you want it.

Scriptable when you don’t.

~/product agent-team init --template startup --name product
Created agent-team.yaml (Startup, 5 agents)
Next: agent-team edit agent-team.yaml
~/product agent-team edit # opens the team editor
~/product agent-team validate
agent-team.yaml: 5 agents, no issues
~/product agent-team export --harness claude-code
⚠ WARNING [claude-code] Claude Code only runs Anthropic models. These agents are exported with `model: inherit`.
Backend uses openai/gpt-5.3-codex
Reviewer uses openai/gpt-5.3
Researcher uses google/gemini-2.5-pro
wrote ./.claude/agents/backend.md
wrote ./.claude/agents/frontend.md
wrote ./.claude/agents/researcher.md
wrote ./.claude/agents/reviewer.md
wrote ./.claude/settings.json
wrote ./CLAUDE.md

Open format

Your team belongs to you.

Plain text. Version controlled. Portable. Reviewable.

agent-team.yaml
version: 1
team:
  name: product
agents:
  - id: cto
    name: CTO
    model: { provider: anthropic, model: claude-opus-4-1 }
  - id: backend
    name: Backend
    model: { provider: openai, model: gpt-5.3-codex }
  - id: frontend
    name: Frontend
git diffreviewer changes model, gains reviews
diff --git a/agent-team.yaml b/agent-team.yaml
@@ agents @@
   - id: reviewer
     name: Reviewer
     role: Reviewer
-    model: { provider: openai, model: gpt-5.3 }
+    model: { provider: openai, model: gpt-5.3-codex }
     responsibilities: [correctness, architecture, regressions]
@@ relationships @@
   - { from: cto, to: frontend, type: delegates_to }
+  - { from: reviewer, to: backend, type: reviews }
+  - { from: reviewer, to: frontend, type: reviews }

More agents don’t create a team.

Structure does.

Build the team.

Get Agent Team Maker

A Rust terminal app. Build it from source with Cargo.

$ git clone <repository-url> agent-team
$ cd agent-team && cargo install --path .
$ agent-team
View on GitHub

agent-team 0.1.0 · Claude Code · Codex · OpenCode · Generic YAML/JSON