Skip to main content

Model-agnostic, self-learning, self-healing agent harness — Python SDK + Claude Code skill/slash/MCP

Project description

forge

Model-agnostic, self-learning, self-healing agent harness — and a Python SDK for building agent swarms.

Drop into any project. Spin up parallel councils. Self-improve via recursion. Memory and skills compound across projects. Use it from code, from a CLI, or as a Claude Code slash command + MCP server.

Layers

L7  Observability  OTel · token+cost · dry-run verdict · replayable traces
L6  Use-case       Personas · skills · routers · heartbeats
L5  Self-improve   Skill autosynthesis · eval gate · skill search
L4  Swarm          Topology × consensus · sub-agent isolation
L3  Self-healing   ErrorType · CircuitBreaker · retry policy
L2  Tools          MCP → Computer/Browser → CLI shell · per-persona deny-list
L1  Memory         ReasoningBank · git journal · Obsidian vault · cross-project genome · .claude/
L0  Kernel         Agent loop · hook lifecycle · provider-as-profile

Install

# From GitHub
pip install git+https://github.com/jbellsolutions/forge.git#egg=forge[anthropic,mcp]

# Or local editable
git clone https://github.com/jbellsolutions/forge.git
cd forge && pip install -e ".[anthropic,mcp]"

Optional extras: anthropic, openai, mcp, composio, otel, embeddings, all.

Configure

mkdir -p ~/.forge
cat > ~/.forge/.env <<EOF
ANTHROPIC_API_KEY=sk-ant-...
OPENROUTER_API_KEY=sk-or-...     # optional
COMPOSIO_API_KEY=ak_...          # optional, unlocks 1000+ SaaS tools
EOF
chmod 600 ~/.forge/.env

forge auto-loads ~/.forge/.env on import. Verify:

forge doctor

Use it from code (the SDK path)

import asyncio
from forge.kernel import HookBus
from forge.healing import attach_healing
from forge.swarm import (
    RoleCouncilSpawner, RoleAssignment, SwarmSpec, Topology, Consensus,
)
from forge.tools import ToolRegistry
from forge.tools.builtin.echo import EchoTool

async def main():
    tools = ToolRegistry(); tools.register(EchoTool())
    hooks = HookBus(); attach_healing(hooks)

    spawner = RoleCouncilSpawner(tools=tools, hooks=hooks, max_turns=4)
    spawner.set_assignments([
        RoleAssignment(profile="anthropic",            role="optimist"),
        RoleAssignment(profile="anthropic-haiku",      role="skeptic"),
        RoleAssignment(profile="anthropic-contrarian", role="pragmatist"),
    ])

    spec = SwarmSpec(
        topology=Topology.PARALLEL_COUNCIL,
        consensus=Consensus.MAJORITY,
        members=["anthropic", "anthropic-haiku", "anthropic-contrarian"],
    )
    result = await spawner.run("Should we ship today?", spec)
    print(result.verdict.winner)

asyncio.run(main())

The full primitive set:

# Kernel
from forge.kernel import AgentLoop, AgentDef, HookBus, HookContext, Verdict

# Providers (model-as-profile)
from forge.providers import make_provider, load_profile
# Profiles: anthropic, anthropic-haiku, anthropic-contrarian,
#           openrouter-deepseek, openai-gpt4, ollama-llama3, mock

# Tools (3-tier fall-through)
from forge.tools import ToolRegistry
from forge.tools.builtin.shell import ShellTool, ClaudeCodeTool, CodexCLITool, GeminiCLITool
from forge.tools.builtin.fs import FSReadTool, FSWriteTool
from forge.tools.builtin.browser import HttpFetchTool
from forge.tools.builtin.obsidian import ObsidianWriteTool, ObsidianSearchTool
from forge.tools.mcp_client import MCPClientPool, load_mcp_servers
from forge.tools.composio_adapter import ComposioAdapter

# Healing
from forge.healing import CircuitBreaker, ErrorType, attach_healing

# Swarm
from forge.swarm import Spawner, RoleCouncilSpawner, SwarmSpec, Topology, Consensus

# Memory (per-project + cross-project genome)
from forge.memory import (
    ObsidianVault, ReasoningBank, GitJournal, ClaudeDir, genome, promote,
)

# Skills (eval-gated autosynth)
from forge.skills import SkillStore, autosynth, evaluate, promote_if_passing, SkillSearchIndex

# Observability
from forge.observability import TraceStore, Telemetry
from forge.observability.otel import OTelExporter

# Recursion (self-mod)
from forge.recursion import recurse_once, propose_with_llm, ResultsLedger

Use it from the CLI

forge doctor                   # health check
forge run operator             # mock vertical end-to-end
forge run operator_real        # live council with MCP filesystem server
forge recurse --home ~/.forge/X
forge recurse-loop -n 5        # nightly cron friendly
forge dashboard --home ~/.forge/X
forge skill list
forge vault search --query "shipping"
forge heartbeat run --dir ~/.forge/X/.claude/heartbeats
forge mcp                      # run as MCP stdio server

Use it inside Claude Code (slash + skill + MCP)

One-time setup:

claude mcp add -s user forge -- /path/to/.venv/bin/forge mcp

Inside a Claude Code session:

/forge council "Should we ship today?"
/forge recurse
/forge vault write Q4 plan :: ship by Oct #planning
/forge vault search shipping
/forge remember "Friday EOD ships work"
/forge recall shipping
/forge skill list
/forge doctor

The skill at ~/.claude/skills/forge/SKILL.md also auto-triggers on intent — you can just say "run a council on whether to ship" and Claude calls forge_council for you.

Memory model

  • Per-project working memory at <your_project>/.claude/forge/ — traces, telemetry, project-specific skills
  • Cross-project genome at ~/.forge/genome.json — high-confidence learnings compound across all your projects
  • Obsidian vault at ~/.forge/vault — human-readable knowledge graph; open in Obsidian, see backlinks, edit by hand

Schedulers

Templates in forge/scheduler/:

# macOS launchd (nightly self-improve)
cp forge/scheduler/launchd.plist.template ~/Library/LaunchAgents/com.forge.recurse.plist
launchctl load ~/Library/LaunchAgents/com.forge.recurse.plist

# Linux/macOS cron
crontab -e        # paste from forge/scheduler/cron.crontab.template

# CI / GitHub Actions
mkdir -p .github/workflows
cp forge/scheduler/github_action.yml.template .github/workflows/forge-nightly.yml

Verification

pytest -q                                      # 70 tests
forge doctor                                   # env audit
python examples/operator/run.py                # mock end-to-end
ANTHROPIC_API_KEY=... python examples/recursion_demo/run.py        # live recursion
ANTHROPIC_API_KEY=... python examples/operator_real/run_with_tools.py  # live council

Architecture references

forge synthesizes patterns from many sources without inheriting any single one:

  • Ruflo — provider-as-profile, topology × consensus as config, ReasoningBank loop
  • Hermes (Nous) — autonomous skill synthesis post-task
  • Meta-Harness (Yoon Ho Lee) — full-fidelity trace store as the recursion substrate
  • OpenHarness (HKUDS) — hook bus + permission modes + dry-run verdict
  • OpenClaw — per-session-type tool allowlists, gateway-as-router
  • Claude Agent SDKAgentDefinition, hook lifecycle, permission modes
  • Anthropic harness paper — Initializer→Coding split, git-as-session-journal
  • Composio — session+auth tool registry over 1000+ apps
  • FowlerGuides (feedforward) + Sensors (feedback) vocabulary
  • AutoAgentprogram.md regularizer, FIXED ADAPTER BOUNDARY sentinel, results.tsv ledger
  • Justin's repos (autonomous-sdr, coo-agent, Orgo).claude/ filesystem contract, ErrorType + CircuitBreaker, eval-gated A/B promotion

License

MIT

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

forge_harness-0.1.0.tar.gz (77.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

forge_harness-0.1.0-py3-none-any.whl (85.0 kB view details)

Uploaded Python 3

File details

Details for the file forge_harness-0.1.0.tar.gz.

File metadata

  • Download URL: forge_harness-0.1.0.tar.gz
  • Upload date:
  • Size: 77.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for forge_harness-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5e2b2b01554d2d092dfbf2212a1fef9e0f164d12d19f3ab75c1c4427f1b9249f
MD5 0e2236edeabfa04840484af84af61f0f
BLAKE2b-256 8e81395547bfe8b2e4c39fc2c6982997204272b86255621b024a52df950963bd

See more details on using hashes here.

File details

Details for the file forge_harness-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: forge_harness-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 85.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for forge_harness-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 656d3f0e56189aadf93e9b929b5eb9440d9daeca4429df1207fdc532c77e7fbf
MD5 fc25ecfed866537c0ce7b1eb69b736df
BLAKE2b-256 a311f476f0c5716ed79780258ca88b97b2e8e506ee922a9f7045226074b0e80f

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