controlzero 1.13.2__tar.gz → 1.13.3__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.2 → controlzero-1.13.3}/CHANGELOG.md +13 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/PKG-INFO +1 -1
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/__init__.py +1 -1
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/doctor.py +83 -0
- controlzero-1.13.3/controlzero/cli/enforcement.py +861 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/antigravity.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/base.py +10 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/claude_code.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/codex_cli.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/cursor.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/cursor_cli.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/gemini_cli.py +1 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/kiro.py +2 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/main.py +200 -104
- {controlzero-1.13.2 → controlzero-1.13.3}/pyproject.toml +1 -1
- controlzero-1.13.3/tests/fixtures/adapter-contracts/antigravity.json +21 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/claude_code.json +31 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/codex_cli.json +24 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/cursor.json +31 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/gemini_cli.json +25 -0
- controlzero-1.13.3/tests/fixtures/adapter-contracts/kiro.json +37 -0
- controlzero-1.13.3/tests/test_adapter_contracts.py +216 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/.gitignore +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/Dockerfile.test +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/LICENSE +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/README.md +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/__main__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/_messages.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/action_aliases.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/action_validator.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/bundle.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/condition_ops.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/credential_hook.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/credential_scanner.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/credentials_data/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/credentials_data/built_in.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/dlp_scanner.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/enforcer.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/hook_extractors.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/io_capture_producer.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/source_labels.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/tool_extractors.json +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/_internal/types.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/audit_local.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/audit_remote.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/canonical.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/__main__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/_secrets.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/agent_config.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/console.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/debug_bundle.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/exec_cmd.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hook_entry.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/hosts/unknown.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/kiro_adapter.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/migrate.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/output.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/spool_cmd.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/telemetry_consent.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/antigravity/hooks.json +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/antigravity.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/autogen.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/claude-code.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/codex-cli.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/cost-cap.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/crewai.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/cursor.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/gemini-cli.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/generic.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-file-save.kiro.hook +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-pre-tool-use.kiro.hook +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/kiro/ide-prompt-submit.kiro.hook +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/kiro/kiro.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/langchain.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/mcp.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/templates/rag.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/cli/update_cmd.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/client.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/device.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/enrollment.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/error_codes.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/error_codes.yaml +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/errors.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/grant_protocol.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/mock.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/pending_approval.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/secret_leak_guard.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hitl/status.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hook_integrity.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hooks/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hooks/tool_output_handler.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/hosted_policy.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/anthropic.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/autogen.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/braintrust.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/crewai/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/crewai/agent.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/crewai/crew.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/crewai/task.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/crewai/tool.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/google.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/google_adk/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/google_adk/agent.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/google_adk/tool.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/agent.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/callbacks.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/chain.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/graph.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/modern.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langchain/tool.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/langfuse.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/litellm.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/openai.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/pydantic_ai.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/integrations/vercel_ai.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/layout_migration.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/policy_loader.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/secrets/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/secrets/reference.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/secrets/resolver.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/secrets/secretstr.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_compress.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_constants.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_crc32c.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_crypto.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_frame.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_keyring.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_metrics.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_spool.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_state.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/_uploader.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/spool/cz-audit-v1.dict +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/tamper.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/controlzero/tracecontext.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/examples/hello_world.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/_fixtures/antigravity-envelope-expected.json +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/_fixtures/jcs_args_hash_vectors.json +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/conftest.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/integrations/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/integrations/test_google.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/parity/action_aliases.json +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/__init__.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/conftest.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_cli.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_concurrency.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_conformance.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_core.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_crash.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_diskfull.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_durable_default_tamper.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_keychain_dek.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_sink_wiring.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_transcript_localack.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/spool/test_spool_uploader.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_action_aliases.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_action_canonicalization.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_action_validator_t86.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_adapter_interface.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_agent_name_env.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_agy_docs_no_exit2_1373.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_adapter.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_envelope_parity.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_ga_blockers_1248.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_hook_check.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_install.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_posttooluse_observe_58.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_antigravity_tool_vocab_1303.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_api_key_mask.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_audit_project_id_attribution_pr2.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_audit_remote.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_audit_remote_io_capture.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_audit_remote_sdk_version.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_audit_sink_isolation.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_bundle_cache_freshness_1303.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_bundle_parser.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_bundle_translate.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_canonical_phase1a.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_capability_matrix_doc.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_carve_out.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_debug_bundle.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_extractor_integration.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_hook.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_hook_entry.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_hosted_refresh.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_init.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_init_templates.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_tail.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_test.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cli_validate.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_coding_agent_hooks.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_condition_operators_1495.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_conditions.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_config_format_parity_1303.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_conformance.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_console.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_credential_hook.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_cursor_adapter.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_default_action.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_deny_rule_reconciliation_1011.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_device.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_dlp_mask.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_dlp_scanner.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_doctor.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_engine_version_consistency.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_enrollment.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_env_dump_438.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_epic_1247_bryan_acceptance.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_error_codes.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_errors_e_codes.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_fail_closed_eval.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_failopen_1303.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_glob_matching.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_5d_email_install.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_cli_flag.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_exceptions.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_get_secret_hitl.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_mock_backend.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_pending_approval.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_request_approval.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_secret_leak_guard.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_6a_wait.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_conformance.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_phase2b_protocol.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_reason_codes.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hitl_validator_keys.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hook_extractors.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hook_integrity.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hook_mask_failclosed.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hosted_local_audit_1247.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hosted_local_shadow_warn_1265.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hosted_policy_e2e.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hosts_adapter.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hybrid_mode_strict.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_hybrid_mode_warn.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_install_hook_command.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_install_hooks.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_io_capture_producer.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_adapter.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_cli_e2e.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_cli_hook_pin_1265.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_cli_v210_hooks.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_hook_templates.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_kiro_install.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_layout_migration_t101.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_layout_parity_t102.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_local_mode_dict.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_local_mode_file_json.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_local_mode_file_yaml.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_localized_reason.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_log_fallback_stderr.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_log_options_ignored_hosted.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_log_rotation.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_migrate.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_min_sdk_version_gate.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_multi_client_per_project_175.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_no_policy_no_key.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_observe_mode_1247.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_package_rename_shim.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_part3_active_policy_count_1303.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_per_client_isolation_1011.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_policy_engine_version_phase1b.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_policy_freshness.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_policy_load_failclosed_f3.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_policy_settings.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_policy_source_audit.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_pr4_install_messaging.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_pr4_output.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_pr4_status.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_probe_audit_isolation.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_quarantine.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_reason_code.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_refresh.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_secrets.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_secrets_reference_resolver.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_shell_semantic_class.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_source_labels.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_sql_semantic_class.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_synthetic_policy_id_t79.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_t103_precedence.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_t104_cache_gc.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_t108_local_override_audit.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_t96_single_audit_log.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_t99_install_prefetch_bundle.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_tamper.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_tamper_behavior.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_tamper_hook.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_telemetry_consent.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_tracecontext.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_unsafe_int_boundary.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_update_cmd.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tests/test_upgrade_nudge.py +0 -0
- {controlzero-1.13.2 → controlzero-1.13.3}/tools/cz-kiro-adapter +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.13.3 (2026-06-29): `verify --prove` enforcement-robustness layer
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **`controlzero verify --prove` actively PROVES enforcement instead of trusting
|
|
8
|
+
config.** Plain `verify` only checked that the hook config was present, so an
|
|
9
|
+
adapter could report green while its hooks never fired -- a "false-green"
|
|
10
|
+
install, the exact class behind the kiro-cli 2.10 and Codex hook-trust reports.
|
|
11
|
+
`--prove` runs a live probe that MUST be denied and confirms the governance hook
|
|
12
|
+
actually fired, reports the effective enforcement state, and validates against
|
|
13
|
+
per-adapter contract fixtures. Catches silent non-enforcement that config-only
|
|
14
|
+
checks miss.
|
|
15
|
+
|
|
3
16
|
## 1.13.2 (2026-06-28): kiro-cli 2.10 install crash + cross-adapter hook hardening
|
|
4
17
|
|
|
5
18
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: controlzero
|
|
3
|
-
Version: 1.13.
|
|
3
|
+
Version: 1.13.3
|
|
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
|
|
@@ -457,6 +457,87 @@ def _check_antigravity_hook_live() -> List[Finding]:
|
|
|
457
457
|
return findings
|
|
458
458
|
|
|
459
459
|
|
|
460
|
+
# -----------------------------------------------------------------------------
|
|
461
|
+
# Prove-enforcement live checks (R1 + R2) for the SAFE-NOW adapters.
|
|
462
|
+
#
|
|
463
|
+
# These generalize the Antigravity liveness check to every adapter via the
|
|
464
|
+
# shared controlzero.cli.enforcement module: a pure offline EFFECTIVE-STATE
|
|
465
|
+
# read (proves the AGENT will INVOKE our command -- gate on, hook trusted,
|
|
466
|
+
# default agent set, failClosed present, the CZ block in the precedence-winning
|
|
467
|
+
# layer) PLUS a real-deny PROBE through the EXACT installed command (proves the
|
|
468
|
+
# command resolves and actually denies). "Present but not effective" => ERROR,
|
|
469
|
+
# not a silent green. An adapter not configured on this box emits NO finding (a
|
|
470
|
+
# valid state); doctor exit 1 stays reserved for active problems.
|
|
471
|
+
# -----------------------------------------------------------------------------
|
|
472
|
+
|
|
473
|
+
# Adapters that can be proven offline today (Phase A+B / SAFE-NOW). Antigravity
|
|
474
|
+
# keeps its dedicated dry-run check above; codex trust is a WARN (needs-live).
|
|
475
|
+
_PROVE_ADAPTERS = ("claude_code", "cursor", "gemini_cli", "codex_cli", "kiro")
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def _check_adapter_enforcement_live(adapter: str) -> List[Finding]:
|
|
479
|
+
"""One prove-enforcement finding for an adapter (or none when it is not
|
|
480
|
+
installed on this box). ERROR when present-but-not-effective; WARN for
|
|
481
|
+
needs-live boundaries; silent when the adapter is absent."""
|
|
482
|
+
from controlzero.cli import enforcement
|
|
483
|
+
|
|
484
|
+
reader = enforcement.EFFECTIVE_STATE_READERS.get(adapter)
|
|
485
|
+
if reader is None:
|
|
486
|
+
return []
|
|
487
|
+
try:
|
|
488
|
+
state = reader()
|
|
489
|
+
except Exception: # noqa: BLE001
|
|
490
|
+
return []
|
|
491
|
+
if not state.installed:
|
|
492
|
+
return []
|
|
493
|
+
|
|
494
|
+
findings: List[Finding] = []
|
|
495
|
+
path = state.config_path or adapter
|
|
496
|
+
|
|
497
|
+
if not state.ok:
|
|
498
|
+
findings.append(Finding(
|
|
499
|
+
path=path, line=1, col=1, severity="ERROR", code="E1010",
|
|
500
|
+
message=(
|
|
501
|
+
f"{adapter} hook is configured but NOT effectively enforcing: "
|
|
502
|
+
+ "; ".join(state.red_reasons)
|
|
503
|
+
),
|
|
504
|
+
fix_hint=f"run `controlzero install {adapter.replace('_', '-')}` and re-check `controlzero verify --prove`",
|
|
505
|
+
))
|
|
506
|
+
# Still surface needs-live warns alongside the error.
|
|
507
|
+
for w in state.warns:
|
|
508
|
+
findings.append(Finding(
|
|
509
|
+
path=path, line=1, col=1, severity="WARN", code="E1011",
|
|
510
|
+
message=f"{adapter}: {w}", fix_hint="see `controlzero verify --prove` for the live signal",
|
|
511
|
+
))
|
|
512
|
+
return findings
|
|
513
|
+
|
|
514
|
+
# Effective-state holds -> drive a real deny through the installed command.
|
|
515
|
+
installed_cmd = enforcement.installed_command(adapter)
|
|
516
|
+
contract = enforcement.ADAPTER_CONTRACTS.get(adapter)
|
|
517
|
+
if installed_cmd and contract is not None:
|
|
518
|
+
res = enforcement.run_enforcement_probe(
|
|
519
|
+
installed_cmd,
|
|
520
|
+
adapter=adapter,
|
|
521
|
+
decision_via_exit_code=(contract.block_mechanism != "stdout_decision"),
|
|
522
|
+
)
|
|
523
|
+
if not res.blocked:
|
|
524
|
+
findings.append(Finding(
|
|
525
|
+
path=path, line=1, col=1, severity="ERROR", code="E1012",
|
|
526
|
+
message=(
|
|
527
|
+
f"{adapter} hook is wired but a real known-deny probe was NOT blocked "
|
|
528
|
+
f"(exit={res.exit_code}{', error=' + res.error if res.error else ''}) -- "
|
|
529
|
+
"the command does not resolve or does not enforce, tools run UNGOVERNED"
|
|
530
|
+
),
|
|
531
|
+
fix_hint=f"reinstall (`controlzero install {adapter.replace('_', '-')}`); confirm the interpreter / PATH the hook resolves",
|
|
532
|
+
))
|
|
533
|
+
for w in state.warns:
|
|
534
|
+
findings.append(Finding(
|
|
535
|
+
path=path, line=1, col=1, severity="WARN", code="E1011",
|
|
536
|
+
message=f"{adapter}: {w}", fix_hint="see `controlzero verify --prove` for the live signal",
|
|
537
|
+
))
|
|
538
|
+
return findings
|
|
539
|
+
|
|
540
|
+
|
|
460
541
|
# -----------------------------------------------------------------------------
|
|
461
542
|
# Public entrypoint. Wired into the CLI as `controlzero doctor`.
|
|
462
543
|
# -----------------------------------------------------------------------------
|
|
@@ -472,6 +553,8 @@ def run_doctor(verbose: bool = False) -> int:
|
|
|
472
553
|
findings.extend(_check_config_permissions())
|
|
473
554
|
findings.extend(_check_global_environment())
|
|
474
555
|
findings.extend(_check_antigravity_hook_live())
|
|
556
|
+
for _adapter in _PROVE_ADAPTERS:
|
|
557
|
+
findings.extend(_check_adapter_enforcement_live(_adapter))
|
|
475
558
|
|
|
476
559
|
errors = [f for f in findings if f.severity == "ERROR"]
|
|
477
560
|
warns = [f for f in findings if f.severity == "WARN"]
|