diff --git a/claude_code_log/html/renderer.py b/claude_code_log/html/renderer.py index 893768e2..3b797a5e 100644 --- a/claude_code_log/html/renderer.py +++ b/claude_code_log/html/renderer.py @@ -27,6 +27,7 @@ BashInput, EditInput, ExitPlanModeInput, + GlobInput, MultiEditInput, ReadInput, TaskInput, @@ -147,15 +148,19 @@ class HtmlRenderer(Renderer): # ------------------------------------------------------------------------- def format_SystemMessage(self, message: SystemMessage) -> str: + """Format →
...
.""" return format_system_content(message) def format_HookSummaryMessage(self, message: HookSummaryMessage) -> str: + """Format →
...
.""" return format_hook_summary_content(message) def format_SessionHeaderMessage(self, message: SessionHeaderMessage) -> str: + """Format →
...
.""" return format_session_header_content(message) def format_DedupNoticeMessage(self, message: DedupNoticeMessage) -> str: + """Format → ....""" return format_dedup_notice_content(message) # ------------------------------------------------------------------------- @@ -163,27 +168,35 @@ def format_DedupNoticeMessage(self, message: DedupNoticeMessage) -> str: # ------------------------------------------------------------------------- def format_UserTextMessage(self, message: UserTextMessage) -> str: + """Format → rendered markdown HTML.""" return format_user_text_model_content(message) def format_UserSlashCommandMessage(self, message: UserSlashCommandMessage) -> str: + """Format → /cmd.""" return format_user_slash_command_content(message) def format_SlashCommandMessage(self, message: SlashCommandMessage) -> str: + """Format → /cmd arg.""" return format_slash_command_content(message) def format_CommandOutputMessage(self, message: CommandOutputMessage) -> str: + """Format →
...
.""" return format_command_output_content(message) def format_BashInputMessage(self, message: BashInputMessage) -> str: + """Format →
$ cmd
.""" return format_bash_input_content(message) def format_BashOutputMessage(self, message: BashOutputMessage) -> str: + """Format →
...
.""" return format_bash_output_content(message) def format_CompactedSummaryMessage(self, message: CompactedSummaryMessage) -> str: + """Format →
...
.""" return format_compacted_summary_content(message) def format_UserMemoryMessage(self, message: UserMemoryMessage) -> str: + """Format →
...
.""" return format_user_memory_content(message) # ------------------------------------------------------------------------- @@ -191,12 +204,15 @@ def format_UserMemoryMessage(self, message: UserMemoryMessage) -> str: # ------------------------------------------------------------------------- def format_AssistantTextMessage(self, message: AssistantTextMessage) -> str: + """Format → rendered markdown HTML.""" return format_assistant_text_content(message) def format_ThinkingMessage(self, message: ThinkingMessage) -> str: + """Format →
...
(foldable if >10 lines).""" return format_thinking_content(message, line_threshold=10) def format_UnknownMessage(self, message: UnknownMessage) -> str: + """Format →
JSON dump
.""" return format_unknown_content(message) # ------------------------------------------------------------------------- @@ -204,33 +220,43 @@ def format_UnknownMessage(self, message: UnknownMessage) -> str: # ------------------------------------------------------------------------- def format_BashInput(self, input: BashInput) -> str: + """Format →
$ command
.""" return format_bash_input(input) def format_ReadInput(self, input: ReadInput) -> str: + """Format → file_path | ...
.""" return format_read_input(input) def format_WriteInput(self, input: WriteInput) -> str: + """Format → file path + syntax-highlighted content preview.""" return format_write_input(input) def format_EditInput(self, input: EditInput) -> str: + """Format → file path + diff of old_string/new_string.""" return format_edit_input(input) def format_MultiEditInput(self, input: MultiEditInput) -> str: + """Format → file path + multiple diffs.""" return format_multiedit_input(input) def format_TaskInput(self, input: TaskInput) -> str: + """Format →
prompt text
.""" return format_task_input(input) def format_TodoWriteInput(self, input: TodoWriteInput) -> str: + """Format → .""" return format_todowrite_input(input) def format_AskUserQuestionInput(self, input: AskUserQuestionInput) -> str: + """Format → questions as definition list.""" return format_askuserquestion_input(input) def format_ExitPlanModeInput(self, input: ExitPlanModeInput) -> str: + """Format → empty string (no content).""" return format_exitplanmode_input(input) def format_ToolUseContent(self, content: ToolUseContent) -> str: + """Format → key | value rows
.""" return render_params_table(content.input) # ------------------------------------------------------------------------- @@ -238,27 +264,35 @@ def format_ToolUseContent(self, content: ToolUseContent) -> str: # ------------------------------------------------------------------------- def format_ReadOutput(self, output: ReadOutput) -> str: + """Format → syntax-highlighted file content.""" return format_read_output(output) def format_WriteOutput(self, output: WriteOutput) -> str: + """Format → status message (e.g. 'Wrote 42 bytes').""" return format_write_output(output) def format_EditOutput(self, output: EditOutput) -> str: + """Format → status message (e.g. 'Applied edit').""" return format_edit_output(output) def format_BashOutput(self, output: BashOutput) -> str: + """Format →
stdout/stderr
.""" return format_bash_output(output) def format_TaskOutput(self, output: TaskOutput) -> str: + """Format → rendered markdown of task result.""" return format_task_output(output) def format_AskUserQuestionOutput(self, output: AskUserQuestionOutput) -> str: + """Format → user's answers as definition list.""" return format_askuserquestion_output(output) def format_ExitPlanModeOutput(self, output: ExitPlanModeOutput) -> str: + """Format → status message.""" return format_exitplanmode_output(output) def format_ToolResultContent(self, output: ToolResultContent) -> str: + """Format →
raw content
(fallback for unknown tools).""" return format_tool_result_content_raw(output) # ------------------------------------------------------------------------- @@ -278,9 +312,15 @@ def _tool_title( return f"{prefix}{escaped_name}" def title_TodoWriteInput(self, message: TemplateMessage) -> str: # noqa: ARG002 + """Title → '📝 Todo List'.""" return "📝 Todo List" + def title_AskUserQuestionInput(self, message: TemplateMessage) -> str: # noqa: ARG002 + """Title → '❓ Asking questions...'.""" + return "❓ Asking questions..." + def title_TaskInput(self, message: TemplateMessage) -> str: + """Title → '🔧 Task (subagent_type)'.""" content = cast(ToolUseMessage, message.content) input = cast(TaskInput, content.input) escaped_name = escape_html(content.tool_name) @@ -297,18 +337,38 @@ def title_TaskInput(self, message: TemplateMessage) -> str: return f"🔧 {escaped_name}" def title_EditInput(self, message: TemplateMessage) -> str: + """Title → '📝 Edit '.""" input = cast(EditInput, cast(ToolUseMessage, message.content).input) return self._tool_title(message, "📝", input.file_path) def title_WriteInput(self, message: TemplateMessage) -> str: + """Title → '📝 Write '.""" input = cast(WriteInput, cast(ToolUseMessage, message.content).input) return self._tool_title(message, "📝", input.file_path) def title_ReadInput(self, message: TemplateMessage) -> str: + """Title → '📄 Read [, lines N-M]'.""" input = cast(ReadInput, cast(ToolUseMessage, message.content).input) - return self._tool_title(message, "📄", input.file_path) + summary = input.file_path + # Add line range info if available + if input.limit is not None: + offset = input.offset or 0 + if input.limit == 1: + summary = f"{summary}, line {offset + 1}" + else: + summary = f"{summary}, lines {offset + 1}-{offset + input.limit}" + return self._tool_title(message, "📄", summary) + + def title_GlobInput(self, message: TemplateMessage) -> str: + """Title → '🔍 Glob [ in path]'.""" + input = cast(GlobInput, cast(ToolUseMessage, message.content).input) + summary = input.pattern + if input.path: + summary = f"{summary} in {input.path}" + return self._tool_title(message, "🔍", summary) def title_BashInput(self, message: TemplateMessage) -> str: + """Title → '💻 Bash '.""" input = cast(BashInput, cast(ToolUseMessage, message.content).input) return self._tool_title(message, "💻", input.description) diff --git a/claude_code_log/html/templates/components/global_styles.css b/claude_code_log/html/templates/components/global_styles.css index 4d4f1b3f..ce6572aa 100644 --- a/claude_code_log/html/templates/components/global_styles.css +++ b/claude_code_log/html/templates/components/global_styles.css @@ -42,7 +42,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -66,6 +66,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; diff --git a/claude_code_log/html/templates/components/message_styles.css b/claude_code_log/html/templates/components/message_styles.css index aa739996..ea3a9f65 100644 --- a/claude_code_log/html/templates/components/message_styles.css +++ b/claude_code_log/html/templates/components/message_styles.css @@ -31,22 +31,22 @@ flex: 1; display: flex; align-items: center; - justify-content: center; + justify-content: flex-end; gap: 0.4em; cursor: pointer; user-select: none; font-size: 0.9em; font-weight: 500; - padding: 0.4em; + padding: 0.4em 0.8em 0.4em 0.4em; transition: all 0.2s ease; - border-bottom: 2px solid transparent; + border-bottom: 1px solid transparent; background: linear-gradient(to bottom, #f8f8f844, #f0f0f0); } /* Show border only when folded (content is hidden) */ .fold-bar-section.folded { border-bottom-style: solid; - border-bottom-width: 2px; + border-bottom-width: 1px; } .fold-bar-section:hover { @@ -72,6 +72,7 @@ .fold-icon { font-size: 1.1em; line-height: 1; + color: var(--fold-color); } .fold-count { @@ -81,7 +82,7 @@ } .fold-label { - color: var(--text-muted); + color: var(--fold-color); font-size: 0.9em; } @@ -538,11 +539,6 @@ } .thinking { - border-left-color: var(--assistant-dimmed); -} - -/* Full purple when thinking is paired (as pair_first) */ -.thinking.pair_first { border-left-color: var(--assistant-color); } diff --git a/claude_code_log/html/templates/components/todo_styles.css b/claude_code_log/html/templates/components/todo_styles.css index 22a35140..ea055414 100644 --- a/claude_code_log/html/templates/components/todo_styles.css +++ b/claude_code_log/html/templates/components/todo_styles.css @@ -75,7 +75,7 @@ } .todo-item.medium { - border-left: 3px solid var(--priority-medium); + border-left: 3px solid transparent; } .todo-item.low { @@ -102,17 +102,17 @@ padding: 12px; background-color: var(--question-bg); border-radius: 6px; - border-left: 3px solid var(--question-accent); + border-left: 3px solid var(--assistant-color); } .question-block:last-child { margin-bottom: 0; } -/* Answered questions in result (lighter, success-tinted) */ +/* Answered questions in result */ .question-block.answered { background-color: var(--answer-bg); - border-left-color: var(--answer-accent); + border-left-color: var(--user-color); } .question-header { @@ -135,9 +135,13 @@ .answer-text { font-size: 1.05em; font-weight: 600; - color: var(--answer-accent); + color: var(--text-primary); line-height: 1.4; - padding-left: 4px; +} + +/* Q: and A: labels */ +.qa-label { + font-weight: 700; } .question-options-hint { diff --git a/claude_code_log/html/tool_formatters.py b/claude_code_log/html/tool_formatters.py index 9b0f6ac0..d367e811 100644 --- a/claude_code_log/html/tool_formatters.py +++ b/claude_code_log/html/tool_formatters.py @@ -62,9 +62,11 @@ def _render_question_item(q: AskUserQuestionItem) -> str: escaped_header = escape_html(q.header) html_parts.append(f'
{escaped_header}
') - # Question text with icon + # Question text with Q: label question_text = escape_html(q.question) - html_parts.append(f'
❓ {question_text}
') + html_parts.append( + f'
Q: {question_text}
' + ) # Options (if present) if q.options: @@ -155,8 +157,12 @@ def format_askuserquestion_result(content: str) -> str: escaped_q = escape_html(question) escaped_a = escape_html(answer) html_parts.append('
') - html_parts.append(f'
❓ {escaped_q}
') - html_parts.append(f'
✅ {escaped_a}
') + html_parts.append( + f'
Q: {escaped_q}
' + ) + html_parts.append( + f'
A: {escaped_a}
' + ) html_parts.append("
") html_parts.append("") @@ -391,8 +397,12 @@ def format_askuserquestion_output(output: AskUserQuestionOutput) -> str: escaped_q = escape_html(qa.question) escaped_a = escape_html(qa.answer) html_parts.append('
') - html_parts.append(f'
❓ {escaped_q}
') - html_parts.append(f'
✅ {escaped_a}
') + html_parts.append( + f'
Q: {escaped_q}
' + ) + html_parts.append( + f'
A: {escaped_a}
' + ) html_parts.append("
") html_parts.append("") diff --git a/test/__snapshots__/test_snapshot_html.ambr b/test/__snapshots__/test_snapshot_html.ambr index 6ee0eec7..f0d7e69c 100644 --- a/test/__snapshots__/test_snapshot_html.ambr +++ b/test/__snapshots__/test_snapshot_html.ambr @@ -54,7 +54,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -78,6 +78,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; @@ -1904,7 +1905,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -1928,6 +1929,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; @@ -2123,22 +2125,22 @@ flex: 1; display: flex; align-items: center; - justify-content: center; + justify-content: flex-end; gap: 0.4em; cursor: pointer; user-select: none; font-size: 0.9em; font-weight: 500; - padding: 0.4em; + padding: 0.4em 0.8em 0.4em 0.4em; transition: all 0.2s ease; - border-bottom: 2px solid transparent; + border-bottom: 1px solid transparent; background: linear-gradient(to bottom, #f8f8f844, #f0f0f0); } /* Show border only when folded (content is hidden) */ .fold-bar-section.folded { border-bottom-style: solid; - border-bottom-width: 2px; + border-bottom-width: 1px; } .fold-bar-section:hover { @@ -2164,6 +2166,7 @@ .fold-icon { font-size: 1.1em; line-height: 1; + color: var(--fold-color); } .fold-count { @@ -2173,7 +2176,7 @@ } .fold-label { - color: var(--text-muted); + color: var(--fold-color); font-size: 0.9em; } @@ -2630,11 +2633,6 @@ } .thinking { - border-left-color: var(--assistant-dimmed); - } - - /* Full purple when thinking is paired (as pair_first) */ - .thinking.pair_first { border-left-color: var(--assistant-color); } @@ -3364,7 +3362,7 @@ } .todo-item.medium { - border-left: 3px solid var(--priority-medium); + border-left: 3px solid transparent; } .todo-item.low { @@ -3391,17 +3389,17 @@ padding: 12px; background-color: var(--question-bg); border-radius: 6px; - border-left: 3px solid var(--question-accent); + border-left: 3px solid var(--assistant-color); } .question-block:last-child { margin-bottom: 0; } - /* Answered questions in result (lighter, success-tinted) */ + /* Answered questions in result */ .question-block.answered { background-color: var(--answer-bg); - border-left-color: var(--answer-accent); + border-left-color: var(--user-color); } .question-header { @@ -3424,9 +3422,13 @@ .answer-text { font-size: 1.05em; font-weight: 600; - color: var(--answer-accent); + color: var(--text-primary); line-height: 1.4; - padding-left: 4px; + } + + /* Q: and A: labels */ + .qa-label { + font-weight: 700; } .question-options-hint { @@ -6704,7 +6706,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -6728,6 +6730,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; @@ -6923,22 +6926,22 @@ flex: 1; display: flex; align-items: center; - justify-content: center; + justify-content: flex-end; gap: 0.4em; cursor: pointer; user-select: none; font-size: 0.9em; font-weight: 500; - padding: 0.4em; + padding: 0.4em 0.8em 0.4em 0.4em; transition: all 0.2s ease; - border-bottom: 2px solid transparent; + border-bottom: 1px solid transparent; background: linear-gradient(to bottom, #f8f8f844, #f0f0f0); } /* Show border only when folded (content is hidden) */ .fold-bar-section.folded { border-bottom-style: solid; - border-bottom-width: 2px; + border-bottom-width: 1px; } .fold-bar-section:hover { @@ -6964,6 +6967,7 @@ .fold-icon { font-size: 1.1em; line-height: 1; + color: var(--fold-color); } .fold-count { @@ -6973,7 +6977,7 @@ } .fold-label { - color: var(--text-muted); + color: var(--fold-color); font-size: 0.9em; } @@ -7430,11 +7434,6 @@ } .thinking { - border-left-color: var(--assistant-dimmed); - } - - /* Full purple when thinking is paired (as pair_first) */ - .thinking.pair_first { border-left-color: var(--assistant-color); } @@ -8164,7 +8163,7 @@ } .todo-item.medium { - border-left: 3px solid var(--priority-medium); + border-left: 3px solid transparent; } .todo-item.low { @@ -8191,17 +8190,17 @@ padding: 12px; background-color: var(--question-bg); border-radius: 6px; - border-left: 3px solid var(--question-accent); + border-left: 3px solid var(--assistant-color); } .question-block:last-child { margin-bottom: 0; } - /* Answered questions in result (lighter, success-tinted) */ + /* Answered questions in result */ .question-block.answered { background-color: var(--answer-bg); - border-left-color: var(--answer-accent); + border-left-color: var(--user-color); } .question-header { @@ -8224,9 +8223,13 @@ .answer-text { font-size: 1.05em; font-weight: 600; - color: var(--answer-accent); + color: var(--text-primary); line-height: 1.4; - padding-left: 4px; + } + + /* Q: and A: labels */ + .qa-label { + font-weight: 700; } .question-options-hint { @@ -11593,7 +11596,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -11617,6 +11620,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; @@ -11812,22 +11816,22 @@ flex: 1; display: flex; align-items: center; - justify-content: center; + justify-content: flex-end; gap: 0.4em; cursor: pointer; user-select: none; font-size: 0.9em; font-weight: 500; - padding: 0.4em; + padding: 0.4em 0.8em 0.4em 0.4em; transition: all 0.2s ease; - border-bottom: 2px solid transparent; + border-bottom: 1px solid transparent; background: linear-gradient(to bottom, #f8f8f844, #f0f0f0); } /* Show border only when folded (content is hidden) */ .fold-bar-section.folded { border-bottom-style: solid; - border-bottom-width: 2px; + border-bottom-width: 1px; } .fold-bar-section:hover { @@ -11853,6 +11857,7 @@ .fold-icon { font-size: 1.1em; line-height: 1; + color: var(--fold-color); } .fold-count { @@ -11862,7 +11867,7 @@ } .fold-label { - color: var(--text-muted); + color: var(--fold-color); font-size: 0.9em; } @@ -12319,11 +12324,6 @@ } .thinking { - border-left-color: var(--assistant-dimmed); - } - - /* Full purple when thinking is paired (as pair_first) */ - .thinking.pair_first { border-left-color: var(--assistant-color); } @@ -13053,7 +13053,7 @@ } .todo-item.medium { - border-left: 3px solid var(--priority-medium); + border-left: 3px solid transparent; } .todo-item.low { @@ -13080,17 +13080,17 @@ padding: 12px; background-color: var(--question-bg); border-radius: 6px; - border-left: 3px solid var(--question-accent); + border-left: 3px solid var(--assistant-color); } .question-block:last-child { margin-bottom: 0; } - /* Answered questions in result (lighter, success-tinted) */ + /* Answered questions in result */ .question-block.answered { background-color: var(--answer-bg); - border-left-color: var(--answer-accent); + border-left-color: var(--user-color); } .question-header { @@ -13113,9 +13113,13 @@ .answer-text { font-size: 1.05em; font-weight: 600; - color: var(--answer-accent); + color: var(--text-primary); line-height: 1.4; - padding-left: 4px; + } + + /* Q: and A: labels */ + .qa-label { + font-weight: 700; } .question-options-hint { @@ -16530,7 +16534,7 @@ --question-accent: #f5a623; --question-bg: #fffbf0; --answer-accent: #4caf50; - --answer-bg: #f0fff4; + --answer-bg: #fffbf0; /* Priority palette (purple intensity - darker = more urgent) */ --priority-600: #7c3aed; @@ -16554,6 +16558,7 @@ --text-primary: #333; --text-muted: #666; --text-secondary: #495057; + --fold-color: #888; /* Border colors */ --border-light: #e0e0e0; @@ -16749,22 +16754,22 @@ flex: 1; display: flex; align-items: center; - justify-content: center; + justify-content: flex-end; gap: 0.4em; cursor: pointer; user-select: none; font-size: 0.9em; font-weight: 500; - padding: 0.4em; + padding: 0.4em 0.8em 0.4em 0.4em; transition: all 0.2s ease; - border-bottom: 2px solid transparent; + border-bottom: 1px solid transparent; background: linear-gradient(to bottom, #f8f8f844, #f0f0f0); } /* Show border only when folded (content is hidden) */ .fold-bar-section.folded { border-bottom-style: solid; - border-bottom-width: 2px; + border-bottom-width: 1px; } .fold-bar-section:hover { @@ -16790,6 +16795,7 @@ .fold-icon { font-size: 1.1em; line-height: 1; + color: var(--fold-color); } .fold-count { @@ -16799,7 +16805,7 @@ } .fold-label { - color: var(--text-muted); + color: var(--fold-color); font-size: 0.9em; } @@ -17256,11 +17262,6 @@ } .thinking { - border-left-color: var(--assistant-dimmed); - } - - /* Full purple when thinking is paired (as pair_first) */ - .thinking.pair_first { border-left-color: var(--assistant-color); } @@ -17990,7 +17991,7 @@ } .todo-item.medium { - border-left: 3px solid var(--priority-medium); + border-left: 3px solid transparent; } .todo-item.low { @@ -18017,17 +18018,17 @@ padding: 12px; background-color: var(--question-bg); border-radius: 6px; - border-left: 3px solid var(--question-accent); + border-left: 3px solid var(--assistant-color); } .question-block:last-child { margin-bottom: 0; } - /* Answered questions in result (lighter, success-tinted) */ + /* Answered questions in result */ .question-block.answered { background-color: var(--answer-bg); - border-left-color: var(--answer-accent); + border-left-color: var(--user-color); } .question-header { @@ -18050,9 +18051,13 @@ .answer-text { font-size: 1.05em; font-weight: 600; - color: var(--answer-accent); + color: var(--text-primary); line-height: 1.4; - padding-left: 4px; + } + + /* Q: and A: labels */ + .qa-label { + font-weight: 700; } .question-options-hint { diff --git a/test/test_askuserquestion_rendering.py b/test/test_askuserquestion_rendering.py index a77f7f98..22949214 100644 --- a/test/test_askuserquestion_rendering.py +++ b/test/test_askuserquestion_rendering.py @@ -75,8 +75,8 @@ def test_format_askuserquestion_multiple_questions(self): assert "Treat .tar/.tar.gz like .zip" in html assert "Only process tar archives inside ZIP files" in html - # Check question icon - assert "❓" in html + # Check question label + assert "Q:" in html # Check select hint assert "(select one)" in html @@ -149,7 +149,7 @@ def test_format_askuserquestion_legacy_single_question(self): # Should still render the question assert 'class="askuserquestion-content"' in html assert "What is your preference?" in html - assert "❓" in html + assert "Q:" in html def test_format_askuserquestion_no_options(self): """Test AskUserQuestion formatting without options.""" @@ -224,8 +224,8 @@ def test_format_result_single_qa(self): assert 'class="question-block answered"' in html assert "What is your preference?" in html assert "Option A" in html - assert "❓" in html - assert "✅" in html + assert "Q:" in html + assert "A:" in html def test_format_result_multiple_qa(self): """Test formatting a result with multiple Q&A pairs."""