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.
- atlas_map-0.2.1a0/.gitignore +5 -0
- atlas_map-0.2.1a0/CHANGELOG.md +265 -0
- atlas_map-0.2.1a0/CONTRIBUTING.md +66 -0
- atlas_map-0.2.1a0/Cargo.lock +509 -0
- atlas_map-0.2.1a0/Cargo.toml +43 -0
- atlas_map-0.2.1a0/LICENSE +21 -0
- atlas_map-0.2.1a0/PKG-INFO +217 -0
- atlas_map-0.2.1a0/README.md +195 -0
- atlas_map-0.2.1a0/assets/atlas-logo.svg +32 -0
- atlas_map-0.2.1a0/examples/dump-ast.rs +87 -0
- atlas_map-0.2.1a0/pyproject.toml +41 -0
- atlas_map-0.2.1a0/queries/python/tags.scm +77 -0
- atlas_map-0.2.1a0/queries/rust/tags.scm +88 -0
- atlas_map-0.2.1a0/queries/typescript/tags.scm +79 -0
- atlas_map-0.2.1a0/src/budget.rs +1341 -0
- atlas_map-0.2.1a0/src/cache.rs +225 -0
- atlas_map-0.2.1a0/src/cli.rs +402 -0
- atlas_map-0.2.1a0/src/discover.rs +254 -0
- atlas_map-0.2.1a0/src/lang/mod.rs +84 -0
- atlas_map-0.2.1a0/src/lang/python.rs +13 -0
- atlas_map-0.2.1a0/src/lang/rust_lang.rs +13 -0
- atlas_map-0.2.1a0/src/lang/typescript.rs +13 -0
- atlas_map-0.2.1a0/src/lib.rs +17 -0
- atlas_map-0.2.1a0/src/link.rs +598 -0
- atlas_map-0.2.1a0/src/main.rs +6 -0
- atlas_map-0.2.1a0/src/parse.rs +544 -0
- atlas_map-0.2.1a0/src/rank.rs +229 -0
- atlas_map-0.2.1a0/src/render/color.rs +214 -0
- atlas_map-0.2.1a0/src/render/json.rs +266 -0
- atlas_map-0.2.1a0/src/render/markdown.rs +193 -0
- atlas_map-0.2.1a0/src/render/mod.rs +19 -0
- atlas_map-0.2.1a0/tests/discover_fixture/.hiddendir/skipped.py +1 -0
- atlas_map-0.2.1a0/tests/discover_fixture/README.md +3 -0
- atlas_map-0.2.1a0/tests/discover_fixture/app.py +5 -0
- atlas_map-0.2.1a0/tests/discover_fixture/node_modules/vendored.py +1 -0
- atlas_map-0.2.1a0/tests/discover_fixture/sub/util.py +5 -0
- atlas_map-0.2.1a0/tests/discover_walk.rs +22 -0
- atlas_map-0.2.1a0/tests/queries/fixtures/python.py +56 -0
- atlas_map-0.2.1a0/tests/queries/fixtures/rust.rs +73 -0
- atlas_map-0.2.1a0/tests/queries/fixtures/typescript.ts +46 -0
- atlas_map-0.2.1a0/tests/queries/snapshots/python.snap +20 -0
- atlas_map-0.2.1a0/tests/queries/snapshots/rust.snap +19 -0
- atlas_map-0.2.1a0/tests/queries/snapshots/typescript.snap +19 -0
- atlas_map-0.2.1a0/tests/query_snapshots.rs +142 -0
|
@@ -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
|