---
name: comfyui_list_skills
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: impure
signature: "def comfyui_list_skills(library_dir: str = None, include_nsfw: bool = False) -> dict"
description: "Lista las skills ComfyUI guardadas en la libreria de disco con su metadata de resumen: slug, title, base_workflow, version, score_mean/score_n y nsfw (de provenance.nsfw), mas n_versions. Respeta include_nsfw=False (oculta las NSFW por defecto). Libreria inexistente o vacia -> lista vacia sin error. library_dir default ~/ComfyUI/skills_library."
error_type: error_go_core
tags: [comfyui, comfyui-skill, ml, skill, library]
uses_functions: []
uses_types: []
params:
  - name: library_dir
    desc: "Raiz de la libreria en disco. Default ~/ComfyUI/skills_library. keyword-only."
  - name: include_nsfw
    desc: "Si False (default), oculta las skills con provenance.nsfw == True. keyword-only."
output: "dict {ok, skills, count, error}. skills es lista de {slug, title, base_workflow, version, score_mean, score_n, nsfw, n_versions} ordenada por slug."
file_path: python/functions/ml/comfyui_list_skills.py
---

# comfyui_list_skills

Inventario de la libreria de skills del grupo `comfyui-skill`. Complementa
[`comfyui_save_skill`](comfyui_save_skill.md) y [`comfyui_load_skill`](comfyui_load_skill.md).

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.comfyui_list_skills import comfyui_list_skills

res = comfyui_list_skills(library_dir="/tmp/skills_demo")
for s in res["skills"]:
    print(s["slug"], s["base_workflow"], s["score_mean"], s["n_versions"])

# Incluir las marcadas NSFW
todas = comfyui_list_skills(library_dir="/tmp/skills_demo", include_nsfw=True)
```

O directo: `./fn run comfyui_list_skills --library-dir /tmp/skills_demo`.

## Cuando usarla

- Para descubrir qué skills hay disponibles antes de cargar una con `comfyui_load_skill`.
- Para construir un selector/menú de skills (ordenado por `score_mean` para sugerir las mejores).

## Gotchas

- **`include_nsfw=False` por defecto**: las skills con `provenance.nsfw == True` se ocultan salvo
  que lo pidas explícito. El filtro es por la metadata de la receta, no por inspección del contenido.
- **Libreria inexistente = lista vacía**: si `library_dir` no existe, devuelve
  `{ok: True, skills: [], count: 0}` (no error). Carpetas sin `recipe.json` se ignoran.
- **`score_mean`/`score_n` los rellena el bucle de scoring** (otra pieza del grupo); aquí solo se
  leen tal cual estén en la receta (0 si no se han puntuado).
- **No lanza excepción**: un error de E/S al listar la raíz devuelve `{ok: False, error: ...}`.
