- 代理在大型仓库里做改动前的定位:一次 MCP 调用拿到调用方、风险、相关测试和负责人,比让代理自己 grep 再逐个读文件省 token,也少走弯路
- 接手陌生仓库或跨服务排查:跨仓库映射 HTTP/gRPC/事件契约并检测破坏性变更,这类信息 grep 拿不到,得靠索引和图谱
- 技术债盘点:按文件健康分排修复队列,比人工翻复杂度报告更容易落到具体文件
- 压缩测试和安装日志再喂给模型:distill 保留错误行、丢掉噪声,适合把长输出塞进上下文窗口的场景
repowise
repowise-devAGPL-3.0活跃维护 有专家点评扫描代码库生成健康评分、自动文档和 Git 分析,还能找出死代码并通过 MCP 输出架构决策,帮团队和 AI 快速看懂项目现状。
Codebase intelligence for AI and humans: code health scores, auto-generated docs, git analytics, dead code detection, and architectural decisions via MCP.
专家点评
上手难度:进阶更新于 2026-11-11给 AI 编码代理用的本地代码库索引层,用查询索引替代反复 grep 和读文件
适用场景
踩坑
- 首次
repowise serve会下载 UI 且要求 Node 20+,纯 Python 环境里会卡在这一步;只想用 MCP 查询的话可以绕开 serve init默认不生成问答和文档,要再跑一次repowise generate,否则会以为功能缺失init会改写 Claude Code 的 MCP 配置,已有指向其他仓库的全局条目不会被自动迁移,多仓库并行时容易连错库;issue 里也出现过 init 写~/.repowise/wiki.db而 MCP server 读<project>/.repowise/wiki.db的路径不一致报告- 语言支持有边界:issue 里有 Python 3.14 下 dotnet resolver 导入失败、以及 Luau/Roblox 依赖图解析缺失的请求,非主流语言栈要先确认覆盖情况
同类对比
如果只需要单仓库的符号跳转和引用查找,语言自带的 LSP 或 tree-sitter 方案更轻;如果重点是跨仓库契约和架构决策沉淀,才值得引入这一层。
uv tool install repowise
cd /path/to/your/repo
repowise init --yes --no-prose
repowise serveREADME 未说明显存或 GPU 要求;索引、图谱、健康分等核心功能不调用 LLM,无需 API key;serve 启动仪表盘需要 Node 20+。
项目说明
由 README 自动翻译提炼本地索引代码库与 git 历史,让 AI 编码代理直接查询索引,少读文件少花 token
扫描代码库生成健康评分、自动文档和 Git 分析,还能找出死代码并通过 MCP 输出架构决策,帮团队和 AI 快速看懂项目现状。
核心能力
- 一次索引代码、git 历史、测试与决策,代理查索引而非 grep
- 提供十个面向任务的 MCP 工具,一次返回调用方、风险、测试与负责人
- distill 压缩测试、安装与 git 输出,保留所有错误行
- 为每个文件打 1~10 分健康分并给出优先修复队列
- 跨仓库映射服务与 HTTP、gRPC、事件契约并检测破坏性变更
容易踩的坑
serve 首次运行会下载 UI,且需要 Node 20+ 环境;init 默认不生成问答与文档,需再跑 repowise generate;init 会写入 Claude Code 的 MCP 配置,已有指向其他仓库的全局条目不会被移动。
- v0.60.1最新正式版2026-11-02 · 2026-11-02 15:10 UTC
What's Changed
- docs(release): record the tree-sitter cap in the 0.60.0 changelog by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5214
- feat(cli): defer docs during index-only updates by @HengYangDS in https://github.com/repowise-dev/repowise/pull/5207
- fix(decisions): fold a commit-mined decision into the PR decision of its merge by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/2753
- fix(decisions): fold a re-mined decision into the record that already holds it by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5221
- feat(decisions): confirm a decision with a reason, and show where it came from by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5222
- perf(update): rehydrate the health report instead of re-scoring every file by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5242
- perf(update): let the graph patch engage when the update runs from a restored state by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5243
- feat(update): report phase timings from the incremental repo update by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5244
- feat(decisions): hand decisions to your agent to review and add by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5246
- fix(update): write function facts only for the files an update re-scores by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5250
- release: v0.60.1, decisions your agent can review, faster updates by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/5249
Full Changelog: https://github.com/repowise-dev/repowise/compare/v0.60.0...v0.60.1
- v0.60.02026-11-01 · 2026-11-01 19:40 UTC
查看更新说明
What's Changed
- fix(ingestion): stop one file from hanging or exhausting the parse by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4738
- fix(update): persist updates for a subdirectory index and scope git rows to it by @Marko0519 in https://github.com/repowise-dev/repowise/pull/4195
- feat(plugins): list every plugin registration, load plugin providers, add SeamRegistry.all and PLUGIN_API_VERSION by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4741
- docs(plugins): add a plugin author guide, a hello example plugin and a test that keeps it working by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4742
- docs(readme): lead with the agent savings, a new hero and plain-English benchmarks by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4750
- fix(health): stop flagging flat boolean chains as compound conditions by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4754
- fix(health): skip cancellation catches and documented fallbacks in error_handling, state facts in idiom reasons by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4755
- fix(server): take the update lock in background syncs and never overwrite newer health rows by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4756
- fix(health): stop primitive_obsession on CLI commands, keyword-only and framework-bound parameters, and same-file overrides by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4758
- fix(health): name C++ reference, operator, destructor and macro-prefixed functions by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4766
- fix(health): skip lock_in_loop when the lock belongs to the loop element by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4767
- fix(health): a switch opens one nesting level, its case arms none by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4762
- fix(coverage): drop files whose report lines no longer match the source at ingest by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4761
- fix(health): count Python pathlib-named calls as file IO only on a path receiver by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4764
- fix(health): stop god_class judging one part of a split partial class or a stateless mixin as the whole class by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4759
- fix(health): count TSX style objects and data props as markup, not code by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4760
- fix(health): stop defer_in_loop and list_insert_zero_in_loop firing when a later statement ends the loop by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4768
- fix(health): stop counting abstract, interface and extern methods as function units by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4772
- fix(health): make three performance findings say only what the code shows by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4773
- fix(health): say what held-back findings deduct in get_health, and describe the change-risk score basis by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4776
- fix(code-origin): class parser-generator output as generated and copied single-file libraries as vendored by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4784
- fix(health): stop pairing the shared skeleton of sibling files as duplication by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4788
- fix(health): keep coverage markers off empty files and code that does not ship by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4765
- fix(health): stop sql_select_star on EXISTS and explicit-column sources, skip temp-table DML by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4775
- fix(health): repeated_nesting bec
- v0.59.02026-10-25 · 2026-10-25 15:43 UTC
查看更新说明
What's Changed
- fix(coverage): explain that a .coverage file builds the per-test map only by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4320
- fix(tests): rank reaching tests by distance before the per-target cap by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4321
- fix(core): a tests/ folder inside a JS or TS src tree is not a test directory by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4322
- fix(impacted-tests): narrow conftest import-only routes and count the broadcast apart by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4324
- fix(coverage): store nothing from a mostly unmapped report unless --allow-partial by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4323
- fix(impacted-tests): count tests reached only through long import chains apart by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4325
- feat(health): per-function coverage, the CRAP score and an untested_complexity finding by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4326
- feat(tests): one reach walk over an in-memory or stored graph, with typed reach states by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4329
- test(health): lock that coverage and deleted tests are never charged to a change by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4332
- fix(coverage): skip the file page line tint when the file changed after coverage was measured by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4336
- fix(tests): list tests that reach a file only through a hub after the rest by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4333
- feat(tests): a test that swaps a module out does not reach it by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4338
- feat(tests): a JS or TS test that mocks a module with a closed factory does not reach it by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4341
- fix(tests): never call a file of only types untested by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4337
- fix(health): one test-reach definition for the Tests tab and the file page by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4334
- fix(coverage): re-read a coverage report on update when it was written after the last ingest by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4327
- fix(coverage): name changed files from the indexed checkout in a nested repository by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4340
- feat(health): surface untested_complexity, measured findings by default by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4330
- fix(risk): say when line coverage is stored without a per-test map, and flag stale measured tests by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4339
- fix(coverage): resolve per-test coverage records with the same path resolver as the aggregate by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4328
- feat(health): coverage findings carry a prompt to add tests and the rule that silences them by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4335
- fix(coverage): dedupe the per-test map before its row cap and cut whole tests by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4331
- docs: readable reference, CI, config, MCP and health docs, with repo-wide test intelligence accuracy by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4342
- fix(health): label six performance findings that showed raw ids by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4354
- fix(decisions): measure staleness from the commit that landed a decision by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4357
- fix(perf): a schema statement or a split of a module string
- v0.58.02026-10-20 · 2026-10-20 19:02 UTC
查看更新说明
What's Changed
- docs: change evidence, components, policy and reports in the README and docs by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3947
- feat(overview): fold Do next on request and keep critical for live secrets by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3966
- docs(readme): match the CodeScene tile wording to the benchmark method by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3969
- refactor(chat): build chart dataset rows from plain records by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3951
- test(analysis): golden snapshots for scan_source, dead code, health and parser by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3970
- test(pipeline): pin persistence step order, failure handling and decision chain by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3971
- test(server): pin get_context, get_symbol, search and overview payloads by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3972
- test(cli): pin serve, doctor and update behaviour by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3974
- refactor(overview): build the overview summary from section functions by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3979
- refactor(security): split security_scan into focused modules by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3973
- fix(serve): reject web UI archive members that escape the cache directory by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3975
- refactor(mcp): share the signature and stale-status helpers by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3976
- refactor(persistence): split health crud into findings, metrics, snapshots and summary modules by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3977
- refactor(core): one git runner for analysis, doc drift and edit capture by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3980
- refactor(cli): split workspace_cmd into a package and its largest commands into steps by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3981
- refactor(serve): split serve_cmd into a package and serve_command into steps by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3982
- refactor(cli): split helpers into focused modules behind the helpers facade by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3983
- fix(workspace): filtered diagnostics reason counts and list counts like status by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3984
- refactor(doctor): split repo checks into check groups, repair and render by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3985
- refactor(cli): one outcome recorder and snapshot refresh for init and update by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3986
- refactor(core): one set of repo-relative path helpers by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3987
- test(providers): point the provider-name allowlist at the moved helpers module by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3998
- refactor(core): split pipeline persist into a package by writer area by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3989
- refactor(context): resolve get_context targets through an ordered resolver list by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3988
- refactor(context): build the get_context card from a table of sections by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3997
- refactor(init): InitOptions and the front stages of init_command by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/4000
- refactor(core): extract persist_analysis decision steps into named helpers by @RaghavChamadiya in https://github.com/repow
- v0.57.02026-10-15 · 2026-10-15 18:20 UTC
查看更新说明
What's Changed
- fix(ui): close contract gaps for hosts that deploy separately from the UI package by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3566
- feat(health): order Fix first by the function's own change history by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3565
- docs(readme): hosted and Foresight near the top, with one way in to each by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3574
- feat(health): say what a Break up split buys in its reason by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3581
- fix(jvm): resolve Kotlin imports of top-level functions and properties by @Aman-goel-04 in https://github.com/repowise-dev/repowise/pull/3407
- fix(jvm): flag Java and Kotlin public API for published modules (#3504) by @rishu685 in https://github.com/repowise-dev/repowise/pull/3577
- fix(core): recognize literal Python lazy exports by @z2Ace0107 in https://github.com/repowise-dev/repowise/pull/3570
- feat(health): a complexity map for Swift by @ybai08 in https://github.com/repowise-dev/repowise/pull/3450
- fix(dataflow): a grouped Go var declares its names by @ybai08 in https://github.com/repowise-dev/repowise/pull/3472
- docs(health): update class metrics availability for Dart, F#, and Obj-C by @AlaminSaifullah in https://github.com/repowise-dev/repowise/pull/3479
- fix: name keyless upgrade commands in init, status, and get_answer by @Aman-goel-04 in https://github.com/repowise-dev/repowise/pull/3143
- fix(health): lead a Fix first finding with the stored plan its first step lifts by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3582
- feat(refactoring): test commands for Go, Rust, JVM and Ruby plans by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3585
- feat(health): hold back layers measured below the precision bar per language by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/2921
- feat(refactoring): run a plan's C# tests with dotnet test by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3583
- feat(refactoring): leave the Extract Method helper's name to the person applying the plan by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3588
- fix(health): bind the catch variable as a def in Java, C# and C++ dataflow dialects by @Aman-goel-04 in https://github.com/repowise-dev/repowise/pull/3483
- fix(health): state the performance queue's reason on every finding and settle example-path contexts by @RaghavChamadiya in https://github.com/repowise-dev/repowise/pull/3612
- fix(graph): bind Kotlin alias imports by alias and drop the fake wildcard module by @swati510 in https://github.com/repowise-dev/repowise/pull/3607
- fix(graph): type Kotlin constructor properties and Swift stored properties as receivers by @swati510 in https://github.com/repowise-dev/repowise/pull/3609
- feat(graph): type Dart call receivers from fields, parameters and locals by @swati510 in https://github.com/repowise-dev/repowise/pull/3610
- fix(graph): a module alias reaches only the module's top-level declarations by @swati510 in https://github.com/repowise-dev/repowise/pull/3617
- fix(swift): a subscript read is not a call by @swati510 in https://github.com/repowise-dev/repowise/pull/3618
- fix(graph): give Java same-arity overloads and enum-constant methods their own node by @swati510 in https://github.com/repowise-dev/repowise/pull/3616
- fix(swift): an extension is not a constructible class by @swati510 in https://github.com/repowise-dev/repowise/pull/3619
- fix(graph): type Java call chains, inherited fields, super and cast receivers by @swati510 in https://github.com/repowise-dev/repowise/pull/3623
- fix(jvm): the same-package tier no longer offers another class's method by @swati510 in https://github.com/repowise-dev/repowise/pull/3620
- fix(graph): an overload tie never lands on an overload that can't take the call's arguments by @swati510 in https://github.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Set it up in one line
Open Claude Code, Codex, Cursor or any MCP-capable agent in your repository and paste:
Read https://docs.repowise.dev/setup.md and set up Repowise in this repository.
The agent installs Repowise, indexes the repo with no API key, connects itself to the index, and asks you before anything costs money. To do it by hand:
uv tool install repowise # or: pipx install repowise / pip install repowise
cd /path/to/your/repo
repowise init --yes --no-prose # graph, git, health, dead code, docs. No key, no spend.
# answers and docs: run repowise generate (one command, no re-index)
repowise serve # dashboard + MCP server (needs Node 20+; first run downloads the UI)
serve opens the dashboard in your browser. After a first index it starts with a short
guided tour, and Setup is where you connect agents, turn on sync and add coverage or a model.
Restart Claude Code or run /mcp, then ask "What breaks if I change
src/auth.py?" or "Use Repowise get_overview to summarize this repository."
init wires Claude Code for this repo and adds the global repowise MCP entry
when there is none; it never moves one that serves another repo. Full setup for every agent →
Your agent stops guessing
Without an index, an agent rediscovers your codebase on every task: grep, open a file, open three more, grep again. Repowise answers those questions ahead of time, so the agent asks once and gets on with the work.
In a measured run on django/django, an agent with Repowise made 3.8 tool calls
instead of 7.2, opened 3.0 files instead of 7.2 and wrote 31.6% less, with
answers just as good. That is the largest saving of the five context tools we
tested. On a small local model the output cut reaches 47.9%.
How it was measured →
- Your agent gets ten task-shaped MCP tools. Ask about several files at once and get callers, risk, tests, owners and the reasons behind the code in one answer. The tool list ↓
- Up to 99% less command noise.
repowise distilltrims test, install and git output before the agent reads it and keeps every error line. Distill → - Context before the agent asks. Optional hooks warn it
off fragile files and stale paths, and Repowise keeps your
CLAUDE.mdandAGENTS.mdcurrent from the index. - See your own savings.
repowise savedand the dashboard's Usage and savings page count the tokens your agent no longer has to read.
What it does
One index of your code, its history and its decisions, used three ways: to understand the code, to change it safely, and to keep improving it.
Understand the code
| You ask | Repowise gives you |
|---|---|
| How does checkout work in this repo? | A cited answer built from the call graph and the generated docs, in one call. Search and answers |
| What calls this function, and what does it call? | A call graph across 28 parsed languages, every edge stamped with how it was resolved and how far to trust it, plus traced execution flows from each entry point. The graph |
| Can I get docs for this codebase? | A wiki for every module and file, rendered from the code's structure with no key, or written by a model when you choose. It updates incrementally after each commit. Docs |
| Which of our docs are wrong? | Markdown checked against the tree: every reference to a file or symbol the code no longer has, with the line to edit. Doc drift |
| Why is it built this way? | Decisions mined from ADRs, # WHY: comments, commit and PR history and your agent sessions, each tied to the code it governs and flagged when it goes stale. Decisions |
| Who knows this code? | Owners, bus factor, fading ownership when the main author goes quiet, and suggested reviewers. Ownership |
| Can I see the architecture? | An explorable dependency map, C4 views, and a Structurizr export, no model involved. Dashboard |
Change it safely
| You ask | Repowise gives you |
|---|---|
| What breaks if I change this? | Symbol-level blast radius: the callers of what you changed, the files that historically change with it but are missing from your diff, and the tests that reach it. Change risk |
| How risky is this PR? | Where the change ranks against your repository's own recent commits, with the reasons, as a directive your agent can act on. Change risk |
| Which tests should run? | The tests a diff actually exercises, from a coverage report if you have one and from the call graph if you do not. Test intelligence |
| Did this PR add untested lines? | Patch coverage, branch coverage on changed lines and path-scoped gates in CI, on GitHub, GitLab or any runner. CI gates |
| Will this API change break another repo? | HTTP, gRPC, topic and OpenAPI contracts matched across repositories, with a breaking-change guard and the consumer files it affects. Workspaces |
| Is anyone else editing these files? | Other open branches touching the same files or their co-change partners, each with the reason it is listed. Branch overlap |
| Did we just commit a secret? | Keys, tokens and risky calls found in the working tree and in full git history, with a pre-commit check and a CI gate. Security signals |
Improve it continuously
| You ask | Repowise gives you |
|---|---|
| What should we fix first? | A ranked queue weighing impact against effort, using churn, fan-in, coverage and bug history. Fix first |
| Where is the debt? | A 1 to 10 score for every file from 53 deterministic detectors, split into defect risk, maintainability and performance, validated against real bug history. Code health |
| Why is this slow? | N+1 queries, I/O in loops, blocking calls inside async code and quadratic loops, traced across function and file boundaries. Performance |
| How do I break this up safely? | Concrete refactoring plans: Extract Method, Extract Class, Move Method, Split File, Break Cycle, with the exact symbols that move and what moves with them. Ready to hand to an agent. Refactoring |
| What can we delete? | Unreachable files, unused exports and unused packages, each with a confidence tier and the evidence behind it. Dead code |
| Where do bugs keep landing? | Bug-fix commits traced to files and symbols, and a warning when your agent edits a bug magnet. Bug history |
| Are our tests testing anything? | Tests with no assertions, tests that only check their own mocks, and untested hotspots. Test-quality smells |
- Test coverage without running coverage. Most repositories never produce a coverage report. Repowise answers "is this tested, and by what" from the import and call graph, and labels every answer measured or inferred.
- It checks its own health score on your repository. After each index it reports how many of the lowest-scoring files actually had bug fixes in your recent history, so a bad score on your codebase is visible to you.
- It learns from your agent sessions. With transcript capture on, the corrections you keep repeating ("use the shared HTTP client") become tracked decisions it feeds back to the agent later. Transcripts never leave your machine.
- It writes your
CLAUDE.mdandAGENTS.mdfrom the real index and keeps them current, so even an agent with no MCP support starts informed. - It shrinks command output before your agent reads it.
repowise distill pytestkeeps every failure and drops the noise, and nothing is lost: anexpandcommand restores any cut. - New git worktrees start indexed. A linked worktree seeds its index from the base checkout instead of starting cold.
- It knows which external systems you depend on. Package manifests across PyPI, npm, Cargo, Go, NuGet, Maven and CMake feed a map of the services and libraries the code reaches.
Hosted, and Foresight
Everything above runs free on your own machine. repowise.dev runs it for you, private repos included, and is where Foresight arrives first: models trained on years of real commits and fixes that rank the files a fix will touch, name what a change forgot, and explain every answer, with no LLM. What Foresight does →
Already indexed locally? repowise publish puts the repo on repowise.dev in one
command. It indexes your GitHub remote, so nothing is uploaded from your machine.
Public repos are free.
Know what breaks before you merge
All of this comes from the graph and git history, with no LLM, so the same diff always gets the same answer.
- Change risk. Score any commit or branch 0 to 10 against your repository's own
recent commits, with what it may break, the companion files it forgot, the
tests it is missing and the tests to run.
repowise risk main..HEAD(reference) - Tests without a coverage run. Which tests reach a file and which ones a diff
exercises, from a coverage report when you have one and from the call graph
when you do not: 97.5% correct on which tests to run.
repowise impacted-tests main..HEAD(reference) - Bug magnets. Which files keep getting bug fixes, with a warning when your agent edits one. (reference)
- Branch overlap. Other open branches editing the same files.
repowise overlap(reference) - In CI. Patch coverage, doc drift, security and change risk as gates through the GitHub Action, a GitLab template or plain CLI, with SARIF output. No API key. Repowise in CI →
On every pull request. The free Repowise PR Bot posts one comment, edited in place on every push, with the callers outside the PR, the tests and companion files it is missing, and its change risk. A green PR gets no comment at all.
A real comment on a real PR: repowise-dev/repowise#1204 · its analysis page → · install the PR bot →
Every change, with its evidence
Each merged PR or commit becomes a Change Record: what it touched, who owns it, the tests that reach it, the contracts and decisions it crosses, and what happened after it landed. No forge API is called.
| You ask | Repowise gives you |
|---|---|
| What landed in this PR, and what backs it up? | The change's evidence checklist, each item ok, attention or unknown, with an in-toto export. Change Records |
| Can CI hold changes to our payment code to a higher bar? | Rules in .repowise/policies.yaml, matched to components by name, tag or criticality and evaluated by repowise check, with SARIF or JUnit output. Change policy |
| Something broke. Which change do we read first? | Recent changes ranked against an error, a stack trace or an issue. On 43 real regressions, the change a later revert or fix named was in the top 5 for 67% of them, against 28% for ranking by shared files. Suspects |
| Who owns this, and are they still working on it? | Backstage-shaped components with owners from your catalog and CODEOWNERS, compared with the last 90 days of commits. Components |
| Can we show an auditor or an acquirer where we stand? | Evidence packs: a repository assessment, a change report for a period and a component inventory, as JSON, Markdown, HTML or CSV. Reports |
Know exactly what to fix
Every file gets a 1 to 10 score from 53 deterministic detectors, read three ways: defect risk, maintainability and performance. Performance findings such as N+1 queries and I/O in loops are traced across functions and files.
The score is checked against real bugs. On 21 open-source projects, ranking by Repowise found 2.3x as many later-buggy files as CodeScene in the same review budget. It also checks itself on your repository after every index: "16 of the 20 lowest-health files had a bug fix in the last 6 months, 3.3x the 24% baseline."
Then it names the fix: Extract Method, Extract Class, Move Method, Split File or Break Cycle, with the exact symbols that move, ranked so a fix on a central file comes before the same fix on a leaf. Each plan has a copy-to-agent button.
repowise next # what to fix first, ranked by impact and effort
repowise health --refactoring-targets # concrete plans
repowise dead-code # what can go, by confidence tier
Code health · Refactoring · Dead code · How it was validated →
Across your repositories
Real systems are more than one repository, and the expensive failures live between them. Change a backend contract and Repowise names the frontend calls that consume it, the services downstream, and the architecture rule the new dependency breaks, before it ships.
| Workspace intelligence | What it answers |
|---|---|
| Contract map | Which services provide and consume each HTTP, gRPC, event, socket and data contract? Links keep their exact or candidate confidence and the source evidence. |
| Cross-repo blast radius | If this provider changes, which downstream services are in structural reach, and which may drift through historical co-change? |
| Breaking-change guard | Was an endpoint removed or an OpenAPI, proto or signature shape changed incompatibly, and which consumer files are linked to that contract? |
| Test impact | Which tests in the consumer repos should run for this provider change, measured from coverage or inferred from the call graph? |
| Architecture as code | Does the live system graph violate declared dependency rules or contain cycles? repowise workspace check gates CI. |
| Architecture health | How coupled is the estate? Propagation cost, the cyclic core, service roles and a deterministic 1-10 architecture score. |
| Federated context | One dashboard and one MCP server answer across every repository while keeping repo-level evidence. |
Workspace guide and support matrix → · Keeping the index fresh →
Measured against the field
The same repositories, commits and questions for every tool, each given its full advertised surface, against answer keys we did not write.
| Result | |
|---|---|
| Work saved in an agent loop | 3.8 tool calls instead of 7.2, 3.0 files opened instead of 7.2, 31.6% less output. The best of five context tools. n=43, p<0.0001 |
| Finding the right files | 0.876 of the files a fix needed, against 0.610 for the next tool, on a sealed set. n=42, p=0.00004 |
| Command output | Up to 99.5% smaller (npm ci), 89% for git log, 86% for git diff, no error line lost |
| Call graph the compiler agrees with | 93.8% to 99.8% precision on Go, TypeScript, Dart, C and Python, graded by each language's own toolchain. Against four other tools, none that finds as much of the graph gets more of it right, in 7 of 7 cells |
| Health that predicts bugs | 2.3x CodeScene's recall of later-buggy files at the same review budget. 2,770 files, p=0.003 |
| Scale | 15 million lines (dotnet/runtime) on one laptop. Building the call graph takes 75 MB, 10x less than the next tool |
Every result, in plain English, with the method → · The research it is built on →
No single product competes with all of this, so there is no single table. Rows marked measured are head-to-head numbers that link to docs/BENCHMARKS.md, where the sample sizes, the tests and the rows we lose live. Unmarked rows are capability presence, not measurements.
As an agent context layer
| repowise | CodeGraph | Serena | DeepWiki | |
|---|---|---|---|---|
| Self-hostable, open source | ✅ AGPL-3.0 | ✅ | ✅ | ❌ cloud only |
| Private repo, no cloud | ✅ | ✅ | ✅ | ❌ OSS forks only |
| MCP tools served | 10 default + 7 opt-in | 1 | 29 | 3 |
| Finds the gold files (measured, n=42 sealed) | ✅ 0.876 | 0.610 | not in this run | not measured |
| Output tokens vs a bare agent (measured, n=43) | ✅ -31.6% | -24.4% | -14.8% | not measured |
| Memory to build the graph (measured, 5 tools, 35 repos) | ✅ 75 MB, lowest on 35 of 35 | 757 MB | not measured | n/a, cloud |
| Time to build the graph (measured, same run) | 2.77s, fastest on 14 of 35 | 3.65s, fastest on 16 | not measured | n/a, cloud |
| Time to build the full index, django (measured) | ⚠️ 366.8s, slowest here | ✅ 16.4s | not measured | n/a, cloud |
| Call-edge precision, judged by a compiler (measured, 5 tools, 7 cells) | ✅ nothing that finds as much gets more of it right, 7 of 7 | lower precision in 7 | not measured | not measured |
| Generated documentation | ✅ | ❌ | ❌ | ✅ |
| Proactive agent hooks | ✅ Claude + Codex | ❌ | ❌ | ❌ |
Generated CLAUDE.md / AGENTS.md | ✅ | ❌ | ❌ | ❌ |
| Command-output distillation | ✅ reversible | ❌ | ❌ | ❌ |
| Architectural decision records | ✅ | ❌ | ❌ | ❌ |
| Multi-repo workspace intelligence | ✅ contracts, co-change, federated MCP | ❌ | ❌ | ❌ |
The two cost rows answer different questions. Building the call graph, we are the lightest tool measured, about ten times lighter than the next, and roughly as fast as the fastest. Building the whole index, CodeGraph is 22x faster than we are, because by then we have also built the git-history layer, the wiki, the decisions and the health pass. If a call graph is all you need, that is the right trade and you should take it. With model-written prose on, it is 135x.
Competitors measured at CodeGraph 1.5.0, Graphify 0.9.31, Serena 1.6.2.dev0 and
code-review-graph 2.3.7 in August 2026. Repowise compiler-graded figures are from main
on 2026-10-03; the other Repowise rows are from 081a59fa, August 2026.
As a code health tool
| repowise | CodeScene | |
|---|---|---|
| Self-hostable, open source | ✅ AGPL-3.0 | ⚠️ on-prem Docker, proprietary |
| Code health score (1-10) | ✅ 53 detectors, 25 scoring | ✅ 25-30 |
| Brain Method / LCOM4 / god class | ✅ | ✅ |
| Defects found at a 20% review budget (measured, 2,770 files) | ✅ 0.173 | 0.074 |
| Effort-aware ranking, Popt (measured, p=0.003) | ✅ 0.607 | 0.462 |
| Precision at that budget (measured) | 0.580 | ✅ 0.636, a shorter list |
| Discrimination, ROC AUC (measured, paired) | 0.731 | 0.705, p=0.054, not significant |
| Business impact (resolution time) | ❌ we could not replicate this on open data | ✅ Code Red study |
| Git intelligence (hotspots, ownership, co-change) | ✅ | ✅ |
| Pre-merge change-risk scoring | ✅ 0-10 + directives | ✅ |
| Concrete cross-file refactoring plans | ✅ graph-aware + blast radius | ⚠️ within-function only |
| Test-coverage intelligence | ✅ LCOV/Cobertura/Clover/JaCoCo/Go | ❌ |
| Dead code detection | ✅ | ❌ |
| Serves it to an AI agent over MCP | ✅ | ✅ |
CodeScene is the only other vendor in this category with a published empirical defect study, which is why it is the one we ran head to head. It flags about 27 files where we flag 132, so if you want a short list to act on, its threshold is the better fit.
Documentation generators
DeepWiki, Google Code Wiki and Swimm generate documentation from a repository, which overlaps one of our layers. We have not measured against them, so there is no table here.
The PR bot, against LLM review bots
| Repowise PR Bot | CodeRabbit | Greptile | |
|---|---|---|---|
| LLM calls per PR | ✅ zero | ❌ every review | ❌ every review |
| Same diff, same review | ✅ deterministic | ❌ sampled output | ❌ sampled output |
| Your code sent to a model provider | ✅ never | ❌ yes | ❌ yes |
| Symbol-level blast radius | ✅ call graph | ❌ | ⚠️ prose, from context |
| Co-change partners missing from the PR | ✅ git history | ❌ | ❌ |
| Change risk vs the repo's own history | ✅ 0-10 + percentile | ❌ | ❌ |
| Silent on a clean PR | ✅ by default | ⚠️ configurable | ⚠️ configurable |
An LLM reviewer is a different product: it can read intent, and it can be wrong in a new way on every run. This one does set arithmetic over a call graph and a git history, so pushing the same diff twice gives the same review twice. Full side-by-side comparisons: repowise.dev/compare →
Supported languages
28 languages parsed to an AST, 42 on a five-rung ladder, framework-aware where an ecosystem handler exists. Every language ships in the open-source distribution.
| Rung | Languages | What you get |
|---|---|---|
| Full (15) | Python · TypeScript · JavaScript · Svelte · Vue · Astro · Java · Kotlin · Go · Rust · C++ · C# · Scala · Ruby · Apex (Salesforce) | The whole pipeline: AST symbols, import resolution, a resolved call graph, heritage, docstrings, framework edges and code-health markers |
| Good (11) | C · Swift · PHP · Dart · Object Pascal · COBOL · GDScript · VB.NET · Elixir · F# · Objective-C | All of the above except the full health suite, within the language-specific ceilings in the full matrix |
| Partial (2) | Luau / Roblox · Razor / Blazor | Luau: AST symbols and require() resolution, Rojo and .luaurc aware. Razor: component symbols, @code and component-tag call edges, C# health markers; no import resolution yet |
| Lightweight (6) | Clojure · Haskell · Lean 4 · Erlang · HTML · QML | A real file-to-file import graph, and no symbol-level claims |
| Structural (8) | R · Zig · Julia · Elm · OCaml · Crystal · Nim · D | Git history: blame, hotspots, co-change, ownership, bug history |
SQL and dbt projects get ref() / source() lineage, shell scripts get function-level
symbols, HTML pages contribute their <script src> and <link href> dependencies, and
OpenAPI, Protobuf, GraphQL, Dockerfile, Terraform and similar formats get dedicated
handlers. Anything else is still tracked through git history.
Every call edge is stamped with how it was resolved and how much to trust it, from
same_file at 0.95 down to a repo-wide name match at 0.50, labelled as the guess it
is. Accuracy per language, graded against each language's own compiler:
docs/BENCHMARKS.md#accuracy-by-language.
Full matrix: docs/layers/LANGUAGE_SUPPORT.md → · adding a language takes five small steps and no changes to the parser core: docs/architecture/language-support.md → · languages moving up the ladder: roadmap →
Supported agents and editors
Eight agents wired end to end · two at the Full tier · every other MCP host one paste away.
Full is every surface Repowise has: MCP tools, skills, slash commands, a managed
instructions file, hook-level interception of tool calls, and transcript mining after
the session. Good is MCP tools plus an instructions file or skills, without transcript mining
(hooks only where the matrix says). Basic is the MCP config alone. Anything else that speaks MCP is one snippet away:
repowise agents print-config claude-code prints a server entry for Cline, Windsurf,
Zed, Gemini CLI or any host that reads mcpServers.
Integration matrix →
In VS Code, the Repowise extension shows what your change breaks before you push (riskiest files, what is downstream, forgotten companion files, missing tests, suggested reviewers), health in the gutter and status bar, callers and ownership on hover, and refactoring plans as CodeLens. One install also registers the MCP server, so the same index serves you and your agent. Install from the Marketplace or Open VSX and run Repowise: Set Up This Repository. VS Code guide →
In Claude Code, Lens ships inside the Repowise plugin and shows you what the index
knows while Claude works: the file it is on and how many files depend on it, a change
review after a turn that edits files (code health, tests to run, other branches on the
same files), and /lens, a pane with Flow (what to check before accepting each turn),
a map of the repo lit by what Claude searched, opened and edited and what its edits
reach, Ask, and a session recap. Nothing reaches Claude unless you press a button, and
Lens makes no model calls of its own. It needs Claude Code 2.1.287 or later, and the
map needs repowise serve --no-ui running. Lens guide →
The ten MCP tools
Every response carries a _meta envelope with the indexed commit, the index age and a
stale warning when the index has fallen behind your checkout, so your agent always
knows how much to trust what it just read.
| Tool | What only this tool answers |
|---|---|
get_overview() | Architecture summary, module map, entry points, git health. The first call on an unfamiliar codebase. |
get_answer(question) | Hybrid retrieval (full-text plus vector), graph expansion and one cited answer with a single calibrated confidence. Search, read and reason in a single round-trip. |
get_context(targets, include?) | Triage card for files, modules or symbols: summary, signatures, hotspot flag, governing decisions, symbol ids. include opens callers, callees, ownership and metrics. Batch many targets in one call. |
get_symbol("file.py::Name") | One indexed symbol's source with exact line bounds. |
search_codebase(query) | Hybrid search over code and docs, by symbol, path or concept. |
get_risk(targets?, changed_files?) | Hotspots, dependents, co-change partners, ownership, test gaps, bug history. Pass changed_files for PR mode and get a directive back. |
get_change_risk(revspec) | What a commit, range or uncommitted change made worse across defect risk, maintainability and performance, the tests that touch it, and how the diff ranks against recent commits. |
get_why(query?, targets?) | Architectural decisions with their verbatim evidence. Falls back to git archaeology when no decision exists. |
get_dead_code(...) | Unreachable code by confidence tier, with cross-repo consumers in workspace mode. |
get_health(targets?, include?) | Health scores and findings across all three lenses, Fix first, coverage, trends, doc drift and refactoring plans. |
Ten is a deliberate ceiling: a small, task-shaped surface is easier for an agent to choose from than a large one. Seven more tools (dependency paths, execution flows, refactoring code generation, finding triage, and three workspace architecture tools) are opt-in. Parameters, examples and when to use which: docs/agent/MCP_TOOLS.md →
For teams and enterprises
AI makes producing a change cheaper. It does not make understanding its consequences cheaper. Repowise gives developers, agents, reviewers and platform teams the same evidence about what exists, what depends on it, what is risky and what will break, from one index, in place of a separate health tool, dead-code tool, code-search layer for agents, docs generator and test-impact service.
| Deployment | Where your code is read | What leaves your network |
|---|---|---|
Self-hosted, open source (pip install repowise) | your machine | anonymous CLI telemetry you can switch off, and your own LLM provider only if you turn prose on |
| Self-hosted, commercial | your VPC or an air-gapped network | nothing at all in air-gapped mode |
| Hosted (repowise.dev) | our managed indexer | your code goes to the platform |
Graph, git, health, change risk, tests, dead code and PR review make zero LLM calls, and raw source is never stored. Prose is optional and runs on your own provider or fully offline through Ollama.
Evidence you can hand to someone else.
| Who is asking | What Repowise produces |
|---|---|
| An auditor reviewing change management (SOC 2 CC8.1, ISO 27001 A.8.32, PCI DSS 6.5) | Every change in the period with its review record, reaching tests, policy verdict and later outcome: repowise report changes |
| A software inventory review (PCI DSS 6.3.2) | Components with owner teams, languages, entry points and the packages they import: repowise report inventory |
| A security team asking which of your code uses a package | Import sites with component, owner team and reachability, plus a CycloneDX 1.6 usage export: repowise packages where |
| An acquirer, a board or a migration committee | Component posture, hotspots, bus factor, dead code, test reach and contracts: repowise report assessment |
| An incident review | The recent changes to read first, with the signals behind each: repowise suspects |
Any git host works, because indexing reads a local checkout: GitHub (PR bot, Action, webhooks), GitLab (CI template, webhooks), Bitbucket and others through the CLI, and plain directories or Perforce and SVN exports for every layer except history.
Commercial licences come per seat, per indexed repository or enterprise-wide, with a named contact, an SLA and a quarterly architecture review. Using Repowise inside your company under the AGPL creates no obligation to publish your own code.
Commercial detail and capability status · Security review pack · Evaluating it for your company · [email protected]
Privacy
- Deterministic or offline mode: with
--no-prose, code-derived content stays on your infrastructure. The CLI reports anonymous, opt-out usage telemetry (command names and coarse environment only); turn it off withrepowise telemetry disable,DO_NOT_TRACK=1, or by running fully offline. What's collected → - Optional LLM features: generated prose, decision extraction and refactoring code generation send code-derived prompts directly to the provider configured with your own key. Repowise does not proxy those calls.
- What's stored: the graph, embeddings, generated wiki pages and git metadata. Raw source is processed transiently and never persisted.
- Fully offline: Ollama plus a local embedding model means zero external calls.
Doing a security review? docs/business/SECURITY_COMPLIANCE.md →
CLI
repowise init [PATH] # index a codebase (plan screen; --yes --no-prose needs no key)
repowise generate [PATH] # answers and docs with a model, on an existing index (no re-index)
repowise serve [PATH] # MCP server + local dashboard
repowise update [PATH] # incremental update (--workspace for every repo)
repowise watch # re-index on file change
repowise search "<q>" # hybrid search (fulltext / semantic / symbol / path)
repowise ask "<q>" # a synthesized answer with citations
repowise context <files> # triage card: layer, hotspot, fix history, freshness
repowise symbol <id> # one symbol's body, with verified line bounds
repowise why <q|path> # decisions, rationale, git archaeology
repowise next # what to fix first
repowise health # code-health KPIs and lowest-scoring files
repowise risk main..HEAD # score a branch or PR range
repowise overlap # other branches editing the same files
repowise impacted-tests # only the tests a diff exercises
repowise changes show ID # one merged change and its evidence checklist
repowise check # evaluate .repowise/policies.yaml against a change
repowise suspects # recent changes ranked against a symptom
repowise components # declared and derived components, owners vs activity
repowise packages where # where a third-party package is imported
repowise report # assessment, change evidence and inventory packs
repowise dead-code # unreachable code by confidence tier
repowise doc-drift # documentation the code no longer supports
repowise security # secrets and risky patterns, tree or full history
repowise decision list # architectural decisions
repowise export --format structurizr # the architecture as Structurizr DSL
repowise distill pytest # compact, errors-first, reversible command output
repowise saved # tokens and dollars saved by distillation
repowise workspace add # multi-repo workspace management
repowise doctor # check setup, API keys, index drift
repowise publish # put this repo on repowise.dev (indexed from GitHub; public repos free)
repowise uninstall # remove what repowise wrote, and say what it left
Every command and flag: docs/reference/CLI_REFERENCE.md · config: docs/reference/CONFIG.md · something not working: docs/start/TROUBLESHOOTING.md · all docs: docs/README.md
Contributing
git clone https://github.com/repowise-dev/repowise
cd repowise
uv sync --all-packages
uv run repowise --version
uv run pytest tests/unit/
New here? You do not have to read 3,000 files to start. We keep a public index of this repository built by Repowise itself, re-indexed on every push: explore repowise with repowise → (architecture, hotspots, ownership, decisions, and a ranked refactoring backlog you are welcome to pick from).
Full guide, including how to add languages and LLM providers: CONTRIBUTING.md · architecture: docs/architecture/
License
AGPL-3.0. Free for individuals, teams and companies using Repowise internally.
For commercial licensing (the enterprise security and compliance layer, SSO/SCIM, RBAC, workflow integrations, priority support and SLA, or embedding Repowise in a product without AGPL obligations), see docs/business/COMMERCIAL.md or contact [email protected].
Built for engineers who got tired of watching their AI agent cat the same file for the fourth time.