tomasz-tomczyk/crit
GitHub: tomasz-tomczyk/crit
Crit 是一个本地运行的 AI agent 产出审查工具,让开发者能像 GitHub PR review 一样对 agent 生成的计划、代码 diff 和前端页面进行行内评论并自动反馈给 agent 迭代修复。
Stars: 756 | Forks: 53
# Crit
[](https://github.com/tomasz-tomczyk/crit/actions/workflows/test.yml)
[](https://codecov.io/gh/tomasz-tomczyk/crit)
[](https://github.com/tomasz-tomczyk/crit/releases)
[](https://goreportcard.com/report/github.com/tomasz-tomczyk/crit)
[](LICENSE)
审查并评论计划、代码 diff、前端元素,并直接向你的 agent 发送反馈。

## 针对每种输出类型的自适应 UI
对于 agent 来说,计划和代码都是一样的——它们只是文本,但对我们人类来说,审查生成的计划和审查 Web 应用程序是两种截然不同的活动。
Crit 为每种类型的输出添加了合适的界面,让你能够指出具体哪里有问题,并留下评论供 agent 修复:
- `crit plan.md` 以正确的格式和审查 UI 渲染 Markdown 文件
- `crit` 自动检测 git 更改,并显示带有语法高亮的 diff 以供本地审查。
- `crit http://localhost:3000` 代理你正在运行的应用程序,并为其添加审查界面
- `crit landing.html` 渲染静态 HTML 产物以供审查
一切都可以通过一个单一的二进制文件在本地运行。
## 快速开始
### 1. 安装 Crit 二进制文件
Brew:
```
brew install crit
```
或者从 [GitHub](https://github.com/tomasz-tomczyk/crit/releases/latest) 下载最新版本。
## 2. 与你的 agent 集成
Claude Code:
```
claude plugin marketplace add tomasz-tomczyk/crit
claude plugin install crit@crit
```
Crit 也兼容 Cursor、GitHub Copilot、OpenCode、Codex、Gemini、Qwen、Hermes、Windsurf、Cline、Grok、Aider 和 Pi——任何能够读取文件并运行命令的 agent。请参阅 [`integrations/`](integrations/) 了解所有安装方法和细节。
### 3. 告诉你的 agent 使用 `crit`
大多数集成都包含一个 `/crit` 斜杠命令,可自动执行完整的审查循环。
Agent 启动 Crit,等待你的审查并根据反馈采取行动。
重复此过程,直到你批准更改。
这是一个关于计划审查和分支审查的 2 分钟演示教程:
[](https://www.youtube.com/watch?v=LHwfdvePf5A)
## 用法
推荐的方法是在完成任何工作之后(无论是编写计划还是进行一些代码更改),配合你的 agent 使用 `/crit` 命令。不过,你也可以自己在终端中启动它,并在完成后将提示词粘贴给你的 agent。
```
crit # auto-detect changed files in your repo
crit plan.md # review a specific file
crit plan.md api-spec.md # review multiple files
crit http://localhost:3000 # review a running dev server
crit landing.html # review a static HTML file
```
### 实时模式
`crit live `(或 `crit `)通过 Crit 的审查 UI 代理正在运行的开发服务器。Crit 的 iframe 在与浏览器标签页不同的源或端口上加载应用程序,因此**host 作用域的 session cookie 不会自动共享**。如果直接访问 URL 有效,但 Crit 显示登录页面或 hydration mismatch,请转发上游 cookie:
```
# 一次性
crit live http://localhost:4000/dashboard --cookie "_crit_key=..."
# 可重复(Netscape jar 或原始 Cookie header 行)
crit live http://localhost:4000/dashboard --cookie-file .crit/live-cookies.txt
```
**获取 cookie:** 在浏览器中登录应用程序,然后从 DevTools(Application → Cookies)复制 session cookie,或导出 cookie jar。
**配置**(全局或项目 `.crit.config.json`;项目覆盖全局):
```
{
"live_cookie_file": ".crit/live-cookies.txt"
}
```
相对路径从仓库根目录解析。相比于在行内提交 `live_cookie`,更推荐使用 `.crit/` 下的被 gitignore 忽略的文件。运行 `crit live --help` 查看所有标志。
```
crit status # show review file path and daemon status
crit stats # show lifetime review statistics
crit cleanup # delete stale review files
```
## 功能
### 轮次之间的 diff
在你的 agent 编辑文件后,Crit 会以分屏或统一视图的形式显示发生了什么变化——在顶部导航栏中切换它。
#### 分屏视图

#### 统一视图

### 行内评论:单行和范围
点击行号即可评论。拖动以选择范围。评论会在其引用的行之后以内联方式呈现,就像 GitHub PR 审查一样。

### 编程式评论
AI agent 可以使用 `crit comment` 添加行内审查评论,而无需打开浏览器 UI 或手动构建 JSON:
```
crit comment src/auth.go:42 'Missing null check'
crit comment src/handler.go:15-28 'Error handling issue'
crit comment --output /tmp/reviews src/auth.go:42 'comment' # custom output dir
crit comment --clear # remove the review file
```
评论会被附加到审查文件(存储在 `~/.crit/reviews/`)中,如果文件不存在则会自动创建。运行 `crit status` 可查看当前活动的审查文件路径。
### 分享以进行异步审查
想在交给 agent 之前听听第二种意见?点击 Share 按钮上传你的审查,并获得一个任何人都可以在浏览器中打开的公开链接,无需安装。每个评论者的评论都会按作者进行颜色编码。随时可取消发布。
你也可以直接从 CLI 分享,而无需启动浏览器 UI:
```
crit share plan.md # share files and print the URL
crit share plan.md --qr # also print a QR code in the terminal
crit share plan.md --org acme # share under an organization
crit share plan.md --org acme --visibility unlisted # org share with explicit visibility
crit unpublish # remove the shared review
```
在组织下分享时,可见性默认为 `organization`(仅限成员)。使用 `--visibility` 覆盖(`organization`、`unlisted` 或 `public`)。当你已登录并属于某个组织时,浏览器 UI 会显示一个组织选择器。
分享默认使用 [crit.md](https://crit.md)。要进行自托管,请部署 [`crit-web`](https://github.com/tomasz-tomczyk/crit-web) 并将 `CRIT_SHARE_URL`(或 `--share-url`,或配置中的 `share_url`)指向你的实例。将 `share_url` 设置为 `""` 可完全禁用分享。
如果你自托管的 `crit-web` 位于终端无法进行身份验证的 SSO 反向代理之后,请在 `~/.crit.config.json` 中设置 `proxy_auth: true`(此选项仅限配置且仅限全局——它是部署的属性,而不是每次调用的选择,因此没有标志或环境变量)。通过浏览器驱动的 Share / Pull / Re-share / Unpublish 随后将通过弹窗路由,代理可以在其中完成其交互式身份验证流程。在 SSO 之后,终端的 `crit share`、`crit fetch` 和 `crit unpublish` 将保持不可用——请使用浏览器 UI 按钮。
#### 身份验证
你可以匿名分享,也可以创建一个免费的 crit.md 账户(使用 GitHub oAuth)。要通过 crit-web 进行身份验证(用于分享和其他需要账户的功能):
```
crit auth login # opens browser to log in
crit auth whoami # show current user info
crit auth logout # log out and revoke token
```
`crit auth login` 使用 OAuth Device Flow——它会打开你的浏览器,你确认后,CLI 会自动收到一个 token。该 token 存储在你的全局配置(`~/.crit.config.json`)中。
### GitHub PR 同步
Crit 可以双向同步审查评论与 GitHub PR。需要安装并验证 [GitHub CLI](https://cli.github.com) (`gh`)。
#### 从 PR 拉取评论
```
crit pull # auto-detects PR from current branch
crit pull 42 # explicit PR number
```
#### 推送评论到 PR
```
crit push # auto-detects PR from current branch
crit push --dry-run # preview without posting
crit push --message "Round 2" # add a top-level review comment
crit push 42 # explicit PR number
```
### 发送给 agent(实验性)
在审查期间点击任何评论上的“Send now”即可实时获得 AI agent 的回复。此功能仅在配置了 `agent_cmd` 时才会出现。
Agent 会读取评论上下文,对其进行处理(如果需要,会编辑代码),并内联
回复——所有这些都在你继续审查的同时进行。

在 `~/.crit.config.json` 中配置(仅限全局配置):
```
{
"agent_cmd": "claude --dangerously-skip-permissions -p"
}
```
#### 权限模式
Agent 需要工具权限才能代表你编辑文件。如何授予权限取决于你的信任级别:
| 模式 | 命令 | agent 可以做什么 |
| ---------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| 完全访问权限 | `claude --dangerously-skip-permissions -p` | 读取、写入和运行任何工具。最简单的选项——推荐用于受信任的仓库。 |
| 选择性访问权限 | `claude --allowedTools Edit,Read,Bash,Write,Glob,Grep -p` | 仅允许使用列出的工具。不错的折中方案。 |
| 无权限 | `claude -p` | agent 可以回复评论,但**无法编辑文件**。适用于仅限 Q&A 的工作流。 |
#### 工作原理
1. agent 通过 **stdin** 接收评论文本、引用文本(如果选择了文本)、文件路径和行范围。
2. agent 的 **stdout** 会被捕获并自动作为对评论的回复发布。
3. 如果 agent 编辑了文件,Crit 会通过**文件监视**检测更改并更新 UI。
#### 实时会话
在第一次与 agent 交互后,评论将变为一个**实时会话**:
- 你在会话中发布的后续回复会自动发送给 agent——无需再次点击“Send to agent”。
- agent 可以看到**完整的对话历史记录**,因此它可以基于之前的上下文进行构建。
- 实时会话会显示 ⚡ **live** 徽章和绿色光晕——agent 将立即回复后续消息。
#### 支持的 agent
| Agent | `agent_cmd` 值 |
| --------------------- | ------------------------ |
| Claude Code | `claude -p` |
| OpenCode | `opencode ask` |
| Cline | `cline --pipe` |
| Aider | `aider --message-file -` |
| Cursor(实验性) | `cursor --pipe` |
### 其他一切
- **每个分支的审查隔离。** 每个分支都有自己的审查文件——自由切换分支而不会丢失评论。审查数据存储在 `~/.crit/reviews/` 中,而不是你的仓库里。
- **草稿自动保存。** 在审查过程中关闭浏览器,下次可以从上次中断的地方继续。
- **Vim 快捷键。** `j`/`k` 导航,`c` 评论,`Shift+F` 完成。`?` 查看完整参考。
- **并发审查。** 每个实例都在自己的端口上运行——可以同时审查多个计划。
- **语法高亮。** 代码块会进行高亮显示并按行拆分,因此你可以对 fence 内的单行进行评论。
- **实时文件监视。** 当源文件发生更改时,浏览器会自动重新加载。
- **暗色/亮色/系统主题。** 顶部导航栏中的三按钮胶囊式切换,状态会持久化保存到 localStorage。
- **默认本地化。** 服务器绑定到 `127.0.0.1`。除非你明确分享,否则你的文件将保留在你的机器上。(使用 `--host` / `CRIT_HOST` / `host` 配置键进行覆盖——例如设置为 `0.0.0.0` 以在局域网上公开。没有身份验证,因此这是一个明确的自愿开启选项。)
- **折叠生成的文件。** 遵循 `.gitattributes` 中的 `linguist-generated` 设置——匹配的文件默认显示为折叠状态。
- **无分析或跟踪。** Crit 收集零遥测数据。没有使用情况统计,没有崩溃报告,没有电话联系机制。如果将来我们添加匿名使用情况统计,它们将明确要求用户自行选择启用。
- **更新检查。** 在启动时,Crit 会发出一个网络请求以检查是否有新版本,如果有,会打印一条通知。设置 `CRIT_NO_UPDATE_CHECK=1` 以禁用它。
## 配置
Crit 支持通过 JSON 文件进行持久化配置,这样你就不必每次都传递相同的标志。
| 文件 | 范围 | 位置 |
| --------------------- | ------- | ------------------------------------------------ |
| `~/.crit.config.json` | 全局 | 适用于所有项目 |
| `.crit.config.json` | 项目 | 仓库根目录(来自 `git rev-parse --show-toplevel`) |
项目配置覆盖全局配置。CLI 标志和环境变量覆盖这两者。
```
crit config --generate > ~/.crit.config.json # scaffold a starter config file
crit config # view resolved config (merged global + project)
```
### 配置键
所有键都是可选的——你可以省略任何不需要的键。
| 键 | 类型 | 默认值 | 描述 |
| ---------------------- | -------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `port` | int | `0`(随机) | 本地服务器的端口。`0` 选择一个随机可用端口。 |
| `host` | string | `"127.0.0.1"` | 监听 host。设置为 `"0.0.0.0"` 以在局域网上公开服务器。没有身份验证,因此任何非环回绑定都是明确的自愿开启选项。 |
| `no_open` | bool | `false` | 开始审查时不要自动打开浏览器。 |
| `quiet` | bool | `false` | 抑制终端状态输出。 |
| `output` | | 仓库根目录或文件目录 | 审查文件的输出目录。默认情况下,审查存储在 `~/.crit/reviews/` 中。 |
| `author` | string | VCS 用户名 | 评论上显示的作者名。回退到你配置的 VCS 用户名。 |
| `base_branch` | string | 自动检测 | 要进行 diff 比较的基准分支(例如 `"main"`、`"develop"`)。覆盖自动检测。 |
| `ignore_patterns` | string[] | `[".crit/"]` | 从 git 模式文件列表中排除的文件模式。全局和项目模式会合并。 |
| `auto_viewed_patterns` | string[] | `[]` | 当审查打开时,自动标记为已查看(折叠)的文件模式——例如 `["*.lock", "generated/", "PLAN.md"]`。手动取消标记的文件会保持打开状态。全局和项目模式会合并。 |
| `cleanup_on_approve` | bool | `true` | 当你在没有未解决的评论的情况下批准时,自动删除审查文件。设置为 `false` 以保留审查历史。 |
| `no_update_check` | bool | `false` | 启动时不要检查新版本。 |
| `no_integration_check` | bool | `false` | 在启动时跳过集成配置的新鲜度检查。 |
| `vcs` | string | 自动检测 | 首选的 VCS 后端:`"git"`、`"sl"` 或 `"jj"`。设置后,crit 将使用此 VCS 而不是自动检测。如果配置的 VCS 不可用,则回退到 git。也可以通过 `--vcs` CLI 标志设置(标志优先于配置)。 |
| `live_cookie` | string | `""` | 在实时模式下转发到上游应用程序的 cookie 标头值(例如 `"_crit_key=..."`)。全局或项目。对于机密信息,首选 `live_cookie_file`。 |
| `live_cookie_file` | string | `""` | 包含实时模式上游 cookie 的文件路径(原始标头行或 Netscape jar)。全局或项目;相对路径从仓库根目录解析。 |
| `prompts` | object | `{}` | 自定义的完成 hook 模板(项目按键覆盖全局)。参见[Agent 提示词](docs/agent-prompts.md)。 |
### Agent 提示词
自定义当你**完成审查**或**批准**时 Crit 告诉 agent 的内容。Hook 是全局或项目配置(`prompts` 映射)以及 `.crit/prompts/*.md` 文件中的模板。
请参阅 **[agent 提示词指南](docs/agent-prompts.md)** 以了解 hook 参考、模板变量、信任流程和示例。
### 仅限全局的配置键
这些键只能在 `~/.crit.config.json`(全局)中设置。项目级的 `.crit.config.json` 无法覆盖它们——这可以防止恶意仓库劫持本地命令或重定向分享请求。
| 键 | 类型 | 默认值 | 描述 |
| ---------------------- | -------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `agent_cmd` | string | `""` | 用于“发送给 agent”的 shell 命令(例如 `"claude -p"`)。参见[发送给 agent](#send-to-agent-experimental)。 |
| `open_cmd` | string | `""` | 用于打开审查 URL 的自定义命令——接收 URL 作为其唯一参数(必须是单个可执行文件,无标志)。当浏览器不在运行 crit 的机器上时使用,例如 crit 通过 SSH 在远程主机上运行,而一个小的包装脚本在你本地机器上打开 URL。未设置时,crit 使用平台默认的开启程序。 |
| `auth_token` | string | `""` | crit.md 的身份验证 token。由 `crit auth login` 自动设置。 |
| `share_url` | string | `"https://crit.md"` | 分享服务的基准 URL。设置为 `""` 可完全禁用分享。使用 [`crit-web`](https://github.com/tomasz-tomczyk/crit-web) 进行自托管。 |
| `public_url` | string | `""` | 用于 stderr 和浏览器打开的广播基准 URL(例如通过 tailscale serve 的 `https://machine.ts.net`)。监听地址保持不变。 |
| `share_consented` | bool | `false` | 在你确认首次分享提示后,自动写入 `true`。重置为 `false` 可再次查看提示。当 `share_url` 是自定义(自托管)URL 时不使用。 |
| `proxy_auth` | bool | `false` | 当为 `true` 时,share / pull / unpublish / re-share 使用浏览器弹窗中继,而不是由本地 Go 服务器直接联系 crit-web。在 crit-web 位于终端无法进行身份验证的 SSO 反向代理之后时使用。无标志或环境变量——这是部署的属性,而不是每次调用的选择。 |
### CLI 标志
| 标志 | 缩写 | 等效的配置键 | 描述 |
| --------------- | ----- | --------------------- | -------------------------------------- |
| `--port` | `-p` | `port` | 要监听的端口 |
| `--host` | | `host` | 监听 host(默认 `127.0.0.1`) |
| `--public-url` | | `public_url` | 广播的审查 URL(监听地址不变) |
| `--no-open` | | `no_open` | 不要自动打开浏览器 |
| `--share-url` | | `share_url` | 分享服务 URL |
| `--output` | `-o` | `output` | 审查文件的输出目录 |
| `--quiet` | `-q` | `quiet` | 抑制状态输出 |
| `--base-branch` | | `base_branch` | 要进行 diff 比较的基准分支 |
| `--vcs` | | `vcs` | VCS 后端(`git`、`sl` 或 `jj`) |
| `--no-ignore` | | | 暂时绕过所有忽略模式 |
| `--version` | `-v` | | 打印版本并退出 |
**仅限实时模式**(`crit live ` — 参见 `crit live --help`):
| 标志 | 等效的配置键 | 描述 |
| --------------- | --------------------- | ----------- |
| `--cookie` | `live_cookie` | 上游 cookie 值(可重复) |
| `--cookie-file` | `live_cookie_file` | 包含上游 cookie 的文件 |
### 忽略模式
来自全局和项目配置的模式会被合并。支持的语法:
| 模式 | 匹配项 |
| ------------------- | ----------------------------------------------- |
| `*.lock` | 目录树中任何以 `.lock` 结尾的文件 |
| `vendor/` | `vendor/` 下的所有文件 |
| `package-lock.json` | 目录树中任何位置的同名文件 |
| `generated/*.pb.go` | 带有 glob 的路径前缀(`filepath.Match` 语法) |
使用 `--no-ignore` 暂时绕过所有模式:
```
crit --no-ignore
```
### 环境变量
| 变量 | 描述 |
| --------------------------- | ------------------------------------------------- |
| `CRIT_PORT` | 本地服务器的默认端口 |
| `CRIT_HOST` | 监听 host(默认 `127.0.0.1`) |
| `CRIT_PUBLIC_URL` | 广播的审查 URL(例如 tailscale serve) |
| `CRIT_SHARE_URL` | 覆盖分享服务 URL |
| `CRIT_AUTH_TOKEN` | 覆盖身份验证 token(跳过 `crit auth login`) |
| `CRIT_NO_UPDATE_CHECK` | 在启动时禁用更新检查 |
| `CRIT_NO_INTEGRATION_CHECK` | 跳过集成配置的新鲜度检查 |
## 其他安装方法
### 从源码构建
需要 Go 1.26+:
```
git clone https://github.com/tomasz-tomczyk/crit.git
cd crit
go build -o crit ./cmd/crit
mv crit /usr/local/bin/
```
### Go
```
go install github.com/tomasz-tomczyk/crit/cmd/crit@latest
```
### Nix
```
nix run github:tomasz-tomczyk/crit -- --help
```
或者将其添加到 `flake.nix` 中:
```
inputs.crit.url = "github:tomasz-tomczyk/crit";
```
### 下载二进制文件
从 [Releases](https://github.com/tomasz-tomczyk/crit/releases) 获取适合你平台的最新二进制文件。
### Windows
原生 Windows:从 [Releases](https://github.com/tomasz-tomczyk/crit/releases) 下载 `crit-windows-amd64.exe`(或 `crit-windows-arm64.exe`),重命名为 `crit.exe`,并将其放在你的 `PATH` 中。
WSL:像在 Linux 上一样安装 Linux 二进制文件(`go install`、`nix run`,或从 Releases 下载 `crit-linux-amd64`)。Crit 会检测 WSL,并通过 `wslview` / `powershell.exe` / `cmd.exe` 在你的 Windows 主机浏览器中打开 URL。
### Docker(沙盒化的 agent)
如果要在容器内与 AI agent 一起运行 crit,同时可以从你的主机浏览器访问审查 UI,请参阅 [`integrations/docker/`](integrations/docker/)。其中包含一个可用的 `Dockerfile` 和 `entrypoint.sh`,它们通过 `socat` 桥接 crit 绑定到环回地址的服务器,从而使 `docker -p` 转发生效,而无需更改 crit 的威胁模型。
## 致谢
Crit 嵌入了以下开源库:
- [markdown-it](https://github.com/markdown-it/markdown-it):Markdown 解析器
- [highlight.js](https://github.com/highlightjs/highlight.js):语法高亮
- [Mermaid](https://github.com/mermaid-js/mermaid):图表渲染
也可通过 Go、Nix、Windows 获取
Go: ``` go install github.com/tomasz-tomczyk/crit@latest ``` Nix: ``` nix profile install github:tomasz-tomczyk/crit ``` Windows: ``` iwr https://github.com/tomasz-tomczyk/crit/releases/latest/download/crit-windows-amd64.exe -OutFile crit.exe ```标签:AI代理, EVTX分析, Go, Ruby工具, 人机交互, 代码审查, 前端预览, 文档结构分析, 日志审计, 本地开发工具, 防御加固