Roadmap
Where GraphoOS
is going.
37 de 123 tareas hechas. Tamaños: S ≈ ½ semana, M ≈ 2, L ≈ 5, XL ≈ 12 semanas·persona. Este documento se genera del plan del proyecto y se versiona en el repositorio (docs/ROADMAP.md); las notas de cada versión están en CHANGELOG.md.
Fase 0 · Desbloquear la compilación 9/14
Que cualquiera pueda clonar y compilar. Sin esto nada es comprobable.
- 0.1 S Dependencias propias: crear en github.com/Empoorio los repos graphoos-floem, graphoos-lsp-types, graphoos-psp-types, graphoos-structdesc, graphoos-vger-rs, graphoos-wasi-experimental-http, graphoos-locale-config y graphoos-winit, sin historial ajeno, y apuntar Cargo.toml a ellos.
Los 8 repos existen y Cargo.toml los referencia por rama main.
- 0.2 S Publicar graphoos-xi-rope como repo propio (main = 0.3.2 para el editor, rama v0.4 para Floem 0.2) y usarlo como dependencia git.
cargo fetch --locked sale con 0.
- 0.3 S Regenerar Cargo.lock cambiando solo las dependencias movidas (14 paquetes), sin subir el resto de versiones.
Diff del lock revisado; 0 fuentes inexistentes.
- 0.4 S Compilar en este Mac: cargo build --profile release-lto, arrancar, abrir un workspace real con resaltado y plugin de Rust activo. Hecho 21-sep: GraphoOS.app arranca, resalta Rust y lanza rust-analyzer. Nota: sin firma de Apple, macOS no deja leer ficheros de Escritorio/Documentos (TCC) — el editor los muestra vacíos; probado fuera de esas carpetas.
Captura del editor abierto con un proyecto de este ecosistema.
- 0.5 M Compilar en Linux (docker buildx bake ubuntu-noble) y Windows (VM o runner).
Binarios de los 3 SO arrancan.
- 0.6 S Mover .github/, .cargo/, .devcontainer/, .rustfmt.toml, .taplo.toml dentro de GraphoOS-master/ y commitearlos.
git ls-files | grep .github > 0.
- 0.7 M Activar la CI en Empoorio/graphoos: fmt, typos, clippy en 3 SO, build en 3 SO, doc-tests.
Badge verde en el README apuntando al repo real.
- 0.8 S Sustituir las 14 apariciones de empoorio/graphoosgraphoos por Empoorio/graphoos (README, CHANGELOG, metainfo, Dockerfile fedora, proxy.sh/ps1, about.rs, remote.rs).
grep -r graphoosgraphoos = 0.
- 0.9 S Probar la guía docs/building-from-source.md en un contenedor limpio rust:1.98 siguiendo solo el texto.
Log del contenedor con build OK adjunto al repo.
- 0.10 S rust-toolchain.toml (stable + rustfmt + clippy) añadido; rust-version = 1.98.0. Pendiente: comprobar el mínimo real que compila.
CI falla si baja de la MSRV declarada.
- 0.11 S Limpiar la carpeta de proyecto: borrar _retirar/ (productos ajenos) cuando el dueño lo confirme y escribir un README que explique forks/, floem-main (Floem 0.2 para la UI futura), floem-shadcn/tailwind y Website/.
du -sh projects/GraphoOS < 100 MB y README en la raíz.
- 0.12 S Commit y push del editor renombrado a Empoorio/graphoos (27 ficheros cambiados: dependencias, identidad, CI dentro del repo) y token de CI con acceso a los repos privados.
CI en GitHub ejecuta fmt, clippy y build en 3 SO.
- 0.13 S GitHub Actions de la cuenta Empoorio: todo run acaba en startup_failure a los 0 s en los repos privados (también empooScan desde el 16-sep). Revisar facturación y ajustes de Actions de la cuenta; hasta entonces la CI de GraphoOS no puede ejecutarse.
gh run list muestra un run de CI que llega a ejecutar jobs.
- 0.14 S Compilación desde contenedor limpio (rust:1.98-bookworm, solo con las instrucciones de la guía): probado el 21-sep con cargo check; la guía necesita el paso de credenciales mientras los repos sean privados.
Log del contenedor con build OK.
Fase 1 · Identidad y legalidad 6/11
Que GraphoOS sea GraphoOS en cada fichero, cada paquete y cada dominio.
- 1.1 S Revisión legal de la licencia del código heredado (Apache-2.0) por el asesor de Empoorio: qué avisos deben ir en los paquetes (dmg, msi, deb, rpm) antes de la primera release pública.
Dictamen escrito y ficheros de licencia incluidos en cada instalador.
- 1.2 S Autoría: authors en Cargo.toml, developer_name en metainfo, Manufacturer en wix, CFBundleIdentifier → org.empoorio.graphoos, bundle id de notarización en release.yml.
Ningún fichero del repo nombra a un autor ajeno a Empoorio.
- 1.3 S Canales propios: README, CONTRIBUTING, plantillas de issues y el diálogo About enlazan a GitHub Discussions y empoorio.org; activar Discussions en el repo y, si se quiere, un Discord de Empoorio.
Ningún enlace a comunidades ajenas; Discussions activo.
- 1.4 S docs/why-graphoos.md: explicar por qué existe GraphoOS dentro del ecosistema Empoorio (nativo, remoto sin latencia, TOML, plugins WASI, asistencia transparente).
Documento nuevo revisado por el dueño.
- 1.5 S CHANGELOG y metainfo: una sola entrada 0.4.6 «primera publicación de GraphoOS» y sección Unreleased para 0.5.0.
Primera entrada propia con fecha.
- 1.6 M Firma macOS propia: certificado Developer ID de Empoorio, sustituir CODESIGN_IDENTITY del Makefile, notarización con secretos propios en release.yml.
spctl --assess acepta el .app; Gatekeeper no avisa.
- 1.7 S Dominios: registrar graphoos.dev, docs., plugins. o mover todo bajo graphoos.empoorio.org; actualizar los 6 sitios del código que los usan.
Los tres hosts resuelven y sirven TLS.
- 1.8 S Web (hecho 21-sep, desplegada en graphoos.web.app): empoorio.org corregido, «AiloOS» en el pie, Agents y Models marcados «en desarrollo» y models.html nombra EmpoorioLM (local) y AndromedaLM (nube).
Sin promesas sin respaldo; enlaces verificados.
- 1.9 S Comprobar conflicto de marca: «GraphOS» es un producto de Apollo GraphQL. Fijar la grafía única «GraphoOS» en todo.
Búsqueda de marca en EUIPO/USPTO documentada.
- 1.10 S Política de contribución: DCO (sección en CONTRIBUTING, commits con -s), CODE_OF_CONDUCT.md y SECURITY.md con control@empoorio.org. Hecho 22-sep: job dco en ci.yml que exige Signed-off-by en cada commit de un PR (se ejecutará cuando Actions funcione, 0.13).
Ficheros en la raíz y check de DCO en la CI.
- 1.11 S Hacer públicos los 13 repos de GraphoOS (hoy privados) cuando el dueño lo decida, y quitar entonces git-fetch-with-cli y el token de la CI.
git clone anónimo + cargo build funcionan.
Fase 2 · Servicios que el editor espera en tiempo de ejecución 3/7
El binario arranca pero llama a URLs que no existen. Sin esto es un editor sin colores, sin plugins y sin remoto.
- 2.1 M Gramáticas tree-sitter: lanzar el workflow de release de graphoos-tree-sitter-grammars (ya creado y apuntado desde app/grammars.rs) para que existan los assets grammars-<os>-<arch> y queries; en repo privado el editor necesita token para descargarlos.
Abrir un .rs, .ts, .py y .md y ver resaltado en las 3 plataformas.
- 2.7 M Assets para Linux y Windows (gramáticas, proxy, instaladores) desde los workflows de release cuando Actions funcione; hoy solo hay macOS arm64 construido en este Mac.
Releases con assets de las 3 plataformas.
- 2.2 L Registro de plugins. v0 hecho el 21-sep: registro estático generado por Website/registry/build.py desde registry/plugins.toml y servido en graphoos.web.app/api/v1 (listado, latest, icon, readme, download → tarball en /dl); URL base configurable en graphoos_core::registry. Falta: dominio plugins.graphoos.dev, búsqueda real, estadísticas, CLI de publicación y firma de paquetes.
Instalar un plugin desde el panel y que active su LSP (descarga+instalación verificadas por test en vivo).
- 2.3 M Proxy remoto: publicar graphoos-proxy por arquitectura (linux x86_64/aarch64 estático con Alpine, macOS, Windows) en cada release y corregir proxy/remote.rs:350.
Conectar por SSH al VPS de Ailoos y editar un fichero remoto.
- 2.4 M Updater: apuntar update.rs a Empoorio/graphoos y probar el ciclo completo (detectar, descargar, reemplazar, reiniciar) en macOS y Windows.
Actualizar de una nightly a la siguiente sin intervención.
- 2.5 L Plugins de lenguaje propios (hecho 21-sep): 9 en el registro — Rust (rust-analyzer), TOML (taplo, descargado), Markdown (marksman, descargado), Go (gopls del sistema, 22-sep) y C/C++ (clangd descargado de sus releases, 22-sep) verificados en el editor con sus servidores respondiendo al initialize; Python (pyright), TypeScript/JS, YAML y JSON usan el servidor instalado en el sistema y avisan cómo instalarlo si falta (verificado el aviso).
9 plugins instalables desde el registro con LSP funcionando.
- 2.6 M Informe de fallos: el panic hook escribe logs/crash-<ts>.txt (versión, SO, hilo, ubicación, backtrace) y al siguiente arranque el editor avisa con la ruta y el enlace para adjuntarlo a un issue; nada sale de la máquina solo (crash_report.rs, 21-sep).
Un panic provocado genera un informe legible y el aviso aparece al reabrir.
Fase 3 · Distribución real 1/8
Instaladores firmados para macOS, Linux y Windows, nightly automática y canales de instalación.
- 3.1 L release.yml completo: macOS universal firmado + notarizado, MSI firmado con signtool (hoy no firma), .deb/.rpm/AppImage, tarballs. Hoy: pre-release nightly manual con DMG macOS arm64 (firma ad-hoc) + proxy.
Release v0.5.0-beta.1 con 10+ artefactos descargables.
- 3.2 S Nightly automática (cron ya existe) publicada como pre-release y enlazada desde download.html. Parcial 22-sep: el pre-release nightly existe y download.html lo enlaza con fecha; la publicación automática espera a que Actions funcione (0.13).
Descarga de ayer disponible cada mañana.
- 3.3 M Gestores: Homebrew cask, winget, Scoop, Flathub (dev.graphoos → org.empoorio), AUR, copr.
brew install --cask graphoos y winget install Empoorio.GraphoOS funcionan.
- 3.4 S Instaladores firmados por plataforma y publicados desde el canal de releases.
Descarga estable por plataforma en la página de descargas.
- 3.5 M Instalación en máquina limpia por SO (VM macOS, Ubuntu, Windows 11) siguiendo solo la web; abrir un proyecto real y depurar.
Checklist de 3 SO con capturas por release.
- 3.6 S Windows portable (feature graphoos-app/portable) publicada como zip.
Arranca desde USB sin escribir en %APPDATA%.
- 3.7 M Builds reproducibles: tarball con cargo vendor (ya soportado) y build offline documentada.
Dos builds del mismo tag dan el mismo resultado.
- 3.8 S Página de descargas de la web con detección de SO, versión y fecha. Hecho 22-sep: registry/build_releases.py genera api/v1/releases.json (versión, canal, commit, fecha y tamaño) y los binarios se sirven desde GitHub Releases (Firebase Spark prohíbe ejecutables y el repo es privado); download.html detecta el SO, resalta la tarjeta, muestra versión y fecha y ya no promete builds de Linux/Windows que no existen (enlaza a compilar). Verificado en Safari.
download.html enlaza a assets reales, no a #build.
Fase 4 · Estabilidad y medida 5/12
Hoy: 40 tests, 347 unwrap, 0 benchmarks publicados. Competir exige números.
- 4.1 L Suite unitaria de buffer, selección, sintaxis, keymaps, paleta y RPC (objetivo > 300 tests) y tests de integración app↔proxy.
cargo test --workspace en la CI, cobertura publicada.
- 4.2 M Tests de UI con floem-test para paleta, pestañas, splits y ajustes.
20+ escenarios de UI automatizados.
- 4.3 M Auditar los 347 .unwrap() en rutas de UI/proxy y los 14 unsafe; convertir en errores recuperables.
Clippy con unwrap_used como warning; unsafe con comentario SAFETY.
- 4.4 S Triage de los 128 TODO/FIXME: listados en el issue #1 de Empoorio/graphoos con casillas; cada uno se cierra con commit o se convierte en issue propio.
0 TODO sin issue asociado.
- 4.5 M Ficheros grandes: abrir 100 MB / 1 M líneas / JSON de una línea de 20 MB sin bloquear la UI; desactivar sintaxis por umbral.
Latencia de tecla < 16 ms medida en esos ficheros.
- 4.6 M Sesiones grandes: 200 pestañas, 10 splits, 3 terminales, proyecto de 50 k ficheros; medir memoria y fugas en 8 h.
Tabla de RSS por escenario en docs/benchmarks.
- 4.7 M Recuperación: hot exit (buffers sin guardar sobreviven al cierre), restaurar ventana tras crash, copias de seguridad. Hecho 22-sep: la sesión (pestañas, ventana y texto sin guardar de cada editor) ya se guardaba al cerrar; ahora se escribe también 2 s después de la última edición (un guardado por ráfaga). Verificado: escribir, kill -9 a los 4 s, reabrir → el buffer vuelve sin guardar con el texto y el fichero en disco intacto. Las copias de seguridad como ficheros aparte (historial local) van con 5.11.
Matar el proceso con cambios sin guardar y recuperarlos al abrir.
- 4.8 L Benchmarks publicados y comparados en la misma máquina contra VS Code, Zed y Cursor: arranque frío/caliente, RAM en reposo, indexación, búsqueda global, latencia de tecla, fps de scroll, batería en 1 h.
docs/benchmarks.md con método reproducible y script.
- 4.9 M cargo-deny (licencias y bans, en verde) y cargo-audit en la CI (job audit, 21-sep); fuzzing del parser RPC (graphoos-rpc/parse.rs) y del cargador WASI pendiente.
Jobs en la CI; fuzzers en fuzz/.
- 4.11 M wasmtime 14 → 49 hecho el 21-sep (pipes WASI propios en wasi_pipe.rs, sin wasi-common, sin parche regalloc2; plugin de Rust verificado en el editor). cargo audit: 29 → 3 (h2 0.3 vía reqwest 0.11; quick-xml en wayland-scanner, solo build). Queda: reqwest 0.12 y hacer bloqueante el paso de advisories.
cargo audit --deny warnings en verde y bloqueante en la CI.
- 4.12 M Robustez del cliente LSP/DAP ante servidores defectuosos u hostiles: límites de tamaño de mensaje, timeouts por petición, fuzzing del parser JSON-RPC del cliente; un servidor caído se reinicia con aviso y no arrastra al editor.
Un servidor que envía basura o se cuelga no bloquea ni cierra GraphoOS.
- 4.10 S Clippy sin warnings (173 lints corregidos el 21-sep, 0 restantes en macOS) y typos en verde en 3 SO.
CI en verde estable 2 semanas.
Fase 5 · Experiencia de edición 3/23
Cerrar la brecha con VS Code en lo que se usa cada día. Lo que existe se pule; lo que no, se construye.
- 5.1 S Multi-cursor: ya existen Alt+clic, seleccionar siguiente/todas las ocurrencias, saltar ocurrencia, cursores arriba/abajo/fin de línea y deshacer de selección (keymaps-macos/nonmacos). Falta selección en columna con arrastre y una suite de tests que fije el comportamiento.
Suite de 30 casos de multi-cursor en verde.
- 5.2 M Snippets de usuario: fichero por lenguaje (TOML), placeholders anidados, transformaciones, variables ($TM_FILENAME…), UI de gestión.
Snippet propio de Rust funciona con tabulación entre 3 placeholders.
- 5.3 M Rename con previsualización multi-archivo y deshacer global; refactors: extract, inline, organize imports, apply all fixes.
Renombrar un símbolo usado en 20 ficheros y revertir de golpe.
- 5.4 S Búsqueda global: reemplazar en todos los ficheros hecho el 21-sep (RPC GlobalReplace, campo + botón + resumen, salta ficheros abiertos con cambios sin guardar; probado en la app). Ya respetaba .gitignore y regex. Faltan: vista previa por coincidencia, incluir/excluir por patrón, historial.
Reemplazo masivo en proyecto de 50 k ficheros < 1 s.
- 5.5 S Formateo (hecho 21-sep): [editor.formatters] asocia un id de lenguaje LSP a un comando (documento por stdin, formateado por stdout, {file}); sustituye al LSP para Format Document y format-on-save; errores del formateador en el panel de mensajes sin perder el guardado. Probado en la app con rustfmt y con un comando que falla.
Guardar un .rs lo formatea con rustfmt; un formateador roto avisa y guarda.
- 5.6 L Minimap (0 refs), breadcrumbs reales (6 refs), guías de indentación, reglas, ajuste de línea, colores de brackets configurables.
Cada uno conmutable en ajustes con captura.
- 5.7 M Soporte web: Emmet (0 refs), HTML/CSS/JSX con cierre de etiquetas, colores inline, previsualización.
ul>li*3 expande en un .html.
- 5.8 L Depurador completo sobre la base DAP: breakpoints condicionales y logpoints, watch, pila, variables editables, consola, launch configs por lenguaje; probado con codelldb (Rust), debugpy (Python) y Node. Avance 22-sep: hasta hoy NINGÚN plugin registraba un adaptador (depurar era imposible) y dos fallos heredados lo impedían igualmente: la capa de breakpoints quedaba bajo la de números (ningún clic llegaba; arreglado con pointer-events) y ${workspace} llegaba sin expandir al adaptador. Ahora el SDK expone register_debugger_type, los plugins de Rust y C/C++ registran lldb → codelldb o lldb-dap (ruta absoluta), y una sesión llega a initialize → launch → runInTerminal con pid; en este Mac se detiene en la autorización «Developer Tools Access» del sistema (la debe conceder el dueño una vez). Faltan: python (debugpy), Node, condicionales, watch, edición de variables.
Depurar EmpooScan (Rust) y un script Python con puntos de ruptura condicionales.
- 5.9 L Git visual completo. Hecho 21-sep: blame inline de la línea del cursor (autor, antigüedad, resumen, commit; «Not committed yet»; se oculta con cambios sin guardar; se actualiza al guardar y al cambiar el repo; editor.enable-git-blame), probado en la app. Faltan: historial de fichero, log de commits con grafo, ramas/stash en panel, pull/push con credenciales, PRs.
Flujo completo rama → commit → push → PR sin salir del editor.
- 5.10 M Editor de conflictos de merge a 3 vías (0 refs hoy).
Resolver un conflicto real de este ecosistema aceptando ambos lados.
- 5.11 M Historial local / timeline en disco por fichero, con diff y restauración.
Recuperar una versión de hace 2 h de un fichero no versionado.
- 5.12 M Terminal: perfiles con UI, splits, enlaces clicables, búsqueda, shell integration (marcadores de comando, cwd), reutilizar para tareas.
Ctrl+clic en una ruta de error abre el fichero en la línea.
- 5.13 M Tareas: detectar cargo/npm/make/gradle, problem matchers que alimentan el panel de problemas, atajos para build/test/run.
Un error de cargo build aparece en Problemas con enlace.
- 5.14 M Diff: lado a lado e inline con navegación de hunks, diff de carpetas, diff contra cualquier commit.
Diff de dos ramas de EmpoorioChain navegable.
- 5.15 M Explorador: workspace multi-raíz, arrastrar y soltar, decoraciones git y de problemas, comparar seleccionados, abrir con.
Abrir 3 proyectos del ecosistema en una ventana.
- 5.16 M Ajustes: búsqueda, edición TOML sincronizada con la UI, ajustes de workspace (.graphoos/settings.toml), importar de VS Code.
Cambiar tema desde la búsqueda de ajustes en < 3 teclas.
- 5.17 L Modal: cobertura Vim (text objects, macros, registros, marks) y modos Helix/Emacs opcionales.
Suite vim-test parcial (200 casos) en verde.
- 5.18 S Markdown preview lateral (markdown.rs ya renderiza hover) y vista previa de imágenes/SVG. Hecho 22-sep: panel «Markdown Preview» (⌘⇧V) con el motor propio (títulos, énfasis, código resaltado, listas con viñetas/números —añadidas al motor—, separadores, citas, imágenes locales), actualización en vivo verificada en la app. Falta abrir ficheros de imagen/SVG en una pestaña.
Preview en vivo de un README con imágenes.
- 5.19 S Notificaciones y mensajes de error legibles: auditar cada anyhow! que llega al usuario.
Ningún error muestra un Debug de Rust al usuario.
- 5.20 L Dev Containers: leer devcontainer.json, construir la imagen con Docker/Podman y ejecutar graphoos-proxy, LSP, DAP y terminal dentro del contenedor mientras la UI sigue nativa (la arquitectura UI/proxy ya está pensada para esto).
Abrir un repo con devcontainer.json y compilar/depurar dentro del contenedor sin instalar nada en el anfitrión.
- 5.21 L Túneles: conectar el editor a un proxy remoto detrás de NAT a través de un relé de Empoorio, además de SSH/WSL.
Editar en un VPS sin abrir puertos ni configurar SSH.
- 5.22 S Resaltado avanzado verificado: inyecciones de lenguaje (SQL en Python, HTML/CSS en JSX, bloques de código en Markdown; hay 90 referencias a injection en el core) y tokens semánticos del LSP por encima de tree-sitter. Hecho 22-sep: bloque Rust en .md verificado en la app; SQL en Python añadido como query propia (overrides/queries/python/injections.scm en graphoos-tree-sitter-grammars: execute/read_sql y strings que empiezan por SELECT/INSERT/…; empaquetado con package_queries.sh y subido al release) y verificado en la app y con test en graphoos-core; corregido un fallo del núcleo: tras una inyección el resto del nodo exterior perdía el color. Tokens semánticos ya llegan del LSP (rust-analyzer). JSX no comprobado. Nota: mientras el repo de gramáticas sea privado, el editor no puede descargar queries (1.11).
Un .md con bloque Rust y un .py con SQL embebido se resaltan por lenguaje interno.
- 5.23 M Depurador: logpoints, breakpoints por número de impactos, consola REPL de evaluación y edición de variables (los tipos DAP ya declaran supports_conditional_breakpoints).
Un logpoint imprime sin parar y la consola evalúa una expresión en el frame actual.
Fase 6 · Sistema de extensiones 1/10
WASI es buena base, pero sin API documentada, versionado ni catálogo no hay ecosistema.
- 6.1 M Documentar el API de plugins (psp-types, wasi-experimental-http, plugin.toml): guía «tu primer plugin en 30 minutos» en Rust y AssemblyScript. Hecho 22-sep (Rust): docs/plugins.md (manifiesto, SDK, descargas, prueba local, publicación en el registro), probada al pie de la letra: sus tres ficheros extraídos de la página compilan a wasm y el plugin se activa en la app con el aviso documentado; publicada en graphoos.web.app/docs/plugins. AssemblyScript: no hay SDK; queda anotado en la guía.
Un desarrollador externo publica un plugin siguiendo solo la guía.
- 6.2 M Versionado del API con compatibilidad declarada en plugin.toml y tests de conformidad.
Un plugin de la v1 sigue cargando en la v1.3 del editor.
- 6.3 L Registro propio con web: catálogo, búsqueda, iconos, README, estadísticas, CLI graphoos plugin publish, firma de paquetes, moderación.
Publicar y actualizar un plugin desde la CLI en < 2 min.
- 6.4 L Plugins de lenguaje mantenidos por Empoorio (10 principales) con CI propia y descarga automática de servidores LSP.
Instalar Python y tener pyright sin pasos manuales.
- 6.5 M Importador de temas de color e iconos de VS Code (JSON) y catálogo de temas.
Instalar «One Dark Pro» desde su JSON original.
- 6.6 XL Decisión explícita: capa de compatibilidad con extensiones VS Code (host Node + API). Es XL y define el producto: Cursor/Antigravity/Windsurf la tienen porque son forks de VS Code; Zed no.
Documento de decisión sí/no con alcance; si sí, prototipo que carga una extensión de tema y una de lenguaje.
- 6.7 L Extensiones con UI: vistas declarativas nativas (paneles, árboles, webviews acotadas).
Un plugin muestra un panel lateral propio.
- 6.8 M Gramáticas y queries tree-sitter instalables como extensión sin recompilar el editor.
Añadir un lenguaje nuevo sin tocar graphoos-core.
- 6.9 M Permisos por plugin (modelo de capacidades): cada plugin declara en volt.toml qué necesita (directorios, red, procesos) y el usuario lo aprueba al instalar; WASI ya aísla por defecto, hoy el proxy abre el directorio del plugin y la red HTTP a todo.
Un plugin sin permiso de red no puede descargar nada; el panel muestra los permisos concedidos.
- 6.10 M Vigilante de plugins: un plugin colgado o en bucle no bloquea el editor (timeout por llamada, reinicio del plugin, aviso al usuario, sin perder el LSP de los demás).
Un plugin con loop {} se detecta, se reinicia y el editor sigue respondiendo.
Fase 7 · IA: Models, Agents y MCP 7/26
Chat hecho (21-sep). Los modelos son los de AiloOS: EmpoorioLM en local y AndromedaLM en la nube. Los agentes se integran desde el CLI andromeda de Ailoos, que ya existe; GraphoOS aporta la interfaz y el arnés.
- 7.1 M Arquitectura (hecho 21-sep): módulo ai en graphoos-rpc (tipos) y graphoos-proxy (cliente SSE OpenAI-compatible con cancelación), RPC AiChat/AiChatCancel/AiListModels y notificaciones de streaming; al vivir en el proxy funciona también en remoto. La clave va en [ai] o en AILOOS_API_KEY; queda guardarla en el keychain del SO.
El chat funciona en una sesión SSH; clave en keychain.
- 7.2 L Proveedores de AiloOS (hecho 21-sep): AndromedaLM y el catálogo de api.ailoos.com en streaming, y EmpoorioLM local vía ailoos serve (endpoint configurable = «endpoint propio»). Probado en la app: lista de modelos real, respuesta en streaming, error legible con el servidor local apagado. Faltan reintentos y cuotas (van con 7.11).
AndromedaLM y EmpoorioLM responden en el chat; sin proveedores ajenos por defecto.
- 7.3 M Selector de modelos: hecho el selector del chat (proveedor AiloOS/local + modelo del catálogo real, recarga). Hecho 22-sep: menús desplegables reales para proveedor y modelo (overlay propio; el Dropdown de Floem cierra al pulsar antes del clic), y modelo por tarea: el ghost text tiene proveedor/modelo propios (ai.inline-completion-provider/-model) y el agente usa el modelo del chat. Verificado en la app (log del proxy con el modelo elegido).
Cambiar de modelo en el selector cambia la respuesta y el proveedor.
- 7.4 L Chat contextual lateral (hecho 21-sep): conversación en streaming, Stop, limpiar, fichero actual y selección como contexto, Cmd/Ctrl+Shift+A, menciones @file:ruta, @diagnostics, @terminal, @git con listado de lo adjuntado, historial por workspace que sobrevive al reinicio. Verificado en la app y en el log del proxy (composición del mensaje).
Preguntar por un error del panel de problemas y recibir el arreglo aplicable.
- 7.26 M Chat: @símbolo (definición vía LSP), imágenes en el mensaje, autocompletado de menciones al escribir @ y desplegable real de modelos.
Escribir @ muestra ficheros y símbolos; una captura pegada llega al modelo.
- 7.5 M Ghost text: conectar inline_completion.rs a un proveedor FIM (EmpoorioLM primero), con debounce, caché y aceptación parcial. Hecho 22-sep: si el LSP no propone nada, tras ai.inline-completion-delay-ms el proxy pide la continuación a /completions (EmpoorioLM por ailoos serve, nativo) o, donde no existe (AiloOS nube), al chat con instrucción de motor de completado; caché por posición, recorte de vallas/marcadores/tokens de fin, descarte de respuestas obsoletas por generación y revisión, Tab acepta; proveedor/modelo/tokens/contexto configurables; verificado en la app con ambos proveedores (la calidad del texto es la de los modelos actuales). Aceptación parcial hecha 22-sep (alt+→ palabra, alt+⇧+→ línea en macOS; ctrl en el resto), el resto sigue propuesto. Latencia local: la del modelo (EmpoorioLM 40M en CPU/MPS responde en ~1 s; p50 < 300 ms exige un modelo pequeño servido con llama.cpp).
Latencia p50 < 300 ms local; aceptar con Tab por palabra.
- 7.6 L Edición multi-archivo con diff revisable: aceptar/rechazar por hunk, aplicar en lote, deshacer completo.
Un cambio en 8 ficheros se revisa y se aplica hunk a hunk.
- 7.7 XL Agentes: integrar el agente andromeda del CLI de Ailoos (herramientas de ficheros/shell/git/búsqueda, sandbox Landlock/Seatbelt, subagentes, confirmaciones) en el editor mediante un protocolo tipo ACP. Hecho 22-sep (base): andromeda --acp (JSON por stdin/stdout: hello/token/actions/confirm/tool_result/done) lanzado por el proxy en el workspace, modo Agent en el panel con respuesta en streaming, tarjeta por acción con diff y Apply / Apply and continue / Reject, decisión de vuelta al agente, Stop que mata el proceso y cierra las tarjetas, historial con la decisión; verificado con andromeda real y con un agente ACP de prueba (crear fichero: aplicar lo crea, rechazar no). Falta: diffs por hunk, permisos por herramienta (leer/escribir/ejecutar/red), registro auditable, sandbox Landlock/Seatbelt, subagentes; y el modelo 1B no sigue la sintaxis de herramientas (calidad del modelo).
El agente refactoriza un módulo, corre los tests y pide permiso antes de cada comando, todo desde el panel.
- 7.8 L MCP cliente: servidores stdio y HTTP, configuración por usuario y por workspace, permisos por herramienta, listado de recursos.
Conectar un servidor MCP de GitHub y usarlo desde el chat.
- 7.9 L Índice semántico del workspace (embeddings locales) para contexto automático; incremental con notify.
Pregunta sobre «dónde se firma el extrínseco» devuelve el fichero correcto sin @.
- 7.10 S Reglas de proyecto (AGENTS.md / .graphoos/rules) y memoria por workspace. Hecho 22-sep: AGENTS.md, .graphoos/rules.md y .graphoos/rules/*.md viajan como mensaje de sistema (tope ai.rules-chars) y como ficheros al agente; .graphoos/memory.md se alimenta con /remember en el chat; verificado en el log del proxy y con el agente de prueba (el modelo 1B no siempre obedece la regla: calidad del modelo).
El agente respeta una regla de estilo escrita en AGENTS.md.
- 7.11 S Coste y uso visibles por sesión; límites configurables; modo sin red. Hecho 22-sep: línea de uso en el panel (último turno, peticiones y tokens de la sesión por proveedor, coste a los precios ai.ailoos-usd-per-million-*, % del límite; clic para reiniciar), ai.session-token-limit bloquea con aviso, ai.offline arranca en local y rechaza la nube (chat y agente); el proxy lee los timings de llama.cpp porque api.ailoos.com no manda usage en streaming. Verificado en la app.
Panel de uso con tokens y coste por proveedor.
- 7.12 L Agentes externos (Claude Code, Codex CLI) por el mismo protocolo ACP que andromeda, con diff streaming al editor.
Claude Code abre y edita en GraphoOS con diffs revisables.
- 7.13 L Arnés — puertas de validación: tras cada edición del agente se ejecutan formateador, linter y tests del proyecto; si fallan, el error vuelve al agente en un bucle de reparación con límite de iteraciones y parada.
Un cambio que rompe un test se corrige solo en ≤3 vueltas o se detiene con informe.
- 7.14 M Skills: procedimientos reutilizables en Markdown (p. ej. «tests de pallets», «migración de esquema») que el agente carga según la tarea, además de AGENTS.md y las reglas del proyecto.
Invocar una skill cambia el comportamiento del agente de forma verificable.
- 7.15 L Subagentes en paralelo con aislamiento elegido por el usuario: heredar el workspace, rama propia en un git worktree, o compartido; cada uno con contexto limpio y resultado resumido al padre.
Tres subagentes tocan tres módulos en worktrees y el padre integra.
- 7.16 M Artefactos de evidencia: el agente entrega plan en Markdown, lista de verificación con progreso y pruebas (salida de tests, capturas) antes de que el usuario integre nada.
Cada tarea de agente termina con su artefacto de evidencia en el panel.
- 7.17 L Agente de navegador con Aephoron (motor Kinetoor, propio del ecosistema): pruebas end-to-end de la UI en desarrollo, con capturas y grabación adjuntas como evidencia.
El agente abre la app local en Aephoron, hace clic y adjunta la captura.
- 7.18 M Flujo dirigido por especificación: el agente lee y critica la spec (invariantes, criterios de aceptación) antes de tocar código; plantilla de spec en el repo.
Con una spec incompleta el agente pregunta en vez de improvisar.
- 7.19 M GraphoOS como servidor MCP: exponer workspace, símbolos, diagnósticos, diffs y terminal a agentes externos con permisos por recurso.
Un agente externo lista los símbolos del fichero abierto vía MCP.
- 7.20 M Defensas contra inyección de prompts y envenenamiento de herramientas: contenido de terceros (issues, webs, salidas MCP) marcado como datos, lista de comandos destructivos con confirmación obligatoria, sin secretos en el contexto, registro auditable de cada acción.
Un issue con instrucciones ocultas no consigue que el agente ejecute nada.
- 7.21 L Tareas delegadas en la nube: ejecutar el agente en un sandbox remoto (graphoos-proxy en contenedor sobre un VPS de Empoorio) y devolver un PR revisable, sin tocar la máquina local.
Delegar una tarea, cerrar el portátil y encontrar el PR.
- 7.22 M Herramientas estructurales para el agente: list_symbols, find_definition, references y diagnostics vía LSP/tree-sitter en vez de grep, con coordenadas exactas.
El agente localiza una función por su símbolo, no por texto.
- 7.23 L Tareas programadas y agentes en segundo plano con un panel de gestión (estado, coste, resultados).
Una tarea nocturna deja su artefacto de evidencia por la mañana.
- 7.24 M Agente revisor: segunda pasada independiente que audita el diff (errores, seguridad, estilo) antes de proponerlo al usuario.
Cada diff llega con el informe del revisor.
- 7.25 M CLI graphoos para terminal y SSH reutilizando andromeda, y SDK para incrustar el agente en otras apps de Empoorio.
graphoos agent "…" funciona en el VPS por SSH.
Fase 8 · Accesibilidad, calidad y localización 1/6
Lo que separa un proyecto de hobby de una herramienta que puede usar cualquiera.
- 8.1 XL AccessKit en Floem (2 refs hoy): árbol de accesibilidad para explorador, editor, paleta y ajustes; probado con VoiceOver, NVDA y Orca.
Recorrer paleta y editor con VoiceOver anunciando contenido.
- 8.2 M Navegación completa por teclado, foco visible, contraste WCAG AA en los temas por defecto.
Auditoría con lista de comprobación WCAG 2.1 AA sin fallos críticos.
- 8.3 S Escalado HiDPI y fuentes: medir en Windows 125/150 %, macOS Retina, Linux fraccional (el 0.4.5/0.4.6 ya arregló bugs aquí).
Sin desalineación en 6 combinaciones documentadas.
- 8.4 L Localización: sistema i18n (8 refs a locale hoy), ES y EN completos, contribución de idiomas por fichero.
Cambiar idioma en ajustes traduce toda la UI sin reiniciar.
- 8.5 L Documentación de usuario propia en graphoos.dev/docs (hoy solo una página en la web): instalación, atajos, ajustes, plugins, remoto, depuración, IA. Hecho 22-sep en graphoos.web.app/docs/: instalación (honesta: nightly macOS, fuente en el resto), compilar, atajos y ajustes GENERADOS de las fuentes (scripts/gen_docs.py: 89 ajustes con descripción y valor por defecto, 278 atajos), asistente/agente/ghost text, plugins, remoto, ejecutar y depurar; Website/build_docs.py renderiza los .md del repo con la misma cabecera del sitio. Pendiente: versión en español (la web está en español y las guías en inglés; va con 8.4) y el dominio (1.7).
Sitio de docs con búsqueda y versión por release.
- 8.6 M Onboarding: pantalla de bienvenida, importar ajustes y keymaps de VS Code, elegir modal o no, elegir proveedor de IA.
Usuario nuevo productivo en < 5 min sin leer docs.
Fase 9 · Beta pública y comunidad 1/6
Recoger feedback real y decidir la relación con upstream.
- 9.1 M Programa beta con formulario de feedback dentro del editor y canal dedicado.
100 usuarios activos con feedback registrado.
- 9.2 S Triage semanal de issues (plantillas ya existen) y etiquetas de prioridad públicas.
Tiempo de primera respuesta < 72 h durante 8 semanas.
- 9.3 S Roadmap público (este documento, versionado en el repo) y notas de versión por release. Hecho 22-sep: export_roadmap.py genera docs/ROADMAP.md y Website/roadmap.html del mismo plan (vivo en graphoos.web.app/roadmap, enlazado desde Comunidad y el pie); CHANGELOG.md con la sección Unreleased de todo lo hecho.
docs/ROADMAP.md enlazado desde la web.
- 9.4 M Métricas de adopción opt-in (instalaciones, SO, versión) sin datos personales.
Panel interno con cifras semanales.
- 9.5 M Política de actualización de las dependencias forkadas (Floem, xi-rope, vger, winit, lsp-types): calendario para traer mejoras de sus proyectos de origen sin reintroducir nombres ajenos (script de renombrado ya probado).
Documento de decisión y primer ciclo de actualización.
- 9.6 M Integraciones con el ecosistema Empoorio solo donde aporten: Ennooia (notas), Ailoos (modelos), EmpoorioChain (firmas de plugins con DID).
Cada integración con caso de uso escrito antes de codificar.