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
- 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★ 098% 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-deps-pinningSkill
- 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 146
No formatea: No invoca black ni ruff format.
≈ “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-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 script | shell · file_read |
| Qué toca | Lee 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 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.
--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 pushcon 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 JSONExit 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ódigo | Qué detecta | Por qué importa |
PARITY-NO-CI | Herramienta declarada que ningún workflow ejecuta | El gate no existe donde importa: nada impide que el código roto entre a main |
PARITY-NO-CONFIG | El CI ejecuta una herramienta que el repo no declara | Config implícita: el dev no puede reproducir en local lo que el CI exige |
PARITY-CONFLICT | Dos 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-ABSENT | Existe .pre-commit-config.yaml pero el hook local no está instalado | El 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-GATE | Hay .py y ningún linter declarado ni en CI | Superficie 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:
| Regla | Por qué no se auto-corrige |
F841 | Variable asignada y nunca usada — puede ser un bug real, no basura |
E741 | Nombre ambiguo (l, I, O) — renombrar es decisión de diseño |
E402 | Import fuera del top — a veces es intencional (side-effects, sys.path) |
E501 | Línea demasiado larga — la arregla el formateador, no el linter |
S110 / S112 | try-except-pass / continue — silenciar excepciones puede ocultar fallos |
C901 | Complejidad excesiva — exige refactor, no un fix |
B008 | Llamada 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
blackniruff format. Reporta el conflicto si hay dos formateadores, pero la decisión de cuál usar es del proyecto. - No instala nada. Si falta
ruffo el hook depre-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 unMakefileo un script propio puede no detectarse. Falso negativo posible enPARITY-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
| Dependencia | Cómo instalar | Requerida u opcional |
python>=3.11 | viene con el SO | requerida (usa tomllib) |
git | — | opcional (sin git analiza todo el árbol) |
ruff | pip install ruff | opcional — capa 2; degrada con aviso |
pre-commit | pip install pre-commit | opcional — 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-onlysobre lo staged (rápido, < 2 s)pre-push-guard→ análisis completo sobre el diff vsorigin/<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.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
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.

