cg-code-graph 0.21.2__tar.gz → 0.23.0__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 (395) hide show
  1. {cg_code_graph-0.21.2/cg_code_graph.egg-info → cg_code_graph-0.23.0}/PKG-INFO +2 -2
  2. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/README.md +1 -1
  3. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/__init__.py +1 -1
  4. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/cli.py +47 -8
  5. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/indexer.py +17 -1
  6. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/link.py +84 -4
  7. cg_code_graph-0.23.0/cg_code_graph/mcp_graphs.py +481 -0
  8. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/mcp_install.py +233 -13
  9. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/mcp_server.py +271 -14
  10. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/platforms.py +32 -3
  11. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/plugin.py +55 -14
  12. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/query.py +272 -11
  13. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0/cg_code_graph.egg-info}/PKG-INFO +2 -2
  14. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/SOURCES.txt +11 -0
  15. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_dart_isolates.py +15 -0
  16. cg_code_graph-0.23.0/tests/test_dead_wrappers.py +39 -0
  17. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_django_flutter.py +4 -1
  18. cg_code_graph-0.23.0/tests/test_issue_202.py +79 -0
  19. cg_code_graph-0.23.0/tests/test_issue_205.py +36 -0
  20. cg_code_graph-0.23.0/tests/test_issue_206.py +32 -0
  21. cg_code_graph-0.23.0/tests/test_issue_208.py +45 -0
  22. cg_code_graph-0.23.0/tests/test_issue_210.py +51 -0
  23. cg_code_graph-0.23.0/tests/test_issue_211_used_at.py +71 -0
  24. cg_code_graph-0.23.0/tests/test_link_origin.py +39 -0
  25. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp_install.py +1 -1
  26. cg_code_graph-0.23.0/tests/test_mcp_multi_graph.py +349 -0
  27. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_php_http.py +2 -1
  28. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_process_runs.py +18 -0
  29. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_realtime_native.py +18 -0
  30. cg_code_graph-0.23.0/tests/test_route_specs.py +71 -0
  31. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift.py +11 -0
  32. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/LICENSE +0 -0
  33. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/MANIFEST.in +0 -0
  34. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/__main__.py +0 -0
  35. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/affected.py +0 -0
  36. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/agent_rules.py +0 -0
  37. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/agents.py +0 -0
  38. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/aitools.py +0 -0
  39. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/android_ipc.py +0 -0
  40. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/apple_ipc.py +0 -0
  41. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/apps.py +0 -0
  42. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/blindspots.py +0 -0
  43. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/bridges.py +0 -0
  44. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/brokers.py +0 -0
  45. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/concepts.py +0 -0
  46. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/config.py +0 -0
  47. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/__init__.py +0 -0
  48. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/cache.py +0 -0
  49. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/detect.py +0 -0
  50. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/env.py +0 -0
  51. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/extractors.py +0 -0
  52. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/fsutil.py +0 -0
  53. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/generated.py +0 -0
  54. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/model.py +0 -0
  55. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/paths.py +0 -0
  56. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/plugin.py +0 -0
  57. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/redact.py +0 -0
  58. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/store.py +0 -0
  59. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/syntax_errors.py +0 -0
  60. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/coverage.py +0 -0
  61. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/dart_isolates.py +0 -0
  62. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/doctor.py +0 -0
  63. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/explore.py +0 -0
  64. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/external.py +0 -0
  65. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/graphql.py +0 -0
  66. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/guard_facts.py +0 -0
  67. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/hooks.py +0 -0
  68. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/insecure_transport.py +0 -0
  69. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/jobs.py +0 -0
  70. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/lint_async.py +0 -0
  71. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/local_ipc.py +0 -0
  72. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/local_sockets.py +0 -0
  73. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/parity.py +0 -0
  74. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/parity_structure.py +0 -0
  75. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/payload.py +0 -0
  76. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plans.py +0 -0
  77. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/platform_scan.py +0 -0
  78. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/__init__.py +0 -0
  79. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
  80. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/content.py +0 -0
  81. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
  82. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  83. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  84. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  85. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
  86. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
  87. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  88. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  89. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  90. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/http.py +0 -0
  91. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/models.py +0 -0
  92. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
  93. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/program.py +0 -0
  94. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/__init__.py +0 -0
  95. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/extras.py +0 -0
  96. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/models.py +0 -0
  97. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/plugin.py +0 -0
  98. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/schemas.py +0 -0
  99. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/shapes.py +0 -0
  100. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/urls.py +0 -0
  101. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/express/__init__.py +0 -0
  102. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/express/plugin.py +0 -0
  103. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  104. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  105. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/__init__.py +0 -0
  106. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/exact.py +0 -0
  107. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/plugin.py +0 -0
  108. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  109. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/interop.py +0 -0
  110. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/spring.py +0 -0
  111. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  112. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  113. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
  114. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  115. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  116. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  117. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/massassign.py +0 -0
  118. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  119. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
  120. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/values.py +0 -0
  121. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/__init__.py +0 -0
  122. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/gates.py +0 -0
  123. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/runner.py +0 -0
  124. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/scipread.py +0 -0
  125. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/ts.py +0 -0
  126. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nest/__init__.py +0 -0
  127. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
  128. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  129. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  130. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  131. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  132. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/__init__.py +0 -0
  133. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/external.py +0 -0
  134. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  135. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  136. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  137. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/gating.py +0 -0
  138. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/http_client.py +0 -0
  139. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/inline_guards.py +0 -0
  140. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/plugin.py +0 -0
  141. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/strings.py +0 -0
  142. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/__init__.py +0 -0
  143. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/aitools.py +0 -0
  144. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/external.py +0 -0
  145. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/fields.py +0 -0
  146. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/plugin.py +0 -0
  147. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/refs.py +0 -0
  148. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/roots.py +0 -0
  149. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/socketio.py +0 -0
  150. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/subproc.py +0 -0
  151. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/tests.py +0 -0
  152. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/values.py +0 -0
  153. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  154. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  155. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
  156. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/__init__.py +0 -0
  157. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
  158. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
  159. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
  160. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/__init__.py +0 -0
  161. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/importer.py +0 -0
  162. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
  163. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  164. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  165. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  166. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/__init__.py +0 -0
  167. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  168. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/exact.py +0 -0
  169. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  170. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/packages.py +0 -0
  171. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/__init__.py +0 -0
  172. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  173. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  174. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  175. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  176. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  177. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  178. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/nav.py +0 -0
  179. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/plugin.py +0 -0
  180. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/react_router.py +0 -0
  181. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  182. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/common.py +0 -0
  183. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
  184. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/__init__.py +0 -0
  185. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
  186. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/common.yaml +0 -0
  187. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/dart.yaml +0 -0
  188. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
  189. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/django.yaml +0 -0
  190. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  191. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/express.yaml +0 -0
  192. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/java.yaml +0 -0
  193. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/kotlin.yaml +0 -0
  194. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/laravel.yaml +0 -0
  195. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nest.yaml +0 -0
  196. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nextjs.yaml +0 -0
  197. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nuxt.yaml +0 -0
  198. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/php.yaml +0 -0
  199. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/python.yaml +0 -0
  200. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/react-router.yaml +0 -0
  201. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/rust.yaml +0 -0
  202. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/spring.yaml +0 -0
  203. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/swift.yaml +0 -0
  204. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/typescript.yaml +0 -0
  205. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/process_runs.py +0 -0
  206. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/__init__.py +0 -0
  207. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/builtin.py +0 -0
  208. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/matchers.py +0 -0
  209. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/view.py +0 -0
  210. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime.py +0 -0
  211. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_events.py +0 -0
  212. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_native.py +0 -0
  213. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_ws.py +0 -0
  214. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/roundtrip.py +0 -0
  215. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/routes.py +0 -0
  216. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/rpc.py +0 -0
  217. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/sdk_systems.py +0 -0
  218. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/sockets.py +0 -0
  219. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/ssrf_input.py +0 -0
  220. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/starters.py +0 -0
  221. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/surface.py +0 -0
  222. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/tests_index.py +0 -0
  223. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/udp_apps.py +0 -0
  224. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/__init__.py +0 -0
  225. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/graph.py +0 -0
  226. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/server.py +0 -0
  227. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/app.css +0 -0
  228. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/app.js +0 -0
  229. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/index.html +0 -0
  230. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/layered.js +0 -0
  231. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  232. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  233. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  234. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  235. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  236. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
  237. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/package.json +0 -0
  238. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  239. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/watch.py +0 -0
  240. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/webhook_subs.py +0 -0
  241. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/webhooks.py +0 -0
  242. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/xcode.py +0 -0
  243. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  244. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
  245. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/requires.txt +0 -0
  246. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/top_level.txt +0 -0
  247. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/pyproject.toml +0 -0
  248. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/setup.cfg +0 -0
  249. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_affected.py +0 -0
  250. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_agents_install.py +0 -0
  251. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_agents_md.py +0 -0
  252. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ai_tools.py +0 -0
  253. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_android_ipc.py +0 -0
  254. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_apple_ipc.py +0 -0
  255. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro.py +0 -0
  256. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro_content.py +0 -0
  257. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro_server.py +0 -0
  258. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_bridges.py +0 -0
  259. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
  260. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_brokers.py +0 -0
  261. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_clean.py +0 -0
  262. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_invalidation.py +0 -0
  263. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_migration.py +0 -0
  264. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_channels_tests.py +0 -0
  265. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cli_output.py +0 -0
  266. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_completeness.py +0 -0
  267. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_config_extras.py +0 -0
  268. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_coverage.py +0 -0
  269. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_coverage_ts_hint.py +0 -0
  270. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_db_connections.py +0 -0
  271. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_dispatch_interfaces.py +0 -0
  272. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_docs_languages.py +0 -0
  273. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_docs_links.py +0 -0
  274. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_echo_ref.py +0 -0
  275. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_echo_wrapper.py +0 -0
  276. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_elysia.py +0 -0
  277. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_enum_constants.py +0 -0
  278. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_env.py +0 -0
  279. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_explore.py +0 -0
  280. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_external.py +0 -0
  281. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_fp_batch.py +0 -0
  282. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_gating.py +0 -0
  283. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_generated.py +0 -0
  284. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_graphql.py +0 -0
  285. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_hooks.py +0 -0
  286. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_impact_overrides.py +0 -0
  287. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_index_isolation.py +0 -0
  288. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_inherited_overrides.py +0 -0
  289. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_inline_guards.py +0 -0
  290. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_192.py +0 -0
  291. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_203.py +0 -0
  292. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_207.py +0 -0
  293. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_209.py +0 -0
  294. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_211.py +0 -0
  295. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_java.py +0 -0
  296. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_java_exact.py +0 -0
  297. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_jobs.py +0 -0
  298. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_js_refs.py +0 -0
  299. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_js_runtime.py +0 -0
  300. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin.py +0 -0
  301. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_binding.py +0 -0
  302. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_exact.py +0 -0
  303. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_fields.py +0 -0
  304. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_mixed.py +0 -0
  305. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_nav_consts.py +0 -0
  306. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_props.py +0 -0
  307. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_laravel_determinism.py +0 -0
  308. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_laravel_resources.py +0 -0
  309. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_lint_async.py +0 -0
  310. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_listing_files.py +0 -0
  311. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_local_ipc.py +0 -0
  312. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_local_sockets.py +0 -0
  313. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mass_assignment.py +0 -0
  314. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp.py +0 -0
  315. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp_index.py +0 -0
  316. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_cfamily.py +0 -0
  317. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_concurrency.py +0 -0
  318. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_rust.py +0 -0
  319. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_nuxt_import_dirs.py +0 -0
  320. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_nuxt_rootsrc.py +0 -0
  321. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_packaging.py +0 -0
  322. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_parity.py +0 -0
  323. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_parity_structure.py +0 -0
  324. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_php_props.py +0 -0
  325. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_plain_js.py +0 -0
  326. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_plans.py +0 -0
  327. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platform_gaps.py +0 -0
  328. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platform_type_variants.py +0 -0
  329. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platforms.py +0 -0
  330. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platforms_apple.py +0 -0
  331. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_presets_config.py +0 -0
  332. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_process_ipc.py +0 -0
  333. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_protocols.py +0 -0
  334. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_app_tests_module.py +0 -0
  335. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_collection_chains.py +0 -0
  336. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_compat.py +0 -0
  337. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_entry_refs.py +0 -0
  338. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_fields.py +0 -0
  339. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_infer_cycles.py +0 -0
  340. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_roots.py +0 -0
  341. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_subprocess_tests.py +0 -0
  342. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_tests.py +0 -0
  343. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_hosts.py +0 -0
  344. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_routes.py +0 -0
  345. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_routes_more.py +0 -0
  346. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_react_router.py +0 -0
  347. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_readers_writers_specs.py +0 -0
  348. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_realtime.py +0 -0
  349. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_redact_salt.py +0 -0
  350. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_request_keys.py +0 -0
  351. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_roundtrip.py +0 -0
  352. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_route_tables.py +0 -0
  353. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_routes_search_explain.py +0 -0
  354. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_rpc.py +0 -0
  355. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_scip_health.py +0 -0
  356. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external.py +0 -0
  357. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external_infra.py +0 -0
  358. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external_mail.py +0 -0
  359. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_snippet.py +0 -0
  360. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sockets.py +0 -0
  361. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_spring.py +0 -0
  362. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ssrf.py +0 -0
  363. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_starters_budget.py +0 -0
  364. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_surface.py +0 -0
  365. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_surface_transport.py +0 -0
  366. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_binding.py +0 -0
  367. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_exact.py +0 -0
  368. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_facts.py +0 -0
  369. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_fields.py +0 -0
  370. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_modules.py +0 -0
  371. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_more.py +0 -0
  372. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_nav_values.py +0 -0
  373. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_parse_errors.py +0 -0
  374. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_props.py +0 -0
  375. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_sdk.py +0 -0
  376. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_testing.py +0 -0
  377. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_values.py +0 -0
  378. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_tests_scope.py +0 -0
  379. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_fields.py +0 -0
  380. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_fields_js_vue.py +0 -0
  381. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_file_specs.py +0 -0
  382. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_frameworks.py +0 -0
  383. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_node_http.py +0 -0
  384. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_nuxt.py +0 -0
  385. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_src_tsconfig.py +0 -0
  386. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_unguarded.py +0 -0
  387. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_values.py +0 -0
  388. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_viz.py +0 -0
  389. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_vue_nav.py +0 -0
  390. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_watch.py +0 -0
  391. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks.py +0 -0
  392. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks_152.py +0 -0
  393. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks_152b.py +0 -0
  394. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_websockets.py +0 -0
  395. {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_workspace_link.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.21.2
3
+ Version: 0.23.0
4
4
  Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
5
5
  Author: cyberchronos00
6
6
  License-Expression: MIT
@@ -93,7 +93,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
93
93
  - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
94
94
  - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
95
95
  - Security views: `cg surface` lists the inbound / outbound attack surface and findings (hardcoded credentials, plaintext protocols, unverified webhooks, unguarded handlers, listeners on all interfaces, disabled TLS / SSH verification, plaintext gRPC, exposed IPC, outbound URLs built from request input) as text, JSON or SARIF, with `--fail-on` for CI.
96
- - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
96
+ - MCP server (`cg-mcp`) so agents query the graph instead of grepping. One server can serve many graphs (`graphs` plus an optional `graph` argument); a single `--db` stays one graph. See [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp).
97
97
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
98
98
 
99
99
  ## Docs
@@ -66,7 +66,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
66
66
  - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
67
67
  - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
68
68
  - Security views: `cg surface` lists the inbound / outbound attack surface and findings (hardcoded credentials, plaintext protocols, unverified webhooks, unguarded handlers, listeners on all interfaces, disabled TLS / SSH verification, plaintext gRPC, exposed IPC, outbound URLs built from request input) as text, JSON or SARIF, with `--fail-on` for CI.
69
- - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
69
+ - MCP server (`cg-mcp`) so agents query the graph instead of grepping. One server can serve many graphs (`graphs` plus an optional `graph` argument); a single `--db` stays one graph. See [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp).
70
70
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
71
71
 
72
72
  ## Docs
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.21.2"
2
+ __version__ = "0.23.0"
@@ -73,6 +73,13 @@ def _add_install_parser(sub, uninstall: bool):
73
73
  p.add_argument("--uninstall", action="store_true", help="remove the entry instead of writing it")
74
74
  p.add_argument("--dry-run", action="store_true", help="print the exact changes and write nothing")
75
75
  p.add_argument("--yes", action="store_true", help="skip the confirmation prompt")
76
+ if not uninstall:
77
+ p.add_argument("--registry", action="store_true",
78
+ help="global single entry: cg-mcp with no --db; graphs come from the registry")
79
+ p.add_argument("--migrate", action="store_true",
80
+ help="fold per-repo cg-* host entries into the graph registry (dry run unless --apply)")
81
+ p.add_argument("--apply", action="store_true", help="with --migrate, write the registry and the host config")
82
+ p.add_argument("--graphs", help="registry file for --migrate (default: ~/.config/cg/graphs.toml)")
76
83
 
77
84
 
78
85
  def _impact_labels(rows: list[dict], name_of, group_of) -> list[str]:
@@ -506,9 +513,14 @@ def main(argv=None):
506
513
  mcp_file=a.mcp_file, dry_run=a.dry_run, assume_yes=a.yes)
507
514
  if a.cmd in ("install", "uninstall"):
508
515
  from .mcp_install import run as run_install
516
+ registry = bool(getattr(a, "registry", False))
517
+ migrate = bool(getattr(a, "migrate", False))
518
+ if (registry or migrate) and not a.project:
519
+ a.glob = True
509
520
  return run_install(a.host, scope="global" if a.glob else "project", root=a.dir, db=a.db,
510
521
  tools=a.tools, portable=a.portable, remove=a.cmd == "uninstall" or a.uninstall,
511
- dry_run=a.dry_run, assume_yes=a.yes)
522
+ dry_run=a.dry_run, assume_yes=a.yes, registry=registry, migrate=migrate,
523
+ apply=bool(getattr(a, "apply", False)), graphs=getattr(a, "graphs", None))
512
524
  if a.cmd == "hooks":
513
525
  from . import hooks as HK
514
526
  return HK.run(a.action, root=a.dir, db=a.db, dry_run=a.dry_run, assume_yes=a.yes)
@@ -624,6 +636,8 @@ def main(argv=None):
624
636
  print(json.dumps(res, indent=1, default=str) if a.json else render_protocols(res, max_items=a.max_items))
625
637
  return
626
638
  if a.cmd == "tests":
639
+ if _unknown_route(st, a.spec, a.json):
640
+ return
627
641
  res = Q.tests_covering(st, a.spec, min_conf=a.min_confidence, near_depth=a.max_depth or None,
628
642
  unit_only=a.unit_only, exclude_roots=a.exclude_root, through_roots=a.through_roots)
629
643
  res["completeness"] = _completeness(st, res.get("targets"))
@@ -662,12 +676,17 @@ def main(argv=None):
662
676
  print(json.dumps(res, indent=1, default=str) if a.json else Q.render_search(res))
663
677
  return
664
678
  if a.cmd == "reaches":
679
+ for spec in a.specs:
680
+ if _unknown_route(st, spec, a.json):
681
+ return
665
682
  res = Q.reaches(st, a.specs, min_conf=a.min_confidence, max_depth=a.max_depth, gate=None if a.gate == "none" else a.gate,
666
683
  platform=a.platform, connection=a.connection)
667
684
  res["completeness"] = _completeness(st, [x for t in res["targets"].values() for x in t] + [i["id"] for i in res["items"]])
668
685
  print(json.dumps(res, indent=1, default=str) if a.json else Q.render_reaches(res, show_paths=not a.no_paths))
669
686
  _note(res["completeness"], a.json)
670
687
  elif a.cmd == "impact":
688
+ if _unknown_route(st, a.spec, a.json):
689
+ return
671
690
  res = Q.impact(st, a.spec, min_conf=a.min_confidence, platform=a.platform)
672
691
  if a.json:
673
692
  res["completeness"] = _completeness(st, list(res["targets"]) + [c["id"] for c in res["callers"]])
@@ -675,16 +694,19 @@ def main(argv=None):
675
694
  if res.get("platform"):
676
695
  from .platforms import render_filter
677
696
  print(render_filter(res["platform"]))
678
- if res["platform"].get("targets_not_built"):
679
- print(f"not built for {a.platform}: {', '.join(res['platform']['targets_not_built'][:6])}")
697
+ dropped = res["platform"].get("targets_not_built") or []
698
+ if dropped and res["targets"]:
699
+ print(f"not built for {a.platform}: {', '.join(dropped[:6])}")
700
+ if dropped and not res["targets"]:
701
+ msg = f"{a.spec} is not built for {a.platform}: nothing calls it there"
702
+ if Q.divergence_lists(st, a.platform, dropped):
703
+ msg += (f" (`cg platforms divergence --target {a.platform}` lists references to it that would not build)")
704
+ print(msg); return
680
705
  print(f"targets: {res['targets'][:5]}")
681
706
  if not res["targets"]:
682
707
  print(f"no method matches {a.spec!r}; try `search` with part of the name"); return
683
- if a.platform and res["targets"] and set(res["platform"]["targets_not_built"]) == set(res["targets"]):
684
- msg = f"{a.spec} is not built for {a.platform}: nothing calls it there"
685
- if Q.divergence_lists(st, a.platform, res["targets"]):
686
- msg += (f" (`cg platforms divergence --target {a.platform}` lists references to it that would not build)")
687
- print(msg); return
708
+ for d in res.get("default_arguments") or []:
709
+ print(f"via default argument: {d['src']} @ {d['file']}:{d['line']}")
688
710
  for line in Q.override_lines(res):
689
711
  print(line)
690
712
  if res.get("connections"):
@@ -740,6 +762,8 @@ def main(argv=None):
740
762
  res = Q.siblings(st, a.spec)
741
763
  print(json.dumps(res, indent=1, default=str) if a.json else Q.render_siblings(st, a.spec, res))
742
764
  elif a.cmd == "node":
765
+ if _unknown_route(st, a.spec, a.json):
766
+ return
743
767
  ids = list(dict.fromkeys(Q.resolve_targets(st, a.spec)))[:20]
744
768
  docs = [node_doc(st, nid) for nid in ids]
745
769
  if a.json:
@@ -759,10 +783,14 @@ def main(argv=None):
759
783
  if not p:
760
784
  raise SystemExit(1) # scripts can tell "no path" apart from a path
761
785
  elif a.cmd == "downstream":
786
+ if _unknown_route(st, a.spec, a.json):
787
+ return
762
788
  res = Q.downstream(st, a.spec, min_conf=a.min_confidence, max_depth=a.max_depth, gate=None if a.gate == "none" else a.gate,
763
789
  platform=a.platform)
764
790
  print(json.dumps(res, indent=1, default=str) if a.json else Q.render_downstream(res, show_paths=not a.no_paths))
765
791
  elif a.cmd == "api-calls":
792
+ if _unknown_route(st, a.spec, a.json):
793
+ return
766
794
  rows = Q.api_calls(st, a.spec)
767
795
  print(json.dumps(rows, indent=1, default=str) if a.json else Q.render_api_calls(rows))
768
796
  if not a.json:
@@ -774,6 +802,17 @@ def main(argv=None):
774
802
  doc = stats_doc(st)
775
803
  print(json.dumps(doc, indent=1, default=str) if a.json else render_stats(st, doc))
776
804
 
805
+ def _unknown_route(st, spec: str, as_json: bool) -> bool:
806
+ miss = Q.route_failure(st, spec)
807
+ if not miss:
808
+ return False
809
+ if as_json:
810
+ print(json.dumps({"error": miss["error"], "spec": miss["spec"], "suggestions": miss["suggestions"]}))
811
+ else:
812
+ print(miss["text"])
813
+ raise SystemExit(1)
814
+
815
+
777
816
  def node_doc(st, nid: str) -> dict:
778
817
  """One node with its attrs parsed and its outgoing / incoming edges (`cg node --json`, #75)."""
779
818
  n = dict(st.node(nid))
@@ -28,6 +28,19 @@ from .plugins.flutter.plugin import FlutterPlugin
28
28
  from .plugins.nest.plugin import NestPlugin
29
29
  from .plugins.nextjs.plugin import NextPlugin
30
30
  from .plugins.express.plugin import ExpressPlugin
31
+ import subprocess
32
+
33
+
34
+ def _git_head(root) -> str | None:
35
+ """Commit indexed for this root, when it is a git work tree."""
36
+ try:
37
+ proc = subprocess.run(["git", "-C", str(root), "rev-parse", "HEAD"],
38
+ capture_output=True, text=True, timeout=8)
39
+ except (OSError, subprocess.TimeoutExpired):
40
+ return None
41
+ if proc.returncode != 0:
42
+ return None
43
+ return (proc.stdout or "").strip() or None
31
44
  from .plugins.astro.plugin import AstroPlugin
32
45
  from .plugins.kotlin.plugin import KotlinPlugin
33
46
  from .plugins.java.plugin import JavaPlugin
@@ -464,6 +477,9 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
464
477
  stats["nodes"] = len(builder.nodes)
465
478
  stats["edges"] = len(builder.edges)
466
479
  stats["index_seconds"] = round(time.time() - t0, 2)
467
- store.set_meta(project=project.name, root=str(project.root), stats=stats, indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()))
480
+ head = _git_head(project.root)
481
+ extra = {"commit": head} if head else {}
482
+ store.set_meta(project=project.name, root=str(project.root), stats=stats,
483
+ indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()), **extra)
468
484
  store.db.close()
469
485
  return stats
@@ -101,20 +101,67 @@ def _method_ok(cm: str, rm: str) -> bool:
101
101
  return cm in rms or "ANY" in rms or (cm == "HEAD" and "GET" in rms)
102
102
 
103
103
 
104
+ _BASE_SEG = re.compile(r"^(api|v\d+)$", re.I)
105
+
106
+
104
107
  def suffix_candidates(path: str, routes: list[dict]):
105
- """Origin unknown: align the client path with the END of route URIs (prefix assumed to be the base)."""
108
+ """Align the client path with the end of a route only when the dropped prefix is a base path (`api`, `v1`)."""
106
109
  cs = _segs(path)
107
110
  out = []
108
111
  for r in routes:
109
112
  us = _segs(r["uri"])
110
113
  if len(us) <= len(cs):
111
114
  continue
115
+ dropped = us[:len(us) - len(cs)]
116
+ if any(not _BASE_SEG.match(seg) for seg in dropped):
117
+ continue
112
118
  ok, info = match_path("/" + "/".join(cs), "/" + "/".join(us[len(us) - len(cs):]))
113
119
  if ok and info["lit"] > 0:
114
120
  out.append((r, "suffix", info))
115
121
  return out
116
122
 
117
123
 
124
+ def known_origin_text(attrs: dict) -> str | None:
125
+ """Env placeholder or literal base URL, when the client recorded one."""
126
+ kind = attrs.get("origin_kind")
127
+ origin = attrs.get("origin") or ""
128
+ base = attrs.get("base") or {}
129
+ if not isinstance(base, dict):
130
+ base = {}
131
+ parts = [origin, base.get("placeholder") or "", base.get("value") or ""]
132
+ text = " ".join(p for p in parts if isinstance(p, str) and p)
133
+ if kind == "env" or (isinstance(origin, str) and origin.startswith("{env.")):
134
+ return text or None
135
+ if kind == "other" or "://" in text:
136
+ return text or None
137
+ return None
138
+
139
+
140
+ _GENERIC_ORIGIN = {"env", "base", "url", "api", "app", "http", "https", "host", "origin", "endpoint", "service", "internal"}
141
+
142
+
143
+ def repos_for_origin(text: str, servers: list[str]) -> list[str] | None:
144
+ """Server names named by the origin.
145
+
146
+ ``None`` when the origin is a generic API base (``API_BASE_URL``) and does not name a repo:
147
+ matching stays as it was. ``[]`` when it names a service that is not one of ``servers``.
148
+ """
149
+ low = text.lower()
150
+ hits = []
151
+ for name in servers:
152
+ token = name.lower()
153
+ if len(token) < 3:
154
+ continue
155
+ if re.search(rf"(^|[^a-z0-9]){re.escape(token)}([^a-z0-9]|$)", low):
156
+ hits.append(name)
157
+ if hits:
158
+ return hits
159
+ tokens = [t for t in re.findall(r"[a-z][a-z0-9]+", low) if t not in _GENERIC_ORIGIN]
160
+ if not tokens:
161
+ return None
162
+ return []
163
+
164
+
118
165
  def match_endpoint(method: str, path: str, routes: list[dict], origin_kind: str = "api", origin: str | None = None,
119
166
  base_prefix: str | None = None) -> dict:
120
167
  """base_prefix: path part of a configured base URL already folded into `path` (http node attrs.base); when the
@@ -388,7 +435,15 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
388
435
  targets = [s for s in server_names if (s != client or folded_self) and (client not in allow or s in allow[client])]
389
436
  pool = [rt for s in targets for rt in by_server[s]]
390
437
  bp = base_path((a.get("base") or {}).get("value") or "") if a.get("base") else None
438
+ origin_text = known_origin_text(a)
439
+ owners = repos_for_origin(origin_text, targets) if origin_text else None
440
+ if owners is not None and len(owners) == 1:
441
+ pool = [rt for rt in pool if rt["server"] == owners[0]]
391
442
  res = match_endpoint(a["method"], a["path"], pool, a.get("origin_kind", "api"), a.get("origin"), base_prefix=bp or None)
443
+ if origin_text and owners == [] and not res.get("matched") and a.get("origin_kind") != "other":
444
+ reason = res.get("reason") or ""
445
+ if reason.startswith(("no backend route", "not a backend URL")) or "suffix" in reason:
446
+ res["reason"] = "external (other origin)"
392
447
  res.update({"endpoint": ep_id, "method": a["method"], "calls": calls_by_ep.get(ep_id, []),
393
448
  "_client": client, "_servers": targets})
394
449
  results.append(res)
@@ -448,13 +503,20 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
448
503
  for sc in scen[:1]:
449
504
  db.executemany("INSERT INTO node_entry_live VALUES (?,?,?,?,?)", [(sc, *r) for r in tag_entries_rows(nodes, edges, prop, skip_gate=sc)])
450
505
  db.commit()
506
+ # call sites whose wrapper no entry point reaches are matched, but not live
507
+ live_ids = {r[0] for r in db.execute("SELECT DISTINCT node_id FROM node_entry WHERE entry_kind != 'test'")}
508
+ for r in results:
509
+ for c in r["calls"]:
510
+ c["live"] = c.get("src") in live_ids
511
+ if r["matched"] and r["calls"] and not any(c.get("live") for c in r["calls"]):
512
+ r["no_live_caller"] = True
451
513
  # ---- stats: per call site and per distinct endpoint
452
514
  n_ep = len(results)
453
515
  m_ep = sum(1 for r in results if r["matched"])
454
516
  site_match = {}
455
517
  for r in results:
456
518
  for c in r["calls"]:
457
- site_match[c["at"]] = site_match.get(c["at"], False) or bool(r["matched"])
519
+ site_match[c["at"]] = site_match.get(c["at"], False) or (bool(r["matched"]) and c.get("live", True))
458
520
  sites = list(site_match)
459
521
  m_sites = sum(1 for v in site_match.values() if v)
460
522
  conf_ct = defaultdict(int)
@@ -476,7 +538,7 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
476
538
  for r in eps:
477
539
  hit = any(rmap[m["route"]]["server"] == server for m in r["matched"])
478
540
  for c in r["calls"]:
479
- sm[c["at"]] = sm.get(c["at"], False) or hit
541
+ sm[c["at"]] = sm.get(c["at"], False) or (hit and c.get("live", True))
480
542
  pair_stats.append({"client": client, "server": server, "endpoints": len(eps),
481
543
  "endpoints_matched": sum(1 for r in eps if any(rmap[m["route"]]["server"] == server for m in r["matched"])),
482
544
  "call_sites": len(sm), "call_sites_matched": sum(1 for v in sm.values() if v)})
@@ -497,10 +559,23 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
497
559
  for name, path, _role in repos:
498
560
  got = for_graph(GraphStore(path))
499
561
  cov.update({name: next(iter(got.values()))} if len(got) == 1 else got)
562
+ commits = {}
563
+ for name, path, _role in repos:
564
+ try:
565
+ member_st = GraphStore(path)
566
+ try:
567
+ member = member_st.meta()
568
+ finally:
569
+ member_st.db.close()
570
+ except Exception:
571
+ member = {}
572
+ if member.get("commit"):
573
+ commits[name] = member["commit"]
500
574
  store.set_meta(project="+".join(names), stats=stats, repos=names, coverage=cov,
501
575
  sources={name: str(Path(path).resolve()) for name, path, _role in repos},
502
576
  repo_roles={name: role for name, _path, role in repos}, link_clients=clients, link_allow=allow,
503
- indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()))
577
+ indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()),
578
+ **({"commit": commits} if commits else {}))
504
579
  db.close()
505
580
  return {"stats": stats, "results": results, "payload_issues": issues, "uncalled_routes": uncalled,
506
581
  "webhook_subscriptions": subscriptions, "external_callbacks": callbacks}
@@ -654,6 +729,11 @@ def write_match_report(res: dict, out_prefix: str) -> None:
654
729
  at = ", ".join(sorted({c["at"] for c in r["calls"]})[:3])
655
730
  extra = f" closest={r['closest']}" if r.get("closest") else (f" near={r['near']}" if r.get("near") else "")
656
731
  L.append(f"- `{r['endpoint']}` - {r['reason']}{extra} - at {at}")
732
+ dead = [r for r in res["results"] if r.get("no_live_caller")]
733
+ if dead:
734
+ L += ["", "## Matched, no live caller", ""]
735
+ for r in dead:
736
+ L.append(f"- `{r['endpoint']}` — matched, no live caller")
657
737
  L += ["", "## Ambiguous / heuristic matches", ""]
658
738
  for r in res["results"]:
659
739
  if r["matched"] and (len(r["matched"]) > 1 or any(m["confidence"] == "heuristic" for m in r["matched"])):