testes/.agent/agent_cli.py

110 lines
3.8 KiB
Python

import typer
import os
import json
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
from rich.progress import Progress, SpinnerColumn, TextColumn
app = typer.Typer(help="PlatformSistemas Senior Agent CLI - War Room Engine")
console = Console()
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = BASE_DIR
def load_json(filename):
path = os.path.join(DATA_DIR, filename)
if not os.path.exists(path):
return None
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
@app.command()
def context(topic: str = typer.Argument("general", help="Topic to get context for (api, database, context)")):
"""Retrieve structured project context from JSON data stores."""
data = load_json(f"{topic}.json")
if not data:
console.print(f"[red]Context for '{topic}' not found.[/red]")
return
console.print(Panel(f"Project Context: [bold cyan]{topic.upper()}[/bold cyan]", border_style="blue"))
console.print_json(data=data)
from rules.technical_rules import audit_file
@app.command()
def audit(path: str = typer.Argument(".", help="Path or file to audit")):
"""Perform technical audit following 'War Room' rules (CSS Fluidity, 14KB, etc)."""
console.print(f"[yellow]Auditing:[/yellow] {path}")
files_to_audit = []
if os.path.isfile(path):
files_to_audit.append(path)
else:
for root, _, files in os.walk(path):
if any(x in root for x in ['node_modules', '.git', 'dist', 'build']):
continue
for f in files:
if f.endswith(('.html', '.css', '.js', '.jsx')):
files_to_audit.append(os.path.join(root, f))
table = Table(title="Audit Results")
table.add_column("File", style="white")
table.add_column("Rule", style="cyan")
table.add_column("Status")
table.add_column("Details")
for file_path in files_to_audit:
results = audit_file(file_path)
rel_path = os.path.relpath(file_path, os.getcwd())
for r in results:
status = "[green]✅ PASS[/green]" if r['passed'] else "[red]❌ FAIL[/red]"
table.add_row(rel_path, r['rule'], status, r['details'])
console.print(table)
@app.command()
def create(type: str, name: str, ambient: str = "workspace"):
"""Create a new component, service, or hook."""
console.print(f"[cyan]Creating {type}:[/cyan] [bold]{name}[/bold] in [bold]{ambient}[/bold]")
# Path mappings based on project structure
paths = {
"component": f"src/features/{ambient}/components/{name}.jsx",
"service": f"src/features/{ambient}/{name}Service.js",
"hook": f"src/features/{ambient}/hooks/use{name}.js"
}
if type not in paths:
console.print(f"[red]Invalid type. Use: component, service, hook.[/red]")
return
target_path = os.path.join(os.getcwd(), paths[type])
os.makedirs(os.path.dirname(target_path), exist_ok=True)
# Template generation (simplified)
template = f"// New {type} created by Senior Agent\nexport const {name} = () => {{}};"
with open(target_path, 'w', encoding='utf-8') as f:
f.write(template)
console.print(f"[green]Successfully created at:[/green] {target_path}")
@app.command()
def register(feature: str, status: str = "active"):
"""Register a new feature or change in the project history."""
history = load_json("history.json") or []
history.append({
"feature": feature,
"status": status,
"timestamp": "2026-02-08" # Should be dynamic
})
with open(os.path.join(DATA_DIR, "history.json"), 'w', encoding='utf-8') as f:
json.dump(history, f, indent=2)
console.print(f"[green]Registered feature:[/green] {feature}")
if __name__ == "__main__":
app()