graphifyy 0.9.0__tar.gz → 0.9.2__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 (298) hide show
  1. {graphifyy-0.9.0/graphifyy.egg-info → graphifyy-0.9.2}/PKG-INFO +4 -1
  2. {graphifyy-0.9.0 → graphifyy-0.9.2}/README.md +3 -0
  3. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/__main__.py +35 -3
  4. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/agents-md.md +1 -1
  5. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cache.py +38 -0
  6. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/export.py +9 -0
  7. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extract.py +441 -95
  8. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/llm.py +26 -4
  9. graphifyy-0.9.2/graphify/resolver_registry.py +85 -0
  10. graphifyy-0.9.2/graphify/ruby_resolution.py +125 -0
  11. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/watch.py +31 -0
  12. {graphifyy-0.9.0 → graphifyy-0.9.2/graphifyy.egg-info}/PKG-INFO +4 -1
  13. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/SOURCES.txt +4 -0
  14. {graphifyy-0.9.0 → graphifyy-0.9.2}/pyproject.toml +1 -2
  15. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cache.py +90 -0
  16. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_export.py +17 -0
  17. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extract.py +85 -0
  18. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_incremental.py +37 -0
  19. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_strings.py +14 -0
  20. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_java_type_resolution.py +13 -0
  21. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_js_import_resolution.py +291 -0
  22. graphifyy-0.9.2/tests/test_language_resolvers.py +74 -0
  23. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_languages.py +178 -0
  24. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_llm_backends.py +104 -0
  25. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_reflect.py +21 -0
  26. graphifyy-0.9.2/tests/test_ruby_resolution.py +195 -0
  27. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_skillgen.py +29 -1
  28. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_swift_cross_file_calls.py +23 -13
  29. {graphifyy-0.9.0 → graphifyy-0.9.2}/LICENSE +0 -0
  30. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/__init__.py +0 -0
  31. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/_minhash.py +0 -0
  32. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/affected.py +0 -0
  33. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/antigravity-rules.md +0 -0
  34. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/claude-md.md +0 -0
  35. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/gemini-md.md +0 -0
  36. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/kiro-steering.md +0 -0
  37. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/always_on/vscode-instructions.md +0 -0
  38. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/analyze.py +0 -0
  39. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/benchmark.py +0 -0
  40. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/build.py +0 -0
  41. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/callflow_html.py +0 -0
  42. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cargo_introspect.py +0 -0
  43. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/cluster.py +0 -0
  44. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/command-kilo.md +0 -0
  45. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/dedup.py +0 -0
  46. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/detect.py +0 -0
  47. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/diagnostics.py +0 -0
  48. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/__init__.py +0 -0
  49. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/base.py +0 -0
  50. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/blade.py +0 -0
  51. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/csharp.py +0 -0
  52. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/elixir.py +0 -0
  53. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/razor.py +0 -0
  54. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/extractors/zig.py +0 -0
  55. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/file_slice.py +0 -0
  56. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/global_graph.py +0 -0
  57. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/google_workspace.py +0 -0
  58. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/hooks.py +0 -0
  59. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/ids.py +0 -0
  60. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/ingest.py +0 -0
  61. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/manifest.py +0 -0
  62. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/manifest_ingest.py +0 -0
  63. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/mcp_ingest.py +0 -0
  64. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/multigraph_compat.py +0 -0
  65. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/paths.py +0 -0
  66. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/pg_introspect.py +0 -0
  67. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/prs.py +0 -0
  68. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/querylog.py +0 -0
  69. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/reflect.py +0 -0
  70. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/report.py +0 -0
  71. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/scip_ingest.py +0 -0
  72. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/security.py +0 -0
  73. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/semantic_cleanup.py +0 -0
  74. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/serve.py +0 -0
  75. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-agents.md +0 -0
  76. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-aider.md +0 -0
  77. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-amp.md +0 -0
  78. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-claw.md +0 -0
  79. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-codex.md +0 -0
  80. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-copilot.md +0 -0
  81. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-devin.md +0 -0
  82. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-droid.md +0 -0
  83. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-kilo.md +0 -0
  84. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-kiro.md +0 -0
  85. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-opencode.md +0 -0
  86. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-pi.md +0 -0
  87. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-trae.md +0 -0
  88. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-vscode.md +0 -0
  89. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill-windows.md +0 -0
  90. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skill.md +0 -0
  91. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/add-watch.md +0 -0
  92. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/exports.md +0 -0
  93. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/extraction-spec.md +0 -0
  94. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/github-and-merge.md +0 -0
  95. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/hooks.md +0 -0
  96. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/query.md +0 -0
  97. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/transcribe.md +0 -0
  98. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/agents/references/update.md +0 -0
  99. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/add-watch.md +0 -0
  100. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/exports.md +0 -0
  101. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/extraction-spec.md +0 -0
  102. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/github-and-merge.md +0 -0
  103. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/hooks.md +0 -0
  104. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/query.md +0 -0
  105. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/transcribe.md +0 -0
  106. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/amp/references/update.md +0 -0
  107. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/add-watch.md +0 -0
  108. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/exports.md +0 -0
  109. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/extraction-spec.md +0 -0
  110. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/github-and-merge.md +0 -0
  111. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/hooks.md +0 -0
  112. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/query.md +0 -0
  113. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/transcribe.md +0 -0
  114. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claude/references/update.md +0 -0
  115. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/add-watch.md +0 -0
  116. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/exports.md +0 -0
  117. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/extraction-spec.md +0 -0
  118. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/github-and-merge.md +0 -0
  119. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/hooks.md +0 -0
  120. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/query.md +0 -0
  121. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/transcribe.md +0 -0
  122. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/claw/references/update.md +0 -0
  123. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/add-watch.md +0 -0
  124. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/exports.md +0 -0
  125. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/extraction-spec.md +0 -0
  126. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/github-and-merge.md +0 -0
  127. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/hooks.md +0 -0
  128. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/query.md +0 -0
  129. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/transcribe.md +0 -0
  130. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/codex/references/update.md +0 -0
  131. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/add-watch.md +0 -0
  132. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/exports.md +0 -0
  133. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/extraction-spec.md +0 -0
  134. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/github-and-merge.md +0 -0
  135. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/hooks.md +0 -0
  136. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/query.md +0 -0
  137. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/transcribe.md +0 -0
  138. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/copilot/references/update.md +0 -0
  139. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/add-watch.md +0 -0
  140. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/exports.md +0 -0
  141. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/extraction-spec.md +0 -0
  142. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/github-and-merge.md +0 -0
  143. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/hooks.md +0 -0
  144. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/query.md +0 -0
  145. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/transcribe.md +0 -0
  146. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/droid/references/update.md +0 -0
  147. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/add-watch.md +0 -0
  148. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/exports.md +0 -0
  149. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/extraction-spec.md +0 -0
  150. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/github-and-merge.md +0 -0
  151. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/hooks.md +0 -0
  152. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/query.md +0 -0
  153. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/transcribe.md +0 -0
  154. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kilo/references/update.md +0 -0
  155. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/add-watch.md +0 -0
  156. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/exports.md +0 -0
  157. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/extraction-spec.md +0 -0
  158. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/github-and-merge.md +0 -0
  159. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/hooks.md +0 -0
  160. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/query.md +0 -0
  161. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/transcribe.md +0 -0
  162. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/kiro/references/update.md +0 -0
  163. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/add-watch.md +0 -0
  164. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/exports.md +0 -0
  165. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/extraction-spec.md +0 -0
  166. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/github-and-merge.md +0 -0
  167. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/hooks.md +0 -0
  168. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/query.md +0 -0
  169. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/transcribe.md +0 -0
  170. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/opencode/references/update.md +0 -0
  171. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/add-watch.md +0 -0
  172. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/exports.md +0 -0
  173. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/extraction-spec.md +0 -0
  174. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/github-and-merge.md +0 -0
  175. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/hooks.md +0 -0
  176. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/query.md +0 -0
  177. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/transcribe.md +0 -0
  178. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/pi/references/update.md +0 -0
  179. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/add-watch.md +0 -0
  180. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/exports.md +0 -0
  181. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/extraction-spec.md +0 -0
  182. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/github-and-merge.md +0 -0
  183. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/hooks.md +0 -0
  184. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/query.md +0 -0
  185. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/transcribe.md +0 -0
  186. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/trae/references/update.md +0 -0
  187. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/add-watch.md +0 -0
  188. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/exports.md +0 -0
  189. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/extraction-spec.md +0 -0
  190. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/github-and-merge.md +0 -0
  191. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/hooks.md +0 -0
  192. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/query.md +0 -0
  193. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/transcribe.md +0 -0
  194. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/vscode/references/update.md +0 -0
  195. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/add-watch.md +0 -0
  196. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/exports.md +0 -0
  197. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/extraction-spec.md +0 -0
  198. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/github-and-merge.md +0 -0
  199. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/hooks.md +0 -0
  200. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/query.md +0 -0
  201. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/transcribe.md +0 -0
  202. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/skills/windows/references/update.md +0 -0
  203. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/symbol_resolution.py +0 -0
  204. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/transcribe.py +0 -0
  205. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/tree_html.py +0 -0
  206. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/validate.py +0 -0
  207. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphify/wiki.py +0 -0
  208. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/dependency_links.txt +0 -0
  209. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/entry_points.txt +0 -0
  210. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/requires.txt +0 -0
  211. {graphifyy-0.9.0 → graphifyy-0.9.2}/graphifyy.egg-info/top_level.txt +0 -0
  212. {graphifyy-0.9.0 → graphifyy-0.9.2}/setup.cfg +0 -0
  213. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_affected_cli.py +0 -0
  214. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_agents_platform.py +0 -0
  215. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_analyze.py +0 -0
  216. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_anthropic_custom_endpoint.py +0 -0
  217. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_antigravity_install.py +0 -0
  218. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_astro_extraction.py +0 -0
  219. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_backend_extras.py +0 -0
  220. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_benchmark.py +0 -0
  221. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_build.py +0 -0
  222. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_callflow_html.py +0 -0
  223. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cargo_introspect.py +0 -0
  224. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_charmap_encoding.py +0 -0
  225. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_chunking.py +0 -0
  226. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_claude_cli_backend.py +0 -0
  227. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_claude_md.py +0 -0
  228. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cli_export.py +0 -0
  229. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cluster.py +0 -0
  230. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_codebuddy.py +0 -0
  231. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_confidence.py +0 -0
  232. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_cpp_preprocess.py +0 -0
  233. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_csharp_type_resolution.py +0 -0
  234. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dart.py +0 -0
  235. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dedup.py +0 -0
  236. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_detect.py +0 -0
  237. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_devin.py +0 -0
  238. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_dotnet.py +0 -0
  239. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_explain_cli.py +0 -0
  240. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extract_cli.py +0 -0
  241. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_extraction_spec_ids.py +0 -0
  242. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_falkordb_integration.py +0 -0
  243. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_file_node_id_spec.py +0 -0
  244. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_file_slice.py +0 -0
  245. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_global_graph.py +0 -0
  246. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_google_workspace.py +0 -0
  247. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_hooks.py +0 -0
  248. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_hypergraph.py +0 -0
  249. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_id_normalization_contract.py +0 -0
  250. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_image_vision.py +0 -0
  251. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_import_extension_resolution.py +0 -0
  252. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ingest.py +0 -0
  253. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install.py +0 -0
  254. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_references.py +0 -0
  255. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_roundtrip.py +0 -0
  256. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_install_upgrade.py +0 -0
  257. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_label_retry.py +0 -0
  258. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_labeling.py +0 -0
  259. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_llm_parser.py +0 -0
  260. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_manifest_ingest.py +0 -0
  261. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_mcp_ingest.py +0 -0
  262. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_minhash.py +0 -0
  263. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multigraph_compat.py +0 -0
  264. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multigraph_diagnostics.py +0 -0
  265. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_multilang.py +0 -0
  266. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_obsidian_dangling_member.py +0 -0
  267. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_obsidian_filename_cap.py +0 -0
  268. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_office_limits.py +0 -0
  269. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ollama.py +0 -0
  270. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_openai_custom_endpoint.py +0 -0
  271. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pascal.py +0 -0
  272. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_path_cli.py +0 -0
  273. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pg_introspect.py +0 -0
  274. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_pipeline.py +0 -0
  275. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_provider_registry.py +0 -0
  276. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_prs.py +0 -0
  277. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_python_import_resolution.py +0 -0
  278. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_query_cli.py +0 -0
  279. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_querylog.py +0 -0
  280. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_rationale.py +0 -0
  281. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_read_hook.py +0 -0
  282. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_report.py +0 -0
  283. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_scip_ingest.py +0 -0
  284. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_security.py +0 -0
  285. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_semantic_cleanup.py +0 -0
  286. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_semantic_similarity.py +0 -0
  287. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_serve.py +0 -0
  288. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_serve_http.py +0 -0
  289. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_swift_import_resolution.py +0 -0
  290. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_symbol_resolution.py +0 -0
  291. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_terraform.py +0 -0
  292. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_transcribe.py +0 -0
  293. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_ts_inheritance.py +0 -0
  294. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_validate.py +0 -0
  295. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_vue_extraction.py +0 -0
  296. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_watch.py +0 -0
  297. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_wheel_packaging.py +0 -0
  298. {graphifyy-0.9.0 → graphifyy-0.9.2}/tests/test_wiki.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphifyy
3
- Version: 0.9.0
3
+ Version: 0.9.2
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: MIT License
6
6
 
@@ -145,6 +145,7 @@ Dynamic: license-file
145
145
 
146
146
  <p align="center">
147
147
  <a href="https://www.ycombinator.com/companies/graphify"><img src="https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&logo=ycombinator&logoColor=white" alt="YC S26"/></a>
148
+ <a href="https://discord.gg/598Ad9zQZ"><img src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat&logo=discord&logoColor=white" alt="Discord"/></a>
148
149
  <a href="https://safishamsi.gumroad.com/l/qetvlo"><img src="https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&logo=gitbook&logoColor=white" alt="The Memory Layer"/></a>
149
150
  <a href="https://github.com/safishamsi/graphify/actions/workflows/ci.yml"><img src="https://github.com/safishamsi/graphify/actions/workflows/ci.yml/badge.svg?branch=v8" alt="CI"/></a>
150
151
  <a href="https://pypi.org/project/graphifyy/"><img src="https://img.shields.io/pypi/v/graphifyy" alt="PyPI"/></a>
@@ -562,6 +563,7 @@ These are only needed for **headless / CI extraction** (`graphify extract`). Whe
562
563
  | `GRAPHIFY_MAX_WORKERS` | AST parallelism thread count | optional — also `--max-workers` flag |
563
564
  | `GRAPHIFY_MAX_OUTPUT_TOKENS` | Raise output cap for dense corpora | optional — e.g. `32768` for large files |
564
565
  | `GRAPHIFY_API_TIMEOUT` | Per-call timeout in seconds for HTTP, claude-cli, and Anthropic SDK backends (default: 600) | optional — also `--api-timeout` flag |
566
+ | `GRAPHIFY_MAX_RETRIES` | How many times to retry a rate-limited (429) request before giving up (default: 6; honors `Retry-After`) | optional — raise for strict per-org limits (e.g. kimi); `0` disables |
565
567
  | `GRAPHIFY_FORCE` | Force graph rebuild even with fewer nodes | optional — also `--force` flag |
566
568
  | `GRAPHIFY_GOOGLE_WORKSPACE` | Auto-enable Google Workspace export | optional — set to `1` |
567
569
  | `GRAPHIFY_TRIAGE_BACKEND` | Backend for `graphify prs --triage` | optional — auto-detected from available keys |
@@ -755,6 +757,7 @@ graphify extract ./docs --api-timeout 900 # longer HTTP timeout for slow lo
755
757
  graphify extract ./docs --google-workspace # export .gdoc/.gsheet/.gslides via gws before extraction
756
758
  graphify extract ./docs --mode deep # richer semantic extraction via extended system prompt
757
759
  graphify extract ./docs --no-cluster # raw extraction only, skip clustering
760
+ graphify extract ./docs --timing # print per-stage wall-clock timings to stderr (also works on cluster-only)
758
761
  graphify extract ./docs --force # overwrite graph.json even if new graph has fewer nodes (use after refactors or to clear ghost duplicates)
759
762
  graphify extract ./docs --dedup-llm # LLM tiebreaker for ambiguous entity pairs (uses same API key)
760
763
  graphify extract ./docs --global --as myrepo # extract and register into the cross-project global graph
@@ -8,6 +8,7 @@
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.ycombinator.com/companies/graphify"><img src="https://img.shields.io/badge/Y%20Combinator-S26-F0652F?style=flat&logo=ycombinator&logoColor=white" alt="YC S26"/></a>
11
+ <a href="https://discord.gg/598Ad9zQZ"><img src="https://img.shields.io/badge/Discord-Join-5865F2?style=flat&logo=discord&logoColor=white" alt="Discord"/></a>
11
12
  <a href="https://safishamsi.gumroad.com/l/qetvlo"><img src="https://img.shields.io/badge/Book-The%20Memory%20Layer-2ea44f?style=flat&logo=gitbook&logoColor=white" alt="The Memory Layer"/></a>
12
13
  <a href="https://github.com/safishamsi/graphify/actions/workflows/ci.yml"><img src="https://github.com/safishamsi/graphify/actions/workflows/ci.yml/badge.svg?branch=v8" alt="CI"/></a>
13
14
  <a href="https://pypi.org/project/graphifyy/"><img src="https://img.shields.io/pypi/v/graphifyy" alt="PyPI"/></a>
@@ -425,6 +426,7 @@ These are only needed for **headless / CI extraction** (`graphify extract`). Whe
425
426
  | `GRAPHIFY_MAX_WORKERS` | AST parallelism thread count | optional — also `--max-workers` flag |
426
427
  | `GRAPHIFY_MAX_OUTPUT_TOKENS` | Raise output cap for dense corpora | optional — e.g. `32768` for large files |
427
428
  | `GRAPHIFY_API_TIMEOUT` | Per-call timeout in seconds for HTTP, claude-cli, and Anthropic SDK backends (default: 600) | optional — also `--api-timeout` flag |
429
+ | `GRAPHIFY_MAX_RETRIES` | How many times to retry a rate-limited (429) request before giving up (default: 6; honors `Retry-After`) | optional — raise for strict per-org limits (e.g. kimi); `0` disables |
428
430
  | `GRAPHIFY_FORCE` | Force graph rebuild even with fewer nodes | optional — also `--force` flag |
429
431
  | `GRAPHIFY_GOOGLE_WORKSPACE` | Auto-enable Google Workspace export | optional — set to `1` |
430
432
  | `GRAPHIFY_TRIAGE_BACKEND` | Backend for `graphify prs --triage` | optional — auto-detected from available keys |
@@ -618,6 +620,7 @@ graphify extract ./docs --api-timeout 900 # longer HTTP timeout for slow lo
618
620
  graphify extract ./docs --google-workspace # export .gdoc/.gsheet/.gslides via gws before extraction
619
621
  graphify extract ./docs --mode deep # richer semantic extraction via extended system prompt
620
622
  graphify extract ./docs --no-cluster # raw extraction only, skip clustering
623
+ graphify extract ./docs --timing # print per-stage wall-clock timings to stderr (also works on cluster-only)
621
624
  graphify extract ./docs --force # overwrite graph.json even if new graph has fewer nodes (use after refactors or to clear ghost duplicates)
622
625
  graphify extract ./docs --dedup-llm # LLM tiebreaker for ambiguous entity pairs (uses same API key)
623
626
  graphify extract ./docs --global --as myrepo # extract and register into the cross-project global graph
@@ -462,8 +462,8 @@ def _skill_registration(skill_path: str = "~/.claude/skills/graphify/SKILL.md")
462
462
  "\n# graphify\n"
463
463
  f"- **graphify** (`{skill_path}`) "
464
464
  "- any input to knowledge graph. Trigger: `/graphify`\n"
465
- "When the user types `/graphify`, invoke the Skill tool "
466
- "with `skill: \"graphify\"` before doing anything else.\n"
465
+ "When the user types `/graphify`, use the installed graphify skill "
466
+ "or instructions before doing anything else.\n"
467
467
  )
468
468
 
469
469
 
@@ -2970,13 +2970,18 @@ def main() -> None:
2970
2970
 
2971
2971
  p = _ap.ArgumentParser(prog="graphify save-result")
2972
2972
  p.add_argument("--question", required=True)
2973
- p.add_argument("--answer", required=True)
2973
+ p.add_argument("--answer", default=None)
2974
+ p.add_argument("--answer-file", dest="answer_file", default=None)
2974
2975
  p.add_argument("--type", dest="query_type", default="query")
2975
2976
  p.add_argument("--nodes", nargs="*", default=[])
2976
2977
  p.add_argument("--outcome", choices=("useful", "dead_end", "corrected"), default=None)
2977
2978
  p.add_argument("--correction", default=None)
2978
2979
  p.add_argument("--memory-dir", default=str(Path(_GRAPHIFY_OUT) / "memory"))
2979
2980
  opts = p.parse_args(sys.argv[2:])
2981
+ if opts.answer_file:
2982
+ opts.answer = Path(opts.answer_file).read_text(encoding="utf-8").strip()
2983
+ elif not opts.answer:
2984
+ p.error("--answer or --answer-file is required")
2980
2985
  from graphify.ingest import save_query_result as _sqr
2981
2986
 
2982
2987
  out = _sqr(
@@ -4546,6 +4551,7 @@ def main() -> None:
4546
4551
  # Semantic extraction on docs/papers/images. Check cache first.
4547
4552
  from graphify.cache import (
4548
4553
  check_semantic_cache as _check_semantic_cache,
4554
+ prune_semantic_cache as _prune_semantic_cache,
4549
4555
  save_semantic_cache as _save_semantic_cache,
4550
4556
  )
4551
4557
  sem_result: dict = {
@@ -4636,6 +4642,32 @@ def main() -> None:
4636
4642
  sem_result["hyperedges"].extend(fresh.get("hyperedges", []))
4637
4643
  sem_result["input_tokens"] += fresh.get("input_tokens", 0)
4638
4644
  sem_result["output_tokens"] += fresh.get("output_tokens", 0)
4645
+
4646
+ # Prune orphaned semantic cache entries. The semantic cache is
4647
+ # content-hash-keyed and unversioned, so it is never swept by the AST
4648
+ # version-cleanup: every content change or file deletion leaves a
4649
+ # permanent orphan that accumulates unbounded (#1527). Sweep it against
4650
+ # the FULL live document set (``files_by_type`` — present in both the
4651
+ # incremental and full branches), NOT the incremental ``semantic_files``
4652
+ # changed-subset, which would delete every unchanged doc's valid entry.
4653
+ # Best-effort: a prune failure must never break extraction.
4654
+ try:
4655
+ from graphify.cache import file_hash as _file_hash
4656
+ _live_hashes: set[str] = set()
4657
+ for _kind in ("document", "paper", "image"):
4658
+ for _fp in files_by_type.get(_kind, []):
4659
+ _abs = Path(_fp)
4660
+ if not _abs.is_absolute():
4661
+ _abs = Path(out_root) / _abs
4662
+ if not _abs.is_file():
4663
+ continue # deleted/missing — leave out so its entry is pruned
4664
+ try:
4665
+ _live_hashes.add(_file_hash(_abs, out_root))
4666
+ except OSError:
4667
+ pass
4668
+ _prune_semantic_cache(out_root, _live_hashes)
4669
+ except Exception as exc:
4670
+ print(f"[graphify extract] warning: could not prune semantic cache: {exc}", file=sys.stderr)
4639
4671
  stages.mark("semantic extract")
4640
4672
 
4641
4673
  pg_result: dict = {"nodes": [], "edges": []}
@@ -2,7 +2,7 @@
2
2
 
3
3
  This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
4
4
 
5
- When the user types `/graphify`, invoke the `skill` tool with `skill: "graphify"` before doing anything else.
5
+ When the user types `/graphify`, use the installed graphify skill or instructions before doing anything else.
6
6
 
7
7
  Rules:
8
8
  - For codebase questions, first run `graphify query "<question>"` when graphify-out/graph.json exists. Use `graphify path "<A>" "<B>"` for relationships and `graphify explain "<concept>"` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output.
@@ -407,6 +407,44 @@ def clear_cache(root: Path = Path(".")) -> None:
407
407
  f.unlink()
408
408
 
409
409
 
410
+ def prune_semantic_cache(root: Path, live_hashes: set[str]) -> int:
411
+ """Remove orphaned semantic cache entries, returning the count pruned.
412
+
413
+ The semantic cache is content-hash-keyed (``{file_hash}.json`` under
414
+ ``cache/semantic/``) and deliberately UNVERSIONED — entries are produced by
415
+ the LLM from file contents, so invalidating them on every release would
416
+ re-bill extraction. Because it is unversioned it is also never swept by the
417
+ AST version-cleanup, so every content change or file deletion leaves a
418
+ permanent orphan entry that accumulates unbounded.
419
+
420
+ This sweeps ``cache/semantic/*.json`` and deletes any entry whose stem (the
421
+ content hash) is not in ``live_hashes`` — the hashes of the current live
422
+ document set. ``*.tmp`` atomic-write temporaries are skipped, and only this
423
+ directory is touched (never ``cache/ast/**`` or anything else). The
424
+ unversioned design is preserved: we prune by liveness, not by version.
425
+
426
+ Best-effort, mirroring :func:`_cleanup_stale_ast_entries`: each unlink is
427
+ wrapped in ``try/except OSError`` and a failure is ignored. The worst-case
428
+ failure mode is benign — a surviving orphan costs only one re-extraction of
429
+ one doc on a future run, never incorrect output.
430
+ """
431
+ _out = Path(_GRAPHIFY_OUT)
432
+ base = _out if _out.is_absolute() else Path(root).resolve() / _out
433
+ semantic_dir = base / "cache" / "semantic"
434
+ if not semantic_dir.is_dir():
435
+ return 0
436
+ pruned = 0
437
+ for entry in semantic_dir.glob("*.json"):
438
+ if entry.stem in live_hashes:
439
+ continue
440
+ try:
441
+ entry.unlink()
442
+ pruned += 1
443
+ except OSError:
444
+ pass
445
+ return pruned
446
+
447
+
410
448
  def check_semantic_cache(
411
449
  files: list[str],
412
450
  root: Path = Path("."),
@@ -1535,6 +1535,15 @@ def to_graphml(
1535
1535
  for _, _, attrs in H.edges(data=True):
1536
1536
  for k in [k for k in attrs if k.startswith("_")]:
1537
1537
  del attrs[k]
1538
+ # nx.write_graphml raises ValueError on None attribute values; replace with "".
1539
+ for node_id in H.nodes():
1540
+ for key, val in list(H.nodes[node_id].items()):
1541
+ if val is None:
1542
+ H.nodes[node_id][key] = ""
1543
+ for u, v in H.edges():
1544
+ for key, val in list(H.edges[u, v].items()):
1545
+ if val is None:
1546
+ H.edges[u, v][key] = ""
1538
1547
  nx.write_graphml(H, output_path)
1539
1548
 
1540
1549