内容
<p align="center">
<img src="docs/argot-logo.svg" alt="argot" width="200" />
</p>
<p align="center">
<strong>你的代码库有自己的声音。argot 让 AI 编写的代码说出你的声音。</strong><br/>
<em>AI 编写代码。argot 通过唯一不会产生幻觉的东西来利用它:你的存储库自己的历史。统计数据,而不是第二个大型语言模型 — 标记你从未使用的依赖项、你已经编写过的函数、破坏你分层结构的导入语句、静默削弱的测试、只有你的团队知道的约定。100% 本地运行,可重放。</em>
</p>
<p align="center">
<a href="https://argot.tmonier.com"><strong>argot.tmonier.com</strong></a>
·
<a href="https://argot.tmonier.com/docs/">文档</a>
·
<a href="https://argot.tmonier.com/benchmarks">基准测试</a>
·
<a href="https://argot.tmonier.com/caught-in-the-wild">实际应用</a>
·
<a href="docs/research/README.md">研究日志</a>
</p>
<p align="center">
<a href="https://github.com/get-tmonier/argot/releases/latest"><img src="https://img.shields.io/github/v/release/get-tmonier/argot?color=E67E45" alt="发布版本" /></a>
<a href="https://www.npmjs.com/package/@tmonier/argot"><img src="https://img.shields.io/npm/v/@tmonier/argot?logo=npm" alt="npm" /></a>
<a href="https://github.com/get-tmonier/argot/actions/workflows/ci.yml"><img src="https://github.com/get-tmonier/argot/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
<a href="https://github.com/get-tmonier/argot/blob/main/LICENSE"><img src="https://img.shields.io/github/license/get-tmonier/argot?color=E67E45" alt="许可证" /></a>
<img src="https://img.shields.io/badge/status-alpha-5B8DEF" alt="状态:alpha" />
<img src="https://img.shields.io/badge/rust-single%20static%20binary-DEA584?logo=rust&logoColor=white" alt="Rust" />
<img src="https://img.shields.io/badge/100%25-local%20%C2%B7%20no%20cloud-brightgreen" alt="100% 本地运行,无云服务" />
· <a href="https://argot.tmonier.com/docs/languages/">11 种语言 →</a>
</p>
<p align="center">
<a href="https://argot.tmonier.com/#film"><img src="landing/public/argot-film-poster.jpg" alt="观看 argot 发布影片" width="220" /></a>
<br/>
<em>🎬 <a href="https://argot.tmonier.com/#film">观看 45 秒发布影片</a></em>
</p>
---
类型检查器会问 *"这是有效的吗?"*,而 argot 会问代码评审中曾经存在的问题: *"这是我们这里的做法吗?"* — 并捕获那些完美、类型正确、 lint 清洁但仍然不属于这里的 AI 代码。它通过你的存储库自己的历史提供统计数据 — 统计核心确定且可重放,全部本地运行 — 从不使用第二个大型语言模型来判断第一个。
它还会问另一个问题,没有其他工具会问:**AI 是否公平?** 当智能代理无法使失败的测试通过时,达到 "完成" 的最便宜的方法是使测试停止寻找。argot 读取每个 diff 的两侧,并将削弱、禁用或删除的测试与它所覆盖的生产变更配对。
### 五个学习检测器 - 加上只有你的存储库才能编写的规则
| | 规则 | 它捕获的内容 | |
| :-- | :-- | :-- | :-- |
| 🚫 | **`foreign-import`** + 朋友 | 依赖项、API 或你的存储库从未使用过的惯例 | *"我们不这样做"* |
| ♻️ | **`redundant`** | 一个新函数 **重新发明你已经拥有的函数** | *"你已经有这个了"* |
| 📍 | **`misplaced`** | 正确代码,存放在 **错误的位置** | *"这不属于这里"* |
| 🧱 | **`layering`** | 内部导入 **反转你的架构** | *"我们从不跨越这个边界"* |
| 🧪 | **`test-deleted`** + 朋友 | 测试 **被静默削弱、禁用或删除**,同时覆盖生产变更 | *"不要玩弄测试"* |
| 📜 | **你自己的规则** | 只有你的存储库才有的 **约定** — 脚本化,无需重新编译 | *"这是我们的做法"* |
前五个是从 git 历史中学习的。第六个是由你编写的 - 它是每个 linter 配置你的团队真正关心的部分。
## 开始使用
```sh
# 安装(单个静态二进制文件 - 无需 Python,无需 Node)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/get-tmonier/argot/releases/latest/download/argot-installer.sh | sh
```
Windows:`powershell -c "irm https://github.com/get-tmonier/argot/releases/latest/download/argot-installer.ps1 | iex"` · npm:`npm install -g @tmonier/argot`
** sixty 秒证明,零设置,在你自己的历史记录上:**
```sh
argot audit # ⏪ AI 在你最后 50 次提交中偷偷放入了什么?
```
`audit` 适合它在 50 次提交之前(在临时工作树中 - 你的树保持不变),重新评估自那以来的所有内容,并将每个发现归因于其引入的提交 - **AI 辅助 / 人类 / 未知**,仅从具体的提交标记:
```
━━ argot audit ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最近 50 次提交 · 52% 带有 AI 标记 · 1 个发现本应通过审核
最严重的违规 - 提交 cae8349 · AI 辅助
! landing/src/pages/llms-full.txt.ts:L1-32 · foreign-import
↳ astro (L1),astro:content (L2) - 49 个模块说明符中…
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
终端卡片以可复制粘贴的 **分享标题** 结束,而 `argot audit --format html` 是一个可以直接截图的卡片 - 发布你的得分。
然后适配今天的声音,以便 `check` 在合并之前提出这些问题:
```sh
argot init # 学习此存储库的声音(在 1,100 个文件的存储库上约 25 秒)
argot check # 用它评估你的工作更改
```
准确性是设置的函数 - argot 从它被允许看到的内容中学习。最佳路径:`npx skills add get-tmonier/argot`,然后在你的编码代理(Claude Code,Cursor,70+ 个代理)中 `/argot-setup` 读取你的存储库,排除不应形成声音的内容,并验证捕获。完整指南:[设置](https://argot.tmonier.com/docs/setup/) · [开始使用](https://argot.tmonier.com/docs/getting-started/)。
**Claude Code - 一次安装即可完成所有操作。** [argot 插件](https://argot.tmonier.com/docs/plugin/) 捆绑了五个技能、 [MCP 服务器](https://argot.tmonier.com/docs/agents/) (`argot mcp` - 在你的代理编写代码时提供主动的声音上下文),以及一个可选的、非阻塞的预写入护栏,询问是否在引入外部依赖项之前:
```text
/plugin marketplace add get-tmonier/argot
/plugin install argot@argot
```
其他代理(Cursor,Codex,70+):`npx skills add get-tmonier/argot`。
## 演示
<p align="center">
<img src="docs/demo/demo.gif" alt="argot check 标记一个与 FastAPI 代码库中所有 Django 风格的视图" width="760" />
</p>
PR 添加了 **Django 风格的视图** 到一个全 FastAPI 代码库。mypy 和 ruff 是沉默的 - 它到达的框架是存储库从未导入过的:
```
argot check · 1 个区块超过阈值(1 个外来)
fastapi/receipts.py
! L1-L10 1.00 外来 · 已分阶段 · foreign-import [94a92c256ea1]
↳ django (L1) - 存储库中 74 个模块说明符中的 0 个
这里很常见:fastapi (357 次),pydantic (129 次),typing (129 次) (+7 次)
1 | from django.views import View
^^^^^^
```
`redundant` 命名你已经有的函数(`↳ duplicates slugify(src/utils/text.py:14)- 相似度 0.86`),`misplaced` 命名代码应该存放的位置,`layering` 命名导入反转的方向,每个 `↳` 行都是你存储库的证据。完整解剖:[阅读输出](https://argot.tmonier.com/docs/reading-the-output/) · [它捕获的内容](https://argot.tmonier.com/docs/what-it-catches/).
## 你自己的约定,作为规则
每个团队都有通用 linter 没有的约定: *"表示性组件接受道具 - 它们不获取"*, *"文件通过我们的加载器解析,而不是原始的 `JSON.parse`*, *"一个存储库一个 HTTP 客户端"*。它们存在于评审评论和上岗文档中 - 直到 AI 代理人阅读了它们,合并了它们。借助 argot,它们是 **存储库本地规则**:一个 TOML 清单 + `.argot/rules/` 中的小型沙盒脚本,与你的代码版本控制,无需插件构建,无需重新编译,一个适用于所有 11 种语言的规则格式。
而且它们可以做经典 linter 无法做的事情。 linter 看到一个文件的一个版本;argot 提供 **diff 的两侧** - 所以你可以编写关于更改 **删除** 的规则:
```toml
# .argot/rules/no-dropped-endpoints/rule.toml
[rule]
schema = 1
name = "no-dropped-endpoints"
description = "删除公共端点需要一个弃用周期 - 捕获 diff 中静默消失的路由"
severity = "error"
languages = ["typescript", "javascript"]
```
```rhai
// check.rhai - 以前存在此路由,现在消失了
const ROUTES = "(call_expression function: (member_expression property: (property_identifier) @verb)
arguments: (arguments (string (string_fragment) @path)))";
let now = [];
for m in ts_query(ROUTES) { if m.capture == "path" { now.push(m.text); } }
for m in ts_query_old(ROUTES) {
if m.capture == "path" && !now.contains(m.text) {
report(m.line, "端点 '" + m.text + "' 未进行废弃周期 - 见 docs/api-lifecycle.md");
}
}
```
没有 ESLint 插件可以表达该规则 - 没有 "旧侧面" 在 linter 中存在。 由于 argot 适合你的历史记录,规则的允许列表可以是 **你自己的 git 日志记录**:`import_attested("moment")` 询问 *"此存储库是否曾经使用过此日期库?"* - 没有硬编码的列表,也无需维护。规则仅在 **更改的文件上运行**(采用一项创建的零后台噪音),并且它们的发现被抑制、配置和呈现与内置规则完全相同。`argot rules test` 是红绿作者循环。完整参考 + 工作示例: [自定义规则](https://argot.tmonier.com/docs/custom-rules/).
## 代理无法操纵的规则
一个 AI 代理无法满足检查时会寻找最便宜的绿色:静音规则、降低本地配置、`--rule it=off`,或者对于自定义规则 - 直接重写捕获它的脚本。锁定规则并关闭所有这些门:
```toml
[rules]
layering = { severity = "error", locked = true }
custom = { severity = "error", locked = true } # 锁定每个存储库本地规则
```
一个 **锁定** 规则(仅限于已提交的 `argot.toml`):
- **冻结其严重性** - `argot.local.toml` 和 `--rule` 覆盖被拒绝;
- **拒绝其发现的所有抑制表面** - 内联 `# argot: ignore`,`[[mute]]` 和 `[exclude].paths` 不适用;
- 而 - **削弱锁定本身就是一个发现。** `rule-tampered`(组 `governance`,固定 `error`,不可抑制)读取 **正在检查的 diff 的两侧` 并在更改删除锁定、降低锁定严重性、在锁定规则上添加 `[[mute]]` 或编辑锁定自定义规则的脚本时触发 - 并带有 CI 上的大警告提示( `--format github` 下的 PR 注解)。
篡改**证据**,而不是篡改证明 - 与测试完整性规则相同的哲学:代理 *可以* 触摸警报,但触摸警报 **就是** 警报。唯一安静的方式放松锁定规则是提交的 `argot.toml` 差异人类审查。指南: [锁定规则](https://argot.tmonier.com/docs/configure/#locked-rules--agent-cant-turn-off-the-alarm).
## 配置它像任何 linter 一样
每个规则(内置或您自己的)默认为 `argot.toml [rules]` - `error` / `warn` / `off`,按规则或按组 - 或通过 `--rule layering=warn`。 `[rules]` 条目还可以作用于路径 (`layering = { include = ["src/**"] }`)。排除`。 `[rules]` 条目还可以限定规则的作用域到路径(`layering = { include = ["src/**"] }`)。 排除项为 gitignore 样式的 `[exclude].paths`;内联 `# argot: ignore-next-line rule=… — reason` 和 `argot mute <hash>` 提供行级和持久的提交接受。指南: [配置](https://argot.tmonier.com/docs/configure/) · [命令](https://argot.tmonier.com/docs/the-commands/).
### argot vs. 你已经运行的工具
| | 类型检查器 | 静态代码分析工具 | Copilot · SAST | argot |
|---|:---:|:---:|:---:|:---:|
| 捕获无效代码 | ✅ | ✅ | ~ | — |
| 标记与 *此* 存储库不符的内容 | ❌ | ❌ | ❌ | ✅ |
| 标记你已经有的函数 | ❌ | ❌ | ❌ | ✅ |
| 标记代码错误放置的位置 | ❌ | ❌ | ❌ | ✅ |
| 标记破坏层级的导入语句 | ❌ | ❌ | ❌ | ✅ |
| 标记静默削弱的测试以操纵失败的测试套件 | ❌ | ❌ | ❌ | ✅ |
| 强制执行 **您团队的自定义约定**,跨语言,在 diff 上 | ❌ | ~ | ❌ | ✅ |
| **锁定** 规则,智能代理无法在不被发现的情况下静默、覆盖或重写 | ❌ | ❌ | ❌ | ✅ |
| 审核合并的历史记录 · **归因发现 AI 与人类** | ❌ | ❌ | ❌ | ✅ |
| 从 *您的* 历史记录中学习 · 本地运行 100% | ❌ | ❌ | ❌ | ✅ |
argot 是附加的:它位于 **您的类型检查器和静态代码分析工具之后**,捕获它们无法捕获的内容 - 有效且 lint 清洁但与您的团队编写的内容不同。它是围绕 AI 输出的保护措施,基于唯一不会产生幻觉的东西:您的存储库的历史记录。
## 基准测试
**诚实、没有漏洞的数字**,通过实际的 `fit → check` 管道衡量 - 外来固定装置插入到实际主机文件中;假警报在临时保留集上计数:
- **外来捕获 - 595/605(98%)** 当 diff 中外来符号可见时 · **假警报率 0.29%** 在 22,513 个真实块中(最差语料库 1.46%)
- **架构 - 244/252(96.8%)** 捕获 · **0/140** 对照组标记 · ≤2.7% 在重放的历史记录中过度触发
- **重新发明 - 中位数 89%** 在 ≤4.5% 假火每块 · **错误放置 - 85–99%(中位数 96%)** 在 ≤1.2%,其中存储库具有可分离的架构
- **测试完整性 - 144/153(94.1%)** 捕获游戏战术 · **0/102** 合法重构控制 · 1.12% 在 5,268 个重放的已接受测试触摸提交中标记为门控严重性
一个文档化的限制:**掩盖的外来** - 外来符号的名称与您已经使用的名称冲突,在语音模型中统计学上不可见。我们发布这个数字而不是隐藏它。方法如下:捕获率在 **预注册的细则** 下使用我们编写的固定装置进行测量;假警报在模型从未见过的真实提交中计数。欢迎独立验证 - 这就是可复制的框架。
语言和语料库表格、方法论、置信区间: [基准测试页面](https://argot.tmonier.com/benchmarks) (CI 提供,不能偏离已发布的版本)。想验证一种语言? [打开一个问题](https://github.com/get-tmonier/argot/issues/new).
数字是一回事;实际的 diffs 是另一回事。 **[实际应用](https://argot.tmonier.com/caught-in-the-wild)** 收集了 33 个开源存储库的实际发现,这些存储库的最后一年历史记录均经过 argot 运行 - 每个存储库都由一名评审员故意攻击以驳斥它,并且每个存储库都幸存下来了。
## CI
```yaml
- uses: get-tmonier/argot@main # 非阻塞语音评分应用于每个 PR
```
`--format github` 打印内联 PR 注解; `--format sarif` 馈送代码扫描; `--format json` 是一个稳定的模式。添加 `publish-badge: true`(带有 `contents: write`)以获取实时 README 徽章 - `argot · N% in-voice`,每次推送时更新。复制粘贴设置包括 pre-commit: [CI 指南](https://argot.tmonier.com/docs/ci/).
## 它是如何工作的
五个学习检测器,一个真相来源 - 您的 git 历史记录 - 加上您自己编写的规则。统计语音模型(两个频率表 + 调用者集群分区 - 无需神经网络)捕获外来导入、调用者和令牌形状;本地代码嵌入模型(jina-code 通过静态链接的 llama.cpp)捕获重新发明和错误放置;模块依赖图捕获层级逆转;测试库存差异捕获被操纵的测试。几秒钟内适应,毫秒级检查,机器上什么也不留下 - 每个判决都是您可重放的统计数据。完整细节: [工作原理](https://argot.tmonier.com/docs/how-it-works/) · [评分模型](https://argot.tmonier.com/docs/the-scoring-model/) · [性能](https://argot.tmonier.com/docs/performance/) · 实验日志在 [docs/research/](docs/research/README.md).
## 贡献
问题和 PR 欢迎 - 从 [CONTRIBUTING.md](CONTRIBUTING.md) 开始:
```sh
git clone https://github.com/get-tmonier/argot && cd argot
just build # cargo build --release -p argot → target/release/argot
just verify # cargo fmt --check + clippy -D warnings + cargo test
```
## 致谢
argot 与用于基准测试的实际存储库一起使用,这些存储库作为 **只读语料库** - 在基准测试时克隆,从不重新分发,每个存储库都有自己的许可证,没有一个与 argot 相关联:FastAPI, rich, faker, Saleor, Wagtail, Dagster, Scrapy, Hono, Ink, faker-js, Excalidraw, Outline, Express, Commander.js, ESLint, GitHub CLI, Hugo, ripgrep, bat, Guava, JUnit 5, PowerShell, Jellyfin, redis, curl, RocksDB, fmt, Homebrew, RuboCop, Laravel, 和 Composer.
基于 [tree-sitter](https://tree-sitter.github.io/tree-sitter/)(11 种语法), [libgit2](https://libgit2.org/) 通过 [git2](https://docs.rs/git2/),HuggingFace [tokenizers](https://github.com/huggingface/tokenizers)(UnixCoder BPE), [Rhai](https://rhai.rs/)(脚本规则), [clap](https://docs.rs/clap/), [Serde](https://serde.rs/), 和 [cargo-dist](https://opensource.axo.dev/cargo-dist/). 语义层链接 [llama.cpp](https://github.com/ggml-org/llama.cpp)(MIT)通过静态 [`llama-cpp-2`](https://crates.io/crates/llama-cpp-2);其模型是 [**jina-embeddings-v2-base-code**](https://huggingface.co/jinaai/jina-embeddings-v2-base-code) 由 [Jina AI](https://jina.ai/) 提供(Apache-2.0),在首次使用时作为 `Q4_K_M` GGUF 量化(Apache-2.0 §4 的派生作品)从 [`semantic-model-v1`](https://github.com/get-tmonier/argot/releases/tag/semantic-model-v1) 版本发布。 argot 与 Jina AI 无关,也不由其赞助。
## 隐私
argot 100% 本地运行 - 无需遥测,无需账户,您的代码永远不会离开您的机器。完整政策: [argot.tmonier.com/privacy](https://argot.tmonier.com/privacy).
## 许可证
MIT
连接信息
猜你喜欢
暂无推荐服务器