agentleFS
vladimiracunadev-createvladimiracunadev-create/codex-skills-toolkit/skills/python-deps-pinning/SKILL.md

python-deps-pinning

Skill0 starsChanged 2 months 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 con rango mínimo 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

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
  1. Very specific:

    No consulta la red: No resuelve versiones ni valida que existan en PyPI.

    line 109

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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.

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.txt o pyproject.toml
  • Al preparar un release reproducible

Cómo se invoca

python ~/.agents/skills/python-deps-pinning/python_deps_pinning.py                 # reporte
python ~/.agents/skills/python-deps-pinning/python_deps_pinning.py --strict        # exit 1 si hay invisibles
python ~/.agents/skills/python-deps-pinning/python_deps_pinning.py --threshold 90  # exit 1 si cobertura < 90%
python ~/.agents/skills/python-deps-pinning/python_deps_pinning.py --json          # salida JSON

Cómo clasifica cada dependencia

EstadoEjemplo¿Auditable?Motivo
exactrequests==2.31.0✅Resuelve a una versión concreta
lockedrequests>=2.0 + lockfile en el mismo directorio✅El lockfile fija la versión real
rangerequests>=2.0 sin lockfile❌No resuelve: la instalación de hoy y la de mañana difieren
barerequests❌Sin especificador alguno
directpkg @ 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

FicheroQué extrae
requirements*.txt (recursivo)Una dependencia por línea; ignora -r, -c, --index-url; marca -e como direct
pyproject.toml → [project] dependenciesPEP 621
pyproject.toml → [project] optional-dependenciesTodos 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-compile ni poetry lock por 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.py con install_requires computado en Python: es código arbitrario, no un manifest declarativo.
  • Solo Python. Para el resto del árbol de dependencias → security-audit.

Dependencias

DependenciaCómo instalarRequerida u opcional
python>=3.11viene con el SOrequerida (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.txt

Download now (ZIP)

Does 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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.