cycode 3.21.0__tar.gz → 3.21.1.dev2__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 (220) hide show
  1. {cycode-3.21.0 → cycode-3.21.1.dev2}/PKG-INFO +16 -2
  2. {cycode-3.21.0 → cycode-3.21.1.dev2}/README.md +15 -1
  3. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/__init__.py +1 -1
  4. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/handlers.py +1 -0
  5. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/payload.py +7 -1
  6. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_command.py +5 -1
  7. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_parameters.py +1 -0
  8. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/cli_types.py +1 -0
  9. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/consts.py +1 -0
  10. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/rich_printer.py +3 -7
  11. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/sca_table_printer.py +15 -1
  12. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/text_printer.py +2 -12
  13. cycode-3.21.1.dev2/cycode/cli/printers/utils/sca_ossf.py +23 -0
  14. cycode-3.21.1.dev2/cycode/cli/printers/utils/sca_policy_details.py +57 -0
  15. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/ai_security_manager_client.py +1 -0
  16. {cycode-3.21.0 → cycode-3.21.1.dev2}/pyproject.toml +1 -1
  17. {cycode-3.21.0 → cycode-3.21.1.dev2}/LICENCE +0 -0
  18. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/__main__.py +0 -0
  19. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/__init__.py +0 -0
  20. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/app.py +0 -0
  21. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/__init__.py +0 -0
  22. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/activation_manager.py +0 -0
  23. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/__init__.py +0 -0
  24. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/command_utils.py +0 -0
  25. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/consts.py +0 -0
  26. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/hooks_manager.py +0 -0
  27. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/__init__.py +0 -0
  28. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py +0 -0
  29. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/base.py +0 -0
  30. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/claude_code.py +0 -0
  31. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/codex.py +0 -0
  32. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/copilot.py +0 -0
  33. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/ides/cursor.py +0 -0
  34. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/install_command.py +0 -0
  35. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/__init__.py +0 -0
  36. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/consts.py +0 -0
  37. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/policy.py +0 -0
  38. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/scan_command.py +0 -0
  39. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/types.py +0 -0
  40. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/scan/utils.py +0 -0
  41. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/session_start_command.py +0 -0
  42. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/status_command.py +0 -0
  43. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_guardrails/uninstall_command.py +0 -0
  44. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
  45. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
  46. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
  47. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
  48. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/api/__init__.py +0 -0
  49. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/api/api_command.py +0 -0
  50. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/api/openapi_spec.py +0 -0
  51. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/auth/__init__.py +0 -0
  52. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/auth/auth_command.py +0 -0
  53. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/auth/auth_common.py +0 -0
  54. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/auth/auth_manager.py +0 -0
  55. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/auth/models.py +0 -0
  56. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/configure/__init__.py +0 -0
  57. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/configure/configure_command.py +0 -0
  58. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/configure/consts.py +0 -0
  59. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/configure/messages.py +0 -0
  60. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/configure/prompts.py +0 -0
  61. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ignore/__init__.py +0 -0
  62. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/ignore/ignore_command.py +0 -0
  63. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/mcp/__init__.py +0 -0
  64. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/mcp/mcp_command.py +0 -0
  65. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/__init__.py +0 -0
  66. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/report_command.py +0 -0
  67. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/__init__.py +0 -0
  68. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/common.py +0 -0
  69. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
  70. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/path/path_command.py +0 -0
  71. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
  72. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
  73. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/sbom_command.py +0 -0
  74. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report/sbom/sbom_report_file.py +0 -0
  75. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report_import/__init__.py +0 -0
  76. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report_import/report_import_command.py +0 -0
  77. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report_import/sbom/__init__.py +0 -0
  78. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/report_import/sbom/sbom_command.py +0 -0
  79. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/sca_options.py +0 -0
  80. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/__init__.py +0 -0
  81. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/aggregation_report.py +0 -0
  82. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/code_scanner.py +0 -0
  83. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
  84. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
  85. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/commit_range_scanner.py +0 -0
  86. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/detection_excluder.py +0 -0
  87. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/path/__init__.py +0 -0
  88. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/path/path_command.py +0 -0
  89. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
  90. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +0 -0
  91. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
  92. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_push/pre_push_command.py +0 -0
  93. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
  94. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +0 -0
  95. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/remote_url_resolver.py +0 -0
  96. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/repository/__init__.py +0 -0
  97. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/repository/repository_command.py +0 -0
  98. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
  99. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
  100. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
  101. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/scan/scan_result.py +0 -0
  102. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/status/__init__.py +0 -0
  103. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/status/get_cli_status.py +0 -0
  104. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/status/models.py +0 -0
  105. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/status/status_command.py +0 -0
  106. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/apps/status/version_command.py +0 -0
  107. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/config.py +0 -0
  108. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/console.py +0 -0
  109. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/__init__.py +0 -0
  110. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/custom_exceptions.py +0 -0
  111. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
  112. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
  113. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/handle_errors.py +0 -0
  114. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
  115. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/exceptions/handle_scan_errors.py +0 -0
  116. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/__init__.py +0 -0
  117. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/commit_range_documents.py +0 -0
  118. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/documents_walk_ignore.py +0 -0
  119. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/file_excluder.py +0 -0
  120. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/iac/__init__.py +0 -0
  121. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
  122. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/models/__init__.py +0 -0
  123. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
  124. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/path_documents.py +0 -0
  125. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/repository_documents.py +0 -0
  126. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/__init__.py +0 -0
  127. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/base_restore_dependencies.py +0 -0
  128. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
  129. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +0 -0
  130. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
  131. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
  132. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
  133. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
  134. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py +0 -0
  135. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/restore_deno_dependencies.py +0 -0
  136. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
  137. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/restore_pnpm_dependencies.py +0 -0
  138. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/npm/restore_yarn_dependencies.py +0 -0
  139. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
  140. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
  141. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/php/__init__.py +0 -0
  142. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/php/restore_composer_dependencies.py +0 -0
  143. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/python/__init__.py +0 -0
  144. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/python/restore_pip_dependencies.py +0 -0
  145. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/python/restore_pipenv_dependencies.py +0 -0
  146. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/python/restore_poetry_dependencies.py +0 -0
  147. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/python/restore_uv_dependencies.py +0 -0
  148. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
  149. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
  150. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
  151. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
  152. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/sca/sca_file_collector.py +0 -0
  153. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/walk_ignore.py +0 -0
  154. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/files_collector/zip_documents.py +0 -0
  155. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/logger.py +0 -0
  156. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/main.py +0 -0
  157. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/models.py +0 -0
  158. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/__init__.py +0 -0
  159. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/console_printer.py +0 -0
  160. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/json_printer.py +0 -0
  161. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/printer_base.py +0 -0
  162. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/__init__.py +0 -0
  163. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/table.py +0 -0
  164. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/table_models.py +0 -0
  165. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/table_printer.py +0 -0
  166. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/tables/table_printer_base.py +0 -0
  167. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/__init__.py +0 -0
  168. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/code_snippet_syntax.py +0 -0
  169. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/detection_data.py +0 -0
  170. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
  171. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
  172. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
  173. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/printers/utils/rich_helpers.py +0 -0
  174. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/__init__.py +0 -0
  175. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/base_file_manager.py +0 -0
  176. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/config_file_manager.py +0 -0
  177. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/configuration_manager.py +0 -0
  178. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/credentials_manager.py +0 -0
  179. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/user_settings/jwt_creator.py +0 -0
  180. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/__init__.py +0 -0
  181. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/binary_utils.py +0 -0
  182. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/enum_utils.py +0 -0
  183. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/get_api_client.py +0 -0
  184. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/git_proxy.py +0 -0
  185. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/host_info.py +0 -0
  186. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/ignore_utils.py +0 -0
  187. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/jwt_utils.py +0 -0
  188. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/path_utils.py +0 -0
  189. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/progress_bar.py +0 -0
  190. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/scan_batch.py +0 -0
  191. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/scan_utils.py +0 -0
  192. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/shell_executor.py +0 -0
  193. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/string_utils.py +0 -0
  194. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/task_timer.py +0 -0
  195. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/trust_store.py +0 -0
  196. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/url_utils.py +0 -0
  197. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/version_checker.py +0 -0
  198. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cli/utils/yaml_utils.py +0 -0
  199. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/config.py +0 -0
  200. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/__init__.py +0 -0
  201. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/ai_security_manager_service_config.py +0 -0
  202. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/auth_client.py +0 -0
  203. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/base_token_auth_client.py +0 -0
  204. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cli_activation_client.py +0 -0
  205. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/client_creator.py +0 -0
  206. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/config.py +0 -0
  207. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/config_dev.py +0 -0
  208. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cycode_client.py +0 -0
  209. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cycode_client_base.py +0 -0
  210. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cycode_dev_based_client.py +0 -0
  211. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cycode_oidc_based_client.py +0 -0
  212. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/cycode_token_based_client.py +0 -0
  213. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/headers.py +0 -0
  214. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/import_sbom_client.py +0 -0
  215. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/logger.py +0 -0
  216. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/models.py +0 -0
  217. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/report_client.py +0 -0
  218. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/scan_client.py +0 -0
  219. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/cyclient/scan_config_base.py +0 -0
  220. {cycode-3.21.0 → cycode-3.21.1.dev2}/cycode/logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cycode
3
- Version: 3.21.0
3
+ Version: 3.21.1.dev2
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  License-Expression: MIT
6
6
  License-File: LICENCE
@@ -834,7 +834,7 @@ The Cycode CLI application offers several types of scans so that you can choose
834
834
  | `--show-secret BOOLEAN` | Show secrets in plain text. See [Show/Hide Secrets](#showhide-secrets) section for more details. |
835
835
  | `--soft-fail BOOLEAN` | Run scan without failing, always return a non-error status code. See [Soft Fail](#soft-fail) section for more details. |
836
836
  | `--severity-threshold [INFO\|LOW\|MEDIUM\|HIGH\|CRITICAL]` | Show only violations at the specified level or higher. |
837
- | `--sca-scan` | Specify the SCA scan you wish to execute (`package-vulnerabilities`/`license-compliance`). The default is both. |
837
+ | `--sca-scan` | Specify the SCA scan you wish to execute (`package-vulnerabilities`/`license-compliance`/`unmaintained-packages`). The default is all. |
838
838
  | `--monitor` | When specified, the scan results will be recorded in Cycode. |
839
839
  | `--cycode-report` | Display a link to the scan report in the Cycode platform in the console output. |
840
840
  | `--no-restore` | When specified, Cycode will not run the restore command. This will scan direct dependencies ONLY! |
@@ -912,6 +912,20 @@ In the previous example, if you wanted to only scan a branch named `dev`, you co
912
912
 
913
913
  `cycode scan -t sca --sca-scan license-compliance repository ~/home/git/codebase -b dev`
914
914
 
915
+ #### Unmaintained Packages Option
916
+
917
+ > [!NOTE]
918
+ > This option is only available to SCA scans.
919
+
920
+ To scan only for unmaintained packages (packages whose [OpenSSF Scorecard](https://scorecard.dev) `Maintained` check is low, meaning little or no recent commit and issue activity), add the argument `--sca-scan unmaintained-packages` following the `-t sca` or `--scan-type sca` option.
921
+
922
+ > [!NOTE]
923
+ > Whether unmaintained packages are reported at all is controlled by your organization's policy. This option narrows what a scan reports; it cannot enable a policy that is turned off for your tenant.
924
+
925
+ In the previous example, if you wanted to only run an SCA scan on unmaintained packages, you could execute the following:
926
+
927
+ `cycode scan -t sca --sca-scan unmaintained-packages repository ~/home/git/codebase`
928
+
915
929
  #### Lock Restore Option
916
930
 
917
931
  > [!NOTE]
@@ -789,7 +789,7 @@ The Cycode CLI application offers several types of scans so that you can choose
789
789
  | `--show-secret BOOLEAN` | Show secrets in plain text. See [Show/Hide Secrets](#showhide-secrets) section for more details. |
790
790
  | `--soft-fail BOOLEAN` | Run scan without failing, always return a non-error status code. See [Soft Fail](#soft-fail) section for more details. |
791
791
  | `--severity-threshold [INFO\|LOW\|MEDIUM\|HIGH\|CRITICAL]` | Show only violations at the specified level or higher. |
792
- | `--sca-scan` | Specify the SCA scan you wish to execute (`package-vulnerabilities`/`license-compliance`). The default is both. |
792
+ | `--sca-scan` | Specify the SCA scan you wish to execute (`package-vulnerabilities`/`license-compliance`/`unmaintained-packages`). The default is all. |
793
793
  | `--monitor` | When specified, the scan results will be recorded in Cycode. |
794
794
  | `--cycode-report` | Display a link to the scan report in the Cycode platform in the console output. |
795
795
  | `--no-restore` | When specified, Cycode will not run the restore command. This will scan direct dependencies ONLY! |
@@ -867,6 +867,20 @@ In the previous example, if you wanted to only scan a branch named `dev`, you co
867
867
 
868
868
  `cycode scan -t sca --sca-scan license-compliance repository ~/home/git/codebase -b dev`
869
869
 
870
+ #### Unmaintained Packages Option
871
+
872
+ > [!NOTE]
873
+ > This option is only available to SCA scans.
874
+
875
+ To scan only for unmaintained packages (packages whose [OpenSSF Scorecard](https://scorecard.dev) `Maintained` check is low, meaning little or no recent commit and issue activity), add the argument `--sca-scan unmaintained-packages` following the `-t sca` or `--scan-type sca` option.
876
+
877
+ > [!NOTE]
878
+ > Whether unmaintained packages are reported at all is controlled by your organization's policy. This option narrows what a scan reports; it cannot enable a policy that is turned off for your tenant.
879
+
880
+ In the previous example, if you wanted to only run an SCA scan on unmaintained packages, you could execute the following:
881
+
882
+ `cycode scan -t sca --sca-scan unmaintained-packages repository ~/home/git/codebase`
883
+
870
884
  #### Lock Restore Option
871
885
 
872
886
  > [!NOTE]
@@ -5,4 +5,4 @@ import time as _time
5
5
  # end-to-end scan duration from the moment the user actually triggered it.
6
6
  _BOOT_WALL: float = _time.time()
7
7
 
8
- __version__ = '3.21.0' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
8
+ __version__ = '3.21.1.dev2' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -334,6 +334,7 @@ def build_ai_guardrails_scan_parameters(
334
334
  'device_hostname': get_hostname(),
335
335
  'conversation_id': payload.conversation_id,
336
336
  'generation_id': payload.generation_id,
337
+ 'hook_event_id': payload.hook_event_id,
337
338
  'ide_user_email': payload.ide_user_email,
338
339
  'mcp_server_name': payload.mcp_server_name,
339
340
  'mcp_tool_name': payload.mcp_tool_name,
@@ -5,7 +5,8 @@ The dataclass is populated by `IDE.parse_hook_payload` (see
5
5
  respective IDE class.
6
6
  """
7
7
 
8
- from dataclasses import dataclass
8
+ import uuid
9
+ from dataclasses import dataclass, field
9
10
  from typing import Optional
10
11
 
11
12
 
@@ -18,6 +19,11 @@ class AIHookPayload:
18
19
  conversation_id: Optional[str] = None
19
20
  generation_id: Optional[str] = None
20
21
 
22
+ # Minted here rather than by the server: the guardrail scan and the hook event are reported in two
23
+ # separate requests, and both have to name the same event. A generation id can't stand in for it - the
24
+ # IDE mints one per prompt, so several hook events share it, and some IDEs don't supply one at all.
25
+ hook_event_id: str = field(default_factory=lambda: str(uuid.uuid4()))
26
+
21
27
  # User and IDE information
22
28
  ide_user_email: Optional[str] = None
23
29
  model: Optional[str] = None
@@ -93,7 +93,11 @@ def scan_command(
93
93
  help='Specify the type of SCA scan you wish to execute.',
94
94
  rich_help_panel=_SCA_RICH_HELP_PANEL,
95
95
  ),
96
- ] = (ScaScanTypeOption.PACKAGE_VULNERABILITIES, ScaScanTypeOption.LICENSE_COMPLIANCE),
96
+ ] = (
97
+ ScaScanTypeOption.PACKAGE_VULNERABILITIES,
98
+ ScaScanTypeOption.LICENSE_COMPLIANCE,
99
+ ScaScanTypeOption.UNMAINTAINED_PACKAGES,
100
+ ),
97
101
  monitor: Annotated[
98
102
  bool,
99
103
  typer.Option(
@@ -16,6 +16,7 @@ def _get_default_scan_parameters(ctx: typer.Context) -> dict:
16
16
  'report': ctx.obj.get('report'),
17
17
  'package_vulnerabilities': ctx.obj.get('package-vulnerabilities'),
18
18
  'license_compliance': ctx.obj.get('license-compliance'),
19
+ 'maintainability': ctx.obj.get('unmaintained-packages', False),
19
20
  'command_type': ctx.info_name.replace('-', '_'), # save backward compatibility
20
21
  'aggregation_id': str(generate_unique_scan_id()),
21
22
  'cli_start_time': _BOOT_WALL,
@@ -40,6 +40,7 @@ class ScanTypeOption(StrEnum):
40
40
  class ScaScanTypeOption(StrEnum):
41
41
  PACKAGE_VULNERABILITIES = 'package-vulnerabilities'
42
42
  LICENSE_COMPLIANCE = 'license-compliance'
43
+ UNMAINTAINED_PACKAGES = 'unmaintained-packages'
43
44
 
44
45
 
45
46
  class SbomFormatOption(StrEnum):
@@ -314,6 +314,7 @@ SCAN_ERROR_STATUS_CODE = 2
314
314
 
315
315
  LICENSE_COMPLIANCE_POLICY_ID = '8f681450-49e1-4f7e-85b7-0c8fe84b3a35'
316
316
  PACKAGE_VULNERABILITY_POLICY_ID = '9369d10a-9ac0-48d3-9921-5de7fe9a37a7'
317
+ UNMAINTAINED_PACKAGE_POLICY_ID = '7b45ee1f-ee08-4353-a00a-2586db27b0f1'
317
318
 
318
319
  # Shortcut dependency paths by remove all middle dependencies
319
320
  # between direct dependency and influence/vulnerable dependency.
@@ -16,6 +16,7 @@ from cycode.cli.printers.utils.detection_data import (
16
16
  )
17
17
  from cycode.cli.printers.utils.detection_ordering.common_ordering import sort_and_group_detections_from_scan_result
18
18
  from cycode.cli.printers.utils.rich_helpers import get_columns_in_1_to_3_ratio, get_markdown_panel, get_panel
19
+ from cycode.cli.printers.utils.sca_policy_details import get_sca_policy_details
19
20
 
20
21
  if TYPE_CHECKING:
21
22
  from cycode.cli.models import CliError, Detection, Document, LocalScanResult
@@ -86,19 +87,14 @@ class RichPrinter(TextPrinter):
86
87
  def __add_sca_scan_related_rows(details_table: Table, detection: 'Detection') -> None:
87
88
  detection_details = detection.detection_details
88
89
 
89
- details_table.add_row('CVEs', get_detection_clickable_cwe_cve(consts.SCA_SCAN_TYPE, detection))
90
90
  details_table.add_row('Package', detection_details.get('package_name'))
91
91
  details_table.add_row('Version', detection_details.get('package_version'))
92
92
 
93
- if detection.has_alert:
94
- patched_version = detection_details['alert'].get('first_patched_version')
95
- details_table.add_row('First patched version', patched_version or 'Not fixed')
96
-
97
93
  dependency_path = detection_details.get('dependency_paths')
98
94
  details_table.add_row('Dependency path', dependency_path or 'N/A')
99
95
 
100
- if not detection.has_alert:
101
- details_table.add_row('License', detection_details.get('license'))
96
+ for label, value in get_sca_policy_details(detection):
97
+ details_table.add_row(label, value)
102
98
 
103
99
  @staticmethod
104
100
  def __add_iac_scan_related_rows(details_table: Table, detection: 'Detection') -> None:
@@ -2,13 +2,18 @@ from collections import defaultdict
2
2
  from typing import TYPE_CHECKING
3
3
 
4
4
  from cycode.cli.cli_types import SeverityOption
5
- from cycode.cli.consts import LICENSE_COMPLIANCE_POLICY_ID, PACKAGE_VULNERABILITY_POLICY_ID
5
+ from cycode.cli.consts import (
6
+ LICENSE_COMPLIANCE_POLICY_ID,
7
+ PACKAGE_VULNERABILITY_POLICY_ID,
8
+ UNMAINTAINED_PACKAGE_POLICY_ID,
9
+ )
6
10
  from cycode.cli.models import Detection
7
11
  from cycode.cli.printers.tables.table import Table
8
12
  from cycode.cli.printers.tables.table_models import ColumnInfoBuilder
9
13
  from cycode.cli.printers.tables.table_printer_base import TablePrinterBase
10
14
  from cycode.cli.printers.utils import is_git_diff_based_scan
11
15
  from cycode.cli.printers.utils.detection_ordering.sca_ordering import sort_and_group_detections
16
+ from cycode.cli.printers.utils.sca_ossf import get_maintained_score
12
17
  from cycode.cli.utils.string_utils import shortcut_dependency_paths
13
18
 
14
19
  if TYPE_CHECKING:
@@ -23,6 +28,7 @@ CODE_PROJECT_COLUMN = column_builder.build(name='Code Project', highlight=False)
23
28
  ECOSYSTEM_COLUMN = column_builder.build(name='Ecosystem', highlight=False)
24
29
  PACKAGE_COLUMN = column_builder.build(name='Package', highlight=False)
25
30
  CVE_COLUMNS = column_builder.build(name='CVE', highlight=False)
31
+ MAINTAINED_SCORE_COLUMN = column_builder.build(name='Maintained Score', highlight=False)
26
32
  DEPENDENCY_PATHS_COLUMN = column_builder.build(name='Dependency Paths')
27
33
  UPGRADE_COLUMN = column_builder.build(name='Upgrade')
28
34
  LICENSE_COLUMN = column_builder.build(name='License', highlight=False)
@@ -51,6 +57,8 @@ class ScaTablePrinter(TablePrinterBase):
51
57
  return 'Dependency Vulnerabilities'
52
58
  if policy_id == LICENSE_COMPLIANCE_POLICY_ID:
53
59
  return 'License Compliance'
60
+ if policy_id == UNMAINTAINED_PACKAGE_POLICY_ID:
61
+ return 'Unmaintained Packages'
54
62
 
55
63
  return 'Unknown'
56
64
 
@@ -62,6 +70,8 @@ class ScaTablePrinter(TablePrinterBase):
62
70
  table.add_column(UPGRADE_COLUMN)
63
71
  elif policy_id == LICENSE_COMPLIANCE_POLICY_ID:
64
72
  table.add_column(LICENSE_COLUMN)
73
+ elif policy_id == UNMAINTAINED_PACKAGE_POLICY_ID:
74
+ table.add_column(MAINTAINED_SCORE_COLUMN)
65
75
 
66
76
  if is_git_diff_based_scan(self.command_scan_type):
67
77
  table.add_column(REPOSITORY_COLUMN)
@@ -120,6 +130,10 @@ class ScaTablePrinter(TablePrinterBase):
120
130
  table.add_cell(CVE_COLUMNS, detection_details.get('vulnerability_id'))
121
131
  table.add_cell(LICENSE_COLUMN, detection_details.get('license'))
122
132
 
133
+ if detection.detection_type_id == UNMAINTAINED_PACKAGE_POLICY_ID:
134
+ maintained_score = get_maintained_score(detection_details)
135
+ table.add_cell(MAINTAINED_SCORE_COLUMN, 'N/A' if maintained_score is None else str(maintained_score))
136
+
123
137
  def _print_summary_issues(self, detections_count: int, title: str) -> None:
124
138
  self.console.print(f'[bold]Cycode found {detections_count} violations of type: [cyan]{title}[/]')
125
139
 
@@ -7,6 +7,7 @@ from cycode.cli.printers.printer_base import PrinterBase
7
7
  from cycode.cli.printers.utils.code_snippet_syntax import get_code_snippet_syntax, get_detection_line
8
8
  from cycode.cli.printers.utils.detection_data import get_detection_title
9
9
  from cycode.cli.printers.utils.detection_ordering.common_ordering import sort_and_group_detections_from_scan_result
10
+ from cycode.cli.printers.utils.sca_policy_details import get_sca_policy_details
10
11
 
11
12
  if TYPE_CHECKING:
12
13
  from cycode.cli.models import Detection, LocalScanResult
@@ -82,18 +83,7 @@ class TextPrinter(PrinterBase):
82
83
 
83
84
  @staticmethod
84
85
  def __get_sca_related_summary_lines(detection: 'Detection') -> list[str]:
85
- summary_lines = []
86
-
87
- if detection.has_alert:
88
- patched_version = detection.detection_details['alert'].get('first_patched_version')
89
- patched_version = patched_version or 'Not fixed'
90
-
91
- summary_lines.append(f'First patched version: [cyan]{patched_version}[/]\n')
92
- else:
93
- package_license = detection.detection_details.get('license', 'N/A')
94
- summary_lines.append(f'License: [cyan]{package_license}[/]\n')
95
-
96
- return summary_lines
86
+ return [f'{label}: [cyan]{value}[/]\n' for label, value in get_sca_policy_details(detection)]
97
87
 
98
88
  def __print_detection_code_segment(self, detection: 'Detection', document: Document) -> None:
99
89
  self.console.print(
@@ -0,0 +1,23 @@
1
+ from typing import Any, Optional
2
+
3
+ _MAINTAINED_CHECK_NAME = 'maintained'
4
+
5
+
6
+ def _get_ossf_details(detection_details: dict) -> dict:
7
+ return detection_details.get('ossf') or {}
8
+
9
+
10
+ def get_ossf_score(detection_details: dict) -> Optional[Any]:
11
+ return _get_ossf_details(detection_details).get('score')
12
+
13
+
14
+ def get_ossf_report_url(detection_details: dict) -> Optional[str]:
15
+ return _get_ossf_details(detection_details).get('scorecard_report_url')
16
+
17
+
18
+ def get_maintained_score(detection_details: dict) -> Optional[Any]:
19
+ for check in _get_ossf_details(detection_details).get('checks') or []:
20
+ if str(check.get('name', '')).lower() == _MAINTAINED_CHECK_NAME:
21
+ return check.get('score')
22
+
23
+ return None
@@ -0,0 +1,57 @@
1
+ from typing import TYPE_CHECKING, Callable
2
+
3
+ from cycode.cli.consts import (
4
+ LICENSE_COMPLIANCE_POLICY_ID,
5
+ PACKAGE_VULNERABILITY_POLICY_ID,
6
+ SCA_SCAN_TYPE,
7
+ UNMAINTAINED_PACKAGE_POLICY_ID,
8
+ )
9
+ from cycode.cli.printers.utils.detection_data import get_detection_clickable_cwe_cve
10
+ from cycode.cli.printers.utils.sca_ossf import get_maintained_score, get_ossf_report_url, get_ossf_score
11
+
12
+ if TYPE_CHECKING:
13
+ from cycode.cyclient.models import Detection
14
+
15
+ _NOT_AVAILABLE = 'N/A'
16
+
17
+
18
+ def _package_vulnerability_details(detection: 'Detection') -> list[tuple[str, str]]:
19
+ alert = detection.detection_details.get('alert') or {}
20
+ return [
21
+ ('CVEs', get_detection_clickable_cwe_cve(SCA_SCAN_TYPE, detection) or _NOT_AVAILABLE),
22
+ ('First patched version', alert.get('first_patched_version') or 'Not fixed'),
23
+ ]
24
+
25
+
26
+ def _license_compliance_details(detection: 'Detection') -> list[tuple[str, str]]:
27
+ return [('License', detection.detection_details.get('license') or _NOT_AVAILABLE)]
28
+
29
+
30
+ def _unmaintained_package_details(detection: 'Detection') -> list[tuple[str, str]]:
31
+ detection_details = detection.detection_details
32
+ maintained_score = get_maintained_score(detection_details)
33
+ ossf_score = get_ossf_score(detection_details)
34
+
35
+ return [
36
+ ('Maintained score', _NOT_AVAILABLE if maintained_score is None else str(maintained_score)),
37
+ ('OSSF Scorecard score', _NOT_AVAILABLE if ossf_score is None else str(ossf_score)),
38
+ ('Scorecard report', get_ossf_report_url(detection_details) or _NOT_AVAILABLE),
39
+ ]
40
+
41
+
42
+ _DETAILS_BY_POLICY: dict[str, Callable[['Detection'], list[tuple[str, str]]]] = {
43
+ PACKAGE_VULNERABILITY_POLICY_ID: _package_vulnerability_details,
44
+ LICENSE_COMPLIANCE_POLICY_ID: _license_compliance_details,
45
+ UNMAINTAINED_PACKAGE_POLICY_ID: _unmaintained_package_details,
46
+ }
47
+
48
+
49
+ def get_sca_policy_details(detection: 'Detection') -> list[tuple[str, str]]:
50
+ """Labelled fields specific to the SCA policy that raised the detection, in display order.
51
+
52
+ A policy with no entry contributes nothing rather than borrowing another policy's fields, so a new one shows
53
+ no details until it is added here.
54
+ """
55
+ build_details = _DETAILS_BY_POLICY.get(detection.detection_type_id)
56
+
57
+ return build_details(detection) if build_details else []
@@ -73,6 +73,7 @@ class AISecurityManagerClient:
73
73
  return
74
74
 
75
75
  body = {
76
+ 'id': payload.hook_event_id,
76
77
  'conversation_id': conversation_id,
77
78
  'event_type': event_type,
78
79
  'outcome': outcome,
@@ -21,7 +21,7 @@ classifiers = [
21
21
  "Programming Language :: Python :: 3.14",
22
22
  ]
23
23
  dynamic = ["dependencies"]
24
- version = "3.21.0"
24
+ version = "3.21.1.dev2"
25
25
 
26
26
  [project.scripts]
27
27
  cycode = "cycode.cli.app:app"
File without changes
File without changes
File without changes