Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This repo is indexed by graft/. For ANY task here, whether understanding how something works, finding where code lives, tracing what calls a symbol or what a change breaks, or scoping an edit, get your context from graft before grepping or reading source files.
.claude/skills/nanonets-graft/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 75% | 0% |
graft/ holds a graph of this repo: small markdown nodes that each explain one part in prose and name the exact file:line spans they cover, plus a wiring graph of who-calls-what. Querying a node costs a few hundred tokens; rebuilding that understanding by reading source costs thousands, and misses the edges.
Every command below is $0, needs no API key, and returns in under a second. There are six of them. Pick the one that fits the task, run it, act on the answer; don't chain tools hoping for more. Most tasks need one call.
graft ask "<question>" --source: locate + understand (the default)Ranked retrieval over the graph, routed automatically between prose nodes and the wiring graph, returning the top hits with exact file:line.
--source inlines the code at each hit, the ≤8-line crux of eachdefinition, so the result IS the code you need, no follow-up file read. Add --full only when the crux is too small to act on.
--in <path> narrows to a subtree before ranking; -n N caps results (default 8).work", "where is rate-limiting handled", "what assembles the request pipeline".
distinct sub-aspect, never the same question reworded. Few or weak hits mean switch tool (grep / skeleton / callers), don't re-ask.
graft grep "<pattern>": exhaustive findRegex (or --fixed for a literal) over every indexed file, hits grouped by enclosing symbol and ranked by coupling; it also reports files it couldn't read.
constant, all providers. ask is ranked top-N and will miss instances; grep won't. One grep replaces a spray of asks.
over-specific regex (func (s *Server) GenerateHandler) returns nothing even when the code is indexed. If a grep misses, loosen it (drop the receiver and signature, keep the bare name) and retry graft grep — do NOT switch to raw grep -rn, which is slower and unranked.
-i case-insensitive; --in <path> scopes to a subtree. Raw grep -rn isonly for files graft genuinely doesn't index (docs, configs, brand-new files).
graft skeleton <file>: a file's API at a glanceSignatures-only view of one file (every function / method / type with its span) in ~200 tokens, ~10x cheaper than reading the file.
editing or wiring into it. One skeleton is the whole answer for a file; don't re-skeleton the same file, and don't skeleton every file map already named.
graft callers <symbol>: the exact edgesPrecomputed call/reference edges, not a text search. Symbol can be bare (Foo), qualified (Class.method), or package-qualified (pkg.Fn).
--direction in: who calls/references this; run before yourename, delete, or change its signature.
--direction out: what this symbol itself calls/depends on (the old callees).--depth N: walk transitively N hops for the full blast radius (the oldimpact); --depth 2 is the usual "what breaks if I touch this".
--depth all: the entire connected closure — every source reachablethrough the edges. Reach for this before a refactor, rename, or any multi-file change: it surfaces the sibling and downstream files (platform variants, a module you must split out) that a single-file edit would miss.
graft map: orientation for an unfamiliar repo or areaA token-budgeted tour: directory clusters, per-directory hubs, and global hotspots, straight from the wiring graph.
map alone is the answer: read the hub cards it names; do NOT then skeleton or ask your way through every subsystem it lists. --max-dirs N widens it.
graft build / graft checkEvery tool above refreshes the graph itself before answering, so what those tools return always describes the code as it is right now — including edits you just made and have not committed. You do not need to run build after editing.
One caveat, if you grep the markdown under graft/ directly: those cards are a projection, rebuilt at the end of the turn rather than on each query, so after an edit they can lag. The tools above never do — prefer them, and treat a card's spans as stale if you have edited that file this turn.
build is for the LLM layer (--deep adds a concept map; skip unless asked); check fails when graft/ is stale, for CI.
| When you're… | Reach for | Calls | |---|---|---| | Onboarding / "explain this codebase" | graft map, then read the named hub cards | 1 | | Understanding a flow ("how does X work") | graft ask "<flow>" --source | 1 | | Finding where a change belongs | graft ask "where is <behavior>" --source | 1 | | Editing a symbol you can already name | graft grep "<symbol>", edit at the file:line (skip ask — you know where it is) | 1 | | Renaming / deleting / changing a signature | graft callers <sym> --depth 2 first | 1 | | Refactor / multi-file change (before editing) | graft callers <sym> --depth all — map every connected file, don't stop at the first | 1 | | "What does this depend on?" | graft callers <sym> --direction out | 1 | | Finding every occurrence of a pattern | graft grep "<literal>" | 1 | | "What's the API of this file?" | graft skeleton <file> | 1 | | Debugging a failure in area X | graft ask "<symptom>" --source, then callers on the suspect | 1–2 | | Judging a diff's risk before merge | graft callers <changed sym> --depth 2 | 1 / symbol | | Working inside one repo of a monorepo | add --in <scope>/ to ask / grep / callers | n/a |
In a multi-repo workspace, graft ranks fairly so the biggest repo can't drown the rest, and every hit carries a [scope/] label naming its sub-project; when you already know where you're working, narrow with graft ask "<task>" --in <scope>/.
covers: list already gives exact file:line for every symbol, socite straight from it. The spans are generated from source and authoritative; don't re-open or re-grep files to "double-check".
graft grep "<symbol>" for the exact file:line, then edit. Reserve graft ask for when you don't yet know where the code lives — an ask round-trip is wasted on a target you can already name.
fell short: weak hits, a truncated span, or a need to be exhaustive.
(a branch switch or unpulled move). Don't read the missing file — graft grep the symbol to find where it lives now, or run graft build to refresh.
Each retrieval tool opens its output with a [graft] tokens saved ≈ N line: the estimated tokens that call saved versus reading the files it covers whole. Whenever you used any graft tool in a turn, close your reply with a one-line tally summing those numbers across every graft call you made, e.g. 🌱 graft saved ~12,400 tokens this turn (3 calls). A call with no such line (tiny files, where the pointers cost as much as the source) saved nothing, so skip it. This is the per-turn figure; the statusline carries the running session total.
Never pipe a graft command through head, tail, or sed -n. Every tool is already capped and states what it dropped; clipping it costs you hits you asked for, and it silently drops the savings line the statusline's running total is parsed from.
the exact file:line, never a whole file to rebuild understanding graft gives.
graft/ directly (plain markdown;graft/INDEX.md indexes the nodes), but the tools above are faster and exhaustive where it matters, so reach for them first.
When the graft MCP server is connected, these are exposed as tools too: graft_find_code, graft_find_all, graft_file_api, graft_trace_calls (with direction / depth), graft_repo_map, graft_check_freshness. Use whichever surface is available; the guidance is identical.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 18,450 | 8,623 | -53% | 1 | 1 | 0% | 1,989 | 3,020 | +52% | 0 | 0 | — |
case-01 | fail→fail | 14,688 | 15,999 | +9% | 1 | 1 | 0% | 241 | 2,800 | +1062% | 0 | 0 | — |
case-02 | fail→fail | 13,492 | 54,842 | +306% | 1 | 1 | 0% | 188 | 2,854 | +1418% | 0 | 0 | — |
case-03 | fail→fail | 19,527 | 15,610 | -20% | 1 | 1 | 0% | 263 | 2,707 | +929% | 0 | 0 | — |
case-04 | fail→pass | 14,062 | 7,541 | -46% | 1 | 1 | 0% | 1,339 | 2,807 | +110% | 0 | 0 | — |
case-06 | fail→fail | 17,041 | 17,898 | +5% | 1 | 1 | 0% | 1,896 | 2,850 | +50% | 0 | 0 | — |
case-07 | pass→pass | 9,994 | 7,520 | -25% | 1 | 1 | 0% | 761 | 2,789 | +266% | 0 | 0 | — |
case-08 | pass→pass | 9,980 | 11,992 | +20% | 1 | 1 | 0% | 738 | 2,853 | +287% | 0 | 0 | — |
case-09 | fail→pass | 13,964 | 10,552 | -24% | 1 | 1 | 0% | 1,406 | 3,228 | +130% | 0 | 0 | — |
case-10 | fail→pass | 13,425 | 7,656 | -43% | 1 | 1 | 0% | 1,350 | 2,802 | +108% | 0 | 0 | — |
case-11 | fail→pass | 16,061 | 8,842 | -45% | 1 | 1 | 0% | 1,743 | 3,054 | +75% | 0 | 0 | — |
case-12 | fail→pass | 11,404 | 10,612 | -7% | 1 | 1 | 0% | 982 | 3,152 | +221% | 0 | 0 | — |
case-13 | fail→pass | 13,159 | 8,903 | -32% | 1 | 1 | 0% | 1,237 | 3,011 | +143% | 0 | 0 | — |
case-14 | pass→pass | 11,907 | 7,759 | -35% | 1 | 1 | 0% | 1,218 | 2,776 | +128% | 0 | 0 | — |
case-15 | fail→pass | 16,313 | 9,515 | -42% | 1 | 1 | 0% | 1,787 | 3,111 | +74% | 0 | 0 | — |
case-16 | fail→pass | 13,191 | 6,873 | -48% | 1 | 1 | 0% | 1,308 | 2,697 | +106% | 0 | 0 | — |
case-17 | pass→pass | 14,130 | 8,075 | -43% | 1 | 1 | 0% | 1,413 | 2,913 | +106% | 0 | 0 | — |
case-18 | pass→pass | 14,235 | 8,861 | -38% | 1 | 1 | 0% | 1,378 | 2,967 | +115% | 0 | 0 | — |
case-19 | fail→pass | 11,213 | 8,727 | -22% | 1 | 1 | 0% | 991 | 3,008 | +204% | 0 | 0 | — |
case-20 | pass→pass | 11,674 | 8,857 | -24% | 1 | 1 | 0% | 1,027 | 3,030 | +195% | 0 | 0 | — |
case-21 | pass→pass | 10,937 | 9,587 | -12% | 1 | 1 | 0% | 1,054 | 3,034 | +188% | 0 | 0 | — |
case-22 | pass→fail | 8,899 | 14,739 | +66% | 1 | 1 | 0% | 760 | 2,612 | +244% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 17 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 17 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.