Cheurteenyt/codebase-mirror

GitHub: Cheurteenyt/codebase-mirror

一个将代码自动索引生成图谱与人类知识笔记(ADR、Bug 记录等)相融合的混合型代码智能系统,并支持 MCP 协议与 Obsidian 同步。

Stars: 1 | Forks: 0

Codebase Memory project logo

# Codebase 内存 V2 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Cheurteenyt/codebase-mirror/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ## 这是什么? Codebase Memory V2 是一个**混合型**代码智能系统: 1. **原生 WASM 索引器** (V2) — 通过 tree-sitter WASM 语法支持 112 种语言。在 TypeScript/JavaScript 上具备最先进的语义精度:跨文件 CALLS 解析、模块有效性锁、类型/值默认分离、内置真值锁。语义版本 8。 2. **人类记忆图谱** (V2) — ADR、bug 记录、重构计划、约定、遗留区域标记、风险评估、活动日志 — 同步至兼容 Obsidian 的 Markdown 库。 3. **V1 C 引擎**(独立的生产者/参考) — 通过 tree-sitter C 支持 158 种语言。如果操作员单独运行 V1,V2 可以通过 `CodeGraphReader` 读取生成的兼容 SQLite 数据库。 V2 执行原生索引而无需调用 V1。它不会自动回退到 V1,不会合并 V1 和 V2 的输出,也不会按需创建 V1 数据库。 ## 当前版本 请参阅 `v2/package.json` 和 `v2/CHANGELOG.md` 以获取权威版本、测试计数以及 bug/优化历史。 ## 快速开始 要求 Node.js >= 22.12.0。仓库的 `.nvmrc` 和 `.node-version` 在开发中选择 Node 24 LTS。 ``` cd v2 npm ci # 仅 Backend CLI + MCP server npm run build npm test # see v2/CHANGELOG.md for current test count # 原生索引项目(TS/JS 无需 V1) node dist/cli/index.js index --project my-app --root /path/to/repo node dist/cli/index.js index --project my-app --root /path/to/repo --incremental # 尝试 demo node dist/cli/index.js demo # 初始化您的项目 node dist/cli/index.js init --project my-app # 运行 diagnostics node dist/cli/index.js doctor --project my-app # 在启动之前构建完整的 package,包括 Graph UI npm run build:package node dist/cli/index.js ui --project my-app # 允许 Control 浏览/索引您 home 目录之外的 repository node dist/cli/index.js ui --project my-app --allowed-root /srv/repos ``` `npm ci` 会安装依赖项,但不会将此包自带的 `cbm-v2` 二进制文件放入你的 `PATH` 中。请如上所述在源代码检出中使用 `node dist/cli/index.js`,或者如果你更喜欢简短的 `cbm-v2` 命令, 则运行一次 `npm link`。 ## CLI 参考 ### 核心命令 | 命令 | 描述 | |---|---| | `cbm-v2 index --project

--root ` | 原生索引项目(WASM,112 种语言) | | `cbm-v2 index --project

--root --incremental` | 快速增量索引(跳过未更改的文件) | | `cbm-v2 index --project

--root --discovery-mode fast` | 明确指定用于基准测试/速度敏感运行的降低覆盖率完全重建;与 `--incremental` 不兼容 | | `cbm-v2 index --project

--root --dry-run` | 预览而不写入 DB | | `cbm-v2 init` | 初始化 `.codebase-memory.json` 配置 | | `cbm-v2 doctor` | 运行诊断(Node 版本、DB、库路径) | | `cbm-v2 stats` | 显示美观的统计仪表板 | | `cbm-v2 demo` | 创建带有示例笔记和库的演示项目 | | `cbm-v2 mcp` | 作为 MCP 服务器运行(基于 stdio 的 JSON-RPC) | | `cbm-v2 ui [--allowed-root ]` | 启动图形 UI Web 服务器(端口 9749);可选择允许额外的本地浏览/索引根目录 | | `cbm-v2 watch` | 监视库的更改并自动同步(daemon) | ### 人类记忆命令 | 命令 | 描述 | |---|---| | `cbm-v2 human create --type ADR --title "ADR-001: ..."` | 创建笔记 | | `cbm-v2 human list [--type ADR] [--status active]` | 列出笔记 | | `cbm-v2 human show ` | 显示笔记(JSON,包含边) | | `cbm-v2 human link --to-cbm-node --edge DECIDES` | 将笔记链接到代码节点 | ### Obsidian 命令 | 命令 | 描述 | |---|---| | `cbm-v2 obsidian init` | 创建库目录结构 | | `cbm-v2 obsidian sync` | 双向同步(DB ↔ 库) | | `cbm-v2 obsidian sync --dry-run` | 预览而不写入 | | `cbm-v2 obsidian sync --direction export` | 仅导出(DB → 库) | | `cbm-v2 obsidian sync --direction import` | 仅导入(库 → DB) | | `cbm-v2 obsidian export` | 一次性导出(DB → 库) | | `cbm-v2 obsidian import` | 一次性导入(库 → DB) | | `cbm-v2 obsidian report` | 库文件报告(按目录) | | `cbm-v2 obsidian create-adr --title "ADR-003: ..."` | 创建 ADR + DB 记录 | | `cbm-v2 obsidian create-module-note --module auth` | 创建 ModuleNote | | `cbm-v2 obsidian create-route-note --method POST --path /api/login` | 创建 RouteNote | ### 报告命令 | 命令 | 描述 | |---|---| | `cbm-v2 report hotspots` | 关键模块(高连接度 + 复杂度) | | `cbm-v2 report undocumented` | 没有人类笔记的代码节点 | | `cbm-v2 report risk` | 高耦合、死代码、脆弱的接口 | ### 备份命令 | 命令 | 描述 | |---|---| | `cbm-v2 backup export --output backup.json` | 将所有笔记 + 边导出为 JSON | | `cbm-v2 backup import backup.json` | 从 JSON 备份导入 | | `cbm-v2 backup import backup.json --dry-run` | 预览导入 | ## MCP 工具 (7) `cbm-v2 mcp` 命令通过基于 stdio 的 JSON-RPC 2.0 暴露 7 个工具: | 工具 | 类型 | 描述 | |---|---|---| | `get_project_overview` | read | 高层级项目统计(节点、笔记、覆盖率、新鲜度) | | `get_module_context` | read | 完整模块上下文:代码 + 人类笔记 + ADR + bug + 重构 | | `get_undocumented_hotspots` | read | 没有文档的关键代码节点 | | `create_human_note` | write | 创建 ADR/BugNote 等 + 链接到代码节点 | | `link_note_to_code_node` | write | 将现有笔记链接到代码节点 | | `search_code_and_memory` | read | 跨代码图谱 + 人类记忆的统一搜索 | | `prepare_edit_context` ⭐ | read | **旗舰功能** — 在编辑任何文件之前调用。返回代码结构、依赖项、人类笔记、影响范围、风险评分、新鲜度和建议 | ### 连接 AI 代理 添加到你的 MCP 客户端配置中(Claude Desktop、Cursor、Zed 等): ``` { "mcpServers": { "codebase-memory-v2": { "command": "node", "args": ["/absolute/path/to/codebase-mirror/v2/dist/cli/index.js", "mcp", "--project", "my-app"] } } } ``` 对于 Codex,在运行 `npm run build` 后,将本地 STDIO 服务器添加到 `~/.codex/config.toml` 或受信任 项目的 `.codex/config.toml` 中: ``` [mcp_servers.codebase_memory_v2] command = "node" args = ["/absolute/path/to/codebase-mirror/v2/dist/cli/index.js", "mcp", "--project", "my-app"] ``` 在 Windows 上,全局文件是 `%USERPROFILE%\.codex\config.toml`。使用带有 正斜杠的绝对路径,例如 `D:/Mycodex/codebase-mirror/v2/dist/cli/index.js`,或者转义 TOML 字符串中的 每个反斜杠。编辑配置后重启 Codex,然后使用 `codex mcp list` 或 `/mcp` 验证连接。 ## 工作原理 ``` ┌──────────────────────────────────────────────────────────────┐ │ Codebase Memory V2 (hybrid) │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────┐ ┌──────────────────────────┐ │ │ │ V2 Native Indexer │ │ V1 C Engine (separate) │ │ │ │ tree-sitter WASM │ │ tree-sitter C │ │ │ │ 112 languages │ │ 158 languages │ │ │ │ cross-file resolver │ │ DB producer/reference │ │ │ │ semantics v8 │ │ │ │ │ └───────────┬─────────────┘ └──────────┬───────────────┘ │ │ │ │ │ │ v v │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ SQLite code graph (produced by one indexer per run) ││ │ └─────────────────────────────────────────────────────────┘│ │ │ │ │ v │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ V2 Human Memory Layer ││ │ │ Human Memory DB • Obsidian vault sync • Graph UI ││ │ │ 7 MCP tools • Reports • Intelligence layer ││ │ └─────────────────────────────────────────────────────────┘│ │ │ │ Storage: │ │ ~/.cache/codebase-memory-mcp/ │ │ .db ← code graph (V2 or separate V1) │ │ .human.db ← human memory (V2, TS) │ │ /.codebase-memory-vault/ ← Obsidian vault (MD) │ │ /.codebase-memory.json ← project config │ └──────────────────────────────────────────────────────────────┘ ``` ## 原生索引器 (V2 WASM) V2 包含一个**原生代码索引器**,它不需要 V1 C 二进制文件: - **112 种语言**,通过预构建的 tree-sitter WASM 语法 (`tree-sitter-wasm`) - **跨文件 CALLS 解析** — 持久化的 `call_sites`、`imports`、`exports` 表;解析器将跨文件的调用点与定义进行匹配 - **模块有效性锁** — 检测重复导出、默认标记冲突、未解析的星号源、无效内置对象 - **类型/值默认分离** — `interface`/`type alias` 默认值不计入运行时统计 - **内置真值锁** — 从 `node:module` 获取的 `isBuiltin()`;拒绝 `node:fake`,接受 `node:test` - **增量索引** — 内容哈希 + mtime_ns 快速跳过;仅删除快速路径 - **并行 worker** — 针对大型项目的多线程 WASM 解析 - **语义版本控制** — `CURRENT_EXTRACTOR_SEMANTICS_VERSION = 8`;当提取器输出发生更改时,增量模式会强制进行完全重新索引 - **发现完整性锁** — 带有结构化错误的 `DiscoveryResult`;部分发现会保留现有图谱(不会静默擦除) - **规范根路径传播** — 符号链接的根路径生成的 `file_path` 不包含 `..` - **文件身份契约** — 带有 `0:0` 回退的 `dev:ino` 去重;确定性的硬链接选择 ### 限制 - V2 原生索引器在 **TypeScript/JavaScript** 上精度最高。其他语言(Python、Go、Rust 等)会进行结构化解析,但不具备跨文件解析能力。 - 如果需要 V1 支持的 158 种语言的覆盖范围和精度,请单独运行 V1 C 二进制文件以生成项目数据库,然后再从 V2 中打开它。 - 图形 UI 最多支持 1,000 个节点,以保证可预测的传输和模拟成本。对于大型项目,请使用过滤器和仪表板。 ## 人类记忆节点类型 | 标签 | Obsidian 目录 | 描述 | |---|---|---| | `ArchitectureNote` | `Architecture/` | 横向架构笔记 | | `ADR` | `ADR/` | 架构决策记录 | | `BugNote` | `Bugs/` | 已知 bug | | `RefactorPlan` | `Refactor/` | 计划的重构 | | `LegacyNote` | `Legacy/` | 遗留区域标记 | | `Convention` | `Conventions/` | 编码/架构约定 | | `Prompt` | `Prompts/` | 对 AI 代理有用的提示词 | | `JournalEntry` | `Journal/` | 活动日志 | | `ModuleNote` | `Modules/` | 附加到模块的笔记 | | `RouteNote` | `Routes/` | 附加到 HTTP 路由的笔记 | | `RiskNote` | `Architecture/` | 风险评估 | ## 库格式 每个笔记有两个部分: ``` --- type: adr status: active cbm_node_ids: [1234] tags: [auth, security] --- # ADR-001:使用 JWT 进行身份验证 ## 自动生成 > ⚠️ This section is controlled by Codebase Memory V2 and may be regenerated. > Do not edit — your changes would be lost on the next sync. ### Metadata - **Type**: ADR - **Status**: active - **Slug**: adr-001-use-jwt-for-authentication ### 代码链接 - [[1234]] — Module:auth (`src/auth/index.ts:1`) --- ## 人工笔记 > ✏️ This section belongs to the user. It will **never** be overwritten. ### 上下文 We needed a stateless auth mechanism. ### 决策 Use JWT tokens signed with HS256. ``` `## HUMAN NOTES` 部分**绝不**会被 V2 覆盖。可以在 Obsidian 中自由编辑它 — 下次同步会保留你的修改。 ## 图形 UI V2 图形 UI 用更简洁的 2D d3-force 画布取代了 V1 的 3D Three.js 场景: - **仪表板选项卡**(默认):KPI、图谱新鲜度、智能建议 - **图谱选项卡**:带有过滤器、平移/缩放、节点详细信息面板的 2D 力导向画布 - **项目选项卡**:包含节点/边数量和健康状态的项目列表 - **控制选项卡**:系统信息 ``` # 在源码检出中的 v2/ 目录下 npm run build:package node dist/cli/index.js ui --project my-app # 或者,在 npm link / 全局安装之后 cbm-v2 ui --project my-app --port 8080 # 将用户 home 目录之外的 repository 添加到 Control allowlist cbm-v2 ui --project my-app --allowed-root /srv/repos /mnt/work ``` 打开 `http://127.0.0.1:9749/` 进入项目选择器,或直接访问 `http://127.0.0.1:9749/?tab=graph&project=my-app` 查看交互式图形。 默认情况下,允许访问主目录和所选项目的索引根目录。 必须使用 `--allowed-root` 明确授予额外的控制选项卡浏览/索引根目录; 路径在进行包含检查之前会被规范化。 ## Docker ``` # 构建 docker build -t cbm-v2 . # 运行 CLI docker run --rm cbm-v2 --help docker run --rm cbm-v2 demo # 运行 MCP server(挂载 cache volume) docker run --rm -i -v cbm-cache:/home/node/.cache/codebase-memory-mcp cbm-v2 mcp --project my-app ``` ## 文档 ### 架构与当前状态 - [V2 架构](docs/V2_ARCHITECTURE.md) — 混合索引器、发现、解析器、语义 - [V2 当前状态](docs/V2_CURRENT_STATE.md) — 版本、稳定功能、限制、阻碍 - [V2 路线图](docs/V2_ROADMAP.md) — 历史存档(0.15.9 时代) - [Obsidian 集成](docs/OBSIDIAN_INTEGRATION.md) — 库格式与同步 - [人类记忆 Schema](docs/HUMAN_MEMORY_GRAPH_SCHEMA.md) — SQL schema ### 参考 - [MCP 工具](docs/MCP_TOOLS.md) — 包含输入/输出示例的所有 7 个 MCP 工具 - [CLI 参考](docs/CLI_REFERENCE.md) — 包含 `m-v2 index` 在内的所有 CLI 命令 - [智能层](docs/INTELLIGENCE.md) — 图谱感知 + prepare_edit_context - [Token 经济](docs/TOKEN_ECONOMY.md) — 历史 v0.15.9 工作流估算(-67% 到 -87%),非当前传输基准 - [性能、Token 与 UI 审计](docs/PERFORMANCE_TOKEN_UI_AUDIT_2026-07-15.md) — 当前的紧凑型与美观型空白传输测量 ### 项目 ## 安全性 - **本地优先**:无网络调用,无遥测 - **保留 HUMAN NOTES**:`## HUMAN NOTES` 部分绝不会被覆盖(已经过回归测试) - **路径遍历保护**:针对 `..` 和反斜杠验证 `obsidian_path`;`assertPathInsideRoot` 使用 `path.relative` 进行跨平台包含检查 - **发现完整性锁**:部分发现(子树 EACCES、致命的符号链接错误)会保留现有图谱 — 不会静默擦除。损坏的符号链接 (ENOENT) 被视为警告,而不是致命错误。 - **别名历史** (R153):当符号链接别名之前有效而现在损坏时,旧规范目标的数据将通过 `alias_history` 表保留。防止静默删除历史目标。 - **警告传播** (R152+R153):所有发现警告(损坏的符号链接、ELOOP、TOCTOU 竞争)都会出现在 `IndexResult.warnings` 中,并带有相对于根目录的路径。即使成功(`SUCCESS_WITH_WARNINGS` 结果),CLI 也会打印它们。 - **类型化结果** (R153):`IndexResult.outcome` 为 `SUCCESS` | `SUCCESS_WITH_WARNINGS` | `STALE` | `PARTIAL` | `FAILED`。退出代码:0(成功)、1(错误)、2(过时但无错误)。 - **根发现验证**:`assertDiscoveryRoot` 在任何 DB 变更之前验证 stat + isDirectory + realpath + readdir - **备份轮换**:每个笔记最多 5 个 `.bak` 文件 - **试运行**:可在 `obsidian sync`、`obsidian export`、`obsidian import`、`backup import` 上使用 - **一致的同步哈希**:`markSynced` 为导出和导入方向计算相同的 DB 派生哈希,使冲突检测变得可靠(R14 修复) ## 性能 - **消除 N+1 查询**:所有热路径均使用批量抓取(`getBulkNotesByCbmNodeIds`、`getBulkNodeDegrees`、`getBulkEdges`) - **SQL 级别限制**:`getBulkNotesByCbmNodeIds` 使用 `ROW_NUMBER() OVER (PARTITION BY ...)` 在数据库级别限制每个节点的数量 - **增量索引**:内容哈希 + mtime_ns 快速跳过;仅删除快速路径避免了重新解析未更改的文件 - **并行 worker**:针对具有 >20 个更改文件的项目进行多线程 WASM 解析 - **稳定的 UI 监听器**:`GraphCanvas` 为回调使用 refs — 在切换过滤器时不会重新绑定监听器 ## 许可证 MIT — 见 [LICENSE](LICENSE)。

标签:AI工具, MITM代理, 自动化攻击