cycode 3.22.1.dev3__tar.gz → 3.22.1.dev5__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.22.1.dev3 → cycode-3.22.1.dev5}/PKG-INFO +1 -1
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/__init__.py +1 -1
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/hooks_manager.py +8 -4
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/base.py +1 -20
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/claude_code.py +1 -5
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/codex.py +5 -6
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/copilot.py +2 -17
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/cursor.py +3 -4
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/install_command.py +2 -4
- cycode-3.22.1.dev5/cycode/cli/apps/ai_guardrails/scan/detach.py +71 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/handlers.py +24 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/scan_command.py +8 -1
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/pyproject.toml +2 -2
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/LICENCE +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/README.md +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/__main__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/app.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/activation_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/command_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/consts.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/consts.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/payload.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/policy.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/types.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/session_start_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/status_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/uninstall_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/api/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/api/api_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/api/openapi_spec.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/auth/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/auth/auth_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/auth/auth_common.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/auth/auth_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/auth/models.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/configure/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/configure/configure_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/configure/consts.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/configure/messages.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/configure/prompts.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ignore/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ignore/ignore_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/mcp/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/mcp/mcp_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/report_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/common.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/path/path_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/sbom_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report/sbom/sbom_report_file.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report_import/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report_import/report_import_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report_import/sbom/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report_import/sbom/sbom_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/sca_options.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/aggregation_report.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/code_scanner.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/commit_range_scanner.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/detection_excluder.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/path/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/path/path_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_push/pre_push_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/remote_url_resolver.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/repository/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/repository/repository_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_parameters.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/scan_result.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/status/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/status/get_cli_status.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/status/models.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/status/status_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/status/version_command.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/cli_types.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/config.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/console.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/consts.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/custom_exceptions.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_errors.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_scan_errors.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/commit_range_documents.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/documents_walk_ignore.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/file_excluder.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/iac/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/models/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/path_documents.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/repository_documents.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/base_restore_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/restore_deno_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/restore_pnpm_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/npm/restore_yarn_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/php/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/php/restore_composer_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/python/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/python/restore_pip_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/python/restore_pipenv_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/python/restore_poetry_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/python/restore_uv_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/sca/sca_file_collector.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/walk_ignore.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/zip_documents.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/logger.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/main.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/models.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/console_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/json_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/printer_base.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/rich_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/sca_table_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/table.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/table_models.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/table_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/tables/table_printer_base.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/text_printer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/code_snippet_syntax.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/detection_data.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/rich_helpers.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/sca_ossf.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/printers/utils/sca_policy_details.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/base_file_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/config_file_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/configuration_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/credentials_manager.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/user_settings/jwt_creator.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/binary_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/enum_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/get_api_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/git_proxy.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/host_info.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/ignore_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/jwt_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/path_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/progress_bar.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/scan_batch.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/scan_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/shell_executor.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/string_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/task_timer.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/trust_store.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/url_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/version_checker.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/utils/yaml_utils.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/config.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/__init__.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/ai_security_manager_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/ai_security_manager_service_config.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/auth_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/base_token_auth_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cli_activation_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/client_creator.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/config.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/config_dev.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cycode_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cycode_client_base.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cycode_dev_based_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cycode_oidc_based_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/cycode_token_based_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/headers.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/import_sbom_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/logger.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/models.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/report_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/scan_client.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cyclient/scan_config_base.py +0 -0
- {cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/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.22.1.
|
|
8
|
+
__version__ = '3.22.1.dev5' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
|
@@ -127,16 +127,20 @@ def install_hooks(
|
|
|
127
127
|
ide: IDE,
|
|
128
128
|
scope: str = 'user',
|
|
129
129
|
repo_path: Optional[Path] = None,
|
|
130
|
-
report_mode: bool = False,
|
|
131
130
|
) -> tuple[bool, str]:
|
|
132
131
|
"""Install Cycode AI guardrails hooks for ``ide``."""
|
|
133
132
|
hooks_path = ide.settings_path(scope, repo_path)
|
|
134
133
|
|
|
135
|
-
existing = _load_hooks_file(hooks_path) or {'
|
|
136
|
-
existing.setdefault('version', 1)
|
|
134
|
+
existing = _load_hooks_file(hooks_path) or {'hooks': {}}
|
|
137
135
|
existing.setdefault('hooks', {})
|
|
138
136
|
|
|
139
|
-
rendered = ide.render_hooks_config(
|
|
137
|
+
rendered = ide.render_hooks_config()
|
|
138
|
+
|
|
139
|
+
# Top-level fields come from the IDE's render only - Codex rejects a hooks file
|
|
140
|
+
# with unknown top-level fields, so no `version` may be injected here.
|
|
141
|
+
for key, value in rendered.items():
|
|
142
|
+
if key != 'hooks':
|
|
143
|
+
existing[key] = value
|
|
140
144
|
|
|
141
145
|
for event, entries in rendered['hooks'].items():
|
|
142
146
|
existing['hooks'].setdefault(event, [])
|
|
@@ -14,7 +14,6 @@ event handlers; `IDE.build_hook_response` translates it into the IDE-specific
|
|
|
14
14
|
JSON response shape that the IDE expects on stdout.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
import platform
|
|
18
17
|
from abc import ABC, abstractmethod
|
|
19
18
|
from dataclasses import dataclass
|
|
20
19
|
from enum import Enum
|
|
@@ -25,24 +24,6 @@ from cycode.cli.apps.ai_guardrails.scan.payload import AIHookPayload
|
|
|
25
24
|
from cycode.cli.apps.ai_guardrails.scan.types import AiHookEventType
|
|
26
25
|
|
|
27
26
|
|
|
28
|
-
def shell_background_suffix(async_mode: bool) -> str:
|
|
29
|
-
"""`' &'` when backgrounding is requested and the platform's shell supports it.
|
|
30
|
-
|
|
31
|
-
Only valid for hooks whose runner is stdin-safe under backgrounding (zsh keeps
|
|
32
|
-
a backgrounded command's stdin; verified for Cursor/Codex). bash/sh reattach it
|
|
33
|
-
to /dev/null, silently emptying the payload — hooks that run under bash (e.g.
|
|
34
|
-
Copilot's `bash` field) must add an explicit `<&0` redirect instead.
|
|
35
|
-
|
|
36
|
-
Windows gets no suffix: depending on the IDE, hooks may run under cmd (where a
|
|
37
|
-
trailing `&` is a no-op separator) or Windows PowerShell (where it's a parse
|
|
38
|
-
error that would fail the hook). Until the CLI can self-detach in report mode,
|
|
39
|
-
Windows hooks run synchronously.
|
|
40
|
-
"""
|
|
41
|
-
if not async_mode or platform.system() == 'Windows':
|
|
42
|
-
return ''
|
|
43
|
-
return ' &'
|
|
44
|
-
|
|
45
|
-
|
|
46
27
|
class DecisionAction(str, Enum):
|
|
47
28
|
"""Canonical decision action returned by event handlers."""
|
|
48
29
|
|
|
@@ -118,7 +99,7 @@ class IDE(ABC):
|
|
|
118
99
|
"""
|
|
119
100
|
|
|
120
101
|
@abstractmethod
|
|
121
|
-
def render_hooks_config(self
|
|
102
|
+
def render_hooks_config(self) -> dict:
|
|
122
103
|
"""Return the settings blob to merge into the IDE's settings file.
|
|
123
104
|
|
|
124
105
|
Shape is IDE-specific (Cursor uses a flat ``{event: [{command}]}`` dict;
|
|
@@ -249,12 +249,8 @@ class ClaudeCode(IDE):
|
|
|
249
249
|
return repo_path / _REPO_SUBDIR / _HOOKS_FILE_NAME
|
|
250
250
|
return _USER_HOOKS_DIR / _HOOKS_FILE_NAME
|
|
251
251
|
|
|
252
|
-
def render_hooks_config(self
|
|
253
|
-
# Claude Code uses a nested hook structure with optional async/timeout.
|
|
252
|
+
def render_hooks_config(self) -> dict:
|
|
254
253
|
hook_entry: dict = {'type': 'command', 'command': _SCAN_COMMAND}
|
|
255
|
-
if async_mode:
|
|
256
|
-
hook_entry['async'] = True
|
|
257
|
-
hook_entry['timeout'] = 20
|
|
258
254
|
|
|
259
255
|
return {
|
|
260
256
|
'hooks': {
|
|
@@ -20,7 +20,7 @@ from cycode.cli.apps.ai_guardrails.ides._plugin_utils import (
|
|
|
20
20
|
resolve_cached_plugin_dir,
|
|
21
21
|
walk_enabled_plugins,
|
|
22
22
|
)
|
|
23
|
-
from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
|
|
23
|
+
from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
|
|
24
24
|
from cycode.cli.apps.ai_guardrails.scan.payload import AIHookPayload
|
|
25
25
|
from cycode.cli.apps.ai_guardrails.scan.types import AiHookEventType
|
|
26
26
|
from cycode.cli.utils.jwt_utils import decode_jwt_unverified
|
|
@@ -189,11 +189,10 @@ class Codex(IDE):
|
|
|
189
189
|
return repo_path / _CONFIG_DIR_NAME / _HOOKS_FILE_NAME
|
|
190
190
|
return _codex_home() / _HOOKS_FILE_NAME
|
|
191
191
|
|
|
192
|
-
def render_hooks_config(self
|
|
193
|
-
#
|
|
194
|
-
#
|
|
195
|
-
|
|
196
|
-
scan_cmd = f'{_SCAN_COMMAND}{shell_background_suffix(async_mode)}'
|
|
192
|
+
def render_hooks_config(self) -> dict:
|
|
193
|
+
# SessionStart stays sync so the conversation context is registered
|
|
194
|
+
# before any scan hook fires.
|
|
195
|
+
scan_cmd = _SCAN_COMMAND
|
|
197
196
|
return {
|
|
198
197
|
'hooks': {
|
|
199
198
|
'SessionStart': [
|
|
@@ -379,24 +379,9 @@ class Copilot(IDE):
|
|
|
379
379
|
return repo_path / _REPO_HOOKS_SUBDIR / _HOOKS_FILE_NAME
|
|
380
380
|
return _copilot_home() / 'hooks' / _HOOKS_FILE_NAME
|
|
381
381
|
|
|
382
|
-
def render_hooks_config(self
|
|
382
|
+
def render_hooks_config(self) -> dict:
|
|
383
|
+
# Single cross-platform `command` field, copied to both shells by Copilot.
|
|
383
384
|
def entry(command: str) -> dict:
|
|
384
|
-
if async_mode:
|
|
385
|
-
# Copilot has no async hook flag; background via shell on unix. Both
|
|
386
|
-
# redirects are load-bearing. `<&0` keeps the payload flowing: a bare
|
|
387
|
-
# `cmd &` gets its stdin reattached to /dev/null by the shell (job
|
|
388
|
-
# control is off in hooks), so the scan reads nothing and allows. The
|
|
389
|
-
# stdout redirect is what actually makes it async: the backgrounded
|
|
390
|
-
# child inherits the hook's stdout and the runner waits on that pipe
|
|
391
|
-
# for EOF, so without it the scan blocks the response it was meant to
|
|
392
|
-
# run behind. Windows PowerShell has no trailing-&, so it stays sync.
|
|
393
|
-
return {
|
|
394
|
-
'type': 'command',
|
|
395
|
-
'bash': f'{command} <&0 >/dev/null 2>&1 &',
|
|
396
|
-
'powershell': command,
|
|
397
|
-
'timeoutSec': _HOOK_TIMEOUT_SEC,
|
|
398
|
-
}
|
|
399
|
-
# Single cross-platform `command` field, copied to both shells by Copilot.
|
|
400
385
|
return {'type': 'command', 'command': command, 'timeoutSec': _HOOK_TIMEOUT_SEC}
|
|
401
386
|
|
|
402
387
|
return {
|
|
@@ -7,7 +7,7 @@ from typing import ClassVar, Optional
|
|
|
7
7
|
|
|
8
8
|
from cycode.cli.apps.ai_guardrails.consts import CYCODE_SCAN_PROMPT_COMMAND, CYCODE_SESSION_START_COMMAND
|
|
9
9
|
from cycode.cli.apps.ai_guardrails.ides._plugin_utils import build_global_config_file
|
|
10
|
-
from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
|
|
10
|
+
from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
|
|
11
11
|
from cycode.cli.apps.ai_guardrails.scan.payload import AIHookPayload
|
|
12
12
|
from cycode.cli.apps.ai_guardrails.scan.types import AiHookEventType
|
|
13
13
|
from cycode.logger import get_logger
|
|
@@ -68,9 +68,8 @@ class Cursor(IDE):
|
|
|
68
68
|
return repo_path / _REPO_SUBDIR / _HOOKS_FILE_NAME
|
|
69
69
|
return _user_hooks_dir() / _HOOKS_FILE_NAME
|
|
70
70
|
|
|
71
|
-
def render_hooks_config(self
|
|
72
|
-
|
|
73
|
-
hooks = {event: [{'command': command}] for event in self.hook_events}
|
|
71
|
+
def render_hooks_config(self) -> dict:
|
|
72
|
+
hooks = {event: [{'command': _SCAN_COMMAND}] for event in self.hook_events}
|
|
74
73
|
hooks['sessionStart'] = [{'command': _SESSION_START_COMMAND}]
|
|
75
74
|
return {'version': 1, 'hooks': hooks}
|
|
76
75
|
|
|
@@ -65,11 +65,9 @@ def install_command(
|
|
|
65
65
|
repo_path = resolve_repo_path(scope, repo_path)
|
|
66
66
|
ides_to_install = resolve_ides(ide)
|
|
67
67
|
|
|
68
|
-
report_mode = mode == GuardrailsMode.REPORT
|
|
69
|
-
|
|
70
68
|
results: list[tuple[str, bool, str]] = []
|
|
71
69
|
for current_ide in ides_to_install:
|
|
72
|
-
success, message = install_hooks(current_ide, scope, repo_path
|
|
70
|
+
success, message = install_hooks(current_ide, scope, repo_path)
|
|
73
71
|
results.append((current_ide.display_name, success, message))
|
|
74
72
|
|
|
75
73
|
any_success = False
|
|
@@ -108,6 +106,6 @@ def _print_next_steps(results: list[tuple[str, bool, str]], mode: GuardrailsMode
|
|
|
108
106
|
console.print('2. (Optional) Customize policy in ~/.cycode/ai-guardrails.yaml')
|
|
109
107
|
console.print()
|
|
110
108
|
if mode == GuardrailsMode.REPORT:
|
|
111
|
-
console.print('[dim]Report mode:
|
|
109
|
+
console.print('[dim]Report mode: policy is set to warn.[/]')
|
|
112
110
|
else:
|
|
113
111
|
console.print('[dim]The hooks will scan prompts, file reads, and MCP tool calls for secrets.[/]')
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Self-detach support for report-mode scans.
|
|
2
|
+
|
|
3
|
+
In report mode nobody consumes the hook verdict, so the scan respawns itself
|
|
4
|
+
detached and the parent exits immediately — the IDE is released after roughly
|
|
5
|
+
CLI startup instead of waiting for a full scan. The child's handles are set at
|
|
6
|
+
process-creation time (stdout/stderr to devnull, payload piped to stdin), so it
|
|
7
|
+
never inherits the IDE's pipes: a backgrounded child that shares the hook's
|
|
8
|
+
stdout keeps EOF-waiting runners blocked for the scan's full duration.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
from cycode.logger import get_logger
|
|
16
|
+
|
|
17
|
+
logger = get_logger('AI Guardrails')
|
|
18
|
+
|
|
19
|
+
DETACHED_ENV_VAR = '_CYCODE_DETACHED'
|
|
20
|
+
|
|
21
|
+
# Numeric fallbacks let non-Windows platforms (tests included) build the same flags.
|
|
22
|
+
_WINDOWS_CREATIONFLAGS = (
|
|
23
|
+
getattr(subprocess, 'DETACHED_PROCESS', 0x00000008)
|
|
24
|
+
| getattr(subprocess, 'CREATE_NEW_PROCESS_GROUP', 0x00000200)
|
|
25
|
+
| getattr(subprocess, 'CREATE_NO_WINDOW', 0x08000000)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def is_detached_child() -> bool:
|
|
30
|
+
"""Whether this process is the respawned detached child."""
|
|
31
|
+
return os.environ.get(DETACHED_ENV_VAR) == '1'
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def build_respawn_command() -> list[str]:
|
|
35
|
+
"""The command that re-runs the current invocation.
|
|
36
|
+
|
|
37
|
+
Under PyInstaller sys.executable is the CLI binary itself; otherwise it is
|
|
38
|
+
the Python interpreter and argv[0] is the console script to re-run.
|
|
39
|
+
"""
|
|
40
|
+
if getattr(sys, 'frozen', False):
|
|
41
|
+
return [sys.executable, *sys.argv[1:]]
|
|
42
|
+
return [sys.executable, *sys.argv]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def respawn_detached(stdin_payload: str) -> bool:
|
|
46
|
+
"""Respawn the current command detached, feeding it ``stdin_payload``.
|
|
47
|
+
|
|
48
|
+
Returns False when the respawn failed, so the caller can fall back to the
|
|
49
|
+
synchronous path instead of dropping the event.
|
|
50
|
+
"""
|
|
51
|
+
try:
|
|
52
|
+
detach_kwargs = (
|
|
53
|
+
{'creationflags': _WINDOWS_CREATIONFLAGS} if sys.platform == 'win32' else {'start_new_session': True}
|
|
54
|
+
)
|
|
55
|
+
process = subprocess.Popen( # noqa: S603
|
|
56
|
+
build_respawn_command(),
|
|
57
|
+
stdin=subprocess.PIPE,
|
|
58
|
+
stdout=subprocess.DEVNULL,
|
|
59
|
+
stderr=subprocess.DEVNULL,
|
|
60
|
+
env={**os.environ, DETACHED_ENV_VAR: '1'},
|
|
61
|
+
**detach_kwargs,
|
|
62
|
+
)
|
|
63
|
+
# Hand over the payload and close, then return without waiting - the
|
|
64
|
+
# whole point is that the parent exits while the child scans.
|
|
65
|
+
process.stdin.write(stdin_payload.encode('utf-8'))
|
|
66
|
+
process.stdin.close()
|
|
67
|
+
logger.debug('Respawned detached scan', extra={'child_pid': process.pid})
|
|
68
|
+
return True
|
|
69
|
+
except Exception as e:
|
|
70
|
+
logger.debug('Failed to respawn detached, falling back to synchronous scan', exc_info=e)
|
|
71
|
+
return False
|
|
@@ -318,6 +318,30 @@ def get_effective_mode(policy: dict, feature_config: dict) -> GuardrailsMode:
|
|
|
318
318
|
return GuardrailsMode.BLOCK if (mode == PolicyMode.BLOCK and action == PolicyMode.BLOCK) else GuardrailsMode.REPORT
|
|
319
319
|
|
|
320
320
|
|
|
321
|
+
# The policy section each event's handler reads its feature config from.
|
|
322
|
+
_FEATURE_KEY_BY_EVENT_TYPE: dict[str, str] = {
|
|
323
|
+
AiHookEventType.PROMPT.value: 'prompt',
|
|
324
|
+
AiHookEventType.FILE_READ.value: 'file_read',
|
|
325
|
+
AiHookEventType.MCP_EXECUTION.value: 'mcp',
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def should_detach_scan(policy: dict, event_name: str) -> bool:
|
|
330
|
+
"""Whether this event's scan is safe to run detached.
|
|
331
|
+
|
|
332
|
+
Report mode never blocks, so nobody consumes the verdict. Fail-closed
|
|
333
|
+
configs stay synchronous even in report mode: their deny on scan failure
|
|
334
|
+
must reach the IDE. Unknown events stay synchronous - they exit fast anyway.
|
|
335
|
+
"""
|
|
336
|
+
feature_key = _FEATURE_KEY_BY_EVENT_TYPE.get(event_name)
|
|
337
|
+
if feature_key is None:
|
|
338
|
+
return False
|
|
339
|
+
if not get_policy_value(policy, 'fail_open', default=True):
|
|
340
|
+
return False
|
|
341
|
+
feature_config = get_policy_value(policy, feature_key, default={})
|
|
342
|
+
return get_effective_mode(policy, feature_config) == GuardrailsMode.REPORT
|
|
343
|
+
|
|
344
|
+
|
|
321
345
|
def build_ai_guardrails_scan_parameters(
|
|
322
346
|
ctx: typer.Context,
|
|
323
347
|
paths: Optional[tuple[str, ...]],
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/scan/scan_command.py
RENAMED
|
@@ -15,7 +15,8 @@ import typer
|
|
|
15
15
|
|
|
16
16
|
from cycode.cli.apps.ai_guardrails.ides import DEFAULT_IDE_NAME, get_ide
|
|
17
17
|
from cycode.cli.apps.ai_guardrails.ides.base import HookDecision
|
|
18
|
-
from cycode.cli.apps.ai_guardrails.scan.
|
|
18
|
+
from cycode.cli.apps.ai_guardrails.scan.detach import is_detached_child, respawn_detached
|
|
19
|
+
from cycode.cli.apps.ai_guardrails.scan.handlers import get_handler_for_event, should_detach_scan
|
|
19
20
|
from cycode.cli.apps.ai_guardrails.scan.policy import load_policy
|
|
20
21
|
from cycode.cli.apps.ai_guardrails.scan.types import AiHookEventType
|
|
21
22
|
from cycode.cli.apps.ai_guardrails.scan.utils import output_json, read_stdin_text, safe_json_parse
|
|
@@ -139,6 +140,12 @@ def scan_command(
|
|
|
139
140
|
workspace_roots = payload.get('workspace_roots') or ['.']
|
|
140
141
|
policy = load_policy(workspace_roots[0])
|
|
141
142
|
|
|
143
|
+
# Report mode: nobody consumes the verdict, so hand the scan to a detached
|
|
144
|
+
# child and release the IDE immediately. Runs before any client or network
|
|
145
|
+
# work. A failed respawn falls through to the synchronous path.
|
|
146
|
+
if not is_detached_child() and should_detach_scan(policy, event_name) and respawn_detached(stdin_data):
|
|
147
|
+
return
|
|
148
|
+
|
|
142
149
|
try:
|
|
143
150
|
_initialize_clients(ctx)
|
|
144
151
|
|
|
@@ -21,7 +21,7 @@ classifiers = [
|
|
|
21
21
|
"Programming Language :: Python :: 3.14",
|
|
22
22
|
]
|
|
23
23
|
dynamic = ["dependencies"]
|
|
24
|
-
version = "3.22.1.
|
|
24
|
+
version = "3.22.1.dev5"
|
|
25
25
|
|
|
26
26
|
[project.scripts]
|
|
27
27
|
cycode = "cycode.cli.app:app"
|
|
@@ -59,7 +59,7 @@ anyio = ">=4.0.0, <4.13.0"
|
|
|
59
59
|
[tool.poetry.group.test.dependencies]
|
|
60
60
|
mock = ">=5.2.0,<5.3.0"
|
|
61
61
|
pytest = ">=7.3.1,<8.5.0"
|
|
62
|
-
pytest-mock = ">=3.
|
|
62
|
+
pytest-mock = ">=3.15.1,<3.16.0"
|
|
63
63
|
coverage = ">=7.2.3,<7.11.0"
|
|
64
64
|
responses = ">=0.23.1,<0.27.0"
|
|
65
65
|
pyfakefs = ">=5.7.2,<5.11.0"
|
|
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.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/session_start_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_guardrails/uninstall_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/ai_remediation/ai_remediation_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/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.22.1.dev3 → cycode-3.22.1.dev5}/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.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/report_import/report_import_command.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/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.22.1.dev3 → cycode-3.22.1.dev5}/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.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/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
|
|
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.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_ai_remediation_errors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/exceptions/handle_report_sbom_errors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/commit_range_documents.py
RENAMED
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/documents_walk_ignore.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/iac/tf_content_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{cycode-3.22.1.dev3 → cycode-3.22.1.dev5}/cycode/cli/files_collector/models/in_memory_zip.py
RENAMED
|
File without changes
|