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.
Files changed (266) hide show
  1. {agentlint-2.3.0 → agentlint-2.4.0}/.gitignore +2 -3
  2. {agentlint-2.3.0 → agentlint-2.4.0}/CHANGELOG.md +74 -0
  3. {agentlint-2.3.0 → agentlint-2.4.0}/PKG-INFO +2 -2
  4. {agentlint-2.3.0 → agentlint-2.4.0}/README.md +1 -1
  5. agentlint-2.4.0/agentlint.yml +74 -0
  6. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-claude.md +12 -0
  7. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-codex.md +36 -0
  8. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-cursor.md +20 -0
  9. {agentlint-2.3.0 → agentlint-2.4.0}/pyproject.toml +1 -1
  10. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/__init__.py +1 -1
  11. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/codex.py +1 -1
  12. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/client.py +1 -1
  13. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/policy.py +8 -2
  14. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/queue.py +25 -1
  15. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/cli.py +1020 -41
  16. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_compromised_dependency.py +1 -1
  17. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/token_burn_against_team_budget.py +2 -2
  18. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_compromised_dependency.py +1 -1
  19. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_token_burn_against_team_budget.py +1 -1
  20. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_client.py +1 -1
  21. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_policy_queue_sync.py +112 -1
  22. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cli.py +1059 -3
  23. {agentlint-2.3.0 → agentlint-2.4.0}/uv.lock +1 -1
  24. {agentlint-2.3.0 → agentlint-2.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {agentlint-2.3.0 → agentlint-2.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  26. {agentlint-2.3.0 → agentlint-2.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {agentlint-2.3.0 → agentlint-2.4.0}/.github/workflows/ci.yml +0 -0
  28. {agentlint-2.3.0 → agentlint-2.4.0}/.github/workflows/publish.yml +0 -0
  29. {agentlint-2.3.0 → agentlint-2.4.0}/.python-version +0 -0
  30. {agentlint-2.3.0 → agentlint-2.4.0}/CODE_OF_CONDUCT.md +0 -0
  31. {agentlint-2.3.0 → agentlint-2.4.0}/CONTRIBUTING.md +0 -0
  32. {agentlint-2.3.0 → agentlint-2.4.0}/LICENSE +0 -0
  33. {agentlint-2.3.0 → agentlint-2.4.0}/SECURITY.md +0 -0
  34. {agentlint-2.3.0 → agentlint-2.4.0}/agentlint.yml.example +0 -0
  35. {agentlint-2.3.0 → agentlint-2.4.0}/codecov.yml +0 -0
  36. {agentlint-2.3.0 → agentlint-2.4.0}/docs/README.md +0 -0
  37. {agentlint-2.3.0 → agentlint-2.4.0}/docs/adapters.md +0 -0
  38. {agentlint-2.3.0 → agentlint-2.4.0}/docs/architecture.md +0 -0
  39. {agentlint-2.3.0 → agentlint-2.4.0}/docs/configuration.md +0 -0
  40. {agentlint-2.3.0 → agentlint-2.4.0}/docs/custom-rules.md +0 -0
  41. {agentlint-2.3.0 → agentlint-2.4.0}/docs/mcp.md +0 -0
  42. {agentlint-2.3.0 → agentlint-2.4.0}/docs/migration-v2.md +0 -0
  43. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-continue.md +0 -0
  44. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-gemini.md +0 -0
  45. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-generic.md +0 -0
  46. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-grok.md +0 -0
  47. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-kimi.md +0 -0
  48. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-mcp.md +0 -0
  49. {agentlint-2.3.0 → agentlint-2.4.0}/docs/setup-openai.md +0 -0
  50. {agentlint-2.3.0 → agentlint-2.4.0}/docs/subagent-safety.md +0 -0
  51. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/.claude-plugin/plugin.json +0 -0
  52. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/doctor.md +0 -0
  53. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/fix.md +0 -0
  54. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/agents/security-audit.md +0 -0
  55. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/bin/resolve-and-run.sh +0 -0
  56. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/commands/lint-config.md +0 -0
  57. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/commands/lint-status.md +0 -0
  58. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/hooks/hooks.json +0 -0
  59. {agentlint-2.3.0 → agentlint-2.4.0}/plugin/mcp.json +0 -0
  60. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/__main__.py +0 -0
  61. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/__init__.py +0 -0
  62. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/_utils.py +0 -0
  63. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/base.py +0 -0
  64. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/claude.py +0 -0
  65. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/continue_dev.py +0 -0
  66. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/cursor.py +0 -0
  67. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/gemini.py +0 -0
  68. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/generic.py +0 -0
  69. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/grok.py +0 -0
  70. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/kimi.py +0 -0
  71. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/mcp.py +0 -0
  72. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/adapters/openai_agents.py +0 -0
  73. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/__init__.py +0 -0
  74. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/feeds.py +0 -0
  75. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agentchute/sync.py +0 -0
  76. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/agents_md.py +0 -0
  77. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/circuit_breaker.py +0 -0
  78. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/config.py +0 -0
  79. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/core/__init__.py +0 -0
  80. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/core/models.py +0 -0
  81. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/detector.py +0 -0
  82. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/engine.py +0 -0
  83. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/filters.py +0 -0
  84. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/__init__.py +0 -0
  85. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/base.py +0 -0
  86. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/claude_hooks.py +0 -0
  87. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/cursor_hooks.py +0 -0
  88. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/gemini_hooks.py +0 -0
  89. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/formats/plain_json.py +0 -0
  90. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/mcp_server.py +0 -0
  91. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/models.py +0 -0
  92. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/__init__.py +0 -0
  93. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/__init__.py +0 -0
  94. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/_dangerous_patterns.py +0 -0
  95. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/bash_rate_limiter.py +0 -0
  96. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_infra_mutation.py +0 -0
  97. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_paid_resource_creation.py +0 -0
  98. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cloud_resource_deletion.py +0 -0
  99. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/cross_account_guard.py +0 -0
  100. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/destructive_confirmation_gate.py +0 -0
  101. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/docker_volume_guard.py +0 -0
  102. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/dry_run_required.py +0 -0
  103. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/network_firewall_guard.py +0 -0
  104. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/operation_journal.py +0 -0
  105. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/package_manager_in_chroot.py +0 -0
  106. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/production_guard.py +0 -0
  107. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/remote_boot_partition_guard.py +0 -0
  108. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/remote_chroot_guard.py +0 -0
  109. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/ssh_destructive_command_guard.py +0 -0
  110. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/subagent_safety_briefing.py +0 -0
  111. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/subagent_transcript_audit.py +0 -0
  112. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/autopilot/system_scheduler_guard.py +0 -0
  113. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/__init__.py +0 -0
  114. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/_helpers.py +0 -0
  115. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_form_labels.py +0 -0
  116. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_heading_hierarchy.py +0 -0
  117. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_image_alt.py +0 -0
  118. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/a11y_interactive_elements.py +0 -0
  119. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/mobile_responsive_patterns.py +0 -0
  120. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/mobile_touch_targets.py +0 -0
  121. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/style_focus_visible.py +0 -0
  122. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/frontend/style_no_arbitrary_values.py +0 -0
  123. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/__init__.py +0 -0
  124. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_bare_except.py +0 -0
  125. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_dangerous_migration.py +0 -0
  126. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_sql_injection.py +0 -0
  127. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_unnecessary_async.py +0 -0
  128. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_unsafe_shell.py +0 -0
  129. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/python/no_wildcard_import.py +0 -0
  130. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/__init__.py +0 -0
  131. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/commit_message_format.py +0 -0
  132. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/naming_conventions.py +0 -0
  133. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_dead_imports.py +0 -0
  134. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_error_handling_removal.py +0 -0
  135. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_file_creation_sprawl.py +0 -0
  136. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/no_large_diff.py +0 -0
  137. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/quality/self_review_prompt.py +0 -0
  138. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/__init__.py +0 -0
  139. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_empty_state.py +0 -0
  140. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_lazy_loading.py +0 -0
  141. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/react/react_query_loading_state.py +0 -0
  142. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/__init__.py +0 -0
  143. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/env_credential_reference.py +0 -0
  144. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_bash_file_write.py +0 -0
  145. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_blocked_domain_fetch.py +0 -0
  146. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_compromised_action.py +0 -0
  147. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_leaked_secret_pattern.py +0 -0
  148. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_malicious_url_fetch.py +0 -0
  149. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/security/no_network_exfil.py +0 -0
  150. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/__init__.py +0 -0
  151. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/_helpers.py +0 -0
  152. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_open_graph.py +0 -0
  153. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_page_metadata.py +0 -0
  154. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_semantic_html.py +0 -0
  155. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/seo/seo_structured_data.py +0 -0
  156. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/__init__.py +0 -0
  157. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/cicd_pipeline_guard.py +0 -0
  158. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/cli_integration.py +0 -0
  159. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/dependency_hygiene.py +0 -0
  160. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/drift_detector.py +0 -0
  161. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/file_scope.py +0 -0
  162. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/git_checkpoint.py +0 -0
  163. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/max_file_size.py +0 -0
  164. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_debug_artifacts.py +0 -0
  165. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_destructive_commands.py +0 -0
  166. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_env_commit.py +0 -0
  167. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_force_push.py +0 -0
  168. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_push_to_main.py +0 -0
  169. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_secrets.py +0 -0
  170. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_skip_hooks.py +0 -0
  171. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_test_weakening.py +0 -0
  172. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_todo_left.py +0 -0
  173. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_vulnerable_import.py +0 -0
  174. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/no_vulnerable_version_install.py +0 -0
  175. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/package_publish_guard.py +0 -0
  176. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/test_with_changes.py +0 -0
  177. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/packs/universal/token_budget.py +0 -0
  178. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/py.typed +0 -0
  179. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/recorder.py +0 -0
  180. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/reporter.py +0 -0
  181. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/session.py +0 -0
  182. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/setup.py +0 -0
  183. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/template.py +0 -0
  184. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/__init__.py +0 -0
  185. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/bash.py +0 -0
  186. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/git.py +0 -0
  187. {agentlint-2.3.0 → agentlint-2.4.0}/src/agentlint/utils/paths.py +0 -0
  188. {agentlint-2.3.0 → agentlint-2.4.0}/tests/__init__.py +0 -0
  189. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/__init__.py +0 -0
  190. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_blocked_domain_fetch.py +0 -0
  191. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_compromised_action.py +0 -0
  192. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_leaked_secret_pattern.py +0 -0
  193. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/security/test_no_malicious_url_fetch.py +0 -0
  194. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_integration.py +0 -0
  195. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_pack_loads.py +0 -0
  196. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_post.py +0 -0
  197. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_autopilot_pre.py +0 -0
  198. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cicd_pipeline_guard.py +0 -0
  199. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_infra_mutation.py +0 -0
  200. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_paid_resource_creation.py +0 -0
  201. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_cloud_resource_deletion.py +0 -0
  202. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_docker_volume_guard.py +0 -0
  203. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_edge_cases.py +0 -0
  204. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_env_credential_reference.py +0 -0
  205. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_frontend.py +0 -0
  206. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_git_checkpoint.py +0 -0
  207. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_network_firewall_guard.py +0 -0
  208. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_vulnerable_import.py +0 -0
  209. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_no_vulnerable_version_install.py +0 -0
  210. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_package_manager_in_chroot.py +0 -0
  211. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_package_publish_guard.py +0 -0
  212. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_python_post.py +0 -0
  213. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_python_pre.py +0 -0
  214. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_post.py +0 -0
  215. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_pre.py +0 -0
  216. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_quality_stop.py +0 -0
  217. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_react.py +0 -0
  218. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_remote_boot_partition_guard.py +0 -0
  219. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_remote_chroot_guard.py +0 -0
  220. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_security_pre.py +0 -0
  221. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_seo.py +0 -0
  222. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_ssh_destructive_command_guard.py +0 -0
  223. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_subagent_safety_briefing.py +0 -0
  224. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_subagent_transcript_audit.py +0 -0
  225. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_system_scheduler_guard.py +0 -0
  226. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_token_budget.py +0 -0
  227. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_post.py +0 -0
  228. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_pre.py +0 -0
  229. {agentlint-2.3.0 → agentlint-2.4.0}/tests/packs/test_universal_stop.py +0 -0
  230. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_adapter_utils.py +0 -0
  231. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agentchute_feeds.py +0 -0
  232. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_agents_md.py +0 -0
  233. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_bash_utils.py +0 -0
  234. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_ci.py +0 -0
  235. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_circuit_breaker.py +0 -0
  236. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cli_integration.py +0 -0
  237. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_codex_adapter.py +0 -0
  238. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_config.py +0 -0
  239. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_continue_adapter.py +0 -0
  240. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_cursor_adapter.py +0 -0
  241. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_custom_rules.py +0 -0
  242. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_detector.py +0 -0
  243. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_engine.py +0 -0
  244. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_file_scope.py +0 -0
  245. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_filters.py +0 -0
  246. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_gemini_adapter.py +0 -0
  247. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_generic_adapter.py +0 -0
  248. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_git.py +0 -0
  249. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_git_utils_checkpoint.py +0 -0
  250. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_grok_adapter.py +0 -0
  251. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_integration.py +0 -0
  252. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_kimi_adapter.py +0 -0
  253. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_main_module.py +0 -0
  254. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_mcp_adapter.py +0 -0
  255. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_mcp_server.py +0 -0
  256. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_models.py +0 -0
  257. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_openai_adapter.py +0 -0
  258. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_packs_loader.py +0 -0
  259. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_paths_utils.py +0 -0
  260. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_quality_new_rules.py +0 -0
  261. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_recorder.py +0 -0
  262. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_reporter.py +0 -0
  263. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_rule_inventory.py +0 -0
  264. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_session.py +0 -0
  265. {agentlint-2.3.0 → agentlint-2.4.0}/tests/test_setup.py +0 -0
  266. {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 dogfood/setup artifacts. Keep agentlint.yml.example and docs
15
- # committed; generated hook configs often contain absolute local paths.
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.0
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.3.0 highlights:** Codex dogfooding polish with FastAPI-aware `no-unnecessary-async`, grouped text CI findings, and repo-local accepted patterns through per-rule `ignore_paths`. Previous: Install experience polish, `agentlint --version`, AgentChute sync support from the default `pip install agentlint` package, public documentation cleanup, AgentChute-ready team sync, hybrid cloud feeds, privacy-safe event queueing, multi-platform adapter architecture, unified `AgentEvent` taxonomy, `NormalizedTool` cross-platform mappings, session summary dashboard, MCP server, global config defaults, warning suppression, auto-suppress, `diff_only` mode, and `auto-fix` mode.
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.3.0 highlights:** Codex dogfooding polish with FastAPI-aware `no-unnecessary-async`, grouped text CI findings, and repo-local accepted patterns through per-rule `ignore_paths`. Previous: Install experience polish, `agentlint --version`, AgentChute sync support from the default `pip install agentlint` package, public documentation cleanup, AgentChute-ready team sync, hybrid cloud feeds, privacy-safe event queueing, multi-platform adapter architecture, unified `AgentEvent` taxonomy, `NormalizedTool` cross-platform mappings, session summary dashboard, MCP server, global config defaults, warning suppression, auto-suppress, `diff_only` mode, and `auto-fix` mode.
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentlint"
3
- version = "2.3.0"
3
+ version = "2.4.0"
4
4
  description = "Real-time quality guardrails for AI coding agents"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  """AgentLint - Real-time quality guardrails for AI coding agents."""
2
2
 
3
- __version__ = "2.3.0"
3
+ __version__ = "2.4.0"
4
4
 
5
5
  from agentlint.core.models import (
6
6
  AgentEvent,
@@ -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 codex_hooks = true in config.toml).
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.io/v1"
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
- name = str(pack["name"])
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: