cg-code-graph 0.17.0__tar.gz → 0.18.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 (345) hide show
  1. {cg_code_graph-0.17.0/cg_code_graph.egg-info → cg_code_graph-0.18.0}/PKG-INFO +5 -3
  2. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/README.md +3 -2
  3. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/__init__.py +1 -1
  4. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/agent_rules.py +2 -0
  5. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/cli.py +4 -4
  6. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/cache.py +1 -1
  7. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/detect.py +33 -0
  8. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/env.py +5 -4
  9. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/syntax_errors.py +2 -0
  10. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/coverage.py +25 -13
  11. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/doctor.py +58 -5
  12. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/indexer.py +11 -2
  13. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/mcp_server.py +1 -1
  14. cg_code_graph-0.18.0/cg_code_graph/plugins/java/exact.py +352 -0
  15. cg_code_graph-0.18.0/cg_code_graph/plugins/java/plugin.py +1005 -0
  16. cg_code_graph-0.18.0/cg_code_graph/plugins/jvm/__init__.py +1 -0
  17. cg_code_graph-0.18.0/cg_code_graph/plugins/jvm/interop.py +212 -0
  18. cg_code_graph-0.18.0/cg_code_graph/plugins/jvm/spring.py +959 -0
  19. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/kotlin/exact.py +232 -39
  20. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/kotlin/plugin.py +54 -212
  21. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/stubs/plugins.py +2 -1
  22. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/__init__.py +1 -1
  23. cg_code_graph-0.18.0/cg_code_graph/presets/java.yaml +5 -0
  24. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/kotlin.yaml +1 -3
  25. cg_code_graph-0.18.0/cg_code_graph/presets/spring.yaml +22 -0
  26. cg_code_graph-0.18.0/cg_code_graph/viz/__init__.py +0 -0
  27. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0/cg_code_graph.egg-info}/PKG-INFO +5 -3
  28. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph.egg-info/SOURCES.txt +12 -0
  29. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph.egg-info/requires.txt +1 -0
  30. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/pyproject.toml +1 -0
  31. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_bridges.py +2 -2
  32. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_coverage.py +2 -1
  33. cg_code_graph-0.18.0/tests/test_docs_languages.py +58 -0
  34. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_env.py +2 -2
  35. cg_code_graph-0.18.0/tests/test_java.py +225 -0
  36. cg_code_graph-0.18.0/tests/test_java_exact.py +308 -0
  37. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_mixed.py +20 -17
  38. cg_code_graph-0.18.0/tests/test_spring.py +159 -0
  39. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/LICENSE +0 -0
  40. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/MANIFEST.in +0 -0
  41. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/__main__.py +0 -0
  42. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/affected.py +0 -0
  43. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/agents.py +0 -0
  44. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/aitools.py +0 -0
  45. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/android_ipc.py +0 -0
  46. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/apple_ipc.py +0 -0
  47. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/apps.py +0 -0
  48. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/blindspots.py +0 -0
  49. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/bridges.py +0 -0
  50. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/brokers.py +0 -0
  51. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/concepts.py +0 -0
  52. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/config.py +0 -0
  53. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/__init__.py +0 -0
  54. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/extractors.py +0 -0
  55. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/fsutil.py +0 -0
  56. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/generated.py +0 -0
  57. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/model.py +0 -0
  58. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/paths.py +0 -0
  59. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/plugin.py +0 -0
  60. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/core/store.py +0 -0
  61. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/dart_isolates.py +0 -0
  62. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/explore.py +0 -0
  63. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/external.py +0 -0
  64. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/graphql.py +0 -0
  65. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/hooks.py +0 -0
  66. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/jobs.py +0 -0
  67. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/link.py +0 -0
  68. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/lint_async.py +0 -0
  69. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/local_ipc.py +0 -0
  70. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/local_sockets.py +0 -0
  71. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/mcp_install.py +0 -0
  72. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/parity.py +0 -0
  73. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/parity_structure.py +0 -0
  74. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/payload.py +0 -0
  75. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plans.py +0 -0
  76. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/platform_scan.py +0 -0
  77. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/platforms.py +0 -0
  78. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/__init__.py +0 -0
  79. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
  80. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/astro/content.py +0 -0
  81. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
  82. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  83. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  84. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  85. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
  86. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
  87. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  88. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  89. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  90. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/http.py +0 -0
  91. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/models.py +0 -0
  92. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
  93. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/dart/program.py +0 -0
  94. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/__init__.py +0 -0
  95. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/extras.py +0 -0
  96. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/models.py +0 -0
  97. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/plugin.py +0 -0
  98. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/schemas.py +0 -0
  99. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/shapes.py +0 -0
  100. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/django/urls.py +0 -0
  101. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/express/__init__.py +0 -0
  102. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/express/plugin.py +0 -0
  103. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  104. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  105. {cg_code_graph-0.17.0/cg_code_graph/plugins/kotlin → cg_code_graph-0.18.0/cg_code_graph/plugins/java}/__init__.py +0 -0
  106. {cg_code_graph-0.17.0/cg_code_graph/plugins/laravel → cg_code_graph-0.18.0/cg_code_graph/plugins/kotlin}/__init__.py +0 -0
  107. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  108. {cg_code_graph-0.17.0/cg_code_graph/plugins/native → cg_code_graph-0.18.0/cg_code_graph/plugins/laravel}/__init__.py +0 -0
  109. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  110. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  111. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
  112. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/laravel/values.py +0 -0
  113. {cg_code_graph-0.17.0/cg_code_graph/plugins/nest → cg_code_graph-0.18.0/cg_code_graph/plugins/native}/__init__.py +0 -0
  114. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/native/gates.py +0 -0
  115. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/native/runner.py +0 -0
  116. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/native/scipread.py +0 -0
  117. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/native/ts.py +0 -0
  118. {cg_code_graph-0.17.0/cg_code_graph/plugins/nextjs → cg_code_graph-0.18.0/cg_code_graph/plugins/nest}/__init__.py +0 -0
  119. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
  120. {cg_code_graph-0.17.0/cg_code_graph/plugins/nuxt → cg_code_graph-0.18.0/cg_code_graph/plugins/nextjs}/__init__.py +0 -0
  121. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  122. {cg_code_graph-0.17.0/cg_code_graph/plugins/php → cg_code_graph-0.18.0/cg_code_graph/plugins/nuxt}/__init__.py +0 -0
  123. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  124. {cg_code_graph-0.17.0/cg_code_graph/plugins/python → cg_code_graph-0.18.0/cg_code_graph/plugins/php}/__init__.py +0 -0
  125. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/external.py +0 -0
  126. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  127. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  128. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  129. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/gating.py +0 -0
  130. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/plugin.py +0 -0
  131. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/php/strings.py +0 -0
  132. {cg_code_graph-0.17.0/cg_code_graph/plugins/pyweb → cg_code_graph-0.18.0/cg_code_graph/plugins/python}/__init__.py +0 -0
  133. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/aitools.py +0 -0
  134. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/external.py +0 -0
  135. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/fields.py +0 -0
  136. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/plugin.py +0 -0
  137. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/refs.py +0 -0
  138. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/roots.py +0 -0
  139. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/socketio.py +0 -0
  140. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/subproc.py +0 -0
  141. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/tests.py +0 -0
  142. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/python/values.py +0 -0
  143. {cg_code_graph-0.17.0/cg_code_graph/plugins/rust → cg_code_graph-0.18.0/cg_code_graph/plugins/pyweb}/__init__.py +0 -0
  144. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  145. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
  146. {cg_code_graph-0.17.0/cg_code_graph/plugins/scip → cg_code_graph-0.18.0/cg_code_graph/plugins/rust}/__init__.py +0 -0
  147. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
  148. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
  149. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
  150. {cg_code_graph-0.17.0/cg_code_graph/plugins/stubs → cg_code_graph-0.18.0/cg_code_graph/plugins/scip}/__init__.py +0 -0
  151. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/scip/importer.py +0 -0
  152. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
  153. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  154. {cg_code_graph-0.17.0/cg_code_graph/plugins/swift → cg_code_graph-0.18.0/cg_code_graph/plugins/stubs}/__init__.py +0 -0
  155. {cg_code_graph-0.17.0/cg_code_graph/plugins/ts → cg_code_graph-0.18.0/cg_code_graph/plugins/swift}/__init__.py +0 -0
  156. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  157. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/swift/exact.py +0 -0
  158. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  159. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/swift/packages.py +0 -0
  160. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/swift/plugin.py +0 -0
  161. {cg_code_graph-0.17.0/cg_code_graph/plugins/tsweb → cg_code_graph-0.18.0/cg_code_graph/plugins/ts}/__init__.py +0 -0
  162. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  163. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  164. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  165. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  166. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  167. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/nav.py +0 -0
  168. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/ts/plugin.py +0 -0
  169. {cg_code_graph-0.17.0/cg_code_graph/viz → cg_code_graph-0.18.0/cg_code_graph/plugins/tsweb}/__init__.py +0 -0
  170. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/tsweb/common.py +0 -0
  171. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
  172. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
  173. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/common.yaml +0 -0
  174. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/dart.yaml +0 -0
  175. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
  176. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/django.yaml +0 -0
  177. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  178. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/express.yaml +0 -0
  179. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/laravel.yaml +0 -0
  180. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/nest.yaml +0 -0
  181. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/nextjs.yaml +0 -0
  182. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/nuxt.yaml +0 -0
  183. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/php.yaml +0 -0
  184. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/python.yaml +0 -0
  185. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/rust.yaml +0 -0
  186. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/swift.yaml +0 -0
  187. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/presets/typescript.yaml +0 -0
  188. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/process_runs.py +0 -0
  189. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/protocols/__init__.py +0 -0
  190. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/protocols/builtin.py +0 -0
  191. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/protocols/matchers.py +0 -0
  192. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/protocols/view.py +0 -0
  193. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/query.py +0 -0
  194. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/realtime.py +0 -0
  195. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/realtime_events.py +0 -0
  196. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/realtime_native.py +0 -0
  197. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/realtime_ws.py +0 -0
  198. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/roundtrip.py +0 -0
  199. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/routes.py +0 -0
  200. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/rpc.py +0 -0
  201. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/sdk_systems.py +0 -0
  202. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/sockets.py +0 -0
  203. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/starters.py +0 -0
  204. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/tests_index.py +0 -0
  205. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/udp_apps.py +0 -0
  206. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/graph.py +0 -0
  207. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/server.py +0 -0
  208. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/app.css +0 -0
  209. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/app.js +0 -0
  210. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/index.html +0 -0
  211. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/layered.js +0 -0
  212. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  213. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  214. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  215. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  216. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  217. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
  218. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/tools/package.json +0 -0
  219. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  220. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/watch.py +0 -0
  221. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/webhooks.py +0 -0
  222. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph/xcode.py +0 -0
  223. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  224. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
  225. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/cg_code_graph.egg-info/top_level.txt +0 -0
  226. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/setup.cfg +0 -0
  227. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_affected.py +0 -0
  228. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_agents_install.py +0 -0
  229. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_agents_md.py +0 -0
  230. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ai_tools.py +0 -0
  231. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_android_ipc.py +0 -0
  232. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_apple_ipc.py +0 -0
  233. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_astro.py +0 -0
  234. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_astro_content.py +0 -0
  235. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_astro_server.py +0 -0
  236. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
  237. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_brokers.py +0 -0
  238. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_cache_clean.py +0 -0
  239. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_cache_invalidation.py +0 -0
  240. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_cache_migration.py +0 -0
  241. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_channels_tests.py +0 -0
  242. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_cli_output.py +0 -0
  243. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_completeness.py +0 -0
  244. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_config_extras.py +0 -0
  245. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_coverage_ts_hint.py +0 -0
  246. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_dart_isolates.py +0 -0
  247. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_dispatch_interfaces.py +0 -0
  248. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_django_flutter.py +0 -0
  249. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_docs_links.py +0 -0
  250. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_enum_constants.py +0 -0
  251. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_explore.py +0 -0
  252. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_external.py +0 -0
  253. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_gating.py +0 -0
  254. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_generated.py +0 -0
  255. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_graphql.py +0 -0
  256. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_hooks.py +0 -0
  257. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_impact_overrides.py +0 -0
  258. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_index_isolation.py +0 -0
  259. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_inherited_overrides.py +0 -0
  260. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_jobs.py +0 -0
  261. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_js_refs.py +0 -0
  262. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_js_runtime.py +0 -0
  263. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin.py +0 -0
  264. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_binding.py +0 -0
  265. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_exact.py +0 -0
  266. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_fields.py +0 -0
  267. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_nav_consts.py +0 -0
  268. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_kotlin_props.py +0 -0
  269. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_laravel_determinism.py +0 -0
  270. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_laravel_resources.py +0 -0
  271. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_lint_async.py +0 -0
  272. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_local_ipc.py +0 -0
  273. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_local_sockets.py +0 -0
  274. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_mcp.py +0 -0
  275. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_mcp_index.py +0 -0
  276. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_mcp_install.py +0 -0
  277. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_native_cfamily.py +0 -0
  278. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_native_concurrency.py +0 -0
  279. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_native_rust.py +0 -0
  280. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_nuxt_import_dirs.py +0 -0
  281. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_nuxt_rootsrc.py +0 -0
  282. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_packaging.py +0 -0
  283. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_parity.py +0 -0
  284. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_parity_structure.py +0 -0
  285. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_php_props.py +0 -0
  286. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_plain_js.py +0 -0
  287. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_plans.py +0 -0
  288. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_platform_gaps.py +0 -0
  289. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_platform_type_variants.py +0 -0
  290. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_platforms.py +0 -0
  291. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_platforms_apple.py +0 -0
  292. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_presets_config.py +0 -0
  293. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_process_ipc.py +0 -0
  294. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_process_runs.py +0 -0
  295. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_protocols.py +0 -0
  296. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_app_tests_module.py +0 -0
  297. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_collection_chains.py +0 -0
  298. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_compat.py +0 -0
  299. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_entry_refs.py +0 -0
  300. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_fields.py +0 -0
  301. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_infer_cycles.py +0 -0
  302. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_roots.py +0 -0
  303. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_subprocess_tests.py +0 -0
  304. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_tests.py +0 -0
  305. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_web_hosts.py +0 -0
  306. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_web_routes.py +0 -0
  307. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_python_web_routes_more.py +0 -0
  308. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_realtime.py +0 -0
  309. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_realtime_native.py +0 -0
  310. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_roundtrip.py +0 -0
  311. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_route_tables.py +0 -0
  312. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_routes_search_explain.py +0 -0
  313. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_rpc.py +0 -0
  314. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_scip_health.py +0 -0
  315. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_sdk_external.py +0 -0
  316. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_snippet.py +0 -0
  317. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_sockets.py +0 -0
  318. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_starters_budget.py +0 -0
  319. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift.py +0 -0
  320. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_binding.py +0 -0
  321. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_exact.py +0 -0
  322. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_facts.py +0 -0
  323. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_fields.py +0 -0
  324. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_modules.py +0 -0
  325. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_more.py +0 -0
  326. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_nav_values.py +0 -0
  327. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_parse_errors.py +0 -0
  328. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_props.py +0 -0
  329. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_sdk.py +0 -0
  330. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_testing.py +0 -0
  331. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_swift_values.py +0 -0
  332. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_tests_scope.py +0 -0
  333. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_fields.py +0 -0
  334. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_fields_js_vue.py +0 -0
  335. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_file_specs.py +0 -0
  336. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_frameworks.py +0 -0
  337. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_nuxt.py +0 -0
  338. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_ts_src_tsconfig.py +0 -0
  339. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_values.py +0 -0
  340. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_viz.py +0 -0
  341. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_vue_nav.py +0 -0
  342. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_watch.py +0 -0
  343. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_webhooks.py +0 -0
  344. {cg_code_graph-0.17.0 → cg_code_graph-0.18.0}/tests/test_websockets.py +0 -0
  345. {cg_code_graph-0.17.0 → cg_code_graph-0.18.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.18.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"
@@ -76,11 +77,12 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
76
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 | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
77
78
  | ![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) |
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
 
@@ -50,11 +50,12 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
50
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
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) |
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
 
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.17.0"
2
+ __version__ = "0.18.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"],
@@ -80,4 +83,34 @@ def detect(root: Path) -> dict:
80
83
  fw[extra] = {}
81
84
  if "typescript" in deps:
82
85
  langs.setdefault("typescript", ["package.json:typescript"])
86
+ if _spring_build(root):
87
+ fw["spring"] = {}
83
88
  return {"languages": langs, "frameworks": fw}
89
+
90
+
91
+ def _spring_build(root: Path) -> bool:
92
+ """Spring Boot Gradle plugin or a ``spring-boot-starter-*`` dependency in Gradle / Maven files.
93
+
94
+ The root build file and one module level (``app/build.gradle.kts``). Deeper trees stay out so a
95
+ monorepo's example apps do not mark the repository root.
96
+ """
97
+ names = {"build.gradle", "build.gradle.kts", "pom.xml"}
98
+ rx = re.compile(r"org\.springframework\.boot|spring-boot-starter(?:-[\w.-]+)?")
99
+ skip = skip_dirs("common") | skip_dirs("common", "scan_skip_dirs")
100
+ for dp, dn, fn in os.walk(root):
101
+ rel = os.path.relpath(dp, root)
102
+ depth = 0 if rel == "." else len(Path(rel).parts)
103
+ if depth > 1:
104
+ dn[:] = []
105
+ continue
106
+ dn[:] = [d for d in dn if d not in skip and not d.startswith(".")]
107
+ for name in fn:
108
+ if name not in names:
109
+ continue
110
+ try:
111
+ text = (Path(dp) / name).read_text(errors="replace")[:200_000]
112
+ except OSError:
113
+ continue
114
+ if rx.search(text):
115
+ return True
116
+ return False
@@ -1,4 +1,4 @@
1
- """Process environment: ``CG_*`` names, with ``CODEGRAPH_*`` aliases through 0.17.x.
1
+ """Process environment: ``CG_*`` names, with ``CODEGRAPH_*`` aliases through 0.18.x.
2
2
 
3
3
  ``get`` reads ``os.environ`` on every call. A legacy name that is set produces one stderr
4
4
  warning per name per process. ``CG_*`` wins when both are set. ``MCP_TOOLS`` has no legacy
@@ -13,7 +13,8 @@ import sys
13
13
  SUFFIXES = (
14
14
  "CACHE", "CACHE_DIR", "CARGO", "CFAMILY", "COMPDB", "C_MASK_ANNOTATIONS", "C_MAX_MACRO_REFS",
15
15
  "C_SCIP", "C_SCIP_FILE", "EXCLUDE_DIRS", "INCLUDE_DIRS", "INDEXER_TIMEOUT", "JOBS",
16
- "KOTLIN_SCIP", "KOTLIN_SCIP_FILE", "LIBINDEXSTORE", "MAX_FILE_BYTES", "NODE", "NO_CACHE",
16
+ "JAVA_SCIP", "JAVA_SCIP_FILE", "KOTLIN_SCIP", "KOTLIN_SCIP_FILE", "LIBINDEXSTORE",
17
+ "MAX_FILE_BYTES", "NODE", "NO_CACHE",
17
18
  "NO_CARGO", "NO_HOOKS", "NO_STALE_CHECK", "RUST_ANALYZER", "RUST_BUILD_SCRIPTS", "RUST_SCIP",
18
19
  "RUST_SCIP_FILE", "RUST_TARGETS", "SCIP_CLANG", "SCIP_JAVA", "SWIFT", "SWIFT_INDEX",
19
20
  "SWIFT_INDEX_STORE",
@@ -34,9 +35,9 @@ def _warn(old: str, new: str, *, both: bool) -> None:
34
35
  return
35
36
  _warned.add(old)
36
37
  if both:
37
- extra = f"{new} is set too and wins; the CODEGRAPH_* names are removed in 0.18.0"
38
+ extra = f"{new} is set too and wins; the CODEGRAPH_* names are removed in 0.19.0"
38
39
  else:
39
- extra = "the CODEGRAPH_* names are removed in 0.18.0"
40
+ extra = "the CODEGRAPH_* names are removed in 0.19.0"
40
41
  print(f"cg: {old} is deprecated, use {new} ({extra})", file=sys.stderr)
41
42
 
42
43
 
@@ -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,7 @@ 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} is set; use the CG_* name (removed in 0.19.0)")
445
475
  leg = r.get("legacy_cache") or None
446
476
  if leg:
447
477
  if leg.get("path"):
@@ -469,12 +499,16 @@ def _mcp(rootp: Path | None) -> list:
469
499
 
470
500
 
471
501
  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."""
502
+ """`cg setup [typescript php dart java]`: install the extractor dependencies for the languages whose toolchain is
503
+ present (typescript, php, dart by default). `java` prints the JDK 17+ hint and reuses the Kotlin scip-java
504
+ install path; it does not run a build. Returns 1 if an explicitly named one failed."""
474
505
  from .plugins.dart.plugin import DartPlugin, find_dart
475
506
  want = langs or list(extractors.SPECS)
476
507
  rc = 0
477
508
  for lang in want:
509
+ if lang == "java":
510
+ rc = rc or _setup_java(quiet)
511
+ continue
478
512
  tool = {"typescript": "npm", "php": "composer", "dart": None}[lang]
479
513
  need = {"typescript": "node", "php": "php", "dart": None}[lang]
480
514
  dart = find_dart() if lang == "dart" else None
@@ -503,3 +537,22 @@ def setup(langs: list[str] | None = None, quiet: bool = False) -> int:
503
537
  print(f"{lang}: failed: {e}", file=sys.stderr)
504
538
  rc = 1
505
539
  return rc
540
+
541
+
542
+ def _setup_java(quiet: bool) -> int:
543
+ """`cg setup java`: the same scip-java / JDK hint as `install.sh --with java`. Heuristic mode needs neither."""
544
+ from .plugins.kotlin.exact import find_java, scip_java_candidates
545
+ jdk = find_java()
546
+ tools = scip_java_candidates()
547
+ if jdk:
548
+ print(f"java: JDK found ({jdk}). scip-java needs JDK 17+ (17, 21 or 25).")
549
+ else:
550
+ print("java: no JDK found. Install JDK 17+ (17, 21 or 25; https://adoptium.net).", file=sys.stderr)
551
+ if tools:
552
+ print(f"java: scip-java found ({tools[0]}). Exact mode stays opt-in, because it runs the build: CG_JAVA_SCIP=1")
553
+ else:
554
+ print("java: scip-java not found. install.sh --with java installs it (the same path as --with kotlin).",
555
+ file=sys.stderr)
556
+ if not quiet:
557
+ print("java: heuristic indexing uses tree-sitter-java and does not need a JDK.")
558
+ return 0
@@ -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
 
@@ -206,11 +208,18 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
206
208
  for fw in frameworks:
207
209
  if f"{fw.language}/{fw.name}" not in stats["plugins"]:
208
210
  stats["plugins"][f"{fw.language}/{fw.name}"] = {"status": "detected; language plugin not active"}
211
+ kp = project.options.get("kotlin_plugin")
212
+ if kp is not None and not getattr(kp, "_exact_done", False):
213
+ kp._finish_exact(project, project.options.get("kotlin_files") or [], kp._exported_stats)
209
214
  if scip:
210
215
  from .plugins.scip.importer import import_scip
211
216
  for s in scip:
212
217
  if s in (project.options.get("scip_consumed") or []):
213
- stats["plugins"][f"scip:{s}"] = {"status": "imported by the Kotlin plugin (exact layer)"}
218
+ who = (project.options.get("scip_consumed_by") or {}).get(s) or ["kotlin"]
219
+ names = [w.capitalize() for w in who]
220
+ word = "plugin" if len(names) == 1 else "plugins"
221
+ stats["plugins"][f"scip:{s}"] = {
222
+ "status": f"imported by the {' and '.join(names)} {word} (exact layer)"}
214
223
  continue
215
224
  stats["plugins"][f"scip:{s}"] = import_scip(s, builder)
216
225
  # generated / copied / vendored files: out of the graph (default) or labelled (attrs.generated)
@@ -946,7 +946,7 @@ def coverage(path: str | None = None, all_files: bool = False, json_output: bool
946
946
  exact-mode indexer such as rust-analyzer or scip-clang is missing, skipped when the toolchain is missing, with the
947
947
  install hint) and file completeness (discovered vs indexed, with parse failures, files over the size limit,
948
948
  unmapped files outside the source roots, excluded files); unsupported source types by extension or shebang
949
- (.go .java .kt .swift .qml .sh ...); blind spots: route / handler registrations cg does not model, with file:line.
949
+ (.go .qml .sh ...); blind spots: route / handler registrations cg does not model, with file:line.
950
950
  path (optional): a file or directory; says whether cg has it in the graph. all_files: list every file per bucket
951
951
  (default: the first 5). json_output: the completeness object as JSON. Not covered, heuristic or a blind spot
952
952
  means: use your normal search and file reading for that part."""