# agent-harness
**Repository Path**: oldtime15672/agent-harness
## Basic Information
- **Project Name**: agent-harness
- **Description**: 基于opencode的harness插件
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-05-22
- **Last Updated**: 2026-07-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Harness Plugin
[](LICENSE)
[](https://www.typescriptlang.org/)
平台无关的 AI 代理任务编排引擎,支持 OpenCode、OpenClaw 等多平台扩展。提供文件锁互斥、Git 分支隔离和合同边界,让 AI 代理像项目经理一样拆分任务、调度执行、验证结果。
## 特性
- **核心与扩展分离** — 核心逻辑零平台依赖,通过扩展适配不同 AI 平台
- **独立 Session 上下文** — 多 Session 并行时互不污染,通过持久化元数据协作
- **按需任务编排** — 简单消息直接回复;复杂目标自动拆分为最小原子子任务
- **拓扑排序调度** — `harness_plan` 自动分析依赖关系,生成并行执行计划
- **智能文件锁** — 单任务模式零开销,仅在并行任务修改相同文件时启用锁
- **Git 分支隔离** — 写入型子任务自动创建分支,完成后由用户决定合并或丢弃
- **合同边界** — 限制子代理只能编辑声明的文件和执行允许的命令
- **自动重试** — 子任务失败后可配置重试次数
## 快速开始
### 安装
```bash
git clone https://gitee.com/oldtime15672/agent-harness.git
cd agent-harness
npm install
npm run build
```
### 配置
在目标项目的 `opencode.json` 中注册插件和代理:
```json
{
"default_agent": "harness",
"plugin": ["./agent-harness"],
"agent": {
"harness": {
"description": "Harness 主协调器",
"mode": "primary",
"prompt": "{file:./agent-harness/skills/harness/SKILL.md}"
},
"executor": {
"description": "执行器",
"mode": "subagent",
"prompt": "{file:./agent-harness/templates/executor.md}",
"permission": {
"read": "allow",
"edit": "allow",
"glob": "allow",
"grep": "allow",
"bash": "allow"
}
}
}
}
```
项目级配置文件 `.agent_harness/config.jsonc`:
```jsonc
{
"git": {
"enabled": true, // 启用 Git 分支隔离
"branch_prefix": "harness/", // 分支前缀
"fallback_to_cache": true, // 非 Git 项目使用缓存回退
"default_branch": "main" // 默认分支
},
"task": {
"max_retries": 3, // 子任务最大重试次数
"lock_timeout_minutes": 10 // 文件锁超时(分钟)
}
}
```
## 架构
```
agent-harness/
├── src/ # 核心模块(零平台依赖)
│ ├── adapter/types.ts # 适配器接口定义
│ ├── tools/handlers/ # 纯业务逻辑处理函数
│ │ ├── task.ts # 任务生命周期
│ │ ├── plan.ts # 执行计划生成
│ │ ├── lock.ts # 文件锁管理
│ │ └── session.ts # 会话管理
│ ├── core/ # 核心编排(类型、注册表、拓扑排序)
│ ├── contract/ # 合同系统(路径边界、命令检查、文件锁)
│ ├── git/ # Git 隔离(分支管理、缓存回退)
│ ├── session/ # 会话上下文(每 Session 独立)
│ ├── config/ # 配置加载(JSONC 解析)
│ └── logging/ # 日志(仅写文件,不输出到 CLI)
│
├── extensions/
│ ├── opencode/ # OpenCode 平台适配
│ │ ├── index.ts # 插件入口(Plugin 工厂)
│ │ ├── tools.ts # 工具定义(Zod schema)
│ │ └── hooks.ts # 钩子适配
│ │
│ └── openclaw/ # OpenClaw 平台适配
│ ├── index.ts # 插件入口
│ └── hooks.ts # EventEmitter 适配
│
├── templates/ # 子代理提示模板
└── skills/ # 主协调器技能定义
```
### 核心概念
| 概念 | 说明 |
|------|------|
| `HarnessTask` | 复杂目标的主任务边界,聚合所有子任务的状态、锁和分支 |
| `SubTask` | 最小执行单元,包含单一目标、工具权限和文件/命令合同 |
| `executor` | 子代理,只执行收到的单个 GOAL,不规划、不派生子任务 |
| `SessionContext` | 每个 Session 的独立上下文,不跨 Session 共享 |
| `parallel` | 任务标记,指示是否需要文件锁保护(plan 自动检测设置) |
### 工具 API
harness_task — 任务生命周期管理
| action | 用途 | 关键参数 |
|--------|------|---------|
| `start` | 开始主任务 | task, target_files, success_criteria?, allowed_commands? |
| `subtask` | 注册子任务 | task_id, subtask_id, goal, target_files?, retry_count? |
| `subtask_start` | 开始子任务(创建子分支) | task_id, subtask_id |
| `subtask_done` | 子任务完成(合并子分支) | task_id, subtask_id, passed, evidence, output? |
| `status` | 查看状态 | task_id? (无则列出所有) |
| `detailed_status` | 获取详细状态(含锁信息) | task_id |
| `verify` | 验证主任务 | task_id, passed, evidence |
| `complete` | 完成主任务 | task_id, outcome (merged/discarded), note? |
| `result` | 获取子任务结果 | task_id, subtask_ids? |
harness_plan — 执行计划生成
| 参数 | 类型 | 说明 |
|------|------|------|
| task_id | string | 主任务 ID |
| tasks | TaskPlan[] | 子任务列表(id, goal, dependencies, target_files?, retry_count?, timeout?) |
| with_instructions? | boolean | 是否包含调度指令(默认 true) |
**自动行为**:
- 检测到并行任务组 + 文件重叠 → 设置 `parallel: true`,启用文件锁
- 否则 → `parallel: false`,单任务模式零锁开销
harness_lock — 文件锁管理
| action | 用途 | 关键参数 |
|--------|------|---------|
| `acquire` | 获取文件锁(支持等待) | file_path, task_id?, subtask_id?, wait_ms?, retry_interval_ms? |
| `release` | 释放文件锁 | file_path, task_id? |
| `status` | 查询锁状态 | file_path |
| `release_all` | 释放任务的所有锁 | task_id? |
harness_session — 会话和系统信息
| action | 用途 | 关键参数 |
|--------|------|---------|
| `config` | 获取当前配置 | 无 |
| `session` | 获取会话信息 | 无 |
| `branches` | 列出所有 harness 分支 | 无 |
| `cleanup` | 释放所有锁并清理 | 无 |
| `sessions` | 列出所有会话 | 无 |
| `tasks` | 列出任务摘要 | 无 |
| `learnings` | 列出学习记录 | 无 |
| `memory` | 获取所有记忆 | 无 |
| `set_memory` | 设置记忆值 | key, value |
| `add_learning` | 添加学习记录 | learning_type, description, tags? |
## 工作流
### 自动生命周期
```
opencode 启动 → event hook 初始化 SessionContext
│
├─ 简单消息 → 直接回复,不创建任务
│
└─ 复杂目标 → harness_task start 创建 HarnessTask
├─ 拆分为 SubTask(最小原子操作)
├─ harness_plan 生成执行计划(拓扑排序 + 并行分组)
│ └─ 检测并行 + 文件重叠 → parallel: true
├─ 按并行组调度 executor
│ ├─ 只读任务:不创建分支,不获取锁
│ ├─ 写入任务(parallel=false):创建分支,直接写入
│ └─ 写入任务(parallel=true):创建分支 + 获取锁
├─ subtask_done → 提交到主任务分支,释放锁
└─ verify → complete → 等待用户确认合并/丢弃
```
### 手动模式
```
harness_task start → 创建主任务 + 合同
harness_task subtask → 注册子任务
harness_plan → 生成执行计划(自动设置 parallel 标记)
harness_task subtask_start → 开始子任务
@executor 执行 → tool-guard 拦截(仅 parallel=true 时检查锁)
harness_task subtask_done → 完成子任务
harness_task verify → 验证
harness_task complete → 等待用户确认
```
## 设计细节
Git 分支结构
```
main
└── harness/{task_id} # 主任务分支(第一个写入子任务时创建)
└── 子任务更改直接提交到主任务分支
```
- 主任务分支在第一个需要文件修改的子任务出现时自动创建
- 只读子任务不创建分支、不获取写锁
- 写入子任务成功后将 `target_files` 提交到主任务分支,然后清理子分支
- `complete` 只保留元数据,**必须由用户手动确认合并或丢弃**
文件锁 & 多任务并发
**智能锁策略**:仅在并行任务修改相同文件时启用锁
| 场景 | parallel=false(默认) | parallel=true |
|------|----------------------|---------------|
| read | 直接读取 | 检查锁 |
| edit/write | 合约检查 → 直接写入 | 合约检查 → 获取锁 → 写入 |
| bash | 合约检查 | 合约检查 |
**锁机制**:
- 锁标识:`task_id + subtask_id`;同标识重入,不同标识冲突
- 锁 TTL:默认 10 分钟(`lock_timeout_minutes`),过期自动释放
- 锁等待:最多 30 秒,每 100ms 重试
- 孤儿锁:超过 24 小时自动清理
异常恢复
| 场景 | 行为 |
|------|------|
| opencode 异常退出 | 释放锁,保留分支和任务元数据 |
| 进程被 kill | 重启后旧 task 标记为 `failed`,孤儿锁自动清理 |
| 删除 `.agent_harness/` | 下次调用自动重建 |
| 子任务失败 | 丢弃子分支,可重试 |
数据存储
```
~/.config/agent_harness/
├── context.json # 全局上下文(会话、任务、学习记录、记忆)
└── sessions/{sessionId}/
└── session.log # 会话日志
/.agent_harness/
├── config.jsonc # 项目配置
├── state/tasks.json # 任务注册表
├── state/task-results/ # 子任务执行结果
├── contracts/ # 合同存储
├── locks/ # 文件锁
└── cache/branches/ # 非 Git 项目缓存
```
## 开发
```bash
npm run build # tsc 编译
npm run dev # tsc --watch 监听模式
npm test # vitest run
```
### 添加新平台支持
1. 创建 `extensions/new-platform/`
2. 实现 2-3 个文件:`index.ts`, `hooks.ts`, 可选 `tools.ts`
3. 核心逻辑零改动
## 参与贡献
1. Fork 本仓库
2. 创建特性分支:`git checkout -b feature/my-feature`
3. 提交更改:`git commit -m "feat: add my feature"`
4. 推送分支:`git push origin feature/my-feature`
5. 提交 Pull Request
请确保 `npm run build` 和 `npm test` 通过后再提交。
## 许可证
本项目采用 [MIT 许可证](LICENSE)。