Fixes for incremental extraction correctness, graph loading, uninstall scoping, macOS paths, and Swift extraction.
Incremental extraction
- Incremental runs no longer drop cross-file edges whose target file wasn't in the batch (#2211, #2213). Python relative imports and markdown reference links emitted absolute-path target ids without the stamp the incremental canonicalization needs, so a re-extracted file's imports/references dangled or vanished. Both now canonicalize to the root-relative node.
- Incremental extraction no longer prunes alive files as "deleted" (#2210). The stale-source check compared paths with a raw string test (no Unicode NFC) and pruned non-matches without a liveness check, so macOS NFD paths and legacy basename spellings lost their nodes. It now compares NFC on both sides and is fail-closed.
--updateon macOS no longer re-extracts everything when the corpus path or a filename contains non-ASCII characters (#2221, thanks @SyedFahad7). Manifest keys are NFC-normalized.- Incremental rebuilds no longer reuse stale community labels, and a graph that outgrows the visualization cap now keeps an aggregated view instead of deleting
graph.html(#2218, thanks @bobspryn).
Other fixes
graphify benchmark, the graph merge-driver, and the call-flow HTML export no longer crash or silently fail on a--no-clustergraph.json(#2212), which stores edges underedgesrather thanlinks.claude/gemini/codebuddyuninstall no longer delete the user-global skill when called with aproject_dir(#2215); this also fixesgraphify uninstall --projectdeleting the global codebuddy skill.- Swift computed and observed properties (
var body: some View { ... },get/set,willSet/didSet) now emit graph nodes, so SwiftUI views are no longer erased (#2181, thanks @ozdemirsarman).