Files
egutierrez dce725e69f feat(infra): auto-commit con 8 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:38:16 +02:00

3.2 KiB

description
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).

#!/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).