controlzero 1.13.6__tar.gz → 1.13.7__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.
- {controlzero-1.13.6 → controlzero-1.13.7}/PKG-INFO +2 -1
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/__init__.py +1 -1
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/audit_remote.py +5 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/main.py +118 -0
- controlzero-1.13.7/controlzero/cli/setup_wizard.py +481 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/spool_cmd.py +2 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/client.py +4 -3
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/enrollment.py +8 -1
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/grant_protocol.py +3 -2
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hosted_policy.py +93 -2
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_keyring.py +65 -5
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/tamper.py +2 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/pyproject.toml +6 -1
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_keychain_dek.py +142 -7
- controlzero-1.13.7/tests/test_api_url_config.py +72 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_5d_email_install.py +1 -1
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_request_approval.py +1 -1
- controlzero-1.13.7/tests/test_install_api_url.py +69 -0
- controlzero-1.13.7/tests/test_setup_wizard.py +196 -0
- controlzero-1.13.7/tests/test_tls_ca_bundle.py +112 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/.gitignore +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/CHANGELOG.md +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/Dockerfile.test +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/LICENSE +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/README.md +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/__main__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/_messages.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/action_aliases.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/action_validator.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/bundle.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/condition_ops.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credential_hook.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credential_scanner.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credentials_data/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credentials_data/built_in.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/dlp_scanner.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/enforcer.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/hook_extractors.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/io_capture_producer.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/source_labels.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/tool_extractors.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/types.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/audit_local.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/canonical.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/__main__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/_secrets.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/agent_config.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/console.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/debug_bundle.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/doctor.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/enforcement.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/exec_cmd.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hook_entry.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/antigravity.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/base.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/claude_code.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/codex_cli.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/cursor.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/cursor_cli.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/gemini_cli.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/kiro.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/unknown.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/kiro_adapter.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/migrate.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/output.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/telemetry_consent.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/antigravity/hooks.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/antigravity.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/autogen.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/claude-code.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/codex-cli.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/cost-cap.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/crewai.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/cursor.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/gemini-cli.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/generic.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-file-save.kiro.hook +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-pre-tool-use.kiro.hook +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-prompt-submit.kiro.hook +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/kiro.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/langchain.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/mcp.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/rag.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/update_cmd.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/device.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/error_codes.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/error_codes.yaml +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/errors.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/mock.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/pending_approval.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/secret_leak_guard.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/status.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hook_integrity.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hooks/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hooks/tool_output_handler.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/anthropic.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/autogen.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/braintrust.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/agent.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/crew.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/task.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/tool.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/agent.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/tool.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/agent.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/callbacks.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/chain.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/graph.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/modern.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/tool.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langfuse.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/litellm.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/openai.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/pydantic_ai.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/vercel_ai.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/layout_migration.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/policy_loader.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/reference.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/resolver.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/secretstr.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_compress.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_constants.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_crc32c.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_crypto.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_frame.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_metrics.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_spool.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_state.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_uploader.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/cz-audit-v1.dict +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/tracecontext.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/examples/hello_world.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/_fixtures/antigravity-envelope-expected.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/_fixtures/jcs_args_hash_vectors.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/conftest.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/antigravity.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/claude_code.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/codex_cli.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/cursor.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/gemini_cli.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/kiro.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/integrations/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/integrations/test_google.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/parity/action_aliases.json +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/__init__.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/conftest.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_cli.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_concurrency.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_conformance.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_core.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_crash.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_diskfull.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_durable_default_tamper.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_sink_wiring.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_transcript_localack.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_uploader.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_aliases.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_canonicalization.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_validator_t86.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_adapter_contracts.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_adapter_interface.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_agent_name_env.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_agy_docs_no_exit2_1373.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_adapter.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_envelope_parity.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_ga_blockers_1248.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_hook_check.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_install.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_posttooluse_observe_58.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_tool_vocab_1303.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_api_key_mask.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_project_id_attribution_pr2.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote_io_capture.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote_sdk_version.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_sink_isolation.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_cache_freshness_1303.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_parser.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_translate.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_canonical_phase1a.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_capability_matrix_doc.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_carve_out.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_debug_bundle.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_extractor_integration.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hook.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hook_entry.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hosted_refresh.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_init.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_init_templates.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_tail.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_test.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_validate.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_coding_agent_hooks.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_condition_operators_1495.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_conditions.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_config_format_parity_1303.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_conformance.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_console.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_credential_hook.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cross_adapter_shell_enforcement.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cursor_adapter.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_default_action.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_deny_rule_reconciliation_1011.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_deny_wins_default_catchall_1620.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_device.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_dlp_mask.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_dlp_scanner.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_doctor.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_engine_version_consistency.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_enrollment.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_env_dump_438.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_epic_1247_bryan_acceptance.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_error_codes.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_errors_e_codes.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_fail_closed_eval.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_failopen_1303.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_glob_matching.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_cli_flag.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_exceptions.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_get_secret_hitl.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_mock_backend.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_pending_approval.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_secret_leak_guard.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_wait.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_conformance.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_phase2b_protocol.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_reason_codes.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_validator_keys.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_command_pinning_1705.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_extractors.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_integrity.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_mask_failclosed.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_local_audit_1247.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_local_shadow_warn_1265.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_policy_e2e.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosts_adapter.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hybrid_mode_strict.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hybrid_mode_warn.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_install_hook_command.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_install_hooks.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_io_capture_producer.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_adapter.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_e2e.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_hook_pin_1265.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_v210_hooks.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_hook_templates.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_install.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_install_standardisation.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_layout_migration_t101.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_layout_parity_t102.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_dict.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_file_json.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_file_yaml.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_localized_reason.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_fallback_stderr.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_options_ignored_hosted.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_rotation.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_migrate.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_min_sdk_version_gate.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_multi_client_per_project_175.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_no_policy_no_key.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_observe_mode_1247.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_package_rename_shim.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_part3_active_policy_count_1303.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_per_client_isolation_1011.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_engine_version_phase1b.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_freshness.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_load_failclosed_f3.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_settings.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_source_audit.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_install_messaging.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_output.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_status.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_probe_audit_isolation.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_quarantine.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_reason_code.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_refresh.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_secrets.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_secrets_reference_resolver.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_shell_semantic_class.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_source_labels.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_sql_semantic_class.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_synthetic_policy_id_t79.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t103_precedence.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t104_cache_gc.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t108_local_override_audit.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t96_single_audit_log.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t99_install_prefetch_bundle.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper_behavior.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper_hook.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_telemetry_consent.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tracecontext.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_unsafe_int_boundary.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_update_cmd.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_upgrade_nudge.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_version_aware_fail_closed.py +0 -0
- {controlzero-1.13.6 → controlzero-1.13.7}/tools/cz-kiro-adapter +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: controlzero
|
|
3
|
-
Version: 1.13.
|
|
3
|
+
Version: 1.13.7
|
|
4
4
|
Summary: AI agent governance: policies, audit, and observability for tool calls. Works locally with no signup.
|
|
5
5
|
Project-URL: Homepage, https://controlzero.ai
|
|
6
6
|
Project-URL: Documentation, https://docs.controlzero.ai
|
|
@@ -28,6 +28,7 @@ Requires-Dist: httpx>=0.25.0
|
|
|
28
28
|
Requires-Dist: loguru>=0.7.0
|
|
29
29
|
Requires-Dist: pydantic>=2.0.0
|
|
30
30
|
Requires-Dist: pyyaml>=6.0
|
|
31
|
+
Requires-Dist: questionary<3,>=2.0.0
|
|
31
32
|
Requires-Dist: rfc8785<0.2,>=0.1.4
|
|
32
33
|
Requires-Dist: rich>=13.0.0
|
|
33
34
|
Requires-Dist: zstandard>=0.23.0
|
|
@@ -18,6 +18,7 @@ Design constraints:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
|
+
from .hosted_policy import tls_verify
|
|
21
22
|
|
|
22
23
|
import getpass
|
|
23
24
|
import json
|
|
@@ -968,6 +969,7 @@ class RemoteAuditSink(_SpoolWiringMixin):
|
|
|
968
969
|
content=body,
|
|
969
970
|
headers=headers,
|
|
970
971
|
timeout=FLUSH_TIMEOUT_S,
|
|
972
|
+
verify=tls_verify(),
|
|
971
973
|
)
|
|
972
974
|
if resp.status_code == 401:
|
|
973
975
|
raise _AuthExpiredError("server returned 401")
|
|
@@ -1034,6 +1036,7 @@ class RemoteAuditSink(_SpoolWiringMixin):
|
|
|
1034
1036
|
content=body,
|
|
1035
1037
|
headers=headers,
|
|
1036
1038
|
timeout=FLUSH_TIMEOUT_S,
|
|
1039
|
+
verify=tls_verify(),
|
|
1037
1040
|
)
|
|
1038
1041
|
return post
|
|
1039
1042
|
|
|
@@ -1192,6 +1195,7 @@ class BearerAuditSink(_SpoolWiringMixin):
|
|
|
1192
1195
|
content=body,
|
|
1193
1196
|
headers=headers,
|
|
1194
1197
|
timeout=FLUSH_TIMEOUT_S,
|
|
1198
|
+
verify=tls_verify(),
|
|
1195
1199
|
)
|
|
1196
1200
|
if resp.status_code == 401:
|
|
1197
1201
|
raise _AuthExpiredError("server returned 401")
|
|
@@ -1244,6 +1248,7 @@ class BearerAuditSink(_SpoolWiringMixin):
|
|
|
1244
1248
|
content=body,
|
|
1245
1249
|
headers=headers,
|
|
1246
1250
|
timeout=FLUSH_TIMEOUT_S,
|
|
1251
|
+
verify=tls_verify(),
|
|
1247
1252
|
)
|
|
1248
1253
|
return post
|
|
1249
1254
|
|
|
@@ -270,6 +270,43 @@ def init(template: str, out: str, force: bool):
|
|
|
270
270
|
click.echo(f" 4. Use it in code: Client(policy_file='{out_path}')")
|
|
271
271
|
|
|
272
272
|
|
|
273
|
+
@cli.command("setup", hidden=True)
|
|
274
|
+
@click.option("--api-url", default=None,
|
|
275
|
+
help="Self-hosted / air-gap backend URL or host (e.g. https://cz.internal). "
|
|
276
|
+
"Presence selects self-hosted mode; persisted to config.yaml.")
|
|
277
|
+
@click.option("--api-key", default=None,
|
|
278
|
+
help="Control Zero API key (cz_live_/cz_test_). Env: CONTROLZERO_API_KEY.")
|
|
279
|
+
@click.option("--agent", "agents", multiple=True,
|
|
280
|
+
help="Coding agent to wire (repeatable): claude-code, codex-cli, gemini-cli, "
|
|
281
|
+
"kiro, cursor, antigravity. Env: CONTROLZERO_SETUP_AGENTS (comma list).")
|
|
282
|
+
@click.option("--tls-ca-bundle", default=None,
|
|
283
|
+
help="CA bundle path for a self-signed air-gap endpoint. Persisted to config.")
|
|
284
|
+
@click.option("--email", default=None, help="Your work email (Approvals attribution).")
|
|
285
|
+
@click.option("--yes", "assume_yes", is_flag=True,
|
|
286
|
+
help="Non-interactive: resolve from flags/env, never prompt.")
|
|
287
|
+
@click.pass_context
|
|
288
|
+
def setup(ctx, api_url, api_key, agents, tls_ca_bundle, email, assume_yes):
|
|
289
|
+
"""Guided onboarding: pick SaaS vs self-hosted, validate, wire agent hooks.
|
|
290
|
+
|
|
291
|
+
Interactive in a TTY; degrades to flags/env (exit 2 on missing input) in
|
|
292
|
+
CI/non-TTY. Hidden/beta -- existing install commands are unchanged.
|
|
293
|
+
"""
|
|
294
|
+
from controlzero.cli.setup_wizard import Flags, run_setup
|
|
295
|
+
|
|
296
|
+
code = run_setup(
|
|
297
|
+
ctx,
|
|
298
|
+
Flags(
|
|
299
|
+
api_url=api_url,
|
|
300
|
+
api_key=api_key,
|
|
301
|
+
agents=tuple(agents),
|
|
302
|
+
tls_ca_bundle=tls_ca_bundle,
|
|
303
|
+
email=email,
|
|
304
|
+
assume_yes=assume_yes,
|
|
305
|
+
),
|
|
306
|
+
)
|
|
307
|
+
sys.exit(code)
|
|
308
|
+
|
|
309
|
+
|
|
273
310
|
@cli.command()
|
|
274
311
|
@click.argument("policy_file", type=click.Path(exists=True), default="controlzero.yaml")
|
|
275
312
|
def validate(policy_file: str):
|
|
@@ -3608,6 +3645,45 @@ def _print_api_key_status(api_key: Optional[str]) -> None:
|
|
|
3608
3645
|
click.echo("Tip: Pass --api-key cz_live_xxx to sync audit logs to the dashboard.")
|
|
3609
3646
|
|
|
3610
3647
|
|
|
3648
|
+
def _write_api_url_config(api_url: str) -> None:
|
|
3649
|
+
"""Persist ``api_url`` to ~/.controlzero/config.yaml (0600). The resolver
|
|
3650
|
+
reads it (env > config > default), so a self-hosted / air-gap endpoint set
|
|
3651
|
+
once at install reaches the agent hook WITHOUT exporting CONTROLZERO_API_URL
|
|
3652
|
+
into every hook subprocess (the historical air-gap footgun). Scheme+host
|
|
3653
|
+
only; the SDK strips a trailing slash and appends request paths itself."""
|
|
3654
|
+
GLOBAL_POLICY_DIR.mkdir(parents=True, exist_ok=True)
|
|
3655
|
+
try:
|
|
3656
|
+
os.chmod(GLOBAL_POLICY_DIR, 0o700)
|
|
3657
|
+
except OSError:
|
|
3658
|
+
pass
|
|
3659
|
+
config_data: dict = {}
|
|
3660
|
+
if GLOBAL_CONFIG_PATH.exists():
|
|
3661
|
+
try:
|
|
3662
|
+
existing = yaml.safe_load(GLOBAL_CONFIG_PATH.read_text(encoding="utf-8"))
|
|
3663
|
+
if isinstance(existing, dict):
|
|
3664
|
+
config_data = existing
|
|
3665
|
+
except Exception: # noqa: BLE001
|
|
3666
|
+
pass
|
|
3667
|
+
config_data["api_url"] = api_url.rstrip("/")
|
|
3668
|
+
GLOBAL_CONFIG_PATH.write_text(
|
|
3669
|
+
yaml.safe_dump(config_data, default_flow_style=False),
|
|
3670
|
+
encoding="utf-8",
|
|
3671
|
+
)
|
|
3672
|
+
try:
|
|
3673
|
+
os.chmod(GLOBAL_CONFIG_PATH, 0o600)
|
|
3674
|
+
except OSError:
|
|
3675
|
+
pass
|
|
3676
|
+
|
|
3677
|
+
|
|
3678
|
+
def _api_url_install_callback(ctx, param, value):
|
|
3679
|
+
"""click callback for the shared --api-url install option. Persists the URL
|
|
3680
|
+
at install time; expose_value=False keeps it off the command signature so no
|
|
3681
|
+
install function needs an api_url parameter."""
|
|
3682
|
+
if value:
|
|
3683
|
+
_write_api_url_config(value)
|
|
3684
|
+
return value
|
|
3685
|
+
|
|
3686
|
+
|
|
3611
3687
|
def _bind_api_key_for_install(
|
|
3612
3688
|
api_key: str,
|
|
3613
3689
|
product: str,
|
|
@@ -3683,6 +3759,13 @@ def install():
|
|
|
3683
3759
|
default=None,
|
|
3684
3760
|
help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team. Stored at ~/.controlzero/config.yaml.",
|
|
3685
3761
|
)
|
|
3762
|
+
@click.option(
|
|
3763
|
+
"--api-url",
|
|
3764
|
+
default=None,
|
|
3765
|
+
expose_value=False,
|
|
3766
|
+
callback=_api_url_install_callback,
|
|
3767
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
3768
|
+
)
|
|
3686
3769
|
def install_claude_code(force: bool, merge: bool, settings: Optional[str], api_key: Optional[str], email: Optional[str]):
|
|
3687
3770
|
"""Install controlzero as a Claude Code PreToolUse hook.
|
|
3688
3771
|
|
|
@@ -3873,6 +3956,13 @@ def install_claude_code(force: bool, merge: bool, settings: Optional[str], api_k
|
|
|
3873
3956
|
default=None,
|
|
3874
3957
|
help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
|
|
3875
3958
|
)
|
|
3959
|
+
@click.option(
|
|
3960
|
+
"--api-url",
|
|
3961
|
+
default=None,
|
|
3962
|
+
expose_value=False,
|
|
3963
|
+
callback=_api_url_install_callback,
|
|
3964
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
3965
|
+
)
|
|
3876
3966
|
def install_gemini_cli(force: bool, merge: bool, settings: Optional[str], api_key: Optional[str], email: Optional[str]):
|
|
3877
3967
|
"""Install controlzero as a Gemini CLI pre-tool-call hook.
|
|
3878
3968
|
|
|
@@ -4085,6 +4175,13 @@ def install_gemini_cli(force: bool, merge: bool, settings: Optional[str], api_ke
|
|
|
4085
4175
|
default=None,
|
|
4086
4176
|
help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
|
|
4087
4177
|
)
|
|
4178
|
+
@click.option(
|
|
4179
|
+
"--api-url",
|
|
4180
|
+
default=None,
|
|
4181
|
+
expose_value=False,
|
|
4182
|
+
callback=_api_url_install_callback,
|
|
4183
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
4184
|
+
)
|
|
4088
4185
|
def install_codex_cli(force: bool, merge: bool, config: Optional[str], api_key: Optional[str], email: Optional[str]):
|
|
4089
4186
|
"""Install controlzero as a Codex CLI tool approval hook.
|
|
4090
4187
|
|
|
@@ -4620,6 +4717,13 @@ def _cursor_enforcement_probe(installed_cmd: str) -> tuple:
|
|
|
4620
4717
|
help="Your work email. Required for Approvals so the backend knows who is "
|
|
4621
4718
|
"at the keyboard when the API key is shared across a team.",
|
|
4622
4719
|
)
|
|
4720
|
+
@click.option(
|
|
4721
|
+
"--api-url",
|
|
4722
|
+
default=None,
|
|
4723
|
+
expose_value=False,
|
|
4724
|
+
callback=_api_url_install_callback,
|
|
4725
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
4726
|
+
)
|
|
4623
4727
|
def install_cursor(
|
|
4624
4728
|
force: bool,
|
|
4625
4729
|
merge: bool,
|
|
@@ -4834,6 +4938,13 @@ def install_cursor(
|
|
|
4834
4938
|
default=None,
|
|
4835
4939
|
help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
|
|
4836
4940
|
)
|
|
4941
|
+
@click.option(
|
|
4942
|
+
"--api-url",
|
|
4943
|
+
default=None,
|
|
4944
|
+
expose_value=False,
|
|
4945
|
+
callback=_api_url_install_callback,
|
|
4946
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
4947
|
+
)
|
|
4837
4948
|
def install_antigravity(
|
|
4838
4949
|
force: bool,
|
|
4839
4950
|
merge: bool,
|
|
@@ -6264,6 +6375,13 @@ def _run_kiro_uninstall(
|
|
|
6264
6375
|
is_flag=True,
|
|
6265
6376
|
help="Print what would change without writing anything to disk.",
|
|
6266
6377
|
)
|
|
6378
|
+
@click.option(
|
|
6379
|
+
"--api-url",
|
|
6380
|
+
default=None,
|
|
6381
|
+
expose_value=False,
|
|
6382
|
+
callback=_api_url_install_callback,
|
|
6383
|
+
help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
|
|
6384
|
+
)
|
|
6267
6385
|
def install_kiro(
|
|
6268
6386
|
surface: str,
|
|
6269
6387
|
workspace: Optional[str],
|