python-deps-pinning
Skill1 starsChanged 9 days agoMITView on GitHub
Mide qué parte del árbol de dependencias Python de un repo es REALMENTE auditable por un scanner de vulnerabilidades, y nombra las que quedan fuera. Una dependencia declarada como `requests` o `requests>=2.0` no resuelve a una versión concreta, así que ningún scanner puede pronunciarse sobre ella y un "0 vulnerabilidades" sobre esa superficie es un falso tranquilizante. Lee requirements*.txt, pyproject.toml (PEP 621, dependency-groups y Poetry) y detecta lockfiles (poetry.lock, uv.lock, Pipfile.lock, pdm.lock, requirements.lock). Reporta cobertura en porcentaje, lista las dependencias invisibles agrupadas por fichero, y da la receta de lockfile del gestor detectado. Úsalo cuando el usuario diga "pinea las dependencias", "por qué el scan no ve nada", "genera el lockfile", "las deps no están fijadas", "auditá las versiones de las dependencias", o antes/después de correr security-audit. Trabaja sobre `Path.cwd()` — funciona en cualquier repo Python.
1 other project uses a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- vladimiracunadev-create/codex-skills-toolkitedited, first seen Sep 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 1
- vladimiracunadev-create/codex-skills-toolkit★ 096% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository22 other files it gives its agents.
- bitcoin-custody-auditSkill
- clone-repoSkill
- docker-cleanupSkill
- docker-compose-doctorSkill
- functional-user-flow-testerSkill
- git-pushSkill
- md-lint-fixSkill
- md-to-docSkill
- pre-commit-guardSkill
- preliminary-product-testerSkill
- pre-push-guardSkill
- python-lint-guardSkill
- python-version-controlSkill
- release-evidence-auditorSkill
- repo-coherence-auditSkill
- security-auditSkill
- software-resilience-state-testerSkill
- sync-forkSkill
- nombre-del-skillSkill
- version-bumpSkill
- web-snapSkill
- yaml-controlSkill
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 128
No consulta la red: No resuelve versiones ni valida que existan en PyPI.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
python-deps-pinning
Complemento directo de security-audit: ese skill
declara que las dependencias sin pin exacto quedan fuera del scan; este las
cuantifica y las nombra.
Alcance y permisos
| Capacidades del script | file_read |
| Qué toca | Lee manifests y lockfiles de Python para medir qué parte del árbol de dependencias es auditable por un scanner de CVE. |
| Qué nunca toca | Solo lectura: da la receta del lockfile, no la ejecuta ni instala nada. |
| Herramientas retiradas | WebFetch, WebSearch |
No declara allowed-tools, y es deliberado: ese campo preaprueba herramientas —se salta la confirmación durante el turno que invoca el skill— en vez de limitarlas. Declararlo aquí no acotaría nada: quitaría la confirmación del usuario. disallowed-tools sí retira herramientas del pool mientras el skill está activo, y ahí es donde se acota de verdad.
Por qué existe
Un scanner de vulnerabilidades (OSV, GHSA, PyPA) responde a la pregunta "¿la
versión X del paquete Y tiene CVEs?". Si el repo declara requests a secas, o
requests>=2.0, no hay versión X que consultar. La dependencia no es que salga
limpia: es que nunca se miró.
El resultado es un reporte que dice "0 vulnerabilidades" sobre una superficie que jamás se auditó. Ese es el falso tranquilizante que este skill elimina: convierte el silencio en un número.
Cuándo invocar este skill
Triggers explícitos:
- "pinea las dependencias"
- "las deps no están fijadas"
- "genera el lockfile"
- "por qué el scan de seguridad no encuentra nada"
- "auditá las versiones de las dependencias"
- "pin dependencies" / "generate lockfile"
Triggers proactivos:
- Antes o después de correr
security-audit(para interpretar su cobertura) - Al añadir una dependencia nueva a
requirements.txtopyproject.toml - Al preparar un release reproducible
Cómo se invoca
python ~/.claude/skills/python-deps-pinning/python_deps_pinning.py # reporte
python ~/.claude/skills/python-deps-pinning/python_deps_pinning.py --strict # exit 1 si hay invisibles
python ~/.claude/skills/python-deps-pinning/python_deps_pinning.py --threshold 90 # exit 1 si cobertura < 90%
python ~/.claude/skills/python-deps-pinning/python_deps_pinning.py --json # salida JSONCómo clasifica cada dependencia
| Estado | Ejemplo | ¿Auditable? | Motivo |
exact | requests==2.31.0 | ✅ | Resuelve a una versión concreta |
locked | requests>=2.0 + lockfile en el mismo directorio | ✅ | El lockfile fija la versión real |
range | requests>=2.0 sin lockfile | ❌ | No resuelve: la instalación de hoy y la de mañana difieren |
bare | requests | ❌ | Sin especificador alguno |
direct | pkg @ https://…, git+https://…, -e ./pkg | ❌ | Fuera de todo índice consultable |
Un ==1.2.* cuenta como rango, no como pin: el comodín no fija una versión.
La detección de lockfile es conservadora: solo cubre el manifest que vive
en su mismo directorio. Un poetry.lock en la raíz no se asume válido para un
requirements.txt de un subproyecto.
Fuentes que lee
| Fichero | Qué extrae |
requirements*.txt (recursivo) | Una dependencia por línea; ignora -r, -c, --index-url; marca -e como direct |
pyproject.toml → [project] dependencies | PEP 621 |
pyproject.toml → [project] optional-dependencies | Todos los grupos extra |
pyproject.toml → [dependency-groups] | PEP 735 |
pyproject.toml → [tool.poetry.dependencies] | Sintaxis de tablas de Poetry (excluye python) |
Lockfiles reconocidos: poetry.lock, uv.lock, Pipfile.lock, pdm.lock,
requirements.lock.
Excluye node_modules, .venv, venv, vendor_py, site-packages, dist,
build, target y cualquier directorio oculto.
Qué NO hace / limitaciones
- No modifica ningún fichero. Es solo lectura: reporta y da la receta. No
ejecuta
pip-compilenipoetry lockpor su cuenta — regenerar un lockfile cambia el árbol de dependencias y esa es una decisión del proyecto. - No consulta la red. No resuelve versiones ni valida que existan en PyPI.
Para eso está
security-audit. - No lee el contenido del lockfile. Comprueba su presencia junto al manifest; no verifica que esté sincronizado con él (un lockfile obsoleto cuenta como cobertura).
- No cubre
setup.pyconinstall_requirescomputado en Python: es código arbitrario, no un manifest declarativo. - Solo Python. Para el resto del árbol de dependencias →
security-audit.
Dependencias
| Dependencia | Cómo instalar | Requerida u opcional |
python>=3.11 | viene con el SO | requerida (usa tomllib) |
Cero dependencias externas.
Ejemplo de salida
python-deps-pinning — repo: /repo
Manifests analizados: 2
· requirements.txt
· pyproject.toml
COBERTURA REAL DEL SCAN DE VULNERABILIDADES
----------------------------------------------------------
dependencias declaradas : 61
resolubles a versión exacta: 0
invisibles para el scanner : 61
cobertura : 0.0%
FUERA DEL SCAN — un CVE en estas dependencias no se detectaría
requirements.txt (60)
· flask rango sin lockfile
· numpy rango sin lockfile
… y 48 más
CÓMO CERRARLO
pip-tools → pip-compile requirements.in -o requirements.txt --generate-hashes
uv → uv pip compile requirements.in -o requirements.txtDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

