[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-73982":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},73982,"OpenHarness","HKUDS\u002FOpenHarness","HKUDS","\"OpenHarness: Open Agent Harness with a Built-in Personal Agent--Ohmo!\"","",null,"Python",13737,2253,75,14,0,156,387,761,468,45,"MIT License",false,"main",true,[],"2026-06-12 02:03:20","\u003Ch1 align=\"center\">\n  \u003Cimg src=\"assets\u002Flogo.png\" alt=\"OpenHarness\" width=\"64\" style=\"vertical-align: middle;\">\n  &nbsp;&nbsp;\n  \u003Cimg src=\"assets\u002Fohmo.png\" alt=\"ohmo\" width=\"64\" style=\"vertical-align: middle;\">\n  \u003Cbr>\n  \u003Ccode>oh\u003C\u002Fcode> — OpenHarness &amp; \u003Ccode>ohmo\u003C\u002Fcode>\n\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"README.md\">\u003Cstrong>English\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"README.zh-CN.md\">\u003Cstrong>简体中文\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\n**OpenHarness** delivers core lightweight agent infrastructure: tool-use, skills, memory, and multi-agent coordination.\n\n**ohmo** is a personal AI agent built on OpenHarness — not another chatbot, but an assistant that actually works for you over long sessions. Chat with ohmo in Feishu \u002F Slack \u002F Telegram \u002F Discord, and it forks branches, writes code, runs tests, and opens PRs on its own. ohmo runs on your existing Claude Code or Codex subscription — no extra API key needed.\n\n**Join the community**: contribute **Harness** for open agent development.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#-quick-start\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FQuick_Start-5_min-blue?style=for-the-badge\" alt=\"Quick Start\">\u003C\u002Fa>\n  \u003Ca href=\"#-harness-architecture\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FHarness-Architecture-ff69b4?style=for-the-badge\" alt=\"Architecture\">\u003C\u002Fa>\n  \u003Ca href=\"#-features\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTools-43+-green?style=for-the-badge\" alt=\"Tools\">\u003C\u002Fa>\n  \u003Ca href=\"#-test-results\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTests-114_Passing-brightgreen?style=for-the-badge\" alt=\"Tests\">\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow?style=for-the-badge\" alt=\"License\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-≥3.10-blue?logo=python&logoColor=white\" alt=\"Python\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact+Ink-TUI-61DAFB?logo=react&logoColor=white\" alt=\"React\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpytest-114_pass-brightgreen\" alt=\"Pytest\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FE2E-6_suites-orange\" alt=\"E2E\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Foutput-text_|_json_|_stream--json-blueviolet\" alt=\"Output\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FOpenHarness\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FOpenHarness\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FHKUDS\u002F.github\u002Fblob\u002Fmain\u002Fprofile\u002FREADME.md\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFeishu-Group-E9DBFC?style=flat&logo=feishu&logoColor=white\" alt=\"Feishu\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FHKUDS\u002F.github\u002Fblob\u002Fmain\u002Fprofile\u002FREADME.md\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWeChat-Group-C5EAB4?style=flat&logo=wechat&logoColor=white\" alt=\"WeChat\">\u003C\u002Fa>\n\u003C\u002Fp>\n\nOne Command (**oh**) to Launch **OpenHarness** and Unlock All Agent Harnesses. \n\nSupports CLI agent integration including OpenClaw, nanobot, Cursor, and more.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fcli-typing.gif\" alt=\"OpenHarness Terminal Demo\" width=\"800\">\n\u003C\u002Fp>\n\n---\n## ✨ OpenHarness's Key Harness Features\n\n\u003Ctable align=\"center\" width=\"100%\">\n\u003Ctr>\n\u003Ctd width=\"20%\" align=\"center\" style=\"vertical-align: top; padding: 15px;\">\n\n\u003Ch3>🔄 Agent Loop\u003C\u002Fh3>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FEngine-06B6D4?style=for-the-badge&logo=lightning&logoColor=white\" alt=\"Engine\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cimg src=\"assets\u002Fscene-agentloop.png\" width=\"140\">\n\n\u003Cp align=\"center\">\u003Cstrong>• Streaming Tool-Call Cycle\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• API Retry with Exponential Backoff\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Parallel Tool Execution\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Token Counting & Cost Tracking\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"20%\" align=\"center\" style=\"vertical-align: top; padding: 15px;\">\n\n\u003Ch3>🔧 Harness Toolkit\u003C\u002Fh3>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F43+_Tools-10B981?style=for-the-badge&logo=toolbox&logoColor=white\" alt=\"Toolkit\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cimg src=\"assets\u002Fscene-toolkit.png\" width=\"140\">\n\n\u003Cp align=\"center\">\u003Cstrong>• 43 Tools (File, Shell, Search, Web, MCP)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• On-Demand Skill Loading (.md)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Plugin Ecosystem (Skills + Hooks + Agents)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Compatible with anthropics\u002Fskills & plugins\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"20%\" align=\"center\" style=\"vertical-align: top; padding: 15px;\">\n\n\u003Ch3>🧠 Context & Memory\u003C\u002Fh3>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPersistent-8B5CF6?style=for-the-badge&logo=brain&logoColor=white\" alt=\"Context\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cimg src=\"assets\u002Fscene-context.png\" width=\"140\">\n\n\u003Cp align=\"center\">\u003Cstrong>• CLAUDE.md Discovery & Injection\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Context Compression (Auto-Compact)\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• MEMORY.md Persistent Memory\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Session Resume & History\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"20%\" align=\"center\" style=\"vertical-align: top; padding: 15px;\">\n\n\u003Ch3>🛡️ Governance\u003C\u002Fh3>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPermissions-F59E0B?style=for-the-badge&logo=shield&logoColor=white\" alt=\"Governance\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cimg src=\"assets\u002Fscene-governance.png\" width=\"140\">\n\n\u003Cp align=\"center\">\u003Cstrong>• Multi-Level Permission Modes\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Path-Level & Command Rules\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• PreToolUse \u002F PostToolUse Hooks\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Interactive Approval Dialogs\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003C\u002Ftd>\n\u003Ctd width=\"20%\" align=\"center\" style=\"vertical-align: top; padding: 15px;\">\n\n\u003Ch3>🤝 Swarm Coordination\u003C\u002Fh3>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMulti--Agent-EC4899?style=for-the-badge&logo=network&logoColor=white\" alt=\"Swarm\" \u002F>\n\u003C\u002Fdiv>\n\n\u003Cimg src=\"assets\u002Fscene-swarm.png\" width=\"140\">\n\n\u003Cp align=\"center\">\u003Cstrong>• Subagent Spawning & Delegation\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Team Registry & Task Management\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• Background Task Lifecycle\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp align=\"center\">\u003Cstrong>• \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FClawTeam\">ClawTeam\u003C\u002Fa> Integration (Roadmap)\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## 🤔 What is an Agent Harness?\n\nAn **Agent Harness** is the complete infrastructure that wraps around an LLM to make it a functional agent. The model provides intelligence; the harness provides **hands, eyes, memory, and safety boundaries**.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fharness-equation.png\" alt=\"Harness = Tools + Knowledge + Observation + Action + Permissions\" width=\"700\">\n\u003C\u002Fp>\n\nOpenHarness is an open-source Python implementation designed for **researchers, builders, and the community**:\n\n- **Understand** how production AI agents work under the hood\n- **Experiment** with cutting-edge tools, skills, and agent coordination patterns\n- **Extend** the harness with custom plugins, providers, and domain knowledge\n- **Build** specialized agents on top of proven architecture\n\n---\n\n## 📰 What's New\n\n- **Unreleased** 🔍 **Dry-run safe preview**:\n  - `oh --dry-run` previews resolved runtime settings, auth state, skills, commands, tools, and configured MCP servers without executing the model, tools, or subagents.\n  - Dry-run now reports a `ready` \u002F `warning` \u002F `blocked` readiness verdict with concrete next-step suggestions such as fixing auth, fixing MCP config, or running the prompt directly.\n  - Prompt previews include likely matching skills and tools, while slash-command previews show whether the command is mostly read-only or stateful.\n- **2026-04-18** ⚙️ **v0.1.7** — Packaging & TUI polish:\n  - Install script now links `oh`, `ohmo`, and `openharness` into `~\u002F.local\u002Fbin` instead of prepending the virtualenv `bin` directory to `PATH`, which avoids clobbering Conda-managed shells.\n  - React TUI now supports `Shift+Enter` to insert a newline while keeping plain `Enter` as submit.\n  - Busy-state animation in the React TUI is quieter and less error-prone on Windows terminals, with conservative spinner frames and reduced flashing.\n- **2026-04-10** 🧠 **v0.1.6** — Auto-Compaction & Markdown TUI:\n  - Auto-Compaction preserves task state and channel logs across context compression — agents can run multi-day sessions without manual compact\u002Fclear\n  - Subprocess teammates run in headless worker mode; agent team creation stabilized\n  - Assistant messages now render full Markdown in the React TUI\n  - `ohmo` gains channel slash commands and multimodal attachment support\n- **2026-04-08** 🔌 **v0.1.5** — MCP HTTP transport & Swarm polling:\n  - MCP protocol adds HTTP transport, auto-reconnect on disconnect, and tool-only server compatibility\n  - JSON Schema types inferred for MCP tool inputs — no manual type mapping needed\n  - `ohmo` channels support file attachments and multimodal gateway messages\n  - Subprocess agents are now pollable in real runs; permission modals serialized to prevent input swallowing\n- **2026-04-08** 🌙 **v0.1.4** — Multi-provider auth & Moonshot\u002FKimi:\n  - Native Moonshot\u002FKimi provider with `reasoning_content` support for thinking models\n  - Auth overhaul: fixed provider-switching key mismatch, `OPENAI_BASE_URL` env override, profile-scoped credential priority\n  - MCP gracefully handles disconnected servers in `call_tool` \u002F `read_resource`\n  - Security: built-in sensitive-path protection in PermissionChecker, hardened `web_fetch` URL validation\n  - Stability: EIO crash recovery in Ink TUI, `--debug` logging, Windows cmd flash fix\n- **2026-04-06** 🚀 **v0.1.2** — Unified setup flows and `ohmo` personal-agent app:\n  - `oh setup` now guides provider selection as workflows instead of exposing raw auth\u002Fprovider internals\n  - Compatible API setup is now profile-scoped, so Anthropic\u002FOpenAI-compatible endpoints can keep separate keys\n  - `ohmo` ships as a packaged app with `~\u002F.ohmo` workspace, gateway, bootstrap prompts, and channel config flow\n- **2026-04-01** 🎨 **v0.1.0** — Initial **OpenHarness** open-source release featuring complete Harness architecture: \n\n\u003Cp align=\"center\">\n  \u003Cstrong>Start here:\u003C\u002Fstrong>\n  \u003Ca href=\"#-quick-start\">Quick Start\u003C\u002Fa> ·\n  \u003Ca href=\"#-provider-compatibility\">Provider Compatibility\u003C\u002Fa> ·\n  \u003Ca href=\"docs\u002FSHOWCASE.md\">Showcase\u003C\u002Fa> ·\n  \u003Ca href=\"CONTRIBUTING.md\">Contributing\u003C\u002Fa> ·\n  \u003Ca href=\"CHANGELOG.md\">Changelog\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n## 🚀 Quick Start\n\n### 1. Install\n\n#### Linux \u002F macOS \u002F WSL\n\n```bash\n# One-click install\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHKUDS\u002FOpenHarness\u002Fmain\u002Fscripts\u002Finstall.sh | bash\n\n# Or via pip\npip install openharness-ai\n```\n\n#### Windows (Native)\n\n```powershell\n# One-click install (PowerShell)\niex (Invoke-WebRequest -Uri 'https:\u002F\u002Fraw.githubusercontent.com\u002FHKUDS\u002FOpenHarness\u002Fmain\u002Fscripts\u002Finstall.ps1')\n\n# Or via pip\npip install openharness-ai\n```\n\n**Note**: Windows support is now native. In PowerShell, use `openh` instead of `oh` because `oh` can resolve to the built-in `Out-Host` alias.\n\n### 2. Configure\n\n```bash\noh setup    # interactive wizard — pick a provider, authenticate, done\n# On Windows PowerShell, use: openh setup\n```\n\nSupports **Claude \u002F OpenAI \u002F Copilot \u002F Codex \u002F Moonshot(Kimi) \u002F GLM \u002F MiniMax \u002F NVIDIA NIM** and any compatible endpoint.\n\n### 3. Run\n\n```bash\noh\n# On Windows PowerShell, use: openh\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Flanding.png\" alt=\"OpenHarness Landing Screen\" width=\"700\">\n\u003C\u002Fp>\n\n### 4. Set up ohmo (Personal Agent)\n\nWant an AI agent that works for you from Feishu \u002F Slack \u002F Telegram \u002F Discord?\n\n```bash\nohmo init             # initialize ~\u002F.ohmo workspace\nohmo config           # configure channels and provider\nohmo gateway start    # start the gateway — ohmo is now live in your chat app\n```\n\nohmo runs on your existing **Claude Code subscription** or **Codex subscription** — no extra API key needed.\n\n### Non-Interactive Mode (Pipes & Scripts)\n\n```bash\n# Single prompt → stdout\noh -p \"Explain this codebase\"\n\n# JSON output for programmatic use\noh -p \"List all functions in main.py\" --output-format json\n\n# Stream JSON events in real-time\noh -p \"Fix the bug\" --output-format stream-json\n```\n\n### Dry Run (Safe Preview)\n\nUse `--dry-run` when you want to inspect what OpenHarness would use before any live execution starts.\n\n```bash\n# Preview an interactive session setup\noh --dry-run\n\n# Preview one prompt without executing the model or tools\noh --dry-run -p \"Review this bug fix and grep for failing tests\"\n\n# Preview a slash command path\noh --dry-run -p \"\u002Fplugin list\"\n\n# Get structured output for scripts or channels\noh --dry-run -p \"Explain this repository\" --output-format json\n```\n\nDry-run is intentionally static:\n\n- It does **not** call the model\n- It does **not** execute tools or spawn subagents\n- It does **not** connect to MCP servers\n- It **does** resolve settings, auth status, prompt assembly, skills, commands, tools, and obvious MCP config problems\n\nReadiness levels:\n\n- `ready`: configuration looks usable; the next suggested action is usually to run the prompt directly\n- `warning`: OpenHarness can resolve the session, but something important still looks wrong, such as broken MCP config or missing auth for later model work\n- `blocked`: the requested path will not run successfully as-is, for example an unknown slash command or a prompt that cannot resolve a runtime client\n\n`next actions` in the dry-run output tell you the shortest fix or follow-up step, such as:\n\n- run `oh auth login`\n- fix or disable broken MCP configuration\n- run the prompt directly with `oh -p \"...\"` or open the interactive UI with `oh`\n\n## 🔌 Provider Compatibility\n\nOpenHarness treats providers as **workflows** backed by named profiles. In day-to-day use, prefer:\n\n```bash\noh setup\noh provider list\noh provider use \u003Cprofile>\n```\n\n### Built-in Workflows\n\n| Workflow | What it is | Typical backends |\n|----------|------------|------------------|\n| **Anthropic-Compatible API** | Anthropic-style request format | Claude official, Kimi, GLM, MiniMax, internal Anthropic-compatible gateways |\n| **Claude Subscription** | Claude CLI subscription bridge | Local `~\u002F.claude\u002F.credentials.json` |\n| **OpenAI-Compatible API** | OpenAI-style request format | OpenAI official, OpenRouter, DashScope, DeepSeek, SiliconFlow, Groq, Ollama, GitHub Models |\n| **Codex Subscription** | Codex CLI subscription bridge | Local `~\u002F.codex\u002Fauth.json` |\n| **GitHub Copilot** | Copilot OAuth workflow | GitHub Copilot device-flow login |\n\n### Compatible API Families\n\n#### Anthropic-Compatible API\n\nTypical examples:\n\n| Backend | Base URL | Example models |\n|---------|----------|----------------|\n| **Claude official** | `https:\u002F\u002Fapi.anthropic.com` | `claude-sonnet-4-6`, `claude-opus-4-6` |\n| **Moonshot \u002F Kimi** | `https:\u002F\u002Fapi.moonshot.cn\u002Fanthropic` | `kimi-k2.5` |\n| **Zhipu \u002F GLM** | custom Anthropic-compatible endpoint | `glm-4.5` |\n| **MiniMax** | custom Anthropic-compatible endpoint | `minimax-m1` |\n\n#### OpenAI-Compatible API\n\nAny provider implementing the OpenAI `\u002Fv1\u002Fchat\u002Fcompletions` style API works:\n\n| Backend | Base URL | Example models |\n|---------|----------|----------------|\n| **OpenAI** | `https:\u002F\u002Fapi.openai.com\u002Fv1` | `gpt-5.4`, `gpt-4.1` |\n| **OpenRouter** | `https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1` | provider-specific |\n| **Alibaba DashScope** | `https:\u002F\u002Fdashscope.aliyuncs.com\u002Fcompatible-mode\u002Fv1` | `qwen3.5-flash`, `qwen3-max`, `deepseek-r1` |\n| **DeepSeek** | `https:\u002F\u002Fapi.deepseek.com` | `deepseek-chat`, `deepseek-reasoner` |\n| **GitHub Models** | `https:\u002F\u002Fmodels.inference.ai.azure.com` | `gpt-4o`, `Meta-Llama-3.1-405B-Instruct` |\n| **SiliconFlow** | `https:\u002F\u002Fapi.siliconflow.cn\u002Fv1` | `deepseek-ai\u002FDeepSeek-V3` |\n| **NVIDIA NIM** | `https:\u002F\u002Fintegrate.api.nvidia.com\u002Fv1` | `openai\u002Fgpt-oss-120b`, `nvidia\u002Fllama-3.3-nemotron-super-49b-v1` |\n| **Google Gemini** | `https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta\u002Fopenai` | `gemini-2.5-flash`, `gemini-2.5-pro` |\n| **Groq** | `https:\u002F\u002Fapi.groq.com\u002Fopenai\u002Fv1` | `llama-3.3-70b-versatile` |\n| **Ollama (local)** | `http:\u002F\u002Flocalhost:11434\u002Fv1` | any local model |\n\n### Advanced Profile Management\n\n```bash\n# List saved workflows\noh provider list\n\n# Switch the active workflow\noh provider use codex\n\n# Add your own compatible endpoint\noh provider add my-endpoint \\\n  --label \"My Endpoint\" \\\n  --provider openai \\\n  --api-format openai \\\n  --auth-source openai_api_key \\\n  --model my-model \\\n  --base-url https:\u002F\u002Fexample.com\u002Fv1\n```\n\nFor custom compatible endpoints, OpenHarness can bind credentials per profile instead of forcing every Anthropic-compatible or OpenAI-compatible backend to share the same API key.\n\n### Ollama (Local Models)\n\nRun local models through Ollama's OpenAI-compatible endpoint:\n\n```bash\n# Add an Ollama provider profile\noh provider add ollama \\\n  --label \"Ollama\" \\\n  --provider Ollama \\\n  --api-format openai \\\n  --auth-source openai_api_key \\\n  --model glm-4.7-flash:q8_0 \\\n  --base-url http:\u002F\u002Flocalhost:11434\u002Fv1\n```\n```\nSaved provider profile: ollama\n```\n\n```bash\n# Activate and verify\noh provider use ollama\n```\n```\nActivated provider profile: ollama\n```\n\n```bash\noh provider list\n```\n```\n  claude-api: Anthropic-Compatible API [ready]\n  ...\n  moonshot: Moonshot (Kimi) [missing auth]\n    auth=moonshot_api_key model=kimi-k2.5 base_url=https:\u002F\u002Fapi.moonshot.cn\u002Fv1\n* ollama: Ollama [ready]\n    auth=openai_api_key model=glm-4.7-flash:q8_0 base_url=http:\u002F\u002Flocalhost:11434\u002Fv1\n```\n\n### GitHub Copilot Format (`--api-format copilot`)\n\nUse your existing GitHub Copilot subscription as the LLM backend. Authentication uses GitHub's OAuth device flow — no API keys needed.\n\n```bash\n# One-time login (opens browser for GitHub authorization)\noh auth copilot-login\n\n# Then launch with Copilot as the provider\nuv run oh --api-format copilot\n\n# Or via environment variable\nexport OPENHARNESS_API_FORMAT=copilot\nuv run oh\n\n# Check auth status\noh auth status\n\n# Remove stored credentials\noh auth copilot-logout\n```\n\n| Feature | Details |\n|---------|---------|\n| **Auth method** | GitHub OAuth device flow (no API key needed) |\n| **Token management** | Automatic refresh of short-lived session tokens |\n| **Enterprise** | Supports GitHub Enterprise via `--github-domain` flag |\n| **Models** | Uses Copilot's default model selection |\n| **API** | OpenAI-compatible chat completions under the hood |\n\n---\n\n## 🏗️ Harness Architecture\n\nOpenHarness implements the core Agent Harness pattern with 10 subsystems:\n\n```\nopenharness\u002F\n  engine\u002F          # 🧠 Agent Loop — query → stream → tool-call → loop\n  tools\u002F           # 🔧 43 Tools — file I\u002FO, shell, search, web, MCP\n  skills\u002F          # 📚 Knowledge — on-demand skill loading (.md files)\n  plugins\u002F         # 🔌 Extensions — commands, hooks, agents, MCP servers\n  permissions\u002F     # 🛡️ Safety — multi-level modes, path rules, command deny\n  hooks\u002F           # ⚡ Lifecycle — PreToolUse\u002FPostToolUse event hooks\n  commands\u002F        # 💬 54 Commands — \u002Fhelp, \u002Fcommit, \u002Fplan, \u002Fresume, ...\n  mcp\u002F             # 🌐 MCP — Model Context Protocol client\n  memory\u002F          # 🧠 Memory — persistent cross-session knowledge\n  tasks\u002F           # 📋 Tasks — background task management\n  coordinator\u002F     # 🤝 Multi-Agent — subagent spawning, team coordination\n  prompts\u002F         # 📝 Context — system prompt assembly, CLAUDE.md, skills\n  config\u002F          # ⚙️ Settings — multi-layer config, migrations\n  ui\u002F              # 🖥️ React TUI — backend protocol + frontend\n```\n\n### The Agent Loop\n\nThe heart of the harness. One loop, endlessly composable:\n\n```python\nwhile True:\n    response = await api.stream(messages, tools)\n    \n    if response.stop_reason != \"tool_use\":\n        break  # Model is done\n    \n    for tool_call in response.tool_uses:\n        # Permission check → Hook → Execute → Hook → Result\n        result = await harness.execute_tool(tool_call)\n    \n    messages.append(tool_results)\n    # Loop continues — model sees results, decides next action\n```\n\nThe model decides **what** to do. The harness handles **how** — safely, efficiently, with full observability.\n\n### Harness Flow\n\n```mermaid\nflowchart LR\n    U[User Prompt] --> C[CLI or React TUI]\n    C --> R[RuntimeBundle]\n    R --> Q[QueryEngine]\n    Q --> A[Anthropic-compatible API Client]\n    A -->|tool_use| T[Tool Registry]\n    T --> P[Permissions + Hooks]\n    P --> X[Files Shell Web MCP Tasks]\n    X --> Q\n```\n\n---\n\n## ✨ Features\n\n### 🔧 Tools (43+)\n\n| Category | Tools | Description |\n|----------|-------|-------------|\n| **File I\u002FO** | Bash, Read, Write, Edit, Glob, Grep | Core file operations with permission checks |\n| **Search** | WebFetch, WebSearch, ToolSearch, LSP | Web and code search capabilities |\n| **Notebook** | NotebookEdit | Jupyter notebook cell editing |\n| **Agent** | Agent, SendMessage, TeamCreate\u002FDelete | Subagent spawning and coordination |\n| **Task** | TaskCreate\u002FGet\u002FList\u002FUpdate\u002FStop\u002FOutput | Background task management |\n| **MCP** | MCPTool, ListMcpResources, ReadMcpResource | Model Context Protocol integration |\n| **Mode** | EnterPlanMode, ExitPlanMode, Worktree | Workflow mode switching |\n| **Schedule** | CronCreate\u002FList\u002FDelete, RemoteTrigger | Scheduled and remote execution |\n| **Meta** | Skill, Config, Brief, Sleep, AskUser | Knowledge loading, configuration, interaction |\n\nEvery tool has:\n- **Pydantic input validation** — structured, type-safe inputs\n- **Self-describing JSON Schema** — models understand tools automatically\n- **Permission integration** — checked before every execution\n- **Hook support** — PreToolUse\u002FPostToolUse lifecycle events\n\n### 📚 Skills System\n\nSkills are **on-demand knowledge** — loaded only when the model needs them:\n\n```\nAvailable Skills:\n- commit: Create clean, well-structured git commits\n- review: Review code for bugs, security issues, and quality\n- debug: Diagnose and fix bugs systematically\n- plan: Design an implementation plan before coding\n- test: Write and run tests for code\n- simplify: Refactor code to be simpler and more maintainable\n- pdf: PDF processing with pypdf (from anthropics\u002Fskills)\n- xlsx: Excel operations (from anthropics\u002Fskills)\n- ... 40+ more\n```\n\nSkills can live in bundled, user, ohmo, project, or plugin locations. User-level skills are loaded from:\n\n```text\n~\u002F.openharness\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n~\u002F.claude\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n~\u002F.agents\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n```\n\nProject-level skills are enabled by default and are discovered from the current working directory up to the git root:\n\n```text\n\u003Cproject>\u002F.openharness\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n\u003Cproject>\u002F.agents\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n\u003Cproject>\u002F.claude\u002Fskills\u002F\u003Cskill>\u002FSKILL.md\n```\n\nDisable project skills for untrusted repositories with:\n\n```bash\noh config set allow_project_skills false\n```\n\nUse `\u002Fskills` to list loaded skills with their source and path. User-invocable skills can be run directly as slash commands, for example `\u002Fdeploy staging`.\n\n**Compatible with [anthropics\u002Fskills](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills)** — use the `SKILL.md` directory layout above.\n\n### 🌐 Web search and proxy settings\n\nBuilt-in `web_search` uses DuckDuckGo HTML search by default. In regions where that endpoint is unreachable, point OpenHarness at a trusted public HTML search endpoint or your own SearXNG instance:\n\n```bash\nexport OPENHARNESS_WEB_SEARCH_URL=\"https:\u002F\u002Fyour-searxng.example\u002Fsearch\"\n```\n\n`web_search` and `web_fetch` keep `trust_env=False` for SSRF safety, so they do not automatically inherit `HTTP_PROXY` \u002F `HTTPS_PROXY`. If you need a proxy, opt in with an OpenHarness-specific variable:\n\n```bash\nexport OPENHARNESS_WEB_PROXY=\"http:\u002F\u002F127.0.0.1:7890\"\n```\n\nThe proxy URL must be HTTP\u002FHTTPS and cannot contain embedded credentials.\n\n### 🔌 Plugin System\n\n**Compatible with [claude-code plugins](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code\u002Ftree\u002Fmain\u002Fplugins)**. Tested with 12 official plugins:\n\n| Plugin | Type | What it does |\n|--------|------|-------------|\n| `commit-commands` | Commands | Git commit, push, PR workflows |\n| `security-guidance` | Hooks | Security warnings on file edits |\n| `hookify` | Commands + Agents | Create custom behavior hooks |\n| `feature-dev` | Commands | Feature development workflow |\n| `code-review` | Agents | Multi-agent PR review |\n| `pr-review-toolkit` | Agents | Specialized PR review agents |\n\n```bash\n# Manage plugins\noh plugin list\noh plugin install \u003Csource>\noh plugin enable \u003Cname>\n```\n\n### 🤝 Ecosystem Workflows\n\nOpenHarness is useful as a lightweight harness layer around Claude-style tooling conventions:\n\n- **OpenClaw-oriented workflows** can reuse Markdown-first knowledge and command-driven collaboration patterns.\n- **Claude-style plugins and skills** stay portable because OpenHarness keeps those formats familiar.\n- **ClawTeam-style multi-agent work** maps well onto the built-in team, task, and background execution primitives.\n\nFor concrete usage ideas instead of generic claims, see [`docs\u002FSHOWCASE.md`](docs\u002FSHOWCASE.md).\n\n### 🛡️ Permissions\n\nMulti-level safety with fine-grained control:\n\n| Mode | Behavior | Use Case |\n|------|----------|----------|\n| **Default** | Ask before write\u002Fexecute | Daily development |\n| **Auto** | Allow everything | Sandboxed environments |\n| **Plan Mode** | Block all writes | Large refactors, review first |\n\n**Path-level rules** in `settings.json`:\n```json\n{\n  \"permission\": {\n    \"mode\": \"default\",\n    \"path_rules\": [{\"pattern\": \"\u002Fetc\u002F*\", \"allow\": false}],\n    \"denied_commands\": [\"rm -rf \u002F\", \"DROP TABLE *\"]\n  }\n}\n```\n\n### 🖥️ Terminal UI\n\nReact\u002FInk TUI with full interactive experience:\n\n- **Command picker**: Type `\u002F` → arrow keys to select → Enter\n- **Permission dialog**: Interactive y\u002Fn with tool details\n- **Mode switcher**: `\u002Fpermissions` → select from list\n- **Session resume**: `\u002Fresume` → pick from history\n- **Animated spinner**: Real-time feedback during tool execution\n- **Keyboard shortcuts**: Shown at the bottom, context-aware\n\n### 📡 CLI\n\n```\noh [OPTIONS] COMMAND [ARGS]\n\nSession:     -c\u002F--continue, -r\u002F--resume, -n\u002F--name\nModel:       -m\u002F--model, --effort, --max-turns\nOutput:      -p\u002F--print, --output-format text|json|stream-json\nPermissions: --permission-mode, --dangerously-skip-permissions\nContext:     -s\u002F--system-prompt, --append-system-prompt, --settings\nAdvanced:    -d\u002F--debug, --mcp-config, --bare\n\nSubcommands: oh setup | oh provider | oh auth | oh mcp | oh plugin\n```\n\n### 🧑‍💼 ohmo Personal Agent\n\n`ohmo` is a personal-agent app built on top of OpenHarness. It is packaged alongside `oh`, with its own workspace and gateway:\n\n```bash\n# Initialize personal workspace\nohmo init\n\n# Configure gateway channels and pick a provider profile\nohmo config\n\n# Run the personal agent\nohmo\n\n# Run the gateway in foreground\nohmo gateway run\n\n# Check or restart the gateway\nohmo gateway status\nohmo gateway restart\n```\n\nKey concepts:\n\n- `~\u002F.ohmo\u002F`\n  - personal workspace root\n- `soul.md`\n  - long-term agent personality and behavior\n- `identity.md`\n  - who `ohmo` is\n- `user.md`\n  - user profile and preferences\n- `BOOTSTRAP.md`\n  - first-run landing ritual\n- `memory\u002F`\n  - personal memory\n- `gateway.json`\n  - selected provider profile and channel configuration\n\n`ohmo config` uses the same workflow language as `oh setup`, so you can point the personal-agent gateway at:\n\n- `Anthropic-Compatible API`\n- `Claude Subscription`\n- `OpenAI-Compatible API`\n- `Codex Subscription`\n- `GitHub Copilot`\n\n`ohmo init` creates the home workspace once. After that, use `ohmo config` to update provider and channel settings; if the gateway is already running, the config flow can restart it for you.\n\nCurrently `ohmo init` \u002F `ohmo config` can guide channel setup for:\n\n- Telegram\n- Slack\n- Discord\n- Feishu\n\n---\n\n## 📊 Test Results\n\n| Suite | Tests | Status |\n|-------|-------|--------|\n| Unit + Integration | 114 | ✅ All passing |\n| CLI Flags E2E | 6 | ✅ Real model calls |\n| Harness Features E2E | 9 | ✅ Retry, skills, parallel, permissions |\n| React TUI E2E | 3 | ✅ Welcome, conversation, status |\n| TUI Interactions E2E | 4 | ✅ Commands, permissions, shortcuts |\n| Real Skills + Plugins | 12 | ✅ anthropics\u002Fskills + claude-code\u002Fplugins |\n\n```bash\n# Run all tests\nuv run pytest -q                           # 114 unit\u002Fintegration\npython scripts\u002Ftest_harness_features.py     # Harness E2E\npython scripts\u002Ftest_real_skills_plugins.py  # Real plugins E2E\n```\n\n---\n\n## 🔧 Extending OpenHarness\n\n### Add a Custom Tool\n\n```python\nfrom pydantic import BaseModel, Field\nfrom openharness.tools.base import BaseTool, ToolExecutionContext, ToolResult\n\nclass MyToolInput(BaseModel):\n    query: str = Field(description=\"Search query\")\n\nclass MyTool(BaseTool):\n    name = \"my_tool\"\n    description = \"Does something useful\"\n    input_model = MyToolInput\n\n    async def execute(self, arguments: MyToolInput, context: ToolExecutionContext) -> ToolResult:\n        return ToolResult(output=f\"Result for: {arguments.query}\")\n```\n\n### Add a Custom Skill\n\nCreate `~\u002F.openharness\u002Fskills\u002Fmy-skill.md`:\n\n```markdown\n---\nname: my-skill\ndescription: Expert guidance for my specific domain\n---\n\n# My Skill\n\n## When to use\nUse when the user asks about [your domain].\n\n## Workflow\n1. Step one\n2. Step two\n...\n```\n\n### Add a Plugin\n\nCreate `.openharness\u002Fplugins\u002Fmy-plugin\u002F.claude-plugin\u002Fplugin.json`:\n\n```json\n{\n  \"name\": \"my-plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"My custom plugin\"\n}\n```\n\nAdd commands in `commands\u002F*.md`, hooks in `hooks\u002Fhooks.json`, agents in `agents\u002F*.md`.\n\n---\n\n## 🌍 Showcase\n\nOpenHarness is most useful when treated as a small, inspectable harness you can adapt to a real workflow:\n\n- **Repo coding assistant** for reading code, patching files, and running checks locally.\n- **Headless scripting tool** for `json` and `stream-json` output in automation flows.\n- **Plugin and skill testbed** for experimenting with Claude-style extensions.\n- **Multi-agent prototype harness** for task delegation and background execution.\n- **Provider comparison sandbox** across Anthropic-compatible backends.\n\nSee [`docs\u002FSHOWCASE.md`](docs\u002FSHOWCASE.md) for short, reproducible examples.\n\n---\n\n## 🤝 Contributing\n\nOpenHarness is a **community-driven research project**. We welcome contributions in:\n\n| Area | Examples |\n|------|---------|\n| **Tools** | New tool implementations for specific domains |\n| **Skills** | Domain knowledge `.md` files (finance, science, DevOps...) |\n| **Plugins** | Workflow plugins with commands, hooks, agents |\n| **Providers** | Support for more LLM backends (OpenAI, Ollama, etc.) |\n| **Multi-Agent** | Coordination protocols, team patterns |\n| **Testing** | E2E scenarios, edge cases, benchmarks |\n| **Documentation** | Architecture guides, tutorials, translations |\n\n```bash\n# Development setup\ngit clone https:\u002F\u002Fgithub.com\u002FHKUDS\u002FOpenHarness.git\ncd OpenHarness\nuv sync --extra dev\nuv run pytest -q  # Verify everything works\n```\n\nUseful contributor entry points:\n\n- [`CONTRIBUTING.md`](CONTRIBUTING.md) for setup, checks, and PR expectations\n- [`CHANGELOG.md`](CHANGELOG.md) for user-visible changes\n- [`docs\u002FSHOWCASE.md`](docs\u002FSHOWCASE.md) for real-world usage patterns worth documenting\n\n---\n\n## 🔧 Troubleshooting\n\n### Backspace key in macOS Terminal.app\n\nOpenHarness handles both common terminal delete sequences, including the raw `DEL` byte (`0x7f`) that macOS Terminal.app sends for Backspace. If Backspace inserts spaces or visible control characters instead of deleting text, upgrade OpenHarness first.\n\nFor older versions that do not include this fix, use a terminal that sends a standard Backspace sequence or adjust your terminal keyboard profile as a temporary workaround.\n\n---\n\n## 📄 License\n\nMIT — see [LICENSE](LICENSE).\n\n---\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Flogo.png\" alt=\"OpenHarness\" width=\"48\">\n  \u003Cbr>\n  \u003Cstrong>Oh my Harness!\u003C\u002Fstrong>\n  \u003Cbr>\n  \u003Cem>The model is the agent. The code is the harness.\u003C\u002Fem>\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fstar-history.com\u002F#HKUDS\u002FOpenHarness&Date\">\n    \u003Cpicture>\n      \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=HKUDS\u002FOpenHarness&type=Date&theme=dark\" \u002F>\n      \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=HKUDS\u002FOpenHarness&type=Date\" \u002F>\n      \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=HKUDS\u002FOpenHarness&type=Date\" style=\"border-radius: 15px; box-shadow: 0 0 30px rgba(0, 217, 255, 0.3);\" \u002F>\n    \u003C\u002Fpicture>\n  \u003C\u002Fa>\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n  \u003Cem> Thanks for visiting ✨ OpenHarness!\u003C\u002Fem>\u003Cbr>\u003Cbr>\n  \u003Cimg src=\"https:\u002F\u002Fvisitor-badge.laobi.icu\u002Fbadge?page_id=HKUDS.OpenHarness&style=for-the-badge&color=00d4ff\" alt=\"Views\">\n\u003C\u002Fp>\n","OpenHarness 是一个提供核心轻量级代理基础设施的项目，旨在支持工具使用、技能、记忆和多代理协调。其内置的个人AI助手ohmo能在长时间会话中为你工作，通过Feishu、Slack、Telegram或Discord与用户交互，并能独立完成代码编写、测试运行及提交拉取请求等任务，基于用户现有的Claude Code或Codex订阅服务运行，无需额外API密钥。该项目采用Python开发，具备快速启动指南、详细的架构设计文档以及超过114个通过的测试用例，适合需要高效自动化处理日常编码任务或希望探索开放代理开发领域的开发者使用。",2,"2026-06-11 03:48:15","high_star"]