关于 koment
koment 将代码背后的理由存为 Git 仓库中的 YAML,并锚定到代码片段、检查其是否偏移。开发者和编码 Agent 可共享这些记录;当解释不再对应代码时,检查会使构建失败。
主要功能
- 01以 YAML 注释记录并纳入 Git
- 02按代码片段锚定
- 03偏移检查可使构建失败
- 04提供命令行、浏览器界面和 LSP
- 05Agent 策略与注释工具
适用场景
- 01保留特殊代码写法的原因
- 02代码修改时发现过期理由
- 03在拉取请求中一并审阅注释
MCP 相关
其 MCP 服务允许 Agent 读取和搜索注释,并在写入模式下添加或确认注释。本地与远程部署提供的修改工具有所不同。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm ghcr.io/koment-dev/koment:3.2.0本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/koment-dev/koment:3.2.0stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
问题所在
有人把 retry 5 times 写成了 3 次,当时是有充分理由的。六个月后,没人记得原因,于是它被“简化”回 3 次,bug 又出现了。
原本注释是用来防止这种情况的。注释会失效:它们紧挨着代码,却没有与代码绑定;代码一旦变更,没有任何提示告诉你注释已经成了谎言。接着,你的 AI Agent 读到这句谎言,并据此采取行动。
koment 的作用
你可以在源代码之外记录原因,并将它锚定到所解释的确切代码行。然后 koment 会监视这些代码行。修改它们,koment 就会给出提示:
$ koment check
internal/auth/token.go
drifted gotcha internal/auth/token.go 01KZN63VC5SZASDYJBMPDC03WB
Without it, clients whose clock runs fast get logged out mid-request. Bit
us in #412.
1 annotation across 1 file: 1 drifted
koment: 1 annotation no longer resolves; revisit it or update the anchor
退出码为 1。构建会停止。没有人会悄然沿用一个已无法描述代码现状的原因。
这些记录以 YAML 格式保存在 Git 仓库的 .koment/ 目录中。无需数据库、服务或账号。它们会与促使其编写的变更在同一个拉取请求中接受审核。
查看运行效果 → — koment 自己的注解,由可复制的工作流发布。
面向 AI Agent
koment 的价值在这里体现得淋漓尽致。Agent 经常编写解释性注释,也会在不理解代码编写缘由的情况下修改代码。koment 会让这两种行为立即失败,此时 Agent 仍在工作:
- 它编写注释 → 编辑会被拒绝,并提示将相关理由记录为注解。
- 它未经检查就修改带有注解的代码 → 必须重新检查注解,才能完成本轮操作。
一个 MCP 服务即可为 Claude Code、Cursor、Codex、opencode、Hermes、Zed 等工具提供服务,让每个 Agent 都能通过相同的接口读取相同的理由。 配置你的环境 →
人类也能在编辑器中体验同样的流程:注释下方会出现波浪线,并提供快速修复选项:转换为注解或保留并记录在案。
安装
brew install koment-dev/tap/koment
其他方式
mise use -g github:koment-dev/koment # mise
go install github.com/koment-dev/koment/cmd/koment@latest
docker run --rm -v "$PWD:/repo" -w /repo ghcr.io/koment-dev/koment:3 check
在 GitHub Actions 中,使用 uses: koment-dev/koment@v3。你也可以从最新版本下载带有校验和列表的 Linux、macOS 或 Windows amd64/arm64 二进制文件——其他所有渠道都基于这些相同的构建产物构建。
一分钟快速上手
在任意 Git 仓库中运行:
koment bootstrap
此操作会创建 .koment/,并为你使用的 Agent 配置相应连接。现在,记录一个原因并观察它如何接受检查:
koment add src/auth.go \
--excerpt 'if token.Expiry.Before(now.Add(-clockSkew)) {' \
--kind gotcha \
--title 'Skew subtraction keeps fast clocks logged in' \
--body 'Without it, clients whose clock runs fast get logged out
mid-request. Bit us in #412.'
koment check # ok
现在修改那一行,然后再次运行 koment check。 检查会失败,并告诉你哪些理由与对应代码不再匹配。这就是整个产品;其余部分只是将它交付给需要它的人和 Agent。
koment ui # read them in a browser
koment show src/auth.go
工作原理
-
你为一段代码添加注释。koment 会记录说明文字、精确摘录、周边源代码上下文、当时所在的提交,以及你的身份。
-
记录会写入
.koment/annotations/<id>.yaml,每条注释对应一个文件。并发运行的 Agent 会创建彼此独立的文件,而不是替换同一个共享列表。 -
解析器会在当前文件中搜索该摘录,并生成且只生成一种状态:
含义 构建 ok在上次找到的位置找到 通过 ambiguous仍有多个符合上下文的候选项 失败 drifted文件存在,但已找不到注释所指的代码 失败 orphaned文件已不存在 失败 -
遇到
ambiguous、drifted或orphaned时,koment check会以非零状态退出。这就是全部机制:不确定的理由比没有注释更糟,因此必须确保无法忽略。 -
检查失败时,运行
koment reanchor <id> --excerpt '<new text>'重新指向代码——保留其 ID 和创建日期,并为你重新采集上下文和行号。系统不会自动重新关联;必须由人确认原有理由仍然成立。
锚定依据是摘录,而不是行号——编辑上方的内容后,行号就会失效。系统会记录提交哈希,但它只用于还原历史;它不会决定注释是否仍然适用。这是两个不同的问题,需要用两种不同的机制处理。
本地写入会修改你当前正在审查的工作区。通过服务写入绝不会触碰副本或推送默认分支:它们会在确定性分支上创建精确注释,并且只会在拉取请求创建后返回。静态发布内容始终不可变且只读。
三种运行方式
任选一种。每种方式都是一个可停留的选择,而非必须经历的步骤,在它们之间切换不属于迁移——三者读取的都是 Git 中相同的 .koment/,因此无需导出、导入或备份。
| 你运行 | 你获得 | |
|---|---|---|
| 本地 | CLI、koment ui --write 和 koment mcp --write | 人员和 Agent 读取并写入相同的已校验记录。无需托管任何服务。 |
| 发布 | 一个工作流文件 → GitHub Pages | 所有人都能在浏览器中阅读注释。无需服务端,无需设计身份验证,也无需付费。 |
| 服务 | 容器或 Helm chart | 经过身份验证、带有提交标记的 GitHub 快照,支持多个代码库、跨代码库搜索、经过审查的注释 PR 和指标 |
多个代码库
一次部署即可服务多个代码库。身份独立于提供方路径分配,每次刷新都会先将分支解析为一个不可变提交,再替换代码库的活动快照:
# yaml-language-server: $schema=https://raw.githubusercontent.com/koment-dev/koment/main/schema/server.schema.json
repositories:
- id: payments
name: Payments API
provider: github
remote: you/payments
default_branch: main
default: true
- id: web
name: Customer Web
provider: github
remote: you/web
default_branch: main
只有在非回环监听器配置了可信代理身份或限定范围的 bearer 凭证后,服务才会启动。私有代码库和经过审查的写入还需要 GitHub 令牌。Helm chart 文档介绍了密钥格式和边界。
本地命令无需这些配置——koment 会从工作目录向上查找所属工作区。
Kubernetes
koment 会将 OCI Helm chart 发布到 oci://ghcr.io/koment-dev/charts/koment:
helm install koment oci://ghcr.io/koment-dev/charts/koment \
--set repositories[0].remote=you/your-repo \
--set metrics.enabled=true \
--set metrics.serviceMonitor.enabled=true \
--set metrics.dashboard.enabled=true
应用端口会对源代码、说明文字、UI 和 MCP 进行身份验证;只有存活状态和就绪状态检查是公开的。指标使用单独的监听器,避免入口控制器意外地将其与应用身份验证一起暴露。该 chart 包含 Grafana 仪表板、ServiceMonitor、强化的 Pod 默认配置、可选的 NetworkPolicy 和中断控制,以及固定摘要的 helm test 探测。
配置
每个标志都可以通过环境变量设置。--flag-name 会变成
KOMENT_FLAG_NAME,显式指定的标志始终优先。
KOMENT_CONFIG | 严格的已服务仓库 YAML |
KOMENT_CREDENTIALS_FILE | 包含 SHA-256 持有者哈希和仓库作用域的密钥文件 |
KOMENT_GITHUB_TOKEN_FILE | 用于私有读取和经审核写入的提供方令牌文件 |
KOMENT_LISTEN | 本地 UI 或统一服务地址 |
KOMENT_HUMAN_WRITES | 允许来自受信任 OIDC 代理的身份创建经审核的注释 |
KOMENT_TRUSTED_PROXIES | 允许声明转发的人类身份的 CIDR |
KOMENT_SYNC_INTERVAL | 提供方快照刷新间隔 |
KOMENT_METRICS | 独立的指标监听器;除非设置,否则关闭 |
KOMENT_WRITE | 启用本地 UI 或 stdio MCP 变更 |
KOMENT_OUT | 静态发布输出目录 |
Git 是唯一的权威记录。本地读取会直接根据工作树解析 YAML;可丢弃的读取模型无法恢复或覆盖 Git。
koment <command> --help 会列出每个标志及其对应的变量。
在代码所在之处工作
参考 VS Code 扩展会启动 koment lsp,
将注释正文呈现为虚拟内联文本,将漂移和违规评论报告为诊断,并添加原生的添加、重新定位、转换和显式
确认操作。说明文字绝不会插入源缓冲区。
每个版本都会附带经过签名的 VSIX,并将同一构件发布到 VS
Code Marketplace 和 Open VSX。
其他编辑器可以使用 koment lsp 提供的标准悬停、诊断、代码透镜、代码操作
和执行命令接口,无需重新实现存储或锚定功能。
Claude Code 可以安装仓库自带的项目级 Marketplace 插件:
/plugin marketplace add koment-dev/koment
/plugin install koment@koment-dev
它捆绑了可写的 MCP 配置,在会话开始时注入严格流程,并在 Claude 完成一轮对话前运行策略门禁。请先安装已发布的 koment 二进制文件,并在仓库中运行 koment agents install。
OpenCode 在
integrations/agent-plugins/opencode/ 提供了并行插件。
将 @koment/opencode-koment 添加到 opencode.json 中的 plugin 数组;OpenCode
会在启动时安装它。它要求 PATH 中有已发布的 koment 二进制文件,
会拒绝普通的说明性评论意图,并在会话结束时运行策略门禁。ADR 0144 记录了软件包和生成适配器的边界。
Codex 通过
integrations/agent-plugins/codex/ 中的本地 Marketplace 提供相同的策略接口。
使用 codex plugin marketplace add 安装该检出路径,然后运行
codex plugin add koment@koment-dev。发布工作流也会生成经过签名的归档文件。该插件提供可写的 MCP 工具、常驻技能和受信任的生命周期钩子。ADR 0151 记录了软件包边界。
交给你的 Agent
koment agents install
koment mcp --write
生成的仓库适配器为 Agent 提供严格的操作流程,并配置可写入的 stdio 服务。它提供三个读取工具:
koment_get(file, repository?)— 获取 Agent 即将编辑的文件的注释koment_search(query, repository?)— 按主题查找理由;省略repository时会搜索所有仓库koment_repositories()— 查看此部署服务的仓库及其数量
写入模式会增加四个工具:
koment_add— 创建带有 Agent 归属信息的理由koment_reanchor— 显式移动现有锚点koment_convert_comment— 将评论记录为理由,然后移除该评论koment_acknowledge_comment— 仅在显式确认后保留特殊评论
这四个变更工具都在本地检出版本上操作。经过身份验证的 MCP 服务接口会公开 koment_add,并返回确定性的分支、提交和拉取请求 URL;会修改源代码的转换和重新锚定操作则保留在本地,避免服务覆盖 Agent 的独立工作树。
每条注释都会附带其解析状态和所属仓库,因此过时的注释绝不会被当作当前信息展示,查询结果也不会脱离其适用范围。当某个路径存在于多个仓库中时,koment_get 会拒绝操作并列出候选项,而不是猜测。
| Claude Code | Cursor | VS Code |
| Zed | Codex | opencode |
| Hermes | OpenClaw | 其他工具 |
发布
审阅者不会安装任何东西。给他们一个 URL 即可:一个工作流文件会将所有注释渲染为静态 HTML,以及 annotations.json 和 search.json,然后将原子快照发布到 GitHub Pages,无需设计服务器、数据库或身份验证。
- uses: actions/checkout@v7
- uses: koment-dev/koment@v3
- run: koment check
- run: koment site --out dist
每个页面都会标明其渲染所依据的提交,因此快照绝不会被误认为当前代码树。同一工作流中的 koment check 会确保任何存在偏差的构建在发布前失败。
网站除了注释也会渲染源代码,因此从私有仓库发布网站就会公开该源代码。分组发布会为每个仓库渲染一个快照,并通过常规仓库切换器将它们连接起来;不会有选择器首页。
文档
koment 不是什么
- 不是通用项目文档。 koment 保存的是与代码中的某个位置绑定的知识;宽泛的项目指南应放在团队已经使用的文档系统中。
- 不是记忆系统。 汇总型存储会改述、合并,并最终遗忘。koment 是记录,而非观点。
- 不是精确到行的。 锚点是代码片段。
相关先例
Codetations / Magic Markup 是最接近的现有项目——提供位于文档之外的注释,并使用大模型重新锚定。锚定问题可追溯至 Microsoft Research,2001 年,至今在一般情况下仍未解决。它的界面形态借鉴了 konflate:konflate 为 Flux 显示一个不可见层,而 koment 也试图以此方式呈现理由。
许可证
除 integrations/editors/zed/ 外,本仓库适用 AGPL-3.0-or-later 开源许可。该扩展的代码单独适用 GPL-3.0-or-later,以便 Zed 能够通过其注册表构建并分发该扩展;它启动的 koment 二进制文件仍适用 AGPL。两份许可证文件均为原文,以便自动扫描工具正确识别。ADR 0145 记录了这一有限例外。
完整的对应源代码即为本仓库:https://github.com/koment-dev/koment。对于通过网络与 koment 服务交互的任何人,本仓库满足 AGPL §13 的义务。
对于政策不允许使用 AGPL,或希望获得保修或赔偿的组织,可按需申请商业许可证 — 请发送邮件至 [email protected]。
≤ v0.6.0 的版本以 MIT 许可证分发,并永久保留 MIT 许可。可无限期依据这些条款,从最后一个带 MIT 标签的源代码 v0.6.0 创建分支。相关决定记录在 ADR 0117 中。
使用 koment 会让我的代码也适用 AGPL 吗? 不会。koment 是一种工具;它写入的注释属于数据,而非该工具的衍生作品。这与使用 GCC 编译程序的法律性质相同:工具的许可证约束的是工具,而非你用它构建的内容。这也是所有经 OSI 批准、用于处理外部输入的 AGPL 部署所秉持的意图;如果你所在组织的法律顾问对此有异议,商业许可证可以解决问题。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。