diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py
index b967a0be..aeecd35b 100644
--- a/pr_agent/algo/utils.py
+++ b/pr_agent/algo/utils.py
@@ -164,7 +164,7 @@ def convert_to_markdown_v2(output_data: dict,
if gfm_supported:
markdown_text += "
\n"
- todos_summary = output_data['review'].pop('todos_summary', '')
+ todo_summary = output_data['review'].pop('todo_summary', '')
for key, value in output_data['review'].items():
if value is None or value == '' or value == {} or value == []:
if key.lower() not in ['can_be_split', 'key_issues_to_review']:
@@ -260,12 +260,9 @@ def convert_to_markdown_v2(output_data: dict,
else:
return file_ref
- if gfm_supported:
- markdown_text += f""
- if is_value_no(value):
- markdown_text += f"{emoji} No TODO sections"
- else:
- markdown_text += f"{emoji} TODO sections ({len(value)} items)\n{todos_summary}\n\n"
+ def format_todo_items(value: list[TodoItem] | TodoItem) -> str:
+ markdown_text = ""
+ if gfm_supported:
if isinstance(value, list):
markdown_text += "\n"
for todo_item in value:
@@ -273,18 +270,35 @@ def convert_to_markdown_v2(output_data: dict,
markdown_text += " \n"
else:
markdown_text += f"{format_todo_item(value)} \n"
- markdown_text += "\n \n"
- markdown_text += f" |
\n"
- else:
- if is_value_no(value):
- markdown_text += f"### {emoji} No TODO sections\n\n"
else:
- markdown_text += f"### {emoji} TODO sections ({len(value)} items)\n{todos_summary}
\n\n"
if isinstance(value, list):
for todo_item in value:
markdown_text += f"- {format_todo_item(todo_item)}\n"
else:
markdown_text += f"- {format_todo_item(value)}\n"
+ return markdown_text
+
+ markdown_todo_items = format_todo_items(value)
+ EXPAND_LINE_THRESHOLD = 10
+ details_open_attr = " open" if markdown_todo_items.count("\n") + 1 <= EXPAND_LINE_THRESHOLD else ""
+
+ todo_entry_label = f"{len(value)} " + "entries" if len(value) > 1 else "entry"
+ if gfm_supported:
+ markdown_text += ""
+ if is_value_no(value):
+ markdown_text += f"{emoji} No TODO sections"
+ else:
+ markdown_text += f"{emoji} TODO sections ({todo_entry_label})\n"
+ markdown_text += f"{todo_summary}\n\n"
+ markdown_text += markdown_todo_items
+ markdown_text += "\n \n"
+ markdown_text += " |
\n"
+ else:
+ if is_value_no(value):
+ markdown_text += f"### {emoji} No TODO sections\n\n"
+ else:
+ markdown_text += f"### {emoji} TODO sections ({todo_entry_label})\n{todo_summary}
\n\n"
+ markdown_text += markdown_todo_items
markdown_text += "\n \n\n"
elif 'can be split' in key_nice.lower():
if gfm_supported:
diff --git a/pr_agent/settings/pr_reviewer_prompts.toml b/pr_agent/settings/pr_reviewer_prompts.toml
index 6d94acd6..c96cac6e 100644
--- a/pr_agent/settings/pr_reviewer_prompts.toml
+++ b/pr_agent/settings/pr_reviewer_prompts.toml
@@ -75,7 +75,7 @@ class KeyIssuesComponentLink(BaseModel):
class TodoSection(BaseModel):
relevant_file: str = Field(description="The file containing the TODO comment")
line_range: Tuple[int, int] = Field(description="Start and end line numbers of the TODO comment (inclusive). Must be a tuple of two integers, e.g., (7, 7) for a single line or (7, 10) for a range. Do not use list format [7, 7].")
- content: str = Field(description="The content of the TODO comment. Only include actual TODO comments within code comments (e.g., lines starting with '#', '//', '/*', '