agentlint 2.3.0__tar.gz → 2.4.0__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.
- {agentlint-2.3.0 → agentlint-2.4.0}/.gitignore +2 -3
- {agentlint-2.3.0 → agentlint-2.4.0}/CHANGELOG.md +74 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/PKG-INFO +2 -2
- {agentlint-2.3.0 → agentlint-2.4.0}/README.md +1 -1
- agentlint-2.4.0/agentlint.yml +74 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-claude.md +12 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-codex.md +36 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-cursor.md +20 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/pyproject.toml +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/__init__.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/codex.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/client.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/policy.py +8 -2
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/queue.py +25 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/cli.py +1020 -41
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_compromised_dependency.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/token_burn_against_team_budget.py +2 -2
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_compromised_dependency.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_token_burn_against_team_budget.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_client.py +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_policy_queue_sync.py +112 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cli.py +1059 -3
- {agentlint-2.3.0 → agentlint-2.4.0}/uv.lock +1 -1
- {agentlint-2.3.0 → agentlint-2.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/.github/workflows/ci.yml +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/.github/workflows/publish.yml +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/.python-version +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/CODE_OF_CONDUCT.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/CONTRIBUTING.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/LICENSE +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/SECURITY.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/agentlint.yml.example +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/codecov.yml +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/README.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/adapters.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/architecture.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/configuration.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/custom-rules.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/mcp.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/migration-v2.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-continue.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-gemini.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-generic.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-grok.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-kimi.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-mcp.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-openai.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/docs/subagent-safety.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/.claude-plugin/plugin.json +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/doctor.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/fix.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/security-audit.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/bin/resolve-and-run.sh +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/commands/lint-config.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/commands/lint-status.md +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/hooks/hooks.json +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/plugin/mcp.json +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/__main__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/_utils.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/base.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/claude.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/continue_dev.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/cursor.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/gemini.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/generic.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/grok.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/kimi.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/mcp.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/openai_agents.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/feeds.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/sync.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agents_md.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/circuit_breaker.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/config.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/core/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/core/models.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/detector.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/engine.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/filters.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/base.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/claude_hooks.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/cursor_hooks.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/gemini_hooks.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/plain_json.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/mcp_server.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/models.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/_dangerous_patterns.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/bash_rate_limiter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_infra_mutation.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_paid_resource_creation.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_resource_deletion.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cross_account_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/destructive_confirmation_gate.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/docker_volume_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/dry_run_required.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/network_firewall_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/operation_journal.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/package_manager_in_chroot.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/production_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/remote_boot_partition_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/remote_chroot_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/ssh_destructive_command_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/subagent_safety_briefing.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/subagent_transcript_audit.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/system_scheduler_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/_helpers.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_form_labels.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_heading_hierarchy.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_image_alt.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_interactive_elements.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/mobile_responsive_patterns.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/mobile_touch_targets.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/style_focus_visible.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/style_no_arbitrary_values.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_bare_except.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_dangerous_migration.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_sql_injection.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_unnecessary_async.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_unsafe_shell.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_wildcard_import.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/commit_message_format.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/naming_conventions.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_dead_imports.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_error_handling_removal.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_file_creation_sprawl.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_large_diff.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/self_review_prompt.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_empty_state.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_lazy_loading.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_query_loading_state.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/env_credential_reference.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_bash_file_write.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_blocked_domain_fetch.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_compromised_action.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_leaked_secret_pattern.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_malicious_url_fetch.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_network_exfil.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/_helpers.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_open_graph.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_page_metadata.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_semantic_html.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_structured_data.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/cicd_pipeline_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/cli_integration.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/dependency_hygiene.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/drift_detector.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/file_scope.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/git_checkpoint.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/max_file_size.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_debug_artifacts.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_destructive_commands.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_env_commit.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_force_push.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_push_to_main.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_secrets.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_skip_hooks.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_test_weakening.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_todo_left.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_vulnerable_import.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_vulnerable_version_install.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/package_publish_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/test_with_changes.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/token_budget.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/py.typed +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/recorder.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/reporter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/session.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/setup.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/template.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/bash.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/git.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/paths.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/__init__.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_blocked_domain_fetch.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_compromised_action.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_leaked_secret_pattern.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_malicious_url_fetch.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_integration.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_pack_loads.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_post.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_pre.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cicd_pipeline_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_infra_mutation.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_paid_resource_creation.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_resource_deletion.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_docker_volume_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_edge_cases.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_env_credential_reference.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_frontend.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_git_checkpoint.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_network_firewall_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_vulnerable_import.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_vulnerable_version_install.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_package_manager_in_chroot.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_package_publish_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_python_post.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_python_pre.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_post.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_pre.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_stop.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_react.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_remote_boot_partition_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_remote_chroot_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_security_pre.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_seo.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_ssh_destructive_command_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_subagent_safety_briefing.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_subagent_transcript_audit.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_system_scheduler_guard.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_token_budget.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_post.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_pre.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_stop.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_adapter_utils.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_feeds.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agents_md.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_bash_utils.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_ci.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_circuit_breaker.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cli_integration.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_codex_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_config.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_continue_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cursor_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_custom_rules.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_detector.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_engine.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_file_scope.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_filters.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_gemini_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_generic_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_git.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_git_utils_checkpoint.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_grok_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_integration.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_kimi_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_main_module.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_mcp_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_mcp_server.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_models.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_openai_adapter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_packs_loader.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_paths_utils.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_quality_new_rules.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_recorder.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_reporter.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_rule_inventory.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_session.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_setup.py +0 -0
- {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_template.py +0 -0
|
@@ -11,9 +11,8 @@ build/
|
|
|
11
11
|
htmlcov/
|
|
12
12
|
.worktrees/
|
|
13
13
|
|
|
14
|
-
# Local AgentLint
|
|
15
|
-
#
|
|
16
|
-
agentlint.yml
|
|
14
|
+
# Local AgentLint hook artifacts. The repo-level agentlint.yml is committed so
|
|
15
|
+
# AgentLint dogfoods the same accepted patterns in local dev and CI.
|
|
17
16
|
.claude/
|
|
18
17
|
.codex/
|
|
19
18
|
.continue/
|
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v2.4.0 (2026-05-19) — AgentChute Local-First Onboarding
|
|
4
|
+
|
|
5
|
+
This release aligns AgentLint with the AgentChute pilot experience: local-first
|
|
6
|
+
policy enforcement, automatic durable event delivery, and one-command setup
|
|
7
|
+
flows that do not require users to understand hook files or queue internals.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Added `agentlint onboard` for updating/installing AgentLint, detecting coding
|
|
12
|
+
agents, installing or repairing hooks, saving AgentChute environment values,
|
|
13
|
+
validating connectivity, and running a safe verification event.
|
|
14
|
+
- Added `agentlint login` for AgentChute dashboard pairing, plus `agentlint
|
|
15
|
+
setup-agent` for adding or repairing Codex, Claude Code, Cursor, Gemini,
|
|
16
|
+
Kimi, Grok, and Continue hook integrations.
|
|
17
|
+
- Added `agentlint status`, `agentlint doctor --fix`, `agentlint test`,
|
|
18
|
+
`agentlint test-policy`, `agentlint queue ...`, `agentlint env ...`, and
|
|
19
|
+
`agentlint policy ...` commands for supportable first-run diagnostics.
|
|
20
|
+
- Added declarative AgentChute policy cache support with local-only hook
|
|
21
|
+
evaluation, strict schema validation, safe predicates, and self-degrading
|
|
22
|
+
behavior when cloud policy is missing or invalid.
|
|
23
|
+
- Added durable AgentChute event queueing and automatic background flushing so
|
|
24
|
+
API outages do not block hooks and normal users do not need to run manual
|
|
25
|
+
sync commands.
|
|
26
|
+
- Added a repo-local dogfood `agentlint.yml` so AgentLint uses its own rules in
|
|
27
|
+
development without enabling paid AgentChute upload by default.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- Changed the default AgentChute API origin to `https://api.agentchute.com/v1`
|
|
32
|
+
to match the deployed AgentChute product and dashboard docs.
|
|
33
|
+
- Changed Codex setup to write `[features].hooks = true` and remove deprecated
|
|
34
|
+
or misplaced `codex_hooks` keys from `~/.codex/config.toml`.
|
|
35
|
+
- Kept `agentlint sync` available as a support/debug flush command, while the
|
|
36
|
+
primary delivery path is now local spool plus automatic background upload.
|
|
37
|
+
|
|
38
|
+
### Compatibility
|
|
39
|
+
|
|
40
|
+
- Existing local AgentLint rules and hook integrations remain valid.
|
|
41
|
+
- AgentChute policy and upload behavior remain opt-in through
|
|
42
|
+
`AGENTCHUTE_ENABLED=true` plus a license key.
|
|
43
|
+
- Cloud policies are declarative JSON only; AgentLint never executes
|
|
44
|
+
cloud-provided Python or JavaScript.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## v2.3.1 (2026-05-15) — AgentChute Onboarding Polish
|
|
49
|
+
|
|
50
|
+
This release applies first-run AgentChute setup feedback from local Codex
|
|
51
|
+
dogfooding. It makes the install path less ambiguous and keeps diagnostics from
|
|
52
|
+
mutating or crashing on the local sync queue.
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- `agentlint init --team-key ...` now prints `AGENTCHUTE_API_URL` alongside the
|
|
57
|
+
license key and enable flag, so local AgentChute tests keep targeting the
|
|
58
|
+
local API instead of silently falling back to production defaults.
|
|
59
|
+
- `agentlint setup codex` now enables `codex_hooks = true` under `[features]` in
|
|
60
|
+
`~/.codex/config.toml`, and repairs stale root or nested `codex_hooks` keys
|
|
61
|
+
that can make Codex fail to load its config.
|
|
62
|
+
- Codex, Claude Code, and Cursor setup docs now include AgentChute local testing
|
|
63
|
+
env vars and restart/reload guidance.
|
|
64
|
+
- `agentlint sync --dry-run` now counts queued events without acquiring the
|
|
65
|
+
flush lock or advancing the delivery cursor.
|
|
66
|
+
- AgentChute queue flushing now treats lock acquisition failures as a locked
|
|
67
|
+
queue instead of crashing.
|
|
68
|
+
|
|
69
|
+
### Compatibility
|
|
70
|
+
|
|
71
|
+
- Existing hook files and AgentLint configs remain valid.
|
|
72
|
+
- Codex users must still restart Codex after enabling hooks; Codex loads hooks
|
|
73
|
+
when the session starts.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
3
77
|
## v2.3.0 (2026-05-14) — CI Signal Polish
|
|
4
78
|
|
|
5
79
|
This release applies real-world Codex and AgentLint dogfooding feedback. It
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentlint
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: Real-time quality guardrails for AI coding agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/mauhpr/agentlint
|
|
6
6
|
Project-URL: Repository, https://github.com/mauhpr/agentlint
|
|
@@ -62,7 +62,7 @@ We don't have a mature answer to that yet. Nobody does. The **autopilot pack** i
|
|
|
62
62
|
|
|
63
63
|
AgentLint ships with 76 rules across 8 packs and normalizes tool events across supported AI coding agents. The 23 **universal** rules and 7 **quality** rules work with any tech stack; 4 additional packs auto-activate based on your project files; the **security** pack is opt-in; and the **autopilot** pack is opt-in and experimental.
|
|
64
64
|
|
|
65
|
-
**v2.
|
|
65
|
+
**v2.4.0 highlights:** AgentChute local-first onboarding with `agentlint onboard`, dashboard pairing through `agentlint login`, `doctor --fix`, `status`, `test`, `test-policy`, policy cache diagnostics, durable queue inspection/flush commands, automatic background event upload, and the production `api.agentchute.com` default. Previous: safer Codex hook enablement, sync dry-run diagnostics, FastAPI-aware `no-unnecessary-async`, grouped text CI findings, repo-local accepted patterns through per-rule `ignore_paths`, AgentChute sync support from the default `pip install agentlint` package, hybrid cloud feeds, privacy-safe event queueing, multi-platform adapter architecture, unified `AgentEvent` taxonomy, `NormalizedTool` cross-platform mappings, MCP server, global config defaults, warning suppression, auto-suppress, `diff_only` mode, and `auto-fix` mode.
|
|
66
66
|
|
|
67
67
|
| Rule | Severity | What it does |
|
|
68
68
|
|------|----------|-------------|
|
|
@@ -26,7 +26,7 @@ We don't have a mature answer to that yet. Nobody does. The **autopilot pack** i
|
|
|
26
26
|
|
|
27
27
|
AgentLint ships with 76 rules across 8 packs and normalizes tool events across supported AI coding agents. The 23 **universal** rules and 7 **quality** rules work with any tech stack; 4 additional packs auto-activate based on your project files; the **security** pack is opt-in; and the **autopilot** pack is opt-in and experimental.
|
|
28
28
|
|
|
29
|
-
**v2.
|
|
29
|
+
**v2.4.0 highlights:** AgentChute local-first onboarding with `agentlint onboard`, dashboard pairing through `agentlint login`, `doctor --fix`, `status`, `test`, `test-policy`, policy cache diagnostics, durable queue inspection/flush commands, automatic background event upload, and the production `api.agentchute.com` default. Previous: safer Codex hook enablement, sync dry-run diagnostics, FastAPI-aware `no-unnecessary-async`, grouped text CI findings, repo-local accepted patterns through per-rule `ignore_paths`, AgentChute sync support from the default `pip install agentlint` package, hybrid cloud feeds, privacy-safe event queueing, multi-platform adapter architecture, unified `AgentEvent` taxonomy, `NormalizedTool` cross-platform mappings, MCP server, global config defaults, warning suppression, auto-suppress, `diff_only` mode, and `auto-fix` mode.
|
|
30
30
|
|
|
31
31
|
| Rule | Severity | What it does |
|
|
32
32
|
|------|----------|-------------|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# AgentLint dogfood configuration for the AgentLint repo.
|
|
2
|
+
|
|
3
|
+
stack: auto
|
|
4
|
+
severity: standard
|
|
5
|
+
|
|
6
|
+
packs:
|
|
7
|
+
- universal
|
|
8
|
+
- quality
|
|
9
|
+
- python
|
|
10
|
+
- security
|
|
11
|
+
- autopilot
|
|
12
|
+
|
|
13
|
+
rules:
|
|
14
|
+
no-secrets:
|
|
15
|
+
allow_paths:
|
|
16
|
+
- "README.md"
|
|
17
|
+
- "**/README.md"
|
|
18
|
+
- "CHANGELOG.md"
|
|
19
|
+
- "**/CHANGELOG.md"
|
|
20
|
+
- "tests/**"
|
|
21
|
+
- "**/tests/**"
|
|
22
|
+
- "src/agentlint/packs/security/no_leaked_secret_pattern.py"
|
|
23
|
+
- "**/src/agentlint/packs/security/no_leaked_secret_pattern.py"
|
|
24
|
+
max-file-size:
|
|
25
|
+
ignore_paths:
|
|
26
|
+
- "README.md"
|
|
27
|
+
- "**/README.md"
|
|
28
|
+
- "CHANGELOG.md"
|
|
29
|
+
- "**/CHANGELOG.md"
|
|
30
|
+
- "uv.lock"
|
|
31
|
+
- "**/uv.lock"
|
|
32
|
+
- "src/agentlint/cli.py"
|
|
33
|
+
- "**/src/agentlint/cli.py"
|
|
34
|
+
- "tests/test_agentchute_policy_queue_sync.py"
|
|
35
|
+
- "**/tests/test_agentchute_policy_queue_sync.py"
|
|
36
|
+
- "tests/test_cli.py"
|
|
37
|
+
- "**/tests/test_cli.py"
|
|
38
|
+
no-large-diff:
|
|
39
|
+
ignore_paths:
|
|
40
|
+
- "src/agentlint/cli.py"
|
|
41
|
+
- "**/src/agentlint/cli.py"
|
|
42
|
+
- "src/agentlint/agentchute/client.py"
|
|
43
|
+
- "**/src/agentlint/agentchute/client.py"
|
|
44
|
+
- "src/agentlint/agentchute/policy.py"
|
|
45
|
+
- "**/src/agentlint/agentchute/policy.py"
|
|
46
|
+
cli-integration:
|
|
47
|
+
timeout: 20
|
|
48
|
+
diff_only: true
|
|
49
|
+
commands:
|
|
50
|
+
- name: pytest-focused
|
|
51
|
+
on: ["Write", "Edit"]
|
|
52
|
+
glob: "src/**/*.py"
|
|
53
|
+
command: "uv run pytest tests/test_cli.py tests/test_agentchute_client.py -q"
|
|
54
|
+
timeout: 60
|
|
55
|
+
severity: warning
|
|
56
|
+
no-bash-file-write:
|
|
57
|
+
allow_paths:
|
|
58
|
+
- "agentlint.yml"
|
|
59
|
+
- ".claude/settings.json"
|
|
60
|
+
- ".cursor/hooks.json"
|
|
61
|
+
- ".codex/hooks.json"
|
|
62
|
+
- ".kimi/hooks.json"
|
|
63
|
+
- ".grok/settings.json"
|
|
64
|
+
- ".gemini/settings.json"
|
|
65
|
+
- ".continue/settings.json"
|
|
66
|
+
no-network-exfil:
|
|
67
|
+
allowed_hosts:
|
|
68
|
+
- "api.agentchute.com"
|
|
69
|
+
|
|
70
|
+
agentchute:
|
|
71
|
+
enabled: false
|
|
72
|
+
policy:
|
|
73
|
+
enabled: true
|
|
74
|
+
missing_required_pack: warn_local_fail_ci
|
|
@@ -18,6 +18,17 @@ This creates `.claude/settings.json` in your project root with hooks for:
|
|
|
18
18
|
- `Notification` — notification-triggered rules
|
|
19
19
|
- `Stop` — session summary report
|
|
20
20
|
|
|
21
|
+
For AgentChute local testing, set the API URL before starting Claude Code:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
export AGENTCHUTE_API_URL=http://localhost:8000/v1
|
|
25
|
+
export AGENTCHUTE_LICENSE_KEY=ac_team_...
|
|
26
|
+
export AGENTCHUTE_ENABLED=true
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Restart Claude Code in the project after running `agentlint setup claude` so it
|
|
30
|
+
loads the updated hook config.
|
|
31
|
+
|
|
21
32
|
## Hook Format
|
|
22
33
|
|
|
23
34
|
Claude Code uses a JSON-based hook protocol:
|
|
@@ -74,6 +85,7 @@ Removes only AgentLint hooks; preserves any other custom hooks you have configur
|
|
|
74
85
|
**Hooks not firing?**
|
|
75
86
|
- Verify `.claude/settings.json` exists and contains a `"hooks"` key
|
|
76
87
|
- Check that the `agentlint` binary is on PATH or that `agentlint setup` embedded an absolute path
|
|
88
|
+
- Restart Claude Code after installing hooks
|
|
77
89
|
- Run `agentlint doctor` to diagnose installation issues
|
|
78
90
|
|
|
79
91
|
**Blocking rules not actually blocking?**
|
|
@@ -16,6 +16,35 @@ This creates `.codex/hooks.json` in your project root with hooks for:
|
|
|
16
16
|
- `SessionStart` — session initialization
|
|
17
17
|
- `Stop` — session summary report
|
|
18
18
|
|
|
19
|
+
Codex also requires native hooks to be enabled globally. `agentlint setup codex`
|
|
20
|
+
updates `~/.codex/config.toml` for you by adding the flag under `[features]`:
|
|
21
|
+
|
|
22
|
+
```toml
|
|
23
|
+
[features]
|
|
24
|
+
hooks = true
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Do not append `hooks = true` to the end of `config.toml` manually. TOML
|
|
28
|
+
assigns bare keys to the most recent table, so appending after a section such as
|
|
29
|
+
`[tui.model_availability_nux]` can make Codex fail to load its config.
|
|
30
|
+
AgentLint also removes legacy or misplaced `codex_hooks` keys when it repairs
|
|
31
|
+
Codex setup.
|
|
32
|
+
|
|
33
|
+
Restart Codex from the terminal where your AgentLint/AgentChute environment
|
|
34
|
+
variables are set:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
codex
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
For AgentChute local testing, set the API URL before starting Codex:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
export AGENTCHUTE_API_URL=http://localhost:8000/v1
|
|
44
|
+
export AGENTCHUTE_LICENSE_KEY=ac_team_...
|
|
45
|
+
export AGENTCHUTE_ENABLED=true
|
|
46
|
+
```
|
|
47
|
+
|
|
19
48
|
## Important: Codex Hook Coverage
|
|
20
49
|
|
|
21
50
|
Codex's PreToolUse hook currently only reliably intercepts **Bash tool calls**. Coverage for `apply_patch` edits and MCP tool calls is intermittent and depends on the Codex CLI version. This is a known upstream limitation.
|
|
@@ -71,6 +100,13 @@ Removes only AgentLint hooks; preserves any other custom hooks you have configur
|
|
|
71
100
|
- Ensure your Codex CLI is up to date; hook support is evolving rapidly
|
|
72
101
|
- Bash tool calls should always trigger PreToolUse hooks
|
|
73
102
|
|
|
103
|
+
**No events in AgentChute?**
|
|
104
|
+
- Ensure `hooks = true` is present under `[features]` in `~/.codex/config.toml`
|
|
105
|
+
- Start a fresh Codex session after running `agentlint setup codex`
|
|
106
|
+
- Launch Codex from the same terminal where `AGENTCHUTE_API_URL`, `AGENTCHUTE_LICENSE_KEY`, and `AGENTCHUTE_ENABLED` are exported
|
|
107
|
+
- Run `agentlint agentchute status` from the project root
|
|
108
|
+
- If events are queued, run `agentlint agentchute flush` as a support/debug step
|
|
109
|
+
|
|
74
110
|
**Need full file-write coverage?**
|
|
75
111
|
- Consider using AgentLint's MCP server alongside hooks for pre-validation
|
|
76
112
|
- Run `agentlint doctor` for alternative integration suggestions
|
|
@@ -17,6 +17,17 @@ This creates `.cursor/hooks.json` in your project root with hooks for:
|
|
|
17
17
|
- `subagentStart` / `subagentStop` — subagent safety
|
|
18
18
|
- `stop` — session summary report
|
|
19
19
|
|
|
20
|
+
For AgentChute local testing, set the API URL before launching Cursor:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
export AGENTCHUTE_API_URL=http://localhost:8000/v1
|
|
24
|
+
export AGENTCHUTE_LICENSE_KEY=ac_team_...
|
|
25
|
+
export AGENTCHUTE_ENABLED=true
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Reload the Cursor window after running `agentlint setup cursor` so it loads the
|
|
29
|
+
updated hook config.
|
|
30
|
+
|
|
20
31
|
## Hook Format
|
|
21
32
|
|
|
22
33
|
Cursor hooks use a JSON-based protocol:
|
|
@@ -57,3 +68,12 @@ agentlint uninstall cursor
|
|
|
57
68
|
| `CURSOR_SESSION_ID` | Session ID for state tracking |
|
|
58
69
|
| `AGENTLINT_PROJECT_DIR` | Generic project directory (takes precedence) |
|
|
59
70
|
| `AGENTLINT_SESSION_ID` | Generic session ID (takes precedence) |
|
|
71
|
+
|
|
72
|
+
## Troubleshooting
|
|
73
|
+
|
|
74
|
+
**No events in AgentChute?**
|
|
75
|
+
- Verify `.cursor/hooks.json` exists in the project
|
|
76
|
+
- Reload the Cursor window after installing hooks
|
|
77
|
+
- Ensure Cursor inherits `AGENTCHUTE_API_URL`, `AGENTCHUTE_LICENSE_KEY`, and `AGENTCHUTE_ENABLED`
|
|
78
|
+
- Run `agentlint agentchute status` from the project root
|
|
79
|
+
- If events are queued, run `agentlint agentchute flush` as a support/debug step
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Codex CLI adapter for AgentLint.
|
|
2
2
|
|
|
3
3
|
OpenAI Codex CLI provides a native hooks system with 6 lifecycle events.
|
|
4
|
-
Configuration is done via JSON in ~/.codex/hooks.json (requires
|
|
4
|
+
Configuration is done via JSON in ~/.codex/hooks.json (requires hooks = true under [features]).
|
|
5
5
|
|
|
6
6
|
Reference: https://developers.openai.com/codex/hooks
|
|
7
7
|
"""
|
|
@@ -37,7 +37,7 @@ ENV_AGENTCHUTE_API_URL = "AGENTCHUTE_API_URL"
|
|
|
37
37
|
|
|
38
38
|
# Default API URL for the paid AgentChute product. Override per-deployment
|
|
39
39
|
# with AGENTCHUTE_API_URL.
|
|
40
|
-
DEFAULT_API_URL = "https://api.agentchute.
|
|
40
|
+
DEFAULT_API_URL = "https://api.agentchute.com/v1"
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def is_agentchute_enabled(config: Any | None = None) -> bool:
|
|
@@ -160,6 +160,8 @@ def validate_policy(policy: Any) -> list[str]:
|
|
|
160
160
|
continue
|
|
161
161
|
if not isinstance(rule.get("id"), str) or not rule["id"]:
|
|
162
162
|
errors.append(f"{prefix}.id is required")
|
|
163
|
+
if rule.get("tool") == "Any":
|
|
164
|
+
errors.append(f"{prefix}.tool must be omitted to match any tool")
|
|
163
165
|
if rule.get("severity", "warning") not in {"error", "warning", "info"}:
|
|
164
166
|
errors.append(f"{prefix}.severity is invalid")
|
|
165
167
|
if rule.get("event") and rule["event"] not in {e.value for e in HookEvent}:
|
|
@@ -202,13 +204,17 @@ def required_packs(policy: dict | None = None) -> list[dict]:
|
|
|
202
204
|
if not policy:
|
|
203
205
|
return []
|
|
204
206
|
packs = policy.get("required_packs") or []
|
|
205
|
-
return [p for p in packs if isinstance(p, dict) and p.get("name")]
|
|
207
|
+
return [p for p in packs if isinstance(p, dict) and (p.get("name") or p.get("id"))]
|
|
206
208
|
|
|
207
209
|
|
|
208
210
|
def missing_required_packs(policy: dict | None = None) -> list[str]:
|
|
209
211
|
missing: list[str] = []
|
|
210
212
|
for pack in required_packs(policy):
|
|
211
|
-
|
|
213
|
+
if pack.get("type") == "cloud_feed" or pack.get("managed_by") == "agentchute":
|
|
214
|
+
continue
|
|
215
|
+
name = str(pack.get("name") or "")
|
|
216
|
+
if not name:
|
|
217
|
+
continue
|
|
212
218
|
try:
|
|
213
219
|
package_version(name)
|
|
214
220
|
except PackageNotFoundError:
|
|
@@ -140,10 +140,31 @@ def flush_queue(
|
|
|
140
140
|
"""Flush queued events to AgentChute in bounded batches."""
|
|
141
141
|
result = FlushResult()
|
|
142
142
|
client = AgentChuteClient.from_env()
|
|
143
|
-
if client is None:
|
|
143
|
+
if client is None and not dry_run:
|
|
144
144
|
result.aborted_reason = "AGENTCHUTE_LICENSE_KEY not set"
|
|
145
145
|
return result
|
|
146
146
|
|
|
147
|
+
if dry_run:
|
|
148
|
+
cursor = int(_load_json(_cursor_path(), {"offset": 0}).get("offset", 0))
|
|
149
|
+
lines = _read_lines()
|
|
150
|
+
if cursor >= len(lines):
|
|
151
|
+
return result
|
|
152
|
+
pending = lines[cursor:]
|
|
153
|
+
if max_events is not None:
|
|
154
|
+
pending = pending[:max_events]
|
|
155
|
+
for raw in pending:
|
|
156
|
+
if not raw.strip():
|
|
157
|
+
result.skipped += 1
|
|
158
|
+
continue
|
|
159
|
+
try:
|
|
160
|
+
json.loads(raw)
|
|
161
|
+
except json.JSONDecodeError:
|
|
162
|
+
result.skipped += 1
|
|
163
|
+
continue
|
|
164
|
+
result.attempted += 1
|
|
165
|
+
result.delivered += 1
|
|
166
|
+
return result
|
|
167
|
+
|
|
147
168
|
if not _acquire_lock():
|
|
148
169
|
result.locked = True
|
|
149
170
|
return result
|
|
@@ -271,6 +292,9 @@ def _acquire_lock() -> bool:
|
|
|
271
292
|
return False
|
|
272
293
|
return _acquire_lock()
|
|
273
294
|
return False
|
|
295
|
+
except OSError:
|
|
296
|
+
logger.debug("agentlint.agentchute: could not acquire flush lock", exc_info=True)
|
|
297
|
+
return False
|
|
274
298
|
|
|
275
299
|
|
|
276
300
|
def _release_lock() -> None:
|