cg-code-graph 0.21.2__tar.gz → 0.23.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cg_code_graph-0.21.2/cg_code_graph.egg-info → cg_code_graph-0.23.0}/PKG-INFO +2 -2
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/README.md +1 -1
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/cli.py +47 -8
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/indexer.py +17 -1
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/link.py +84 -4
- cg_code_graph-0.23.0/cg_code_graph/mcp_graphs.py +481 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/mcp_install.py +233 -13
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/mcp_server.py +271 -14
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/platforms.py +32 -3
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/plugin.py +55 -14
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/query.py +272 -11
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0/cg_code_graph.egg-info}/PKG-INFO +2 -2
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/SOURCES.txt +11 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_dart_isolates.py +15 -0
- cg_code_graph-0.23.0/tests/test_dead_wrappers.py +39 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_django_flutter.py +4 -1
- cg_code_graph-0.23.0/tests/test_issue_202.py +79 -0
- cg_code_graph-0.23.0/tests/test_issue_205.py +36 -0
- cg_code_graph-0.23.0/tests/test_issue_206.py +32 -0
- cg_code_graph-0.23.0/tests/test_issue_208.py +45 -0
- cg_code_graph-0.23.0/tests/test_issue_210.py +51 -0
- cg_code_graph-0.23.0/tests/test_issue_211_used_at.py +71 -0
- cg_code_graph-0.23.0/tests/test_link_origin.py +39 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp_install.py +1 -1
- cg_code_graph-0.23.0/tests/test_mcp_multi_graph.py +349 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_php_http.py +2 -1
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_process_runs.py +18 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_realtime_native.py +18 -0
- cg_code_graph-0.23.0/tests/test_route_specs.py +71 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift.py +11 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/LICENSE +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/MANIFEST.in +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/pyproject.toml +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/setup.cfg +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_affected.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_coverage.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_env.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_explore.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_external.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_gating.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_generated.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_java.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_parity.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_plans.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_spring.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_surface.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_values.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_viz.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_watch.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.21.2 → cg_code_graph-0.23.0}/tests/test_workspace_link.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.0
|
|
4
4
|
Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
@@ -93,7 +93,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
93
93
|
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
|
|
94
94
|
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
|
|
95
95
|
- Security views: `cg surface` lists the inbound / outbound attack surface and findings (hardcoded credentials, plaintext protocols, unverified webhooks, unguarded handlers, listeners on all interfaces, disabled TLS / SSH verification, plaintext gRPC, exposed IPC, outbound URLs built from request input) as text, JSON or SARIF, with `--fail-on` for CI.
|
|
96
|
-
- MCP server (`cg-mcp`) so agents query the graph instead of grepping.
|
|
96
|
+
- MCP server (`cg-mcp`) so agents query the graph instead of grepping. One server can serve many graphs (`graphs` plus an optional `graph` argument); a single `--db` stays one graph. See [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp).
|
|
97
97
|
- Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
|
|
98
98
|
|
|
99
99
|
## Docs
|
|
@@ -66,7 +66,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
66
66
|
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
|
|
67
67
|
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
|
|
68
68
|
- Security views: `cg surface` lists the inbound / outbound attack surface and findings (hardcoded credentials, plaintext protocols, unverified webhooks, unguarded handlers, listeners on all interfaces, disabled TLS / SSH verification, plaintext gRPC, exposed IPC, outbound URLs built from request input) as text, JSON or SARIF, with `--fail-on` for CI.
|
|
69
|
-
- MCP server (`cg-mcp`) so agents query the graph instead of grepping.
|
|
69
|
+
- MCP server (`cg-mcp`) so agents query the graph instead of grepping. One server can serve many graphs (`graphs` plus an optional `graph` argument); a single `--db` stays one graph. See [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp).
|
|
70
70
|
- Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
|
|
71
71
|
|
|
72
72
|
## Docs
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.
|
|
2
|
+
__version__ = "0.23.0"
|
|
@@ -73,6 +73,13 @@ def _add_install_parser(sub, uninstall: bool):
|
|
|
73
73
|
p.add_argument("--uninstall", action="store_true", help="remove the entry instead of writing it")
|
|
74
74
|
p.add_argument("--dry-run", action="store_true", help="print the exact changes and write nothing")
|
|
75
75
|
p.add_argument("--yes", action="store_true", help="skip the confirmation prompt")
|
|
76
|
+
if not uninstall:
|
|
77
|
+
p.add_argument("--registry", action="store_true",
|
|
78
|
+
help="global single entry: cg-mcp with no --db; graphs come from the registry")
|
|
79
|
+
p.add_argument("--migrate", action="store_true",
|
|
80
|
+
help="fold per-repo cg-* host entries into the graph registry (dry run unless --apply)")
|
|
81
|
+
p.add_argument("--apply", action="store_true", help="with --migrate, write the registry and the host config")
|
|
82
|
+
p.add_argument("--graphs", help="registry file for --migrate (default: ~/.config/cg/graphs.toml)")
|
|
76
83
|
|
|
77
84
|
|
|
78
85
|
def _impact_labels(rows: list[dict], name_of, group_of) -> list[str]:
|
|
@@ -506,9 +513,14 @@ def main(argv=None):
|
|
|
506
513
|
mcp_file=a.mcp_file, dry_run=a.dry_run, assume_yes=a.yes)
|
|
507
514
|
if a.cmd in ("install", "uninstall"):
|
|
508
515
|
from .mcp_install import run as run_install
|
|
516
|
+
registry = bool(getattr(a, "registry", False))
|
|
517
|
+
migrate = bool(getattr(a, "migrate", False))
|
|
518
|
+
if (registry or migrate) and not a.project:
|
|
519
|
+
a.glob = True
|
|
509
520
|
return run_install(a.host, scope="global" if a.glob else "project", root=a.dir, db=a.db,
|
|
510
521
|
tools=a.tools, portable=a.portable, remove=a.cmd == "uninstall" or a.uninstall,
|
|
511
|
-
dry_run=a.dry_run, assume_yes=a.yes
|
|
522
|
+
dry_run=a.dry_run, assume_yes=a.yes, registry=registry, migrate=migrate,
|
|
523
|
+
apply=bool(getattr(a, "apply", False)), graphs=getattr(a, "graphs", None))
|
|
512
524
|
if a.cmd == "hooks":
|
|
513
525
|
from . import hooks as HK
|
|
514
526
|
return HK.run(a.action, root=a.dir, db=a.db, dry_run=a.dry_run, assume_yes=a.yes)
|
|
@@ -624,6 +636,8 @@ def main(argv=None):
|
|
|
624
636
|
print(json.dumps(res, indent=1, default=str) if a.json else render_protocols(res, max_items=a.max_items))
|
|
625
637
|
return
|
|
626
638
|
if a.cmd == "tests":
|
|
639
|
+
if _unknown_route(st, a.spec, a.json):
|
|
640
|
+
return
|
|
627
641
|
res = Q.tests_covering(st, a.spec, min_conf=a.min_confidence, near_depth=a.max_depth or None,
|
|
628
642
|
unit_only=a.unit_only, exclude_roots=a.exclude_root, through_roots=a.through_roots)
|
|
629
643
|
res["completeness"] = _completeness(st, res.get("targets"))
|
|
@@ -662,12 +676,17 @@ def main(argv=None):
|
|
|
662
676
|
print(json.dumps(res, indent=1, default=str) if a.json else Q.render_search(res))
|
|
663
677
|
return
|
|
664
678
|
if a.cmd == "reaches":
|
|
679
|
+
for spec in a.specs:
|
|
680
|
+
if _unknown_route(st, spec, a.json):
|
|
681
|
+
return
|
|
665
682
|
res = Q.reaches(st, a.specs, min_conf=a.min_confidence, max_depth=a.max_depth, gate=None if a.gate == "none" else a.gate,
|
|
666
683
|
platform=a.platform, connection=a.connection)
|
|
667
684
|
res["completeness"] = _completeness(st, [x for t in res["targets"].values() for x in t] + [i["id"] for i in res["items"]])
|
|
668
685
|
print(json.dumps(res, indent=1, default=str) if a.json else Q.render_reaches(res, show_paths=not a.no_paths))
|
|
669
686
|
_note(res["completeness"], a.json)
|
|
670
687
|
elif a.cmd == "impact":
|
|
688
|
+
if _unknown_route(st, a.spec, a.json):
|
|
689
|
+
return
|
|
671
690
|
res = Q.impact(st, a.spec, min_conf=a.min_confidence, platform=a.platform)
|
|
672
691
|
if a.json:
|
|
673
692
|
res["completeness"] = _completeness(st, list(res["targets"]) + [c["id"] for c in res["callers"]])
|
|
@@ -675,16 +694,19 @@ def main(argv=None):
|
|
|
675
694
|
if res.get("platform"):
|
|
676
695
|
from .platforms import render_filter
|
|
677
696
|
print(render_filter(res["platform"]))
|
|
678
|
-
|
|
679
|
-
|
|
697
|
+
dropped = res["platform"].get("targets_not_built") or []
|
|
698
|
+
if dropped and res["targets"]:
|
|
699
|
+
print(f"not built for {a.platform}: {', '.join(dropped[:6])}")
|
|
700
|
+
if dropped and not res["targets"]:
|
|
701
|
+
msg = f"{a.spec} is not built for {a.platform}: nothing calls it there"
|
|
702
|
+
if Q.divergence_lists(st, a.platform, dropped):
|
|
703
|
+
msg += (f" (`cg platforms divergence --target {a.platform}` lists references to it that would not build)")
|
|
704
|
+
print(msg); return
|
|
680
705
|
print(f"targets: {res['targets'][:5]}")
|
|
681
706
|
if not res["targets"]:
|
|
682
707
|
print(f"no method matches {a.spec!r}; try `search` with part of the name"); return
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
if Q.divergence_lists(st, a.platform, res["targets"]):
|
|
686
|
-
msg += (f" (`cg platforms divergence --target {a.platform}` lists references to it that would not build)")
|
|
687
|
-
print(msg); return
|
|
708
|
+
for d in res.get("default_arguments") or []:
|
|
709
|
+
print(f"via default argument: {d['src']} @ {d['file']}:{d['line']}")
|
|
688
710
|
for line in Q.override_lines(res):
|
|
689
711
|
print(line)
|
|
690
712
|
if res.get("connections"):
|
|
@@ -740,6 +762,8 @@ def main(argv=None):
|
|
|
740
762
|
res = Q.siblings(st, a.spec)
|
|
741
763
|
print(json.dumps(res, indent=1, default=str) if a.json else Q.render_siblings(st, a.spec, res))
|
|
742
764
|
elif a.cmd == "node":
|
|
765
|
+
if _unknown_route(st, a.spec, a.json):
|
|
766
|
+
return
|
|
743
767
|
ids = list(dict.fromkeys(Q.resolve_targets(st, a.spec)))[:20]
|
|
744
768
|
docs = [node_doc(st, nid) for nid in ids]
|
|
745
769
|
if a.json:
|
|
@@ -759,10 +783,14 @@ def main(argv=None):
|
|
|
759
783
|
if not p:
|
|
760
784
|
raise SystemExit(1) # scripts can tell "no path" apart from a path
|
|
761
785
|
elif a.cmd == "downstream":
|
|
786
|
+
if _unknown_route(st, a.spec, a.json):
|
|
787
|
+
return
|
|
762
788
|
res = Q.downstream(st, a.spec, min_conf=a.min_confidence, max_depth=a.max_depth, gate=None if a.gate == "none" else a.gate,
|
|
763
789
|
platform=a.platform)
|
|
764
790
|
print(json.dumps(res, indent=1, default=str) if a.json else Q.render_downstream(res, show_paths=not a.no_paths))
|
|
765
791
|
elif a.cmd == "api-calls":
|
|
792
|
+
if _unknown_route(st, a.spec, a.json):
|
|
793
|
+
return
|
|
766
794
|
rows = Q.api_calls(st, a.spec)
|
|
767
795
|
print(json.dumps(rows, indent=1, default=str) if a.json else Q.render_api_calls(rows))
|
|
768
796
|
if not a.json:
|
|
@@ -774,6 +802,17 @@ def main(argv=None):
|
|
|
774
802
|
doc = stats_doc(st)
|
|
775
803
|
print(json.dumps(doc, indent=1, default=str) if a.json else render_stats(st, doc))
|
|
776
804
|
|
|
805
|
+
def _unknown_route(st, spec: str, as_json: bool) -> bool:
|
|
806
|
+
miss = Q.route_failure(st, spec)
|
|
807
|
+
if not miss:
|
|
808
|
+
return False
|
|
809
|
+
if as_json:
|
|
810
|
+
print(json.dumps({"error": miss["error"], "spec": miss["spec"], "suggestions": miss["suggestions"]}))
|
|
811
|
+
else:
|
|
812
|
+
print(miss["text"])
|
|
813
|
+
raise SystemExit(1)
|
|
814
|
+
|
|
815
|
+
|
|
777
816
|
def node_doc(st, nid: str) -> dict:
|
|
778
817
|
"""One node with its attrs parsed and its outgoing / incoming edges (`cg node --json`, #75)."""
|
|
779
818
|
n = dict(st.node(nid))
|
|
@@ -28,6 +28,19 @@ from .plugins.flutter.plugin import FlutterPlugin
|
|
|
28
28
|
from .plugins.nest.plugin import NestPlugin
|
|
29
29
|
from .plugins.nextjs.plugin import NextPlugin
|
|
30
30
|
from .plugins.express.plugin import ExpressPlugin
|
|
31
|
+
import subprocess
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _git_head(root) -> str | None:
|
|
35
|
+
"""Commit indexed for this root, when it is a git work tree."""
|
|
36
|
+
try:
|
|
37
|
+
proc = subprocess.run(["git", "-C", str(root), "rev-parse", "HEAD"],
|
|
38
|
+
capture_output=True, text=True, timeout=8)
|
|
39
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
40
|
+
return None
|
|
41
|
+
if proc.returncode != 0:
|
|
42
|
+
return None
|
|
43
|
+
return (proc.stdout or "").strip() or None
|
|
31
44
|
from .plugins.astro.plugin import AstroPlugin
|
|
32
45
|
from .plugins.kotlin.plugin import KotlinPlugin
|
|
33
46
|
from .plugins.java.plugin import JavaPlugin
|
|
@@ -464,6 +477,9 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
|
|
|
464
477
|
stats["nodes"] = len(builder.nodes)
|
|
465
478
|
stats["edges"] = len(builder.edges)
|
|
466
479
|
stats["index_seconds"] = round(time.time() - t0, 2)
|
|
467
|
-
|
|
480
|
+
head = _git_head(project.root)
|
|
481
|
+
extra = {"commit": head} if head else {}
|
|
482
|
+
store.set_meta(project=project.name, root=str(project.root), stats=stats,
|
|
483
|
+
indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()), **extra)
|
|
468
484
|
store.db.close()
|
|
469
485
|
return stats
|
|
@@ -101,20 +101,67 @@ def _method_ok(cm: str, rm: str) -> bool:
|
|
|
101
101
|
return cm in rms or "ANY" in rms or (cm == "HEAD" and "GET" in rms)
|
|
102
102
|
|
|
103
103
|
|
|
104
|
+
_BASE_SEG = re.compile(r"^(api|v\d+)$", re.I)
|
|
105
|
+
|
|
106
|
+
|
|
104
107
|
def suffix_candidates(path: str, routes: list[dict]):
|
|
105
|
-
"""
|
|
108
|
+
"""Align the client path with the end of a route only when the dropped prefix is a base path (`api`, `v1`)."""
|
|
106
109
|
cs = _segs(path)
|
|
107
110
|
out = []
|
|
108
111
|
for r in routes:
|
|
109
112
|
us = _segs(r["uri"])
|
|
110
113
|
if len(us) <= len(cs):
|
|
111
114
|
continue
|
|
115
|
+
dropped = us[:len(us) - len(cs)]
|
|
116
|
+
if any(not _BASE_SEG.match(seg) for seg in dropped):
|
|
117
|
+
continue
|
|
112
118
|
ok, info = match_path("/" + "/".join(cs), "/" + "/".join(us[len(us) - len(cs):]))
|
|
113
119
|
if ok and info["lit"] > 0:
|
|
114
120
|
out.append((r, "suffix", info))
|
|
115
121
|
return out
|
|
116
122
|
|
|
117
123
|
|
|
124
|
+
def known_origin_text(attrs: dict) -> str | None:
|
|
125
|
+
"""Env placeholder or literal base URL, when the client recorded one."""
|
|
126
|
+
kind = attrs.get("origin_kind")
|
|
127
|
+
origin = attrs.get("origin") or ""
|
|
128
|
+
base = attrs.get("base") or {}
|
|
129
|
+
if not isinstance(base, dict):
|
|
130
|
+
base = {}
|
|
131
|
+
parts = [origin, base.get("placeholder") or "", base.get("value") or ""]
|
|
132
|
+
text = " ".join(p for p in parts if isinstance(p, str) and p)
|
|
133
|
+
if kind == "env" or (isinstance(origin, str) and origin.startswith("{env.")):
|
|
134
|
+
return text or None
|
|
135
|
+
if kind == "other" or "://" in text:
|
|
136
|
+
return text or None
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
_GENERIC_ORIGIN = {"env", "base", "url", "api", "app", "http", "https", "host", "origin", "endpoint", "service", "internal"}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def repos_for_origin(text: str, servers: list[str]) -> list[str] | None:
|
|
144
|
+
"""Server names named by the origin.
|
|
145
|
+
|
|
146
|
+
``None`` when the origin is a generic API base (``API_BASE_URL``) and does not name a repo:
|
|
147
|
+
matching stays as it was. ``[]`` when it names a service that is not one of ``servers``.
|
|
148
|
+
"""
|
|
149
|
+
low = text.lower()
|
|
150
|
+
hits = []
|
|
151
|
+
for name in servers:
|
|
152
|
+
token = name.lower()
|
|
153
|
+
if len(token) < 3:
|
|
154
|
+
continue
|
|
155
|
+
if re.search(rf"(^|[^a-z0-9]){re.escape(token)}([^a-z0-9]|$)", low):
|
|
156
|
+
hits.append(name)
|
|
157
|
+
if hits:
|
|
158
|
+
return hits
|
|
159
|
+
tokens = [t for t in re.findall(r"[a-z][a-z0-9]+", low) if t not in _GENERIC_ORIGIN]
|
|
160
|
+
if not tokens:
|
|
161
|
+
return None
|
|
162
|
+
return []
|
|
163
|
+
|
|
164
|
+
|
|
118
165
|
def match_endpoint(method: str, path: str, routes: list[dict], origin_kind: str = "api", origin: str | None = None,
|
|
119
166
|
base_prefix: str | None = None) -> dict:
|
|
120
167
|
"""base_prefix: path part of a configured base URL already folded into `path` (http node attrs.base); when the
|
|
@@ -388,7 +435,15 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
|
|
|
388
435
|
targets = [s for s in server_names if (s != client or folded_self) and (client not in allow or s in allow[client])]
|
|
389
436
|
pool = [rt for s in targets for rt in by_server[s]]
|
|
390
437
|
bp = base_path((a.get("base") or {}).get("value") or "") if a.get("base") else None
|
|
438
|
+
origin_text = known_origin_text(a)
|
|
439
|
+
owners = repos_for_origin(origin_text, targets) if origin_text else None
|
|
440
|
+
if owners is not None and len(owners) == 1:
|
|
441
|
+
pool = [rt for rt in pool if rt["server"] == owners[0]]
|
|
391
442
|
res = match_endpoint(a["method"], a["path"], pool, a.get("origin_kind", "api"), a.get("origin"), base_prefix=bp or None)
|
|
443
|
+
if origin_text and owners == [] and not res.get("matched") and a.get("origin_kind") != "other":
|
|
444
|
+
reason = res.get("reason") or ""
|
|
445
|
+
if reason.startswith(("no backend route", "not a backend URL")) or "suffix" in reason:
|
|
446
|
+
res["reason"] = "external (other origin)"
|
|
392
447
|
res.update({"endpoint": ep_id, "method": a["method"], "calls": calls_by_ep.get(ep_id, []),
|
|
393
448
|
"_client": client, "_servers": targets})
|
|
394
449
|
results.append(res)
|
|
@@ -448,13 +503,20 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
|
|
|
448
503
|
for sc in scen[:1]:
|
|
449
504
|
db.executemany("INSERT INTO node_entry_live VALUES (?,?,?,?,?)", [(sc, *r) for r in tag_entries_rows(nodes, edges, prop, skip_gate=sc)])
|
|
450
505
|
db.commit()
|
|
506
|
+
# call sites whose wrapper no entry point reaches are matched, but not live
|
|
507
|
+
live_ids = {r[0] for r in db.execute("SELECT DISTINCT node_id FROM node_entry WHERE entry_kind != 'test'")}
|
|
508
|
+
for r in results:
|
|
509
|
+
for c in r["calls"]:
|
|
510
|
+
c["live"] = c.get("src") in live_ids
|
|
511
|
+
if r["matched"] and r["calls"] and not any(c.get("live") for c in r["calls"]):
|
|
512
|
+
r["no_live_caller"] = True
|
|
451
513
|
# ---- stats: per call site and per distinct endpoint
|
|
452
514
|
n_ep = len(results)
|
|
453
515
|
m_ep = sum(1 for r in results if r["matched"])
|
|
454
516
|
site_match = {}
|
|
455
517
|
for r in results:
|
|
456
518
|
for c in r["calls"]:
|
|
457
|
-
site_match[c["at"]] = site_match.get(c["at"], False) or bool(r["matched"])
|
|
519
|
+
site_match[c["at"]] = site_match.get(c["at"], False) or (bool(r["matched"]) and c.get("live", True))
|
|
458
520
|
sites = list(site_match)
|
|
459
521
|
m_sites = sum(1 for v in site_match.values() if v)
|
|
460
522
|
conf_ct = defaultdict(int)
|
|
@@ -476,7 +538,7 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
|
|
|
476
538
|
for r in eps:
|
|
477
539
|
hit = any(rmap[m["route"]]["server"] == server for m in r["matched"])
|
|
478
540
|
for c in r["calls"]:
|
|
479
|
-
sm[c["at"]] = sm.get(c["at"], False) or hit
|
|
541
|
+
sm[c["at"]] = sm.get(c["at"], False) or (hit and c.get("live", True))
|
|
480
542
|
pair_stats.append({"client": client, "server": server, "endpoints": len(eps),
|
|
481
543
|
"endpoints_matched": sum(1 for r in eps if any(rmap[m["route"]]["server"] == server for m in r["matched"])),
|
|
482
544
|
"call_sites": len(sm), "call_sites_matched": sum(1 for v in sm.values() if v)})
|
|
@@ -497,10 +559,23 @@ def link_many(repos: list[tuple[str, str, str]], out_db: str, *, allow: dict | N
|
|
|
497
559
|
for name, path, _role in repos:
|
|
498
560
|
got = for_graph(GraphStore(path))
|
|
499
561
|
cov.update({name: next(iter(got.values()))} if len(got) == 1 else got)
|
|
562
|
+
commits = {}
|
|
563
|
+
for name, path, _role in repos:
|
|
564
|
+
try:
|
|
565
|
+
member_st = GraphStore(path)
|
|
566
|
+
try:
|
|
567
|
+
member = member_st.meta()
|
|
568
|
+
finally:
|
|
569
|
+
member_st.db.close()
|
|
570
|
+
except Exception:
|
|
571
|
+
member = {}
|
|
572
|
+
if member.get("commit"):
|
|
573
|
+
commits[name] = member["commit"]
|
|
500
574
|
store.set_meta(project="+".join(names), stats=stats, repos=names, coverage=cov,
|
|
501
575
|
sources={name: str(Path(path).resolve()) for name, path, _role in repos},
|
|
502
576
|
repo_roles={name: role for name, _path, role in repos}, link_clients=clients, link_allow=allow,
|
|
503
|
-
indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime())
|
|
577
|
+
indexed_at=time.strftime("%Y-%m-%d %H:%M:%S UTC", time.gmtime()),
|
|
578
|
+
**({"commit": commits} if commits else {}))
|
|
504
579
|
db.close()
|
|
505
580
|
return {"stats": stats, "results": results, "payload_issues": issues, "uncalled_routes": uncalled,
|
|
506
581
|
"webhook_subscriptions": subscriptions, "external_callbacks": callbacks}
|
|
@@ -654,6 +729,11 @@ def write_match_report(res: dict, out_prefix: str) -> None:
|
|
|
654
729
|
at = ", ".join(sorted({c["at"] for c in r["calls"]})[:3])
|
|
655
730
|
extra = f" closest={r['closest']}" if r.get("closest") else (f" near={r['near']}" if r.get("near") else "")
|
|
656
731
|
L.append(f"- `{r['endpoint']}` - {r['reason']}{extra} - at {at}")
|
|
732
|
+
dead = [r for r in res["results"] if r.get("no_live_caller")]
|
|
733
|
+
if dead:
|
|
734
|
+
L += ["", "## Matched, no live caller", ""]
|
|
735
|
+
for r in dead:
|
|
736
|
+
L.append(f"- `{r['endpoint']}` — matched, no live caller")
|
|
657
737
|
L += ["", "## Ambiguous / heuristic matches", ""]
|
|
658
738
|
for r in res["results"]:
|
|
659
739
|
if r["matched"] and (len(r["matched"]) > 1 or any(m["confidence"] == "heuristic" for m in r["matched"])):
|