cg-code-graph 0.19.0__tar.gz → 0.20.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 (358) hide show
  1. {cg_code_graph-0.19.0/cg_code_graph.egg-info → cg_code_graph-0.20.0}/PKG-INFO +10 -10
  2. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/README.md +9 -9
  3. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/__init__.py +1 -1
  4. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/cli.py +3 -2
  5. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/extractors.py +33 -8
  6. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/coverage.py +16 -0
  7. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/mcp_server.py +12 -3
  8. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/payload.py +261 -38
  9. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/express/plugin.py +120 -17
  10. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/plugin.py +168 -1
  11. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/values.py +199 -3
  12. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/extract.php +28 -4
  13. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/gating.py +12 -3
  14. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/http_client.py +20 -4
  15. cg_code_graph-0.20.0/cg_code_graph/plugins/php/inline_guards.py +758 -0
  16. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/plugin.py +4 -1
  17. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +134 -6
  18. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +15 -2
  19. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/view.py +5 -3
  20. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/query.py +25 -19
  21. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/routes.py +40 -8
  22. cg_code_graph-0.20.0/cg_code_graph/webhooks.py +1426 -0
  23. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0/cg_code_graph.egg-info}/PKG-INFO +10 -10
  24. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/SOURCES.txt +5 -0
  25. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_coverage.py +4 -4
  26. cg_code_graph-0.20.0/tests/test_echo_ref.py +48 -0
  27. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_elysia.py +13 -0
  28. cg_code_graph-0.20.0/tests/test_inline_guards.py +186 -0
  29. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_packaging.py +76 -4
  30. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_php_http.py +16 -1
  31. cg_code_graph-0.20.0/tests/test_request_keys.py +229 -0
  32. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_routes_search_explain.py +12 -4
  33. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_nuxt.py +8 -3
  34. cg_code_graph-0.20.0/tests/test_webhooks_152.py +159 -0
  35. cg_code_graph-0.19.0/cg_code_graph/webhooks.py +0 -598
  36. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/LICENSE +0 -0
  37. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/MANIFEST.in +0 -0
  38. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/__main__.py +0 -0
  39. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/affected.py +0 -0
  40. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/agent_rules.py +0 -0
  41. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/agents.py +0 -0
  42. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/aitools.py +0 -0
  43. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/android_ipc.py +0 -0
  44. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/apple_ipc.py +0 -0
  45. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/apps.py +0 -0
  46. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/blindspots.py +0 -0
  47. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/bridges.py +0 -0
  48. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/brokers.py +0 -0
  49. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/concepts.py +0 -0
  50. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/config.py +0 -0
  51. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/__init__.py +0 -0
  52. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/cache.py +0 -0
  53. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/detect.py +0 -0
  54. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/env.py +0 -0
  55. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/fsutil.py +0 -0
  56. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/generated.py +0 -0
  57. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/model.py +0 -0
  58. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/paths.py +0 -0
  59. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/plugin.py +0 -0
  60. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/store.py +0 -0
  61. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/syntax_errors.py +0 -0
  62. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/dart_isolates.py +0 -0
  63. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/doctor.py +0 -0
  64. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/explore.py +0 -0
  65. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/external.py +0 -0
  66. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/graphql.py +0 -0
  67. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/hooks.py +0 -0
  68. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/indexer.py +0 -0
  69. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/jobs.py +0 -0
  70. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/link.py +0 -0
  71. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/lint_async.py +0 -0
  72. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/local_ipc.py +0 -0
  73. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/local_sockets.py +0 -0
  74. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/mcp_install.py +0 -0
  75. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/parity.py +0 -0
  76. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/parity_structure.py +0 -0
  77. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plans.py +0 -0
  78. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/platform_scan.py +0 -0
  79. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/platforms.py +0 -0
  80. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/__init__.py +0 -0
  81. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
  82. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/content.py +0 -0
  83. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
  84. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  85. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  86. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  87. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
  88. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
  89. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  90. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  91. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  92. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/http.py +0 -0
  93. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/models.py +0 -0
  94. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
  95. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/program.py +0 -0
  96. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/__init__.py +0 -0
  97. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/extras.py +0 -0
  98. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/models.py +0 -0
  99. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/plugin.py +0 -0
  100. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/schemas.py +0 -0
  101. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/shapes.py +0 -0
  102. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/urls.py +0 -0
  103. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/express/__init__.py +0 -0
  104. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  105. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  106. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/__init__.py +0 -0
  107. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/exact.py +0 -0
  108. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/plugin.py +0 -0
  109. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  110. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/interop.py +0 -0
  111. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/spring.py +0 -0
  112. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  113. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  114. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
  115. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  116. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  117. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  118. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
  119. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/__init__.py +0 -0
  120. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/gates.py +0 -0
  121. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/runner.py +0 -0
  122. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/scipread.py +0 -0
  123. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/ts.py +0 -0
  124. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nest/__init__.py +0 -0
  125. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
  126. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  127. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  128. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  129. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  130. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/__init__.py +0 -0
  131. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/external.py +0 -0
  132. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  133. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  134. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/strings.py +0 -0
  135. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/__init__.py +0 -0
  136. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/aitools.py +0 -0
  137. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/external.py +0 -0
  138. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/fields.py +0 -0
  139. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/plugin.py +0 -0
  140. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/refs.py +0 -0
  141. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/roots.py +0 -0
  142. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/socketio.py +0 -0
  143. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/subproc.py +0 -0
  144. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/tests.py +0 -0
  145. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/values.py +0 -0
  146. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  147. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  148. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
  149. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/__init__.py +0 -0
  150. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
  151. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
  152. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
  153. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/__init__.py +0 -0
  154. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/importer.py +0 -0
  155. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
  156. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  157. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  158. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  159. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/__init__.py +0 -0
  160. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  161. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/exact.py +0 -0
  162. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  163. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/packages.py +0 -0
  164. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/plugin.py +0 -0
  165. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/__init__.py +0 -0
  166. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  167. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  168. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  169. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  170. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/nav.py +0 -0
  171. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/plugin.py +0 -0
  172. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/react_router.py +0 -0
  173. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  174. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/common.py +0 -0
  175. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
  176. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/__init__.py +0 -0
  177. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
  178. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/common.yaml +0 -0
  179. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/dart.yaml +0 -0
  180. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
  181. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/django.yaml +0 -0
  182. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  183. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/express.yaml +0 -0
  184. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/java.yaml +0 -0
  185. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/kotlin.yaml +0 -0
  186. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/laravel.yaml +0 -0
  187. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nest.yaml +0 -0
  188. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nextjs.yaml +0 -0
  189. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nuxt.yaml +0 -0
  190. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/php.yaml +0 -0
  191. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/python.yaml +0 -0
  192. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/react-router.yaml +0 -0
  193. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/rust.yaml +0 -0
  194. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/spring.yaml +0 -0
  195. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/swift.yaml +0 -0
  196. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/typescript.yaml +0 -0
  197. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/process_runs.py +0 -0
  198. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/__init__.py +0 -0
  199. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/builtin.py +0 -0
  200. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/matchers.py +0 -0
  201. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime.py +0 -0
  202. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_events.py +0 -0
  203. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_native.py +0 -0
  204. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_ws.py +0 -0
  205. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/roundtrip.py +0 -0
  206. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/rpc.py +0 -0
  207. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/sdk_systems.py +0 -0
  208. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/sockets.py +0 -0
  209. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/starters.py +0 -0
  210. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/tests_index.py +0 -0
  211. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/udp_apps.py +0 -0
  212. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/__init__.py +0 -0
  213. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/graph.py +0 -0
  214. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/server.py +0 -0
  215. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/app.css +0 -0
  216. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/app.js +0 -0
  217. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/index.html +0 -0
  218. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/layered.js +0 -0
  219. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  220. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  221. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  222. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  223. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  224. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
  225. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/package.json +0 -0
  226. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  227. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/watch.py +0 -0
  228. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/xcode.py +0 -0
  229. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  230. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
  231. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/requires.txt +0 -0
  232. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/top_level.txt +0 -0
  233. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/pyproject.toml +0 -0
  234. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/setup.cfg +0 -0
  235. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_affected.py +0 -0
  236. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_agents_install.py +0 -0
  237. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_agents_md.py +0 -0
  238. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ai_tools.py +0 -0
  239. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_android_ipc.py +0 -0
  240. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_apple_ipc.py +0 -0
  241. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro.py +0 -0
  242. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro_content.py +0 -0
  243. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro_server.py +0 -0
  244. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_bridges.py +0 -0
  245. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
  246. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_brokers.py +0 -0
  247. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_clean.py +0 -0
  248. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_invalidation.py +0 -0
  249. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_migration.py +0 -0
  250. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_channels_tests.py +0 -0
  251. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cli_output.py +0 -0
  252. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_completeness.py +0 -0
  253. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_config_extras.py +0 -0
  254. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_coverage_ts_hint.py +0 -0
  255. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_dart_isolates.py +0 -0
  256. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_dispatch_interfaces.py +0 -0
  257. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_django_flutter.py +0 -0
  258. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_docs_languages.py +0 -0
  259. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_docs_links.py +0 -0
  260. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_enum_constants.py +0 -0
  261. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_env.py +0 -0
  262. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_explore.py +0 -0
  263. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_external.py +0 -0
  264. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_gating.py +0 -0
  265. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_generated.py +0 -0
  266. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_graphql.py +0 -0
  267. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_hooks.py +0 -0
  268. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_impact_overrides.py +0 -0
  269. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_index_isolation.py +0 -0
  270. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_inherited_overrides.py +0 -0
  271. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_java.py +0 -0
  272. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_java_exact.py +0 -0
  273. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_jobs.py +0 -0
  274. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_js_refs.py +0 -0
  275. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_js_runtime.py +0 -0
  276. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin.py +0 -0
  277. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_binding.py +0 -0
  278. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_exact.py +0 -0
  279. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_fields.py +0 -0
  280. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_mixed.py +0 -0
  281. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_nav_consts.py +0 -0
  282. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_props.py +0 -0
  283. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_laravel_determinism.py +0 -0
  284. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_laravel_resources.py +0 -0
  285. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_lint_async.py +0 -0
  286. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_local_ipc.py +0 -0
  287. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_local_sockets.py +0 -0
  288. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp.py +0 -0
  289. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp_index.py +0 -0
  290. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp_install.py +0 -0
  291. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_cfamily.py +0 -0
  292. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_concurrency.py +0 -0
  293. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_rust.py +0 -0
  294. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_nuxt_import_dirs.py +0 -0
  295. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_nuxt_rootsrc.py +0 -0
  296. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_parity.py +0 -0
  297. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_parity_structure.py +0 -0
  298. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_php_props.py +0 -0
  299. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_plain_js.py +0 -0
  300. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_plans.py +0 -0
  301. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platform_gaps.py +0 -0
  302. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platform_type_variants.py +0 -0
  303. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platforms.py +0 -0
  304. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platforms_apple.py +0 -0
  305. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_presets_config.py +0 -0
  306. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_process_ipc.py +0 -0
  307. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_process_runs.py +0 -0
  308. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_protocols.py +0 -0
  309. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_app_tests_module.py +0 -0
  310. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_collection_chains.py +0 -0
  311. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_compat.py +0 -0
  312. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_entry_refs.py +0 -0
  313. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_fields.py +0 -0
  314. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_infer_cycles.py +0 -0
  315. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_roots.py +0 -0
  316. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_subprocess_tests.py +0 -0
  317. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_tests.py +0 -0
  318. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_hosts.py +0 -0
  319. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_routes.py +0 -0
  320. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_routes_more.py +0 -0
  321. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_react_router.py +0 -0
  322. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_realtime.py +0 -0
  323. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_realtime_native.py +0 -0
  324. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_roundtrip.py +0 -0
  325. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_route_tables.py +0 -0
  326. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_rpc.py +0 -0
  327. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_scip_health.py +0 -0
  328. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_sdk_external.py +0 -0
  329. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_snippet.py +0 -0
  330. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_sockets.py +0 -0
  331. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_spring.py +0 -0
  332. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_starters_budget.py +0 -0
  333. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift.py +0 -0
  334. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_binding.py +0 -0
  335. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_exact.py +0 -0
  336. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_facts.py +0 -0
  337. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_fields.py +0 -0
  338. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_modules.py +0 -0
  339. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_more.py +0 -0
  340. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_nav_values.py +0 -0
  341. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_parse_errors.py +0 -0
  342. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_props.py +0 -0
  343. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_sdk.py +0 -0
  344. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_testing.py +0 -0
  345. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_values.py +0 -0
  346. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_tests_scope.py +0 -0
  347. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_fields.py +0 -0
  348. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_fields_js_vue.py +0 -0
  349. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_file_specs.py +0 -0
  350. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_frameworks.py +0 -0
  351. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_src_tsconfig.py +0 -0
  352. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_values.py +0 -0
  353. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_viz.py +0 -0
  354. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_vue_nav.py +0 -0
  355. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_watch.py +0 -0
  356. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_webhooks.py +0 -0
  357. {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_websockets.py +0 -0
  358. {cg_code_graph-0.19.0 → cg_code_graph-0.20.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.19.0
3
+ Version: 0.20.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
@@ -33,11 +33,11 @@ Dynamic: license-file
33
33
 
34
34
  For you and your AI agent (CLI + MCP). No LLM in the graph.
35
35
 
36
- [![PyPI](https://img.shields.io/pypi/v/cg-code-graph)](https://pypi.org/project/cg-code-graph/) [![Downloads](https://img.shields.io/pepy/dt/cg-code-graph)](https://pepy.tech/project/cg-code-graph) [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB)](https://pypi.org/project/cg-code-graph/) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![Docs](https://img.shields.io/badge/docs-code--graph-93b600)](https://code-graph.cyberchronos00.workers.dev/)
36
+ [![PyPI](https://img.shields.io/pypi/v/cg-code-graph)](https://pypi.org/project/cg-code-graph/) [![Downloads](https://img.shields.io/pepy/dt/cg-code-graph)](https://pepy.tech/project/cg-code-graph) [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB)](https://pypi.org/project/cg-code-graph/) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE) [![Docs](https://img.shields.io/badge/docs-code--graph-93b600)](https://code-graph.cyberchronos00.workers.dev/)
37
37
 
38
- [Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](CHANGELOG.md)
38
+ [Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md)
39
39
 
40
- [![cg visual view: the graph around the warehouse connection, a selected node with its evidence paths and source, then the planned-change overlay for the preorders plan](docs/media/cg-view-preview.gif)](docs/media/cg-view-demo.mp4)
40
+ [![cg visual view: the graph around the warehouse connection, a selected node with its evidence paths and source, then the planned-change overlay for the preorders plan](https://raw.githubusercontent.com/cyberchronos00/code-graph/main/docs/media/cg-view-preview.gif)](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-view-demo.mp4)
41
41
 
42
42
  </div>
43
43
 
@@ -67,7 +67,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
67
67
  -READS_TABLE[resolved @ catalog/tasks.py:14]-> table:store_books
68
68
  ```
69
69
 
70
- [![Terminal demo: cg indexes the bundled Laravel and Nuxt sample apps, links them, then runs reaches, path, impact and plan check](docs/media/cg-terminal-demo.gif)](docs/media/cg-terminal-demo.mp4)
70
+ [![Terminal demo: cg indexes the bundled Laravel and Nuxt sample apps, links them, then runs reaches, path, impact and plan check](https://raw.githubusercontent.com/cyberchronos00/code-graph/main/docs/media/cg-terminal-demo.gif)](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-terminal-demo.mp4)
71
71
 
72
72
  ## Supported languages
73
73
 
@@ -75,7 +75,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
75
75
  |---|---|---|---|
76
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) |
77
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
+ | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes, route attributes, middleware, queues, broadcasting, outbound HTTP) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
79
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) |
80
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
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) |
@@ -88,8 +88,8 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
88
88
 
89
89
  - `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
90
90
  - `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
91
- - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
92
- - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
91
+ - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
92
+ - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
93
93
  - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
94
94
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
95
95
 
@@ -97,6 +97,6 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
97
97
 
98
98
  [Install](https://code-graph.cyberchronos00.workers.dev/docs/install) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Configuration](https://code-graph.cyberchronos00.workers.dev/docs/configuration) · [Architecture](https://code-graph.cyberchronos00.workers.dev/docs/architecture) · [Limitations](https://code-graph.cyberchronos00.workers.dev/docs/limitations)
99
99
 
100
- [Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · MIT [License](LICENSE)
100
+ [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md) · [Contributing](https://github.com/cyberchronos00/code-graph/blob/main/CONTRIBUTING.md) · [Security](https://github.com/cyberchronos00/code-graph/blob/main/SECURITY.md) · MIT [License](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE)
101
101
 
102
- More recordings: [docs/media](docs/media).
102
+ More recordings: [docs/media](https://github.com/cyberchronos00/code-graph/tree/main/docs/media).
@@ -6,11 +6,11 @@
6
6
 
7
7
  For you and your AI agent (CLI + MCP). No LLM in the graph.
8
8
 
9
- [![PyPI](https://img.shields.io/pypi/v/cg-code-graph)](https://pypi.org/project/cg-code-graph/) [![Downloads](https://img.shields.io/pepy/dt/cg-code-graph)](https://pepy.tech/project/cg-code-graph) [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB)](https://pypi.org/project/cg-code-graph/) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![Docs](https://img.shields.io/badge/docs-code--graph-93b600)](https://code-graph.cyberchronos00.workers.dev/)
9
+ [![PyPI](https://img.shields.io/pypi/v/cg-code-graph)](https://pypi.org/project/cg-code-graph/) [![Downloads](https://img.shields.io/pepy/dt/cg-code-graph)](https://pepy.tech/project/cg-code-graph) [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB)](https://pypi.org/project/cg-code-graph/) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE) [![Docs](https://img.shields.io/badge/docs-code--graph-93b600)](https://code-graph.cyberchronos00.workers.dev/)
10
10
 
11
- [Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](CHANGELOG.md)
11
+ [Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md)
12
12
 
13
- [![cg visual view: the graph around the warehouse connection, a selected node with its evidence paths and source, then the planned-change overlay for the preorders plan](docs/media/cg-view-preview.gif)](docs/media/cg-view-demo.mp4)
13
+ [![cg visual view: the graph around the warehouse connection, a selected node with its evidence paths and source, then the planned-change overlay for the preorders plan](https://raw.githubusercontent.com/cyberchronos00/code-graph/main/docs/media/cg-view-preview.gif)](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-view-demo.mp4)
14
14
 
15
15
  </div>
16
16
 
@@ -40,7 +40,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
40
40
  -READS_TABLE[resolved @ catalog/tasks.py:14]-> table:store_books
41
41
  ```
42
42
 
43
- [![Terminal demo: cg indexes the bundled Laravel and Nuxt sample apps, links them, then runs reaches, path, impact and plan check](docs/media/cg-terminal-demo.gif)](docs/media/cg-terminal-demo.mp4)
43
+ [![Terminal demo: cg indexes the bundled Laravel and Nuxt sample apps, links them, then runs reaches, path, impact and plan check](https://raw.githubusercontent.com/cyberchronos00/code-graph/main/docs/media/cg-terminal-demo.gif)](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-terminal-demo.mp4)
44
44
 
45
45
  ## Supported languages
46
46
 
@@ -48,7 +48,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
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
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) |
51
+ | ![PHP](https://img.shields.io/badge/PHP-777BB4?logo=php&logoColor=white) | Laravel (routes, route attributes, 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
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
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) |
@@ -61,8 +61,8 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
61
61
 
62
62
  - `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
63
63
  - `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
64
- - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
65
- - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
64
+ - Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
65
+ - Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
66
66
  - MCP server (`cg-mcp`) so agents query the graph instead of grepping.
67
67
  - Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
68
68
 
@@ -70,6 +70,6 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
70
70
 
71
71
  [Install](https://code-graph.cyberchronos00.workers.dev/docs/install) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Configuration](https://code-graph.cyberchronos00.workers.dev/docs/configuration) · [Architecture](https://code-graph.cyberchronos00.workers.dev/docs/architecture) · [Limitations](https://code-graph.cyberchronos00.workers.dev/docs/limitations)
72
72
 
73
- [Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · MIT [License](LICENSE)
73
+ [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md) · [Contributing](https://github.com/cyberchronos00/code-graph/blob/main/CONTRIBUTING.md) · [Security](https://github.com/cyberchronos00/code-graph/blob/main/SECURITY.md) · MIT [License](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE)
74
74
 
75
- More recordings: [docs/media](docs/media).
75
+ More recordings: [docs/media](https://github.com/cyberchronos00/code-graph/tree/main/docs/media).
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.19.0"
2
+ __version__ = "0.20.0"
@@ -171,7 +171,8 @@ def main(argv=None):
171
171
  p.add_argument("--writes", nargs="?", const="*", metavar="TABLE", help="routes reaching a DB write (any table, or TABLE)")
172
172
  p.add_argument("--reaches", nargs="+", metavar="SPEC", help="routes reaching any of these nodes (table, column, connection:, env:, Class.method)")
173
173
  p.add_argument("--missing", metavar="NAME", help="keep routes with no guard whose name contains NAME (e.g. auth:api, ApiKeyGuard)")
174
- p.add_argument("--unguarded", action="store_true", help="keep routes with no auth guard (framework presets, the auth name pattern, .cg.yaml auth.extra_patterns and --auth-pattern)")
174
+ p.add_argument("--unguarded", action="store_true", help="keep routes with no auth guard (framework presets, the auth name pattern, .cg.yaml auth.extra_patterns and --auth-pattern). An unconditional inline check (Laravel authorize / permission / shared secret) counts; --strict ignores it")
175
+ p.add_argument("--strict", action="store_true", help="with --unguarded, count only route-level guards (inline checks are still listed)")
175
176
  p.add_argument("--auth-pattern", help="extra regex for guard names that count as auth")
176
177
  p.add_argument("--min-confidence", default="heuristic", choices=["heuristic", "resolved", "exact"])
177
178
  p.add_argument("--max-items", type=int, default=200); p.add_argument("--no-paths", action="store_true"); p.add_argument("--json", action="store_true")
@@ -548,7 +549,7 @@ def main(argv=None):
548
549
  if a.cmd == "routes":
549
550
  from . import routes as R
550
551
  res = R.routes_report(st, writes=a.writes, reaches=a.reaches, missing=a.missing, unguarded=a.unguarded,
551
- auth_pattern=a.auth_pattern, min_conf=a.min_confidence, platform=a.platform)
552
+ strict=a.strict, auth_pattern=a.auth_pattern, min_conf=a.min_confidence, platform=a.platform)
552
553
  if a.json:
553
554
  res["completeness"] = R.route_completeness(st)
554
555
  print(json.dumps(res, indent=1, default=str) if a.json else R.render_routes(res, st, max_items=a.max_items, paths=not a.no_paths))
@@ -5,8 +5,9 @@ The extractor sources ship inside the package (cg_code_graph/plugins/{ts,php,dar
5
5
 
6
6
  - a checkout whose extractor directory already has them (`npm ci` run there) keeps using that directory;
7
7
  - otherwise the sources are copied into a per-user cache directory and the dependencies installed there, on first
8
- use or by `cg setup`. The directory is keyed by the lock file, so an update that only changes the extractor source
9
- reuses the installed dependencies, and one that changes the lock file installs into a fresh directory.
8
+ use or by `cg setup`. The directory is keyed by the lock file and the extractor sources (names and contents), so a
9
+ release that adds or edits a module installs into a fresh directory. A cache directory that is missing a listed
10
+ source is incomplete and is rebuilt.
10
11
 
11
12
  Cache root (core/cache.py): $CG_CACHE, else %LOCALAPPDATA%\\cg on Windows,
12
13
  else $XDG_CACHE_HOME/cg or ~/.cache/cg; the extractors live in <root>/extractors.
@@ -46,7 +47,8 @@ class Spec:
46
47
 
47
48
 
48
49
  SPECS = {
49
- "typescript": Spec("typescript", PLUGINS / "ts" / "extractor", ("extract.mjs", "fw.mjs", "package.json", "package-lock.json"),
50
+ "typescript": Spec("typescript", PLUGINS / "ts" / "extractor", ("extract.mjs", "fw.mjs", "rr.mjs", "package.json",
51
+ "package-lock.json"),
50
52
  "package-lock.json", ("node_modules/typescript/package.json",), "npm", "TypeScript / JavaScript"),
51
53
  "php": Spec("php", PLUGINS / "php" / "extractor", ("extract.php", "composer.json", "composer.lock"), "composer.lock",
52
54
  ("vendor/autoload.php",), "composer", "PHP"),
@@ -63,20 +65,42 @@ def _installed(d: Path, spec: Spec) -> bool:
63
65
  return any((d / m).exists() for m in spec.markers)
64
66
 
65
67
 
68
+ def _missing_sources(spec: Spec, d: Path) -> list[str]:
69
+ """Listed sources that exist in the package but not in the cache directory."""
70
+ return [rel for rel in spec.sources if (spec.pkg / rel).exists() and not (d / rel).exists()]
71
+
72
+
73
+ def _cache_key(spec: Spec) -> str:
74
+ """Lock file plus every source path and its bytes, so a new or edited module does not reuse an old install."""
75
+ h = hashlib.sha256()
76
+ lock = spec.pkg / spec.lock
77
+ h.update(lock.read_bytes() if lock.exists() else b"")
78
+ for rel in spec.sources:
79
+ h.update(b"\0")
80
+ h.update(rel.encode())
81
+ src = spec.pkg / rel
82
+ h.update(b"\0")
83
+ h.update(src.read_bytes() if src.exists() else b"")
84
+ return h.hexdigest()[:12]
85
+
86
+
66
87
  def cache_dir(lang: str) -> Path:
67
88
  spec = SPECS[lang]
68
- lock = spec.pkg / spec.lock
69
- key = hashlib.sha256(lock.read_bytes() if lock.exists() else b"").hexdigest()[:12]
70
- return cache_root() / f"{lang}-{key}"
89
+ return cache_root() / f"{lang}-{_cache_key(spec)}"
71
90
 
72
91
 
73
92
  def workdir(lang: str) -> Path:
74
93
  """The directory the extractor runs from: the package's own one when its dependencies are installed there (a
75
- development checkout), else the cache directory (sources synced into it; dependencies maybe not yet installed)."""
94
+ development checkout), else the cache directory (sources synced into it; dependencies maybe not yet installed).
95
+ A cache directory missing a listed source is rebuilt from the package sources."""
76
96
  spec = SPECS[lang]
77
97
  if _installed(spec.pkg, spec):
78
98
  return spec.pkg
79
99
  d = cache_dir(lang)
100
+ if d.exists() and _missing_sources(spec, d):
101
+ # Incomplete copy (for example a 0.19.0 typescript cache that predates a module): drop it and start over
102
+ # when the key still matches, otherwise cache_dir already points at a fresh directory.
103
+ shutil.rmtree(d, ignore_errors=True)
80
104
  _sync(spec, d)
81
105
  return d
82
106
 
@@ -101,7 +125,8 @@ def status(lang: str) -> dict:
101
125
  if _installed(spec.pkg, spec):
102
126
  return {"installed": True, "dir": str(spec.pkg), "where": "package"}
103
127
  d = cache_dir(lang)
104
- return {"installed": _installed(d, spec), "dir": str(d), "where": "cache"}
128
+ ready = _installed(d, spec) and not _missing_sources(spec, d)
129
+ return {"installed": ready, "dir": str(d), "where": "cache"}
105
130
 
106
131
 
107
132
  JS_RUNTIME_MISSING = (
@@ -338,6 +338,11 @@ def compute(root: str | Path, plugins: dict, scip_imported: bool = False, report
338
338
  e["syntax_error_files"] = len(se)
339
339
  e["parsed_with_errors"] = sum(1 for x in se if not x.get("parse_failed"))
340
340
  e["decls_lost"] = sum(x.get("decls_lost", 0) for x in se)
341
+ if lang == "typescript" and st and st.get("realtime_subscriptions_unresolved_receiver"):
342
+ e["realtime_subscriptions_unresolved_receiver"] = st["realtime_subscriptions_unresolved_receiver"]
343
+ at = st.get("realtime_subscriptions_unresolved_receiver_at") or []
344
+ if at:
345
+ e["realtime_subscriptions_unresolved_receiver_at"] = at[:8]
341
346
  if lang == "python" and st:
342
347
  for k in ("roots_mode", "source_roots", "roots_warnings", "roots_ambiguous", "module_name_collisions"):
343
348
  if st.get(k):
@@ -497,6 +502,16 @@ def _entry_text(e: dict) -> str:
497
502
  return f"{e['language']} {e['files']} {e['status'].replace('_', ' ')}{errs}"
498
503
 
499
504
 
505
+ def realtime_unresolved_lines(e: dict, indent: str = " ") -> list[str]:
506
+ """'.private(...)' on a receiver that is not an Echo client, with a channel literal: where to look."""
507
+ n = e.get("realtime_subscriptions_unresolved_receiver") or 0
508
+ if not n or e.get("language") != "typescript":
509
+ return []
510
+ at = e.get("realtime_subscriptions_unresolved_receiver_at") or []
511
+ where = f" ({', '.join(at[:5])})" if at else ""
512
+ return [f"{indent}typescript: {n} .private(...) call{'s' if n != 1 else ''} on an unknown receiver{where}"]
513
+
514
+
500
515
  def syntax_error_lines(e: dict, all_files: bool = False, indent: str = " ") -> list[str]:
501
516
  """'swift: syntax errors in 8 files, 12 declarations lost (most first):' and one line per file with its error
502
517
  line spans and the declarations lost there (5 files unless all_files), #73."""
@@ -702,6 +717,7 @@ def render(covs: dict[str, dict | None], all_files: bool = False) -> str:
702
717
  out.append(f" fix: {e['hint']}")
703
718
  for e in (cov or {}).get("languages", []):
704
719
  out += syntax_error_lines(e, all_files)
720
+ out += realtime_unresolved_lines(e)
705
721
  for e in (cov or {}).get("languages", []): # which mode an exact-capable language ran in, and why
706
722
  if e["language"] in ("kotlin", "swift", "java") and not _is_gap(e) and e.get("reason"):
707
723
  out.append(f" {e['language']}: {e['files']} files {e['status']}: {e['reason']}")
@@ -904,13 +904,16 @@ def explore(query: str, budget_tokens: int = 3000, max_symbols: int = 4) -> str:
904
904
 
905
905
  @tool
906
906
  def routes(writes: str | None = None, reaches: list[str] | None = None, missing: str | None = None,
907
- unguarded: bool = False, auth_pattern: str | None = None, max_items: int = 40, paths: bool = True,
907
+ unguarded: bool = False, strict: bool = False, auth_pattern: str | None = None, max_items: int = 40, paths: bool = True,
908
908
  min_confidence: str = "heuristic", platform: str | None = None) -> str:
909
909
  """Routes with their middleware / guards / auth, in one call. Optional scope: writes="*" (routes that reach any
910
910
  DB write) or writes="<table>", reaches=[specs] (routes that reach any of these nodes: table, column, connection,
911
911
  method, env key...). Optional filters: missing="<name>" keeps routes with no guard whose name contains it (e.g.
912
912
  "auth:api", "ApiKeyGuard"), unguarded=true keeps routes with no auth guard (the framework presets' auth guards and
913
- the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns). Each route: guards, what it reaches with one evidence chain, and the frontend callers on a
913
+ the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns). An unconditional
914
+ inline check on a Laravel action (authorize, Gate, a permission check, FormRequest::authorize, controller
915
+ middleware, a shared-secret compare) is listed under guards as `inline:` and counts for unguarded. strict=true
916
+ with unguarded counts only route-level guards. Each route: guards, what it reaches with one evidence chain, and the frontend callers on a
914
917
  combined graph. Guards come from Laravel middleware, Nest guards/interceptors, Express/Koa/Fastify/Hono/Elysia
915
918
  middleware, Next.js middleware.ts / handler wrappers, django-ninja auth= and Django/DRF view access checks.
916
919
  min_confidence: keep the default (heuristic) for reviews: every edge still shows its own label, and a stricter
@@ -923,7 +926,7 @@ def routes(writes: str | None = None, reaches: list[str] | None = None, missing:
923
926
  st = _st()
924
927
  pf, _ = _platform(st, platform)
925
928
  _scope(whole=True, categories=("route",), unsupported=False)
926
- res = R.routes_report(st, writes=writes, reaches=reaches, missing=missing, unguarded=unguarded,
929
+ res = R.routes_report(st, writes=writes, reaches=reaches, missing=missing, unguarded=unguarded, strict=strict,
927
930
  auth_pattern=auth_pattern, min_conf=min_confidence, platform=pf)
928
931
  return R.render_routes(res, st, max_items=max_items, paths=paths, compact=True)
929
932
 
@@ -1149,6 +1152,12 @@ def api_calls(filter: str = "all", max_items: int = 60) -> str:
1149
1152
  for c in r["calls"][:3]:
1150
1153
  h = f" via {short(c['via_helper']['fn'])}" if c.get("via_helper") else ""
1151
1154
  out.append(f" ← {short(c['caller'])} @ {at(c['at'])}{h}")
1155
+ bk = Q._key_names(c.get("body_keys"))
1156
+ qk = Q._key_names(c.get("query_keys"))
1157
+ if bk:
1158
+ out.append(f" body keys: {', '.join(bk)}")
1159
+ if qk:
1160
+ out.append(f" query keys: {', '.join(qk)}")
1152
1161
  for g in gaps.get(r["endpoint"], [])[:3]:
1153
1162
  out.append(f" ! {short(g['caller'])} @ {at(g['call_at'])} passes {', '.join(g['dropped'])}: sent but not forwarded "
1154
1163
  f"(request sends {', '.join(g['request_keys'])})")