apisec-code-bolt 0.1.4__tar.gz → 0.1.7__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.
- apisec_code_bolt-0.1.7/PKG-INFO +363 -0
- apisec_code_bolt-0.1.7/README.md +316 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/pyproject.toml +1 -1
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/analyzer.py +10 -1
- apisec_code_bolt-0.1.7/src/apisec_code_bolt/analysis/config_scanner.py +363 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/dependency_extractor.py +209 -2
- apisec_code_bolt-0.1.7/src/apisec_code_bolt/analysis/surface_enrichment.py +459 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/main.py +32 -12
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/apisec_client.py +17 -2
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/client.py +94 -1
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/manifest.py +47 -2
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/types.py +1 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/__init__.py +2 -0
- apisec_code_bolt-0.1.7/src/apisec_code_bolt/frameworks/dotnet/webforms_plugin.py +269 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/express_plugin.py +38 -1
- apisec_code_bolt-0.1.7/tests/fixtures/vulnerable_app/pom.xml +44 -0
- apisec_code_bolt-0.1.7/tests/fixtures/vulnerable_app/src/main/java/com/demo/DemoController.java +15 -0
- apisec_code_bolt-0.1.7/tests/integration/test_vulnerable_app_reachability_guard.py +57 -0
- apisec_code_bolt-0.1.7/tests/unit/test_apisec_client.py +74 -0
- apisec_code_bolt-0.1.7/tests/unit/test_cli_console_url.py +37 -0
- apisec_code_bolt-0.1.7/tests/unit/test_config_scanner_framework.py +82 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_dependency_parsing.py +175 -0
- apisec_code_bolt-0.1.7/tests/unit/test_manifest_upload_gzip.py +73 -0
- apisec_code_bolt-0.1.7/tests/unit/test_static_route_catchup.py +128 -0
- apisec_code_bolt-0.1.7/tests/unit/test_surface_enrichment.py +145 -0
- apisec_code_bolt-0.1.7/tests/unit/test_surface_extraction_client.py +67 -0
- apisec_code_bolt-0.1.7/tests/unit/test_webforms_plugin.py +83 -0
- apisec_code_bolt-0.1.4/PKG-INFO +0 -231
- apisec_code_bolt-0.1.4/README.md +0 -184
- apisec_code_bolt-0.1.4/src/apisec_code_bolt/analysis/config_scanner.py +0 -197
- apisec_code_bolt-0.1.4/tests/unit/test_cli_console_url.py +0 -27
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/.gitignore +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/__main__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/binding_tracker.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_graph.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_graph_types.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/capability_tagger.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/data_flow.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/flow_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/hof_catalog.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/integration_detector.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/literal_scanner.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/path_normalizer.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/read_site_detector.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/request_patterns.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/sensitivity_classifier.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/sink_evidence.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/url_prefix_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/exit_codes.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/config.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/credentials.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/discovery.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/log_format.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/repo.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/state.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/telemetry.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/fingerprinting/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/_graphql_common.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/_jwt_common.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/auth_helpers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/base.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/_path_helpers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/aspnet_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/grpc_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/jwt_config_extractor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/legacy_aspnet_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/refit_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/wcf_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/_annotations.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/_constraints.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/jaxrs_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/jwt_config_extractor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/micronaut_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/spring_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/_route_helpers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/fastify_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/nestjs_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/celery_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/click_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/django_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/fastapi/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/fastapi/plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/flask_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/prefect_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/webhook_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/_ts_helpers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/grape_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/rails_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/sinatra_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/taint_scanner.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/base.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/language_services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/literals.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/type_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/language_services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/language_services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/type_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/cbv_extractor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/constant_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/cross_file_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/dynamic_route_detector.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/expression_utils.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/extraction_types.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/language_services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/parameter_analyzer.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/path_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/router_registry.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/type_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/visitors.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/language_services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/services.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/ast_cache.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/executor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/handlers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/manifest_context.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/conftest.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Cargo.toml +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Gemfile.lock +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Pipfile +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/build.gradle +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/build.gradle.kts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/go.mod +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/package.json +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pom.xml +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pyproject_pep621.toml +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pyproject_poetry.toml +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/requirements-dev.txt +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/requirements.txt +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/setup.cfg +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/setup.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_django/urls.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_django/views.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/app.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/middleware/authenticate.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/routes/auth.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/routes/users.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/main.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/routes/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/routes/users.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/services/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/services/user_service.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_flask/app.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_flask_pydantic/app.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_grape/api.rb +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/auth.controller.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/roles.decorator.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/roles.guard.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/users.controller.ts +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_sinatra/app.rb +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/java/com/example/demo/config/SecurityConfig.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/java/com/example/demo/controller/UserController.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/java/com/example/demo/model/User.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/java/com/example/demo/service/UserService.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/resources/application.properties +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/VULNERABILITIES.md +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/config/SecurityConfig.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/controller/AdminController.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/controller/OrderController.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/controller/UserController.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/model/Order.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/model/User.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/service/OrderService.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/java/com/example/vulnapi/service/UserService.java +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/resources/application.properties +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_cli.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_django_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_express_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_fastapi_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_flask_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_nestjs_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_spring_boot_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/fixtures/sample_app.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_auth_indicator_matching.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_executor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_handlers.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_read_site_origin_types.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/__init__.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_aspnet_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_benchmark_audit.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_benchmark_run.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_call_graph.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_cbv_extractor.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_config.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_constant_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_cross_file_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_csharp_literals.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_csharp_type_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_data_flow.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_discovery.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_django_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_dynamic_routes.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_express_nestjs_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_fastapi_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_fastify_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_flow_analysis.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_grape_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_grpc_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_instrumentation.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_integration_detection.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_java_parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_jaxrs_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_js_graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_jwt_config_extraction.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_legacy_aspnet_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_micronaut_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_parameter_analyzer.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_path_resolver.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_pydantic_body_inference.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_python_parser.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_rails_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_refit_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_repo_canonical.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_router_registry.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_ruby_graphql_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sensitivity_capability.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sinatra_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sink_evidence.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_spring_plugin.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_telemetry.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_transformation_tracking.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_types.py +0 -0
- {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_wcf_plugin.py +0 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: apisec-code-bolt
|
|
3
|
+
Version: 0.1.7
|
|
4
|
+
Summary: Static analysis probe for extracting architectural metadata from codebases
|
|
5
|
+
Project-URL: Homepage, https://apisec.ai
|
|
6
|
+
Project-URL: Documentation, https://docs.apisec.ai/code-bolt
|
|
7
|
+
Project-URL: Repository, https://github.com/apisec-inc/apisec-code-bolt
|
|
8
|
+
Author-email: APIsec <engineering@apisec.ai>
|
|
9
|
+
License: Proprietary
|
|
10
|
+
Keywords: api,security,static-analysis,vulnerability
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Security
|
|
19
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: click>=8.1.0
|
|
23
|
+
Requires-Dist: httpx>=0.26.0
|
|
24
|
+
Requires-Dist: javalang>=0.13.0
|
|
25
|
+
Requires-Dist: libcst>=1.1.0
|
|
26
|
+
Requires-Dist: networkx>=3.2
|
|
27
|
+
Requires-Dist: pathspec>=0.12.0
|
|
28
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
29
|
+
Requires-Dist: pydantic>=2.5.0
|
|
30
|
+
Requires-Dist: pyyaml>=6.0
|
|
31
|
+
Requires-Dist: rich>=13.7.0
|
|
32
|
+
Requires-Dist: tree-sitter-c-sharp>=0.23
|
|
33
|
+
Requires-Dist: tree-sitter-javascript>=0.23
|
|
34
|
+
Requires-Dist: tree-sitter-ruby>=0.23
|
|
35
|
+
Requires-Dist: tree-sitter-typescript>=0.23
|
|
36
|
+
Requires-Dist: tree-sitter>=0.23
|
|
37
|
+
Requires-Dist: typing-extensions>=4.9.0
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
40
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
44
|
+
Provides-Extra: semgrep
|
|
45
|
+
Requires-Dist: semgrep>=1.50.0; extra == 'semgrep'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# apisec-code-bolt
|
|
49
|
+
|
|
50
|
+
Static analysis probe for extracting architectural metadata from codebases.
|
|
51
|
+
|
|
52
|
+
## Overview
|
|
53
|
+
|
|
54
|
+
apisec-code-bolt analyzes source code to extract:
|
|
55
|
+
|
|
56
|
+
- **Routes/Endpoints** — HTTP routes, parameters, request/response types
|
|
57
|
+
- **Data Flows** — How data moves from entry points to sinks
|
|
58
|
+
- **Authentication** — Auth schemes, dependencies, role requirements
|
|
59
|
+
- **Integrations** — External services, databases, APIs
|
|
60
|
+
- **Dependencies** — Package dependencies and versions
|
|
61
|
+
|
|
62
|
+
The output is a structured **manifest** that can be uploaded to the APIsec cloud
|
|
63
|
+
for vulnerability analysis. **Raw source code never leaves your environment.**
|
|
64
|
+
|
|
65
|
+
## Requirements
|
|
66
|
+
|
|
67
|
+
- **Python 3.11 or newer** (3.11 and 3.12 are supported). Check with `python --version`.
|
|
68
|
+
- No JDK, Node, Ruby, or .NET runtime required — all parsers are pure-Python
|
|
69
|
+
(Java via `javalang`, C#/JS/TS/Ruby via tree-sitter grammars). You can analyze
|
|
70
|
+
a Java or Ruby project without those toolchains installed.
|
|
71
|
+
|
|
72
|
+
## Installation
|
|
73
|
+
|
|
74
|
+
The CLI is published on PyPI as [`apisec-code-bolt`](https://pypi.org/project/apisec-code-bolt/).
|
|
75
|
+
|
|
76
|
+
### Recommended: isolated install (pipx or uv)
|
|
77
|
+
|
|
78
|
+
Installing a CLI into an isolated environment avoids dependency conflicts with
|
|
79
|
+
other tools and sidesteps system-Python issues:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Using pipx
|
|
83
|
+
pipx install apisec-code-bolt
|
|
84
|
+
|
|
85
|
+
# Or using uv (also handles the Python version for you)
|
|
86
|
+
uv tool install apisec-code-bolt
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Plain pip
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install apisec-code-bolt
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
> **On an older or mismatched Python?** If `pip install` fails with a
|
|
96
|
+
> `requires-python` error, your default `python` is older than 3.11. The
|
|
97
|
+
> simplest fix is [`uv`](https://docs.astral.sh/uv/), which fetches a
|
|
98
|
+
> compatible interpreter automatically:
|
|
99
|
+
>
|
|
100
|
+
> ```bash
|
|
101
|
+
> uv tool install apisec-code-bolt # install the CLI, or
|
|
102
|
+
> uv run --python 3.12 apisec-code-bolt ... # run ad hoc under 3.12
|
|
103
|
+
> ```
|
|
104
|
+
|
|
105
|
+
### Verify the install
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
apisec-code-bolt --version
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Getting Started (end to end)
|
|
112
|
+
|
|
113
|
+
A full run is three steps: **register → authenticate → analyze**.
|
|
114
|
+
|
|
115
|
+
### 1. Register (first run only)
|
|
116
|
+
|
|
117
|
+
The first time you run the CLI it asks for the **registration code** APIsec
|
|
118
|
+
provided during onboarding (format `###-###`):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
apisec-code-bolt analyze . # prompts: "Please enter code (###-###)"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For non-interactive environments (CI, scripts), supply it via the environment
|
|
125
|
+
instead of typing it at a prompt:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
export APISEC_REGISTRATION_CODE=123-456
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 2. Authenticate
|
|
132
|
+
|
|
133
|
+
Store your APIsec API key so uploads are authorized:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Interactive (prompts for the key)
|
|
137
|
+
apisec-code-bolt auth
|
|
138
|
+
|
|
139
|
+
# Or pass the key directly
|
|
140
|
+
apisec-code-bolt auth sk_live_abc123...
|
|
141
|
+
|
|
142
|
+
# Confirm you're authenticated
|
|
143
|
+
apisec-code-bolt auth --check
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 3. Analyze
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Analyze the current project and upload the manifest to the cloud
|
|
150
|
+
apisec-code-bolt analyze .
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
On a successful upload the CLI prints a **"View Results in APIsec"** panel with a
|
|
154
|
+
direct link to your results in the console.
|
|
155
|
+
|
|
156
|
+
### Working offline / inspecting the manifest
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Analyze and save the manifest locally, no upload
|
|
160
|
+
apisec-code-bolt analyze . --output manifest.json --no-upload
|
|
161
|
+
|
|
162
|
+
# Analyze but write nothing — just print a summary (great for a first look)
|
|
163
|
+
apisec-code-bolt analyze . --dry-run
|
|
164
|
+
|
|
165
|
+
# Emit manifest JSON to stdout for piping into other tools
|
|
166
|
+
apisec-code-bolt analyze . --stdout --no-upload | jq .
|
|
167
|
+
|
|
168
|
+
# Give the extractor framework hints
|
|
169
|
+
apisec-code-bolt analyze . --frameworks fastapi,sqlalchemy
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Supported Languages & Frameworks
|
|
173
|
+
|
|
174
|
+
| Language | Frameworks |
|
|
175
|
+
|----------|-----------|
|
|
176
|
+
| Python | FastAPI, Flask, Django, GraphQL (Strawberry / Graphene / Ariadne), Celery, Click, Prefect |
|
|
177
|
+
| Java | Spring Boot, Micronaut, JAX-RS (Quarkus), GraphQL (Spring for GraphQL / graphql-java-kickstart) |
|
|
178
|
+
| JavaScript / TypeScript | Express, Fastify, NestJS, GraphQL (NestJS GraphQL / TypeGraphQL) |
|
|
179
|
+
| Ruby | Rails, Grape, Sinatra, GraphQL (graphql-ruby) |
|
|
180
|
+
| C# / .NET | ASP.NET Core, legacy ASP.NET (MVC/Web API), WCF, gRPC, Refit |
|
|
181
|
+
|
|
182
|
+
Framework coverage is validated end-to-end against real-world repositories in
|
|
183
|
+
the benchmark suite (`benchmark/`).
|
|
184
|
+
|
|
185
|
+
## Configuration
|
|
186
|
+
|
|
187
|
+
Scaffold a config file with sensible defaults:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
apisec-code-bolt init # writes .surface.yaml
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`.surface.yaml` in your project root is picked up automatically:
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
analysis:
|
|
197
|
+
file_discovery:
|
|
198
|
+
exclude_patterns:
|
|
199
|
+
- "tests/**"
|
|
200
|
+
- "**/migrations/**"
|
|
201
|
+
max_files: 10000
|
|
202
|
+
|
|
203
|
+
data_flow:
|
|
204
|
+
mode: inter_procedural
|
|
205
|
+
max_depth: 10
|
|
206
|
+
|
|
207
|
+
cloud:
|
|
208
|
+
enabled: true
|
|
209
|
+
api_url: https://api.apisec.ai
|
|
210
|
+
|
|
211
|
+
output:
|
|
212
|
+
format: json
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Commands
|
|
216
|
+
|
|
217
|
+
Global options (before the subcommand): `--version`, `-v/--verbose`,
|
|
218
|
+
`-q/--quiet`, `--debug`, `--log-format [text|json]`.
|
|
219
|
+
|
|
220
|
+
### analyze
|
|
221
|
+
|
|
222
|
+
Analyze a codebase and generate/upload a manifest.
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
apisec-code-bolt analyze [PATH] [OPTIONS]
|
|
226
|
+
|
|
227
|
+
Options:
|
|
228
|
+
-o, --output FILE Save manifest to file instead of uploading
|
|
229
|
+
--no-upload Skip uploading to cloud (implies --output if not set)
|
|
230
|
+
--cloud-url TEXT Reasoning engine URL (legacy direct connection, local dev)
|
|
231
|
+
--api-key TEXT Override stored API key
|
|
232
|
+
--api-url TEXT Override stored API URL
|
|
233
|
+
--reasoning-url TEXT Reasoning engine URL (if different from API URL)
|
|
234
|
+
--format [json|yaml] Output format
|
|
235
|
+
--config FILE Path to configuration file
|
|
236
|
+
--frameworks TEXT Comma-separated framework hints
|
|
237
|
+
--exclude TEXT Glob patterns to exclude (repeatable)
|
|
238
|
+
--max-files INTEGER Maximum files to analyze
|
|
239
|
+
--timeout INTEGER Analysis timeout in seconds
|
|
240
|
+
--dry-run Analyze and print a summary; write/upload nothing
|
|
241
|
+
--stdout Write manifest JSON to stdout (for pipelines)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### auth
|
|
245
|
+
|
|
246
|
+
Authenticate with the APIsec cloud.
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
apisec-code-bolt auth [API_KEY] [OPTIONS]
|
|
250
|
+
|
|
251
|
+
Options:
|
|
252
|
+
--api-url TEXT APIsec API URL
|
|
253
|
+
--check Check if already authenticated
|
|
254
|
+
--logout Remove stored credentials
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### init
|
|
258
|
+
|
|
259
|
+
Scaffold a `.surface.yaml` configuration file.
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
apisec-code-bolt init [OPTIONS]
|
|
263
|
+
|
|
264
|
+
Options:
|
|
265
|
+
-o, --output FILE Output file path (default: .surface.yaml)
|
|
266
|
+
--force Overwrite an existing file
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### validate
|
|
270
|
+
|
|
271
|
+
Validate a manifest file against the schema.
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
apisec-code-bolt validate MANIFEST_FILE
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### answer
|
|
278
|
+
|
|
279
|
+
Answer verification queries (for air-gapped environments where the manifest was
|
|
280
|
+
uploaded separately and the cloud generated questions).
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
apisec-code-bolt answer [OPTIONS]
|
|
284
|
+
|
|
285
|
+
Options:
|
|
286
|
+
-q, --questions FILE Input questions file (JSON) [required]
|
|
287
|
+
-o, --output FILE Output answers file
|
|
288
|
+
-r, --repo DIRECTORY Repository path
|
|
289
|
+
--timeout INTEGER Query timeout in seconds
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### telemetry
|
|
293
|
+
|
|
294
|
+
Manage anonymous, opt-in usage telemetry (disabled by default; never includes
|
|
295
|
+
code, paths, or credentials).
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
apisec-code-bolt telemetry on|off|status
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Architecture
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
apisec-code-bolt/
|
|
305
|
+
├── cli/ # Command-line interface
|
|
306
|
+
├── core/ # Types, config, manifest schema
|
|
307
|
+
├── parsing/ # Language-specific parsers
|
|
308
|
+
│ ├── python/ # LibCST-based Python parser
|
|
309
|
+
│ └── jvm/ # Java via the pure-Python javalang library
|
|
310
|
+
├── frameworks/ # Framework plugins
|
|
311
|
+
│ ├── python/ # FastAPI, Flask, Django, GraphQL, Celery, Click, Prefect
|
|
312
|
+
│ ├── java/ # Spring Boot, Micronaut, JAX-RS, GraphQL
|
|
313
|
+
│ ├── js/ # Express, Fastify, NestJS, GraphQL
|
|
314
|
+
│ ├── ruby/ # Rails, Grape, Sinatra, GraphQL
|
|
315
|
+
│ └── dotnet/ # ASP.NET Core, legacy ASP.NET, WCF, gRPC, Refit
|
|
316
|
+
├── analysis/ # Call graph, data flow
|
|
317
|
+
├── fingerprinting/ # Integration detection
|
|
318
|
+
├── query/ # Query API executor
|
|
319
|
+
└── cloud/ # Cloud communication
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Development
|
|
323
|
+
|
|
324
|
+
### Setup
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
# Clone and install in development mode
|
|
328
|
+
git clone https://github.com/apisec-inc/apisec-code-bolt.git
|
|
329
|
+
cd apisec-code-bolt
|
|
330
|
+
pip install -e ".[dev]"
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Running Tests
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
pytest
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Type Checking
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
mypy src/apisec_code_bolt
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Linting & Formatting
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
ruff check .
|
|
349
|
+
ruff format --check .
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Privacy
|
|
353
|
+
|
|
354
|
+
apisec-code-bolt is designed with privacy as a core principle:
|
|
355
|
+
|
|
356
|
+
- **No raw code egress** — Source code never leaves your environment
|
|
357
|
+
- **Metadata only** — The manifest contains structural information, not code
|
|
358
|
+
- **Outbound only** — Only makes outbound HTTPS calls to upload manifests
|
|
359
|
+
- **Air-gapped support** — Can run completely offline with file-based workflow
|
|
360
|
+
|
|
361
|
+
## License
|
|
362
|
+
|
|
363
|
+
Proprietary. Copyright © APIsec.
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# apisec-code-bolt
|
|
2
|
+
|
|
3
|
+
Static analysis probe for extracting architectural metadata from codebases.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
apisec-code-bolt analyzes source code to extract:
|
|
8
|
+
|
|
9
|
+
- **Routes/Endpoints** — HTTP routes, parameters, request/response types
|
|
10
|
+
- **Data Flows** — How data moves from entry points to sinks
|
|
11
|
+
- **Authentication** — Auth schemes, dependencies, role requirements
|
|
12
|
+
- **Integrations** — External services, databases, APIs
|
|
13
|
+
- **Dependencies** — Package dependencies and versions
|
|
14
|
+
|
|
15
|
+
The output is a structured **manifest** that can be uploaded to the APIsec cloud
|
|
16
|
+
for vulnerability analysis. **Raw source code never leaves your environment.**
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- **Python 3.11 or newer** (3.11 and 3.12 are supported). Check with `python --version`.
|
|
21
|
+
- No JDK, Node, Ruby, or .NET runtime required — all parsers are pure-Python
|
|
22
|
+
(Java via `javalang`, C#/JS/TS/Ruby via tree-sitter grammars). You can analyze
|
|
23
|
+
a Java or Ruby project without those toolchains installed.
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
The CLI is published on PyPI as [`apisec-code-bolt`](https://pypi.org/project/apisec-code-bolt/).
|
|
28
|
+
|
|
29
|
+
### Recommended: isolated install (pipx or uv)
|
|
30
|
+
|
|
31
|
+
Installing a CLI into an isolated environment avoids dependency conflicts with
|
|
32
|
+
other tools and sidesteps system-Python issues:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Using pipx
|
|
36
|
+
pipx install apisec-code-bolt
|
|
37
|
+
|
|
38
|
+
# Or using uv (also handles the Python version for you)
|
|
39
|
+
uv tool install apisec-code-bolt
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Plain pip
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pip install apisec-code-bolt
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
> **On an older or mismatched Python?** If `pip install` fails with a
|
|
49
|
+
> `requires-python` error, your default `python` is older than 3.11. The
|
|
50
|
+
> simplest fix is [`uv`](https://docs.astral.sh/uv/), which fetches a
|
|
51
|
+
> compatible interpreter automatically:
|
|
52
|
+
>
|
|
53
|
+
> ```bash
|
|
54
|
+
> uv tool install apisec-code-bolt # install the CLI, or
|
|
55
|
+
> uv run --python 3.12 apisec-code-bolt ... # run ad hoc under 3.12
|
|
56
|
+
> ```
|
|
57
|
+
|
|
58
|
+
### Verify the install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
apisec-code-bolt --version
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Getting Started (end to end)
|
|
65
|
+
|
|
66
|
+
A full run is three steps: **register → authenticate → analyze**.
|
|
67
|
+
|
|
68
|
+
### 1. Register (first run only)
|
|
69
|
+
|
|
70
|
+
The first time you run the CLI it asks for the **registration code** APIsec
|
|
71
|
+
provided during onboarding (format `###-###`):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
apisec-code-bolt analyze . # prompts: "Please enter code (###-###)"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For non-interactive environments (CI, scripts), supply it via the environment
|
|
78
|
+
instead of typing it at a prompt:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
export APISEC_REGISTRATION_CODE=123-456
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 2. Authenticate
|
|
85
|
+
|
|
86
|
+
Store your APIsec API key so uploads are authorized:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Interactive (prompts for the key)
|
|
90
|
+
apisec-code-bolt auth
|
|
91
|
+
|
|
92
|
+
# Or pass the key directly
|
|
93
|
+
apisec-code-bolt auth sk_live_abc123...
|
|
94
|
+
|
|
95
|
+
# Confirm you're authenticated
|
|
96
|
+
apisec-code-bolt auth --check
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 3. Analyze
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Analyze the current project and upload the manifest to the cloud
|
|
103
|
+
apisec-code-bolt analyze .
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
On a successful upload the CLI prints a **"View Results in APIsec"** panel with a
|
|
107
|
+
direct link to your results in the console.
|
|
108
|
+
|
|
109
|
+
### Working offline / inspecting the manifest
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Analyze and save the manifest locally, no upload
|
|
113
|
+
apisec-code-bolt analyze . --output manifest.json --no-upload
|
|
114
|
+
|
|
115
|
+
# Analyze but write nothing — just print a summary (great for a first look)
|
|
116
|
+
apisec-code-bolt analyze . --dry-run
|
|
117
|
+
|
|
118
|
+
# Emit manifest JSON to stdout for piping into other tools
|
|
119
|
+
apisec-code-bolt analyze . --stdout --no-upload | jq .
|
|
120
|
+
|
|
121
|
+
# Give the extractor framework hints
|
|
122
|
+
apisec-code-bolt analyze . --frameworks fastapi,sqlalchemy
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Supported Languages & Frameworks
|
|
126
|
+
|
|
127
|
+
| Language | Frameworks |
|
|
128
|
+
|----------|-----------|
|
|
129
|
+
| Python | FastAPI, Flask, Django, GraphQL (Strawberry / Graphene / Ariadne), Celery, Click, Prefect |
|
|
130
|
+
| Java | Spring Boot, Micronaut, JAX-RS (Quarkus), GraphQL (Spring for GraphQL / graphql-java-kickstart) |
|
|
131
|
+
| JavaScript / TypeScript | Express, Fastify, NestJS, GraphQL (NestJS GraphQL / TypeGraphQL) |
|
|
132
|
+
| Ruby | Rails, Grape, Sinatra, GraphQL (graphql-ruby) |
|
|
133
|
+
| C# / .NET | ASP.NET Core, legacy ASP.NET (MVC/Web API), WCF, gRPC, Refit |
|
|
134
|
+
|
|
135
|
+
Framework coverage is validated end-to-end against real-world repositories in
|
|
136
|
+
the benchmark suite (`benchmark/`).
|
|
137
|
+
|
|
138
|
+
## Configuration
|
|
139
|
+
|
|
140
|
+
Scaffold a config file with sensible defaults:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
apisec-code-bolt init # writes .surface.yaml
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`.surface.yaml` in your project root is picked up automatically:
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
analysis:
|
|
150
|
+
file_discovery:
|
|
151
|
+
exclude_patterns:
|
|
152
|
+
- "tests/**"
|
|
153
|
+
- "**/migrations/**"
|
|
154
|
+
max_files: 10000
|
|
155
|
+
|
|
156
|
+
data_flow:
|
|
157
|
+
mode: inter_procedural
|
|
158
|
+
max_depth: 10
|
|
159
|
+
|
|
160
|
+
cloud:
|
|
161
|
+
enabled: true
|
|
162
|
+
api_url: https://api.apisec.ai
|
|
163
|
+
|
|
164
|
+
output:
|
|
165
|
+
format: json
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Commands
|
|
169
|
+
|
|
170
|
+
Global options (before the subcommand): `--version`, `-v/--verbose`,
|
|
171
|
+
`-q/--quiet`, `--debug`, `--log-format [text|json]`.
|
|
172
|
+
|
|
173
|
+
### analyze
|
|
174
|
+
|
|
175
|
+
Analyze a codebase and generate/upload a manifest.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
apisec-code-bolt analyze [PATH] [OPTIONS]
|
|
179
|
+
|
|
180
|
+
Options:
|
|
181
|
+
-o, --output FILE Save manifest to file instead of uploading
|
|
182
|
+
--no-upload Skip uploading to cloud (implies --output if not set)
|
|
183
|
+
--cloud-url TEXT Reasoning engine URL (legacy direct connection, local dev)
|
|
184
|
+
--api-key TEXT Override stored API key
|
|
185
|
+
--api-url TEXT Override stored API URL
|
|
186
|
+
--reasoning-url TEXT Reasoning engine URL (if different from API URL)
|
|
187
|
+
--format [json|yaml] Output format
|
|
188
|
+
--config FILE Path to configuration file
|
|
189
|
+
--frameworks TEXT Comma-separated framework hints
|
|
190
|
+
--exclude TEXT Glob patterns to exclude (repeatable)
|
|
191
|
+
--max-files INTEGER Maximum files to analyze
|
|
192
|
+
--timeout INTEGER Analysis timeout in seconds
|
|
193
|
+
--dry-run Analyze and print a summary; write/upload nothing
|
|
194
|
+
--stdout Write manifest JSON to stdout (for pipelines)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### auth
|
|
198
|
+
|
|
199
|
+
Authenticate with the APIsec cloud.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
apisec-code-bolt auth [API_KEY] [OPTIONS]
|
|
203
|
+
|
|
204
|
+
Options:
|
|
205
|
+
--api-url TEXT APIsec API URL
|
|
206
|
+
--check Check if already authenticated
|
|
207
|
+
--logout Remove stored credentials
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### init
|
|
211
|
+
|
|
212
|
+
Scaffold a `.surface.yaml` configuration file.
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
apisec-code-bolt init [OPTIONS]
|
|
216
|
+
|
|
217
|
+
Options:
|
|
218
|
+
-o, --output FILE Output file path (default: .surface.yaml)
|
|
219
|
+
--force Overwrite an existing file
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### validate
|
|
223
|
+
|
|
224
|
+
Validate a manifest file against the schema.
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
apisec-code-bolt validate MANIFEST_FILE
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### answer
|
|
231
|
+
|
|
232
|
+
Answer verification queries (for air-gapped environments where the manifest was
|
|
233
|
+
uploaded separately and the cloud generated questions).
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
apisec-code-bolt answer [OPTIONS]
|
|
237
|
+
|
|
238
|
+
Options:
|
|
239
|
+
-q, --questions FILE Input questions file (JSON) [required]
|
|
240
|
+
-o, --output FILE Output answers file
|
|
241
|
+
-r, --repo DIRECTORY Repository path
|
|
242
|
+
--timeout INTEGER Query timeout in seconds
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### telemetry
|
|
246
|
+
|
|
247
|
+
Manage anonymous, opt-in usage telemetry (disabled by default; never includes
|
|
248
|
+
code, paths, or credentials).
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
apisec-code-bolt telemetry on|off|status
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Architecture
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
apisec-code-bolt/
|
|
258
|
+
├── cli/ # Command-line interface
|
|
259
|
+
├── core/ # Types, config, manifest schema
|
|
260
|
+
├── parsing/ # Language-specific parsers
|
|
261
|
+
│ ├── python/ # LibCST-based Python parser
|
|
262
|
+
│ └── jvm/ # Java via the pure-Python javalang library
|
|
263
|
+
├── frameworks/ # Framework plugins
|
|
264
|
+
│ ├── python/ # FastAPI, Flask, Django, GraphQL, Celery, Click, Prefect
|
|
265
|
+
│ ├── java/ # Spring Boot, Micronaut, JAX-RS, GraphQL
|
|
266
|
+
│ ├── js/ # Express, Fastify, NestJS, GraphQL
|
|
267
|
+
│ ├── ruby/ # Rails, Grape, Sinatra, GraphQL
|
|
268
|
+
│ └── dotnet/ # ASP.NET Core, legacy ASP.NET, WCF, gRPC, Refit
|
|
269
|
+
├── analysis/ # Call graph, data flow
|
|
270
|
+
├── fingerprinting/ # Integration detection
|
|
271
|
+
├── query/ # Query API executor
|
|
272
|
+
└── cloud/ # Cloud communication
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Development
|
|
276
|
+
|
|
277
|
+
### Setup
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
# Clone and install in development mode
|
|
281
|
+
git clone https://github.com/apisec-inc/apisec-code-bolt.git
|
|
282
|
+
cd apisec-code-bolt
|
|
283
|
+
pip install -e ".[dev]"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Running Tests
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
pytest
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Type Checking
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
mypy src/apisec_code_bolt
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Linting & Formatting
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
ruff check .
|
|
302
|
+
ruff format --check .
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Privacy
|
|
306
|
+
|
|
307
|
+
apisec-code-bolt is designed with privacy as a core principle:
|
|
308
|
+
|
|
309
|
+
- **No raw code egress** — Source code never leaves your environment
|
|
310
|
+
- **Metadata only** — The manifest contains structural information, not code
|
|
311
|
+
- **Outbound only** — Only makes outbound HTTPS calls to upload manifests
|
|
312
|
+
- **Air-gapped support** — Can run completely offline with file-based workflow
|
|
313
|
+
|
|
314
|
+
## License
|
|
315
|
+
|
|
316
|
+
Proprietary. Copyright © APIsec.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apisec-code-bolt"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.7"
|
|
8
8
|
description = "Static analysis probe for extracting architectural metadata from codebases"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "Proprietary"}
|
|
@@ -2360,7 +2360,16 @@ class ProjectAnalyzer:
|
|
|
2360
2360
|
# Phase 3: discover config files
|
|
2361
2361
|
config_files = scanner.to_config_file_models()
|
|
2362
2362
|
|
|
2363
|
-
|
|
2363
|
+
# Phase 4: capture allow-listed framework settings (actuator exposure,
|
|
2364
|
+
# datasource driver/scheme, active profile, H2 console) for downstream
|
|
2365
|
+
# framework-mediated reachability.
|
|
2366
|
+
framework_settings = scanner.to_framework_config_models()
|
|
2367
|
+
|
|
2368
|
+
return ConfigurationModel(
|
|
2369
|
+
env_vars_used=env_vars,
|
|
2370
|
+
config_files=config_files,
|
|
2371
|
+
framework_settings=framework_settings,
|
|
2372
|
+
)
|
|
2364
2373
|
|
|
2365
2374
|
# =========================================================================
|
|
2366
2375
|
# Function/Class Collection
|