featuring/SKILL.md
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tree-sitting (structural) with semantic (why/what-for) layer.
npx skillsauth add oaustegard/claude-skills featuringInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate _FEATURES.md files — top-down documentation of what a codebase does,
organized by feature/capability, anchored to specific source symbols.
tree-sitting tells you WHAT symbols exist. _FEATURES.md tells you WHY they exist and what they accomplish together.
For large codebases, the root _FEATURES.md decomposes into sub-feature files
linked by capability area — not by folder structure. An agent starts at the root
and is drawn into sub-files only when working on a relevant area.
Requires tree-sitting skill. Uses its engine for AST scanning.
uv venv /home/claude/.venv 2>/dev/null
uv pip install tree-sitter-language-pack --python /home/claude/.venv/bin/python
For quick structural orientation before running gather.py, use tree-sitting's CLI:
TREESIT=/mnt/skills/user/tree-sitting/scripts/treesit.py
# Complete tree, sparse detail — see the full shape
/home/claude/.venv/bin/python $TREESIT /path/to/repo --depth=-1 --detail=sparse
Feature documentation is built in three passes. The overview is written LAST, after all features are understood — not first.
/home/claude/.venv/bin/python /mnt/skills/user/featuring/scripts/gather.py /path/to/repo \
--skip tests,.github,node_modules --source-budget 8000
Read the gather output. Before writing anything, form a hypothesis:
"This codebase appears to be a [what it is] that provides [capability A], [capability B], and [capability C]."
Write this down as a DRAFT overview. It will be wrong or incomplete — that's fine. The point is to orient before diving into detail.
How to identify capability areas:
For each capability area identified in Pass 1:
get_source())During this pass, you'll discover:
Hierarchy decision (per feature, during this pass):
| Signal | Action |
|--------|--------|
| ≤6 key symbols, self-contained | Inline in root _FEATURES.md |
| >6 key symbols OR clear sub-capabilities | Own _FEATURES.md sub-file |
| Spans many files but is ONE capability | Inline (breadth ≠ complexity) |
| Has sub-features that are independently useful | Own sub-file |
| Is infrastructure (logging, DB layer) | Inline briefly, unless it IS the product |
NOW — after all features are documented — rewrite the overview. The Pass 1 draft was a hypothesis. Pass 3 replaces it with a proper progressive-disclosure overview that:
This is the most important part. The overview IS the entry point for every agent session. It must be accurate, complete, and fast to scan.
# Features: {project-name}
> One-sentence description of what this codebase is and does.
**Capability areas:**
- **[Area A]** — one-sentence summary
- **[Area B]** — one-sentence summary → [details](path/to/_FEATURES.md)
- **[Area C]** — one-sentence summary
## {Inline Feature Name}
{2-3 sentences: what this feature does from a user perspective.}
**Key symbols:**
- `file.py#function_name` — role in this feature
- `file.py#ClassName` — role in this feature
**Workflow:** {How a user exercises this feature or how symbols collaborate.}
**Constraints:** {Invariants, limits, rules.}
---
## {Complex Feature Area}
> One-sentence summary of what this area covers.
This area is documented in detail in [{area-name}/_FEATURES.md]({path}).
Read it when working on {specific trigger — e.g., "the memory retrieval pipeline",
"adding a new API endpoint", "modifying the build system"}.
At a glance, this area provides:
- {sub-capability 1} — one line
- {sub-capability 2} — one line
- {sub-capability 3} — one line
Sub-feature files follow the SAME format as the root, recursively. They can contain inline features and further sub-file references. Each sub-file:
# Features: {area-name} header← [Root features](../_FEATURES.md)file#symbol notation (relative to repo root)Good: "Memory Storage — Persist observations across sessions. Stores typed, tagged memories to a Turso database with BM25 full-text search. Memories have priority levels that affect retrieval ranking."
Bad: "memory.py — Contains remember(), recall(), forget(), and
supersede() functions."
The first tells you WHAT you can do. The second describes file contents — tree-sitting already gives you that.
The hierarchy is feature-driven, not folder-driven. Folders are natural candidates for decomposition boundaries, but the decision is based on:
Counter-examples — do NOT split just because:
Heuristics for finding feature boundaries:
Features to SKIP in _FEATURES.md:
Three mechanisms, layered:
/home/claude/.venv/bin/python /mnt/skills/user/featuring/scripts/check.py /path/to/repo \
[--features _FEATURES.md] [--skip tests,.github]
Parses file#symbol references from ALL _FEATURES.md files (root + sub-files),
resolves them against the live codebase via tree-sitting, and reports:
Exit code 0 = clean, 1 = drift detected. Suitable for CI or pre-commit hooks.
Add to CLAUDE.md or equivalent:
## Feature Documentation
- `_FEATURES.md` documents what this codebase does, organized by capability.
- Start here when orienting to the codebase. Follow sub-file links as needed.
- After changing behavior (new feature, renamed API, deleted functionality):
run `python featuring/scripts/check.py .` and fix any broken refs.
- After adding a new public API surface: add it to the appropriate feature
section, or create a new feature section if it's a new capability.
- Run check before committing. Broken refs = broken documentation.
When check reports broken refs, the fix is usually surgical: update the
file#symbol reference to the new name/location. For dead features (all refs
gone), either delete the section or regenerate it.
Full regeneration (re-running all three passes) is the nuclear option. Prefer targeted updates — they're cheaper and preserve hand-written narrative.
# .github/workflows/features-check.yml
name: Check _FEATURES.md
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v4
- run: uv pip install tree-sitter-language-pack
- run: python featuring/scripts/check.py . --skip tests
In Claude Code, use tree-sitting's CLI or engine directly. The agent should:
treesit.py /path --depth=-1 --detail=sparse for full structural overviewtreesit.py /path --path=DIR --detail=full for each capability areatreesit.py /path --no-tree 'source:symbol_name' where intent isn't clearAdd to CLAUDE.md:
## Codebase Understanding
Read `_FEATURES.md` for top-down feature orientation before modifying code.
Follow links to sub-feature files when working on a specific area.
Use tree-sitting MCP tools for structural queries (symbol lookup, source retrieval).
After adding new features or changing behavior, update the relevant _FEATURES.md.
A CLI tool with 15 public symbols → single _FEATURES.md, all features inline.
No sub-files needed.
The remembering skill (memory system for an AI agent) has ~60 public symbols
across 8 files. Hierarchical decomposition:
_FEATURES.md (root — overview + 3 inline features + 3 sub-file refs)
├── scripts/_FEATURES.md (memory operations — storage, retrieval, lifecycle, maintenance)
└── utils/_FEATURES.md (utility modules — therapy, reminders, blog publishing)
Root _FEATURES.md would contain:
scripts/_FEATURES.md
("Read when working on storage, retrieval, or memory lifecycle")utils/_FEATURES.md
("Read when working on therapy sessions, reminders, or blog publishing")| Skill | What it provides | Drift detection |
|-------|-----------------|-----------------|
| tree-sitting | Structural inventory (symbols, signatures) | N/A (live queries) |
| featuring | Feature documentation (what/why), hierarchical | check.py — docs → code |
| generating-lattice | Bidirectional knowledge graph | lat check — docs ↔ code |
| mapping-webapp | Web app behavioral docs (pages, flows) | None |
featuring's check is lighter than lattice's: no source code annotations needed,
no @lat: comments, just reference resolution. The trade-off is that new code
without docs is only flagged as "uncovered symbols" — it's advisory, not
enforced. Use lattice when you need strict bidirectional traceability; use
featuring when you need good-enough orientation docs that catch renames and
deletions.
development
Write effective instructions for Claude: project instructions, standalone prompts, and skill content. Use when users need help writing prompts, setting up project instructions, choosing between instruction formats, or improving how they communicate with Claude. Covers writing principles, model-aware calibration, and format selection. For building and testing complete skills, use skill-creator instead.
data-ai
Discover and load skills on demand from /mnt/skills/user/. Use when you need a capability but don't know which skill provides it, when the boot-emitted skill list is names-only and you need a full description, or when you want to list the catalog. Verbs are list (names only), search (rank by name/description match against a query), and show (emit the full SKILL.md for a named skill).
documentation
Reads the visual content of slides, pages, and images the way a human would, not just their embedded text. Use when a PPTX or PDF has image slides, screenshots, charts, scanned figures, or flattened-to-image layouts that the built-in pptx/pdf skills read as empty; when asked to transcribe, describe, OCR, or extract what is shown in an image, slide deck, or document page; or when embedded-text extraction returned little or nothing from a visually rich file. Triggers on 'read this deck', 'what's on these slides', 'transcribe', 'OCR', 'extract text from image', 'describe this chart/diagram', .pptx/.pdf/.png/.jpg with visual content.
development
Portrait Mode for SVGs — foveated vectorization with 4-zone selective detail. Combines vision annotations, MediaPipe segmentation/landmarks, and optional saliency. Like phone portrait mode, but vectorized. Use when vectorizing a portrait or photo where subject detail should outrank background detail.