关于 Unwritten
Unwritten 从仓库的 git 历史中学习文件的协同变更规律,找出可能遗漏的关联文件或 C# 成员。它可通过 MCP 供编码 Agent 检查编辑,也能作为 CLI 或提交钩子运行,并为警告提供置信度和示例提交。
主要功能
- 01从 git 历史学习协同变更规律
- 02标记遗漏的关联文件和成员
- 03显示置信度与示例提交
- 04按文件分析任意语言的仓库
- 05提供 C# 成员检查和 JSON 噪声过滤
- 06通过 MCP、CLI 或钩子运行
适用场景
- 01提交前检查 Agent 的编辑
- 02修改实现文件后发现遗漏的测试
- 03在 pre-commit 钩子中运行仓库检查
MCP 相关
作为 MCP 服务运行,供编码 Agent 调用 `check_holes` 检查编辑。它也提供 CLI 和基于钩子的检查方式。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Unwritten
找出你或 AI Agent 忘记修改的文件。 Unwritten 会从你的 git 历史中学习通常会一起变更的文件,并在你遗漏某个文件时发出提醒:“你修改了 OrderService.cs,却没有修改 OrderServiceTests.cs,而这两个文件有 94% 的概率会一起变更。”它将这些遗漏的配套文件称为 缺口,并为每条提醒提供置信度分数和真实提交示例作为依据。
1 possible hole(s):
src/Orders/OrderServiceTests.cs
expected because you changed src/Orders/OrderService.cs
confidence 0.826 (90 co-changes in 100 changes)
e.g. 3f2a1c9 Add surcharge handling to freight calculation
FAIL: at least one hole at confidence >= 0.70.
它以 MCP 服务的形式运行,让 AI 编码 Agent(Claude Code、Copilot)能够在会话中途检查自己的修改;也可以作为 CLI 用于提交前钩子。只需运行一次 dotnet tool execute,索引保存在 .unwritten/ 中,无需服务、订阅或令牌。
适用于任何语言。 文件级规则只需 git 历史,因此无论是 Python、TypeScript、Go 还是混合仓库,缺口检测的工作方式都相同。C# 仓库还可获得方法级规则和外观修改过滤;JSON 文件则可进行键级噪声过滤。运行该工具需要 .NET SDK(10+),但它分析的仓库可以使用任何语言。
快速开始
在仓库根目录下:
- 预热索引(可选——每条命令首次运行时都会构建索引,并自动保持索引为最新;预热只是为了加快首次查询)。
dotnet tool execute Unwritten --yes -- reindex
- 注册为 MCP 服务(Claude Code):
claude mcp add unwritten -- dotnet tool execute Unwritten --yes -- mcp
3.(如果使用 Claude Code,建议执行)让检查变得确定:配置一个 git 提交前钩子和 Claude Code Stop 钩子,在提交前将未通过的缺口反馈给 Agent:
dotnet tool execute Unwritten --yes -- install-hook --git --claude-code
就这样——现在你的 Agent 可以在编辑后调用 check_holes,钩子则会捕获它忘记修改的情况。
说明视频
https://github.com/user-attachments/assets/4ae7a22d-c611-458f-8c48-08f87eca1d29
实际演示
stats 会显示工具学到了什么——这里有一对关联性足够强(置信度 ≥ 0.7)的文件,如果缺少其中一侧,就会阻止提交:

修改这对文件中的一个后,check 会提醒你缺少配套文件,并说明三种解决方法——更新配套文件、仍然提交,或停用该规则:

安装提交前钩子后,同一项检查会在每次提交时自动运行,并在配套文件仍缺失时阻止提交:

文档
其他内容请参阅 docs/README.md:
License
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。