{"slug": "skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad", "title": "skill-auditor v0.1.0: auditar colecciones de skills de agentes IA por integridad y secretos", "summary": "A developer released skill-auditor v0.1.0, a CLI tool that audits AI agent skill collections for structural integrity, broken references, and hardcoded secrets. The tool scans directories of skills from agents like Hermes, Claude Code, OpenCode, or Codex, providing clear-language classification and reports in terminal, markdown, or JSON formats. In a real audit of 200 Hermes skills, it found duplicate names, nested folder collisions, and broken references, though no secrets were present.", "body_md": "Una CLI agent-agnostic (Hermes primero) que escanea skills por integridad estructural, referencias rotas y secretos hardcodeados, y clasifica cada skill en lenguaje claro. 95% de cobertura de tests, CI verde.\n\nLas colecciones de skills de un agente IA crecen sin revisión: 100–200+ entradas en Hermes, Claude Code, OpenCode o Codex. La superficie de prompts del agente es, en la práctica, código ejecutable que carga comandos y (en skills de seguridad) maneja guía sobre credenciales. Nadie la audita.\n\nEn una colección real de 200 skills de Hermes, una auditoría directa al filesystem encontró:\n\n`software-development/software-development/software-development/`\n\n) que causaba una colisión de nombre activa en runtime y arrastraba un bug de doble escapado;`anti-evasión`\n\nvs `anti-evasion`\n\n);`references`\n\nque nunca se entregaron.El hygiene de secretos estaba limpio (solo placeholders de documentación), pero \"limpio porque lo miré una vez\" no es un proceso. `skill-auditor`\n\nlo vuelve repetible.\n\nAudita cualquier directorio de skills (Hermes es el target primario; es agent-agnostic vía `name`\n\n/`description`\n\nen frontmatter YAML):\n\n| Chequeo | Hallazgo | Notas |\n|---|---|---|\n| Frontmatter YAML parseable | `FRONTMATTER_ERROR` |\nmultilínea `\\ |\n{% raw %}`name` presente |\n`NAME_MISSING` |\n|\n`description` presente y ≥15 chars |\n`DESC_EMPTY` / `DESC_SHORT`\n|\n|\n`name` duplicado |\n`NAME_DUPLICADO` |\n|\nCarpeta anidada `X/X/X`\n|\n`NESTED_DUPLICATE` |\nsolo la copia innermost es eliminable |\nReferencias `scripts/` `references/` rotas |\n`REF_ROTA` |\nignora `/tmp` , `/opt` , placeholders |\n| Secretos hardcodeados | `SECRET` |\nAWS/GH/OpenAI/Anthropic/Google/Slack/GitLab, claves privadas, asignaciones; filtra placeholders |\n\nCada skill recibe una **clasificación en lenguaje claro**: categoría (carpeta superior), propósito de una línea, y estado `OK`\n\n/ `WARNING`\n\n/ `BROKEN`\n\n.\n\nReportes en `terminal`\n\n(por defecto), `md`\n\n(una sección por skill) y `json`\n\n(para CI gates).\n\n`--fix`\n\n(opt-in, solo seguro)\nImprime el diff primero y aplica solo correcciones demostrablemente seguras y reversibles:\n\nNunca edita valores de secreto, nunca reescribe la prosa del skill, nunca borra la única copia de un skill. Si hay un hallazgo `SECRET`\n\nsobre un archivo, ningún fix lo toca.\n\n`SKILL.md`\n\n, determinista y ordenado.`pyyaml.safe_load`\n\ncon fallback regex conservador si pyyaml no está. Los bloques multilínea se preservan como texto real (un parser regex ingenuo los lee como descripción de 1 char — esa fue la clase de falso positivo exacta de un script ad-hoc previo, y es el test de regresión).`name`\n\ny auto-anidado `X/X/.../X`\n\ncon run-length ≥ 3 (solo el innermost es la copia eliminable).El proyecto se construyó por SDD (Spec-Driven Development) con criterios de aceptación Pass/Fail:\n\n`--cov-fail-under=85`\n\n).`All checks passed!`\n\n).`FRONTMATTER_ERROR`\n\n, `REF_ROTA`\n\n, secreto real (placeholder ignorado), `NAME_DUPLICADO`\n\n, `NESTED_DUPLICATE`\n\n; `--fix`\n\nelimina solo la carpeta inner y deja la outer intacta; re-audit baja de 9 a 8 skills sin nested.`push`\n\n/`PR`\n\n→ checkout → setup-python 3.11 → install → ruff → pytest con cov≥85 → smoke del CLI. Run real: `success`\n\n.Todas las métricas son salida cruda de `pytest --cov`\n\ny del log de CI, no resumen.\n\n```\npip install -e .\n# auditoría read-only\nskill-auditor ~/.hermes/skills\n# reporte markdown\nskill-auditor ~/.hermes/skills --report md\n# JSON para CI\nskill-auditor ~/.hermes/skills --report json\n# correcciones seguras (muestra diff, luego aplica)\nskill-auditor ~/.hermes/skills --fix\n```\n\nPython 3.11+, `pyyaml`\n\n(única dependencia de runtime), `argparse`\n\n, `pytest`\n\n, `ruff`\n\n. Licencia AGPL-3.0-or-later.\n\n*Licencia: AGPL-3.0-or-later © 2026 Pedro Sordo Martínez — amurlaniakea@gmail.com*", "url": "https://wpnews.pro/news/skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad", "canonical_source": "https://dev.to/magopredator/skill-auditor-v010-auditar-colecciones-de-skills-de-agentes-ia-por-integridad-y-secretos-3m47", "published_at": "2026-07-14 02:24:23+00:00", "updated_at": "2026-07-14 02:58:13.288551+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-safety"], "entities": ["Hermes", "Claude Code", "OpenCode", "Codex", "Pedro Sordo Martínez"], "alternates": {"html": "https://wpnews.pro/news/skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad", "markdown": "https://wpnews.pro/news/skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad.md", "text": "https://wpnews.pro/news/skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad.txt", "jsonld": "https://wpnews.pro/news/skill-auditor-v0-1-0-auditar-colecciones-de-skills-de-agentes-ia-por-integridad.jsonld"}}