graphifyy 0.9.75__tar.gz → 0.9.76__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 (571) hide show
  1. {graphifyy-0.9.75/graphifyy.egg-info → graphifyy-0.9.76}/PKG-INFO +3 -2
  2. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/analyze.py +13 -1
  3. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/build.py +6 -3
  4. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cache.py +1 -1
  5. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cli.py +12 -20
  6. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cross_repo_calls.py +1 -1
  7. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cross_repo_types.py +1 -1
  8. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/dedup.py +39 -32
  9. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/detect.py +43 -1
  10. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extract.py +151 -38
  11. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/elixir.py +24 -3
  12. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/engine.py +180 -0
  13. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/json_config.py +45 -9
  14. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/pascal.py +32 -0
  15. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/vbnet.py +12 -3
  16. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/zig.py +17 -4
  17. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/hooks.py +73 -2
  18. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/interface_dispatch.py +1 -1
  19. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/serve.py +90 -22
  20. {graphifyy-0.9.75 → graphifyy-0.9.76/graphifyy.egg-info}/PKG-INFO +3 -2
  21. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphifyy.egg-info/SOURCES.txt +3 -0
  22. {graphifyy-0.9.75 → graphifyy-0.9.76}/pyproject.toml +3 -2
  23. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_analyze.py +54 -0
  24. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cache.py +32 -0
  25. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cpp_nested_and_cli.py +39 -0
  26. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cross_repo_member_calls.py +1 -0
  27. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cross_repo_shared_types.py +1 -0
  28. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_interface_dispatch.py +4 -0
  29. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dedup.py +82 -14
  30. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_detect.py +161 -0
  31. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_elixir_unqualified_call_scope.py +32 -0
  32. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extract.py +279 -16
  33. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hooks.py +64 -0
  34. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_inferred_confidence_rubric.py +72 -12
  35. graphifyy-0.9.76/tests/test_json_schema_config.py +227 -0
  36. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_languages.py +45 -0
  37. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_loose_sibling_import_resolution.py +8 -4
  38. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pascal.py +46 -0
  39. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_path_cli.py +176 -0
  40. graphifyy-0.9.76/tests/test_php_language_construct_calls.py +258 -0
  41. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_python_import_resolution.py +96 -0
  42. graphifyy-0.9.76/tests/test_svelte_extraction.py +205 -0
  43. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_cross_file_calls.py +3 -3
  44. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_protocol_dispatch.py +1 -1
  45. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_vbnet_extractor.py +36 -0
  46. {graphifyy-0.9.75 → graphifyy-0.9.76}/LICENSE +0 -0
  47. {graphifyy-0.9.75 → graphifyy-0.9.76}/LICENSE-MIT +0 -0
  48. {graphifyy-0.9.75 → graphifyy-0.9.76}/NOTICE +0 -0
  49. {graphifyy-0.9.75 → graphifyy-0.9.76}/README.md +0 -0
  50. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/__init__.py +0 -0
  51. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/__main__.py +0 -0
  52. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/_minhash.py +0 -0
  53. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/affected.py +0 -0
  54. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/agents-md.md +0 -0
  55. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/antigravity-rules.md +0 -0
  56. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/claude-md.md +0 -0
  57. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/gemini-md.md +0 -0
  58. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/kiro-steering.md +0 -0
  59. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/always_on/vscode-instructions.md +0 -0
  60. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/benchmark.py +0 -0
  61. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/callflow_html.py +0 -0
  62. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cargo_introspect.py +0 -0
  63. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/cluster.py +0 -0
  64. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/command-kilo.md +0 -0
  65. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/csharp_dispatch.py +0 -0
  66. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/diagnostics.py +0 -0
  67. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/export.py +0 -0
  68. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/exporters/__init__.py +0 -0
  69. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/exporters/base.py +0 -0
  70. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/exporters/graphdb.py +0 -0
  71. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/exporters/html.py +0 -0
  72. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/__init__.py +0 -0
  73. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/apex.py +0 -0
  74. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/base.py +0 -0
  75. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/bash.py +0 -0
  76. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/blade.py +0 -0
  77. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/cobol.py +0 -0
  78. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/commonlisp.py +0 -0
  79. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/csharp.py +0 -0
  80. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/dart.py +0 -0
  81. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/dm.py +0 -0
  82. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/erlang.py +0 -0
  83. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/fortran.py +0 -0
  84. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/go.py +0 -0
  85. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/julia.py +0 -0
  86. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/markdown.py +0 -0
  87. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/models.py +0 -0
  88. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/objc.py +0 -0
  89. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/ocaml.py +0 -0
  90. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/pascal_forms.py +0 -0
  91. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/powershell.py +0 -0
  92. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/r.py +0 -0
  93. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/razor.py +0 -0
  94. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/resolution.py +0 -0
  95. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/robot.py +0 -0
  96. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/rust.py +0 -0
  97. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/sln.py +0 -0
  98. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/solidity.py +0 -0
  99. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/sql.py +0 -0
  100. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/terraform.py +0 -0
  101. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/extractors/verilog.py +0 -0
  102. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/file_slice.py +0 -0
  103. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/global_graph.py +0 -0
  104. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/google_workspace.py +0 -0
  105. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/ids.py +0 -0
  106. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/ingest.py +0 -0
  107. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/install.py +0 -0
  108. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/llm.py +0 -0
  109. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/manifest.py +0 -0
  110. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/manifest_ingest.py +0 -0
  111. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/markdown_resolution.py +0 -0
  112. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/mcp_ingest.py +0 -0
  113. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/multigraph_compat.py +0 -0
  114. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/pascal_resolution.py +0 -0
  115. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/paths.py +0 -0
  116. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/pg_introspect.py +0 -0
  117. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/prs.py +0 -0
  118. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/querylog.py +0 -0
  119. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/reflect.py +0 -0
  120. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/report.py +0 -0
  121. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/resolver_registry.py +0 -0
  122. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/ruby_resolution.py +0 -0
  123. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/scip_ingest.py +0 -0
  124. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/security.py +0 -0
  125. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/semantic_cleanup.py +0 -0
  126. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-agents.md +0 -0
  127. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-aider.md +0 -0
  128. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-amp.md +0 -0
  129. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-claw.md +0 -0
  130. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-codex.md +0 -0
  131. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-copilot.md +0 -0
  132. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-devin.md +0 -0
  133. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-droid.md +0 -0
  134. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-kilo.md +0 -0
  135. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-kiro.md +0 -0
  136. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-opencode.md +0 -0
  137. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-pi.md +0 -0
  138. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-trae.md +0 -0
  139. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-vscode.md +0 -0
  140. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill-windows.md +0 -0
  141. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skill.md +0 -0
  142. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/add-watch.md +0 -0
  143. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/exports.md +0 -0
  144. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/extraction-spec.md +0 -0
  145. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/github-and-merge.md +0 -0
  146. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/hooks.md +0 -0
  147. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/query.md +0 -0
  148. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/transcribe.md +0 -0
  149. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/agents/references/update.md +0 -0
  150. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/add-watch.md +0 -0
  151. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/exports.md +0 -0
  152. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/extraction-spec.md +0 -0
  153. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/github-and-merge.md +0 -0
  154. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/hooks.md +0 -0
  155. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/query.md +0 -0
  156. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/transcribe.md +0 -0
  157. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/amp/references/update.md +0 -0
  158. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/add-watch.md +0 -0
  159. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/exports.md +0 -0
  160. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/extraction-spec.md +0 -0
  161. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/github-and-merge.md +0 -0
  162. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/hooks.md +0 -0
  163. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/query.md +0 -0
  164. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/transcribe.md +0 -0
  165. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claude/references/update.md +0 -0
  166. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/add-watch.md +0 -0
  167. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/exports.md +0 -0
  168. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/extraction-spec.md +0 -0
  169. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/github-and-merge.md +0 -0
  170. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/hooks.md +0 -0
  171. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/query.md +0 -0
  172. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/transcribe.md +0 -0
  173. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/claw/references/update.md +0 -0
  174. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/add-watch.md +0 -0
  175. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/exports.md +0 -0
  176. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/extraction-spec.md +0 -0
  177. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/github-and-merge.md +0 -0
  178. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/hooks.md +0 -0
  179. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/query.md +0 -0
  180. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/transcribe.md +0 -0
  181. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/codex/references/update.md +0 -0
  182. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/add-watch.md +0 -0
  183. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/exports.md +0 -0
  184. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/extraction-spec.md +0 -0
  185. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/github-and-merge.md +0 -0
  186. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/hooks.md +0 -0
  187. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/query.md +0 -0
  188. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/transcribe.md +0 -0
  189. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/copilot/references/update.md +0 -0
  190. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/add-watch.md +0 -0
  191. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/exports.md +0 -0
  192. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/extraction-spec.md +0 -0
  193. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/github-and-merge.md +0 -0
  194. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/hooks.md +0 -0
  195. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/query.md +0 -0
  196. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/transcribe.md +0 -0
  197. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/droid/references/update.md +0 -0
  198. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/add-watch.md +0 -0
  199. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/exports.md +0 -0
  200. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/extraction-spec.md +0 -0
  201. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/github-and-merge.md +0 -0
  202. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/hooks.md +0 -0
  203. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/query.md +0 -0
  204. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/transcribe.md +0 -0
  205. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kilo/references/update.md +0 -0
  206. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/add-watch.md +0 -0
  207. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/exports.md +0 -0
  208. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/extraction-spec.md +0 -0
  209. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/github-and-merge.md +0 -0
  210. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/hooks.md +0 -0
  211. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/query.md +0 -0
  212. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/transcribe.md +0 -0
  213. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/kiro/references/update.md +0 -0
  214. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/add-watch.md +0 -0
  215. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/exports.md +0 -0
  216. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/extraction-spec.md +0 -0
  217. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/github-and-merge.md +0 -0
  218. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/hooks.md +0 -0
  219. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/query.md +0 -0
  220. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/transcribe.md +0 -0
  221. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/opencode/references/update.md +0 -0
  222. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/add-watch.md +0 -0
  223. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/exports.md +0 -0
  224. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/extraction-spec.md +0 -0
  225. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/github-and-merge.md +0 -0
  226. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/hooks.md +0 -0
  227. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/query.md +0 -0
  228. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/transcribe.md +0 -0
  229. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/pi/references/update.md +0 -0
  230. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/add-watch.md +0 -0
  231. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/exports.md +0 -0
  232. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/extraction-spec.md +0 -0
  233. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/github-and-merge.md +0 -0
  234. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/hooks.md +0 -0
  235. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/query.md +0 -0
  236. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/transcribe.md +0 -0
  237. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/trae/references/update.md +0 -0
  238. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/add-watch.md +0 -0
  239. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/exports.md +0 -0
  240. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/extraction-spec.md +0 -0
  241. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/github-and-merge.md +0 -0
  242. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/hooks.md +0 -0
  243. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/query.md +0 -0
  244. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/transcribe.md +0 -0
  245. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/vscode/references/update.md +0 -0
  246. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/add-watch.md +0 -0
  247. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/exports.md +0 -0
  248. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/extraction-spec.md +0 -0
  249. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/github-and-merge.md +0 -0
  250. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/hooks.md +0 -0
  251. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/query.md +0 -0
  252. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/transcribe.md +0 -0
  253. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/skills/windows/references/update.md +0 -0
  254. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/swift_dispatch.py +0 -0
  255. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/symbol_resolution.py +0 -0
  256. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/transcribe.py +0 -0
  257. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/tree_html.py +0 -0
  258. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/validate.py +0 -0
  259. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/watch.py +0 -0
  260. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphify/wiki.py +0 -0
  261. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphifyy.egg-info/dependency_links.txt +0 -0
  262. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphifyy.egg-info/entry_points.txt +0 -0
  263. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphifyy.egg-info/requires.txt +0 -0
  264. {graphifyy-0.9.75 → graphifyy-0.9.76}/graphifyy.egg-info/top_level.txt +0 -0
  265. {graphifyy-0.9.75 → graphifyy-0.9.76}/setup.cfg +0 -0
  266. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_affected_cli.py +0 -0
  267. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_affected_member_seed.py +0 -0
  268. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_agents_platform.py +0 -0
  269. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_anthropic_custom_endpoint.py +0 -0
  270. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_antigravity_install.py +0 -0
  271. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_apm_fallback_version.py +0 -0
  272. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_architecture_doc.py +0 -0
  273. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_astro_extraction.py +0 -0
  274. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_astro_import_ids.py +0 -0
  275. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_atomic_canvas_export.py +0 -0
  276. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_atomic_version_stamp.py +0 -0
  277. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_atomic_writes.py +0 -0
  278. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_backend_env_isolation.py +0 -0
  279. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_backend_extras.py +0 -0
  280. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_benchmark.py +0 -0
  281. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_benchmark_raw_graph.py +0 -0
  282. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_blade_extractor.py +0 -0
  283. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_build.py +0 -0
  284. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_build_merge_dedup_scope.py +0 -0
  285. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_build_merge_hyperedges_and_prune.py +0 -0
  286. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_build_merge_shrink_guard.py +0 -0
  287. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_builtin_global_type_refs.py +0 -0
  288. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_callflow_html.py +0 -0
  289. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cargo_introspect.py +0 -0
  290. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cargo_missing_manifest.py +0 -0
  291. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_carried_hyperedge_remap.py +0 -0
  292. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_case_sensitive_resolution.py +0 -0
  293. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_charmap_encoding.py +0 -0
  294. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_chunking.py +0 -0
  295. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cjs_module_extension.py +0 -0
  296. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_claude_cli_backend.py +0 -0
  297. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_claude_md.py +0 -0
  298. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cli_broken_pipe.py +0 -0
  299. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cli_export.py +0 -0
  300. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cli_help.py +0 -0
  301. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cluster.py +0 -0
  302. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cluster_exclude_hubs.py +0 -0
  303. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cobol_extractor.py +0 -0
  304. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_codebuddy.py +0 -0
  305. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_community_hub_labels.py +0 -0
  306. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_community_labels_skill.py +0 -0
  307. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_confidence.py +0 -0
  308. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_corrupt_graph_json.py +0 -0
  309. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cpp_method_declarations.py +0 -0
  310. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cpp_objc_cross_file_calls.py +0 -0
  311. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cpp_preprocess.py +0 -0
  312. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cross_extension_reexport_self_cycle.py +0 -0
  313. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cross_language_call_resolution.py +0 -0
  314. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_cross_repo_external_call_guards.py +0 -0
  315. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_call_site_generic_args.py +0 -0
  316. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_enum_members.py +0 -0
  317. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_field_generic_args.py +0 -0
  318. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_generic_callsites.py +0 -0
  319. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_member_calls.py +0 -0
  320. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_member_nodes.py +0 -0
  321. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_object_creation.py +0 -0
  322. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_partial_classes.py +0 -0
  323. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_tuple_type_refs.py +0 -0
  324. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_csharp_type_resolution.py +0 -0
  325. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dart.py +0 -0
  326. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dedup_remaps_hyperedges.py +0 -0
  327. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dedup_shrink_refuses_force_write.py +0 -0
  328. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dedup_survivor_richness.py +0 -0
  329. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_definition_file_portability.py +0 -0
  330. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_devin.py +0 -0
  331. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_docx_to_markdown.py +0 -0
  332. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_dotnet.py +0 -0
  333. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_duplicate_annotation_edges.py +0 -0
  334. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_elixir_import_resolution.py +0 -0
  335. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_erlang_extractor.py +0 -0
  336. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_evidence_binding.py +0 -0
  337. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_explain_cli.py +0 -0
  338. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_export.py +0 -0
  339. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_export_control_characters.py +0 -0
  340. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_export_idempotent_writes.py +0 -0
  341. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_export_path_length.py +0 -0
  342. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_external_stub_endpoints.py +0 -0
  343. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extract_cache_location.py +0 -0
  344. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extract_cli.py +0 -0
  345. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extract_code_only_cli.py +0 -0
  346. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extract_php_closures.py +0 -0
  347. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extraction_spec_ids.py +0 -0
  348. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_extractors_registry.py +0 -0
  349. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_falkordb_integration.py +0 -0
  350. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_file_label_disambiguation.py +0 -0
  351. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_file_node_id_spec.py +0 -0
  352. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_file_slice.py +0 -0
  353. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_file_truncation_warning.py +0 -0
  354. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_forwarding_review_findings.py +0 -0
  355. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_gemini_hook.py +0 -0
  356. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_global_add_tag_inference.py +0 -0
  357. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_global_graph.py +0 -0
  358. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_go_builtin_call_targets.py +0 -0
  359. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_go_import_repoint.py +0 -0
  360. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_go_interface_methods.py +0 -0
  361. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_go_qualified_resolution.py +0 -0
  362. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_god_nodes_cli.py +0 -0
  363. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_god_nodes_exclude_hubs.py +0 -0
  364. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_google_workspace.py +0 -0
  365. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_graphdb_push_indexes.py +0 -0
  366. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hollow_chunks_arm_shrink_guard.py +0 -0
  367. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_home_sandbox.py +0 -0
  368. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hook_chain_survives_skip.py +0 -0
  369. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hook_guard.py +0 -0
  370. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hook_guard_token_match.py +0 -0
  371. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hook_out_of_project_paths.py +0 -0
  372. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hook_strict.py +0 -0
  373. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hyperedge_member_shapes.py +0 -0
  374. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hyperedge_roundtrip.py +0 -0
  375. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_hypergraph.py +0 -0
  376. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_id_normalization_contract.py +0 -0
  377. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ignore_file_encoding.py +0 -0
  378. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_image_vision.py +0 -0
  379. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_import_extension_resolution.py +0 -0
  380. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_import_self_loops.py +0 -0
  381. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_imported_export_forwarding.py +0 -0
  382. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_incomplete_build_guard.py +0 -0
  383. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_incremental.py +0 -0
  384. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_incremental_mtime_collision.py +0 -0
  385. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_arrow_single_param_shadow.py +0 -0
  386. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_block_scoped_shadow.py +0 -0
  387. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_catch_binding_shadow.py +0 -0
  388. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_external_import_shadow.py +0 -0
  389. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_for_of_binding_shadow.py +0 -0
  390. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_function_expression_shadow.py +0 -0
  391. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_call_nested_closure_shadow.py +0 -0
  392. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_dispatch.py +0 -0
  393. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_dispatch_assign_return.py +0 -0
  394. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_indirect_dispatch_getattr.py +0 -0
  395. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ingest.py +0 -0
  396. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ingest_url_type.py +0 -0
  397. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_inherited_field_receivers.py +0 -0
  398. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_injection_sentinel_coverage.py +0 -0
  399. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install.py +0 -0
  400. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_references.py +0 -0
  401. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_roundtrip.py +0 -0
  402. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_strings.py +0 -0
  403. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_upgrade.py +0 -0
  404. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_version_stamp.py +0 -0
  405. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_install_version_warning.py +0 -0
  406. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_issue_3405_python_resolution.py +0 -0
  407. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_issue_3472_source_file_collision.py +0 -0
  408. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_java_enum_members.py +0 -0
  409. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_java_member_calls.py +0 -0
  410. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_java_type_resolution.py +0 -0
  411. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_callback_calls.py +0 -0
  412. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_destructured_export.py +0 -0
  413. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_dynamic_import_affected.py +0 -0
  414. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_dynamic_imports.py +0 -0
  415. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_exported_fn_call_resolution.py +0 -0
  416. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_exported_scalar_bindings.py +0 -0
  417. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_import_resolution.py +0 -0
  418. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_module_level_anonymous_calls.py +0 -0
  419. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_js_this_member_expressions.py +0 -0
  420. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_jsconfig_baseurl.py +0 -0
  421. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_jsx_component_usage_calls.py +0 -0
  422. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_kotlin_grammar.py +0 -0
  423. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_kotlin_object_literal.py +0 -0
  424. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_label_retry.py +0 -0
  425. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_labeling.py +0 -0
  426. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_language_resolvers.py +0 -0
  427. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_llm_backends.py +0 -0
  428. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_llm_parser.py +0 -0
  429. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_llm_parser_reasoning.py +0 -0
  430. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_long_path_hashing.py +0 -0
  431. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_lua_import.py +0 -0
  432. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_lua_method_calls.py +0 -0
  433. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_manifest_ingest.py +0 -0
  434. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_manifest_tomli_required.py +0 -0
  435. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_markdown_code_spans.py +0 -0
  436. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_mcp_ingest.py +0 -0
  437. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_merge_chunks_validation.py +0 -0
  438. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_merge_graphs_cli.py +0 -0
  439. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_minhash.py +0 -0
  440. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_multigraph_compat.py +0 -0
  441. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_multigraph_diagnostics.py +0 -0
  442. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_multilang.py +0 -0
  443. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_no_dedup_flag.py +0 -0
  444. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_node_id_canonical.py +0 -0
  445. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_non_regular_files.py +0 -0
  446. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_non_string_node_ids.py +0 -0
  447. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_objc_category_interfaces.py +0 -0
  448. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_objc_field_table_remap.py +0 -0
  449. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_objc_member_calls.py +0 -0
  450. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_objc_property_ivar_receivers.py +0 -0
  451. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_obsidian_dangling_member.py +0 -0
  452. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_obsidian_filename_cap.py +0 -0
  453. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_obsidian_unicode_tags.py +0 -0
  454. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_obsidian_vault_migration.py +0 -0
  455. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ocaml.py +0 -0
  456. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_office_incremental.py +0 -0
  457. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_office_limits.py +0 -0
  458. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ollama.py +0 -0
  459. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ollama_retry_cap.py +0 -0
  460. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_openai_custom_endpoint.py +0 -0
  461. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_out_dir_evidence.py +0 -0
  462. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_oversized_document_slicing.py +0 -0
  463. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_owned_type_sources.py +0 -0
  464. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_package_json_subpath_imports.py +0 -0
  465. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_partial_cache.py +0 -0
  466. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_partial_extraction_warning.py +0 -0
  467. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pascal_call_scoping.py +0 -0
  468. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pascal_resolution.py +0 -0
  469. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_paths.py +0 -0
  470. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pdf_extra_warning.py +0 -0
  471. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pdf_slicing.py +0 -0
  472. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pdf_token_estimate.py +0 -0
  473. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pg_introspect.py +0 -0
  474. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_phantom_cross_package_call.py +0 -0
  475. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_phantom_external_import.py +0 -0
  476. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_php_object_creation.py +0 -0
  477. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_php_type_resolution.py +0 -0
  478. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pin_hash_seed.py +0 -0
  479. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_pipeline.py +0 -0
  480. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_provider_registry.py +0 -0
  481. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_prs.py +0 -0
  482. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_prune_sweeps_orphans.py +0 -0
  483. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_python_decorators.py +0 -0
  484. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_python_parse_memoization.py +0 -0
  485. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_python_underscore_resolution.py +0 -0
  486. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_query_cli.py +0 -0
  487. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_query_induced_edges.py +0 -0
  488. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_query_mcp_direction.py +0 -0
  489. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_query_names_its_graph.py +0 -0
  490. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_querylog.py +0 -0
  491. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_r_extractor.py +0 -0
  492. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_rationale.py +0 -0
  493. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_read_hook.py +0 -0
  494. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_reflect.py +0 -0
  495. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_relation_collapse_precedence.py +0 -0
  496. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_replace_or_append_section.py +0 -0
  497. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_report.py +0 -0
  498. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_report_gap_thresholds.py +0 -0
  499. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_resolve_memoization.py +0 -0
  500. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ruby_bare_self_send_calls.py +0 -0
  501. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ruby_resolution.py +0 -0
  502. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_rust_builtin_type_hubs.py +0 -0
  503. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_rust_macro_rules.py +0 -0
  504. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_rust_self_member_calls.py +0 -0
  505. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scala_abstract_methods.py +0 -0
  506. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scala_context_bounds.py +0 -0
  507. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scala_self_type.py +0 -0
  508. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scala_top_level_binding.py +0 -0
  509. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scala_type_definition.py +0 -0
  510. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_scip_ingest.py +0 -0
  511. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_search_hook.py +0 -0
  512. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_security.py +0 -0
  513. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_cache_basename_recovery.py +0 -0
  514. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_cache_out_root.py +0 -0
  515. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_cleanup.py +0 -0
  516. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_fragment_sanitize.py +0 -0
  517. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_id_remap_root.py +0 -0
  518. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_semantic_similarity.py +0 -0
  519. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_serve.py +0 -0
  520. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_serve_http.py +0 -0
  521. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_settings_merge.py +0 -0
  522. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_skill_auto_refresh.py +0 -0
  523. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_skill_version_warning.py +0 -0
  524. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_skillgen.py +0 -0
  525. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_skillgen_input_path_injection.py +0 -0
  526. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_solidity_extractor.py +0 -0
  527. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_source_key_memoization.py +0 -0
  528. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_sourceless_call_targets.py +0 -0
  529. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_src_layout_import_resolution.py +0 -0
  530. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_stale_prune.py +0 -0
  531. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_stat_index_husk.py +0 -0
  532. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_stat_index_multi_root.py +0 -0
  533. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_stat_index_portability.py +0 -0
  534. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_builtin_noise.py +0 -0
  535. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_computed_properties.py +0 -0
  536. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_import_resolution.py +0 -0
  537. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_swift_protocol_requirements.py +0 -0
  538. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_symbol_resolution.py +0 -0
  539. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_terraform.py +0 -0
  540. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_terraform_modules.py +0 -0
  541. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_trailing_newline_not_a_syntax_error.py +0 -0
  542. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_transcribe.py +0 -0
  543. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_tree_html.py +0 -0
  544. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_abstract_methods.py +0 -0
  545. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_decorators.py +0 -0
  546. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_generators.py +0 -0
  547. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_import_require.py +0 -0
  548. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_import_type_arguments.py +0 -0
  549. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_inheritance.py +0 -0
  550. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_namespace.py +0 -0
  551. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_new_expression_calls.py +0 -0
  552. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_parse_warning.py +0 -0
  553. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_ts_receiver_member_calls.py +0 -0
  554. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_type_only_import_cycles.py +0 -0
  555. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_typescript_enum_members.py +0 -0
  556. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_typescript_module_extensions.py +0 -0
  557. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_uninstall_scope.py +0 -0
  558. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_uninstall_symlink.py +0 -0
  559. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_unmapped_at_alias_resolution.py +0 -0
  560. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_unverified_semantic_shrink.py +0 -0
  561. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_validate.py +0 -0
  562. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_vue_extraction.py +0 -0
  563. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_walk_python_tree_iterative.py +0 -0
  564. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_watch.py +0 -0
  565. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_watch_manifest_location.py +0 -0
  566. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_wheel_packaging.py +0 -0
  567. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_wiki.py +0 -0
  568. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_wiki_link_filename_parity.py +0 -0
  569. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_wiki_truncation_indicator.py +0 -0
  570. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_word_count_cache.py +0 -0
  571. {graphifyy-0.9.75 → graphifyy-0.9.76}/tests/test_zero_node_no_cache.py +0 -0
@@ -1,9 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphifyy
3
- Version: 0.9.75
3
+ Version: 0.9.76
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
- Project-URL: Homepage, https://github.com/Graphify-Labs/graphify
6
+ Project-URL: Homepage, https://graphify.com
7
+ Project-URL: Documentation, https://docs.graphify.com
7
8
  Project-URL: Repository, https://github.com/Graphify-Labs/graphify
8
9
  Project-URL: Issues, https://github.com/Graphify-Labs/graphify/issues
9
10
  Keywords: claude,claude-code,codex,opencode,kilo,cursor,gemini,aider,kiro,pi,devin,knowledge-graph,rag,graphrag,obsidian,community-detection,tree-sitter,leiden,llm
@@ -468,6 +468,9 @@ def suggest_questions(
468
468
  Generate questions the graph is uniquely positioned to answer.
469
469
  Based on: AMBIGUOUS edges, bridge nodes, underexplored god nodes, isolated nodes.
470
470
  Each question has a 'type', 'question', and 'why' field.
471
+ Interleave question types before applying top_n so an abundant early type
472
+ cannot crowd out later signals. Preserve the existing order within each type
473
+ and category generation order when the limit is smaller than the type count.
471
474
  """
472
475
  if community_labels:
473
476
  community_labels = {int(k) if isinstance(k, str) else k: v for k, v in community_labels.items()}
@@ -583,7 +586,16 @@ def suggest_questions(
583
586
  ),
584
587
  }]
585
588
 
586
- return questions[:top_n]
589
+ from itertools import zip_longest
590
+
591
+ by_type: dict[str, list[dict]] = {}
592
+ for question in questions:
593
+ by_type.setdefault(question["type"], []).append(question)
594
+ diversified = [
595
+ question for row in zip_longest(*by_type.values())
596
+ for question in row if question is not None
597
+ ]
598
+ return diversified[:top_n]
587
599
 
588
600
 
589
601
  def graph_diff(G_old: nx.Graph, G_new: nx.Graph) -> dict:
@@ -70,9 +70,12 @@ _CONFIDENCE_RANK: dict[str, int] = {"EXTRACTED": 3, "INFERRED": 2, "AMBIGUOUS":
70
70
  # on-disk graph.json (written by the incremental update path) keep the edge with
71
71
  # no matching node — an undeclared endpoint every loader materialises as an
72
72
  # attribute-less phantom (#2873). For these relations we instead mint a typed
73
- # external stub node so every edge endpoint resolves. Deliberately NOT `calls`:
74
- # a sourceless external call target is suppressed on purpose (#3156) to avoid a
75
- # phantom god-node, and that policy is unchanged here.
73
+ # external stub node so every edge endpoint resolves. `calls` is intentionally
74
+ # NOT in this set: a `calls` edge to an external target only survives when the
75
+ # module was also imported (its import edge pre-mints the stub, see the Python
76
+ # external-call resolution in #3793); a `calls` edge to a never-imported target
77
+ # is still dropped as a phantom (#3156). External stubs stay out of god-node
78
+ # ranking regardless (analyze._is_concept_node filters source_file="").
76
79
  _EXTERNAL_STUB_RELATIONS: frozenset[str] = frozenset(
77
80
  {"imports", "imports_from", "re_exports"}
78
81
  )
@@ -36,7 +36,7 @@ except Exception:
36
36
  _EXTRACTOR_VERSION = "unknown"
37
37
 
38
38
  # Bump when AST cache-key semantics change independently of the package version.
39
- _AST_CACHE_SCHEMA = 4 # Rust generic-impl identity markers + Terraform block attributes.
39
+ _AST_CACHE_SCHEMA = 5 # Python receiver-shadow facts in persisted raw calls.
40
40
 
41
41
  # Version dirs already swept this process — cleanup runs once per (base, version).
42
42
  _cleaned_ast_dirs: set[str] = set()
@@ -1628,7 +1628,7 @@ def dispatch_command(cmd: str) -> None:
1628
1628
  file=sys.stderr,
1629
1629
  )
1630
1630
  sys.exit(1)
1631
- from graphify.serve import _pick_scored_endpoint, _score_nodes
1631
+ from graphify.serve import _resolve_path_endpoint
1632
1632
  from networkx.readwrite import json_graph
1633
1633
  import networkx as _nx
1634
1634
 
@@ -1679,16 +1679,15 @@ def dispatch_command(cmd: str) -> None:
1679
1679
  G = json_graph.node_link_graph(_raw, edges="links")
1680
1680
  except TypeError:
1681
1681
  G = json_graph.node_link_graph(_raw)
1682
- src_scored = _score_nodes(G, [t.lower() for t in source_label.split()])
1683
- tgt_scored = _score_nodes(G, [t.lower() for t in target_label.split()])
1684
- if not src_scored:
1685
- print(f"No node matching '{source_label}' found.", file=sys.stderr)
1686
- sys.exit(1)
1687
- if not tgt_scored:
1688
- print(f"No node matching '{target_label}' found.", file=sys.stderr)
1689
- sys.exit(1)
1690
- src_nid = _pick_scored_endpoint(G, src_scored, source_label)
1691
- tgt_nid = _pick_scored_endpoint(G, tgt_scored, target_label)
1682
+ src_nid, src_scored, src_err = _resolve_path_endpoint(G, source_label)
1683
+ tgt_nid, tgt_scored, tgt_err = _resolve_path_endpoint(G, target_label)
1684
+ for _label, _nid, _err in (
1685
+ (source_label, src_nid, src_err),
1686
+ (target_label, tgt_nid, tgt_err),
1687
+ ):
1688
+ if _err or _nid is None:
1689
+ print(_err or f"No node matching '{_label}' found.", file=sys.stderr)
1690
+ sys.exit(1)
1692
1691
  # Ambiguity guard: when both queries resolve to the same node, the
1693
1692
  # shortest path is trivially zero hops, which is almost never what the
1694
1693
  # caller wanted (see bug #828).
@@ -1805,7 +1804,7 @@ def dispatch_command(cmd: str) -> None:
1805
1804
  if len(sys.argv) < 3:
1806
1805
  print('Usage: graphify explain "<node>" [--graph path]', file=sys.stderr)
1807
1806
  sys.exit(1)
1808
- from graphify.serve import _find_node, find_node_ambiguity
1807
+ from graphify.serve import _ambiguity_message, _find_node, find_node_ambiguity
1809
1808
  from networkx.readwrite import json_graph
1810
1809
 
1811
1810
  label = sys.argv[2]
@@ -1834,14 +1833,7 @@ def dispatch_command(cmd: str) -> None:
1834
1833
  sys.exit(0)
1835
1834
  rivals = find_node_ambiguity(G, label)
1836
1835
  if rivals:
1837
- print(f"Ambiguous: '{label}' matches {len(rivals)} nodes in different files.")
1838
- for rival in rivals:
1839
- print(f" {G.nodes[rival].get('source_file') or rival}")
1840
- print(f" id: {rival}")
1841
- print(
1842
- f"Retry with path::symbol using one of the paths above (e.g. "
1843
- f"<path>::{label}) or the full node id."
1844
- )
1836
+ print(_ambiguity_message(G, label, rivals))
1845
1837
  sys.exit(1)
1846
1838
  nid = matches[0]
1847
1839
  d = G.nodes[nid]
@@ -235,7 +235,7 @@ def link_cross_repo_member_calls(merged: "nx.Graph") -> int:
235
235
  relation="calls",
236
236
  context="cross_repo",
237
237
  confidence="INFERRED",
238
- confidence_score=0.8,
238
+ confidence_score=0.85,
239
239
  source_file=str(caller_data.get("source_file") or ""),
240
240
  source_location=entry.get("line"),
241
241
  weight=1.0,
@@ -65,7 +65,7 @@ def link_shared_type_declarations(merged: "nx.Graph") -> int:
65
65
  relation=SHARED_TYPE_RELATION,
66
66
  context="cross_repo",
67
67
  confidence="INFERRED",
68
- confidence_score=0.9,
68
+ confidence_score=0.85,
69
69
  source_file=str(merged.nodes[left].get("source_file") or ""),
70
70
  weight=1.0,
71
71
  _src=left,
@@ -678,6 +678,30 @@ def deduplicate_entities(
678
678
  if prot is not None:
679
679
  prot_by_root[new_root] = prot
680
680
 
681
+ def _crossfile_union(left: dict, right: dict, *, with_prot: bool) -> None:
682
+ nonlocal exact_merges
683
+ if _crossfile_fileanchored_blocked(left, right):
684
+ return
685
+ left_id = left["id"]
686
+ right_id = right["id"]
687
+ if with_prot:
688
+ px = _get_prot(left_id)
689
+ py = _get_prot(right_id)
690
+ if px is not None and py is not None and px != py:
691
+ return
692
+ if uf.find(left_id) == uf.find(right_id):
693
+ return
694
+ if with_prot:
695
+ _union_with_prot(left_id, right_id)
696
+ else:
697
+ uf.union(left_id, right_id)
698
+ exact_merges += 1
699
+
700
+ def _crossfile_join(members: list[dict], *, with_prot: bool) -> None:
701
+ for index, left in enumerate(members):
702
+ for right in members[index + 1:]:
703
+ _crossfile_union(left, right, with_prot=with_prot)
704
+
681
705
  for key, group in norm_to_nodes.items():
682
706
  if len(group) <= 1:
683
707
  continue
@@ -726,20 +750,15 @@ def deduplicate_entities(
726
750
  # it is provably safe (#2182). `concept` is the one file_type meant to
727
751
  # unify across files (#1284) — code is keyed by ID (#1205) and
728
752
  # image/paper labels are often shared basenames (logo.png), so both stay
729
- # blocked. rationale/document join `concept` here ONLY when the node
730
- # reads as an entity inside its file (#296): a file-anchored
731
- # *file_type* does not make an individual node file-anchored. An entity
732
- # extracted from a note — a person, a project — inherits `document` from
733
- # the file's extension, not from anything about itself, so in note-heavy
734
- # corpora almost no entity node is typed `concept` and this merge never
735
- # got to run on them. A file's own node and its headings still never
736
- # merge (#1284, #3094).
753
+ # blocked. A rationale or document node can still enter this list when
754
+ # it reads as an entity (#296). Each union calls
755
+ # `_crossfile_fileanchored_blocked`, so that node does not join a node
756
+ # from another file (#3094). Concept nodes still join across files.
757
+ # A file's own node and its headings never enter the list (#1284).
737
758
  # Provenance is required (#1178), and the entropy gate mirrors Pass 2 so
738
759
  # short generic labels ("API") stay distinct — both untouched here.
739
- # Scoped to this exact-normalization pass: Pass 2's fuzzy
740
- # `_crossfile_fileanchored_blocked` is unchanged, so #1284's
741
- # near-identical boilerplate and heading siblings stay blocked.
742
- # Sorting by id keeps the winner order-independent.
760
+ # Pass 2 still calls the same block, so near-identical boilerplate stays
761
+ # blocked (#1284). Sorting by id keeps the pair order stable.
743
762
  mergeable = sorted(
744
763
  (n for n in group
745
764
  if (n.get("file_type") == "concept"
@@ -758,30 +777,18 @@ def deduplicate_entities(
758
777
  # NEVER collapse them during incremental merge.
759
778
  continue
760
779
  if prot_members:
761
- # Mixed: pick AT MOST ONE protected survivor for incoming nodes to fold into.
762
- # Multiple protected nodes must remain separate independent entities.
780
+ # Mixed: fold an incoming node into at most one protected
781
+ # survivor. Protected nodes stay separate from each other.
782
+ # Incoming nodes the block still allows are joined to each
783
+ # other, so a blocked winner does not leave them apart.
763
784
  canonical_winner = _pick_winner(prot_members)
764
785
  for inc in inc_members:
765
- px = _get_prot(canonical_winner["id"])
766
- py = _get_prot(inc["id"])
767
- if px is not None and py is not None and px != py:
768
- continue
769
- if uf.find(canonical_winner["id"]) != uf.find(inc["id"]):
770
- _union_with_prot(canonical_winner["id"], inc["id"])
771
- exact_merges += 1
786
+ _crossfile_union(canonical_winner, inc, with_prot=True)
787
+ _crossfile_join(inc_members, with_prot=True)
772
788
  else:
773
- # Incoming only: merge normally
774
- winner = _pick_winner(inc_members)
775
- for node in inc_members:
776
- if uf.find(winner["id"]) != uf.find(node["id"]):
777
- _union_with_prot(winner["id"], node["id"])
778
- exact_merges += 1
789
+ _crossfile_join(inc_members, with_prot=True)
779
790
  else:
780
- winner = _pick_winner(mergeable)
781
- for node in mergeable:
782
- if uf.find(winner["id"]) != uf.find(node["id"]):
783
- uf.union(winner["id"], node["id"])
784
- exact_merges += 1
791
+ _crossfile_join(mergeable, with_prot=False)
785
792
 
786
793
  # ── pass 2: MinHash/LSH + Jaro-Winkler (high-entropy nodes only) ─────────
787
794
  candidates: list[dict] = []
@@ -971,6 +971,31 @@ _SKIP_FILES = {
971
971
  # unconditionally pruned above; only the ambiguous bare name is gated here.
972
972
  _JS_SNAPSHOT_TEST_ROOTS = frozenset({"__tests__", "__test__"})
973
973
 
974
+ # Platforms whose project-scope skills dir is one level below the hidden dir
975
+ # (install.py: pi -> .pi/agent/skills, kilo -> .config/kilo/skills).
976
+ _NESTED_SKILL_HOLDERS = frozenset({(".pi", "agent"), (".config", "kilo")})
977
+
978
+ # Single files `graphify install` writes whole into a project (#4057): the
979
+ # always-on rules/steering/workflow files and the opencode/kilo hook plugins.
980
+ # Matched on the hidden holder dir plus the exact relative path, never on the
981
+ # bare file name, so e.g. docs/graphify.md or src/plugins/graphify.js stay.
982
+ # Files graphify only adds a section or entry to (AGENTS.md, CLAUDE.md,
983
+ # settings.json, ...) belong to the user and are not listed here.
984
+ _GRAPHIFY_INSTALLED_FILES = frozenset({
985
+ (".agents", "rules", "graphify.md"), # antigravity
986
+ (".agents", "workflows", "graphify.md"), # antigravity
987
+ (".cursor", "rules", "graphify.mdc"), # cursor
988
+ (".kilo", "plugins", "graphify.js"), # kilo
989
+ (".kiro", "steering", "graphify.md"), # kiro
990
+ (".opencode", "plugins", "graphify.js"), # opencode
991
+ (".windsurf", "rules", "graphify.md"), # devin
992
+ })
993
+
994
+
995
+ def _is_installed_graphify_file(path: "Path") -> bool:
996
+ """True for a single file `graphify install` wrote into the project (#4057)."""
997
+ return path.parts[-3:] in _GRAPHIFY_INSTALLED_FILES
998
+
974
999
  # Files a coverage tool writes into its own output dir. Any one of them is proof
975
1000
  # the directory is generated: lcov (lcov.info), nyc/Istanbul (coverage-final.json,
976
1001
  # clover.xml, the lcov-report/ subtree), coverage.py (coverage.xml, .coverage),
@@ -1128,6 +1153,21 @@ def _is_noise_dir(part: str, parent: "Path | None" = None) -> bool:
1128
1153
  # worktrees/ nested inside a dotted dir (e.g. .claude/worktrees/, .git/worktrees/)
1129
1154
  if part == "worktrees" and parent is not None and parent.name.startswith("."):
1130
1155
  return True
1156
+ # graphify's own skill folder, as `graphify install --project` writes it
1157
+ # (#4057): <hidden dir>/skills/graphify/ (.claude, .codex, .agents, ...),
1158
+ # .pi/agent/skills/graphify/, .config/kilo/skills/graphify/ and
1159
+ # .aider/graphify/. Matched on the whole path shape rather than the bare
1160
+ # names "skills"/"graphify" (#2479), so graphify's own source tree
1161
+ # (graphify/skills/<host>/), a top-level skills/graphify/ and the user's
1162
+ # other skills under .claude/skills/ are still indexed.
1163
+ if part == "graphify" and parent is not None:
1164
+ if parent.name == ".aider":
1165
+ return True
1166
+ if parent.name == "skills":
1167
+ holder = parent.parent
1168
+ if holder.name.startswith(".") and holder.name != "..":
1169
+ return True
1170
+ return (holder.parent.name, holder.name) in _NESTED_SKILL_HOLDERS
1131
1171
  return False
1132
1172
 
1133
1173
 
@@ -1771,7 +1811,7 @@ def ignored_predicate(
1771
1811
  rel_parts = path.relative_to(root).parts
1772
1812
  except ValueError:
1773
1813
  return False # outside the scan root: detect() never considered it
1774
- if path.name in _SKIP_FILES:
1814
+ if path.name in _SKIP_FILES or _is_installed_graphify_file(path):
1775
1815
  return True
1776
1816
  # Noise-dir pruning: os.walk never descends these, so anything beneath
1777
1817
  # one is excluded from the corpus regardless of ignore patterns.
@@ -2014,6 +2054,8 @@ def detect(root: Path, *, follow_symlinks: bool | None = None, google_workspace:
2014
2054
  if fname in _SKIP_FILES:
2015
2055
  continue
2016
2056
  p = dp / fname
2057
+ if _is_installed_graphify_file(p):
2058
+ continue
2017
2059
  if p not in seen:
2018
2060
  seen.add(p)
2019
2061
  all_files.append(p)