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.
Todo sobre el mismo grafo, con análisis estático y semántico (LLM).
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 y asset 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 / hook / note / command para Claude), cómo clasificarlos y cómo la UI dibuja cada tipo (etiqueta, color, ícono). El provider de Claude viene built-in; escribe uno para Cursor, Copilot, o tu propio runner.
export const claude: IProvider = {
id: 'claude', kind: 'provider',
globs: ['~/.claude/**/*.md'],
kinds: { skill, agent, hook, command, note },
classify: (p) => /* skill | agent | hook | … */,
};
Extrae datos de un nodo
Cada archivo es un nodo; un Extractor lo convierte en datos. Extrae links a otros nodos, atributos que enriquecen el nodo, o información extra.
export const slash: IExtractor = {
id: 'slash', kind: 'extractor',
extract: (ctx) => {
for (const m of ctx.body.matchAll(SLASH_RE))
ctx.emitLink({ kind: 'invokes', target: m[1] });
},
};
Encuentra problemas en el grafo
Mira el grafo completo y detecta problemas: colisiones de trigger, huérfanos, dependencias muertas, referencias rotas. Escribe una rule, ejecútala en cualquier proyecto, o publícala para que otros la usen.
export const triggerCollisions: IRule = {
id: 'trigger-collisions', kind: 'rule',
evaluate: (graph) => byTrigger(graph)
.filter(([, ns]) => ns.length > 1)
.map(toCollisionIssue),
};
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.
export const renameTrigger: IAction = {
id: 'rename-trigger', kind: 'action', mode: 'deterministic',
run: async (node, { newTrigger }) => {
node.frontmatter.trigger = newTrigger;
await node.save();
},
};
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 ocho eventos a los que te puedes suscribir.
export const slackOnFailure: IHook = {
id: 'slack-on-failure', kind: 'hook',
triggers: ['job.failed'],
on: async (event) => slack.post('#alerts', event.error),
};
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.
export const mermaid: IFormatter = {
id: 'mermaid', kind: 'formatter',
format: (graph) => 'graph LR\n' +
graph.edges.map(e => ` ${e.src} --> ${e.dst}`).join('\n'),
};
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 y escanea tus skills, abre el explorador en el navegador y observa cambios en vivo.
Colisiones de trigger, huérfanos, referencias rotas, skills obesas, 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 nota: 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. Un solo scan pone toda la colmena en el mismo grafo.
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.
“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.”