aireg harnesses¶
List the harnesses aireg can install into, and which this machine has.
Synopsis¶
Description¶
aireg harnesses lists the coding agents aireg found on this machine, and any a harness file of yours defines. It finds one by its environment variables, its program on your PATH, or its folder in the project or your home folder. With --all, it lists every harness name --for accepts, found or not.
Each row names a coding agent and the id --for takes. Once a harness file of yours defines one, a from column says where each harness comes from.
harnesses doesn't need a project.
Actions¶
| Action | Description |
|---|---|
show <id> |
Print a harness as aireg resolved it. |
check <file> |
Check a harness file before you use it. |
Supported harnesses¶
Each path is in a project, then in your user scope.
| Harness | --for |
Skills | Agents | Moves the user folder |
|---|---|---|---|---|
| Claude Code | claude |
.claude/skills/<name>/, ~/.claude/skills/<name>/ |
.claude/agents/<name>.md, ~/.claude/agents/<name>.md |
CLAUDE_CONFIG_DIR |
| Codex | codex |
.agents/skills/<name>/, ~/.agents/skills/<name>/ |
.codex/agents/<name>.toml, ~/.codex/agents/<name>.toml, as TOML |
CODEX_HOME |
| Cursor | cursor |
.agents/skills/<name>/, ~/.agents/skills/<name>/ |
.cursor/agents/<name>.md, ~/.cursor/agents/<name>.md |
None |
| GitHub Copilot | copilot |
.github/skills/<name>/, ~/.copilot/skills/<name>/ |
.github/agents/<name>.agent.md, ~/.copilot/agents/<name>.agent.md |
COPILOT_HOME |
| Gemini CLI | gemini |
.gemini/skills/<name>/, ~/.gemini/skills/<name>/ |
.gemini/agents/<name>.md, ~/.gemini/agents/<name>.md, as a copy |
GEMINI_CLI_HOME |
| OpenCode | opencode |
.agents/skills/<name>/, ~/.agents/skills/<name>/ |
.opencode/agents/<name>.md, ~/.config/opencode/agents/<name>.md, as a copy |
XDG_CONFIG_HOME |
Harness files¶
A harness file adds a harness aireg doesn't ship, or replaces one it does with "overrides": true. aireg reads one JSON file per harness from ~/.aireg/harnesses/<id>.json ($AIREG_HOME/harnesses/ when AIREG_HOME is set). Only your user scope defines harnesses: a project can select one by id, in --for or its manifest, but never define one.
{
"id": "tool",
"displayName": "Tool",
"roots": { "project": ".tool", "user": { "default": "~/.tool", "env": "TOOL_HOME" } },
"detect": { "binary": ["tool"] },
"reads": { "skill": ["agents"] },
"kinds": {
"plugin": { "shape": "contents" },
"agent": { "shape": "file", "subdir": "agents", "extension": ".md" }
}
}
This harness reads skills from the shared .agents folder and agents from .tool/agents/, and takes a plugin as the skills and agents it holds. harness.schema.json describes every key. A file can't set default, importable or detect.caller, which only built-in harnesses use.
A kind placed with place: "copy" is written as real files, for a harness that edits or refuses links; an edit then shows in aireg status. A codec rewrites an agent in the harness's own format, and refuses to drop or change a key that limits the agent, such as tools.
A kind's keys say how the harness takes a front-matter key it doesn't read as written, such as disable-model-invocation: a .json or .yaml file it reads instead, which aireg writes into a copy of the artifact, or false, which leaves out an artifact that sets the key rather than install it without that limit.
aireg skips a file, with a warning, when it isn't valid against the schema, names a codec aireg doesn't have, reaches outside its folders, gives a shell command where a program and its arguments belong, or isn't named <id>.json. The built-in harnesses keep working. Run aireg harnesses check <file> to see what is wrong with one.
Trust and reload steps¶
Some harnesses load what aireg placed only after you trust it. aireg never takes that step: it prints the command once, and aireg status --json lists it under needsApproval. It also prints a harness's reload step after a change to it.
Options¶
| Option | Description |
|---|---|
--all |
List every harness aireg supports, not only those found. |
JSON output¶
{"ok": true, "data": {"harnesses": [{"name": "claude", "displayName": "Claude Code", "kind": "coding", "shared": false, "detected": true, "by": "binary", "origin": "built-in"}], "skipped": []}}
The harnesses are every one --all lists, in its order, plus the shared .agents folder, which the table leaves out; shared is true for it. by is env, binary, project or user, and is left out when the harness wasn't found. origin is built-in or the path of the file that defines the harness. skipped lists each harness file aireg refused, with its path and problems.
show prints {"harness": {...}}, the harness as aireg resolved it. check prints {"path": "...", "id": "tool", "problems": []}, with ok false when it found a problem.
Exit status¶
0: listed, shown, or the file is usable.1:checkfound a problem with the file.2: an unknown action, a missing argument, or no harness with that id.
Examples¶
See which coding agents this machine has:
harness id status where
Claude Code claude found on your PATH
Found 1 of 3 supported harnesses on this machine.
hint: Run `aireg harnesses --all` to see every one.
See where Codex takes each kind:
Check a harness file before you save it in ~/.aireg/harnesses/: