Observed since 20 Oct, 23:10 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agent-readiness-scorecard
A tool to analyze codebases for AI-Agent Friendliness
Is your codebase ready for the AI workforce?
agent-readiness-scorecard is a CLI tool that analyzes your Python project to determine how "friendly" it is for AI Agents (like Jules, Copilot, Gemini, or Devin).
AI Agents struggle with:
This tool scores your repo and helps you fix it.
pip install agent-readiness-scorecard
Run the scorecard on your current directory:
agent-score .
Different agents have different strengths. Optimize for specific workflows:
--agent=generic (Default): Balanced checks for readability and types.--agent=jules: Strict typing and high documentation requirements (expects agents.md).--agent=copilot: Focuses on small file sizes for autocomplete efficiency.Bootstrap your repository with the necessary context files and skeleton docstrings:
agent-score . --fix
Generate a detailed report for your team or CI/CD logs. Control the level of detail with --report-style:
agent-score . --report scorecard.md --report-style actionable
--report-style=full: Includes all sections and a complete breakdown of every file.--report-style=actionable (Default): Focuses on issues; hides passing files and high-coverage type safety rows.--report-style=collapsed: (Minimal) Only includes the Executive Summary.agent-readiness-scorecard can be configured via pyproject.toml, .agent-readiness-scorecard.json, or CLI flags.
Settings are resolved in the following order (highest to lowest):
--agent, --verbosity)pyproject.toml or .agent-readiness-scorecard.json)You can control how much visual noise the scorecard generates by adding the verbosity or report_style keys to your pyproject.toml.
[tool.agent-readiness-scorecard]
# Control CLI output (quiet, summary, detailed)
verbosity = "summary"
# Control Markdown report detail (collapsed, actionable, full)
report_style = "actionable"
[tool.agent-readiness-scorecard.thresholds]
acl_yellow = 10
acl_red = 15
type_safety = 90
# Language-specific overrides
[tool.agent-readiness-scorecard.javascript.thresholds]
acl_yellow = 12
acl_red = 18
[tool.agent-readiness-scorecard.markdown.thresholds]
token_limit = 64000
| Level | Description |
|---|---|
quiet | Suppresses tables; only prints the Final Score and Project-Wide Issues. Ideal for CI/CD. |
summary | (Default) Displays Environment Health and actionable files with issues. Perfect scores (100) are hidden to reduce noise. |
detailed | Deep-dive mode. Provides a full breakdown of every file, using progressive disclosure for passing metrics. |
Used when generating a report via the --report flag.
| Style | Description |
|---|---|
collapsed | (Minimal) Only includes the Executive Summary. |
actionable | (Default) Focuses on issues: hides passing files and high-coverage type safety rows from tables. |
full | Includes all sections and a complete breakdown of every file and metric. |
Your codebase starts at 100 points. Penalties are applied for:
| Metric | Penalty | Why? |
|---|---|---|
| Bloated Files | -1 pt per 10 lines > 200 | Agents lose focus in large files. |
| High ACL | -15 (Red) / -5 (Yellow) | Agent Cognitive Load: (Depth*2) + (Complexity*1.5) + (LOC/50). Target <= 10. |
| Missing Types | -20 pts if coverage < 90% | Agents need types to call functions correctly. |
| Missing Context | -15 pts per missing file | agents.md acts as the System Prompt for your repo. |
| God Modules | -10 pts per module | Modules with > 50 inbound imports overload context. |
| High Entropy | -5 pts per directory | Folders with > 50 files confuse retrieval tools. |
| Circular Deps | -5 pts per cycle | Causes infinite recursion in agent planning. |
To get a perfect score, your project should look like this:
my-project/
├── agents.md # High-level architecture map for the Agent
├── instructions.md # Testing/Linting commands for the Agent
└── src/ # Your source code (Typed & Docstringed)
The beta branch includes upcoming capabilities for enhanced agent-readiness:
pyproject.toml Configuration: Centralize settings alongside your other tools.check-prompts): Validate your system prompts against LLM best practices (Role Definition, Few-Shot, etc.).--verbosity): Choose between quiet, summary (default), or detailed output.Show off your Agent-Readiness! Run agent-score --badge to generate an agent_score.svg for your repo.
Optimize your CI/CD pipeline by scoring only the files changed in a Pull Request.
The provided GitHub Action defaults to Diff-Aware Reporting. This means that in a Pull Request, the scorecard will automatically detect and only score the files you've modified.
Benefits:
You can use the --diff flag to analyze only the files that have changed compared to a base reference (default: origin/main). This is useful for quickly checking your work before committing.
# Check only changed files (compared to origin/main)
agent-score --diff
# Check changes compared to a specific branch or commit
agent-score --diff --diff-base HEAD^
You can also manually use the --limit-to flag to restrict analysis to a subset of files. You can provide the flag multiple times. If used with --diff, it will analyze the intersection of changed files and the specified files.
# Score only specific files
agent-score score . --limit-to src/core.py --limit-to src/utils.py
Static analysis for your LLM prompts. Ensure your system prompts follow best practices before deploying them to production.
agent-score check-prompts prompts/system_v1.txt
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
clickEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | click>=8.0.0 | runtime |
mccabeEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mccabe>=0.7.0 | runtime |
networkxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | networkx>=3.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0.0 | runtime |
richEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | rich>=13.0.0 | runtime |
tiktokenEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tiktoken>=0.7.0 | runtime |
tomliEnvironment{
"extras": "",
"marker": "python_version < \"3.11\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tomli>=2.0.0; python_version < "3.11" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.0.0; extra == "all" | runtime |
tree-sitter-javascriptEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-javascript>=0.21.0; extra == "all" | runtime |
tree-sitter-typescriptEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-typescript>=0.21.0; extra == "all" | runtime |
tree-sitterEnvironment{
"extras": "",
"marker": "extra == \"all\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter>=0.22.0; extra == "all" | runtime |
banditEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | bandit>=1.7.0; extra == "dev" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.0.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.9.0; extra == "dev" | runtime |
pip-auditEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pip-audit>=2.7.0; extra == "dev" | runtime |
pre-commitEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pre-commit>=3.6.0; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=8.0.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.3.0; extra == "dev" | runtime |
tree-sitter-javascriptEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-javascript>=0.21.0; extra == "dev" | runtime |
tree-sitter-typescriptEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-typescript>=0.21.0; extra == "dev" | runtime |
tree-sitterEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter>=0.22.0; extra == "dev" | runtime |
types-clickEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-click; extra == "dev" | runtime |
types-networkxEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-networkx; extra == "dev" | runtime |
types-pyyamlEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-pyyaml; extra == "dev" | runtime |
types-requestsEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-requests; extra == "dev" | runtime |
types-tabulateEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-tabulate; extra == "dev" | runtime |
types-tomlEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | types-toml; extra == "dev" | runtime |
litellmEnvironment{
"extras": "",
"marker": "extra == \"llm\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | litellm>=1.0.0; extra == "llm" | runtime |
tree-sitter-javascriptEnvironment{
"extras": "",
"marker": "extra == \"treesitter\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-javascript>=0.21.0; extra == "treesitter" | runtime |
tree-sitter-typescriptEnvironment{
"extras": "",
"marker": "extra == \"treesitter\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter-typescript>=0.21.0; extra == "treesitter" | runtime |
tree-sitterEnvironment{
"extras": "",
"marker": "extra == \"treesitter\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tree-sitter>=0.22.0; extra == "treesitter" | runtime |
bdist_wheel · 53.17 KB · Python py3
sdist · 273.01 KB · Python source
Shared repository data · GitHub
Observed since 20 Oct, 23:10 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:acbe349c8bf69d1c008fd9e3dfa43b92a44779d366a4345669fd2d262d82c55c