name: lint-and-validate
description: Automatic multi-language quality control, linting, and static analysis.
Auto-detects project language and applies appropriate tooling.
Triggers on: lint, format, check, validate, types, static analysis.
Lint and Validate - Multi-Language
MANDATORY: Run appropriate validation tools after EVERY code change.
IMPORTANT: This skill auto-detects the project language and applies the correct linting stack.
🔍 Auto-Detección de Lenguaje
Detecta automáticamente el lenguaje del proyecto:
├── pyproject.toml / requirements.txt → Python (Ruff, mypy)
├── package.json → JavaScript/TypeScript (ESLint, tsc)
├── go.mod → Go (go fmt, golangci-lint)
├── Cargo.toml → Rust (cargo clippy, cargo fmt)
├── pom.xml / build.gradle → Java (Checkstyle)
├── *.csproj → C# (.NET format, StyleCop)
├── Gemfile → Ruby (RuboCop)
├── composer.json → PHP (PHP-CS-Fixer, PHPStan)
├── Package.swift → Swift (SwiftLint)
├── build.gradle.kts → Kotlin (ktlint)
└── CMakeLists.txt → C++ (clang-format)
📋 Herramientas por Lenguaje
Python
| Herramienta | Propósito | Comando |
|---|
| Ruff | Linting rápido | ruff check . --fix |
| Black | Formateo | black . |
| isort | Import sorting | isort . |
| MyPy | Tipos estáticos | mypy . |
| Bandit | Seguridad | bandit -r . -ll |
| Flake8 | Estilo PEP 8 | flake8 . |
ruff check . --fix && black . --check && mypy . && bandit -r . -ll
JavaScript / TypeScript
| Herramienta | Propósito | Comando |
|---|
| ESLint | Linting | npx eslint . --fix |
| Prettier | Formateo | npx prettier . --write |
| TypeScript | Tipos | npx tsc --noEmit |
| npm audit | Seguridad | npm audit --audit-level=high |
npx eslint . --fix && npx prettier . --check && npx tsc --noEmit
Go
| Herramienta | Propósito | Comando |
|---|
| go fmt | Formateo | go fmt ./... |
| go vet | Análisis estático | go vet ./... |
| golangci-lint | Linting completo | golangci-lint run ./... |
| staticcheck | Análisis estático | staticcheck ./... |
go fmt ./... && go vet ./... && golangci-lint run ./...
Rust
| Herramienta | Propósito | Comando |
|---|
| cargo fmt | Formateo | cargo fmt --check |
| cargo clippy | Linting | cargo clippy -- -D warnings |
| cargo test | Tests | cargo test |
| cargo audit | Seguridad | cargo audit |
cargo fmt --check && cargo clippy -- -D warnings && cargo test
Java
| Herramienta | Propósito | Comando |
|---|
| Checkstyle | Estilo de código | mvn checkstyle:check |
| SpotBugs | Análisis estático | mvn spotbugs:check |
| PMD | Análisis de código | mvn pmd:check |
| Google Java Format | Formateo | google-java-format -d . |
mvn checkstyle:check spotbugs:check pmd:check
C# / .NET
| Herramienta | Propósito | Comando |
|---|
| dotnet format | Formateo | dotnet format --verify-no-changes |
| dotnet build | Compilación | dotnet build --no-restore |
| StyleCopAnalyzers | Estilo | dotnet build (incluido) |
| Roslynator | Análisis | dotnet build |
dotnet format --verify-no-changes && dotnet build --no-restore
Ruby
| Herramienta | Propósito | Comando |
|---|
| RuboCop | Linting | rubocop -a |
| Brakeman | Seguridad | brakeman -w 1 |
| bundler-audit | Dependencias | bundler-audit |
rubocop -a && brakeman -w 1 && bundler-audit
PHP
| Herramienta | Propósito | Comando |
|---|
| PHP-CS-Fixer | Estilo | php-cs-fixer fix . |
| PHPStan | Análisis estático | phpstan analyse . |
| psalm | Análisis estático | psalm . |
| PHPUnit | Tests | phpunit |
php-cs-fixer fix . && phpstan analyse . --level=max
Swift
| Herramienta | Propósito | Comando |
|---|
| SwiftLint | Linting | swiftlint |
| SwiftFormat | Formateo | swiftformat . |
| swift build | Compilación | swift build |
swiftlint && swiftformat . && swift build
Kotlin
| Herramienta | Propósito | Comando |
|---|
| ktlint | Linting | ktlint . |
| detekt | Análisis estático | detekt . |
| kotlinc | Compilación | kotlinc -include-runtime -d app.jar |
ktlint . && detekt .
C / C++
| Herramienta | Propósito | Comando |
|---|
| clang-format | Formateo | clang-format -i *.cpp |
| cppcheck | Análisis estático | cppcheck . |
| clang-tidy | Linting | clang-tidy . |
clang-format -i *.cpp *.h && cppcheck . && clang-tidy .
🔄 Pipeline Universal
INPUT: Proyecto multi-lenguaje
├── Carpeta / archivo a validar
└── Auto-detección de lenguajes presentes
PROCESO:
1. Detectar lenguajes en el proyecto (glob *.{ext})
2. Para cada lenguaje:
a. Aplicar linting (dependencies/tooling check)
b. Aplicar formatting
c. Verificar tipos/análisis estático
3. Agregar warnings de security scan
4. Aggregate results
OUTPUT: Reporte de errores y warnings por lenguaje
📋 Decision Tree
¿Qué validación necesito?
├── Necesito verificartypes
│ ├── Python → mypy
│ ├── TypeScript → tsc --noEmit
│ ├── Go → go vet
│ ├── Rust → cargo clippy
│ ├── Java → mvn checkstyle:check
│ └── C# → dotnet build --no-restore
├── Necesito formatear código
│ ├── Python → black
│ ├── JS/TS → prettier
│ ├── Go → go fmt
│ ├── Rust → cargo fmt
│ ├── PHP → php-cs-fixer
│ ├── Swift → swiftformat
│ └── C++ → clang-format
└── Necesito verificar seguridad
├── Python → bandit
├── JS/TS → npm audit
├── Go → golangci-lint
├── Ruby → brakeman
└── PHP → phpstan
🔴 The Quality Loop
- Write/Edit Code
- Run Auto-Lint: Determinar lenguaje y ejecutar tools apropiadas
- Analyze Report: Revisar errores y warnings
- Fix & Repeat: No terminar hasta que esté limpio
🔴 Strict Rule: No code should be committed or reported as "done" without passing lint checks.
🔴 If no tool is configured: Check the project root for config files (.eslintrc, pyproject.toml, go.mod) and suggest/create appropriate configuration.
🛠️ Scripts
| Script | Propósito | Comando |
|---|
scripts/lint_runner.py | Ejecución multi-lenguaje | python scripts/lint_runner.py <project_path> |
scripts/type_coverage.py | Análisis de cobertura de tipos | python scripts/type_coverage.py <project_path> |
scripts/security_check.py | Escaneo de seguridad | python scripts/security_check.py <project_path> |
🚨 Ejemplo de Output
## Lint Results: /project
### Python (detected via pyproject.toml)
✅ Ruff passed
✅ Black formatted correctly
✅ MyPy: 0 errors, 0 warnings
### TypeScript (detected via package.json)
✅ ESLint passed
⚠️ Prettier: 2 files needs formatting (run with --write)
❌ TypeScript: 3 errors found
### Errors to fix:
[file1.ts:12] Type error: Argument of type 'string' is not assignable to parameter of type 'number'
[file2.ts:5] TS2304: Cannot find name 'Undefinec'
[app.ts:45] TS7006: Parameter 'userId' implicitly has an 'any' type
Should I fix these errors?
📋 Before Running Lint
| Check | Question |
|---|
| ✅ Language detected? | What language(s) is the project? |
| ✅ Tools available? | Are the lint tools installed? |
| ✅ Config exists? | Does the project have lint config? |
| ✅ Dependencies installed? | Did you run npm install / pip install / go mod download? |
Tip: If tools aren't installed, offer to install them or configure them.