sshanzel/plex
GitHub: sshanzel/plex
Plex 是一款本地优先的开源 AI 代码审查工具,通过 MCP server 和 CLI 让编码 agent 在独立的上下文中进行无偏见、有据可依且持续学习的代码审查。
Stars: 2 | Forks: 0
# Plex
Plex 是一款本地优先的代码审查工具,可通过你正在使用的编码 agent(Claude Code 或 Codex)来运行。它不是一个新的模型。它是一个 MCP server 和 CLI,旨在让你的 agent 成为一个更加严谨、无偏见的审查者,并且随着你的使用会变得越来越敏锐。
- **无偏见。** 审查在全新的独立上下文中运行,因此它不会受到代码编写者推理逻辑的影响,即使经过多轮审查也是如此。
- **有据可依。** 代码库的爆炸半径图(通过 git co-change、imports 和精确的 TypeScript 边)展示了某项改动还可能破坏什么,而不仅仅是 diff 中的代码行。
- **持续增益。** 审查知识会在全局(跨你的所有代码库)和单个项目内不断积累,并根据你的判定进行重新加权,同时从你的 PR 审查历史中学习。
- **单一信息流。** 第一性原理推理、学习到的陷阱和确定性检查被合并为一个列表,并按严重程度、置信度和爆炸半径进行排序。
推理过程仍然来自前沿模型。Plex 的工作是为其提供正确的上下文,并记住它所学到的东西。
## 为什么需要它
Copilot 的审查会遇到使用限制,Claudio 的个人版套餐没有审查功能,而编写代码的 agent 本身就是一个有偏见的审查者。Plex 就是那双无偏见的“第二双眼睛”,运行在你已经付费的订阅服务上。
## 快速开始
**1. 添加插件** 在 Claude Code 中(只需一次 —— 之后你打开的每一个 repo 都会生效)。这就是审查器本身:一个拥有全新上下文的 agent、`/plex:review` 命令,以及运行它的 MCP 引擎。
```
/plugin marketplace add sshanzel/plugins
/plugin install plex@sshanzel
```
**2. 添加 embedding key**(强烈推荐)。这将开启 Plex 中具备*学习*能力的部分:检索陷阱、语义匹配和 PR 历史分析。有关选项,请参阅 [Embeddings](#embeddings)(Voyage 提供免费额度)。
```
npx @sshanzel/plex init
```
它会将 key 保存到 `~/.plex/config.json`(你也可以自己创建该文件),并提供为当前 repo 建立索引的选项。想要一个完全可视化的 CLI(从终端运行 `doctor`、`eval`、分析和爆炸半径)?`npm install -g @sshanzel/plex` 会为你提供一个原生的 `plex` 命令 —— 请参阅[命令行使用](#command-line-use-optional)。
**3. 审查。** 运行 **`/plex:review`**,或者直接说*“review my changes with Plex”*。首次审查会为你所在的 repo 建立索引,之后图谱会自动保持更新。
如果没有 key,Plex 依然可以进行审查,只是没有了学习层;并且在添加 key 之前,它会在每次审查时提醒你一次。
### 使用 Codex
Codex 会从其自带的市场安装相同的插件。Codex 没有 agent 类型,因此审查器以 `plex-review` skill 的形式提供:
```
codex plugin marketplace add sshanzel/plex
```
然后运行 `plex-review` skill(通过 `/skills` 或 `$plex-review`)。其他一切的工作方式都是相同的。
## 大型代码库
首次审查会为你所在的 repo 建立索引,这会遍历 git 历史。在大型 repo 中这可能需要一分钟的时间,因此首次审查会比之后慢一些。为了提前完成这一步骤,你可以在 repo 内部,在审查之前构建图谱:
```
npx @sshanzel/plex index
```
此后,审查将使用缓存的图谱,并且仅刷新发生变化的部分。(如果你全局安装了 CLI,只需运行 `plex index` 即可。)
## Embeddings
Plex 没有 embedding provider 也能工作,但 key 是开启*学习*层的关键。这就是敏锐但一次性审查与能够持续积累经验的审查者之间的区别:
- **没有 key:** 具备全新上下文的审查、爆炸半径图和确定性检查。审查结果仍然会根据文件/行的位置进行自动采纳,并且存储的陷阱仍然会被检索 —— 只是通过关键字匹配,而不是语义匹配。
- **有 key:** 包含上述所有功能,外加完整的知识层。Plex 会以*语义方式*将相关的过去陷阱拉入每次审查中,根据*含义*抑制你已经驳回过的问题(因此即使措辞改变或代码行发生移动它们也能被识别),发现没有人标记过的改动,并且可以从你的 PR 审查历史中学习可重用的陷阱。这就是所谓的“越用越敏锐”的部分。
因此,请添加一个 key:运行 `npx @sshanzel/plex init`,自己创建 `~/.plex/config.json`,或者设置一对环境变量(`PLEX_EMBEDDING_PROVIDER=voyage` 加上该 provider 的 key,例如 `VOYAGE_API_KEY` —— 环境变量会覆盖文件配置):
```
{ "embedding": { "provider": "voyage", "apiKey": "YOUR_KEY" } }
```
无论采用哪种方式,它都会在下一次审查时生效,无需重新加载。
**Providers:**
- **Voyage**(推荐)。专为代码优化的 embeddings,免费额度完全足够起步使用。这是我日常使用的工具。设置 `voyage` 和 `VOYAGE_API_KEY`。
- **OpenAI。** `text-embedding-3-small` 便宜且可靠。设置 `openai` 和 `OPENAI_API_KEY`。
- **Gemini。** 设置 `gemini` 和 `GEMINI_API_KEY`。
- **Ollama。** 完全本地化,无需 key,适合私有 repo。设置 `ollama`(需要运行带有 embedding model(例如 `nomic-embed-text`)的 Ollama)。
稍后切换 provider 会使已存储的向量失效,因为它们在不同的模型之间不具有可比性 (ADR-13)。如果你进行了更改,请删除 `~/.plex/knowledge` 并重新进行分析。
## 从你的 PR 历史中进行引导
Plex 会随着你的审查变得越来越敏锐,但你也可以通过分析过去的 PR 审查并将其转化为陷阱,给它一个良好的开端。在 repo 内部,设置了 embedding key 并通过 GitHub CLI (`gh`) 认证后:
```
npx @sshanzel/plex analyze --oldest --limit 50
```
这会提取你前 50 个 PR 的审查评论,将重复出现的主题进行聚类,并将其提炼为知识。它借助你的 Claude 订阅运行(通过 `claude` CLI,不需要 API key),并且是增量进行的,因此可以重新运行它以继续处理你的历史记录。去掉 `--oldest` 参数则可以分析你最近的 PR。
## 命令行使用(可选)
正常使用时你不需要终端 CLI:插件会运行审查器,而 `plex init` 会设置你的 key。如果你还想自己运行 Plex 的维护和知识命令(在 CI、脚本中或手动运行),这些内容已在 **[docs/cli.md](docs/cli.md)** 中记录。
## 工作原理
```
diff (local or gh PR)
│
▼ Plex MCP server (fresh, unbiased) assembles the grounding:
blast radius (Kùzu code graph) · deterministic checks · relevant pitfalls
│
▼ get_review_context
your agent reasons (first-principles and grounded)
│
▼ submit_findings → merge · dedup · rank · triage (severity × confidence × blast)
│ └─ (PR, opt-in) post the stream back as one GitHub review
▼ record_outcome (accept / reject / waive / acknowledge) → knowledge sharpens
```
**三个来源,一个信息流。** 第一性原理推理(agent)、基于知识的发现(检索到的陷阱)和确定性检查(内置的 TypeScript-AST 规则)。普遍程度是通过严重性来衡量的:常见的*样式 (style)* 问题会被视为约定从而被降级,而常见的 *bug* 则会被视为系统性问题,并作为需要进行迁移的项目被升级。
**两层知识。** 全局层包含通用的陷阱和你的审查风格,这是在你所有的 repo 中学习并按结果重新加权得来的;它适用于所有地方。特定于项目的层包含该 repo 的代码图谱、co-change 耦合以及其特定于 repo 的陷阱;它为单个代码库量身定制审查。
**在 PR 上形成闭环(可选择加入)。** 开启 `autoComment` 后,PR 审查会将排好序的反馈流作为一条 GitHub review 发布:在修改过的行上提供行内评论,并为耦合和感知相关的发现提供摘要,在多轮审查中自动去重。接着,**`/pr-master:respond`** 会逐一处理这些问题(由你决定每一个的处理方式),并将结果记录回知识库中 (ADR-34)。该命令来自同一市场中安装的第二个插件,可以在你需要时单独安装:`/plugin install pr-master@sshanzel`。
**审查历史分析。** Plex 会将你的 PR 审查历史转化为陷阱。它通过 `gh` 提取审查评论,对其进行降噪处理,将相似内容聚类,然后由 LLM 提炼每一个聚类,决定哪些值得保留,以及它们是属于全局层还是项目层。提炼过程在你的订阅下运行,通过连接的 agent(先 `analyze_scan` 后 `add_pitfalls`)或本地 `claude` CLI(`plex analyze`)完成。这是一个增量过程:每个 repo 的游标只会读取新的 PR。
## MCP 工具
`index_repo` · `get_review_context` · `get_blast_radius` · `get_deterministic_findings` · `submit_findings` · `record_outcome` · `reconcile_outcomes` · `get_relevant_knowledge` · `consolidate_knowledge` · `analyze_scan` · `add_pitfalls` · `analyze_history` · `doctor`
## 架构
**MCP server 和 CLI** 是集成契合点:agent 提供 LLM,而 Plex 提供基础依据和记忆。
**Kùzu**(嵌入式,MIT 许可证)保存着持久化的、特定于 repo 的代码图谱(symbols、imports、co-change 和精确的 alias 边)以及特定于 PR 的大脑(轮次、发现、判定、评论以及*发生了更改但未提供反馈*的信号)。它是一个嵌入式引擎,无需运行任何服务 (ADR-30)。图谱只构建一次,然后进行增量刷新;审查时会在首次使用或发生偏移时对其进行索引或刷新。
**知识库** 是由 JSON 支持的带有 embeddings 的陷阱和事件,位于一个可插拔且可选的 embedding provider(Voyage、OpenAI、Gemini 或 Ollama)之后。豁免机制会根据*含义*在不同轮次中抑制同一个问题,因此即使代码行发生偏移或措辞被重写,它们依然有效。
请参阅 [`docs/architecture.md`](docs/architecture.md) 以及 [`docs/adr/README.md`](docs/adr/README.md) 中的决策日志。
## 配置
这里的所有内容都是可选的。使用 `plex init` 进行一次设置(保存到 `~/.plex/config.json`),或者将其设置为环境变量,这会覆盖文件配置。
| 变量 | 用途 |
|---|---|
| `PLEX_EMBEDDING_PROVIDER` | 语义知识和大脑信号:`voyage`、`openai`、`gemini` 或 `ollama`。`none` 会关闭此功能;`fake` 仅用于测试。 |
| *(provider key)* | `VOYAGE_API_KEY`、`OPENAI_API_KEY` 或 `GEMINI_API_KEY`。Ollama 不需要。 |
| `PLEX_LLM_PROVIDER` | 分析提炼器:`claude-cli`(默认)、`anthropic` 或 `openai`。 |
| `PLEX_DATA_DIR` | 特定于 repo 的数据目录。默认集中存放在 `~/.plex/repos/`;设置为 `.plex` 可将其保留在 repo 中,它会在那里被自动忽略。 |
| `PLEX_KNOWLEDGE_DIR` | 全局知识库。默认为 `~/.plex/knowledge`。 |
| `PLEX_AUTO_COMMENT` | 将 PR 审查的发现发布回 GitHub PR。默认关闭。设置 `PLEX_AUTO_COMMENT_SKIP_NITS=true` 可排除细枝末节的问题;否则也会发布这些细小问题。 |
## 许可证
[MIT](LICENSE)
标签:AI风险缓解, CLI, MCP, MITM代理, SOC Prime, WiFi技术, 人工智能, 代码审查, 开发工具, 文档结构分析, 用户模式Hook绕过, 自动化攻击