Tilth:コードリーディングを「この語を見つけた」から「この symbol を理解した」へ進める
知らない repository を調べる時、rg は速い。ただし答えられるのは「この文字列はどこにあるか」までだ。function 名は comment、string、同名の implementation、本当の call site に混ざる。その後は大きな file を開き、context range を推測し、もう一度 search することになりがちだ。人にとっては attention の切り替えであり、agent にとっては tool call と重複 token の増加になる。本当に知りたいのはもっと構造化された問いだろう。definition はどこか。誰が呼ぶのか。この file は何に依存するのか。この変更は実際にはどの function を変えたのか。
今日見る jahala/tilth は、tree-sitter で source code を parse する single binary の tool だ。CLI と MCP server の両方で使える。事前 index はいらない。small file はそのまま返し、大きな file では line range 付きの outline を先に返す。search は mention より definition を先に置き、周辺 symbol、call relationship、source を展開できる。tilth diff は text line の羅列ではなく function 単位で change を報告する。
GitHub repository、README、LICENSE、main の最新 commit、Releases を 2026-09-21 10:00 Asia/Shanghai 時点で確認すると、jahala/tilth は 350 stars、28 forks。主要 language は Rust、license は MIT。repository は 2026-02-09 17:27:39 UTC に作成された。main の最新 HEAD は 9ecdc04、latest push/commit は 2026-09-19 12:02:44 UTC で、page から host を click して対応する install command を見られるようにする commit だ。最新 GitHub Release は v0.10.1、published at は 2026-08-30 21:26:45 UTC。まだ素早く磨かれている段階なので、complete な language server の代わりとして扱うより、まず一つの real repository と具体的な調査 task で試したい。
プロジェクト概要
| 項目 | 内容 |
|---|---|
| リポジトリ | jahala/tilth |
| 位置づけ | tree-sitter ベースの code-reading CLI と MCP server |
| Stars / Forks | 350 / 28 |
| 主要 language | Rust |
| ライセンス | MIT |
| 作成日 | 2026-02-09 17:27:39 UTC |
| Latest push / main HEAD | 2026-09-19 12:02:44 UTC / 9ecdc04 |
| 最新 Release | v0.10.1、2026-08-30 21:26:45 UTC |
| index の要否 | 事前 index や追加 setup は不要 |
file を移動できる outline にする
README で最も分かりやすい入口は、file を直接渡すことだ。
tilth fastapi/dependencies/utils.py
tilth fastapi/dependencies/utils.py --section 218-232
small file は全体を返す。large file では imports、function、line range からなる outline を先に返し、--section で必要な部分だけを取る。code review や引き継いだばかりの module で、まず outline を見て掘る場所を決められるので、千行を超える file を最初から context に入れずに済む。Markdown heading を指定して document の一部を取ることもできる。
search も実用的な違いになる。tilth get_typed_signature --scope fastapi --expand=1 は definition を先に示し、同じ scope の周辺 symbol、optional な source expansion、callee を一緒に置く。call chain を逆にたどるなら --callers、複数の概念を一度に調べるなら comma 区切りの multi-symbol query が使える。MCP mode はすでに expand した definition を覚え、後の結果では既出として示すので、同じ function body を何度も受け取らない。
install 後は一つの具体的な問いから使う
cargo install tilth
# または
npx tilth
Codex、Claude Code、Cursor などの MCP host で code を読むなら、README の host ごとの install subcommand が使える。たとえば tilth install codex は Codex の MCP config を書く。一般的な設定も tilth --mcp を server として起動するだけで、repository-wide indexing を先に走らせる必要はない。
まず「この auth check は誰が呼ぶのか」や「この PR は実際にどの function を変えたのか」という一つの問いで、CLI の --callers、grok、diff HEAD~1 を動かしてみたい。価値は rg を置き換えることではなく、text match の後に必要な構造確認を人が毎回組み立てなくてよくする点にある。
境界もはっきりしている
Tilth は syntax を parse するが、type を resolve しない。caller と file dependency は name で match するため、別 module の同名 function は混同され得るし、dynamic dispatch を信頼できる形で追跡することもできない。tree-sitter grammar がない language では text search と通常の file reading に戻る。refactor の安全性を単独で証明する tool ではない、という割り切りは必要だ。
それでも single binary、index database なし、code を読む次の行動に焦点を当てた output という trade-off は良い。知らない codebase で agent に context を渡す人や、一時的な調査のために language service 一式を起動したくない人なら、definition-first search と function-level diff を一度試せば、日常の tool box に入るか判断しやすい。
まとめ
tilth は「文字列を見つける」と「code の中で symbol の位置を理解する」の間にある繰り返し作業を、軽い CLI/MCP workflow にしている。type system の代わりにはならず、dynamic dispatch まで解決する約束もしない。それでも definition、caller、dependency、function-level diff という高頻度の reading task では、tree-sitter の構造情報が file を開く回数を減らし、agent の往復も減らせる。Rust、Go、Python などが混ざる repository を探索するなら、warm-up なしで始められる構造化 reading は試す価値がある。
プロジェクト: https://github.com/jahala/tilth