cg-code-graph 0.17.0__tar.gz → 0.19.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 (354) hide show
  1. {cg_code_graph-0.17.0/cg_code_graph.egg-info → cg_code_graph-0.19.0}/PKG-INFO +8 -6
  2. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/README.md +6 -5
  3. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/__init__.py +1 -1
  4. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/agent_rules.py +2 -0
  5. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/cli.py +4 -4
  6. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/cache.py +1 -1
  7. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/detect.py +37 -0
  8. cg_code_graph-0.19.0/cg_code_graph/core/env.py +78 -0
  9. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/syntax_errors.py +2 -0
  10. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/coverage.py +25 -13
  11. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/doctor.py +59 -5
  12. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/hooks.py +10 -4
  13. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/indexer.py +19 -2
  14. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/link.py +11 -1
  15. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/mcp_server.py +3 -3
  16. cg_code_graph-0.19.0/cg_code_graph/plugins/express/plugin.py +924 -0
  17. cg_code_graph-0.19.0/cg_code_graph/plugins/java/exact.py +352 -0
  18. cg_code_graph-0.19.0/cg_code_graph/plugins/java/plugin.py +1005 -0
  19. cg_code_graph-0.19.0/cg_code_graph/plugins/jvm/__init__.py +1 -0
  20. cg_code_graph-0.19.0/cg_code_graph/plugins/jvm/interop.py +212 -0
  21. cg_code_graph-0.19.0/cg_code_graph/plugins/jvm/spring.py +959 -0
  22. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/kotlin/exact.py +232 -39
  23. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/kotlin/plugin.py +54 -212
  24. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/extractor/extract.php +4 -3
  25. cg_code_graph-0.19.0/cg_code_graph/plugins/php/http_client.py +1003 -0
  26. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/plugin.py +2 -0
  27. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/stubs/plugins.py +2 -1
  28. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +9 -1
  29. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +27 -10
  30. cg_code_graph-0.19.0/cg_code_graph/plugins/ts/extractor/rr.mjs +748 -0
  31. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/plugin.py +6 -1
  32. cg_code_graph-0.19.0/cg_code_graph/plugins/ts/react_router.py +265 -0
  33. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/tsweb/common.py +13 -3
  34. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/__init__.py +3 -2
  35. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/express.yaml +1 -1
  36. cg_code_graph-0.19.0/cg_code_graph/presets/java.yaml +5 -0
  37. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/kotlin.yaml +1 -3
  38. cg_code_graph-0.19.0/cg_code_graph/presets/react-router.yaml +3 -0
  39. cg_code_graph-0.19.0/cg_code_graph/presets/spring.yaml +22 -0
  40. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/query.py +26 -2
  41. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/routes.py +2 -2
  42. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/tests_index.py +8 -1
  43. cg_code_graph-0.19.0/cg_code_graph/viz/__init__.py +0 -0
  44. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0/cg_code_graph.egg-info}/PKG-INFO +8 -6
  45. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph.egg-info/SOURCES.txt +19 -0
  46. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph.egg-info/requires.txt +1 -0
  47. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/pyproject.toml +1 -0
  48. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_bridges.py +2 -2
  49. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_cache_clean.py +3 -3
  50. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_cache_migration.py +1 -1
  51. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_coverage.py +6 -5
  52. cg_code_graph-0.19.0/tests/test_docs_languages.py +70 -0
  53. cg_code_graph-0.19.0/tests/test_elysia.py +151 -0
  54. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_env.py +18 -16
  55. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_hooks.py +36 -1
  56. cg_code_graph-0.19.0/tests/test_java.py +225 -0
  57. cg_code_graph-0.19.0/tests/test_java_exact.py +308 -0
  58. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_mixed.py +20 -17
  59. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_mcp_index.py +2 -1
  60. cg_code_graph-0.19.0/tests/test_php_http.py +270 -0
  61. cg_code_graph-0.19.0/tests/test_react_router.py +246 -0
  62. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_routes_search_explain.py +3 -3
  63. cg_code_graph-0.19.0/tests/test_spring.py +159 -0
  64. cg_code_graph-0.17.0/cg_code_graph/core/env.py +0 -83
  65. cg_code_graph-0.17.0/cg_code_graph/plugins/express/plugin.py +0 -435
  66. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/LICENSE +0 -0
  67. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/MANIFEST.in +0 -0
  68. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/__main__.py +0 -0
  69. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/affected.py +0 -0
  70. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/agents.py +0 -0
  71. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/aitools.py +0 -0
  72. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/android_ipc.py +0 -0
  73. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/apple_ipc.py +0 -0
  74. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/apps.py +0 -0
  75. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/blindspots.py +0 -0
  76. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/bridges.py +0 -0
  77. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/brokers.py +0 -0
  78. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/concepts.py +0 -0
  79. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/config.py +0 -0
  80. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/__init__.py +0 -0
  81. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/extractors.py +0 -0
  82. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/fsutil.py +0 -0
  83. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/generated.py +0 -0
  84. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/model.py +0 -0
  85. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/paths.py +0 -0
  86. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/plugin.py +0 -0
  87. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/core/store.py +0 -0
  88. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/dart_isolates.py +0 -0
  89. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/explore.py +0 -0
  90. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/external.py +0 -0
  91. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/graphql.py +0 -0
  92. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/jobs.py +0 -0
  93. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/lint_async.py +0 -0
  94. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/local_ipc.py +0 -0
  95. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/local_sockets.py +0 -0
  96. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/mcp_install.py +0 -0
  97. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/parity.py +0 -0
  98. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/parity_structure.py +0 -0
  99. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/payload.py +0 -0
  100. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plans.py +0 -0
  101. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/platform_scan.py +0 -0
  102. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/platforms.py +0 -0
  103. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/__init__.py +0 -0
  104. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
  105. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/astro/content.py +0 -0
  106. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
  107. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  108. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  109. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  110. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
  111. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
  112. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  113. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  114. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  115. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/http.py +0 -0
  116. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/models.py +0 -0
  117. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
  118. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/dart/program.py +0 -0
  119. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/__init__.py +0 -0
  120. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/extras.py +0 -0
  121. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/models.py +0 -0
  122. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/plugin.py +0 -0
  123. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/schemas.py +0 -0
  124. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/shapes.py +0 -0
  125. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/django/urls.py +0 -0
  126. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/express/__init__.py +0 -0
  127. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  128. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  129. {cg_code_graph-0.17.0/cg_code_graph/plugins/kotlin → cg_code_graph-0.19.0/cg_code_graph/plugins/java}/__init__.py +0 -0
  130. {cg_code_graph-0.17.0/cg_code_graph/plugins/laravel → cg_code_graph-0.19.0/cg_code_graph/plugins/kotlin}/__init__.py +0 -0
  131. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  132. {cg_code_graph-0.17.0/cg_code_graph/plugins/native → cg_code_graph-0.19.0/cg_code_graph/plugins/laravel}/__init__.py +0 -0
  133. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  134. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  135. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
  136. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/laravel/values.py +0 -0
  137. {cg_code_graph-0.17.0/cg_code_graph/plugins/nest → cg_code_graph-0.19.0/cg_code_graph/plugins/native}/__init__.py +0 -0
  138. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/native/gates.py +0 -0
  139. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/native/runner.py +0 -0
  140. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/native/scipread.py +0 -0
  141. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/native/ts.py +0 -0
  142. {cg_code_graph-0.17.0/cg_code_graph/plugins/nextjs → cg_code_graph-0.19.0/cg_code_graph/plugins/nest}/__init__.py +0 -0
  143. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
  144. {cg_code_graph-0.17.0/cg_code_graph/plugins/nuxt → cg_code_graph-0.19.0/cg_code_graph/plugins/nextjs}/__init__.py +0 -0
  145. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  146. {cg_code_graph-0.17.0/cg_code_graph/plugins/php → cg_code_graph-0.19.0/cg_code_graph/plugins/nuxt}/__init__.py +0 -0
  147. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  148. {cg_code_graph-0.17.0/cg_code_graph/plugins/python → cg_code_graph-0.19.0/cg_code_graph/plugins/php}/__init__.py +0 -0
  149. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/external.py +0 -0
  150. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  151. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  152. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/gating.py +0 -0
  153. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/php/strings.py +0 -0
  154. {cg_code_graph-0.17.0/cg_code_graph/plugins/pyweb → cg_code_graph-0.19.0/cg_code_graph/plugins/python}/__init__.py +0 -0
  155. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/aitools.py +0 -0
  156. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/external.py +0 -0
  157. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/fields.py +0 -0
  158. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/plugin.py +0 -0
  159. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/refs.py +0 -0
  160. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/roots.py +0 -0
  161. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/socketio.py +0 -0
  162. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/subproc.py +0 -0
  163. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/tests.py +0 -0
  164. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/python/values.py +0 -0
  165. {cg_code_graph-0.17.0/cg_code_graph/plugins/rust → cg_code_graph-0.19.0/cg_code_graph/plugins/pyweb}/__init__.py +0 -0
  166. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  167. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
  168. {cg_code_graph-0.17.0/cg_code_graph/plugins/scip → cg_code_graph-0.19.0/cg_code_graph/plugins/rust}/__init__.py +0 -0
  169. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
  170. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
  171. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
  172. {cg_code_graph-0.17.0/cg_code_graph/plugins/stubs → cg_code_graph-0.19.0/cg_code_graph/plugins/scip}/__init__.py +0 -0
  173. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/scip/importer.py +0 -0
  174. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
  175. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  176. {cg_code_graph-0.17.0/cg_code_graph/plugins/swift → cg_code_graph-0.19.0/cg_code_graph/plugins/stubs}/__init__.py +0 -0
  177. {cg_code_graph-0.17.0/cg_code_graph/plugins/ts → cg_code_graph-0.19.0/cg_code_graph/plugins/swift}/__init__.py +0 -0
  178. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  179. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/swift/exact.py +0 -0
  180. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  181. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/swift/packages.py +0 -0
  182. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/swift/plugin.py +0 -0
  183. {cg_code_graph-0.17.0/cg_code_graph/plugins/tsweb → cg_code_graph-0.19.0/cg_code_graph/plugins/ts}/__init__.py +0 -0
  184. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  185. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  186. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  187. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/ts/nav.py +0 -0
  188. {cg_code_graph-0.17.0/cg_code_graph/viz → cg_code_graph-0.19.0/cg_code_graph/plugins/tsweb}/__init__.py +0 -0
  189. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
  190. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
  191. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/common.yaml +0 -0
  192. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/dart.yaml +0 -0
  193. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
  194. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/django.yaml +0 -0
  195. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  196. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/laravel.yaml +0 -0
  197. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/nest.yaml +0 -0
  198. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/nextjs.yaml +0 -0
  199. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/nuxt.yaml +0 -0
  200. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/php.yaml +0 -0
  201. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/python.yaml +0 -0
  202. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/rust.yaml +0 -0
  203. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/swift.yaml +0 -0
  204. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/presets/typescript.yaml +0 -0
  205. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/process_runs.py +0 -0
  206. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/protocols/__init__.py +0 -0
  207. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/protocols/builtin.py +0 -0
  208. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/protocols/matchers.py +0 -0
  209. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/protocols/view.py +0 -0
  210. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/realtime.py +0 -0
  211. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/realtime_events.py +0 -0
  212. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/realtime_native.py +0 -0
  213. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/realtime_ws.py +0 -0
  214. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/roundtrip.py +0 -0
  215. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/rpc.py +0 -0
  216. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/sdk_systems.py +0 -0
  217. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/sockets.py +0 -0
  218. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/starters.py +0 -0
  219. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/udp_apps.py +0 -0
  220. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/graph.py +0 -0
  221. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/server.py +0 -0
  222. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/app.css +0 -0
  223. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/app.js +0 -0
  224. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/index.html +0 -0
  225. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/layered.js +0 -0
  226. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  227. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  228. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  229. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  230. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  231. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
  232. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/tools/package.json +0 -0
  233. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  234. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/watch.py +0 -0
  235. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/webhooks.py +0 -0
  236. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph/xcode.py +0 -0
  237. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  238. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
  239. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/cg_code_graph.egg-info/top_level.txt +0 -0
  240. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/setup.cfg +0 -0
  241. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_affected.py +0 -0
  242. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_agents_install.py +0 -0
  243. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_agents_md.py +0 -0
  244. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ai_tools.py +0 -0
  245. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_android_ipc.py +0 -0
  246. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_apple_ipc.py +0 -0
  247. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_astro.py +0 -0
  248. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_astro_content.py +0 -0
  249. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_astro_server.py +0 -0
  250. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
  251. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_brokers.py +0 -0
  252. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_cache_invalidation.py +0 -0
  253. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_channels_tests.py +0 -0
  254. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_cli_output.py +0 -0
  255. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_completeness.py +0 -0
  256. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_config_extras.py +0 -0
  257. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_coverage_ts_hint.py +0 -0
  258. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_dart_isolates.py +0 -0
  259. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_dispatch_interfaces.py +0 -0
  260. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_django_flutter.py +0 -0
  261. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_docs_links.py +0 -0
  262. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_enum_constants.py +0 -0
  263. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_explore.py +0 -0
  264. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_external.py +0 -0
  265. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_gating.py +0 -0
  266. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_generated.py +0 -0
  267. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_graphql.py +0 -0
  268. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_impact_overrides.py +0 -0
  269. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_index_isolation.py +0 -0
  270. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_inherited_overrides.py +0 -0
  271. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_jobs.py +0 -0
  272. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_js_refs.py +0 -0
  273. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_js_runtime.py +0 -0
  274. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin.py +0 -0
  275. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_binding.py +0 -0
  276. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_exact.py +0 -0
  277. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_fields.py +0 -0
  278. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_nav_consts.py +0 -0
  279. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_kotlin_props.py +0 -0
  280. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_laravel_determinism.py +0 -0
  281. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_laravel_resources.py +0 -0
  282. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_lint_async.py +0 -0
  283. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_local_ipc.py +0 -0
  284. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_local_sockets.py +0 -0
  285. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_mcp.py +0 -0
  286. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_mcp_install.py +0 -0
  287. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_native_cfamily.py +0 -0
  288. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_native_concurrency.py +0 -0
  289. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_native_rust.py +0 -0
  290. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_nuxt_import_dirs.py +0 -0
  291. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_nuxt_rootsrc.py +0 -0
  292. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_packaging.py +0 -0
  293. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_parity.py +0 -0
  294. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_parity_structure.py +0 -0
  295. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_php_props.py +0 -0
  296. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_plain_js.py +0 -0
  297. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_plans.py +0 -0
  298. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_platform_gaps.py +0 -0
  299. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_platform_type_variants.py +0 -0
  300. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_platforms.py +0 -0
  301. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_platforms_apple.py +0 -0
  302. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_presets_config.py +0 -0
  303. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_process_ipc.py +0 -0
  304. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_process_runs.py +0 -0
  305. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_protocols.py +0 -0
  306. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_app_tests_module.py +0 -0
  307. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_collection_chains.py +0 -0
  308. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_compat.py +0 -0
  309. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_entry_refs.py +0 -0
  310. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_fields.py +0 -0
  311. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_infer_cycles.py +0 -0
  312. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_roots.py +0 -0
  313. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_subprocess_tests.py +0 -0
  314. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_tests.py +0 -0
  315. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_web_hosts.py +0 -0
  316. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_web_routes.py +0 -0
  317. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_python_web_routes_more.py +0 -0
  318. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_realtime.py +0 -0
  319. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_realtime_native.py +0 -0
  320. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_roundtrip.py +0 -0
  321. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_route_tables.py +0 -0
  322. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_rpc.py +0 -0
  323. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_scip_health.py +0 -0
  324. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_sdk_external.py +0 -0
  325. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_snippet.py +0 -0
  326. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_sockets.py +0 -0
  327. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_starters_budget.py +0 -0
  328. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift.py +0 -0
  329. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_binding.py +0 -0
  330. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_exact.py +0 -0
  331. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_facts.py +0 -0
  332. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_fields.py +0 -0
  333. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_modules.py +0 -0
  334. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_more.py +0 -0
  335. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_nav_values.py +0 -0
  336. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_parse_errors.py +0 -0
  337. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_props.py +0 -0
  338. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_sdk.py +0 -0
  339. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_testing.py +0 -0
  340. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_swift_values.py +0 -0
  341. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_tests_scope.py +0 -0
  342. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_fields.py +0 -0
  343. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_fields_js_vue.py +0 -0
  344. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_file_specs.py +0 -0
  345. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_frameworks.py +0 -0
  346. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_nuxt.py +0 -0
  347. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_ts_src_tsconfig.py +0 -0
  348. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_values.py +0 -0
  349. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_viz.py +0 -0
  350. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_vue_nav.py +0 -0
  351. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_watch.py +0 -0
  352. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_webhooks.py +0 -0
  353. {cg_code_graph-0.17.0 → cg_code_graph-0.19.0}/tests/test_websockets.py +0 -0
  354. {cg_code_graph-0.17.0 → cg_code_graph-0.19.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.17.0
3
+ Version: 0.19.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
@@ -17,6 +17,7 @@ Requires-Dist: tree-sitter-rust>=0.23
17
17
  Requires-Dist: tree-sitter-c>=0.23
18
18
  Requires-Dist: tree-sitter-cpp>=0.23
19
19
  Requires-Dist: tree-sitter-kotlin>=1.0
20
+ Requires-Dist: tree-sitter-java>=0.23
20
21
  Requires-Dist: tree-sitter-swift<0.7.4,>=0.6
21
22
  Provides-Extra: dev
22
23
  Requires-Dist: pytest>=8; extra == "dev"
@@ -73,20 +74,21 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
73
74
  | Language | Frameworks and facts | Calls | Docs |
74
75
  |---|---|---|---|
75
76
  | ![Python](https://img.shields.io/badge/Python-3776AB?logo=python&logoColor=white) | Django (+ DRF, django-ninja), FastAPI / Starlette, Flask, Celery | exact (stdlib `ast`) | [Python](https://code-graph.cyberchronos00.workers.dev/docs/python) |
76
- | ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white) ![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black) | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
77
- | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes and middleware, queues, broadcasting) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
77
+ | ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white) ![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black) | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono, Elysia, React Router / Remix | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
78
+ | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes, middleware, queues, broadcasting, outbound HTTP) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
78
79
  | ![Dart](https://img.shields.io/badge/Dart-0175C2?logo=dart&logoColor=white) | Flutter | exact (Dart analyzer; needs the Dart SDK) | [Platforms](https://code-graph.cyberchronos00.workers.dev/docs/platforms) |
79
- | ![Kotlin](https://img.shields.io/badge/Kotlin-7F52FF?logo=kotlin&logoColor=white) | Android, Kotlin Multiplatform | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
80
+ | ![Kotlin](https://img.shields.io/badge/Kotlin-7F52FF?logo=kotlin&logoColor=white) | Android, Kotlin Multiplatform, Spring | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
81
+ | ![Java](https://img.shields.io/badge/Java-ED8B00?logo=openjdk&logoColor=white) | Spring (routes, guards, beans, tables, clients) | heuristic; exact with scip-java (opt-in) | [Java](https://code-graph.cyberchronos00.workers.dev/docs/java) |
80
82
  | ![Swift](https://img.shields.io/badge/Swift-F05138?logo=swift&logoColor=white) | iOS / SwiftPM | heuristic; exact with the Swift index store (opt-in) | [Swift](https://code-graph.cyberchronos00.workers.dev/docs/swift) |
81
83
  | ![Rust](https://img.shields.io/badge/Rust-000000?logo=rust&logoColor=white) ![C](https://img.shields.io/badge/C-A8B9CC?logo=c&logoColor=black) ![C++](https://img.shields.io/badge/C++-00599C?logo=cplusplus&logoColor=white) | crates / modules, entry points, FFI, `#[cfg]` / `#if` gates | heuristic; exact with rust-analyzer / scip-clang | [Rust, C and C++](https://code-graph.cyberchronos00.workers.dev/docs/native) |
82
84
 
83
- Go, Java and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor` to see exact / heuristic per language on your machine.
85
+ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor` to see exact / heuristic per language on your machine.
84
86
 
85
87
  ## What you get
86
88
 
87
89
  - `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
88
90
  - `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
89
- - Frontend ↔ backend: `cg link` matches client HTTP calls to server routes across repos.
91
+ - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
90
92
  - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
91
93
  - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
92
94
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
@@ -47,20 +47,21 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
47
47
  | Language | Frameworks and facts | Calls | Docs |
48
48
  |---|---|---|---|
49
49
  | ![Python](https://img.shields.io/badge/Python-3776AB?logo=python&logoColor=white) | Django (+ DRF, django-ninja), FastAPI / Starlette, Flask, Celery | exact (stdlib `ast`) | [Python](https://code-graph.cyberchronos00.workers.dev/docs/python) |
50
- | ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white) ![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black) | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
51
- | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes and middleware, queues, broadcasting) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
50
+ | ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white) ![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?logo=javascript&logoColor=black) | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono, Elysia, React Router / Remix | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
51
+ | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes, middleware, queues, broadcasting, outbound HTTP) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
52
52
  | ![Dart](https://img.shields.io/badge/Dart-0175C2?logo=dart&logoColor=white) | Flutter | exact (Dart analyzer; needs the Dart SDK) | [Platforms](https://code-graph.cyberchronos00.workers.dev/docs/platforms) |
53
- | ![Kotlin](https://img.shields.io/badge/Kotlin-7F52FF?logo=kotlin&logoColor=white) | Android, Kotlin Multiplatform | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
53
+ | ![Kotlin](https://img.shields.io/badge/Kotlin-7F52FF?logo=kotlin&logoColor=white) | Android, Kotlin Multiplatform, Spring | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
54
+ | ![Java](https://img.shields.io/badge/Java-ED8B00?logo=openjdk&logoColor=white) | Spring (routes, guards, beans, tables, clients) | heuristic; exact with scip-java (opt-in) | [Java](https://code-graph.cyberchronos00.workers.dev/docs/java) |
54
55
  | ![Swift](https://img.shields.io/badge/Swift-F05138?logo=swift&logoColor=white) | iOS / SwiftPM | heuristic; exact with the Swift index store (opt-in) | [Swift](https://code-graph.cyberchronos00.workers.dev/docs/swift) |
55
56
  | ![Rust](https://img.shields.io/badge/Rust-000000?logo=rust&logoColor=white) ![C](https://img.shields.io/badge/C-A8B9CC?logo=c&logoColor=black) ![C++](https://img.shields.io/badge/C++-00599C?logo=cplusplus&logoColor=white) | crates / modules, entry points, FFI, `#[cfg]` / `#if` gates | heuristic; exact with rust-analyzer / scip-clang | [Rust, C and C++](https://code-graph.cyberchronos00.workers.dev/docs/native) |
56
57
 
57
- Go, Java and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor` to see exact / heuristic per language on your machine.
58
+ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor` to see exact / heuristic per language on your machine.
58
59
 
59
60
  ## What you get
60
61
 
61
62
  - `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
62
63
  - `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
63
- - Frontend ↔ backend: `cg link` matches client HTTP calls to server routes across repos.
64
+ - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
64
65
  - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
65
66
  - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
66
67
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.17.0"
2
+ __version__ = "0.19.0"
@@ -44,6 +44,8 @@ Pipe long output through `head` or `tail`:
44
44
  cg impact <symbol> --db out/graph.db | head -n 40
45
45
  While iterating, run one file: `pytest -q -x tests/test_x.py`.
46
46
  Run the full suite once at the end: `pytest -q 2>&1 | tail -n 30`.
47
+
48
+ A new language or framework updates README's Supported languages table, its docs page, `docs-site/app/utils/docs-nav.ts`, and `docs-site/app/components/HomeStacks.vue` in the same change.
47
49
  """
48
50
 
49
51
 
@@ -118,9 +118,9 @@ def main(argv=None):
118
118
  p.add_argument("--dry-run", action="store_true", help="list what would be removed, delete nothing")
119
119
  p.add_argument("--json", action="store_true")
120
120
  p = sub.add_parser("setup", help="install the Node / PHP / Dart extractor dependencies (into the user cache; "
121
- "otherwise done on the first index)")
121
+ "otherwise done on the first index). `java` prints the JDK 17+ / scip-java hint")
122
122
  p.add_argument("languages", nargs="*", metavar="LANG",
123
- help="typescript, php, dart (default: every one whose toolchain is installed)")
123
+ help="typescript, php, dart, java (default: typescript, php, dart whose toolchain is installed)")
124
124
  p.add_argument("--quiet", action="store_true")
125
125
  p.add_argument("--prune", action="store_true",
126
126
  help="remove extractor installs this version does not use (left by updates that changed a lock "
@@ -408,9 +408,9 @@ def main(argv=None):
408
408
  return 0
409
409
  if a.cmd == "setup":
410
410
  from .doctor import setup
411
- bad = [x for x in a.languages if x not in ("typescript", "php", "dart")]
411
+ bad = [x for x in a.languages if x not in ("typescript", "php", "dart", "java")]
412
412
  if bad:
413
- print(f"cg setup: unknown language {bad[0]!r} (typescript, php, dart)", file=sys.stderr)
413
+ print(f"cg setup: unknown language {bad[0]!r} (typescript, php, dart, java)", file=sys.stderr)
414
414
  return 2
415
415
  return setup(a.languages or None, quiet=a.quiet)
416
416
  if a.cmd == "coverage":
@@ -1,7 +1,7 @@
1
1
  """The per-user cache: where it lives, what is in it, and `cg clean`.
2
2
 
3
3
  Root (one lookup for every user: extractors, SCIP outputs, parse caches, the Swift build directory):
4
- $CG_CACHE (older names still work through 0.17.x; see core/env.py), else
4
+ $CG_CACHE (older names still work through 0.18.x; see core/env.py), else
5
5
  %LOCALAPPDATA%\\cg on Windows, else $XDG_CACHE_HOME/cg, else ~/.cache/cg. The first use of that
6
6
  default moves a leftover `codegraph` directory to `cg` and drops `swift-build/` (SwiftPM build
7
7
  directories embed absolute paths). An explicit cache path is used as given and is not moved.
@@ -2,9 +2,12 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  import json
5
+ import os
5
6
  import re
6
7
  from pathlib import Path
7
8
 
9
+ from ..presets import skip_dirs
10
+
8
11
  MARKERS = {
9
12
  # language: files/globs that indicate it
10
13
  "php": ["composer.json", "artisan"],
@@ -56,6 +59,10 @@ def detect(root: Path) -> dict:
56
59
  fw["astro"] = {"version": deps.get("astro")}
57
60
  if "vue" in deps:
58
61
  fw["vue"] = {"version": deps.get("vue")}
62
+ from ..plugins.ts.react_router import is_react_router
63
+ if is_react_router(root):
64
+ ver = deps.get("react-router") or deps.get("react-router-dom") or deps.get("@remix-run/react")
65
+ fw["react-router"] = {"version": ver} if ver else {}
59
66
  from ..plugins.tsweb.common import SERVER_DEPS # TS / JS servers (NestJS, Next.js, Express / Koa / Fastify / Hono ...)
60
67
  for name, pkgs in SERVER_DEPS.items():
61
68
  hit = [d for d in pkgs if d in deps]
@@ -80,4 +87,34 @@ def detect(root: Path) -> dict:
80
87
  fw[extra] = {}
81
88
  if "typescript" in deps:
82
89
  langs.setdefault("typescript", ["package.json:typescript"])
90
+ if _spring_build(root):
91
+ fw["spring"] = {}
83
92
  return {"languages": langs, "frameworks": fw}
93
+
94
+
95
+ def _spring_build(root: Path) -> bool:
96
+ """Spring Boot Gradle plugin or a ``spring-boot-starter-*`` dependency in Gradle / Maven files.
97
+
98
+ The root build file and one module level (``app/build.gradle.kts``). Deeper trees stay out so a
99
+ monorepo's example apps do not mark the repository root.
100
+ """
101
+ names = {"build.gradle", "build.gradle.kts", "pom.xml"}
102
+ rx = re.compile(r"org\.springframework\.boot|spring-boot-starter(?:-[\w.-]+)?")
103
+ skip = skip_dirs("common") | skip_dirs("common", "scan_skip_dirs")
104
+ for dp, dn, fn in os.walk(root):
105
+ rel = os.path.relpath(dp, root)
106
+ depth = 0 if rel == "." else len(Path(rel).parts)
107
+ if depth > 1:
108
+ dn[:] = []
109
+ continue
110
+ dn[:] = [d for d in dn if d not in skip and not d.startswith(".")]
111
+ for name in fn:
112
+ if name not in names:
113
+ continue
114
+ try:
115
+ text = (Path(dp) / name).read_text(errors="replace")[:200_000]
116
+ except OSError:
117
+ continue
118
+ if rx.search(text):
119
+ return True
120
+ return False
@@ -0,0 +1,78 @@
1
+ """Process environment: ``CG_*`` names only.
2
+
3
+ ``get`` reads ``os.environ`` on every call. A leftover ``CODEGRAPH_*`` name from this project
4
+ does not affect the value. The first read prints one stderr notice naming each leftover and
5
+ its ``CG_*`` replacement. ``CODEGRAPH_MCP_TOOLS`` belongs to another project and is ignored
6
+ silently.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import os
11
+ import sys
12
+
13
+ # Suffixes this project reads. ``CODEGRAPH_CACHE_DIR`` renames to ``CG_CACHE``.
14
+ SUFFIXES = (
15
+ "CACHE", "CACHE_DIR", "CARGO", "CFAMILY", "COMPDB", "C_MASK_ANNOTATIONS", "C_MAX_MACRO_REFS",
16
+ "C_SCIP", "C_SCIP_FILE", "EXCLUDE_DIRS", "INCLUDE_DIRS", "INDEXER_TIMEOUT", "JOBS",
17
+ "JAVA_SCIP", "JAVA_SCIP_FILE", "KOTLIN_SCIP", "KOTLIN_SCIP_FILE", "LIBINDEXSTORE",
18
+ "MAX_FILE_BYTES", "NODE", "NO_CACHE",
19
+ "NO_CARGO", "NO_HOOKS", "NO_STALE_CHECK", "RUST_ANALYZER", "RUST_BUILD_SCRIPTS", "RUST_SCIP",
20
+ "RUST_SCIP_FILE", "RUST_TARGETS", "SCIP_CLANG", "SCIP_JAVA", "SWIFT", "SWIFT_INDEX",
21
+ "SWIFT_INDEX_STORE",
22
+ )
23
+ _NO_LEGACY = frozenset({"MCP_TOOLS", "CACHE_DIR"})
24
+ _noted = False
25
+
26
+
27
+ def replacements() -> dict[str, str]:
28
+ """Old name -> ``CG_*`` name, in suffix order. ``CACHE_DIR`` is ``CG_CACHE``."""
29
+ out: dict[str, str] = {}
30
+ for name in SUFFIXES:
31
+ if name in _NO_LEGACY:
32
+ continue
33
+ if name == "CACHE":
34
+ out["CODEGRAPH_CACHE"] = "CG_CACHE"
35
+ out["CODEGRAPH_CACHE_DIR"] = "CG_CACHE"
36
+ else:
37
+ out["CODEGRAPH_" + name] = "CG_" + name
38
+ return out
39
+
40
+
41
+ def note_removed() -> list[str]:
42
+ """Print one stderr line when any removed name is set. Returns those old names."""
43
+ global _noted
44
+ mapping = replacements()
45
+ found = [old for old in mapping if old in os.environ]
46
+ if _noted:
47
+ return found
48
+ _noted = True
49
+ if found:
50
+ pairs = ", ".join(f"{old} -> {mapping[old]}" for old in found)
51
+ print(f"cg: ignored removed environment variables: {pairs}", file=sys.stderr)
52
+ return found
53
+
54
+
55
+ def get(name: str, default=None) -> str | None:
56
+ """``CG_<name>`` when set, else ``default``. Removed ``CODEGRAPH_*`` names are ignored."""
57
+ note_removed()
58
+ new = "CG_" + name
59
+ if new in os.environ:
60
+ return os.environ[new]
61
+ return default
62
+
63
+
64
+ def is_set(name: str) -> bool:
65
+ """True when ``CG_<name>`` is present in the environment."""
66
+ note_removed()
67
+ return ("CG_" + name) in os.environ
68
+
69
+
70
+ def flag(name: str) -> bool:
71
+ """True when the value is set and not a false-like token (``0``, ``false``, ``no``, ``off``)."""
72
+ val = get(name)
73
+ return val is not None and val.strip().lower() not in ("", "0", "false", "no", "off")
74
+
75
+
76
+ def legacy_in_env() -> list[str]:
77
+ """Removed ``CODEGRAPH_*`` names from this project that are present (for ``cg doctor``)."""
78
+ return note_removed()
@@ -20,6 +20,8 @@ _SWIFT_MODS = (r"(?:(?:public|private|fileprivate|internal|open|package|static|f
20
20
  DECL = {
21
21
  "swift": re.compile(r"^[ \t]*(?:@[\w.]+(?:\([^)\n]*\))?\s+)*" + _SWIFT_MODS +
22
22
  r"(func|init|class|struct|enum|protocol|extension|actor)\b[ \t]*([A-Za-z_]\w*)?", re.M),
23
+ "java": re.compile(r"^[ \t]*(?:(?:public|private|protected|static|final|abstract|sealed|native|synchronized|"
24
+ r"default|strictfp)\s+)*(class|interface|enum|record)\s+([A-Za-z_]\w*)", re.M),
23
25
  "kotlin": re.compile(r"^[ \t]*(?:@[\w.]+(?:\([^)\n]*\))?\s+)*(?:(?:public|private|internal|protected|open|abstract|"
24
26
  r"override|suspend|inline|data|sealed|enum|annotation|inner|value|companion|actual|expect|"
25
27
  r"operator|infix|tailrec|external)\s+)*(fun|class|interface|object)\b[ \t]*"
@@ -22,13 +22,14 @@ SUPPORTED = {
22
22
  "rust": (".rs",),
23
23
  "c_cpp": (".c", ".h", ".cc", ".cpp", ".cxx", ".c++", ".hpp", ".hh", ".hxx", ".h++", ".ipp", ".inl"),
24
24
  "kotlin": (".kt", ".kts"),
25
+ "java": (".java",),
25
26
  "swift": (".swift",),
26
27
  }
27
- # source types without a native plugin (go / java can be imported from a SCIP index). A generic "looks like source" rule:
28
+ # source types without a native plugin (go can be imported from a SCIP index). A generic "looks like source" rule:
28
29
  # text source extensions of programming / scripting languages, plus a shebang for extensionless scripts (SHEBANGS).
29
30
  # Data, markup, config and asset extensions are not listed, so they never count as unsupported source.
30
31
  UNSUPPORTED = {
31
- ".go": "go", ".java": "java", ".rb": "ruby", ".cs": "csharp",
32
+ ".go": "go", ".rb": "ruby", ".cs": "csharp",
32
33
  ".scala": "scala", ".ex": "elixir", ".exs": "elixir", ".m": "objective-c", ".mm": "objective-c", ".lua": "lua",
33
34
  ".pl": "perl", ".pm": "perl", ".clj": "clojure", ".erl": "erlang", ".hrl": "erlang", ".hs": "haskell", ".fs": "fsharp",
34
35
  ".fsx": "fsharp", ".groovy": "groovy", ".r": "r", ".jl": "julia", ".zig": "zig", ".sol": "solidity",
@@ -53,7 +54,7 @@ BUCKET_TEXT = {"parse_failed": "parse failed", "skipped_oversize": "over size li
53
54
  BUCKET_SHORT = {"parse_failed": "parse failed", "skipped_oversize": "over size limit", "unmapped": "unmapped",
54
55
  "excluded": "excluded"}
55
56
  LANG_LABEL = {"php": "PHP", "typescript": "TypeScript / JavaScript", "python": "Python", "dart": "Dart", "rust": "Rust",
56
- "c_cpp": "C / C++", "kotlin": "Kotlin", "swift": "Swift"}
57
+ "c_cpp": "C / C++", "kotlin": "Kotlin", "java": "Java", "swift": "Swift"}
57
58
  MAX_PATHS = 500 # file paths stored per bucket in the index (counts are always exact)
58
59
  SHOW_PATHS = 5 # shown per bucket by default (`cg coverage --all-files` / coverage(all_files=true) for all)
59
60
  HINTS = {
@@ -73,11 +74,15 @@ HINTS = {
73
74
  "CG_SWIFT_INDEX=1 (SwiftPM: runs `swift build --enable-index-store`; needs a Swift toolchain) or "
74
75
  "CG_SWIFT_INDEX_STORE to an existing index store (docs/swift.md#exact-mode)",
75
76
  "go": "no native plugin: index with scip-go and pass `--scip index.scip`",
76
- "java": "no native plugin: index with scip-java and pass `--scip index.scip`",
77
+ "java": "heuristic mode (tree-sitter syntax layer, receiver-type call resolution){layer}. "
78
+ "For compiler-resolved references set CG_JAVA_SCIP=1 (or CG_KOTLIN_SCIP=1; one scip-java run serves both) "
79
+ "or pass `--scip index.scip`. install.sh --with java installs scip-java (JDK 17, 21 or 25). "
80
+ "docs/java.md#exact-mode",
77
81
  }
78
82
  # tree-sitter modules of the syntax layer per language: the hint names the ones missing (none: no install hint, #75)
79
83
  LAYER_MODULES = {"rust": ("tree_sitter", "tree_sitter_rust"), "c_cpp": ("tree_sitter", "tree_sitter_c", "tree_sitter_cpp"),
80
- "kotlin": ("tree_sitter", "tree_sitter_kotlin"), "swift": ("tree_sitter", "tree_sitter_swift")}
84
+ "kotlin": ("tree_sitter", "tree_sitter_kotlin"), "java": ("tree_sitter", "tree_sitter_java"),
85
+ "swift": ("tree_sitter", "tree_sitter_swift")}
81
86
 
82
87
 
83
88
  def hint(lang: str) -> str | None:
@@ -111,7 +116,7 @@ class Scan:
111
116
  self.counts: Counter = Counter()
112
117
  self.paths: dict[str, list[str]] = {}
113
118
  self.scripts: Counter = Counter()
114
- self.bridge_paths: list[str] = [] # Java / ObjC files: no language plugin, scanned for bridge receivers
119
+ self.bridge_paths: list[str] = [] # Java / ObjC files scanned for bridge receivers (Java is also a language plugin)
115
120
 
116
121
  def files(self, exts) -> list[str]:
117
122
  return [f for e in exts for f in self.paths.get(e, [])]
@@ -175,7 +180,9 @@ def scan_tree(root: str | Path, rules=None, classifier=None) -> Scan:
175
180
  sc.counts[ext] += 1
176
181
  if ext in _SUPPORTED_EXTS:
177
182
  sc.paths.setdefault(ext, []).append(rel_dir + fn)
178
- elif ext in (".java", ".m", ".mm"):
183
+ # .java is a language plugin and still a bridge receiver source (Android
184
+ # @CapacitorPlugin / @ReactMethod). .m / .mm stay bridge-only until they have one.
185
+ if ext == ".java" or (ext in (".m", ".mm") and ext not in _SUPPORTED_EXTS):
179
186
  sc.bridge_paths.append(rel_dir + fn)
180
187
  elif not fn.startswith(".") and is_real_file(p):
181
188
  lang = _shebang(p)
@@ -271,6 +278,15 @@ def _status(lang: str, st: dict | None) -> tuple[str, str | None]:
271
278
  part += ("; skipped modules: " + ", ".join(m["module"] for m in sc["skipped_modules"][:5])
272
279
  + f" ({sc['skipped_modules'][0]['reason']})")
273
280
  return "exact", f"scip-java index ({sc.get('source', 'scip')}){part}"
281
+ if lang == "java" and mode == "heuristic":
282
+ why = (st.get("scip") or {}).get("status") if isinstance(st.get("scip"), dict) else None
283
+ return "heuristic", ("tree-sitter syntax layer with receiver-type call resolution; no compiler index"
284
+ + (f": {why}" if why else ""))
285
+ if lang == "java" and mode == "scip":
286
+ sc = st.get("scip") if isinstance(st.get("scip"), dict) else {}
287
+ n, k = st.get("scip_files"), st.get("files")
288
+ part = f"; {k - n} of {k} Java files not in the index keep heuristic calls" if n is not None and k and n < k else ""
289
+ return "exact", f"scip-java index ({sc.get('source', 'scip')}){part}"
274
290
  if lang == "typescript" and st.get("program_files") == 0 and not st.get("nodes"):
275
291
  return "not_indexed", "the TypeScript plugin ran but found no source files (tsconfig include / source dirs)"
276
292
  return "exact", None
@@ -349,10 +365,6 @@ def compute(root: str | Path, plugins: dict, scip_imported: bool = False, report
349
365
  other[lang]["reason"] = st.get("reason")
350
366
  elif "status" not in st:
351
367
  other[lang]["status"] = "exact" # a SCIP indexer ran
352
- kj = ((plugins.get("kotlin") or {}).get("java") or {})
353
- if kj.get("documents") and "java" in other and other["java"]["status"] == "unsupported":
354
- other["java"].update(status="scip", reason=f"{kj['documents']} Java file(s) imported from the Kotlin build's "
355
- "scip-java index (Kotlin exact mode)")
356
368
  for o in other.values():
357
369
  if o["status"] == "unsupported":
358
370
  if scip_imported and o["language"] in ("go", "java"):
@@ -632,7 +644,7 @@ def render_summary(covs: dict[str, dict | None], db: str | None = None) -> str:
632
644
  line += f"; fix: {e['hint']}"
633
645
  out.append(line)
634
646
  for e in (cov or {}).get("languages", []): # the mode an exact-capable language ran in, and why
635
- if e["language"] in ("kotlin", "swift") and not _is_gap(e) and e.get("reason"):
647
+ if e["language"] in ("kotlin", "swift", "java") and not _is_gap(e) and e.get("reason"):
636
648
  out.append(f" {e['language']} {e['files']} {e['status']}: {e['reason']}")
637
649
  se = [e for e in (cov or {}).get("languages", []) if e.get("syntax_errors")]
638
650
  if se:
@@ -691,7 +703,7 @@ def render(covs: dict[str, dict | None], all_files: bool = False) -> str:
691
703
  for e in (cov or {}).get("languages", []):
692
704
  out += syntax_error_lines(e, all_files)
693
705
  for e in (cov or {}).get("languages", []): # which mode an exact-capable language ran in, and why
694
- if e["language"] in ("kotlin", "swift") and not _is_gap(e) and e.get("reason"):
706
+ if e["language"] in ("kotlin", "swift", "java") and not _is_gap(e) and e.get("reason"):
695
707
  out.append(f" {e['language']}: {e['files']} files {e['status']}: {e['reason']}")
696
708
  if all_files:
697
709
  for e in (cov or {}).get("languages", []):
@@ -24,13 +24,15 @@ INSTALL_DOC = "docs/install.md"
24
24
  REPO = "https://github.com/cyberchronos00/code-graph"
25
25
  GRAMMARS = {"rust": "tree_sitter_rust", "c_cpp": "tree_sitter_c", "kotlin": "tree_sitter_kotlin", "swift": "tree_sitter_swift"}
26
26
  PIP_NAMES = {"tree_sitter": "tree-sitter", "tree_sitter_rust": "tree-sitter-rust", "tree_sitter_c": "tree-sitter-c",
27
- "tree_sitter_cpp": "tree-sitter-cpp", "tree_sitter_kotlin": "tree-sitter-kotlin", "tree_sitter_swift": "tree-sitter-swift"}
27
+ "tree_sitter_cpp": "tree-sitter-cpp", "tree_sitter_kotlin": "tree-sitter-kotlin",
28
+ "tree_sitter_java": "tree-sitter-java", "tree_sitter_swift": "tree-sitter-swift"}
28
29
 
29
30
 
30
31
  # language -> the plugin packages its `cg index` run loads (besides the indexer, which loads all of them)
31
32
  PLUGIN_PACKAGES = {"python": ("python", "pyweb", "django"), "typescript": ("ts", "tsweb", "nuxt", "nest", "nextjs", "express"),
32
33
  "php": ("php", "laravel"), "dart": ("dart", "flutter"), "rust": ("rust", "native", "scip"),
33
- "c_cpp": ("cfamily", "native", "scip"), "kotlin": ("kotlin", "scip"), "swift": ("swift",)}
34
+ "c_cpp": ("cfamily", "native", "scip"), "kotlin": ("kotlin", "scip"), "java": ("java",),
35
+ "swift": ("swift",)}
34
36
 
35
37
 
36
38
  def _run(tool: str | None, args=("--version",)) -> tuple[str | None, bool]:
@@ -222,6 +224,34 @@ def _languages(tools: dict, root: Path | None, cfg: dict) -> list[dict]:
222
224
  "set CG_KOTLIN_SCIP=1 (or pass --scip index.scip)")
223
225
  else:
224
226
  add("kotlin", "exact", "scip-java on the Gradle / Maven build")
227
+ # Java exact mode is the same scip-java run as Kotlin (CG_JAVA_SCIP or CG_KOTLIN_SCIP).
228
+ jdk_major = None
229
+ if has("java"):
230
+ from .plugins.kotlin.exact import java_major
231
+ jdk_major = java_major(tools["java"]["path"])
232
+ jdk_note = f"; JDK {jdk_major}" if jdk_major else ""
233
+ if not ts_ok or not _module("tree_sitter_java"):
234
+ add("java", "unavailable", "tree-sitter grammar missing", _pip("tree_sitter", "tree_sitter_java"))
235
+ elif env.get("JAVA_SCIP_FILE") or env.get("KOTLIN_SCIP_FILE"):
236
+ which = "CG_JAVA_SCIP_FILE" if env.get("JAVA_SCIP_FILE") else "CG_KOTLIN_SCIP_FILE (shared with Kotlin)"
237
+ add("java", "exact", which + jdk_note)
238
+ elif not has("scip-java") or not has("java"):
239
+ miss = " and ".join(t for t in ("scip-java", "java") if not has(t))
240
+ why = f"tree-sitter-java; {miss} not found{jdk_note}"
241
+ if jdk_major is not None and jdk_major < 17:
242
+ why += " (scip-java needs JDK 17, 21 or 25)"
243
+ add("java", "heuristic", why,
244
+ "install.sh --with java (JDK 17+ and scip-java via coursier), then CG_JAVA_SCIP=1")
245
+ elif jdk_major is not None and jdk_major < 17:
246
+ extra = "; unsupported Java 8/11 build JDK" if jdk_major in (8, 11) else ""
247
+ add("java", "heuristic", f"JDK too old (found {jdk_major}; scip-java needs JDK 17, 21 or 25){extra}",
248
+ "install JDK 17, 21 or 25, then CG_JAVA_SCIP=1")
249
+ elif env.get("JAVA_SCIP") != "1" and env.get("KOTLIN_SCIP") != "1":
250
+ add("java", "heuristic", "scip-java found but not run: it runs the Gradle / Maven build (the project's build scripts)"
251
+ + jdk_note,
252
+ "set CG_JAVA_SCIP=1 (or CG_KOTLIN_SCIP=1; one run serves both) or pass --scip index.scip")
253
+ else:
254
+ add("java", "exact", "scip-java on the Gradle / Maven build" + jdk_note)
225
255
  # Swift
226
256
  if not ts_ok or not _module("tree_sitter_swift"):
227
257
  add("swift", "unavailable", "tree-sitter grammar missing", _pip("tree_sitter", "tree_sitter_swift"))
@@ -441,7 +471,8 @@ def _legacy_lines(r: dict) -> list[str]:
441
471
  names = r.get("legacy_env") or []
442
472
  if names:
443
473
  shown = ", ".join(names)
444
- lines.append(f"note: {shown} is set; use the CG_* name (removed in 0.18.0)")
474
+ lines.append(f"note: {shown} no longer affects cg; rename each CODEGRAPH_* name to CG_* "
475
+ "(CODEGRAPH_CACHE and CODEGRAPH_CACHE_DIR become CG_CACHE)")
445
476
  leg = r.get("legacy_cache") or None
446
477
  if leg:
447
478
  if leg.get("path"):
@@ -469,12 +500,16 @@ def _mcp(rootp: Path | None) -> list:
469
500
 
470
501
 
471
502
  def setup(langs: list[str] | None = None, quiet: bool = False) -> int:
472
- """`cg setup [typescript php dart]`: install the extractor dependencies for the languages whose toolchain is
473
- present (all three by default); returns 1 if an explicitly named one failed."""
503
+ """`cg setup [typescript php dart java]`: install the extractor dependencies for the languages whose toolchain is
504
+ present (typescript, php, dart by default). `java` prints the JDK 17+ hint and reuses the Kotlin scip-java
505
+ install path; it does not run a build. Returns 1 if an explicitly named one failed."""
474
506
  from .plugins.dart.plugin import DartPlugin, find_dart
475
507
  want = langs or list(extractors.SPECS)
476
508
  rc = 0
477
509
  for lang in want:
510
+ if lang == "java":
511
+ rc = rc or _setup_java(quiet)
512
+ continue
478
513
  tool = {"typescript": "npm", "php": "composer", "dart": None}[lang]
479
514
  need = {"typescript": "node", "php": "php", "dart": None}[lang]
480
515
  dart = find_dart() if lang == "dart" else None
@@ -503,3 +538,22 @@ def setup(langs: list[str] | None = None, quiet: bool = False) -> int:
503
538
  print(f"{lang}: failed: {e}", file=sys.stderr)
504
539
  rc = 1
505
540
  return rc
541
+
542
+
543
+ def _setup_java(quiet: bool) -> int:
544
+ """`cg setup java`: the same scip-java / JDK hint as `install.sh --with java`. Heuristic mode needs neither."""
545
+ from .plugins.kotlin.exact import find_java, scip_java_candidates
546
+ jdk = find_java()
547
+ tools = scip_java_candidates()
548
+ if jdk:
549
+ print(f"java: JDK found ({jdk}). scip-java needs JDK 17+ (17, 21 or 25).")
550
+ else:
551
+ print("java: no JDK found. Install JDK 17+ (17, 21 or 25; https://adoptium.net).", file=sys.stderr)
552
+ if tools:
553
+ print(f"java: scip-java found ({tools[0]}). Exact mode stays opt-in, because it runs the build: CG_JAVA_SCIP=1")
554
+ else:
555
+ print("java: scip-java not found. install.sh --with java installs it (the same path as --with kotlin).",
556
+ file=sys.stderr)
557
+ if not quiet:
558
+ print("java: heuristic indexing uses tree-sitter-java and does not need a JDK.")
559
+ return 0
@@ -42,6 +42,12 @@ _BLOCK = re.compile(re.escape(BEGIN) + r".*?" + re.escape(END) + r"\n?", re.S)
42
42
  _SHELLS = {"sh", "bash", "dash", "ksh", "zsh", "ash"}
43
43
  _SHEBANG_ONLY = "#!/bin/sh"
44
44
  _OLD_CLI = "-m " + "codegraph" + ".cli"
45
+ _OLD_NO_HOOKS = "CODEGRAPH_NO_HOOKS"
46
+
47
+
48
+ def _block_outdated(block: str) -> bool:
49
+ """A 0.17/0.18 block that still checks CODEGRAPH_NO_HOOKS, or the pre-0.17 CLI."""
50
+ return _OLD_CLI in block or _OLD_NO_HOOKS in block
45
51
 
46
52
 
47
53
  def _sh_quote(text: str) -> str:
@@ -101,7 +107,7 @@ def _block_text(hook: str, root: str, db: str, py: str) -> str:
101
107
  f"# cg-root: {root}",
102
108
  f"# cg-db: {db}",
103
109
  f"# cg-hook: {hook}",
104
- 'if [ "${CG_NO_HOOKS:-${CODEGRAPH_NO_HOOKS:-}}" != 1 ]; then',
110
+ 'if [ "${CG_NO_HOOKS:-}" != 1 ]; then',
105
111
  ]
106
112
  if hook == "post-checkout":
107
113
  lines.append(' if [ "$1" != "$2" ]; then')
@@ -211,7 +217,7 @@ def _status_line(path: Path, hook: str) -> str:
211
217
  found = _BLOCK.search(text)
212
218
  if not found:
213
219
  return f"{hook}: not installed"
214
- if _OLD_CLI in found.group(0):
220
+ if _block_outdated(found.group(0)):
215
221
  return f"outdated hook {hook}: re-run cg hooks install"
216
222
  root, db = _meta(text)
217
223
  extra = ""
@@ -282,14 +288,14 @@ def run(action: str, root: str = ".", db: str | None = None, dry_run: bool = Fal
282
288
 
283
289
 
284
290
  def outdated_names(root: str | Path) -> list[str]:
285
- """Hook names whose cg block still runs the removed `codegraph.cli` module."""
291
+ """Hook names whose cg block still runs `codegraph.cli` or checks `CODEGRAPH_NO_HOOKS`."""
286
292
  hooks = _hooks_dir(Path(root))
287
293
  if hooks is None:
288
294
  return []
289
295
  out = []
290
296
  for hook in HOOKS:
291
297
  found = _BLOCK.search(_read(hooks / hook))
292
- if found and _OLD_CLI in found.group(0):
298
+ if found and _block_outdated(found.group(0)):
293
299
  out.append(hook)
294
300
  return out
295
301
 
@@ -28,9 +28,11 @@ from .plugins.nextjs.plugin import NextPlugin
28
28
  from .plugins.express.plugin import ExpressPlugin
29
29
  from .plugins.astro.plugin import AstroPlugin
30
30
  from .plugins.kotlin.plugin import KotlinPlugin
31
+ from .plugins.java.plugin import JavaPlugin
31
32
  from .plugins.swift.plugin import SwiftPlugin
32
33
 
33
- LANGUAGE_PLUGINS = [PhpPlugin(), TypeScriptPlugin(), PythonPlugin(), DartPlugin(), RustPlugin(), CFamilyPlugin(), KotlinPlugin(), SwiftPlugin(),
34
+ LANGUAGE_PLUGINS = [PhpPlugin(), TypeScriptPlugin(), PythonPlugin(), DartPlugin(), RustPlugin(), CFamilyPlugin(),
35
+ KotlinPlugin(), JavaPlugin(), SwiftPlugin(),
34
36
  *SCIP_PLUGINS]
35
37
  FRAMEWORK_PLUGINS = [LaravelPlugin(), NuxtPlugin(), DjangoPlugin(), FastAPIPlugin(), FlaskPlugin(), FlutterPlugin(), NestPlugin(), NextPlugin(), ExpressPlugin(), AstroPlugin()]
36
38
 
@@ -100,6 +102,12 @@ def setup(project: Project) -> dict:
100
102
  names = {k: v for k, v in found.items() if k not in remove}
101
103
  for k in sorted(add):
102
104
  names.setdefault(k, ".cg.yaml")
105
+ # Elysia shares the Express plugin and preset. The coverage label is elysia, not express (via elysia).
106
+ det_fw = project.detected.get("frameworks") or {}
107
+ if "elysia" in det_fw and "elysia" not in remove:
108
+ if "express" in names and "express" not in det_fw:
109
+ names.pop("express")
110
+ names.setdefault("elysia", "detected")
103
111
  applied = presets.select([lp.name for lp in langs], list(names))
104
112
  project.options["presets"] = applied
105
113
  return {"language_plugins": langs, "framework_plugins": fws, "languages": [lp.name for lp in langs],
@@ -206,11 +214,18 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
206
214
  for fw in frameworks:
207
215
  if f"{fw.language}/{fw.name}" not in stats["plugins"]:
208
216
  stats["plugins"][f"{fw.language}/{fw.name}"] = {"status": "detected; language plugin not active"}
217
+ kp = project.options.get("kotlin_plugin")
218
+ if kp is not None and not getattr(kp, "_exact_done", False):
219
+ kp._finish_exact(project, project.options.get("kotlin_files") or [], kp._exported_stats)
209
220
  if scip:
210
221
  from .plugins.scip.importer import import_scip
211
222
  for s in scip:
212
223
  if s in (project.options.get("scip_consumed") or []):
213
- stats["plugins"][f"scip:{s}"] = {"status": "imported by the Kotlin plugin (exact layer)"}
224
+ who = (project.options.get("scip_consumed_by") or {}).get(s) or ["kotlin"]
225
+ names = [w.capitalize() for w in who]
226
+ word = "plugin" if len(names) == 1 else "plugins"
227
+ stats["plugins"][f"scip:{s}"] = {
228
+ "status": f"imported by the {' and '.join(names)} {word} (exact layer)"}
214
229
  continue
215
230
  stats["plugins"][f"scip:{s}"] = import_scip(s, builder)
216
231
  # generated / copied / vendored files: out of the graph (default) or labelled (attrs.generated)
@@ -402,6 +417,8 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
402
417
  finally:
403
418
  gst.db.close()
404
419
  stats["starters_seconds"] = round(time.time() - t_st, 2)
420
+ from .plugins.ts.react_router import reconcile_detection
421
+ reconcile_detection(project, plan, stats)
405
422
  stats["coverage"]["setup"] = {"frameworks": sorted(plan["frameworks"]), "presets": plan["presets"],
406
423
  "config": cfg.get("file")}
407
424
  if pl: # per-target coverage: what each declared target builds, conditions left unevaluated
@@ -16,7 +16,8 @@ Matching is deterministic (no guessing):
16
16
  - segments match when literal == literal, client placeholder <-> route {param},
17
17
  client literal -> route {param} (resolved), or a client segment with an embedded
18
18
  placeholder fully matches a route literal (heuristic, e.g. export.{format} ~ export.csv);
19
- - method must match (HEAD ~ GET); the most specific route (most literal==literal segments)
19
+ - method must match (HEAD ~ GET); a client verb `ANY` matches only when one route fits the
20
+ path, and that match is `heuristic`. The most specific route (most literal==literal segments)
20
21
  wins; ties are kept and marked heuristic (ambiguous).
21
22
 
22
23
  Realtime: client channel subscriptions (channel_sub:<name>, from Echo / pusher-js / useEcho) get MATCHES_CHANNEL ->
@@ -94,6 +95,8 @@ def match_path(client: str, route: str) -> tuple[bool, dict]:
94
95
 
95
96
 
96
97
  def _method_ok(cm: str, rm: str) -> bool:
98
+ if (cm or "").upper() == "ANY":
99
+ return True
97
100
  rms = set(rm.upper().replace("|", ",").split(","))
98
101
  return cm in rms or "ANY" in rms or (cm == "HEAD" and "GET" in rms)
99
102
 
@@ -180,6 +183,13 @@ def match_endpoint(method: str, path: str, routes: list[dict], origin_kind: str
180
183
  key = lambda h: (-h[2]["ph_into_lit"], h[2]["lit"])
181
184
  top = max(key(h) for h in hits)
182
185
  best = [h for h in hits if key(h) == top]
186
+ if method.upper() == "ANY":
187
+ if len(best) != 1:
188
+ return {"matched": [], "path": path, "reason": "ANY verb matches only a unique path",
189
+ "near": [h[0]["id"] for h in best][:3]}
190
+ r, variant, info = best[0]
191
+ return {"matched": [{"route": r["id"], "uri_variant": variant, "confidence": "heuristic", "segments": info}],
192
+ "path": path}
183
193
  out = []
184
194
  for r, variant, info in best:
185
195
  conf = "exact"