Saltar al contenido principal

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> version para npm o mise 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 --optionno 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.