Project Structure Map
steipete/agent-scripts
Compresses a TypeScript or Swift repository into one symbol-map text file sized for an LLM context window, for refactor planning and architecture recon.
Answers questions about a named symbol, such as its callers, what it calls, the path between two symbols or the downstream impact of changing it, using the ripwire CLI.
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install redhat-et/ripwire ripwire-navigate --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ripwire-navigate .claude/skills/ripwire-navigate && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .claude/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install redhat-et/ripwire ripwire-navigate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ripwire-navigate .agents/skills/ripwire-navigate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .agents/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install redhat-et/ripwire ripwire-navigate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ripwire-navigate .cursor/skills/ripwire-navigate && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .cursor/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/redhat-et/ripwire.git --path skills/ripwire-navigate--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install redhat-et/ripwire ripwire-navigate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ripwire-navigate .gemini/skills/ripwire-navigate && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .gemini/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install redhat-et/ripwire ripwire-navigateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ripwire-navigate .github/skills/ripwire-navigate && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .github/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add redhat-et/ripwire --skill ripwire-navigate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install redhat-et/ripwire ripwire-navigate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/redhat-et/ripwire.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ripwire-navigate .opencode/skills/ripwire-navigate && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ripwire-navigate" agent skill from https://github.com/redhat-et/ripwire/tree/main/skills/ripwire-navigate into .opencode/skills/ripwire-navigate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ripwire-navigate", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ripwire-navigateAnswers questions about a named symbol, such as its callers, what it calls, the path between two symbols or the downstream impact of changing it, using the ripwire CLI.
The agent picks the one ripwire verb that fits a question about a symbol it already knows by name, runs it and stops. The verbs cover who calls a symbol with `--callers`, where it is used with `--uses`, the transitive blast radius of changing or renaming it with `--impact`, the path from one symbol to another, its full body, and exact literal or regex matches. When the question involves three or more symbols it points to `--connect`.
Much of the guidance is about output cost. Each XML verb begins with a legend explaining its attributes, so the skill keeps the legend on the first call and adds `--legend=compact` to later navigation calls, which it says saves about a third of the bytes over a seven-call session. It warns that `--callers` returns direct callers only and should never be used to decide whether a change is safe, and says to pass every root when tracing across a service and client checked out separately. Sibling ripwire skills are named for orienting on a repo, finding bugs, combined queries and checking a diff.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 255dc19. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ripwire Code Navigation loads about 4.8k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 2,645 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, ReadAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from redhat-et/ripwire at commit 255dc19, republished under its Apache-2.0 licence (© redhat-et). 2,645 words, ~4,818 tokens.
.claude/skills/ripwire-navigate/SKILL.md (or your agent's skills folder).Nearest neighbours: • You DON'T know the symbol yet — orienting on a whole repo/subsystem → ripwire-orient. • You have a symptom and need to FIND the buggy code → ripwire-find-bug. • Your question needs to COMBINE conditions (cx + fanin + file + reachability) → ripwire-graph-query. • "Is this diff safe to merge" (not "is it safe to touch this symbol") → ripwire-change-check.
<dir> = the repo or subsystem. Calls are warm after the first parse. Tracing across a split
service+client checkout — pass every root, ripwire dir1 dir2 --impact=SYM — the merged graph carries the
cross-root evidence edges (include/import/FFI) a single-root call would never see.
Every XML verb prefixes its answer with a legend defining the attributes. You need it once. After that you are paying for prose you have already read — and the cost is worst on exactly the verbs you call most, because the legend is a fixed size while these answers are small. Measured on ripwire's own repo:
| verb | saved by --legend=compact |
|---|---|
--callers=SYM | ~70% |
--uses=SYM | ~65% |
--impact=SYM | ~50% |
--affected=F1,F2 | ~67% |
--for="..." | ~4% |
The payload is byte-identical — the entire difference is legend prose. (Percentages, not byte counts:
an exact byte total goes stale the next time anyone edits a legend, and a stale number in a skill is worse
than no number. ripwire --help carries the range, and a gate holds it to it.) So:
--for, --pack-task): leave the legend on. It is ~4% there, and it is where you
learn what amb=, cx= and counts_floor= mean. Reading a map whose legend you skipped is how
confident misreadings happen.--callers, --uses, --impact, --expand): add
--legend=compact. Across a seven-call session that is ~34% fewer bytes, ~2,900 tokens.The MCP server already defaults to compact for this reason — the tool description carries the schema, so
the legend would be redundant on every call. The CLI defaults to full because a human reading one map
needs it. If you are an agent making repeated calls, you are the case the CLI default is not tuned for.
--callers is 1-hop — don't let it answer "is it safe to change X?"--callers=SYM gives direct in-edges only. It under-counts on purpose (it's the cheap verb) — a caller
two hops away, a read/write that never calls SYM, or an #include that pulls it in all fall outside a
1-hop answer. Match the verb to the question:
ripwire <dir> --impact=SYM --legend=compact (transitive blast radius: everything
that transitively reaches SYM through the call graph, not just direct callers) +
ripwire <dir> --uses=SYM --legend=compact (the resolvable use-sites by role — call|read|write|import|extends — file:line; catches
non-call references --callers never sees, e.g. a struct read or a header import). Run both — --impact
gives depth (the call chain), --uses gives breadth (kinds of reference). --callers alone is the wrong
tool for this question; reach for it only when you already know the change is local.--impact/--callers/--callees rows
carry tested="1" when an indexed test transitively reaches that row (omitted, never a literal 0, when
none does); --impact's root adds radius_tested=/radius_untested= over its transitive reach,
--callers/--callees's root adds hop_tested=/hop_untested= over their 1-hop count — one call
answers both "what breaks" and "what's covered" instead of a second --test-gate round-trip.--callers=SYM.--slice=SYM:VAR — per-line
def/use rows (declaration/assignment/param vs read) inside the one resolved definition; bare
--slice=SYM lists the sliceable locals first. Name-based and intra-procedural — the legend states
the limits — so it answers "what touches this variable here" without reading the whole body.--slice-flow=back|fwd|both — the transitive cross-statement data-flow slice over
reaching-definition def-use edges: back = the statements whose values feed the seed variable,
fwd = the statements its value reaches; each flow row carries the variable (v=), the BFS depth
(d=) and the line it was reached from (f=). --slice-depth=N bounds the walk (default 8; a
bound that cuts is disclosed as flow_truncated="1"). Stops at the function boundary by design —
the inter-procedural half is --callers/--impact. Data dependence only — the guard deciding
whether a def executes is never a row.ripwire <dir> --at=FILE:LINE --legend=compact — the enclosing-definition chain at that location, outermost→innermost;
sym= names the innermost. The SAME seed composes into any SYM selector as @FILE:LINE
(--callers=@src/f.cpp:120, --expand=@…, --edit-check=@…, --slice=@FILE:LINE:VAR) and resolves
to that innermost definition — skip the "what is this function called" grep entirely. A seed on a
blank top-level line, an ambiguous path, or a line two definitions share is refused with a specific
diagnosis, never guessed.--slice=@FILE:LINE (or --at=FILE:LINE
beside any --slice spec — the pair composes as the slicer's seed, ARISE's own
(file, line[, variable])). A seed line naming exactly ONE sliceable local pre-picks it (disclosed:
seed=, var_from="seed"); zero or several serve the locals inventory with the candidates marked
seed="1" — pick one and re-run with :VAR. A plain identifier beside --at reads as the seed's
variable (--slice=out --at=src/f.cpp:12), and the seed also narrows an ambiguous SYM to the
definition enclosing the line.--path=A,B (shortest call-path) or --around=SYM [--around-depth=2] (bounded neighborhood). Not --for — --for returns a ranked set of relevant
signatures for a task, it does not trace a path between two named points.ripwire <dir> --connect=A,B,C --legend=compact [--connect-radius=N] — the minimal connecting subgraph: your terminals,
the fewest joining intermediaries (with signatures), and the call edges in true caller→callee direction.
Reach for --connect over --path in two cases: N>2 symbols (--path only ever takes SRC,DST — it
has no notion of a third point), or a pair --path calls unreachable. The search is undirected, so it
finds the shared caller joining two symbols — the most common way task symbols relate, which a directed
--path can never see (--path=A,B says reachable="0" even when main calls both). Symbols that can't
meet within the radius appear honestly in <unconnected>.ripwire <dir> --callers=SYM --legend=compact · ripwire <dir> --callees=SYM --legend=compactcounts_floor="1" — the count is a floor) — ripwire <dir> --uses=SYM --legend=compactt="field" symbols; per-site owner resolution, owner_candidates=K where several owners could match, never a silent pin) — ripwire <dir> --uses=Owner.field --legend=compactripwire <dir> --impact=SYM --legend=compactripwire <dir> --around=SYM --legend=compact [--around-depth=2] [--around-fanout=32]ripwire <dir> --path=SRC,DST --legend=compactripwire <dir> --connect=A,B,C --legend=compact [--connect-radius=N]ripwire <dir> --verify='calls(A,B)' --legend=compact (also uses(SYM) / unused(SYM) / contains(FILE, "LIT") /
defines(FILE, SYM) / reaches(SYM, "FILE")): one three-valued verdict with the evidence inline —
confirmed (witness printed) · refuted (only with complete evidence; a clean literal-scan no carries
complete="1") · not-established (limit= names the floor: dynamic dispatch and string-keyed references
are invisible to the index, so this verdict is honest "the index cannot prove it", never "false").
Replaces the grep-then-read chain you would otherwise run to check the claim yourself.ripwire <dir> --grep=STR --legend=compact (literal + enclosing symbol) ·
ripwire <dir> --regex=PAT --legend=compact ·
ripwire <dir> --match='(<tree-sitter query>)' --legend=compact (e.g. (call_expression function: (identifier) @c)) ·
ripwire <dir> --pattern='foo($X, ...)' --legend=compact — the same structural search written in CODE instead of in
node kinds, so you do not have to know whether this grammar calls it call_expression, call,
method_invocation or invocation_expression. $NAME binds one node (repeat it and both sites must
match), $_ binds nothing, ... (or $$$) is an ellipsis over siblings. ONE pattern searches every
served language at once — c, cpp, objc, java, csharp, javascript, typescript, python, go, rust, swift —
and grammars=/shapes= on the result name which ones it resolved for and what node kind it became in
each. Reach for --pattern when you can WRITE the shape and for --match when you need a constraint the
pattern language cannot express (a field name, a #match? predicate). Ruby, bash and the data tiers are
refused by name, never answered with a zero.
— add --grep-context=N (or --grep-before=N/--grep-after=N) for ripgrep-style N lines of source
around each hit, so you see the call site's shape without a follow-up --expand.
When one grep answers a two-term question ("cache staleness check for the MCP index"), narrow it in the
SAME call instead of grepping again and eyeballing the intersection: --and=B (repeatable) keeps only
hits where B is ALSO present, --not=C (repeatable) drops hits where C IS present — literal-only, so
they pair with --grep=, not --regex=. --grep-scope=line (default) requires the extra term on the
SAME matched line; --grep-scope=file widens that to anywhere in the same file.
Hits are SPAN-TIERED by default: a hit inside a comment or a string literal is a mention, not a use, so
the answer serves the CODE tier when any hit is code — and when none is, the ladder COLLAPSES and it
serves comment and string together as tier="comment+string" (so pasting an error message reaches
the string literal that emits it, not just some gate script's comment about it; a pattern that lives only
in prose is still answered, never emptied) — and says what it held back via
suppressed_comment=/suppressed_string=. When those counters appear and the mention IS what you were
after (an error-message string, a design note), re-ask with --grep-in=any for every tier.--callers/--callees answer from the call graph directly — no separate index step. Edges are name-based:
a high-rank symbol with no callees may be a dispatch hub (virtual/callback/macro), not a leaf — read it.
What a high amb= should CHANGE about your next action: amb="K" on a symbol means K of its outgoing
calls matched more than one same-named definition and the resolver guessed. Don't treat that edge as fact —
before you rely on it to judge safety or trace a flow, open the source at that call site and confirm which
definition it actually resolves to (or overlay --scip=index.scip if you have a compiler index; matched
edges get prov="scip" and stop being a guess). A high-rank symbol with a high amb= and an --impact
result you're about to act on is exactly the case where "read the source" isn't optional.
Sharper trust with a SCIP index — ripwire <dir> --scip=index.scip overlays compiler-backed precise
edges on top of the name-based graph: a matched edge is tagged prov="scip" and its amb= risk drops (it's
no longer a guess). Edges --scip didn't cover keep their plain name-based status — amb="K" on a symbol
still means K of its calls are guessed, prov= absent or not. Read prov="scip" as "trust this edge more
than an unmarked one," not as "the whole symbol is now precise." A path that is missing, empty or not a
regular file refuses (exit 1); a corrupt index warns on stderr and proceeds all-name-based (same stdout as not
passing --scip) — check header precise=N to confirm the overlay actually matched anything.
When you need to understand a specific function/class/concept in full (its body, contract, and rationale):
ripwire <dir> --expand=SYM --legend=compact
The ranked map, then <bodies> with SYM's full source in CDATA and a <calls> block of inline one-line
signatures for everything it calls — read the body with the callee signatures beside it. (No <doc> block
here; SYM's own doc-comment is in the CDATA body if it sits inside the definition — otherwise read the
source lines just above l=.)
About to Edit what you just expanded? If your edit tool needs a fresh native Read of the file first
(true of Claude Code's Edit; other harnesses may differ), the served body doesn't satisfy that — but the
read doesn't need to start at line 1: Read at l=, not the whole file. Same for a --for hit before
you've expanded it — its <d> row carries l= too. Over MCP, skip the Read requirement altogether —
see ripwire-mcp's edit verbs.ripwire <dir> --callers=SYM --legend=compact → <callers of="SYM" count="N"> with type, name,
file:line. Callers reveal SYM's contract from the outside — expected preconditions.ripwire <dir> --callees=SYM --legend=compact → cross with the --expand body to understand the flow.ripwire <dir> --mentions=SYM --legend=compact → <mentions of="SYM" defs="D" docs="N">
listing markdown files that backtick-name SYM: the design decisions and rationale around this symbol.ripwire <dir> --around=SYM --legend=compact [--around-depth=2].
→ Explanation: what SYM does (from the body + <calls>), who calls it and why, what it coordinates,
and any design rationale (from --mentions). Note amb="K" if call edges are ambiguous — verify in source.--layout=STRUCTFor a plain function, the deep-dive above is the whole story. For a struct/class whose bytes are a contract with something outside this compiler — a GPU uniform block, a wire/IPC/file-format record, a type mirrored into a stub or a second checkout — the question before you edit is not "who calls it" but "what is the byte layout, what pins it, and who else declares it":
ripwire <dir> --layout=AudioUniforms --legend=compact # file:name disambiguates, like --around/--legoOne call gives three things: the fields in declaration order with computed offsets/sizes and every byte
of padding made explicit; every static_assert in the index that mentions the type, with agree="0" when
a sizeof(X)==N tripwire contradicts the computed size; and every same-name definition, compared field
by field. It exits 2 when the contract is broken — mirror="mismatch" (kind="drift": two populated
definitions disagree) or a contradicted tripwire — so it works as a pre-commit check, not just a report.
kind="stub" (an empty placeholder) and kind="spelling" (simd::float4 vs float4 — the two arms of
one #ifdef) are reported but exit 0.
Believe the caveats. The offsets are a MODEL, not the ABI: a lexical walk under standard-layout
assumptions on a 64-bit LP64 target. When it cannot see the truth it says modeled="0" with a named
<caveat> instead of printing a number — #pragma pack, bitfields, virtuals, base classes, nested or
anonymous aggregates, #if-conditional members, templates, and any field type it cannot size. One unsized
field un-places every field after it. A modeled="1" number that agrees with the type's own
static_assert is trustworthy; a modeled="0" def is telling you to read the source.
--query (lexical) vs --for (task lens)ripwire <dir> --query="terms" --legend=compact — pure BM25 relatedness: the map re-ranked by lexical match against
your terms, nothing else. Use it when you want what mentions these words, uncolored by importance —
chasing a domain term, an error string's neighborhood, a concept's vocabulary.ripwire <dir> --for="task in words" — the task lens: relevance-ranked signatures plus doc-comments
and cx/in metrics, framed for reuse ("compose from these"). Use it when the question is "what should I
build on / touch for THIS task".--for for a task you're about to do; --query for a vocabulary you're hunting. Both shine
on specific technical wording; for broad common-word asks, plain rg + one read can still win.Budgeting trap: a positive, explicit --top-k is inert on plain --for — the run warns on stderr and
emits the full bundle anyway. (--for --format=candidates --top-k=N is different: the export consumes the
flag and caps the rows, no warning. --for --top-k=0 is refused by the payload-only guard.)
Narrow plain --for with its own arguments: --signatures-only (no auto-bodies), --token-budget=N (shapes
the bundle to fit), --detail=N (full bodies for just the top N). --top-k does shape --query — and pair
it with --expand as --top-k=0 when SYM is an ambiguous bare name; an unambiguous single match already
drops the map by default (topk_default="0").
Compose filters over the call graph with --graph-query=EXPR — see ripwire-graph-query for the
mini-language (sources · kind/cx/fanin/file filters · bounded callers/callees closure · and/or/not joins).
© redhat-et, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/ripwire-navigate of redhat-et/ripwire.
Open the folder on GitHubat commit 255dc19
Ripwire Code Navigation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ripwire Code Navigation this skillredhat-et/ripwire | 2.4k | — | ~4.8k | Automated safety check: Notes | Apache-2.0 | |
| Project Structure Mapsteipete/agent-scripts | 7.3k | — | ~1.9k | Automated safety check: Pass | MIT | |
| tilth Code Reading CLIjahala/tilth | 352 | — | ~1.1k | Automated safety check: Pass | MIT | |
| ccc Semantic Code Searchcocoindex-io/cocoindex-code | 2.7k | — | ~938 | Automated safety check: Pass | Apache-2.0 | |
| Repomix Codebase Packeryamadashy/repomix | 29k | — | ~1.3k | Automated safety check: Notes | MIT | |
| MCP Code Search Tool SelectionContext-Engine-AI/Context-Engine | 402 | — | ~1.3k | Automated safety check: Pass | MIT |
steipete/agent-scripts
Compresses a TypeScript or Swift repository into one symbol-map text file sized for an LLM context window, for refactor planning and architecture recon.
jahala/tilth
Replaces grep, cat, find and ls with the tilth CLI, which returns AST-aware outlines, definitions, usages and callers across many languages in one call.
cocoindex-io/cocoindex-code
Semantic code search and index management with the ccc CLI: the agent initializes, indexes and queries the project by concept, filtering by language or path.
yamadashy/repomix
Packs a local directory or remote GitHub repository into one AI-friendly file with Repomix, then searches it to explore structure, find patterns and count tokens.
Context-Engine-AI/Context-Engine
Rules for choosing Qdrant-Indexer semantic search over grep or file reads when exploring code, debugging or asking where and why questions.
gviiisen/repo-context-ledger
Record every behavior-changing feature addition, fix, and adjustment as durable, evidence-based repository knowledge, then use that ledger to continue accurately across AI windows, tools, Git…
redhat-et/ripwire
Rules for writing and converting formatted output in ripwire's C++ source with its emit helpers, keeping every printed byte identical to the old printf output.
redhat-et/ripwire
Checks whether a working-tree diff or a pull request is safe to merge: blast radius, tests to run, contract breaks, branch conflicts and stranded work.
redhat-et/ripwire
Answers call-graph questions that combine several conditions, such as complex functions that reach a target or untested symbols near main, using ripwire's graph-query mode.
redhat-et/ripwire
Produces a short brief for handing a code subsystem to a teammate or fresh session, using ripwire to rank symbols, expand bodies and surface design docs.
redhat-et/ripwire
Contributor guide for reading clang optimization remarks while editing ripwire's own C++, deciding between a source change and a build change such as LTO or PGO.
redhat-et/ripwire
Maps an unfamiliar repo or subsystem with the ripwire CLI before reading files, climbing an escalation ladder only until you are oriented.
Categories
Answers questions about a named symbol, such as its callers, what it calls, the path between two symbols or the downstream impact of changing it, using the ripwire CLI. The agent picks the one ripwire verb that fits a question about a symbol it already knows by name, runs it and stops. The verbs cover who calls a symbol with `--callers`, where it is used with `--uses`, the transitive blast radius of changing or renaming it with `--impact`, the path from one symbol to another, its full body, and exact literal or regex matches.
Ripwire Code Navigation fits situations like: finding every caller of a function before changing its signature; working out what breaks downstream if you rename a symbol; tracing the path between two functions in a large codebase; fetching one symbol's full body without reading the whole file.
Run `npx skills add redhat-et/ripwire --skill ripwire-navigate -a claude-code`. Or copy the skill folder (skills/ripwire-navigate in redhat-et/ripwire) into .claude/skills/ripwire-navigate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add redhat-et/ripwire --skill ripwire-navigate -a codex`. Or copy the skill folder (skills/ripwire-navigate in redhat-et/ripwire) into .agents/skills/ripwire-navigate in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add redhat-et/ripwire --skill ripwire-navigate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ripwire-navigate, .gemini/skills/ripwire-navigate, .github/skills/ripwire-navigate and .opencode/skills/ripwire-navigate in your project.
SKILL.md names no scripts, command-line tools or credentials: Ripwire Code Navigation is instructions for the agent only. Our summary lists: The ripwire CLI installed; A checked-out repository to analyze. Its frontmatter pre-approves these tools: Bash, Read.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Ripwire Code Navigation is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ripwire Code Navigation: Project Structure Map (steipete/agent-scripts, 7.3k stars), tilth Code Reading CLI (jahala/tilth, 352 stars), ccc Semantic Code Search (cocoindex-io/cocoindex-code, 2.7k stars) and Repomix Codebase Packer (yamadashy/repomix, 29k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
redhat-et (a GitHub organization) maintains it in redhat-et/ripwire, which has 2,412 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 4, 2026.
Source: redhat-et/ripwire on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.