Maintain a single .1harness/ config directory and transpile to multiple AI coding agent formats
Project description
OneHarness
Maintain a single .1harness/ directory as the source of truth for your AI coding agent configurations, then transpile them into multiple target formats.
One config. Every tool.
The Problem
Each AI coding tool has its own config directory, file format, and feature set:
| Tool | Skills | Instructions | MCP | Config location |
|---|---|---|---|---|
| Claude Code | .claude/skills/ |
CLAUDE.md |
.claude/settings.json |
.claude/ |
| OpenCode | .opencode/skills/ |
AGENTS.md |
.opencode/config.yaml |
.opencode/ |
| GitHub Copilot | .github/skills/ |
.github/copilot-instructions.md |
.vscode/mcp.json |
.github/, .vscode/ |
When you update a skill or MCP server config, you have to replicate the change across every tool manually. OneHarness eliminates that.
How It Works
.1harness/ # You maintain this (committed to git)
config.yaml # Which tools to target
AGENTS.md # Main instructions
skills/
code-review/SKILL.md # Your skills
instructions/
coding-standards.md # Your instructions
mcp/
servers.yaml # Your MCP servers
oneharness sync
────────────────>
.claude/ # Generated (gitignored)
skills/code-review/SKILL.md
settings.json # MCP servers merged in
CLAUDE.md # Instructions concatenated
.opencode/ # Generated (gitignored)
skills/code-review/SKILL.md
AGENTS.md # Instructions concatenated
.github/ # Generated (gitignored)
skills/code-review/SKILL.md
copilot-instructions.md # Instructions concatenated
.vscode/
mcp.json # MCP servers merged in
Install
# Zero-install (recommended) - runs directly without installing
uvx oneharness
# Or install permanently
uv pip install oneharness
# or
uv add oneharness
Quick Start
# 1. Initialize - select which tools to target
oneharness init
# 2. Add your content to .1harness/
# - Put skills in .1harness/skills/<name>/SKILL.md
# - Put instructions in .1harness/instructions/*.md
# - Put MCP configs in .1harness/mcp/*.yaml
# - Edit .1harness/AGENTS.md for main instructions
# 3. Sync to all target tools
oneharness sync
Commands
oneharness init
Interactive setup. Prompts you to select target tools, scaffolds .1harness/, writes config.yaml, and optionally runs an initial sync.
oneharness init # Project only (default)
oneharness init --global # Global config (~/.config/1harness/)
oneharness init --all # Both
oneharness sync
Transpiles .1harness/ content into each target tool's config directory.
oneharness sync # Incremental sync (default)
oneharness sync --clean # Wipe target dirs first, then sync fresh
oneharness sync --global # Sync global config only
oneharness sync --all # Sync both global and project
- Only touches files it owns (tracked in
sync.lock) - Manually added files in target dirs are preserved
- Incremental: skips unchanged files via SHA-256 hashing
- Reports 4-level diagnostics:
info,lossy,skipped,blocked
oneharness status
Shows sync state per adapter: file count, last sync time, capability resolutions, lossy transform count.
oneharness clean
Interactive removal of generated config directories. Reads ownership from sync.lock so it removes exactly what OneHarness created.
oneharness clean # Interactive select
oneharness clean --target claude-code # Clean specific adapter
oneharness doctor
Read-only audit. Checks config validity, adapter availability, hash mismatches, missing files, and whether target tools are installed.
Config
.1harness/config.yaml (committed to git):
schema_version: 1
adapters:
claude-code:
enabled: true
version: ">=1.0.0" # Optional version constraint
opencode:
enabled: true
copilot-vscode:
enabled: true
instructions:
- path: "instructions/coding-standards.md"
scope: project
apply_to: ["*.py", "*.ts"] # Optional file targeting
- path: "AGENTS.md"
scope: global
fallback:
on_lossy: warn # warn | error | ignore
on_skipped: warn
on_blocked: error
Scope Levels
OneHarness supports two independent config levels:
| Level | Location | Syncs to |
|---|---|---|
| Project | ./.1harness/ |
Tool project dirs (.claude/, .opencode/, etc.) |
| Global | ~/.config/1harness/ |
Tool home dirs (~/.claude/, ~/.opencode/, etc.) |
Each level syncs independently. OneHarness does not merge between levels -- the target tools handle that.
All commands default to --project. Use --global or --all to include other levels.
Supported Adapters (v1)
| Adapter | Skills | Instructions | Agents | MCP | Hooks | Commands | Prompts |
|---|---|---|---|---|---|---|---|
| Claude Code | yes | yes | yes | yes | partial | yes | yes |
| OpenCode | yes | yes | yes | yes | no | no | no |
| Copilot VS Code | yes | yes | yes | yes | yes | partial | yes |
partial = some sub-features supported; unsupported parts emit lossy diagnostics.
Diagnostics
Every sync reports diagnostics at four levels:
| Level | Meaning |
|---|---|
info |
File synced successfully |
lossy |
Content was simplified or partially dropped during transform |
skipped |
Feature not supported by target adapter, omitted |
blocked |
Fatal error, file could not be synced |
Configure how each level is treated via fallback in config.yaml.
Files
OneHarness adds only two files to your .1harness/:
config.yaml-- Adapter selection and settings. Commit this.sync.lock-- Sync state with hashes and ownership. Gitignored.
Everything else in .1harness/ is your content. Adapter manifests and all CLI logic ship inside the Python package.
Requirements
- Python 3.10+
- uv (recommended for
uvxzero-install usage)
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
File details
Details for the file oneharness-0.1.0.tar.gz.
File metadata
- Download URL: oneharness-0.1.0.tar.gz
- Upload date:
- Size: 9.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca2f80dbc50b162842ce3877a9dcd5483102db612c3f48a7d798b412a44eabc3
|
|
| MD5 |
546b73c223c15f47a8cf248335c52a4a
|
|
| BLAKE2b-256 |
54a09c82e4981724bf15e2705027d062031ac7ee383530ef9391aa29f65ee383
|