Run a full dev cycle on one change: clarify, plan, execute, lint, fix. Start every change here.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Locate and understand code through the project's graft graph before reading: where-is-X, how-does-Y or what-calls-Z.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
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.
Run every command through the project's runtime:
cd "$(git rev-parse --show-toplevel)" # the graph is at the repo root
bin/harness graft ask "<question>" --source
bin/harness graft <args…> resolves the backend, builds the graph if there is
none, and passes everything after graft straight through. A bare graft is a
different command with a different failure mode: in a repo whose graph has not
been built it answers "no matching nodes — try different words" and exits 0,
which reads like a bad question rather than a missing index. bin/harness graft
builds one first.
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.
If several repos are checked out side by side, each has its own graft/.
Neither knows about the other's files, so run every command from the repo whose
code you are working on.
bin/harness 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 each
definition, 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 <dir>/ narrows to a subtree before ranking; -n N caps results (default 8).bin/harness 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.
ask is ranked top-N and will miss instances;
grep won't. One grep replaces a spray of asks.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 — do NOT switch to raw
grep -rn, which is slower and unranked.-i case-insensitive; --in <dir>/ scopes to a subtree. Raw grep -rn is
only for files graft genuinely doesn't index (docs, configs, brand-new files).bin/harness 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.
map already named.bin/harness 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 you
rename, 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 old
impact); --depth 2 is the usual "what breaks if I touch this".--depth all: the entire connected closure — every source reachable
through 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.bin/harness 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.bin/harness graft build / bin/harness 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.
bin/harness graft build is for the LLM layer (--deep adds a concept map;
skip unless asked). bin/harness graft check refreshes and then verifies, and
fails when the graph cannot be rebuilt — the pre-push hook runs it. bin/harness graft ensure builds only when there is no graph at all, which is what
pre-commit runs, and bin/harness setup builds one on a fresh clone.
graft/ is a local, gitignored cache, never a commit.
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.
| When you're… | Reach for | Calls |
|---|---|---|
| Onboarding / "explain this codebase" | bin/harness graft map, then read the named hub cards | 1 |
| Understanding a flow ("how does X work") | bin/harness graft ask "<flow>" --source | 1 |
| Finding where a change belongs | bin/harness graft ask "where is <behavior>" --source | 1 |
| Editing a symbol you can already name | bin/harness graft grep "<symbol>", edit at the file:line (skip ask — you know where it is) | 1 |
| Renaming / deleting / changing a signature | bin/harness graft callers <sym> --depth 2 first | 1 |
| Refactor / multi-file change (before editing) | bin/harness graft callers <sym> --depth all — map every connected file, don't stop at the first | 1 |
| "What does this depend on?" | bin/harness graft callers <sym> --direction out | 1 |
| Finding every occurrence of a pattern | bin/harness graft grep "<literal>" | 1 |
| "What's the API of this file?" | bin/harness graft skeleton <file> | 1 |
| Debugging a failure in area X | bin/harness graft ask "<symptom>" --source, then callers on the suspect | 1–2 |
| Judging a diff's risk before merge | bin/harness graft callers <changed sym> --depth 2 | 1 / symbol |
| Working inside one area of a large repo | add --in <dir>/ to ask / grep / callers | n/a |
covers: list already gives exact file:line for every symbol, so
cite straight from it. The spans are generated from source and authoritative;
don't re-open or re-grep files to "double-check".bin/harness graft grep "<symbol>" for the exact file:line, then edit.
Reserve 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.bin/harness graft grep the symbol to find where it lives now, or bin/harness 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.
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 silently drops the savings line.
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.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Run a full dev cycle on one change: clarify, plan, execute, lint, fix. Start every change here.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Write a document an agent consumes — a skill, an AGENTS.md, a README, a docblock, or any file reached by a pointer.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Stress-test the owner's plan, decision or idea by interviewing them to a shared understanding before any work starts.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Remove AI tells from French prose without lowering its register — a reply, a `.po` target, a French post.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Remove AI tells from English prose — a README, a comment, a user-facing string, a review. French is `humaniseur-fr`.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Turn surviving mutants into better tests or bug reports: on a survivor, a red MSI gate, or before a threshold drops.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.