persiyanov/herdr-reviewr
GitHub: persiyanov/herdr-reviewr
为 herdr 终端 AI 编程助手打造的代码审查侧边栏插件,让开发者在终端内审查 agent 生成的 diff、逐行评论并一键反馈。
Stars: 67 | Forks: 7
# herdr-reviewr
[herdr](https://herdr.dev) 的代码审查侧边栏。你的 agent 编写代码。你在聊天旁边的窗格中阅读它的 diff,对相关行进行评论,并将备注发回去。你永远不需要
离开终端。

在一个指向 git worktree 的持久化窗格中,你能获得:
- **Diff 审查** — agent 修改的文件,带有语法高亮,范围限定为*未提交 (uncommitted)*、
*分支 (branch)* 或*上一轮 (last turn)*。
- **变更集遍历** — `]` 和 `[` 逐个 hunk 遍历更改。当到达文件的最后一个 hunk 时,步进会停止,
底部会提示跨越,再按一次即可打开下一个文件。`f` 和
`F` 可直接在文件之间跳转。
- **行评论** — 选择一个范围并写下备注。它会作为卡片显示在代码下方,
而不是隐藏在标记后面。
- **发送** — 只需一次按键,即可将每条评论以
`path:start-end — comment` 的形式放入 agent 的输入框中。你可以补充上下文并按回车键。
- **文件查看器** — 整个 worktree,而不仅仅是 diff,任何文件的当前内容
都可以在窗格中渲染。
- **PR 视图** — 分支的打开状态 pull request,只读,无需切换窗口。
描述和每条评论都会渲染为带样式的 markdown。
- **Markdown 预览** — 按一个键即可在 `.md` 文件的源码和渲染视图之间切换,
标题、列表、表格、链接和代码块会像 diff 一样高亮显示。切换会保持
你的阅读位置。
- **主题** — 18 种命名的暗色和亮色调色板,只需一行配置即可切换。Catppuccin, Dracula,
Nord, Gruvbox, Tokyo Night, Rosé Pine, Solarized 等。
它**从不编辑你的 worktree**,也不会自行发送任何内容。它对 git 唯一的写入是一个私有的
`last-turn` 基准 ref,位于 `refs/reviewr/` 下。**PR** 标签页会读取 GitHub,但从不向其发布内容。
## 环境要求
- **herdr ≥ 0.7.0**(插件系统)。
- **git** 位于 `PATH` 中。
- 一个支持 Unicode 框线绘制的 **truecolor (24位)** 终端。选择一个与
其亮色或暗色背景匹配的主题(参见 [主题](#theme))。
- **macOS 或 Linux。**
- **`gh`**(GitHub CLI),已通过身份验证。可选,仅 **PR** 标签页需要它。其他所有功能
没有它也能正常工作。
## 安装
从 herdr marketplace 安装。你会获得一个预构建的二进制文件,无需 Rust 工具链:
```
herdr plugin install persiyanov/herdr-reviewr
```
侧边栏会**为新建的 worktree 自动打开**,因此安装插件就足够了。设置
`auto_open = false` 可以让它保持隐藏,直到你调用它(参见 [配置](#configuration))。若要
按需切换,请在你的 herdr 配置中为 **reviewr: toggle sidebar** 操作绑定一个快捷键。
快捷键位于用户配置中,而不是插件清单中:
```
[[keys.command]]
key = "cmd+r"
type = "plugin_action"
command = "persiyanov.reviewr.toggle" # . — note the id, not the name
```
`cmd+…` 组合键可以触达 herdr。macOS 会拦截 `alt+…` 组合键。如果未绑定快捷键,可以使用
`herdr plugin action invoke toggle --plugin persiyanov.reviewr` 运行一次该操作。
除了 `toggle` 之外,还有两个专门用于脚本和布局插件的操作。`open` 会打开
侧边栏,如果已经打开则不做任何事。`close` 会关闭它,如果没有打开则不做
任何事。以相同的方式绑定或调用它们,即 `persiyanov.reviewr.open` 和 `persiyanov.reviewr.close`。
有关布局方案,请参见 [自动打开和布局插件](#auto-open-and-layout-plugins)。
## 快速开始
核心循环只需要五个按键。在你的 agent 旁边打开侧边栏,然后:
1. **选择一个文件。** agent 修改的文件位于右侧窗格。`j` / `k` 移动光标。
当你移动时,diff 会在左侧打开。或者按 `]` 逐个 hunk、
挨个文件地遍历更改。
2. **聚焦 diff。** 按 `Tab` 从文件列表移至 diff 中。
3. **选择行。** 按 `v`,然后按 `j` / `k` 扩展选择(或点击拖拽)。
4. **评论。** 按 `c`,输入你的备注,按 `Enter` 保存。它会作为卡片保留在
该行下方的屏幕上。
5. **发送。** 完成后,按 `s`。每条评论都会以
`path:start-end — comment` 的形式进入 agent 的输入框。你可以补充上下文并发送。
底部总是会显示当前可用的快捷键,因此你可以在使用中学习。下表
是完整的参考。
## 控制
以下单键快捷键是默认设置。它们中的任何一个都可以针对每个操作重新绑定,甚至可以
一次绑定到多个键([快捷键](#keybindings))。
**导航**
| 按键 | 操作 |
| --- | --- |
| `1` `2` `3` | 切换标签页 — Changes / All files / PR |
| `u` `b` `t` | 切换范围 — 未提交 / 分支 / 上一轮 |
| `j` `k` · `↑` `↓` | 在聚焦的窗格中移动光标 |
| `]` `[` | 跳转到下一个 / 上一个 hunk — 在文件边缘再按一次即可进入相邻文件 |
| `f` `F` | 跳转到下一个 / 上一个文件 |
| `PageUp` `PageDown` | 移动一页 |
| `Ctrl+U` `Ctrl+D` | 移动半页 |
| `Tab` | 在文件列表和 diff 之间切换焦点 |
| `→` `←` | 展开或折叠目录或折叠区域,或横向滚动 diff |
| `w` | 切换自动换行 |
| `m` | 切换 `.md` 文件的 markdown 预览(Changes 或 All files) |
| `<` `>` | 向左 / 向右移动窗格分隔线 |
| `r` | 立即刷新 |
| `q` | 退出 |
**审查中**(在 diff 中)
| 按键 | 操作 |
| --- | --- |
| `v` | 开始行选择,然后 `j` / `k` 扩展(或点击拖拽) |
| `c` | 对所选内容或当前行进行评论 |
| `e` `d` | 编辑 / 删除光标下的评论 |
| `n` `N` | 跳转到下一个 / 上一个评论 |
| `l` | 列出所有评论 |
| `s` | 将所有评论发送给 agent |
| `y` | 将所有评论复制到剪贴板 |
| `esc` | 清除选择 |
**在评论框中**
| 按键 | 操作 |
| --- | --- |
| `Enter` | 保存评论 |
| `Esc` | 取消 |
| `Shift+Enter` · `Alt+Enter` · `Ctrl+J` | 插入换行符 |
此外还有常见的插入符移动:方向键,`Home` / `End`,`Ctrl+A` / `Ctrl+E`,使用
`Alt+b` / `Alt+f` 进行单词跳转,以及使用 `Ctrl+W` / `Ctrl+U` / `Ctrl+K` 按单词或至行边缘删除。
**PR 标签页**(只读)
| 按键 | 操作 |
| --- | --- |
| `j` `k` | 在描述和评论中移动 |
| `PageUp` `PageDown` | 滚动阅读窗格 |
| `o` | 在浏览器中打开 PR |
| `r` | 刷新 |
herdr 是原生支持鼠标操作的,因此点击文件、拖拽选择行、点击标签页或 `Send`
按钮以及滚轮也都能正常工作。渲染后的 markdown 中的链接在点击时会在你的浏览器中打开
(仅限 `http`/`https`),而锚点链接(`#section`)会跳转到其对应的标题。
## 三个标签页
- **Changes** — 当前作用域内已更改的文件,每个文件带有 `+/-` 统计信息,及其
总计位于标题中。选择一个文件以阅读其带有语法高亮的 diff。这是你进行审查和评论的地方。在 `.md` 文件上,`m` 会打开
它的渲染预览。再次按 `m` 可返回到你离开时的 diff 处。
- **All files** — 整个 worktree 树,而不仅仅是更改的内容。diff 窗格会渲染任何
文件的当前内容。Git 忽略的路径也会显示,但颜色会变暗。作为一个整体被忽略的目录
(`target/`、`node_modules/`)是一行折叠的记录,只有当你展开它时才会加载其内容。
你也可以在这里进行评论。在 `.md` 文件上,`m` 会在源码和渲染后的
markdown 预览之间切换。预览是只读的,因此评论会保留在源码视图中。
- **PR** — 分支打开状态 pull request 的只读镜像,通过 `gh` 从 GitHub 读取。它
显示 PR 的状态(草稿、打开、已合并或已关闭,以及可合并性和未推送提交的
同步状态)、带有通过/失败汇总的检查及其评论。PR 描述位于列表
的顶部。评论涵盖审查、行内发现和普通评论,最新的在前,并带有
`resolved` 和 `outdated` 标记。描述和每个评论正文都呈现为带样式的
markdown,代码块使用你的主题高亮显示。`o` 在浏览器中打开 PR。该标签页
只读取 GitHub。它从不发布、解决、重新运行或合并。
## Diff 作用域
- **未提交** — 工作区与 `HEAD` 的对比(已暂存、未暂存和未追踪)。
- **分支** — 工作区与基础分支的 merge-base 进行对比。默认基础是
`origin/main`,然后是 `origin/master`、`main`、`master`,可通过 `base_branches` 或 `--base` 设置。
此作用域是**未提交**加上分支已提交的工作。
- **上一轮** — 仅限 agent 自最近一轮开始以来更改的内容(参见
[限制](#limitations))。
侧边栏在**未提交**状态下启动。要在其他作用域中启动,请在
配置文件中设置 `default_scope`(`"uncommitted"`、`"branch"` 或 `"last-turn"`)。使用 `u`/`b`/`t` 切换始终
优先,并应用于会话的其余时间。
每个作用域都遵循 `.gitignore`,因此构建输出永远不会弄乱 **Changes**。要审查一个文件,
请在 git 中追踪它。一个被忽略但有意保留的文件(计划、示例 env)应该包含在 repo 中。
在那里它显示为更改,一旦提交就会过期。**All files** 仍然可以浏览任何
被忽略的路径(颜色变暗),甚至包括未追踪的文件。
## 配置
窗格命令上的 CLI 标志:
| 标志 | 默认值 | 含义 |
| --- | --- | --- |
| `--poll ` | `2000` | worktree 轮询间隔(最小 `200`) |
| `--base ` | 自动 | `branch` 作用域的基础分支,覆盖 `base_branches` |
| `--theme ` | `catppuccin` | UI + 语法主题(见下文) |
| `--wrap ` | `on` | 自动换行显示过长的 diff 行(`w` 在运行时切换) |
其他所有内容都在 reviewr 自己的配置文件中设置:
```
~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
```
如果文件尚不存在,请创建它。herdr 将此目录作为
`$HERDR_PLUGIN_CONFIG_DIR` 传递给插件,而上面的路径就是它在磁盘上的位置。请注意这是
reviewr 的文件,而不是 herdr 的。添加到 herdr 自己的 `~/.config/herdr/config.toml` 中的设置永远不会
到达 reviewr。
该文件接受以下八个键:
```
theme = "tokyo-night"
base_branches = ["origin/develop", "origin/main", "main", "master"]
default_scope = "branch"
toggle_placement = "overlay"
toggle_direction = "down"
auto_open = false
github_host = "github.example.com"
[keybindings]
comment = ["c", "ㅊ"]
select = ["v", "ㅍ"]
```
缺少文件或省略的键会使用其默认值。任何未知的键、错误的类型或无效的值
都会使整个文件无效。reviewr 从不应用看起来有效的部分。然后侧边栏
仅显示配置错误,操作或事件将以非零状态退出,而不会触及工作区。
修复该文件,正在运行的侧边栏会在下次刷新时恢复。如果你的编辑器或配置器
可能暴露部分保存,请原子性地替换文件。
### 主题
一个主题为整个 UI 着色,同时作用于界面和语法。在 reviewr 的配置文件中设置它。
reviewr 会在刷新时重新读取文件,因此编辑并刷新可以更改主题,而无需重新启动:
```
# ~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
theme = "tokyo-night"
```
`--theme` 会覆盖配置文件(便于开发运行)。选择一个与你的
终端的亮色或暗色背景匹配的名称。窗格保留终端的背景,因此在暗色
终端上使用亮色主题阅读体验很差,反之亦然。可用主题:
- **暗色:** `catppuccin`, `catppuccin-frappe`, `catppuccin-macchiato`, `dracula`, `nord`,
`gruvbox`, `one-dark`, `solarized`, `monokai`, `tokyo-night`, `rose-pine`。
- **亮色:** `catppuccin-latte`, `gruvbox-light`, `one-light`, `solarized-light`, `github-light`,
`tokyo-night-day`, `rose-pine-dawn`。
在两者都提供调色板的地方,名称与 herdr 的相匹配。未知的配置名称是一个错误。独立的
`--theme` 开发标志保留了其较早版本回退到 `catppuccin` 的行为。
### 基础分支
**分支**作用域针对与基础分支的 merge-base 进行 diff。reviewr 会尝试一个有序
的候选列表,并使用在你的 repo 中存在的第一个,因此一个设置适用于具有不同主干的 repo
。默认值为 `origin/main`,然后是 `origin/master`、`main`、`master`。
要针对不同的基础进行审查,比如 `develop` 主干,请在同一个
配置文件中设置 `base_branches`。reviewr 在刷新时重新读取它,因此编辑它并按 `r` 即可重新设置基准,而无需
重新启动:
```
# ~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
base_branches = ["origin/develop", "origin/main", "main", "master"]
```
reviewr 会选择 repo 中存在的第一个条目。当 `--base ` 标志指定了
现有的 ref 时,它仍然优先。缺少文件或省略的键会使用默认列表。格式错误的值
会像任何其他无效配置一样阻止插件。
### 快捷键
每个单键快捷键都可以针对每个操作重新绑定。在同一个配置文件中设置 `[keybindings]`。
每个条目将一个操作名称映射到一个键数组。该数组替换该操作的默认
键,而你没有提到的操作则保留其原有快捷键。底部和顶部的提示会显示数组中的第一个键。reviewr 在刷新时重新读取文件,因此快捷键编辑无需重新启动即可生效。
```
# ~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
[keybindings]
comment = ["c", "ㅊ"]
select = ["v", "ㅍ"]
```
当启用了 CJK 输入法时,每个操作对应多个按键就是关键所在。操作系统会将
组合好的字符发送给终端,因此纯 ASCII 快捷键永远不会到达。请绑定你的
键盘布局在同一个物理按键上产生的字符,这样快捷键就可以在不
将输入法切换到英语的情况下工作。
操作名称及其默认值:
| 操作 | 默认值 |
| --- | --- |
| `down` / `up` | `j` / `k` |
| `next-hunk` / `prev-hunk` | `]` / `[` |
| `next-file` / `prev-file` | `f` / `F` |
| `scope-uncommitted` / `scope-branch` / `scope-last-turn` | `u` / `b` / `t` |
| `tab-changes` / `tab-all-files` / `tab-pr` | `1` / `2` / `3` |
| `wrap` | `w` |
| `preview` | `m` |
| `list-wider` / `list-narrower` | `<` / `>` |
| `select` | `v` |
| `comment` | `c` |
| `edit` / `delete` | `e` / `d` |
| `next-comment` / `prev-comment` | `n` / `N` |
| `comments` | `l` |
| `send` | `s`, `S` |
| `copy` | `y`, `Y` |
| `open-pr` | `o` |
| `refresh` | `r` |
| `quit` | `q` |
一个键即一个字符,任何可打印的字符都可以。方向键、`Tab`、`Esc`、`Enter`
和翻页键是固定的,并且始终有效。在评论框中按键仍然会正常输入字符。两个
操作永远不能共享同一个键。冲突会使整个文件无效,并且错误会同时指出
这两个操作,因此拼写错误无法在不被发现的情况下覆盖另一个快捷键。
### GitHub 主机
GitHub.com 无需配置即可工作。要从一个 GitHub Enterprise 主机读取 pull request,
请设置其裸主机名:
```
github_host = "github.example.com"
```
reviewr 会匹配该确切的 origin 主机,或者匹配以
`github.example.com-` 开头的受信任 SSH 别名,例如 `git@github.example.com-work:owner/repo.git`。此别名约定
仅适用于 scp 风格和 `ssh://` origin。HTTPS 主机必须完全匹配。当配置了 Enterprise 时,GitHub.com 及其
SSH 别名将继续工作。
主机身份来自 Git 的 `url.*.insteadOf` 重写后的 origin 获取 URL。单独的
推送 URL 不会改变它。API 调用在每次请求时都会指明规范主机,因此 `GH_HOST`
无法重定向获取操作。请使用
`gh auth login --hostname github.example.com` 对 Enterprise 主机进行身份验证。
### 侧边栏位置
默认情况下,切换键会将 reviewr 作为你 agent 右侧的分割窗口打开。你可以通过在同一个配置文件中设置 `toggle_placement` 来更改它
的打开方式。reviewr 会在每次
切换时重新读取该文件,因此更改将在你下次按下该键时生效。
```
# ~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
toggle_placement = "overlay" # split | overlay | zoomed | tab (default: split)
toggle_direction = "down" # right | down — split only (default: right)
```
- **`split`** 位于你的 agent 旁边,并将键盘焦点留在 agent 上。设置 `toggle_direction` 以
将 reviewr 放在右侧(默认)或下方。
- **`overlay`** 用 reviewr 覆盖整个标签页,并将键盘焦点交给它。再次切换即可
返回你的 agent。
- **`zoomed`** 像覆盖一样填满标签页,并将键盘焦点交给 reviewr。
- **`tab`** 在自己的标签页中打开 reviewr,并将键盘焦点交给它。
当你创建新的 worktree 时,reviewr 仅针对 `split` 和 `tab` 自动打开。使用 `overlay` 或
`zoomed` 时,它会避让,直到你自己按下切换键。无法识别的值会使
配置无效。你也可以完全关闭自动打开功能。下一节将展示如何操作。
### 自动打开和布局插件
reviewr 默认情况下会为每个新的 worktree 自动打开。要让它等待切换键,请
在同一个配置文件中设置 `auto_open = false`:
```
# ~/.config/herdr/plugins/config/persiyanov.reviewr/config.toml
auto_open = false # default: true
```
当另一个插件为你安排新的 worktree 时执行此操作,例如
[herdr-plus](https://github.com/cloudmanic/herdr-plus) worktree 布局。这两个插件都会对同一个
worktree 事件做出反应并相互竞争,任何一方都可能失败。竞争可能会完全跳过布局,
或者将 reviewr 作为分割窗口丢弃在布局中间。设置了 `auto_open = false` 后,reviewr 将不再
管新生成的工作区。布局构建不受干扰,并且切换键可以在其上
以你配置的任何位置打开 reviewr。
布局也可以在其窗格就位后自行打开 reviewr:
```
herdr plugin action invoke open --plugin persiyanov.reviewr
```
`open` 会忽略 `auto_open`,因为显式调用代表你的意愿。它会以你配置的
位置打开,如果侧边栏已经打开则不做任何事,因此布局可以在每次过程中运行它。
有两点需要了解。该操作会在**聚焦的** workspace 中打开 reviewr,因此请在
新的 workspace 获得焦点时调用它。而且它会将 reviewr 作为其**自己的新窗格**打开。一个命令
为该调用的布局窗格将在调用返回后退出。请将调用作为一次性命令从你的
布局 hook 中运行,而不是作为一个应该保留下来的窗格。
## 限制
这是一个专注且年轻的工具。已知的限制:
**终端与主题**
- **需要 Truecolor** — 颜色为 24 位 RGB,没有 256/8 位颜色回退。基础终端
会渲染出错误的颜色。
- **主题必须与终端匹配** — 窗格保留终端的背景,因此在暗色
终端上使用亮色主题阅读体验很差,反之亦然。目前还没有自动亮/暗检测
。你需要手动设置主题以使其匹配。
- **添加 / 删除为红色 / 绿色** — 目前还没有针对色盲用户的辅助提示。
- **需要框线绘制字形** — UI 使用 Unicode 框字符绘制。不需要 Nerd Font。
**平台**
- **仅限 macOS 和 Linux** — 不支持 Windows。
- **剪贴板导出** 在 macOS 上使用 `pbcopy`,或在 Linux 上使用 `wl-copy` / `xclip` / `xsel`。如果
未安装任何剪贴板工具,它会进行提示,但 **发送** 仍然有效。OSC 52 和 Windows 已列入路线图。
**herdr 耦合**
- **发送需要找到 agent 窗格** — 即你标签页中的 agent,或者工作区中唯一的
agent。否则发送将不起作用,并保留你的评论。浏览和 diff 不需要
herdr。
- **上一轮依赖于轮询**(默认为 2 秒)— 在一次轮询内开始并完成的 turn 永远不会
获得自己的快照。然后,该作用域会显示自上次*观察到的* turn
开始以来的所有内容。那绝对不是 agent 没有写的行,但可能涉及不止一轮。
**PR 标签页**
- **仅限 GitHub 且为只读** — 需要经过身份验证的 `gh` 和 GitHub 远程仓库。如果缺少其中之一
,它会显示一行文字告诉你需要修复什么,而 Changes 和 All files 会继续工作。
- **仅镜像分支*打开的* PR** — 已合并或已关闭的 PR 显示为历史记录。每个评论
界面最多显示一页(100 行),当有更多内容时,会显示 `+more on GitHub ↗` 标记。
**审查模型**
- **评论位于内存中且为单会话** — 关闭窗格会丢失你尚未发送或
复制出来的任何评论。
- **发送是全有或全无** — 发送(或复制到剪贴板)会传递整个集合并清除
它。没有针对单条评论的发送,也没有重复传递。失败会使所有内容保留
在原处。
- **没有行号变基** — 评论通过其 diff 片段保持可定位,而不是通过其行
号。reviewr 会标记过期的评论,而不是将其丢弃。
- **每个 worktree 一个侧边栏** — 同一个 worktree 上的两个侧边栏会竞争基准 ref,最后
写入者获胜。
**预算**
- 超过 **2 MB** 或 **50,000 行**的文件会显示“太大”通知。**二进制**文件没有
diff。
## 从源码构建
面向贡献者。`herdr plugin link` 会跳过下载构建步骤,因此请在窗格命令寻找它的地方放置本地构建的
二进制文件,即 `$HERDR_PLUGIN_ROOT/bin/herdr-reviewr`:
```
git clone https://github.com/persiyanov/herdr-reviewr
cd herdr-reviewr
just install # build release → bin/herdr-reviewr, ad-hoc re-signed on macOS
herdr plugin link .
```
`just install` 会用新文件替换二进制文件,并对其进行 ad-hoc 重新签名。在 Apple Silicon
上这很重要。原地覆盖经过代码签名的二进制文件会使其签名失效,然后 macOS 会在
启动时对其发送 SIGKILL 信号。因此,简单的 `cp target/release/herdr-reviewr bin/` 会使窗格
瞬间打开并关闭。
**第一次链接后的开发循环:**
1. 编辑代码。
2. 运行 `just install` 以重新构建并重新签名 `bin/` 下的二进制文件。
3. 通过使用你的快捷键关闭再重新打开侧边栏来重新启动它。在此之前,打开的窗格会继续
运行*旧*进程,因此仅仅重新构建并不会改变屏幕上的内容。
此循环仅在插件处于**链接**状态时有效,而不是从 marketplace 安装的。使用
`herdr plugin list` 进行检查。`github:…` 源意味着窗格运行的是位于
`~/.config/herdr/plugins/github/` 下的*下载的*二进制文件,并且无论你多么频繁地运行
`just install`,本地重新构建都不会出现在那里。将 GitHub 安装切换为开发链接:
```
herdr plugin uninstall persiyanov.reviewr # config is keyed by id and survives
herdr plugin link .
```
## 路线图
结构化 (JSON) 导出、diff 内搜索、并排分割视图、标记文件已审查、
快捷键的修饰符和命名键表示法、OSC 亮/暗主题自动检测、更多主题
(`kanagawa`、`vesper`、`everforest`、`ayu`、暗色 `github`)、`terminal` 跟随调色板
,以及 OSC 52 剪贴板。
## 设计
生动的设计位于 [`specs/`](_URL_7/>) 中,每个文档一个概念,始终保持最新。
## 许可证
[MIT](LICENSE)。语法高亮来自 [syntect](https://github.com/trishume/syntect) 和
[two-face](https://github.com/CosmicHorrorDev/two-face)。大多数主题的语法颜色来自
two-face 的内置集合。
`assets/` 中内置的 `.tmTheme` 语法文件,各自拥有其许可证:
- [Catppuccin Mocha](https://github.com/catppuccin/bat) — MIT。
- [Tokyo Night](https://github.com/folke/tokyonight.nvim)(`tokyo-night`, `tokyo-night-day`)— Apache-2.0。
- [Rosé Pine](https://github.com/rose-pine/tm-theme)(`rose-pine`, `rose-pine-dawn`)— MIT。
标签:AI编程助手, Git, Python安全, SOC Prime, 代码审查, 可视化界面, 开发工具, 插件, 通知系统