HelloThisWorld/open-mind

GitHub: HelloThisWorld/open-mind

面向 AI agent 的验证优先代码智能层,将本地代码库转化为可溯源的持久化知识索引,帮助 agent 基于源码事实而非模型幻觉来理解和操作代码。

Stars: 1 | Forks: 0

# Open Mind **面向 AI agent 的验证优先代码智能层。** Open Mind 将本地代码库转化为确定的、可溯源的上下文, 编码 agent 可以查询这些上下文,而无需依赖对索引事实的猜测:一个 原样保留的词汇表、结构和调用图、精确的 token 搜索、有据可查的 Q&A 上下文、已保存的解决案例,以及 MCP 工具接口。
[![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/HelloThisWorld/open-mind/actions/workflows/ci.yml) [![Python](https://img.shields.io/badge/python-3.12+-3776ab.svg)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Agent ready](https://img.shields.io/badge/AI%20Agents-MCP%20tools-8a2be2.svg)](#use-it-from-an-agent-mcp) [![Verification first](https://img.shields.io/badge/verification-file%3Aline%20evidence-e8590c.svg)](#verification-first-design) [![Skill evals](https://img.shields.io/badge/skill%20evals-250%2F250%20runs%20passed-2ea44f.svg)](#measured-skill-verification) [![Local first](https://img.shields.io/badge/local--first-audited%20egress-555.svg)](#local-first-boundary) [![Built with skill template](https://img.shields.io/badge/built%20with-skill%20template-8250df.svg)](https://github.com/HelloThisWorld/agent-skill-verification-template) Open Mind 的构建围绕着一个实用的 agent 工程问题: 与其要求模型从零开始“理解”一个代码库,Open Mind 从代码本身构建持久化的 artifact。模型、编辑器或 agent 然后 查询这些 artifact。如果代码库不支持某个声明,Open Mind 更倾向于精确的“未找到”,而不是看似合理的幻觉。 相关项目: - [Open Mind](https://github.com/HelloThisWorld/open-mind):生成可溯源的代码库 artifact - [open-mind-mcp-server](https://github.com/HelloThisWorld/open-mind-mcp-server):将这些 artifact 作为 MCP 工具暴露给 agent - [agent-skill-verification-template](https://github.com/HelloThisWorld/agent-skill-verification-template):使用评估、指标、追踪和重放 artifact 测试 agent 技能/工具 ## 实际项目演示 下面的截图来自运行中的 Open Mind UI,针对的是已索引的 ZooKeeper 代码库。它们展示了已实现的产品界面:基于源码的 词汇表条目和基于结构衍生出的图导航。 | 带有溯源信息的原样词汇表 | 基于源码的图节点详情 | |---|---| | ![Open Mind glossary view showing a real indexed project, term list, source provenance, and content hash](https://static.pigsec.cn/wp-content/uploads/repos/cas/3b/3b45bb2d7fd642bfdf71519052a70d02f3cd0459b2daae22d046ac8f970a08e5.png) | ![Open Mind graph view showing call graph nodes and a selected file detail panel with definitions and callers](https://static.pigsec.cn/wp-content/uploads/repos/cas/5a/5a80ade1e647ae5e57442be7bc186cc121b29202671c8e1afed3f8f8ababdb52.png) | ## 为什么选择 Open Mind 大型代码库对于人类来说很难学习,而对于 LLM 来说却很容易 误报。一个编码助手可能会自信地编造一个缩写展开, 画出不存在的架构边界,或者基于一个仅仅是作为子字符串匹配到的 符号推荐修改。 Open Mind 采取了相反的方法: - **证据优于流畅度** - 重要的回答基于源文件、 行号、行范围或明确的“未找到”响应。 - **生成前先确定** - 词汇表提取、结构映射、 token 匹配、路由默认值和图投影都是确定性的。 - **将 agent 上下文作为基础设施** - 代码库成为 AI agent、Claude Skills 风格的工作流、编辑器和 更安全的 AI 辅助开发的可查询知识层。 - **有用的省略优于幻觉** - 不支持的术语和未解析的 图边不会被模型填充。 这就是项目的论点: ## 它构建了什么 将 Open Mind 指向本地代码库,它会构建持久化的 artifact: | Artifact | 已实现的行为 | |---|---| | **可溯源的知识索引** | 存储 repo 相对路径、内容哈希、源码位置、文件元数据和搜索块。 | | **原样词汇表** | 从定义表、定义行、缩写展开和代码注释中提取术语/缩写;定义原样复制,并携带 `source_file`、`line_number` 和 `content_hash`。交互式学习路径会扫描代码/配置源;`.openmind` 导出过程还会扫描 README/docs/GLOSSARY 文件(主要的定义来源)。 | | **结构和图映射** | 构建模块树、文件级定义索引、import/dependency 图、入口点以及基于名称的调用/使用图。有歧义的调用边会被标记出来,而不是靠猜。 | | **精确 token + 混合搜索** | 裸标识符使用 token 边界匹配;自然语言查询使用向量 + 词法检索。 | | **有据可查的提问 (Ask) 上下文** | 从词汇表命中、检索到的代码、已解决的案例、先前的对话上下文和用户附件中组装带编号的来源,供本地模型回答。 | | **已保存的解决案例** | 让有用的提问交流成为可搜索的案例;被引用的文件稍后会进行哈希检查,如果代码更改,则标记为过期。 | | **Agent 工具接口** | 通过 MCP stdio server 暴露核心查询、路由、案例和受限修复工具。 | | **可移植的 artifact 导出** | 导出带有版本的 `.openmind` 目录(manifest + glossary, architecture, flows, source index — 都带有 `file:line` 证据),作为外部消费者(例如配套的 MCP server)的稳定契约。 | | **模板配置** | 声明式的 YAML/JSON “透镜”文件,用于描述技术栈(内置的 `generic`, `spring-boot`, `rails`, `django`, `express-nestjs` 位于 `openmind/templates/` 中;将你自己的配置放入 `/templates/` — 相同的 schema,用户文件按名称优先)。一个 schema gate 会列出无效文件及其错误;确定性的技术栈检测会在学习时对配置进行评分,并记录每个项目的获胜者及其匹配的证据(`GET /templates`, `GET/POST /projects/{id}/template`)。解析后的配置随后将文件分类为逻辑 **角色**(controller/service/repository/…),并捕获 **切面** — 原样正则表达式事实,例如 HTTP 路由路径或 Kafka topic 文本,每个都带有 `file:line:snippet` 证据 — 在学习时持久化,通过 `/structure`(层摘要)和 `/graph`(每个节点的角色 + 事实)呈现,并投影到 `.openmind` 导出中。没有解析到模板 -> 行为和输出保持不变。 | | **模板学习指南** | 在每次学习后将解析后的配置的 `guide` 大纲渲染成 markdown 页面(`GET /docs`, `GET /docs/{page}`, MCP `get_doc`;通过 `POST /gendocs` 重新生成)。每个部分都是对已学习映射的一个确定性查询(概述 / 层 / 入口点 / 流 / 切面 / 词汇表 / 模块);每个事实都引用了 `file:line`,空部分会如实说明,重新生成是字节相同的,并且每页的 `OPENMIND:NOTES` 块在重建过程中保留人类注释。没有指南 -> 文档界面保持为一个诚实的空壳。 | | **测试门控的代码修改路径** | 提供了一个狭窄的原样查找/替换路径:预览 diff,要求绿色的基准测试,应用,重新运行测试,并在测试失败时回滚。 | 这**不是**什么:一个完整的编译器、类型检查器、IDE 扩展或自由形式的 自主编码 agent。它是此类 agent 可以调用的基于源码的上下文和验证层。 ## 为 AI Agent 工作流而生 Open Mind 被设计为实用 AI agent 和工具 集成的基础设施: - **代码库上手** - 快速检查词汇表术语、模块、入口 点、依赖项、调用者和被调用者。 - **上下文工程** - 为 agent 提供持久的代码库上下文,而不是 依赖冗长的 prompt。 - **代码库 Q&A 溯源** - 为本地 LLM 组装带有源码编号的上下文, 词汇表问题首先通过确定性查找进行路由。 - **架构发现** - 检查从结构衍生出的模块、依赖项、 调用和入口点,无需模型推断的架构图。 - **变更影响探索** - 在编辑之前检查基于名称的调用者/被调用者邻域 以及相关的词汇表术语。 - **工具使用验证** - 使用受限的 MCP 工具,如 `propose_fix` 和 `apply_fix`,由测试决定是否保留更改。 - **更安全的 AI 辅助开发** - 优先考虑源码证据、明确的 不确定性,以及可重复的 artifact,而不是一次性的生成摘要。 这与 AI Agent、Claude Skills、工具集成、 上下文工程、验证 pipeline、系统设计以及可靠的 软件开发直接相关。 ## 验证优先设计 Open Mind 将歧义视为风险信号: - **词汇表定义是原样的。** 它们永远不会被模型总结或重写。 如果某个术语不存在,查找将返回 `found: false`。 - **源码位置是一等公民。** 词汇表条目带有 `file:line`; 搜索块带有行范围;图节点细节暴露了源文件、 定义、调用者、被调用者和相关术语。 - **图是由源码衍生而来的。** 依赖和调用/使用图来自于 确定性的静态分析。调用图是基于名称的,因此有歧义的 符号目标会被标记为 `ambiguous`。 - **精确的 token 保持精确。** `ack` 不匹配 `acked`;`user` 不 匹配 `userId`;`service1` 不匹配 `service10`。 - **路由具有确定性的基础。** 可选的本地模型可以细化 能力选择,但前提是它必须返回有效的能力。否则,将采用 确定性的路由器。 - **代码编写是门控的。** codemod 路径是单文件原样的查找/替换, 带有 diff 预览和测试门控的应用/回滚行为。 本地模型很有用,但它不被信任为事实来源。源码 artifact 才是事实来源。 ## 实际运行 ### 原样词汇表查找 一个明确的缩写问题会路由到词汇表映射,而不是相似性搜索: ``` query: "what does ISR mean?" { "found": true, "term": "ISR", "definition": "In-Sync Replicas", "source_file": "server/src/main/java/org/apache/kafka/server/partition/PartitionState.java", "line_number": 24, "source_kind": "acronym", "content_hash": "29122a12..." } ``` 不支持的术语是一个诚实的未命中: ``` query: "what does ZKQ mean?" { "found": false, "term": "ZKQ", "message": "no authoritative definition found for 'ZKQ' in the indexed project" } ``` ### 源码衍生出的图 图视图是结构 artifact 的投影,而不是模型生成的 架构猜测。下面的例子展示了模块聚合的输出形状; 边权重是从索引检出中恢复的引用计数, 而不是基准测试声明: ``` flowchart LR admin["clients / admin/internals"] -->|1878| req["clients / common/requests"] ctrl["metadata / controller"] -->|1800| req persist["server-common / share/persister"] -->|1241| req group["group-coordinator / group"] -->|862| req consumer["clients / consumer/internals"] -->|745| req ``` 在 UI 中,单击图节点会打开源码位置、定义、 调用者/被调用者以及交叉链接的词汇表术语。 ### 精确 token 搜索 裸标识符作为完整的 token 进行匹配: ``` search "ApiKeys" -> enum/class/interface chunks containing token ApiKeys search "user" -> token user, not userId unless subword mode is enabled search "service1" -> token service1, not service10 ``` ### Agent 消费 Agent 可以通过 MCP 调用 Open Mind 并接收结构化的、基于源码的 结果: ``` tool: get_glossary args: { "scope": "kafka", "term": "ISR" } result: found: true definition: "In-Sync Replicas" source_file: "..." line_number: 24 ``` 该输出可以直接在编码 agent prompt、审计跟踪或 验证 pipeline 中使用。 ## 这与通用 RAG 有何不同 通用的代码 RAG 通常这样做: 1. 对代码库进行分块。 2. 对这些块进行嵌入 (embed)。 3. 检索相似的文本。 4. 要求模型合成答案。 Open Mind 仍然使用本地嵌入进行概念检索,但在模型介入之前,它会做更多的工作: - 为术语/缩写查找构建确定性的词汇表 artifact; - 为模块、定义、import、 调用和入口点构建确定性的结构 artifact; - 在针对标识符查询的向量相似度之前,应用精确的 token 规则; - 暴露具有确定性兜底的能力路由; - 保持源码路径可移植且可追溯; - 提供 agent 可以安全调用的受限工具 API。 目标不是“与代码库聊天”。目标是提供可靠的代码库上下文,让 AI agent 能够对其进行检查、引用和采取行动。 ## 快速开始 **前提条件:** 在 Windows、macOS 或 Linux 上安装 Python 3.12+。 ``` git clone https://github.com/HelloThisWorld/open-mind.git cd open-mind pip install -r requirements.txt ``` Open Mind 是一个**无头运行时,包含多个前端**。CLI、MCP server 和 FastAPI 应用程序都驱动相同的代码 — Web UI 只是运行时之上的一个适配器, 而不是定义行为的地方,并且它完全是可选的。 ### 工具优先(无 UI) ``` # 检查 runtime:data dir、database、schema version、backends python -m openmind.cli doctor # 基于本地 repository 创建 workspace python -m openmind.cli init --name demo --path ./fixtures/sample-repo # 学习它(增量式;未更改的文件会通过 content hash 跳过) python -m openmind.cli ingest --workspace --wait # 它知道什么? python -m openmind.cli status --workspace # 通过 MCP 将 knowledge layer 暴露给 editor 或 agent python -m openmind.cli mcp serve # ...或者启动可选的 web UI python -m openmind.cli serve ``` 每个命令都接受 `--json`,以便在 stdout 上输出一个机器可读的对象,在 stderr 上输出诊断信息以及 [稳定的退出代码](docs/cli.md#exit-codes),因此运行时脚本可以顺畅执行: ``` WS=$(python -m openmind.cli init --name demo --path ./src --json | jq -r .workspace_id) python -m openmind.cli ingest --workspace "$WS" --wait --json | jq '.progress' python -m openmind.cli status --workspace "$WS" --json | jq '.counts' ``` 完整契约:**[docs/cli.md](docs/cli.md)**。 ### Web UI ``` ./run.ps1 # Windows ``` ``` python -m openmind.cli serve # cross-platform python -m uvicorn openmind.main:app --host 127.0.0.1 --port 8077 # equivalent ``` 然后打开 `http://127.0.0.1:8077`,创建一个项目,选择一个本地代码库, 然后开始学习。确定性的词汇表、图和精确 token 搜索 功能不需要 LLM。提问/Q&A 使用可选的本地兼容 OpenAI 的 `llama-server`。 默认情况下,server 绑定到 loopback,并拒绝非 loopback 绑定,除非 你显式传递 `--allow-non-loopback`。 ### 值得了解的事项 * **UI 是可选的。 CLI 或 MCP 路径中的任何操作都不需要它运行。 * **一个运行时,一个引导程序。** CLI、MCP 和 FastAPI 共享相同的 配置、数据库连接、迁移和服务,因此在其中一个创建的工作区 会立即可见于其他工作区。 * **`--workspace` 就是项目 ID。** 存储的实体仍然是一个 *project*, 并且 REST API 仍然显示 `/projects`;“workspace” 是内部词汇, 后续阶段将在此基础上进行构建。存储的形状没有任何改变。 * **artifact schema 是稳定的。** `.openmind` 导出保持在 schema **1.x**; 外部消费者将继续工作。导出是独立的 — 它不需要数据库、 向量存储或模型,并且仅使用标准库运行。 * **schema 变更是通过迁移实现的。** 数据库带有版本并会 自动升级;现有的项目数据库会被设定基准,从不重建。参见 [docs/database-migrations.md](docs/database-migrations.md)。 * 企业 Asset 和 Knowledge Graph 模型是**未来的 v2 工作**,尚未 实现 — 参见 [路线图](#roadmap)。 ## 从 Agent (MCP) 中使用它 Open Mind 附带了一个 MCP stdio server。任一命令都会启动相同的 server — 它们共享一个实现,而不是工具的两个副本: ``` python -m openmind.mcp_server python -m openmind.cli mcp serve ``` 客户端注册示例: ``` { "mcpServers": { "open-mind": { "command": "python", "args": ["-m", "openmind.mcp_server"] } } } ``` 已实现的 MCP 工具: | 工具 | 用途 | |---|---| | `search` | 混合代码搜索,对裸标识符采用精确 token 行为。 | | `get_glossary` | 确定性的术语/缩写查找或完整术语列表。 | | `route` | 具有确定性兜底的能力路由。 | | `dispatch` | 路由查询并调用选定的能力。 | | `find_similar_cases` | 搜索已保存的解决案例,带有过期标志。 | | `save_case` | 将问题/解决方法保存为可重用的案例。 | | `get_doc` | 生成的学习指南页面(模板 `guide` 部分;确定性的,引用了 `file:line`),或者在没有模板指南适用时如实返回未命中。 | | `propose_fix` | 以 unified diff 形式预览原样查找/替换。 | | `apply_fix` | 仅在测试套件保持通过时应用原样替换。 | ## 与兼容 MCP 的 Agent 一起使用 Open Mind Open Mind 是独立的:上述所有内容都不需要任何其他项目即可运行。对于 agent 集成,另外还有一个**稳定的 artifact 契约** — Open Mind 将其知识导出为带有版本的 `.openmind` 目录,并且 配套的 [open-mind-mcp-server](https://github.com/HelloThisWorld/open-mind-mcp-server) 加载该目录并将其作为 MCP 工具暴露出来(搜索、符号证据、 架构说明、声明验证): ``` Source Code Repository -> Open Mind (this repo; analysis, standalone) -> .openmind artifacts (manifest.json + schema 1.1.0) -> open-mind-mcp-server (optional integration layer) -> Claude / Cursor / AI agents (MCP tools, structured JSON, file:line evidence) ``` 集成边界被故意缩小了:**`manifest.json` 加上带有版本的 artifact schema**。Open Mind 永远不会 import 或启动 MCP server; MCP server 永远不会 import Open Mind 的内部结构或重新运行其分析。 任何一个项目都可以独立于另一个工作 — MCP server 提供了示例 artifact,而 Open Mind 的 artifact 是任何消费者都可以读取的纯 JSON。 生成 artifact(确定性的、离线的、无需 LLM 且没有额外的依赖项 — 导出路径在裸 Python 安装上运行;PyYAML 是可选的,并且只 用于控制 YAML 模板配置,如果没有它会降级为“未应用模板”): ``` python -m openmind.artifacts --repo ./fixtures/sample-repo --output ./.openmind # 或者通过 npm task-runner shim,等效地: npm run analyze -- --repo ./fixtures/sample-repo --output ./.openmind ``` 然后将它们暴露给 agent: ``` cd ../open-mind-mcp-server npm install npm run demo -- --artifacts ../open-mind/.openmind ``` `.openmind` 目录包含 `manifest.json`、`metadata.json`、 `glossary.json`、`architecture.json`、`flows.json` 和 `source-index.json`。 每个条目都带有 repo 相对路径的 `{file, line, snippet}` 证据 以及 `high`/`medium`/`low` 置信度;原样词汇表提取为 `high`,启发式投影(目录模块、基于名称的调用流)为 `medium` 或更低。将 `--repo` 指向任何本地代码库以为你自己的代码库导出 artifact。该契约由 `python tests/verify_artifacts.py`(schema、针对被分析 repo 的证据有效性 以及字节相同的确定性)验证。 schema 1.1.0 是附加的:当应用模板配置时(确定性自动选择, 或 `--template NAME`;`--no-template` 完全退出), `metadata.template` 会记录它,`architecture.json` 将获得按角色分类的 `layers`(带证据)和每个组件的 `roles` 计数,并且流程将根据 原样切面捕获进行命名(例如 `HTTP route: Post /orders`)。如果没有 模板,额外的 key 将不存在,输出保持 1.0.0 形状 — 接受 `1.x` 的消费者无论哪种情况都能继续工作。 ## 作为技能的能力 被追踪的代码库将核心能力记录为 `SKILL.md` 契约: | 技能契约 | 涵盖内容 | 状态 | |---|---|---| | [`glossary`](skills/glossary/SKILL.md) | 原样术语/缩写提取和精确查找。 | 已实现 · 验证 90/90 次运行 | | [`code-graphs`](skills/code-graphs/SKILL.md) | 结构、依赖、调用和入口点流映射。 | 已实现 · 验证 80/80 次运行 | | [`capability-router`](skills/capability-router/SKILL.md) | 具有确定性兜底的 agent 风格路由。 | 已实现 · 验证 80/80 次运行 | 这些是 Claude Skills 风格的能力规范:小型的、明确的、 可审计的、具有确定性契约的单元。每个技能都与 [Agent Skill Verification Template](https://github.com/HelloThisWorld/agent-skill-verification-template) 配对 — 这是一个配套项目,它将 agent 技能视为生产组件,将 模型无关的契约与离线评估工具、基于源码的 验证器、可重放的运行 artifact 以及发布门控配对在一起。上面“已验证”的数字 是经过测量的,而不是断言的 — 有关方法论、最新结果以及如何重现这些结果,请参见 [测量的技能验证](#measured-skill-verification)。将技能打包为可安装的 Claude Skills 已列在路线图中;当前的 repo 已经通过 REST 和 MCP 暴露了核心工具接口。 ## 测量的技能验证 这三个能力技能使用 [Agent Skill Verification Template](https://github.com/HelloThisWorld/agent-skill-verification-template) 作为**独立工具**进行端到端评估。该模板并没有重新实现 Open Mind:它 通过 [`openmind/skill_bridge.py`](openmind/skill_bridge.py) 驱动真正的 Python 实现(`openmind/glossary.py`、 `openmind/structure.py`、`openmind/router.py`),这是一个 JSON-lines stdin/stdout 桥梁,为 fixture 语料库构建词汇表和结构 artifact, 并从中回答查找/使用/定义/路由请求。 每个技能在模板 repo(`skills/openmind-*/`, `testcases/openmind-*.json`)中都有一个机器可读的契约、快乐路径测试用例和否定 (诚实度)测试用例。每个用例运行 **10 次**,每次运行 都由四个验证器评分: 1. **schema** — 输出符合所需的结构形状。 2. **引用** — 该工具独立地重新读取 Open Mind 引用的每个 `file:line`,并检查该行是否存在、是否支持声明以及是否包含 被查询的术语/符号。伪造的引用会导致运行失败。 3. **不支持的声明** — 未知输入必须返回 `insufficient_evidence` 且零声明(绝不返回编造的答案);已回答的声明必须全部被 引用;必须没有禁止的幻觉标记。 4. **工具调用** — 契约要求的工具已被按顺序调用。 ### 最新结果(2026-07-02 · 每个用例 10 次运行 · 门控阈值 90%) | 被评估技能 | 测试用例 | 总运行次数 | 通过率 | 有效引用 | 工具错误 | 门控 | |---|---|---|---|---|---|---| | `openmind-glossary` | 9 (7 个快乐 + 2 个否定) | 90 | **100%** | 100% | 0% | PASSED | | `openmind-code-graphs` | 8 (6 + 2) | 80 | **100%** | 100% | 0% | PASSED | | `openmind-capability-router` | 8 (6 + 2) | 80 | **100%** | 100% | 0% | PASSED | **在重复执行中 250/250 次运行为绿色** — 与 确定性契约(相同输入 → 相同输出)保持一致。否定用例通过 *拒绝*而通过:未知的术语和符号返回 `insufficient_evidence` 且零 声明,并且路由器无法被说服执行其文档记录 集合之外的能力(要求它“发明一个名为 quantum 的新能力”的查询将路由到 安全的 `search` 基础,并且“quantum”永远不会作为路由的能力出现)。 这些运行的机器可读快照提交在 [`docs/verification/`](docs/verification/) 下。 ### 该门控可证明能捕获错误输出 只有当相同的 pipeline 在遇到错误 输出时也会变红时,绿色的报告才有意义。该模板的脆弱孪生方法论根据运行种子扰乱了 Open Mind 正确的 输出 — 丢弃的引用、行号偏移了 +7、一个无效的 状态值、颠倒的工具顺序、一个凭空捏造的无据声明 — 并且门控 如期失败: | 被注入错误的技能 | 通过率 | 门控 | 重放 artifact | |---|---|---|---| | `openmind-glossary` | 52.2% | FAILED | 43 | | `openmind-code-graphs` | 58.8% | FAILED | 33 | | `openmind-capability-router` | 33.8% | FAILED | 53 | 每个注入的错误都映射回旨在捕获它的验证器 (`citation_line_out_of_range`、`answered_claim_without_citation`、 `tool_order_violation`、schema 拒绝无效状态等),并且每次 失败的运行都会留下一个重放 artifact,包含确切的输入、输出、工具追踪 和裁决。 ### 复现 ``` # 在本 repo 旁 clone harness(或者将 OPENMIND_REPO 指向此 checkout) git clone https://github.com/HelloThisWorld/agent-skill-verification-template.git cd agent-skill-verification-template npm install npm run eval:openmind # all three skills; non-zero exit if the gate fails npm run eval:openmind:flaky # proof the gate catches seeded failures ``` 每次评估都会在模板的 `reports/` 目录下写入一个独立的 `report.html`、一个 `summary.json`、Prometheus 指标、结构化的 JSONL 事件,以及(如果失败)每次运行的重放 artifact。 ## 实现映射 ``` openmind/ cli.py the command-line front end (argparse; JSON + exit codes) runtime.py composition root: one idempotent bootstrap for every adapter version.py the single runtime version constant domain/ typed application errors + the types crossing service calls ports/ the three narrow boundaries services depend on services/ use-case orchestration shared by CLI, MCP and FastAPI (workspace, ingest, job, export, health + the container) migrations/ versioned, checksummed SQLite schema migrations walker.py selection-aware walk, .gitignore handling, hashing detect.py manifest/language detection and stack cues langspec.py declarative language registry templates.py declarative template profiles: schema gate + deterministic stack-match auto-selection facets.py template facet extraction: role classification + verbatim capture facts, all with file:line evidence docs.py template-driven learning guide: guide sections -> cited, deterministic markdown pages (notes preserved across rebuilds) structure.py deterministic modules, definitions, imports, calls, entries diagrams.py Mermaid/DOT/interactive graph projections glossary.py verbatim glossary extraction and lookup tokenmatch.py exact identifier/literal boundary matching rag.py code chunking, local embedding, hybrid retrieval embeddings.py fastembed/ONNX backend with deterministic hashing fallback vectorstore.py Chroma persistence with numpy fallback ask.py source-numbered grounded prompt assembly conversation.py bounded retained Ask history cases.py saved solved cases and staleness checks router.py deterministic capability routing plus optional model refine codemod.py preview/apply literal edits with test gating artifacts.py .openmind artifact export (the stable integration contract) mcp_server.py MCP stdio server skill_bridge.py JSON-lines bridge exposing the skills to the eval harness main.py FastAPI REST/SSE API and single-page UI (one adapter) netguard.py audited outbound HTTP guard for app-controlled egress machine.py machine-local source roots and GitHub source links jobs.py resumable background jobs for ingest, Ask, enrichment ``` 语言支持定义在 `openmind/langspec.py` 中,目前在行级 结构层涵盖了 Python、JavaScript、TypeScript、Java、Kotlin、Scala、Go、Rust、C#、Ruby、PHP、C 和 C++。当可用时,Java 还具有 tree-sitter 语义 分块功能,可提供更丰富的 RAG 块。 ## 本地优先边界 Open Mind 是本地优先的: - 索引的项目内容是从本地磁盘读取的; - 持久化的 artifact 尽可能存储 repo 相对路径; - 本地模型调用通过 `netguard` 固定到 loopback; - Wikipedia 词汇表丰富化和 GitHub 源码链接获取是独立的、 经过审计的出口路径,可以禁用; - 嵌入在模型权重可用后在进程内运行。 一个重要的精度:`fastembed` 可能会在 首次使用时下载嵌入模型权重。设置 `OPENMIND_EMBED_OFFLINE=1` 以强制使用确定性哈希 嵌入器,并阻止该模型下载路径。 ## 配置 所有功能都使用默认值即可工作。有用的环境变量: | 变量 | 默认值 | 用途 | |---|---|---| | `OPENMIND_DATA_DIR` | `./data` | SQLite、Chroma、映射、日志和已学习的 artifact。 | | `OPENMIND_MACHINE_DIR` | `~/.openmind` | 机器本地的源码根目录和 GitHub 源码链接,保存在可移植数据之外。 | | `OPENMIND_EMBED_DEVICE` | `smart` | 用于 ONNX 执行提供程序的 `cpu`、`smart`、`auto` 或 `gpu`。 | | `OPENMIND_INGEST_FREE_GPU` | `1` | 在有用时暂时停止 Open Mind 管理的模型 server 以进行批量嵌入。 | | `OPENMIND_EMBED_OFFLINE` | `0` | `1` 强制使用哈希嵌入并阻止嵌入模型下载。 | | `OPENMIND_ENRICH_EGRESS` | `1` | `0` 禁用 Wikipedia 丰富化查找。 | | `OPENMIND_SOURCELINK_EGRESS` | `1` | `0` 禁用为链接源获取 GitHub 原始文件。 | | `OPENMIND_MODELS_FOLDER` | `~/models` 回退 | 本地 `.gguf`模型选择的默认文件夹。 | | `OPENMIND_MODEL_PATH` | 空 | 默认本地模型路径。 | | `OPENMIND_LLAMA_SERVER` | `llama-server` | 本地兼容 OpenAI 的模型 server 二进制文件。 | 可选的 GPU 嵌入包: ``` # Windows AMD/Intel pip uninstall onnxruntime pip install onnxruntime-directml # NVIDIA pip install onnxruntime-gpu ``` ## 测试 两层检查支持本 README 中的声明。 **技能级评估工具** — 这三个能力技能使用 [Agent Skill Verification Template](https://github.com/HelloThisWorld/agent-skill-verification-template) 进行验证(每个测试用例运行 10 次,四个验证器,发布门控);有关最新的 结果和重现步骤,请参见 [测量的技能验证](#measured-skill-verification)。 **专注的验收脚本** — 涵盖此构建中实现的验证 契约的小型检查。一个命令即可运行支持的套件: ``` python scripts/run_acceptance.py # the CI gate (core tier) python scripts/run_acceptance.py --all # every tier, including local-only python scripts/run_acceptance.py --list # what is in the suite, and why python scripts/run_acceptance.py --only verify_migrations ``` 运行器为每个脚本提供自己独立的 `OPENMIND_DATA_DIR` 和 `OPENMIND_MACHINE_DIR`,强制离线嵌入并禁用所有出口,并且 在任何失败时返回非零值。有两个属性是经过深思熟虑的:**被跳过的 核心脚本会被计为失败**,永远不会算作通过,并且 **磁盘上的每个 `tests/verify_*.py` 都必须注册在运行器的清单中** — 因此在套件仍然报告绿色的同时,新测试不能悄无声息地不被运行。 各个脚本,每个都映射到一个具体的可靠性声明: ``` python tests/verify_artifacts.py # .openmind artifact contract: schema, evidence, determinism python tests/verify_glossary.py # verbatim extraction, provenance, honest miss python tests/verify_structure.py # detection, structure map, incremental reuse python tests/verify_diagrams.py # Mermaid/DOT projections and honest empty graphs python tests/verify_router.py # deterministic routing and model fallback validation python tests/verify_source_link.py # source-link parsing and audited egress policy python tests/verify_resources.py # ingest RAM guard behavior python tests/verify_templates.py # template profiles: schema gate, deterministic selection python tests/verify_facets.py # template facets: roles, captures, projections, honest empties python tests/verify_guide.py # learning guide: cited pages, notes preservation, honest reset python tests/verify_grounding.py # glossary-first Ask routing, honest miss/empty sources python tests/verify.py # 12 cross-cutting design invariants end to end python tests/verify_migrations.py # schema ledger: empty, legacy baseline, checksum, rollback python tests/verify_runtime.py # runtime bootstrap idempotency, worker opt-in, one version python tests/verify_services.py # application services and their typed errors python tests/verify_cli.py # CLI contract: JSON output, exit codes, every command python tests/verify_adapters.py # REST route, MCP tool and skill-bridge compatibility ``` 其余的 `tests/verify_*.py` 文件是回归套件(Ask 流程、模型 server、异步删除、特定的修复批次)。一个脚本, `verify_delete_responsive.py`,被排除在 CI 门控之外,并在 清单中标记为 `local`,原因是:它断言在执行删除操作排空时 API 延迟低于 2 秒,而共享 CI 运行器的调度抖动 会使这一点变得不稳定。在发布对删除路径的更改之前,请在本地运行它。 在运行器的设置下,整个 `tests/` 目录在全新克隆上针对 `fixtures/` 中的中立 fixture 代码库可以通过测试。 ## 路线图 以下内容在当前构建中并未声称已完成: **v2 企业知识层** — 其中任何一个都未实现。阶段 1 (已发布)是 [docs/v2/phase-1-core-foundation.md](docs/v2/phase-1-core-foundation.md) 中描述的以工具为先的运行时基础;它 故意为以下项目创建了扩展点,而不是构建 它们: - 企业 Asset、Revision、Claim 和 Relation 模型; - 工程 Knowledge Graph; - PDF、DOCX 和 XLSX 解析;支持 COBOL 和 JCL; - 云模型提供商(OpenAI、Anthropic、Bedrock、Azure、Vertex) — 运行时保持本地优先,没有云凭证; - 需求到代码的可追溯性、冲突检测和分支覆盖; - webhook 集成和 Bundle 2.0 artifact schema(导出保持在 schema 1.x); - 类型化的 worker 池或作业 DAG,以取代当前的单 worker 引擎。 **其他尚未完成的工作:** - 为被追踪的能力契约提供可安装的 Claude Skill 打包; - 超出基于名称的调用者/被调用者邻域的更深入的变更影响分析; - IDE 扩展集成; - 在本 repo 自己的 CI 中运行技能评估门控(幻觉抵抗力和源码引用 质量已由配套工具测量); - 用于模型答案的输出引用验证器; - 超出 Java 的更广泛的 tree-sitter 解析器; - 用于节点扩展和图导航的特定于图的 MCP 工具; - 超出保留的提问历史和已保存的解决案例的一流代码库 记忆层; - `.openmind` 导出中的指南 artifact(学习指南页面目前 仅在应用端生成); - 图 UI 中的可视层分组(每个节点的 `role` 数据已经 由 API 暴露)。 ## 设计原则 - **证据优于流畅度。** 一个正确的“未找到”比一个自信但 无根据的答案更好。 - **可追溯性优于模糊的摘要。** 有用的事实应该指向源码 路径、行、行范围或显式的提取 artifact。 - **确定性优于聪明的猜测。** 系统的默认行为应该在没有模型的情况下 可重复。 - **歧义即是数据。** 如果静态边是模棱两可的,就标记它;不要假装 系统知道的比它实际知道的更多。 - **Agent 可靠性优于演示吸引力。** 工具 API、路由、本地优先 边界和测试门控比花哨的聊天界面更重要。 ## 贡献 欢迎提交 issue 和 pull request。一个好的更改应保持核心契约 不变: - 为新事实添加源码证据; - 优先选择确定性提取而不是模型生成; - 添加或更新专注的 `tests/verify_*.py` 验收检查; - 通过经过审计的防护来路由新的出站网络路径; - 明确区分未来功能与已实现的行为。 ## 许可证 基于 [MIT 许可证](LICENSE) 发布。
标签:AI智能体, MCP, SOC Prime, 代码理解, 代码索引, 开发工具, 逆向工具