From b84fdd68824d9784281565eb961c2fbdac20b65a Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 00:41:28 +0100 Subject: [PATCH 01/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 41 ++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index b0ac3b3e354..36ddecf42e9 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -20,19 +20,21 @@ jobs: python -m pip install --upgrade pip pip install PyGithub - - name: Ejecutar script de búsqueda + - name: Ejecutar script de búsqueda y actualizar issue env: TOKEN: ${{ secrets.NOVUM_PRIVATE_REPOS }} run: | python - < Date: Wed, 17 Dec 2025 00:57:02 +0100 Subject: [PATCH 02/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index 36ddecf42e9..87df25d2f46 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -74,25 +74,20 @@ jobs: print(f"Issue #{issue.number}: {issue.title} ({issue_url})") # Crear tabla en formato markdown - table_header = "| IssueNumber | IssueName | Status | Last Modification |\n" - table_separator = "|-------------|-----------|--------|------------------|\n" + table_header = "| Issue | Name | Last Modification |\n" + table_separator = "|-------------|-----------|------------------|\n" table_rows = "" for issue in issues_con_checkboxes_desactivados: issue_link = f"[#{issue.number}]({REPO_URL}/issues/{issue.number})" issue_name = issue.title.replace("|", "\\|") # Escapar pipes en el título - status = "Closed" if issue.state == "closed" else "Open" last_modified = issue.updated_at.strftime("%Y-%m-%d %H:%M") - table_rows += f"| {issue_link} | {issue_name} | {status} | {last_modified} |\n" + table_rows += f"| {issue_link} | {issue_name} | {last_modified} |\n" # Crear el nuevo body de la issue current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC") - new_body = f"""# Pending Tasks Report - - **Last Updated:** {current_time} - - ## Issues with Unchecked Checkboxes + new_body = f""" {table_header}{table_separator}{table_rows} From a04143a129bbdd8eaf88b6d9778fcb3ffe4422e2 Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 00:59:13 +0100 Subject: [PATCH 03/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index 87df25d2f46..4429dceeb07 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -74,7 +74,7 @@ jobs: print(f"Issue #{issue.number}: {issue.title} ({issue_url})") # Crear tabla en formato markdown - table_header = "| Issue | Name | Last Modification |\n" + table_header = "| Issue ({len(issues_con_checkboxes_desactivados)}) | Name | Last Modification |\n" table_separator = "|-------------|-----------|------------------|\n" table_rows = "" @@ -93,7 +93,6 @@ jobs: --- *This report shows closed issues that still contain unchecked checkboxes (- [ ]) in their description or comments.* - *Total issues found: {len(issues_con_checkboxes_desactivados)}* """ # Actualizar la issue #2490 From 2722f40dfe5bfefb37e06d4c1cc408a775aaeb8a Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 14:45:57 +0100 Subject: [PATCH 04/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 63 +++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index 4429dceeb07..ec6342cf6df 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -51,21 +51,33 @@ jobs: # Lista para almacenar las issues con checkboxes desactivados issues_con_checkboxes_desactivados = [] + def count_checkboxes(text): + """Cuenta checkboxes marcados y desmarcados en un texto""" + if text is None: + return 0, 0 + + checked = text.count('- [x]') + text.count('- [X]') + unchecked = text.count('- [ ]') + return checked, unchecked + # Itera sobre las issues cerradas for issue in closed_issues: + has_unchecked = False + # Verifica que el cuerpo de la issue no sea None if issue.body is not None and '- [ ]' in issue.body: - issues_con_checkboxes_desactivados.append(issue) - continue + has_unchecked = True - # Obtiene los comentarios de la issue - comments = issue.get_comments() + # Si no se encontraron en el body, busca en los comentarios + if not has_unchecked: + comments = issue.get_comments() + for comment in comments: + if '- [ ]' in comment.body: + has_unchecked = True + break - # Busca checkboxes desactivados en los comentarios - for comment in comments: - if '- [ ]' in comment.body: - issues_con_checkboxes_desactivados.append(issue) - break + if has_unchecked: + issues_con_checkboxes_desactivados.append(issue) # Imprime el listado de issues con checkboxes desactivados print("Issues con checkboxes desactivados:") @@ -74,8 +86,8 @@ jobs: print(f"Issue #{issue.number}: {issue.title} ({issue_url})") # Crear tabla en formato markdown - table_header = "| Issue ({len(issues_con_checkboxes_desactivados)}) | Name | Last Modification |\n" - table_separator = "|-------------|-----------|------------------|\n" + table_header = "| Issue | Name | Progress | Last Modification |\n" + table_separator = "|-------|------|----------|------------------|\n" table_rows = "" for issue in issues_con_checkboxes_desactivados: @@ -83,16 +95,41 @@ jobs: issue_name = issue.title.replace("|", "\\|") # Escapar pipes en el título last_modified = issue.updated_at.strftime("%Y-%m-%d %H:%M") - table_rows += f"| {issue_link} | {issue_name} | {last_modified} |\n" + # Contar checkboxes en el body de la issue + checked_body, unchecked_body = count_checkboxes(issue.body) + + # Contar checkboxes en los comentarios + checked_comments = 0 + unchecked_comments = 0 + comments = issue.get_comments() + for comment in comments: + c_checked, c_unchecked = count_checkboxes(comment.body) + checked_comments += c_checked + unchecked_comments += c_unchecked + + # Total de checkboxes + total_checked = checked_body + checked_comments + total_unchecked = unchecked_body + unchecked_comments + total_checkboxes = total_checked + total_unchecked + + progress = f"{total_checked} / {total_checkboxes}" + + table_rows += f"| {issue_link} | {issue_name} | {progress} | {last_modified} |\n" # Crear el nuevo body de la issue current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC") - new_body = f""" + new_body = f"""# Pending Tasks Report + + **Last Updated:** {current_time} + **Total Issues Found:** {len(issues_con_checkboxes_desactivados)} + + ## Issues with Unchecked Checkboxes {table_header}{table_separator}{table_rows} --- *This report shows closed issues that still contain unchecked checkboxes (- [ ]) in their description or comments.* + *Progress column shows: completed tasks / total tasks* """ # Actualizar la issue #2490 From f39372ddb9c3b61a755d5fc6593cef70b264b5bc Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 15:38:13 +0100 Subject: [PATCH 05/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index ec6342cf6df..c1ef3eadcfd 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -128,7 +128,7 @@ jobs: {table_header}{table_separator}{table_rows} --- - *This report shows closed issues that still contain unchecked checkboxes (- [ ]) in their description or comments.* + *This report shows closed issues that still contain unchecked checkboxes in their description or comments.* *Progress column shows: completed tasks / total tasks* """ From f5992a7a4c7255229cfbb804f123b09f8760a38a Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 16:16:13 +0100 Subject: [PATCH 06/14] separate script --- .../branch-table.py | 0 .github/issue-scripts/pending-tasks.py | 160 ++++++++++++++++++ .github/workflows/pending-tasks.yml | 120 +------------ 3 files changed, 162 insertions(+), 118 deletions(-) rename .github/{branch-table => issue-scripts}/branch-table.py (100%) create mode 100644 .github/issue-scripts/pending-tasks.py diff --git a/.github/branch-table/branch-table.py b/.github/issue-scripts/branch-table.py similarity index 100% rename from .github/branch-table/branch-table.py rename to .github/issue-scripts/branch-table.py diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py new file mode 100644 index 00000000000..e223c317463 --- /dev/null +++ b/.github/issue-scripts/pending-tasks.py @@ -0,0 +1,160 @@ +import os +from github import Github +from datetime import datetime + +def count_checkboxes(text): + """Cuenta checkboxes marcados y desmarcados en un texto""" + if text is None: + return 0, 0 + + checked = text.count('- [x]') + text.count('- [X]') + unchecked = text.count('- [ ]') + return checked, unchecked + +def format_time_difference(days): + """Formatea la diferencia de tiempo en años, meses y días""" + years = days // 365 + remaining_days = days % 365 + months = remaining_days // 30 + remaining_days = remaining_days % 30 + + # Build the formatted string based on the components + formatted_time = [] + if years > 0: + formatted_time.append(f"{years} yr{'s' if years > 1 else ''}") + if months > 0: + formatted_time.append(f"{months} mo") + if remaining_days > 0 or (years == 0 and months == 0): + formatted_time.append(f"{remaining_days} d") + if remaining_days == 0 and years == 0 and months == 0: + return "Today" + + return ", ".join(formatted_time) + +def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): + """Analiza issues cerradas con checkboxes pendientes y actualiza el reporte""" + + # URL base del repositorio + repo_url = f'https://github.com/{owner}/{repo}' + + # Crea una instancia de la clase Github usando el token de acceso + g = Github(token) + + # Obtiene el repositorio + repository = g.get_repo(f'{owner}/{repo}') + + # Busca las issues cerradas en el repositorio + closed_issues = repository.get_issues(state='closed') + + # Lista para almacenar las issues con checkboxes desactivados + issues_con_checkboxes_desactivados = [] + + # Itera sobre las issues cerradas + for issue in closed_issues: + # Excluir la issue del reporte (donde se muestra este reporte) + if issue.number == target_issue_number: + continue + + has_unchecked = False + + # Verifica que el cuerpo de la issue no sea None + if issue.body is not None and '- [ ]' in issue.body: + has_unchecked = True + + # Si no se encontraron en el body, busca en los comentarios + if not has_unchecked: + comments = issue.get_comments() + for comment in comments: + if comment.body is not None and '- [ ]' in comment.body: + has_unchecked = True + break + + if has_unchecked: + issues_con_checkboxes_desactivados.append(issue) + + # Imprime el listado de issues con checkboxes desactivados + print("Issues con checkboxes desactivados:") + for issue in issues_con_checkboxes_desactivados: + issue_url = f'{repo_url}/issues/{issue.number}' + print(f"Issue #{issue.number}: {issue.title} ({issue_url})") + + # Crear tabla en formato markdown + table_header = "| Issue | Name | Progress | Last Modification |\n" + table_separator = "|-------|------|----------|------------------|\n" + table_rows = "" + + for issue in issues_con_checkboxes_desactivados: + issue_link = f"[#{issue.number}]({repo_url}/issues/{issue.number})" + issue_name = issue.title.replace("|", "\\|") # Escapar pipes en el título + + # Calcular días desde la última modificación + current_time = datetime.now(issue.updated_at.tzinfo) + days_since_modification = (current_time - issue.updated_at).days + last_modified = format_time_difference(days_since_modification) + + # Contar checkboxes en el body de la issue + checked_body, unchecked_body = count_checkboxes(issue.body) + + # Contar checkboxes en los comentarios + checked_comments = 0 + unchecked_comments = 0 + comments = issue.get_comments() + for comment in comments: + c_checked, c_unchecked = count_checkboxes(comment.body) + checked_comments += c_checked + unchecked_comments += c_unchecked + + # Total de checkboxes + total_checked = checked_body + checked_comments + total_unchecked = unchecked_body + unchecked_comments + total_checkboxes = total_checked + total_unchecked + + progress = f"{total_checked} / {total_checkboxes}" + + table_rows += f"| {issue_link} | {issue_name} | {progress} | {last_modified} |\n" + + # Crear el nuevo body de la issue + current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC") + new_body = f"""# Pending Tasks Report + +**Last Updated:** {current_time} +**Total Issues Found:** {len(issues_con_checkboxes_desactivados)} + +## Issues with Unchecked Checkboxes + +{table_header}{table_separator}{table_rows} + +--- +*This report shows closed issues that still contain unchecked checkboxes in their description or comments.* +*Progress column shows: completed tasks / total tasks* +""" + + # Actualizar la issue del reporte + try: + target_issue = repository.get_issue(target_issue_number) + target_issue.edit(body=new_body) + print(f"\n✅ Issue #{target_issue_number} updated successfully!") + print(f"Total issues with unchecked checkboxes: {len(issues_con_checkboxes_desactivados)}") + return True + except Exception as e: + print(f"\n❌ Error updating issue #{target_issue_number}: {str(e)}") + return False + +def main(): + """Función principal""" + # Obtener variables de entorno + token = os.environ.get('TOKEN') + if not token: + print("❌ Error: TOKEN environment variable not found") + return False + + # Configuración del repositorio + owner = 'Telefonica' + repo = 'mistica-design' + target_issue_number = 2490 + + return analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number) + +if __name__ == "__main__": + success = main() + exit(0 if success else 1) \ No newline at end of file diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index c1ef3eadcfd..f8df6cb66da 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -23,121 +23,5 @@ jobs: - name: Ejecutar script de búsqueda y actualizar issue env: TOKEN: ${{ secrets.NOVUM_PRIVATE_REPOS }} - run: | - python - < Date: Wed, 17 Dec 2025 16:17:51 +0100 Subject: [PATCH 07/14] Update pending-tasks.yml --- .github/workflows/pending-tasks.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pending-tasks.yml b/.github/workflows/pending-tasks.yml index f8df6cb66da..9af825aabd2 100644 --- a/.github/workflows/pending-tasks.yml +++ b/.github/workflows/pending-tasks.yml @@ -2,6 +2,8 @@ name: Pending tasks in issues on: workflow_dispatch: + schedule: + - cron: 0 8 * * * jobs: pending-tasks: From fd44de9e9a2dc91da6babeb8a47b57002ff8a6d6 Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:06:30 +0100 Subject: [PATCH 08/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 45 ++++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index e223c317463..f1db78835df 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -3,7 +3,7 @@ from datetime import datetime def count_checkboxes(text): - """Cuenta checkboxes marcados y desmarcados en un texto""" + """Count checked and unchecked checkboxes in a text""" if text is None: return 0, 0 @@ -12,7 +12,7 @@ def count_checkboxes(text): return checked, unchecked def format_time_difference(days): - """Formatea la diferencia de tiempo en años, meses y días""" + """Format time difference in years, months and days""" years = days // 365 remaining_days = days % 365 months = remaining_days // 30 @@ -32,18 +32,18 @@ def format_time_difference(days): return ", ".join(formatted_time) def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): - """Analiza issues cerradas con checkboxes pendientes y actualiza el reporte""" + """Analyze closed issues with pending checkboxes and update the report""" - # URL base del repositorio + # Repository base URL repo_url = f'https://github.com/{owner}/{repo}' - # Crea una instancia de la clase Github usando el token de acceso + # Create a Github class instance using the access token g = Github(token) - # Obtiene el repositorio + # Get the repository repository = g.get_repo(f'{owner}/{repo}') - # Busca las issues cerradas en el repositorio + # Search for closed issues in the repository closed_issues = repository.get_issues(state='closed') # Lista para almacenar las issues con checkboxes desactivados @@ -51,17 +51,17 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): # Itera sobre las issues cerradas for issue in closed_issues: - # Excluir la issue del reporte (donde se muestra este reporte) + # Exclude the report issue (where this report is displayed) if issue.number == target_issue_number: continue has_unchecked = False - # Verifica que el cuerpo de la issue no sea None + # Verify that the issue body is not None if issue.body is not None and '- [ ]' in issue.body: has_unchecked = True - # Si no se encontraron en el body, busca en los comentarios + # If not found in the body, search in comments if not has_unchecked: comments = issue.get_comments() for comment in comments: @@ -72,22 +72,25 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): if has_unchecked: issues_con_checkboxes_desactivados.append(issue) - # Imprime el listado de issues con checkboxes desactivados + # Sort issues by last modification date (most recent first) + issues_con_checkboxes_desactivados.sort(key=lambda x: x.updated_at, reverse=True) + + # Print the list of issues with unchecked checkboxes print("Issues con checkboxes desactivados:") for issue in issues_con_checkboxes_desactivados: issue_url = f'{repo_url}/issues/{issue.number}' print(f"Issue #{issue.number}: {issue.title} ({issue_url})") - # Crear tabla en formato markdown + # Create markdown table table_header = "| Issue | Name | Progress | Last Modification |\n" - table_separator = "|-------|------|----------|------------------|\n" + table_separator = "|-------|------|----------|:------------------|\n" table_rows = "" for issue in issues_con_checkboxes_desactivados: issue_link = f"[#{issue.number}]({repo_url}/issues/{issue.number})" - issue_name = issue.title.replace("|", "\\|") # Escapar pipes en el título + issue_name = issue.title.replace("|", "\\|") # Escape pipes in the title - # Calcular días desde la última modificación + # Calculate days since last modification current_time = datetime.now(issue.updated_at.tzinfo) days_since_modification = (current_time - issue.updated_at).days last_modified = format_time_difference(days_since_modification) @@ -104,7 +107,7 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): checked_comments += c_checked unchecked_comments += c_unchecked - # Total de checkboxes + # Total checkboxes total_checked = checked_body + checked_comments total_unchecked = unchecked_body + unchecked_comments total_checkboxes = total_checked + total_unchecked @@ -113,7 +116,7 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): table_rows += f"| {issue_link} | {issue_name} | {progress} | {last_modified} |\n" - # Crear el nuevo body de la issue + # Create the new issue body current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC") new_body = f"""# Pending Tasks Report @@ -129,7 +132,7 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): *Progress column shows: completed tasks / total tasks* """ - # Actualizar la issue del reporte + # Update the report issue try: target_issue = repository.get_issue(target_issue_number) target_issue.edit(body=new_body) @@ -141,14 +144,14 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): return False def main(): - """Función principal""" - # Obtener variables de entorno + """Main function""" + # Get environment variables token = os.environ.get('TOKEN') if not token: print("❌ Error: TOKEN environment variable not found") return False - # Configuración del repositorio + # Repository configuration owner = 'Telefonica' repo = 'mistica-design' target_issue_number = 2490 From 1e4cea317db2a6afbb3e42c255229ebe7f9cde6e Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:07:44 +0100 Subject: [PATCH 09/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index f1db78835df..69a025e14f0 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -118,15 +118,13 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): # Create the new issue body current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC") - new_body = f"""# Pending Tasks Report + new_body = f""" + +{table_header}{table_separator}{table_rows} **Last Updated:** {current_time} **Total Issues Found:** {len(issues_con_checkboxes_desactivados)} -## Issues with Unchecked Checkboxes - -{table_header}{table_separator}{table_rows} - --- *This report shows closed issues that still contain unchecked checkboxes in their description or comments.* *Progress column shows: completed tasks / total tasks* From 247adc13b25cce84833187a9cdb829233efc0861 Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:08:58 +0100 Subject: [PATCH 10/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index 69a025e14f0..596ce12538e 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -125,9 +125,6 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): **Last Updated:** {current_time} **Total Issues Found:** {len(issues_con_checkboxes_desactivados)} ---- -*This report shows closed issues that still contain unchecked checkboxes in their description or comments.* -*Progress column shows: completed tasks / total tasks* """ # Update the report issue From c2c1d178414666f864552d164f5ddcc18511a51b Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:22:50 +0100 Subject: [PATCH 11/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index 596ce12538e..cb120dedfc3 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -21,11 +21,11 @@ def format_time_difference(days): # Build the formatted string based on the components formatted_time = [] if years > 0: - formatted_time.append(f"{years} yr{'s' if years > 1 else ''}") + formatted_time.append(f"{years}yr{'s' if years > 1 else ''}") if months > 0: - formatted_time.append(f"{months} mo") + formatted_time.append(f"{months}mo") if remaining_days > 0 or (years == 0 and months == 0): - formatted_time.append(f"{remaining_days} d") + formatted_time.append(f"{remaining_days}d") if remaining_days == 0 and years == 0 and months == 0: return "Today" From 8f0afff72a0ee5805f65e4af2f792c855e6a3b40 Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:28:26 +0100 Subject: [PATCH 12/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index cb120dedfc3..d61d590f2a7 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -82,8 +82,8 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): print(f"Issue #{issue.number}: {issue.title} ({issue_url})") # Create markdown table - table_header = "| Issue | Name | Progress | Last Modification |\n" - table_separator = "|-------|------|----------|:------------------|\n" + table_header = "| Issue | Issue name | Progress | Last Modification |\n" + table_separator = "|-------|:------|:----------|:------------------|\n" table_rows = "" for issue in issues_con_checkboxes_desactivados: From d6254da88c9555ae8e2d592c06e3fb8a61e5d4e4 Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:31:43 +0100 Subject: [PATCH 13/14] change directory --- .github/workflows/open-branches.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/open-branches.yml b/.github/workflows/open-branches.yml index 1c4d76a5250..58d11282930 100644 --- a/.github/workflows/open-branches.yml +++ b/.github/workflows/open-branches.yml @@ -29,5 +29,5 @@ jobs: env: FIGMA_TOKEN: ${{ secrets.FIGMA_TOKEN }} GITHUB_TOKEN: ${{ secrets.NOVUM_PRIVATE_REPOS }} - working-directory: .github/branch-table + working-directory: .github/issue-scripts run: python3 branch-table.py From ec6a025637ce8fd578db60e4cad07ce8a74d8a2d Mon Sep 17 00:00:00 2001 From: "Ignacio Ceballos (Yayo)" Date: Wed, 17 Dec 2025 22:40:17 +0100 Subject: [PATCH 14/14] Update pending-tasks.py --- .github/issue-scripts/pending-tasks.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/issue-scripts/pending-tasks.py b/.github/issue-scripts/pending-tasks.py index d61d590f2a7..2ef08195e11 100644 --- a/.github/issue-scripts/pending-tasks.py +++ b/.github/issue-scripts/pending-tasks.py @@ -55,6 +55,10 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): if issue.number == target_issue_number: continue + # Only include issues closed as completed (exclude duplicates and not planned) + if hasattr(issue, 'state_reason') and issue.state_reason != 'completed': + continue + has_unchecked = False # Verify that the issue body is not None @@ -125,6 +129,10 @@ def analyze_issues_with_pending_tasks(token, owner, repo, target_issue_number): **Last Updated:** {current_time} **Total Issues Found:** {len(issues_con_checkboxes_desactivados)} +--- +*This report shows closed issues (completed only) that still contain unchecked checkboxes in their description or comments.* +*Progress column shows: completed tasks / total tasks* +*Note: Issues closed as duplicate or not planned are excluded from this report.* """ # Update the report issue