Tools for measuring and tracking engineering effectiveness, with a focus on agentic coding tool adoption.
A CLI tool that scans all repositories in a GitHub organization to detect adoption of agentic coding tools (Claude Code, GitHub Copilot, Cursor, MCP servers, evals frameworks, and more). Produces tidy-format CSV data suitable for analysis and visualization.
macOS (Intel and Apple Silicon):
curl -fsSL "https://github.com/posit-dev/eng-effectiveness-metrics-tools/releases/latest/download/agentic-adoption-scan_darwin_$(uname -m | sed 's/x86_64/amd64/').tar.gz" | tar -xz && sudo mv agentic-adoption-scan /usr/local/bin/Linux (x86_64 and arm64):
curl -fsSL "https://github.com/posit-dev/eng-effectiveness-metrics-tools/releases/latest/download/agentic-adoption-scan_linux_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar -xz && sudo mv agentic-adoption-scan /usr/local/bin/Via pip/pipx (macOS, Linux, Windows):
pipx install agentic-adoption-scanThe tool uses the gh CLI for GitHub authentication. Make sure you have it installed and authenticated:
gh auth loginScan an organization for agentic tool indicators:
agentic-adoption-scan scan --org your-org --output results.csvFetch and analyze content of detected indicators:
agentic-adoption-scan inspect --org your-org --scan-results results.csv --output inspect-results.csvGenerate a customizable indicators config file:
agentic-adoption-scan init-config --output indicators.yamlRun as an MCP server for Claude Code integration:
agentic-adoption-scan serve| Flag | Default | Description |
|---|---|---|
--org |
(required) | GitHub organization to scan |
--output |
stdout | Output CSV file path |
--days |
90 | Only include repos active in the last N days |
--include-archived |
false | Include archived repos |
--force |
false | Bypass cache and rescan everything |
--cache-dir |
.agentic-scan-cache |
Directory for scan state cache |
--config |
Path to custom indicators YAML config | |
--verbose |
false | Enable verbose logging |
The tool checks for 25+ built-in indicators across 7 categories:
| Category | Examples |
|---|---|
claude-code |
CLAUDE.md, .claude/ directory, settings.json, custom commands |
github-copilot |
copilot-instructions.md, .copilot/ directory |
cursor |
.cursorrules, .cursor/rules/ directory |
agents-config |
AGENTS.md, .agents/ directory |
mcp |
mcp.json, .mcp.json, MCP server configs |
evals |
evals directories, promptfoo, inspect_ai, mcp-evals |
workflows-ai |
claude-code-action, Copilot references, AI review actions |
You can extend or override these indicators via a YAML config file (init-config generates a starter).
Scan results are written as tidy CSV — one row per (repo × indicator) observation:
scan_timestamp,org,repo,repo_visibility,repo_language,repo_pushed_at,category,indicator,found,file_path,details
This format makes it easy to filter, pivot, and visualize in R, Python, or any BI tool.
The tool can run as an MCP server, exposing tools for use directly within Claude Code:
{
"mcpServers": {
"agentic-adoption-scan": {
"command": "agentic-adoption-scan",
"args": ["serve"]
}
}
}Available MCP tools: scan_org, inspect_repo, list_indicators, get_repo_summary, get_adoption_summary.
You can deploy the MCP server to Posit Connect so that AI clients across your organization can access it without running anything locally. The connect/ directory contains a Python entry point that wraps the binary for Connect's ASGI runtime.
- rsconnect-python installed:
pip install rsconnect-python - The
ghCLI installed and available inPATHon the Connect server (the binary uses it for GitHub API calls) - A Posit Connect server URL and API key
In your Connect content's Vars settings (or pass via --environment at deploy time), set:
GITHUB_TOKEN=<your-github-pat>
The gh CLI reads GITHUB_TOKEN automatically, so no interactive gh auth login is needed on the server.
cd connect/
rsconnect write-manifest fastapi --overwrite --entrypoint server:mcp .This creates connect/manifest.json (and connect/requirements.txt if not already present) for later or CI-driven deployments.
rsconnect deploy fastapi \
--server https://your-connect-server.example.com \
--api-key YOUR_API_KEY \
--entrypoint server:mcp \
--title "agentic-adoption-scan" \
.Or if you have already saved your server with rsconnect add:
rsconnect deploy fastapi \
--name your-server-nickname \
--entrypoint server:mcp \
--title "agentic-adoption-scan" \
.Once deployed, add the Connect-hosted MCP server to your Claude Code configuration:
{
"mcpServers": {
"agentic-adoption-scan": {
"type": "streamable-http",
"url": "https://your-connect-server.example.com/content/<content-id>/mcp"
}
}
}Replace <content-id> with the numeric ID shown in the Connect dashboard for this content item.
Set Min processes to 1 in the content's runtime settings so the server is always warm and avoids cold-start delays when clients connect.
Record a deployment event into GitHub:
./record-deployment.sh posit-dev/eng-effectiveness-metrics-tools main testingReleases are fully automated via python-semantic-release on every merge to main. The version bump is determined automatically from Conventional Commit PR titles (enforced by the pr-title workflow):
| PR title prefix | Version bump |
|---|---|
fix: |
patch — 0.1.0 → 0.1.1 |
feat: |
minor — 0.1.1 → 0.2.0 |
feat!: / BREAKING CHANGE: |
major — 0.2.0 → 1.0.0 |
chore:, docs:, refactor:, etc. |
no release |
On every merge to main, semantic-release analyzes commits since the last tag. If there are releasable changes, it creates a CHANGELOG.md entry, commits it, tags the new version (e.g. v0.2.0), and publishes a GitHub release — all in one step. That tag push then triggers the publish workflow, which:
- Builds native binaries for macOS (amd64/arm64) and Linux (amd64/arm64) via GoReleaser
- Publishes Python wheels for all platforms to PyPI via go-to-wheel
Deploy key — semantic-release pushes back to main and needs to trigger the publish workflow. The default GITHUB_TOKEN cannot do this, so an SSH deploy key is required:
ssh-keygen -t ed25519 -C "semantic-release" -f deploy_key -N ""- Add
deploy_key.pubas a repo Deploy key with write access: Settings → Deploy keys - Add
deploy_key(private) as an Actions secret namedDEPLOY_KEY: Settings → Secrets and variables → Actions
PyPI Trusted Publisher — the publish workflow uses OIDC Trusted Publishing (no API token needed). Configure a Trusted Publisher on PyPI for this repository pointing to the publish.yml workflow and the pypi environment.