Determinístico y probabilístico, lado a lado
modesEl análisis estático corre en milisegundos; el LLM corre como job. Un mismo grafo analizado desde dos ángulos.
Recupera tokens (¡y dinero!), ahorra tiempo y vuelve determinísticos a tus Markdowns. Detecta colisiones, huérfanos, duplicados semánticos y skills obesas.
El arnés que diseñaste, por fin visible y verificable: análisis determinístico y semántico (LLM) sobre un mismo grafo.
Instala, crea una carpeta vacía y abre tu agente (Claude Code, Codex, etc). Deja que tu agente te guíe por todo el flujo, en vivo en tu consola y navegador.
Después, dentro de Claude, escribe:
El análisis estático corre en milisegundos; el LLM corre como job. Un mismo grafo analizado desde dos ángulos.
Conteo de bytes y tokens por nodo. Encuentra la skill obesa que se come tu context window.
Cada link entre archivos: invocaciones /slash, menciones @, imports, URLs. El directorio se transforma en un grafo.
Referencias que apuntan a triggers que no existen. Las detectas en el scan, antes que el agente falle.
¿Dos skills reclamando la misma invocación? Lo detectas antes que el agente elija mal.
Lista cada URL externa que aparece en tu workspace. Audita tu supply chain.
Seis maneras de extender esta herramienta. Tu plugin, el de tu empresa, el que publica la comunidad, todos corren contra el mismo kernel.
Define un agente (Claude, Codex, etc)
Declara los tipos de archivo que un agente expone (skill / agent / command para Claude), dónde vive su contenido en disco, el schema de frontmatter de cada tipo y cómo la UI lo dibuja (etiqueta, color, ícono). El provider de Claude viene built-in; escribe uno para Codex, Copilot, o tu propio runner.
// claude/provider.ts (kinds live in claude/kinds/<name>/)
// id and kind come from the folder, you never write them.
export default {
version: '0.1.0',
description: 'Claude Code agents, commands, and skills',
presentation: { label: 'Claude', color: '#cc785c' },
detect: { markers: ['.claude'] },
read: { extensions: ['.md'], parser: 'frontmatter-yaml' },
classify: (path, fm) => /* 'agent' | 'command' | 'skill' | null */,
};
Extrae datos de un nodo
Cada archivo es un nodo; un Extractor lo convierte en datos. Links a otros nodos, atributos que enriquecen el nodo, o señales que guardas en tu propio KV. Código puro, determinístico, corre en milisegundos dentro de `sm scan`, sin LLM, sin costo.
// claude/extractors/slash/index.ts
export default {
version: '0.1.0',
description: 'Link /command invocations to their target',
scope: 'body',
extract(ctx) {
for (const [, cmd] of ctx.body.matchAll(SLASH_RE))
ctx.emitLink({
source: ctx.node.path, target: cmd,
kind: 'invokes', confidence: 0.8,
});
},
};
Encuentra problemas en el grafo
Mira el grafo completo y detecta problemas: colisiones de trigger, huérfanos, dependencias muertas, referencias rotas. Escribe un analyzer, ejecútalo en cualquier proyecto, o publícalo para que otros lo usen.
// example/analyzers/trigger-collisions/index.ts
export default {
version: '0.1.0',
description: 'Flags two nodes that share one trigger',
evaluate(ctx) {
return [...byTrigger(ctx.nodes)]
.filter(([, ns]) => ns.length > 1)
.map(([trigger, ns]) => ({
severity: 'warn',
nodeIds: ns.map((n) => n.path),
message: `"${trigger}" claimed by ${ns.length} nodes`,
}));
},
};
Mejora tus agentes y skills automáticamente
Las actions son el único tipo de plugin que toca el disco. En modo determinístico, código directo: renombra un trigger, ajusta frontmatter. En probabilístico, un prompt que ejecuta el LLM: regenera un summary, reescribe un texto.
// core/actions/rename-trigger/index.ts
export default {
version: '0.1.0',
description: 'Rename a node trigger',
mode: 'deterministic',
invoke(input, ctx) {
return {
report: { ok: true, trigger: input.trigger },
writes: [{ kind: 'sidecar', path: ctx.nodeAbsolutePath,
changes: { annotations: { trigger: input.trigger } } }],
};
},
};
Exporta el grafo a otros formatos
El grafo vive en memoria; un Formatter lo saca afuera. ASCII para terminal, Mermaid para tu README, DOT para Graphviz, JSON para tu pipeline. Los built-in cubren lo común; escribe los tuyos para lo que falte.
// core/formatters/mermaid/index.ts
export default {
version: '0.1.0',
description: 'Render the graph as Mermaid',
format(ctx) {
return 'graph LR\n' + ctx.links
.map((l) => ` ${l.source} --> ${l.target}`).join('\n');
},
};
Notifica e integra con otras herramientas
Cuando algo pasa en skill-map (scan terminado, action ejecutada, job fallido), un Hook reacciona. Mándalo a Slack, dispara un webhook, bloquea un spawn antes de que arranque. Hay diez eventos a los que te puedes suscribir.
// integrations/hooks/slack-on-failure/index.ts
export default {
version: '0.1.0',
description: 'Post to Slack when a job fails',
triggers: ['job.failed'],
on(ctx) {
slack.post('#alerts', ctx.jobResult);
},
};
Un plugin son ~30 líneas de código.
sm plugins list
Sin config, sin setup, sin docs que leer antes. Ejecuta `sm` desde cualquier carpeta: prepara el proyecto, escanea tus skills, abre el explorador en el navegador y observa cambios en vivo.
Skills obesas que se comen tus tokens, colisiones de trigger, huérfanos, referencias rotas, duplicados semánticos. El análisis estático corre local en milisegundos; el semántico (LLM) cuando lo pides.
Las acciones son el tipo de plugin que toca el disco. Las determinísticas corren como código (renombrar un trigger, editar frontmatter); las probabilísticas ejecutan un prompt en el LLM (regenerar un summary, reescribir un texto).
Sin promesas, sin magia. Solo un grafo sobre los archivos que ya tienes.
Skill, agente o markdown: todo Markdown vive conectado al resto. skill-map te muestra duplicados, redundancias y oportunidades de optimización antes de publicar.
Múltiples proyectos, múltiples agentes, copias divergentes de la misma skill en tu harness. Un solo scan pone toda la colmena en el mismo grafo, y el diseño que pensaste y el que publicaste por fin coinciden.
El agente eligió mal una invocación. ¿Qué la disparó? skill-map sigue el camino completo: desde la frase de trigger hasta la skill que ganó el match. Todo esto en tiempo real.
Cada operación tiene un verbo CLI, una salida JSON y un hook de plugin. Conecta skill-map a tu CI, tu dashboard o tu flujo LLM, sin forkear el kernel.
“Encontramos 14 colisiones de trigger en nuestra flota interna de agentes en la primera ejecución. Llevábamos semanas depurando los fallos.”
“El chequeo de huérfanos por sí solo vale la pena. Teníamos 38 skills definidas y nunca referenciadas. Código muerto, pero para agentes.”
“Corro sm en CI. Si un PR introduce una colisión o una dep externa no permitida, el build falla. Fin del debate.”