Manage projects that target multiple coding agents from a single shared harness.
Project description
multi-harness ๐
One project. Many coding agents. Zero duplication.
mh is a CLI that keeps your skills, subagents, and project instructions in a single
canonical .harness/ directory and materialises per-agent symlinks so every agent sees
the paths it expects โ no copy-paste, no drift.
Supported agents: Claude Code ยท OpenAI Codex CLI ยท OpenCode ยท GitHub Copilot ยท Google Antigravity
โจ Why multi-harness?
Each coding agent looks for instructions, skills, and subagents in different places:
CLAUDE.md, .github/copilot-instructions.md, AGENTS.md, .claude/skills/, .codex/skills/ โฆ
Without mh you either duplicate these files across every agent-specific location or
keep them in sync by hand. mh solves this by:
- Creating one real
.harness/directory with the canonical files. - Writing relative symlinks everywhere each agent expects to look.
- Detecting an existing single-agent project and migrating it automatically.
๐ฆ Installation
pip install multi-harness
Verify the install:
mh --help
๐ Quick start
cd my-project
mh init
That's it. mh detects which agents are already configured, migrates their files into
.harness/, and creates symlinks for all five supported agents.
๐ Commands
mh init โ bootstrap or migrate a project
mh init # all five agents, current directory
mh init --agents claude,codex # register only two agents
mh init --template ./AGENTS_TEMPLATE.md # seed AGENTS.md from a template file
mh init --force # re-create symlinks idempotently (safe)
mh init /path/to/project # target a different directory
On first run mh init:
- Creates
AGENTS.md(or uses your--template) as the shared project instructions file. - Creates
.harness/skills/and.harness/agents/as the shared canonical directories. - Writes relative symlinks for every registered agent (see layout below).
- Records the registered agents in
.harness/config.toml.
If exactly one agent is already configured, mh init migrates its files into
.harness/ before creating symlinks โ your existing work is preserved, not overwritten.
mh add โ register new agents
mh add copilot # add a single agent
mh add opencode antigravity # add multiple agents at once
Creates the symlinks for the new agent(s) and updates .harness/config.toml. Requires
mh init to have been run first.
mh remove โ unregister agents
mh remove codex # remove one agent
mh remove opencode copilot # remove several at once
Removes the agent's symlinks (instructions, skills, subagents) without touching any file
inside .harness/. Your shared content is never deleted.
mh status โ inspect symlink health
mh status # check current directory
mh status /path/to/project # check another directory
Reports the state of every symlink for every registered agent:
| Status | Meaning |
|---|---|
โ
ok |
Symlink exists and resolves correctly |
โ missing |
Symlink is absent |
๐ broken |
Symlink exists but target doesn't resolve |
โ ๏ธ detached |
A real file/dir sits where a symlink should be |
๐๏ธ Layout produced by mh init
my-project/
โโโ AGENTS.md โ canonical shared instructions (real file)
โโโ CLAUDE.md โ AGENTS.md
โโโ .harness/
โ โโโ config.toml โ registered agents list
โ โโโ skills/ โ shared skills (real dir)
โ โโโ agents/ โ shared subagents (real dir)
โโโ .claude/
โ โโโ skills โ ../.harness/skills
โ โโโ agents โ ../.harness/agents
โโโ .codex/
โ โโโ skills โ ../.harness/skills
โ โโโ agents โ ../.harness/agents
โโโ .opencode/
โ โโโ skills โ ../.harness/skills
โ โโโ agent โ ../.harness/agents
โโโ .github/
โ โโโ copilot-instructions.md โ ../AGENTS.md
โ โโโ skills โ ../.harness/skills
โ โโโ agents โ ../.harness/agents
โโโ .agents/
โ โโโ skills โ ../.harness/skills
โโโ .subagents โ .harness/agents
All symlinks are relative, so the tree is fully portable across machines and paths.
๐ Typical workflow
# 1. Bootstrap a new project
mh init --agents claude,codex
# 2. Add an agent later
mh add copilot
# 3. Check everything is wired up correctly
mh status
# 4. Remove an agent you no longer use
mh remove antigravity
Write your instructions once in AGENTS.md, drop skills into .harness/skills/, and
place shared subagents in .harness/agents/ โ every registered agent picks them up
automatically.
๐ก๏ธ Safety guarantees
- Symlinks never overwrite real files. If a real file or directory already exists
where a symlink should go,
mhaborts with an error rather than deleting your data. --forceis safe. It re-creates symlinks but still refuses to touch real files.- Migration is non-destructive. Files are moved into
.harness/; nothing is deleted.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file multi_harness-0.1.0.tar.gz.
File metadata
- Download URL: multi_harness-0.1.0.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34e1941f8637f88a42c6321d3dc786764f2462ab232ee488c92a9ac1510a0963
|
|
| MD5 |
3edd085a6659849c5a928957b4cfe2e5
|
|
| BLAKE2b-256 |
21e569dba0fc8ca80ce50998df7b59c2a416ad579f6c55df63ba6eb4f0468cc0
|
File details
Details for the file multi_harness-0.1.0-py3-none-any.whl.
File metadata
- Download URL: multi_harness-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97d6b81233f1441526c16e1050fcbc0e10529c7166601505db88e8c97e05200b
|
|
| MD5 |
066bffe373e18e3ee4718936d90a2512
|
|
| BLAKE2b-256 |
b508d7d844a030b9dd106a1876f63eada722c303ba60eb4eb1c863c817b4708b
|