mcpField
P
Pitroom

Pitroom

本地服务
github.comAI 与智能体29今天更新

关于 Pitroom

Pitroom 是用于委派有限编码任务的命令行工具和 Agent 技能套件,由主编码 Agent 保留决策权。它会核验引用的文件位置,返回差异和用量凭据,并支持通过多种工作者命令行并行执行任务。

主要功能

  1. 01委派研究、修复、测试和审查
  2. 02并行运行工作者并配置回退链
  3. 03核验引用的文件位置
  4. 04返回精确差异和用量凭据
  5. 05隔离变更后再应用
  6. 06在本地面板查看运行记录

适用场景

  1. 01编码时委派代码库阅读
  2. 02并行开展独立代码审查
  3. 03应用工作者补丁且不混入其他编辑
  4. 04跟踪工作者用量和历史运行

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"atastech-pitroom": {
"command": "npx",
"args": [
"-y",
"pitroom"
]
}
}
}
启动命令npx -y pitroom

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmpitroom0.27.0

工具

10

收录的工具列表 · 更新于 3 天前

参数类型必填说明
dirstring否项目目录(默认:服务端的目录)。
webboolean否允许使用 Web 工具。
linkarray否要链接到隔离副本中的忽略目录,例如 ["node_modules"]。
modeenum否read | isolate | write
taskstring否要执行的操作,以及工作者所需的上下文。
tierstring否cheap、standard 或 capable(来自配置)。
auditboolean否读取:让另一位工作者重新检查答案(每项任务各一位)。
filesarray否要附加的文件。
freshboolean否读取:即使此问题已针对相同代码得到回答,也要询问工作者。
groupstring否相关运行的分组名称。
modelstring否该工作者使用的模型。
tasksarray否或者指定多个相互独立的任务,每个任务分配一位工作者。
effortstring否low、medium、high、xhigh。
verifystring否之后运行的命令,例如 "npm test"。
workerstring否工作者 "backend[:model]",例如 "opencode"、"claude:haiku"。默认值:已配置的工作者。
inPlaceboolean否读取:读取目录本身,而不是不含疑似机密文件的快照。
continuestring否要在同一工作者会话中继续跟进的已完成运行。
waitSecondsnumber否在返回 "still running" 前等待的时长(默认值为 50,最大值为 540)。

详细介绍

原文在翻译后有更新,译文可能不是最新。

Pitroom

为你昂贵的编码 Agent 配备免费维修团队

更省钱、更快速:把阅读、修复、测试和审查交给并行运行的工作者。决策仍由你掌握。

模型无关 · 答案经过验证 · 提供依据,不凭感觉 · 支持 OpenCode / Codex / Claude Code / Gemini CLI / Qwen Code / Kilo Code / Antigravity 工作者


Release Downloads npm Stars CI License


快速开始 · 仪表板 · 基准测试 · 工作流 · 技能 · 命令 · 工作者 · 责任 · 编写适配器


Pitroom——为你昂贵的编码 Agent 配备免费维修团队。橙色的 Claw’d、蓝色终端脸的 Codex 宠物和紫蓝色的 Gemini 星星在编码终端前协同工作。

你的 Agent 做决策 · 廉价工作者负责敲代码 · 另一个模型负责审查


Pitroom 仪表板:显示带有动态吉祥物的运行中工作者;已完成的运行展开后显示其任务、步骤、结果和差异;随后显示 History 和 Stats 标签页(示例数据)

pitroom dash,示例数据


为什么选择 Pitroom?

Claude Code、Codex 等工具会花费高级令牌来阅读:搜索代码、打开文件、扫描那些它们永远不会引用的代码。

Pitroom 更进一步:

你的 Agent 始终掌控全局。廉价工作者组成的维修团队并行处理杂活,而你的 Agent 继续工作;它们只会返回答案、精确差异和凭据。

用你的模型,而非我们的

不硬编码任何模型。

Pitroom 使用工作者 CLI 的默认模型:免费套餐、本地 MLX/Ollama 模型,或价格低廉的付费模型。在那里切换模型,Pitroom 也会随之切换。

支持任意工作者 CLI

支持 OpenCode、Codex CLI、Claude Code、Gemini CLI、Qwen Code、Kilo Code 和 Antigravity CLI(测试版)。

一个工作组可以混用它们,回退链也可以跨它们运行(适配器的工作原理)。

答案经过验证

工作者引用的每个 path:line 都会在磁盘上核实。即使引用没有带目录(ipc.ts:218、src/main/ipc.ts:218),也能在项目中找到;像 Schema.parse:432 这样的调用也不会被误认为文件。

你的 Agent 可以信任通过核实的内容,跳过重新阅读。

从设计上保障安全

不提交、不推送、不重置,也不批量删除。Git 防护机制会阻止这些操作。

在隔离模式下,只有应用更改后,它们才会进入你的工作树。

### 还有更多
另外 12 项功能
  • 用数据说话,而非凭感觉。 查看工作器消耗的令牌数、返回给 Agent 的令牌数、压缩率,以及主模型可能收取的费用估算。运行 pitroom savings --card card.svg 即可生成可分享的卡片。
  • 工作器链自动恢复。 免费模型可能会遇到速率限制或退役。只需列出备用工作器(fallback),运行遇到“找不到模型”、429 或配额错误时,就会自动切换到下一个模型。仍然没有硬编码模型:工作器链由你决定。
  • 一支队伍,不止一个工作器。 pitroom crew 可同时启动多个工作器,pitroom watch --json 会在每次变更时输出一行,让 Agent 实时跟进,pitroom wait -g 会收集所有答案,pitroom apply -g 会按顺序应用隔离的补丁。默认最多同时运行 20 个工作器(maxParallel,上限为 30),其余进入队列;备用工作器链会应对免费层级的速率限制;不允许多个工作器并行写入。
  • 不只是更便宜,也更快。 工作器在后台并行运行(最多同时 20 个),Agent 可以继续工作,不再被缓慢的阅读和审查拖住。在基准测试中,工作器耗时 470 秒的任务只用了 156 秒的实际时间,约比逐个提问快 3 倍,同时 Agent 自身的上下文也保持精简。
  • 优先免费,必要时再用更贵的。 运行和计划任务默认使用 cheap 层级,即 OpenCode 的免费模型;需要更强能力的任务可使用 standard(Codex)和 capable(Claude Code),还可以通过可选的 review 层级指定审查者。使用免费的 Google AI Studio 密钥,通过 Gemini CLI 还能多一个低成本工作器(每个模型每天的配额较少)。pitroom models 会显示各工作器的能力、每个模型支持的工作量级别(low … xhigh)、你设定的费用(costs)和实际用量;--effort 可设置每次运行的级别。详情:模型、费用和工作量级别。
  • 即使工作区有未提交改动,也能精确追踪变更。 Pitroom 使用临时 Git 索引快照记录工作区(不会触碰你的索引、分支和 stash),因此只报告工作器所做的编辑,并可精确撤销:pitroom revert <id>。
  • 权限由你的 Agent 设定。 Agent 会根据任务和会话允许的范围(只读、隔离副本、原地编辑、网页访问)为每个工作器设置权限,工作器绝不会自行扩大权限。每次运行都受固定限制:不能更改 Git 历史、不能使用 sudo、不能发布内容、不能访问密钥。工作器也不能应用删除操作:除非 Agent 传入 --allow-delete,否则 pitroom apply 会拒绝删除文件的补丁。
  • 真正隔离。 --isolate 会在当前状态的私有副本中运行工作器(使用独立仓库,以只读方式共享对象),包括未提交和未跟踪文件,然后交付补丁:运行 pitroom apply <id> 应用补丁(会先检查,发生冲突时拒绝应用),或运行 pitroom discard <id> 丢弃补丁。
  • 不污染仓库。 不会创建 .pitroom/ 文件夹,不会修改 .gitignore,也不会创建分支。记录存放在 ~/.local/state/pitroom。
  • 适用于任何 Agent。 提供十四个 Agent Skills:由工作器运行的 superpowers 开发工作流,以及委派功能(using-pitroom、pitroom-research、-crew、-implement)、CLI,还有一个 Claude Code / Codex 插件,其会话启动钩子会加载工作流。支持 Claude Code、Codex、Gemini CLI、Cursor,以及任何能运行 shell 命令的工具。
  • 实时仪表板和可搜索的历史记录。 pitroom dash 会打开本地页面,展示每次运行(任务、工作器逐步执行的操作、结果和差异)以及历史记录和统计信息,适用于不显示钩子或状态行的 Agent 应用;pitroom history 可搜索 Pitroom 运行过的所有内容。参见仪表板。
  • 轻巧。 CLI 约有 6,500 行 TypeScript,CLI 打包后约 210 KB(另有约 1.9 MB 的仪表板文件,由它提供服务,并支持十种语言的语法高亮),没有运行时依赖。
### 它如何保持安全

每次运行都会将工作者自身的安全机制设为相应模式(对于 OpenCode,会通过 OPENCODE_CONFIG_CONTENT 注入权限配置):禁止 commit/push/reset/checkout/stash/clean/rebase、禁止批量删除、禁止使用 sudo;文件读取工具会拒绝读取 .env 和密钥文件(OpenCode 和 Claude Code 工作者);除非传入 --web,否则不启用 Web 工具;不使用子 Agent,也不进行递归委派。规则只有 allow/deny,因此无头运行不会卡在提示词上。工作者 PATH 中的 git 防护 还会阻止 sh -c "git push"、env git reset、别名和脚本执行 commit、push、reset、stash 操作或触碰你的索引。绝不会修改你的 opencode.json。这些防护措施可以降低风险,但并不构成安全边界(请参阅责任和 SECURITY.md)。


看看它的实际效果

在免费的 OpenCode Zen 模型上进行的一次真实运行:你的 Agent 读取约 554 个 token,而不是 163,000 个。

$ pitroom run "Which function builds the read-only permission profile, and which bash commands does it allow?"
pitroom ✔ done · read · 30s · run 20260930-003902-3270
session ses_… · model opencode/muse-spark-1.3-contributor-free

SUMMARY: The read-only permission profile is built by `readProfile()` in src/profiles.ts:89.
Its bash allow-list is `READ_ONLY_BASH` in src/profiles.ts:29-46.
DETAILS:
- Allowed (src/profiles.ts:31-41): `git status*`:31, `git diff*`:32, … `rg *`:40, `wc *`:41.
- Explicit sub-denies: `rg *--pre*`:43, `git *--output*`:44, `git *--ext-diff*`:45.
FILES CHANGED: none

── receipt: worker processed 163k tokens in 6 steps (7 tool calls) · worker cost $0.000
   · returned ~554 tokens, 294× compression · est. saved $0.152 vs Claude Sonnet

每次运行都会打印一张收据,pitroom savings 会汇总这些收据(--card 会生成这张可分享的卡片;此处的数字为示例数据,实际测量结果见基准测试):

Pitroom 节省卡片


仪表板

pitroom dash --detach 会输出一个实时页面的地址,位于 127.0.0.1(仅限本机;它会读取你的运行记录,除以下两个操作外不会做任何更改)。它适用于 Hook 消息和状态行无法送达的场景,例如 Claude Code 和 Codex 应用:在浏览器或应用自带的浏览器窗格中打开。技能会指示你的 Agent 启动它,并在其后台运行工作进程时将地址提供给你。

以下截图展示的是示例数据(一个虚构的 shop-api 项目),并非真实项目。

实时。 查看当前正在运行的内容和最近的运行记录。运行中的卡片会显示计时器、工作进程的最新发言,以及它的动画像素吉祥物(已完成的卡片则显示工作进程的徽标);已完成的卡片会显示结果,对于审查任务还会显示发现的问题。

实时标签页:四个正在运行的工作进程,显示计时器和进度条,下面是已完成的运行记录,带有已批准和需要修改徽标、步骤数、令牌数和节省金额

卡片、审计、历史记录、统计和停止/丢弃

点击卡片,它会展开为一个面板,显示任务、工作进程逐步执行的操作(读取的文件、搜索、命令、编辑及其时间,失败的操作会标出)、结果、它更改的文件和差异,以及详细信息(模型、令牌数、费用、回退和引用检查)。

展开的运行卡片:任务、包含十个步骤的活动列表、结果、五个已更改文件(其中一个展开显示高亮差异)以及详细信息

卡片上会显示审计结果和被跳过的工作进程。 由其他工作进程重新检查过的研究答案(审计)会带有 audited · agrees / partly agrees / disagrees 徽标;如果存在异议,还会显示有争议的说法。因配额用尽而被跳过的工作进程会列在详细信息中(“Skipped … cooling down until 14:05”,参见 pitroom cooldown)。

展开的研究卡片:答案经过另一个工作进程审计,该工作进程表示不同意,并列出两条带有 file:line 的争议说法;另有说明指出某个工作进程因当天配额用尽而被跳过

历史记录会搜索 Pitroom 运行过的所有内容(任务、答案和步骤的全文),并可按状态、模型和时间范围筛选;每条运行记录打开后都会显示与实时页相同的卡片。统计会按工作进程、模型和日期显示运行次数、成功率、耗时、令牌数和节省金额。

历史记录标签页:搜索框、筛选条件,以及每条过往运行记录的卡片 统计标签页:总计、每日运行次数,以及各工作进程和模型的徽标、成功率和其经审计答案得到另一工作进程确认的数量

停止和丢弃。 正在运行的卡片上有一个停止按钮;尚未应用的已完成 --isolate 卡片上则有丢弃按钮(分别等同于 pitroom stop 和 pitroom discard;补丁文件会保留)。一个小组的卡片可以一次性对其所有运行记录执行相同操作(全部停止、全部丢弃);如果其中一些运行失败、超时或已停止,重试命令会显示用于在同一小组中重新启动这些运行的 pitroom run … --bg 命令,可复制到终端或交给你的 Agent(Windows 上的 PowerShell 命令会加引号,其他系统则适用于 POSIX Shell)。每项操作都会再次要求确认。页面无法执行其他操作:它不会启动运行,也不会应用补丁。POST 请求需要页面提供时使用的密钥(每次启动仪表板时都会更换)和页面自身的来源,因此其他网站上的网页无法触发这些操作。

仪表板是一个 React 应用,只构建一次到 dist/ui,并作为两个静态文件提供,因此 CLI 仍然没有运行时依赖。它会遵循系统的浅色或深色主题(可通过按钮切换)。


基准测试

在真实的公开代码仓库中进行测量:PI-Desktop,提交为 c2bfe35,包含 2,349 个受版本控制的文件,以及约 419,000 行 TypeScript 和 Rust 代码。使用 OpenCode 的免费模型 muse-spark-1.3-contributor-free,将 Agent 在修改代码前会提出的八个问题作为一个只读小组任务运行(pitroom crew,同时最多运行四个工作者)。

简而言之:在该代码仓库中,回答八个问题耗时 156 秒;工作者读取了 550 万个 Token,交给 Agent 的内容为 7,684 个 Token(压缩 715 倍);后续审计发现部分答案不完整。在 React、Django 和 Kubernetes 上,四种免费模型在九个范围明确的问题上与 gpt-6-sol 表现相当;在植入 Bug 的代码审查测试中,几乎所有模型都找到了几乎所有 Bug。下方的表格会说明这些结果,以及它们未能说明的内容。

PI-Desktop:八个问题、Token 节省、答案质量和一次独立改动
问题工作时间处理的 Token 数返回给 Agent 的 Token 数压缩比已验证的引用
插件运行时在哪里?哪些函数会激活和停用插件?37 秒405,380767529 倍10/11
Agent 运行时何时压缩对话?(函数和确切条件)90 秒1,250,7197631,639 倍17/17
Rust 主机在哪里将会话状态持久化到磁盘?71 秒854,9691,426600 倍29/45 ¹
哪些 IPC 通道向渲染进程公开窗口管理功能?32 秒165,180716231 倍3/28 ¹
工具调用如何从 Agent 运行时传递到 Rust 主机?119 秒1,818,5248662,100 倍14/15
哪些包和应用依赖 i18n 包?33 秒271,297656414 倍15/16
自动更新在哪里实现?Windows 便携版目标会做出什么改变?29 秒215,693743290 倍20/21
哪些测试覆盖 RPC 层?59 秒511,2091,747293 倍6/7
全部八个问题156 秒(墙上时钟时间)5,492,9717,684715 倍114/160

工作者读取了 550 万个 Token 的代码和文档(96 个步骤、179 次工具调用),交给 Agent 的内容为 7,684 个 Token,平均每个答案约 960 个 Token。八次运行的工作者时间合计为 470 秒,但由于每次同时运行四个任务(当时的上限;默认值现在是 20),墙上时钟时间仅为 156 秒,比依次运行快约 3 倍。这是相同工作者之间的比较,并非与 Agent 单独阅读的时间对比;我没有测量后者。pitroom savings 按 Claude Sonnet 的公开定价估算,这八次运行节省了 3.86 美元。

答案正确吗? 我对照代码仓库手动检查了所有八个答案中的 46 个关键声明(引用的行及其内容),全部正确;两项完整性检查也通过了(恰好有 6 个 invoke 和 3 个 event 窗口通道;config_sync_rpc.rs 中没有测试)。i18n 答案列出了导入该包的 12 个源文件,但漏掉了同样会导入该包的 11 个测试和 fixture 文件;问题并未询问这些文件。Pitroom 自带的检查器标记为已验证的引用更少:¹ 这两个答案引用了没有路径的文件名(transcripts.rs:651),检查器无法将其解析为路径,因此将其计为未验证,尽管行号正确。 **审计发现的问题比人工检查更多。**随后,第二个免费工作者(在 space-bunny 上运行的 pitroom audit)重新检查了这 8 个答案:3 个答案一致,5 个被标记为部分正确。争议在于答案不完整或略有偏差,而不是引用的代码行有问题:遗漏内容的列表(会话状态:还有更多写入位置;i18n:还有第二种深度导入式的使用者;RPC 测试:漏掉了 14 个测试)、错误的计数,以及少数引用行与声明相隔几行。我们人工检查了其中一个,审计者是对的:RPC 的 mod tests 代码块中有 59 个测试,而答案说大约 40 个。其他答案未经人工检查,而且审计者本身也是可能出错的免费模型。因此,应把工作者提供的列表或计数视为不错的初步答案;重要时让你的 Agent 确认,这正是 --audit 的用途。

在隔离副本中进行更改:“在 resolveUpdateMode 上方添加一行注释”用时 16 秒,经过 4 个步骤(142,491 个 token)后完成。补丁只涉及一个文件和一行,注释与代码相符;应用之前,你的工作树不会受到影响。

免费模型与 React、Django 和 Kubernetes 上的 gpt-6-sol 对比

**免费模型与 gpt-6-sol 在三个大型代码库上的对比。**在固定的提交版本上,对 React(7,252 个文件)、Django(7,091 个文件)和 Kubernetes(31,353 个文件)进行同类工作。共 9 个范围明确的问题,每个代码库 3 个:定义某个函数的文件和行号、包含某个词的文件数量,以及包含该词的文件。每个答案都通过 git grep 核对,而非凭主观判断:精确的 path:line(文件正确但行号错误得半分)、精确计数,以及对列表采用 F1 分数,同时惩罚遗漏和臆造的文件。每个工作者只读运行这 9 个问题一次,不启用回退,因此无法完成任务的模型会直接失败,而不会被换成其他模型。

工作者和模型得分耗时中位数token 数中位数
Codex gpt-6-sol(effort medium)100%16 秒50k
Codex gpt-6-sol(effort low)100%20 秒50k
OpenCode muse-spark-1.3-contributor-free100%23 秒44k
OpenCode space-bunny-free100%35 秒63k
OpenCode mimo-v2.6-flash-free100%37 秒42k
OpenCode big-pickle100%42 秒91k
OpenRouter nemotron-3-ultra-550b-a55b:free89%27 秒42k
OpenCode longcat-2.5-preview-free89%29 秒20k
OpenCode nemotron-3-ultra-free89%35 秒21k
OpenRouter inkling:free83%14 秒41k
OpenCode nemotron-3.5-lightning-free72%377 秒69k
NVIDIA gpt-oss-20b(7 个问题)57%24 秒42k

在这些问题上,4 个免费模型的表现与 gpt-6-sol 相同。每个模型都找到了所有定义;错误出现在计数问题(数字错误),以及两个模型的列表问题上,其中一个模型加入了不属于 django/ 的 docs/ 文件。gpt-6-sol 的速度与最快的免费模型一样快,而且在此处降低其 effort 并未影响准确率。nemotron-3.5-lightning-free 在一个列表问题上输出了无关文本,并在另一个问题上触及 10 分钟时限。评分脚本和所有原始答案都在 benchmarks/multi-repo 中。

表格只列出了实际运行的工作者。无法作答的模型(遇到提供商错误,或受 OpenRouter 免费层的共享每日配额限制)不在其中;两个因提供商错误而结束的 gpt-oss-20b 运行也未列入。超时的运行则保留在表中。

审查能否发现预先埋下的 bug? **审查能否发现预埋的 Bug?** 我们将一个 Bug 改进真实代码中(反转条件检查、调换 `&&`/`||`、翻转 `return`),分别放入 React、Django、Kubernetes 和 Pitroom 本身,然后以一个简单的 “tidy” 提交,并要求 `pitroom review` 审查该提交。共 29 个软件包(14 个仅包含该 Bug,15 个包含该 Bug 及其周围三处仅修改注释的编辑)。当一条 Critical 或 Important 级别的发现指出了被修改的文件,并且引用的行号与改动相差不超过 5 行,或点名了被修改的标识符或其函数时,就算发现了 Bug;“精确行号”是更严格的标准(相差不超过 3 行)。
工作器和模型发现 Bug精确行号审查数平均用时最慢用时
OpenCode space-bunny-free100%100%29 次(共 29 次)2 分 19 秒5 分 46 秒
OpenCode nemotron-3-ultra-free97%79%29 次(共 29 次)1 分 45 秒3 分 29 秒
OpenCode longcat-2.5-preview-free83%83%29 次(共 29 次)2 分 53 秒8 分钟(1 次超时)
Codex gpt-6-sol100%100%9 次(共 29 次)38 秒52 秒
OpenCode muse-spark-1.3-contributor-free100%57%14 次(共 29 次)48 秒2 分 0 秒
OpenCode big-pickle100%92%13 次(共 29 次)2 分 28 秒5 分 27 秒
OpenCode mimo-v2.6-flash-free100%100%10 次(共 29 次)4 分 6 秒7 分 40 秒

几乎所有模型都找到了几乎所有 Bug,因此这项测试比较的是速度和精确度,而不是它们能否进行代码审查:muse-spark 描述出了正确的 Bug,但引用的行号经常有误(精确率为 57%);gpt-6-sol 和 muse-spark 则明显快得多。只有三个模型完成了全部 29 次审查:其余四个模型的评分基于触及服务提供商限制前完成的审查(免费层的使用限制,以及 gpt-6-sol 触及的 Codex 计划限制);其余未完成的审查不计入评分,也不算作漏报,因此它们的结果仅基于 9 到 14 次审查。每处改动只有 2 到 5 行,难度较低;我们无法计算误报率(所谓“干净”的仅修改注释软件包,最终发现其中的注释实际上有误,因此无法用来计算);而且 React、Django 和 Kubernetes 可能出现在模型的训练数据中。测试框架和所有原始审查结果都在 benchmarks/review-bugs 中。

这项测试不能说明什么

  • 每个问题和模型只运行了一次,因此无法衡量结果的差异。这些问题都是范围明确、可用 grep 解答的查找任务,因此无法体现模型处理设计问题或大型改动的能力;四个免费模型和 gpt-6-sol 均获得 100% 的成绩,只说明这项测试对顶尖模型而言很简单,并不意味着它们水平相同。
  • 一项开放式任务(“在 docs/ 中找出最多五个拼写错误”)未能完成:运行 19 分钟后、调用工具 57 次,我们停止了任务。请为工作器分配范围明确的任务。
  • “处理的 Token 数”指工作器读取和写入的 Token 数。你的 Agent 若自行完成相同的阅读工作,其耗费的 Token 数是估算值,而非实测值:节省量的计算假设它处理的 Token 数大致相同。工作器成本为 $0,是因为所用模型免费。
  • 人工核查只覆盖了关键结论,并未核查每一处引文。

要在自己的代码库中复现:pitroom crew -d <repo> -g bench "<question 1>" "<question 2>" …,然后运行 pitroom wait -g bench、pitroom show <run> 和 pitroom savings --models。


平台

macOS 和 Linux 是主要平台。Windows 在 CI 中运行相同的测试套件(Windows Server、Node 22 和 24,使用模拟工作进程;工作进程 CLI 本身不会在那里运行),但有以下区别:

  • Git 防护机制与其他平台一样分为两层,基于 Git for Windows 附带的 sh.exe 构建:Git 自身的配置(一个拒绝所有引用更新的 reference-transaction hook,以及指向无效地址的推送 URL)始终启用;git 垫片(供 cmd.exe 和 PowerShell 使用的 git.cmd,以及供 Git Bash 使用的 git)会友好地拒绝操作,同时也会阻止 add、restore、clean 等命令。不通过 shell 启动 Git 的工作进程(直接调用 CreateProcess)会跳过垫片,只保留配置层。pitroom doctor 会说明当前生效的是哪一层。CI 中已使用 Git for Windows 验证,但尚未在真实 Windows 机器上使用工作进程 CLI 验证。
  • 启动器是 pitroom.cmd(位于 %USERPROFILE%\.local\bin),使用运行 pitroom install 的 Node,或 PITROOM_NODE 中指定的 Node 启动;它不会搜索其他 Node。
  • 行尾。 Pitroom 按字节比较和应用补丁。请关闭 core.autocrlf(或像本仓库一样,在 .gitattributes 中设置 eol=lf);尚未测试过对转换为 CRLF 的检出内容运行 apply。
  • 读取快照中的文件不会被设为只读(Windows 没有 POSIX 模式),而且 --verify 命令会在 cmd.exe 中运行;如果命令缺失,它会报告 is not recognized。

快速开始

你需要 Node.js 22.13+ 和至少一个工作进程 CLI:OpenCode v2+(默认工作进程,提供免费模型)、Codex CLI、Claude Code、Gemini CLI(测试版;需要 Google AI Studio 的 API 密钥,Google 账号登录已不再适用)、Qwen Code(测试版;可使用任何兼容 OpenAI 的提供商、DashScope 密钥或本地模型)、Kilo Code 的 CLI(测试版;npm i -g @kilocode/cli,提供 500 多种模型和提供商),或 Antigravity CLI(测试版;命令为 agy,使用 Google 账号登录)。

1. 安装:选择你的 Agent

Claude Code

claude plugin marketplace add ATASTECH/pitroom
claude plugin install pitroom@pitroom

在会话中:/plugin marketplace add ATASTECH/pitroom,然后运行 /plugin install pitroom@pitroom。

Codex

codex plugin marketplace add ATASTECH/pitroom
codex plugin add pitroom@pitroom
npm i -g pitroom

Gemini CLI

gemini extensions install https://github.com/ATASTECH/pitroom
npm i -g pitroom

Cursor

npm i -g pitroom
pitroom install --mcp --client cursor

这会将 pitroom mcp 添加到 ~/.cursor/mcp.json,并保留该文件中的其他服务;如果没有显示,请重启 Cursor。Cursor 可使用下文介绍的十个 MCP 工具。技能会链接到 ~/.agents/skills 和 ~/.claude/skills(使用 --no-skills 可跳过),而 Cursor 的文档将这两个路径都列为加载技能的位置;我们尚未在 Cursor 会话中运行过此功能,且 Cursor 论坛上的一则报告称,其 CLI(cursor-agent)不会加载 ~/.agents/skills。先运行 pitroom install --mcp --dry-run,即可查看它将进行哪些更改。

任何支持 MCP 的 Agent(包括 Claude Desktop 和上述 Agent)

Pitroom 也可以作为通过 stdio 通信的 MCP 服务:提供十个工具,而非 shell 命令和技能(pitroom_run、pitroom_wait、pitroom_show、pitroom_info、pitroom_review、pitroom_audit、pitroom_apply、pitroom_discard、pitroom_revert、pitroom_stop)、作为资源提供的运行记录,以及四个提示词。工具定义会在整个会话期间保留在客户端的上下文中,因此体积很小:约 1.9k 个 token。它在 MCP Registry 中的条目为 io.github.ATASTECH/pitroom,因此可以被浏览该注册表的客户端发现。运行 npm i -g pitroom 后,让 Pitroom 在检测到的客户端(Claude Code、Codex、Gemini CLI、Cursor、Claude Desktop)中自行注册:

pitroom install --mcp               # also links the skills; add --no-skills to skip that
pitroom install --mcp --dry-run     # only say what it would do
pitroom install --mcp --client cursor,claude-desktop

它会通过完整路径注册启动器(Claude Desktop 之类的应用启动时不会使用你的 PATH),使用 Claude Code、Codex 和 Gemini CLI 各自的 mcp add 命令进行配置(支持用户级配置的客户端会使用用户级配置),合并 Cursor 和 Claude Desktop 的 JSON 配置而不影响其中的其他服务(创建 .bak-pitroom 备份;如果文件不是有效的 JSON,则保持原样),跳过已注册的项,而 pitroom uninstall 会将其移除。pitroom doctor 会显示注册位置。之后重启客户端。也可以手动配置:

claude mcp add pitroom -- pitroom mcp
codex mcp add pitroom -- pitroom mcp
gemini mcp add pitroom pitroom mcp

或者用于 Cursor(~/.cursor/mcp.json)、Claude Desktop(claude_desktop_config.json)等:

{ "mcpServers": { "pitroom": { "command": "pitroom", "args": ["mcp"] } } }

每个工具都会运行对应的 pitroom 命令,因此 CLI 的所有规则均原样适用(权限配置、git 防护、隔离、读取快照)。运行最多等待 waitSeconds 秒(默认值为 50),之后会返回“仍在运行”状态以及对应的 ID,供 pitroom_wait 使用;请将等待时间设为低于客户端的工具超时时间。服务会在启动时所在的目录中运行:stdio 模式下使用客户端所在的目录,或使用 -d DIR 指定的目录(Claude Desktop 会从其他位置启动,因此请为它设置 "args": ["mcp", "-d", "/path/to/project"]);工具的 dir 参数则可为每次调用指定其他目录。

关于 MCP 服务的更多信息:进度、取消、资源、提示词、HTTP - **实时视图。** 如果运行在几秒后仍未完成,系统会启动仪表板(如果尚未运行),并在结果中提供其地址:“每次运行的实时视图:http://127.0.0.1:7878/”。服务说明会告诉 Agent 在应用自己的浏览器窗格中打开该地址(Claude Code 和 Codex 应用都有浏览器窗格),否则就将地址提供给用户;不会打开系统浏览器。快速完成的运行不会启动仪表板。在配置中设置 `"mcpDash": false`(或设置 `PITROOM_MCP_DASH=0`)即可关闭此功能。 - **进度。** 调用等待运行期间,如果客户端发送了进度令牌,每隔几秒就会收到一条 `notifications/progress`(“running · read · 12s · 3 steps, 2 tool calls · last: …”);收到进度时会重置超时的客户端(协议允许这样做,但并非所有客户端都支持)不会因长时间运行而放弃。**取消** `pitroom_run`、`pitroom_review` 或 `pitroom_audit` 调用会停止该调用启动的运行(取消 `pitroom_wait` 只会停止等待)。 - **资源。** 最新运行会列为 `pitroom://run/`(报告);对于更改了文件的运行,还会列为 `pitroom://run//patch`(确切差异),以便客户端将其附加到对话中。客户端可以**订阅**某次运行(`resources/subscribe`),并在运行状态变化时收到通知(`notifications/resources/updated`);每当最新运行变化时,所有客户端都会收到通知(`notifications/resources/list_changed`),因此无需轮询;通过 HTTP 时,这些通知会在会话的事件流(GET)中到达。 - **提示词。** `research`、`implement`、`review` 和 `crew` 会说明如何针对相应任务使用 Pitroom(在 Claude Code 中,它们显示为 `/mcp__pitroom__research`、……);每项技能也都是同名提示词(`using-pitroom`、`pitroom-research`、……),因此没有技能的客户端也能获得相同的指导。服务说明会告知 Agent 将技能与工具配合使用。 - **不止运行:** `pitroom_run` 接受 `tasks`(并行执行的独立任务,每个任务一个工作者)和 `continue`(在同一工作者会话中继续后续操作);`pitroom_info` 会按 `topic` 提供信息,但不会更改任何内容:`runs`、`history`(再次提问前查找先前的回答)、`stats` 和 `models`(选择工作者)、`savings`、`cooldown`、`config`、`doctor`;搭配 `cooldowns` 使用 `pitroom_stop` 会重试受到速率限制的模型。 - **通过 HTTP 使用。** `pitroom mcp --http [--port N]`(默认端口为 7117)会在 `http://127.0.0.1:7117/mcp` 提供相同的工具,供通过 URL 连接的客户端使用,例如 `claude mcp add --transport http pitroom http://127.0.0.1:7117/mcp --header "Authorization: Bearer $(cat ~/.local/state/pitroom/mcp-token)"`(启动时会打印此命令)。这是一个本地服务:它只监听 127.0.0.1,需要 Bearer 令牌(首次启动时生成,保存在 `/mcp-token` 中,并仅对所有者开放权限;也可以通过 `PITROOM_MCP_TOKEN` 设置),且会拒绝非本地的 Host 或 Origin,因此网页无法使用它。任何持有令牌的人都能以你的身份运行工作者,因此请妥善保密。它会在启动时所在的目录中运行(启动时会打印该目录;如需使用其他目录,请指定 `-d DIR`)。每个客户端都有自己的会话;请求进度的调用会以事件流的形式得到响应。结束会话或停止服务只会结束等待,不会停止运行:请使用 `pitroom_wait` 或 CLI 收集结果。`pitroom install --mcp` 会注册 stdio 命令,无需令牌,也无需运行中的进程。

任何其他 Agent(普通 shell)或直接使用 CLI

npm i -g pitroom
pitroom install
路径你将获得
Claude Code 插件14 个技能、介绍 Pitroom 的会话启动钩子,以及每次执行 pitroom 命令后显示的卡片。
Gemini CLI 扩展14 个技能,以及介绍 Pitroom 的简短上下文文件(Gemini 会要求你确认该扩展)。Gemini CLI 也可以作为 worker 使用,这是另一种用法:请参阅Workers。
MCP 服务上述九个工具,适用于任何能够使用 MCP 服务的 Agent。不包含技能:工具会自我说明,服务会告知 Agent 如何启动。
Codex 插件14 个技能、介绍 Pitroom 的会话启动钩子(因此即使 Codex 因安装了许多技能而丢弃技能描述,它也能识别 Pitroom),以及每次执行 pitroom 命令后显示的卡片。Codex 会要求你信任该插件的钩子一次。这些钩子会调用 pitroom,它来自 npm(npm i -g pitroom)。
npm + pitroom installCLI,以及链接到 ~/.agents/skills 和 ~/.claude/skills 的技能。

选择一种方式即可,不要同时使用多种:如果技能被重复加载,doctor 会发出警告。插件本身不会将 pitroom 加入 PATH,因此如果你想自行运行它(watch、models、savings、状态行),也请通过 npm 安装。

2. 检查设置
pitroom doctor --probe

它会检查 worker CLI、模型、权限和技能,并运行一轮实时往返。

3. 开始使用

Pitroom 是一个工具箱,而不是操作流程:Agent 会在有帮助时使用它,或者你也可以明确提出要求:

使用 pitroom 梳理会话的创建和失效方式,然后提出修复方案。 将此任务拆分为一个 pitroom 小组:检查身份验证、计费和上传功能是否缺少输入验证。

或者自行启动一个 worker 并查看其回执:

pitroom "Which files read the session cookie? Cite file:line."
pitroom -W gemini:gemini-3.8-flash "…"   # the same on another worker (see Workers below)
pitroom savings          # what all your runs saved so far
pitroom models           # what each worker offers, what it costs you, what it used
更新和卸载
# update
claude plugin update pitroom@pitroom
codex plugin marketplace upgrade pitroom
npm i -g pitroom@latest

# uninstall
claude plugin uninstall pitroom@pitroom
codex plugin remove pitroom@pitroom
pitroom uninstall && npm rm -g pitroom

模式

标志用途工作树状态
read(默认)调研、定位代码、审查不受影响;编辑工具不可用
isolate-i想先审查再应用的代码更改在执行 pitroom apply 前不受影响
write-w快速就地编辑立即编辑;pitroom revert 可精确撤销

读取快照。 如果目录中有看起来像机密的文件,read 运行会读取项目当前状态的快照(包括未提交和未跟踪的文件),但不包含这些机密文件和被 git 忽略的文件。快照由 git 对象生成,每种状态只保留一份,供该状态下的所有 read 运行共享(二十个 worker,共用一个快照),并在三天后或执行 pitroom clean 时清理。不会复制任何内容回来:read 运行没有内容需要落地。快照文件为只读,worker 引用的路径会映射回项目中的路径。如果没有看起来像机密的文件,则不会有任何变化:worker 会就地运行。--in-place(或配置中的 "readIn": "project")会直接读取目录本身,例如适用于需要构建输出的任务;"readIn": "snapshot" 则始终使用快照。

答案缓存。 对相同代码提出相同的 read 问题,会立即返回之前的答案,不会运行 worker:pitroom ⟲ cached answer · the same question on the same code as run … · no worker ran。“相同代码”指完全一致:提交以及每个工作文件,包括未提交和未跟踪的文件(被 git 忽略的文件不算代码),因此任何编辑都会使其成为一个新问题。只有经验证可靠的答案才会复用(运行已完成、每条文件:行号引用均已核实、没有审计提出异议),且只保留 7 天(配置中的 "cacheDays",设为 0 可关闭,或使用 PITROOM_CACHE_DAYS)。后续追问、网页运行、计划任务、审查、审计、--verify 运行、并行工作(crew)和更改都不会使用缓存作答;--fresh 则会照常运行 worker(之后会复用这次运行的答案)。“相同代码”不包括:被 git 忽略的文件(构建输出、已安装的依赖项)以及作答的 worker 或模型;如果问题取决于这些内容,请使用 --fresh。

pitroom run "Find every place we build SQL strings by hand; file:line and risk"
pitroom run -i --link node_modules --verify "npm test" "Fix the off-by-one in paginate() and add a test"
pitroom run -w "Rename getUserById to findUserById in src/ and fix imports"
pitroom run --continue last "Now handle the empty-page case too"

长时间运行的任务:--bg 会立即返回;pitroom wait <id> 最多阻塞 9 分钟(专为工具限时 10 分钟的 Agent 设计;退出代码 75 表示“再次调用 wait”)。


工作流

Pitroom 提供一套完整的开发方法论,以技能的形式呈现,并根据 superpowers 改编,让它的子 Agent 成为低成本的执行者:你的 Agent 会与你一起头脑风暴并制定计划,然后按任务逐项执行计划,由执行者负责敲代码,另一个模型负责审查。

工作流逐步说明

工作流:先进行头脑风暴,然后制定计划并为每项任务分配一个执行者层级;接着,对于每项任务,执行者在隔离副本中实现,另一个模型进行审查,反复修复直至获批;然后你的 Agent 应用更改、测试并提交;最后进行整个分支的审查并完成收尾。

步骤技能命令
设计pitroom-brainstorming将规范写入 docs/pitroom/specs/
计划pitroom-writing-plans将计划写入 docs/pitroom/plans/,并为每项任务指定执行者层级
实现pitroom-driven-developmentpitroom run -i --plan PLAN --step N
审查pitroom-reviewpitroom review <run>(由另一个模型执行只读审查)
修复pitroom-receiving-reviewpitroom run --continue <run> "…"(重新审查时只会看到修复内容)
合入pitroom-driven-developmentpitroom apply <run>,运行你的测试,并提交
分支审查pitroom-reviewpitroom review --range main..HEAD --plan PLAN
收尾pitroom-finishing合并、创建拉取请求或保留更改:由你选择,绝不自动执行

审查包包含待审查的差异及其上下文(前后各 10 行),审查者的 CLI 会将其发送给该执行者对应的模型提供方。Pitroom 不会过滤内容:已提交到审查范围内的机密也会随之发送。

层级用于将计划任务映射到执行者:"tiers": {"cheap": "opencode", "standard": "codex", "capable": "claude"}。pitroom plan status PLAN 会根据运行记录重建计划进度(即使上下文压缩后仍然有效),而 pitroom plan note 会将完成情况和裁定记录在仓库之外。


审核

Pitroom 会检查工作器引用的每个 path:line,这只能证明该行存在,不能证明关于它的说法属实。审核会让第二个工作器根据你的项目核实答案中的关键说法,并给出 AGREE、PARTIAL 或 DISAGREE,同时指出有争议的说法。

pitroom audit <run>            # now: re-check one read run (-W picks the auditor)
pitroom run --audit "…"        # re-check this run's answer when it finishes (--no-audit skips it)

或者在配置中设置 "audit": 0.1(或设置 PITROOM_AUDIT=0.1),让大约十分之一的读取运行在后台接受审核,无需你的 Agent 提出请求。同一次运行始终会被纳入或排除在抽样之外。

费用、限制和判定结果的显示位置
  • **费用:**默认关闭。审核会运行审核器进行一次读取,因此费用约为工作器自身令牌用量乘以审核率,使用 audit 层级(否则使用 cheap,即如果你的低价层级是免费模型,就使用免费模型)。它绝不会延迟运行或导致运行失败。
  • **审核对象:**审核器绝不会是给出答案的工作器和模型;如果没有配置其他工作器,就不会进行任何审核(pitroom doctor 会说明这一点)。只有读取运行会接受审核:更改会使用 pitroom review。
  • **显示位置:**答案卡片和 pitroom show 会显示判定结果及有争议的说法;统计信息标签页会按工作器统计已确认的审核答案数量。审核不计为运行,也不会保存任何内容。
  • **抽样,而非保证。**审核器也是模型:它可能存在相同的盲点,而且少数几次审核不足以说明工作器的表现。将 DISAGREE 视为需要查看的理由,并将 AGREE 视为又一条参考信号。

更正("auditFix": true,或 PITROOM_AUDIT_FIX=1;默认关闭)。如果审核结果为 PARTIAL 或 DISAGREE,并指出有争议的说法,答案会返回给给出答案的工作器:在它自己的会话中跟进(会话仍保留它读取的内容),附上有争议的说法,让它对照文件核查(审核器也可能出错),然后重新给出完整答案,并在 OPEN ISSUES 下说明它接受了哪些说法。只进行一轮:更正绝不会再次被退回。已审核运行的卡片和 pitroom show 会注明更正运行(── fix: …)。这需要工作器能够继续会话,所有内置工作器都支持此功能。

重点抽样("auditFocus": true,或 PITROOM_AUDIT_FOCUS=1;默认关闭)。设置审核率后,抽样会更倾向于审核容易发现问题的情况:对于要求列出所有内容、给出列表或计数的问题,审核率会翻倍;对于已审核答案中确认率低于一半的工作器(30 天内至少审核 3 次),审核率会再次翻倍;对于最近 5 次或更多答案全部得到确认的工作器,审核率会减半。--audit 和 --no-audit 始终不会改变;运行记录会保存其获得的概率及原因。

评测

在你自己的代码上运行自己的基准测试:提出答案已知的问题,交给你想比较的工作器,并进行评分。

pitroom eval questions.json -W opencode -W codex:gpt-6.1-sol    # every question to every worker, as one group
pitroom eval questions.json --json                               # the same as JSON: truths, rows, a summary per worker
{
  "questions": [
    { "id": "def", "kind": "definition", "task": "Which file and line define `export function loadConfig(`? The SUMMARY line must be only path:line.", "truth": { "grep": "^export function loadConfig\\(", "regex": true, "dir": "src" } },
    { "id": "count", "kind": "count", "task": "How many files under src/ contain the word effective? The SUMMARY line must be only the number.", "truth": { "grep": "effective", "word": true, "dir": "src" } },
    { "id": "list", "kind": "set", "task": "List every file under src/ that mentions node:sqlite. The SUMMARY line must be only the paths, separated by commas.", "truth": ["src/cli/commands.ts", "src/core/history.ts"] }
  ]
}

标准答案会被记录下来("path:line"、一个数字或路径列表),或在评测开始时通过 git grep 查找(grep,以及可选的 dir、word、regex、exclude),因此会随着代码变化而保持准确。评分方式与多仓库基准测试一致:精确匹配 path:line 的定义得 1 分,文件正确得 0.5 分;计数只有完全匹配才得分;列表按其列出的路径计算 F1 分数(取自 SUMMARY,否则取自 DETAILS)。每个工作器独立作答:不使用回退、审核或缓存答案。这些运行属于普通运行组,因此 pitroom watch -g、仪表板和历史记录都会显示它们。

团队

在这个仓库上运行的真实团队:使用免费的 OpenCode Zen 模型,同时回答四个问题:

pitroom crew -g v04-demo \
  "Where does Pitroom enforce the maxParallel queue, and how does a waiting run react to pitroom stop? Cite file:line." \
  "How does the git guard shim resolve git aliases? Cite file:line." \
  "Which fields of OpenCode v2 events does the parser read for token usage, refused tool calls and errors? Cite file:line." \
  "How does pitroom apply -g decide which patches to apply and in what order? Cite file:line."
pitroom watch -g v04-demo --json   # what the primary agent follows, one line per change:
团队输出的内容:Agent 遵循的流和状态表
{"event":"started","run":"20260930-102812-a65d","mode":"read","task":"Where does Pitroom enforce the maxParallel queue, and how d…"}
{"event":"progress","run":"20260930-102812-a65d","steps":3,"tools":4,"last":"grep SIGINT|SIGTERM|stop.*queued|stopped.*queued"}
{"event":"done","run":"20260930-102812-a563","time":"21s","worker":"opencode (default model)","summary":"The shim resolves `alias.<sub>` via `real git config --get` in a loop …","refs":"5/5"}
{"event":"all-done","runs":4,"ok":4,"failed":0}
$ pitroom status -g v04-demo
RUN                   STATE  MODE  TIME  STEPS  WORKER                    NOW / RESULT
20260930-102812-0c0d  done   read  30s   5      opencode (default model)  Parser `src/backends/opencode/events.ts` reads …
20260930-102812-7642  done   read  27s   5      opencode (default model)  `pitroom apply -g NAME` applies finished isolat…
20260930-102812-a563  done   read  21s   2      opencode (default model)  The shim resolves `alias.<sub>` via `real git c…
20260930-102812-a65d  done   read  39s   7      opencode (default model)  maxParallel is enforced by file-based slots (`s…

用户可以通过 pitroom watch -g NAME 实时查看同一张表;pitroom wait -g NAME --brief 会为每位工作者打印一行,pitroom show <run> 则会显示完整答案。

对于变更,pitroom crew -i … 会为每位工作者提供当前状态的独立副本,而 pitroom apply -g NAME 会按顺序应用补丁,遇到第一个冲突时停止。最多同时运行 maxParallel 位工作者(默认 20,最多 30 位),其余工作者排队;每个仓库一次只允许一个 --write 运行。pitroom stop -g NAME 会停止正在运行和排队的工作者。


技能

14 项技能
技能Agent 使用它来
using-pitroom了解 Pitroom 提供什么,以及何时值得使用(由插件在会话开始时注入;可选)
pitroom-brainstorming在编写任何代码之前,将想法转化为已批准的设计
pitroom-writing-plans编写逐项任务计划,并为每项任务指定工作者级别
pitroom-driven-development执行计划:每项任务分配一位工作者,由另一个模型审查,进行修复循环、应用并提交
pitroom-worktrees为工作创建独立分支
pitroom-tdd先编写测试,既适用于自身,也适用于它向工作者说明的任务
pitroom-debugging查找根本原因,并让工作者收集证据
pitroom-verification在声称任何工作已完成之前运行检查
pitroom-review让另一个模型审查变更、修复轮次、分支或 PR
pitroom-receiving-review以严谨的技术态度评估审查意见
pitroom-finishing按用户选择合并、创建 PR 或保留分支
pitroom-research通过只读工作者查找、梳理或讲解代码
pitroom-implement在独立副本中完成一次性变更
pitroom-crew将独立工作拆分给并行工作者,并合并结果

命令

所有命令和退出代码
pitroom run [-r|-w|-i] [-W WORKER] [-m MODEL] [-d DIR] [-f FILE]… [-t 30m] [--verify CMD] [--link a,b] [--bg] "task"
pitroom run --continue <run|last> "follow-up"
pitroom crew [-i] [-g NAME] "task 1" "task 2" …   (or --task-file with --- separators)
pitroom run -i --plan PLAN --step N [--tier T] ["notes"]
pitroom review [run | --range A..B [--plan PLAN]] [--tier T | -W T] [--bg]
pitroom audit RUN [-W worker]
pitroom eval QUESTIONS.json [-W worker]… [--json]   your questions with known answers, scored per worker
pitroom mcp [-d DIR] [--http [--port N]]   # serve Pitroom as MCP tools on stdio, or over HTTP on 127.0.0.1 (bearer token)
pitroom cooldown [--clear]
pitroom plan status PLAN [--json] · pitroom plan note PLAN "Task N: …"
pitroom status|wait|watch [run… | -g NAME]        wait: --any --brief --timeout · watch: --json|--brief --interval
pitroom dash [--detach] [--port N] [--open] [--stop]   a live page of the runs on 127.0.0.1
pitroom history [TEXT] [--model M] [--state S] [--since 30d] [--limit N] [--json]   finished runs, searchable
pitroom history stats [--since 30d] · pitroom history import   per worker and model · take in older runs
pitroom show [run]                                --patch --events --full --json
pitroom apply [run | -g NAME] · pitroom discard|revert [run] · pitroom stop [run | -g NAME]
pitroom ls [--running] [-g NAME] · pitroom clean [--days 14] [--yes]
pitroom savings [--since 7d|30d|all] [--models] [--card file.svg] [--badge]
pitroom models [worker] [--all] [--json]      models, effort levels, your costs, your usage
pitroom statusline [--then CMD] · pitroom hook-card
pitroom doctor [--probe] · pitroom config · pitroom init [--model ID] [--fallback A,B] [--yes] [--force] · pitroom install [--copy] [--force] [--mcp [--client A,B] [--no-skills] [--dry-run]] · pitroom uninstall

退出代码:0 正常 · 1 工作者失败 · 2 用法错误 · 3 已拒绝/设置失败 · 4 超时 · 5 违反只读限制 · 6 验证失败 · 75 仍在运行。

历史记录
搜索历史记录

每次已完成的运行也会写入 SQLite 数据库(Pitroom 状态目录中的 history.db;使用 Node 内置的 node:sqlite,无需安装任何内容)。数据库会保留任务、工作者和模型、时间、令牌、节省量、工作者执行的步骤、答案和差异,并支持搜索:

pitroom history "login bug"            # full-text search over the task, the answer and the steps
pitroom history --state problem --since 7d
pitroom history stats --since 30d      # runs, success rate, average time and tokens per worker and model

运行期间,原始事件流会保存为普通文件(这是最简单且能在崩溃后保留内容的方式)。运行结束后,事件流会压缩;只有未成功的运行才会保留 stderr 日志。pitroom clean 会移除旧运行目录,但历史记录会保留这些记录:pitroom show <run> 仍会打印报告、步骤和补丁。历史记录功能出现之前的运行会由 pitroom history import 导入(首次运行 pitroom history 和 pitroom dash 时也会执行导入)。文件仍是数据来源:可以删除数据库,再通过 history import 根据仍保存在磁盘上的运行记录重建数据库。

### 查看 Pitroom 的运行情况
状态行和钩子卡片(以及应用中的显示方式)

有两项设置可以显示每次委派,无论 Agent 是否提及。状态行会显示正在运行的工作进程和本周节省的开销(--then 会将你自己的状态行放在最前面);每次 Agent 运行 pitroom 命令后,每个阶段都会显示一张卡片(已启动、已完成并显示结果、已应用)。插件会自行注册卡片钩子;使用 pitroom install 时,将两项都添加到 ~/.claude/settings.json:

{
  "statusLine": { "type": "command", "command": "pitroom statusline --then 'your-own-statusline'" },
  "hooks": {
    "PostToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "pitroom hook-card", "timeout": 10 }] }]
  }
}

Claude Code 和 Codex 应用都不会显示钩子消息或状态行。对于它们,有两种无需设置的方法:

  • pitroom dash --detach 会打印实时仪表板的地址,其中有三个标签页:实时(将每个正在运行和最近运行的任务显示为动画卡片;点击卡片即可查看任务、工作进程逐步执行的操作、结果、差异和详细信息)、历史记录(搜索和筛选 Pitroom 运行过的所有任务;每次运行都会以相同的卡片形式打开)和 统计数据(按工作进程和模型统计成功率、耗时、令牌用量和节省的开销)。仪表板为只读,仅监听 127.0.0.1,无请求一小时后会自动停止(pitroom dash --stop 可提前停止)。可在浏览器或应用自带的浏览器窗格中打开。技能会指示 Agent 在后台运行工作进程时启动仪表板并向你提供地址。
  • pitroom watch -g NAME --brief 会在工作进程启动时打印一行卡片信息,在工作进程结束时再打印一行。在 Claude Code 中,Agent 会通过 Monitor 工具运行它,信息会显示在应用中;在 Codex 中,命令的输出区块会随着运行逐步填充。

工作原理

一次运行的流程:主 Agent 将任务委派给 Pitroom CLI,后者以读取、隔离或写入模式启动一个工作进程 CLI;事件、答案、精确差异和回执随后返回。

Pitroom 为每个工作进程处理的无头模式问题

Pitroom 会为每个工作进程处理以下问题:opencode run 会因 stdin 管道保持打开而一直阻塞;ask 权限会导致无头运行停滞;默认输出包含 ANSI 转义序列和横幅;在 OpenCode v2 中,普通的 run 会连接到共享后台服务,因此不会应用每次运行的权限设置和 git 防护。Pitroom 会关闭 stdin,使用仅允许/拒绝的配置文件,解析 --format json,并始终运行私有的 --standalone 服务器。


工作器

工作器由目标指定:backend[:model]。

pitroom run "…"                                          # preferred worker (config "worker", default opencode)
pitroom run -W opencode:opencode/space-bunny-free "…"    # a specific backend and model
pitroom run -W 'codex:#low' "…"                          # the model from config "models" (not Codex's default), low reasoning effort
pitroom run --effort high "…"                           # model#level (Codex, Claude Code, OpenCode; Gemini CLI has no effort option)
pitroom run -W claude:haiku "…"                          # Claude Code on a cheap model
pitroom run -W gemini:gemini-3.8-flash "…"               # Gemini CLI (beta; needs a Google AI Studio API key)
pitroom run -W qwen:qwen3-coder-plus "…"                 # Qwen Code (beta; your provider from ~/.qwen/settings.json)
pitroom run -W kilo:kilo/<model> "…"                      # Kilo Code's CLI (beta; any model from `kilo models`)
pitroom run -i -W antigravity "…"                         # Antigravity CLI (beta; your Google account, models from `agy models`)
pitroom run -m nvidia/z-ai/glm-5.3 "…"                   # another model on the preferred worker
工作器状态只读由谁强制执行收据中的费用备注
OpenCode (v2+)✅每次运行的权限规则已报告每次运行都会启动私有的 --standalone 服务
Codex CLI✅操作系统沙箱(read-only / workspace-write)仅令牌执行 codex login;工作器会忽略你的 ~/.codex/config.toml(其中的 MCP 服务在沙箱外运行);模型支持 #effort
Claude Code✅工具允许列表(--restricted --safe-mode、dontAsk)已报告执行 claude auth login;它通常默认使用 Opus,因此建议使用 -W claude:haiku
Gemini CLIbeta--approval-mode plan 加上 Pitroom 的策略规则仅令牌使用 Google AI Studio 的 API 密钥(通过 gemini 登录或设置 GEMINI_API_KEY;Google 会拒绝使用 Google 账号登录);工作器在私有的 Gemini 主目录中运行,不会使用你的钩子、MCP 服务和技能;Gemini 0.62 不会强制执行机密文件规则,但读取包含疑似机密文件的运行会读取不含这些文件的干净快照;请固定模型,例如 -W gemini:gemini-3.8-flash;--continue 可用(按会话 ID;参见说明)
Qwen Codebeta--approval-mode plan;仅在工作目录内编辑,其他位置的编辑会被拒绝仅令牌已使用脚本模型针对 Qwen Code 0.25 进行检查,尚未使用真实提供方进行检查;使用你在 ~/.qwen/settings.json 中的登录信息和模型(任何兼容 OpenAI 的提供方、DashScope、本地模型);--safe-mode 会阻止工作器使用你的 QWEN.md、钩子、技能和 MCP 服务,并阻止 CLI 写入本次运行的记忆;如有要求,会读取 .env,因此读取包含疑似机密文件的运行会读取干净快照;参见说明
Kilo Codebeta每次运行的权限规则(OpenCode 的配置)已报告@kilocode/cli(OpenCode 的一个分支)的 CLI:通过 KILO_CONFIG_CONTENT 使用相同的 pitroom-read/pitroom-write 配置,并沿用你的登录信息和提供方;工作器使用私有状态文件夹,因此不会附加到正在运行的 kilo daemon(它会忽略这些配置);已使用脚本模型针对 Kilo 7.8.8 进行检查,尚未使用真实提供方进行检查;参见说明
Antigravity CLIbeta每次只读运行都会使用其自身的只读快照(agy 的无头运行没有只读模式)仅令牌已针对 agy 1.3.5(macOS)进行检查;修改时使用 -i,而不是 -w(其拒绝规则是模式,在 git 防护和隔离副本之上再加一层);每个工作区都有独立的主目录(agy 只从 ~/.gemini 读取设置),因此其命令看不到你的点文件;无答案运行(被拒绝的命令可能导致其结束当前轮次且不返回答案,并以状态码 0 退出)会被视为失败;使用你的 Google 账号登录(Gemini CLI 现在会拒绝使用该账号登录);在 agy 的终端沙箱中运行(macOS、Linux);这些工作器无法访问 Web;请提供备用方案,其配额按账号计算;参见说明
模型、费用与工作量
模型、费用和工作量级别

pitroom models 会列出每个工作者提供的内容(Codex 使用自身的模型缓存,Claude Code 使用其别名,OpenCode 使用 opencode models,Gemini CLI 使用内置名称)、每个模型接受的推理力度级别、你设定的费用,以及你自己的运行记录:

worker  model        effort (* default)                 cost  runs  avg tokens  $/run   in use
codex   gpt-6.1-sol  low*/medium/high/xhigh/max/ultra   2     20    174k        -       tier standard
codex   gpt-6-sol    low/medium*/high/xhigh/max/ultra   1     1     24k         -       -
claude  haiku        low/medium/high/xhigh/max          ?     -     -           -       -

Pitroom 不知道任何供应商的价格,除非你启用 priceFeed(见配置说明),否则也不会获取价格;因此,费用由你填写:在配置中设置 "costs": {"codex:gpt-6-sol": 1, "codex:gpt-6.1-sol": 2},单位不限(这里只会进行比较;Codex 和 Gemini 收据中的美元价格需填在 workerPrices 中,见配置说明)。随后,pitroom doctor 会打印正在使用的模型费用,并在你为同一工作者中更便宜的模型定价时提示你。只指定力度的目标(codex:#low)会使用 models 中的模型;如果 Codex 或 Claude Code 工作者没有固定模型,则会收到警告,因为它会使用供应商自己的默认模型,而该模型可能会变更且费用更高。--effort LEVEL 可为单次运行设置级别;你的 Agent 会从 pitroom models 中选择模型和级别(符合要求的最便宜选项:查询使用 low,普通更改使用 medium,审查使用 high)。

备用选项可以跨后端(例如 "fallback": ["codex:#low", "opencode"]):遇到速率限制、已退出登录或缺少模型的工作者会将任务交给下一个工作者。后续操作(--continue)始终留在拥有该会话的工作者上。编写适配器:参见 docs/backends.md。如果模型提示“速率受限”(每日配额已用完或供应商过载),Pitroom 会在提示给出的时长内记住此状态,或进行估算;只要还有备用选项,后续运行就会跳过它,避免每次都等待它失败。pitroom cooldown 会列出被跳过的模型及跳过截止时间,--clear 会重新尝试,doctor 也会显示这些信息。


配置

环境变量
Env默认值
PITROOM_WORKERopencode首选工作者目标:backend[:model]
PITROOM_MODEL工作者的默认模型首选工作者使用的模型
PITROOM_FALLBACK无以逗号分隔的备用目标,在模型或供应商出错时切换使用
PITROOM_TIMEOUT30m单次运行的超时时间
PITROOM_MAX_PARALLEL20同时运行的工作者数量(最多 30);超出的任务会排队
PITROOM_PRIMARYsonnet用于节省费用估算的价格预设:sonnet、opus、haiku、gpt-5
PITROOM_PRICE自定义主模型价格,单位为每 1M 个 token 的美元价格:"in,out[,cachedIn]"
PITROOM_HOME~/.local/state/pitroom运行记录和账本的存放位置
PITROOM_NO_SECRET_WARNING设为 1 可关闭关于工作者目录中 .env 文件和私钥的警告
PITROOM_<WORKER>_BIN位于 PATH 中工作者 CLI 的路径,例如 PITROOM_OPENCODE_BIN

也可以将默认值写入 ~/.config/pitroom/config.json(命令行标志和环境变量仍具有更高优先级);pitroom config 会显示每个生效值及其来源。pitroom init 会根据你安装的工作者 CLI 和 OpenCode 模型建议初始配置(由免费模型组成的备用链;安装了多个 CLI 时会建议使用不同层级),只有指定 --yes 时才会写入;它绝不会替你选择模型。对于未指定模型的目标(-W codex、"codex" 备用项),models 会为每个工作者指定默认模型;目标中指定的模型或 -m 仍具有优先级。tiers 用于为 --tier 以及计划任务中的 **Worker:** 行指定工作者:

config.json:示例及各项设置说明
{
  "worker": "opencode",
  "fallback": ["opencode:opencode/space-bunny-free", "codex"],
  "models": { "codex": "gpt-6.1-sol", "claude": "claude-sonnet-5-5" },
  "costs": { "codex:gpt-6-sol": 1, "codex:gpt-6.1-sol": 2 },
  "tiers": { "cheap": "opencode", "standard": "codex", "capable": "claude", "review": "opencode:opencode/space-bunny-free" },
  "timeout": "20m",
  "primary": "opus",
  "link": ["node_modules"],
  "maxParallel": 20,
  "audit": 0.1
}
- `worker` 和 `fallback`:未指定执行者时由谁运行任务,以及任务失败时由谁接手;`models`:目标未指定模型时各 worker 使用的模型。 - `tiers`:`cheap`、`standard` 和 `capable` 指定计划任务和 `--tier` 使用的 worker;可选的 `review` tier 指定谁来审查一次运行(默认由实现者以外的另一位 worker 审查,优先使用 `standard`)。 - `audit`:已完成的读取运行在后台重新检查的概率(0 到 1,默认 0 = 关闭),参见 [审计](#audits)。由 `audit` tier 指定审查者(否则使用 `cheap`)。 - `costs`:各 `worker:model` 的相对成本,仅彼此比较;`maxParallel`:同时运行的 worker 数量(默认 20,最多 30)。 - `workerPrices`:对于不报告成本的 CLI(Codex、Gemini),指定 worker 模型每 100 万个 token 的 USD 价格:`"workerPrices": {"codex:gpt-6.1-sol": "1.25,10,0.125"}` 表示“输入、输出[,缓存输入]”,键为 `backend:model`(实际运行的模型,否则为你指定的模型),也可以只用 `backend`。未设置时,收据会显示 `worker cost n/a`,且在节省额计算中将该次运行视为免费,因此会高估节省额(`pitroom doctor` 会发出警告);设置后,成本会根据 token 数估算,显示为 `~$0.016 (estimated from your workerPrices)`,并记入账本、历史记录和仪表板,同时从节省额中扣除。Pitroom 不知道供应商的价格,也不会获取价格,因此这里的数字由你提供。 - `priceFeed`:保持价格目录为最新(默认 `false`;`PITROOM_PRICE_FEED=1`)。该目录采用 OpenCode 也会读取的公开 [models.dev](https://models.dev) 列表(约 8,000 个模型的每 100 万个 token 的 USD 价格):每天最多获取一次(`priceFeedHours`,默认 24),在一次运行结束后通过后台进程获取,运行等待期间绝不获取。Pitroom 会对该文件发送普通的 `GET` 请求(使用 `priceFeedUrl` / `PITROOM_PRICE_FEED_URL` 指定镜像,使用 `priceFeedHours` / `PITROOM_PRICE_FEED_HOURS` 设置间隔),并在其状态目录中保存一份精简副本(约 400 KB);刷新失败时会保留旧副本,并且一小时内不会重试。这只是备用选项:优先使用你的 `workerPrices`,收据会注明使用了哪种价格(`estimated from models.dev prices`)。启用后,`"primary": ""` 可指定目录中的任意模型用于节省额比较(`"primary": "claude-opus-5-5"`);未启用时只能使用四种预设值。`pitroom prices` 会显示价格源、目录以及当前使用的各 worker 的价格;`pitroom prices --refresh` 会立即获取。发送内容见:[PRIVACY.md](PRIVACY.md)。列出的价格是 API 标价:使用订阅的 worker(通过 ChatGPT 账户使用 Codex)无需支付这些费用,因此对这类 worker,估算值表示相同 token 数通过 API 使用时的费用。 - `notify`:后台运行的任务(`--bg`、一个 crew、一次 MCP 调用)结束时发送桌面通知,让你无需一直关注长任务(默认 `false`;`PITROOM_NOTIFY=1`)。成功但耗时少于 `notifyAfter` 秒的运行(默认 15;`PITROOM_NOTIFY_AFTER`)以及审计不会发送通知(失败总会通知);crew 会在最后一次运行结束时整体判断,并只通知一次。被直接终止的 worker 进程无法发送通知。内置通知器在 macOS 上使用 `osascript`,在 Linux 上使用 `notify-send`(暂不支持 Windows);`notifyCommand` 则会在 shell 中运行你提供的命令,通知文本存放在 `PITROOM_NOTIFY_TITLE` 和 `PITROOM_NOTIFY_BODY` 中(以及 `PITROOM_NOTIFY_RUN`、`PITROOM_NOTIFY_STATE`):例如 `"notifyCommand": "curl -s -d \"$PITROOM_NOTIFY_BODY\" ntfy.sh/my-topic"`。 - `mcpDash`:MCP 客户端启动的运行如果几秒后仍未结束,是否也启动仪表板并返回其地址(默认 `true`;设置 `PITROOM_MCP_DASH=0` 或 `"mcpDash": false` 可关闭),参见 [MCP 服务](#1-install-pick-your-agent)。 - `auditFix` 和 `auditFocus`:将有争议的答案发回给对应 worker 进行一次修正,并让审计样本偏向列表和计数问题以及有争议的 worker(两者默认均为 `false`;`PITROOM_AUDIT_FIX`、`PITROOM_AUDIT_FOCUS`),参见 [审计](#audits)。 - `budgetDaily`:worker 每天可产生的成本上限,以 USD 计(采用其 CLI 报告的金额,或根据 `workerPrices` 和价格目录估算;包括审计和修正)。达到预算的 80% 后,运行会发出警告;预算用尽后,只有免费 worker 仍会运行(价格为 `0`,或者某个 worker 最近的运行成本全部恰好为 0)。如果运行链中没有免费 worker,则会被拒绝(退出码 3);审计和修正也不会启动。尚未结束的运行按目前已产生的成本计入;同一时刻启动的运行则从各自首个已完成步骤开始计入,因此一个 crew 结束当天时,成本仍可能略微超出预算。`0` 表示只允许使用免费 worker。默认:不设预算(`PITROOM_BUDGET_DAILY`)。 - `rankWorkers`:根据 worker 最近 30 天的记录,对 worker 及其备用者排序:以成功结束的运行占比(不包括速率限制)乘以经审计且确认无误的答案占比(审计数至少为 3)。只有运行次数达到 5 次的 worker 才会调整,并且只会在此类 worker 原先占据的位置之间按 10% 的步长调整;你指定的 worker(`-W`、`-m`、某个 tier)不会重新排序。运行信息会说明首选 worker 何时发生变化(默认 `false`;`PITROOM_RANK_WORKERS=1`)。 - `countRateLimits`:因速率限制或配额而失败的运行,是否计入 `pitroom history stats` 和仪表板的 Stats(默认 `false`:这类运行不会计入运行次数、成功率、耗时和 token 数,而是单独显示为速率受限,因为它们不能说明 worker 的工作表现;设置为 `true` 时会将其计为失败)。

常见问题

我的代码会发送到哪里? 会发送到工作器所用模型的提供商。如果代码是私密的,请让工作器使用本地模型。OpenCode 和 Claude Code 工作器的文件读取工具会拒绝读取 .env 文件和私钥;Codex 工作器没有这类限制,而且 shell 命令仍能读取这些文件,因此请勿将机密放在你委派任务的文件夹中。

“节省金额”是如何计算的? 计算时假设主 Agent 处理的令牌数与工作器处理的差不多,按主 Agent 的标价(PITROOM_PRIMARY / PITROOM_PRICE)计费,再减去工作器的费用和读取报告的费用。这只是估算值,并会标明为估算。

工作器会破坏我的仓库吗? 工作器无法修改 git 历史、引用或暂存区(通过权限配置文件和 git 防护实现),也不能批量删除文件;写入模式下的编辑可用一条命令撤销。但该防护并非操作系统级沙盒:脚本中通过绝对路径调用的 git,以及非 git 工具,都不在其保护范围内。这正是 --isolate 存在的原因:在应用更改之前,不会有任何内容进入你的工作树。

工作器能读取我的 .env 吗? 在只读运行中不能:如果目录中有看起来像机密的文件(.env、prod.env、私钥和密钥库、.netrc、credentials.json、secrets.json),工作器读取的会是项目的干净快照(见下文),这些文件不会出现在快照中,无论工作器 CLI 原本是否允许读取它们。编辑(-i、-w)和审查则有所不同:隔离副本(-i)不会包含被 git 忽略的文件,因此被 git 忽略的 .env 不会放入其中;但未被忽略的 .env 会被复制。Pitroom 检测到这类文件时会发出警告(设置 PITROOM_NO_SECRET_WARNING=1 可关闭警告)。免费模型可能由第三方托管:请勿将真实机密放在你委派任务的内容中。

如果工作器失败了怎么办? Pitroom 会以非零状态码退出,并给出实际原因(例如,默认模型已不存在),你的 Agent 则会自行继续工作。pitroom doctor 可诊断设置问题。


责任

Pitroom 按“原样”提供,遵循 MIT License,并且是一个独立项目:它与 OpenAI、Anthropic、OpenCode 或它能驱动的其他工具均无隶属关系,也不受其认可。

你需对自己的使用方式负责。 你决定委派什么任务、选择哪个模型提供商、授予工作器哪些权限,以及将哪些内容应用到项目中。工作器是 AI Agent,也可能出错:请审查其更改,并在依赖这些更改之前运行测试。Pitroom 的权限配置文件、git 防护和隔离副本可以降低风险,但不能构成抵御蓄意攻击者或恶意仓库的安全边界。请勿将机密放在你委派任务的文件夹中;对于尚未审查的更改,请优先使用隔离模式;并遵守你所连接的工作器 CLI 和模型提供商的条款。哪些内容会发送给提供商,请参阅隐私政策。


参与贡献

欢迎提交问题和拉取请求。请从 CONTRIBUTING.md 开始,其中介绍了设置、测试、dist 包和提交规范。工作器适配器是最容易上手的部分:docs/backends.md。

npm install
npm test          # end-to-end tests against a fake worker CLI + adapter contract tests on recorded real streams
npm run typecheck

安全: 请按照 SECURITY.md 中的说明,通过私下渠道报告漏洞,不要在公开问题中报告。

报告问题 · 查看未解决问题 · 安全政策 · 行为准则


致谢

工作流技能(头脑风暴、规划、工作器驱动开发、审查、调试、TDD、验证、工作树、收尾)改编自 Jesse Vincent 在 MIT License 下发布的 superpowers;相关声明见 THIRD_PARTY_NOTICES.md。

许可证

Pitroom 根据 MIT License 授权。详情请参阅 LICENSE。


Pitroom

为你昂贵的编码 Agent 配备免费维修团队。

由你的 Agent 决策 · 廉价工作者负责输入 · 另一个模型负责审核


快速开始 · 工作流 · 技能 · 编写适配器



不依赖特定模型 · 答案经过验证 · 有据可查,不靠感觉

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。