Graphify es una herramienta auxiliar de análisis que construye un grafo de conocimiento persistente y navegable del workspace NeoDOS. Convierte código, relaciones entre crates, dependencias, módulos, syscalls, drivers y separación Ring 0 / Ring 3 en tres artefactos: graph.json (GraphRAG), graph.html (visualización) y GRAPH_REPORT.md (reporte).
Rol en NeoDOS: solo análisis. Nunca modifica código Rust funcional, APIs, syscalls, ABI, linker scripts ni toolchain. Si Graphify no analiza un crate, se ajusta Graphify vía configuración, no NeoDOS.
- God nodes: hubs arquitectónicos más conectados (ej.
Scheduler,libneodos,HandleEntry). - Comunidades: clusters por subsistema (VFS, HAL, ipc, scheduler, memory, drivers, net, security, usermode).
- Consultas acotadas (
query,path,explain) que devuelven subgrafos mucho más pequeños quegrepoGRAPH_REPORT.md. - Detección automática de corpus Rust: NeoDOS no es un workspace Cargo único sino ~70 crates independientes (kernel, bootloader, drivers, libneodos, ~40 binarios
userbin/, 4 libs NXL, tools).
- Python
3.14.6,uv 0.12.15, Rust1.95.0(stable + nightlynightly-x86_64-unknown-linux-gnu) uven~/.local/bin
# 1. Instalar uv (si falta)
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
# 2. Instalar Graphify (paquete graphifyy, binario graphify) — SIN sudo
uv tool install graphifyy
# 3. Verificar
graphify --version # 0.9.63
uv tool list
# Si graphify no está en PATH
uv tool update-shellEl paquete se llama
graphifyy, el ejecutable esgraphify. No usarpip,aptnisudosiuv toolfunciona.
OpenCode en NeoDOS usa opencode.json en la raíz + skill skills/ + carpeta .opencode/ para plugins.
Graphify ofrece graphify install --platform opencode que:
- instala skill en
~/.config/opencode/skills/graphify/(global, reutilizable por el usuario) y/o.opencode/skills/graphify/(project-scoped, reproducible) - crea plugin
.opencode/plugins/graphify.js(hooktool.execute.before) - registra el plugin en
.opencode/opencode.json - (con
--project) añade sección## graphifyaAGENTS.md
Comprobar antes de instalar:
git status
ls -la .opencode/ AGENTS.md opencode.jsonInstalación project-scoped (preferida para NeoDOS — queda claro qué es del repo y qué es global del usuario):
# Instalación estándar (plugin project + skill global)
graphify install --platform opencode
# Project-scoped completo (skill también dentro del repo, commitable)
graphify install --platform opencode --project
# Salida esperada:
# skill installed -> .opencode/skills/graphify/SKILL.md
# .opencode/plugins/graphify.js -> tool.execute.before hook written
# .opencode/opencode.json -> plugin registered
# graphify section written to .../AGENTS.md
# Project-scoped install. Add to version control:
# git add .opencode/ AGENTS.mdNO sobrescribe opencode.json raíz, AGENTS.md existente (solo añade sección), ni CLAUDE.md.
Para desinstalar:
graphify uninstall --platform opencode # o: graphify opencode uninstall
# --purge también borra graphify-out/Desde la raíz de NeoDOS (/home/amartinper/rust-os/neodos o neodos/ si es clon directo):
cd /home/amartinper/rust-os/neodos
# Extracción headless solo código (sin LLM, sin API key)
graphify extract . --code-only
# o atajo:
graphify . --code-only # equivale a extract
# Generar reporte y HTML (requiere grafo previo)
graphify cluster-only .
# Incremental tras cambios (solo código, sin API key, rápido)
graphify update .
# Opciones útiles
graphify extract . --code-only --no-cluster # solo graph.json, sin cluster
graphify extract . --code-only --force # re-scan completo, ignora cacheNeoDOS tiene ~70 crates sin Cargo.toml raíz, por eso
graphify extract --cargofalla conNo such file: Cargo.toml. El AST Rust (tree-sitter-rust) sí detecta los crates individuales y sus dependencias internas.
graphify extract . --code-only→375 code filesdetectados,116 docssaltados,267no clasificados (.toml,.ld,.klc, etc.)graph.json: 7260 nodes, 13038 edges, 379 communities(trascluster-only)- Token cost:
0(AST-only)
Si hay GEMINI_API_KEY/GOOGLE_API_KEY configurado, graphify extract . sin --code-only intentará extracción semántica de docs con Gemini (gemini-3-flash-preview). Sin clave, usar --code-only es la vía headless soportada.
Todos los artefactos van a graphify-out/ (respecta GRAPHIFY_OUT env var):
| Archivo | Tamaño verificado | Descripción |
|---|---|---|
graph.json |
~7.0 MiB | Grafo principal. Nodos=symbols/files, edges=calls/references/imports. Fuente para query/path/explain. No versionar (grande, regenerable). |
GRAPH_REPORT.md |
~64 KiB | Reporte legible: corpus, god nodes, comunidades, freshness. Útil para revisión amplia. No versionar. |
graph.html |
~302 KiB | Visualización agregada (379 comunidades, 701 cross-edges, límite 5000 nodos). No versionar. |
.graphify_analysis.json |
~387 KiB | Comunidades, cohesión, god nodes, surprises. Sidecar interno. Cache. |
.graphify_labels.json + .sig |
~8–10 KiB | Labels de comunidades (placeholders Community N si falla LLM). Cache. |
manifest.json |
~80 KiB | Hashes por archivo para incremental (detect_incremental). Cache. |
cache/ast/ + stat-index.json |
~7.3 MiB | Cache AST+stat para update/extract incremental. Cache pura. |
.graphify_root |
31 B | Root del scan. Auxiliar. |
No hacer
git add graphify-out/. Añadido a.gitignore.
Versionar (reproducible, Commit):
.opencode/plugins/graphify.js— plugin hook OpenCode.opencode/opencode.json— registro del plugin ({"plugin":[".opencode/plugins/graphify.js"]}).opencode/skills/graphify/SKILL.md+references/— skill project-scoped (solo si se usó--project)AGENTS.md— sección## graphifyañadida (reglas para agentes).gitignore— líneagraphify-out/+.graphify_cache/
No versionar / ignorado:
graphify-out/completo (ver tabla arriba) — declarado en.gitignoreraíz comographify-out/y.graphify_cache/~/.config/opencode/skills/graphify/— instalación global del usuario (fuera del repo)~/.graphify/global-graph.json— si se usagraphify global add(no usado en NeoDOS)
El plugin tool.execute.before inyecta un recordatorio en cada bash cuando graphify-out/graph.json existe:
[graphify] knowledge graph at graphify-out/. For focused questions, run graphify query ...
Comandos clave (todos verificados con graphify 0.9.63):
# BFS — contexto amplio
graphify query "How does the scheduler work? Priorities and aging" --budget 2000
# DFS — trazar path específico
graphify query "syscall dispatch SSDT" --dfs --budget 1500
# Camino más corto entre conceptos
graphify path "Scheduler" "Memory"
graphify path "Scheduler" "Memory" --undirected # ignora dirección
# Explicación de un nodo
graphify explain "HandleEntry"
graphify explain "neodos-kernel/src/scheduler/mod.rs::Scheduler" # desambiguado
# Hubs arquitectónicos
graphify god-nodes --top 10
graphify god-nodes --top 10 --json
# Impacto inverso (qué depende de X)
graphify affected "Scheduler" --depth 2
# Actualizar tras editar código
graphify update .Workflow recomendado para Astra/OpenCode:
- Pregunta de arquitectura →
graphify query "<pregunta>"primero (subgrafo < 2000 tokens). - Si falta contexto →
graphify path/explain/god-nodes. - Solo si no basta → leer
graphify-out/GRAPH_REPORT.mdographify-out/wiki/index.md(si existe) ogrep/Readdirecto. - Tras modificar código →
graphify update .(AST-only, gratis, sin API).
El skill /graphify (instalado en .opencode/skills/graphify/SKILL.md) automatiza el pipeline completo (detect → AST → semantic → build → cluster) cuando el usuario escribe /graphify o /graphify <path>.
uv tool install --upgrade graphifyy
graphify --version
# Si hay skill stale, reinstalar:
graphify install --platform opencode --projectEl CLI avisa si el skill está desactualizado comparando .graphify_version junto al SKILL.md.
- Sin Cargo workspace raíz:
--cargono extrae deps crate→crate; el grafo de dependencias Rust se infiere víatree-sitter+ imports, no víaCargo.tomlagregado. - Sin API key: docs (
*.md, 116 files) se saltan con--code-only. Para incluir docs semánticamente se necesitaGEMINI_API_KEY(Gemini) o backend local (--backend openaiconOPENAI_BASE_URL=http://localhost:1234/v1si hay LM Studio). Sin clave, el grafo cubre solo código (no_std, Ring 0/3, UEFI bootloader, drivers NEM, userbin). - Tamaño:
graph.json> 5 MiB activa vista agregada engraph.html(comunidades). Para detalle nodo-a-nodo usar--obsidianographify query. - Labeling:
cluster-onlyintenta etiquetar comunidades conclaude -p; sin login cae a placeholdersCommunity N(funcional pero menos descriptivo). No bloquea generación del grafo.
graphify extract . --code-only && graphify cluster-only .
graphify god-nodes --top 10
graphify query "scheduler priorities" --budget 1000
# Rust — debe seguir en 0 (warnings preexistentes permitidos)
cargo check # en neodos-kernel/ con nightly
# o
RUSTUP_TOOLCHAIN=nightly cargo check -p neodos_kernelAntes vs después de Graphify: cargo check mismo resultado (414 warnings preexistentes, Finished OK). Graphify no toca toolchain ni dependencias.