cg-code-graph 0.19.0__tar.gz → 0.20.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cg_code_graph-0.19.0/cg_code_graph.egg-info → cg_code_graph-0.20.0}/PKG-INFO +10 -10
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/README.md +9 -9
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/__init__.py +1 -1
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/cli.py +3 -2
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/extractors.py +33 -8
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/coverage.py +16 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/mcp_server.py +12 -3
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/payload.py +261 -38
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/express/plugin.py +120 -17
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/plugin.py +168 -1
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/values.py +199 -3
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/extract.php +28 -4
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/gating.py +12 -3
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/http_client.py +20 -4
- cg_code_graph-0.20.0/cg_code_graph/plugins/php/inline_guards.py +758 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/plugin.py +4 -1
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/extract.mjs +134 -6
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/fw.mjs +15 -2
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/view.py +5 -3
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/query.py +25 -19
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/routes.py +40 -8
- cg_code_graph-0.20.0/cg_code_graph/webhooks.py +1426 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0/cg_code_graph.egg-info}/PKG-INFO +10 -10
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/SOURCES.txt +5 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_coverage.py +4 -4
- cg_code_graph-0.20.0/tests/test_echo_ref.py +48 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_elysia.py +13 -0
- cg_code_graph-0.20.0/tests/test_inline_guards.py +186 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_packaging.py +76 -4
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_php_http.py +16 -1
- cg_code_graph-0.20.0/tests/test_request_keys.py +229 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_routes_search_explain.py +12 -4
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_nuxt.py +8 -3
- cg_code_graph-0.20.0/tests/test_webhooks_152.py +159 -0
- cg_code_graph-0.19.0/cg_code_graph/webhooks.py +0 -598
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/LICENSE +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/MANIFEST.in +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/__main__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/affected.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/agent_rules.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/agents.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/aitools.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/android_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/apple_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/apps.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/blindspots.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/bridges.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/brokers.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/concepts.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/config.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/cache.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/detect.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/env.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/fsutil.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/generated.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/model.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/paths.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/store.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/core/syntax_errors.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/dart_isolates.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/doctor.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/explore.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/external.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/graphql.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/hooks.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/indexer.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/jobs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/link.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/lint_async.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/local_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/local_sockets.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/mcp_install.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/parity.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/parity_structure.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plans.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/platform_scan.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/platforms.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/content.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/astro/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/cfamily/syntax.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/bridges.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/bin/extract.dart +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/pubspec.lock +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/extractor/pubspec.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/http.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/models.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/dart/program.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/extras.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/models.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/schemas.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/shapes.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/django/urls.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/express/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/flutter/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/flutter/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/java/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/interop.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/jvm/spring.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/kotlin/reparse.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/broadcast.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/laravel/tests.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/gates.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/runner.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/scipread.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/native/ts.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nest/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nest/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nextjs/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nextjs/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nuxt/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/nuxt/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/external.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/composer.json +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/extractor/composer.lock +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/php/strings.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/aitools.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/external.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/fields.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/refs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/roots.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/socketio.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/subproc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/tests.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/python/values.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/pyweb/values.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/cargo.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/rust/syntax.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/importer.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/scip.proto +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/scip/scip_pb2.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/stubs/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/stubs/plugins.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/baseurl.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/indexstore.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/packages.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/swift/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/baseurl.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/package-lock.json +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/package.json +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/extractor/rr.mjs +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/nav.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/plugin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/ts/react_router.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/common.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/plugins/tsweb/data.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/c_cpp.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/common.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/dart.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/django-ninja.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/django.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/djangorestframework.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/express.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/java.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/kotlin.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/laravel.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nest.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nextjs.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/nuxt.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/php.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/python.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/react-router.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/rust.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/spring.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/swift.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/presets/typescript.yaml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/process_runs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/builtin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/protocols/matchers.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_events.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_native.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/realtime_ws.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/roundtrip.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/rpc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/sdk_systems.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/sockets.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/starters.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/tests_index.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/udp_apps.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/__init__.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/graph.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/server.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/app.css +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/app.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/index.html +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/layered.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/VERSIONS.txt +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cose-base.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cytoscape-fcose.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/cytoscape.min.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/static/vendor/layout-base.js +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/package-lock.json +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/package.json +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/viz/tools/shoot.mjs +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/watch.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph/xcode.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/dependency_links.txt +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/entry_points.txt +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/requires.txt +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/cg_code_graph.egg-info/top_level.txt +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/pyproject.toml +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/setup.cfg +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_affected.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_agents_install.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_agents_md.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ai_tools.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_android_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_apple_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro_content.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_astro_server.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_bridges.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_bridges_pigeon_monorepo.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_brokers.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_clean.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_invalidation.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cache_migration.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_channels_tests.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_cli_output.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_completeness.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_config_extras.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_coverage_ts_hint.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_dart_isolates.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_dispatch_interfaces.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_django_flutter.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_docs_languages.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_docs_links.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_enum_constants.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_env.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_explore.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_external.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_gating.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_generated.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_graphql.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_hooks.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_impact_overrides.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_index_isolation.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_inherited_overrides.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_java.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_java_exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_jobs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_js_refs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_js_runtime.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_binding.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_fields.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_mixed.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_nav_consts.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_kotlin_props.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_laravel_determinism.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_laravel_resources.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_lint_async.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_local_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_local_sockets.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp_index.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_mcp_install.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_cfamily.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_concurrency.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_native_rust.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_nuxt_import_dirs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_nuxt_rootsrc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_parity.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_parity_structure.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_php_props.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_plain_js.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_plans.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platform_gaps.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platform_type_variants.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platforms.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_platforms_apple.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_presets_config.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_process_ipc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_process_runs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_protocols.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_app_tests_module.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_collection_chains.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_compat.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_entry_refs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_fields.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_infer_cycles.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_roots.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_subprocess_tests.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_tests.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_hosts.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_routes.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_python_web_routes_more.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_react_router.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_realtime.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_realtime_native.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_roundtrip.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_route_tables.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_rpc.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_scip_health.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_sdk_external.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_snippet.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_sockets.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_spring.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_starters_budget.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_binding.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_exact.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_facts.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_fields.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_modules.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_more.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_nav_values.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_parse_errors.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_props.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_sdk.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_testing.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_swift_values.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_tests_scope.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_fields.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_fields_js_vue.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_file_specs.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_frameworks.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_ts_src_tsconfig.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_values.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_viz.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_vue_nav.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_watch.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_webhooks.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_websockets.py +0 -0
- {cg_code_graph-0.19.0 → cg_code_graph-0.20.0}/tests/test_workspace_link.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cg-code-graph
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.0
|
|
4
4
|
Summary: cg: a code graph of routes, calls, data access and platform boundaries for agents and humans (CLI + MCP server)
|
|
5
5
|
Author: cyberchronos00
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,11 +33,11 @@ Dynamic: license-file
|
|
|
33
33
|
|
|
34
34
|
For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
35
35
|
|
|
36
|
-
[](https://pypi.org/project/cg-code-graph/) [](https://pepy.tech/project/cg-code-graph) [](https://pypi.org/project/cg-code-graph/) [](LICENSE) [](https://code-graph.cyberchronos00.workers.dev/)
|
|
36
|
+
[](https://pypi.org/project/cg-code-graph/) [](https://pepy.tech/project/cg-code-graph) [](https://pypi.org/project/cg-code-graph/) [](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE) [](https://code-graph.cyberchronos00.workers.dev/)
|
|
37
37
|
|
|
38
|
-
[Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](CHANGELOG.md)
|
|
38
|
+
[Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md)
|
|
39
39
|
|
|
40
|
-
[](docs/media/cg-view-demo.mp4)
|
|
40
|
+
[](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-view-demo.mp4)
|
|
41
41
|
|
|
42
42
|
</div>
|
|
43
43
|
|
|
@@ -67,7 +67,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
67
67
|
-READS_TABLE[resolved @ catalog/tasks.py:14]-> table:store_books
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
[](docs/media/cg-terminal-demo.mp4)
|
|
70
|
+
[](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-terminal-demo.mp4)
|
|
71
71
|
|
|
72
72
|
## Supported languages
|
|
73
73
|
|
|
@@ -75,7 +75,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
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
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) |
|
|
78
|
+
|  | Laravel (routes, route attributes, 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,8 +88,8 @@ 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
|
-
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
|
|
92
|
-
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
|
|
91
|
+
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
|
|
92
|
+
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
|
|
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.
|
|
95
95
|
|
|
@@ -97,6 +97,6 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
97
97
|
|
|
98
98
|
[Install](https://code-graph.cyberchronos00.workers.dev/docs/install) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Configuration](https://code-graph.cyberchronos00.workers.dev/docs/configuration) · [Architecture](https://code-graph.cyberchronos00.workers.dev/docs/architecture) · [Limitations](https://code-graph.cyberchronos00.workers.dev/docs/limitations)
|
|
99
99
|
|
|
100
|
-
[Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · MIT [License](LICENSE)
|
|
100
|
+
[Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md) · [Contributing](https://github.com/cyberchronos00/code-graph/blob/main/CONTRIBUTING.md) · [Security](https://github.com/cyberchronos00/code-graph/blob/main/SECURITY.md) · MIT [License](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE)
|
|
101
101
|
|
|
102
|
-
More recordings: [docs/media](docs/media).
|
|
102
|
+
More recordings: [docs/media](https://github.com/cyberchronos00/code-graph/tree/main/docs/media).
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
For you and your AI agent (CLI + MCP). No LLM in the graph.
|
|
8
8
|
|
|
9
|
-
[](https://pypi.org/project/cg-code-graph/) [](https://pepy.tech/project/cg-code-graph) [](https://pypi.org/project/cg-code-graph/) [](LICENSE) [](https://code-graph.cyberchronos00.workers.dev/)
|
|
9
|
+
[](https://pypi.org/project/cg-code-graph/) [](https://pepy.tech/project/cg-code-graph) [](https://pypi.org/project/cg-code-graph/) [](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE) [](https://code-graph.cyberchronos00.workers.dev/)
|
|
10
10
|
|
|
11
|
-
[Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](CHANGELOG.md)
|
|
11
|
+
[Docs](https://code-graph.cyberchronos00.workers.dev/) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md)
|
|
12
12
|
|
|
13
|
-
[](docs/media/cg-view-demo.mp4)
|
|
13
|
+
[](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-view-demo.mp4)
|
|
14
14
|
|
|
15
15
|
</div>
|
|
16
16
|
|
|
@@ -40,7 +40,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
40
40
|
-READS_TABLE[resolved @ catalog/tasks.py:14]-> table:store_books
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
[](docs/media/cg-terminal-demo.mp4)
|
|
43
|
+
[](https://github.com/cyberchronos00/code-graph/blob/main/docs/media/cg-terminal-demo.mp4)
|
|
44
44
|
|
|
45
45
|
## Supported languages
|
|
46
46
|
|
|
@@ -48,7 +48,7 @@ dependents: 18 nodes (code: 6, entry points: 9, other: 3)
|
|
|
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
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) |
|
|
51
|
+
|  | Laravel (routes, route attributes, 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,8 +61,8 @@ 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
|
-
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes.
|
|
65
|
-
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard.
|
|
64
|
+
- Across repos: `cg link` matches client HTTP calls (frontends and Laravel / Guzzle backends) to server routes, and checks request keys (Laravel FormRequest, Elysia schemas, Nuxt / TypeScript bodies).
|
|
65
|
+
- Route guards: `cg routes --writes --unguarded` lists routes that write with no auth guard. Laravel checks inside the action count as inline guards unless `--strict`.
|
|
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.
|
|
68
68
|
|
|
@@ -70,6 +70,6 @@ Go and others: import a SCIP index with `cg index --scip FILE`. Run `cg doctor`
|
|
|
70
70
|
|
|
71
71
|
[Install](https://code-graph.cyberchronos00.workers.dev/docs/install) · [Quick start](https://code-graph.cyberchronos00.workers.dev/docs/quickstart) · [CLI](https://code-graph.cyberchronos00.workers.dev/docs/cli) · [MCP](https://code-graph.cyberchronos00.workers.dev/docs/mcp) · [Configuration](https://code-graph.cyberchronos00.workers.dev/docs/configuration) · [Architecture](https://code-graph.cyberchronos00.workers.dev/docs/architecture) · [Limitations](https://code-graph.cyberchronos00.workers.dev/docs/limitations)
|
|
72
72
|
|
|
73
|
-
[Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · MIT [License](LICENSE)
|
|
73
|
+
[Changelog](https://github.com/cyberchronos00/code-graph/blob/main/CHANGELOG.md) · [Contributing](https://github.com/cyberchronos00/code-graph/blob/main/CONTRIBUTING.md) · [Security](https://github.com/cyberchronos00/code-graph/blob/main/SECURITY.md) · MIT [License](https://github.com/cyberchronos00/code-graph/blob/main/LICENSE)
|
|
74
74
|
|
|
75
|
-
More recordings: [docs/media](docs/media).
|
|
75
|
+
More recordings: [docs/media](https://github.com/cyberchronos00/code-graph/tree/main/docs/media).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""code-graph: deterministic code knowledge graph (beta)."""
|
|
2
|
-
__version__ = "0.
|
|
2
|
+
__version__ = "0.20.0"
|
|
@@ -171,7 +171,8 @@ def main(argv=None):
|
|
|
171
171
|
p.add_argument("--writes", nargs="?", const="*", metavar="TABLE", help="routes reaching a DB write (any table, or TABLE)")
|
|
172
172
|
p.add_argument("--reaches", nargs="+", metavar="SPEC", help="routes reaching any of these nodes (table, column, connection:, env:, Class.method)")
|
|
173
173
|
p.add_argument("--missing", metavar="NAME", help="keep routes with no guard whose name contains NAME (e.g. auth:api, ApiKeyGuard)")
|
|
174
|
-
p.add_argument("--unguarded", action="store_true", help="keep routes with no auth guard (framework presets, the auth name pattern, .cg.yaml auth.extra_patterns and --auth-pattern)")
|
|
174
|
+
p.add_argument("--unguarded", action="store_true", help="keep routes with no auth guard (framework presets, the auth name pattern, .cg.yaml auth.extra_patterns and --auth-pattern). An unconditional inline check (Laravel authorize / permission / shared secret) counts; --strict ignores it")
|
|
175
|
+
p.add_argument("--strict", action="store_true", help="with --unguarded, count only route-level guards (inline checks are still listed)")
|
|
175
176
|
p.add_argument("--auth-pattern", help="extra regex for guard names that count as auth")
|
|
176
177
|
p.add_argument("--min-confidence", default="heuristic", choices=["heuristic", "resolved", "exact"])
|
|
177
178
|
p.add_argument("--max-items", type=int, default=200); p.add_argument("--no-paths", action="store_true"); p.add_argument("--json", action="store_true")
|
|
@@ -548,7 +549,7 @@ def main(argv=None):
|
|
|
548
549
|
if a.cmd == "routes":
|
|
549
550
|
from . import routes as R
|
|
550
551
|
res = R.routes_report(st, writes=a.writes, reaches=a.reaches, missing=a.missing, unguarded=a.unguarded,
|
|
551
|
-
auth_pattern=a.auth_pattern, min_conf=a.min_confidence, platform=a.platform)
|
|
552
|
+
strict=a.strict, auth_pattern=a.auth_pattern, min_conf=a.min_confidence, platform=a.platform)
|
|
552
553
|
if a.json:
|
|
553
554
|
res["completeness"] = R.route_completeness(st)
|
|
554
555
|
print(json.dumps(res, indent=1, default=str) if a.json else R.render_routes(res, st, max_items=a.max_items, paths=not a.no_paths))
|
|
@@ -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 = (
|
|
@@ -338,6 +338,11 @@ def compute(root: str | Path, plugins: dict, scip_imported: bool = False, report
|
|
|
338
338
|
e["syntax_error_files"] = len(se)
|
|
339
339
|
e["parsed_with_errors"] = sum(1 for x in se if not x.get("parse_failed"))
|
|
340
340
|
e["decls_lost"] = sum(x.get("decls_lost", 0) for x in se)
|
|
341
|
+
if lang == "typescript" and st and st.get("realtime_subscriptions_unresolved_receiver"):
|
|
342
|
+
e["realtime_subscriptions_unresolved_receiver"] = st["realtime_subscriptions_unresolved_receiver"]
|
|
343
|
+
at = st.get("realtime_subscriptions_unresolved_receiver_at") or []
|
|
344
|
+
if at:
|
|
345
|
+
e["realtime_subscriptions_unresolved_receiver_at"] = at[:8]
|
|
341
346
|
if lang == "python" and st:
|
|
342
347
|
for k in ("roots_mode", "source_roots", "roots_warnings", "roots_ambiguous", "module_name_collisions"):
|
|
343
348
|
if st.get(k):
|
|
@@ -497,6 +502,16 @@ def _entry_text(e: dict) -> str:
|
|
|
497
502
|
return f"{e['language']} {e['files']} {e['status'].replace('_', ' ')}{errs}"
|
|
498
503
|
|
|
499
504
|
|
|
505
|
+
def realtime_unresolved_lines(e: dict, indent: str = " ") -> list[str]:
|
|
506
|
+
"""'.private(...)' on a receiver that is not an Echo client, with a channel literal: where to look."""
|
|
507
|
+
n = e.get("realtime_subscriptions_unresolved_receiver") or 0
|
|
508
|
+
if not n or e.get("language") != "typescript":
|
|
509
|
+
return []
|
|
510
|
+
at = e.get("realtime_subscriptions_unresolved_receiver_at") or []
|
|
511
|
+
where = f" ({', '.join(at[:5])})" if at else ""
|
|
512
|
+
return [f"{indent}typescript: {n} .private(...) call{'s' if n != 1 else ''} on an unknown receiver{where}"]
|
|
513
|
+
|
|
514
|
+
|
|
500
515
|
def syntax_error_lines(e: dict, all_files: bool = False, indent: str = " ") -> list[str]:
|
|
501
516
|
"""'swift: syntax errors in 8 files, 12 declarations lost (most first):' and one line per file with its error
|
|
502
517
|
line spans and the declarations lost there (5 files unless all_files), #73."""
|
|
@@ -702,6 +717,7 @@ def render(covs: dict[str, dict | None], all_files: bool = False) -> str:
|
|
|
702
717
|
out.append(f" fix: {e['hint']}")
|
|
703
718
|
for e in (cov or {}).get("languages", []):
|
|
704
719
|
out += syntax_error_lines(e, all_files)
|
|
720
|
+
out += realtime_unresolved_lines(e)
|
|
705
721
|
for e in (cov or {}).get("languages", []): # which mode an exact-capable language ran in, and why
|
|
706
722
|
if e["language"] in ("kotlin", "swift", "java") and not _is_gap(e) and e.get("reason"):
|
|
707
723
|
out.append(f" {e['language']}: {e['files']} files {e['status']}: {e['reason']}")
|
|
@@ -904,13 +904,16 @@ def explore(query: str, budget_tokens: int = 3000, max_symbols: int = 4) -> str:
|
|
|
904
904
|
|
|
905
905
|
@tool
|
|
906
906
|
def routes(writes: str | None = None, reaches: list[str] | None = None, missing: str | None = None,
|
|
907
|
-
unguarded: bool = False, auth_pattern: str | None = None, max_items: int = 40, paths: bool = True,
|
|
907
|
+
unguarded: bool = False, strict: bool = False, auth_pattern: str | None = None, max_items: int = 40, paths: bool = True,
|
|
908
908
|
min_confidence: str = "heuristic", platform: str | None = None) -> str:
|
|
909
909
|
"""Routes with their middleware / guards / auth, in one call. Optional scope: writes="*" (routes that reach any
|
|
910
910
|
DB write) or writes="<table>", reaches=[specs] (routes that reach any of these nodes: table, column, connection,
|
|
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
|
-
the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns).
|
|
913
|
+
the auth name pattern; extend with auth_pattern, a regex, or .cg.yaml auth.extra_patterns). An unconditional
|
|
914
|
+
inline check on a Laravel action (authorize, Gate, a permission check, FormRequest::authorize, controller
|
|
915
|
+
middleware, a shared-secret compare) is listed under guards as `inline:` and counts for unguarded. strict=true
|
|
916
|
+
with unguarded counts only route-level guards. Each route: guards, what it reaches with one evidence chain, and the frontend callers on a
|
|
914
917
|
combined graph. Guards come from Laravel middleware, Nest guards/interceptors, Express/Koa/Fastify/Hono/Elysia
|
|
915
918
|
middleware, Next.js middleware.ts / handler wrappers, django-ninja auth= and Django/DRF view access checks.
|
|
916
919
|
min_confidence: keep the default (heuristic) for reviews: every edge still shows its own label, and a stricter
|
|
@@ -923,7 +926,7 @@ def routes(writes: str | None = None, reaches: list[str] | None = None, missing:
|
|
|
923
926
|
st = _st()
|
|
924
927
|
pf, _ = _platform(st, platform)
|
|
925
928
|
_scope(whole=True, categories=("route",), unsupported=False)
|
|
926
|
-
res = R.routes_report(st, writes=writes, reaches=reaches, missing=missing, unguarded=unguarded,
|
|
929
|
+
res = R.routes_report(st, writes=writes, reaches=reaches, missing=missing, unguarded=unguarded, strict=strict,
|
|
927
930
|
auth_pattern=auth_pattern, min_conf=min_confidence, platform=pf)
|
|
928
931
|
return R.render_routes(res, st, max_items=max_items, paths=paths, compact=True)
|
|
929
932
|
|
|
@@ -1149,6 +1152,12 @@ def api_calls(filter: str = "all", max_items: int = 60) -> str:
|
|
|
1149
1152
|
for c in r["calls"][:3]:
|
|
1150
1153
|
h = f" via {short(c['via_helper']['fn'])}" if c.get("via_helper") else ""
|
|
1151
1154
|
out.append(f" ← {short(c['caller'])} @ {at(c['at'])}{h}")
|
|
1155
|
+
bk = Q._key_names(c.get("body_keys"))
|
|
1156
|
+
qk = Q._key_names(c.get("query_keys"))
|
|
1157
|
+
if bk:
|
|
1158
|
+
out.append(f" body keys: {', '.join(bk)}")
|
|
1159
|
+
if qk:
|
|
1160
|
+
out.append(f" query keys: {', '.join(qk)}")
|
|
1152
1161
|
for g in gaps.get(r["endpoint"], [])[:3]:
|
|
1153
1162
|
out.append(f" ! {short(g['caller'])} @ {at(g['call_at'])} passes {', '.join(g['dropped'])}: sent but not forwarded "
|
|
1154
1163
|
f"(request sends {', '.join(g['request_keys'])})")
|