--- name: generate_capability_doc kind: pipeline lang: bash domain: pipelines version: "1.0.0" purity: impure signature: "generate_capability_doc(group: string, --registry: string?, --out: string?) -> void" description: "Regenera la tabla de funciones de una pagina capability en docs/capabilities/.md consultando registry.db. Preserva bloques curated (Ejemplo canonico, Fronteras, Prerequisitos, Notas). Si el archivo no existe lo crea con plantilla minima." tags: ["capability-groups", "docs", "doctor", "generator", "pipeline"] uses_functions: - audit_capability_groups_go_infra uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: group desc: "slug del capability group (ej. notebook, metabase). Coincide con el tag canonico en frontmatter de funciones." - name: --registry desc: "path opcional a registry.db o a su directorio padre (default: walk-up desde cwd hasta encontrar registry.db)." - name: --out desc: "path opcional del archivo de salida (default: /docs/capabilities/.md)." output: "path del archivo actualizado o creado + count de funciones a stdout. Exit 0 ok, exit 1 si error." tested: false tests: [] test_file_path: "" file_path: "bash/functions/pipelines/generate_capability_doc.sh" --- ## Ejemplo ```bash # Regenerar tabla de notebook (ya existe, preserva Ejemplo canonico / Fronteras) ./bash/functions/pipelines/generate_capability_doc.sh notebook # → $HOME/fn_registry/docs/capabilities/notebook.md updated (5 functions) # Crear pagina nueva para un grupo sin pagina todavia ./bash/functions/pipelines/generate_capability_doc.sh metabase # → $HOME/fn_registry/docs/capabilities/metabase.md created (12 functions) # Especificar registry y destino custom ./bash/functions/pipelines/generate_capability_doc.sh android \ --registry /ruta/alternativa/registry.db \ --out /tmp/android_cap.md # → /tmp/android_cap.md created (8 functions) # Grupo sin funciones todavia (avisa pero no falla) ./bash/functions/pipelines/generate_capability_doc.sh nuevo_grupo # WARN: El grupo 'nuevo_grupo' no tiene funciones con ese tag en registry.db. # → $HOME/fn_registry/docs/capabilities/nuevo_grupo.md created (0 functions) ``` ## Comportamiento detallado ### Resolucion de root Walk-up desde `cwd` buscando `registry.db`. Si se pasa `--registry`: - Si es un archivo: toma el directorio padre. - Si es un directorio: lo usa directamente. ### Tabla generada (SQL) ```sql SELECT f.id, f.signature, f.description FROM functions f, json_each(f.tags) j WHERE j.value = '' ORDER BY f.id; ``` JOIN custom via `json_each` — usa `sqlite3` directo (excepcion autorizada para JOINs no expuestos por MCP). ### Formato de tabla ```markdown | ID | Firma | Que hace | |---|---|---| | `` | `` | | ``` Los `|` dentro de signatures y descriptions se escapan como `\|`. ### Preservacion de bloques curated Cuando el archivo ya existe: - El bloque entre `## Funciones` y la siguiente `## ` se reemplaza. - Todo lo anterior y posterior (Ejemplo canonico, Fronteras, Prerequisitos, Notas, etc.) se mantiene intacto. - Implementado con `awk`: copia hasta `## Funciones`, imprime nueva tabla, salta contenido viejo hasta encontrar `^## `, reanuda copia. ### Archivo nuevo Si `docs/capabilities/.md` no existe, se crea con plantilla minima: - Titulo `# Capability: `. - Placeholder de descripcion (editable a mano). - Tabla generada. - Secciones vacias: `## Ejemplo canonico`, `## Fronteras`. ## Codigos de salida | Codigo | Significado | |--------|-------------| | 0 | Exito | | 1 | Error: grupo no especificado, registry.db no encontrado, fallo SQL, awk vacio | ## Notas - `uses_functions: []` — depende de `sqlite3` y `awk` del sistema, no de funciones del registry. - El tag del grupo debe ser plano (ej. `notebook`, `metabase`), no `tag:notebook`. - Enganchado en `docs/capabilities/INDEX.md` como el mecanismo de auto-generacion referenciado bajo `fn doctor capabilities --update`. - Seguro para re-ejecucion: idempotente si el registry no cambia.