{"id":50489125,"url":"https://github.com/jackspiece/maintainer-radar","last_synced_at":"2026-06-02T01:01:03.557Z","repository":{"id":361895748,"uuid":"1256322541","full_name":"JackSpiece/maintainer-radar","owner":"JackSpiece","description":"Local-first PR triage reports for maintainers in the AI contribution era.","archived":false,"fork":false,"pushed_at":"2026-06-01T19:11:32.000Z","size":135,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T19:12:58.778Z","etag":null,"topics":["ai-tools","cli","github","maintainers","open-source","pull-requests","triage"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JackSpiece.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T17:05:48.000Z","updated_at":"2026-06-01T19:06:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/JackSpiece/maintainer-radar","commit_stats":null,"previous_names":["jackspiece/maintainer-radar"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/JackSpiece/maintainer-radar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackSpiece%2Fmaintainer-radar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackSpiece%2Fmaintainer-radar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackSpiece%2Fmaintainer-radar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackSpiece%2Fmaintainer-radar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JackSpiece","download_url":"https://codeload.github.com/JackSpiece/maintainer-radar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JackSpiece%2Fmaintainer-radar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33800676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-tools","cli","github","maintainers","open-source","pull-requests","triage"],"created_at":"2026-06-02T01:01:02.640Z","updated_at":"2026-06-02T01:01:03.549Z","avatar_url":"https://github.com/JackSpiece.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Maintainer Radar\n\n[![CI](https://github.com/JackSpiece/maintainer-radar/actions/workflows/ci.yml/badge.svg)](https://github.com/JackSpiece/maintainer-radar/actions/workflows/ci.yml)\n\nGitHub Action and local CLI for read-only pull request triage reports in the AI\ncontribution era.\n\nDemo: \u003chttps://jackspiece.github.io/maintainer-radar/\u003e includes a no-install\nbrowser preview for public repositories.\n\nExample scan: \u003chttps://jackspiece.github.io/maintainer-radar/?repo=python/cpython\u003e\n\nBrowser preview details: [docs/browser-preview.md](docs/browser-preview.md)\n\nAdoption guide: [docs/adoption.md](docs/adoption.md)\n\nGitHub Action usage: [docs/github-action.md](docs/github-action.md)\n\n![Maintainer Radar terminal preview](docs/assets/terminal-preview.svg)\n\nMaintainer Radar turns GitHub pull request metadata into a short, deterministic\nreview brief: which PRs are ready to review, which ones need author follow-up,\nwhich ones are blocked by CI, and which ones are too risky to merge without more\nevidence.\n\nIt is not a review bot and it does not require a GitHub App. It runs from your\nterminal, uses the GitHub CLI when live data is needed, and can also analyze JSON\nfixtures offline.\n\n## Why This Exists\n\nMaintainers are getting more drive-by and AI-assisted PRs. The hard part is not\nonly reading code. It is deciding where review time is worth spending.\n\nMaintainer Radar focuses on that first 60 seconds:\n\n- Is the PR small enough to review?\n- Did CI pass?\n- Did the author include a test plan?\n- Are tests changed when code changed?\n- Did a maintainer already say \"not working\" or request changes?\n- Is this stale enough that it needs a fresh author response?\n- Is this a review-now PR or a follow-up-needed PR?\n\n## What Makes It Different\n\nMost tools in this area are AI reviewers, GitHub Apps, bounty boards, or generic\ndashboards. Maintainer Radar is different on purpose:\n\n- **Maintainer-first:** it prioritizes review time, not contributor output.\n- **Local-first:** no SaaS, no webhook, no hosted database.\n- **Deterministic:** every score comes with a visible heuristic breakdown.\n- **AI-era aware:** it catches the common failure shape of large PRs with weak\n  test evidence and unresolved maintainer feedback.\n- **Markdown-native:** output can be pasted into issues, PR comments, worklogs,\n  release notes, or maintainer handoff docs.\n\nFor a category comparison, see [docs/positioning.md](docs/positioning.md).\n\n## Quick Start\n\nFor most maintainers, the fastest path is the reusable GitHub Action:\n\n```yaml\n- uses: actions/setup-python@v6\n  with:\n    python-version: \"3.12\"\n- uses: JackSpiece/maintainer-radar@v0.16.12\n  id: radar\n  env:\n    GH_TOKEN: ${{ github.token }}\n  with:\n    repository: ${{ github.repository }}\n    format: markdown\n```\n\nOr generate a complete scheduled workflow:\n\n```bash\nmaintainer-radar init-action --path .github/workflows/maintainer-radar.yml\n```\n\nThis writes a workflow that scans the current repository's PR queue and uploads\na Markdown triage artifact. The report also appears in the GitHub Actions run\nsummary, so maintainers do not have to download the artifact just to read the\nqueue. The Action also exposes summary outputs such as `review-now`,\n`ci-blocked`, and `average-score` for later workflow steps. It refuses to\noverwrite an existing file unless you pass `--force`.\n\nIf your project uses custom thresholds, include them in the generated workflow:\n\n```bash\nmaintainer-radar init-action --config .maintainer-radar.json --path .github/workflows/maintainer-radar.yml\n```\n\nFor a smaller scheduled report, generate a focused review-ready workflow:\n\n```bash\nmaintainer-radar init-action --action review-now --min-score 80 --top 10 --group-by action --path .github/workflows/review-ready.yml\n```\n\nFor local CLI use, install directly from GitHub:\n\n```bash\npython -m pip install \"git+https://github.com/JackSpiece/maintainer-radar.git\"\nmaintainer-radar repo owner/repo --hydrate --sort action --top 10\n```\n\nLive CLI scans require the GitHub CLI:\n\n```bash\ngh auth login\n```\n\nFor local development from a checkout:\n\n```bash\npython -m pip install -e .\npython -m unittest discover -s tests\n```\n\nOr run without installing:\n\n```bash\nPYTHONPATH=src python -m maintainer_radar --help\nPYTHONPATH=src python -m unittest discover -s tests\n```\n\n## Offline Example\n\n![Maintainer Radar quickstart sequence](docs/assets/quickstart-sequence.svg)\n\nTry the offline sample data first:\n\n```bash\nPYTHONPATH=src python -m maintainer_radar from-json examples/sample-prs.json\n```\n\n## Usage\n\nAnalyze open PRs in a repository:\n\n```bash\nmaintainer-radar repo owner/repo --limit 20\n```\n\nFetch full PR detail for deeper live scoring:\n\n```bash\nmaintainer-radar repo owner/repo --limit 20 --hydrate\n```\n\nFilter noisy queues:\n\n```bash\nmaintainer-radar repo owner/repo --label bug --stale-days 14\nmaintainer-radar repo owner/repo --author contributor --updated-since 2026-06-01\n```\n\nGet a compact queue snapshot:\n\n```bash\nmaintainer-radar repo owner/repo --summary-only\n```\n\nFocus a report on the most reviewable PRs:\n\n```bash\nmaintainer-radar repo owner/repo --action review-now --min-score 80\nmaintainer-radar from-json queue.json --max-risk 25\n```\n\nSort a queue for the review session:\n\n```bash\nmaintainer-radar repo owner/repo --sort action\nmaintainer-radar from-json queue.json --sort risk\n```\n\nGroup Markdown or HTML reports by action:\n\n```bash\nmaintainer-radar repo owner/repo --sort action --group-by action\n```\n\nKeep only the first results after filtering and sorting:\n\n```bash\nmaintainer-radar repo owner/repo --hydrate --sort risk --top 10\n```\n\nUse project-specific thresholds:\n\n```bash\nmaintainer-radar repo owner/repo --config .maintainer-radar.json\n```\n\nAnalyze one PR in detail:\n\n```bash\nmaintainer-radar pr owner/repo 123\n```\n\nDraft a maintainer follow-up comment without posting it:\n\n```bash\nmaintainer-radar pr owner/repo 123 --comment-template\n```\n\nTrack one contributor's open PRs:\n\n```bash\nmaintainer-radar author JackSpiece --state open --limit 50\n```\n\nAnalyze offline JSON:\n\n```bash\nmaintainer-radar from-json examples/sample-prs.json\ncat examples/sample-prs.json | maintainer-radar from-json -\nmaintainer-radar from-json gitlab-merge-requests.json --source gitlab\nmaintainer-radar from-json forgejo-pull-requests.json --source forgejo\nmaintainer-radar from-json gitea-pull-requests.json --source gitea\n```\n\nJSON output is available for automation:\n\n```bash\nmaintainer-radar repo owner/repo --format json\n```\n\nCSV output is available for spreadsheets:\n\n```bash\nmaintainer-radar repo owner/repo --format csv\n```\n\nHTML output is available for shareable local reports:\n\n```bash\nmaintainer-radar repo owner/repo --hydrate --sort action --format html \u003e review-queue.html\n```\n\nBootstrap a repository workflow without copying YAML by hand:\n\n```bash\nmaintainer-radar init-action --report-format html --path .github/workflows/maintainer-radar.yml\n```\n\n## Example Output\n\n```markdown\n## Maintainer Radar Report\n\n| PR | Action | Next Step | Score | Risk Impact | Signals |\n| --- | --- | --- | ---: | --- | --- |\n| #42 Fix parser cache race | review now | Review now while the PR appears small, active, and low risk. | 100 | CI passed (-8 risk) | CI passed, test plan present, tests changed |\n| #43 Add universal plugin system | ask for CI fix | Ask the author to get failing checks green before deeper review. | 0 | very large diff (+30 risk); CI failing (+30 risk) | very large diff, CI failing, changes requested |\n```\n\n## Signals\n\nMaintainer Radar currently checks:\n\n- draft PRs\n- review decision\n- CI state\n- stale update windows\n- additions, deletions, and changed file count\n- body test-plan language\n- code changes without nearby tests\n- generated file paths and lockfiles\n- maintainer comments that look like blockers\n- failing or pending checks\n- per-PR score breakdowns that show each risk adjustment\n- per-PR next steps that translate triage into a maintainer move\n- draft follow-up comments for one PR, without posting automatically\n\nThe goal is not to replace review. The goal is to route attention.\n\n## Project Status\n\nThis is an early public release. The core CLI, scoring engine, Markdown renderer,\noffline JSON mode, hydrated GitHub scans, and tests are present. Next work is\nfocused on richer maintainer blocker detection and examples from real OSS review\nworkflows.\n\nSee [ROADMAP.md](ROADMAP.md).\n\nFor copy-paste maintainer workflows, see\n[docs/handoff-examples.md](docs/handoff-examples.md).\n\nFor scheduled queue reports, see [docs/github-actions.md](docs/github-actions.md).\n\nFor copy-paste workflows and sample data, see [examples/README.md](examples/README.md).\n\nFor generated sample reports, see [examples/output](examples/output).\n\nFor scoring details, see [docs/heuristics.md](docs/heuristics.md).\n\nFor automation output, see [docs/json-output.md](docs/json-output.md).\n\nFor spreadsheet output, see [docs/csv-output.md](docs/csv-output.md).\n\nFor shareable static reports, see [docs/html-output.md](docs/html-output.md).\n\nFor queue ordering, see [docs/sorting.md](docs/sorting.md).\n\nFor compact queue snapshots, see [docs/focused-reports.md](docs/focused-reports.md).\n\nFor stable sample output, see [docs/reproducible-reports.md](docs/reproducible-reports.md).\n\nFor deeper live GitHub reports, see [docs/hydrated-scans.md](docs/hydrated-scans.md).\n\nFor GitLab exports, see [docs/gitlab-json.md](docs/gitlab-json.md).\n\nFor Forgejo and Gitea exports, see\n[docs/forgejo-gitea-json.md](docs/forgejo-gitea-json.md).\n\nFor project-specific thresholds, see [docs/configuration.md](docs/configuration.md).\n\n## Contributing\n\nIssues and PRs are welcome, especially:\n\n- better heuristics for maintainer feedback\n- fixtures from real open-source review patterns\n- integrations with `gh`, GitLab, Forgejo, or static JSON exports\n- examples that help maintainers adopt the tool without workflow churn\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackspiece%2Fmaintainer-radar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjackspiece%2Fmaintainer-radar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackspiece%2Fmaintainer-radar/lists"}