SafeAI-Static-Analyzer 2.2.0__tar.gz → 2.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/PKG-INFO +2 -2
  2. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/README.md +1 -1
  3. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/PKG-INFO +2 -2
  4. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/SOURCES.txt +1 -0
  5. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/cmd/cli.py +6 -2
  6. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/pr_comment.py +9 -0
  7. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/version.py +1 -1
  8. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_pr_comment.py +51 -0
  9. safeai_static_analyzer-2.2.1/tests/test_release_assets.py +100 -0
  10. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/LICENSE +0 -0
  11. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/dependency_links.txt +0 -0
  12. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/entry_points.txt +0 -0
  13. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/requires.txt +0 -0
  14. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/SafeAI_Static_Analyzer.egg-info/top_level.txt +0 -0
  15. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/pyproject.toml +0 -0
  16. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/__init__.py +0 -0
  17. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/__main__.py +0 -0
  18. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/__init__.py +0 -0
  19. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/aggregation.py +0 -0
  20. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/capabilities.py +0 -0
  21. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/capability_diff.py +0 -0
  22. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/component_diff.py +0 -0
  23. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/component_graph.py +0 -0
  24. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/components.py +0 -0
  25. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/dependency_correlation.py +0 -0
  26. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/escalation.py +0 -0
  27. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/escalation_remediation.py +0 -0
  28. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/import_graph.py +0 -0
  29. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/project_graph.py +0 -0
  30. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/semantic.py +0 -0
  31. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/target_taxonomy.py +0 -0
  32. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/tool_identity.py +0 -0
  33. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/tool_implementation.py +0 -0
  34. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analysis/tool_surface.py +0 -0
  35. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/__init__.py +0 -0
  36. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/capability/__init__.py +0 -0
  37. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/capability/analyzer.py +0 -0
  38. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/claude_code/__init__.py +0 -0
  39. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/claude_code/analyzer.py +0 -0
  40. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/data_leakage/__init__.py +0 -0
  41. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/data_leakage/analyzer.py +0 -0
  42. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/dataflow/__init__.py +0 -0
  43. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/dataflow/analyzer.py +0 -0
  44. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/env_dependency/__init__.py +0 -0
  45. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/env_dependency/analyzer.py +0 -0
  46. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/governance/__init__.py +0 -0
  47. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/governance/analyzer.py +0 -0
  48. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/mcp/__init__.py +0 -0
  49. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/mcp/analyzer.py +0 -0
  50. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/mcp/compatibility.py +0 -0
  51. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/mcp/schema.py +0 -0
  52. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/mcp/validators.py +0 -0
  53. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/model_config/__init__.py +0 -0
  54. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/model_config/analyzer.py +0 -0
  55. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/prompt/__init__.py +0 -0
  56. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/prompt/analyzer.py +0 -0
  57. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/prompt_file/__init__.py +0 -0
  58. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/prompt_file/analyzer.py +0 -0
  59. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/skill/__init__.py +0 -0
  60. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/skill/analyzer.py +0 -0
  61. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/tool_def/__init__.py +0 -0
  62. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/tool_def/analyzer.py +0 -0
  63. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/workflow/__init__.py +0 -0
  64. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/analyzers/workflow/analyzer.py +0 -0
  65. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/cmd/__init__.py +0 -0
  66. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/cmd/manifest_cli.py +0 -0
  67. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/cmd/postprocess.py +0 -0
  68. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/cmd/registry_cli.py +0 -0
  69. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/controls/__init__.py +0 -0
  70. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/controls/catalogs.py +0 -0
  71. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/controls/mappings.py +0 -0
  72. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/engine/__init__.py +0 -0
  73. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/engine/file_discovery.py +0 -0
  74. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/engine/metadata.py +0 -0
  75. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/engine/orchestrator.py +0 -0
  76. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/engine/scan.py +0 -0
  77. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/__init__.py +0 -0
  78. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/autogen/parser.py +0 -0
  79. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/azure_foundry/__init__.py +0 -0
  80. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/azure_foundry/parser.py +0 -0
  81. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/bedrock_agent/__init__.py +0 -0
  82. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/bedrock_agent/parser.py +0 -0
  83. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/claude_code/__init__.py +0 -0
  84. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/claude_code/commands.py +0 -0
  85. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/claude_code/parser.py +0 -0
  86. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/claude_code/permissions.py +0 -0
  87. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/claude_code/settings.py +0 -0
  88. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/crewai/__init__.py +0 -0
  89. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/crewai/parser.py +0 -0
  90. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/cursorrules/__init__.py +0 -0
  91. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/cursorrules/parser.py +0 -0
  92. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/dify/__init__.py +0 -0
  93. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/dify/parser.py +0 -0
  94. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/google_adk/__init__.py +0 -0
  95. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/google_adk/parser.py +0 -0
  96. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/haystack/__init__.py +0 -0
  97. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/haystack/parser.py +0 -0
  98. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/langchain/__init__.py +0 -0
  99. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/langchain/parser.py +0 -0
  100. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/langgraph/__init__.py +0 -0
  101. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/langgraph/parser.py +0 -0
  102. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/llamaindex/__init__.py +0 -0
  103. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/llamaindex/parser.py +0 -0
  104. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/mastra/__init__.py +0 -0
  105. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/mastra/parser.py +0 -0
  106. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/microsoft_agent/__init__.py +0 -0
  107. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/microsoft_agent/parser.py +0 -0
  108. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/n8n/__init__.py +0 -0
  109. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/n8n/parser.py +0 -0
  110. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/openai_agents/__init__.py +0 -0
  111. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/openai_agents/parser.py +0 -0
  112. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/semantic_kernel/__init__.py +0 -0
  113. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/semantic_kernel/parser.py +0 -0
  114. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/windsurf/__init__.py +0 -0
  115. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/frameworks/windsurf/parser.py +0 -0
  116. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/__init__.py +0 -0
  117. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/assurance.py +0 -0
  118. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/baseline.py +0 -0
  119. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/ci_context.py +0 -0
  120. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/contract.py +0 -0
  121. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/enrich.py +0 -0
  122. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/exporter.py +0 -0
  123. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/fingerprints.py +0 -0
  124. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/identity.py +0 -0
  125. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/importer.py +0 -0
  126. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/integrity.py +0 -0
  127. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/manifest.py +0 -0
  128. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/policy.py +0 -0
  129. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/registry/__init__.py +0 -0
  130. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/registry/connection.py +0 -0
  131. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/registry/persist.py +0 -0
  132. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/registry/queries.py +0 -0
  133. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/registry/schema.py +0 -0
  134. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/suppressions.py +0 -0
  135. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/kya/util.py +0 -0
  136. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/__init__.py +0 -0
  137. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/failure_matrix.py +0 -0
  138. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/html.py +0 -0
  139. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/html_kit.py +0 -0
  140. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/json_report.py +0 -0
  141. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/registry_html.py +0 -0
  142. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/sarif.py +0 -0
  143. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/report/terminal.py +0 -0
  144. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/rules/__init__.py +0 -0
  145. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/rules/base_rules.yaml +0 -0
  146. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/rules/loader.py +0 -0
  147. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/scorecard.py +0 -0
  148. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/scoring/__init__.py +0 -0
  149. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/scoring/engine.py +0 -0
  150. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/severity.py +0 -0
  151. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/telemetry/__init__.py +0 -0
  152. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/telemetry/client.py +0 -0
  153. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/telemetry/config.py +0 -0
  154. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/safeai/telemetry/schema.py +0 -0
  155. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/setup.cfg +0 -0
  156. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_adapter_dataflow.py +0 -0
  157. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_assurance.py +0 -0
  158. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_baseline.py +0 -0
  159. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_benchmarks.py +0 -0
  160. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_capability_detection.py +0 -0
  161. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_capability_diff_v2.py +0 -0
  162. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_ci_context.py +0 -0
  163. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_claude_code_deep.py +0 -0
  164. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_compatibility.py +0 -0
  165. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_component_graph.py +0 -0
  166. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_component_hash.py +0 -0
  167. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_confidence_arbitration.py +0 -0
  168. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_control_mappings.py +0 -0
  169. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_crewai_framework.py +0 -0
  170. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_cursorrules_framework.py +0 -0
  171. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_dco.py +0 -0
  172. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_env_dependency.py +0 -0
  173. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_escalation.py +0 -0
  174. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_escalation_remediation.py +0 -0
  175. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_evidence_type.py +0 -0
  176. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_fingerprints.py +0 -0
  177. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_github_action.py +0 -0
  178. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_governance_analyzer.py +0 -0
  179. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_html_report.py +0 -0
  180. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_init_and_rules.py +0 -0
  181. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_kya_integration.py +0 -0
  182. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_kya_manifest.py +0 -0
  183. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_langgraph_framework.py +0 -0
  184. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_llamaindex_framework.py +0 -0
  185. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_manifest_contract.py +0 -0
  186. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_manifest_integrity.py +0 -0
  187. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_mcp_tool_poisoning.py +0 -0
  188. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_mcp_validation.py +0 -0
  189. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_n8n_workflow.py +0 -0
  190. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_parser_aggregation.py +0 -0
  191. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_phase15.py +0 -0
  192. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_policy.py +0 -0
  193. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_pr_comment_cli.py +0 -0
  194. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_quality_gates.py +0 -0
  195. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_registry.py +0 -0
  196. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_registry_cli.py +0 -0
  197. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_registry_html.py +0 -0
  198. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_regression_fixtures.py +0 -0
  199. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_release_fixes.py +0 -0
  200. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_release_validation.py +0 -0
  201. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_rules_loader_determinism.py +0 -0
  202. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_sarif.py +0 -0
  203. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_scan_phase11.py +0 -0
  204. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_scorecard.py +0 -0
  205. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_scoring.py +0 -0
  206. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_semantic.py +0 -0
  207. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_severity.py +0 -0
  208. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_suppressions.py +0 -0
  209. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_target_taxonomy_engine.py +0 -0
  210. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_telemetry.py +0 -0
  211. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_tool_identity.py +0 -0
  212. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_tool_implementation.py +0 -0
  213. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_version.py +0 -0
  214. {safeai_static_analyzer-2.2.0 → safeai_static_analyzer-2.2.1}/tests/test_windsurf_framework.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SafeAI-Static-Analyzer
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Summary: The lightweight, open-source Static AI Capability & Risk Analyzer for CI/CD pipelines.
5
5
  Author: IkarusCareer
6
6
  License-Expression: Apache-2.0
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
 
42
42
  Enjoying SafeAI? A ⭐ on [GitHub](https://github.com/ikaruscareer/SafeAI) helps more security teams find it.
43
43
 
44
- **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It runs entirely offline, never executes agents or calls LLMs, and integrates into CI/CD pipelines.
44
+ **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It is offline and source-private by default — it never executes agents or calls LLMs, and network activity occurs only through explicitly enabled integration commands (currently only `--pr-comment-post`). It integrates into CI/CD pipelines.
45
45
 
46
46
  > 🌐 [safeai-analyzer.ikaruscareer.com](https://safeai-analyzer.ikaruscareer.com) — project landing page
47
47
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  Enjoying SafeAI? A ⭐ on [GitHub](https://github.com/ikaruscareer/SafeAI) helps more security teams find it.
10
10
 
11
- **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It runs entirely offline, never executes agents or calls LLMs, and integrates into CI/CD pipelines.
11
+ **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It is offline and source-private by default — it never executes agents or calls LLMs, and network activity occurs only through explicitly enabled integration commands (currently only `--pr-comment-post`). It integrates into CI/CD pipelines.
12
12
 
13
13
  > 🌐 [safeai-analyzer.ikaruscareer.com](https://safeai-analyzer.ikaruscareer.com) — project landing page
14
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SafeAI-Static-Analyzer
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Summary: The lightweight, open-source Static AI Capability & Risk Analyzer for CI/CD pipelines.
5
5
  Author: IkarusCareer
6
6
  License-Expression: Apache-2.0
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
 
42
42
  Enjoying SafeAI? A ⭐ on [GitHub](https://github.com/ikaruscareer/SafeAI) helps more security teams find it.
43
43
 
44
- **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It runs entirely offline, never executes agents or calls LLMs, and integrates into CI/CD pipelines.
44
+ **SafeAI** is a static analysis tool that scans AI application source code for security risks, capability exposure, and governance gaps. It is offline and source-private by default — it never executes agents or calls LLMs, and network activity occurs only through explicitly enabled integration commands (currently only `--pr-comment-post`). It integrates into CI/CD pipelines.
45
45
 
46
46
  > 🌐 [safeai-analyzer.ikaruscareer.com](https://safeai-analyzer.ikaruscareer.com) — project landing page
47
47
 
@@ -193,6 +193,7 @@ tests/test_registry.py
193
193
  tests/test_registry_cli.py
194
194
  tests/test_registry_html.py
195
195
  tests/test_regression_fixtures.py
196
+ tests/test_release_assets.py
196
197
  tests/test_release_fixes.py
197
198
  tests/test_release_validation.py
198
199
  tests/test_rules_loader_determinism.py
@@ -26,7 +26,9 @@ KYA (Know Your Agent) behavior:
26
26
  * ``--pr-comment`` writes a reviewer-facing Markdown summary of
27
27
  capability escalations to a file. SafeAI never posts it anywhere;
28
28
  publishing is the CI workflow's job.
29
- * All outputs remain local: no network calls, no uploads.
29
+ * All outputs remain local: no network calls, no uploads — except the
30
+ explicitly enabled ``--pr-comment-post`` integration, which makes one
31
+ GitHub API request and announces itself on stderr.
30
32
  """
31
33
 
32
34
  import argparse
@@ -70,7 +72,9 @@ def _build_parser():
70
72
  help="Print the PR comment Markdown to stdout")
71
73
  scan.add_argument("--pr-comment-post", action="store_true",
72
74
  help="Post or update the PR comment on GitHub (requires GITHUB_TOKEN "
73
- "and CI context with PR number and repository)")
75
+ "and CI context with PR number and repository). "
76
+ "NETWORK: the one explicitly enabled integration that "
77
+ "makes a GitHub API request; announces itself on stderr.")
74
78
  scan.add_argument("--fail-on-escalation", choices=["critical", "high", "medium"],
75
79
  help="Fail the scan when a capability escalation at or above "
76
80
  "this severity is detected (requires --baseline)")
@@ -20,6 +20,8 @@ Design constraints, all enforced by tests:
20
20
  * Nothing is posted anywhere. This module returns a string.
21
21
  """
22
22
 
23
+ import sys
24
+
23
25
  from safeai.analysis.tool_identity import display_name
24
26
  from safeai.kya.assurance import BOUNDARY_SENTENCE
25
27
  from safeai.severity import ESCALATION_SEVERITIES
@@ -343,6 +345,13 @@ def post_pr_comment(report, ci_context=None, token=None):
343
345
  text = render_pr_comment(report, ci_context=ci_context)
344
346
  api_base = f"https://api.github.com/repos/{repository}"
345
347
 
348
+ # Explicit integration boundary: the scanner is offline by default;
349
+ # this is the one path that makes a network request, and it says so.
350
+ sys.stderr.write(
351
+ "Integration mode enabled: SafeAI is making an explicit GitHub API "
352
+ "request to post/update a PR comment.\n"
353
+ )
354
+
346
355
  # Find existing comment with our marker
347
356
  comment_id = _find_existing_comment(api_base, pr_number, token)
348
357
  if comment_id:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  import sys
5
5
 
6
- SAFEAI_VERSION = "2.2.0"
6
+ SAFEAI_VERSION = "2.2.1"
7
7
  VERSION_FLAGS = ("--version", "-V")
8
8
 
9
9
 
@@ -299,3 +299,54 @@ def test_post_pr_comment_returns_none_without_token(monkeypatch):
299
299
  "repository": "ikaruscareer/SafeAI",
300
300
  })
301
301
  assert result is None
302
+
303
+
304
+ def test_post_pr_comment_announces_integration_mode(monkeypatch, capsys):
305
+ """The one network path announces itself on stderr before requesting."""
306
+ import json as _json
307
+ import urllib.request
308
+
309
+ from safeai.report.pr_comment import post_pr_comment
310
+
311
+ calls = []
312
+
313
+ class _FakeResponse:
314
+ def __init__(self, payload):
315
+ self.payload = payload
316
+
317
+ def __enter__(self):
318
+ return self
319
+
320
+ def __exit__(self, *args):
321
+ return False
322
+
323
+ def read(self):
324
+ return _json.dumps(self.payload).encode()
325
+
326
+ def _fake_urlopen(request, *args, **kwargs):
327
+ calls.append(request.full_url)
328
+ if request.full_url.endswith("/comments?per_page=100"):
329
+ return _FakeResponse([])
330
+ return _FakeResponse({"html_url": "https://github.com/x/y/pull/42#issuecomment-1"})
331
+
332
+ monkeypatch.setattr(urllib.request, "urlopen", _fake_urlopen)
333
+ result = post_pr_comment(typical_report(), ci_context={
334
+ "pr_number": 42,
335
+ "repository": "ikaruscareer/SafeAI",
336
+ }, token="fake-token")
337
+ assert result == "https://github.com/x/y/pull/42#issuecomment-1"
338
+ assert len(calls) == 2 # find existing, then create
339
+ err = capsys.readouterr().err
340
+ assert "Integration mode enabled" in err
341
+ assert "explicit GitHub API request" in err
342
+
343
+
344
+ def test_post_pr_comment_silent_without_token(monkeypatch, capsys):
345
+ """No announcement when nothing will be sent (offline stays silent)."""
346
+ from safeai.report.pr_comment import post_pr_comment
347
+ monkeypatch.delenv("GITHUB_TOKEN", raising=False)
348
+ assert post_pr_comment(typical_report(), ci_context={
349
+ "pr_number": 42,
350
+ "repository": "ikaruscareer/SafeAI",
351
+ }) is None
352
+ assert "Integration mode" not in capsys.readouterr().err
@@ -0,0 +1,100 @@
1
+ """Release asset invariants (supply-chain: no misattributed evidence)."""
2
+
3
+ import hashlib
4
+ import importlib.util
5
+ import json
6
+ import os
7
+
8
+ REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
9
+ SCRIPT = os.path.join(REPO_ROOT, "scripts", "verify_release_assets.py")
10
+
11
+
12
+ def _load():
13
+ spec = importlib.util.spec_from_file_location("verify_release_assets", SCRIPT)
14
+ mod = importlib.util.module_from_spec(spec)
15
+ spec.loader.exec_module(mod)
16
+ return mod
17
+
18
+
19
+ def _write(path, content=b"x"):
20
+ with open(path, "wb") as fh:
21
+ fh.write(content if isinstance(content, bytes) else content.encode())
22
+
23
+
24
+ def _clean_tree(tmp_path, version="2.2.1"):
25
+ wheel = f"safeai_static_analyzer-{version}-py3-none-any.whl"
26
+ sdist = f"safeai_static_analyzer-{version}.tar.gz"
27
+ sbom = f"safeai-{version}-sbom.spdx.json"
28
+ slsa = f"safeai-{version}-slsa-provenance.json"
29
+ for name, content in (
30
+ (wheel, b"wheel-bytes"),
31
+ (sdist, b"sdist-bytes"),
32
+ (sbom, json.dumps({"spdxVersion": "SPDX-2.3"})),
33
+ (slsa, json.dumps({"_type": "in-toto"})),
34
+ ):
35
+ _write(os.path.join(str(tmp_path), name), content)
36
+ for name in (wheel, sdist):
37
+ _write(os.path.join(str(tmp_path), name + ".sig"), b"sig")
38
+ _write(os.path.join(str(tmp_path), name + ".pem"), b"pem")
39
+ lines = []
40
+ for name in (wheel, sdist, sbom, slsa):
41
+ with open(os.path.join(str(tmp_path), name), "rb") as fh:
42
+ digest = hashlib.sha256(fh.read()).hexdigest()
43
+ lines.append(f"{digest} {name}")
44
+ _write(os.path.join(str(tmp_path), "SHA256SUMS"), "\n".join(lines) + "\n")
45
+ return str(tmp_path)
46
+
47
+
48
+ def test_clean_release_passes(tmp_path):
49
+ mod = _load()
50
+ assert mod.verify(_clean_tree(tmp_path), "2.2.1") == []
51
+
52
+
53
+ def test_historical_artifact_fails(tmp_path):
54
+ mod = _load()
55
+ root = _clean_tree(tmp_path)
56
+ _write(os.path.join(root, "safeai-2.0.1-sbom.spdx.json"), b"{}")
57
+ problems = mod.verify(root, "2.2.1")
58
+ assert any("2.0.1" in p and "foreign version" in p for p in problems)
59
+
60
+
61
+ def test_generic_provenance_fails(tmp_path):
62
+ mod = _load()
63
+ root = _clean_tree(tmp_path)
64
+ _write(os.path.join(root, "provenance.json"), b"{}")
65
+ problems = mod.verify(root, "2.2.1")
66
+ assert any("generically named" in p for p in problems)
67
+
68
+
69
+ def test_missing_sidecar_fails(tmp_path):
70
+ mod = _load()
71
+ root = _clean_tree(tmp_path)
72
+ os.remove(os.path.join(root, "safeai_static_analyzer-2.2.1.tar.gz.sig"))
73
+ problems = mod.verify(root, "2.2.1")
74
+ assert any("sidecar" in p for p in problems)
75
+
76
+
77
+ def test_checksum_mismatch_fails(tmp_path):
78
+ mod = _load()
79
+ root = _clean_tree(tmp_path)
80
+ _write(os.path.join(root, "safeai_static_analyzer-2.2.1.tar.gz"), b"tampered")
81
+ problems = mod.verify(root, "2.2.1")
82
+ assert any("digest mismatch" in p for p in problems)
83
+
84
+
85
+ def test_unlisted_file_fails(tmp_path):
86
+ mod = _load()
87
+ root = _clean_tree(tmp_path)
88
+ wheel = "safeai_static_analyzer-2.2.1-py3-none-any.whl"
89
+ sums = os.path.join(root, "SHA256SUMS")
90
+ with open(sums, encoding="utf-8") as fh:
91
+ kept = [ln for ln in fh if wheel not in ln]
92
+ with open(sums, "w", encoding="utf-8") as fh:
93
+ fh.writelines(kept)
94
+ problems = mod.verify(root, "2.2.1")
95
+ assert any("absent from SHA256SUMS" in p for p in problems)
96
+
97
+
98
+ def test_bad_version_usage():
99
+ mod = _load()
100
+ assert mod.main([".", "not-a-version"]) == 2