cg-code-graph 0.19.0__tar.gz → 0.19.1__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 (352) hide show
  1. {cg_code_graph-0.19.0/cg_code_graph.egg-info → cg_code_graph-0.19.1}/PKG-INFO +1 -1
  2. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/__init__.py +1 -1
  3. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/extractors.py +33 -8
  4. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1/cg_code_graph.egg-info}/PKG-INFO +1 -1
  5. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_packaging.py +76 -4
  6. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/LICENSE +0 -0
  7. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/MANIFEST.in +0 -0
  8. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/README.md +0 -0
  9. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/__main__.py +0 -0
  10. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/affected.py +0 -0
  11. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/agent_rules.py +0 -0
  12. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/agents.py +0 -0
  13. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/aitools.py +0 -0
  14. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/android_ipc.py +0 -0
  15. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/apple_ipc.py +0 -0
  16. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/apps.py +0 -0
  17. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/blindspots.py +0 -0
  18. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/bridges.py +0 -0
  19. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/brokers.py +0 -0
  20. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/cli.py +0 -0
  21. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/concepts.py +0 -0
  22. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/config.py +0 -0
  23. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/__init__.py +0 -0
  24. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/cache.py +0 -0
  25. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/detect.py +0 -0
  26. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/env.py +0 -0
  27. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/fsutil.py +0 -0
  28. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/generated.py +0 -0
  29. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/model.py +0 -0
  30. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/paths.py +0 -0
  31. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/plugin.py +0 -0
  32. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/store.py +0 -0
  33. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/core/syntax_errors.py +0 -0
  34. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/coverage.py +0 -0
  35. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/dart_isolates.py +0 -0
  36. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/doctor.py +0 -0
  37. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/explore.py +0 -0
  38. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/external.py +0 -0
  39. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/graphql.py +0 -0
  40. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/hooks.py +0 -0
  41. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/indexer.py +0 -0
  42. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/jobs.py +0 -0
  43. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/link.py +0 -0
  44. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/lint_async.py +0 -0
  45. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/local_ipc.py +0 -0
  46. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/local_sockets.py +0 -0
  47. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/mcp_install.py +0 -0
  48. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/mcp_server.py +0 -0
  49. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/parity.py +0 -0
  50. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/parity_structure.py +0 -0
  51. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/payload.py +0 -0
  52. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plans.py +0 -0
  53. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/platform_scan.py +0 -0
  54. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/platforms.py +0 -0
  55. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/__init__.py +0 -0
  56. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/__init__.py +0 -0
  57. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/content.py +0 -0
  58. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/plugin.py +0 -0
  59. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
  60. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
  61. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
  62. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/__init__.py +0 -0
  63. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/bridges.py +0 -0
  64. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
  65. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
  66. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
  67. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/http.py +0 -0
  68. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/models.py +0 -0
  69. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/plugin.py +0 -0
  70. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/program.py +0 -0
  71. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/__init__.py +0 -0
  72. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/extras.py +0 -0
  73. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/models.py +0 -0
  74. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/plugin.py +0 -0
  75. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/schemas.py +0 -0
  76. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/shapes.py +0 -0
  77. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/urls.py +0 -0
  78. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/express/__init__.py +0 -0
  79. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/express/plugin.py +0 -0
  80. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/flutter/__init__.py +0 -0
  81. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/flutter/plugin.py +0 -0
  82. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/__init__.py +0 -0
  83. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/exact.py +0 -0
  84. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/plugin.py +0 -0
  85. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/__init__.py +0 -0
  86. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/interop.py +0 -0
  87. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/spring.py +0 -0
  88. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
  89. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/exact.py +0 -0
  90. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
  91. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
  92. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/__init__.py +0 -0
  93. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
  94. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/plugin.py +0 -0
  95. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/tests.py +0 -0
  96. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/values.py +0 -0
  97. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/__init__.py +0 -0
  98. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/gates.py +0 -0
  99. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/runner.py +0 -0
  100. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/scipread.py +0 -0
  101. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/ts.py +0 -0
  102. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nest/__init__.py +0 -0
  103. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nest/plugin.py +0 -0
  104. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
  105. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
  106. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
  107. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
  108. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/__init__.py +0 -0
  109. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/external.py +0 -0
  110. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
  111. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
  112. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
  113. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/gating.py +0 -0
  114. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/http_client.py +0 -0
  115. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/plugin.py +0 -0
  116. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/strings.py +0 -0
  117. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/__init__.py +0 -0
  118. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/aitools.py +0 -0
  119. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/external.py +0 -0
  120. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/fields.py +0 -0
  121. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/plugin.py +0 -0
  122. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/refs.py +0 -0
  123. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/roots.py +0 -0
  124. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/socketio.py +0 -0
  125. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/subproc.py +0 -0
  126. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/tests.py +0 -0
  127. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/values.py +0 -0
  128. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
  129. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
  130. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/values.py +0 -0
  131. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/__init__.py +0 -0
  132. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/cargo.py +0 -0
  133. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/plugin.py +0 -0
  134. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/syntax.py +0 -0
  135. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/__init__.py +0 -0
  136. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/importer.py +0 -0
  137. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/scip.proto +0 -0
  138. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
  139. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/stubs/__init__.py +0 -0
  140. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/stubs/plugins.py +0 -0
  141. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/__init__.py +0 -0
  142. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/baseurl.py +0 -0
  143. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/exact.py +0 -0
  144. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/indexstore.py +0 -0
  145. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/packages.py +0 -0
  146. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/plugin.py +0 -0
  147. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/__init__.py +0 -0
  148. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/baseurl.py +0 -0
  149. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
  150. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
  151. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
  152. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
  153. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
  154. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/nav.py +0 -0
  155. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/plugin.py +0 -0
  156. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/react_router.py +0 -0
  157. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
  158. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/common.py +0 -0
  159. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/data.py +0 -0
  160. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/__init__.py +0 -0
  161. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/c_cpp.yaml +0 -0
  162. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/common.yaml +0 -0
  163. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/dart.yaml +0 -0
  164. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/django-ninja.yaml +0 -0
  165. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/django.yaml +0 -0
  166. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/djangorestframework.yaml +0 -0
  167. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/express.yaml +0 -0
  168. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/java.yaml +0 -0
  169. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/kotlin.yaml +0 -0
  170. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/laravel.yaml +0 -0
  171. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nest.yaml +0 -0
  172. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nextjs.yaml +0 -0
  173. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nuxt.yaml +0 -0
  174. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/php.yaml +0 -0
  175. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/python.yaml +0 -0
  176. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/react-router.yaml +0 -0
  177. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/rust.yaml +0 -0
  178. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/spring.yaml +0 -0
  179. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/swift.yaml +0 -0
  180. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/typescript.yaml +0 -0
  181. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/process_runs.py +0 -0
  182. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/__init__.py +0 -0
  183. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/builtin.py +0 -0
  184. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/matchers.py +0 -0
  185. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/view.py +0 -0
  186. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/query.py +0 -0
  187. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime.py +0 -0
  188. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_events.py +0 -0
  189. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_native.py +0 -0
  190. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_ws.py +0 -0
  191. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/roundtrip.py +0 -0
  192. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/routes.py +0 -0
  193. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/rpc.py +0 -0
  194. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/sdk_systems.py +0 -0
  195. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/sockets.py +0 -0
  196. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/starters.py +0 -0
  197. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/tests_index.py +0 -0
  198. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/udp_apps.py +0 -0
  199. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/__init__.py +0 -0
  200. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/graph.py +0 -0
  201. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/server.py +0 -0
  202. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/app.css +0 -0
  203. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/app.js +0 -0
  204. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/index.html +0 -0
  205. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/layered.js +0 -0
  206. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
  207. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
  208. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
  209. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
  210. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
  211. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/package-lock.json +0 -0
  212. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/package.json +0 -0
  213. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/shoot.mjs +0 -0
  214. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/watch.py +0 -0
  215. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/webhooks.py +0 -0
  216. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph/xcode.py +0 -0
  217. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/SOURCES.txt +0 -0
  218. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/dependency_links.txt +0 -0
  219. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/entry_points.txt +0 -0
  220. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/requires.txt +0 -0
  221. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/top_level.txt +0 -0
  222. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/pyproject.toml +0 -0
  223. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/setup.cfg +0 -0
  224. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_affected.py +0 -0
  225. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_agents_install.py +0 -0
  226. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_agents_md.py +0 -0
  227. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ai_tools.py +0 -0
  228. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_android_ipc.py +0 -0
  229. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_apple_ipc.py +0 -0
  230. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_astro.py +0 -0
  231. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_astro_content.py +0 -0
  232. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_astro_server.py +0 -0
  233. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_bridges.py +0 -0
  234. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_bridges_pigeon_monorepo.py +0 -0
  235. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_brokers.py +0 -0
  236. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_cache_clean.py +0 -0
  237. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_cache_invalidation.py +0 -0
  238. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_cache_migration.py +0 -0
  239. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_channels_tests.py +0 -0
  240. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_cli_output.py +0 -0
  241. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_completeness.py +0 -0
  242. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_config_extras.py +0 -0
  243. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_coverage.py +0 -0
  244. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_coverage_ts_hint.py +0 -0
  245. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_dart_isolates.py +0 -0
  246. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_dispatch_interfaces.py +0 -0
  247. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_django_flutter.py +0 -0
  248. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_docs_languages.py +0 -0
  249. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_docs_links.py +0 -0
  250. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_elysia.py +0 -0
  251. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_enum_constants.py +0 -0
  252. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_env.py +0 -0
  253. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_explore.py +0 -0
  254. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_external.py +0 -0
  255. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_gating.py +0 -0
  256. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_generated.py +0 -0
  257. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_graphql.py +0 -0
  258. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_hooks.py +0 -0
  259. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_impact_overrides.py +0 -0
  260. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_index_isolation.py +0 -0
  261. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_inherited_overrides.py +0 -0
  262. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_java.py +0 -0
  263. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_java_exact.py +0 -0
  264. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_jobs.py +0 -0
  265. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_js_refs.py +0 -0
  266. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_js_runtime.py +0 -0
  267. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin.py +0 -0
  268. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_binding.py +0 -0
  269. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_exact.py +0 -0
  270. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_fields.py +0 -0
  271. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_mixed.py +0 -0
  272. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_nav_consts.py +0 -0
  273. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_kotlin_props.py +0 -0
  274. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_laravel_determinism.py +0 -0
  275. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_laravel_resources.py +0 -0
  276. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_lint_async.py +0 -0
  277. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_local_ipc.py +0 -0
  278. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_local_sockets.py +0 -0
  279. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_mcp.py +0 -0
  280. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_mcp_index.py +0 -0
  281. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_mcp_install.py +0 -0
  282. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_native_cfamily.py +0 -0
  283. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_native_concurrency.py +0 -0
  284. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_native_rust.py +0 -0
  285. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_nuxt_import_dirs.py +0 -0
  286. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_nuxt_rootsrc.py +0 -0
  287. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_parity.py +0 -0
  288. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_parity_structure.py +0 -0
  289. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_php_http.py +0 -0
  290. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_php_props.py +0 -0
  291. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_plain_js.py +0 -0
  292. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_plans.py +0 -0
  293. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_platform_gaps.py +0 -0
  294. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_platform_type_variants.py +0 -0
  295. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_platforms.py +0 -0
  296. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_platforms_apple.py +0 -0
  297. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_presets_config.py +0 -0
  298. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_process_ipc.py +0 -0
  299. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_process_runs.py +0 -0
  300. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_protocols.py +0 -0
  301. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_app_tests_module.py +0 -0
  302. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_collection_chains.py +0 -0
  303. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_compat.py +0 -0
  304. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_entry_refs.py +0 -0
  305. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_fields.py +0 -0
  306. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_infer_cycles.py +0 -0
  307. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_roots.py +0 -0
  308. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_subprocess_tests.py +0 -0
  309. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_tests.py +0 -0
  310. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_web_hosts.py +0 -0
  311. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_web_routes.py +0 -0
  312. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_python_web_routes_more.py +0 -0
  313. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_react_router.py +0 -0
  314. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_realtime.py +0 -0
  315. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_realtime_native.py +0 -0
  316. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_roundtrip.py +0 -0
  317. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_route_tables.py +0 -0
  318. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_routes_search_explain.py +0 -0
  319. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_rpc.py +0 -0
  320. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_scip_health.py +0 -0
  321. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_sdk_external.py +0 -0
  322. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_snippet.py +0 -0
  323. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_sockets.py +0 -0
  324. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_spring.py +0 -0
  325. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_starters_budget.py +0 -0
  326. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift.py +0 -0
  327. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_binding.py +0 -0
  328. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_exact.py +0 -0
  329. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_facts.py +0 -0
  330. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_fields.py +0 -0
  331. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_modules.py +0 -0
  332. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_more.py +0 -0
  333. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_nav_values.py +0 -0
  334. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_parse_errors.py +0 -0
  335. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_props.py +0 -0
  336. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_sdk.py +0 -0
  337. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_testing.py +0 -0
  338. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_swift_values.py +0 -0
  339. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_tests_scope.py +0 -0
  340. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_fields.py +0 -0
  341. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_fields_js_vue.py +0 -0
  342. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_file_specs.py +0 -0
  343. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_frameworks.py +0 -0
  344. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_nuxt.py +0 -0
  345. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_ts_src_tsconfig.py +0 -0
  346. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_values.py +0 -0
  347. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_viz.py +0 -0
  348. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_vue_nav.py +0 -0
  349. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_watch.py +0 -0
  350. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_webhooks.py +0 -0
  351. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/tests/test_websockets.py +0 -0
  352. {cg_code_graph-0.19.0 → cg_code_graph-0.19.1}/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.19.1
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
@@ -1,2 +1,2 @@
1
1
  """code-graph: deterministic code knowledge graph (beta)."""
2
- __version__ = "0.19.0"
2
+ __version__ = "0.19.1"
@@ -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 = (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cg-code-graph
3
- Version: 0.19.0
3
+ Version: 0.19.1
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
@@ -15,6 +15,21 @@ from cg_code_graph.core import extractors
15
15
 
16
16
  ROOT = Path(__file__).resolve().parent.parent
17
17
 
18
+ _RUNTIME_SUFFIXES = {".mjs", ".js", ".php", ".dart"}
19
+ _SKIP_DIRS = {"node_modules", "vendor", ".dart_tool", ".bin"}
20
+
21
+
22
+ def _runtime_sources(pkg: Path) -> list[str]:
23
+ """Extractor modules that must be listed on Spec.sources (lockfiles and dependency trees are not runtime modules)."""
24
+ found = []
25
+ for p in pkg.rglob("*"):
26
+ if not p.is_file() or p.suffix not in _RUNTIME_SUFFIXES:
27
+ continue
28
+ if any(part in _SKIP_DIRS for part in p.relative_to(pkg).parts):
29
+ continue
30
+ found.append(p.relative_to(pkg).as_posix())
31
+ return found
32
+
18
33
 
19
34
  def test_pyproject_metadata():
20
35
  meta = tomllib.loads((ROOT / "pyproject.toml").read_text())
@@ -34,6 +49,10 @@ def test_pyproject_metadata():
34
49
  for spec in extractors.SPECS.values():
35
50
  for rel in spec.sources:
36
51
  assert (spec.pkg / rel).exists(), rel
52
+ # every runtime module in the plugin folder is copied into the cache, or a pip install fails with ERR_MODULE_NOT_FOUND
53
+ for spec in extractors.SPECS.values():
54
+ for rel in _runtime_sources(spec.pkg):
55
+ assert rel in spec.sources, (spec.lang, rel)
37
56
 
38
57
 
39
58
  def _fake_spec(tmp_path, monkeypatch):
@@ -55,22 +74,75 @@ def test_extractor_runs_from_user_cache_without_deps_in_package(tmp_path, monkey
55
74
  assert (d / "extract.mjs").read_text() == "// v1\n" and not (d / "fw.mjs").exists()
56
75
  st = extractors.status("typescript")
57
76
  assert st == {"installed": False, "dir": str(d), "where": "cache"}
58
- # dependencies installed there: reused; a newer extractor source with the same lock file is synced into it
77
+ # dependencies installed there: reused while the sources are unchanged
59
78
  (d / "node_modules" / "typescript").mkdir(parents=True)
60
79
  (d / "node_modules" / "typescript" / "package.json").write_text("{}")
61
- (pkg / "extract.mjs").write_text("// v2\n")
62
80
  assert extractors.ensure("typescript") == d # no install command run: the marker is there
63
- assert (d / "extract.mjs").read_text() == "// v2\n"
64
81
  assert extractors.status("typescript")["installed"]
82
+ # edited extractor source: a new cache key, so the broken or stale directory is not reused
83
+ (pkg / "extract.mjs").write_text("// v2\n")
84
+ d_src = extractors.workdir("typescript")
85
+ assert d_src != d and (d_src / "extract.mjs").read_text() == "// v2\n"
65
86
  # a new lock file: a fresh directory
66
87
  (pkg / "package-lock.json").write_text('{"lockfileVersion": 3, "x": 1}\n')
67
- assert extractors.workdir("typescript") != d
88
+ assert extractors.workdir("typescript") != d_src
68
89
  # a checkout with the dependencies in the package directory keeps using it
69
90
  (pkg / "node_modules" / "typescript").mkdir(parents=True)
70
91
  (pkg / "node_modules" / "typescript" / "package.json").write_text("{}")
71
92
  assert extractors.workdir("typescript") == pkg and extractors.status("typescript")["where"] == "package"
72
93
 
73
94
 
95
+ def test_cache_missing_listed_source_is_rebuilt(tmp_path, monkeypatch):
96
+ """A cache directory that lost a listed source is not treated as installed and is rebuilt with that file."""
97
+ pkg = _fake_spec(tmp_path, monkeypatch)
98
+ (pkg / "rr.mjs").write_text("export const rr = 1\n")
99
+ spec = extractors.SPECS["typescript"]
100
+ spec = extractors.Spec(spec.lang, pkg, spec.sources + ("rr.mjs",), spec.lock, spec.markers, spec.tool, spec.label)
101
+ monkeypatch.setitem(extractors.SPECS, "typescript", spec)
102
+ d = extractors.workdir("typescript")
103
+ (d / "node_modules" / "typescript").mkdir(parents=True)
104
+ (d / "node_modules" / "typescript" / "package.json").write_text("{}")
105
+ assert extractors.status("typescript")["installed"]
106
+ (d / "rr.mjs").unlink()
107
+ assert not extractors.status("typescript")["installed"]
108
+ rebuilt = extractors.workdir("typescript")
109
+ assert rebuilt == d
110
+ assert (rebuilt / "rr.mjs").read_text() == "export const rr = 1\n"
111
+ assert (rebuilt / "extract.mjs").read_text() == "// v1\n"
112
+ assert not (rebuilt / "node_modules").exists() # the incomplete install was removed, not patched in place
113
+
114
+
115
+ def test_typescript_cache_index_without_network(tmp_path, monkeypatch):
116
+ """Pip-style install: package dir has no node_modules, so indexing uses the cache and a local node_modules link."""
117
+ nm = extractors.SPECS["typescript"].pkg / "node_modules"
118
+ if not (nm / "typescript" / "package.json").exists():
119
+ pytest.skip("typescript extractor node_modules is not installed")
120
+ from cg_code_graph.indexer import index_project
121
+ monkeypatch.setenv("CG_CACHE", str(tmp_path / "cgcache"))
122
+ real = extractors._installed
123
+
124
+ def installed(d, spec):
125
+ if spec.lang == "typescript" and d == spec.pkg:
126
+ return False
127
+ return real(d, spec)
128
+
129
+ def run(cmd, d, spec):
130
+ assert spec.lang == "typescript", cmd
131
+ link = d / "node_modules"
132
+ if not link.exists():
133
+ link.symlink_to(nm, target_is_directory=True)
134
+
135
+ monkeypatch.setattr(extractors, "_installed", installed)
136
+ monkeypatch.setattr(extractors, "_run", run)
137
+ root = ROOT / "examples" / "bookstore-react-router"
138
+ stats = index_project(root, tmp_path / "rr.db", root.name)
139
+ assert stats["nodes"] > 0
140
+ import sqlite3
141
+ routes = sqlite3.connect(tmp_path / "rr.db").execute(
142
+ "SELECT id FROM nodes WHERE kind IN ('route', 'page')").fetchall()
143
+ assert routes
144
+
145
+
74
146
  def test_extractor_install_failure_names_the_tool(tmp_path, monkeypatch):
75
147
  _fake_spec(tmp_path, monkeypatch)
76
148
  monkeypatch.setattr(extractors, "install_command", lambda lang, dart=None: ["cg-no-such-npm", "ci"])
File without changes
File without changes