-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproject_manager.py
More file actions
104 lines (89 loc) · 3.65 KB
/
Copy pathproject_manager.py
File metadata and controls
104 lines (89 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
"""
Project Manager – manage multiple repositories for RepoForge Engine.
"""
import os
from typing import List, Dict, Any, Optional
from pathlib import Path
from .project_registry import ProjectRegistry
class ProjectManager:
"""Manages a list of repositories and coordinates runs across them."""
def __init__(self, registry_path: Optional[str] = None):
self.registry = ProjectRegistry(registry_path)
self.projects = self.registry.load_all()
def add_project(self, path: str, name: Optional[str] = None) -> Dict[str, Any]:
"""Add a new project to the registry."""
path = str(Path(path).resolve())
if not name:
name = Path(path).name
project = {
"path": path,
"name": name,
"last_analysis": None,
"quality_score": 0,
"grade": "N/A",
"issues": 0,
"last_action": None,
}
self.projects.append(project)
self.registry.save_all(self.projects)
return project
def remove_project(self, path: str) -> bool:
"""Remove a project by path."""
path = str(Path(path).resolve())
original_len = len(self.projects)
self.projects = [p for p in self.projects if p["path"] != path]
if len(self.projects) < original_len:
self.registry.save_all(self.projects)
return True
return False
def list_projects(self) -> List[Dict[str, Any]]:
"""Return all registered projects."""
return self.projects
def get_project(self, path: str) -> Optional[Dict[str, Any]]:
"""Get a project by path."""
path = str(Path(path).resolve())
for p in self.projects:
if p["path"] == path:
return p
return None
def update_project(self, path: str, updates: Dict[str, Any]) -> bool:
"""Update a project's metadata."""
project = self.get_project(path)
if not project:
return False
project.update(updates)
self.registry.save_all(self.projects)
return True
def run_all(self, prompt: str, approve: bool = False) -> List[Dict[str, Any]]:
"""
Run RepoForge on all registered projects.
Returns a list of results per project.
"""
from repoforge.workflow_engine import WorkflowEngine
results = []
for project in self.projects:
path = project["path"]
print(f"\n🔨 Running on: {project['name']} ({path})")
engine = WorkflowEngine(path)
result = engine.execute(prompt)
# Update project metadata
score = result.get("quality_score", {}).get("score", 0)
grade = result.get("quality_score", {}).get("grade", "N/A")
v4 = result.get("stages", {}).get("v4_analysis", {})
issues = len(v4.get("raw_issues", []))
v5 = result.get("stages", {}).get("v5_agents", {})
consensus = v5.get("consensus", {})
selected_actions = consensus.get("selected_actions", [])
last_action = selected_actions[0].get("action") if selected_actions else None
self.update_project(path, {
"last_analysis": result.get("stages", {}).get("scan", {}).get("timestamp"),
"quality_score": score,
"grade": grade,
"issues": issues,
"last_action": last_action,
})
results.append({
"project": project,
"result": result,
})
return results