From 62d9945df468e032702778635ae048fdba8a1257 Mon Sep 17 00:00:00 2001 From: Adam Moussa Date: Fri, 17 Jul 2026 13:52:03 -0400 Subject: [PATCH] refactor: consolidate reviewer modules into agent/review/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of the domain-reorg adoption (build plan step C2): fork content, upstream layout. Nine 1:1 module moves (reviewer_diff/eval_store/ findings/groups/publish/reconcile/trace_context + review_style_ collector/guidance) into agent/review/, with internal relative imports re-wired to the new package depth. agent/review/__init__.py mirrors upstream's thin re-export shim (one of the 21 verified "A" structural adds). Rewrote the 38 grep hits across importer files (agent/{analyzer, ci_autofix,reviewer,webapp}.py, agent/dashboard/*, agent/middleware/ settle_review_check.py, agent/tools/*, agent/utils/github_feedback.py, agent/webhooks/github.py, evals/reviewer/*, and the reviewer test suite) to point at agent.review.*; 4 of the 38 hits were name collisions (list_reviewer_findings, reviewer_outcomes, _reviewer_thread_id, reviewer_thread_id — not the moved modules) and were left untouched. tests/test_github_checks.py's module-alias import (`from agent import reviewer_publish`) follows upstream's own `from agent.review import publish as reviewer_publish` pattern so downstream `reviewer_publish.*` call sites needed no changes. agent/reviewer.py and agent/webapp.py stay in place per the hard rule (fork content, import-only rewire) and are not part of this package. Gates: ruff check + ruff format --check, pytest --co -q (1637 collected), full unit suite (1637 passed), and the reviewer/findings suite in isolation (pytest -k "review or finding", 421 passed). --- agent/analyzer.py | 2 +- agent/ci_autofix.py | 2 +- agent/dashboard/agent_usage.py | 2 +- agent/dashboard/eval_jobs.py | 4 +- agent/dashboard/review_api.py | 6 +-- agent/dashboard/review_chat_api.py | 4 +- agent/dashboard/review_style_jobs.py | 2 +- agent/middleware/settle_review_check.py | 4 +- agent/review/__init__.py | 11 ++++ agent/{reviewer_diff.py => review/diff.py} | 4 +- .../eval_store.py} | 0 .../findings.py} | 0 .../{reviewer_groups.py => review/groups.py} | 4 +- .../publish.py} | 20 ++++---- .../reconcile.py} | 4 +- .../style_collector.py} | 0 .../style_guidance.py} | 0 .../trace_context.py} | 8 +-- agent/reviewer.py | 14 +++--- agent/tools/add_finding.py | 6 +-- agent/tools/list_findings.py | 4 +- agent/tools/list_review_findings.py | 2 +- agent/tools/publish_review.py | 10 ++-- agent/tools/reply_to_finding_thread.py | 4 +- agent/tools/resolve_finding_thread.py | 6 +-- agent/tools/update_finding.py | 2 +- agent/utils/github_feedback.py | 2 +- agent/webapp.py | 8 +-- agent/webhooks/github.py | 2 +- evals/reviewer/judge.py | 2 +- evals/reviewer/run_eval.py | 4 +- evals/reviewer/store_reporter.py | 2 +- evals/reviewer/target.py | 2 +- tests/test_dashboard_reviews.py | 2 +- tests/test_github_checks.py | 2 +- tests/test_review_style_collector.py | 2 +- tests/test_reviewer_diff.py | 6 +-- tests/test_reviewer_eval_target.py | 2 +- tests/test_reviewer_findings.py | 50 +++++++++---------- tests/test_reviewer_groups.py | 14 +++--- tests/test_reviewer_publish.py | 46 ++++++++--------- tests/test_reviewer_reconcile.py | 30 +++++------ tests/test_reviewer_tools.py | 4 +- tests/test_reviewer_trace_context.py | 10 ++-- 44 files changed, 163 insertions(+), 152 deletions(-) create mode 100644 agent/review/__init__.py rename agent/{reviewer_diff.py => review/diff.py} (98%) rename agent/{reviewer_eval_store.py => review/eval_store.py} (100%) rename agent/{reviewer_findings.py => review/findings.py} (100%) rename agent/{reviewer_groups.py => review/groups.py} (98%) rename agent/{reviewer_publish.py => review/publish.py} (99%) rename agent/{reviewer_reconcile.py => review/reconcile.py} (99%) rename agent/{review_style_collector.py => review/style_collector.py} (100%) rename agent/{review_style_guidance.py => review/style_guidance.py} (100%) rename agent/{reviewer_trace_context.py => review/trace_context.py} (98%) diff --git a/agent/analyzer.py b/agent/analyzer.py index 8f16934b..de5a6243 100644 --- a/agent/analyzer.py +++ b/agent/analyzer.py @@ -36,7 +36,7 @@ from .middleware import ( TimeoutWrapupMiddleware, ToolErrorMiddleware, ) -from .review_style_guidance import REVIEWER_STYLE_THEMES +from .review.style_guidance import REVIEWER_STYLE_THEMES from .server import ( DEFAULT_LLM_MAX_TOKENS, DEFAULT_LLM_MODEL_ID, diff --git a/agent/ci_autofix.py b/agent/ci_autofix.py index 13571f58..c9306656 100644 --- a/agent/ci_autofix.py +++ b/agent/ci_autofix.py @@ -26,7 +26,7 @@ from .dashboard.agent_overrides import load_profile, resolve_login_from_email_as from .dashboard.autofix_state import is_pr_autofix_disabled from .dashboard.enabled_repos import is_review_repo_enabled from .dispatch import dispatch_agent_run -from .reviewer_findings import REVIEWER_THREAD_KIND +from .review.findings import REVIEWER_THREAD_KIND from .utils.dashboard_links import dashboard_thread_url from .utils.github_app import get_github_app_installation_token from .utils.github_checks import post_autofix_status_check diff --git a/agent/dashboard/agent_usage.py b/agent/dashboard/agent_usage.py index f3a305c7..01840345 100644 --- a/agent/dashboard/agent_usage.py +++ b/agent/dashboard/agent_usage.py @@ -12,7 +12,7 @@ from typing import Any, Literal import httpx from langgraph_sdk import get_client -from ..reviewer_findings import REVIEWER_THREAD_KIND +from ..review.findings import REVIEWER_THREAD_KIND from ..utils.github_app import get_github_app_installation_token USAGE_THREAD_NAMESPACE: list[str] = ["agent_usage", "threads"] diff --git a/agent/dashboard/eval_jobs.py b/agent/dashboard/eval_jobs.py index d64c7ea1..91293ff4 100644 --- a/agent/dashboard/eval_jobs.py +++ b/agent/dashboard/eval_jobs.py @@ -17,13 +17,13 @@ from typing import Any, Literal, TypedDict from langgraph_sdk import get_client -from agent.reviewer_eval_store import ( +from agent.review.eval_store import ( _HEARTBEAT_STALE_SECONDS, DEFAULT_EVAL_PROJECT, EVALS_NAMESPACE, REVIEWER_EVAL_KEY, ) -from agent.reviewer_findings import REVIEW_FINDING_CAP +from agent.review.findings import REVIEW_FINDING_CAP logger = logging.getLogger(__name__) diff --git a/agent/dashboard/review_api.py b/agent/dashboard/review_api.py index 1c84aca6..c0db55c1 100644 --- a/agent/dashboard/review_api.py +++ b/agent/dashboard/review_api.py @@ -19,7 +19,7 @@ from urllib.parse import urljoin, urlparse import httpx from fastapi import HTTPException, Response -from ..reviewer_findings import REVIEWER_THREAD_KIND +from ..review.findings import REVIEWER_THREAD_KIND from ..utils.github_app import get_github_app_installation_token from ..utils.github_checks import github_headers from ..utils.thread_ops import langgraph_client @@ -443,7 +443,7 @@ async def create_review_comment( _HTML_COMMENT_RE = re.compile(r"", re.DOTALL) -# Inline comments the reviewer posts carry this hidden marker (see reviewer_publish). +# Inline comments the reviewer posts carry this hidden marker (see review.publish). _OPEN_SWE_COMMENT_RE = re.compile(r"