cg-code-graph 0.23.13__tar.gz → 0.23.14__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 (430) hide show
  1. {cg_code_graph-0.23.13/cg_code_graph.egg-info → cg_code_graph-0.23.14}/PKG-INFO +7 -5
  2. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/README.md +5 -3
  3. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/__init__.py +1 -1
  4. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/cli.py +115 -8
  5. cg_code_graph-0.23.14/cg_code_graph/cli_errors.py +171 -0
  6. cg_code_graph-0.23.14/cg_code_graph/core/detect.py +251 -0
  7. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/doctor.py +53 -0
  8. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/hooks.py +9 -1
  9. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/indexer.py +12 -0
  10. cg_code_graph-0.23.14/cg_code_graph/l10n.py +603 -0
  11. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/mcp_graphs.py +149 -15
  12. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/mcp_install.py +12 -4
  13. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/mcp_server.py +8 -0
  14. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/query.py +58 -0
  15. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14/cg_code_graph.egg-info}/PKG-INFO +7 -5
  16. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/SOURCES.txt +5 -0
  17. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/pyproject.toml +1 -1
  18. cg_code_graph-0.23.14/tests/test_cli_ergonomics.py +191 -0
  19. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_cli_output.py +2 -1
  20. cg_code_graph-0.23.14/tests/test_cloud_bootstrap.py +194 -0
  21. cg_code_graph-0.23.14/tests/test_detect_l10n.py +122 -0
  22. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_incomplete_239.py +2 -1
  23. cg_code_graph-0.23.13/cg_code_graph/core/detect.py +0 -120
  24. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/LICENSE +0 -0
  25. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/MANIFEST.in +0 -0
  26. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/__main__.py +0 -0
  27. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/affected.py +0 -0
  28. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/agent_rules.py +0 -0
  29. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/agents.py +0 -0
  30. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/aitools.py +0 -0
  31. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/android_ipc.py +0 -0
  32. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/apple_ipc.py +0 -0
  33. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/apps.py +0 -0
  34. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/blindspots.py +0 -0
  35. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/bridges.py +0 -0
  36. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/brokers.py +0 -0
  37. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/cmake_sources.py +0 -0
  38. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/concepts.py +0 -0
  39. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/config.py +0 -0
  40. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/__init__.py +0 -0
  41. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/cache.py +0 -0
  42. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/env.py +0 -0
  43. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/extractors.py +0 -0
  44. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/fsutil.py +0 -0
  45. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/generated.py +0 -0
  46. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/model.py +0 -0
  47. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/paths.py +0 -0
  48. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/plugin.py +0 -0
  49. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/redact.py +0 -0
  50. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/store.py +0 -0
  51. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/core/syntax_errors.py +0 -0
  52. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/coverage.py +0 -0
  53. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/dart_isolates.py +0 -0
  54. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/explore.py +0 -0
  55. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/external.py +0 -0
  56. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/graphql.py +0 -0
  57. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/guard_facts.py +0 -0
  58. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/insecure_transport.py +0 -0
  59. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/install_rules.py +0 -0
  60. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/jobs.py +0 -0
  61. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/link.py +0 -0
  62. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/lint_async.py +0 -0
  63. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/local_ipc.py +0 -0
  64. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/local_sockets.py +0 -0
  65. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/parity.py +0 -0
  66. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/parity_structure.py +0 -0
  67. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/payload.py +0 -0
  68. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plans.py +0 -0
  69. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/platform_scan.py +0 -0
  70. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/platforms.py +0 -0
  71. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/__init__.py +0 -0
  72. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/__init__.py +0 -0
  73. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/content.py +0 -0
  74. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/plugin.py +0 -0
  75. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  76. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  77. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  78. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/__init__.py +0 -0
  79. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/bridges.py +0 -0
  80. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  81. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  82. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  83. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/http.py +0 -0
  84. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/models.py +0 -0
  85. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/plugin.py +0 -0
  86. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/program.py +0 -0
  87. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/__init__.py +0 -0
  88. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/extras.py +0 -0
  89. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/models.py +0 -0
  90. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/plugin.py +0 -0
  91. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/schemas.py +0 -0
  92. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/shapes.py +0 -0
  93. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/urls.py +0 -0
  94. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/express/__init__.py +0 -0
  95. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/express/plugin.py +0 -0
  96. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  97. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  98. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/__init__.py +0 -0
  99. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/exact.py +0 -0
  100. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/plugin.py +0 -0
  101. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  102. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/interop.py +0 -0
  103. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/spring.py +0 -0
  104. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  105. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  106. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
  107. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  108. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  109. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  110. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/massassign.py +0 -0
  111. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  112. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/tests.py +0 -0
  113. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/values.py +0 -0
  114. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/__init__.py +0 -0
  115. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/gates.py +0 -0
  116. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/runner.py +0 -0
  117. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/scipread.py +0 -0
  118. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/ts.py +0 -0
  119. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nest/__init__.py +0 -0
  120. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nest/plugin.py +0 -0
  121. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  122. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  123. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  124. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  125. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/__init__.py +0 -0
  126. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/external.py +0 -0
  127. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  128. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  129. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  130. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/gating.py +0 -0
  131. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/http_client.py +0 -0
  132. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/inline_guards.py +0 -0
  133. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/plugin.py +0 -0
  134. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/strings.py +0 -0
  135. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/__init__.py +0 -0
  136. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/aitools.py +0 -0
  137. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/external.py +0 -0
  138. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/fields.py +0 -0
  139. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/plugin.py +0 -0
  140. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/refs.py +0 -0
  141. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/roots.py +0 -0
  142. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/socketio.py +0 -0
  143. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/subproc.py +0 -0
  144. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/tests.py +0 -0
  145. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/values.py +0 -0
  146. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  147. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  148. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/values.py +0 -0
  149. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/__init__.py +0 -0
  150. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/cargo.py +0 -0
  151. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/plugin.py +0 -0
  152. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/syntax.py +0 -0
  153. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/__init__.py +0 -0
  154. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/importer.py +0 -0
  155. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/scip.proto +0 -0
  156. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  157. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  158. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  159. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/__init__.py +0 -0
  160. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  161. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/exact.py +0 -0
  162. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  163. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/packages.py +0 -0
  164. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/plugin.py +0 -0
  165. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/__init__.py +0 -0
  166. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  167. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  168. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  169. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  170. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  171. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  172. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/nav.py +0 -0
  173. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/plugin.py +0 -0
  174. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/react_router.py +0 -0
  175. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  176. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/common.py +0 -0
  177. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/data.py +0 -0
  178. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/__init__.py +0 -0
  179. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/c_cpp.yaml +0 -0
  180. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/common.yaml +0 -0
  181. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/dart.yaml +0 -0
  182. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/django-ninja.yaml +0 -0
  183. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/django.yaml +0 -0
  184. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  185. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/express.yaml +0 -0
  186. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/java.yaml +0 -0
  187. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/kotlin.yaml +0 -0
  188. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/laravel.yaml +0 -0
  189. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/nest.yaml +0 -0
  190. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/nextjs.yaml +0 -0
  191. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/nuxt.yaml +0 -0
  192. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/php.yaml +0 -0
  193. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/python.yaml +0 -0
  194. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/react-router.yaml +0 -0
  195. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/rust.yaml +0 -0
  196. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/spring.yaml +0 -0
  197. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/swift.yaml +0 -0
  198. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/presets/typescript.yaml +0 -0
  199. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/process_runs.py +0 -0
  200. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/protocols/__init__.py +0 -0
  201. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/protocols/builtin.py +0 -0
  202. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/protocols/matchers.py +0 -0
  203. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/protocols/view.py +0 -0
  204. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/realtime.py +0 -0
  205. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/realtime_events.py +0 -0
  206. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/realtime_native.py +0 -0
  207. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/realtime_ws.py +0 -0
  208. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/roundtrip.py +0 -0
  209. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/routes.py +0 -0
  210. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/rpc.py +0 -0
  211. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/sdk_systems.py +0 -0
  212. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/sockets.py +0 -0
  213. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/ssrf_input.py +0 -0
  214. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/starters.py +0 -0
  215. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/surface.py +0 -0
  216. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/tests_index.py +0 -0
  217. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/udp_apps.py +0 -0
  218. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/update_check.py +0 -0
  219. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/__init__.py +0 -0
  220. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/graph.py +0 -0
  221. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/server.py +0 -0
  222. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/app.css +0 -0
  223. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/app.js +0 -0
  224. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/index.html +0 -0
  225. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/layered.js +0 -0
  226. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  227. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  228. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  229. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  230. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  231. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/package-lock.json +0 -0
  232. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/package.json +0 -0
  233. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  234. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/watch.py +0 -0
  235. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/webhook_subs.py +0 -0
  236. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/webhooks.py +0 -0
  237. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph/xcode.py +0 -0
  238. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  239. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/entry_points.txt +0 -0
  240. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/requires.txt +0 -0
  241. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/top_level.txt +0 -0
  242. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/setup.cfg +0 -0
  243. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_affected.py +0 -0
  244. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_agents_install.py +0 -0
  245. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_agents_md.py +0 -0
  246. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ai_tools.py +0 -0
  247. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_android_ipc.py +0 -0
  248. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_apple_ipc.py +0 -0
  249. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_astro.py +0 -0
  250. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_astro_content.py +0 -0
  251. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_astro_server.py +0 -0
  252. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_bridges.py +0 -0
  253. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_bridges_pigeon_monorepo.py +0 -0
  254. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_brokers.py +0 -0
  255. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_cache_clean.py +0 -0
  256. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_cache_invalidation.py +0 -0
  257. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_cache_migration.py +0 -0
  258. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_channels_tests.py +0 -0
  259. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_cmake_sources.py +0 -0
  260. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_completeness.py +0 -0
  261. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_config_extras.py +0 -0
  262. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_coverage.py +0 -0
  263. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_coverage_ts_hint.py +0 -0
  264. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_dart_isolates.py +0 -0
  265. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_db_connections.py +0 -0
  266. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_dead_wrappers.py +0 -0
  267. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_dispatch_interfaces.py +0 -0
  268. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_dispatch_part3.py +0 -0
  269. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_django_flutter.py +0 -0
  270. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_docs_languages.py +0 -0
  271. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_docs_links.py +0 -0
  272. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_echo_ref.py +0 -0
  273. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_echo_wrapper.py +0 -0
  274. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_elysia.py +0 -0
  275. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_enum_constants.py +0 -0
  276. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_env.py +0 -0
  277. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_explore.py +0 -0
  278. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_external.py +0 -0
  279. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_fp_batch.py +0 -0
  280. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_gating.py +0 -0
  281. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_generated.py +0 -0
  282. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_graphql.py +0 -0
  283. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_hooks.py +0 -0
  284. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_impact_overrides.py +0 -0
  285. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_index_isolation.py +0 -0
  286. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_inherited_overrides.py +0 -0
  287. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_inline_guards.py +0 -0
  288. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_install_rules.py +0 -0
  289. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_192.py +0 -0
  290. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_201.py +0 -0
  291. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_202.py +0 -0
  292. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_203.py +0 -0
  293. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_204.py +0 -0
  294. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_205.py +0 -0
  295. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_206.py +0 -0
  296. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_207.py +0 -0
  297. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_208.py +0 -0
  298. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_209.py +0 -0
  299. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_210.py +0 -0
  300. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_211.py +0 -0
  301. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_211_used_at.py +0 -0
  302. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_212.py +0 -0
  303. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_212_langs.py +0 -0
  304. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_218.py +0 -0
  305. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_219.py +0 -0
  306. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_issue_222.py +0 -0
  307. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_java.py +0 -0
  308. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_java_exact.py +0 -0
  309. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_jobs.py +0 -0
  310. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_js_refs.py +0 -0
  311. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_js_runtime.py +0 -0
  312. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin.py +0 -0
  313. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_binding.py +0 -0
  314. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_exact.py +0 -0
  315. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_fields.py +0 -0
  316. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_local_state.py +0 -0
  317. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_mixed.py +0 -0
  318. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_nav_consts.py +0 -0
  319. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_prop_exact.py +0 -0
  320. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_prop_overrides.py +0 -0
  321. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_kotlin_props.py +0 -0
  322. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_laravel_determinism.py +0 -0
  323. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_laravel_receiver_narrowing.py +0 -0
  324. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_laravel_resources.py +0 -0
  325. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_laravel_route_paths.py +0 -0
  326. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_link_origin.py +0 -0
  327. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_lint_async.py +0 -0
  328. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_listing_files.py +0 -0
  329. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_local_ipc.py +0 -0
  330. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_local_sockets.py +0 -0
  331. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mass_assignment.py +0 -0
  332. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mcp.py +0 -0
  333. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mcp_index.py +0 -0
  334. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mcp_install.py +0 -0
  335. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mcp_instructions.py +0 -0
  336. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_mcp_multi_graph.py +0 -0
  337. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_native_cfamily.py +0 -0
  338. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_native_concurrency.py +0 -0
  339. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_native_rust.py +0 -0
  340. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_nuxt_i18n.py +0 -0
  341. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_nuxt_import_dirs.py +0 -0
  342. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_nuxt_nitro.py +0 -0
  343. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_nuxt_rootsrc.py +0 -0
  344. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_nuxt_side_dirs.py +0 -0
  345. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_packaging.py +0 -0
  346. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_parity.py +0 -0
  347. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_parity_fields.py +0 -0
  348. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_parity_members.py +0 -0
  349. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_parity_structure.py +0 -0
  350. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_php_http.py +0 -0
  351. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_php_props.py +0 -0
  352. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_plain_js.py +0 -0
  353. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_plans.py +0 -0
  354. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_platform_gaps.py +0 -0
  355. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_platform_type_variants.py +0 -0
  356. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_platforms.py +0 -0
  357. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_platforms_apple.py +0 -0
  358. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_presets_config.py +0 -0
  359. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_process_ipc.py +0 -0
  360. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_process_runs.py +0 -0
  361. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_protocols.py +0 -0
  362. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_app_tests_module.py +0 -0
  363. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_collection_chains.py +0 -0
  364. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_compat.py +0 -0
  365. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_entry_refs.py +0 -0
  366. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_fields.py +0 -0
  367. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_infer_cycles.py +0 -0
  368. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_roots.py +0 -0
  369. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_subprocess_tests.py +0 -0
  370. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_tests.py +0 -0
  371. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_web_hosts.py +0 -0
  372. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_web_routes.py +0 -0
  373. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_python_web_routes_more.py +0 -0
  374. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_react_router.py +0 -0
  375. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_readers_writers_specs.py +0 -0
  376. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_realtime.py +0 -0
  377. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_realtime_native.py +0 -0
  378. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_redact_salt.py +0 -0
  379. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_request_keys.py +0 -0
  380. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_roundtrip.py +0 -0
  381. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_route_specs.py +0 -0
  382. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_route_tables.py +0 -0
  383. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_routes_search_explain.py +0 -0
  384. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_rpc.py +0 -0
  385. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_scip_health.py +0 -0
  386. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_sdk_external.py +0 -0
  387. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_sdk_external_infra.py +0 -0
  388. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_sdk_external_mail.py +0 -0
  389. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_snippet.py +0 -0
  390. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_sockets.py +0 -0
  391. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_spring.py +0 -0
  392. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ssrf.py +0 -0
  393. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_starters_budget.py +0 -0
  394. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_state_tracking_235.py +0 -0
  395. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_surface.py +0 -0
  396. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_surface_transport.py +0 -0
  397. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift.py +0 -0
  398. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_binding.py +0 -0
  399. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_exact.py +0 -0
  400. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_facts.py +0 -0
  401. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_fields.py +0 -0
  402. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_modules.py +0 -0
  403. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_more.py +0 -0
  404. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_nav_values.py +0 -0
  405. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_parse_errors.py +0 -0
  406. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_platform_files.py +0 -0
  407. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_props.py +0 -0
  408. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_sdk.py +0 -0
  409. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_testing.py +0 -0
  410. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_swift_values.py +0 -0
  411. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_tauri_events.py +0 -0
  412. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_tests_scope.py +0 -0
  413. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_fields.py +0 -0
  414. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_fields_js_vue.py +0 -0
  415. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_file_specs.py +0 -0
  416. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_frameworks.py +0 -0
  417. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_node_http.py +0 -0
  418. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_nuxt.py +0 -0
  419. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_ts_src_tsconfig.py +0 -0
  420. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_unguarded.py +0 -0
  421. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_update_check.py +0 -0
  422. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_values.py +0 -0
  423. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_viz.py +0 -0
  424. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_vue_nav.py +0 -0
  425. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_watch.py +0 -0
  426. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_webhooks.py +0 -0
  427. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_webhooks_152.py +0 -0
  428. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_webhooks_152b.py +0 -0
  429. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_websockets.py +0 -0
  430. {cg_code_graph-0.23.13 → cg_code_graph-0.23.14}/tests/test_workspace_link.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.23.13
4
- Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
3
+ Version: 0.23.14
4
+ Summary: Python package on PyPI (not a Rust crate): a code graph of routes, calls, data access and platform boundaries. pip install cg-code-graph
5
5
  Author: cyberchronos00
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/cyberchronos00/code-graph
@@ -31,6 +31,8 @@ Dynamic: license-file
31
31
 
32
32
  **See everything a change affects before you make it: a local, deterministic dependency graph of routes, calls, tables and config, with `file:line` evidence for every hop.**
33
33
 
34
+ cg is a Python package on PyPI: `pip install cg-code-graph` (or `pipx install cg-code-graph`, or `uv tool install cg-code-graph`). It is not a Rust crate. `cargo install cg-code-graph` does not apply.
35
+
34
36
  For you and your AI agent (CLI + MCP). No LLM in the graph.
35
37
 
36
38
  <!-- mcp-name: io.github.cyberchronos00/cg-code-graph -->
@@ -46,13 +48,13 @@ For you and your AI agent (CLI + MCP). No LLM in the graph.
46
48
  ## Quick start
47
49
 
48
50
  ```bash
49
- pipx install cg-code-graph # or: uv tool install cg-code-graph
51
+ pipx install cg-code-graph # Python package. Not a Rust crate (cargo install does not apply).
50
52
  cg index . --db out/graph.db # prints starter queries for your repo
51
- cg install --host cursor # or claude, codex, vscode, …: registers the MCP server and a "use cg first" agent rule
53
+ cg install --yes --project # non-interactive MCP register; --host cursor|claude|codex|vscode|…
52
54
  cg reaches table:orders --db out/graph.db # any table, connection or config key
53
55
  ```
54
56
 
55
- Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install).
57
+ Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install). A clean cloud or CI image: [Cloud agent bootstrap](https://code-graph.cyberchronos00.workers.dev/docs/cloud-agents).
56
58
 
57
59
  `cg reaches table:store_books` on the bundled Django sample:
58
60
 
@@ -4,6 +4,8 @@
4
4
 
5
5
  **See everything a change affects before you make it: a local, deterministic dependency graph of routes, calls, tables and config, with `file:line` evidence for every hop.**
6
6
 
7
+ cg is a Python package on PyPI: `pip install cg-code-graph` (or `pipx install cg-code-graph`, or `uv tool install cg-code-graph`). It is not a Rust crate. `cargo install cg-code-graph` does not apply.
8
+
7
9
  For you and your AI agent (CLI + MCP). No LLM in the graph.
8
10
 
9
11
  <!-- mcp-name: io.github.cyberchronos00/cg-code-graph -->
@@ -19,13 +21,13 @@ For you and your AI agent (CLI + MCP). No LLM in the graph.
19
21
  ## Quick start
20
22
 
21
23
  ```bash
22
- pipx install cg-code-graph # or: uv tool install cg-code-graph
24
+ pipx install cg-code-graph # Python package. Not a Rust crate (cargo install does not apply).
23
25
  cg index . --db out/graph.db # prints starter queries for your repo
24
- cg install --host cursor # or claude, codex, vscode, …: registers the MCP server and a "use cg first" agent rule
26
+ cg install --yes --project # non-interactive MCP register; --host cursor|claude|codex|vscode|…
25
27
  cg reaches table:orders --db out/graph.db # any table, connection or config key
26
28
  ```
27
29
 
28
- Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install).
30
+ Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install). A clean cloud or CI image: [Cloud agent bootstrap](https://code-graph.cyberchronos00.workers.dev/docs/cloud-agents).
29
31
 
30
32
  `cg reaches table:store_books` on the bundled Django sample:
31
33
 
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.23.13"
2
+ __version__ = "0.23.14"
@@ -12,7 +12,7 @@
12
12
  python -m cg_code_graph.cli api-calls <all|unmatched|substring|glob*> --db out/combined.db
13
13
  python -m cg_code_graph.cli plan list|load|validate|check|baseline [<name>] --db out/combined.db [--verify] [--summary] [--json]
14
14
  python -m cg_code_graph.cli routes --db ... [--writes [TABLE]] [--reaches SPEC...] [--missing NAME] [--unguarded]
15
- python -m cg_code_graph.cli search <name> --db ... [--kind route]
15
+ python -m cg_code_graph.cli search <name> --db ... [--kind route] [--compact]
16
16
  python -m cg_code_graph.cli channels [PATTERN] --db ... (who can join, which events publish, which client code listens)
17
17
  python -m cg_code_graph.cli tests <spec> --db ... (tests covering a symbol / route / table: direct + transitive)
18
18
  python -m cg_code_graph.cli bridges [PATTERN] --db ... [--protocol capacitor] [--unmatched] (web / native bridge calls)
@@ -35,6 +35,16 @@ import sys
35
35
  from .core.store import GraphStore
36
36
  from . import query as Q
37
37
  from .bridges import PROTOCOLS as BRIDGE_PROTOCOLS
38
+ from .cli_errors import explain_parse_error
39
+
40
+ _COMPACT_SEARCH_LIMIT = 8
41
+ _COMPACT_SNIPPET_LINES = 40
42
+ _COMPACT_CALLERS = 8
43
+ _COMPACT_ENTRIES = 5
44
+ _COMPACT_HELP = ("short agent summary (also CG_OUTPUT=compact): fewer rows, short paths, and how to expand. "
45
+ "Search shows 8 nodes unless --limit is set; snippet shows 40 lines unless --max-lines is set; "
46
+ "impact omits evidence paths. The default output is unchanged. "
47
+ "For a token cap, use cg explore --budget")
38
48
 
39
49
 
40
50
  def _parse_repo(spec: str) -> tuple[str, str, str]:
@@ -58,7 +68,8 @@ def _add_install_parser(sub, uninstall: bool):
58
68
  from .mcp_install import HOSTS
59
69
  name = "uninstall" if uninstall else "install"
60
70
  help_ = ("remove the cg MCP server entry from a host config" if uninstall else
61
- "register the cg MCP server (key cg) in a host config; previews and asks first")
71
+ "register the cg MCP server (key cg) in a host config; previews and asks first "
72
+ "(--yes writes without asking; with no host detected it writes the Cursor project config)")
62
73
  p = sub.add_parser(name, help=help_)
63
74
  p.add_argument("--host", action="append", choices=[*HOSTS, "all"],
64
75
  help="MCP host (repeatable). Default: hosts already present for this scope")
@@ -86,6 +97,68 @@ def _add_install_parser(sub, uninstall: bool):
86
97
  p.add_argument("--graphs", help="registry file for --migrate (default: ~/.config/cg/graphs.toml)")
87
98
 
88
99
 
100
+ class _CgParser(argparse.ArgumentParser):
101
+ """Parent parser whose rejected flags and unknown commands stay on one screen."""
102
+
103
+ def parse_args(self, args=None, namespace=None):
104
+ argv = sys.argv[1:] if args is None else list(args)
105
+ self._cg_argv = argv
106
+ self._cg_root = self
107
+ for action in self._actions:
108
+ if isinstance(action, argparse._SubParsersAction):
109
+ for sub in action.choices.values():
110
+ sub._cg_argv = argv
111
+ sub._cg_root = self
112
+ return super().parse_args(args, namespace)
113
+
114
+ def error(self, message):
115
+ text = explain_parse_error(self, message, getattr(self, "_cg_argv", None))
116
+ if text:
117
+ self.exit(2, text if text.endswith("\n") else text + "\n")
118
+ super().error(message)
119
+
120
+
121
+ def _opt_given(args, flag: str) -> bool:
122
+ return any(arg == flag or arg.startswith(flag + "=") for arg in args)
123
+
124
+
125
+ def _compact_output(parsed, args) -> bool:
126
+ """Text-only compact profile. `--json` keeps the document shape."""
127
+ if getattr(parsed, "json", False):
128
+ return False
129
+ if getattr(parsed, "compact", False):
130
+ return True
131
+ return os.environ.get("CG_OUTPUT", "").strip().lower() == "compact"
132
+
133
+
134
+ def _print_impact_compact(st, parsed, res) -> None:
135
+ """First callers and entry points, no evidence paths, and how to expand."""
136
+ callers, entries = res["callers"], res["entry_points"]
137
+ shown_c = callers[:_COMPACT_CALLERS]
138
+ print(f"callers (transitive): {len(callers)} showing {len(shown_c)}")
139
+ labels = _impact_labels(shown_c, lambda c: c.get("fqn") or c["id"], lambda c: c.get("module") or c.get("kind"))
140
+ for caller, label in zip(shown_c, labels):
141
+ loc = f" @ {Q.short_path(caller.get('file'))}:{caller.get('line')}" if caller.get("file") else ""
142
+ print(f" d={caller['depth']} [{caller['module'] or caller['kind']}] {label}{loc}{Q.caller_label(caller)}")
143
+ if len(callers) > len(shown_c):
144
+ print(f"{len(callers) - len(shown_c)} more callers, drop --compact for the full list")
145
+ shown_e = entries[:_COMPACT_ENTRIES]
146
+ print(f"entry points: {len(entries)} showing {len(shown_e)}")
147
+ for entry in shown_e:
148
+ loc = f" @ {Q.short_path(entry.get('file'))}:{entry.get('line')}" if entry.get("file") else ""
149
+ print(f" {entry['entry_kind']:16} {entry.get('fqn') or entry['name']}{loc} conf={entry['path_confidence']}")
150
+ if len(entries) > len(shown_e):
151
+ print(f"{len(entries) - len(shown_e)} more entry points, drop --compact for the full list")
152
+ if any(row.get("candidate") for row in shown_c + shown_e):
153
+ print(Q.CANDIDATE_NOTE)
154
+ if parsed.plans_dir:
155
+ from . import plans as P
156
+ hits = P.snapshot_clients(st, [e["id"] for e in entries if e["id"].startswith("route:")], parsed.plans_dir)
157
+ print(f"external clients (snapshot, not indexed): {len(hits)}")
158
+ print("expand: drop --compact or unset CG_OUTPUT. token cap: cg explore --budget")
159
+ _note(_completeness(st, list(res["targets"]) + [c["id"] for c in callers]), False)
160
+
161
+
89
162
  def _impact_labels(rows: list[dict], name_of, group_of) -> list[str]:
90
163
  """Display names for one impact listing. Same-name rows in one group gain a file suffix."""
91
164
  from collections import defaultdict
@@ -113,7 +186,7 @@ def _version_text(version: str) -> str:
113
186
 
114
187
  def main(argv=None):
115
188
  from . import __version__
116
- ap = argparse.ArgumentParser(prog="cg")
189
+ ap = _CgParser(prog="cg")
117
190
  args_in = sys.argv[1:] if argv is None else list(argv)
118
191
  if args_in[:1] == ["--version"]:
119
192
  print(_version_text(__version__)) # printed here: argparse's version action re-wraps a second line
@@ -221,6 +294,7 @@ def main(argv=None):
221
294
  p = sub.add_parser("search", help="nodes by name / FQN substring, plus route middleware / guard / auth names")
222
295
  p.add_argument("name"); p.add_argument("--db", required=True); p.add_argument("--kind"); p.add_argument("--limit", type=int, default=30)
223
296
  p.add_argument("--json", action="store_true"); p.add_argument("--platform", help="only code built for this target (windows, linux, macos, ios, android, web; see docs/platforms.md)")
297
+ p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
224
298
  p = sub.add_parser("channels", help="broadcast channels: who can join (auth callback + checks), which events publish on it, which client code / pages listen")
225
299
  p.add_argument("pattern", nargs="?", help="channel pattern or concrete name (orders.{id}, orders.42, orders.*); omit to list all")
226
300
  p.add_argument("--db", required=True); p.add_argument("--json", action="store_true"); p.add_argument("--no-source", action="store_true")
@@ -328,10 +402,13 @@ def main(argv=None):
328
402
  p.add_argument("--context", type=int, default=0, help="extra lines of context around the symbol (default 0)")
329
403
  p.add_argument("--max-lines", type=int, default=200, help="cap the printed body (default 200); extra lines are noted")
330
404
  p.add_argument("--json", action="store_true")
405
+ p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
331
406
  p = sub.add_parser("explore", help="question or spec → source, entry points, call paths and blast radius")
332
407
  p.add_argument("query", help="a free-text question, a source file, or a symbol spec")
333
408
  p.add_argument("--db", required=True)
334
- p.add_argument("--budget", type=int, default=3000, help="token budget (clamped to 500..20000, default 3000)")
409
+ p.add_argument("--budget", type=int, default=3000,
410
+ help="token budget (clamped to 500..20000, default 3000). "
411
+ "search, snippet and impact name this flag from --help and from --compact")
335
412
  p.add_argument("--max-symbols", type=int, default=4, help="how many symbols to expand (default 4)")
336
413
  p.add_argument("--json", action="store_true")
337
414
  p = sub.add_parser("agents", help="opt-in: add cg usage guidance (and the cg MCP entry) to AGENTS.md / CLAUDE.md / Cursor rules; previews and asks first")
@@ -394,6 +471,7 @@ def main(argv=None):
394
471
  p.add_argument("--platform", help="only code built for this target (windows, linux, macos, ios, android, web; see docs/platforms.md)")
395
472
  if name == "impact":
396
473
  p.add_argument("--plans-dir", help="also list external clients from the snapshot files in this directory (e.g. examples/plans)")
474
+ p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
397
475
  a = ap.parse_args(argv)
398
476
 
399
477
  if a.cmd == "index":
@@ -534,8 +612,17 @@ def main(argv=None):
534
612
  print(json.dumps(rows, indent=1) if a.json else render_starters(rows))
535
613
  return
536
614
  if a.cmd == "snippet":
537
- res = Q.snippet(GraphStore(a.db), a.spec, context=a.context, max_lines=a.max_lines)
538
- print(json.dumps(res, indent=1, default=str) if a.json else Q.render_snippet(res))
615
+ context, max_lines = a.context, a.max_lines
616
+ compact = _compact_output(a, args_in)
617
+ if compact and not _opt_given(args_in, "--max-lines"):
618
+ max_lines = min(max_lines, _COMPACT_SNIPPET_LINES)
619
+ res = Q.snippet(GraphStore(a.db), a.spec, context=context, max_lines=max_lines)
620
+ if a.json:
621
+ print(json.dumps(res, indent=1, default=str))
622
+ elif compact:
623
+ print(Q.render_snippet_compact(res))
624
+ else:
625
+ print(Q.render_snippet(res))
539
626
  return 0 if res.get("status") == "ok" else 1
540
627
  if a.cmd == "explore":
541
628
  from . import explore as EX
@@ -708,8 +795,25 @@ def main(argv=None):
708
795
  _note(_completeness(st, res.get("targets")), False)
709
796
  return
710
797
  if a.cmd == "search":
711
- res = Q.search(st, a.name, kind=a.kind, limit=a.limit, platform=a.platform)
712
- print(json.dumps(res, indent=1, default=str) if a.json else Q.render_search(res))
798
+ limit = a.limit
799
+ compact = _compact_output(a, args_in)
800
+ if compact and not _opt_given(args_in, "--limit"):
801
+ limit = min(limit, _COMPACT_SEARCH_LIMIT)
802
+ res = Q.search(st, a.name, kind=a.kind, limit=limit, platform=a.platform)
803
+ if a.json:
804
+ print(json.dumps(res, indent=1, default=str))
805
+ elif compact:
806
+ more, note = 0, None
807
+ if a.platform:
808
+ if len(res["nodes"]) == limit:
809
+ probe = Q.search(st, a.name, kind=a.kind, limit=limit + 1, platform=a.platform)
810
+ if len(probe["nodes"]) > limit:
811
+ note = "1+ more, raise --limit"
812
+ else:
813
+ more = max(0, Q.search_node_total(st, a.name, a.kind) - len(res["nodes"]))
814
+ print(Q.render_search_compact(res, more=more, more_note=note))
815
+ else:
816
+ print(Q.render_search(res))
713
817
  return
714
818
  if a.cmd == "reaches":
715
819
  for spec in a.specs:
@@ -749,6 +853,9 @@ def main(argv=None):
749
853
  print(Q.connections_line(res["connections"]))
750
854
  if not res["callers"] and not res["entry_points"]:
751
855
  print(Q.explain_no_callers(st, a.spec, res["targets"], a.min_confidence)); return
856
+ if _compact_output(a, args_in):
857
+ _print_impact_compact(st, a, res)
858
+ return
752
859
  nc = res.get("callers_candidate") or 0
753
860
  print(f"callers (transitive): {len(res['callers']) - nc}" + (f" (+{nc} candidate)" if nc else ""))
754
861
  caller_names = _impact_labels(res["callers"], lambda c: c.get("fqn") or c["id"], lambda c: c.get("module") or c.get("kind"))
@@ -0,0 +1,171 @@
1
+ """Short errors for rejected flags and unknown subcommands.
2
+
3
+ Grep- and git-style flags are not accepted: the reply names the long option
4
+ that already exists on this command, or the commands that do have it.
5
+ Unknown subcommands name the closest real commands instead of the full list.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import difflib
11
+ import re
12
+
13
+ # Rejected spellings -> long options that already exist somewhere on the CLI.
14
+ FLAG_HINTS: dict[str, tuple[str, ...]] = {
15
+ "-k": ("--kind",),
16
+ "-A": ("--context", "--max-lines"),
17
+ "-C": ("--context",),
18
+ "--depth": ("--max-depth",),
19
+ "--name": ("--db",),
20
+ }
21
+
22
+ # Guesses that spelling distance does not connect to the real command.
23
+ COMMAND_HINTS: dict[str, tuple[str, ...]] = {
24
+ "callers": ("impact", "node", "readers"),
25
+ "caller": ("impact", "node", "readers"),
26
+ "called-by": ("impact", "node", "readers"),
27
+ "whocalls": ("impact", "node", "readers"),
28
+ "who-calls": ("impact", "node", "readers"),
29
+ "callees": ("downstream", "node"),
30
+ "callee": ("downstream", "node"),
31
+ "find": ("search",),
32
+ "grep": ("search",),
33
+ "cat": ("snippet", "node"),
34
+ "source": ("snippet", "node"),
35
+ }
36
+
37
+
38
+ def explain_parse_error(parser: argparse.ArgumentParser, message: str, argv: list[str] | None) -> str | None:
39
+ """A one-screen stderr body, or None to keep argparse's own error."""
40
+ root = getattr(parser, "_cg_root", parser)
41
+ args = list(argv or getattr(parser, "_cg_argv", []) or [])
42
+ if message.startswith("unrecognized arguments:"):
43
+ return _unknown_args(root, message, args)
44
+ if message.startswith("argument cmd: invalid choice:"):
45
+ return _unknown_command(root, message)
46
+ return None
47
+
48
+
49
+ def _subparsers(parser: argparse.ArgumentParser):
50
+ for action in parser._actions:
51
+ if isinstance(action, argparse._SubParsersAction):
52
+ return action
53
+ return None
54
+
55
+
56
+ def _option_strings(parser: argparse.ArgumentParser) -> set[str]:
57
+ out: set[str] = set()
58
+ for action in parser._actions:
59
+ out.update(action.option_strings)
60
+ return out
61
+
62
+
63
+ def _owners(root: argparse.ArgumentParser, option: str) -> list[str]:
64
+ action = _subparsers(root)
65
+ if action is None:
66
+ return []
67
+ return sorted(name for name, sub in action.choices.items() if option in _option_strings(sub))
68
+
69
+
70
+ def _command(argv: list[str], names: set[str]) -> str | None:
71
+ for arg in argv:
72
+ if arg == "--":
73
+ return None
74
+ if arg in names:
75
+ return arg
76
+ if arg.startswith("-"):
77
+ continue
78
+ return None
79
+ return None
80
+
81
+
82
+ def _normalize_flag(token: str) -> str:
83
+ if token.startswith("--") and "=" in token:
84
+ return token.split("=", 1)[0]
85
+ if re.fullmatch(r"-[A-Za-z]\d+", token):
86
+ return token[:2]
87
+ return token
88
+
89
+
90
+ def _flag_hint(root: argparse.ArgumentParser, command: str | None, flag: str) -> str | None:
91
+ options = FLAG_HINTS.get(flag)
92
+ if not options:
93
+ return None
94
+ parts: list[str] = []
95
+ for opt in options:
96
+ owners = _owners(root, opt)
97
+ if not owners:
98
+ continue
99
+ if command and command in owners:
100
+ parts.append(opt)
101
+ else:
102
+ parts.append(f"{opt} (on {', '.join(owners)})")
103
+ if not parts:
104
+ return None
105
+ text = f"unknown {flag}; did you mean {' or '.join(parts)}?"
106
+ if flag == "--name":
107
+ named = _owners(root, "--name")
108
+ if named:
109
+ text += f" (--name sets the project name on {', '.join(named)})"
110
+ return text
111
+
112
+
113
+ def _unknown_args(root: argparse.ArgumentParser, message: str, argv: list[str]) -> str:
114
+ action = _subparsers(root)
115
+ names = set(action.choices) if action is not None else set()
116
+ command = _command(argv, names)
117
+ tokens = message.split(":", 1)[1].strip().split()
118
+ hints: list[str] = []
119
+ leftover: list[str] = []
120
+ i = 0
121
+ while i < len(tokens):
122
+ token = tokens[i]
123
+ if token.startswith("-") and token != "-":
124
+ flag = _normalize_flag(token)
125
+ hint = _flag_hint(root, command, flag)
126
+ i += 1
127
+ values: list[str] = []
128
+ while i < len(tokens) and not (tokens[i].startswith("-") and tokens[i] != "-"):
129
+ values.append(tokens[i])
130
+ i += 1
131
+ if hint:
132
+ hints.append(hint)
133
+ else:
134
+ leftover.append(token)
135
+ leftover.extend(values)
136
+ continue
137
+ leftover.append(token)
138
+ i += 1
139
+ body: list[str] = list(hints)
140
+ if leftover:
141
+ body.append("unrecognized arguments: " + " ".join(leftover))
142
+ if not body:
143
+ body.append(message)
144
+ if leftover:
145
+ body.append(f"see `cg {command} --help`" if command else "see `cg --help`")
146
+ text = "cg: error: " + body[0]
147
+ if len(body) > 1:
148
+ text += "\n" + "\n".join(body[1:])
149
+ return text
150
+
151
+
152
+ def _fmt_try(names: list[str]) -> str:
153
+ shown = [f"cg {name}" for name in names]
154
+ if len(shown) == 1:
155
+ return shown[0]
156
+ if len(shown) == 2:
157
+ return f"{shown[0]} or {shown[1]}"
158
+ return ", ".join(shown[:-1]) + ", or " + shown[-1]
159
+
160
+
161
+ def _unknown_command(root: argparse.ArgumentParser, message: str) -> str:
162
+ action = _subparsers(root)
163
+ choices = list(action.choices) if action is not None else []
164
+ match = re.search(r"invalid choice: '([^']*)'", message)
165
+ name = match.group(1) if match else ""
166
+ picks = [cmd for cmd in COMMAND_HINTS.get(name, ()) if cmd in choices]
167
+ if not picks and name:
168
+ picks = difflib.get_close_matches(name, choices, n=3, cutoff=0.6)
169
+ if picks:
170
+ return f"cg: error: unknown command {name!r}; try: {_fmt_try(picks)}"
171
+ return f"cg: error: unknown command {name!r}; run `cg --help` for commands"