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.
Files changed (252) hide show
  1. apisec_code_bolt-0.1.7/PKG-INFO +363 -0
  2. apisec_code_bolt-0.1.7/README.md +316 -0
  3. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/pyproject.toml +1 -1
  4. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/analyzer.py +10 -1
  5. apisec_code_bolt-0.1.7/src/apisec_code_bolt/analysis/config_scanner.py +363 -0
  6. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/dependency_extractor.py +209 -2
  7. apisec_code_bolt-0.1.7/src/apisec_code_bolt/analysis/surface_enrichment.py +459 -0
  8. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/main.py +32 -12
  9. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/apisec_client.py +17 -2
  10. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/client.py +94 -1
  11. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/manifest.py +47 -2
  12. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/types.py +1 -0
  13. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/__init__.py +2 -0
  14. apisec_code_bolt-0.1.7/src/apisec_code_bolt/frameworks/dotnet/webforms_plugin.py +269 -0
  15. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/express_plugin.py +38 -1
  16. apisec_code_bolt-0.1.7/tests/fixtures/vulnerable_app/pom.xml +44 -0
  17. apisec_code_bolt-0.1.7/tests/fixtures/vulnerable_app/src/main/java/com/demo/DemoController.java +15 -0
  18. apisec_code_bolt-0.1.7/tests/integration/test_vulnerable_app_reachability_guard.py +57 -0
  19. apisec_code_bolt-0.1.7/tests/unit/test_apisec_client.py +74 -0
  20. apisec_code_bolt-0.1.7/tests/unit/test_cli_console_url.py +37 -0
  21. apisec_code_bolt-0.1.7/tests/unit/test_config_scanner_framework.py +82 -0
  22. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_dependency_parsing.py +175 -0
  23. apisec_code_bolt-0.1.7/tests/unit/test_manifest_upload_gzip.py +73 -0
  24. apisec_code_bolt-0.1.7/tests/unit/test_static_route_catchup.py +128 -0
  25. apisec_code_bolt-0.1.7/tests/unit/test_surface_enrichment.py +145 -0
  26. apisec_code_bolt-0.1.7/tests/unit/test_surface_extraction_client.py +67 -0
  27. apisec_code_bolt-0.1.7/tests/unit/test_webforms_plugin.py +83 -0
  28. apisec_code_bolt-0.1.4/PKG-INFO +0 -231
  29. apisec_code_bolt-0.1.4/README.md +0 -184
  30. apisec_code_bolt-0.1.4/src/apisec_code_bolt/analysis/config_scanner.py +0 -197
  31. apisec_code_bolt-0.1.4/tests/unit/test_cli_console_url.py +0 -27
  32. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/.gitignore +0 -0
  33. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/__init__.py +0 -0
  34. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/__main__.py +0 -0
  35. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/__init__.py +0 -0
  36. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/binding_tracker.py +0 -0
  37. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_graph.py +0 -0
  38. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_graph_types.py +0 -0
  39. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/call_resolver.py +0 -0
  40. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/capability_tagger.py +0 -0
  41. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/data_flow.py +0 -0
  42. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/flow_analysis.py +0 -0
  43. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/hof_catalog.py +0 -0
  44. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/integration_detector.py +0 -0
  45. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/literal_scanner.py +0 -0
  46. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/path_normalizer.py +0 -0
  47. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/read_site_detector.py +0 -0
  48. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/request_patterns.py +0 -0
  49. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/sensitivity_classifier.py +0 -0
  50. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/sink_evidence.py +0 -0
  51. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/analysis/url_prefix_resolver.py +0 -0
  52. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/__init__.py +0 -0
  53. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cli/exit_codes.py +0 -0
  54. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/cloud/__init__.py +0 -0
  55. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/__init__.py +0 -0
  56. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/config.py +0 -0
  57. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/credentials.py +0 -0
  58. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/discovery.py +0 -0
  59. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/log_format.py +0 -0
  60. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/repo.py +0 -0
  61. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/state.py +0 -0
  62. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/core/telemetry.py +0 -0
  63. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/fingerprinting/__init__.py +0 -0
  64. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/__init__.py +0 -0
  65. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/_graphql_common.py +0 -0
  66. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/_jwt_common.py +0 -0
  67. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/auth_helpers.py +0 -0
  68. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/base.py +0 -0
  69. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/_path_helpers.py +0 -0
  70. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/aspnet_plugin.py +0 -0
  71. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/grpc_plugin.py +0 -0
  72. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/jwt_config_extractor.py +0 -0
  73. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/legacy_aspnet_plugin.py +0 -0
  74. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/refit_plugin.py +0 -0
  75. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/dotnet/wcf_plugin.py +0 -0
  76. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/__init__.py +0 -0
  77. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/_annotations.py +0 -0
  78. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/_constraints.py +0 -0
  79. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/graphql_plugin.py +0 -0
  80. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/jaxrs_plugin.py +0 -0
  81. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/jwt_config_extractor.py +0 -0
  82. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/micronaut_plugin.py +0 -0
  83. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/java/spring_plugin.py +0 -0
  84. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/__init__.py +0 -0
  85. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/_route_helpers.py +0 -0
  86. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/fastify_plugin.py +0 -0
  87. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/graphql_plugin.py +0 -0
  88. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/js/nestjs_plugin.py +0 -0
  89. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/__init__.py +0 -0
  90. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/celery_plugin.py +0 -0
  91. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/click_plugin.py +0 -0
  92. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/django_plugin.py +0 -0
  93. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/fastapi/__init__.py +0 -0
  94. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/fastapi/plugin.py +0 -0
  95. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/flask_plugin.py +0 -0
  96. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/graphql_plugin.py +0 -0
  97. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/prefect_plugin.py +0 -0
  98. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/python/webhook_plugin.py +0 -0
  99. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/__init__.py +0 -0
  100. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/_ts_helpers.py +0 -0
  101. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/grape_plugin.py +0 -0
  102. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/graphql_plugin.py +0 -0
  103. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/rails_plugin.py +0 -0
  104. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/sinatra_plugin.py +0 -0
  105. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/frameworks/ruby/taint_scanner.py +0 -0
  106. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/__init__.py +0 -0
  107. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/base.py +0 -0
  108. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/__init__.py +0 -0
  109. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/language_services.py +0 -0
  110. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/literals.py +0 -0
  111. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/parser.py +0 -0
  112. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/csharp/type_resolver.py +0 -0
  113. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/__init__.py +0 -0
  114. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/language_services.py +0 -0
  115. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/js/parser.py +0 -0
  116. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/__init__.py +0 -0
  117. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/language_services.py +0 -0
  118. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/parser.py +0 -0
  119. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/jvm/type_resolver.py +0 -0
  120. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/__init__.py +0 -0
  121. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/cbv_extractor.py +0 -0
  122. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/constant_resolver.py +0 -0
  123. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/cross_file_resolver.py +0 -0
  124. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/dynamic_route_detector.py +0 -0
  125. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/expression_utils.py +0 -0
  126. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/extraction_types.py +0 -0
  127. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/language_services.py +0 -0
  128. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/parameter_analyzer.py +0 -0
  129. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/parser.py +0 -0
  130. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/path_resolver.py +0 -0
  131. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/router_registry.py +0 -0
  132. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/type_resolver.py +0 -0
  133. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/python/visitors.py +0 -0
  134. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/__init__.py +0 -0
  135. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/language_services.py +0 -0
  136. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/ruby/parser.py +0 -0
  137. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/parsing/services.py +0 -0
  138. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/__init__.py +0 -0
  139. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/ast_cache.py +0 -0
  140. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/executor.py +0 -0
  141. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/handlers.py +0 -0
  142. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/src/apisec_code_bolt/query/manifest_context.py +0 -0
  143. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/conftest.py +0 -0
  144. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Cargo.toml +0 -0
  145. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Gemfile.lock +0 -0
  146. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/Pipfile +0 -0
  147. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/build.gradle +0 -0
  148. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/build.gradle.kts +0 -0
  149. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/go.mod +0 -0
  150. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/package.json +0 -0
  151. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pom.xml +0 -0
  152. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pyproject_pep621.toml +0 -0
  153. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/pyproject_poetry.toml +0 -0
  154. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/requirements-dev.txt +0 -0
  155. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/requirements.txt +0 -0
  156. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/setup.cfg +0 -0
  157. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/dep_files/setup.py +0 -0
  158. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_django/urls.py +0 -0
  159. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_django/views.py +0 -0
  160. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/app.ts +0 -0
  161. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/middleware/authenticate.ts +0 -0
  162. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/routes/auth.ts +0 -0
  163. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_express/routes/users.ts +0 -0
  164. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/main.py +0 -0
  165. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/routes/__init__.py +0 -0
  166. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/routes/users.py +0 -0
  167. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/services/__init__.py +0 -0
  168. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_fastapi/services/user_service.py +0 -0
  169. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_flask/app.py +0 -0
  170. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_flask_pydantic/app.py +0 -0
  171. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_grape/api.rb +0 -0
  172. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/auth.controller.ts +0 -0
  173. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/roles.decorator.ts +0 -0
  174. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/roles.guard.ts +0 -0
  175. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_nestjs/users.controller.ts +0 -0
  176. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_sinatra/app.rb +0 -0
  177. {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
  178. {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
  179. {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
  180. {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
  181. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/sample_spring_boot/src/main/resources/application.properties +0 -0
  182. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/VULNERABILITIES.md +0 -0
  183. {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
  184. {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
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/fixtures/vuln_spring_boot/src/main/resources/application.properties +0 -0
  192. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/__init__.py +0 -0
  193. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_cli.py +0 -0
  194. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_django_analysis.py +0 -0
  195. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_express_analysis.py +0 -0
  196. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_fastapi_analysis.py +0 -0
  197. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_flask_analysis.py +0 -0
  198. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_nestjs_analysis.py +0 -0
  199. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/integration/test_spring_boot_analysis.py +0 -0
  200. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/__init__.py +0 -0
  201. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/fixtures/sample_app.py +0 -0
  202. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_auth_indicator_matching.py +0 -0
  203. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_executor.py +0 -0
  204. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_handlers.py +0 -0
  205. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/test_query/test_read_site_origin_types.py +0 -0
  206. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/__init__.py +0 -0
  207. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_aspnet_plugin.py +0 -0
  208. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_benchmark_audit.py +0 -0
  209. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_benchmark_run.py +0 -0
  210. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_call_graph.py +0 -0
  211. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_cbv_extractor.py +0 -0
  212. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_config.py +0 -0
  213. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_constant_resolver.py +0 -0
  214. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_cross_file_resolver.py +0 -0
  215. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_csharp_literals.py +0 -0
  216. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_csharp_type_resolver.py +0 -0
  217. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_data_flow.py +0 -0
  218. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_discovery.py +0 -0
  219. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_django_plugin.py +0 -0
  220. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_dynamic_routes.py +0 -0
  221. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_express_nestjs_plugin.py +0 -0
  222. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_fastapi_plugin.py +0 -0
  223. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_fastify_plugin.py +0 -0
  224. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_flow_analysis.py +0 -0
  225. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_grape_plugin.py +0 -0
  226. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_graphql_plugin.py +0 -0
  227. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_grpc_plugin.py +0 -0
  228. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_instrumentation.py +0 -0
  229. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_integration_detection.py +0 -0
  230. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_java_parser.py +0 -0
  231. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_jaxrs_plugin.py +0 -0
  232. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_js_graphql_plugin.py +0 -0
  233. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_jwt_config_extraction.py +0 -0
  234. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_legacy_aspnet_plugin.py +0 -0
  235. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_micronaut_plugin.py +0 -0
  236. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_parameter_analyzer.py +0 -0
  237. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_path_resolver.py +0 -0
  238. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_pydantic_body_inference.py +0 -0
  239. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_python_parser.py +0 -0
  240. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_rails_plugin.py +0 -0
  241. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_refit_plugin.py +0 -0
  242. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_repo_canonical.py +0 -0
  243. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_router_registry.py +0 -0
  244. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_ruby_graphql_plugin.py +0 -0
  245. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sensitivity_capability.py +0 -0
  246. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sinatra_plugin.py +0 -0
  247. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_sink_evidence.py +0 -0
  248. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_spring_plugin.py +0 -0
  249. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_telemetry.py +0 -0
  250. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_transformation_tracking.py +0 -0
  251. {apisec_code_bolt-0.1.4 → apisec_code_bolt-0.1.7}/tests/unit/test_types.py +0 -0
  252. {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.4"
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
- return ConfigurationModel(env_vars_used=env_vars, config_files=config_files)
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