Merge pull request #3 from PullPullers/feedback/review-todo-section

Feedback/review todo section
This commit is contained in:
Yunhui Chae
2025-06-05 22:15:18 +09:00
committed by GitHub
2 changed files with 19 additions and 12 deletions

View File

@ -164,6 +164,7 @@ def convert_to_markdown_v2(output_data: dict,
if gfm_supported:
markdown_text += "<table>\n"
todos_summary = output_data['review'].pop('todos_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']:
@ -223,16 +224,6 @@ def convert_to_markdown_v2(output_data: dict,
value = emphasize_header(value.strip(), only_markdown=True)
markdown_text += f"{value}\n\n"
elif 'todo sections' in key_nice.lower():
def format_multiline_html_item(file: str, line_range: Tuple[int, int], content: str, url: str) -> str:
label = f"{file} [{line_range[0]}-{line_range[1]}]" if line_range[0] != line_range[1] else f"{file} [{line_range[0]}]"
first_line, *rest_lines = content.strip().split("\n")
if rest_lines:
rest = "<br>".join(rest_lines)
return f"<li><a href='{url}'>{label}</a>: {first_line}<br><blockquote>{rest}</blockquote></li>"
else:
return f"<li><a href='{url}'>{label}</a>: {first_line}</li>"
def format_todo_item(todo_item: TodoItem) -> str:
relevant_file = todo_item.get('relevant_file', '').strip()
line_range = todo_item.get('line_range', [])
@ -274,7 +265,7 @@ def convert_to_markdown_v2(output_data: dict,
if is_value_no(value):
markdown_text += f"{emoji}&nbsp;<strong>No TODO sections</strong>"
else:
markdown_text += f"<details><summary>{emoji}&nbsp;<strong>TODO sections</strong></summary>\n\n"
markdown_text += f"{emoji}&nbsp;<strong>TODO sections ({len(value)} items)</strong>\n<details><summary>{todos_summary}</summary>\n\n"
if isinstance(value, list):
markdown_text += "<ul>\n"
for todo_item in value:
@ -288,7 +279,7 @@ def convert_to_markdown_v2(output_data: dict,
if is_value_no(value):
markdown_text += f"### {emoji} No TODO sections\n\n"
else:
markdown_text += f"<details><summary>### {emoji} TODO sections</summary>\n\n"
markdown_text += f"### {emoji} TODO sections ({len(value)} items)\n<details><summary>{todos_summary}</summary>\n\n"
if isinstance(value, list):
for todo_item in value:
markdown_text += f"- {format_todo_item(todo_item)}\n"

View File

@ -109,6 +109,18 @@ class Review(BaseModel):
{%- endif %}
{%- if require_todo_scan %}
todo_sections: Union[List[TodoSection], str] = Field(description="A list of TODO comments found in the code. Return 'No' (as a string) if there are no TODO comments.")
todos_summary: str = Field(description="When writing TODO section summaries, use this format:
[count] TODOs found about [functional area based on TODO content]
- The [count] is the number of TODO items, equal to the length of the `todo_sections` list.
- Functional areas describe what the TODOs are about:
testing, error handling, validation, documentation, performance,
security, logging, refactoring, API design, UI/UX
Example:
3 TODOs found about input validation and error handling
Return 'No' (as a string) if there are no TODO comments.")
{%- endif %}
{%- if require_can_be_split_review %}
can_be_split: List[SubPR] = Field(min_items=0, max_items=3, description="Can this PR, which contains {{ num_pr_files }} changed files in total, be divided into smaller sub-PRs with distinct tasks that can be reviewed and merged independently, regardless of the order ? Make sure that the sub-PRs are indeed independent, with no code dependencies between them, and that each sub-PR represent a meaningful independent task. Output an empty list if the PR code does not need to be split.")
@ -158,6 +170,8 @@ review:
No
todo_sections:
No
todos_summary:
No
{%- if require_can_be_split_review %}
can_be_split:
- relevant_files:
@ -278,6 +292,8 @@ review:
No
todo_sections:
No
todos_summary:
No
{%- if require_can_be_split_review %}
can_be_split:
- relevant_files: