cg-code-graph 0.18.0__tar.gz → 0.19.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cg_code_graph-0.18.0/cg_code_graph.egg-info → cg_code_graph-0.19.1}/PKG-INFO +4 -4
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/README.md +3 -3
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/detect.py +4 -0
- cg_code_graph-0.19.1/cg_code_graph/core/env.py +78 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/extractors.py +33 -8
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/doctor.py +2 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/hooks.py +10 -4
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/indexer.py +8 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/link.py +11 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/mcp_server.py +2 -2
- cg_code_graph-0.19.1/cg_code_graph/plugins/express/plugin.py +924 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/extract.php +4 -3
- cg_code_graph-0.19.1/cg_code_graph/plugins/php/http_client.py +1003 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/plugin.py +2 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/extract.mjs +9 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/fw.mjs +27 -10
- cg_code_graph-0.19.1/cg_code_graph/plugins/ts/extractor/rr.mjs +748 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/plugin.py +6 -1
- cg_code_graph-0.19.1/cg_code_graph/plugins/ts/react_router.py +265 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/common.py +13 -3
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/__init__.py +2 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/express.yaml +1 -1
- cg_code_graph-0.19.1/cg_code_graph/presets/react-router.yaml +3 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/query.py +26 -2
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/routes.py +2 -2
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/tests_index.py +8 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1/cg_code_graph.egg-info}/PKG-INFO +4 -4
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/SOURCES.txt +7 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_cache_clean.py +3 -3
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_cache_migration.py +1 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_coverage.py +4 -4
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_docs_languages.py +12 -0
- cg_code_graph-0.19.1/tests/test_elysia.py +151 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_env.py +18 -16
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_hooks.py +36 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_mcp_index.py +2 -1
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_packaging.py +76 -4
- cg_code_graph-0.19.1/tests/test_php_http.py +270 -0
- cg_code_graph-0.19.1/tests/test_react_router.py +246 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_routes_search_explain.py +3 -3
- cg_code_graph-0.18.0/cg_code_graph/core/env.py +0 -84
- cg_code_graph-0.18.0/cg_code_graph/plugins/express/plugin.py +0 -435
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/LICENSE +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/MANIFEST.in +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/cli.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/coverage.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/payload.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/platforms.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/laravel/values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/gating.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/swift/plugin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/protocols/view.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/webhooks.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/pyproject.toml +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/setup.cfg +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_affected.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_astro.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_explore.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_external.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_gating.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_generated.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_java.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_parity.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_plans.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_spring.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_nuxt.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_values.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_viz.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_watch.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.18.0 → cg_code_graph-0.19.1}/tests/test_workspace_link.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.19.1
|
|
4
4
|
Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
@@ -74,8 +74,8 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
74
74
|
| Language | Frameworks and facts | Calls | Docs |
|
|
75
75
|
|---|---|---|---|
|
|
76
76
|
|  | Django (+ DRF, django-ninja), FastAPI / Starlette, Flask, Celery | exact (stdlib `ast`) | [Python](https://code-graph.cyberchronos00.workers.dev/docs/python) |
|
|
77
|
-
|   | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
|
|
78
|
-
|  | Laravel (routes
|
|
77
|
+
|   | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono, Elysia, React Router / Remix | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
|
|
78
|
+
|  | Laravel (routes, middleware, queues, broadcasting, outbound HTTP) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
|
|
79
79
|
|  | Flutter | exact (Dart analyzer; needs the Dart SDK) | [Platforms](https://code-graph.cyberchronos00.workers.dev/docs/platforms) |
|
|
80
80
|
|  | Android, Kotlin Multiplatform, Spring | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
|
|
81
81
|
|  | Spring (routes, guards, beans, tables, clients) | heuristic; exact with scip-java (opt-in) | [Java](https://code-graph.cyberchronos00.workers.dev/docs/java) |
|
|
@@ -88,7 +88,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
88
88
|
|
|
89
89
|
- `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
|
|
90
90
|
- `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
|
|
91
|
-
-
|
|
91
|
+
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
|
|
92
92
|
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
|
|
93
93
|
- MCP server (`cg-mcp`) so agents query the graph instead of grepping.
|
|
94
94
|
- Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
|
|
@@ -47,8 +47,8 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
47
47
|
| Language | Frameworks and facts | Calls | Docs |
|
|
48
48
|
|---|---|---|---|
|
|
49
49
|
|  | Django (+ DRF, django-ninja), FastAPI / Starlette, Flask, Celery | exact (stdlib `ast`) | [Python](https://code-graph.cyberchronos00.workers.dev/docs/python) |
|
|
50
|
-
|   | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
|
|
51
|
-
|  | Laravel (routes
|
|
50
|
+
|   | Nuxt / Vue, NestJS, Next.js, Astro, Express, Fastify, Koa, Hono, Elysia, React Router / Remix | exact (TypeScript compiler API) | [TS frameworks](https://code-graph.cyberchronos00.workers.dev/docs/ts-frameworks) |
|
|
51
|
+
|  | Laravel (routes, middleware, queues, broadcasting, outbound HTTP) | exact (nikic/php-parser; needs PHP 8.2+) | [PHP](https://code-graph.cyberchronos00.workers.dev/docs/php) |
|
|
52
52
|
|  | Flutter | exact (Dart analyzer; needs the Dart SDK) | [Platforms](https://code-graph.cyberchronos00.workers.dev/docs/platforms) |
|
|
53
53
|
|  | Android, Kotlin Multiplatform, Spring | heuristic; exact with scip-java (opt-in) | [Kotlin](https://code-graph.cyberchronos00.workers.dev/docs/kotlin) |
|
|
54
54
|
|  | Spring (routes, guards, beans, tables, clients) | heuristic; exact with scip-java (opt-in) | [Java](https://code-graph.cyberchronos00.workers.dev/docs/java) |
|
|
@@ -61,7 +61,7 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
61
61
|
|
|
62
62
|
- `reaches`, `impact`, `path`: every caller, route, job and page that reaches a table, config key or method.
|
|
63
63
|
- `cg affected --base main`: the tests and entry points a change reaches (`--quiet` feeds your test runner).
|
|
64
|
-
-
|
|
64
|
+
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
|
|
65
65
|
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
|
|
66
66
|
- MCP server (`cg-mcp`) so agents query the graph instead of grepping.
|
|
67
67
|
- Visual view (`cg serve`) and plan checks (`cg plan check`) for planned changes.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.
|
|
2
|
+
__version__ = "0.19.1"
|
|
@@ -59,6 +59,10 @@ def detect(root: Path) -> dict:
|
|
|
59
59
|
fw["astro"] = {"version": deps.get("astro")}
|
|
60
60
|
if "vue" in deps:
|
|
61
61
|
fw["vue"] = {"version": deps.get("vue")}
|
|
62
|
+
from ..plugins.ts.react_router import is_react_router
|
|
63
|
+
if is_react_router(root):
|
|
64
|
+
ver = deps.get("react-router") or deps.get("react-router-dom") or deps.get("@remix-run/react")
|
|
65
|
+
fw["react-router"] = {"version": ver} if ver else {}
|
|
62
66
|
from ..plugins.tsweb.common import SERVER_DEPS # TS / JS servers (NestJS, Next.js, Express / Koa / Fastify / Hono ...)
|
|
63
67
|
for name, pkgs in SERVER_DEPS.items():
|
|
64
68
|
hit = [d for d in pkgs if d in deps]
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""Process environment: ``CG_*`` names only.
|
|
2
|
+
|
|
3
|
+
``get`` reads ``os.environ`` on every call. A leftover ``CODEGRAPH_*`` name from this project
|
|
4
|
+
does not affect the value. The first read prints one stderr notice naming each leftover and
|
|
5
|
+
its ``CG_*`` replacement. ``CODEGRAPH_MCP_TOOLS`` belongs to another project and is ignored
|
|
6
|
+
silently.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
# Suffixes this project reads. ``CODEGRAPH_CACHE_DIR`` renames to ``CG_CACHE``.
|
|
14
|
+
SUFFIXES = (
|
|
15
|
+
"CACHE", "CACHE_DIR", "CARGO", "CFAMILY", "COMPDB", "C_MASK_ANNOTATIONS", "C_MAX_MACRO_REFS",
|
|
16
|
+
"C_SCIP", "C_SCIP_FILE", "EXCLUDE_DIRS", "INCLUDE_DIRS", "INDEXER_TIMEOUT", "JOBS",
|
|
17
|
+
"JAVA_SCIP", "JAVA_SCIP_FILE", "KOTLIN_SCIP", "KOTLIN_SCIP_FILE", "LIBINDEXSTORE",
|
|
18
|
+
"MAX_FILE_BYTES", "NODE", "NO_CACHE",
|
|
19
|
+
"NO_CARGO", "NO_HOOKS", "NO_STALE_CHECK", "RUST_ANALYZER", "RUST_BUILD_SCRIPTS", "RUST_SCIP",
|
|
20
|
+
"RUST_SCIP_FILE", "RUST_TARGETS", "SCIP_CLANG", "SCIP_JAVA", "SWIFT", "SWIFT_INDEX",
|
|
21
|
+
"SWIFT_INDEX_STORE",
|
|
22
|
+
)
|
|
23
|
+
_NO_LEGACY = frozenset({"MCP_TOOLS", "CACHE_DIR"})
|
|
24
|
+
_noted = False
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def replacements() -> dict[str, str]:
|
|
28
|
+
"""Old name -> ``CG_*`` name, in suffix order. ``CACHE_DIR`` is ``CG_CACHE``."""
|
|
29
|
+
out: dict[str, str] = {}
|
|
30
|
+
for name in SUFFIXES:
|
|
31
|
+
if name in _NO_LEGACY:
|
|
32
|
+
continue
|
|
33
|
+
if name == "CACHE":
|
|
34
|
+
out["CODEGRAPH_CACHE"] = "CG_CACHE"
|
|
35
|
+
out["CODEGRAPH_CACHE_DIR"] = "CG_CACHE"
|
|
36
|
+
else:
|
|
37
|
+
out["CODEGRAPH_" + name] = "CG_" + name
|
|
38
|
+
return out
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def note_removed() -> list[str]:
|
|
42
|
+
"""Print one stderr line when any removed name is set. Returns those old names."""
|
|
43
|
+
global _noted
|
|
44
|
+
mapping = replacements()
|
|
45
|
+
found = [old for old in mapping if old in os.environ]
|
|
46
|
+
if _noted:
|
|
47
|
+
return found
|
|
48
|
+
_noted = True
|
|
49
|
+
if found:
|
|
50
|
+
pairs = ", ".join(f"{old} -> {mapping[old]}" for old in found)
|
|
51
|
+
print(f"cg: ignored removed environment variables: {pairs}", file=sys.stderr)
|
|
52
|
+
return found
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get(name: str, default=None) -> str | None:
|
|
56
|
+
"""``CG_<name>`` when set, else ``default``. Removed ``CODEGRAPH_*`` names are ignored."""
|
|
57
|
+
note_removed()
|
|
58
|
+
new = "CG_" + name
|
|
59
|
+
if new in os.environ:
|
|
60
|
+
return os.environ[new]
|
|
61
|
+
return default
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def is_set(name: str) -> bool:
|
|
65
|
+
"""True when ``CG_<name>`` is present in the environment."""
|
|
66
|
+
note_removed()
|
|
67
|
+
return ("CG_" + name) in os.environ
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def flag(name: str) -> bool:
|
|
71
|
+
"""True when the value is set and not a false-like token (``0``, ``false``, ``no``, ``off``)."""
|
|
72
|
+
val = get(name)
|
|
73
|
+
return val is not None and val.strip().lower() not in ("", "0", "false", "no", "off")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def legacy_in_env() -> list[str]:
|
|
77
|
+
"""Removed ``CODEGRAPH_*`` names from this project that are present (for ``cg doctor``)."""
|
|
78
|
+
return note_removed()
|
|
@@ -5,8 +5,9 @@ The extractor sources ship inside the package (cg_code_graph/plugins/{ts,php,dar
|
|
|
5
5
|
|
|
6
6
|
- a checkout whose extractor directory already has them (`npm ci` run there) keeps using that directory;
|
|
7
7
|
- otherwise the sources are copied into a per-user cache directory and the dependencies installed there, on first
|
|
8
|
-
use or by `cg setup`. The directory is keyed by the lock file
|
|
9
|
-
|
|
8
|
+
use or by `cg setup`. The directory is keyed by the lock file and the extractor sources (names and contents), so a
|
|
9
|
+
release that adds or edits a module installs into a fresh directory. A cache directory that is missing a listed
|
|
10
|
+
source is incomplete and is rebuilt.
|
|
10
11
|
|
|
11
12
|
Cache root (core/cache.py): $CG_CACHE, else %LOCALAPPDATA%\\cg on Windows,
|
|
12
13
|
else $XDG_CACHE_HOME/cg or ~/.cache/cg; the extractors live in <root>/extractors.
|
|
@@ -46,7 +47,8 @@ class Spec:
|
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
SPECS = {
|
|
49
|
-
"typescript": Spec("typescript", PLUGINS / "ts" / "extractor", ("extract.mjs", "fw.mjs", "
|
|
50
|
+
"typescript": Spec("typescript", PLUGINS / "ts" / "extractor", ("extract.mjs", "fw.mjs", "rr.mjs", "package.json",
|
|
51
|
+
"package-lock.json"),
|
|
50
52
|
"package-lock.json", ("node_modules/typescript/package.json",), "npm", "TypeScript / JavaScript"),
|
|
51
53
|
"php": Spec("php", PLUGINS / "php" / "extractor", ("extract.php", "composer.json", "composer.lock"), "composer.lock",
|
|
52
54
|
("vendor/autoload.php",), "composer", "PHP"),
|
|
@@ -63,20 +65,42 @@ def _installed(d: Path, spec: Spec) -> bool:
|
|
|
63
65
|
return any((d / m).exists() for m in spec.markers)
|
|
64
66
|
|
|
65
67
|
|
|
68
|
+
def _missing_sources(spec: Spec, d: Path) -> list[str]:
|
|
69
|
+
"""Listed sources that exist in the package but not in the cache directory."""
|
|
70
|
+
return [rel for rel in spec.sources if (spec.pkg / rel).exists() and not (d / rel).exists()]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _cache_key(spec: Spec) -> str:
|
|
74
|
+
"""Lock file plus every source path and its bytes, so a new or edited module does not reuse an old install."""
|
|
75
|
+
h = hashlib.sha256()
|
|
76
|
+
lock = spec.pkg / spec.lock
|
|
77
|
+
h.update(lock.read_bytes() if lock.exists() else b"")
|
|
78
|
+
for rel in spec.sources:
|
|
79
|
+
h.update(b"\0")
|
|
80
|
+
h.update(rel.encode())
|
|
81
|
+
src = spec.pkg / rel
|
|
82
|
+
h.update(b"\0")
|
|
83
|
+
h.update(src.read_bytes() if src.exists() else b"")
|
|
84
|
+
return h.hexdigest()[:12]
|
|
85
|
+
|
|
86
|
+
|
|
66
87
|
def cache_dir(lang: str) -> Path:
|
|
67
88
|
spec = SPECS[lang]
|
|
68
|
-
|
|
69
|
-
key = hashlib.sha256(lock.read_bytes() if lock.exists() else b"").hexdigest()[:12]
|
|
70
|
-
return cache_root() / f"{lang}-{key}"
|
|
89
|
+
return cache_root() / f"{lang}-{_cache_key(spec)}"
|
|
71
90
|
|
|
72
91
|
|
|
73
92
|
def workdir(lang: str) -> Path:
|
|
74
93
|
"""The directory the extractor runs from: the package's own one when its dependencies are installed there (a
|
|
75
|
-
development checkout), else the cache directory (sources synced into it; dependencies maybe not yet installed).
|
|
94
|
+
development checkout), else the cache directory (sources synced into it; dependencies maybe not yet installed).
|
|
95
|
+
A cache directory missing a listed source is rebuilt from the package sources."""
|
|
76
96
|
spec = SPECS[lang]
|
|
77
97
|
if _installed(spec.pkg, spec):
|
|
78
98
|
return spec.pkg
|
|
79
99
|
d = cache_dir(lang)
|
|
100
|
+
if d.exists() and _missing_sources(spec, d):
|
|
101
|
+
# Incomplete copy (for example a 0.19.0 typescript cache that predates a module): drop it and start over
|
|
102
|
+
# when the key still matches, otherwise cache_dir already points at a fresh directory.
|
|
103
|
+
shutil.rmtree(d, ignore_errors=True)
|
|
80
104
|
_sync(spec, d)
|
|
81
105
|
return d
|
|
82
106
|
|
|
@@ -101,7 +125,8 @@ def status(lang: str) -> dict:
|
|
|
101
125
|
if _installed(spec.pkg, spec):
|
|
102
126
|
return {"installed": True, "dir": str(spec.pkg), "where": "package"}
|
|
103
127
|
d = cache_dir(lang)
|
|
104
|
-
|
|
128
|
+
ready = _installed(d, spec) and not _missing_sources(spec, d)
|
|
129
|
+
return {"installed": ready, "dir": str(d), "where": "cache"}
|
|
105
130
|
|
|
106
131
|
|
|
107
132
|
JS_RUNTIME_MISSING = (
|
|
@@ -471,7 +471,8 @@ def _legacy_lines(r: dict) -> list[str]:
|
|
|
471
471
|
names = r.get("legacy_env") or []
|
|
472
472
|
if names:
|
|
473
473
|
shown = ", ".join(names)
|
|
474
|
-
lines.append(f"note: {shown}
|
|
474
|
+
lines.append(f"note: {shown} no longer affects cg; rename each CODEGRAPH_* name to CG_* "
|
|
475
|
+
"(CODEGRAPH_CACHE and CODEGRAPH_CACHE_DIR become CG_CACHE)")
|
|
475
476
|
leg = r.get("legacy_cache") or None
|
|
476
477
|
if leg:
|
|
477
478
|
if leg.get("path"):
|
|
@@ -42,6 +42,12 @@ _BLOCK = re.compile(re.escape(BEGIN) + r".*?" + re.escape(END) + r"\n?", re.S)
|
|
|
42
42
|
_SHELLS = {"sh", "bash", "dash", "ksh", "zsh", "ash"}
|
|
43
43
|
_SHEBANG_ONLY = "#!/bin/sh"
|
|
44
44
|
_OLD_CLI = "-m " + "codegraph" + ".cli"
|
|
45
|
+
_OLD_NO_HOOKS = "CODEGRAPH_NO_HOOKS"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _block_outdated(block: str) -> bool:
|
|
49
|
+
"""A 0.17/0.18 block that still checks CODEGRAPH_NO_HOOKS, or the pre-0.17 CLI."""
|
|
50
|
+
return _OLD_CLI in block or _OLD_NO_HOOKS in block
|
|
45
51
|
|
|
46
52
|
|
|
47
53
|
def _sh_quote(text: str) -> str:
|
|
@@ -101,7 +107,7 @@ def _block_text(hook: str, root: str, db: str, py: str) -> str:
|
|
|
101
107
|
f"# cg-root: {root}",
|
|
102
108
|
f"# cg-db: {db}",
|
|
103
109
|
f"# cg-hook: {hook}",
|
|
104
|
-
'if [ "${CG_NO_HOOKS
|
|
110
|
+
'if [ "${CG_NO_HOOKS:-}" != 1 ]; then',
|
|
105
111
|
]
|
|
106
112
|
if hook == "post-checkout":
|
|
107
113
|
lines.append(' if [ "$1" != "$2" ]; then')
|
|
@@ -211,7 +217,7 @@ def _status_line(path: Path, hook: str) -> str:
|
|
|
211
217
|
found = _BLOCK.search(text)
|
|
212
218
|
if not found:
|
|
213
219
|
return f"{hook}: not installed"
|
|
214
|
-
if
|
|
220
|
+
if _block_outdated(found.group(0)):
|
|
215
221
|
return f"outdated hook {hook}: re-run cg hooks install"
|
|
216
222
|
root, db = _meta(text)
|
|
217
223
|
extra = ""
|
|
@@ -282,14 +288,14 @@ def run(action: str, root: str = ".", db: str | None = None, dry_run: bool = Fal
|
|
|
282
288
|
|
|
283
289
|
|
|
284
290
|
def outdated_names(root: str | Path) -> list[str]:
|
|
285
|
-
"""Hook names whose cg block still runs
|
|
291
|
+
"""Hook names whose cg block still runs `codegraph.cli` or checks `CODEGRAPH_NO_HOOKS`."""
|
|
286
292
|
hooks = _hooks_dir(Path(root))
|
|
287
293
|
if hooks is None:
|
|
288
294
|
return []
|
|
289
295
|
out = []
|
|
290
296
|
for hook in HOOKS:
|
|
291
297
|
found = _BLOCK.search(_read(hooks / hook))
|
|
292
|
-
if found and
|
|
298
|
+
if found and _block_outdated(found.group(0)):
|
|
293
299
|
out.append(hook)
|
|
294
300
|
return out
|
|
295
301
|
|
|
@@ -102,6 +102,12 @@ def setup(project: Project) -> dict:
|
|
|
102
102
|
names = {k: v for k, v in found.items() if k not in remove}
|
|
103
103
|
for k in sorted(add):
|
|
104
104
|
names.setdefault(k, ".cg.yaml")
|
|
105
|
+
# Elysia shares the Express plugin and preset. The coverage label is elysia, not express (via elysia).
|
|
106
|
+
det_fw = project.detected.get("frameworks") or {}
|
|
107
|
+
if "elysia" in det_fw and "elysia" not in remove:
|
|
108
|
+
if "express" in names and "express" not in det_fw:
|
|
109
|
+
names.pop("express")
|
|
110
|
+
names.setdefault("elysia", "detected")
|
|
105
111
|
applied = presets.select([lp.name for lp in langs], list(names))
|
|
106
112
|
project.options["presets"] = applied
|
|
107
113
|
return {"language_plugins": langs, "framework_plugins": fws, "languages": [lp.name for lp in langs],
|
|
@@ -411,6 +417,8 @@ def index_project(root: str | Path, db_path: str | Path, name: str | None = None
|
|
|
411
417
|
finally:
|
|
412
418
|
gst.db.close()
|
|
413
419
|
stats["starters_seconds"] = round(time.time() - t_st, 2)
|
|
420
|
+
from .plugins.ts.react_router import reconcile_detection
|
|
421
|
+
reconcile_detection(project, plan, stats)
|
|
414
422
|
stats["coverage"]["setup"] = {"frameworks": sorted(plan["frameworks"]), "presets": plan["presets"],
|
|
415
423
|
"config": cfg.get("file")}
|
|
416
424
|
if pl: # per-target coverage: what each declared target builds, conditions left unevaluated
|
|
@@ -16,7 +16,8 @@ Matching is deterministic (no guessing):
|
|
|
16
16
|
- segments match when literal == literal, client placeholder <-> route {param},
|
|
17
17
|
client literal -> route {param} (resolved), or a client segment with an embedded
|
|
18
18
|
placeholder fully matches a route literal (heuristic, e.g. export.{format} ~ export.csv);
|
|
19
|
-
- method must match (HEAD ~ GET);
|
|
19
|
+
- method must match (HEAD ~ GET); a client verb `ANY` matches only when one route fits the
|
|
20
|
+
path, and that match is `heuristic`. The most specific route (most literal==literal segments)
|
|
20
21
|
wins; ties are kept and marked heuristic (ambiguous).
|
|
21
22
|
|
|
22
23
|
Realtime: client channel subscriptions (channel_sub:<name>, from Echo / pusher-js / useEcho) get MATCHES_CHANNEL ->
|
|
@@ -94,6 +95,8 @@ def match_path(client: str, route: str) -> tuple[bool, dict]:
|
|
|
94
95
|
|
|
95
96
|
|
|
96
97
|
def _method_ok(cm: str, rm: str) -> bool:
|
|
98
|
+
if (cm or "").upper() == "ANY":
|
|
99
|
+
return True
|
|
97
100
|
rms = set(rm.upper().replace("|", ",").split(","))
|
|
98
101
|
return cm in rms or "ANY" in rms or (cm == "HEAD" and "GET" in rms)
|
|
99
102
|
|
|
@@ -180,6 +183,13 @@ def match_endpoint(method: str, path: str, routes: list[dict], origin_kind: str
|
|
|
180
183
|
key = lambda h: (-h[2]["ph_into_lit"], h[2]["lit"])
|
|
181
184
|
top = max(key(h) for h in hits)
|
|
182
185
|
best = [h for h in hits if key(h) == top]
|
|
186
|
+
if method.upper() == "ANY":
|
|
187
|
+
if len(best) != 1:
|
|
188
|
+
return {"matched": [], "path": path, "reason": "ANY verb matches only a unique path",
|
|
189
|
+
"near": [h[0]["id"] for h in best][:3]}
|
|
190
|
+
r, variant, info = best[0]
|
|
191
|
+
return {"matched": [{"route": r["id"], "uri_variant": variant, "confidence": "heuristic", "segments": info}],
|
|
192
|
+
"path": path}
|
|
183
193
|
out = []
|
|
184
194
|
for r, variant, info in best:
|
|
185
195
|
conf = "exact"
|
|
@@ -44,7 +44,7 @@ server = MCPServer(
|
|
|
44
44
|
"Code graph of a project: classes, functions, routes, commands, jobs, pages, DB tables/columns, connections, "
|
|
45
45
|
"config/env keys, each edge with file:line evidence and a confidence (exact / resolved / heuristic). Stacks: "
|
|
46
46
|
"For a broad question ('how does X work') start with `explore`: source, entry points, call paths and blast radius in one call. "
|
|
47
|
-
"Laravel, Django (django-ninja, DRF), FastAPI/Starlette, Flask, NestJS, Next.js, Express/Fastify/Koa/Hono, Nuxt/Vue, Flutter/Dart, Rust, C, C++. "
|
|
47
|
+
"Laravel, Django (django-ninja, DRF), FastAPI/Starlette, Flask, NestJS, Next.js, Express/Fastify/Koa/Hono/Elysia, Nuxt/Vue, React Router / Remix, Flutter/Dart, Rust, C, C++. "
|
|
48
48
|
"Check the blast radius before editing: `reaches` lists everything that depends on a symbol/column/connection "
|
|
49
49
|
"(grouped runtime / library / operator / UI / dev / gated), `impact` gives callers up to entry points, `siblings` "
|
|
50
50
|
"finds parallel code that usually needs the same change, `writers` shows who writes a table, `routes` lists routes "
|
|
@@ -911,7 +911,7 @@ def routes(writes: str | None = None, reaches: list[str] | None = None, missing:
|
|
|
911
911
|
method, env key...). Optional filters: missing="<name>" keeps routes with no guard whose name contains it (e.g.
|
|
912
912
|
"auth:api", "ApiKeyGuard"), unguarded=true keeps routes with no auth guard (the framework presets' auth guards and
|
|
913
913
|
the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns). Each route: guards, what it reaches with one evidence chain, and the frontend callers on a
|
|
914
|
-
combined graph. Guards come from Laravel middleware, Nest guards/interceptors, Express/Koa/Fastify/Hono
|
|
914
|
+
combined graph. Guards come from Laravel middleware, Nest guards/interceptors, Express/Koa/Fastify/Hono/Elysia
|
|
915
915
|
middleware, Next.js middleware.ts / handler wrappers, django-ninja auth= and Django/DRF view access checks.
|
|
916
916
|
min_confidence: keep the default (heuristic) for reviews: every edge still shows its own label, and a stricter
|
|
917
917
|
level names the routes it hides.
|