cycode 3.25.2.dev1__tar.gz → 3.25.2.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.
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/PKG-INFO +12 -19
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/README.md +2 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/__init__.py +1 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/app.py +9 -10
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/activation_manager.py +6 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/command_utils.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/hooks_manager.py +6 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py +6 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/_skill_utils.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/base.py +9 -11
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/claude_code.py +14 -14
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/codex.py +11 -11
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/copilot.py +7 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/cursor.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/install_command.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/guardrail_config.py +10 -11
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/handlers.py +15 -14
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/mcp_server_status.py +6 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/payload.py +13 -14
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/policy.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/scan_command.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/session_start_command.py +8 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/status_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/uninstall_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/api/__init__.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/api/api_command.py +6 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/api/openapi_spec.py +4 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/auth/auth_common.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/configure/configure_command.py +2 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/configure/messages.py +2 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/configure/prompts.py +5 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ignore/ignore_command.py +7 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/mcp/mcp_command.py +11 -11
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/common.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/sbom_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/sbom_report_file.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report_import/sbom/sbom_command.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/sca_options.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/aggregation_report.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/code_scanner.py +8 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/commit_range_scanner.py +10 -10
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/detection_excluder.py +2 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_push/pre_push_command.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/remote_url_resolver.py +6 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/repository/repository_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_command.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_parameters.py +1 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_result.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/console.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/custom_exceptions.py +1 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/handle_errors.py +1 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/handle_scan_errors.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/commit_range_documents.py +14 -14
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/models/in_memory_zip.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/repository_documents.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/base_restore_dependencies.py +7 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +3 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py +3 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/restore_deno_dependencies.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/restore_pnpm_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/restore_yarn_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/coverage.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/files.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/globs.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/resolvers.py +14 -16
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/php/restore_composer_dependencies.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/python/restore_pip_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/python/restore_pipenv_dependencies.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/python/restore_poetry_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/python/restore_uv_dependencies.py +2 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/sca_file_collector.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/zip_documents.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/models.py +8 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/console_printer.py +9 -9
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/json_printer.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/printer_base.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/rich_printer.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/table.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/table_models.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/table_printer_base.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/text_printer.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/code_snippet_syntax.py +1 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/detection_data.py +3 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/sca_ossf.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/sca_policy_details.py +2 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/config_file_manager.py +10 -10
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/configuration_manager.py +6 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/credentials_manager.py +5 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/get_api_client.py +5 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/git_proxy.py +8 -8
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/host_info.py +21 -38
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/ignore_utils.py +13 -15
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/jwt_utils.py +2 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/path_utils.py +6 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/progress_bar.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/scan_batch.py +2 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/scan_utils.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/shell_executor.py +3 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/task_timer.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/trust_store.py +0 -17
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/url_utils.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/version_checker.py +4 -5
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/yaml_utils.py +1 -1
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/config.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/ai_security_manager_client.py +17 -17
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/auth_client.py +2 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/base_token_auth_client.py +2 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/client_creator.py +4 -6
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cycode_client_base.py +10 -9
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cycode_dev_based_client.py +1 -3
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/headers.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/import_sbom_client.py +3 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/models.py +33 -33
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/report_client.py +1 -2
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/scan_client.py +8 -7
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/logger.py +4 -4
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/pyproject.toml +15 -17
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/LICENCE +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/__main__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/consts.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/consts.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/detach.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/types.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/scan/utils.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/auth/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/auth/auth_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/auth/auth_manager.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/auth/models.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/configure/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/configure/consts.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ignore/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/mcp/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/report_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/path/path_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report_import/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report_import/report_import_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/report_import/sbom/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/path/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/path/path_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/repository/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/status/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/status/get_cli_status.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/status/models.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/status/status_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/status/version_command.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/cli_types.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/config.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/consts.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/documents_walk_ignore.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/file_excluder.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/iac/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/models/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/path_documents.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/npm/workspace/names.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/php/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/python/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/files_collector/walk_ignore.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/logger.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/main.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/sca_table_printer.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/tables/table_printer.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/printers/utils/rich_helpers.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/base_file_manager.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/user_settings/jwt_creator.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/binary_utils.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/enum_utils.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/utils/string_utils.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/__init__.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/ai_security_manager_service_config.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cli_activation_client.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/config.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/config_dev.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cycode_client.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cycode_oidc_based_client.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/cycode_token_based_client.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/logger.py +0 -0
- {cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cyclient/scan_config_base.py +0 -0
|
@@ -1,46 +1,45 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cycode
|
|
3
|
-
Version: 3.25.2.
|
|
3
|
+
Version: 3.25.2.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
|
|
7
7
|
Keywords: secret-scan,cycode,devops,token,secret,security,code
|
|
8
8
|
Author: Cycode
|
|
9
9
|
Author-email: support@cycode.com
|
|
10
|
-
Requires-Python: >=3.
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Environment :: Console
|
|
13
13
|
Classifier: Natural Language :: English
|
|
14
14
|
Classifier: Operating System :: OS Independent
|
|
15
15
|
Classifier: Programming Language :: Python
|
|
16
16
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.14
|
|
23
|
-
Requires-Dist: anyio (>=4.
|
|
22
|
+
Requires-Dist: anyio (>=4.14.2,<5.0.0)
|
|
24
23
|
Requires-Dist: arrow (>=1.0.0,<1.5.0)
|
|
25
24
|
Requires-Dist: click (>=8.1.0,<8.2.0)
|
|
26
25
|
Requires-Dist: colorama (>=0.4.3,<0.5.0)
|
|
27
26
|
Requires-Dist: gitpython (>=3.1.62,<3.2.0)
|
|
28
|
-
Requires-Dist: marshmallow (>=4.
|
|
29
|
-
Requires-Dist: mcp (>=1.28.1,<2.0.0)
|
|
27
|
+
Requires-Dist: marshmallow (>=4.1.2,<5.0.0)
|
|
28
|
+
Requires-Dist: mcp (>=1.28.1,<2.0.0)
|
|
30
29
|
Requires-Dist: patch-ng (==1.19.1)
|
|
31
30
|
Requires-Dist: pathvalidate (>=3.3.1,<4.0.0)
|
|
32
31
|
Requires-Dist: pydantic (>=2.11.5,<3.0.0)
|
|
33
|
-
Requires-Dist: pyjwt (>=2.
|
|
34
|
-
Requires-Dist: pywin32 (>=312,<313) ;
|
|
32
|
+
Requires-Dist: pyjwt (>=2.15.0,<3.0)
|
|
33
|
+
Requires-Dist: pywin32 (>=312,<313) ; sys_platform == "win32"
|
|
35
34
|
Requires-Dist: pyyaml (>=6.0,<7.0)
|
|
36
|
-
Requires-Dist: requests (>=2.
|
|
35
|
+
Requires-Dist: requests (>=2.33.0,<3.0)
|
|
37
36
|
Requires-Dist: rich (>=15.0.0,<16.0.0)
|
|
38
37
|
Requires-Dist: tenacity (>=9.1.2,<9.2.0)
|
|
39
38
|
Requires-Dist: tomli (>=2.0.0,<3.0.0) ; python_version < "3.11"
|
|
40
39
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
|
41
|
-
Requires-Dist: truststore (>=0.10.4,<0.11.0)
|
|
40
|
+
Requires-Dist: truststore (>=0.10.4,<0.11.0)
|
|
42
41
|
Requires-Dist: typer (>=0.15.3,<0.16.0)
|
|
43
|
-
Requires-Dist: urllib3 (>=2.
|
|
42
|
+
Requires-Dist: urllib3 (>=2.8.0,<3.0.0)
|
|
44
43
|
Project-URL: Repository, https://github.com/cycodehq/cycode-cli
|
|
45
44
|
Description-Content-Type: text/markdown
|
|
46
45
|
|
|
@@ -120,7 +119,7 @@ This guide walks you through both installation and usage.
|
|
|
120
119
|
|
|
121
120
|
# Prerequisites
|
|
122
121
|
|
|
123
|
-
- The Cycode CLI application requires Python version 3.
|
|
122
|
+
- The Cycode CLI application requires Python version 3.10 or later.
|
|
124
123
|
- Use the [`cycode auth` command](#using-the-auth-command) to authenticate to Cycode with the CLI
|
|
125
124
|
- Alternatively, you can get a Cycode Client ID and Client Secret Key by following the steps detailed in the [Service Account Token](https://docs.cycode.com/docs/en/service-accounts) and [Personal Access Token](https://docs.cycode.com/v1/docs/managing-personal-access-tokens) pages, which contain details on getting these values.
|
|
126
125
|
|
|
@@ -292,7 +291,7 @@ Perform the following steps to install the pre-commit hook:
|
|
|
292
291
|
|
|
293
292
|
### Installing Pre-Commit Hook
|
|
294
293
|
|
|
295
|
-
1. Install the pre-commit framework (Python 3.
|
|
294
|
+
1. Install the pre-commit framework (Python 3.10 or higher must be installed):
|
|
296
295
|
|
|
297
296
|
```bash
|
|
298
297
|
pip3 install pre-commit
|
|
@@ -441,9 +440,6 @@ The two options combine: with `CYCODE_CLI_ENABLE_TRUSTSTORE=1`, certificates fro
|
|
|
441
440
|
|
|
442
441
|
Notes:
|
|
443
442
|
|
|
444
|
-
- `CYCODE_CLI_ENABLE_TRUSTSTORE` requires Python 3.10 or newer. On Python 3.9 the CLI logs a warning
|
|
445
|
-
and falls back to the bundled CA bundle; use `REQUESTS_CA_BUNDLE` instead, or upgrade Python. The
|
|
446
|
-
standalone executables and the Docker image already ship a supported Python.
|
|
447
443
|
- On Windows, the CLI has always fallen back to the system certificate store when neither
|
|
448
444
|
`REQUESTS_CA_BUNDLE` nor `CURL_CA_BUNDLE` is set. That behavior is unchanged.
|
|
449
445
|
- Proxies themselves are configured with the standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY`
|
|
@@ -451,9 +447,6 @@ Notes:
|
|
|
451
447
|
|
|
452
448
|
# MCP Command \[EXPERIMENT\]
|
|
453
449
|
|
|
454
|
-
> [!WARNING]
|
|
455
|
-
> The MCP command is available only for Python 3.10 and above. If you're using an earlier Python version, this command will not be available.
|
|
456
|
-
|
|
457
450
|
The Model Context Protocol (MCP) command allows you to start an MCP server that exposes Cycode's scanning capabilities to AI systems and applications. This enables AI models to interact with Cycode CLI tools via a standardized protocol.
|
|
458
451
|
|
|
459
452
|
> [!TIP]
|
|
@@ -74,7 +74,7 @@ This guide walks you through both installation and usage.
|
|
|
74
74
|
|
|
75
75
|
# Prerequisites
|
|
76
76
|
|
|
77
|
-
- The Cycode CLI application requires Python version 3.
|
|
77
|
+
- The Cycode CLI application requires Python version 3.10 or later.
|
|
78
78
|
- Use the [`cycode auth` command](#using-the-auth-command) to authenticate to Cycode with the CLI
|
|
79
79
|
- Alternatively, you can get a Cycode Client ID and Client Secret Key by following the steps detailed in the [Service Account Token](https://docs.cycode.com/docs/en/service-accounts) and [Personal Access Token](https://docs.cycode.com/v1/docs/managing-personal-access-tokens) pages, which contain details on getting these values.
|
|
80
80
|
|
|
@@ -246,7 +246,7 @@ Perform the following steps to install the pre-commit hook:
|
|
|
246
246
|
|
|
247
247
|
### Installing Pre-Commit Hook
|
|
248
248
|
|
|
249
|
-
1. Install the pre-commit framework (Python 3.
|
|
249
|
+
1. Install the pre-commit framework (Python 3.10 or higher must be installed):
|
|
250
250
|
|
|
251
251
|
```bash
|
|
252
252
|
pip3 install pre-commit
|
|
@@ -395,9 +395,6 @@ The two options combine: with `CYCODE_CLI_ENABLE_TRUSTSTORE=1`, certificates fro
|
|
|
395
395
|
|
|
396
396
|
Notes:
|
|
397
397
|
|
|
398
|
-
- `CYCODE_CLI_ENABLE_TRUSTSTORE` requires Python 3.10 or newer. On Python 3.9 the CLI logs a warning
|
|
399
|
-
and falls back to the bundled CA bundle; use `REQUESTS_CA_BUNDLE` instead, or upgrade Python. The
|
|
400
|
-
standalone executables and the Docker image already ship a supported Python.
|
|
401
398
|
- On Windows, the CLI has always fallen back to the system certificate store when neither
|
|
402
399
|
`REQUESTS_CA_BUNDLE` nor `CURL_CA_BUNDLE` is set. That behavior is unchanged.
|
|
403
400
|
- Proxies themselves are configured with the standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY`
|
|
@@ -405,9 +402,6 @@ Notes:
|
|
|
405
402
|
|
|
406
403
|
# MCP Command \[EXPERIMENT\]
|
|
407
404
|
|
|
408
|
-
> [!WARNING]
|
|
409
|
-
> The MCP command is available only for Python 3.10 and above. If you're using an earlier Python version, this command will not be available.
|
|
410
|
-
|
|
411
405
|
The Model Context Protocol (MCP) command allows you to start an MCP server that exposes Cycode's scanning capabilities to AI systems and applications. This enables AI models to interact with Cycode CLI tools via a standardized protocol.
|
|
412
406
|
|
|
413
407
|
> [!TIP]
|
|
@@ -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.25.2.
|
|
8
|
+
__version__ = '3.25.2.dev2' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import importlib
|
|
2
2
|
import logging
|
|
3
3
|
import sys
|
|
4
|
-
from typing import Annotated
|
|
4
|
+
from typing import Annotated
|
|
5
5
|
|
|
6
6
|
import click
|
|
7
7
|
import typer
|
|
@@ -51,13 +51,12 @@ _SUBAPP_MODULES: dict[str, str] = {
|
|
|
51
51
|
'auth': 'cycode.cli.apps.auth',
|
|
52
52
|
'configure': 'cycode.cli.apps.configure',
|
|
53
53
|
'ignore': 'cycode.cli.apps.ignore',
|
|
54
|
+
'mcp': 'cycode.cli.apps.mcp',
|
|
54
55
|
'report': 'cycode.cli.apps.report',
|
|
55
56
|
'import': 'cycode.cli.apps.report_import',
|
|
56
57
|
'scan': 'cycode.cli.apps.scan',
|
|
57
58
|
'status': 'cycode.cli.apps.status',
|
|
58
59
|
}
|
|
59
|
-
if sys.version_info >= (3, 10):
|
|
60
|
-
_SUBAPP_MODULES['mcp'] = 'cycode.cli.apps.mcp'
|
|
61
60
|
|
|
62
61
|
# Aliases: alternate spellings that resolve to a primary subcommand key.
|
|
63
62
|
_SUBAPP_ALIASES: dict[str, str] = {
|
|
@@ -80,7 +79,7 @@ _ROOT_OPTS_WITH_VALUE = frozenset(
|
|
|
80
79
|
)
|
|
81
80
|
|
|
82
81
|
|
|
83
|
-
def _detect_invocation() -> tuple[
|
|
82
|
+
def _detect_invocation() -> tuple[str | None, str | None]:
|
|
84
83
|
"""Return (top-level-subapp, second-level-subcommand) parsed from sys.argv.
|
|
85
84
|
|
|
86
85
|
Both values may be None: when no positional arg matches a known subapp,
|
|
@@ -113,7 +112,7 @@ def _detect_invocation() -> tuple[Optional[str], Optional[str]]:
|
|
|
113
112
|
_INVOKED_SUBAPP, _INVOKED_SUBCOMMAND = _detect_invocation()
|
|
114
113
|
|
|
115
114
|
|
|
116
|
-
def _register_subapps(only:
|
|
115
|
+
def _register_subapps(only: str | None) -> None:
|
|
117
116
|
if only is not None:
|
|
118
117
|
app.add_typer(importlib.import_module(_SUBAPP_MODULES[only]).app)
|
|
119
118
|
return
|
|
@@ -189,32 +188,32 @@ def app_callback(
|
|
|
189
188
|
OutputTypeOption, typer.Option('--output', '-o', case_sensitive=False, help='Specify the output type.')
|
|
190
189
|
] = OutputTypeOption.RICH,
|
|
191
190
|
user_agent: Annotated[
|
|
192
|
-
|
|
191
|
+
str | None,
|
|
193
192
|
typer.Option(hidden=True, help='Characteristic JSON object that lets servers identify the application.'),
|
|
194
193
|
] = None,
|
|
195
194
|
client_secret: Annotated[
|
|
196
|
-
|
|
195
|
+
str | None,
|
|
197
196
|
typer.Option(
|
|
198
197
|
help='Specify a Cycode client secret for this specific scan execution.',
|
|
199
198
|
rich_help_panel=_AUTH_RICH_HELP_PANEL,
|
|
200
199
|
),
|
|
201
200
|
] = None,
|
|
202
201
|
client_id: Annotated[
|
|
203
|
-
|
|
202
|
+
str | None,
|
|
204
203
|
typer.Option(
|
|
205
204
|
help='Specify a Cycode client ID for this specific scan execution.',
|
|
206
205
|
rich_help_panel=_AUTH_RICH_HELP_PANEL,
|
|
207
206
|
),
|
|
208
207
|
] = None,
|
|
209
208
|
id_token: Annotated[
|
|
210
|
-
|
|
209
|
+
str | None,
|
|
211
210
|
typer.Option(
|
|
212
211
|
help='Specify a Cycode OIDC ID token for this specific scan execution.',
|
|
213
212
|
rich_help_panel=_AUTH_RICH_HELP_PANEL,
|
|
214
213
|
),
|
|
215
214
|
] = None,
|
|
216
215
|
_: Annotated[
|
|
217
|
-
|
|
216
|
+
bool | None,
|
|
218
217
|
typer.Option(
|
|
219
218
|
'--install-completion',
|
|
220
219
|
callback=install_callback,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
2
|
|
|
3
3
|
from cycode import __version__
|
|
4
4
|
from cycode.cli.config import configuration_manager
|
|
@@ -13,13 +13,13 @@ logger = get_logger('Activation Manager')
|
|
|
13
13
|
_CLI_CLIENT_NAME = 'cli'
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def _get_client_and_version(plugin_app_name:
|
|
16
|
+
def _get_client_and_version(plugin_app_name: str | None, plugin_app_version: str | None) -> tuple[str, str]:
|
|
17
17
|
return plugin_app_name or _CLI_CLIENT_NAME, plugin_app_version or __version__
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def should_report_cli_activation(
|
|
21
|
-
plugin_app_name:
|
|
22
|
-
plugin_app_version:
|
|
21
|
+
plugin_app_name: str | None = None,
|
|
22
|
+
plugin_app_version: str | None = None,
|
|
23
23
|
) -> bool:
|
|
24
24
|
client, version = _get_client_and_version(plugin_app_name, plugin_app_version)
|
|
25
25
|
return configuration_manager.get_last_reported_activation_version(client) != version
|
|
@@ -27,8 +27,8 @@ def should_report_cli_activation(
|
|
|
27
27
|
|
|
28
28
|
def report_cli_activation(
|
|
29
29
|
cycode_client: 'CycodeClientBase',
|
|
30
|
-
plugin_app_name:
|
|
31
|
-
plugin_app_version:
|
|
30
|
+
plugin_app_name: str | None = None,
|
|
31
|
+
plugin_app_version: str | None = None,
|
|
32
32
|
) -> None:
|
|
33
33
|
"""Report CLI/IDE activation to the backend if the (client, version) pair is new.
|
|
34
34
|
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
import typer
|
|
8
7
|
from rich.console import Console
|
|
@@ -18,7 +17,7 @@ def validate_scope(scope: str, allowed_scopes: tuple[str, ...] = ('user', 'repo'
|
|
|
18
17
|
raise typer.Exit(1)
|
|
19
18
|
|
|
20
19
|
|
|
21
|
-
def resolve_repo_path(scope: str, repo_path:
|
|
20
|
+
def resolve_repo_path(scope: str, repo_path: Path | None) -> Path | None:
|
|
22
21
|
"""Default repo_path to cwd for 'repo' scope; leave None for 'user' scope."""
|
|
23
22
|
if scope == 'repo' and repo_path is None:
|
|
24
23
|
return Path(os.getcwd())
|
|
@@ -8,7 +8,6 @@ agent-agnostic.
|
|
|
8
8
|
import copy
|
|
9
9
|
import json
|
|
10
10
|
from pathlib import Path
|
|
11
|
-
from typing import Optional
|
|
12
11
|
|
|
13
12
|
import yaml
|
|
14
13
|
|
|
@@ -47,7 +46,7 @@ def is_cycode_hook_entry(entry: dict) -> bool:
|
|
|
47
46
|
return False
|
|
48
47
|
|
|
49
48
|
|
|
50
|
-
def _strip_cycode_from_entry(entry: dict) ->
|
|
49
|
+
def _strip_cycode_from_entry(entry: dict) -> dict | None:
|
|
51
50
|
"""Remove Cycode hooks from ``entry`` and return the remainder.
|
|
52
51
|
|
|
53
52
|
Returns ``None`` when nothing useful remains (Cursor-flat Cycode entry, or
|
|
@@ -72,7 +71,7 @@ def _strip_cycode_from_entry(entry: dict) -> Optional[dict]:
|
|
|
72
71
|
return entry
|
|
73
72
|
|
|
74
73
|
|
|
75
|
-
def _load_hooks_file(hooks_path: Path) ->
|
|
74
|
+
def _load_hooks_file(hooks_path: Path) -> dict | None:
|
|
76
75
|
if not hooks_path.exists():
|
|
77
76
|
return None
|
|
78
77
|
try:
|
|
@@ -102,7 +101,7 @@ def _load_policy_dict(policy_path: Path) -> dict:
|
|
|
102
101
|
return {**copy.deepcopy(DEFAULT_POLICY), **existing}
|
|
103
102
|
|
|
104
103
|
|
|
105
|
-
def create_policy_file(scope: str, repo_path:
|
|
104
|
+
def create_policy_file(scope: str, repo_path: Path | None = None) -> tuple[bool, str]:
|
|
106
105
|
"""Create or update the ai-guardrails.yaml policy file (operational knobs only).
|
|
107
106
|
|
|
108
107
|
Enforcement mode and sensitive-path globs are platform-managed; those keys are stripped
|
|
@@ -125,7 +124,7 @@ def create_policy_file(scope: str, repo_path: Optional[Path] = None) -> tuple[bo
|
|
|
125
124
|
def install_hooks(
|
|
126
125
|
ide: IDE,
|
|
127
126
|
scope: str = 'user',
|
|
128
|
-
repo_path:
|
|
127
|
+
repo_path: Path | None = None,
|
|
129
128
|
) -> tuple[bool, str]:
|
|
130
129
|
"""Install Cycode AI guardrails hooks for ``ide``."""
|
|
131
130
|
hooks_path = ide.settings_path(scope, repo_path)
|
|
@@ -197,7 +196,7 @@ def _persist_uninstall(hooks_path: Path, existing: dict, modified: bool) -> tupl
|
|
|
197
196
|
return True, f'Cycode hooks removed from: {hooks_path}'
|
|
198
197
|
|
|
199
198
|
|
|
200
|
-
def uninstall_hooks(ide: IDE, scope: str = 'user', repo_path:
|
|
199
|
+
def uninstall_hooks(ide: IDE, scope: str = 'user', repo_path: Path | None = None) -> tuple[bool, str]:
|
|
201
200
|
"""Remove Cycode AI guardrails hooks for ``ide``."""
|
|
202
201
|
hooks_path = ide.settings_path(scope, repo_path)
|
|
203
202
|
|
|
@@ -218,7 +217,7 @@ def uninstall_hooks(ide: IDE, scope: str = 'user', repo_path: Optional[Path] = N
|
|
|
218
217
|
return True, message
|
|
219
218
|
|
|
220
219
|
|
|
221
|
-
def get_hooks_status(ide: IDE, scope: str = 'user', repo_path:
|
|
220
|
+
def get_hooks_status(ide: IDE, scope: str = 'user', repo_path: Path | None = None) -> dict:
|
|
222
221
|
"""Return installation status of Cycode hooks for ``ide``."""
|
|
223
222
|
hooks_path = ide.settings_path(scope, repo_path)
|
|
224
223
|
|
{cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py
RENAMED
|
@@ -7,15 +7,16 @@ supplies the two callables that vary (``locate_dir`` + ``read_plugin``).
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
+
from collections.abc import Callable
|
|
10
11
|
from pathlib import Path
|
|
11
|
-
from typing import Any
|
|
12
|
+
from typing import Any
|
|
12
13
|
|
|
13
14
|
from cycode.logger import get_logger
|
|
14
15
|
|
|
15
16
|
logger = get_logger('AI Guardrails Plugins')
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
def resolve_cached_plugin_dir(cache_root: Path, marketplace: str, plugin_name: str) ->
|
|
19
|
+
def resolve_cached_plugin_dir(cache_root: Path, marketplace: str, plugin_name: str) -> Path | None:
|
|
19
20
|
"""Find ``<cache_root>/<marketplace>/<plugin>/<version-or-hash>/``.
|
|
20
21
|
|
|
21
22
|
Both Claude Code and Codex cache installed plugin content in this layout (the trailing
|
|
@@ -31,7 +32,7 @@ def resolve_cached_plugin_dir(cache_root: Path, marketplace: str, plugin_name: s
|
|
|
31
32
|
return max(candidates, key=lambda d: (d.stat().st_mtime, d.name))
|
|
32
33
|
|
|
33
34
|
|
|
34
|
-
def load_plugin_json(path: Path) ->
|
|
35
|
+
def load_plugin_json(path: Path) -> dict | None:
|
|
35
36
|
"""Load a JSON file inside a plugin directory; None if missing or invalid."""
|
|
36
37
|
if not path.exists():
|
|
37
38
|
return None
|
|
@@ -42,7 +43,7 @@ def load_plugin_json(path: Path) -> Optional[dict]:
|
|
|
42
43
|
return None
|
|
43
44
|
|
|
44
45
|
|
|
45
|
-
def build_global_config_files(path: Path, mcp_servers:
|
|
46
|
+
def build_global_config_files(path: Path, mcp_servers: dict | None) -> list[dict]:
|
|
46
47
|
"""Wrap a global (non-plugin) MCP config into the session-context file shape.
|
|
47
48
|
|
|
48
49
|
Returns ``[{"path": <full path>, "content": <{"mcpServers": ...} JSON>}]`` when
|
|
@@ -58,7 +59,7 @@ def build_global_config_files(path: Path, mcp_servers: Optional[dict]) -> list[d
|
|
|
58
59
|
def walk_enabled_plugins(
|
|
59
60
|
plugin_entries: dict[str, Any],
|
|
60
61
|
is_enabled: Callable[[Any], bool],
|
|
61
|
-
locate_dir: Callable[[str, str],
|
|
62
|
+
locate_dir: Callable[[str, str], Path | None],
|
|
62
63
|
read_plugin: Callable[[Path], tuple[dict, dict]],
|
|
63
64
|
) -> dict:
|
|
64
65
|
"""Iterate enabled plugins and build their inventory metadata.
|
{cycode-3.25.2.dev1 → cycode-3.25.2.dev2}/cycode/cli/apps/ai_guardrails/ides/_skill_utils.py
RENAMED
|
@@ -11,7 +11,6 @@ the device its MCP inventory as well.
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import Optional
|
|
15
14
|
|
|
16
15
|
from cycode.logger import get_logger
|
|
17
16
|
|
|
@@ -32,7 +31,7 @@ MAX_SKILL_FILE_BYTES = 256 * 1024
|
|
|
32
31
|
MAX_SKILLS_PER_ROOT = 200
|
|
33
32
|
|
|
34
33
|
|
|
35
|
-
def _read_skill_file(skill_file: Path) ->
|
|
34
|
+
def _read_skill_file(skill_file: Path) -> dict | None:
|
|
36
35
|
"""Read one ``SKILL.md`` into the session-context file shape, or None if unusable."""
|
|
37
36
|
try:
|
|
38
37
|
size = skill_file.stat().st_size
|
|
@@ -18,7 +18,7 @@ from abc import ABC, abstractmethod
|
|
|
18
18
|
from dataclasses import dataclass
|
|
19
19
|
from enum import Enum
|
|
20
20
|
from pathlib import Path
|
|
21
|
-
from typing import ClassVar
|
|
21
|
+
from typing import ClassVar
|
|
22
22
|
|
|
23
23
|
from cycode.cli.apps.ai_guardrails.scan.payload import AIHookPayload
|
|
24
24
|
from cycode.cli.apps.ai_guardrails.scan.types import AiHookEventType
|
|
@@ -44,17 +44,15 @@ class HookDecision:
|
|
|
44
44
|
|
|
45
45
|
action: DecisionAction
|
|
46
46
|
event_type: AiHookEventType
|
|
47
|
-
user_message:
|
|
48
|
-
agent_message:
|
|
47
|
+
user_message: str | None = None
|
|
48
|
+
agent_message: str | None = None
|
|
49
49
|
|
|
50
50
|
@classmethod
|
|
51
51
|
def allow(cls, event_type: AiHookEventType) -> 'HookDecision':
|
|
52
52
|
return cls(action=DecisionAction.ALLOW, event_type=event_type)
|
|
53
53
|
|
|
54
54
|
@classmethod
|
|
55
|
-
def deny(
|
|
56
|
-
cls, event_type: AiHookEventType, user_message: str, agent_message: Optional[str] = None
|
|
57
|
-
) -> 'HookDecision':
|
|
55
|
+
def deny(cls, event_type: AiHookEventType, user_message: str, agent_message: str | None = None) -> 'HookDecision':
|
|
58
56
|
return cls(
|
|
59
57
|
action=DecisionAction.DENY,
|
|
60
58
|
event_type=event_type,
|
|
@@ -63,7 +61,7 @@ class HookDecision:
|
|
|
63
61
|
)
|
|
64
62
|
|
|
65
63
|
@classmethod
|
|
66
|
-
def ask(cls, event_type: AiHookEventType, user_message: str, agent_message:
|
|
64
|
+
def ask(cls, event_type: AiHookEventType, user_message: str, agent_message: str | None = None) -> 'HookDecision':
|
|
67
65
|
return cls(
|
|
68
66
|
action=DecisionAction.ASK,
|
|
69
67
|
event_type=event_type,
|
|
@@ -92,7 +90,7 @@ class IDE(ABC):
|
|
|
92
90
|
# --- install / status ---
|
|
93
91
|
|
|
94
92
|
@abstractmethod
|
|
95
|
-
def settings_path(self, scope: str, repo_path:
|
|
93
|
+
def settings_path(self, scope: str, repo_path: Path | None = None) -> Path:
|
|
96
94
|
"""Return the hooks/settings file path for the given scope.
|
|
97
95
|
|
|
98
96
|
`scope` is 'user' or 'repo'. `repo_path` is required when scope == 'repo'.
|
|
@@ -108,7 +106,7 @@ class IDE(ABC):
|
|
|
108
106
|
``hooks_manager`` can treat them uniformly.
|
|
109
107
|
"""
|
|
110
108
|
|
|
111
|
-
def post_install(self, scope: str, repo_path:
|
|
109
|
+
def post_install(self, scope: str, repo_path: Path | None = None) -> tuple[bool, str]:
|
|
112
110
|
"""Run IDE-specific actions after the hooks file is written.
|
|
113
111
|
|
|
114
112
|
Default: no-op success. Override to perform extra setup that doesn't
|
|
@@ -120,7 +118,7 @@ class IDE(ABC):
|
|
|
120
118
|
"""
|
|
121
119
|
return True, ''
|
|
122
120
|
|
|
123
|
-
def post_uninstall(self, scope: str, repo_path:
|
|
121
|
+
def post_uninstall(self, scope: str, repo_path: Path | None = None) -> tuple[bool, str]:
|
|
124
122
|
"""Run IDE-specific cleanup after the hooks file is removed.
|
|
125
123
|
|
|
126
124
|
Default: no-op success. Override to undo whatever ``post_install``
|
|
@@ -169,7 +167,7 @@ class IDE(ABC):
|
|
|
169
167
|
"""
|
|
170
168
|
return AIHookPayload(ide_provider=self.name)
|
|
171
169
|
|
|
172
|
-
def get_user_email(self) ->
|
|
170
|
+
def get_user_email(self) -> str | None:
|
|
173
171
|
"""Best-effort read of the user's email from IDE-specific config.
|
|
174
172
|
|
|
175
173
|
Default: None. Override if the IDE stores a usable account locally.
|
|
@@ -5,7 +5,7 @@ import re
|
|
|
5
5
|
from collections.abc import Iterator
|
|
6
6
|
from copy import deepcopy
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import ClassVar
|
|
8
|
+
from typing import ClassVar
|
|
9
9
|
|
|
10
10
|
from cycode.cli.apps.ai_guardrails.consts import CYCODE_SCAN_PROMPT_COMMAND, CYCODE_SESSION_START_COMMAND
|
|
11
11
|
from cycode.cli.apps.ai_guardrails.ides._plugin_utils import (
|
|
@@ -80,12 +80,12 @@ def _reverse_readline(path: Path, buf_size: int = 8192) -> Iterator[str]:
|
|
|
80
80
|
yield buffer.decode('utf-8', errors='replace')
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
def _extract_model(entry: dict) ->
|
|
83
|
+
def _extract_model(entry: dict) -> str | None:
|
|
84
84
|
"""Extract model from a transcript entry (top level or nested in message)."""
|
|
85
85
|
return entry.get('model') or (entry.get('message') or {}).get('model')
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
def _extract_generation_id(entry: dict) ->
|
|
88
|
+
def _extract_generation_id(entry: dict) -> str | None:
|
|
89
89
|
"""Extract generation ID from a user-type transcript entry."""
|
|
90
90
|
if entry.get('type') == 'user':
|
|
91
91
|
return entry.get('uuid')
|
|
@@ -94,7 +94,7 @@ def _extract_generation_id(entry: dict) -> Optional[str]:
|
|
|
94
94
|
|
|
95
95
|
def extract_from_claude_transcript(
|
|
96
96
|
transcript_path: str,
|
|
97
|
-
) -> tuple[
|
|
97
|
+
) -> tuple[str | None, str | None, str | None]:
|
|
98
98
|
"""Extract ``(ide_version, model, generation_id)`` from a transcript.
|
|
99
99
|
|
|
100
100
|
The transcript is a JSONL file scanned from end → start so the most recent
|
|
@@ -135,7 +135,7 @@ def extract_from_claude_transcript(
|
|
|
135
135
|
# --- ~/.claude.json + ~/.claude/settings.json parsing -------------------------
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
def load_claude_config(config_path:
|
|
138
|
+
def load_claude_config(config_path: Path | None = None) -> dict | None:
|
|
139
139
|
"""Load and parse `~/.claude.json`. Returns None if missing/invalid."""
|
|
140
140
|
path = config_path or _CLAUDE_CONFIG_PATH
|
|
141
141
|
if not path.exists():
|
|
@@ -148,17 +148,17 @@ def load_claude_config(config_path: Optional[Path] = None) -> Optional[dict]:
|
|
|
148
148
|
return None
|
|
149
149
|
|
|
150
150
|
|
|
151
|
-
def _email_from_config(config: dict) ->
|
|
151
|
+
def _email_from_config(config: dict) -> str | None:
|
|
152
152
|
"""Read ``oauthAccount.emailAddress`` from a parsed Claude config."""
|
|
153
153
|
return config.get('oauthAccount', {}).get('emailAddress')
|
|
154
154
|
|
|
155
155
|
|
|
156
|
-
def get_mcp_servers(config: dict) ->
|
|
156
|
+
def get_mcp_servers(config: dict) -> dict | None:
|
|
157
157
|
"""Read ``mcpServers`` from a parsed Claude config."""
|
|
158
158
|
return config.get('mcpServers')
|
|
159
159
|
|
|
160
160
|
|
|
161
|
-
def load_claude_settings(settings_path:
|
|
161
|
+
def load_claude_settings(settings_path: Path | None = None) -> dict | None:
|
|
162
162
|
"""Load and parse `~/.claude/settings.json`. Returns None if missing/invalid."""
|
|
163
163
|
path = settings_path or _CLAUDE_SETTINGS_PATH
|
|
164
164
|
if not path.exists():
|
|
@@ -185,7 +185,7 @@ def _plugins_cache_dir() -> Path:
|
|
|
185
185
|
return Path.home() / '.claude' / 'plugins' / 'cache'
|
|
186
186
|
|
|
187
187
|
|
|
188
|
-
def _resolve_marketplace_path(marketplace: dict) ->
|
|
188
|
+
def _resolve_marketplace_path(marketplace: dict) -> Path | None:
|
|
189
189
|
"""Resolve filesystem path for a directory-type marketplace."""
|
|
190
190
|
source = marketplace.get('source', {})
|
|
191
191
|
if source.get('source') != 'directory':
|
|
@@ -236,7 +236,7 @@ def resolve_plugins(settings: dict) -> dict:
|
|
|
236
236
|
enabled = settings.get('enabledPlugins') or {}
|
|
237
237
|
marketplaces = settings.get('extraKnownMarketplaces') or {}
|
|
238
238
|
|
|
239
|
-
def _locate(plugin_name: str, marketplace_name: str) ->
|
|
239
|
+
def _locate(plugin_name: str, marketplace_name: str) -> 'Path | None':
|
|
240
240
|
# Directory-type marketplaces point straight at the plugin source; every other source
|
|
241
241
|
# type (git, github, ...) is cloned into the local plugin cache.
|
|
242
242
|
marketplace = marketplaces.get(marketplace_name)
|
|
@@ -259,7 +259,7 @@ def _sanitize_mcp_name(name: str) -> str:
|
|
|
259
259
|
return re.sub(r'[^a-z0-9_-]', '_', name.lower())
|
|
260
260
|
|
|
261
261
|
|
|
262
|
-
def _local_mcp_servers(config:
|
|
262
|
+
def _local_mcp_servers(config: dict | None, cwd: str | None) -> Iterator[tuple[str, str]]:
|
|
263
263
|
"""Yield ``(name as Claude Code namespaces it, config key)`` for each locally configured MCP server."""
|
|
264
264
|
sources = []
|
|
265
265
|
if config:
|
|
@@ -280,7 +280,7 @@ def _local_mcp_servers(config: Optional[dict], cwd: Optional[str]) -> Iterator[t
|
|
|
280
280
|
yield f'plugin_{plugin_name}_{server}', server
|
|
281
281
|
|
|
282
282
|
|
|
283
|
-
def _resolve_mcp_server_name(server: str, config:
|
|
283
|
+
def _resolve_mcp_server_name(server: str, config: dict | None, cwd: str | None) -> str:
|
|
284
284
|
"""Map the server segment of ``mcp__<server>__<tool>`` back to its config key; unknown names pass through."""
|
|
285
285
|
wanted = _sanitize_mcp_name(server)
|
|
286
286
|
for namespaced, name in _local_mcp_servers(config, cwd):
|
|
@@ -297,7 +297,7 @@ class ClaudeCode(IDE):
|
|
|
297
297
|
display_name: ClassVar[str] = 'Claude Code'
|
|
298
298
|
hook_events: ClassVar[list[str]] = list(_HOOK_EVENTS)
|
|
299
299
|
|
|
300
|
-
def settings_path(self, scope: str, repo_path:
|
|
300
|
+
def settings_path(self, scope: str, repo_path: Path | None = None) -> Path:
|
|
301
301
|
if scope == 'repo' and repo_path:
|
|
302
302
|
return repo_path / _REPO_SUBDIR / _HOOKS_FILE_NAME
|
|
303
303
|
return _USER_HOOKS_DIR / _HOOKS_FILE_NAME
|
|
@@ -430,7 +430,7 @@ class ClaudeCode(IDE):
|
|
|
430
430
|
source=raw_payload.get('source'),
|
|
431
431
|
)
|
|
432
432
|
|
|
433
|
-
def get_user_email(self) ->
|
|
433
|
+
def get_user_email(self) -> str | None:
|
|
434
434
|
config = load_claude_config()
|
|
435
435
|
return _email_from_config(config) if config else None
|
|
436
436
|
|