agentleFS
vladimiracunadev-createvladimiracunadev-create/claude-skills-toolkit/skills/python-lint-guard/SKILL.md

python-lint-guard

Skill1 starsChanged 9 days agoMITView on GitHub

Gate de lint Python antes de commit/push, con control de PARIDAD toolchain — compara lo que el repo DECLARA (pyproject, ruff.toml, setup.cfg, .flake8, tox.ini, .pre-commit-config.yaml) contra lo que el CI REALMENTE ejecuta (.github/workflows), y detecta el caso que más commits de arreglo produce, el gate declarado cuyo hook local nunca se instaló. Si `ruff` está disponible, separa las violaciones MECÁNICAS (auto-corregibles) de las que exigen CRITERIO humano — nunca aplica `--fix` a ciegas sobre F841 o E402. Úsalo cuando el usuario diga "arregla el lint de Python", "corrige ruff", "por qué falla el lint en CI", "black rompió el CI", "valida los .py antes de pushear", o proactivamente después de editar cualquier `.py`. Trabaja sobre `Path.cwd()` — funciona en cualquier repo.

  • Installs packages
  • Commits and pushes

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 formatea: No invoca black ni ruff format.

    line 146

≈ “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-lint-guard

El gemelo Python de md-lint-fix: el gate que faltaba en la cadena de guardias del toolkit.

Alcance y permisos

Capacidades del scriptshell · file_read
Qué tocaLee la configuración de lint que el repo declara e invoca el linter que corresponda (ruff, flake8).
Qué nunca toca--fix nunca toca F841, E402 ni S110: borrar el síntoma puede borrar el bug.
Herramientas retiradasWebFetch, 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.

--fix reescribe código.


Por qué existe

Un .py modificado atravesaba pre-commit-guard y pre-push-guard sin lint. Los dos guards encadenaban yaml-control + md-lint-fix + pytest, y ninguno miraba el estilo del Python. El resultado observable son los commits que solo existen para apagar un CI en rojo: fix(lint): ruff F401/I001, style: aplicar black para pasar CI, fix: wrap strings for ruff.

Pero este skill no es un wrapper de ruff. Correr el linter es la parte fácil y ya la hace el CI. Su aporte propio es la capa que ninguna herramienta cubre: la paridad entre lo declarado y lo ejecutado.


Cuándo invocar este skill

Triggers explícitos:

  • "arregla el lint de Python"
  • "corrige los errores de ruff"
  • "por qué falla el lint en CI"
  • "black rompió el CI"
  • "valida los .py antes de pushear"
  • "fix python lint"

Triggers proactivos:

  • Después de editar cualquier .py
  • Antes de git commit / git push con Python en el diff
  • Cuando el CI falla en un job de lint y no está claro por qué en local pasaba

Cómo se invoca

python ~/.claude/skills/python-lint-guard/python_lint_guard.py                # diff vs git
python ~/.claude/skills/python-lint-guard/python_lint_guard.py --all          # todos los .py
python ~/.claude/skills/python-lint-guard/python_lint_guard.py --fix          # auto-fix del set mecánico
python ~/.claude/skills/python-lint-guard/python_lint_guard.py --parity-only  # solo paridad, sin ruff
python ~/.claude/skills/python-lint-guard/python_lint_guard.py --json         # salida JSON

Exit code 0 si no hay errores, 1 si hay algo que bloquea commit/push.


Capa 1 — Paridad de toolchain (núcleo, stdlib)

Cruza dos inventarios y reporta cuatro desalineaciones:

CódigoQué detectaPor qué importa
PARITY-NO-CIHerramienta declarada que ningún workflow ejecutaEl gate no existe donde importa: nada impide que el código roto entre a main
PARITY-NO-CONFIGEl CI ejecuta una herramienta que el repo no declaraConfig implícita: el dev no puede reproducir en local lo que el CI exige
PARITY-CONFLICTDos herramientas con el mismo rol (dos formateadores, dos linters)Se pisan: cada una reescribe lo que la otra dejó, generando commits de ida y vuelta
PARITY-HOOK-ABSENTExiste .pre-commit-config.yaml pero el hook local no está instaladoEl caso más caro: el gate existe en el papel, no en la máquina. Cada violación se descubre en CI y cuesta un commit extra
PARITY-NO-GATEHay .py y ningún linter declarado ni en CISuperficie sin cubrir

Fuentes de declaración que lee: pyproject.toml ([tool.*] y dependencias), ruff.toml, .ruff.toml, setup.cfg, .flake8, tox.ini, .pre-commit-config.yaml. Fuente de ejecución: .github/workflows/*.y*ml, mirando solo líneas run: / uses: para no confundir un comentario o el nombre de un job con una ejecución real.

Herramientas reconocidas y su rol: ruff (linter+formatter), black, autopep8, yapf (formatter), flake8, pylint (linter), isort (import-sorter), mypy (type-checker).


Capa 2 — Violaciones (opt-in, requiere ruff)

Si ruff no está instalado, esta capa se salta con un aviso RUFF-ABSENT y la capa de paridad ya se ejecutó igual. Nunca falla por ausencia.

La aportación aquí es la separación en dos grupos:

Mecánicas — se corrigen sin criterio humano, y son las únicas que toca --fix:

I001 · F401 · UP006 · UP035 · W291 · W293 · W391 · RUF100 · COM812 · Q000

Requieren criterio — se reportan, nunca se auto-corrigen:

ReglaPor qué no se auto-corrige
F841Variable asignada y nunca usada — puede ser un bug real, no basura
E741Nombre ambiguo (l, I, O) — renombrar es decisión de diseño
E402Import fuera del top — a veces es intencional (side-effects, sys.path)
E501Línea demasiado larga — la arregla el formateador, no el linter
S110 / S112try-except-pass / continue — silenciar excepciones puede ocultar fallos
C901Complejidad excesiva — exige refactor, no un fix
B008Llamada en el default de un argumento — semántica, no estilo

--fix invoca ruff check --select <set-mecánico> --fix. Nunca un --fix global: eso es exactamente lo que borra la evidencia de un bug al eliminar la variable que lo delataba.


Qué NO hace / limitaciones

  • No formatea. No invoca black ni ruff format. Reporta el conflicto si hay dos formateadores, pero la decisión de cuál usar es del proyecto.
  • No instala nada. Si falta ruff o el hook de pre-commit, lo dice y da el comando; no lo ejecuta por su cuenta.
  • La detección en workflows es textual, no semántica: un run: que invoque el linter a través de un Makefile o un script propio puede no detectarse. Falso negativo posible en PARITY-NO-CI — nunca falso positivo silencioso.
  • No juzga la configuración del linter (qué reglas activar es del proyecto).
  • Solo Python. Para YAML → yaml-control; para Markdown → md-lint-fix.

Dependencias

DependenciaCómo instalarRequerida u opcional
python>=3.11viene con el SOrequerida (usa tomllib)
git—opcional (sin git analiza todo el árbol)
ruffpip install ruffopcional — capa 2; degrada con aviso
pre-commitpip install pre-commitopcional — solo para aplicar la recomendación

Integración con los guards

Ambos guards del toolkit lo invocan automáticamente cuando hay .py en el diff:

  • pre-commit-guard → --parity-only sobre lo staged (rápido, < 2 s)
  • pre-push-guard → análisis completo sobre el diff vs origin/<branch>

Si el skill no está instalado, ambos guards lo saltan con ⊘ y siguen.


Ejemplo de salida

python-lint-guard — repo: C:\dev\social-bot-scheduler
  ficheros .py en scope: 47

Toolchain declarado vs. ejecutado en CI
  ---------------------------------------------------------------------
  herramienta   rol               declarado en             CI
  black         formatter         .pre-commit-config.yaml  ci-cd.yml
  flake8        linter            .pre-commit-config.yaml  ci-cd.yml
  mypy          type-checker      pyproject.toml           ci-cd.yml

ERRORES
  ✗ [PARITY-HOOK-ABSENT] .pre-commit-config.yaml existe pero el hook local NO está instalado
      → instálalo con `pre-commit install` — sin él el linter solo corre en CI
        y cada violación cuesta un commit extra de arreglo

❌ Hay errores que bloquean commit/push.

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.