@zhijiewang/openharness 2.17.0 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -24
- package/README.zh-CN.md +785 -0
- package/dist/commands/hooks-report.d.ts +7 -0
- package/dist/commands/hooks-report.js +29 -0
- package/dist/commands/info.d.ts +1 -1
- package/dist/commands/info.js +7 -1
- package/dist/harness/config.d.ts +13 -0
- package/dist/harness/hooks.d.ts +2 -1
- package/dist/harness/hooks.js +1 -1
- package/dist/harness/language.d.ts +8 -0
- package/dist/harness/language.js +13 -0
- package/dist/main.js +59 -5
- package/dist/mcp/loader.d.ts +7 -0
- package/dist/mcp/loader.js +18 -0
- package/dist/outputStyles/index.d.ts +30 -0
- package/dist/outputStyles/index.js +89 -0
- package/dist/tools/ListMcpResourcesTool/index.d.ts +23 -0
- package/dist/tools/ListMcpResourcesTool/index.js +53 -0
- package/dist/tools/ReadMcpResourceTool/index.d.ts +20 -0
- package/dist/tools/ReadMcpResourceTool/index.js +51 -0
- package/dist/tools.js +4 -0
- package/dist/utils/json-schema.d.ts +24 -0
- package/dist/utils/json-schema.js +110 -0
- package/package.json +1 -1
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,785 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo-256.png" alt="openHarness logo" width="128" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# OpenHarness
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
___
|
|
9
|
+
/ \
|
|
10
|
+
( ) ___ ___ ___ _ _ _ _ _ ___ _ _ ___ ___ ___
|
|
11
|
+
`~w~` / _ \| _ \| __| \| | || | /_\ | _ \ \| | __/ __/ __|
|
|
12
|
+
(( )) | (_) | _/| _|| .` | __ |/ _ \| / .` | _|\__ \__ \
|
|
13
|
+
))(( \___/|_| |___|_|\_|_||_/_/ \_\_|_\_|\_|___|___/___/
|
|
14
|
+
(( ))
|
|
15
|
+
`--`
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
终端里的 AI 编程助手。支持任意 LLM —— 免费的本地模型,或任意云端 API。
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<img src="assets/openharness_v0.11.1_4.gif" alt="OpenHarness demo" width="800" />
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
[](https://www.npmjs.com/package/@zhijiewang/openharness) [](https://www.npmjs.com/package/@zhijiewang/openharness) [](LICENSE)     [](https://github.com/zhijiewong/openharness) [](https://github.com/zhijiewong/openharness/issues) [](https://github.com/zhijiewong/openharness/pulls)
|
|
25
|
+
|
|
26
|
+
[English](README.md) | **简体中文**
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 目录
|
|
31
|
+
|
|
32
|
+
- [快速开始](#快速开始)
|
|
33
|
+
- [为什么选择 OpenHarness?](#为什么选择-openharness)
|
|
34
|
+
- [终端界面](#终端界面)
|
|
35
|
+
- [工具(37 个)](#工具37-个)
|
|
36
|
+
- [斜杠命令(33 个)](#斜杠命令33-个)
|
|
37
|
+
- [权限模式](#权限模式)
|
|
38
|
+
- [钩子](#钩子)
|
|
39
|
+
- [检查点与回滚](#检查点与回滚)
|
|
40
|
+
- [代理角色](#代理角色)
|
|
41
|
+
- [无头模式与 CI/CD](#无头模式)
|
|
42
|
+
- [电子宠物 Cybergotchi](#电子宠物-cybergotchi)
|
|
43
|
+
- [MCP 服务器](#mcp-服务器)
|
|
44
|
+
- [模型提供商](#模型提供商)
|
|
45
|
+
- [常见问题](#常见问题)
|
|
46
|
+
- [安装](#安装)
|
|
47
|
+
- [开发](#开发)
|
|
48
|
+
- [贡献](#贡献)
|
|
49
|
+
- [社区](#社区)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 快速开始
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install -g @zhijiewang/openharness
|
|
57
|
+
oh
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
就是这么简单。OpenHarness 会自动检测 Ollama 并开始对话。无需 API 密钥。
|
|
61
|
+
|
|
62
|
+
**Python SDK:** 我们还提供了官方的 Python SDK,可以在 Python 程序中驱动 `oh`(笔记本、批处理脚本、ML 流水线)。在 npm 安装之后,使用 `pip install openharness-sdk` 安装(PyPI 分发名为 `openharness-sdk`,因为未加后缀的名称已被占用),然后 `from openharness import query`。详见 [`python/README.md`](python/README.md)。
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
oh init # 交互式安装向导(模型提供商 + 电子宠物)
|
|
66
|
+
oh # 自动检测本地模型
|
|
67
|
+
oh --model ollama/qwen2.5:7b # 指定模型
|
|
68
|
+
oh --model gpt-4o # 云端模型(需要 OPENAI_API_KEY)
|
|
69
|
+
oh --trust # 自动批准所有工具调用
|
|
70
|
+
oh --auto # 自动批准,但阻止危险的 bash 命令
|
|
71
|
+
oh -p "fix the tests" --trust # 无头模式(单次提示后退出)
|
|
72
|
+
oh run "review code" --json # 用于 CI/CD 的 JSON 输出
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**会话内命令:**
|
|
76
|
+
```
|
|
77
|
+
/rewind # 撤销最近一次 AI 文件变更(恢复检查点)
|
|
78
|
+
/roles # 列出所有代理专长
|
|
79
|
+
/vim # 切换 vim 模式
|
|
80
|
+
Ctrl+O # 将历史记录刷入终端滚动缓冲区以便查阅
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 为什么选择 OpenHarness?
|
|
84
|
+
|
|
85
|
+
大多数 AI 编程助手要么绑定单一模型提供商,要么每月收费 20 美元以上。OpenHarness 支持任意 LLM —— 可以在本机用 Ollama 免费运行,也可以连接任意云端 API。每一次 AI 编辑都会自动提交到 git,并可以通过 `/undo` 回退。
|
|
86
|
+
|
|
87
|
+
## 终端界面
|
|
88
|
+
|
|
89
|
+
OpenHarness 采用受 Ink/Claude Code 默认模式启发的顺序式终端渲染器。已完成的消息会刷入原生的滚动缓冲区(可滚动),而实时区域(流式输出、加载动画、输入框)则通过相对光标移动进行原地重绘。
|
|
90
|
+
|
|
91
|
+
### 键位绑定
|
|
92
|
+
|
|
93
|
+
| 按键 | 操作 |
|
|
94
|
+
|-----|--------|
|
|
95
|
+
| `Enter` | 提交提示词 |
|
|
96
|
+
| `Alt+Enter` | 插入换行(多行输入) |
|
|
97
|
+
| `↑` / `↓` | 浏览输入历史 |
|
|
98
|
+
| `Ctrl+C` | 取消当前请求 / 退出 |
|
|
99
|
+
| `Ctrl+A` / `Ctrl+E` | 跳到输入框首 / 尾 |
|
|
100
|
+
| `Ctrl+O` | 展开 / 折叠思考块 |
|
|
101
|
+
| `Ctrl+K` | 展开 / 折叠消息中的代码块 |
|
|
102
|
+
| `Tab` | 自动补全斜杠命令 / 文件路径 / 切换工具输出 |
|
|
103
|
+
| `/vim` | 切换 Vim 模式(normal/insert) |
|
|
104
|
+
|
|
105
|
+
滚动由终端的原生滚动条处理。已完成的消息会进入终端滚动缓冲区。使用终端自带的搜索功能(如 VS Code 中的 `Ctrl+Shift+F`)搜索对话历史。
|
|
106
|
+
|
|
107
|
+
### 特性
|
|
108
|
+
|
|
109
|
+
- **Markdown 渲染** —— 标题、代码块、粗体、斜体、列表、表格、引用块、链接
|
|
110
|
+
- **语法高亮** —— 关键字、字符串、注释、数字、类型(支持 JS/TS/Python/Rust/Go 等 20+ 种语言)
|
|
111
|
+
- **可折叠代码块** —— 超过 8 行的代码块会自动折叠;按 `Ctrl+K` 全部展开
|
|
112
|
+
- **可折叠思考块** —— 思考块在完成后会折叠为一行摘要;按 `Ctrl+O` 展开
|
|
113
|
+
- **流光加载动画** —— 带颜色过渡的 "Thinking" 指示器(30 秒后洋红 → 黄,60 秒后 → 红)
|
|
114
|
+
- **工具调用显示** —— 参数预览、实时流式输出、结果摘要(行数、耗时),按 `Tab` 展开/折叠
|
|
115
|
+
- **权限提示** —— 带边框的提示框,按风险级别着色,醒目的 **Y**es/**N**o/**D**iff 按键,内联 diff 带语法高亮
|
|
116
|
+
- **状态栏** —— 显示模型名称、token 计数、费用、上下文占用条(可通过配置自定义)
|
|
117
|
+
- **上下文告警** —— 上下文窗口超过 75% 时显示黄色警告
|
|
118
|
+
- **原生终端滚动条** —— 已完成的消息进入滚动缓冲区;使用终端自带的滚动条与搜索
|
|
119
|
+
- **多行输入** —— `Alt+Enter` 插入换行;粘贴时自动识别并插入换行
|
|
120
|
+
- **自动补全** —— 斜杠命令与文件路径(带说明);按 Tab 循环切换
|
|
121
|
+
- **文件路径补全** —— Tab 补全路径,并用 `[dir]`/`[file]` 标记类型
|
|
122
|
+
- **会话浏览器** —— 使用 `/browse` 交互式浏览并恢复历史会话
|
|
123
|
+
- **桌面宠物** —— 页脚中的动画电子宠物 Cybergotchi(通过 `/companion off|on` 切换)
|
|
124
|
+
|
|
125
|
+
### 主题
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
oh --light # 适用于明亮终端的浅色主题
|
|
129
|
+
/theme light # 会话中切换(自动保存)
|
|
130
|
+
/theme dark # 切回深色
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
主题偏好会保存到 `.oh/config.yaml`,跨会话持久化。
|
|
134
|
+
|
|
135
|
+
### 自定义状态栏
|
|
136
|
+
|
|
137
|
+
在 `.oh/config.yaml` 中自定义状态栏格式:
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
statusLineFormat: '{model} │ {tokens} │ {cost} │ {ctx}'
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
可用变量:`{model}`、`{tokens}`(输入↑ 输出↓)、`{cost}`($X.XXXX)、`{ctx}`(上下文占用条)。空片段会自动折叠。
|
|
144
|
+
|
|
145
|
+
## 工具(37 个)
|
|
146
|
+
|
|
147
|
+
| 工具 | 风险 | 描述 |
|
|
148
|
+
|------|------|-------------|
|
|
149
|
+
| **核心** | | |
|
|
150
|
+
| Bash | 高 | 执行 shell 命令并实时流式输出(AST 安全分析) |
|
|
151
|
+
| Read | 低 | 按行范围读取文件,支持 PDF |
|
|
152
|
+
| ImageRead | 低 | 读取图片/PDF 以进行多模态分析 |
|
|
153
|
+
| Write | 中 | 创建或覆盖文件 |
|
|
154
|
+
| Edit | 中 | 搜索并替换编辑 |
|
|
155
|
+
| MultiEdit | 中 | 原子化的多文件编辑(全部成功或全部失败) |
|
|
156
|
+
| Glob | 低 | 按 pattern 查找文件 |
|
|
157
|
+
| Grep | 低 | 带上下文行数的正则内容搜索 |
|
|
158
|
+
| LS | 低 | 列出目录内容和大小 |
|
|
159
|
+
| **Web** | | |
|
|
160
|
+
| WebFetch | 中 | 获取 URL 内容(防 SSRF) |
|
|
161
|
+
| WebSearch | 中 | 网络搜索 |
|
|
162
|
+
| RemoteTrigger | 高 | 向 webhook/API 发送 HTTP 请求 |
|
|
163
|
+
| **任务** | | |
|
|
164
|
+
| TaskCreate | 低 | 创建结构化任务 |
|
|
165
|
+
| TaskUpdate | 低 | 更新任务状态 |
|
|
166
|
+
| TaskList | 低 | 列出所有任务 |
|
|
167
|
+
| TaskGet | 低 | 获取任务详情 |
|
|
168
|
+
| TaskStop | 低 | 停止正在运行的任务 |
|
|
169
|
+
| TaskOutput | 低 | 获取任务输出 |
|
|
170
|
+
| **代理** | | |
|
|
171
|
+
| Agent | 中 | 派生一个子代理(可指定角色) |
|
|
172
|
+
| ParallelAgent | 中 | 派发多个代理并支持 DAG 依赖 |
|
|
173
|
+
| SendMessage | 低 | 代理之间的点对点消息 |
|
|
174
|
+
| AskUser | 低 | 向用户提问(带选项) |
|
|
175
|
+
| **调度** | | |
|
|
176
|
+
| CronCreate | 中 | 创建定时任务 |
|
|
177
|
+
| CronDelete | 中 | 删除定时任务 |
|
|
178
|
+
| CronList | 低 | 列出所有定时任务 |
|
|
179
|
+
| **规划** | | |
|
|
180
|
+
| EnterPlanMode | 低 | 进入结构化规划模式 |
|
|
181
|
+
| ExitPlanMode | 低 | 退出规划模式 |
|
|
182
|
+
| **代码智能** | | |
|
|
183
|
+
| Diagnostics | 低 | 基于 LSP 的代码诊断 |
|
|
184
|
+
| NotebookEdit | 中 | 编辑 Jupyter notebook |
|
|
185
|
+
| **记忆与发现** | | |
|
|
186
|
+
| Memory | 低 | 保存/列出/搜索持久化记忆 |
|
|
187
|
+
| Skill | 低 | 调用 .oh/skills/ 下的技能 |
|
|
188
|
+
| ToolSearch | 低 | 按描述查找工具 |
|
|
189
|
+
| **MCP** | | |
|
|
190
|
+
| ListMcpResources | 低 | 列出已连接 MCP 服务器上的资源 |
|
|
191
|
+
| ReadMcpResource | 低 | 按 URI 读取指定的 MCP 资源 |
|
|
192
|
+
| **Git 工作树** | | |
|
|
193
|
+
| EnterWorktree | 中 | 创建隔离的 git worktree |
|
|
194
|
+
| ExitWorktree | 中 | 移除一个 git worktree |
|
|
195
|
+
| **进程** | | |
|
|
196
|
+
| KillProcess | 高 | 按 PID 或名称停止进程 |
|
|
197
|
+
|
|
198
|
+
低风险只读工具会自动批准。在 `ask` 模式下,中高风险工具需要确认。使用 `--trust` 或 `--auto` 可跳过提示。
|
|
199
|
+
|
|
200
|
+
## 斜杠命令(33 个)
|
|
201
|
+
|
|
202
|
+
在对话中输入这些命令。别名:`/q` 退出、`/h` 帮助、`/c` 提交、`/m` 模型、`/s` 状态。
|
|
203
|
+
|
|
204
|
+
**会话:**
|
|
205
|
+
| 命令 | 描述 |
|
|
206
|
+
|---------|-------------|
|
|
207
|
+
| `/clear` | 清空对话历史 |
|
|
208
|
+
| `/compact` | 压缩对话以释放上下文 |
|
|
209
|
+
| `/export` | 将对话导出为 markdown |
|
|
210
|
+
| `/history [n]` | 列出最近的会话;`/history search <term>` 搜索 |
|
|
211
|
+
| `/browse` | 带预览的交互式会话浏览器 |
|
|
212
|
+
| `/resume <id>` | 恢复已保存的会话 |
|
|
213
|
+
| `/fork` | 克隆当前会话 |
|
|
214
|
+
|
|
215
|
+
**Git:**
|
|
216
|
+
| 命令 | 描述 |
|
|
217
|
+
|---------|-------------|
|
|
218
|
+
| `/diff` | 显示未提交的 git 变更 |
|
|
219
|
+
| `/undo` | 撤销最后一次 AI 提交 |
|
|
220
|
+
| `/commit [msg]` | 创建 git 提交 |
|
|
221
|
+
| `/log` | 显示最近的 git 提交 |
|
|
222
|
+
|
|
223
|
+
**信息:**
|
|
224
|
+
| 命令 | 描述 |
|
|
225
|
+
|---------|-------------|
|
|
226
|
+
| `/help` | 显示所有可用命令(按分类) |
|
|
227
|
+
| `/cost` | 显示会话费用与 token 用量 |
|
|
228
|
+
| `/status` | 显示模型、模式、git 分支、MCP 服务器 |
|
|
229
|
+
| `/config` | 显示配置 |
|
|
230
|
+
| `/files` | 列出上下文中的文件 |
|
|
231
|
+
| `/model <name>` | 会话中切换模型 |
|
|
232
|
+
| `/memory` | 查看并搜索记忆 |
|
|
233
|
+
| `/doctor` | 运行诊断健康检查 |
|
|
234
|
+
| `/hooks` | 按事件列出已加载的钩子 |
|
|
235
|
+
|
|
236
|
+
**设置:**
|
|
237
|
+
| 命令 | 描述 |
|
|
238
|
+
|---------|-------------|
|
|
239
|
+
| `/theme dark\|light` | 切换主题(自动保存到配置) |
|
|
240
|
+
| `/vim` | 切换 Vim 模式 |
|
|
241
|
+
| `/companion off\|on` | 切换电子宠物可见性 |
|
|
242
|
+
|
|
243
|
+
**AI:**
|
|
244
|
+
| 命令 | 描述 |
|
|
245
|
+
|---------|-------------|
|
|
246
|
+
| `/plan <task>` | 进入规划模式 |
|
|
247
|
+
| `/review` | 审查最近的代码变更 |
|
|
248
|
+
|
|
249
|
+
**宠物:**
|
|
250
|
+
| 命令 | 描述 |
|
|
251
|
+
|---------|-------------|
|
|
252
|
+
| `/cybergotchi` | 喂食、抚摸、休息、状态、改名或重置电子宠物 |
|
|
253
|
+
|
|
254
|
+
## 权限模式
|
|
255
|
+
|
|
256
|
+
控制 OpenHarness 自动批准工具调用的激进程度:
|
|
257
|
+
|
|
258
|
+
| 模式 | 参数 | 行为 |
|
|
259
|
+
|------|------|----------|
|
|
260
|
+
| `ask` | `--permission-mode ask` | 中/高风险操作会提示(默认) |
|
|
261
|
+
| `trust` | `--trust` | 自动批准一切 |
|
|
262
|
+
| `deny` | `--deny` | 仅允许低风险只读操作 |
|
|
263
|
+
| `acceptEdits` | `--permission-mode acceptEdits` | 自动批准文件编辑,Bash/WebFetch/Agent 仍会询问 |
|
|
264
|
+
| `plan` | `--permission-mode plan` | 只读模式 —— 阻止所有写操作 |
|
|
265
|
+
| `auto` | `--auto` | 自动批准所有操作,阻止危险 bash(经 AST 分析) |
|
|
266
|
+
| `bypassPermissions` | `--permission-mode bypassPermissions` | 无条件批准一切(仅用于 CI) |
|
|
267
|
+
|
|
268
|
+
Bash 命令由一个轻量级 AST 解析器分析,可识别破坏性模式(`rm -rf`、`git push --force`、`curl | bash` 等)并相应调整风险级别。
|
|
269
|
+
|
|
270
|
+
在 `.oh/config.yaml` 中永久设置:`permissionMode: 'acceptEdits'`
|
|
271
|
+
|
|
272
|
+
## 钩子
|
|
273
|
+
|
|
274
|
+
通过在 `.oh/config.yaml` 中添加 `hooks` 块,在关键会话事件触发时自动运行 shell 脚本:
|
|
275
|
+
|
|
276
|
+
```yaml
|
|
277
|
+
hooks:
|
|
278
|
+
- event: sessionStart
|
|
279
|
+
command: "echo 'Session started' >> ~/.oh/session.log"
|
|
280
|
+
|
|
281
|
+
- event: preToolUse
|
|
282
|
+
command: "scripts/check-tool.sh"
|
|
283
|
+
match: Bash # 可选:仅对该工具名触发
|
|
284
|
+
|
|
285
|
+
- event: postToolUse
|
|
286
|
+
command: "scripts/after-tool.sh"
|
|
287
|
+
|
|
288
|
+
- event: sessionEnd
|
|
289
|
+
command: "scripts/cleanup.sh"
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**事件类型:**
|
|
293
|
+
- `sessionStart` —— 会话开始时触发一次
|
|
294
|
+
- `preToolUse` —— 每次工具调用前触发;**退出码 1 会阻止该工具**并向模型返回错误
|
|
295
|
+
- `postToolUse` —— 每次工具调用完成后触发
|
|
296
|
+
- `sessionEnd` —— 会话结束时触发
|
|
297
|
+
|
|
298
|
+
**环境变量**(钩子脚本可用):
|
|
299
|
+
|
|
300
|
+
| 变量 | 描述 |
|
|
301
|
+
|----------|-------------|
|
|
302
|
+
| `OH_EVENT` | 事件类型(`sessionStart`、`preToolUse` 等) |
|
|
303
|
+
| `OH_TOOL_NAME` | 正在调用的工具名(仅工具类事件) |
|
|
304
|
+
| `OH_TOOL_ARGS` | JSON 编码的工具参数(仅工具类事件) |
|
|
305
|
+
| `OH_TOOL_OUTPUT` | JSON 编码的工具输出(仅 `postToolUse`) |
|
|
306
|
+
|
|
307
|
+
使用 `match` 将钩子限定到特定工具名(例如 `match: Bash` 仅对 Bash 工具触发)。
|
|
308
|
+
|
|
309
|
+
完整事件参考(包括新增的 `userPromptSubmit`、`permissionRequest`、`postToolUseFailure` 事件)见 [docs/hooks.md](docs/hooks.md)。
|
|
310
|
+
|
|
311
|
+
## 电子宠物 Cybergotchi
|
|
312
|
+
|
|
313
|
+
OpenHarness 自带一只拓麻歌子(Tamagotchi)风格的电子宠物,住在侧边面板里。它会实时对你的会话做出反应 —— 为连胜欢呼、为工具失败抱怨、被冷落时会饿。
|
|
314
|
+
|
|
315
|
+
**孵化一只:**
|
|
316
|
+
```
|
|
317
|
+
oh init # 安装向导包含电子宠物设置
|
|
318
|
+
/cybergotchi # 或在会话中孵化
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**命令:**
|
|
322
|
+
```
|
|
323
|
+
/cybergotchi feed # 饱食度 +30
|
|
324
|
+
/cybergotchi pet # 快乐值 +20
|
|
325
|
+
/cybergotchi rest # 精力值 +40
|
|
326
|
+
/cybergotchi status # 显示需求与终生统计
|
|
327
|
+
/cybergotchi rename # 起个新名字
|
|
328
|
+
/cybergotchi reset # 换个物种重新开始
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**需求**会随时间衰减(饱食度最快,快乐值最慢)。按时喂食、抚摸你的宠物,让它保持开心。
|
|
332
|
+
|
|
333
|
+
**进化** —— 基于终生里程碑进化:
|
|
334
|
+
- 阶段 1(✦ 洋红):10 次会话或 50 次提交
|
|
335
|
+
- 阶段 2(★ 黄色 + 皇冠):完成 100 个任务,或连续 25 次工具调用无失败
|
|
336
|
+
|
|
337
|
+
**18 个物种**可选:鸭、猫、猫头鹰、企鹅、兔、龟、蜗牛、章鱼、美西螈、仙人掌、蘑菇、胖团子、水豚、鹅等等。
|
|
338
|
+
|
|
339
|
+
## MCP 服务器
|
|
340
|
+
|
|
341
|
+
通过编辑 `.oh/config.yaml` 接入任意 MCP(Model Context Protocol)服务器:
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
provider: anthropic
|
|
345
|
+
model: claude-sonnet-4-6
|
|
346
|
+
permissionMode: ask
|
|
347
|
+
mcpServers:
|
|
348
|
+
- name: filesystem
|
|
349
|
+
command: npx
|
|
350
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
351
|
+
- name: github
|
|
352
|
+
command: npx
|
|
353
|
+
args: ["-y", "@modelcontextprotocol/server-github"]
|
|
354
|
+
env:
|
|
355
|
+
GITHUB_PERSONAL_ACCESS_TOKEN: ghp_...
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
MCP 工具会与内置工具并列出现。`/status` 会显示已连接的服务器。
|
|
359
|
+
|
|
360
|
+
### 远程 MCP 服务器(HTTP / SSE)
|
|
361
|
+
|
|
362
|
+
```yaml
|
|
363
|
+
mcpServers:
|
|
364
|
+
- name: linear
|
|
365
|
+
type: http
|
|
366
|
+
url: https://mcp.linear.app/mcp
|
|
367
|
+
headers:
|
|
368
|
+
Authorization: "Bearer ${LINEAR_API_KEY}"
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
完整参考见 [docs/mcp-servers.md](docs/mcp-servers.md)。
|
|
372
|
+
OAuth 2.1 设置见 [docs/mcp-servers.md](docs/mcp-servers.md#authentication)(收到 401 时自动触发;另有 `/mcp-login` 和 `/mcp-logout` 命令)。
|
|
373
|
+
|
|
374
|
+
**MCP 服务器注册表** —— 从精选目录中浏览并安装:
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
/mcp-registry # 浏览所有可用服务器
|
|
378
|
+
/mcp-registry github # 显示指定服务器的安装配置
|
|
379
|
+
/mcp-registry database # 按分类搜索
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
分类:filesystem、git、database、api、search、productivity、dev-tools、ai。
|
|
383
|
+
|
|
384
|
+
## Git 集成
|
|
385
|
+
|
|
386
|
+
在 git 仓库中,OpenHarness 会自动提交 AI 编辑:
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
oh: Edit src/app.ts # 自动以 "oh:" 前缀提交
|
|
390
|
+
oh: Write tests/app.test.ts
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
- 每次 AI 文件变更都会自动提交
|
|
394
|
+
- `/undo` 会回退最后一次 AI 提交(仅限 OH 提交,不会动你的)
|
|
395
|
+
- `/diff` 显示变更内容
|
|
396
|
+
- 你的未提交文件是安全的 —— 会在 AI 编辑前先单独提交
|
|
397
|
+
|
|
398
|
+
## 检查点与回滚
|
|
399
|
+
|
|
400
|
+
每次文件修改都会在执行前自动打检查点。如果出了问题:
|
|
401
|
+
|
|
402
|
+
```
|
|
403
|
+
/rewind # 从最近一次检查点恢复文件
|
|
404
|
+
/undo # 回退最后一次 AI git 提交
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
检查点保存在 `.oh/checkpoints/` 中,覆盖 FileWrite、FileEdit 以及会修改文件的 Bash 命令。
|
|
408
|
+
|
|
409
|
+
## 校验循环
|
|
410
|
+
|
|
411
|
+
每次文件编辑(Edit、Write、MultiEdit)之后,openHarness 会自动运行语言相关的 lint/类型检查命令,并把结果反馈回代理的上下文。这是影响最大的单一 harness 工程模式 —— 研究表明,自动反馈能带来 2-3 倍的质量提升。
|
|
412
|
+
|
|
413
|
+
**自动检测** —— 如果你的项目有 `tsconfig.json`、`.eslintrc*`、`pyproject.toml`、`go.mod` 或 `Cargo.toml`,校验规则会被自动识别。无需配置。
|
|
414
|
+
|
|
415
|
+
**自定义规则**(在 `.oh/config.yaml` 中):
|
|
416
|
+
|
|
417
|
+
```yaml
|
|
418
|
+
verification:
|
|
419
|
+
enabled: true # 默认:true(自动检测)
|
|
420
|
+
mode: warn # 'warn' 追加到输出;'block' 标记为错误
|
|
421
|
+
rules:
|
|
422
|
+
- extensions: [".ts", ".tsx"]
|
|
423
|
+
lint: "npx tsc --noEmit 2>&1 | head -20"
|
|
424
|
+
timeout: 15000
|
|
425
|
+
- extensions: [".py"]
|
|
426
|
+
lint: "ruff check {file} 2>&1 | head -10"
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
每次编辑后,代理会看到 `[Verification passed]` 或带 linter 输出的 `[Verification FAILED]`,从而自我修正。
|
|
430
|
+
|
|
431
|
+
## 记忆整理
|
|
432
|
+
|
|
433
|
+
会话退出时,openHarness 会按时间衰减自动剔除过期记忆:
|
|
434
|
+
|
|
435
|
+
- 30 天以上未访问的记忆,每 30 天衰减 0.1 相关度
|
|
436
|
+
- 相关度低于 0.1 的记忆会被永久删除
|
|
437
|
+
- 更新后的相关度分数会写回记忆文件
|
|
438
|
+
|
|
439
|
+
这能让记忆系统保持精简且相关。在 `.oh/config.yaml` 中配置:
|
|
440
|
+
|
|
441
|
+
```yaml
|
|
442
|
+
memory:
|
|
443
|
+
consolidateOnExit: true # 默认:true
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## 定时任务(Cron)
|
|
447
|
+
|
|
448
|
+
创建会在后台自动运行的定时任务:
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
# 通过斜杠命令
|
|
452
|
+
/cron list # 显示所有定时任务
|
|
453
|
+
/cron create "check-tests" # 新建任务(交互式)
|
|
454
|
+
/cron delete <id> # 删除任务
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**调度语法:** `every 5m`、`every 2h`、`every 1d`
|
|
458
|
+
|
|
459
|
+
Cron 执行器每 60 秒检查一次到期任务,并通过子查询运行。结果保存到 `~/.oh/crons/history/`。
|
|
460
|
+
|
|
461
|
+
## 代理角色
|
|
462
|
+
|
|
463
|
+
派发专职子代理来处理特定任务:
|
|
464
|
+
|
|
465
|
+
```
|
|
466
|
+
/roles # 列出所有可用角色
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
| 角色 | 描述 | 工具 |
|
|
470
|
+
|------|-------------|-------|
|
|
471
|
+
| `code-reviewer` | 找出 bug、安全问题、风格问题 | 只读 |
|
|
472
|
+
| `test-writer` | 生成单元测试和集成测试 | 读 + 写 |
|
|
473
|
+
| `docs-writer` | 撰写文档与注释 | 读 + 写 + 编辑 |
|
|
474
|
+
| `debugger` | 系统化排查 bug | 只读 + Bash |
|
|
475
|
+
| `refactorer` | 在不改变行为的前提下简化代码 | 全部文件工具 + Bash |
|
|
476
|
+
| `security-auditor` | OWASP、注入、密钥、CVE 扫描 | 只读 + Bash |
|
|
477
|
+
| `evaluator` | 评估代码质量并运行测试(只读) | 只读 + Bash + Diagnostics |
|
|
478
|
+
| `planner` | 设计分步实现计划 | 只读 + Bash |
|
|
479
|
+
| `architect` | 分析架构、设计结构性变更 | 只读 |
|
|
480
|
+
| `migrator` | 系统化的代码库迁移与升级 | 全部文件工具 + Bash |
|
|
481
|
+
|
|
482
|
+
每个角色只会让子代理使用其推荐的工具。你也可以显式传入 `allowed_tools`:
|
|
483
|
+
|
|
484
|
+
```
|
|
485
|
+
Agent({ subagent_type: 'evaluator', prompt: 'Run all tests and report results' })
|
|
486
|
+
Agent({ allowed_tools: ['Read', 'Grep'], prompt: 'Search for all TODO comments' })
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## 无头模式
|
|
490
|
+
|
|
491
|
+
跑一次提示词,不走交互 UI —— 适合 CI/CD 和脚本化:
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
# 推荐:chat 命令加 -p 参数
|
|
495
|
+
oh -p "fix the failing tests" --model ollama/llama3 --trust
|
|
496
|
+
oh -p "review src/query.ts" --auto --output-format json
|
|
497
|
+
|
|
498
|
+
# 替代:run 命令
|
|
499
|
+
oh run "fix the failing tests" --model ollama/llama3 --trust
|
|
500
|
+
oh run "add error handling to api.ts" --json # JSON 输出
|
|
501
|
+
|
|
502
|
+
# 通过 stdin 输入
|
|
503
|
+
cat error.log | oh run "what's wrong here?"
|
|
504
|
+
git diff | oh run "review these changes"
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### 使用 `--json-schema` 约束结构化输出
|
|
508
|
+
|
|
509
|
+
按 JSON Schema 约束模型输出。适用于需要以编程方式解析模型输出、避免正则启发式的 CI 脚本:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
oh -p "output {\"ok\": true, \"count\": 3} as JSON" \
|
|
513
|
+
--trust \
|
|
514
|
+
--json-schema '{"type":"object","properties":{"ok":{"type":"boolean"},"count":{"type":"integer"}},"required":["ok","count"]}'
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
行为:
|
|
518
|
+
- stdout:校验通过时输出单行的 JSON。
|
|
519
|
+
- stderr:失败时输出结构化错误,并附带原始模型输出以便调试。
|
|
520
|
+
- 退出码:**0** 校验通过,**2** schema 本身不合法,**3** 模型输出不是合法 JSON,**4** JSON 不匹配 schema。
|
|
521
|
+
|
|
522
|
+
支持的关键字:`type`、`properties`、`required`、`items`、`enum`。如需更完整的校验,请通过管道交给专用校验器。
|
|
523
|
+
|
|
524
|
+
### 用于 PR 审查的 GitHub Action
|
|
525
|
+
|
|
526
|
+
OpenHarness 自带用于自动代码审查的 GitHub Action:
|
|
527
|
+
|
|
528
|
+
```yaml
|
|
529
|
+
# .github/workflows/ai-review.yml
|
|
530
|
+
on:
|
|
531
|
+
pull_request:
|
|
532
|
+
types: [opened, synchronize]
|
|
533
|
+
|
|
534
|
+
jobs:
|
|
535
|
+
review:
|
|
536
|
+
runs-on: ubuntu-latest
|
|
537
|
+
steps:
|
|
538
|
+
- uses: actions/checkout@v4
|
|
539
|
+
with:
|
|
540
|
+
fetch-depth: 0
|
|
541
|
+
- uses: ./.github/actions/review
|
|
542
|
+
with:
|
|
543
|
+
model: 'claude-sonnet-4-6'
|
|
544
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
成功退出码 0,失败 1。
|
|
548
|
+
|
|
549
|
+
## 模型提供商
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
# 本地(免费,无需 API key)
|
|
553
|
+
oh --model ollama/llama3
|
|
554
|
+
oh --model ollama/qwen2.5:7b
|
|
555
|
+
|
|
556
|
+
# 云端
|
|
557
|
+
OPENAI_API_KEY=sk-... oh --model gpt-4o
|
|
558
|
+
ANTHROPIC_API_KEY=sk-ant-... oh --model claude-sonnet-4-6
|
|
559
|
+
OPENROUTER_API_KEY=sk-or-... oh --model openrouter/meta-llama/llama-3-70b
|
|
560
|
+
|
|
561
|
+
# llama.cpp / GGUF
|
|
562
|
+
oh --model llamacpp/my-model
|
|
563
|
+
|
|
564
|
+
# LM Studio
|
|
565
|
+
oh --model lmstudio/my-model
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### llama.cpp / GGUF(本地,无需 Ollama)
|
|
569
|
+
|
|
570
|
+
通过 `llama-server` 直接支持 GGUF,避免 Ollama 的额外开销。对大模型通常更快。
|
|
571
|
+
|
|
572
|
+
**前置条件:**
|
|
573
|
+
- 安装 llama.cpp:`brew install llama.cpp`,或从 [github.com/ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp) 下载
|
|
574
|
+
- 下载一个 GGUF 模型(例如从 [HuggingFace](https://huggingface.co))
|
|
575
|
+
|
|
576
|
+
**启动 llama-server:**
|
|
577
|
+
```bash
|
|
578
|
+
llama-server --model ./your-model.gguf --port 8080 --alias my-model
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
**通过 `oh init` 配置:**
|
|
582
|
+
- 运行 `oh init`,在提示时选择 "llama.cpp / GGUF"
|
|
583
|
+
|
|
584
|
+
**或手动配置** `.oh/config.yaml`:
|
|
585
|
+
```yaml
|
|
586
|
+
provider: llamacpp
|
|
587
|
+
model: my-model
|
|
588
|
+
baseUrl: http://localhost:8080
|
|
589
|
+
permissionMode: ask
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
**运行:**
|
|
593
|
+
```bash
|
|
594
|
+
oh
|
|
595
|
+
oh --model llamacpp/my-model
|
|
596
|
+
oh models # 列出可用模型
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## 配置层级
|
|
600
|
+
|
|
601
|
+
配置按层加载(后者覆盖前者):
|
|
602
|
+
|
|
603
|
+
1. **全局** `~/.oh/config.yaml` —— 所有项目共用的默认提供商、模型、主题
|
|
604
|
+
2. **项目** `.oh/config.yaml` —— 项目级设置
|
|
605
|
+
3. **本地** `.oh/config.local.yaml` —— 个人覆盖(已 gitignore)
|
|
606
|
+
|
|
607
|
+
全局设置一次默认提供商:
|
|
608
|
+
|
|
609
|
+
```yaml
|
|
610
|
+
# ~/.oh/config.yaml
|
|
611
|
+
provider: ollama
|
|
612
|
+
model: llama3
|
|
613
|
+
permissionMode: ask
|
|
614
|
+
theme: dark
|
|
615
|
+
language: zh-CN # 可选 —— 模型会用该语言回复(代码、命令、路径保持原样)
|
|
616
|
+
outputStyle: default # 可选 —— "default"、"explanatory"、"learning" 或自定义名
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
之后项目配置只需写不同之处:
|
|
620
|
+
|
|
621
|
+
```yaml
|
|
622
|
+
# .oh/config.yaml
|
|
623
|
+
model: codellama # 仅覆盖模型
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
### 输出风格(Output Styles)
|
|
627
|
+
|
|
628
|
+
在不修改核心指令的前提下切换代理的"性格"。内置风格:
|
|
629
|
+
|
|
630
|
+
- **`default`** —— 标准的软件工程助手(无前置)
|
|
631
|
+
- **`explanatory`** —— 每完成一个任务后追加 `## Insights` 小节,解释 *为什么* 做出这样的选择
|
|
632
|
+
- **`learning`** —— 在关键位置留 1–3 个 `TODO(human)` 标记,把最有学习价值的那部分代码留给你自己写
|
|
633
|
+
|
|
634
|
+
自定义风格是带 YAML frontmatter 的 markdown 文件。保存到 `.oh/output-styles/<name>.md`(项目级)或 `~/.oh/output-styles/<name>.md`(用户级)。项目级 > 用户级 > 内置。
|
|
635
|
+
|
|
636
|
+
````markdown
|
|
637
|
+
---
|
|
638
|
+
name: code-review
|
|
639
|
+
description: 专注的代码审查模式
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
严格审查。对每个函数追问:逻辑是否正确?错误处理是否完整?有没有遗漏的边界情况?
|
|
643
|
+
````
|
|
644
|
+
|
|
645
|
+
在 `.oh/config.yaml` 中通过 `outputStyle: code-review` 激活。
|
|
646
|
+
|
|
647
|
+
## 项目规则
|
|
648
|
+
|
|
649
|
+
在任意仓库中创建 `.oh/RULES.md`(或运行 `oh init`):
|
|
650
|
+
|
|
651
|
+
```markdown
|
|
652
|
+
- Always run tests after changes
|
|
653
|
+
- Use strict TypeScript
|
|
654
|
+
- Never commit to main directly
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
规则会自动加载到每次会话中。
|
|
658
|
+
|
|
659
|
+
## 技能与插件
|
|
660
|
+
|
|
661
|
+
### 技能
|
|
662
|
+
|
|
663
|
+
技能是带 YAML frontmatter 的 markdown 文件,用于添加可复用行为:
|
|
664
|
+
|
|
665
|
+
```markdown
|
|
666
|
+
---
|
|
667
|
+
name: deploy
|
|
668
|
+
description: Deploy the application to production
|
|
669
|
+
trigger: deploy
|
|
670
|
+
tools: [Bash, Read]
|
|
671
|
+
---
|
|
672
|
+
|
|
673
|
+
Run the deploy script with health checks...
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
**查找位置**(按顺序):
|
|
677
|
+
1. `.oh/skills/` —— 项目级技能
|
|
678
|
+
2. `~/.oh/skills/` —— 全局技能(在所有项目中可用)
|
|
679
|
+
|
|
680
|
+
当用户消息中包含 trigger 关键字时,技能会自动触发;也可以用 `/skill deploy` 显式调用。
|
|
681
|
+
|
|
682
|
+
### 插件
|
|
683
|
+
|
|
684
|
+
插件是打包了技能、钩子和 MCP 服务器的 npm 包:
|
|
685
|
+
|
|
686
|
+
```json
|
|
687
|
+
{
|
|
688
|
+
"name": "my-openharness-plugin",
|
|
689
|
+
"version": "1.0.0",
|
|
690
|
+
"skills": ["skills/deploy.md", "skills/review.md"],
|
|
691
|
+
"hooks": {
|
|
692
|
+
"sessionStart": "scripts/setup.sh"
|
|
693
|
+
},
|
|
694
|
+
"mcpServers": [
|
|
695
|
+
{ "name": "my-api", "command": "npx", "args": ["-y", "@my-org/mcp-server"] }
|
|
696
|
+
]
|
|
697
|
+
}
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
把它命名为 `openharness-plugin.json` 放在 npm 包根目录。安装时 `npm install`,openHarness 会自动从 `node_modules/` 中发现它。
|
|
701
|
+
|
|
702
|
+
## 工作原理
|
|
703
|
+
|
|
704
|
+
```mermaid
|
|
705
|
+
graph LR
|
|
706
|
+
User[用户输入] --> REPL[REPL 循环]
|
|
707
|
+
REPL --> Query[查询引擎]
|
|
708
|
+
Query --> Provider[LLM 提供商]
|
|
709
|
+
Provider --> LLM[Ollama / OpenAI / Anthropic]
|
|
710
|
+
LLM --> Tools[工具执行]
|
|
711
|
+
Tools --> Permissions{权限检查}
|
|
712
|
+
Permissions -->|批准| Execute[运行工具]
|
|
713
|
+
Permissions -->|拒绝| Deny[拒绝并上报]
|
|
714
|
+
Execute --> Response[流式响应]
|
|
715
|
+
Response --> REPL
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
## 常见问题
|
|
719
|
+
|
|
720
|
+
**可以离线使用吗?**
|
|
721
|
+
可以。用 Ollama 加一个本地模型 —— 不需要网络,也不需要 API key。
|
|
722
|
+
|
|
723
|
+
**要多少钱?**
|
|
724
|
+
免费。OpenHarness 使用 MIT 协议。云端模型自带 API key(BYOK),或者用 Ollama 完全免费。
|
|
725
|
+
|
|
726
|
+
**安全吗?**
|
|
727
|
+
安全。7 种权限模式控制工具能做什么。Bash 命令由 AST 解析器分析,阻止破坏性模式(`rm -rf`、`curl | bash` 等)。每次文件变更都会打检查点,可通过 `/rewind` 回滚。
|
|
728
|
+
|
|
729
|
+
**可以在 CI/CD 中使用吗?**
|
|
730
|
+
可以。用 `oh -p "prompt" --auto` 跑无头模式,或用自带的 GitHub Action 做 PR 审查。
|
|
731
|
+
|
|
732
|
+
**支持我的语言/框架吗?**
|
|
733
|
+
支持。OpenHarness 与语言无关 —— 它能读写并执行任意语言的代码。语法高亮覆盖 20+ 种语言。
|
|
734
|
+
|
|
735
|
+
**与 Claude Code 相比如何?**
|
|
736
|
+
CLI 使用场景下约 95% 功能对等。主要优势:兼容任意 LLM(不止 Anthropic),且采用 MIT 协议。见上文 [为什么选择 OpenHarness?](#为什么选择-openharness)。
|
|
737
|
+
|
|
738
|
+
## 安装
|
|
739
|
+
|
|
740
|
+
需要 **Node.js 18+**。
|
|
741
|
+
|
|
742
|
+
```bash
|
|
743
|
+
# 从 npm 安装
|
|
744
|
+
npm install -g @zhijiewang/openharness
|
|
745
|
+
|
|
746
|
+
# 从源码安装
|
|
747
|
+
git clone https://github.com/zhijiewong/openharness.git
|
|
748
|
+
cd openharness
|
|
749
|
+
npm install && npm install -g .
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
## 开发
|
|
753
|
+
|
|
754
|
+
```bash
|
|
755
|
+
npm install
|
|
756
|
+
npx tsx src/main.tsx # 以开发模式运行
|
|
757
|
+
npx tsc --noEmit # 类型检查
|
|
758
|
+
npm test # 运行测试
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
### 添加工具
|
|
762
|
+
|
|
763
|
+
在 `src/tools/YourTool/index.ts` 中实现 `Tool` 接口(配合 Zod 输入 schema),然后在 `src/tools.ts` 中注册。
|
|
764
|
+
|
|
765
|
+
### 添加模型提供商
|
|
766
|
+
|
|
767
|
+
在 `src/providers/yourprovider.ts` 中实现 `Provider` 接口,然后在 `src/providers/index.ts` 中添加一个 case。
|
|
768
|
+
|
|
769
|
+
## 贡献
|
|
770
|
+
|
|
771
|
+
见 [CONTRIBUTING.md](CONTRIBUTING.md)。
|
|
772
|
+
|
|
773
|
+
## 社区
|
|
774
|
+
|
|
775
|
+
加入 OpenHarness 社区,一起获取帮助、分享工作流、讨论 AI 编程助手的未来!
|
|
776
|
+
|
|
777
|
+
| 平台 | 详情与链接 |
|
|
778
|
+
| :--- | :--- |
|
|
779
|
+
| 🟣 **Discord** | [**加入我们的 Discord**](https://discord.gg/ezVrqy3qu),和开发者实时交流、获取支持。 |
|
|
780
|
+
| 🔵 **飞书 / Lark** | 扫描下方二维码加入社区协作群:<br><br><img src="https://github.com/user-attachments/assets/54ade077-22ad-45d2-b38a-623464677d53" width="160" alt="飞书群二维码"> |
|
|
781
|
+
| 🟢 **微信** | 扫描下方二维码加入微信群:<br><br><img src="https://github.com/user-attachments/assets/adcf291a-9ffe-4738-8608-f46a21e18db0" width="160" alt="微信群二维码"> |
|
|
782
|
+
|
|
783
|
+
## 许可证
|
|
784
|
+
|
|
785
|
+
MIT
|