añadido guidelines de karpathy y repensado del proyecto
This commit is contained in:
+12
-35
@@ -66,9 +66,8 @@ NIVEL 5
|
||||
NIVEL 6
|
||||
main ⇐ api (routers), api.middlewares, config, observability.logging → create_app(), app
|
||||
|
||||
(separado, sin imports del paquete core)
|
||||
dashboard/src/ forja_dashboard/* ← habla con `main` por HTTP, no por import
|
||||
```
|
||||
(UI HTMX co-locada dentro del propio forja-core; mismo proceso, sin cliente HTTP intermedio)
|
||||
```
|
||||
|
||||
Reglas que se cumplen y conviene mantener:
|
||||
- **`domain/` no importa nada del resto del proyecto.** Es el vocabulario; todos dependen de él.
|
||||
@@ -333,33 +332,14 @@ Hashing/versionado: `registry/versioning.compute_hash(yaml_text)` = SHA-256 del
|
||||
|
||||
---
|
||||
|
||||
## 6. Dashboard ↔ Core (` forja_dashboard`)
|
||||
## 6. UI HTMX embebida en Core
|
||||
|
||||
El dashboard no comparte código con el core: solo lo llama por HTTP a través de
|
||||
`CoreClient` (`dashboard/src/ forja_dashboard/client.py`, httpx síncrono con 2
|
||||
retries, `base_url = FORJA_CORE_URL`; mapea 404/409/422 → `{"error": <json>}`).
|
||||
Con la migración a Opción A (FastAPI + HTMX), la interfaz de usuario se sirve
|
||||
directamente desde el mismo proceso `forja-core` (Jinja2 + HTMX vía CDN, sin
|
||||
servicio separado). No hay `CoreClient` intermedio para las páginas; los
|
||||
endpoints de UI llaman a los mismos servicios internos que la API REST.
|
||||
|
||||
| `CoreClient.<método>` | Endpoint del core | Página(s) que lo usan |
|
||||
|-----------------------|-------------------|-----------------------|
|
||||
| `health()` | `GET /health` | `app.py` (sidebar) |
|
||||
| `list_agents()` | `GET /agents` | Registro, Ejecutar |
|
||||
| `get_agent(name)` | `GET /agents/{name}` | Registro |
|
||||
| `list_versions(name)` | `GET /agents/{name}/versions` | Registro |
|
||||
| `diff_versions(name, a, b)` | `GET /agents/{name}/versions/{a}/diff/{b}` | Registro (→ `components/diff_view`) |
|
||||
| `invoke_agent(name, body)` | `POST /agents/{name}/invoke` | Ejecutar |
|
||||
| `list_executions()` | `GET /executions` | Aprobaciones (filtra `status=="awaiting_approval"`), Historial |
|
||||
| `get_execution(trace_id)` | `GET /executions/{trace_id}` | Aprobaciones, Historial (→ `components/trace_view`, `violation_view`) |
|
||||
| `approve(trace_id, body)` | `POST /executions/{trace_id}/approve` | Aprobaciones |
|
||||
| `reject(trace_id, body)` | `POST /executions/{trace_id}/reject` | Aprobaciones |
|
||||
| `list_violations(**filters)` | `GET /violations?…` | Historial |
|
||||
| `list_policies()` | `GET /policies` | Politicas |
|
||||
| `list_policy_versions(name)` | `GET /policies/{name}/versions` | Politicas |
|
||||
|
||||
Páginas (Streamlit multipágina; el nº y el emoji del nombre del fichero son la
|
||||
navegación): `app.py` (raíz), `pages/1_🏛️_Registro.py`, `pages/2_▶️_Ejecutar.py`,
|
||||
`pages/3_🤝_Aprobaciones.py`, `pages/4_📜_Historial.py`, `pages/5_📐_Politicas.py`.
|
||||
Componentes reutilizables: `components/diff_view.render_unified_diff(diff_text)`,
|
||||
`components/trace_view.render_trace(decision_path)`, `components/violation_view.render_violations(violations)`.
|
||||
La antigua sección de dashboard Streamlit ha sido eliminada.
|
||||
|
||||
---
|
||||
|
||||
@@ -378,13 +358,10 @@ Componentes reutilizables: `components/diff_view.render_unified_diff(diff_text)`
|
||||
pueden disparar la construcción perezosa) → handler → respuesta con `X-Trace-Id`.
|
||||
|
||||
**Contenedores** (`docker-compose.yml`): servicio `core` (`core/Dockerfile`,
|
||||
`uvicorn forja_core.main:app --host 0.0.0.0 --port 8000`, `HEALTHCHECK` →
|
||||
`curl /health`, monta `./agents:ro`, `./policies:ro`, `./data:rw`, env
|
||||
`DATA_DIR=/app/data`, `AGENTS_DIR=/app/agents`, `POLICIES_DIR=/app/policies`,
|
||||
`env_file: .env`); servicio `dashboard` (`dashboard/Dockerfile`, `streamlit run
|
||||
app.py`, `HEALTHCHECK` → `/_stcore/health`, `depends_on: core: service_healthy`,
|
||||
env `FORJA_CORE_URL=http://core:8000`, monta `./agents:ro` para leer los
|
||||
`examples/*.txt`).
|
||||
`uvicorn forja_core.main:app --host 0.0.0.0 --port 8000` para API + UI HTMX,
|
||||
`HEALTHCHECK` → `curl /health`, monta `./agents:rw`, `./policies:rw`, `./data:rw`,
|
||||
env `DATA_DIR=/app/data`, `AGENTS_DIR=/app/agents`, `POLICIES_DIR=/app/policies`,
|
||||
`env_file: .env`). Un solo servicio.
|
||||
|
||||
**`Settings` (env vars)** — `config.py`:
|
||||
|
||||
|
||||
+2
-5
@@ -511,15 +511,12 @@ Forja no usa una sola base de datos; usa la herramienta adecuada para cada cosa.
|
||||
│ │ ├── api/ ← FastAPI (middlewares, deps, routers, persistence)
|
||||
│ │ └── main.py ← create_app(): ensambla la app
|
||||
│ ├── Dockerfile · requirements.txt
|
||||
├── dashboard/
|
||||
│ ├── src/ forja_dashboard/ ← Streamlit (client + app + pages + components)
|
||||
│ ├── Dockerfile · requirements.txt
|
||||
├── agents/incident_analyzer/ ← el agente de ejemplo (YAMLs + escenarios .txt)
|
||||
├── policies/default/ ← la política de guardrails de ejemplo
|
||||
├── data/ ← estado runtime (gitignored)
|
||||
├── tests/ ← pytest: tests/unit/ y tests/integration/ (88 tests en total; el demo Streamlit no se testea con unit tests)
|
||||
├── tests/ ← pytest: tests/unit/ y tests/integration/
|
||||
├── docs/ ← este documento, manual_qa.md, futuro.md, superpowers/
|
||||
├── docker-compose.yml ← levanta core + dashboard
|
||||
├── docker-compose.yml ← levanta core (API + UI HTMX en puerto 8000)
|
||||
├── Makefile ← install / test / test-all / lint / smoke / up / down
|
||||
├── README.md · ARCHITECTURE.md
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user