| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #!/usr/bin/env python3
- """
- Task queue utility functions.
- Provides:
- list_tasks_by_status - List tasks by status
- list_pending_tasks - List tasks with pending status
- list_tasks_by_assignee - List tasks by assignee
- list_my_tasks - List tasks assigned to current developer
- get_task_stats - Get P0/P1/P2/P3 counts
- """
- from __future__ import annotations
- from pathlib import Path
- from .paths import (
- get_repo_root,
- get_developer,
- get_tasks_dir,
- )
- from .tasks import iter_active_tasks
- # =============================================================================
- # Internal helper
- # =============================================================================
- def _task_to_dict(t) -> dict:
- """Convert TaskInfo to the dict format callers expect."""
- return {
- "priority": t.priority,
- "id": t.raw.get("id", ""),
- "title": t.title,
- "status": t.status,
- "assignee": t.assignee or "-",
- "dir": t.dir_name,
- "children": list(t.children),
- "parent": t.parent,
- }
- # =============================================================================
- # Public Functions
- # =============================================================================
- def list_tasks_by_status(
- filter_status: str | None = None,
- repo_root: Path | None = None
- ) -> list[dict]:
- """List tasks by status.
- Args:
- filter_status: Optional status filter.
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- List of task info dicts with keys: priority, id, title, status, assignee.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- tasks_dir = get_tasks_dir(repo_root)
- results = []
- for t in iter_active_tasks(tasks_dir):
- if filter_status and t.status != filter_status:
- continue
- results.append(_task_to_dict(t))
- return results
- def list_pending_tasks(repo_root: Path | None = None) -> list[dict]:
- """List pending tasks.
- Args:
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- List of task info dicts.
- """
- return list_tasks_by_status("planning", repo_root)
- def list_tasks_by_assignee(
- assignee: str,
- filter_status: str | None = None,
- repo_root: Path | None = None
- ) -> list[dict]:
- """List tasks assigned to a specific developer.
- Args:
- assignee: Developer name.
- filter_status: Optional status filter.
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- List of task info dicts.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- tasks_dir = get_tasks_dir(repo_root)
- results = []
- for t in iter_active_tasks(tasks_dir):
- if (t.assignee or "-") != assignee:
- continue
- if filter_status and t.status != filter_status:
- continue
- results.append(_task_to_dict(t))
- return results
- def list_my_tasks(
- filter_status: str | None = None,
- repo_root: Path | None = None
- ) -> list[dict]:
- """List tasks assigned to current developer.
- Args:
- filter_status: Optional status filter.
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- List of task info dicts.
- Raises:
- ValueError: If developer not set.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- developer = get_developer(repo_root)
- if not developer:
- raise ValueError("Developer not set")
- return list_tasks_by_assignee(developer, filter_status, repo_root)
- def get_task_stats(repo_root: Path | None = None) -> dict[str, int]:
- """Get task statistics.
- Args:
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- Dict with keys: P0, P1, P2, P3, Total.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- tasks_dir = get_tasks_dir(repo_root)
- stats = {"P0": 0, "P1": 0, "P2": 0, "P3": 0, "Total": 0}
- for t in iter_active_tasks(tasks_dir):
- if t.priority in stats:
- stats[t.priority] += 1
- stats["Total"] += 1
- return stats
- def format_task_stats(stats: dict[str, int]) -> str:
- """Format task stats as string.
- Args:
- stats: Stats dict from get_task_stats.
- Returns:
- Formatted string like "P0:0 P1:1 P2:2 P3:0 Total:3".
- """
- return f"P0:{stats['P0']} P1:{stats['P1']} P2:{stats['P2']} P3:{stats['P3']} Total:{stats['Total']}"
- # =============================================================================
- # Main Entry (for testing)
- # =============================================================================
- if __name__ == "__main__":
- stats = get_task_stats()
- print(format_task_stats(stats))
- print()
- print("Pending tasks:")
- for task in list_pending_tasks():
- print(f" {task['priority']}|{task['id']}|{task['title']}|{task['status']}|{task['assignee']}")
|