graphifyy 0.9.97__tar.gz → 0.9.99__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 (724) hide show
  1. {graphifyy-0.9.97/graphifyy.egg-info → graphifyy-0.9.99}/PKG-INFO +2 -2
  2. {graphifyy-0.9.97 → graphifyy-0.9.99}/README.md +1 -1
  3. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/__main__.py +13 -3
  4. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/analyze.py +14 -5
  5. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/build.py +125 -4
  6. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cache.py +1 -1
  7. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cli.py +23 -8
  8. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/dedup.py +53 -6
  9. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/export.py +1 -1
  10. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extract.py +69 -7
  11. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/commonlisp.py +43 -2
  12. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/csharp.py +87 -0
  13. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/engine.py +104 -26
  14. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/go.py +146 -26
  15. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/julia.py +11 -6
  16. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/pascal_forms.py +2 -2
  17. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/powershell.py +19 -3
  18. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/resolution.py +53 -1
  19. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/rust.py +7 -6
  20. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/solidity.py +19 -9
  21. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/verilog.py +8 -3
  22. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/file_slice.py +2 -1
  23. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ids.py +68 -1
  24. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/install.py +54 -26
  25. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/serve.py +325 -9
  26. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-agents.md +1 -1
  27. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-aider.md +1 -1
  28. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-amp.md +1 -1
  29. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-claw.md +1 -1
  30. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-codex.md +1 -1
  31. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-copilot.md +1 -1
  32. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-devin.md +1 -1
  33. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-droid.md +1 -1
  34. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-kilo.md +1 -1
  35. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-kiro.md +1 -1
  36. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-opencode.md +1 -1
  37. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-pi.md +1 -1
  38. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-trae.md +1 -1
  39. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-vscode.md +1 -1
  40. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill-windows.md +1 -1
  41. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skill.md +1 -1
  42. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/watch.py +44 -11
  43. {graphifyy-0.9.97 → graphifyy-0.9.99/graphifyy.egg-info}/PKG-INFO +2 -2
  44. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/SOURCES.txt +10 -0
  45. {graphifyy-0.9.97 → graphifyy-0.9.99}/pyproject.toml +1 -1
  46. graphifyy-0.9.99/tests/test_confidence_score_output.py +117 -0
  47. graphifyy-0.9.99/tests/test_csharp_method_owner_labels.py +288 -0
  48. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup.py +180 -0
  49. graphifyy-0.9.99/tests/test_edge_also_seen.py +173 -0
  50. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export.py +9 -1
  51. graphifyy-0.9.99/tests/test_file_id_collision_4854.py +386 -0
  52. graphifyy-0.9.99/tests/test_go_method_value_indirect_calls.py +97 -0
  53. graphifyy-0.9.99/tests/test_go_package_var_calls.py +63 -0
  54. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_receiver_member_calls.py +82 -0
  55. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_import_extension_resolution.py +58 -0
  56. graphifyy-0.9.99/tests/test_indirect_dispatch_module_attr.py +174 -0
  57. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install.py +48 -0
  58. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_references.py +1 -1
  59. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_languages.py +119 -0
  60. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_opencode_plugin_refresh.py +14 -0
  61. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal.py +72 -0
  62. graphifyy-0.9.99/tests/test_path_confidence.py +163 -0
  63. graphifyy-0.9.99/tests/test_path_type_member.py +317 -0
  64. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_slicing.py +42 -0
  65. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_serve.py +47 -0
  66. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_serve_http.py +29 -0
  67. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_auto_refresh.py +8 -9
  68. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_solidity_extractor.py +30 -0
  69. graphifyy-0.9.99/tests/test_undirected_two_file_import_cycle.py +163 -0
  70. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_scope.py +24 -1
  71. {graphifyy-0.9.97 → graphifyy-0.9.99}/LICENSE +0 -0
  72. {graphifyy-0.9.97 → graphifyy-0.9.99}/LICENSE-MIT +0 -0
  73. {graphifyy-0.9.97 → graphifyy-0.9.99}/NOTICE +0 -0
  74. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/__init__.py +0 -0
  75. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/_minhash.py +0 -0
  76. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/affected.py +0 -0
  77. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/agents-md.md +0 -0
  78. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/antigravity-rules.md +0 -0
  79. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/claude-md.md +0 -0
  80. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/gemini-md.md +0 -0
  81. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/kiro-steering.md +0 -0
  82. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/always_on/vscode-instructions.md +0 -0
  83. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/benchmark.py +0 -0
  84. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/callflow_html.py +0 -0
  85. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cargo_introspect.py +0 -0
  86. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cluster.py +0 -0
  87. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/command-kilo.md +0 -0
  88. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cross_repo_calls.py +0 -0
  89. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/cross_repo_types.py +0 -0
  90. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/csharp_dispatch.py +0 -0
  91. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/detect.py +0 -0
  92. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/diagnostics.py +0 -0
  93. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/__init__.py +0 -0
  94. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/base.py +0 -0
  95. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/graphdb.py +0 -0
  96. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/exporters/html.py +0 -0
  97. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/__init__.py +0 -0
  98. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/apex.py +0 -0
  99. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/base.py +0 -0
  100. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/bash.py +0 -0
  101. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/blade.py +0 -0
  102. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/cobol.py +0 -0
  103. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/dart.py +0 -0
  104. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/dm.py +0 -0
  105. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/elixir.py +0 -0
  106. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/erlang.py +0 -0
  107. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/fortran.py +0 -0
  108. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/json_config.py +0 -0
  109. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/markdown.py +0 -0
  110. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/models.py +0 -0
  111. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/objc.py +0 -0
  112. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/ocaml.py +0 -0
  113. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/pascal.py +0 -0
  114. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/r.py +0 -0
  115. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/razor.py +0 -0
  116. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/robot.py +0 -0
  117. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/sln.py +0 -0
  118. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/sql.py +0 -0
  119. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/terraform.py +0 -0
  120. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/vbnet.py +0 -0
  121. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/yaml_config.py +0 -0
  122. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/extractors/zig.py +0 -0
  123. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/global_graph.py +0 -0
  124. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/google_workspace.py +0 -0
  125. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/hooks.py +0 -0
  126. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ingest.py +0 -0
  127. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/interface_dispatch.py +0 -0
  128. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/llm.py +0 -0
  129. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/manifest.py +0 -0
  130. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/manifest_ingest.py +0 -0
  131. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/markdown_resolution.py +0 -0
  132. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/mcp_ingest.py +0 -0
  133. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/multigraph_compat.py +0 -0
  134. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pascal_resolution.py +0 -0
  135. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/paths.py +0 -0
  136. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pg_introspect.py +0 -0
  137. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pi/index.ts +0 -0
  138. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/pi/package.json +0 -0
  139. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/prs.py +0 -0
  140. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/querylog.py +0 -0
  141. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/rcfile.py +0 -0
  142. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/reflect.py +0 -0
  143. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/report.py +0 -0
  144. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/resolver_registry.py +0 -0
  145. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/ruby_resolution.py +0 -0
  146. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/scip_ingest.py +0 -0
  147. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/security.py +0 -0
  148. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/semantic_cleanup.py +0 -0
  149. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/add-watch.md +0 -0
  150. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/exports.md +0 -0
  151. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/extraction-spec.md +0 -0
  152. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/github-and-merge.md +0 -0
  153. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/hooks.md +0 -0
  154. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/query.md +0 -0
  155. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/transcribe.md +0 -0
  156. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/agents/references/update.md +0 -0
  157. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/add-watch.md +0 -0
  158. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/exports.md +0 -0
  159. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/extraction-spec.md +0 -0
  160. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/github-and-merge.md +0 -0
  161. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/hooks.md +0 -0
  162. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/query.md +0 -0
  163. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/transcribe.md +0 -0
  164. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/amp/references/update.md +0 -0
  165. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/add-watch.md +0 -0
  166. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/exports.md +0 -0
  167. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/extraction-spec.md +0 -0
  168. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/github-and-merge.md +0 -0
  169. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/hooks.md +0 -0
  170. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/query.md +0 -0
  171. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/transcribe.md +0 -0
  172. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claude/references/update.md +0 -0
  173. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/add-watch.md +0 -0
  174. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/exports.md +0 -0
  175. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/extraction-spec.md +0 -0
  176. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/github-and-merge.md +0 -0
  177. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/hooks.md +0 -0
  178. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/query.md +0 -0
  179. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/transcribe.md +0 -0
  180. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/claw/references/update.md +0 -0
  181. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/add-watch.md +0 -0
  182. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/exports.md +0 -0
  183. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/extraction-spec.md +0 -0
  184. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/github-and-merge.md +0 -0
  185. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/hooks.md +0 -0
  186. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/query.md +0 -0
  187. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/transcribe.md +0 -0
  188. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/codex/references/update.md +0 -0
  189. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/add-watch.md +0 -0
  190. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/exports.md +0 -0
  191. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/extraction-spec.md +0 -0
  192. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/github-and-merge.md +0 -0
  193. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/hooks.md +0 -0
  194. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/query.md +0 -0
  195. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/transcribe.md +0 -0
  196. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/copilot/references/update.md +0 -0
  197. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/add-watch.md +0 -0
  198. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/exports.md +0 -0
  199. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/extraction-spec.md +0 -0
  200. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/github-and-merge.md +0 -0
  201. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/hooks.md +0 -0
  202. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/query.md +0 -0
  203. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/transcribe.md +0 -0
  204. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/droid/references/update.md +0 -0
  205. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/add-watch.md +0 -0
  206. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/exports.md +0 -0
  207. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/extraction-spec.md +0 -0
  208. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/github-and-merge.md +0 -0
  209. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/hooks.md +0 -0
  210. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/query.md +0 -0
  211. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/transcribe.md +0 -0
  212. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kilo/references/update.md +0 -0
  213. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/add-watch.md +0 -0
  214. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/exports.md +0 -0
  215. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/extraction-spec.md +0 -0
  216. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/github-and-merge.md +0 -0
  217. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/hooks.md +0 -0
  218. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/query.md +0 -0
  219. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/transcribe.md +0 -0
  220. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/kiro/references/update.md +0 -0
  221. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/add-watch.md +0 -0
  222. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/exports.md +0 -0
  223. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/extraction-spec.md +0 -0
  224. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/github-and-merge.md +0 -0
  225. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/hooks.md +0 -0
  226. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/query.md +0 -0
  227. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/transcribe.md +0 -0
  228. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/opencode/references/update.md +0 -0
  229. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/add-watch.md +0 -0
  230. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/exports.md +0 -0
  231. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/extraction-spec.md +0 -0
  232. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/github-and-merge.md +0 -0
  233. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/hooks.md +0 -0
  234. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/query.md +0 -0
  235. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/transcribe.md +0 -0
  236. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/pi/references/update.md +0 -0
  237. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/add-watch.md +0 -0
  238. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/exports.md +0 -0
  239. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/extraction-spec.md +0 -0
  240. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/github-and-merge.md +0 -0
  241. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/hooks.md +0 -0
  242. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/query.md +0 -0
  243. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/transcribe.md +0 -0
  244. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/trae/references/update.md +0 -0
  245. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/add-watch.md +0 -0
  246. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/exports.md +0 -0
  247. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/extraction-spec.md +0 -0
  248. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/github-and-merge.md +0 -0
  249. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/hooks.md +0 -0
  250. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/query.md +0 -0
  251. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/transcribe.md +0 -0
  252. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/vscode/references/update.md +0 -0
  253. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/add-watch.md +0 -0
  254. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/exports.md +0 -0
  255. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/extraction-spec.md +0 -0
  256. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/github-and-merge.md +0 -0
  257. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/hooks.md +0 -0
  258. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/query.md +0 -0
  259. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/transcribe.md +0 -0
  260. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/skills/windows/references/update.md +0 -0
  261. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/swift_dispatch.py +0 -0
  262. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/symbol_resolution.py +0 -0
  263. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/transcribe.py +0 -0
  264. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/tree_html.py +0 -0
  265. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/validate.py +0 -0
  266. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphify/wiki.py +0 -0
  267. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/dependency_links.txt +0 -0
  268. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/entry_points.txt +0 -0
  269. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/requires.txt +0 -0
  270. {graphifyy-0.9.97 → graphifyy-0.9.99}/graphifyy.egg-info/top_level.txt +0 -0
  271. {graphifyy-0.9.97 → graphifyy-0.9.99}/setup.cfg +0 -0
  272. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_cli.py +0 -0
  273. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_defines.py +0 -0
  274. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_member_seed.py +0 -0
  275. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_overrides.py +0 -0
  276. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_affected_path_file_node.py +0 -0
  277. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_agents_platform.py +0 -0
  278. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_alias_folding.py +0 -0
  279. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_analyze.py +0 -0
  280. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_anthropic_custom_endpoint.py +0 -0
  281. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_antigravity_install.py +0 -0
  282. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_apm_fallback_version.py +0 -0
  283. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_architecture_doc.py +0 -0
  284. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_astro_extraction.py +0 -0
  285. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_astro_import_ids.py +0 -0
  286. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_canvas_export.py +0 -0
  287. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_version_stamp.py +0 -0
  288. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_atomic_writes.py +0 -0
  289. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_env_isolation.py +0 -0
  290. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_extras.py +0 -0
  291. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_backend_opt_in.py +0 -0
  292. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark.py +0 -0
  293. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark_raw_graph.py +0 -0
  294. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_benchmark_real_query.py +0 -0
  295. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_binary_media_words.py +0 -0
  296. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_blade_extractor.py +0 -0
  297. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build.py +0 -0
  298. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_located_semantic_identity.py +0 -0
  299. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_dedup_scope.py +0 -0
  300. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_hyperedges_and_prune.py +0 -0
  301. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_build_merge_shrink_guard.py +0 -0
  302. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_builtin_global_type_refs.py +0 -0
  303. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_c_include_resolution.py +0 -0
  304. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache.py +0 -0
  305. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache_long_paths.py +0 -0
  306. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cache_stale_import_target.py +0 -0
  307. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_callflow_html.py +0 -0
  308. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cargo_introspect.py +0 -0
  309. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cargo_missing_manifest.py +0 -0
  310. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_carried_hyperedge_remap.py +0 -0
  311. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_case_sensitive_resolution.py +0 -0
  312. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_charmap_encoding.py +0 -0
  313. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_chunking.py +0 -0
  314. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cjs_module_extension.py +0 -0
  315. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_claude_cli_backend.py +0 -0
  316. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_claude_md.py +0 -0
  317. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_broken_pipe.py +0 -0
  318. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_export.py +0 -0
  319. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cli_help.py +0 -0
  320. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cloud_cta.py +0 -0
  321. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster.py +0 -0
  322. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster_ambiguous_scale.py +0 -0
  323. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cluster_exclude_hubs.py +0 -0
  324. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cobol_extractor.py +0 -0
  325. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_code_only_update_all_hosts.py +0 -0
  326. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_codebuddy.py +0 -0
  327. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_community_hub_labels.py +0 -0
  328. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_community_labels_skill.py +0 -0
  329. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_compact_graph_json.py +0 -0
  330. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_confidence.py +0 -0
  331. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_corrupt_graph_json.py +0 -0
  332. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_method_declarations.py +0 -0
  333. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_nested_and_cli.py +0 -0
  334. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_objc_cross_file_calls.py +0 -0
  335. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_preprocess.py +0 -0
  336. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_template_type_params.py +0 -0
  337. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cpp_type_alias.py +0 -0
  338. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_extension_reexport_self_cycle.py +0 -0
  339. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_language_call_resolution.py +0 -0
  340. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_external_call_guards.py +0 -0
  341. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_member_calls.py +0 -0
  342. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_cross_repo_shared_types.py +0 -0
  343. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_call_site_generic_args.py +0 -0
  344. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_delegate_declarations.py +0 -0
  345. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_enum_members.py +0 -0
  346. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_field_generic_args.py +0 -0
  347. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_foreach_loop_variable.py +0 -0
  348. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_generic_callsites.py +0 -0
  349. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_interface_dispatch.py +0 -0
  350. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_calls.py +0 -0
  351. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_chain_calls.py +0 -0
  352. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_member_nodes.py +0 -0
  353. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_object_creation.py +0 -0
  354. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_overloads.py +0 -0
  355. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_partial_classes.py +0 -0
  356. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_tuple_type_refs.py +0 -0
  357. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_type_resolution.py +0 -0
  358. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_underscore_collisions.py +0 -0
  359. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_var_call_return_type.py +0 -0
  360. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_csharp_verbatim_interpolation.py +0 -0
  361. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dart.py +0 -0
  362. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_remaps_hyperedges.py +0 -0
  363. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_shrink_refuses_force_write.py +0 -0
  364. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dedup_survivor_richness.py +0 -0
  365. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_definition_file_portability.py +0 -0
  366. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_detect.py +0 -0
  367. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_detect_jinja.py +0 -0
  368. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_devin.py +0 -0
  369. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_docx_to_markdown.py +0 -0
  370. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_dotnet.py +0 -0
  371. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_duplicate_annotation_edges.py +0 -0
  372. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ejs_extractor.py +0 -0
  373. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_defdelegate.py +0 -0
  374. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_import_resolution.py +0 -0
  375. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_keyword_def_calls.py +0 -0
  376. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_qualified_calls.py +0 -0
  377. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_elixir_unqualified_call_scope.py +0 -0
  378. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_erlang_extractor.py +0 -0
  379. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_evidence_binding.py +0 -0
  380. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_explain_cli.py +0 -0
  381. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_explain_same_file_tie.py +0 -0
  382. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_control_characters.py +0 -0
  383. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_direction.py +0 -0
  384. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_idempotent_writes.py +0 -0
  385. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_export_path_length.py +0 -0
  386. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ext_tagged_id_clash.py +0 -0
  387. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_external_stub_endpoints.py +0 -0
  388. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract.py +0 -0
  389. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cache_location.py +0 -0
  390. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cli.py +0 -0
  391. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_code_only_cli.py +0 -0
  392. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_cost_ledger.py +0 -0
  393. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_path_memo.py +0 -0
  394. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extract_php_closures.py +0 -0
  395. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extraction_spec_ids.py +0 -0
  396. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extractor_scan_root_context.py +0 -0
  397. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_extractors_registry.py +0 -0
  398. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_falkordb_integration.py +0 -0
  399. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_label_disambiguation.py +0 -0
  400. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_node_id_spec.py +0 -0
  401. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_slice.py +0 -0
  402. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_file_truncation_warning.py +0 -0
  403. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_forwarding_review_findings.py +0 -0
  404. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_frontmatter_and_ssrf_hardening.py +0 -0
  405. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_gemini_hook.py +0 -0
  406. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_git_head_stdin.py +0 -0
  407. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_global_add_tag_inference.py +0 -0
  408. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_global_graph.py +0 -0
  409. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_builtin_call_targets.py +0 -0
  410. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_generic_receiver_methods.py +0 -0
  411. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_generic_type_params.py +0 -0
  412. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_import_repoint.py +0 -0
  413. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_interface_methods.py +0 -0
  414. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_package_type_fold.py +0 -0
  415. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_qualified_resolution.py +0 -0
  416. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_go_type_alias.py +0 -0
  417. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_god_nodes_cli.py +0 -0
  418. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_god_nodes_exclude_hubs.py +0 -0
  419. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_google_workspace.py +0 -0
  420. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_grammar_cache_key.py +0 -0
  421. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_graph_invariance.py +0 -0
  422. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_graphdb_push_indexes.py +0 -0
  423. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hollow_chunks_arm_shrink_guard.py +0 -0
  424. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_home_sandbox.py +0 -0
  425. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_chain_survives_skip.py +0 -0
  426. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_guard.py +0 -0
  427. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_guard_token_match.py +0 -0
  428. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_nudge_wording.py +0 -0
  429. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_out_of_project_paths.py +0 -0
  430. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hook_strict.py +0 -0
  431. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hooks.py +0 -0
  432. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hooks_rewrite.py +0 -0
  433. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_html_script_breakout.py +0 -0
  434. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_html_theme.py +0 -0
  435. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hyperedge_member_shapes.py +0 -0
  436. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hyperedge_roundtrip.py +0 -0
  437. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_hypergraph.py +0 -0
  438. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_id_normalization_contract.py +0 -0
  439. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ignore_file_encoding.py +0 -0
  440. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_image_vision.py +0 -0
  441. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_import_self_loops.py +0 -0
  442. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_imported_export_forwarding.py +0 -0
  443. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incomplete_build_guard.py +0 -0
  444. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental.py +0 -0
  445. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental_mtime_collision.py +0 -0
  446. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_incremental_unscanned_placeholders.py +0 -0
  447. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_arrow_single_param_shadow.py +0 -0
  448. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_block_scoped_shadow.py +0 -0
  449. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_catch_binding_shadow.py +0 -0
  450. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_external_import_shadow.py +0 -0
  451. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_file_scope_callback_shadow.py +0 -0
  452. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_for_of_binding_shadow.py +0 -0
  453. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_function_expression_shadow.py +0 -0
  454. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_call_nested_closure_shadow.py +0 -0
  455. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch.py +0 -0
  456. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch_assign_return.py +0 -0
  457. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_indirect_dispatch_getattr.py +0 -0
  458. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_inferred_confidence_rubric.py +0 -0
  459. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ingest.py +0 -0
  460. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ingest_url_type.py +0 -0
  461. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_inherited_field_receivers.py +0 -0
  462. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_injection_sentinel_coverage.py +0 -0
  463. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_hook_identity.py +0 -0
  464. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_line_endings.py +0 -0
  465. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_roundtrip.py +0 -0
  466. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_strings.py +0 -0
  467. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_upgrade.py +0 -0
  468. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_version_stamp.py +0 -0
  469. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_install_version_warning.py +0 -0
  470. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_issue_3405_python_resolution.py +0 -0
  471. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_issue_3472_source_file_collision.py +0 -0
  472. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_anonymous_class.py +0 -0
  473. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_enum_members.py +0 -0
  474. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_member_calls.py +0 -0
  475. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_java_type_resolution.py +0 -0
  476. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_callback_calls.py +0 -0
  477. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_destructured_export.py +0 -0
  478. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_dynamic_import_affected.py +0 -0
  479. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_dynamic_imports.py +0 -0
  480. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_exported_fn_call_resolution.py +0 -0
  481. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_exported_scalar_bindings.py +0 -0
  482. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_import_resolution.py +0 -0
  483. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_member_call_bare_name_fallback.py +0 -0
  484. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_member_collisions.py +0 -0
  485. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_module_level_anonymous_calls.py +0 -0
  486. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_nested_function_scope.py +0 -0
  487. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_require_binding_shadow.py +0 -0
  488. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_require_external_package_call.py +0 -0
  489. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_this_member_expressions.py +0 -0
  490. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_js_walk_order.py +0 -0
  491. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_jsconfig_baseurl.py +0 -0
  492. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_json_schema_config.py +0 -0
  493. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_jsx_component_usage_calls.py +0 -0
  494. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_generic_type_params.py +0 -0
  495. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_grammar.py +0 -0
  496. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_object_literal.py +0 -0
  497. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_kotlin_typealias_declarations.py +0 -0
  498. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_label_retry.py +0 -0
  499. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_labeling.py +0 -0
  500. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_override_imports.py +0 -0
  501. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_override_lifecycle.py +0 -0
  502. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_overrides.py +0 -0
  503. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_language_resolvers.py +0 -0
  504. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_backends.py +0 -0
  505. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_null_token_counts.py +0 -0
  506. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_parser.py +0 -0
  507. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_llm_parser_reasoning.py +0 -0
  508. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_long_path_hashing.py +0 -0
  509. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lookup_exit_codes.py +0 -0
  510. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_loose_sibling_import_resolution.py +0 -0
  511. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lost_saved_semantic_nodes.py +0 -0
  512. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lua_import.py +0 -0
  513. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_lua_method_calls.py +0 -0
  514. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_manifest_ingest.py +0 -0
  515. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_manifest_tomli_required.py +0 -0
  516. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_markdown_code_spans.py +0 -0
  517. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_mcp_graph_view_cache.py +0 -0
  518. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_mcp_ingest.py +0 -0
  519. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_chunks_validation.py +0 -0
  520. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_graphs_cli.py +0 -0
  521. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_merge_sweeps_reextract_orphans.py +0 -0
  522. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_minhash.py +0 -0
  523. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_msbuild_dir_evidence.py +0 -0
  524. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multigraph_compat.py +0 -0
  525. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multigraph_diagnostics.py +0 -0
  526. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_multilang.py +0 -0
  527. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_cluster_run_only_keys.py +0 -0
  528. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_cluster_undeclared_endpoints.py +0 -0
  529. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_no_dedup_flag.py +0 -0
  530. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_node_id_canonical.py +0 -0
  531. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_non_regular_files.py +0 -0
  532. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_non_string_node_ids.py +0 -0
  533. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_callable_markers.py +0 -0
  534. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_category_interfaces.py +0 -0
  535. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_category_portable_ids.py +0 -0
  536. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_enum_declarations.py +0 -0
  537. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_field_table_remap.py +0 -0
  538. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_member_calls.py +0 -0
  539. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_objc_property_ivar_receivers.py +0 -0
  540. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_dangling_member.py +0 -0
  541. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_filename_cap.py +0 -0
  542. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_unicode_tags.py +0 -0
  543. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_obsidian_vault_migration.py +0 -0
  544. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ocaml.py +0 -0
  545. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_office_incremental.py +0 -0
  546. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_office_limits.py +0 -0
  547. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama.py +0 -0
  548. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_ctx_sizing.py +0 -0
  549. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_live.py +0 -0
  550. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_native_chat.py +0 -0
  551. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ollama_retry_cap.py +0 -0
  552. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_openai_custom_endpoint.py +0 -0
  553. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_out_dir_evidence.py +0 -0
  554. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_oversized_document_slicing.py +0 -0
  555. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_owned_type_sources.py +0 -0
  556. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_package_json_subpath_imports.py +0 -0
  557. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_parked_call_site_file.py +0 -0
  558. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_partial_cache.py +0 -0
  559. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_partial_extraction_warning.py +0 -0
  560. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_call_scoping.py +0 -0
  561. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_record_methods.py +0 -0
  562. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pascal_resolution.py +0 -0
  563. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_path_cli.py +0 -0
  564. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_paths.py +0 -0
  565. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_extra_warning.py +0 -0
  566. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pdf_token_estimate.py +0 -0
  567. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pg_introspect.py +0 -0
  568. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_phantom_cross_package_call.py +0 -0
  569. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_phantom_external_import.py +0 -0
  570. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_language_construct_calls.py +0 -0
  571. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_object_creation.py +0 -0
  572. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_receiver_member_calls.py +0 -0
  573. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_static_call_resolution.py +0 -0
  574. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_type_resolution.py +0 -0
  575. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_php_unparsed_casts.py +0 -0
  576. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pi_guard_install.py +0 -0
  577. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pin_hash_seed.py +0 -0
  578. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pipeline.py +0 -0
  579. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pnpm_workspace_globs.py +0 -0
  580. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_csharp_overrides.py +0 -0
  581. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_resolution_overrides.py +0 -0
  582. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_pr10_watch_overrides.py +0 -0
  583. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_provider_registry.py +0 -0
  584. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_prs.py +0 -0
  585. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_prune_sweeps_orphans.py +0 -0
  586. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_decorators.py +0 -0
  587. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_forward_ref_file_id.py +0 -0
  588. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_import_never_resolves_to_itself.py +0 -0
  589. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_import_resolution.py +0 -0
  590. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_inherited_method_calls.py +0 -0
  591. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_injected_factory_calls.py +0 -0
  592. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_member_call_language_gate.py +0 -0
  593. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_member_collisions.py +0 -0
  594. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_module_call_exact_name.py +0 -0
  595. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_nested_class_identity.py +0 -0
  596. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_parse_memoization.py +0 -0
  597. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_property_reads.py +0 -0
  598. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_pytest_fixture_receivers.py +0 -0
  599. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_reexport_type_binding.py +0 -0
  600. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_self_type_ref.py +0 -0
  601. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_type_alias.py +0 -0
  602. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_typed_receiver_calls.py +0 -0
  603. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_python_underscore_resolution.py +0 -0
  604. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_qualified_annotation_stub_bind.py +0 -0
  605. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_cli.py +0 -0
  606. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_fallback_edges.py +0 -0
  607. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_induced_edges.py +0 -0
  608. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_mcp_direction.py +0 -0
  609. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_names_its_graph.py +0 -0
  610. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_seed_order.py +0 -0
  611. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_query_seeds.py +0 -0
  612. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_querylog.py +0 -0
  613. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_r_extractor.py +0 -0
  614. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rationale.py +0 -0
  615. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_read_hook.py +0 -0
  616. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_reflect.py +0 -0
  617. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_relation_collapse_precedence.py +0 -0
  618. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_replace_or_append_section.py +0 -0
  619. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_report.py +0 -0
  620. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_report_gap_thresholds.py +0 -0
  621. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_resolve_memoization.py +0 -0
  622. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ruby_bare_self_send_calls.py +0 -0
  623. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ruby_resolution.py +0 -0
  624. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_anonymous_const.py +0 -0
  625. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_builtin_type_hubs.py +0 -0
  626. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_case_collisions.py +0 -0
  627. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_crate_use_scope.py +0 -0
  628. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_in_file_call_binding.py +0 -0
  629. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_macro_rules.py +0 -0
  630. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_self_member_calls.py +0 -0
  631. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_type_alias_union.py +0 -0
  632. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_rust_use_trees.py +0 -0
  633. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_abstract_methods.py +0 -0
  634. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_context_bounds.py +0 -0
  635. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_generic_type_params.py +0 -0
  636. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_given_instances.py +0 -0
  637. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_self_type.py +0 -0
  638. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_top_level_binding.py +0 -0
  639. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scala_type_definition.py +0 -0
  640. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_scip_ingest.py +0 -0
  641. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_search_hook.py +0 -0
  642. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_security.py +0 -0
  643. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cache_basename_recovery.py +0 -0
  644. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cache_out_root.py +0 -0
  645. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_cleanup.py +0 -0
  646. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_fragment_sanitize.py +0 -0
  647. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_id_remap_root.py +0 -0
  648. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_origin_stamp.py +0 -0
  649. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_semantic_similarity.py +0 -0
  650. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_settings_merge.py +0 -0
  651. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_code_only_incremental_update.py +0 -0
  652. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_codex_semantic_merge.py +0 -0
  653. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_no_backtick_substitution.py +0 -0
  654. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_part_a_explicit_root.py +0 -0
  655. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_persisted_scan_options.py +0 -0
  656. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_semantic_all_cached.py +0 -0
  657. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skill_version_warning.py +0 -0
  658. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skillgen.py +0 -0
  659. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_skillgen_input_path_injection.py +0 -0
  660. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_solidity_inherited_calls.py +0 -0
  661. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_source_file_encoding.py +0 -0
  662. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_source_key_memoization.py +0 -0
  663. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sourceless_call_targets.py +0 -0
  664. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_cross_file_tables.py +0 -0
  665. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_go_batches.py +0 -0
  666. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_sql_tsql_procedures.py +0 -0
  667. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_src_layout_import_resolution.py +0 -0
  668. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stale_prune.py +0 -0
  669. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_husk.py +0 -0
  670. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_multi_root.py +0 -0
  671. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_stat_index_portability.py +0 -0
  672. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_suggest_questions_ambiguous.py +0 -0
  673. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_svelte_extraction.py +0 -0
  674. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_builtin_noise.py +0 -0
  675. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_computed_properties.py +0 -0
  676. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_cross_file_calls.py +0 -0
  677. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_generic_type_params.py +0 -0
  678. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_import_resolution.py +0 -0
  679. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_macro_declarations.py +0 -0
  680. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_protocol_dispatch.py +0 -0
  681. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_protocol_requirements.py +0 -0
  682. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_swift_self_type_ref.py +0 -0
  683. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_symbol_resolution.py +0 -0
  684. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_terraform.py +0 -0
  685. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_terraform_modules.py +0 -0
  686. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_trailing_newline_not_a_syntax_error.py +0 -0
  687. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_transcribe.py +0 -0
  688. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_tree_html.py +0 -0
  689. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_truncation_full_answer.py +0 -0
  690. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_abstract_methods.py +0 -0
  691. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_decorator_chains.py +0 -0
  692. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_decorators.py +0 -0
  693. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_export_type_star.py +0 -0
  694. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_generators.py +0 -0
  695. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_import_require.py +0 -0
  696. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_import_type_arguments.py +0 -0
  697. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_inheritance.py +0 -0
  698. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_namespace.py +0 -0
  699. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_new_expression_calls.py +0 -0
  700. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_parse_warning.py +0 -0
  701. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_ts_receiver_member_calls.py +0 -0
  702. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_type_only_import_cycles.py +0 -0
  703. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_typescript_enum_members.py +0 -0
  704. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_typescript_module_extensions.py +0 -0
  705. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_purge_safety.py +0 -0
  706. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_uninstall_symlink.py +0 -0
  707. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_unmapped_at_alias_resolution.py +0 -0
  708. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_unverified_semantic_shrink.py +0 -0
  709. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_update_no_change_gate.py +0 -0
  710. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_validate.py +0 -0
  711. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_vbnet_extractor.py +0 -0
  712. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_vue_extraction.py +0 -0
  713. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_walk_python_tree_iterative.py +0 -0
  714. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch.py +0 -0
  715. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch_identity_cache.py +0 -0
  716. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_watch_manifest_location.py +0 -0
  717. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wheel_packaging.py +0 -0
  718. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki.py +0 -0
  719. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_case_only_relabel.py +0 -0
  720. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_link_filename_parity.py +0 -0
  721. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_wiki_truncation_indicator.py +0 -0
  722. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_word_count_cache.py +0 -0
  723. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_yaml_extraction.py +0 -0
  724. {graphifyy-0.9.97 → graphifyy-0.9.99}/tests/test_zero_node_no_cache.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphifyy
3
- Version: 0.9.97
3
+ Version: 0.9.99
4
4
  Summary: AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://graphify.com
@@ -260,7 +260,7 @@ Shortest path (3 hops):
260
260
  FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField
261
261
  ```
262
262
 
263
- Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect.
263
+ Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect, ending with the path's overall confidence: that of its weakest hop.
264
264
 
265
265
  ---
266
266
 
@@ -104,7 +104,7 @@ Shortest path (3 hops):
104
104
  FastAPI --uses--> DefaultPlaceholder <--references-- get_request_handler() --references--> ModelField
105
105
  ```
106
106
 
107
- Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect.
107
+ Every edge carries a **confidence tag** (`EXTRACTED` = explicit in the source, `INFERRED` = derived by resolution), so you can tell what was read directly from what was inferred. `graphify query "<question>"` returns a scoped subgraph for a plain-language question, and `graphify path A B` traces how any two things connect, ending with the path's overall confidence: that of its weakest hop.
108
108
 
109
109
  ---
110
110
 
@@ -122,6 +122,7 @@ from graphify.install import ( # noqa: E402,F401
122
122
  _OPENCODE_PLUGIN_HEADER,
123
123
  _drop_opencode_config_entry,
124
124
  _opencode_config_names_plugin,
125
+ _opencode_dir,
125
126
  _opencode_plugin_is_v1_only,
126
127
  _PLATFORM_CONFIG,
127
128
  _skill_lock,
@@ -429,12 +430,21 @@ def _refresh_v1_opencode_plugins() -> None:
429
430
  if os.environ.get("GRAPHIFY_NO_AUTO_REFRESH", "").strip().lower() in ("1", "true", "yes"):
430
431
  return
431
432
  try:
432
- directories = dict.fromkeys(d.resolve() for d in (Path.cwd(), Path.home()))
433
+ # The cwd and home .opencode dirs are where installs before #3398 wrote,
434
+ # ~/.config/opencode is the global install's dir since.
435
+ directories = dict.fromkeys(
436
+ d.resolve()
437
+ for d in (
438
+ _opencode_dir(project=True, project_dir=Path.cwd()),
439
+ _opencode_dir(project=True, project_dir=Path.home()),
440
+ _opencode_dir(project=False),
441
+ )
442
+ )
433
443
  except (OSError, RuntimeError):
434
444
  return
435
445
  loadable: "bool | None" = None # asked once, and only when an old plugin is found
436
446
  for directory in directories:
437
- plugin_file = directory / _OPENCODE_PLUGIN_PATH
447
+ plugin_file = directory / _OPENCODE_PLUGIN_PATH.relative_to(".opencode")
438
448
 
439
449
  def pending() -> "bool | None":
440
450
  """True for an old plugin, False for a stale entry only, None for neither."""
@@ -486,7 +496,7 @@ def _refresh_v1_opencode_plugins() -> None:
486
496
  elif dropped:
487
497
  print(
488
498
  f"graphify: removed the stale graphify entry from "
489
- f"{directory / _OPENCODE_CONFIG_PATH}; set GRAPHIFY_NO_AUTO_REFRESH=1 to disable",
499
+ f"{directory / _OPENCODE_CONFIG_PATH.name}; set GRAPHIFY_NO_AUTO_REFRESH=1 to disable",
490
500
  file=sys.stderr,
491
501
  )
492
502
 
@@ -82,9 +82,13 @@ def _is_file_node(G: nx.Graph, node_id: str) -> bool:
82
82
  from graphify.build import _is_file_node_label
83
83
  if _is_file_node_label(label, source_file):
84
84
  return True
85
- # Method stub: AST extractor labels methods as '.method_name()'
85
+ # Method stub: AST extractor labels methods as '.method_name()'; C# methods
86
+ # carry their owner for display ('Owner.method_name()', #4883).
86
87
  if label.startswith(".") and label.endswith("()"):
87
88
  return True
89
+ from graphify.extractors.csharp import bare_csharp_method_label
90
+ if bare_csharp_method_label(label, source_file) is not None:
91
+ return True
88
92
  # Module-level function stub: labeled 'function_name()' - only has a contains edge
89
93
  # These are real functions but structurally isolated by definition; not a gap worth flagging
90
94
  if label.endswith("()") and G.degree(node_id) <= 1:
@@ -757,12 +761,14 @@ def find_import_cycles(
757
761
 
758
762
  # Deferred `import(...)` edges are real dependencies but do not form a
759
763
  # hard file-level cycle, so they are excluded from cycle detection (#1241).
760
- if data.get("deferred"):
761
- continue
762
764
  # Type-only imports/re-exports (`import type` / `export type ... from`)
763
765
  # are erased at compile time - a cycle that closes through one cannot
764
766
  # exist at runtime (#3123). The edge itself stays in the graph.
765
- if data.get("type_only"):
767
+ forward = not data.get("deferred") and not data.get("type_only")
768
+ # An undirected build keeps one edge per file pair, so the other file's
769
+ # runtime import back is only a stamp on this edge (#4839).
770
+ reverse = bool(data.get("reverse_import"))
771
+ if not forward and not reverse:
766
772
  continue
767
773
 
768
774
  src_file_attr = data.get("source_file", "")
@@ -787,7 +793,10 @@ def find_import_cycles(
787
793
  if not tgt_file:
788
794
  continue
789
795
 
790
- file_graph.add_edge(src_file_attr, tgt_file)
796
+ if forward:
797
+ file_graph.add_edge(src_file_attr, tgt_file)
798
+ if reverse:
799
+ file_graph.add_edge(tgt_file, src_file_attr)
791
800
 
792
801
  if not file_graph.edges():
793
802
  return []
@@ -189,6 +189,66 @@ _GENERIC_RELATIONS: frozenset[str] = frozenset({"references", "uses", "mentions"
189
189
  # `calls` is not ranked here.
190
190
  _STRUCTURAL_MEMBER_RELATIONS: frozenset[str] = frozenset({"method", "contains"})
191
191
  _CONFIDENCE_RANK: dict[str, int] = {"EXTRACTED": 3, "INFERRED": 2, "AMBIGUOUS": 1}
192
+ # The fields that say how sure the graph is of an edge and where that came from.
193
+ # A same-relation collision keeps one edge; the loser's copy of these fields is
194
+ # folded into the winner's `also_seen` list instead of being discarded (#4881).
195
+ _EVIDENCE_KEYS: tuple[str, ...] = ("confidence", "confidence_score", "source_file", "source_location")
196
+
197
+
198
+ def _evidence(attrs: dict) -> dict:
199
+ """The provenance fields of one edge (or ``also_seen`` entry), scalars only."""
200
+ out: dict = {}
201
+ for key in _EVIDENCE_KEYS:
202
+ val = attrs.get(key)
203
+ if isinstance(val, bool) or val is None or val == "":
204
+ continue
205
+ if key == "confidence_score":
206
+ try:
207
+ val = float(val)
208
+ except (TypeError, ValueError):
209
+ continue
210
+ if not math.isfinite(val):
211
+ continue
212
+ elif not isinstance(val, (str, int, float)):
213
+ continue
214
+ out[key] = val
215
+ return out
216
+
217
+
218
+ def _evidence_sort_key(ev: dict) -> tuple:
219
+ # Weakest first: lowest confidence tier, then lowest score.
220
+ score = ev.get("confidence_score")
221
+ return (
222
+ _CONFIDENCE_RANK.get(str(ev.get("confidence", "")), 0),
223
+ score is None,
224
+ score if score is not None else 0.0,
225
+ str(ev.get("source_file", "")),
226
+ str(ev.get("source_location", "")),
227
+ )
228
+
229
+
230
+ def edge_evidence(d: dict) -> list[dict]:
231
+ """Every provenance record an edge carries: its own, then each ``also_seen``."""
232
+ also = d.get("also_seen")
233
+ return [d, *(a for a in also if isinstance(a, dict))] if isinstance(also, list) else [d]
234
+
235
+
236
+ def _fold_also_seen(winner: dict, loser: dict) -> None:
237
+ """Record ``loser``'s provenance on ``winner`` when the two collapse (#4881).
238
+
239
+ Entries that repeat the winner's own provenance, or each other, are dropped,
240
+ so re-feeding a written graph.json through the build is idempotent.
241
+ """
242
+ own = _evidence(winner)
243
+ kept: list[dict] = []
244
+ for raw in (*edge_evidence(winner)[1:], loser, *edge_evidence(loser)[1:]):
245
+ ev = _evidence(raw)
246
+ if ev and not ev.items() <= own.items() and ev not in kept:
247
+ kept.append(ev)
248
+ if kept:
249
+ winner["also_seen"] = sorted(kept, key=_evidence_sort_key)
250
+ else:
251
+ winner.pop("also_seen", None)
192
252
 
193
253
  # Import-family relations whose target may legitimately be a module OUTSIDE the
194
254
  # graph (stdlib, a third-party dependency, another repo). Historically the edge
@@ -815,6 +875,39 @@ def disambiguate_file_labels_in_nodes(nodes: "list") -> None:
815
875
  nodes[i]["label"] = new_label
816
876
 
817
877
 
878
+ def _qualify_csharp_method_labels(G: "nx.Graph") -> None:
879
+ """Give C# method nodes an ``Owner.Name()`` display label (#4883). Ids and
880
+ edges are never changed, and an undirected graph's owner side is read from
881
+ the edge's recorded ``_src``/``_tgt``. Idempotent."""
882
+ from graphify.extractors.csharp import csharp_method_label_reassignments
883
+ method_edges = [
884
+ (data.get("_src", u), data.get("_tgt", v))
885
+ for u, v, data in G.edges(data=True)
886
+ if data.get("relation") == "method"
887
+ ]
888
+ for nid, new_label in csharp_method_label_reassignments(
889
+ G.nodes(data=True), method_edges
890
+ ).items():
891
+ G.nodes[nid]["label"] = new_label
892
+
893
+
894
+ def qualify_csharp_method_labels_in_nodes(nodes: "list", edges: "list") -> None:
895
+ """Raw node/edge-list form of :func:`_qualify_csharp_method_labels`, in
896
+ place, for the --no-cluster writers that bypass build_from_json (#4883)."""
897
+ from graphify.extractors.csharp import csharp_method_label_reassignments
898
+ method_edges = [
899
+ (e.get("source"), e.get("target"))
900
+ for e in edges
901
+ if isinstance(e, dict) and e.get("relation") == "method"
902
+ ]
903
+ reassigned = csharp_method_label_reassignments(
904
+ ((n.get("id"), n) for n in nodes if isinstance(n, dict)), method_edges
905
+ )
906
+ for n in nodes:
907
+ if isinstance(n, dict) and n.get("id") in reassigned:
908
+ n["label"] = reassigned[n["id"]]
909
+
910
+
818
911
  def _infer_merge_root(graph_path: Path) -> str | None:
819
912
  """Best-effort scan root for relativizing paths in build_merge when the caller
820
913
  passes no ``root`` (#1571).
@@ -1076,6 +1169,7 @@ def _alias_index(nodes: "Iterable[tuple[str, dict]]") -> dict[str, str]:
1076
1169
  endpoint the same way (#4670).
1077
1170
  """
1078
1171
  from graphify.extractors.base import _file_stem as _fs
1172
+ from graphify.extractors.csharp import bare_csharp_method_label
1079
1173
  from graphify.extractors.resolution import _PYTHON_STDLIB_MODULE_NAMES
1080
1174
 
1081
1175
  alias_candidates: dict[str, set[str]] = {}
@@ -1109,8 +1203,10 @@ def _alias_index(nodes: "Iterable[tuple[str, dict]]") -> dict[str, str]:
1109
1203
  alias = old_stem + suffix
1110
1204
  alias_candidates.setdefault(_normalize_id(alias), set()).add(nid)
1111
1205
  alias_candidates.setdefault(alias, set()).add(nid)
1112
- if attrs.get("_origin") == "ast" and str(attrs.get("label", "")).startswith("."):
1113
- m_name = make_id(str(attrs.get("label", "")).strip().removeprefix(".").removesuffix("()"))
1206
+ m_label = str(attrs.get("label", ""))
1207
+ m_label = bare_csharp_method_label(m_label.strip(), sf) or m_label
1208
+ if attrs.get("_origin") == "ast" and m_label.startswith("."):
1209
+ m_name = make_id(m_label.strip().removeprefix(".").removesuffix("()"))
1114
1210
  m_alias = f"{new_stem}_{m_name}"
1115
1211
  if _normalize_id(nid) != _normalize_id(m_alias):
1116
1212
  alias_candidates.setdefault(_normalize_id(m_alias), set()).add(nid)
@@ -1515,6 +1611,7 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1515
1611
  _noloc_nodes: dict[tuple[str, str], str] = {} # (source_file, label) -> ghost node id
1516
1612
  _ast_file_nodes: list[tuple[str, str]] = [] # (node_id, source_file) for AST file-self nodes (#3344)
1517
1613
  _ast_method_nodes: dict[tuple[str, str], list[str]] = {} # (source_file, norm_method) -> [ast_nid, ...]
1614
+ from graphify.extractors.csharp import bare_csharp_method_label
1518
1615
 
1519
1616
  # Pass 1: collect canonical nodes — AST-origin nodes take precedence over LLM nodes.
1520
1617
  # When 2+ AST nodes share a key (same-named symbols in same-named files across
@@ -1576,8 +1673,9 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1576
1673
  # a dotfile label like `.env` is never mistaken for a method
1577
1674
  # (#3705 follow-up). Key on the normalized name for parity with
1578
1675
  # the alias index below and the rest of the dedup passes.
1579
- if label.startswith(".") and label.endswith("()"):
1580
- m_name = make_id(label.removeprefix(".").removesuffix("()"))
1676
+ m_label = bare_csharp_method_label(label, sf) or label
1677
+ if m_label.startswith(".") and m_label.endswith("()"):
1678
+ m_name = make_id(m_label.removeprefix(".").removesuffix("()"))
1581
1679
  _ast_method_nodes.setdefault((sf, m_name), []).append(nid)
1582
1680
  else:
1583
1681
  # First non-AST node for this (file, label) wins as canonical; a
@@ -1782,6 +1880,8 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1782
1880
  if not math.isfinite(_num_val) or _num_val < 0:
1783
1881
  _num_val = 1.0
1784
1882
  attrs[_num_key] = _num_val
1883
+ if "also_seen" in attrs:
1884
+ _fold_also_seen(attrs, {})
1785
1885
  # Backfill source_file from the endpoint nodes (every node carries one).
1786
1886
  # Semantic/LLM edges occasionally omit it, which downstream validation
1787
1887
  # flags and leaves query results with no file reference (#1279).
@@ -1870,6 +1970,15 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1870
1970
  incoming_rel = attrs.get("relation")
1871
1971
  reverse = existing.get("_src") == tgt and existing.get("_tgt") == src
1872
1972
  if reverse and existing_rel == incoming_rel:
1973
+ # For an import the dropped leg is the other half of a two-file
1974
+ # cycle. Stamp the kept edge so find_import_cycles still sees it
1975
+ # (#4839); a type-only or deferred import closes no cycle.
1976
+ if (
1977
+ incoming_rel in ("imports_from", "re_exports")
1978
+ and not attrs.get("type_only")
1979
+ and not attrs.get("deferred")
1980
+ ):
1981
+ existing["reverse_import"] = True
1873
1982
  continue
1874
1983
  # Different relations in opposite directions are two facts that only
1875
1984
  # share a pair because the graph is undirected. A type's
@@ -1910,9 +2019,11 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1910
2019
  existing_rank = _CONFIDENCE_RANK.get(existing_conf, 0)
1911
2020
  incoming_rank = _CONFIDENCE_RANK.get(incoming_conf, 0)
1912
2021
  if existing_rank > incoming_rank:
2022
+ _fold_also_seen(existing_attrs, attrs)
1913
2023
  continue
1914
2024
  if existing_rank == incoming_rank:
1915
2025
  if existing_attrs.get("source_location") and not attrs.get("source_location"):
2026
+ _fold_also_seen(existing_attrs, attrs)
1916
2027
  continue
1917
2028
  existing_score = existing_attrs.get("confidence_score")
1918
2029
  incoming_score = attrs.get("confidence_score")
@@ -1921,7 +2032,14 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1921
2032
  and incoming_score is not None
1922
2033
  and existing_score > incoming_score
1923
2034
  ):
2035
+ _fold_also_seen(existing_attrs, attrs)
1924
2036
  continue
2037
+ _fold_also_seen(attrs, existing_attrs)
2038
+ # add_edge merges into the stored dict: a field only the loser
2039
+ # carried (its score, its line) would otherwise stay on the winner.
2040
+ for _key in (*_EVIDENCE_KEYS, "also_seen"):
2041
+ if _key not in attrs:
2042
+ existing_attrs.pop(_key, None)
1925
2043
  G.add_edge(src, tgt, **attrs)
1926
2044
  if dropped_schema_edges:
1927
2045
  print(
@@ -1989,6 +2107,9 @@ def build_from_json(extraction: dict, *, directed: bool = False, root: str | Pat
1989
2107
  # directory-qualified display label so lookup/discovery can disambiguate
1990
2108
  # them (#2032). Labels only — ids and edges are untouched.
1991
2109
  _disambiguate_file_node_labels(G)
2110
+ # Also last, after the method-ghost passes above: C# methods display with
2111
+ # their owning type (#4883).
2112
+ _qualify_csharp_method_labels(G)
1992
2113
  return G
1993
2114
 
1994
2115
 
@@ -38,7 +38,7 @@ except Exception:
38
38
  _EXTRACTOR_VERSION = "unknown"
39
39
 
40
40
  # Bump when AST cache-key semantics change independently of the package version.
41
- _AST_CACHE_SCHEMA = 29 # OCaml `and`-chained module/class bindings are all walked (only the first was, so later bindings were silently dropped, #4822), and a SystemVerilog class `task` method is modeled like a `function` one with its own node and parameter refs while its task-locals no longer leak as class fields (#4774), so cached OCaml and Verilog/SystemVerilog extractions re-run; prior (28): Markdown ATX headings parse per CommonMark (closing `#` runs dropped, 0-3 space indent, hash-only lines mint no node, #4790) and fenced code blocks are tracked by CommonMark rules so headings inside fences stop leaking (#4787); YAML keys carry their written spelling and real line and `on`/`off`/`yes`/`no` keys no longer fold to booleans (#4784); rationale labels redact more credential shapes before caching (#4647); Razor `@implements` interface edges are extracted (#4820); aliased Terraform providers get their own node and `provider =` refs resolve (#4819); COBOL paragraphs after a nested `END PROGRAM` reattach to the enclosing program (#4824); Blade `wire:click` binds the bare method name (#4823); a Pascal record is a type with its own methods (#4825); VB.NET operator declarations are extracted as members with their bodies walked (#4821); and a Fortran call resolves to the subroutine it names (#4795), so cached Markdown/YAML/rationale/Razor/Terraform/COBOL/Blade/Pascal/VB.NET/Fortran extractions re-run; prior (27): VB.NET external namespace/type stubs now carry a `source_file` sentinel (#4725); Python member calls resolve through injected fields and method-result types (#4726); a Rust `use` is scoped to the crate it names (#4699), so cached VB.NET/Python/Rust extractions re-run; prior (26): Zig no longer crosses a call between a method and a same-named free function (#4755), and a Dart unnamed `extension on T` is detected (#4741), so cached Zig and Dart extractions re-run; prior (25): Python/Go/C++/Rust explicit type aliases (and Rust `union` items) are extracted as type nodes so references resolve instead of minting sourceless stubs (#4578/#4579/#4580/#4581); each C# method overload gets its own node bound by arity (#4584); a package.json dependency's manifest entry links to its ref node (#4569), so cached extractions re-run; prior (24): Objective-C `NS_CLOSED_ENUM` declarations are extracted as enums like `NS_ENUM` (#4705), and a `CREATE TABLE` whose column default the SQL grammar rejects (MySQL `DEFAULT current_timestamp()`) is recovered from its ERROR node (#4613), so cached ObjC and SQL extractions re-run; prior (23): `.yaml`/`.yml` files are structurally extracted (keys as nodes, config-vs-data gated) and reclassified from document to code (#2214), so cached YAML re-extracts; prior (22): SQL labels drop T-SQL brackets and routine bodies emit `reads_from`/`writes_to` (#4635), and a `GO` batch separator ends a statement (#4651), so cached `.sql` extractions re-run; prior (21): a CommonJS `const X = require('./m')` binding no longer mints a module-scope node that shadows the class the required file exports, so `new X()` resolves to the required declaration (#4621); prior (20): Obsidian `[[wikilink]]` targets that start with the scan root's own folder names now resolve to the real page (#4559), so cached markdown extractions re-run; prior (19): Dart `typedef` declarations are extracted as aliases (not variables of type `typedef`); C++ Metal/CUDA GPU qualifiers no longer mint sourceless god nodes (#4550); a `.h` header containing `extern "C"` routes to the C++ extractor; prior (18): Kotlin `typealias` (#4553), C# `delegate` (#4552), and Swift `macro` declarations (#4551) are now extracted so references stop minting sourceless stubs; Rust `use` rooted at a `mod` declared in the same scope carries `_rust_use_name` (#4564); prior (17): Python pytest-fixture markers (`_py_fixture`/`_python_fixture_param`, #4332) and module-level class-id collision salting (#2810); TS `this.field` typed from any method incl. static (#4473); Solidity callables carry `metadata.arity` + inherited-call/`super`/modifier raw calls (#4379); Go type-decl and Rust file-item case-distinct node ids (#4444); prior (16): Rust `use` edges carry the imported name as written (`_rust_use_name`, #4439); (15): Go generic receiver types normalized (`Box[T]` -> `Box`) so methods attach to the type node; prior (14): C# receiver resolution for nameless/`new X()`/`foreach` receivers (defer + receiver-chain markers) and `_`/case-distinct node ids (underscore-salted); prior (13): Kotlin/Scala/C++/Swift generic & template type params no longer mint sourceless stubs; Objective-C NS_ENUM/NS_OPTIONS extraction and `_callable`/`_callable_class` markers; Go and PHP receiver-typed member calls park cross-repo (`go_type_table`/`php_type_table`, receiver fields); prior (12): Java inherited-supertype (`receiver_unbound`) and chained/new/cast receiver typing (`java_receiver_chain`, `_java_ret`); C/C++ quoted cross-directory include provenance (`include_kind`); JS external imports anchored to the package, not the path leaf; prior (11): Python property-accessor decorators / `Self`, Swift `Self`, Go generic type params, Python forward type-hint file node, PowerShell dot-source, C# verbatim-interpolated string recovery; (10): C# partial types carry `type_path`; (9): Python property-read raw calls and `_py_property` nodes; (8): Rust `use`-group per-binding edges; (7): Python opaque-base/super(args) markers + nested-class enclosing ids.
41
+ _AST_CACHE_SCHEMA = 31 # Go credits a call in a package-level `var` initialiser (and its closures) to the file node (#4867); a Go method value passed as an argument is linked as an `indirect_call` (#4868); a Go receiver's field whose struct is declared in a sibling file of the same package is typed so its member calls resolve (#4866); and a Python dispatch table's `module.func` values resolve to the referenced functions as `indirect_call`s (#4773), so cached Go and Python extractions re-run; prior (30): File and per-declaration ids are kept distinct so a top-level declaration sharing the file's name is not dropped (#4854); a SystemVerilog `function new(...)` constructor gets its own node, `method` edge and parameter refs (#4848); a Go `var x = T{}`/`var x = &T{}` types `x` as `T` for receiver resolution like `x := T{}` (#4843); a PowerShell `using module`/`using assembly` name drops its file extension (#4847); a Solidity free-function `using {a, b} for T` set emits `uses` edges (#4846); a CommonLisp forward-referenced superclass binds to its local node instead of a sourceless stub (#4845); and Pascal `inherited`/`inline` form component blocks are recognised so later `object` blocks keep their parent (#4844), so cached extractions across those languages re-run; prior (29): OCaml `and`-chained module/class bindings are all walked (only the first was, so later bindings were silently dropped, #4822), and a SystemVerilog class `task` method is modeled like a `function` one with its own node and parameter refs while its task-locals no longer leak as class fields (#4774), so cached OCaml and Verilog/SystemVerilog extractions re-run; prior (28): Markdown ATX headings parse per CommonMark (closing `#` runs dropped, 0-3 space indent, hash-only lines mint no node, #4790) and fenced code blocks are tracked by CommonMark rules so headings inside fences stop leaking (#4787); YAML keys carry their written spelling and real line and `on`/`off`/`yes`/`no` keys no longer fold to booleans (#4784); rationale labels redact more credential shapes before caching (#4647); Razor `@implements` interface edges are extracted (#4820); aliased Terraform providers get their own node and `provider =` refs resolve (#4819); COBOL paragraphs after a nested `END PROGRAM` reattach to the enclosing program (#4824); Blade `wire:click` binds the bare method name (#4823); a Pascal record is a type with its own methods (#4825); VB.NET operator declarations are extracted as members with their bodies walked (#4821); and a Fortran call resolves to the subroutine it names (#4795), so cached Markdown/YAML/rationale/Razor/Terraform/COBOL/Blade/Pascal/VB.NET/Fortran extractions re-run; prior (27): VB.NET external namespace/type stubs now carry a `source_file` sentinel (#4725); Python member calls resolve through injected fields and method-result types (#4726); a Rust `use` is scoped to the crate it names (#4699), so cached VB.NET/Python/Rust extractions re-run; prior (26): Zig no longer crosses a call between a method and a same-named free function (#4755), and a Dart unnamed `extension on T` is detected (#4741), so cached Zig and Dart extractions re-run; prior (25): Python/Go/C++/Rust explicit type aliases (and Rust `union` items) are extracted as type nodes so references resolve instead of minting sourceless stubs (#4578/#4579/#4580/#4581); each C# method overload gets its own node bound by arity (#4584); a package.json dependency's manifest entry links to its ref node (#4569), so cached extractions re-run; prior (24): Objective-C `NS_CLOSED_ENUM` declarations are extracted as enums like `NS_ENUM` (#4705), and a `CREATE TABLE` whose column default the SQL grammar rejects (MySQL `DEFAULT current_timestamp()`) is recovered from its ERROR node (#4613), so cached ObjC and SQL extractions re-run; prior (23): `.yaml`/`.yml` files are structurally extracted (keys as nodes, config-vs-data gated) and reclassified from document to code (#2214), so cached YAML re-extracts; prior (22): SQL labels drop T-SQL brackets and routine bodies emit `reads_from`/`writes_to` (#4635), and a `GO` batch separator ends a statement (#4651), so cached `.sql` extractions re-run; prior (21): a CommonJS `const X = require('./m')` binding no longer mints a module-scope node that shadows the class the required file exports, so `new X()` resolves to the required declaration (#4621); prior (20): Obsidian `[[wikilink]]` targets that start with the scan root's own folder names now resolve to the real page (#4559), so cached markdown extractions re-run; prior (19): Dart `typedef` declarations are extracted as aliases (not variables of type `typedef`); C++ Metal/CUDA GPU qualifiers no longer mint sourceless god nodes (#4550); a `.h` header containing `extern "C"` routes to the C++ extractor; prior (18): Kotlin `typealias` (#4553), C# `delegate` (#4552), and Swift `macro` declarations (#4551) are now extracted so references stop minting sourceless stubs; Rust `use` rooted at a `mod` declared in the same scope carries `_rust_use_name` (#4564); prior (17): Python pytest-fixture markers (`_py_fixture`/`_python_fixture_param`, #4332) and module-level class-id collision salting (#2810); TS `this.field` typed from any method incl. static (#4473); Solidity callables carry `metadata.arity` + inherited-call/`super`/modifier raw calls (#4379); Go type-decl and Rust file-item case-distinct node ids (#4444); prior (16): Rust `use` edges carry the imported name as written (`_rust_use_name`, #4439); (15): Go generic receiver types normalized (`Box[T]` -> `Box`) so methods attach to the type node; prior (14): C# receiver resolution for nameless/`new X()`/`foreach` receivers (defer + receiver-chain markers) and `_`/case-distinct node ids (underscore-salted); prior (13): Kotlin/Scala/C++/Swift generic & template type params no longer mint sourceless stubs; Objective-C NS_ENUM/NS_OPTIONS extraction and `_callable`/`_callable_class` markers; Go and PHP receiver-typed member calls park cross-repo (`go_type_table`/`php_type_table`, receiver fields); prior (12): Java inherited-supertype (`receiver_unbound`) and chained/new/cast receiver typing (`java_receiver_chain`, `_java_ret`); C/C++ quoted cross-directory include provenance (`include_kind`); JS external imports anchored to the package, not the path leaf; prior (11): Python property-accessor decorators / `Self`, Swift `Self`, Go generic type params, Python forward type-hint file node, PowerShell dot-source, C# verbatim-interpolated string recovery; (10): C# partial types carry `type_path`; (9): Python property-read raw calls and `_py_property` nodes; (8): Rust `use`-group per-binding edges; (7): Python opaque-base/super(args) markers + nested-class enclosing ids.
42
42
 
43
43
 
44
44
  # Per-process memo: distributions() scans site-packages metadata, which is
@@ -1965,7 +1965,7 @@ def dispatch_command(cmd: str) -> None:
1965
1965
  file=sys.stderr,
1966
1966
  )
1967
1967
  sys.exit(1)
1968
- from graphify.serve import _is_ambiguity_refusal, _resolve_path_endpoint
1968
+ from graphify.serve import _confidence_tag, _is_ambiguity_refusal, _resolve_path_endpoint
1969
1969
  from networkx.readwrite import json_graph
1970
1970
  import networkx as _nx
1971
1971
 
@@ -2054,12 +2054,14 @@ def dispatch_command(cmd: str) -> None:
2054
2054
  # returned an arbitrary route among equal-length paths that varied per
2055
2055
  # process. Build a sorted, materialized graph so neighbor order — and
2056
2056
  # thus the chosen path — is canonical for a given graph.json.
2057
+ from graphify.serve import _weakest_shortest_path
2057
2058
  try:
2058
2059
  if undirected:
2059
2060
  _und = _nx.Graph()
2060
2061
  _und.add_nodes_from(sorted(G.nodes))
2061
2062
  _und.add_edges_from(sorted((min(u, v), max(u, v)) for u, v in G.edges()))
2062
- path_nodes = _nx.shortest_path(_und, src_nid, tgt_nid)
2063
+ path_nodes, _n_routes, _routes_capped = _weakest_shortest_path(
2064
+ _und, G, src_nid, tgt_nid)
2063
2065
  else:
2064
2066
  # Directed by default (#2487). True direction is NOT raw arc
2065
2067
  # order: legacy canonicalized files persist a flipped arc with
@@ -2084,7 +2086,8 @@ def dispatch_command(cmd: str) -> None:
2084
2086
  for u, v, d in G.edges(data=True)
2085
2087
  if d.get("relation") == "contains"
2086
2088
  ))
2087
- path_nodes = _nx.shortest_path(_dg, src_nid, tgt_nid)
2089
+ path_nodes, _n_routes, _routes_capped = _weakest_shortest_path(
2090
+ _dg, G, src_nid, tgt_nid)
2088
2091
  except (_nx.NetworkXNoPath, _nx.NodeNotFound):
2089
2092
  if undirected:
2090
2093
  print(f"No path found between '{source_label}' and '{target_label}'.")
@@ -2097,7 +2100,9 @@ def dispatch_command(cmd: str) -> None:
2097
2100
  sys.exit(0)
2098
2101
  hops = len(path_nodes) - 1
2099
2102
  segments = []
2100
- from graphify.build import edge_datas
2103
+ hop_datas: list[list[dict]] = []
2104
+ from graphify.build import edge_datas, edge_evidence
2105
+ from graphify.serve import _path_confidence_line
2101
2106
  for i in range(len(path_nodes) - 1):
2102
2107
  u, v = path_nodes[i], path_nodes[i + 1]
2103
2108
  # Report the ACTUAL stored relation(s) of the traversed pair and
@@ -2116,10 +2121,11 @@ def dispatch_command(cmd: str) -> None:
2116
2121
  for d in edge_datas(G, a, b):
2117
2122
  (fwd if d.get("_src", a) == u else bwd).append(d)
2118
2123
  datas = fwd or bwd
2124
+ hop_datas.append(datas)
2119
2125
  forward = bool(fwd)
2120
2126
  rels = sorted({d.get("relation") for d in datas if d.get("relation")})
2121
2127
  rel = "/".join(rels) if rels else "related"
2122
- confs = sorted({d.get("confidence") for d in datas if d.get("confidence")})
2128
+ confs = sorted({_confidence_tag(e) for d in datas for e in edge_evidence(d) if e.get("confidence")})
2123
2129
  conf_str = f" [{'/'.join(confs)}]" if confs else ""
2124
2130
  if i == 0:
2125
2131
  segments.append(G.nodes[u].get("label", u))
@@ -2128,6 +2134,13 @@ def dispatch_command(cmd: str) -> None:
2128
2134
  else:
2129
2135
  segments.append(f"<--{rel}{conf_str}-- {G.nodes[v].get('label', v)}")
2130
2136
  print(f"Shortest path ({hops} hops):\n " + " ".join(segments))
2137
+ _summary = _path_confidence_line(hop_datas)
2138
+ if _summary and _n_routes > 1:
2139
+ # Several routes tie on length; report the weakest's confidence so it
2140
+ # never overstates how sure the connection is (#4881).
2141
+ _summary += f" (weakest of {'256+' if _routes_capped else _n_routes} equal-length routes)"
2142
+ if _summary:
2143
+ print(_summary)
2131
2144
  from graphify import querylog
2132
2145
  querylog.log_query(
2133
2146
  kind="path",
@@ -2149,7 +2162,7 @@ def dispatch_command(cmd: str) -> None:
2149
2162
  if len(sys.argv) == 3 and sys.argv[2] in ("--help", "-h"):
2150
2163
  print(_explain_usage)
2151
2164
  return
2152
- from graphify.serve import _is_ambiguity_refusal, _resolve_single_node
2165
+ from graphify.serve import _confidence_tag, _is_ambiguity_refusal, _resolve_single_node
2153
2166
  from networkx.readwrite import json_graph
2154
2167
 
2155
2168
  label = sys.argv[2]
@@ -2232,7 +2245,7 @@ def dispatch_command(cmd: str) -> None:
2232
2245
  shown = connections if show_all else connections[:20]
2233
2246
  for direction, nb, edata in shown:
2234
2247
  rel = edata.get("relation", "")
2235
- conf = edata.get("confidence", "")
2248
+ conf = _confidence_tag(edata)
2236
2249
  arrow = "-->" if direction == "out" else "<--"
2237
2250
  # Append the edge's location — the actual call/import/reference
2238
2251
  # SITE (in the caller's file for an incoming call), not a def
@@ -4399,7 +4412,7 @@ def dispatch_command(cmd: str) -> None:
4399
4412
  "_rust_impl_key", "_rust_declaration_count",
4400
4413
  "_ts_public_twin", "_py_property", "_java_ret",
4401
4414
  "_ts_fields", "_ts_static_fields",
4402
- "_py_fixture", "_py_return_type",
4415
+ "_py_fixture", "_py_return_type", "_go_fields",
4403
4416
  ):
4404
4417
  if _node.get(_marker):
4405
4418
  _ctx_node[_marker] = _node[_marker]
@@ -4947,6 +4960,8 @@ def dispatch_command(cmd: str) -> None:
4947
4960
  # gets this), so apply it directly on the merged node list.
4948
4961
  from graphify.build import disambiguate_file_labels_in_nodes as _disamb_labels
4949
4962
  _disamb_labels(merged["nodes"])
4963
+ from graphify.build import qualify_csharp_method_labels_in_nodes as _qualify_cs_methods
4964
+ _qualify_cs_methods(merged["nodes"], merged["edges"])
4950
4965
  # Same endpoint rules as build_from_json (#2873): an import of an
4951
4966
  # external module gets a typed stub node, and any other edge without
4952
4967
  # two declared endpoints is dropped instead of shipping a phantom.
@@ -446,12 +446,14 @@ def _rank_path(source_file: str, root: Path | None) -> str:
446
446
 
447
447
 
448
448
  def _collision_rank(node: dict, root: Path | None = None,
449
- mentions: "frozenset | set" = frozenset()) -> tuple:
449
+ mentions: "frozenset | set" = frozenset(),
450
+ outranked: "frozenset | set" = frozenset()) -> tuple:
450
451
  """A total order for choosing the survivor of an ID collision, independent of
451
452
  the order the colliding nodes arrive in.
452
453
 
453
454
  The winner is the node with the SMALLEST rank. A node whose ``source_file``
454
- defines the ID always outranks a mere reference; among equally-(non-)defining
455
+ defines the ID always outranks a mere reference, and a definer listed in
456
+ ``outranked`` ranks behind the other definers (#4859); among equally-(non-)defining
455
457
  nodes an active/in-progress path outranks an archived/done one (#2532); then
456
458
  it prefers the shorter, more canonical label over a longer qualified variant,
457
459
  then breaks any remaining tie lexically on label and finally on the REVERSED
@@ -470,6 +472,14 @@ def _collision_rank(node: dict, root: Path | None = None,
470
472
  level up (#3775/#3786). It changes no collision between two sourced
471
473
  nodes, since both sides of that key agree there.
472
474
 
475
+ ``outranked`` (see ``_outranked_by_ast``) holds the ``(id, file)`` of non-AST
476
+ definers that another file's AST node also defines. A doc whose own path
477
+ prefixes a code entity's id (``pkg.md`` beside ``pkg/test_x.py``) defines it
478
+ too, and used to take it on a shorter label, so its next re-extract deleted the
479
+ code node (#4859). Such a definer now ranks right behind the other definers;
480
+ same-file pairs (#2091), same-stem twins, and collisions with one definer
481
+ rank as before.
482
+
473
483
  ``mentions`` (see ``_mentions``) holds the ``(id, file)`` of nodes read as a
474
484
  mention of a document rather than the document itself. Such a node ranks as a
475
485
  reference even though its id is a path slice, so a real document outranks it
@@ -481,8 +491,10 @@ def _collision_rank(node: dict, root: Path | None = None,
481
491
  """
482
492
  label = node.get("label") or ""
483
493
  rank_path = _rank_path(node.get("source_file") or "", root)
494
+ key = (node.get("id"), rank_path)
484
495
  return (
485
- not _defines_id(node) or (node.get("id"), rank_path) in mentions,
496
+ not _defines_id(node) or key in mentions,
497
+ key in outranked and node.get("_origin") != "ast", # (#4859)
486
498
  not node.get("source_file"), # a located node beats a source-less one (#4492)
487
499
  _lifecycle_penalty(rank_path), # active paths beat archived ones (#2532)
488
500
  len(label), # shorter, more canonical label first
@@ -491,6 +503,40 @@ def _collision_rank(node: dict, root: Path | None = None,
491
503
  )
492
504
 
493
505
 
506
+ def _outranked_by_ast(nodes: list[dict], root: Path | None,
507
+ mentions: "frozenset | set") -> set[tuple[str, str]]:
508
+ """``(id, root-relative file)`` of non-AST definers that an AST node from
509
+ another file also defines, while their own file has no AST definer (#4859).
510
+
511
+ The AST node is extracted fact and the other is an inference about it, so the
512
+ AST node keeps the id. The check is strict on ``_origin == "ast"``, as in the
513
+ build ghost pass: fresh semantic chunks arrive unstamped. A file that has its
514
+ own AST definer (#2091 enrichment) is never listed, and an AST node with the
515
+ same full stem (an ``x.py``/``x.html`` twin, or a slug twin such as
516
+ ``pkg/service.py`` and ``pkg_service.py``) never counts against it.
517
+ """
518
+ ast_defs: dict[str, list[tuple[str, str]]] = defaultdict(list)
519
+ others: list[tuple[str, str, str]] = []
520
+ for node in nodes:
521
+ nid = node.get("id") or ""
522
+ source_file = node.get("source_file") or ""
523
+ rank_path = _rank_path(source_file, root)
524
+ if not nid or not _defines_id(node) or (nid, rank_path) in mentions:
525
+ continue
526
+ entry = (rank_path, _full_stem(source_file))
527
+ if node.get("_origin") == "ast":
528
+ ast_defs[nid].append(entry)
529
+ else:
530
+ others.append((nid, *entry))
531
+ outranked = set()
532
+ for nid, rank_path, stem in others:
533
+ defs = ast_defs.get(nid, [])
534
+ if (defs and rank_path not in {rp for rp, _ in defs}
535
+ and any(ast_stem != stem for _, ast_stem in defs)):
536
+ outranked.add((nid, rank_path))
537
+ return outranked
538
+
539
+
494
540
  def _mentions(nodes: list[dict], edges: list[dict],
495
541
  root: Path | None) -> set[tuple[str, str]]:
496
542
  """``(id, root-relative file)`` of nodes read as a MENTION of a document (#4281).
@@ -1104,6 +1150,7 @@ def deduplicate_entities(
1104
1150
  nodes, edges, hyperedges, root_resolved,
1105
1151
  )
1106
1152
  mentions = _mentions(nodes, edges, root_resolved) | _slice_references(nodes, root_resolved)
1153
+ outranked = _outranked_by_ast(nodes, root_resolved, mentions)
1107
1154
  seen_ids: dict[str, dict] = {}
1108
1155
  dropped: dict[str, list[dict]] = defaultdict(list)
1109
1156
  for node in nodes:
@@ -1113,8 +1160,8 @@ def deduplicate_entities(
1113
1160
  incumbent = seen_ids.get(nid)
1114
1161
  if incumbent is None:
1115
1162
  seen_ids[nid] = node
1116
- elif (_collision_rank(node, root_resolved, mentions)
1117
- < _collision_rank(incumbent, root_resolved, mentions)):
1163
+ elif (_collision_rank(node, root_resolved, mentions, outranked)
1164
+ < _collision_rank(incumbent, root_resolved, mentions, outranked)):
1118
1165
  # Smallest-ranked node wins; the min over a total order is independent
1119
1166
  # of the order nodes arrive in, so the survivor no longer depends on
1120
1167
  # chunk ordering (#1851).
@@ -1132,7 +1179,7 @@ def deduplicate_entities(
1132
1179
  survivor = seen_ids[nid]
1133
1180
  same_source = sorted(
1134
1181
  (l for l in losers if _same_source_entity(survivor, l)),
1135
- key=lambda l: _collision_rank(l, root_resolved, mentions),
1182
+ key=lambda l: _collision_rank(l, root_resolved, mentions, outranked),
1136
1183
  )
1137
1184
  for loser in same_source:
1138
1185
  survivor = _merge_missing_attributes(survivor, loser)
@@ -564,7 +564,7 @@ def to_cypher(G: nx.Graph, output_path: str) -> None:
564
564
  (data.get("file_type", "unknown") or "unknown").capitalize(),
565
565
  "Entity",
566
566
  )
567
- lines.append(f"MERGE (n:{ftype} {{id: '{node_id_esc}', label: '{label}'}});")
567
+ lines.append(f"MERGE (n:{ftype} {{id: '{node_id_esc}'}}) SET n.label = '{label}';")
568
568
  lines.append("")
569
569
  for u, v, data in G.edges(data=True):
570
570
  u, v = data.get("_src", u), data.get("_tgt", v)