v0.37.2
v0.37.2: Background code-health scans stop rebuilding the call graph
This patch removes the biggest background CPU sink in AFT. If you've seen sustained multi-core usage attributed to aft processes (#108), this release is for you.
Dead-code scans read the persisted call-graph store
Background code-health scans (the dead_code category behind aft_inspect and the status bar) used to rebuild a full call graph from scratch on every refresh — parsing every project file each time. On a ~3,000-file repo that meant 60+ seconds of snapshot building plus minutes of scanning, re-triggered by ordinary file activity (saving in your editor was enough).
The scan now projects from the persisted call-graph store that AFT already maintains incrementally: one cold build per project (the same store that powers aft_callgraph), then millisecond updates per file change. Measured on a 903-file repo: snapshot assembly went from ~93 seconds to ~250 milliseconds, and a full dead_code pass from over 3 minutes to well under a second.
While the store is still building (first open of a project), dead code reports unavailable (call graph building/retrying) instead of a wrong number, and fills in automatically once the build lands.
Remote source files in aft_outline and aft_zoom
URLs pointing at source files (unpkg, raw.githubusercontent, any CDN) now work: the file extension in the URL path decides how the content is parsed, so aft_outline https://unpkg.com/pkg/dist/index.mjs returns real symbols instead of an unsupported-content-type error. This also fixes a silent bug where raw.githubusercontent files (served as text/plain) were cached as markdown and outlined as headings.
Fixes
- Call-graph store survives project moves and renames. Moving a repository used to leave the store referencing the old path, permanently disabling dead-code analysis. The store now re-roots itself on open (or rebuilds once when necessary).
- A single stale row in the call-graph store no longer disables dead-code analysis. Orphaned call references now fall back to the file's top-level scope instead of failing the whole projection, and incremental refreshes keep symbol and reference rows coherent so the orphans stop appearing.
- The status bar no longer shows
D0when dead code is unavailable — it keeps the last known count, and theaft_inspectbody says unavailable explicitly.