patchloom/patchloom

GitHub: patchloom/patchloom

Patchloom 是一个单二进制 CLI 工具,为 AI 编程代理提供安全、结构化且跨平台的文件编辑能力,支持批量操作与原子回滚。

Stars: 4 | Forks: 1

Patchloom logo

# Patchloom [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/24b89844d7134709.svg)](https://github.com/patchloom/patchloom/actions/workflows/ci.yml) [![Security](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/eb37cccbf4134710.svg)](https://github.com/patchloom/patchloom/actions/workflows/security.yml) [![crates.io](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SebTardif/6a26adf6bfae45f530465f626c9154f4/raw/crate-version.json&logo=rust)](https://crates.io/crates/patchloom) [![Release](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SebTardif/6a26adf6bfae45f530465f626c9154f4/raw/release.json&logo=github)](https://github.com/patchloom/patchloom/releases/latest) [![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue)](./LICENSE) [![Tests](https://img.shields.io/badge/tests-1500%2B%20passing-brightgreen)](#) [![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SebTardif/6a26adf6bfae45f530465f626c9154f4/raw/coverage.json)](https://github.com/patchloom/patchloom/actions/workflows/ci.yml) [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13097/badge)](https://www.bestpractices.dev/projects/13097) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/patchloom/patchloom/badge)](https://securityscorecards.dev/viewer/?uri=github.com/patchloom/patchloom) [![FOSSA Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1cad1ccbf1134711.svg)](https://github.com/patchloom/patchloom/actions/workflows/fossa.yml) [![Docs](https://img.shields.io/badge/docs-patchloom.github.io-blue?logo=mdbook)](https://patchloom.github.io/patchloom/) [![VS Code Marketplace](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SebTardif/d01e4551b744b77e2927555e43a4b935/raw/version.json)](https://marketplace.visualstudio.com/items?itemName=patchloom.patchloom) [![crates.io downloads](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SebTardif/6a26adf6bfae45f530465f626c9154f4/raw/crates-downloads.json&logo=rust)](https://crates.io/crates/patchloom) **单一二进制文件。全平台支持。专为 AI agent 设计的结构化文件编辑。** Patchloom 是一个单一二进制文件的 CLI 工具,可为 AI 编码 agent 在任何操作系统上提供安全、结构化的文件编辑功能。它通过选择器(而非正则表达式)编辑 JSON、YAML 和 TOML,保留注释,通过 tree-sitter 理解代码结构(支持 20 种语言),将多个文件编辑批处理为一次工具调用,并在 Linux、macOS 和 Windows 上以完全相同的方式运行。 ![Patchloom 演示:对 JSON、YAML 和 TOML 格式的 4 个文件进行 6 次编辑——一条命令,保留注释](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/ac0244ee34134718.gif) ``` # 通过 selector 编辑 YAML 值,且不会破坏 comments 或 formatting patchloom doc set config.yaml database.port 5432 --apply # 将 6 个文件 edits 批量合并为单次 tool call patchloom batch --apply <<'EOF' doc.set package.json version "2.0.0" doc.set config.yaml app.version "2.0.0" doc.set config.toml project.version "2.0.0" replace README.md "1.0.0" "2.0.0" replace CHANGELOG.md "1.0.0" "2.0.0" file.create VERSION "2.0.0" EOF ``` **[为什么选择 Patchloom?](#why-patchloom)** | **[安装](#install)** | **[快速开始](#quick-start)** | **[命令](#commands)** | **[对比](#how-patchloom-compares)** | **[架构](#how-it-works-with-your-ai-agent)** | **[状态](#status)** ## 为什么选择 Patchloom? ### 问题所在 AI agent 通过工具调用来编辑文件。每次调用都会产生一次与 LLM 的往返交互。当一个任务涉及配置文件时,该过程有三种失败模式: 1. **语法损坏。** agent 对 JSON、YAML 或 TOML 使用文本替换,导致生成无效输出(大括号不匹配、缩进错误、丢失注释)。 2. **往返开销。** 编辑 6 个文件意味着需要 6 次单独的工具调用。每次调用都要等待 LLM 生成、执行、读取结果并计划下一次调用。 3. **平台碎片化。** 在 Linux 上,agent 使用 `sed`、`jq`、`grep`。而在 Windows 上,这些都不存在。agent 只能退回到冗长的 PowerShell,或者因不熟悉的语法而犯错。 ### Patchloom 如何逐一解决 | 问题 | Patchloom 如何解决它 | |---|---| | **语法损坏** | `doc` 命令会解析文件,通过选择器路径更改值,并写入有效的输出。保留注释和格式。无需正则表达式。 | | **往返开销** | `batch` 和 `tx` 将 N 个操作合并为 1 次工具调用。六个文件编辑变成一条命令,失败时支持原子回滚。 | | **平台碎片化** | 单一的静态二进制文件,零依赖。在 Linux、macOS 和 Windows 上具有相同的命令、相同的标志和相同的行为。 | ### Patchloom 带来的改变
**不使用 Patchloom**(6 次工具调用) ``` Agent: edit file 1 ─── tool call ───▶ 15s Agent: edit file 2 ─── tool call ───▶ 15s Agent: edit file 3 ─── tool call ───▶ 15s Agent: edit file 4 ─── tool call ───▶ 15s Agent: edit file 5 ─── tool call ───▶ 15s Agent: edit file 6 ─── tool call ───▶ 15s Total: ~90s ``` **使用 Patchloom batch**(1 次工具调用) ``` Agent: batch with all 6 edits ─── tool call ───▶ 25s 5 round-trips saved Total: ~25s ```
### 核心能力 | 能力 | 功能描述 | 示例 | |---|---|---| | **基于解析器的编辑** | 通过选择器编辑 JSON/YAML/TOML,保留注释和格式 | `doc set config.yaml db.port 5432 --apply` | | **单次调用批量处理 N 个文件** | `batch` 和 `tx` 将操作合并为一次工具调用,并支持回滚 | `batch --apply < ops.txt` | | **保留注释** | YAML/TOML 的注释在所有编辑操作中都会保留,包括调整数组大小 | `doc append config.yaml tags '"v2"' --apply` | | **标题感知的 Markdown** | 根据标题(而非行号)编辑章节、表格和列表 | `md table-append README.md --heading "API" --row "\| new \| row \|" --apply` | | **感知 AST 的代码操作** | 使用 tree-sitter(支持 20 种语言)列出、重命名、替换和分析符号 | `ast rename src/ old_name new_name --apply` | | **原子回滚** | 如果格式化或验证步骤失败,`strict: true` 会还原所有文件 | `tx plan.json --apply` | | **MCP server** | 将所有操作作为结构化的 MCP 工具调用公开 | `patchloom mcp-server` | | **跨平台** | 在 Linux、macOS、Windows 上表现完全一致。不需要 `sed`、`jq`、`grep`。 | 到处使用同一个二进制文件 | ### 何时使用 Patchloom 与原生工具 Patchloom 并不能替代所有的文件操作。它的指令会准确地告诉 agent 何时该使用它,以及何时使用原生工具会更快: | 任务 | 使用 Patchloom? | 原因 | |---|---|---| | 通过选择器编辑 JSON/YAML/TOML 的值 | **是** | 解析器确保输出有效,并保留注释 | | 在一项任务中编辑 3 个及以上文件 | **是** | `batch`/`tx` 消除了往返交互 | | 向 Markdown 表格追加一行 | **是** | 感知标题,无需猜测行号 | | 读取单个文件 | 否 | 原生的 `read_file` 更快 | | 简单文本搜索 | 否 | 原生的 `grep` 更快 | | 单文件文本替换 | 否 | 原生的 `search_replace` 更快 | ### 准确性高于速度 对于简单的单文件编辑,Patchloom 并不比原生工具快。对于这些操作请使用原生工具。但是原生文本替换无法安全地编辑结构化文件:对 YAML 使用 `sed` 可能会破坏缩进、去除注释或产生无效语法。`doc set` 会解析文件,通过选择器更改值,并写入有效的输出。这种保证才是核心意义所在。 Patchloom *确实*更快的地方在于多文件批处理。通过原生工具进行六次文件编辑意味着要与 LLM 进行六次往返交互。而一次 `batch` 调用可以在单次往返中完成相同的工作。
基准测试详情(通过 Grok Build 使用 Claude Opus 4,共 11 项任务) ``` Task PL-CLI MCP Native ────────────────────── ────── ────── ────── search 18.5s 12.7s 13.9s ◀ ~same replace 36.1s 26.6s 26.1s ◀ ~same doc_set 30.9s 16.9s 13.7s ◀ native fastest md_table 15.5s 13.5s 15.3s ◀ MCP fastest tx_multi_file 41.4s 28.5s 22.9s ◀ native fastest batch_6_files 50.6s 46.6s 30.3s ◀ native fastest batch_mixed_ops 24.7s 13.6s 20.9s ◀ MCP fastest yaml_comment_preserve 18.1s 11.6s 16.1s ◀ MCP fastest md_insert 15.0s 11.7s 15.7s ◀ MCP fastest file_ops 26.0s 16.6s 17.2s ◀ ~same tidy 45.0s 30.3s 41.7s ◀ MCP fastest ────────────────────── ────── ────── ────── TOTAL 321.9s 228.5s 233.8s ``` 总体而言,MCP 模式胜出(228.5秒 对比 原生 233.8秒),因为结构化的工具调用完全跳过了 shell 语法的构建。MCP 赢了 5/11 项任务;原生赢了 3/11 项;3 项平局。由于 shell 构建的开销,CLI 模式始终是最慢的。
## 安装 ``` # Homebrew (macOS/Linux) brew install patchloom/tap/patchloom # crates.io (要求 Rust 1.95+,包含 MCP server) cargo install patchloom ``` 适用于 Linux、macOS 和 Windows 的预编译二进制文件位于 [Releases](https://github.com/patchloom/patchloom/releases/latest) 页面。 有关 shell 安装脚本、源码构建和 shell 自动补全设置,请参阅[安装说明](./docs/getting-started/installation.md)。 ### 编辑器扩展 为 VS Code、Cursor、Windsurf 或 VSCodium 安装配套扩展: - [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=patchloom.patchloom) - [Open VSX Registry](https://open-vsx.org/extension/patchloom/patchloom) 该扩展会自动发现 CLI(或为您安装),生成 AGENTS.md,配置 MCP server,并在命令面板中添加快捷操作。详情请参阅[编辑器扩展指南](./docs/getting-started/editor-extension.md)。 ## 快速开始 ### 1. 设置您的项目 ``` patchloom init ``` 这会在新项目中创建 `AGENTS.md`,或将规则追加到现有的 agent 指令文件中,提供 shell 自动补全,并检测 MCP 配置机会。传入 `-y` 可跳过确认提示。 如果您只想要规则文本: ``` patchloom agent-rules >> AGENTS.md # 或者自定义 output: patchloom agent-rules --mode mcp >> AGENTS.md # MCP-only (no CLI examples) patchloom agent-rules --platform windows >> AGENTS.md # Windows-only syntax ``` 如果存在 `.vscode/` 或 `.cursor/`,`init` 还会输出可直接复制的 `.vscode/mcp.json` 或 `.cursor/mcp.json` 片段。 ### 2. 安全地编辑配置文件 ``` # Parser-backed:修改值,保留 comments 和 formatting patchloom doc set config.yaml database.port 5432 --apply ``` ### 3. 将多次编辑合并为一次调用 ``` patchloom batch --apply <<'EOF' doc.set config.json version "2.0" md.upsert_bullet AGENTS.md "Rules" "- Always test" replace src/main.rs "v1" "v2" EOF ``` 或者使用带有格式化和验证生命周期的 JSON 计划: ``` { "version": "1", "operations": [ { "op": "doc.set", "path": "config.json", "selector": "version", "value": "2.0" }, { "op": "md.upsert_bullet", "path": "AGENTS.md", "heading": "Rules", "bullet": "- Always test" }, { "op": "replace", "path": "src/main.rs", "from": "v1", "to": "v2" } ], "format": [{ "cmd": "cargo fmt --all" }], "validate": [{ "cmd": "cargo test", "required": true }] } ``` ``` patchloom tx plan.json --apply ``` `tx` 计划是受信任的输入。`format` 和 `validate` 会通过宿主机的 shell(Unix 上为 `sh -c`,Windows 上为 `cmd /C`)运行其 `cmd` 字段,因此请仅运行您信任的计划。 ### 4. 或者使用 MCP 进行结构化工具调用(无需 shell 语法) ``` patchloom mcp-server ``` 支持 MCP 的 agent 直接以结构化 JSON 形式调用 patchloom 工具,无需进行 shell 引号处理或命令构建。agent 只需发送 `{"path": "config.json", "selector": "version", "value": "2.0"}`,而无需构建 `patchloom doc set config.json version '"2.0"' --apply`。 有关各 agent 的配置和完整的安全模型,请参阅 [MCP 设置指南](./docs/getting-started/mcp-setup.md)。 ### 作为 Rust 库使用 将 patchloom 作为依赖项添加(使用 `default-features = false` 可省略 MCP server): ``` [dependencies] patchloom = { version = "0.3", default-features = false } ``` ``` use patchloom::api::{self, ApplyMode}; use std::path::Path; // Replace text (preview only, no disk write) let result = api::replace_text( Path::new("src/config.rs"), "old_value", "new_value", &api::ReplaceOptions::default(), ApplyMode::Preview, )?; println!("{}", result.diff); // Set a value in a JSON file api::doc_set( Path::new("config.json"), "version", serde_json::json!("2.0"), ApplyMode::Apply, )?; ``` 所有 API 类型均为 `Send + Sync`。除了 `api` 模块外,实用工具模块也是公开的:`containement`(工作区路径保护)、`exec`(shell 命令执行)、`files`(文件遍历和二进制检测)以及 `write`(带有策略转换的原子文件写入)。完整接口请参阅 `patchloom::api` 模块文档。 ## 新手入门 | 资源 | 您将学到什么 | |---|---| | [安装说明](https://patchloom.github.io/patchloom/getting-started/installation.html) | 安装选项和 shell 自动补全 | | [核心概念](https://patchloom.github.io/patchloom/getting-started/concepts.html) | 写入模式、事务计划和退出代码 | | [MCP 设置](https://patchloom.github.io/patchloom/getting-started/mcp-setup.html) | 将 patchloom 配置为您 agent 的 MCP server | | [编辑器扩展](./docs/getting-started/editor-extension.md) | VS Code、Cursor、Windsurf 和 VSCodium 集成 | | [快速入门](https://patchloom.github.io/patchloom/getting-started/quickstart.html) | 5 分钟演练 | | [参考](https://patchloom.github.io/patchloom/reference/) | 每一个命令、操作和模式 | | [示例](./examples/README.md) | 事务计划模板 | ## 命令 ### 针对 Agent 优化(比原生工具更快或更安全) | 命令 | 功能描述 | 适用场景 | |---|---|---| | `batch` | 单次调用中面向行的多文件编辑 | 使用简单语法编辑 3 个及以上的文件 | | `tx` | 带有格式化/验证生命周期的 JSON 计划 | 需要回滚的复杂多文件编辑 | | `doc` | 基于解析器的 JSON/YAML/TOML 编辑 | 在不破坏语法的情况下更改配置值 | | `md` | 感知标题的 Markdown 编辑 | 更新文档中的表格、章节和列表 | | `ast` | 通过 tree-sitter(支持 20 种语言)感知 AST 的符号操作 | 重命名标识符、列出符号、影响分析 | | `patch` | 应用带有陈旧检测的 unified diff | 安全地重放补丁 | | `tidy` | 文本文件的空白字符和换行符规范化 | 用于文本整洁度的 CI 检查 | | `mcp-server` | MCP 协议服务器 | 支持 MCP 的 agent(无需 shell 语法) | ### 通用功能(在脚本和 CI 中同样实用) | 命令 | 描述 | |---|---| | `search` | 跨文本文件进行快速的文本字面量或正则表达式搜索 | | `replace` | 跨文本文件进行机械的字符串替换,并提供 diff 预览 | | `append` | 向现有文件追加内容 | | `create` | 创建包含的新文件 | | `delete` | 删除文件 | | `rename` | 移动(重命名)文件 | | `read` | 读取文件内容,支持可选的行范围 | | `status` | 显示哪些文件有未提交的更改 | | `explain` | 用通俗易懂的语言总结 tx 计划 | | `undo` | 从 `--apply` 创建的备份中恢复文件 | | `completions` | 生成 shell 自动补全(bash、zsh、fish、elvish) | | `init` | 在项目中设置 patchloom(agent 规则、补全、MCP) | | `schema` | 导出具有层级过滤和系统提示词的操作 schema | | `agent-rules` | 为您的项目生成 agent 指令 | ## Patchloom 的对比 | 工具 | 优势 | Patchloom 的不同之处 | |------|----------|------------------------| | **jq** | JSON 查询/转换 | patchloom 还能处理 YAML、TOML、Markdown;支持跨文件批处理;保留注释 | | **yq** | YAML/JSON 查询/转换 | patchloom 通过 CST 编辑保留 YAML 注释;增加了 Markdown、批处理和原子事务 | | **dasel** | 多格式获取/设置 | patchloom 增加了批处理(单次调用 N 次编辑)、原子回滚、格式化/验证生命周期 | | **sd** | 正则表达式查找/替换 | patchloom 增加了基于解析器的结构化编辑;批处理;绝不产生无效的 JSON/YAML | | **comby** | 结构化代码模式 | patchloom 针对的是配置文件和 agent 工作流,而非源代码模式匹配 | 关键区别在于:patchloom 是专为 AI agent 工作流设计的。一次 `batch` 或 `tx` 调用即可替代 N 次顺序工具调用,从而减少往返交互并消除部分失败的状态。 ### 对比 Agent 原生编辑工具 上表将 patchloom 与人类使用的 CLI 工具进行了对比。但是 agent 已经内置了编辑功能:Claude Code 的 `edit_file`、Cursor 的 apply、Grok Build 的 `search_replace`、Aider 的 `/code` 块。为什么还要在其之上添加 patchloom 呢? **Agent 原生工具使用的是文本匹配。** 它们找到一段文本并将其替换。这对源代码有效,但在结构化配置文件上会失败:
**Agent 对 YAML 使用 `search_replace`** ``` database: # Production settings host: db.prod.internal port: 5432 # PostgreSQL default pool_size: 10 ``` agent 将 `port: 5432` 替换为 `port: 5433`。结果取决于具体实现。许多 agent 会丢失行内注释、破坏缩进,或者因为周围的上下文发生变化而导致匹配失败。 **Agent 使用 `patchloom doc set`** ``` patchloom doc set config.yaml \ database.port 5433 --apply ``` YAML 解析器更改选择器路径上的值。注释、缩进、键的排序以及所有其他格式都会被保留。输出始终是有效的 YAML。
| Agent 原生工具的局限性 | Patchloom 如何解决它 | |---|---| | **破坏注释** | CST 级别的 YAML/TOML 编辑可保留所有注释 | | **每次工具调用只能处理一个文件** | `batch`/`tx` 在一次调用中编辑 N 个文件(在基准测试中快 6.7 倍) | | **无法回滚** | 如果验证失败,带有 `strict: true` 的 `tx` 会还原所有文件 | | **依赖平台** | 在 Linux、macOS、Windows 上使用相同的二进制文件和语法 | | **上下文陈旧风险** | `patch apply` 使用模糊匹配来处理上下文漂移 | ## 它如何与您的 AI Agent 协作 两种集成模式,具备相同的能力: ``` flowchart LR subgraph CLI["CLI mode (any agent)"] direction TB A["patchloom agent-rules >> AGENTS.md"] --> B["Agent reads AGENTS.md"] B --> C{"What kind of edit?"} C -->|Simple edit| D["Native tool (faster)"] C -->|Config edit| E["patchloom doc (safer)"] C -->|Markdown edit| F["patchloom md (smarter)"] C -->|Multi-file edit| G["patchloom batch (batched)"] end subgraph MCP["MCP mode (MCP-capable agents)"] direction TB H["patchloom mcp-server"] --> I["Agent discovers tools via MCP"] I --> J["Structured JSON tool calls"] J --> K["No shell syntax needed"] end ``` ## 状态 跨 22 个命令的 1500 多项测试。已通过 Grok 4.3、GPT-5.4 和 Claude Opus 4.6 测试。 | 组件 | 状态 | |---|---| | CLI | 已发布在 [crates.io](https://crates.io/crates/patchloom) 和 [Homebrew](https://github.com/patchloom/homebrew-tap) 上 | | 编辑器扩展 | 已发布在 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=patchloom.patchloom) 和 [Open VSX](https://open-vsx.org/extension/patchloom/patchloom) 上 | ## 完整命令参考 每个命令、标志、事务操作和退出代码都记录在 **[命令参考](https://patchloom.github.io/patchloom/reference/)** 中(也可在 [docs/reference/README.md](docs/reference/README.md) 查看)。 ## 许可证 根据以下任一许可证授权: - MIT 许可证 ([LICENSE](./LICENSE)) - Apache License, Version 2.0 ([LICENSE-APACHE](./LICENSE-APACHE)) 由您选择。 ### Agent 集成测试 `make agent-test` 会运行 19 个 pytest 场景,以验证 AI agent 在接到指令时是否能正确使用 patchloom。`make bench-agent` 会跨 11 项任务运行三方基准测试(CLI 对比 MCP 对比 原生)。使用 `MODEL=X` 可切换模型,使用 `RUNS=N` 可减少方差。需要 LLM API 密钥。不属于 `make check` 的一部分。详情请参阅 [tests/agent/README.md](./tests/agent/README.md)。 ## 安全 有关当前的安全报告指南,请参阅 [SECURITY.md](./SECURITY.md)。
标签:AI代理, Rust, SOC Prime, 可视化界面, 开发工具, 文件编辑, 文档结构分析, 网络流量审计, 通知系统