AIR organizes AI agent configuration into composable, version-controlled artifacts. This document covers the architecture, design principles, and composition model.
AIR is built around a simple idea: agent configurations should be treated like code — version-controlled, reviewed, composable, and shareable.
Every piece of agent configuration in AIR is an artifact with:
- An index entry — ID, description, and location reference in a JSON index file
- A JSON schema — for validation and editor autocomplete
- Content — the actual configuration or document (SKILL.md, reference doc, MCP config, etc.)
The index files act as lightweight registries. Agents use the ID and description to decide what they need, then progressively load the full content on demand.
| Type | Index File | Content | Schema |
|---|---|---|---|
| Skills | skills/skills.json |
SKILL.md files in directories |
schemas/skills.schema.json |
| References | references/references.json |
Markdown documents | schemas/references.schema.json |
| MCP Servers | mcp/mcp.json |
Inline server configs | schemas/mcp.schema.json |
| Plugins | plugins/plugins.json |
Named groupings of skills, MCP servers, hooks (composable with other plugins) | schemas/plugins.schema.json |
| Roots | roots/roots.json |
Agent workspaces (repos with AGENTS.md) | schemas/roots.schema.json |
| Hooks | hooks/hooks.json |
Hook directories (HOOK.json + scripts) | schemas/hooks.schema.json |
air.json lives at ~/.air/air.json (user-level). Each artifact property is an array of paths to index files. Every artifact is identified by @scope/id, where local entries contribute under @local/ and remote catalogs use a provider-derived scope (e.g. @<owner>/<repo>/). Composition is additive — duplicate qualified IDs hard-fail, and the only way to drop an artifact is exclude:
{
"name": "my-team",
"description": "My team's agent configs",
"skills": [
"github://acme/air-org/skills/skills.json",
"./skills/skills.json"
],
"mcp": [
"github://acme/air-org/mcp/mcp.json",
"./mcp/mcp.json"
]
}All paths are relative to the air.json file. You only need to include the artifact types you use.
Composition is expressed directly in air.json. Every artifact has a qualified identity of the form @scope/id. Local indexes contribute under @local/; remote catalogs contribute under their provider-derived scope (for github://owner/repo that's @<owner>/<repo>/).
For each artifact type:
- Disjoint qualified IDs accumulate (additive union)
- Duplicate qualified IDs hard-fail — you cannot silently override an artifact
- Cross-scope shortname collisions warn but keep both — disambiguate with the qualified form
excludeis the only way to drop an artifact. It takes a per-type object (keys:skills,references,mcp,plugins,roots,hooks) where each value is a list of qualified-ID patterns.*is allowed within a single segment (matches one full segment, no boundary spanning).
{
"name": "frontend-team",
"catalogs": [
"github://acme/air-org",
"github://acme/air-frontend"
],
"mcp": ["./mcp/mcp.json"],
"exclude": {
"mcp": ["@acme/air-org/legacy-server"]
}
}- Org catalog ships under
@acme/air-org/... - Frontend team catalog ships under
@acme/air-frontend/... - Local
mcp.jsonships under@local/... exclude.mcpdrops the MCP server@acme/air-org/legacy-server. To replace an upstream artifact, exclude it under the right type and ship a replacement under your own scope.
AIR orients around open standards like MCP, Agent Skills, and Plugins. The agentic ecosystem will constantly evolve, but agreed-upon standards and interfaces will be the deterministic mainstays that the ecosystem builds on top of. Everything else is just custom glue. When a well-adopted standard exists for something, use it rather than inventing your own.
All configuration is stored in git repositories. No databases, no proprietary backends, no SaaS dependencies. You can read, diff, review, and revert everything with standard git tools.
Every piece of knowledge should have a single canonical location:
- References are broken out of skills so multiple skills can share them
- MCP server configs are defined once and referenced by ID from roots
- Skills compose references rather than embedding knowledge inline
If you find yourself duplicating content, that's a signal to extract it into a reusable artifact. Plugins can also compose other plugins — a "full-stack" plugin can include "code-quality" and "database-tools" plugins rather than re-listing all their primitives. See Plugins for details.
AIR targets single-session configuration, not per-user or per-project. The distinction matters:
- Per-user configs drift between users and don't compose
- Per-project configs duplicate across projects and aren't appropriate for every session
- Per-session configs are assembled from composable layers at session start time
Each air start or air prepare call sets up exactly one agent session in one working directory. AIR does not coordinate multiple sessions, manage parallelism, or orchestrate agents — those are concerns for a separate orchestration layer. See Orchestration for what belongs where.
Index files contain just enough information (ID + description) for an agent to decide relevance. Full content is loaded only when needed. This keeps session startup fast and lets agents be selective about what they load.
AIR defines artifacts in agent-agnostic formats. Translation to agent-specific formats (Claude Code .mcp.json, OpenCode configs, etc.) happens at session start time. This means you can switch agents without rewriting your configs.
When writing artifact descriptions, be explicit about scope:
- Org-level: "Company-wide code review process" — anyone in the org should understand this
- Team-level: "Frontend team deployment checklist" — scoped to the team
- Project-level: "API rate limiting configuration" — scoped to a specific project
The description is what agents (and humans) use to decide relevance. Make it count.
AIR is a single-session configuration layer — it resolves, validates, and translates config for one agent session at a time. It does not orchestrate multiple sessions, coordinate agents, persist state, or handle secrets.
If you need to run multiple agent sessions (sequential pipelines, delegated subagents, event-triggered sessions), you need a separate orchestration layer. AIR is the config foundation underneath it. See Orchestration & Multi-Agent Patterns for guidance on what belongs where.