agentsclimarketplace

Tree sitting

Skill oaustegard/claude-skills/plugins/code-intelligence/skills/tree-sitting

AST-powered code navigation via tree-sitter. Auto-scans codebases and provides progressive-disclosure tree views with symbol search, source retrieval, and reference finding. Each invocation is self-contained — no cross-process state. Use when exploring unfamiliar repos, navigating code, or needing fast symbol lookup. Triggers on "map this codebase", "explore repo", "find symbol", "navigate code", "tree-sitter", or when starting work on an unfamiliar repository.From its SKILL.md

Install
npx -y skills add oaustegard/claude-skills --skill tree-sitting

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

7.8 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it

tree-sitting

AST-powered code navigation using tree-sitter. Each invocation auto-scans the codebase (~700ms for 250 files), then runs queries at sub-millisecond speed.

Setup

uv pip install --system --break-system-packages tree-sitter

Grammars are loaded from bundled parsers/*.so files — no network fetch, no tree-sitter-language-pack dependency. Install is <1s.

Usage: CLI (treesit.py)

Every call auto-scans, prints a tree overview, then runs any queries. No state to manage between calls.

TREESIT=/mnt/skills/user/tree-sitting/scripts/treesit.py

# Orient: root-level overview (default depth=1)
python3 $TREESIT /path/to/repo

# Featuring: complete tree, minimal detail
python3 $TREESIT /path/to/repo --depth=-1 --detail=sparse

# Explore a subdirectory in full detail
python3 $TREESIT /path/to/repo --path=src/core --detail=full

# Run queries (tree overview + query results)
python3 $TREESIT /path/to/repo 'find:Parser*' 'source:parse_input'

# Queries only, no tree
python3 $TREESIT /path/to/repo --no-tree 'refs:AuthToken'

Options

OptionDefaultDescription
--depth N1Directory depth: -1=all, 0=root only, 1=one level
--detail LEVELnormalNode detail: sparse, normal, full
--path DIR(root)Scope to subdirectory
--skip DIRSExtra dirs to skip (comma-separated)
--no-treeSuppress tree overview, show only queries
--statsShow scan timing and counts

Detail Levels

All levels include line ranges (:start-end) so you can feed the window straight into Read --offset/--limit without another scan.

LevelTree-overview row (per file)Use case
sparsefile: name:1-10, Other:30-90 +3featuring: see the full shape
normalfile: name(f):1-10, Other(c):30-90 +3exploring: quick orientation
fullfull per-symbol formatter + children + importsexploring: deep dive into a directory

Queries

Append after the repo path. Multiple queries per call.

QueryExampleDescription
find:PATTERN[:KIND[:LIMIT]]find:*Handler*:functionSymbol search (glob/substring)
symbols:FILEsymbols:src/api.pyAll symbols in a file
source:SYMBOL[:FILE]source:parse_inputSource code of a symbol
refs:SYMBOL[:LIMIT]refs:AuthToken:30Text references across codebase
imports:FILEimports:src/api.pyImport list for a file
dir:PATHdir:src/coreDirectory overview (engine format)

Caching

Scans are cached to disk, keyed on a fileset fingerprint (mtime + size of all files under root, combined with skip-set and cache format version). Repeat drills in a session skip re-parsing — results are byte-identical whether served from cache or fresh parse.

Cache auto-invalidates when files change, are added, or removed. Use --no-cache to skip cache entirely (always parse), or --rebuild-cache to ignore existing cache and rewrite it. Set TREESIT_CACHE_DIR environment variable to relocate cache from the system temp directory.

Workflow

For structural drills ("what does this expose", "where is X", "who calls X"), batch multiple queries in a single call:

# Batch drills (default for exploration)
treesit.py /repo 'find:Parser*' 'source:parse_input' 'refs:ParseState'

One scan, all results. Do not fall back to grep or sed for symbol lookups — the AST queries (find:, source:, refs:) provide accurate, fast symbol-aware results that text search cannot match.

For iterative exploration:

1. treesit.py /repo                           → orient: what dirs, how big
2. treesit.py /repo --path=src/core           → drill into interesting directory
3. treesit.py /repo 'find:Parser*'            → find specific symbols
4. treesit.py /repo 'source:parse_input'      → read implementation
5. treesit.py /repo 'refs:ParseState'         → find usage across codebase

Each call is self-contained. No need to "scan first, query later" — scan happens automatically, and results are cached for subsequent calls (~700ms first scan).

Usage: Direct Python (single invocation)

For custom scripts that need the engine API directly:

import sys; sys.path.insert(0, '/mnt/skills/user/tree-sitting/scripts')
from engine import CodeCache

cache = CodeCache()
cache.scan('/path/to/repo')
# All queries in the SAME invocation:
print(cache.tree_overview())
print(cache.find_symbol('ClassName'))
print(cache.get_source_range('src/core/parser.c', 100, 150))

Important: The cache is in-memory only. All scan + query calls MUST happen in the same Python process. Splitting across separate python -c invocations loses the cache — use treesit.py instead.

Supported Languages

Bundled grammars (work out of the box): Python, JavaScript, TypeScript, TSX, Go, Rust, Ruby, Java, C, HTML, Markdown, Mojo.

Three-tier extraction for bundled languages:

  1. Custom extractors (richest — signatures, hierarchy, docstrings): Python, C, Go, Rust, JavaScript, TypeScript, TSX, Ruby, Markdown (heading outline)
  2. tags.scm queries (community-maintained — kinds, docs): Java, Mojo
  3. Generic heuristic (names + kinds + locations): HTML and any future bundled grammars

Adding a grammar

Files with unsupported extensions are silently skipped (they show as SKIP (no parser) with --stats). To add a grammar, drop a compiled libtree_sitter_<lang>.so into parsers/ — the engine picks it up automatically on the next run. Build from the grammar's repo (each tree-sitter/tree-sitter-<lang> repo has a src/ directory you can compile with cc -shared -fPIC -I src src/parser.c src/scanner.c -o libtree_sitter_<lang>.so, or use tree-sitter build).

If you need a language urgently and can't build the .so, you can try installing tree-sitter-language-pack as a fallback (uv pip install --system --break-system-packages 'tree-sitter-language-pack<1.6.3') — but note 1.6.3 ships a broken wheel (only _native/, missing the tree_sitter_language_pack/ python module → ModuleNotFoundError despite pip showing it installed); 1.6.2 and earlier work, hence the <1.6.3 pin and try to download grammars at runtime from a domain that may not be in your network allowlist. Bundling the .so is the reliable path.

What It Extracts

  • Symbols: functions, classes, structs, enums, methods, constants, defines, types
  • Signatures: parameter lists and return types (Python, C; partial for others)
  • Doc comments: first-line summaries from docstrings, JSDoc, Doxygen, ///, #
  • Line ranges: start and end line for every symbol
  • Imports: per-file dependency tracking
  • Hierarchy: class→methods, struct→fields (Python, C)

Architecture

CodeCache (in-memory, per-invocation)
  ├── files: {relpath → FileEntry(source, tree, symbols, imports)}
  ├── _symbol_index: {name → [Symbol, ...]}  ← fast lookup
  └── methods: scan(), find_symbol(), file_symbols(), dir_overview(), ...
       │
       └── treesit.py CLI — auto-scan + progressive-disclosure tree + queries

Parse cost is paid once per invocation. The symbol index enables O(1) exact match and O(n) substring/glob search where n is the number of unique symbol names (not files).

What ships with it: 11 files

201.3 KB alongside SKILL.md, 9 of them executable

scripts/

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.