Wiedii — Linters by Stack Policy
⚠️ Verificar versiones antes de usar — las versiones de paquetes (ESLint, ruff, PHPStan, etc.) pueden estar desactualizadas. Usar
bun info <paquete> versionpara npm omise ls-remote <herramienta>para herramientas. Ver politicas-core.
JavaScript / TypeScript
Instalar:
bun add -d eslint typescript-eslint @eslint/js prettier sort-package-json
eslint.config.mjs (flat config, ESM):
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.strict,
{ rules: { "no-console": "warn" } }
);
.prettierrc (or prettier key in package.json):
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
TypeScript: siempre activar strict mode en tsconfig.json:
{ "compilerOptions": { "strict": true } }
Python
Instalar via mise (versión exacta — verificar en mise-versions.jdx.dev):
mise use ruff@<version> mypy@<version>
pyproject.toml or ruff.toml:
[tool.ruff]
line-length = 100
select = ["E", "F", "I", "N", "W"]
Go
Instalar via mise (versión exacta — verificar en mise-versions.jdx.dev):
mise use golangci-lint@<version>
.golangci.yaml:
linters:
enable:
- errcheck
- gosimple
- govet
- ineffassign
- staticcheck
- unused
PHP
Instalar via mise:
mise use php@8.3
Herramientas de análisis y formato vía Composer (devDependencies del proyecto):
composer require --dev phpstan/phpstan friendsofphp/php-cs-fixer
phpstan.neon — análisis estático en nivel máximo:
parameters:
level: max
paths:
- src
checkMissingIterableValueType: false
.php-cs-fixer.php — formatter con reglas PSR-12:
<?php
$finder = PhpCsFixer\Finder::create()->in(__DIR__ . '/src');
return (new PhpCsFixer\Config())
->setRules([
'@PSR12' => true,
'array_syntax' => ['syntax' => 'short'],
'ordered_imports' => ['sort_algorithm' => 'alpha'],
'no_unused_imports' => true,
'trailing_comma_in_multiline' => true,
])
->setFinder($finder);
Integración en lefthook (pre-commit):
phpstan:
priority: 2
glob: '*.php'
run: mise exec -- php vendor/bin/phpstan analyse {staged_files} --no-progress
php-cs-fixer:
priority: 1
glob: '*.php'
run: mise exec -- php vendor/bin/php-cs-fixer fix {staged_files}
stage_fixed: true
Para proyectos Laravel se puede usar Laravel Pint (wrapper oficial de PHP CS Fixer) en lugar de PHP CS Fixer directamente:
composer require --dev laravel/pint. Pint viene preconfigurado con las convenciones de Laravel y simplifica la configuración.
CSS / Estilos
bun add -d stylelint stylelint-config-standard
TOML
Taplo formatea archivos .toml y se gestiona via mise. No tiene mecanismo extends ni soporte de config remota — la configuración es siempre local.
Estrategia Wiedii — dos capas
Capa 1 — hook centralizado en wiedii-configs/base.yaml (siempre activa):
El hook toml en base.yaml pasa las opciones directamente via --option. No requiere .taplo.toml en el proyecto — las opciones viven en un solo lugar y se propagan a todos los repos al hacer lefthook install:
toml:
priority: 1
glob: '*.toml'
run: mise exec -- taplo fmt --option align_entries=true --option indent_entries=true --option reorder_arrays=true --option reorder_keys=true {staged_files}
stage_fixed: true
Capa 2 — .taplo.toml por proyecto (opcional):
Solo necesario si el proyecto usa taplo fuera del hook: extensión de VS Code (formato al guardar), taplo fmt manual, o CI que invoca taplo directamente sin lefthook. El hook de Capa 1 en wiedii-configs/base.yaml ya pasa las opciones correctas via --option — no se necesita el archivo para que los commits funcionen.
# .taplo.toml — agregar solo si se usa taplo fuera del hook lefthook
[formatting]
align_entries = true
indent_entries = true
reorder_arrays = true
reorder_keys = true
Taplo lo descubre automáticamente desde el directorio de trabajo; los --option del hook sobreescriben cualquier opción divergente.
Shell / Docker
Gestionados via mise (shfmt, shellcheck, hadolint) — sin configuración adicional más allá de mise.toml.