cycode 3.24.1.dev3__tar.gz → 3.24.2.dev1__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.
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/PKG-INFO +1 -1
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/__init__.py +1 -1
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/guardrail_config.py +2 -9
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/handlers.py +59 -52
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_result.py +2 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/models.py +1 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/models.py +4 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/pyproject.toml +1 -1
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/LICENCE +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/README.md +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/__main__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/app.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/activation_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/command_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/consts.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/hooks_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_skill_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/base.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/claude_code.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/codex.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/copilot.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/cursor.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/install_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/consts.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/detach.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/payload.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/policy.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/scan_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/types.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/session_start_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/status_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/uninstall_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/api_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/openapi_spec.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_common.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/models.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/configure_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/consts.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/messages.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/prompts.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ignore/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ignore/ignore_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/mcp/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/mcp/mcp_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/report_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/common.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/path/path_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/sbom_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/sbom_report_file.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/report_import_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/sbom/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/sbom/sbom_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/sca_options.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/aggregation_report.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/code_scanner.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_range_scanner.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/detection_excluder.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/path/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/path/path_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_push/pre_push_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/remote_url_resolver.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/repository/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/repository/repository_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_parameters.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/get_cli_status.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/models.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/status_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/version_command.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/cli_types.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/config.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/console.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/consts.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/custom_exceptions.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_errors.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_scan_errors.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/commit_range_documents.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/documents_walk_ignore.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/file_excluder.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/iac/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/models/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/path_documents.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/repository_documents.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/base_restore_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_deno_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_pnpm_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_yarn_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/php/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/php/restore_composer_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_pip_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_pipenv_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_poetry_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_uv_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sca_file_collector.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/walk_ignore.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/zip_documents.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/logger.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/main.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/console_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/json_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/printer_base.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/rich_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/sca_table_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_models.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_printer_base.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/text_printer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/code_snippet_syntax.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_data.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/rich_helpers.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/sca_ossf.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/sca_policy_details.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/base_file_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/config_file_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/configuration_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/credentials_manager.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/jwt_creator.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/binary_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/enum_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/get_api_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/git_proxy.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/host_info.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/ignore_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/jwt_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/path_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/progress_bar.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/scan_batch.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/scan_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/shell_executor.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/string_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/task_timer.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/trust_store.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/url_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/version_checker.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/yaml_utils.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/config.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/__init__.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/ai_security_manager_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/ai_security_manager_service_config.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/auth_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/base_token_auth_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cli_activation_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/client_creator.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/config.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/config_dev.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_client_base.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_dev_based_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_oidc_based_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_token_based_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/headers.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/import_sbom_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/logger.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/report_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/scan_client.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/scan_config_base.py +0 -0
- {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/logger.py +0 -0
|
@@ -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.24.
|
|
8
|
+
__version__ = '3.24.2.dev1' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/guardrail_config.py
RENAMED
|
@@ -37,19 +37,11 @@ _KNOWN_GUARDRAIL_KEYS = frozenset(
|
|
|
37
37
|
)
|
|
38
38
|
)
|
|
39
39
|
|
|
40
|
-
# CLI --ide names to matrix column names; identity for names not listed.
|
|
41
|
-
_AGENT_BY_IDE_NAME = {'claude-code': 'claude'}
|
|
42
|
-
|
|
43
40
|
|
|
44
41
|
def get_config_cache_path() -> Path:
|
|
45
42
|
return Path.home() / CYCODE_CONFIGURATION_DIRECTORY / GUARDRAILS_CONFIG_FILE_NAME
|
|
46
43
|
|
|
47
44
|
|
|
48
|
-
def agent_for_ide(ide_name: Optional[str]) -> str:
|
|
49
|
-
ide_name = (ide_name or '').lower()
|
|
50
|
-
return _AGENT_BY_IDE_NAME.get(ide_name, ide_name)
|
|
51
|
-
|
|
52
|
-
|
|
53
45
|
def _default_sensitive_globs() -> list:
|
|
54
46
|
return list(DEFAULT_SENSITIVE_PATH_GLOBS)
|
|
55
47
|
|
|
@@ -69,8 +61,9 @@ class GuardrailConfig:
|
|
|
69
61
|
}
|
|
70
62
|
|
|
71
63
|
def mode_for(self, guardrail_key: str, ide_name: Optional[str]) -> str:
|
|
64
|
+
"""The platform keys the cells by our --ide names, so the lookup is direct."""
|
|
72
65
|
agents = (self._guardrails.get(guardrail_key) or {}).get('agents') or {}
|
|
73
|
-
return str(agents.get(
|
|
66
|
+
return str(agents.get((ide_name or '').lower(), GuardrailCellMode.REPORT.value)).lower()
|
|
74
67
|
|
|
75
68
|
def _modes_for_event(self, event_name: str, ide_name: Optional[str]) -> list:
|
|
76
69
|
return [
|
|
@@ -13,7 +13,7 @@ import os
|
|
|
13
13
|
from dataclasses import dataclass
|
|
14
14
|
from multiprocessing.pool import ThreadPool
|
|
15
15
|
from multiprocessing.pool import TimeoutError as PoolTimeoutError
|
|
16
|
-
from typing import TYPE_CHECKING, Callable, Optional
|
|
16
|
+
from typing import TYPE_CHECKING, Callable, NamedTuple, Optional
|
|
17
17
|
|
|
18
18
|
import typer
|
|
19
19
|
|
|
@@ -45,12 +45,32 @@ logger = get_logger('AI Guardrails')
|
|
|
45
45
|
HandlerFn = Callable[[typer.Context, AIHookPayload, dict], HookDecision]
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
class ScanOutcome(NamedTuple):
|
|
49
|
+
"""What one guardrail scan came back with; the verdict is the server's, which applied the tenant's floors."""
|
|
50
|
+
|
|
51
|
+
violation_summary: Optional[str] = None
|
|
52
|
+
scan_id: Optional[str] = None
|
|
53
|
+
verdict: Optional[GuardrailsMode] = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
NO_SCAN = ScanOutcome()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _parse_verdict(verdict: Optional[str]) -> Optional[GuardrailsMode]:
|
|
60
|
+
"""The server spells the verdict "Block"/"Report" and omits it when the scan found nothing to decide on."""
|
|
61
|
+
if not verdict:
|
|
62
|
+
return None
|
|
63
|
+
try:
|
|
64
|
+
return GuardrailsMode(verdict.lower())
|
|
65
|
+
except ValueError:
|
|
66
|
+
logger.debug('Ignoring unknown guardrail verdict, %s', {'verdict': verdict})
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
48
70
|
def handle_before_submit_prompt(ctx: typer.Context, payload: AIHookPayload, policy: dict) -> HookDecision:
|
|
49
71
|
"""Scan prompt text for secrets before it's sent to the AI model."""
|
|
50
72
|
ai_client = ctx.obj['ai_security_client']
|
|
51
73
|
|
|
52
|
-
prompt_config = get_policy_value(policy, 'prompt', default={})
|
|
53
|
-
effective_mode = get_effective_mode(prompt_config)
|
|
54
74
|
prompt = payload.prompt or ''
|
|
55
75
|
max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
|
|
56
76
|
timeout_ms = get_policy_value(policy, 'secrets', 'timeout_ms', default=30000)
|
|
@@ -62,20 +82,20 @@ def handle_before_submit_prompt(ctx: typer.Context, payload: AIHookPayload, poli
|
|
|
62
82
|
error_message = None
|
|
63
83
|
|
|
64
84
|
try:
|
|
65
|
-
|
|
85
|
+
scan_outcome = _scan_text_for_secrets(
|
|
66
86
|
ctx,
|
|
67
87
|
clipped,
|
|
68
88
|
timeout_ms,
|
|
69
89
|
payload=payload,
|
|
70
90
|
event_type=AiHookEventType.PROMPT,
|
|
71
|
-
effective_mode=effective_mode,
|
|
72
91
|
)
|
|
92
|
+
scan_id = scan_outcome.scan_id
|
|
73
93
|
|
|
74
|
-
if violation_summary:
|
|
94
|
+
if scan_outcome.violation_summary:
|
|
75
95
|
block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[AiHookEventType.PROMPT]
|
|
76
|
-
if
|
|
96
|
+
if scan_outcome.verdict == GuardrailsMode.BLOCK:
|
|
77
97
|
outcome = AIHookOutcome.BLOCKED
|
|
78
|
-
user_message = f'Remove secrets before sending. {violation_summary}'
|
|
98
|
+
user_message = f'Remove secrets before sending. {scan_outcome.violation_summary}'
|
|
79
99
|
return HookDecision.deny(AiHookEventType.PROMPT, user_message)
|
|
80
100
|
outcome = AIHookOutcome.WARNED
|
|
81
101
|
return HookDecision.allow(AiHookEventType.PROMPT)
|
|
@@ -104,7 +124,6 @@ def handle_before_read_file(ctx: typer.Context, payload: AIHookPayload, policy:
|
|
|
104
124
|
file_read_config = get_policy_value(policy, 'file_read', default={})
|
|
105
125
|
file_path = payload.file_path or ''
|
|
106
126
|
path_mode = get_effective_mode(file_read_config, action_key='path_action')
|
|
107
|
-
content_mode = get_effective_mode(file_read_config)
|
|
108
127
|
|
|
109
128
|
scan_id = None
|
|
110
129
|
block_reason = None
|
|
@@ -138,21 +157,20 @@ def handle_before_read_file(ctx: typer.Context, payload: AIHookPayload, policy:
|
|
|
138
157
|
outcome = AIHookOutcome.ALLOWED
|
|
139
158
|
|
|
140
159
|
if get_policy_value(file_read_config, 'scan_content', default=True):
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if violation_summary:
|
|
160
|
+
scan_outcome = _scan_path_for_secrets(ctx, file_path, policy, payload=payload)
|
|
161
|
+
scan_id = scan_outcome.scan_id
|
|
162
|
+
if scan_outcome.violation_summary:
|
|
145
163
|
block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[AiHookEventType.FILE_READ]
|
|
146
|
-
if
|
|
164
|
+
if scan_outcome.verdict == GuardrailsMode.BLOCK:
|
|
147
165
|
outcome = AIHookOutcome.BLOCKED
|
|
148
|
-
user_message = f'Cycode blocked reading {file_path}. {violation_summary}'
|
|
166
|
+
user_message = f'Cycode blocked reading {file_path}. {scan_outcome.violation_summary}'
|
|
149
167
|
return HookDecision.deny(
|
|
150
168
|
AiHookEventType.FILE_READ,
|
|
151
169
|
user_message,
|
|
152
170
|
'Secrets detected; do not send this file to the model.',
|
|
153
171
|
)
|
|
154
172
|
outcome = AIHookOutcome.WARNED
|
|
155
|
-
user_message = f'Cycode detected secrets in {file_path}. {violation_summary}'
|
|
173
|
+
user_message = f'Cycode detected secrets in {file_path}. {scan_outcome.violation_summary}'
|
|
156
174
|
return HookDecision.ask(
|
|
157
175
|
AiHookEventType.FILE_READ,
|
|
158
176
|
user_message,
|
|
@@ -192,10 +210,9 @@ class _ArgScanFeature:
|
|
|
192
210
|
"""Configuration for a "scan some text and decide" event.
|
|
193
211
|
|
|
194
212
|
MCP execution and command exec share identical scan-and-decide logic;
|
|
195
|
-
only the
|
|
213
|
+
only the event type and user-facing messages differ.
|
|
196
214
|
"""
|
|
197
215
|
|
|
198
|
-
policy_key: str # 'mcp' or 'command_exec'
|
|
199
216
|
event_type: AiHookEventType
|
|
200
217
|
deny_message: Callable[[str], str]
|
|
201
218
|
deny_agent_message: str
|
|
@@ -213,11 +230,9 @@ def _handle_arg_scan(
|
|
|
213
230
|
"""Shared scan + decision flow for MCP_EXECUTION and COMMAND_EXEC events."""
|
|
214
231
|
ai_client = ctx.obj['ai_security_client']
|
|
215
232
|
|
|
216
|
-
feature_config = get_policy_value(policy, feature.policy_key, default={})
|
|
217
233
|
max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
|
|
218
234
|
timeout_ms = get_policy_value(policy, 'secrets', 'timeout_ms', default=30000)
|
|
219
235
|
clipped = truncate_utf8(scan_text, max_bytes)
|
|
220
|
-
effective_mode = get_effective_mode(feature_config)
|
|
221
236
|
|
|
222
237
|
scan_id = None
|
|
223
238
|
block_reason = None
|
|
@@ -225,27 +240,27 @@ def _handle_arg_scan(
|
|
|
225
240
|
error_message = None
|
|
226
241
|
|
|
227
242
|
try:
|
|
228
|
-
|
|
243
|
+
scan_outcome = _scan_text_for_secrets(
|
|
229
244
|
ctx,
|
|
230
245
|
clipped,
|
|
231
246
|
timeout_ms,
|
|
232
247
|
payload=payload,
|
|
233
248
|
event_type=feature.event_type,
|
|
234
|
-
effective_mode=effective_mode,
|
|
235
249
|
)
|
|
236
|
-
|
|
250
|
+
scan_id = scan_outcome.scan_id
|
|
251
|
+
if scan_outcome.violation_summary:
|
|
237
252
|
block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[feature.event_type]
|
|
238
|
-
if
|
|
253
|
+
if scan_outcome.verdict == GuardrailsMode.BLOCK:
|
|
239
254
|
outcome = AIHookOutcome.BLOCKED
|
|
240
255
|
return HookDecision.deny(
|
|
241
256
|
feature.event_type,
|
|
242
|
-
feature.deny_message(violation_summary),
|
|
257
|
+
feature.deny_message(scan_outcome.violation_summary),
|
|
243
258
|
feature.deny_agent_message,
|
|
244
259
|
)
|
|
245
260
|
outcome = AIHookOutcome.WARNED
|
|
246
261
|
return HookDecision.ask(
|
|
247
262
|
feature.event_type,
|
|
248
|
-
feature.ask_message(violation_summary),
|
|
263
|
+
feature.ask_message(scan_outcome.violation_summary),
|
|
249
264
|
feature.ask_agent_message,
|
|
250
265
|
)
|
|
251
266
|
|
|
@@ -278,7 +293,6 @@ def handle_before_mcp_execution(ctx: typer.Context, payload: AIHookPayload, poli
|
|
|
278
293
|
payload,
|
|
279
294
|
policy,
|
|
280
295
|
_ArgScanFeature(
|
|
281
|
-
policy_key='mcp',
|
|
282
296
|
event_type=AiHookEventType.MCP_EXECUTION,
|
|
283
297
|
deny_message=lambda v: f'Cycode blocked MCP tool call "{tool}". {v}',
|
|
284
298
|
deny_agent_message='Do not pass secrets to tools. Use secret references (name/id) instead.',
|
|
@@ -329,11 +343,9 @@ def build_ai_guardrails_scan_parameters(
|
|
|
329
343
|
paths: Optional[tuple[str, ...]],
|
|
330
344
|
payload: AIHookPayload,
|
|
331
345
|
event_type: AiHookEventType,
|
|
332
|
-
effective_mode: GuardrailsMode,
|
|
333
346
|
) -> dict:
|
|
334
347
|
scan_parameters = get_scan_parameters(ctx, paths)
|
|
335
348
|
scan_parameters.setdefault('metadata', {})['ai_guardrails'] = {
|
|
336
|
-
'mode': effective_mode.value,
|
|
337
349
|
'ide_provider': payload.ide_provider,
|
|
338
350
|
'detection_source': SECRETS_BLOCK_REASON_BY_EVENT_TYPE[event_type].value,
|
|
339
351
|
'device_id': get_serial_number(),
|
|
@@ -360,13 +372,13 @@ def _setup_scan_context(ctx: typer.Context) -> typer.Context:
|
|
|
360
372
|
|
|
361
373
|
def _perform_scan(
|
|
362
374
|
ctx: typer.Context, documents: list[Document], scan_parameters: dict, timeout_seconds: float
|
|
363
|
-
) ->
|
|
364
|
-
"""Run a scan on documents
|
|
375
|
+
) -> ScanOutcome:
|
|
376
|
+
"""Run a scan on documents.
|
|
365
377
|
|
|
366
378
|
Raises on scan failure / timeout so the fail-open policy can take over.
|
|
367
379
|
"""
|
|
368
380
|
if not documents:
|
|
369
|
-
return
|
|
381
|
+
return NO_SCAN
|
|
370
382
|
|
|
371
383
|
scan_batch_thread_func = _get_scan_documents_thread_func(
|
|
372
384
|
ctx, is_git_diff=False, is_commit_range=False, scan_parameters=scan_parameters
|
|
@@ -377,7 +389,7 @@ def _perform_scan(
|
|
|
377
389
|
with ThreadPool(processes=1) as pool:
|
|
378
390
|
result = pool.apply_async(scan_batch_thread_func, (documents,))
|
|
379
391
|
try:
|
|
380
|
-
|
|
392
|
+
_, error, local_scan_result = result.get(timeout=timeout_seconds)
|
|
381
393
|
except PoolTimeoutError:
|
|
382
394
|
logger.debug('Scan timed out after %s seconds', timeout_seconds)
|
|
383
395
|
raise RuntimeError(f'Scan timed out after {timeout_seconds} seconds') from None
|
|
@@ -387,15 +399,14 @@ def _perform_scan(
|
|
|
387
399
|
raise RuntimeError(error.message)
|
|
388
400
|
|
|
389
401
|
if not local_scan_result:
|
|
390
|
-
return
|
|
391
|
-
|
|
392
|
-
scan_id = local_scan_result.scan_id
|
|
402
|
+
return NO_SCAN
|
|
393
403
|
|
|
394
|
-
if local_scan_result.issue_detected
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
404
|
+
violation_summary = build_violation_summary([local_scan_result]) if local_scan_result.issue_detected else None
|
|
405
|
+
return ScanOutcome(
|
|
406
|
+
violation_summary=violation_summary,
|
|
407
|
+
scan_id=local_scan_result.scan_id,
|
|
408
|
+
verdict=_parse_verdict(local_scan_result.verdict),
|
|
409
|
+
)
|
|
399
410
|
|
|
400
411
|
|
|
401
412
|
def _scan_text_for_secrets(
|
|
@@ -404,16 +415,15 @@ def _scan_text_for_secrets(
|
|
|
404
415
|
timeout_ms: int,
|
|
405
416
|
payload: AIHookPayload,
|
|
406
417
|
event_type: AiHookEventType,
|
|
407
|
-
|
|
408
|
-
) -> tuple[Optional[str], Optional[str]]:
|
|
418
|
+
) -> ScanOutcome:
|
|
409
419
|
"""Scan text content for secrets using Cycode CLI."""
|
|
410
420
|
if not text:
|
|
411
|
-
return
|
|
421
|
+
return NO_SCAN
|
|
412
422
|
|
|
413
423
|
document = Document(path='prompt-content.txt', content=text, is_git_diff_format=False)
|
|
414
424
|
scan_ctx = _setup_scan_context(ctx)
|
|
415
425
|
timeout_seconds = timeout_ms / 1000.0
|
|
416
|
-
scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, None, payload, event_type
|
|
426
|
+
scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, None, payload, event_type)
|
|
417
427
|
return _perform_scan(scan_ctx, [document], scan_parameters, timeout_seconds)
|
|
418
428
|
|
|
419
429
|
|
|
@@ -422,15 +432,14 @@ def _scan_path_for_secrets(
|
|
|
422
432
|
file_path: str,
|
|
423
433
|
policy: dict,
|
|
424
434
|
payload: AIHookPayload,
|
|
425
|
-
|
|
426
|
-
) -> tuple[Optional[str], Optional[str]]:
|
|
435
|
+
) -> ScanOutcome:
|
|
427
436
|
"""Scan a file path for secrets."""
|
|
428
437
|
if not file_path or not os.path.isfile(file_path):
|
|
429
|
-
return
|
|
438
|
+
return NO_SCAN
|
|
430
439
|
|
|
431
440
|
if is_path_configured_in_exclusions(str(ScanTypeOption.SECRET), os.path.abspath(file_path)):
|
|
432
441
|
logger.debug('Skipping scan; the path is in the ignore paths list, %s', {'file_path': file_path})
|
|
433
|
-
return
|
|
442
|
+
return NO_SCAN
|
|
434
443
|
|
|
435
444
|
max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
|
|
436
445
|
|
|
@@ -442,7 +451,5 @@ def _scan_path_for_secrets(
|
|
|
442
451
|
|
|
443
452
|
document = Document(path=os.path.basename(file_path), content=content, is_git_diff_format=False)
|
|
444
453
|
scan_ctx = _setup_scan_context(ctx)
|
|
445
|
-
scan_parameters = build_ai_guardrails_scan_parameters(
|
|
446
|
-
scan_ctx, (file_path,), payload, AiHookEventType.FILE_READ, effective_mode
|
|
447
|
-
)
|
|
454
|
+
scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, (file_path,), payload, AiHookEventType.FILE_READ)
|
|
448
455
|
return _perform_scan(scan_ctx, [document], scan_parameters, timeout_seconds)
|
|
@@ -79,6 +79,7 @@ def create_local_scan_result(
|
|
|
79
79
|
issue_detected=len(relevant_document_detections_list) > 0,
|
|
80
80
|
detections_count=detections_count,
|
|
81
81
|
relevant_detections_count=relevant_detections_count,
|
|
82
|
+
verdict=scan_result.verdict,
|
|
82
83
|
)
|
|
83
84
|
|
|
84
85
|
|
|
@@ -170,6 +171,7 @@ def get_sync_scan_result(scan_type: str, scan_results: 'ScanResultsSyncFlow') ->
|
|
|
170
171
|
did_detect=True,
|
|
171
172
|
detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_results.detection_messages),
|
|
172
173
|
scan_id=scan_results.id,
|
|
174
|
+
verdict=scan_results.verdict,
|
|
173
175
|
)
|
|
174
176
|
|
|
175
177
|
|
|
@@ -76,6 +76,7 @@ class ZippedFileScanResult(Schema):
|
|
|
76
76
|
report_url: Optional[str] = None,
|
|
77
77
|
scan_id: Optional[str] = None,
|
|
78
78
|
err: Optional[str] = None,
|
|
79
|
+
verdict: Optional[str] = None,
|
|
79
80
|
) -> None:
|
|
80
81
|
super().__init__()
|
|
81
82
|
self.did_detect = did_detect
|
|
@@ -83,6 +84,7 @@ class ZippedFileScanResult(Schema):
|
|
|
83
84
|
self.scan_id = scan_id
|
|
84
85
|
self.report_url = report_url
|
|
85
86
|
self.err = err
|
|
87
|
+
self.verdict = verdict
|
|
86
88
|
|
|
87
89
|
|
|
88
90
|
class ScanResult(Schema):
|
|
@@ -506,6 +508,7 @@ class DetectionRuleSchema(Schema):
|
|
|
506
508
|
class ScanResultsSyncFlow:
|
|
507
509
|
id: str
|
|
508
510
|
detection_messages: list[dict]
|
|
511
|
+
verdict: Optional[str] = None
|
|
509
512
|
|
|
510
513
|
|
|
511
514
|
class ScanResultsSyncFlowSchema(Schema):
|
|
@@ -514,6 +517,7 @@ class ScanResultsSyncFlowSchema(Schema):
|
|
|
514
517
|
|
|
515
518
|
id = fields.String()
|
|
516
519
|
detection_messages = fields.List(fields.Dict())
|
|
520
|
+
verdict = fields.String(allow_none=True, load_default=None)
|
|
517
521
|
|
|
518
522
|
@post_load
|
|
519
523
|
def build_dto(self, data: dict[str, Any], **_) -> ScanResultsSyncFlow:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py
RENAMED
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_skill_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/scan_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/session_start_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/uninstall_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/ai_remediation_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/print_remediation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/repository_url/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/report_import_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/sbom/sbom_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/repository/repository_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|