110 lines
3.8 KiB
Python
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()
|