atlas-map 0.2.1a0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. atlas_map-0.2.1a0/.gitignore +5 -0
  2. atlas_map-0.2.1a0/CHANGELOG.md +265 -0
  3. atlas_map-0.2.1a0/CONTRIBUTING.md +66 -0
  4. atlas_map-0.2.1a0/Cargo.lock +509 -0
  5. atlas_map-0.2.1a0/Cargo.toml +43 -0
  6. atlas_map-0.2.1a0/LICENSE +21 -0
  7. atlas_map-0.2.1a0/PKG-INFO +217 -0
  8. atlas_map-0.2.1a0/README.md +195 -0
  9. atlas_map-0.2.1a0/assets/atlas-logo.svg +32 -0
  10. atlas_map-0.2.1a0/examples/dump-ast.rs +87 -0
  11. atlas_map-0.2.1a0/pyproject.toml +41 -0
  12. atlas_map-0.2.1a0/queries/python/tags.scm +77 -0
  13. atlas_map-0.2.1a0/queries/rust/tags.scm +88 -0
  14. atlas_map-0.2.1a0/queries/typescript/tags.scm +79 -0
  15. atlas_map-0.2.1a0/src/budget.rs +1341 -0
  16. atlas_map-0.2.1a0/src/cache.rs +225 -0
  17. atlas_map-0.2.1a0/src/cli.rs +402 -0
  18. atlas_map-0.2.1a0/src/discover.rs +254 -0
  19. atlas_map-0.2.1a0/src/lang/mod.rs +84 -0
  20. atlas_map-0.2.1a0/src/lang/python.rs +13 -0
  21. atlas_map-0.2.1a0/src/lang/rust_lang.rs +13 -0
  22. atlas_map-0.2.1a0/src/lang/typescript.rs +13 -0
  23. atlas_map-0.2.1a0/src/lib.rs +17 -0
  24. atlas_map-0.2.1a0/src/link.rs +598 -0
  25. atlas_map-0.2.1a0/src/main.rs +6 -0
  26. atlas_map-0.2.1a0/src/parse.rs +544 -0
  27. atlas_map-0.2.1a0/src/rank.rs +229 -0
  28. atlas_map-0.2.1a0/src/render/color.rs +214 -0
  29. atlas_map-0.2.1a0/src/render/json.rs +266 -0
  30. atlas_map-0.2.1a0/src/render/markdown.rs +193 -0
  31. atlas_map-0.2.1a0/src/render/mod.rs +19 -0
  32. atlas_map-0.2.1a0/tests/discover_fixture/.hiddendir/skipped.py +1 -0
  33. atlas_map-0.2.1a0/tests/discover_fixture/README.md +3 -0
  34. atlas_map-0.2.1a0/tests/discover_fixture/app.py +5 -0
  35. atlas_map-0.2.1a0/tests/discover_fixture/node_modules/vendored.py +1 -0
  36. atlas_map-0.2.1a0/tests/discover_fixture/sub/util.py +5 -0
  37. atlas_map-0.2.1a0/tests/discover_walk.rs +22 -0
  38. atlas_map-0.2.1a0/tests/queries/fixtures/python.py +56 -0
  39. atlas_map-0.2.1a0/tests/queries/fixtures/rust.rs +73 -0
  40. atlas_map-0.2.1a0/tests/queries/fixtures/typescript.ts +46 -0
  41. atlas_map-0.2.1a0/tests/queries/snapshots/python.snap +20 -0
  42. atlas_map-0.2.1a0/tests/queries/snapshots/rust.snap +19 -0
  43. atlas_map-0.2.1a0/tests/queries/snapshots/typescript.snap +19 -0
  44. atlas_map-0.2.1a0/tests/query_snapshots.rs +142 -0
@@ -0,0 +1,5 @@
1
+ /target
2
+ .atlas/
3
+ .repomap/
4
+ benchmark/results/*.local.json
5
+ benchmark/.work/
@@ -0,0 +1,265 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to atlas, grouped Added/Changed/Fixed per
4
+ release ([Keep a Changelog](https://keepachangelog.com/) style). Pre-1.0
5
+ semver policy: JSON schema changes bump the minor version — see the
6
+ release-process skill. Ranking/budgeting entries must include their
7
+ benchmark delta.
8
+
9
+ ## [Unreleased]
10
+
11
+ ## [0.2.1-alpha] - 2026-06-17
12
+
13
+ Terminal polish, and the fix that makes the pip publish actually land.
14
+
15
+ ### Fixed
16
+ - **PyPI macOS x86_64 wheel.** The publish pipeline stalled on v0.2.0-alpha: the
17
+ `macos-13` runner that built the Intel-macOS wheel sat queued indefinitely
18
+ (the runner is being deprecated), blocking the publish job. Both macOS wheels
19
+ now build on the `macos-14` (arm64) runner — x86_64 via cross-compile (Apple's
20
+ SDK is universal) — so `pip install --pre atlas-map` publishes reliably.
21
+
22
+ ### Added
23
+ - **Colorized terminal output.** When stdout is a terminal, the Markdown map is
24
+ ANSI-colorized for scannability — bold-cyan header, bold-blue file paths, dim
25
+ rank/dependency/footer detail, tinted declaration keywords. It's a display-only
26
+ layer: **piped output stays plain** (so feeding the map to an agent or a file
27
+ is unaffected), and the token count/determinism are untouched. Controlled by
28
+ `--color auto|always|never` (default `auto`); honors the `NO_COLOR` convention.
29
+ - **Shell completions.** `atlas --completions <bash|zsh|fish|powershell|elvish>`
30
+ prints a completion script to stdout (e.g. `atlas --completions zsh >
31
+ ~/.zfunc/_atlas`). Adds the `clap_complete` dependency.
32
+
33
+ ## [0.2.0-alpha] - 2026-06-17
34
+
35
+ Second alpha. Headline: the **symbol index** more than doubles the comprehension
36
+ token win (−65.2% at 20/20 accuracy), and atlas now installs via **pip/pipx**
37
+ (`pip install --pre atlas-map`) alongside the existing `curl | sh` and `cargo
38
+ install`.
39
+
40
+ ### Added
41
+ - **pip / pipx distribution (`pip install atlas-map`).** atlas now ships as a
42
+ PyPI wheel so the Python-native audience (aider/Claude-Code/Cursor users) can
43
+ install it without a Rust toolchain or a `curl | sh`, and reach it on Windows
44
+ and in locked-down/corp environments where the shell installer doesn't work.
45
+ The wheel wraps the same compiled binary via maturin `bindings = "bin"` (no
46
+ Python runs at execution time; the `atlas` command lands on PATH); a new
47
+ `.github/workflows/pypi.yml` builds the five platform wheels + an sdist
48
+ fallback and publishes via PyPI Trusted Publishing (OIDC) on each release tag.
49
+ Distribution name is `atlas-map` (bare `atlas` was taken); the command stays
50
+ `atlas`. Additive — cargo-dist's `curl | sh`, archives, and `cargo install`
51
+ are unchanged. *Maintainer one-time setup before first publish: add the PyPI
52
+ Trusted Publisher (project `atlas-map`, repo `fkenmar/atlas`, workflow
53
+ `pypi.yml`, environment `pypi`).*
54
+ - **Symbol index for the collapsed tail (ADR 0004).** When files overflow the
55
+ budget, atlas now lists the *names* of the collapsed files' types — a compact
56
+ `path: ClassA, ClassB` index — instead of erasing them into a bare directory
57
+ skeleton, so an agent can locate the long tail without grepping. Type-first,
58
+ ranked, capped per file; appears only when files collapse. The JSON output
59
+ gains an additive `symbol_index` array (schema version unchanged). **Benchmark
60
+ delta:** comprehension **−65.2% tokens** (85,670 → 29,781) at **20/20 accuracy
61
+ in both arms**, median turns 3 → 1, at the default 2,048 budget — more than
62
+ doubling the prior −30.1% (run-20260617-084740).
63
+ - **Prebuilt binary distribution via cargo-dist.** A GitHub Actions release
64
+ workflow (`.github/workflows/release.yml`) cross-builds `atlas` for macOS,
65
+ Linux, and Windows (x86_64 + arm64) and publishes a `curl | sh` shell
66
+ installer plus per-platform archives on every version tag. dist config lives
67
+ in `dist-workspace.toml`.
68
+
69
+ ### Changed
70
+ - **Leaner published crate.** A Cargo.toml `exclude` drops dev-only process
71
+ dirs (`.claude`, `.github`, `benchmark`, `docs`) and process docs from the
72
+ packaged artifact: `cargo package` went from 81 to 41 files (55.8 KiB
73
+ compressed) and still builds standalone.
74
+
75
+ ## [0.1.0-alpha] - 2026-06-16
76
+
77
+ First tagged pre-release. The renamed **atlas** binary with the full M1 pipeline
78
+ (discover → parse → link → rank → budget → render) for Python / TypeScript-JS /
79
+ Rust. **Pre-release:** the M1 "measurable benchmark win" exit criterion is not yet
80
+ confirmed at N≥5 (tracked in #1); numbers below are from N=3 checkpoints.
81
+
82
+ ### Changed
83
+ - **Imports show resolved internal dependencies, not raw import strings.** The
84
+ import line was 27.5% of the map and dominated by stdlib/external noise
85
+ (`std::collections`, `node:path`). It now lists only the repo-relative paths
86
+ of the in-repo files each file actually depends on (the link graph's
87
+ File→File edges) — e.g. `imports: parse.rs, lang/mod.rs`. On repomap's own
88
+ source the import lines fell 1,090 → 283 chars (−74%), and the freed budget
89
+ lifted the map from degraded "public-only" to full detail. The external/
90
+ stdlib deps that drop out remain inferable from the symbol signatures; the
91
+ in-repo dependency structure (the navigational signal) is now clearer.
92
+ - **Adaptive skeleton footer** — the biggest density win so far. A
93
+ full-granularity collapsed-file footer dominated the budget on large repos
94
+ (pytest: 58 directory groups, ~32% of the whole map). The footer now coarsens
95
+ to the *finest* directory depth whose group count stays ≤16, keeping the
96
+ high-level shape while reclaiming the rest. pytest's footer fell from 2,491 →
97
+ 115 chars, and that freed ~30% of the budget now shows **10 files / 143
98
+ symbol lines instead of 4** at the same 2,048-token budget — far more real API
99
+ per token.
100
+ - **Lossless signature/import compression**: trailing syntactic noise carried
101
+ in from the source line — an opening `{`, a Python/trait `:`/`;` — and import
102
+ boilerplate (`use `, `;`, quotes) are dropped, keeping the declaration and
103
+ dependency path intact. Same information, fewer tokens: repomap's own Rust
104
+ self-map fell from 1,443 → 1,257 tokens (−13%) at budget 2,048, and a
105
+ budget-filling map spends the freed space surfacing more real API. A pure
106
+ step toward the token-reduction goal.
107
+ - Budget rung 3 gained a **partial-file rung**: when a file's full block won't
108
+ fit, it now shows its top-K highest-PageRank symbols (default 8) plus a
109
+ "… (N more symbols)" note, instead of collapsing straight to a one-line count.
110
+ A too-large core file now surfaces its most important API rather than just
111
+ its existence — more information at the same token budget (pytest's
112
+ `src/_pytest/_py/path.py` went from "(101 symbols)" to its top 8 signatures +
113
+ 93 more). `omitted` added to BudgetedFile and the JSON schema.
114
+ - Symbol visibility is now language-aware instead of Python-underscore-only:
115
+ Rust items are public iff declared `pub`/`pub(crate)` (bare fns, non-exported
116
+ helpers, and non-`#[macro_export]` macros are correctly private); TypeScript
117
+ members are private under a `private`/`protected` modifier. This makes the
118
+ ladder's drop-private rung and `--no-private` actually work for Rust/TS
119
+ (previously every symbol read as public). Known limitation: Rust trait
120
+ methods carry no `pub` keyword so they read as private — documented, only
121
+ bites under a tight budget. (No effect on the pytest benchmark — Python
122
+ visibility is unchanged.)
123
+ - Budget rung 3 + ranking, both found by dogfooding the map on pytest (92k LOC):
124
+ - **One-line rung:** a file whose full block overflows the remaining budget
125
+ now collapses to a one-line summary (`## path (#rank, N symbols)`) instead
126
+ of dropping the whole file — fixing a degenerate case where a single huge
127
+ top-ranked file blanked out the entire map (pytest rendered 0 content files
128
+ before this; now it shows the core modules).
129
+ - **Ranking count-bias fix:** a file's score summed its symbols' raw PageRank,
130
+ so a file's symbol COUNT dominated — 200-test-function files swamped the
131
+ core API. Now each symbol contributes only its rank *earned above the
132
+ uniform teleport baseline*, so trivial (never-referenced) symbols add ~0.
133
+ pytest's top-ranked files flipped from `testing/test_*.py` to the
134
+ `src/_pytest/*` core modules.
135
+ - Extraction now drops Rust inline test scaffolding: symbols (and their
136
+ spurious import/call graph edges) inside `#[cfg(test)]` / `mod tests`
137
+ modules are suppressed via tree-sitter node navigation — test fns, helpers,
138
+ and the `mod tests` symbol itself are no longer mapped. They are noise, not
139
+ API surface. Dogfood impact on repomap's own source: the map went from a
140
+ degraded 2,036-token "params elided" listing with 6 of 16 files collapsed to
141
+ a **1,749-token full-detail listing of all 16 files** — removing test noise
142
+ freed enough budget to show the entire real API at full signature fidelity.
143
+
144
+ ### Added
145
+ - **Reverse-dependency ("used by") edges** — each file now lists the files
146
+ that import it (`used by: a.rs, b.rs`, capped at 8; the header `imported_by`
147
+ count gives the total). This is the signal a *multi-site edit* needs — to
148
+ change a file's API you must visit everything that uses it — which the
149
+ benchmark flagged as missing on multi-site tasks (the map's weakest case).
150
+ In both the Markdown and JSON output. Whether it nets out (navigation value
151
+ vs. added per-turn cost) is for the benchmark to judge on the next run.
152
+ - **Class fields are now extracted (Python)** — PRD §5.3 shows fields in the
153
+ map (`class User # fields: id, email, …`), but classes were rendered without
154
+ them. Annotated class-body attributes (dataclass/attrs fields, typed class
155
+ attributes — `name: Type` / `name: Type = default`) are now extracted as a
156
+ new `field` symbol kind and rendered indented under their class. This gives
157
+ field-editing tasks (e.g. "add a field to a dataclass") the existing field
158
+ set directly, without reading the file. Visibility follows the underscore
159
+ convention; the cache version bumped (extraction output changed). Rust struct
160
+ fields and TS class/interface members are a follow-up.
161
+ - M1 ignore handling (FR-7): discover now reads root-level `.gitignore` and
162
+ `.repomapignore` and skips matching files/dirs during the walk (in addition
163
+ to the built-in vendored-path defaults). The hand-rolled matcher supports the
164
+ common forms — comments, blank lines, `dir/` (directory-only), `*` segment
165
+ globs, basename patterns (match any path component), and root-relative path
166
+ patterns. Not handled in v1: negation (`!`), `**`, nested ignore files
167
+ (documented; a later milestone may adopt the `ignore` crate). No new
168
+ dependency.
169
+ - M1 incremental cache (FR-6): parse results are cached in `.repomap/cache`
170
+ (bincode), keyed on each file's content hash plus a cache version. Unchanged
171
+ files reuse their stored parse instead of re-running tree-sitter; a changed
172
+ hash or version bump invalidates. Files not seen in a run are pruned on save.
173
+ The cache is purely an optimization — every I/O or decode error degrades
174
+ silently to a cold parse, never an error — and `.repomap/` is gitignored.
175
+ `parse_all` keeps its uncached signature (delegates to a disabled cache);
176
+ the CLI uses the cached path. Cold and warm runs produce byte-identical maps.
177
+ - M1 JSON renderer (FR-5/json): `--format json` emits the versioned PRD §7.3
178
+ schema (`version`, `repo`, `budget{target,rendered,detail}`, `files[{path,
179
+ lang,rank,score,imported_by,one_line,symbols[{kind,name,sig,line,
180
+ visibility}],imports}]`, `collapsed`, skip/unwired counts). Hand-serialized
181
+ with spec-correct string escaping (no serde dependency yet) and deterministic
182
+ output. `BudgetedFile`/`RenderedSymbol` gained `lang` and per-symbol `line`.
183
+ - M1 CLI integration: clap (derive) drives the full pipeline end-to-end —
184
+ `repomap [PATH] --budget N --focus PATH... --lang csv --no-private`. discover
185
+ → parse → link → rank (with `--focus` paths mapped to PageRank seeds) →
186
+ budget → Markdown. repomap now compiles its own 2,473-LOC source into a
187
+ 2,036-token budgeted map. `--format` accepts `md` (json/xml are later rungs).
188
+ - M1 budget stage (FR-3, FR-11) + budgeted Markdown renderer (FR-5, md): greedy
189
+ packing into a token budget (default 2,048) with exact BPE counts from
190
+ tiktoken-rs `cl100k_base`, behind a pluggable `Tokenizer` trait. Degradation
191
+ ladder per PRD §5.1, in order: drop private symbols → strip parameter names
192
+ (bracket-depth-aware, types kept) → collapse low-rank files into a
193
+ directory-skeleton footer that always retains every file (none lost).
194
+ Detail reduction is global and tried first; only an overflowing most-compact
195
+ listing triggers greedy per-file collapse. Deterministic (score-desc via
196
+ `f64::total_cmp`, BTreeMap-grouped footer). A rust-reviewer pass caught and
197
+ fixed a lost-file bug (empty files vanished from both listing and footer) and
198
+ a param-stripping bug (operator `>` in a default masked the next param), both
199
+ now regression-tested. Benchmark owed at M1 CLI integration (the budgeted
200
+ path isn't wired into the CLI yet).
201
+ - M1 rank stage (FR-4): personalized PageRank over the link graph — in-house
202
+ power iteration (damping 0.85, ≤20 iterations, L1 convergence check per
203
+ PRD §7.2). Dangling Symbol-node mass is redistributed through the teleport
204
+ vector each step so scores stay a distribution summing to 1; `--focus` node
205
+ indices seed the personalization vector. Deterministic (node-index-order
206
+ arithmetic). Property tests cover the distribution invariant, that
207
+ referenced symbols outrank unreferenced ones, focus boosting, and
208
+ determinism.
209
+ - M1 link stage (ADR-0002): best-effort syntactic import/reference graph —
210
+ File nodes (index-aligned to the file list) plus Symbol nodes, with import
211
+ edges (File→File) and reference edges (File→callee Symbol), sorted and
212
+ deduplicated for determinism. Per-language import resolution (Python dotted,
213
+ TypeScript relative, Rust `use` incl. `pub use`/aliases), all fuzzy by
214
+ design (no type checker). A rust-reviewer pass caught and fixed four
215
+ false-edge classes before commit: Python bare-name shadowing, Rust `pub use`
216
+ mis-parsing, TypeScript `../` root-escape, and Rust deep-segment basename
217
+ guessing — each now has a regression test (17 link tests total). Feeds
218
+ PageRank; the benchmark runs at the M1 integration checkpoint (no budgeted
219
+ map to inject until budgeting lands).
220
+ - M1 grammars (FR-1): TypeScript/JavaScript (tree-sitter-typescript 0.23.2)
221
+ and Rust (tree-sitter-rust 0.24.2) wired end-to-end — per-language
222
+ `grammar()` handle + compiled tags.scm query, with extraction snapshot tests
223
+ now covering all three Tier 1 languages. Snapshot review caught two real
224
+ extraction bugs: Rust trait methods with a default body were mis-tagged as
225
+ free functions, and TypeScript ambient (`declare`) / overload signatures
226
+ (`function_signature` nodes, distinct from `function_declaration`) were
227
+ dropped entirely — both are now extracted.
228
+ - M0 naive pipeline: tree-sitter + Python grammar wired (tree-sitter 0.26.9,
229
+ tree-sitter-python 0.25.0); discover walks with vendored-path/hidden-dir
230
+ exclusion and sorted output; parse extracts defs/imports/calls via the
231
+ embedded Python tags.scm; naive full-map markdown renderer with FR-12
232
+ skip/unwired footer; minimal `repomap [PATH] [--lang csv]` CLI.
233
+ - Real `dump-ast` example (named-AST printer for wired grammars).
234
+ - Python extraction snapshot test (`UPDATE_SNAPSHOTS=1` to regenerate) and a
235
+ discover-walk fixture test. Snapshot immediately caught and fixed a real
236
+ bug: decorated methods extracted as functions.
237
+ - Benchmark harness executes real headless `claude -p` sessions per task in
238
+ fresh pinned clones (acceptEdits mode), records tokens/turns/cost medians
239
+ with per-run values and automatic >15%-spread variance notes, and
240
+ `--record-baseline` writes baseline.json — the only sanctioned writer.
241
+ - No-map baseline recorded (M0 exit criterion): pytest 8.2.0,
242
+ claude-sonnet-4-6, 3 runs/task — 902,555 tok / 22 turns (task 01),
243
+ 369,461 tok / 14 turns (task 02), 6/6 success-criteria passes.
244
+ - Preliminary with-map probe (unofficial; naive ~81k-token map injected):
245
+ turns −41–43% on both tasks, 6/6 passes, but tokens/cost up 2.2–3.4×
246
+ from per-turn cache re-reads of the oversized map — direct evidence that
247
+ M1 budgeting is the load-bearing feature. Details in STATUS.md.
248
+
249
+ - Self-improvement loop: docs/SELF_IMPROVEMENT.md (pick → implement → gate →
250
+ measure → keep-or-revert by stats), runnable as `/improve` (one iteration)
251
+ or `/loop /improve` (continuous, self-paced); benchmark/history.md is the
252
+ append-only stats ledger, seeded with the baseline and probe rows.
253
+ - Competitive-arms protocol (post-M1) in benchmark/README.md: repomap must
254
+ beat Aider repo-map, ctags, and a file-tree control at equal budget.
255
+ - Comprehension benchmark (benchmark/comprehension.sh + verified question
256
+ set for pytest 8.2.0): read-only Q&A sessions scored against answer keys;
257
+ hard gate in the loop — with-map accuracy must be ≥ without-map, so the
258
+ map can never trade correctness for token savings.
259
+
260
+ ### Changed
261
+ - run.sh delivers prompts via stdin (naive maps exceed ARG_MAX as an
262
+ argument) and keeps harness artifacts outside the working clone.
263
+ - Project skeleton: six-stage pipeline module stubs, embedded tags.scm
264
+ queries for Python/TypeScript/Rust, benchmark harness scaffold, and the
265
+ Claude Code workspace (hooks, subagents, skills, slash commands).
@@ -0,0 +1,66 @@
1
+ # Contributing to atlas
2
+
3
+ Thanks for your interest! atlas is a small, focused tool, and contributions of
4
+ all sizes are welcome — bug reports, language fixes, docs, and features alike.
5
+
6
+ ## Quick start
7
+
8
+ ```
9
+ git clone https://github.com/fkenmar/atlas
10
+ cd atlas
11
+ cargo build
12
+ cargo test
13
+ ```
14
+
15
+ Run it against any repo to see the map:
16
+
17
+ ```
18
+ cargo run -- path/to/some/repo --budget 2048
19
+ ```
20
+
21
+ ## Before you open a PR
22
+
23
+ Every change must pass the same gate CI runs — all green:
24
+
25
+ ```
26
+ cargo fmt --all
27
+ cargo clippy --all-targets -- -D warnings
28
+ cargo test
29
+ ```
30
+
31
+ A few conventions worth knowing (the full set is in [CLAUDE.md](CLAUDE.md)):
32
+
33
+ - **No `.unwrap()` / `.expect()`** outside tests; use `anyhow` in the binary and
34
+ `thiserror` for library error types.
35
+ - **Deterministic output** — iterate sorted collections; never rely on `HashMap`
36
+ order. The same input must always produce byte-identical output.
37
+ - **Unparseable files are skipped and counted, never a panic.**
38
+ - **New dependencies need a maintainer's OK first** — please ask in the issue
39
+ before adding one.
40
+ - **Ranking or budgeting changes** are measured against the benchmark
41
+ ([benchmark/README.md](benchmark/README.md)), not merged on intuition — note the
42
+ delta in your PR.
43
+
44
+ ## Adding a language
45
+
46
+ atlas extracts symbols with tree-sitter queries. To add or fix one:
47
+
48
+ 1. Edit `queries/<lang>/tags.scm` (the capture contract is documented in
49
+ `.claude/skills/tree-sitter-queries/SKILL.md`).
50
+ 2. Add a fixture under `tests/queries/fixtures/` and a `query_*` snapshot test.
51
+ 3. `cargo test query_` — green before you push.
52
+
53
+ ## Scope
54
+
55
+ atlas is purely a **structural** map: signatures, types, and import edges, ranked
56
+ and budgeted. It is intentionally *not* a semantic search engine, an LSP, an
57
+ editor, or a code generator. Out-of-scope ideas are parked in
58
+ [ideas.md](ideas.md) rather than dropped — feel free to add yours there.
59
+
60
+ ## Reporting bugs
61
+
62
+ Open an issue with the command you ran, the repo (or a minimal snippet) it ran
63
+ on, and what you expected versus what you got. A wrong or missing symbol in the
64
+ map is a great, actionable bug report.
65
+
66
+ MIT © Kenmar