惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
博客园 - 司徒正美
雷峰网
雷峰网
L
LINUX DO - 最新话题
博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
V2EX - 技术
V2EX - 技术
S
Security Affairs
有赞技术团队
有赞技术团队
月光博客
月光博客
T
Threatpost
T
Tor Project blog
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
V2EX
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
博客园 - 三生石上(FineUI控件)
D
Docker
AWS News Blog
AWS News Blog
AI
AI
P
Proofpoint News Feed
K
Kaspersky official blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Securelist
F
Fortinet All Blogs
F
Full Disclosure
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Palo Alto Networks Blog
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
美团技术团队
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
07-核心工具链
我才是银古 · 2026-05-04 · via 博客园 - 我才是银古

第七章:核心工具链 Hashline、LSP、AST-Grep 与 Tmux

oh-my-openagent(OmO)配给 Agent 的不是简单的"读 / 写 / sed"三件套,而是一整套IDE 级别的工具链。理解这些工具是怎么工作的,你才能明白为什么 OmO 改代码"能不出错"——以及为什么有些第三方 Agent 工具改完动不动就需要你回滚。

本章涵盖 4 大核心工具体系:

  1. Hashline 编辑——LINE#ID 哈希校验编辑;
  2. LSP 工具集——把 IDE 的语义能力交给 Agent;
  3. AST-Grep 工具——基于语法树的安全搜替;
  4. Tmux 交互式终端——长时存活的终端环境,跑 REPL / TUI / 调试器。

外加 OmO 的 26 个工具速查表。


7.1 Hashline 编辑:消灭"改错行"

7.1.1 Harness 问题

研究者 Can Bölük 在 oh-my-pi / The Harness Problem 中指出:

几乎所有 Edit 工具都没办法给模型一个稳定、可验证的行定位标识……它们都依赖模型一字不差复述刚看到的原文。模型只要写错(这非常常见),用户就会怪罪大模型太蠢。

OpenAI 的 IDE Edit / Anthropic 的 IDE Edit 都有这个问题。模型记住的"原始行"其实并不一定和当前行一致——文件被另一个 Agent 修过、被 Lint 处理过、行号变了……结果就是 patch 打到了错的位置。

7.1.2 Hashline 怎么解决

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!';" }]
})

校验流程:

  1. 编辑工具收到 22#XJ
  2. 重新计算第 22 行内容的哈希;
  3. 哈希一致 → 应用;不一致 → 拒绝编辑,返回错误,让模型重读、再编辑。

效果:在 Grok Code Fast 1 上,仅这一改进就把编辑成功率从 6.7% 飙到 68.3%。

7.1.3 配套 Hook

  • hashline-read-enhancer:PostToolUse 钩子,在 read 工具回应里追加 LINE#ID 标记,让模型看到的就是带哈希的视图;
  • hashline-edit-diff-enhancer:PreToolUse + PostToolUse,把编辑前后视图加上 diff 标记,便于模型自检和我们调试;
  • edit-error-recovery:当编辑因哈希不一致失败时,PostToolUse 自动注入"请重读再改"的引导。

7.2 LSP 工具集:把 IDE 交给 Agent

7.2.1 6 个 LSP 工具

工具 描述
lsp_diagnostics 取错误 / 警告(构建前预检)
lsp_prepare_rename 校验某个符号是否可重命名
lsp_rename 在工作区范围内安全重命名符号
lsp_goto_definition 跳到定义
lsp_find_references 找所有引用
lsp_symbols 文件大纲 / 工作区符号搜索

7.2.2 实战用法

# 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 引用一次性替换

为什么这套很重要:

  • Agent 不再瞎搜瞎改:用 grep 找 logger 会误命中字符串、注释、文档;用 LSP 走的是 AST 级符号引用,精度近 100%
  • Sisyphus-Junior 必须 lsp_diagnostics 通过才算完成:被 Hook 强制要求;
  • 配合 Hashline:先用 LSP 找位置,再用 Hashline 改,几乎不出错。

7.3 AST-Grep:语法树级别的搜替

7.3.1 两个工具

工具 描述
ast_grep_search 基于 AST 的代码模式搜索(25 种语言)
ast_grep_replace 基于 AST 的代码替换

7.3.2 与 grep / sed 的差异

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)

7.3.3 在 OmO 里的角色

  • 大规模重构("把所有 console.log 替换成 logger.debug");
  • 模式迁移("把所有 Class extends React.Component 迁到 functional");
  • 跨文件批量整理;
  • 与 Skill 配合(git-master 用它做精确的重构提交切片)。

7.4 Tmux 交互式终端

7.4.1 interactive_bash 工具

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 前缀;
  • 适合 vim / htop / pudb / GDB / mysql shell / Python REPL 这种 TUI 应用;
  • 一次性命令该用普通 bash 加 & 后台跑。

7.4.2 多 Agent Tmux 集成

如果你打开 tmux.enabled = true,OmO 的后台 Agent 会真的开新 tmux pane 在你眼前跑:

{
  "tmux": {
    "enabled": true,
    "layout": "main-vertical"
  }
}

效果:

  • 后台 Agent 在新 pane 出现;
  • 实时观察各 Agent 输出;
  • 完成后自动清理;
  • 稳定的 Agent 顺序:Sisyphus(1)、Hephaestus(2)、Prometheus(3)、Atlas(4) 是固定序号,剩下按字母序——避免无意义的顺序漂移。

7.5 OmO 工具地图:26 个工具

按用途归组:

7.5.1 代码搜索

工具 描述
grep 内容搜索(正则)
glob 文件名模式匹配

7.5.2 编辑

工具 描述
edit Hashline LINE#ID 哈希校验编辑

7.5.3 LSP(IDE 能力)

工具 描述
lsp_diagnostics 错误 / 警告
lsp_prepare_rename 重命名校验
lsp_rename 重命名
lsp_goto_definition 跳定义
lsp_find_references 找引用
lsp_symbols 文件大纲 / 工作区符号

7.5.4 AST-Grep

工具 描述
ast_grep_search AST 模式搜索
ast_grep_replace AST 替换

7.5.5 委派

工具 描述
call_omo_agent 调用 explore / librarian / oracle / multimodal-looker,支持 run_in_background
task 按 Category 委派 / 直接 subagent_type 委派
background_output 取后台任务结果
background_cancel 取消后台任务

7.5.6 视觉

工具 描述
look_at 通过 Multimodal-Looker 分析 PDF / 图片 / 图表

7.5.7 Skill

工具 描述
skill 按名加载 Skill / 执行斜杠命令,注入上下文化指令
skill_mcp 调用 Skill 内嵌 MCP 操作

7.5.8 会话

工具 描述
session_list 列所有 OpenCode 会话
session_read 读会话消息 / 历史
session_search 全文搜索
session_info 会话元数据 + 统计

7.5.9 任务系统(experimental.task_system: true)

工具 描述
task_create 创建任务(自动生成 ID)
task_get 取任务
task_list 列所有活跃任务
task_update 更新任务

任务对象有 subject / status / blocks / blockedBy / owner / metadata / threadID 等字段。空 blockedBy 的任务并行执行;有依赖关系的任务自动等待 blockers 完成。

存储在 .sisyphus/tasks/ 目录,重启不丢——这是它和 TodoWrite 的主要区别(TodoWrite 是会话内存,关掉就没)。

7.5.10 交互式终端

工具 描述
interactive_bash tmux 封装,TUI / 持久会话

7.6 工具与 Hook 的协同

工具不是孤立工作的,OmO 给每个工具都配了 Pre/Post Hook 加固:

工具类 关键 Hook
edit / write write-existing-file-guard(防覆盖)、hashline-edit-diff-enhanceredit-error-recoverycomment-checker
read directory-agents-injectordirectory-readme-injectorrules-injectorhashline-read-enhancer
grep / glob / lsp / ast-grep tool-output-truncator(动态根据上下文窗口截断)
task / call_omo_agent delegate-task-retryempty-task-response-detectortask-resume-infocategory-skill-reminder
interactive_bash interactive-bash-session(管理 tmux 会话)

7.7 一个真实的"工具链协同"场景

任务:"给 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 系统。这是把上面所有看似零散的工具粘合成一个稳健流水线的关键。