Deterministic PR readiness detection for AI coding agents
"Is the PR ready to merge?" — Finally, a definitive answer.
Documentation · PyPI · Contributing
AI agents can write code, fix bugs, and respond to reviews. But they all struggle with one question: "Am I done yet?"
- CI is running... check again... still running...
- CodeRabbit left 12 comments — which ones are blocking?
- Reviewer wrote "consider X" — is that a request or a suggestion?
- Threads are unresolved — but the fix is already pushed
Good To Go answers this definitively:
gtg 123OK PR #123: READY
CI: success (5/5 passed)
Threads: 3/3 resolved
One command. One status. No guessing.
flowchart LR
PR[Pull Request] --> GTG[gtg]
GTG --> CI[CI Status]
GTG --> Comments[Comment Analysis]
GTG --> Threads[Thread Resolution]
CI --> Status{Status}
Comments --> Status
Threads --> Status
Status --> READY[✓ READY]
Status --> ACTION[! ACTION_REQUIRED]
Status --> UNRESOLVED[? UNRESOLVED_THREADS]
Status --> FAILING[✗ CI_FAILING]
Good To Go combines three analyses:
| Analysis | What It Does |
|---|---|
| CI Status | Aggregates all checks into pass/fail/pending |
| Comment Classification | Identifies actionable vs. informational comments |
| Thread Resolution | Tracks which discussions are truly blocking |
Not all comments need action. Good To Go classifies each one:
| Classification | Examples | Action |
|---|---|---|
| ACTIONABLE | "Critical: SQL injection vulnerability" | Must fix |
| NON_ACTIONABLE | "LGTM!", nitpicks, resolved items | Ignore |
| AMBIGUOUS | "Consider using X", questions | Human review |
Built-in support for: CodeRabbit, Greptile, Claude, Cursor/Bugbot
# Install
pip install gtg
# Set GitHub token
export GITHUB_TOKEN=ghp_...
# Check a PR (auto-detects repo)
gtg 123
# Explicit repo
gtg 123 --repo owner/repogtg 123 --format text!! PR #456: ACTION_REQUIRED
CI: success (5/5 passed)
Threads: 8/8 resolved
Action required:
- Fix CRITICAL comment from coderabbit in src/db.py:42
gtg 123 --format json{
"status": "ACTION_REQUIRED",
"action_items": ["Fix CRITICAL comment from coderabbit in src/db.py:42"],
"actionable_comments": [...],
"ci_status": {"state": "success", "passed": 5, "total_checks": 5}
}Default (AI-friendly) — parse the JSON for details:
| Code | Meaning |
|---|---|
| 0 | Any analyzable state |
| 4 | Error |
With -q or --semantic-codes — for shell scripts:
| Code | Status |
|---|---|
| 0 | READY |
| 1 | ACTION_REQUIRED |
| 2 | UNRESOLVED |
| 3 | CI_FAILING |
| 4 | ERROR |
Make gtg a required check to block merges until PRs are truly ready:
# .github/workflows/pr-check.yml
- name: Check PR readiness
run: gtg ${{ github.event.pull_request.number }} --semantic-codesSee USAGE.md for full workflow setup.
import subprocess
import json
result = subprocess.run(
["gtg", "123", "--format", "json"],
capture_output=True, text=True
)
data = json.loads(result.stdout)
if data["status"] == "READY":
print("Merge it!")
else:
for item in data["action_items"]:
print(f"TODO: {item}")Or use the Python API:
from goodtogo import PRAnalyzer, Container
container = Container.create_default(github_token="ghp_...")
analyzer = PRAnalyzer(container)
result = analyzer.analyze("owner", "repo", 123)Track handled comments across sessions:
gtg 123 --state-path .goodtogo/state.db # Remember dismissed comments
gtg 123 --refresh # Force fresh analysis- Landing Page — Philosophy and vision
- USAGE.md — Complete CLI reference
- CONTRIBUTING.md — Development guide
MIT License — see LICENSE
Made with Claude Code
by David Sifry