sast-skills
Colección de habilidades de agente que convierten tu codificador de IA en un escáner SAST
Documentación
🛡️ sast-skills
Convierte tu asistente de codificación LLM en un escáner SAST completamente funcional.
Habilidades de agente listas para usar para 14 asistentes de IA — Claude Code, OpenAI Codex CLI, Gemini CLI, GitHub Copilot, Cursor, Windsurf, OpenCode, Cline, Antigravity, Aider, Kilo Code, Augment Code, Hermes Agent y Mistral Vibe.
Se recomienda Claude Code con Opus para mayor calidad; cualquier modelo capaz funciona.
⚡ Inicio rápido
npx sast-skills install # pick your assistant(s) — ones found on your PATH are pre-enabled
Luego abre el proyecto en tu asistente y escribe el prompt:
Ejecutar escaneo de vulnerabilidades
Ejecuta las cuatro fases y escribe los hallazgos en sast/. Agréguelos con npx sast-skills export --format sarif para GitHub Code Scanning, o --format oscal para evidencia de cumplimiento NIST OSCAL.
📑 Tabla de contenidos
- ✨ Características destacadas
- 🔄 Flujo
- 🔍 Qué detecta
- 📦 Instalación
- 🚀 Ejecutar un escaneo
- 🔌 Integraciones CI
- 🩺 Verificar y solucionar problemas
- 🤝 Contribuciones
- 📄 Licencia
✨ Características destacadas
- 68 habilidades en 64 clases de vulnerabilidades — inyección (incl. XPath, lenguaje de expresiones, fórmula CSV, variantes de bomba XML), control de acceso roto, profundidad de API y sesión (limitación de tasa, OAuth/OIDC, fijación de sesión, rutas ocultas), criptografía débil, manejo de archivos, cadena de suministro, riesgos de CI/CD y metadatos en la nube, lógica de negocio y abuso de pagos, seguridad agéntica/MCP (envenenamiento de configuración de habilidades, envenenamiento de herramientas MCP, configuración como ejecución, identidad de agente con privilegios excesivos), y tiempo de ejecución de LLM/agente (agencia excesiva, aislamiento RAG, llamadas inseguras a herramientas, envenenamiento de memoria, denegación de billetera), además de un enrutador de pila tecnológica.
- Orquestación de cuatro fases — reconocimiento → detección paralela → informe consolidado → triaje basado en evidencia, impulsado completamente desde
CLAUDE.md/AGENTS.md. - Idempotente y reanudable — cada fase omite trabajo cuyo resultado ya existe; vuelve a ejecutar después de corregir problemas para actualizar solo lo que está desactualizado.
- Salida legible por máquina — cada habilidad emite JSON canónico;
sast-skills exportagrega a JSON, SARIF 2.1.0, o HTML para GitHub Code Scanning y CI. - Salida lista para cumplimiento — los mismos hallazgos se exportan como NIST OSCAL 1.2.3: un documento
assessment-results(SAR) o unplan-of-action-and-milestones(POA&M), con cada hallazgo mapeado a los controles NIST SP 800-53 Rev 5 que pone en duda. - Multi-asistente — habilidades idénticas se envían para Claude Code (
.claude/skills) y cada asistenteAGENTS.md(.agents/skills). - CLI sin configuración —
install/update/uninstall/doctor/export, publicado desde GitHub Actions con procedencia npm (atestación SLSA).
🔄 Flujo
El orquestador ejecuta cuatro fases — reconocimiento, detección paralela, síntesis y triaje:
flowchart TD
U(["User: Run vulnerability scan"]) --> R{"CLAUDE.md / AGENTS.md orchestrator"}
R --> S1["Step 1 — sast-analysis<br/>codebase and architecture map"]
S1 -->|sast/architecture.md| S2["Step 2 — parallel vulnerability scan<br/>64 skills: recon, batched verify, merge"]
S2 -->|sast/*-results.md and *-results.json| S3["Step 3 — sast-report<br/>consolidate and rank"]
S3 -->|sast/final-report.md| S4["Step 4 — sast-triage<br/>false-positive elimination,<br/>severity adjustment with evidence"]
S4 -->|sast/final-report-triaged.md and triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML, OSCAL"]
EXP --> CS(["GitHub Code Scanning, CI, dashboards"])
EXP --> GRC(["OSCAL SAR / POA&M for GRC"])
Cada paso es idempotente: si su archivo de salida ya existe, el orquestador lo omite. Vuelve a ejecutar el escaneo después de corregir problemas para actualizar solo lo que está desactualizado.
🔍 Qué detecta
Todas las habilidades siguen el mismo patrón de tres fases: reconocimiento → verificación por lotes (subagentes paralelos, 3 por lote) → fusión. Cada una escribe un informe markdown legible por humanos y un archivo JSON canónico de hallazgos que sast-skills export agrega.
Reconocimiento y síntesis
| Habilidad | Rol |
|---|---|
sast-analysis | Reconocimiento del código base, mapeo de arquitectura, modelo de amenazas |
sast-stack | Enrutador de pila tecnológica — elige qué habilidades de detección ejecutar por proyecto |
sast-report | Consolidar hallazgos por clase en un informe clasificado |
sast-triage | Eliminar falsos positivos y ajustar severidades con evidencia del código base |
Inyección
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-sqli | Inyección SQL |
sast-nosql | Inyección NoSQL (Mongo, Firestore, DynamoDB) |
sast-ldap | Inyección de filtro LDAP / DN |
sast-graphql | Construcción insegura de documentos GraphQL |
sast-xss | Cross-Site Scripting |
sast-ssti | Inyección de plantillas del lado del servidor |
sast-rce | Ejecución remota de código (inyección de comandos, eval, deserialización insegura) |
sast-xxe | XML External Entity |
sast-ssrf | Server-Side Request Forgery |
sast-openredirect | Redirección abierta (phishing / robo de tokens OAuth) |
sast-crlf | CRLF / división de respuesta HTTP (inyección de encabezados) |
sast-ssrfimds | SSRF de metadatos en la nube (robo de credenciales IMDSv1) |
sast-unsafeconsumption | Respuesta de API de terceros no validada hacia un sumidero (inyección de segundo orden) |
sast-xpath | Inyección XPath (entrada de usuario en una expresión XPath) |
sast-csvinj | Inyección de fórmula / CSV en exportaciones de hojas de cálculo |
sast-elinj | Inyección de lenguaje de expresiones (OGNL / SpEL / MVEL / JEXL) |
Control de acceso y autenticación
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-idor | Referencia directa insegura a objetos |
sast-missingauth | Autenticación faltante / autorización a nivel de función rota |
sast-jwt | Implementaciones JWT inseguras |
sast-csrf | Cross-Site Request Forgery |
sast-cors | Configuración incorrecta de CORS |
sast-cookieflags | HttpOnly / Secure / SameSite faltantes en cookies de sesión |
sast-massassign | Asignación masiva / sobrepublicación (escalada de privilegios) |
sast-secheaders | Encabezados de seguridad faltantes (CSP, HSTS, X-Frame-Options, SRI) |
sast-ratelimit | Límite de tasa faltante en endpoints de autenticación / costosos |
sast-session | Fijación de sesión + IDs de sesión de baja entropía |
sast-oauth | Configuración incorrecta de OAuth / OIDC (redirect_uri, state, PKCE) |
sast-routeinventory | Rutas ocultas / de depuración / de administrador registradas |
sast-postmessage | Confianza de origen postMessage / CSWSH / reverse-tabnabbing |
Archivos, criptografía y tiempo de ejecución
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-pathtraversal | Traversal de ruta / directorio |
sast-fileupload | Carga de archivos insegura |
sast-crypto | Primitivas débiles, modos incorrectos, reutilización de IV, PRNG débil |
sast-prototype | Polución de prototipos en JavaScript |
sast-redos | DoS por regex con retroceso catastrófico |
sast-race | Condiciones de carrera y TOCTOU |
sast-deser | Deserialización insegura (cadenas de gadgets, pickle, unserialize) |
sast-tls | Verificación de certificado / nombre de host TLS deshabilitada |
sast-zipslip | Zip Slip — traversal de ruta en extracción de archivos |
sast-dangerousapi | Sumideros de API peligrosos (eval / exec / reflexión / puentes nativos) |
sast-xmlbomb | DoS por expansión de entidades XML (billion laughs / explosión cuadrática) |
Exposición de datos y cadena de suministro
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-hardcodedsecrets | Claves API / tokens / credenciales en código orientado al cliente |
sast-pii | Fuga de PII y credenciales a registros / telemetría / páginas de error |
sast-deps | Dependencias vulnerables conocidas (CVE en lockfiles) |
sast-iac | IaC inseguro (Dockerfile / Terraform / Kubernetes / GitHub Actions) |
sast-errorhandling | Lógica fail-open, fugas de stack-trace / secretos, modo de depuración |
sast-excessivedata | Exposición excesiva de datos en respuestas API |
sast-pipelineinj | Inyección en pipeline CI/CD (payloads de eventos no confiables) |
sast-depconfusion | Confusión de dependencias + ejecución de scripts en tiempo de instalación |
sast-lockfile | Lockfile faltante / hashes de dependencias sin fijar |
sast-cloudsdk | Uso incorrecto de SDK en la nube (bucket público, clave hardcodeada, IAM amplio) |
Lógica de negocio y específicas de LLM
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-businesslogic | Manipulación de precios, bypass de flujo de trabajo, abuso de recompensas |
sast-paymentlogic | Abuso de pagos en comercio electrónico (carrera de precio / cupón / reembolso / saldo) |
sast-promptinjection | Texto no confiable que llega a un prompt de LLM (OWASP LLM #1) |
sast-llmoutput | Salida de LLM no validada que llega a sumideros de código / HTML / SQL / shell (OWASP LLM #2) |
Seguridad agéntica y MCP
La superficie de ataque de la era 2026 que la mayoría de los escáneres de firmas pasan por alto — manipulación de lenguaje natural, envenenamiento de herramientas MCP, configuración como ejecución e identidades de agente con privilegios excesivos. Estas habilidades usan un paso de verificación impulsado por LLM, no coincidencia de regex.
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-skillaudit | Instrucción oculta / sumidero de shell en configuración de habilidad o agente no confiable |
sast-mcpsec | Envenenamiento de herramientas de servidor MCP + falta de autenticación de herramientas |
sast-configrce | Configuración de repositorio que auto-ejecuta shell al abrir / hacer checkout del proyecto |
sast-agentidentity | Identidad no humana (agente / CI) con privilegios excesivos |
Tiempo de ejecución de LLM y agente
Comportamiento en tiempo de ejecución de aplicaciones LLM y de agente — autoridad de herramientas, aislamiento de recuperación, higiene de secretos en prompts, confianza en memoria y límites de costo. El enrutador de pila tecnológica los controla para que nunca se ejecuten en códigos base sin dependencias LLM/agente.
| Habilidad | Clase de vulnerabilidad |
|---|---|
sast-excessiveagency | Autoridad excesiva del agente (herramientas que cambian estado, sin humano en el bucle) |
sast-toolcalling | Despacho de herramientas LLM sin lista de permitidos / validación de argumentos |
sast-ragleak | Fuga entre inquilinos RAG + inyección indirecta (filtro ACL de recuperación faltante) |
sast-systempromptleak | Secretos en prompts del sistema; prompt registrado o devuelto a los llamadores |
sast-memorypoison | Datos no confiables persistidos en la memoria del agente y luego confiados |
sast-llmdos | Tokens LLM / bucles de agente sin límite (denegación de billetera) |
📦 Instalación
npx sast-skills install
El instalador muestra una selección múltiple de los 14 asistentes compatibles (más Todos los anteriores) y pregunta si instalar en el proyecto actual o en el directorio de inicio del usuario (project / global). Para omitir prompts, pasa una lista separada por comas de IDs de asistentes (o all):
npx sast-skills install --yes --assistant claude,cursor,copilot --scope project
Si tu proyecto ya contiene un
CLAUDE.mdoAGENTS.md, el instalador se niega a sobrescribirlo por defecto — haz una copia de seguridad o pasa--force.
Instalación manual (sin npx / npm) — clic para expandir
Usa esta ruta si no puedes ejecutar npx (proxy corporativo, registro npm inalcanzable, entorno sin conexión) o si quieres fijar el código fuente de este fork en lugar del paquete npm publicado. El instalador CLI solo hace dos cosas — colocar el archivo de entrada del orquestador en la raíz del proyecto y reflejar cada SKILL.md de habilidad en el directorio oculto correcto — por lo que un cp -R simple lo reproduce exactamente.
1. Obtener los archivos empaquetados
git clone https://github.com/mstfknn/sast-skills.git
Todo lo que necesitas está bajo sast-skills/sast-files/:
sast-files/
├── CLAUDE.md # Orchestrator entry for Claude Code
├── AGENTS.md # Orchestrator entry for Gemini CLI / Codex / OpenCode / Cursor
├── .claude/skills/sast-*/SKILL.md # 68 skills in Claude Code format
└── .agents/skills/sast-*/SKILL.md # Same 68 skills mirrored for AGENTS.md assistants
Los dos árboles de habilidades se mantienen sincronizados por npm run sync — el contenido es idéntico, solo difiere el nombre del directorio.
2a. Instalar para Claude Code
Establece SAST_SRC a la ruta del clon para que los comandos a continuación sigan siendo copiables y pegables:
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
Alcance del proyecto (recomendado — versionado junto con tu repositorio):
cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./
Si ya usas un
CLAUDE.mda nivel de proyecto, no lo sobrescribas — Claude Code solo lee unCLAUDE.mdpor proyecto. Fusiona el contenido del orquestador (el flujo de cuatro fases) en tu archivo existente en su lugar.
Alcance global (habilidades disponibles en cada proyecto; el orquestador aún se copia por proyecto):
mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# Then in any project where you want the scan flow:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md
2b. Instalar para Gemini CLI (y otros asistentes AGENTS.md)
export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./
Gemini CLI lee GEMINI.md; el instalador lo escribe por ti cuando eliges Gemini.
3. Verificar la instalación
# Project scope (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head
# Project scope (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head
# Global scope (Claude Code)
ls ~/.claude/skills/ | head
Deberías ver los 31 directorios de habilidades sast-*. Abre el proyecto en tu asistente y escribe el prompt "Ejecutar escaneo de vulnerabilidades" — el orquestador dentro de CLAUDE.md / AGENTS.md impulsa las cuatro fases desde allí.
4. Mantener una instalación manual actualizada
cd "$SAST_SRC" && git pull
# Re-run the cp commands from Step 2a / 2b to refresh — they're idempotent.
Si conservas el clon, cd "$SAST_SRC" && git pull && <rerun cp> es el equivalente manual de npx sast-skills update.
Comandos CLI
| Comando | Qué hace |
|---|---|
npx sast-skills install | Copia CLAUDE.md / AGENTS.md y el árbol de habilidades en tu proyecto o $HOME |
npx sast-skills update | Actualiza una instalación existente con los archivos de habilidades incluidos actualmente |
npx sast-skills uninstall | Elimina habilidades instaladas; se niega a eliminar un CLAUDE.md modificado sin --force |
npx sast-skills doctor | Verifica una instalación e informa OK / MISSING / MODIFIED por archivo; sale con código distinto de cero si hay problemas |
npx sast-skills export --input sast/ --format sarif --output report.sarif | Agrega sast/*-results.json en JSON, SARIF 2.1.0 o HTML |
npx sast-skills export --input sast/ --format oscal --output sar.json | Genera un documento assessment-results NIST OSCAL 1.2.3 |
npx sast-skills export --input sast/ --format oscal-poam --output poam.json | Genera un plan-of-action-and-milestones NIST OSCAL 1.2.3 |
npx sast-skills export --input sast/ --triaged --format sarif | Prefiere el sast/triaged.json triado sobre los resultados brutos por habilidad |
npx sast-skills --version | Imprime la versión CLI instalada |
Banderas de instalación
| Bandera | Propósito |
|---|---|
--yes | No interactivo; requerido cuando stdin no es un TTY |
--assistant <ids> | IDs de asistente separados por comas (p. ej., claude,cursor,copilot) o all |
--scope <project|global> | Instalar en ./.claude/skills/ o $HOME/.claude/skills/ |
--target <path> | Destino de instalación explícito (anula --scope) |
--force | Sobrescribe un CLAUDE.md / AGENTS.md preexistente |
--dry-run | Imprime el plan de archivos sin escribir |
🚀 Ejecutar un escaneo
Después de instalar, abre el proyecto en tu asistente de IA y pregunta:
Ejecutar escaneo de vulnerabilidades
o
Encontrar vulnerabilidades en este código base
El orquestador toma el control. Ejecuta las cuatro fases automáticamente, respeta la idempotencia (las re-ejecuciones solo detectan lo que falta) y escribe todo en sast/ en la raíz de tu proyecto.
Archivos de salida
| Archivo | Descripción |
|---|---|
sast/architecture.md | Pila tecnológica, arquitectura, puntos de entrada, flujos de datos |
sast/*-results.md | Hallazgos por clase de vulnerabilidad (legibles para humanos) |
sast/*-results.json | Hallazgos canónicos legibles por máquina (alimentados a sast-skills export) |
sast/final-report.md | Informe bruto consolidado ordenado por severidad |
sast/final-report-triaged.md | Informe triado: falsos positivos eliminados, severidades ajustadas con evidencia |
sast/triaged.json | Hallazgos triados canónicos (preferidos por sast-skills export --triaged) |
Esquema de hallazgos
Cada habilidad escribe sast/<skill>-results.json como una lista de hallazgos simple:
{
"findings": [
{
"id": "sast-sqli-0001",
"skill": "sast-sqli",
"severity": "critical|high|medium|low|info",
"title": "SQL injection in /api/user",
"description": "…",
"location": { "file": "src/api/user.js", "line": 42, "column": 10 },
"remediation": "…"
}
]
}
sast-skills export agrega esos archivos en un documento envuelto en un sobre run — { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } — sellando la versión de la CLI que produjo el informe. El paso de triaje escribe sast/triaged.json en esa misma forma envuelta.
Los hallazgos triados agregan triage_status (confirmed|upgraded|downgraded|false_positive), triage_original_severity (cuando la severidad cambió) y triage_evidence con citas concretas del código base.
Cada campo anterior se traslada a la exportación OSCAL; consulta NIST OSCAL para el mapeo campo por campo.
🔌 Integraciones de CI
GitHub Code Scanning (SARIF)
Acción compuesta en .github/actions/scan/action.yml:
- uses: mstfknn/sast-skills/.github/actions/scan@main
with:
input: sast/
output: sast-skills.sarif
Esto ejecuta sast-skills export --format sarif y sube el resultado a Code Scanning mediante github/codeql-action/upload-sarif@v3.
NIST OSCAL (evidencia de cumplimiento)
Para plataformas GRC, evidencia de auditoría e informes de línea base de control, exporta los mismos hallazgos como OSCAL — el Lenguaje de Evaluación de Controles de Seguridad Abiertos de NIST. Los documentos declaran oscal-version 1.2.3 y se validan contra los esquemas JSON publicados por NIST en CI.
# Security Assessment Results (SAR) — a point-in-time record of what was found
npx sast-skills export --input sast/ --triaged --format oscal --output sast-skills-sar.json
# Plan of Action and Milestones (POA&M) — the remediation backlog
npx sast-skills export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json
En GitHub Actions, los documentos OSCAL son artefactos de flujo de trabajo en lugar de cargas de Code Scanning — Code Scanning habla SARIF, las plataformas GRC hablan OSCAL, por lo que ambos se ejecutan en paralelo:
- uses: mstfknn/sast-skills/.github/actions/scan@main # SARIF → Code Scanning
with:
input: sast/
output: sast-skills.sarif
- name: Export OSCAL
run: |
npx sast-skills@latest export --input sast/ --triaged --format oscal --output sast-skills-sar.json
npx sast-skills@latest export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json
- uses: actions/upload-artifact@v4
with:
name: oscal
path: sast-skills-*.json
Cómo se mapea un hallazgo. OSCAL separa la evidencia del riesgo y del veredicto de cumplimiento, por lo que cada hallazgo de sast-skills se expande en tres objetos vinculados:
| sast-skills | OSCAL | Notas |
|---|---|---|
title, description, location | observation | methods: ["TEST"], href de evidencia path/to/file.js#L42 |
severity | risk.characterizations[].facets[] | faceta severity |
exploitability | faceta likelihood | omitida cuando el hallazgo no la incluye |
confidence | faceta confidence | omitida cuando el hallazgo no la incluye |
remediation | risk.remediations[] | lifecycle: "recommendation" |
chain_id, skill, triage_status | risk.props[] | campos para los que OSCAL no tiene un espacio de primera clase |
skill → controles | finding.target | statement-id si-10_smt, estado not-satisfied |
Mapeo de controles. Cada habilidad de detección se mapea a los controles de NIST SP 800-53 Rev 5 cuyo objetivo sus hallazgos ponen en duda — sast-sqli → si-10, sast-crypto → sc-13/sc-28, sast-missingauth → ac-3/ac-6/ia-2, y así sucesivamente. Esos IDs pueblan reviewed-controls y el target-id de cada hallazgo. La tabla completa vive en src/oscal-controls.js; una habilidad sin mapear cae en ra-5 (Monitoreo y Escaneo de Vulnerabilidades) en lugar de descartarse.
La semántica del triaje difiere según el modelo. En el SAR, un hallazgo triado como falso positivo permanece en el documento como un riesgo cerrado — evidencia de que el escáner lo consideró y lo resolvió. En el POA&M se omite por completo, porque un POA&M es una lista de trabajo aún pendiente.
Identificadores estables. Todos los UUID son RFC 4122 v5, derivados del contenido propio del hallazgo (habilidad, archivo, línea, título). Re-exportar un directorio sast/ sin cambios produce un documento byte-idéntico aparte de las marcas de tiempo de ejecución, por lo que la salida OSCAL es segura para confirmar y comparar entre escaneos.
Gancho de pre-commit
Copia hooks/pre-commit en .git/hooks/pre-commit para que sast-skills doctor controle cada confirmación.
Docker
docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif
El Dockerfile incluido es basado en node:20-alpine con sast-skills establecido como punto de entrada.
🩺 Verificar y solucionar problemas
# Is the install in the expected shape?
npx sast-skills doctor --target . --assistant claude
# Version check
npx sast-skills --version
npm view sast-skills version # latest on the registry
# Upgrade
npx sast-skills update
doctor sale con 0 si cada archivo incluido en el destino coincide con la copia de la versión instalada, y con 1 si algún archivo está MISSING o MODIFIED. MODIFIED significa que el archivo divergió de la copia incluida — esperado si editas el archivo de entrada, de lo contrario es una señal para ejecutar update.
🤝 Contribuciones
Consulta CONTRIBUTING.md. Bucle de desarrollo:
npm install
npm test # vitest suite (TDD-guard enabled; count shown in the tests badge)
npm run sync # mirror .claude/skills → .agents/skills
node scripts/scaffold-skill.js sast-foo # stub a new skill in both trees
node scripts/register-skill.js sast-foo foo "Foo" "Foo injection description"
npm run lint:md # markdownlint
prepublishOnly ejecuta npm run sync && npm test — un espejo sucio o una prueba en rojo aborta npm publish.
- Estándares comunitarios: CODE_OF_CONDUCT.md
- Historial de versiones: CHANGELOG.md
📄 Licencia
MIT — consulta LICENSE.