dce725e69f
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
87 lines
3.2 KiB
Markdown
87 lines
3.2 KiB
Markdown
---
|
|
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`).
|