From 19fccd5b923ec0c8dcdcee3f73073adeb8add347 Mon Sep 17 00:00:00 2001 From: CleverThis Date: Fri, 29 May 2026 23:23:53 -0400 Subject: [PATCH] fix(tui): remove unused shutil import; implement width-based auto_diff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the unused `shutil` import from models.py (fixes lint F401). Implement `auto_diff()` with actual terminal-width-based dispatch as spec ยง30139 requires: terminals >= 120 columns get split (side-by-side) format, narrower terminals get unified diff. Previously the method called `difflib.context_diff()` with a docstring falsely claiming width-based selection. ISSUES CLOSED: #1480 --- src/cleveragents/tui/permissions/models.py | 27 ++++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/cleveragents/tui/permissions/models.py b/src/cleveragents/tui/permissions/models.py index f1cb19139..8cbb3f905 100644 --- a/src/cleveragents/tui/permissions/models.py +++ b/src/cleveragents/tui/permissions/models.py @@ -6,7 +6,6 @@ tool permission requests with diff views and record user decisions. from __future__ import annotations -import shutil from enum import StrEnum from pydantic import BaseModel, ConfigDict, Field @@ -140,23 +139,21 @@ class PermissionRequest(BaseModel): return left, right def auto_diff(self, *, context_lines: int = 3) -> str: - """Generate a context diff showing only changed lines with context. + """Select unified or split diff based on available terminal width. - In AUTO mode, the display mode is selected based on available - terminal width: unified for narrow terminals, split for wide. + Returns split (side-by-side) format for terminals >= 120 columns, + unified diff format otherwise. """ - import difflib + import shutil - before_lines = (self.before_content or "").splitlines(keepends=True) - after_lines = (self.after_content or "").splitlines(keepends=True) - diff_lines = difflib.context_diff( - before_lines, - after_lines, - fromfile=f"a/{self.path}", - tofile=f"b/{self.path}", - n=context_lines, - ) - return "".join(diff_lines) + terminal_width = shutil.get_terminal_size().columns + if terminal_width >= 120: + left, right = self.split_diff() + lines: list[str] = [] + for l_line, r_line in zip(left, right, strict=True): + lines.append(f"{l_line:<40} | {r_line}") + return "\n".join(lines) + return self.unified_diff(context_lines=context_lines) def render_diff( self,