← Work

zatsu

ツール Rust · tree-sitter ソースを見る

単一ファイル概要 CLI の zat をフォークし、リポジトリ全体の構造と公開シンボルを「雑」に眺められるよう拡張した決定論的なコード概要 CLI。

zatsu というツールを作りました。単一ファイルのコード概要を表示する CLI zat のフォークで、リポジトリ全体を対象にできるよう拡張したものです。リポジトリを渡すと、.gitignore を尊重したコンパクトなツリーに各ファイルの公開シンボルの概要をぶら下げて出力します。

作った理由

zat は tree-sitter でファイルの公開シンボルを抽出して概要表示してくれる良いツールですが、対象は単一ファイルです。初めてのリポジトリを開いたとき、まず知りたいのは「どこに何があって、どんな公開 API を持っているか」という全体像で、エディタでファイルを一つずつ開いて回るのは遠回りだし、tree はファイル名しか教えてくれません。そこで zat をフォークして、この概要表示をリポジトリ全体に広げました。

もう一つの動機はコーディングエージェントです。エージェントにリポジトリの全体像を渡すとき、実行のたびに揺れない安定した出力であってほしい。zatsu は決定論的な出力を方針にしていて、人間が雑に眺める用途とエージェントへのコンテキスト供給の両方に使えます。

できること

  • ディレクトリモード: ツリー表示に、対応言語のファイルはシンボル概要(関数シグネチャ、構造体フィールド、enum バリアントなど)を行番号付きでぶら下げる
  • ファイルモード: 単一ファイルの概要だけを出力
  • .gitignore に対応したトラバーサル、--max-depth / --max-lines による出力の制限

zatsu 自身のリポジトリに実行するとこうなります。

src/
├── lib.rs
│   ├── mod outline; // L1
│   ├── mod repository; // L2
│   └── fn lang_for_ext(ext: &str) -> Option<(Language, &'static str)> // L6-L70
├── outline.rs
│   ├── struct VisibleRange<'a> { // L12-L18
│   │       node: Node<'a>
│   │       start_byte: usize
│   │       ...
│   ├── fn write_outline(...) -> io::Result<()> // L41-L137
│   └── fn parse(source: &str, language: &Language) -> Option<Tree> // L150-L156
...

技術構成

Rust 製で、解析は tree-sitter に任せています。言語ごとのシンボル抽出は .scm のクエリファイルで定義していて、現在 JavaScript / TypeScript / Rust / Python / Go / Java / C / C++ / C# / Swift / Kotlin / Haskell / Ruby / Markdown に対応しています。

tree-sitter の概要エンジンと言語ごとのクエリは上流の zat の成果で、zatsu が足したのは .gitignore 対応のトラバーサル、出力の制限、そして決定論的なリポジトリ全体の出力です。

試してみる

brew install shohei81/tap/zatsu

Cargo や Nix でも入ります。あとはリポジトリで実行するだけです。

zatsu .
zatsu --max-depth 2 --max-lines 100 .
zatsu src/lib.rs   # ファイルモード

ソースは github.com/shohei81/zatsu にあります(GPL-3.0 ライセンス)。