cg-code-graph 0.23.12__tar.gz → 0.23.14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cg_code_graph-0.23.12/cg_code_graph.egg-info → cg_code_graph-0.23.14}/PKG-INFO +7 -5
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/README.md +5 -3
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/apps.py +2 -1
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/cli.py +129 -11
- cg_code_graph-0.23.14/cg_code_graph/cli_errors.py +171 -0
- cg_code_graph-0.23.14/cg_code_graph/core/detect.py +251 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/coverage.py +34 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/doctor.py +53 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/hooks.py +9 -1
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/indexer.py +16 -0
- cg_code_graph-0.23.14/cg_code_graph/l10n.py +603 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/mcp_graphs.py +149 -15
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/mcp_install.py +12 -4
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/mcp_server.py +8 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/query.py +58 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14/cg_code_graph.egg-info}/PKG-INFO +7 -5
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/SOURCES.txt +6 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/pyproject.toml +1 -1
- cg_code_graph-0.23.14/tests/test_cli_ergonomics.py +191 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_cli_output.py +2 -1
- cg_code_graph-0.23.14/tests/test_cloud_bootstrap.py +194 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_coverage.py +9 -2
- cg_code_graph-0.23.14/tests/test_detect_l10n.py +122 -0
- cg_code_graph-0.23.14/tests/test_incomplete_239.py +76 -0
- cg_code_graph-0.23.12/cg_code_graph/core/detect.py +0 -120
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/LICENSE +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/MANIFEST.in +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/cmake_sources.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/extractors.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/redact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/guard_facts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/insecure_transport.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/install_rules.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/platforms.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/express/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/massassign.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/extractor/extract.php +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/http_client.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/inline_guards.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/swift/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/extract.mjs +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/fw.mjs +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/routes.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/ssrf_input.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/surface.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/update_check.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/webhook_subs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/setup.cfg +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_affected.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_astro.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_cmake_sources.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_db_connections.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_dead_wrappers.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_dispatch_part3.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_echo_ref.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_echo_wrapper.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_elysia.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_env.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_explore.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_external.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_fp_batch.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_gating.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_generated.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_inline_guards.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_install_rules.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_192.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_201.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_202.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_203.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_204.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_205.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_206.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_207.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_208.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_209.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_210.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_211.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_211_used_at.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_212.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_212_langs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_218.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_219.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_issue_222.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_java.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_local_state.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_prop_exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_prop_overrides.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_laravel_receiver_narrowing.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_laravel_route_paths.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_link_origin.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_listing_files.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mass_assignment.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mcp_instructions.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_mcp_multi_graph.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_nuxt_i18n.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_nuxt_nitro.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_nuxt_side_dirs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_packaging.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_parity.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_parity_fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_parity_members.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_php_http.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_plans.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_readers_writers_specs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_redact_salt.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_request_keys.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_route_specs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_routes_search_explain.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_sdk_external_infra.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_sdk_external_mail.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_spring.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ssrf.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_state_tracking_235.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_surface.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_surface_transport.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_platform_files.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_tauri_events.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_node_http.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_unguarded.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_update_check.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_values.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_viz.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_watch.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_webhooks_152.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_webhooks_152b.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.23.12 → cg_code_graph-0.23.14}/tests/test_workspace_link.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.23.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.23.14
|
|
4
|
+
Summary: Python package on PyPI (not a Rust crate): a code graph of routes, calls, data access and platform boundaries. pip install cg-code-graph
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/cyberchronos00/code-graph
|
|
@@ -31,6 +31,8 @@ Dynamic: license-file
|
|
|
31
31
|
|
|
32
32
|
**See everything a change affects before you make it: a local, deterministic dependency graph of routes, calls, tables and config, with `file:line` evidence for every hop.**
|
|
33
33
|
|
|
34
|
+
cg is a Python package on PyPI: `pip install cg-code-graph` (or `pipx install cg-code-graph`, or `uv tool install cg-code-graph`). It is not a Rust crate. `cargo install cg-code-graph` does not apply.
|
|
35
|
+
|
|
34
36
|
For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
35
37
|
|
|
36
38
|
<!-- mcp-name: io.github.cyberchronos00/cg-code-graph -->
|
|
@@ -46,13 +48,13 @@ For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
|
46
48
|
## Quick start
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
|
-
pipx install cg-code-graph #
|
|
51
|
+
pipx install cg-code-graph # Python package. Not a Rust crate (cargo install does not apply).
|
|
50
52
|
cg index . --db out/graph.db # prints starter queries for your repo
|
|
51
|
-
cg install --
|
|
53
|
+
cg install --yes --project # non-interactive MCP register; --host cursor|claude|codex|vscode|…
|
|
52
54
|
cg reaches table:orders --db out/graph.db # any table, connection or config key
|
|
53
55
|
```
|
|
54
56
|
|
|
55
|
-
Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install).
|
|
57
|
+
Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install). A clean cloud or CI image: [Cloud agent bootstrap](https://code-graph.cyberchronos00.workers.dev/docs/cloud-agents).
|
|
56
58
|
|
|
57
59
|
`cg reaches table:store_books` on the bundled Django sample:
|
|
58
60
|
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
**See everything a change affects before you make it: a local, deterministic dependency graph of routes, calls, tables and config, with `file:line` evidence for every hop.**
|
|
6
6
|
|
|
7
|
+
cg is a Python package on PyPI: `pip install cg-code-graph` (or `pipx install cg-code-graph`, or `uv tool install cg-code-graph`). It is not a Rust crate. `cargo install cg-code-graph` does not apply.
|
|
8
|
+
|
|
7
9
|
For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
8
10
|
|
|
9
11
|
<!-- mcp-name: io.github.cyberchronos00/cg-code-graph -->
|
|
@@ -19,13 +21,13 @@ For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
|
19
21
|
## Quick start
|
|
20
22
|
|
|
21
23
|
```bash
|
|
22
|
-
pipx install cg-code-graph #
|
|
24
|
+
pipx install cg-code-graph # Python package. Not a Rust crate (cargo install does not apply).
|
|
23
25
|
cg index . --db out/graph.db # prints starter queries for your repo
|
|
24
|
-
cg install --
|
|
26
|
+
cg install --yes --project # non-interactive MCP register; --host cursor|claude|codex|vscode|…
|
|
25
27
|
cg reaches table:orders --db out/graph.db # any table, connection or config key
|
|
26
28
|
```
|
|
27
29
|
|
|
28
|
-
Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install).
|
|
30
|
+
Try it on a bundled sample, link a frontend to a backend, or connect an agent over MCP: [Quick start guide](https://code-graph.cyberchronos00.workers.dev/docs/quickstart). Other install options (install.sh, Windows, exact-mode toolchains): [Install](https://code-graph.cyberchronos00.workers.dev/docs/install). A clean cloud or CI image: [Cloud agent bootstrap](https://code-graph.cyberchronos00.workers.dev/docs/cloud-agents).
|
|
29
31
|
|
|
30
32
|
`cg reaches table:store_books` on the bundled Django sample:
|
|
31
33
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.23.
|
|
2
|
+
__version__ = "0.23.14"
|
|
@@ -56,7 +56,8 @@ def index_apps(root: str | Path, db: str | Path, cfg: dict, scip=None, python_ro
|
|
|
56
56
|
include_generated=include_generated)
|
|
57
57
|
out["apps"].append({"name": a["name"], "root": a["root"] or ".", "role": a["role"], "db": str(per_app[a["name"]]),
|
|
58
58
|
"nodes": st.get("nodes"), "edges": st.get("edges"), "index_seconds": st.get("index_seconds"),
|
|
59
|
-
"frameworks": sorted(((st.get("presets") or {}).get("frameworks") or {}))
|
|
59
|
+
"frameworks": sorted(((st.get("presets") or {}).get("frameworks") or {})),
|
|
60
|
+
**({"incomplete": st["incomplete"]} if st.get("incomplete") else {})})
|
|
60
61
|
if len(apps) == 1:
|
|
61
62
|
shutil.copyfile(per_app[apps[0]["name"]], db)
|
|
62
63
|
out["db_is"] = f"graph of app {apps[0]['name']}"
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
python -m cg_code_graph.cli api-calls <all|unmatched|substring|glob*> --db out/combined.db
|
|
13
13
|
python -m cg_code_graph.cli plan list|load|validate|check|baseline [<name>] --db out/combined.db [--verify] [--summary] [--json]
|
|
14
14
|
python -m cg_code_graph.cli routes --db ... [--writes [TABLE]] [--reaches SPEC...] [--missing NAME] [--unguarded]
|
|
15
|
-
python -m cg_code_graph.cli search <name> --db ... [--kind route]
|
|
15
|
+
python -m cg_code_graph.cli search <name> --db ... [--kind route] [--compact]
|
|
16
16
|
python -m cg_code_graph.cli channels [PATTERN] --db ... (who can join, which events publish, which client code listens)
|
|
17
17
|
python -m cg_code_graph.cli tests <spec> --db ... (tests covering a symbol / route / table: direct + transitive)
|
|
18
18
|
python -m cg_code_graph.cli bridges [PATTERN] --db ... [--protocol capacitor] [--unmatched] (web / native bridge calls)
|
|
@@ -35,6 +35,16 @@ import sys
|
|
|
35
35
|
from .core.store import GraphStore
|
|
36
36
|
from . import query as Q
|
|
37
37
|
from .bridges import PROTOCOLS as BRIDGE_PROTOCOLS
|
|
38
|
+
from .cli_errors import explain_parse_error
|
|
39
|
+
|
|
40
|
+
_COMPACT_SEARCH_LIMIT = 8
|
|
41
|
+
_COMPACT_SNIPPET_LINES = 40
|
|
42
|
+
_COMPACT_CALLERS = 8
|
|
43
|
+
_COMPACT_ENTRIES = 5
|
|
44
|
+
_COMPACT_HELP = ("short agent summary (also CG_OUTPUT=compact): fewer rows, short paths, and how to expand. "
|
|
45
|
+
"Search shows 8 nodes unless --limit is set; snippet shows 40 lines unless --max-lines is set; "
|
|
46
|
+
"impact omits evidence paths. The default output is unchanged. "
|
|
47
|
+
"For a token cap, use cg explore --budget")
|
|
38
48
|
|
|
39
49
|
|
|
40
50
|
def _parse_repo(spec: str) -> tuple[str, str, str]:
|
|
@@ -58,7 +68,8 @@ def _add_install_parser(sub, uninstall: bool):
|
|
|
58
68
|
from .mcp_install import HOSTS
|
|
59
69
|
name = "uninstall" if uninstall else "install"
|
|
60
70
|
help_ = ("remove the cg MCP server entry from a host config" if uninstall else
|
|
61
|
-
"register the cg MCP server (key cg) in a host config; previews and asks first"
|
|
71
|
+
"register the cg MCP server (key cg) in a host config; previews and asks first "
|
|
72
|
+
"(--yes writes without asking; with no host detected it writes the Cursor project config)")
|
|
62
73
|
p = sub.add_parser(name, help=help_)
|
|
63
74
|
p.add_argument("--host", action="append", choices=[*HOSTS, "all"],
|
|
64
75
|
help="MCP host (repeatable). Default: hosts already present for this scope")
|
|
@@ -86,6 +97,68 @@ def _add_install_parser(sub, uninstall: bool):
|
|
|
86
97
|
p.add_argument("--graphs", help="registry file for --migrate (default: ~/.config/cg/graphs.toml)")
|
|
87
98
|
|
|
88
99
|
|
|
100
|
+
class _CgParser(argparse.ArgumentParser):
|
|
101
|
+
"""Parent parser whose rejected flags and unknown commands stay on one screen."""
|
|
102
|
+
|
|
103
|
+
def parse_args(self, args=None, namespace=None):
|
|
104
|
+
argv = sys.argv[1:] if args is None else list(args)
|
|
105
|
+
self._cg_argv = argv
|
|
106
|
+
self._cg_root = self
|
|
107
|
+
for action in self._actions:
|
|
108
|
+
if isinstance(action, argparse._SubParsersAction):
|
|
109
|
+
for sub in action.choices.values():
|
|
110
|
+
sub._cg_argv = argv
|
|
111
|
+
sub._cg_root = self
|
|
112
|
+
return super().parse_args(args, namespace)
|
|
113
|
+
|
|
114
|
+
def error(self, message):
|
|
115
|
+
text = explain_parse_error(self, message, getattr(self, "_cg_argv", None))
|
|
116
|
+
if text:
|
|
117
|
+
self.exit(2, text if text.endswith("\n") else text + "\n")
|
|
118
|
+
super().error(message)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _opt_given(args, flag: str) -> bool:
|
|
122
|
+
return any(arg == flag or arg.startswith(flag + "=") for arg in args)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _compact_output(parsed, args) -> bool:
|
|
126
|
+
"""Text-only compact profile. `--json` keeps the document shape."""
|
|
127
|
+
if getattr(parsed, "json", False):
|
|
128
|
+
return False
|
|
129
|
+
if getattr(parsed, "compact", False):
|
|
130
|
+
return True
|
|
131
|
+
return os.environ.get("CG_OUTPUT", "").strip().lower() == "compact"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _print_impact_compact(st, parsed, res) -> None:
|
|
135
|
+
"""First callers and entry points, no evidence paths, and how to expand."""
|
|
136
|
+
callers, entries = res["callers"], res["entry_points"]
|
|
137
|
+
shown_c = callers[:_COMPACT_CALLERS]
|
|
138
|
+
print(f"callers (transitive): {len(callers)} showing {len(shown_c)}")
|
|
139
|
+
labels = _impact_labels(shown_c, lambda c: c.get("fqn") or c["id"], lambda c: c.get("module") or c.get("kind"))
|
|
140
|
+
for caller, label in zip(shown_c, labels):
|
|
141
|
+
loc = f" @ {Q.short_path(caller.get('file'))}:{caller.get('line')}" if caller.get("file") else ""
|
|
142
|
+
print(f" d={caller['depth']} [{caller['module'] or caller['kind']}] {label}{loc}{Q.caller_label(caller)}")
|
|
143
|
+
if len(callers) > len(shown_c):
|
|
144
|
+
print(f"{len(callers) - len(shown_c)} more callers, drop --compact for the full list")
|
|
145
|
+
shown_e = entries[:_COMPACT_ENTRIES]
|
|
146
|
+
print(f"entry points: {len(entries)} showing {len(shown_e)}")
|
|
147
|
+
for entry in shown_e:
|
|
148
|
+
loc = f" @ {Q.short_path(entry.get('file'))}:{entry.get('line')}" if entry.get("file") else ""
|
|
149
|
+
print(f" {entry['entry_kind']:16} {entry.get('fqn') or entry['name']}{loc} conf={entry['path_confidence']}")
|
|
150
|
+
if len(entries) > len(shown_e):
|
|
151
|
+
print(f"{len(entries) - len(shown_e)} more entry points, drop --compact for the full list")
|
|
152
|
+
if any(row.get("candidate") for row in shown_c + shown_e):
|
|
153
|
+
print(Q.CANDIDATE_NOTE)
|
|
154
|
+
if parsed.plans_dir:
|
|
155
|
+
from . import plans as P
|
|
156
|
+
hits = P.snapshot_clients(st, [e["id"] for e in entries if e["id"].startswith("route:")], parsed.plans_dir)
|
|
157
|
+
print(f"external clients (snapshot, not indexed): {len(hits)}")
|
|
158
|
+
print("expand: drop --compact or unset CG_OUTPUT. token cap: cg explore --budget")
|
|
159
|
+
_note(_completeness(st, list(res["targets"]) + [c["id"] for c in callers]), False)
|
|
160
|
+
|
|
161
|
+
|
|
89
162
|
def _impact_labels(rows: list[dict], name_of, group_of) -> list[str]:
|
|
90
163
|
"""Display names for one impact listing. Same-name rows in one group gain a file suffix."""
|
|
91
164
|
from collections import defaultdict
|
|
@@ -113,14 +186,14 @@ def _version_text(version: str) -> str:
|
|
|
113
186
|
|
|
114
187
|
def main(argv=None):
|
|
115
188
|
from . import __version__
|
|
116
|
-
ap =
|
|
189
|
+
ap = _CgParser(prog="cg")
|
|
117
190
|
args_in = sys.argv[1:] if argv is None else list(argv)
|
|
118
191
|
if args_in[:1] == ["--version"]:
|
|
119
192
|
print(_version_text(__version__)) # printed here: argparse's version action re-wraps a second line
|
|
120
193
|
return 0
|
|
121
194
|
ap.add_argument("--version", action="version", version=f"cg {__version__}")
|
|
122
195
|
sub = ap.add_subparsers(dest="cmd", required=True)
|
|
123
|
-
p = sub.add_parser("index", help="detect languages / frameworks under ROOT and build the graph DB (stats JSON on stdout, coverage on stderr)"); p.add_argument("root"); p.add_argument("--db", required=True); p.add_argument("--name"); p.add_argument("--scip", action="append"); p.add_argument("--gates", help="gate scenarios JSON (e.g. examples/bookstore.gates.json)")
|
|
196
|
+
p = sub.add_parser("index", help="detect languages / frameworks under ROOT and build the graph DB (stats JSON on stdout, coverage on stderr)"); p.add_argument("root"); p.add_argument("--db", required=True); p.add_argument("--name"); p.add_argument("--scip", action="append"); p.add_argument("--gates", help="gate scenarios JSON (e.g. examples/bookstore.gates.json)"); p.add_argument("--allow-incomplete", action="store_true", help="exit 0 even when most supported source files could not be indexed (missing PHP / Node / Dart toolchain); the WARNING / ERROR lines still print")
|
|
124
197
|
p.add_argument("--python-root", action="append", metavar="DIR",
|
|
125
198
|
help="Python source root, relative to ROOT (repeatable); replaces detection and python.source_roots in .cg.yaml")
|
|
126
199
|
p.add_argument("--no-apps", action="store_true",
|
|
@@ -221,6 +294,7 @@ def main(argv=None):
|
|
|
221
294
|
p = sub.add_parser("search", help="nodes by name / FQN substring, plus route middleware / guard / auth names")
|
|
222
295
|
p.add_argument("name"); p.add_argument("--db", required=True); p.add_argument("--kind"); p.add_argument("--limit", type=int, default=30)
|
|
223
296
|
p.add_argument("--json", action="store_true"); p.add_argument("--platform", help="only code built for this target (windows, linux, macos, ios, android, web; see docs/platforms.md)")
|
|
297
|
+
p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
|
|
224
298
|
p = sub.add_parser("channels", help="broadcast channels: who can join (auth callback + checks), which events publish on it, which client code / pages listen")
|
|
225
299
|
p.add_argument("pattern", nargs="?", help="channel pattern or concrete name (orders.{id}, orders.42, orders.*); omit to list all")
|
|
226
300
|
p.add_argument("--db", required=True); p.add_argument("--json", action="store_true"); p.add_argument("--no-source", action="store_true")
|
|
@@ -328,10 +402,13 @@ def main(argv=None):
|
|
|
328
402
|
p.add_argument("--context", type=int, default=0, help="extra lines of context around the symbol (default 0)")
|
|
329
403
|
p.add_argument("--max-lines", type=int, default=200, help="cap the printed body (default 200); extra lines are noted")
|
|
330
404
|
p.add_argument("--json", action="store_true")
|
|
405
|
+
p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
|
|
331
406
|
p = sub.add_parser("explore", help="question or spec → source, entry points, call paths and blast radius")
|
|
332
407
|
p.add_argument("query", help="a free-text question, a source file, or a symbol spec")
|
|
333
408
|
p.add_argument("--db", required=True)
|
|
334
|
-
p.add_argument("--budget", type=int, default=3000,
|
|
409
|
+
p.add_argument("--budget", type=int, default=3000,
|
|
410
|
+
help="token budget (clamped to 500..20000, default 3000). "
|
|
411
|
+
"search, snippet and impact name this flag from --help and from --compact")
|
|
335
412
|
p.add_argument("--max-symbols", type=int, default=4, help="how many symbols to expand (default 4)")
|
|
336
413
|
p.add_argument("--json", action="store_true")
|
|
337
414
|
p = sub.add_parser("agents", help="opt-in: add cg usage guidance (and the cg MCP entry) to AGENTS.md / CLAUDE.md / Cursor rules; previews and asks first")
|
|
@@ -394,6 +471,7 @@ def main(argv=None):
|
|
|
394
471
|
p.add_argument("--platform", help="only code built for this target (windows, linux, macos, ios, android, web; see docs/platforms.md)")
|
|
395
472
|
if name == "impact":
|
|
396
473
|
p.add_argument("--plans-dir", help="also list external clients from the snapshot files in this directory (e.g. examples/plans)")
|
|
474
|
+
p.add_argument("--compact", action="store_true", help=_COMPACT_HELP)
|
|
397
475
|
a = ap.parse_args(argv)
|
|
398
476
|
|
|
399
477
|
if a.cmd == "index":
|
|
@@ -413,7 +491,13 @@ def main(argv=None):
|
|
|
413
491
|
include_generated=a.include_generated)
|
|
414
492
|
print(json.dumps({k: v for k, v in summary.items()}, indent=2, default=str))
|
|
415
493
|
print(render_apps(summary), file=sys.stderr)
|
|
416
|
-
|
|
494
|
+
from .coverage import incomplete_lines
|
|
495
|
+
fatal = False
|
|
496
|
+
for app in summary.get("apps") or ():
|
|
497
|
+
for ln in incomplete_lines(app.get("incomplete"), allow=a.allow_incomplete, where=f"app {app['name']}"):
|
|
498
|
+
print(ln, file=sys.stderr)
|
|
499
|
+
fatal = fatal or bool((app.get("incomplete") or {}).get("fatal"))
|
|
500
|
+
return 3 if fatal and not a.allow_incomplete else None
|
|
417
501
|
st = index_project(a.root, a.db, a.name, a.scip, gates=a.gates, python_roots=a.python_root,
|
|
418
502
|
include_generated=a.include_generated)
|
|
419
503
|
except ConfigError as ex:
|
|
@@ -422,7 +506,12 @@ def main(argv=None):
|
|
|
422
506
|
print(json.dumps(st, indent=2, default=str))
|
|
423
507
|
from .coverage import render_summary
|
|
424
508
|
print(render_summary({"": st.get("coverage")}, db=a.db), file=sys.stderr) # stdout stays pure JSON
|
|
425
|
-
|
|
509
|
+
from .coverage import incomplete_lines
|
|
510
|
+
inc = st.get("incomplete")
|
|
511
|
+
for ln in incomplete_lines(inc, allow=a.allow_incomplete):
|
|
512
|
+
print(ln, file=sys.stderr)
|
|
513
|
+
# a mostly-unindexed project is an error, so `rc == 0 && nodes > 0` checks do not accept it (#239)
|
|
514
|
+
return 3 if inc and inc.get("fatal") and not a.allow_incomplete else None
|
|
426
515
|
if a.cmd == "doctor":
|
|
427
516
|
from .doctor import render, report
|
|
428
517
|
r = report(a.root, scip=a.scip)
|
|
@@ -523,8 +612,17 @@ def main(argv=None):
|
|
|
523
612
|
print(json.dumps(rows, indent=1) if a.json else render_starters(rows))
|
|
524
613
|
return
|
|
525
614
|
if a.cmd == "snippet":
|
|
526
|
-
|
|
527
|
-
|
|
615
|
+
context, max_lines = a.context, a.max_lines
|
|
616
|
+
compact = _compact_output(a, args_in)
|
|
617
|
+
if compact and not _opt_given(args_in, "--max-lines"):
|
|
618
|
+
max_lines = min(max_lines, _COMPACT_SNIPPET_LINES)
|
|
619
|
+
res = Q.snippet(GraphStore(a.db), a.spec, context=context, max_lines=max_lines)
|
|
620
|
+
if a.json:
|
|
621
|
+
print(json.dumps(res, indent=1, default=str))
|
|
622
|
+
elif compact:
|
|
623
|
+
print(Q.render_snippet_compact(res))
|
|
624
|
+
else:
|
|
625
|
+
print(Q.render_snippet(res))
|
|
528
626
|
return 0 if res.get("status") == "ok" else 1
|
|
529
627
|
if a.cmd == "explore":
|
|
530
628
|
from . import explore as EX
|
|
@@ -697,8 +795,25 @@ def main(argv=None):
|
|
|
697
795
|
_note(_completeness(st, res.get("targets")), False)
|
|
698
796
|
return
|
|
699
797
|
if a.cmd == "search":
|
|
700
|
-
|
|
701
|
-
|
|
798
|
+
limit = a.limit
|
|
799
|
+
compact = _compact_output(a, args_in)
|
|
800
|
+
if compact and not _opt_given(args_in, "--limit"):
|
|
801
|
+
limit = min(limit, _COMPACT_SEARCH_LIMIT)
|
|
802
|
+
res = Q.search(st, a.name, kind=a.kind, limit=limit, platform=a.platform)
|
|
803
|
+
if a.json:
|
|
804
|
+
print(json.dumps(res, indent=1, default=str))
|
|
805
|
+
elif compact:
|
|
806
|
+
more, note = 0, None
|
|
807
|
+
if a.platform:
|
|
808
|
+
if len(res["nodes"]) == limit:
|
|
809
|
+
probe = Q.search(st, a.name, kind=a.kind, limit=limit + 1, platform=a.platform)
|
|
810
|
+
if len(probe["nodes"]) > limit:
|
|
811
|
+
note = "1+ more, raise --limit"
|
|
812
|
+
else:
|
|
813
|
+
more = max(0, Q.search_node_total(st, a.name, a.kind) - len(res["nodes"]))
|
|
814
|
+
print(Q.render_search_compact(res, more=more, more_note=note))
|
|
815
|
+
else:
|
|
816
|
+
print(Q.render_search(res))
|
|
702
817
|
return
|
|
703
818
|
if a.cmd == "reaches":
|
|
704
819
|
for spec in a.specs:
|
|
@@ -738,6 +853,9 @@ def main(argv=None):
|
|
|
738
853
|
print(Q.connections_line(res["connections"]))
|
|
739
854
|
if not res["callers"] and not res["entry_points"]:
|
|
740
855
|
print(Q.explain_no_callers(st, a.spec, res["targets"], a.min_confidence)); return
|
|
856
|
+
if _compact_output(a, args_in):
|
|
857
|
+
_print_impact_compact(st, a, res)
|
|
858
|
+
return
|
|
741
859
|
nc = res.get("callers_candidate") or 0
|
|
742
860
|
print(f"callers (transitive): {len(res['callers']) - nc}" + (f" (+{nc} candidate)" if nc else ""))
|
|
743
861
|
caller_names = _impact_labels(res["callers"], lambda c: c.get("fqn") or c["id"], lambda c: c.get("module") or c.get("kind"))
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Short errors for rejected flags and unknown subcommands.
|
|
2
|
+
|
|
3
|
+
Grep- and git-style flags are not accepted: the reply names the long option
|
|
4
|
+
that already exists on this command, or the commands that do have it.
|
|
5
|
+
Unknown subcommands name the closest real commands instead of the full list.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import difflib
|
|
11
|
+
import re
|
|
12
|
+
|
|
13
|
+
# Rejected spellings -> long options that already exist somewhere on the CLI.
|
|
14
|
+
FLAG_HINTS: dict[str, tuple[str, ...]] = {
|
|
15
|
+
"-k": ("--kind",),
|
|
16
|
+
"-A": ("--context", "--max-lines"),
|
|
17
|
+
"-C": ("--context",),
|
|
18
|
+
"--depth": ("--max-depth",),
|
|
19
|
+
"--name": ("--db",),
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# Guesses that spelling distance does not connect to the real command.
|
|
23
|
+
COMMAND_HINTS: dict[str, tuple[str, ...]] = {
|
|
24
|
+
"callers": ("impact", "node", "readers"),
|
|
25
|
+
"caller": ("impact", "node", "readers"),
|
|
26
|
+
"called-by": ("impact", "node", "readers"),
|
|
27
|
+
"whocalls": ("impact", "node", "readers"),
|
|
28
|
+
"who-calls": ("impact", "node", "readers"),
|
|
29
|
+
"callees": ("downstream", "node"),
|
|
30
|
+
"callee": ("downstream", "node"),
|
|
31
|
+
"find": ("search",),
|
|
32
|
+
"grep": ("search",),
|
|
33
|
+
"cat": ("snippet", "node"),
|
|
34
|
+
"source": ("snippet", "node"),
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def explain_parse_error(parser: argparse.ArgumentParser, message: str, argv: list[str] | None) -> str | None:
|
|
39
|
+
"""A one-screen stderr body, or None to keep argparse's own error."""
|
|
40
|
+
root = getattr(parser, "_cg_root", parser)
|
|
41
|
+
args = list(argv or getattr(parser, "_cg_argv", []) or [])
|
|
42
|
+
if message.startswith("unrecognized arguments:"):
|
|
43
|
+
return _unknown_args(root, message, args)
|
|
44
|
+
if message.startswith("argument cmd: invalid choice:"):
|
|
45
|
+
return _unknown_command(root, message)
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _subparsers(parser: argparse.ArgumentParser):
|
|
50
|
+
for action in parser._actions:
|
|
51
|
+
if isinstance(action, argparse._SubParsersAction):
|
|
52
|
+
return action
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _option_strings(parser: argparse.ArgumentParser) -> set[str]:
|
|
57
|
+
out: set[str] = set()
|
|
58
|
+
for action in parser._actions:
|
|
59
|
+
out.update(action.option_strings)
|
|
60
|
+
return out
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _owners(root: argparse.ArgumentParser, option: str) -> list[str]:
|
|
64
|
+
action = _subparsers(root)
|
|
65
|
+
if action is None:
|
|
66
|
+
return []
|
|
67
|
+
return sorted(name for name, sub in action.choices.items() if option in _option_strings(sub))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _command(argv: list[str], names: set[str]) -> str | None:
|
|
71
|
+
for arg in argv:
|
|
72
|
+
if arg == "--":
|
|
73
|
+
return None
|
|
74
|
+
if arg in names:
|
|
75
|
+
return arg
|
|
76
|
+
if arg.startswith("-"):
|
|
77
|
+
continue
|
|
78
|
+
return None
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _normalize_flag(token: str) -> str:
|
|
83
|
+
if token.startswith("--") and "=" in token:
|
|
84
|
+
return token.split("=", 1)[0]
|
|
85
|
+
if re.fullmatch(r"-[A-Za-z]\d+", token):
|
|
86
|
+
return token[:2]
|
|
87
|
+
return token
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _flag_hint(root: argparse.ArgumentParser, command: str | None, flag: str) -> str | None:
|
|
91
|
+
options = FLAG_HINTS.get(flag)
|
|
92
|
+
if not options:
|
|
93
|
+
return None
|
|
94
|
+
parts: list[str] = []
|
|
95
|
+
for opt in options:
|
|
96
|
+
owners = _owners(root, opt)
|
|
97
|
+
if not owners:
|
|
98
|
+
continue
|
|
99
|
+
if command and command in owners:
|
|
100
|
+
parts.append(opt)
|
|
101
|
+
else:
|
|
102
|
+
parts.append(f"{opt} (on {', '.join(owners)})")
|
|
103
|
+
if not parts:
|
|
104
|
+
return None
|
|
105
|
+
text = f"unknown {flag}; did you mean {' or '.join(parts)}?"
|
|
106
|
+
if flag == "--name":
|
|
107
|
+
named = _owners(root, "--name")
|
|
108
|
+
if named:
|
|
109
|
+
text += f" (--name sets the project name on {', '.join(named)})"
|
|
110
|
+
return text
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _unknown_args(root: argparse.ArgumentParser, message: str, argv: list[str]) -> str:
|
|
114
|
+
action = _subparsers(root)
|
|
115
|
+
names = set(action.choices) if action is not None else set()
|
|
116
|
+
command = _command(argv, names)
|
|
117
|
+
tokens = message.split(":", 1)[1].strip().split()
|
|
118
|
+
hints: list[str] = []
|
|
119
|
+
leftover: list[str] = []
|
|
120
|
+
i = 0
|
|
121
|
+
while i < len(tokens):
|
|
122
|
+
token = tokens[i]
|
|
123
|
+
if token.startswith("-") and token != "-":
|
|
124
|
+
flag = _normalize_flag(token)
|
|
125
|
+
hint = _flag_hint(root, command, flag)
|
|
126
|
+
i += 1
|
|
127
|
+
values: list[str] = []
|
|
128
|
+
while i < len(tokens) and not (tokens[i].startswith("-") and tokens[i] != "-"):
|
|
129
|
+
values.append(tokens[i])
|
|
130
|
+
i += 1
|
|
131
|
+
if hint:
|
|
132
|
+
hints.append(hint)
|
|
133
|
+
else:
|
|
134
|
+
leftover.append(token)
|
|
135
|
+
leftover.extend(values)
|
|
136
|
+
continue
|
|
137
|
+
leftover.append(token)
|
|
138
|
+
i += 1
|
|
139
|
+
body: list[str] = list(hints)
|
|
140
|
+
if leftover:
|
|
141
|
+
body.append("unrecognized arguments: " + " ".join(leftover))
|
|
142
|
+
if not body:
|
|
143
|
+
body.append(message)
|
|
144
|
+
if leftover:
|
|
145
|
+
body.append(f"see `cg {command} --help`" if command else "see `cg --help`")
|
|
146
|
+
text = "cg: error: " + body[0]
|
|
147
|
+
if len(body) > 1:
|
|
148
|
+
text += "\n" + "\n".join(body[1:])
|
|
149
|
+
return text
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _fmt_try(names: list[str]) -> str:
|
|
153
|
+
shown = [f"cg {name}" for name in names]
|
|
154
|
+
if len(shown) == 1:
|
|
155
|
+
return shown[0]
|
|
156
|
+
if len(shown) == 2:
|
|
157
|
+
return f"{shown[0]} or {shown[1]}"
|
|
158
|
+
return ", ".join(shown[:-1]) + ", or " + shown[-1]
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _unknown_command(root: argparse.ArgumentParser, message: str) -> str:
|
|
162
|
+
action = _subparsers(root)
|
|
163
|
+
choices = list(action.choices) if action is not None else []
|
|
164
|
+
match = re.search(r"invalid choice: '([^']*)'", message)
|
|
165
|
+
name = match.group(1) if match else ""
|
|
166
|
+
picks = [cmd for cmd in COMMAND_HINTS.get(name, ()) if cmd in choices]
|
|
167
|
+
if not picks and name:
|
|
168
|
+
picks = difflib.get_close_matches(name, choices, n=3, cutoff=0.6)
|
|
169
|
+
if picks:
|
|
170
|
+
return f"cg: error: unknown command {name!r}; try: {_fmt_try(picks)}"
|
|
171
|
+
return f"cg: error: unknown command {name!r}; run `cg --help` for commands"
|