内容
# DejaVu
[](https://github.com/HMAKT99/Dejavu/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/dejavu-dev)
[](https://github.com/HMAKT99/DejaVu#quick-start)
[](LICENSE)
**你的 AI 已经写过这段代码。** DejaVu 给你的代码库一个记忆,每个编码代理都共享这个记忆——没有人可以忽略它。
```
⚠ 重复 lib/helpers.ts:4
makeUrlSlug() 看起来与 utils/text.ts:2 中的 slugify() 有 98% 相似度
你的 AI 已经写过这段代码——请重复使用它
```
每个 AI 编码会话都从头开始。决定使用 Supabase RLS 而不是 API-layer auth 的决定是在三周前,在不同的工具中做出的,现在已经不可见——所以今天的会话悄悄地与之相矛盾,并第四次重写 `slugify()`。AI 辅助的代码库积累重复代码的速度是手写代码库的 **8 倍**,技术债务在 **大约 3 个月** 时累积到极限点,此时添加功能开始破坏现有功能。
**第 3 个月是 vibecoded 项目死亡的地方。DejaVu 是你的项目如何生存下去。**

<sub>15 秒快速演示 — [MP4 版本](docs/media/install.mp4) · 由 [`video/`](video/) 使用 Remotion 渲染</sub>
## 它做什么
1. **捕获** — 从 Claude Code / OpenClaw 会话记录中挖掘决策(启发式,无需 LLM),收获 `#decision:` 代码注释,并获取 `dejavu remember` 的所有内容。每个候选方案都经过你的审查队列——未经批准的内容不会被记录。
2. **注入** — 通过 `CLAUDE.md`、`AGENTS.md`、`。cursorrules`、OpenClaw `MEMORY.md` 中的托管块将活跃的决策投射到每个代理的上下文中——并通过 **MCP** 向任何询问的代理提供服务。决策在工具切换时仍然有效。
3. **强制执行** — `dejavu check` 标志与过去的决策或重复实现相矛盾的代码。作为 CLI、预提交钩子、GitHub Action 或实时代理钩子运行。警告优先;`--strict` 时强制执行。
思维模型:**git 用于代码,DejaVu 用于 *原因* 。**
## 快速开始
```bash
cd your-project
npx dejavu-dev init # DECISIONS.md + .dejavu/ (+ 可选的预提交钩子)
npx dejavu-dev mine # 从过去的 Claude Code 会话中收获决策
npx dejavu-dev review # 批准 / 编辑 / 拒绝每个候选方案
npx dejavu-dev project # 将决策推送到 CLAUDE.md、.cursorrules、...
npx dejavu-dev check # "我的上一次更改是否与任何内容相矛盾或重复?"
npx dejavu-dev score # 0-100 仓库健康度,字母评分,可分享的徽章
```
在包含的 wreck 中试用它:[`examples/spaghetti-app`](examples/spaghetti-app) — 一个 month-3 固定装置,植入了矛盾和两个 AI 重写的重复项。
## 为什么不是 ……
| | ADR 工具(AgDR,adr-agent) | PR 审查机器人(Qodo,CodeAnt) | 代理内存(Mem0,Cipher) | **DejaVu** |
|---|---|---|---|---|
| 从会话中自动捕获 | ✗ (人为纪律) | ✗ | ~ (事实,而不是决策) | ✔ |
| 跨所有工具工作 | ~ (仅限文档) | ✗ (他们的平台) | ✗ (每个框架) | ✔ (文件 + MCP) |
| 强制执行代码 | ✗ | ✔ (PR 时间,云) | ✗ | ✔ (本地,预提交) |
| 完全本地 | ✔ | ✗ | ~ | ✔ |
| 免费 | ✔ | ✗ (企业席位) | ~ | ✔ (Apache-2.0) |
ADR 工具验证了问题,但需要纪律,而 vibecoding 消除了这种纪律。审查机器人会在 PR 时间、在云中、按席位捕获漂移。内存工具存储偏好,而不是决策,并且不检查任何内容。DejaVu 是未被声称的组合:**捕获 + 注入 + 强制执行,本地且免费。**
双层设计是可移植的部分:仓库决策存储在 `DECISIONS.md` 中 **提交到 git** ——协作者的 Cursor 尊重你的 Claude Code 做出的决策,即使他们从未安装 DejaVu,因为仓库本身是导出格式。你的个人偏好存储在 `~/.dejavu/` 中,并且 **永远不会** 被提交(在代码中强制执行,通过测试证明——包括 `git check-ignore`)。
## 决策格式
```markdown
## D-014: 使用 Supabase RLS 进行授权(不是 API-layer 检查)
- 日期:2026-07-04 · 来源:claude-code 会话 · 状态:活跃
- 上下文:单租户应用,身份验证错误来自重复的 API 检查
- 规则:所有授权都通过 RLS 策略;API 路由中没有手动 user_id 过滤
- 适用于:src/api/**
- 检测:user_id\s*===?
- 取代:D-006
```
纯 markdown,零工具即可使用。`applies_to:` 通配符和 `detect:` 正则表达式使决策 **可强制执行**。改变主意会追加一个取代条目——历史是价值。`.dejavu/index.json` 是一个派生缓存,始终可再生;**markdown 是源头**。
## 命令
| 命令 | 它做什么 |
|---|---|
| `dejavu init` | 设置仓库(幂等);提供预提交钩子 |
| `dejavu remember "<title>"` | 记录决策: `--context`、`--rule`、`--applies-to`、`--detect`、`--supersedes`、`--queue`、`--global` |
| `dejavu mine` | 将会话 + `#decision:` 注释收获到队列 (`--source`、`--dry-run`、`--limit`) |
| `dejavu review` | 批准 / 编辑 / 拒绝队列中的候选方案(TUI,显示置信度 + 证据) |
| `dejavu project` | 更新代理上下文文件中的托管块 (`--to`、`--all`、`--check`、`--remove`) |
| `dejavu check [files]` | 更改文件的矛盾 + 重复 (`--staged`、`--all`、`--strict`) |
| `dejavu score` | 仓库健康度 0–100 + 等级 (`--json`、`--badge` → 本地 SVG) |
| `dejavu hooks install` | 预提交钩子 — 默认警告,`--strict` 阻止 |
| `dejavu serve` | MCP 服务器:`search_decisions`、`get_decision`、`check_against_decisions` ([docs/mcp.md](docs/mcp.md)) |
**CI:** [GitHub Action](docs/ci.md) 在任何仓库上运行 `check` + 投影过时检查 — 包括完全在网络平台上构建的仓库(Lovable、Replit、Bolt),因为仓库承载了账本。
## 配置
具有 **故意** 重复的仓库(脚手架模板,fixtures)可以通过 `.dejavu/config.json` 从 `check`/`score` 中排除路径:
```json
{ "exclude": ["cli/template/**", "fixtures/**"] }
```
## 性能
`dejavu check` 和 `dejavu score` 在 **50k-LOC 仓库(~2,400 个函数)上完成时间不到 1 秒** — 实测,非吹嘘。预提交容忍度是设计预算(3s);启发式提取 + 归一化令牌 shingles 与倒排索引在不使用嵌入、AST 解析器或网络的情况下达到此目标。
## 非目标(v0.1)
无云,无账户,无遥测,无嵌入/向量 DB,无完整 AST 分析(捕获常见 80% 的启发式优于完美分析)无 PR 审查评论(该通道已占用)。Windows:完整的测试套件在 CI 中原生运行(实验性);WSL 仍然是推荐路径。
## 贡献
影响最大的 PR 是您工具的 ~40 行适配器:[docs/adapters.md](docs/adapters.md)。金色文件测试使适配器 PR 变得微不足道地可验证 — 添加一个 fixtures 文件夹,运行 `UPDATE_GOLDEN=1 npm test`,审查差异。挖掘启发式 PR 由 `tests/heuristics.test.ts` 中的精度表控制:新模式不得在噪声集上触发。
```bash
npm install && npm test # 200+ 测试:金色文件,生成轮回,注入 fs 失败
npm run typecheck && npm run lint
npm run build # tsup → dist/cli.js (npx 运行的内容)
npm run build:bin # bun build --compile → 单个可执行文件
```
## 许可证
Apache-2.0