mmnto-ai/totem
GitHub: mmnto-ai/totem
为 AI 代理提供持久化记忆与强制执行层的 CLI 工具,解决上下文遗忘与架构一致性退化问题。
Stars: 13 | Forks: 4
# 图腾
_AI 编码代理是优秀的金鱼。Totem 是它们持久化、跨仓库的记忆。_
在使用大型语言模型处理项目时,我发现代理不断犯同样的架构错误。它们忘记上下文,并重新发明已经存在的辅助工具。速度很快,但架构完整性很快退化。每个 PR 都变成了与审查机器人就琐事的反复拉锯。
它们可以让错误的方式看起来精彩(直到你意识到发生了什么)。它们很少会问:_“难道已经存在一个共享的辅助工具了吗?”_
Totem 是为了解决这种摩擦而提取出来的。它是一套 CLI 工具,为 AI 代理提供持久化内存和强制执行层。它使用确定性钩子来记住 AI 忘记的教训。
- [文档仅是一种建议](#documentation-is-merely-a-suggestion)
- [错误如何变成规则](#how-mistakes-become-rules)
- [记忆层](#the-memory-layer)
- [盒中有什么](#whats-in-the-box)
- [有效与无效的实践](#what-works-and-what-doesnt)
- [快速入门](#quickstart)
- [立即体验](#try-it-live)
- [文档与工作流](#documentation--workflows)
## 文档仅是一种建议
我尝试了那种规定代理每一步工作流程的沉重编排方法,发现它僵硬且会破坏人类参与的动态。Totem 基于不同的哲学构建:**触发线,而非轨道。**
你提供一个被电围栏包围的开放场地。LLM 可以自由地以任何方式编码,但当它试图改变世界的永久状态时(例如 `git push`),它会撞上确定性触发线。
Totem 将纯英文课程说明转化为物理约束,由一个本地的、零 LLM 的代码检查工具强制执行:
**输入:**(`.totem/lessons/no-child-process.md`)
```
## 课程 - 永远不要使用原生子进程
Tags: architecture
Direct use of `node:child_process` is forbidden outside `core/src/sys/`. Use the `safeExec` shared helper instead.
```
**输出:**(`git push` 在代理机器上被阻止)
```
$ git push
[Lint] Running 393 rules (zero LLM)...
### 警告
- **packages/cli/src/git.ts:22** - Never use native child_process
Pattern: `import { execSync } from 'node:child_process'`
Lesson: "Direct use of `node:child_process` is forbidden outside `core/src/sys/`. Use the `safeExec` shared helper instead."
[Lint] Verdict: FAIL - Fix violations before pushing.
```
“错误”的方式变成了“嘈杂”的方式。运行时没有 LLM 介入。只是亚秒级的离线强制执行。
## 错误如何变成规则
核心循环很简单。一个错误在 PR 审查、机器人检查或生产 Bug 中被捕获。我写一份纯英文的课程说明,解释哪里出了问题。`totem compile` 将课程说明转换为 AST 或正则规则,`totem lint` 在此后每次推送时强制执行该规则。同样的错误永远不会再发生。
```
graph LR
Catch["Catch a mistake"] -->|write a lesson| Compile["totem compile"]
Compile -->|generates rule| Enforce["totem lint"]
Enforce -->|catches next attempt| Catch
style Catch fill:#4b3a75,stroke:#9b72cf,color:#fff
style Compile fill:#5e3a24,stroke:#e67c3b,color:#fff
style Enforce fill:#1a4d2e,stroke:#34a853,color:#fff
```
当规则匹配注释或字符串字面量而不是实际代码时,`totem doctor` 会将其标记为嘈杂,并通过上下文遥测建议升级。`totem compile --upgrade` 会使用针对精度优化的提示重新运行编译器。我宁愿有 300 条精确规则,也不愿有 1000 条嘈杂规则。
## 记忆层
默认情况下,AI 代理是无状态的。每个新会话都从零开始,没有任何对先前事件或已编写共享辅助工具的记忆。你最终不得不反复解释相同的上下文。
Totem 通过将你的课程说明和 ADR 编入本地语义知识库(Tree-sitter + LanceDB)来解决这个问题。该索引以纯文件形式保留在你的仓库中,因此没有云依赖,也没有供应商锁定。
任何兼容 MCP 的代理都可以查询它:Claude、Gemini、Cursor、Windsurf、GitHub Copilot。在你的代理编写代码行之前,它可以询问“此代码库中有哪些禁止的模式?”或“认证系统的架构是什么?”,并获得基于你项目实际历史的真实答案。
通过[跨仓库网格](docs/wiki/cross-repo-mesh.md),你可以在兄弟仓库之间进行联合搜索。一个仓库的课程说明可以被所有关联仓库查询,因此上下文不会在仓库边界处停止。
## 盒中有什么
Totem 是一套 CLI 工具,而不是一个框架。你可以将构建模块连接到你已有的任何 CI 和工作流中。每个命令都支持 `--json` 以用于脚本编写。
| 命令 | 功能 |
|------|------|
| `totem lint` | 在你的代码上运行所有已编译的规则。零 LLM、离线、亚秒级。 |
| `totem compile` | 将纯英文课程说明转换为 AST 或正则规则。 |
| `totem extract` | 从 PR 审查和机器人评论中提取课程说明。 |
| `totem doctor` | 通过上下文遥测标记嘈杂规则,并建议升级。 |
| `totem spec` | 在接触任何代码之前从 GitHub 问题生成实现说明(LLM 驱动,需要 API 密钥)。 |
| `totem review` | 在未提交的差异上进行 LLM 驱动的架构审查(需要 API 密钥)。 |
| `totem sync` | 从你的课程说明和文档中重建语义索引。 |
| `totem hooks` | 安装 Git 钩子(`pre-push` 审查门控)。 |
内置的 MCP 服务器将知识库暴露给任何兼容代理。这是相同的索引,无需额外设置。
## CI/CD 与 GitHub 集成
因为 `totem lint` 是确定性的且运行时间不到两秒,它可以无缝地集成到 CI 流水线中。三种输出格式分别为:`text`(默认)、`json`(用于脚本编写)和 `sarif`(用于安全仪表板):
```
totem lint --format sarif --out totem.sarif
```
将 SARIF 文件通过标准 `github/codeql-action/upload-sarif` 操作或任何兼容 SARIF 的工具传入 GitHub Code Scanning,Totle 的触发线会作为内联 PR 注解显示在违反规则的代码旁边。该流被刻意限制为仅错误严重性的发现,以防止 PR 审查被暂挂警告淹没。警告会保留为本地遥测数据,直到规则积累足够信号后才升级。
相同的 `--format sarif` 标志也适用于无需 Node.js 的独立 `totem-lite` 二进制文件。CI/CD 集成请参考[CI/CD 集成](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/ci-integration.md)中的流水线配方。
## 有效与无效的实践
Totem 有三个层次,我想诚实地说明每个层次的现状:
1. **强制执行层有效。** 已编译的规则和 Git 钩子能在不到 2 秒内机械且离线地捕获违规。这是所有其他功能所依赖的承重地板。该地板上的任何内容都不会接触网络,因此可以在隔离环境中原生运行。不会有源代码离开你的机器。
2. **规划层也有效,这让我惊讶。** 在代理编写任何代码之前,`totem spec` 会提取 GitHub 问题正文并查询知识库以获取相关的课程说明和 ADR。它会编写一份结构化的实现说明到 `.totem/specs/.md`。该说明包含架构上下文、需要检查的文件、问题描述中遗漏的边缘情况,以及内联注入的已检索课程说明作为不变量的任务驱动 TDD 指令。这些都不是硬性触发线。代理可以编写模糊的说明并忽略检索到的上下文。但在实践中,结构化的提示可靠地抓住了“即将重新发明一个已存在的辅助工具”的情况,这在我最初添加它之前并未预料到。速度和架构一致性中很大一部分来自这个上游门控,比我最初添加时预期的更多。
3. **记忆层是真实的基础设施。** 索引确实存在。它是跨仓库可移植的,任何 MCP 代理都可以查询它。但代理**持续地**基于检索到的上下文采取行动,是一个我正在积极研究的开放问题。可用性是确定性的,但代理的纪律性不是。
我构建强制执行层是因为上游层次本身并不足够。代理可以拥有干净的说明、上下文中的相关课程说明,但仍会在深入任务时偏离。触发线捕获了规划和记忆层遗漏的内容。这就是为什么将它们保持为三个独立层次而不是一个的原因:每一层都在工作流的不同阶段以不同的方式捕获故障类别。
## 更新日志
请查看[版本发布](https://github.com/mmnto-ai/totem/releases)了解最新更新。
## 快速入门
在任何项目(Node、Python、Go、Rust)中初始化 Totem:
```
pnpm dlx @mmnto/cli init
```
这会生成 `totem.config.ts` 并连接 `pre-push` Git 钩子。它还会安装基线规则包。
运行代码检查器(零设置、离线):
```
pnpm dlx @mmnto/cli lint
```
### 独立二进制文件(无需 Node.js)
如果你在非 JavaScript 生态系统中工作(Rust、Go、Python)且不想安装 Node.js,你可以从[版本发布](https://github.com/mmnto-ai/totem/releases)页面下载 **Totem Lite** 独立二进制文件。
```
# Linux (x64)
curl -L https://github.com/mmnto-ai/totem/releases/latest/download/totem-lite-linux-x64 -o totem
chmod +x totem && sudo mv totem /usr/local/bin/
# macOS (Apple Silicon)
curl -L https://github.com/mmnto-ai/totem/releases/latest/download/totem-lite-darwin-arm64 -o totem
chmod +x totem && sudo mv totem /usr/local/bin/
```
Lite 二进制文件包含完整的 AST 引擎,可以完全离线运行 `totem init`、`totem lint` 和 `totem hooks`。对于 Windows 及其他平台,请参考[安装指南](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/installation.md)。
## 立即体验
[Totem Playground](https://github.com/mmnto-ai/totem-playground) 是一个包含 5 个故意架构违规的预置 Next.js 应用。在 Codespaces 中它并运行 `totem lint`。Totem 会捕获每一个违规,无需任何配置或 API 密钥。然后尝试运行 `totem rule list --json`,以脚本化 API 的形式查看引擎。
## 文档与工作流
请参阅 Wiki,了解如何使用 Totem 来治理你的工作流:
- [**永不再发生:**](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/it-never-happens-again.md) 如何在 60 秒内将 PR 错误转化为永久的项目法规。
- [**治理 AI 代理:**](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/governing-ai-agents.md) 如何使用钩子和 MCP 工具从第一轮开始对 Claude 和 Gemini 强制执行项目规则。
- [**不再误报:**](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/it-stops-crying-wolf.md) 自愈循环如何根据开发者沮丧程度自动降级嘈杂规则。
### 深入探讨
- [CLI 参考](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/cli-reference.md)
- [架构与工作流](https://github.com/mmnto-ai/totem/blob/main/docs/reference/architecture-diagram.md)
- [MCP 服务器设置](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/mcp-setup.md)
- [CI/CD 集成](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/ci-integration.md)
## 开放核心承诺
**单仓库本地使用免费。多仓库集中治理需付费。** 强制执行引擎、课程管线、MCP 服务器和自愈循环均采用 Apache 2.0 许可,并将保持免费和开源。详见 [`COVENANT.md`](https://github.com/mmnto-ai/totem/blob/main/COVENANT.md)。
## 许可证
Apache 2.0 许可证。
标签:AI 代理, AI 安全, AI 编码, AI 记忆层, CLI 工具, LLM 辅助开发, MITM代理, Tripwires 架构, 上下文记忆, 云计算, 代码助手, 代码审查, 代码规范, 共享助手, 威胁情报, 开发效率, 开发者工具, 持久化内存, 持续记忆, 文档即建议, 本地 linter, 架构完整性, 确定性钩子, 约束与护栏, 网络可观测性, 自动化攻击, 规则引擎, 跨仓库记忆, 防止重复造轮子, 零 LLM 干预