Catalog PyPI
Back to packageRELEASE DETAILS

0.91.0

PyPI

agent-readiness-scorecard

A tool to analyze codebases for AI-Agent Friendliness

Published4 Mar 2026
Direct dependencies23
Transitive dependenciesNot calculated

README

Version 0.91.0 documentation

🤖 Agent Readiness Scorecard

Agent Score CI Ruff Python Version Strictly Typed

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:

  • Massive Contexts: Large files confuse models and waste token limits.
  • Ambiguity: Missing type hints lead to hallucinated parameters.
  • Hidden Logic: Complex code flows (high cyclomatic complexity) make it hard for agents to reason about changes.

This tool scores your repo and helps you fix it.

📦 Installation

pip install agent-readiness-scorecard

🚀 Usage

1. Check your Score

Run the scorecard on your current directory:

agent-score .

2. Select an Agent Profile

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.

3. Auto-Fix Issues

Bootstrap your repository with the necessary context files and skeleton docstrings:

agent-score . --fix

4. Generate a Markdown Report

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.

⚙️ Configuration

agent-readiness-scorecard can be configured via pyproject.toml, .agent-readiness-scorecard.json, or CLI flags.

Priority

Settings are resolved in the following order (highest to lowest):

  1. CLI Flags (e.g., --agent, --verbosity)
  2. Configuration File (pyproject.toml or .agent-readiness-scorecard.json)
  3. Defaults

Customizing Output Verbosity

You can control how much visual noise the scorecard generates by adding the verbosity or report_style keys to your pyproject.toml.

Noise-Reduction Configuration

[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

Verbosity Levels (CLI Output)

LevelDescription
quietSuppresses 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.
detailedDeep-dive mode. Provides a full breakdown of every file, using progressive disclosure for passing metrics.

Report Styles (Markdown Report)

Used when generating a report via the --report flag.

StyleDescription
collapsed(Minimal) Only includes the Executive Summary.
actionable(Default) Focuses on issues: hides passing files and high-coverage type safety rows from tables.
fullIncludes all sections and a complete breakdown of every file and metric.

📊 The Scoring System

Your codebase starts at 100 points. Penalties are applied for:

MetricPenaltyWhy?
Bloated Files-1 pt per 10 lines > 200Agents 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 fileagents.md acts as the System Prompt for your repo.
God Modules-10 pts per moduleModules with > 50 inbound imports overload context.
High Entropy-5 pts per directoryFolders with > 50 files confuse retrieval tools.
Circular Deps-5 pts per cycleCauses infinite recursion in agent planning.

🛠 Project Structure

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)

🚀 Beta Features

The beta branch includes upcoming capabilities for enhanced agent-readiness:

  • pyproject.toml Configuration: Centralize settings alongside your other tools.
  • Prompt Linter (check-prompts): Validate your system prompts against LLM best practices (Role Definition, Few-Shot, etc.).
  • Verbosity Control (--verbosity): Choose between quiet, summary (default), or detailed output.
  • Enhanced Metrics: Track "Average ACL" and "Average Type Safety" in the summary report.
  • CI/CD Automation: Automated badge updates and GitHub Actions workflows for continuous agent-readiness.

🛡 Badges

Show off your Agent-Readiness! Run agent-score --badge to generate an agent_score.svg for your repo.

⚡ CI/CD & Diff Mode

Optimize your CI/CD pipeline by scoring only the files changed in a Pull Request.

Diff-Aware CI Reporting

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:

  • Noise Reduction: Developers only see scores and issues for the code they are actually touching.
  • Speed: Analysis is significantly faster on large repositories.
  • Project Integrity: While focusing on specific files for scoring, the tool still validates project-wide issues like circular dependencies and global context health.

Local Incremental Analysis

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^

Manual File Limitation

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

📝 Prompt Engineering Linter

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

Heuristics Checked:

  • Role Definition: Does the prompt establish a persona?
  • Cognitive Scaffolding: Are there "Think step-by-step" instructions?
  • Delimiter Hygiene: Are instructions separated from data using XML/Markdown tags?
  • Few-Shot Examples: Does it include 1-3 examples?
  • Negative Constraints: Identifies "Don't" statements and suggests positive alternatives.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 31

Native requirements
23 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
click
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
click>=8.0.0runtime
mccabe
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mccabe>=0.7.0runtime
networkx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
networkx>=3.0runtime
pyyaml
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pyyaml>=6.0.0runtime
rich
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
rich>=13.0.0runtime
tiktoken
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tiktoken>=0.7.0runtime
tomli
Environment
{
  "extras": "",
  "marker": "python_version < \"3.11\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tomli>=2.0.0; python_version < "3.11"runtime
litellm
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
litellm>=1.0.0; extra == "all"runtime
tree-sitter-javascript
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-javascript>=0.21.0; extra == "all"runtime
tree-sitter-typescript
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-typescript>=0.21.0; extra == "all"runtime
tree-sitter
Environment
{
  "extras": "",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter>=0.22.0; extra == "all"runtime
bandit
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
bandit>=1.7.0; extra == "dev"runtime
litellm
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
litellm>=1.0.0; extra == "dev"runtime
mypy
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
mypy>=1.9.0; extra == "dev"runtime
pip-audit
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pip-audit>=2.7.0; extra == "dev"runtime
pre-commit
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pre-commit>=3.6.0; extra == "dev"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
pytest>=8.0.0; extra == "dev"runtime
ruff
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
ruff>=0.3.0; extra == "dev"runtime
tree-sitter-javascript
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-javascript>=0.21.0; extra == "dev"runtime
tree-sitter-typescript
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-typescript>=0.21.0; extra == "dev"runtime
tree-sitter
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter>=0.22.0; extra == "dev"runtime
types-click
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-click; extra == "dev"runtime
types-networkx
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-networkx; extra == "dev"runtime
types-pyyaml
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-pyyaml; extra == "dev"runtime
types-requests
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-requests; extra == "dev"runtime
types-tabulate
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-tabulate; extra == "dev"runtime
types-toml
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
types-toml; extra == "dev"runtime
litellm
Environment
{
  "extras": "",
  "marker": "extra == \"llm\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
litellm>=1.0.0; extra == "llm"runtime
tree-sitter-javascript
Environment
{
  "extras": "",
  "marker": "extra == \"treesitter\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-javascript>=0.21.0; extra == "treesitter"runtime
tree-sitter-typescript
Environment
{
  "extras": "",
  "marker": "extra == \"treesitter\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter-typescript>=0.21.0; extra == "treesitter"runtime
tree-sitter
Environment
{
  "extras": "",
  "marker": "extra == \"treesitter\"",
  "requires_python": ">=3.10",
  "evaluation": "NOT_EVALUATED"
}
tree-sitter>=0.22.0; extra == "treesitter"runtime

Distribution files

2 collected
agent_readiness_scorecard-0.91.0-py3-none-any.whl

bdist_wheel · 53.17 KB · Python py3

Source file
agent_readiness_scorecard-0.91.0.tar.gz

sdist · 273.01 KB · Python source

Source file

Repository

PENDING
brewmarsh/agent-readiness-scorecard

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 23:10 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:acbe349c8bf69d1c008fd9e3dfa43b92a44779d366a4345669fd2d262d82c55c

Other collected versions

View all collected versions →