Harness support¶
Loadout targets Claude Code, Codex, Factory Droid, OpenCode, and Pi. These tables describe what Loadout renders, not the complete capability of each agent.
They are checked against this project's global preset and project preset. An absent output is an implementation limit of Loadout.
Global scope¶
| Configuration | Claude Code | Codex | Factory Droid | OpenCode | Pi |
|---|---|---|---|---|---|
| Instructions | Yes | Yes | Yes | Yes | Yes |
| Shell permissions | Yes | Yes | Yes | Yes | Permission extension |
| MCP tool policy | Yes | Yes, with server config | Not rendered | Yes | Permission extension |
| MCP server definitions | Yes | Yes | Yes | Yes | MCP adapter |
| Skills | Yes | Yes | Yes | Yes | Yes |
| Native settings | JSON settings | Defaults slice | JSON settings | JSON settings | JSON settings with plugins selected |
| Hooks | Native document | Native document | Native document | Command-hook adapter | Command-hook adapter |
| Plugin declarations | Marketplace enablement | Enablement and registrations | Enablement and registrations | Plugin files via module-config | Package references |
| Module files | Yes | Not rendered | Yes | Yes | Yes |
Pi needs the corresponding permission extension and MCP adapter to consume those generated files. Loadout renders configuration; it does not install those integrations.
Claude's global MCP servers are written into the owned mcpServers key in .claude.json.
Codex's server definitions and policy share the owned mcp_servers tables in config.toml.
Unrelated state in those co-owned files is preserved.
Project scope¶
| Configuration | Claude Code | Codex | Factory Droid | OpenCode | Pi |
|---|---|---|---|---|---|
| Instructions | CLAUDE.md |
AGENTS.md |
AGENTS.md |
AGENTS.md |
AGENTS.md |
| Shell permissions | Yes | Yes | Yes | Yes | Permission extension |
| MCP tool policy | Yes | Not rendered | Not rendered | Yes | Permission extension |
| MCP definitions | .mcp.json |
Not rendered | .factory/mcp.json |
opencode.json |
Reads shared .mcp.json through adapter |
| Skills | .claude/skills/ |
Not rendered | .factory/skills/ |
.opencode/skills/ |
.pi/skills/ |
| Hooks | Not rendered | Not rendered | .factory/hooks.json |
Not rendered | Not rendered |
| Plugin declarations | Not rendered | Not rendered | .factory/settings.json |
Not rendered | Not rendered |
The Pi MCP case requires the shared file to exist, for example because Claude is also enabled. A Pi-only project has no MCP-definition output.
Other than Droid's co-owned permission/plugin settings, this Loadout version has no project outputs for native settings/defaults or module files. Project templates contribute permissions, instructions, skills, and MCP definitions to the supported targets.
Permission portability¶
| Behavior | Claude Code | Codex | Factory Droid | OpenCode | Pi |
|---|---|---|---|---|---|
| Native decision order | Deny, ask, allow | Most restrictive | Native lists | Last match | Last match |
| Command matching | Patterns | Literal prefixes | Literal list entries | Globs | Globs |
| Loadout trailing shell globs | Rendered | Skipped | Skipped and reported | Rendered | Rendered |
Loadout exact shell entries (=) |
Rendered | Allow and ask omitted, deny widened, reported | Allow and ask omitted, deny widened, reported | Rendered | Rendered |
| Loadout shell catch-all | Native settings instead | Separate approval setting | Session autonomy instead | Rendered | Rendered |
Loadout expands bare commands where a harness needs a second rule for arguments and emits rules in the order required by last-match matchers. It cannot make every matcher equivalent.
Allowing a command that launches other commands, such as a shell interpreter, can make narrower deny rules ineffective. Review broad permissions using the harness's actual enforcement model.
The maintainer's matching research records the version-specific evidence and detailed examples.
OpenCode skills¶
OpenCode also discovers Claude skill directories by default. When Loadout renders different skill content for each harness, disable that overlapping discovery in your shell:
Add the setting to your shell configuration and start a new session. Loadout's check command
reports when neither this variable nor the broader OPENCODE_DISABLE_CLAUDE_CODE is enabled.
Global destination roots¶
| Harness | Default directory | Relocation variable |
|---|---|---|
| Claude Code | ~/.claude/ |
CLAUDE_CONFIG_DIR |
| Codex | ~/.codex/ |
CODEX_HOME |
| Factory Droid | ~/.factory/ |
FACTORY_HOME_OVERRIDE |
| OpenCode | ~/.config/opencode/ |
XDG_CONFIG_HOME |
| Pi | ~/.pi/agent/ |
PI_CODING_AGENT_DIR |
Claude's global MCP file defaults to ~/.claude.json. With CLAUDE_CONFIG_DIR set, Loadout
places .claude.json under that directory, alongside the relocated configuration.
For OpenCode, XDG_CONFIG_HOME is the parent configuration directory. Loadout appends
opencode/. OPENCODE_CONFIG_DIR is a different mechanism and does not relocate these
Loadout destinations.
For Droid, FACTORY_HOME_OVERRIDE is the parent home directory. Loadout appends .factory/.