From b9a9675b0b78c58ed9bcd881c8ad3b068834b9a5 Mon Sep 17 00:00:00 2001 From: zhouxuan009 Date: Thu, 12 Mar 2026 15:15:18 -0400 Subject: [PATCH] fix: add Grep tool HTML rendering --- claude_code_log/html/__init__.py | 2 ++ claude_code_log/html/renderer.py | 10 +++++++++ claude_code_log/html/tool_formatters.py | 29 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/claude_code_log/html/__init__.py b/claude_code_log/html/__init__.py index 2bfd2c6..308c434 100644 --- a/claude_code_log/html/__init__.py +++ b/claude_code_log/html/__init__.py @@ -20,6 +20,7 @@ format_askuserquestion_input, format_bash_input, format_edit_input, + format_grep_input, format_exitplanmode_input, format_multiedit_input, format_read_input, @@ -105,6 +106,7 @@ "format_askuserquestion_input", "format_bash_input", "format_edit_input", + "format_grep_input", "format_exitplanmode_input", "format_multiedit_input", "format_read_input", diff --git a/claude_code_log/html/renderer.py b/claude_code_log/html/renderer.py index 8d22a37..4a3fb40 100644 --- a/claude_code_log/html/renderer.py +++ b/claude_code_log/html/renderer.py @@ -30,6 +30,7 @@ EditInput, ExitPlanModeInput, GlobInput, + GrepInput, MultiEditInput, ReadInput, TaskInput, @@ -92,6 +93,7 @@ format_edit_input, format_edit_output, format_exitplanmode_input, + format_grep_input, format_exitplanmode_output, format_multiedit_input, format_read_input, @@ -310,6 +312,10 @@ def format_ExitPlanModeInput( """Format → empty string (no content).""" return format_exitplanmode_input(input) + def format_GrepInput(self, input: GrepInput, _: TemplateMessage) -> str: + """Format → pattern + params (path, glob, type, mode).""" + return format_grep_input(input) + def format_WebSearchInput(self, input: WebSearchInput, _: TemplateMessage) -> str: """Format → search query display.""" return format_websearch_input(input) @@ -445,6 +451,10 @@ def title_GlobInput(self, input: GlobInput, message: TemplateMessage) -> str: summary = f"{summary} in {input.path}" return self._tool_title(message, "🔍", summary) + def title_GrepInput(self, input: GrepInput, message: TemplateMessage) -> str: + """Title → '🔎 Grep `pattern`'.""" + return self._tool_title(message, "🔎", input.pattern) + def title_BashInput(self, input: BashInput, message: TemplateMessage) -> str: """Title → '💻 Bash '.""" return self._tool_title(message, "💻", input.description) diff --git a/claude_code_log/html/tool_formatters.py b/claude_code_log/html/tool_formatters.py index 8873eab..106cb91 100644 --- a/claude_code_log/html/tool_formatters.py +++ b/claude_code_log/html/tool_formatters.py @@ -36,6 +36,7 @@ EditOutput, ExitPlanModeInput, ExitPlanModeOutput, + GrepInput, MultiEditInput, ReadInput, ReadOutput, @@ -268,6 +269,33 @@ def format_websearch_output(output: WebSearchOutput) -> str: return render_markdown_collapsible(markdown_content, "websearch-results") +# -- Grep Tool ---------------------------------------------------------------- + + +def format_grep_input(grep_input: GrepInput) -> str: + """Format Grep tool use content showing search parameters. + + Args: + grep_input: Typed GrepInput with pattern, path, glob, type, etc. + + Each field is shown on its own line with a consistent label: value format. + """ + html_parts = ["
"] + html_parts.append(f"
pattern: {escape_html(grep_input.pattern)}
") + if grep_input.path: + html_parts.append(f"
path: {escape_html(grep_input.path)}
") + if grep_input.glob: + html_parts.append(f"
glob: {escape_html(grep_input.glob)}
") + if grep_input.type: + html_parts.append(f"
type: {escape_html(grep_input.type)}
") + if grep_input.output_mode: + html_parts.append(f"
mode: {escape_html(grep_input.output_mode)}
") + if grep_input.multiline: + html_parts.append(f"
multiline: true
") + html_parts.append("
") + return "".join(html_parts) + + # -- TodoWrite Tool ----------------------------------------------------------- @@ -832,6 +860,7 @@ def format_tool_result_content_raw(tool_result: ToolResultContent) -> str: "format_edit_input", "format_multiedit_input", "format_bash_input", + "format_grep_input", "format_task_input", "format_websearch_input", "format_webfetch_input",