mirror of
https://github.com/safishamsi/graphify.git
synced 2026-07-13 19:07:10 +00:00
e34e27c24c
Local install-testing of 0.9.4 surfaced that `graphify extract .` dropped every cross-file indirect_call edge — the headline feature, broken on the primary code path — while the extract() API worked. Root cause: the cross-file callable-target guard unioned per-file `callable_nids` (pre-remap ids), but extract() rewrites node ids afterward (id_remap / prefix sym_remap / _disambiguate_colliding_node_ids). When the scan root relativizes ids (cache_root == project root, which the CLI passes), the guard set went stale and `tgt not in callable_nids` rejected every remapped target. In-file indirect edges survived (emitted with consistently-remapped endpoints), which masked it — only cross-file dropped. Fix: mark callable defs with a `_callable` attribute on the node dict instead of exporting an id list. A marker rides through every id remap; callable_nids is rebuilt from the final (post-remap) nodes right before the pass that uses it, and the marker is stripped before output (like origin_file). Regression test extracts with cache_root == project root (the CLI shape) and asserts the cross-file edge survives and _callable never ships to graph.json. Full suite 2769. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>