























oh-my-openagent(OmO)配给 Agent 的不是简单的"读 / 写 / sed"三件套,而是一整套IDE 级别的工具链。理解这些工具是怎么工作的,你才能明白为什么 OmO 改代码"能不出错"——以及为什么有些第三方 Agent 工具改完动不动就需要你回滚。
本章涵盖 4 大核心工具体系:
外加 OmO 的 26 个工具速查表。
研究者 Can Bölük 在 oh-my-pi / The Harness Problem 中指出:
几乎所有 Edit 工具都没办法给模型一个稳定、可验证的行定位标识……它们都依赖模型一字不差复述刚看到的原文。模型只要写错(这非常常见),用户就会怪罪大模型太蠢。
OpenAI 的 IDE Edit / Anthropic 的 IDE Edit 都有这个问题。模型记住的"原始行"其实并不一定和当前行一致——文件被另一个 Agent 修过、被 Lint 处理过、行号变了……结果就是 patch 打到了错的位置。
OmO 借鉴了 Hashline 技术:每行代码读出来时尾部都打上一个绑定内容的哈希码,形如:
11#VK| function hello() {
22#XJ| return "world";
33#MB| }
格式:<行号><两个字符的 hash>| <内容>。
模型修改时必须引用 LINE#ID:
edit({
path: "src/foo.ts",
edits: [{ line: "22#XJ", new: " return 'world!';" }]
})
校验流程:
22#XJ;效果:在 Grok Code Fast 1 上,仅这一改进就把编辑成功率从 6.7% 飙到 68.3%。
hashline-read-enhancer:PostToolUse 钩子,在 read 工具回应里追加 LINE#ID 标记,让模型看到的就是带哈希的视图;hashline-edit-diff-enhancer:PreToolUse + PostToolUse,把编辑前后视图加上 diff 标记,便于模型自检和我们调试;edit-error-recovery:当编辑因哈希不一致失败时,PostToolUse 自动注入"请重读再改"的引导。| 工具 | 描述 |
|---|---|
| lsp_diagnostics | 取错误 / 警告(构建前预检) |
| lsp_prepare_rename | 校验某个符号是否可重命名 |
| lsp_rename | 在工作区范围内安全重命名符号 |
| lsp_goto_definition | 跳到定义 |
| lsp_find_references | 找所有引用 |
| lsp_symbols | 文件大纲 / 工作区符号搜索 |
# Agent 在改完代码后必须做的最后一步:
lsp_diagnostics(path="src/auth.ts")
# 0 errors, 0 warnings → ok
# Agent 想重命名 logger 为 log:
lsp_prepare_rename(path="src/log.ts", line=12, character=10)
# valid → 然后:
lsp_rename(symbol="logger", newName="log")
# 工作区所有 logger 引用一次性替换
为什么这套很重要:
| 工具 | 描述 |
|---|---|
| ast_grep_search | 基于 AST 的代码模式搜索(25 种语言) |
| ast_grep_replace | 基于 AST 的代码替换 |
grep "console.log" # 命中字符串里的 "console.log"、注释里的 console.log、变量名 console_log_x
ast_grep "console.log($A)" # 只匹配实际的函数调用 console.log(...)
sed -i 's/foo/bar/g' file.ts # 字符串替换,会乱伤
ast_grep replace 'foo($A)' 'bar($A)' --lang ts # 只换函数调用 foo(x) → bar(x)
console.log 替换成 logger.debug");Class extends React.Component 迁到 functional");OmO 提供 interactive_bash 工具,本质是封装了 tmux 子命令——使 Agent 能跑长时存活的交互式进程:
# 创建新会话
interactive_bash(tmux_command="new-session -d -s dev-app")
# 给会话发按键
interactive_bash(tmux_command="send-keys -t dev-app 'vim main.py' Enter")
# 抓取屏幕输出
interactive_bash(tmux_command="capture-pane -p -t dev-app")
注意:
tmux 前缀;& 后台跑。如果你打开 tmux.enabled = true,OmO 的后台 Agent 会真的开新 tmux pane 在你眼前跑:
{
"tmux": {
"enabled": true,
"layout": "main-vertical"
}
}
效果:
按用途归组:
| 工具 | 描述 |
|---|---|
| grep | 内容搜索(正则) |
| glob | 文件名模式匹配 |
| 工具 | 描述 |
|---|---|
| edit | Hashline LINE#ID 哈希校验编辑 |
| 工具 | 描述 |
|---|---|
| lsp_diagnostics | 错误 / 警告 |
| lsp_prepare_rename | 重命名校验 |
| lsp_rename | 重命名 |
| lsp_goto_definition | 跳定义 |
| lsp_find_references | 找引用 |
| lsp_symbols | 文件大纲 / 工作区符号 |
| 工具 | 描述 |
|---|---|
| ast_grep_search | AST 模式搜索 |
| ast_grep_replace | AST 替换 |
| 工具 | 描述 |
|---|---|
| call_omo_agent | 调用 explore / librarian / oracle / multimodal-looker,支持 run_in_background |
| task | 按 Category 委派 / 直接 subagent_type 委派 |
| background_output | 取后台任务结果 |
| background_cancel | 取消后台任务 |
| 工具 | 描述 |
|---|---|
| look_at | 通过 Multimodal-Looker 分析 PDF / 图片 / 图表 |
| 工具 | 描述 |
|---|---|
| skill | 按名加载 Skill / 执行斜杠命令,注入上下文化指令 |
| skill_mcp | 调用 Skill 内嵌 MCP 操作 |
| 工具 | 描述 |
|---|---|
| session_list | 列所有 OpenCode 会话 |
| session_read | 读会话消息 / 历史 |
| session_search | 全文搜索 |
| session_info | 会话元数据 + 统计 |
| 工具 | 描述 |
|---|---|
| task_create | 创建任务(自动生成 ID) |
| task_get | 取任务 |
| task_list | 列所有活跃任务 |
| task_update | 更新任务 |
任务对象有 subject / status / blocks / blockedBy / owner / metadata / threadID 等字段。空 blockedBy 的任务并行执行;有依赖关系的任务自动等待 blockers 完成。
存储在 .sisyphus/tasks/ 目录,重启不丢——这是它和 TodoWrite 的主要区别(TodoWrite 是会话内存,关掉就没)。
| 工具 | 描述 |
|---|---|
| interactive_bash | tmux 封装,TUI / 持久会话 |
工具不是孤立工作的,OmO 给每个工具都配了 Pre/Post Hook 加固:
| 工具类 | 关键 Hook |
|---|---|
| edit / write | write-existing-file-guard(防覆盖)、hashline-edit-diff-enhancer、edit-error-recovery、comment-checker |
| read | directory-agents-injector、directory-readme-injector、rules-injector、hashline-read-enhancer |
| grep / glob / lsp / ast-grep | tool-output-truncator(动态根据上下文窗口截断) |
| task / call_omo_agent | delegate-task-retry、empty-task-response-detector、task-resume-info、category-skill-reminder |
| interactive_bash | interactive-bash-session(管理 tmux 会话) |
任务:"给 src/auth.ts 添加 OAuth Refresh 逻辑,然后切原子提交"。
Sisyphus
├─ call_omo_agent(librarian, run_in_background=true)
│ → 查 OAuth 2.1 的 refresh_token 标准
├─ call_omo_agent(explore, run_in_background=true)
│ → grep 现有 fetchAccessToken 模式
├─ task(category="deep", prompt="实现 refreshToken / 测试 / 集成", load_skills=[])
│ ↓
│ Sisyphus-Junior
│ ├─ read src/auth.ts → 看到带 LINE#ID 的视图(hashline-read-enhancer)
│ ├─ lsp_symbols → 文件大纲
│ ├─ lsp_find_references("fetchAccessToken")
│ ├─ edit (Hashline) → 改 src/auth.ts
│ ├─ write src/auth.refresh.test.ts
│ ├─ lsp_diagnostics(path) → 0 errors
│ ├─ bash "npm test" → 通过
│ └─ comment-checker 提示删了 3 条冗余 AI 注释
└─ skill("git-master") → 把改动切成 2 个原子提交
整个过程:Hashline 保证编辑不写错行;LSP 保证语义正确;AST-Grep 在大规模重构时上场;Tmux 在你想要看 vim / 调试器时给 Agent 长存的终端;Hooks 全程偷偷把质量警卫加上。
下一章我们要讲 OmO 的"操作系统":Hooks 与 MCP 系统。这是把上面所有看似零散的工具粘合成一个稳健流水线的关键。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。