Explore codebase
Orient before reading. The failure this skill exists to prevent: opening files in the order a
search engine returned them and calling the resulting impression an understanding.
The workflow derives from the skill templates the code-review-graph project auto-installs
(MIT, © 2026 Tirth Kanani), rewritten here to be tool-agnostic: every step carries a baseline
that needs no graph server.
Steps
Establish the shape before the content — how large, what languages, how many entry
points.
Accelerated: a graph-stats call (e.g. list_graph_stats-shaped; discover the real tool name
from the server's own listing). Baseline: git ls-files | wc -l, cloc or
git ls-files | sed 's/.*\.//' | sort | uniq -c | sort -rn for the language split, and the
project's own manifest (package.json, *.csproj, pyproject.toml) for its declared
dependencies and entry points.
Find the module boundaries the project actually has, not the ones its directory names
suggest.
Accelerated: an architecture-overview or community-listing call (e.g.
get_architecture_overview-shaped) clusters by real coupling. Baseline: read the top-level
directory tree, then check it against the imports — a directory whose files import mostly
from one other directory is one module wearing two names.
Read the entry points first. A main, an HTTP route table, a CLI command registry, a
message consumer, a scheduled job. These are where the project states what it is for.
Accelerated: a flow listing (e.g. list_flows-shaped) names the paths the project itself
considers significant. Baseline: grep for the framework's entry-point markers — route
decorators, if __name__ == "__main__", Main(, .MapGet(, a bin or scripts entry in
the manifest.
Follow one real path end to end before reading anything else. One request, one command,
one message — from entry point to persistence and back.
Accelerated: a flow query (e.g. get_flow-shaped) returns the whole path in one call.
Baseline: read each hop in sequence. One traced path teaches more than ten skimmed files,
because it shows which abstractions the project actually uses rather than which it declares.
Locate the tests for that path. They are the executable description of intended
behaviour, and their absence is itself a finding worth recording.
Accelerated: a tests-for query (e.g. query_graph-shaped with a tests-for pattern).
Baseline: search for the symbol's name under the test directory, and check whether the
project's test command names a coverage report you can read instead.
Write down what you concluded and what you did not check. An exploration that produces
no artifact has to be repeated by the next person, including you next week.
Gotchas
No environment-specific gotchas known.
Red flags — STOP
- Reading files in search-result order and calling it an understanding
- Describing the architecture from directory names, without checking the imports against them
- Skipping step 4 — a traced path is the difference between knowing the layout and knowing the
system
- Reporting "the codebase does X" from a region you did not open; say which parts you read
- Treating a generated or vendored directory as authored code — check whether it is in
.gitignore or carries a generation banner before drawing conclusions from it
An orientation is not finished until it names the entry points, one traced path, where that
path's tests live, and — explicitly — the regions left unread.
1---2name: explore-codebase3description: Use when arriving at an unfamiliar codebase, or an unfamiliar region of a known one, and the question is "what is here and how is it arranged" rather than "where is this specific thing". Trigger phrases: "help me understand this repo", "what does this project do", "where does X live", "walk me through the architecture", "I'm new to this codebase", "what are the main modules". Not for tracing one symptom to its cause — that is `debug-issue`; not for judging a diff — that is `review-changes`. Reach for this one when orienting, and switch to those once you know where to look.4license: MIT5---67# Explore codebase89Orient before reading. The failure this skill exists to prevent: opening files in the order a10search engine returned them and calling the resulting impression an understanding.1112The workflow derives from the skill templates the `code-review-graph` project auto-installs13(MIT, © 2026 Tirth Kanani), rewritten here to be tool-agnostic: every step carries a baseline14that needs no graph server.1516## Steps17181. **Establish the shape before the content** — how large, what languages, how many entry19 points.20 Accelerated: a graph-stats call (e.g. `list_graph_stats`-shaped; discover the real tool name21 from the server's own listing). Baseline: `git ls-files | wc -l`, `cloc` or22 `git ls-files | sed 's/.*\.//' | sort | uniq -c | sort -rn` for the language split, and the23 project's own manifest (`package.json`, `*.csproj`, `pyproject.toml`) for its declared24 dependencies and entry points.25262. **Find the module boundaries the project actually has**, not the ones its directory names27 suggest.28 Accelerated: an architecture-overview or community-listing call (e.g.29 `get_architecture_overview`-shaped) clusters by real coupling. Baseline: read the top-level30 directory tree, then check it against the imports — a directory whose files import mostly31 from one other directory is one module wearing two names.32333. **Read the entry points first.** A `main`, an HTTP route table, a CLI command registry, a34 message consumer, a scheduled job. These are where the project states what it is for.35 Accelerated: a flow listing (e.g. `list_flows`-shaped) names the paths the project itself36 considers significant. Baseline: grep for the framework's entry-point markers — route37 decorators, `if __name__ == "__main__"`, `Main(`, `.MapGet(`, a `bin` or `scripts` entry in38 the manifest.39404. **Follow one real path end to end** before reading anything else. One request, one command,41 one message — from entry point to persistence and back.42 Accelerated: a flow query (e.g. `get_flow`-shaped) returns the whole path in one call.43 Baseline: read each hop in sequence. One traced path teaches more than ten skimmed files,44 because it shows which abstractions the project actually uses rather than which it declares.45465. **Locate the tests for that path.** They are the executable description of intended47 behaviour, and their absence is itself a finding worth recording.48 Accelerated: a tests-for query (e.g. `query_graph`-shaped with a tests-for pattern).49 Baseline: search for the symbol's name under the test directory, and check whether the50 project's test command names a coverage report you can read instead.51526. **Write down what you concluded and what you did not check.** An exploration that produces53 no artifact has to be repeated by the next person, including you next week.5455## Gotchas5657No environment-specific gotchas known.5859## Red flags — STOP6061- Reading files in search-result order and calling it an understanding62- Describing the architecture from directory names, without checking the imports against them63- Skipping step 4 — a traced path is the difference between knowing the layout and knowing the64 system65- Reporting "the codebase does X" from a region you did not open; say which parts you read66- Treating a generated or vendored directory as authored code — check whether it is in67 `.gitignore` or carries a generation banner before drawing conclusions from it6869An orientation is not finished until it names the entry points, one traced path, where that70path's tests live, and — explicitly — the regions left unread.