diff --git a/wolf/task.py b/wolf/task.py new file mode 100644 index 0000000..ded30ea --- /dev/null +++ b/wolf/task.py @@ -0,0 +1,63 @@ +import logging +import json +from dataclasses import dataclass, asdict +from typing import List, Dict, Any, Optional + +@dataclass +class Task: + id: str + title: str + description: str + repo_owner: str + repo_name: str + issue_number: Optional[int] = None + assigned_model: Optional[str] = None + assigned_provider: Optional[str] = None + +class TaskGenerator: + """ + Task generator for Wolf. + """ + def __init__(self, gitea_client): + self.gitea = gitea_client + + def from_gitea_issues(self, owner, repo, label="wolf-task"): + issues = self.gitea.get_issues(owner, repo) + tasks = [] + for issue in issues: + # Check for label if needed + labels = [l['name'] for l in issue.get('labels', [])] + if label and label not in labels: + continue + + task = Task( + id=f"gitea-{owner}-{repo}-{issue['number']}", + title=issue['title'], + description=issue['body'], + repo_owner=owner, + repo_name=repo, + issue_number=issue['number'] + ) + tasks.append(task) + return tasks + + def from_spec(self, spec_path): + with open(spec_path, 'r') as f: + data = json.load(f) + tasks = [] + for item in data: + task = Task(**item) + tasks.append(task) + return tasks + + def assign_tasks(self, tasks: List[Task], models: List[Dict[str, str]]): + """ + Assign tasks to models in a round-robin fashion or similar. + """ + assigned_tasks = [] + for i, task in enumerate(tasks): + model_info = models[i % len(models)] + task.assigned_model = model_info['model'] + task.assigned_provider = model_info['provider'] + assigned_tasks.append(task) + return assigned_tasks