Skip to main content

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 uvx zero-install usage)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oneharness-0.1.0.tar.gz (9.7 MB view details)

Uploaded Source

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

Hashes for oneharness-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ca2f80dbc50b162842ce3877a9dcd5483102db612c3f48a7d798b412a44eabc3
MD5 546b73c223c15f47a8cf248335c52a4a
BLAKE2b-256 54a09c82e4981724bf15e2705027d062031ac7ee383530ef9391aa29f65ee383

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page