---
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 <substring>       # filtra por substring en nombre o descripcion
/commands --ns <namespace>  # 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 (/<cmd>)"
        else                print "## " $1 " (/" $1 ":<cmd>)"
        prev_ns = $1
    }
    printf "- /%s%s — %s\n", ($1=="global"?"":$1":"), $2, $3
}'
```

Filtros:

- Substring: `grep -i "<substring>"` 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 (/<cmd>)
- /app — Crear, configurar y desplegar apps del registry
- /autopilot — Modo full-auto...
- /commands — Catalogo de slash commands del repo
...

## aurgi (/aurgi:<cmd>)
- /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/<ns>/`.
- Solo escanea `<root>/.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/<project>` -> `../../projects/<project>/.claude/commands`).
