--- description: "Lista todos los slash commands disponibles en el repo: globales de fn_registry + namespaced de cada project. Filtra por substring o por namespace." --- # /commands — Catalogo de slash commands del repo Inventario unificado. Lista los `.md` bajo `.claude/commands/` (recursivo, sigue symlinks) y agrupa por namespace. ## Sintaxis ``` /commands # listado completo agrupado por namespace /commands # filtra por substring en nombre o descripcion /commands --ns # solo un namespace (global, aurgi, ...) /commands --json # salida JSON para agentes ``` ## Implementacion Bash + awk. Parsea frontmatter `description:` de cada `.md`. Agrupa por subdirectorio (subdir = namespace, root = `global`). ```bash #!/usr/bin/env bash set -euo pipefail ROOT="${FN_REGISTRY_ROOT:-/home/egutierrez/fn_registry}" CMD_DIR="$ROOT/.claude/commands" # Recolecta: ns|name|description collect() { find -L "$CMD_DIR" -type f -name '*.md' | while read -r f; do rel="${f#$CMD_DIR/}" case "$rel" in */*) ns="${rel%%/*}"; name="${rel#*/}"; name="${name%.md}" ;; *) ns="global"; name="${rel%.md}" ;; esac desc=$(awk '/^description:/ {sub(/^description:[[:space:]]*/, ""); gsub(/^"|"$/, ""); print; exit}' "$f") printf '%s|%s|%s\n' "$ns" "$name" "${desc:-(sin descripcion)}" done | sort } collect | awk -F'|' ' { if ($1 != prev_ns) { if (prev_ns) print "" if ($1 == "global") print "## global (/)" else print "## " $1 " (/" $1 ":)" prev_ns = $1 } printf "- /%s%s — %s\n", ($1=="global"?"":$1":"), $2, $3 }' ``` Filtros: - Substring: `grep -i ""` sobre stdout. - `--ns X`: filtrar antes del `awk` por `$1 == "X"`. - `--json`: reemplazar el `awk` por `jq -Rsn` que construya array `{namespace, name, description, invocation}`. ## Salida (formato humano) ``` ## global (/) - /app — Crear, configurar y desplegar apps del registry - /autopilot — Modo full-auto... - /commands — Catalogo de slash commands del repo ... ## aurgi (/aurgi:) - /aurgi:anadir_contexto_aurgi — Anade o modifica contexto... - /aurgi:aumentar_task — Enriquece tarea Aurgi con preguntas... - /aurgi:contexto_aurgi — Aprende el contexto de Aurgi... ``` ## Cuando usarlo - Sesion nueva: ver de un vistazo que slash commands hay disponibles. - Antes de inventar logica inline: comprobar si ya existe un command. - Auditoria: verificar que los projects exponen sus commands correctamente. - Onboarding: nuevo PC clonado, descubrir capacidades del repo sin abrir N archivos. ## Gotchas - Sigue symlinks (`find -L`). Si un symlink apunta a directorio inexistente, devuelve vacio para esa rama — verificar con `ls -L .claude/commands//`. - Solo escanea `/.claude/commands/`. Commands user-global en `~/.claude/commands/` NO entran (son personales, fuera del repo). - Namespace = nombre del subdirectorio bajo `.claude/commands/`. Coincide con el project pero no por mecanismo — por convencion. Ver `.claude/rules/project_commands.md`. - Para que un command de project aparezca aqui desde la raiz, hace falta el symlink (`.claude/commands/` -> `../../projects//.claude/commands`).