Saltar al contenido principal

Stack Tecnológico de Wiedii

⚠️ Verificar versiones antes de usar — los números de versión de imágenes, runtimes y herramientas mencionados en esta nota pueden estar desactualizados. Siempre consultar la versión estable más reciente antes de usarlos en un proyecto. Ver politicas-core.

Esta nota define los lenguajes, runtimes y herramientas que Wiedii usa oficialmente. Cualquier tecnología fuera de esta lista requiere aprobación del Tech Lead antes de incorporarse a un proyecto. Ver gestion-herramientas-brew-mise para la política de instalación.


Lenguajes de programación

LenguajeUso principalNotas
GoServicios backend, CLIs, binarios compiladosPreferido para herramientas internas y servicios de alta performance
PHPAplicaciones web, APIs RESTProyectos legacy y nuevos proyectos web cuando aplica
JavaScript / TypeScriptFrontend, SSR, APIs Node, CLIs JSTypeScript siempre — nunca JS plano en código nuevo
PythonScripts, automatización, data, MLFastAPI para APIs Python

Lenguajes que NO usamos

LenguajeMotivo
JavaNo forma parte del stack de Wiedii
RubyNo forma parte del stack de Wiedii
RustNo es lenguaje de desarrollo en Wiedii — solo se usan herramientas escritas en Rust (bat, eza, fd, ripgrep, starship)
C / C++Sin proyectos activos

Herramientas escritas en Rust como bat, eza, fd, ripgrep, sd, gping y starship son parte del entorno de desarrollo estándar — pero como binarios de CLI, no como lenguaje de programación de los proyectos. Ver herramientas-rust.


Runtimes y entornos

TecnologíaRolVersion managerNotas
BunPackage managermisebun install, bun run, bun test — gestión de deps y scripts
Node.jsRuntime de ejecuciónmiseEl proceso que corre en producción y en Docker
GoRuntime + compiladormiseVersión por proyecto en mise.toml
PHPRuntime + FPMdev container (NO local)PHP no se instala en el host — se trabaja en un VS Code Dev Container. Ver nota abajo
PythonRuntimemiseVersión por proyecto en mise.toml

PHP no se instala localmente — se usa un VS Code Dev Container. A diferencia del resto del stack (Go/Node/Python por mise), PHP no va por mise en el host. Gestionar la versión de PHP por proyecto con mise en macOS implica recompilar PHP constantemente y arrastrar muchas dependencias del sistema (extensiones, libs) → alto costo de mantenimiento. En su lugar, cada proyecto PHP trae un .devcontainer/devcontainer.json y se desarrolla dentro del contenedor: PHP, Composer, las extensiones y el LSP corren ahí (el editor abre el repo dentro del dev container). La imagen base sigue la convención de docker (php:8.3-fpm-alpine). Por eso el LSP de PHP no se cablea en Claude Code (lo sirve el editor dentro del contenedor).

LSP de Go (gopls) y build tags — pasar los tags por .lsp.json. Claude Code arranca gopls para archivos .go. Por defecto corre sin los build tags del proyecto, así que en repos con archivos bajo //go:build <tag> (p. ej. //go:build e2e para tests de integración, o //go:build darwin por plataforma) gopls no resuelve el paquete y emite falsos No packages found for open file … (go list) en cada lectura/edición — aunque go vet -tags e2e y go test -tags e2e pasen limpio. Es ruido que puede inducir al agente a "arreglar" errores inexistentes. Solución: declarar los tags del repo en su .lsp.json (raíz), pasándolos a gopls por initializationOptions.build.buildFlags:

{
"go": {
"command": "gopls",
"initializationOptions": { "build.buildFlags": ["-tags=e2e"] },
"extensionToLanguage": { ".go": "go" }
}
}

Ajustar -tags=… a los build tags reales del repo (varios: -tags=integration,e2e). El plugin wiedii-dev trae su propio .lsp.json baseline que, según la documentación de plugins de Claude Code, debería activarse solo con instalar el plugin — pero se observó empíricamente que no ocurre de forma confiable en repos consumidores (squadlinx-frontend: el LSP del plugin nunca arrancó; causa raíz sin confirmar). El .lsp.json a nivel de repo (scaffoldeado por repo-setup) sigue siendo el mecanismo confiable, y es en todo caso necesario aquí — un baseline genérico de plugin nunca puede saber los build tags de un repo puntual. El binario gopls debe estar en el PATH. Ver repo-setup para el scaffolding del repo.

Bun como PM, Node.js como runtime — la distinción clave

Wiedii usa Bun exclusivamente como package manager (bun install, bun run, bun test, bun add) pero Node.js como runtime de ejecución en producción y en contenedores Docker.

Motivo principal: compatibilidad de librerías con bindings nativos — especialmente librerías de procesamiento de imágenes (sharp, canvas, etc.) que requieren el runtime de Node.js para funcionar correctamente.

Segundo motivo (entorno de CI): el motor JS de Bun usa instrucciones AVX que algunos runners con CPU antigua no soportan, y el build revienta con SIGILL / CPU lacks AVX support (el bun install sí corre; falla el build pesado). En ese caso se instala con Bun y se compila bajo Node con node --run. Ver docker → sección 16 "Caso especial — Bun no puede ejecutar el build".

# Desarrollo y CI: bun gestiona las deps y corre los scripts
bun install
bun run build
bun run dev

# Producción y Docker: Node.js ejecuta el artefacto compilado
node dist/index.js

Bun es el package manager estándar — nunca npm ni yarn como herramienta de desarrollo. La política completa está en politicas-core.


Infraestructura y plataformas

ÁreaTecnología
ContenedoresDocker (BuildKit)
Entorno localOrbStack — reemplaza Docker Desktop
CI/CDGitLab CI/CD
Registro de imágenesGitLab Container Registry
Gestión de reposGitLab (gitlab.wiedii.co)
Monorepo JS/TSNX

Testing por lenguaje

LenguajeUnit / IntegrationProperty-basedE2E
JS/TS (CLI)bun:testfast-check
JS/TS (web/API)Vitest (en evaluación)fast-checkPlaywright
Gotesting + testify
Pythonpytesthypothesis
PHPPHPUnit

Ver trofeo-testing para la metodología y distribución de esfuerzo. Ver bun-testing para el detalle de bun:test y sus patrones.


Linters y formatters

LenguajeLinterFormatter
JS/TSESLint (flat config) + TypeScript strictPrettier
Pythonruff (lint + format) + mypyruff format
Gogolangci-lintgofmt / goimports
PHPPHPStanPHP CS Fixer
TOMLtaplotaplo fmt
Shellshellcheckshfmt
Dockerhadolint

Ver linters para configuraciones exactas y políticas por stack.


Convenciones de código

ConvenciónReferencia
CommitsConventional Commits con emoji — commits
VersionadoSemVer — versioning
Nombres de reposTitle Case display / kebab-case path — gitlab-naming
Estructura de repos nuevosrepo-setup
Git workflowGit Flow — git-flow
Política de branchesbranch-protection

Imágenes Docker base por lenguaje

Para builds de producción, siempre usar imágenes Alpine o slim para reducir la superficie de ataque. Ver docker para patrones completos de multi-stage y cache.

LenguajeImagen de buildImagen de runtimeNota
Gogolang:1.24-alpinealpine:3.21 o scratch
JS/TSnode:22-alpine (con bun instalado)node:22-alpineBun instala deps, Node ejecuta
Pythonpython:3.12-slimpython:3.12-slim
PHPphp:8.3-fpm-alpinephp:8.3-fpm-alpine

JS/TS: la imagen base es node:22-alpine. Bun se instala en el build stage para gestionar dependencias (bun install). El runtime stage ejecuta con node — no con bun. Esto garantiza compatibilidad con librerías que requieren el runtime de Node.js.

Usuario de runtime por imagen — verificado contra Dockerfiles oficiales:

ImagenUsuarioUIDPre-existeAcción
golang:1.24-alpine + alpine:3.21app1001NoCrear manualmente
node:22-alpinenode1000Si, pero inactivoUSER node
python:3.12-slimapp1001NoCrear manualmente
php:8.3-fpm-alpinewww-data82SiUSER www-data + config pool
scratch (Go estático)65534No aplicaUSER 65534:65534

Referencias

  • politicas-core — reglas de desarrollo aplicables a todos los proyectos
  • herramientas-por-rol — qué instala cada rol del equipo
  • linters — configuración detallada de linters por stack
  • docker — buenas prácticas de build, multi-stage y multi-plataforma
  • trofeo-testing — metodología de testing por tipo de proyecto