@@ -56,6 +56,7 @@ class WorktreeChanges(BaseModel):
5656
5757 @property
5858 def any (self ) -> bool :
59+ """Return whether the index or worktree contains any reviewable change."""
5960 return self .staged or self .unstaged or self .untracked
6061
6162
@@ -95,12 +96,14 @@ class ReviewTargetErrorCode(StrEnum):
9596
9697class ReviewTargetResolutionError (RuntimeError ):
9798 def __init__ (self , code : ReviewTargetErrorCode , brief : str , message : str ) -> None :
99+ """Create a categorized resolution failure with safe user-facing text."""
98100 self .code = code
99101 self .brief = brief
100102 super ().__init__ (message )
101103
102104
103105def validate_review_target (target : ReviewTarget ) -> None :
106+ """Reject unsupported modes, fields, and unsafe or malformed refs."""
104107 if target .model_extra :
105108 raise ReviewTargetResolutionError (
106109 ReviewTargetErrorCode .invalid_target ,
@@ -142,6 +145,7 @@ def validate_review_target(target: ReviewTarget) -> None:
142145
143146
144147async def _run_resolver_git (args : list [str ], cwd : str ) -> GitCommandResult :
148+ """Run Git and map host failures to review-target error categories."""
145149 try :
146150 return await run_git (args , cwd )
147151 except GitCommandError as exc :
@@ -159,6 +163,7 @@ async def _run_resolver_git(args: list[str], cwd: str) -> GitCommandResult:
159163
160164
161165def _require_oid (result : GitCommandResult , * , message : str ) -> str :
166+ """Return a normalized full object ID or fail closed on malformed output."""
162167 value = result .stdout
163168 if value .endswith ("\n " ):
164169 value = value [:- 1 ]
@@ -181,6 +186,7 @@ def _require_oid(result: GitCommandResult, *, message: str) -> str:
181186
182187
183188def _quiet_verification_is_missing (result : GitCommandResult ) -> bool :
189+ """Recognize Git's exact quiet-verification response for a missing ref."""
184190 return (
185191 result .returncode == 1
186192 and not result .stdout
@@ -191,6 +197,7 @@ def _quiet_verification_is_missing(result: GitCommandResult) -> bool:
191197
192198
193199def _raise_commit_verification_failed () -> None :
200+ """Raise the sanitized failure shared by fatal commit verification paths."""
194201 raise ReviewTargetResolutionError (
195202 ReviewTargetErrorCode .git_failed ,
196203 "Review target unavailable" ,
@@ -199,6 +206,7 @@ def _raise_commit_verification_failed() -> None:
199206
200207
201208async def _try_resolve_commit (cwd : str , ref : str ) -> str | None :
209+ """Resolve a commit ref, returning ``None`` only for an exact quiet miss."""
202210 result = await _run_resolver_git (
203211 ["rev-parse" , "--verify" , "--quiet" , "--end-of-options" , f"{ ref } ^{{commit}}" ],
204212 cwd ,
@@ -211,6 +219,7 @@ async def _try_resolve_commit(cwd: str, ref: str) -> str | None:
211219
212220
213221async def _resolve_commit (cwd : str , ref : str ) -> str :
222+ """Resolve a required commit ref or raise a typed safe failure."""
214223 result = await _run_resolver_git (
215224 ["rev-parse" , "--verify" , "--quiet" , "--end-of-options" , f"{ ref } ^{{commit}}" ], cwd
216225 )
@@ -226,6 +235,7 @@ async def _resolve_commit(cwd: str, ref: str) -> str:
226235
227236
228237async def _resolve_head (cwd : str ) -> str :
238+ """Validate the worktree and return its full HEAD commit ID."""
229239 repository = await _run_resolver_git (
230240 ["rev-parse" , "--is-inside-work-tree" ],
231241 cwd ,
@@ -253,6 +263,7 @@ async def _resolve_head(cwd: str) -> str:
253263
254264
255265async def _quiet_diff_changed (cwd : str , args : list [str ]) -> bool :
266+ """Interpret Git's quiet-diff exit contract without accepting other failures."""
256267 result = await _run_resolver_git (args , cwd )
257268 if result .returncode in {0 , 1 }:
258269 return result .returncode == 1
@@ -264,6 +275,7 @@ async def _quiet_diff_changed(cwd: str, args: list[str]) -> bool:
264275
265276
266277async def _worktree_changes (cwd : str ) -> WorktreeChanges :
278+ """Collect staged, unstaged, and untracked change presence."""
267279 staged = await _quiet_diff_changed (
268280 cwd ,
269281 ["diff" , "--quiet" , "--cached" , "--no-ext-diff" , "--no-textconv" , "--exit-code" , "--" ],
@@ -289,6 +301,7 @@ async def _worktree_changes(cwd: str) -> WorktreeChanges:
289301
290302
291303async def _merge_base (cwd : str , head_sha : str , base_sha : str ) -> str | None :
304+ """Resolve the merge base, distinguishing unrelated histories from Git failures."""
292305 result = await _run_resolver_git (["merge-base" , head_sha , base_sha ], cwd )
293306 if result .returncode == 1 :
294307 return None
@@ -302,6 +315,7 @@ async def _merge_base(cwd: str, head_sha: str, base_sha: str) -> str | None:
302315
303316
304317async def _base_has_tracked_changes (cwd : str , merge_base_sha : str ) -> bool :
318+ """Return whether tracked content differs from the selected merge base."""
305319 return await _quiet_diff_changed (
306320 cwd ,
307321 [
@@ -317,6 +331,7 @@ async def _base_has_tracked_changes(cwd: str, merge_base_sha: str) -> bool:
317331
318332
319333async def _commit_details (cwd : str , target_sha : str ) -> tuple [tuple [str , ...], str ]:
334+ """Return validated parent IDs and an escaped title for a resolved commit."""
320335 parents_result = await _run_resolver_git (
321336 ["rev-list" , "--parents" , "-n" , "1" , target_sha , "--" ],
322337 cwd ,
@@ -361,6 +376,7 @@ async def _commit_details(cwd: str, target_sha: str) -> tuple[tuple[str, ...], s
361376
362377
363378def _review_target_block (lines : list [str ]) -> str :
379+ """Wrap resolved target facts in the authoritative prompt boundary."""
364380 body = "\n " .join (lines )
365381 return (
366382 "<review-target>\n "
@@ -376,13 +392,15 @@ def _review_target_block(lines: list[str]) -> str:
376392
377393
378394def _requested_lines (target : ReviewTarget ) -> list [str ]:
395+ """Render the caller's validated requested mode and optional ref."""
379396 lines = [f"requested_mode: { target .kind } " ]
380397 if target .ref is not None :
381398 lines .append (f"requested_ref: { escape_prompt_data (target .ref , max_chars = 1024 )} " )
382399 return lines
383400
384401
385402def _attempted_line (attempted : tuple [str , ...]) -> str | None :
403+ """Render attempted default bases as escaped untrusted metadata."""
386404 if not attempted :
387405 return None
388406 rendered = ", " .join (escape_prompt_data (ref , max_chars = 1024 ) for ref in attempted )
@@ -401,6 +419,7 @@ def _resolved_live_target(
401419 merge_base_sha : str | None = None ,
402420 auto_note : str | None = None ,
403421) -> ResolvedReviewTarget :
422+ """Build a live worktree or base target anchored to the current HEAD."""
404423 anchor = head_sha if kind == "uncommitted" else merge_base_sha
405424 assert anchor is not None
406425 lines = [
@@ -431,11 +450,11 @@ def _resolved_live_target(
431450 lines .extend (
432451 [
433452 "scope: inspect tracked changes from the anchor through the live index/worktree, "
434- "then inspect every relevant untracked path reported by status." ,
453+ + "then inspect every relevant untracked path reported by status." ,
435454 f"command: git diff --no-ext-diff --no-textconv { anchor } --" ,
436455 "command: git status --short --untracked-files=all --" ,
437456 "Live warning: concurrent index/worktree edits can change the inspected patch; this "
438- "target does not claim a frozen snapshot." ,
457+ + "target does not claim a frozen snapshot." ,
439458 ]
440459 )
441460 safe_base = escape_prompt_data (base_ref , max_chars = 1024 ) if base_ref is not None else None
@@ -471,6 +490,7 @@ async def _resolved_commit_target(
471490 attempted : tuple [str , ...] = (),
472491 auto_note : str | None = None ,
473492) -> ResolvedReviewTarget :
493+ """Build an immutable commit target with validated parent metadata."""
474494 parent_shas , title = await _commit_details (cwd , target_sha )
475495 lines = [
476496 * _requested_lines (requested ),
@@ -538,6 +558,7 @@ async def resolve_review_target(
538558 target : ReviewTarget ,
539559 work_dir : HostPath ,
540560) -> ResolvedReviewTarget :
561+ """Resolve one validated request to a deterministic, executable Git scope."""
541562 validate_review_target (target )
542563 cwd = str (work_dir )
543564 head_sha = await _resolve_head (cwd )
@@ -682,6 +703,7 @@ async def revalidate_review_target_head(
682703 target : ResolvedReviewTarget ,
683704 work_dir : HostPath ,
684705) -> None :
706+ """Reject a live target when HEAD moved after initial resolution."""
685707 if target .worktree_state != "live" :
686708 return
687709 current_head = await _resolve_head (str (work_dir ))
0 commit comments