ripwire — deterministic repo map before reading code
ripwire (v0.4.x at authoring time; the release binary must be on PATH) is a zero-dependency C++23
CLI that builds a ranked, deterministic call graph of any repo in ~1s (parses once, then auto-caches
warm). It answers "what to touch, what it breaks, which tests to run" for a fraction of the tokens of
grep + whole-file reads. No API key, no daemon, no index server, offline. Invoke it via the terminal
tool.
When to reach for it (instead of blind grep / whole-file reads)
- Landing cold in a repo or subsystem — "what's here, how is it organized, what matters"
- "Where is the code for X" — a task, feature, or concept in your own words
- A change is proposed — what breaks, who calls it, which tests must run
- Resuming work after compaction / a new session on in-flight work
- Reviewing code you did not write (fresh eyes), or pre-commit change vetting
Do NOT use for trivial single-file lookups (plain rg/search_files wins) or broad common-word
questions — ripwire shines on specific technical asks.
Core verbs (all take a repo dir; --help is authoritative)
bashripwire <dir> --report # architecture summary: modules, god-files, cycles, top symbols ripwire <dir> --for="<task in your own words>" # ranked task lens: what to touch first, with 1-hop edges ripwire <dir> --callers=someFunc --legend=compact # who calls it (blast radius) ripwire <dir> --test-gate --legend=compact # which tests must run before committing ripwire <dir> --tree --legend=compact # file-by-file: top symbols per file ripwire <dir> --hotspots --legend=compact # files ranked by churn × complexity ripwire <dir> --communities --legend=compact # cohesive modules (Louvain) + bridges — where a new feature belongs ripwire <dir> --situ # what the working tree already changed + its blast radius (resuming work) ripwire <dir> --notes --legend=compact # pinned gotchas from past sessions (field notes) ripwire <git-url> # orient in a remote repo (shallow-clones into a cached temp dir; --refetch refreshes)
Read the map, then open only the files it surfaces (god-files and hotspots first). For a body of one
ranked symbol: ripwire <dir> --for="..." --expand=path:name (paste p=/n= off the row).
Honesty signals — read them before trusting a result
- The
--forlens reportsconfidence=/margin_pct=on its result root and the output carriesest_tokens=—confidence="low"or a flat ranking means treat the set as a starting point, not an answer. --forbundles:bodies="0"= no full bodies shipped (reason="compact-route";--auto-bodiesrestores them. Areason="budget"means the caller's token budget cut them — raise the budget instead).--skippedlists files the index dropped (oversize, or.gitignored — default ignored;--no-ignorerestores the full walk). A "not found" is only trustworthy after checking this.amb="K"on a symbol means K of its outbound calls matched several possible definitions — the resolver split the weight instead of choosing one. Read the source if the target matters. (lpin=is a separate, disclosed guess the resolver made; same remedy.)
Pitfalls
- First call on a tree parses (~1s at 1,500+ files; measured ≈1.2s wall for a 2,355-file / 77k-edge checkout on Apple M2). Later calls are warm and near-instant — chain verbs freely.
--top-kis NOT read by--for's own bundle (it shapes the default map and--query; it still applies to--format=candidateswith--for).- Markdown/docs-only or shell-only repos yield few call-graph edges —
--reportis still useful, edges are not. - The tool indexes signatures, not necessarily full bodies, by default on conceptual queries —
--expandor--auto-bodieswhen you need the body. - Cache/notes live in the repo tree (
.ripwire_notesfor--note-add); the notes file is meant to be committed. - ripwire output can be large on big repos — budget with
--max-tokens=8000/--top-k=50where supported.
Reference links
- Upstream: https://github.com/redhat-et/ripwire (Apache-2.0; releases ship prebuilt macOS/Linux binaries + SHA-256)
- The project ships 18 agent skills (Claude Code/Codex format) under
skills/in its repo — this Hermes skill is the distilled Hermes-format counterpart to that family (ripwire-orientis the closest base); read those upstream for deeper flows.

