这个项目能做什么
NEAT 通过构建代码库的实时确定性模型——将静态代码与实时运行时行为融合为一张图——并通过 MCP 工具将其暴露给 AI 代理,从而解决 AI 编码上下文问题。它旨在减少 LLM 幻觉,提供沿图节点和边的时间旅行错误日志以用于调试,并通过策略强制执行架构规则。
## 核心概念
中心是系统的一张实时图,由两个流融合而成:
- **静态分析**——对源代码(JavaScript、TypeScript、Python)、`package.json` 以及 yaml/env 配置运行 tree-sitter。每个源文件成为一个节点;导入成为边;对数据库、队列和外部主机的调用从代码中提取。
- **运行时遥测**——OpenTelemetry span 被归属回发起调用的确切文件和行。NEAT 会自动接入插桩。
两个流落在相同的节点上,因此图中并排保存了代码*声明*的内容和系统*实际执行*的内容。文件是主要单元——关系从文件出发(例如 `src/services/billing.ts ──CALLS──▶ api.stripe.com`),使答案保持清晰且具体。
每条边都带有一个 `provenance` 标签:
- `EXTRACTED` 来自源代码(无时钟衰减)
- `OBSERVED` 来自 span(带有 `lastObserved` 和 `callCount`)
- `INFERRED` 由 trace 拼接器在 OTel 覆盖存在缺口处推断(置信度设有上限)
- `STALE` 因为运行时不再发声(保留原始 `lastObserved`)
## 快速开始
```bash
npx neat.is
```
在项目内部运行(或 `npx neat.is <path>`)。它会发现服务、提取静态图、接入 OpenTelemetry、启动守护进程并打开仪表盘——无需配置。然后运行应用,观察实时边逐渐填充。
> **Windows 注意:** 使用 `neat` 命令,而不是 `npx neat.is`。npm 会生成一个字面名为 `neat.is` 的 shim,而 Windows 不会执行 `.is` 文件。全局安装一次(`npm i -g neat.is`)并运行 `neat`(或 `neat <path>`)。若未全局安装:`npx -p neat.is neat`。
## CLI 动词
```
neat <path> 编排器:提取、插桩、启动守护进程、打开仪表盘
neat init <path> 仅提取;默认补丁模式,--apply 写入
neat watch <path> 在文件变化时保持图实时更新
neat deploy 为托管目标生成部署产物
neat sync --to <url> 将本地 EXTRACTED 快照推送到远程守护进程
neat divergences 代码与生产流量不一致之处
neat root-cause <id> 沿入边回溯,找出最先出问题的环节
neat blast-radius <id> 出边 BFS;如果此节点失效会破坏什么
neat dependencies <id> 传递性出边依赖
neat incidents 最近的错误事件
neat policies 当前策略违规
neat search <query> 对节点名称和 id 进行语义匹配
```
每个查询动词都支持 `--json` 和 `--project <name>`。退出码:0 成功,1 服务器错误,2 误用,3 守护进程不可达。
## 分歧
分歧是声明意图与观察到的行为分道扬镳之处——这是用其他方式最难回答的问题,因为它需要同时具备两个流。示例:
```
[missing-extracted] src/services/prices.ts ──CALLS──▶ folio-api.example.com confidence 0.87
生产环境观察到了此调用,但静态分析从未发现该边。
→ 动态分派或覆盖缺口。
[missing-observed] src/db/client.ts ──CONNECTS_TO──▶ postgres:primary confidence 0.85
代码声明了此连接,但没有任何生产流量使用过它。
→ 死路径、功能开关或未发布的代码分支。
```
## 策略
项目中的 `policy.json` 将架构规则声明为对图的断言——例如“只有 `service:billing` 和 `service:orders` 可以连接到 `postgres:primary`”,或“任何文件都不得调用 `legacy-api.internal`”。NEAT 会在图变化时持续评估每条策略。违规通过 `neat policies`(CLI)和 `check_policies`(面向代理的 MCP 工具)呈现。`block` 动作会阻止新出现的外部主机(`FrontierNode`)被提升,从而避免未经批准的依赖沉淀到模型中。
## MCP 工具
二十四个 MCP 工具将图暴露给 AI 代理。十四个读取图:`ask`、`get_root_cause`、`get_blast_radius`、`get_dependencies`、`get_observed_dependencies`、`get_incident_history`、`get_incident_card`、`get_divergences`、`get_graph_diff`、`get_recent_stale_edges`、`check_policies`、`semantic_search`、`expand`、`relate`。六个(`neat extend`)为捆绑 OTel 集未覆盖的库填补插桩缺口,由版本化的插桩注册表驱动。四个将托管项目连接到提供商。
## 服务器部署
容器镜像位于 `ghcr.io/neat-technologies/neat:latest`,启动 `neatd start` 并在 `:8080` 上暴露 REST、在 `:4318` 上暴露 OTLP、在 `:6328` 上暴露 Web UI。每个公共接口都要求 `NEAT_AUTH_TOKEN`;没有它,守护进程拒绝非回环绑定。`neat deploy` 会生成令牌、写入 `docker-compose.neat.yml`,并打印应用程序部署平台的环境变量块:
```
OTEL_EXPORTER_OTLP_ENDPOINT=https://<your-host>:4318
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer <generated-token>
```
当 TLS 终止和认证已在上游完成时,可通过 `NEAT_AUTH_PROXY=true` 支持反向代理。
## 代理集成
NEAT 的 MCP 服务器已在官方 MCP Registry 中列为 `io.github.neat-technologies/neat`。Cursor 和 VS Code 提供一键安装按钮。对于 Claude Code:
```bash
claude mcp add neat -- neat-mcp
```
或编辑 `~/.claude/settings.json`:
```json
{
"mcpServers": {
"neat": {
"command": "neat-mcp",
"env": { "NEAT_CORE_URL": "http://localhost:8080" }
}
}
}
```
`neat hooks --apply` 会安装一个 Claude Code 搜索提示钩子(在原始 grep 之前注入一条提示,引导代理使用 `semantic_search`、`get_dependencies`、`get_divergences`),以及一个与代理无关的 `GRAPH_FIRST.md` 指导块。Claude Code 插件(`claude plugin marketplace add NEAT-Technologies/Neat` 然后 `claude plugin install neat@neat`)将 MCP 工具、钩子和技能打包为一次安装。
## 仓库布局
```
packages/
types/ 共享 Zod schema:节点、边、事件、结果类型
core/ 图引擎、tree-sitter 提取、OTel 摄取、REST API、neat CLI
mcp/ stdio MCP 服务器,暴露二十四个工具
web/ Next.js 仪表盘
claude-skill/ Claude Code 技能元数据
neat.is/ 伞形包
plugin/ Claude Code 插件(仓库托管)
```
## 文档
- `docs/guide/`:用户指南——快速开始、核心概念、查询、AI 代理、故障排除
- `PROVENANCE.md`:四种边状态以及置信度如何传递
- `CLAUDE.md`:面向代理和贡献者的指南
- `docs/architecture.md`:包边界和数据流
- `docs/api-reference.md`:REST 端点和 MCP 工具签名
- `docs/runbook.md`:日常命令和恢复方案
- `docs/contracts.md`:每个 PR 都必须遵守的约束规则
- `CONTRIBUTING.md`:分支约定、PR 形态、开发环境设置
- `SECURITY.md`:漏洞报告
## 许可证
Apache 2.0。
评论
0 人表达喜爱 · 满10人后显示 Deer Point
登录后参与讨论。