Agent specs
Agents
---
name: code-reviewer
description: Reviews diffs for bugs, style, and architectural issues.
tools: [Read, Grep, Bash]
model: sonnet
---
You are a code reviewer. Report concise findings with `file:line` references.
| Field | Required | Default | Description |
|---|---|---|---|
name | no | filename without .md | Agent identifier and output filename. |
description | no | empty | One-liner shown in tool listings. |
tools | no | unset | Tools the agent may invoke. See tools support by target. |
model | no | unset | A string for every target, or a map per target. See per-target model and effort. |
effort | no | unset | A string or integer for every target, or a map per target. See per-target model and effort. |
color | no | unset | Badge color. See color support by target. |
readonly | no | unset | true restricts the agent to reading. Cursor: restricted. Claude: disallowedTools: Write, Edit, NotebookEdit (Bash stays allowed). Codex: sandbox_mode = "read-only". Factory: tools: read-only with mcpServers: [] unless servers are listed (wins over a portable tools list). An explicit x-claude.disallowedTools, x-codex.sandbox_mode, or x-factory.tools wins. Other targets report a coverage note. false is a no-op. |
memory | no | unset | Persistent memory scope: user, project, or local. |
Any other frontmatter field passes through unchanged.
memory gives the agent a directory that survives across sessions. Only Claude Code is confirmed to act on it; Qoder gets the key unconfirmed, Junie passes it through, and every other adapter drops it.
Per-target model and effort
model: and effort: each take a scalar or a map keyed by target name, with an optional default. Precedence: x-<target>.<key>, then <key>.<target>, then <key>.default, then the key is not written and the tool uses its own default. x-<target>.<key>: null deletes it. A non-scalar value under a target key falls through to default.
| Want | Write |
|---|---|
| Same model everywhere | model: sonnet |
| Per target, with a fallback | model: {claude: sonnet, default: gpt-4o} |
| Per target, tool default elsewhere | model: {claude: sonnet} |
| Different effort per target | effort: {claude: xhigh, default: high} |
---
name: architect
description: Designs the change before anyone codes it.
model:
claude: opus
cursor: "claude-opus-5[effort=high]"
default: gpt-5.5
effort:
claude: xhigh
qoder: 8000
factory: max
default: high
x-codex:
model_reasoning_effort: xhigh
---
Result: Claude gets opus and xhigh; Qoder gpt-5.5 and 8000; Junie gpt-5.5 and high; Cursor claude-opus-5[effort=high] (resolved effort discarded); Codex gpt-5.5 with x-codex overriding effort to xhigh; Factory gpt-5.5 with no reasoningEffort (max is outside its enum, coverage note); Trae drops both with notes.
effort values by target. Only the targets listed were checked. Omitting effort inherits the session's level.
| Target | Values | How it lands |
|---|---|---|
| Claude Code | low, medium, high, xhigh, max, model dependent | Verbatim effort, not validated |
| Qoder | Same five names, or a positive integer | Verbatim effort |
| Junie | Alias of reasoningLevel | Verbatim effort |
| Factory | low, medium, high | reasoningEffort. Other values and integers raise a coverage note |
| Codex | Any string | model_reasoning_effort; x-codex.model_reasoning_effort wins. An integer raises a note |
| Cursor | none | Coverage note. Put it in the model id: model: {cursor: "claude-opus-5[effort=high]"} |
| Copilot | none | Coverage note. x-copilot.effort still passes through |
| Every other target | none | Coverage note |
Cursor encodes effort in the model string, so it rides on the model map. Factory ignores reasoningEffort when model resolves to inherit.
tools support by target
Only the targets listed were checked. A target that cannot honor tools prints a coverage note at sync time, so tools: [Read] never silently becomes an unrestricted agent.
| Target | Behavior |
|---|---|
| Claude Code, Copilot, Junie | Passed through as a YAML list |
| Qoder, Trae | Passed through as a comma-separated string (tools: Read, Bash) |
| Windsurf, Kiro, Factory, Gemini | Translated to native names |
| Antigravity, OpenHands, Goose, Codex, Cursor, Augment, Kilo Code | Dropped with a note |
Translation can widen access: on Kiro, Edit alone also permits delete_file. Most targets accept native names through x-<target>.tools, which bypasses translation.
mcpServers support by target
Only the targets listed were checked. A top-level mcpServers list narrows which MCP servers one agent may reach. Omitting it inherits the session's full set.
| Target | Behavior |
|---|---|
| Claude Code, Junie, Factory | Server names, written to the agent file |
| Qoder | Server names or inline objects, written to the agent file |
| OpenHands | Inline definitions only. Set x-openhands.mcp_servers |
| Antigravity | Inline objects only. Set x-antigravity.mcpServers |
| Kiro | Inline definitions only. Set x-kiro.mcpServers |
Every other target drops the list with a coverage note; the three inline targets' notes name the x-<target> key to set.
An empty list is not portable. Junie treats mcpServers: [] as keeping every configured server. Factory treats it as excluding every server. List the servers you want instead.
permissionMode and agent hooks support by target
Only the targets listed were checked. permissionMode sets one delegated agent's approval boundary; hooks scopes lifecycle hooks to it. Omitting either inherits the parent session.
| Target | permissionMode | Agent hooks |
|---|---|---|
| Claude Code | Seven values, manual aliases default | Written to the agent file |
| Qoder | Six values, another one is reported | Seven events, a wider one is reported |
| OpenHands | Different names (always_confirm, never_confirm, confirm_risky). Set x-openhands | Six snake_case events, command handlers only. Set x-openhands |
On Qoder, bypassPermissions is demoted to acceptEdits when security policy disables it, and agent scope runs fewer hook events than project scope.
color support by target
Only the targets listed were checked. color is written verbatim and not validated. An unrecognized value is cosmetic: the agent still runs.
| Target | Values |
|---|---|
| Augment | Free text, an ANSI color name |
| Kilo Code | Hex or a theme token |
| Qoder | One of eight names |
| OpenHands | Dropped with a note. Set x-openhands.color to a Rich color name |
color: blue is valid on Augment and Qoder but is neither hex nor a Kilo Code theme token. OpenHands shares its .agents/agents/ tree with Goose, whose frontmatter has no color, so a portable color prints a coverage note there.