
ovecc
io.github.Ovecc-labs由 GitHub 账号 Ovecc-labs 发布v0.3.1更新于 Nov 3, 2026
Architecture guardrails for AI-written code: dependency graph, impact, dead code, CI gate
概览
本地 MCP 服务器,把 Ovecc 的代码库架构分析(依赖图、影响面、死代码、安全与 CI 门禁)以确定性工具形式提供给编码助手。
- 可以做什么
- 查询已索引的仓库模型:摘要、组件、耦合、循环依赖与依赖查询
- 评估变更风险:符号或文件的影响范围、热点,以及带修复建议的单文件分析
- 发现代码腐化:重复代码、未使用导出与不可达文件、复杂度健康度、架构异味
- 检查安全与依赖:密钥、不安全模式、污点流,以及离线 OSV 依赖漏洞审计
- 执行架构约束:读取架构契约文件、按契约检查代码、拦截新增违规
- 生成报告与导出:一次性架构报告、依赖图 HTML 导出、机器可读的能力清单
- 适用场景
- 适合编码助手在大型或多语言仓库中改动代码时使用:需要知道某次改动会影响什么、某个导出是否仍被使用,或某个拉取请求是否破坏既定架构,而不必把大量文件读入上下文。
- 运行要求
- 以本地 stdio 进程运行,通常用 npx ovecc mcp 启动,或使用已安装到 PATH 的 ovecc 二进制。需先对仓库执行索引(ovecc index .),会在 .ovecc 目录写入模型。除随附二进制外无需其他运行时,无需 API 密钥,可完全离线使用。
安装
在 SourceWeft 中
- 打开 控制台中的 ovecc,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
CLI-first architecture intelligence: understand your codebase, then hold it to the rules you set.
Rust, one binary, no runtime. Runs offline, with no LLM in the loop.
What is Ovecc
Ovecc reads your repository once and builds a persistent model of it: every file, import, symbol, and call. From that single index it answers the questions you ask about a codebase:
- What breaks if I change this? (
impact) - Where are the dependency cycles and the tight coupling? (
query,summary) - What is duplicated, dead, or over-complex? (
dupes,deadcode,health) - What is insecure, and which dependencies have known CVEs? (
security,audit) - Where is the churn, and who owns this code? (
hotspots)
It is an architecture database with deterministic commands, driven from the CLI, from CI, or by a coding agent over MCP.
[React's dependency graph in ovecc's offline viewer]React's dependency graph, rendered by ovecc export graph --html into a single file you can open directly, no server or CDN needed.
What it costs an agent
Asking whether a new import closes a dependency cycle, on zod, with Claude Sonnet 4.6:
One run, one model, one question, and agent runs are not deterministic. Method and the cases where ovecc loses are in docs/benchmark/BENCHMARKS.md.
Write your architecture down, and hold the code to it
Most tools stop at reading the code. Ovecc goes one step further: you write down which parts of your codebase are allowed to depend on which, in one small file, and every build checks the real code against it.
Here's one for a small app:
Run the check and every breach comes back with a file and a line:
Four kinds of decay caught in one run: a layer reaching where it shouldn't, a
feature tangling into its neighbor, a network call inside code you promised was
pure, and a function creeping past the budget you set. Put ovecc architecture check in CI and the pull request fails on the drift, instead of a reviewer
noticing three months later, or nobody noticing at all.
Don't have one yet? ovecc architecture suggest recognizes the architecture
you already follow (Feature-Sliced, bulletproof-react, Clean/Hexagonal, an Nx
workspace) and writes the file bound to your real folders. Or ovecc architecture init drafts it from your actual import graph, so day one starts
green and you tighten from there. The details are in the contract reference
below.
Install
npm pulls only the binary for your platform. npm i -g ovecc keeps it on your
PATH.
Prebuilt binaries are also on the latest release: Linux
x86_64 and aarch64, Windows x86_64, macOS arm64. There is nothing else to
install: DuckDB is bundled, there is no runtime, and it works fully offline. A
rolling dev build ships on every push to main.
The macOS binary is unsigned, so Gatekeeper quarantines it when a browser downloads it. Clear the flag once and it runs:
curl and npm don't set that flag, so npx ovecc never runs into it.
Build from source
Builds with stable Rust (on Windows use the windows-gnu toolchain; DuckDB is
compiled from source on the first build). The step-by-step Windows setup is in
docs/dev/SETUP.md.
The binary is ovecc (crates/ovecc-cli).
Quick start
If you only ever run three of these, run advise before editing a file,
diagnose instead of violations (same findings, plus the fix and when not
to act), and history to see whether the codebase is improving. summary
prints these as a footer, because a list read once loses to output read every
run.
Every command renders as text, json, ndjson, or markdown via --format
(plus sarif for GitHub code scanning and codeclimate for GitLab Code Quality)
and returns stable exit codes for CI. The full per-command reference, with real
output, is in docs/COMMANDS.md. For pull requests, the repo
ships a drop-in GitHub Action that indexes base and head, comments
the review findings on the PR, and gates on severity.
The architecture contract in depth
.ovecc/architecture.toml is your intended architecture as code. Each component
claims files by path glob; depends_on is the allow-list of what it may import.
ovecc architecture init writes the first draft from the graph you already have,
so every entry mirrors a real import and day one has zero violations. Prefer a
known shape? init --template fsd (or bulletproof-react, nx-workspace,
clean-architecture) drops in a reference architecture, and the diff against your
code becomes your migration plan.
From then on, each run compares code to contract and names what it finds:
- a divergence is an import the contract does not allow,
- a bypass is an import that skips a component's declared public interface,
- an absence is a dependency you declared but never actually use.
Three more checks read past the import graph (JS/TS):
slices = trueisolates a component's sub-folders from each other, the rule behind Feature-Sliced Design and bulletproof-react, with FSD's@xpublic-API escape hatch honored.deny_capabilitiesforbids a component the ambient powers that break purity:network,filesystem,storage,dom,process,time,random. ADate.now()in a pure domain comes back with its file and line.max_cyclomatic/max_cognitiveput a per-function complexity budget in the contract, so "keep the core simple" becomes a rule the build can check.
Interfaces are virtual: you list a component's public entry files and ovecc enforces them on the real imports, so you get encapsulation without barrel files or an extra re-export layer.
Adoption is meant to be gradual. check --freeze records today's violations in a
per-component baseline (one line each, so branches merge cleanly), gates only new
ones from then on, and drops entries as you fix them so the count never climbs.
Agents can read the contract before editing, through ovecc architecture show <path> or the ovecc_architecture MCP tool.
Rules
Simpler, language-neutral policy lives in .ovecc/config.toml, is enforced at
index time, and shows up in violations (and the gate CI check):
Silence a single finding inline with // ovecc-ignore (or
// ovecc-ignore-next-line, and # ovecc-ignore in Python) on the offending
line; it is dropped at index time.
For CI and coding agents
Every command is built to run in a pipeline: pick a format with --format, rely
on stable exit codes (0 clean, 1 a --fail-on threshold crossed, 2 and up
a real error), and emit sarif or codeclimate for GitHub and GitLab. The
drop-in GitHub Action wires review into pull requests.
The same analysis is available to coding agents over the Model Context Protocol.
ovecc mcp runs an MCP server over stdio that exposes each command as a tool
(ovecc_summary, ovecc_impact, ovecc_architecture, ...), so an agent can ask
"is this export used?", "what is the blast radius of BillingService?", or "does
this PR break the architecture contract?" and get the same deterministic answer.
Register it with any MCP client:
With the binary already on PATH, "command": "ovecc" and "args": ["mcp"] start it
without the npm lookup.
Start with ovecc capabilities --format json: it returns every command, the
metrics and rules they emit (each with a definition), the severity vocabulary,
and the exit-code contract, enough to drive an audit without reading these docs.
Every command's JSON is a stable, self-describing envelope, normalized to
repo-relative POSIX paths and byte-identical across runs. The full walkthrough is
in docs/dev/MCP.md.
Languages
The JavaScript and TypeScript family is parsed with tree-sitter and enriched by
the pure-Rust oxc stack: real tsconfig path and exports resolution
(oxc_resolver), plus per-function complexity and exports
(oxc_parser/oxc_semantic). One tree-sitter adapter covers Python, Go, Rust,
and C++. They all feed the same language-agnostic model, so resolution, the call
graph, taint, and the rules work across every supported language. Adding a
language is a new extractor behind the parser boundary, not a core change.
Workspace layout
Ten library crates and one binary, each documented in its own README.md (plus
xtask, the std-only task runner behind cargo xtask):
Design guarantees
- Deterministic before generative. Every finding traces back to explicit facts; the same input produces the same output.
- Local and private. Indexing, analysis, and explanation run on the machine; nothing leaves it.
- Incremental. Re-indexing an unchanged repository re-parses nothing and writes only a new snapshot.
License
MPL-2.0; see LICENSE. Every file in this repository is covered by it
unless the file itself carries a different SPDX-License-Identifier header. Files
with a different header are adapted from
fallow and remain MIT; third-party
attributions are in THIRD-PARTY-NOTICES.md.
Releases up to and including v0.2.5 were published under Apache-2.0 and remain available under it.
来源:README.md,提交 571f596
工具
0版本历史
1- v0.3.1最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分