Andamio
Plantillas de andamiaje de proyecto y generación de boilerplate para tipos de proyecto comunes con valores predeterminados de mejores prácticas.
Árbol de Decisión de Tipo de Proyecto
¿Qué estás creando?
│
├─ API / Servicio Backend
│ ├─ API REST
│ │ ├─ Python → FastAPI (async, documentación OpenAPI automática)
│ │ ├─ Node.js → Express o Fastify (Fastify para rendimiento)
│ │ ├─ Go → Gin (ergonómico) o Echo (rico en middleware)
│ │ └─ Rust → Axum (ecosistema tower, async-first)
│ ├─ API GraphQL
│ │ ├─ Python → Strawberry + FastAPI
│ │ ├─ Node.js → Apollo Server o Pothos + Yoga
│ │ ├─ Go → gqlgen (code-first)
│ │ └─ Rust → async-graphql + Axum
│ └─ Servicio gRPC
│ ├─ Python → grpcio + protobuf
│ ├─ Go → google.golang.org/grpc
│ └─ Rust → tonic
│
├─ Aplicación Web
│ ├─ Full-stack con SSR
│ │ ├─ Ecosistema React → Next.js 14+ (App Router)
│ │ ├─ Ecosistema Vue → Nuxt 3
│ │ ├─ Ecosistema Svelte → SvelteKit
│ │ └─ Contenido intensivo / multi-framework → Astro
│ ├─ SPA (solo cliente)
│ │ ├─ React → Vite + React + React Router
│ │ ├─ Vue → Vite + Vue + Vue Router
│ │ └─ Svelte → Vite + Svelte + svelte-routing
│ └─ Sitio Estático
│ ├─ Blog / documentación → Astro o VitePress
│ └─ Marketing / landing → Astro o Next.js (exportación estática)
│
├─ Herramienta CLI
│ ├─ Python → Typer (simple) o Click (complejo)
│ ├─ Node.js → Commander + Inquirer
│ ├─ Go → Cobra + Viper
│ └─ Rust → Clap (API derive)
│
├─ Biblioteca / Paquete
│ ├─ Paquete npm → TypeScript + tsup + Vitest
│ ├─ Paquete PyPI → uv + pyproject.toml + pytest
│ ├─ Módulo Go → go mod init + go test
│ └─ Caja Rust → cargo init --lib + cargo test
│
└─ Monorepositorio
├─ JavaScript/TypeScript → Turborepo + pnpm workspaces
├─ JS Full-stack → Nx
├─ Go → Espacios de trabajo Go (go.work)
├─ Rust → Espacios de trabajo Cargo
└─ Python → Espacios de trabajo uv o hatch
Matriz de Selección de Stack
| Tipo de Proyecto | Lenguaje | Framework | Base de Datos | ORM/Query | Destino de Despliegue |
|---|
| API REST | Python | FastAPI | PostgreSQL | SQLAlchemy + Alembic | Docker / AWS ECS |
| API REST | Node.js | Fastify | PostgreSQL | Prisma o Drizzle | Docker / Vercel |
| API REST | Go | Gin | PostgreSQL | sqlx (raw) o GORM | Docker / Fly.io |
| API REST | Rust | Axum | PostgreSQL | sqlx | Docker / Fly.io |
| Aplicación Web | TypeScript | Next.js 14+ | PostgreSQL | Prisma o Drizzle | Vercel / Docker |
| Aplicación Web | TypeScript | Nuxt 3 | PostgreSQL | Prisma | Vercel / Netlify |
| Aplicación Web | TypeScript | Astro | SQLite / ninguno | Drizzle | Cloudflare / Netlify |
| Herramienta CLI | Python | Typer | SQLite | sqlite3 stdlib | PyPI |
| Herramienta CLI | Go | Cobra | SQLite / BoltDB | sqlx | Lanzamientos de GitHub |
| Herramienta CLI | Rust | Clap | SQLite | rusqlite | crates.io |
| Biblioteca | TypeScript | tsup | n/a | n/a | npm |
| Biblioteca | Python | hatch/uv | n/a | n/a | PyPI |
Comandos Rápidos de Andamiaje
Python (API)
mkdir my-api && cd my-api
uv init --python 3.12
uv add fastapi uvicorn sqlalchemy alembic psycopg2-binary pydantic-settings
uv add --dev pytest pytest-asyncio httpx ruff mypy
Node.js (Aplicación Web)
npx create-next-app@latest my-app --typescript --tailwind --eslint --app --src-dir --import-alias "@/*"
npm create vite@latest my-app -- --template react-ts
Go (API)
mkdir my-api && cd my-api
go mod init github.com/user/my-api
go get github.com/gin-gonic/gin
go get github.com/jmoiron/sqlx
go get github.com/lib/pq
Rust (CLI)
cargo init my-cli
cd my-cli
cargo add clap --features derive
cargo add serde --features derive
cargo add anyhow tokio --features tokio/full
Monorepositorio (Turborepo)
npx create-turbo@latest my-monorepo
mkdir my-monorepo && cd my-monorepo
npm init -y
npm install turbo --save-dev
mkdir -p apps/web apps/api packages/shared
Plantilla de Proyecto API
Estructura de Directorios (Ejemplo FastAPI)
my-api/
├── src/
│ └── my_api/
│ ├── __init__.py
│ ├── main.py # Aplicación FastAPI, lifespan, middleware
│ ├── config.py # Configuración pydantic-settings
│ ├── database.py # Motor SQLAlchemy, sesión
│ ├── dependencies.py # Dependencias compartidas de FastAPI
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── health.py # Endpoint de verificación de salud
│ │ └── users.py # Endpoints CRUD de usuarios
│ ├── models/
│ │ ├── __init__.py
│ │ └── user.py # Modelos SQLAlchemy
│ ├── schemas/
│ │ ├── __init__.py
│ │ └── user.py # Esquemas Pydantic de solicitud/respuesta
│ └── services/
│ ├── __init__.py
│ └── user.py # Lógica de negocio
├── alembic/
│ ├── alembic.ini
│ ├── env.py
│ └── versions/
├── tests/
│ ├── conftest.py # Fixtures: base de datos de prueba, cliente, fábricas
│ ├── test_health.py
│ └── test_users.py
├── pyproject.toml
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── .gitignore
└── .dockerignore
Estructura de Directorios (Ejemplo Express/Fastify)
my-api/
├── src/
│ ├── index.ts # Punto de entrada, inicio del servidor
│ ├── app.ts # Configuración de la aplicación Express/Fastify
│ ├── config.ts # Configuración de entorno con validación zod
│ ├── database.ts # Cliente Prisma o configuración Drizzle
│ ├── middleware/
│ │ ├── auth.ts
│ │ ├── error-handler.ts
│ │ └── request-logger.ts
│ ├── routes/
│ │ ├── health.ts
│ │ └── users.ts
│ ├── services/
│ │ └── user.service.ts
│ └── types/
│ └── index.ts
├── prisma/
│ └── schema.prisma
├── tests/
│ ├── setup.ts
│ └── routes/
│ └── users.test.ts
├── package.json
├── tsconfig.json
├── Dockerfile
├── docker-compose.yml
├── .env.example
└── .gitignore
Plantilla de Proyecto de Aplicación Web
Estructura de Directorios (Next.js App Router)
my-app/
├── src/
│ ├── app/
│ │ ├── layout.tsx # Layout raíz
│ │ ├── page.tsx # Página de inicio
│ │ ├── loading.tsx # UI de carga global
│ │ ├── error.tsx # Límite de error global
│ │ ├── not-found.tsx # Página 404
│ │ ├── globals.css # Estilos globales + Tailwind
│ │ ├── (auth)/
│ │ │ ├── login/page.tsx
│ │ │ └── register/page.tsx
│ │ ├── dashboard/
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ │ └── api/
│ │ └── health/route.ts
│ ├── components/
│ │ ├── ui/ # Primitivas reutilizables
│ │ └── features/ # Componentes específicos de funcionalidades
│ ├── lib/
│ │ ├── db.ts # Cliente de base de datos
│ │ ├── auth.ts # Ayudantes de autenticación
│ │ └── utils.ts # Utilidades compartidas
│ └── types/
│ └── index.ts
├── public/
│ └── favicon.ico
├── tests/
│ ├── setup.ts
│ └── components/
├── next.config.ts
├── tailwind.config.ts
├── tsconfig.json
├── package.json
├── .env.local.example
└── .gitignore
Plantilla de Proyecto de Herramienta CLI
Estructura de Directorios (Python / Typer)
my-cli/
├── src/
│ └── my_cli/
│ ├── __init__.py
│ ├── __main__.py # punto de entrada python -m my_cli
│ ├── cli.py # Aplicación Typer, grupos de comandos
│ ├── commands/
│ │ ├── __init__.py
│ │ ├── init.py # my-cli init
│ │ └── run.py # my-cli run
│ ├── config.py # Carga de archivo de configuración (TOML/YAML)
│ └── utils.py
├── tests/
│ ├── conftest.py
│ └── test_commands.py
├── pyproject.toml # punto de entrada [project.scripts]
├── .gitignore
└── README.md
Estructura de Directorios (Go / Cobra)
my-cli/
├── cmd/
│ ├── root.go # Comando raíz, banderas globales
│ ├── init.go # my-cli init
│ └── run.go # my-cli run
├── internal/
│ ├── config/
│ │ └── config.go # Carga de configuración Viper
│ └── runner/
│ └── runner.go # Lógica central
├── main.go # Punto de entrada, llama a cmd.Execute()
├── go.mod
├── go.sum
├── Makefile
└── .gitignore
Plantilla de Proyecto de Biblioteca
Estructura de Directorios (Paquete npm)
my-lib/
├── src/
│ ├── index.ts # Exportaciones de la API pública
│ ├── core.ts # Implementación central
│ └── types.ts # Definiciones de tipos públicos
├── tests/
│ └── core.test.ts
├── package.json # "type": "module", mapa de exportaciones
├── tsconfig.json # declaration: true, declarationMap: true
├── tsup.config.ts # Configuración de compilación: cjs + esm
├── vitest.config.ts
├── .npmignore
├── .gitignore
├── CHANGELOG.md
└── LICENSE
Estructura de Directorios (Paquete PyPI)
my-lib/
├── src/
│ └── my_lib/
│ ├── __init__.py # API pública, __version__
│ ├── core.py
│ └── py.typed # Marcador PEP 561
├── tests/
│ ├── conftest.py
│ └── test_core.py
├── pyproject.toml # Sistema de compilación, metadatos, configuración de herramientas
├── .gitignore
├── CHANGELOG.md
└── LICENSE
Plantilla de Monorepositorio
Turborepo + pnpm Workspaces
my-monorepo/
├── apps/
│ ├── web/ # Frontend Next.js
│ │ ├── src/
│ │ ├── package.json # depende de @repo/shared
│ │ └── tsconfig.json # extiende ../../tsconfig.base.json
│ └── api/ # Backend Fastify
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── packages/
│ ├── shared/ # Tipos, utilidades, validadores compartidos
│ │ ├── src/
│ │ ├── package.json # "name": "@repo/shared"
│ │ └── tsconfig.json
│ ├── ui/ # Componentes React compartidos
│ │ ├── src/
│ │ └── package.json # "name": "@repo/ui"
│ └── config/ # Configuraciones compartidas
│ ├── eslint/
│ ├── typescript/
│ └── package.json
├── turbo.json # Pipeline: build, test, lint
├── pnpm-workspace.yaml # packages: ["apps/*", "packages/*"]
├── package.json # DevDeps raíz: turbo
├── tsconfig.base.json # Configuración TypeScript compartida
├── .gitignore
└── .npmrc
Espacios de Trabajo Cargo (Rust)
my-workspace/
├── crates/
│ ├── my-core/ # Biblioteca central
│ │ ├── src/lib.rs
│ │ └── Cargo.toml
│ ├── my-cli/ # Binario CLI
│ │ ├── src/main.rs
│ │ └── Cargo.toml # depende de my-core
│ └── my-server/ # Binario API
│ ├── src/main.rs
│ └── Cargo.toml
├── Cargo.toml # [workspace] members = ["crates/*"]
├── Cargo.lock
├── .gitignore
└── rust-toolchain.toml
Lista de Verificación de Adiciones Comunes
¿Configuración del proyecto completa? Añade estas:
│
├─ Control de Versiones
│ ├─ [ ] .gitignore (específico del lenguaje)
│ ├─ [ ] .gitattributes (finales de línea, archivos binarios)
│ └─ [ ] Reglas de protección de ramas
│
├─ CI/CD
│ ├─ [ ] Flujo de trabajo de GitHub Actions (probar en PR, desplegar en merge)
│ ├─ [ ] Pruebas matriciales (OS, versiones de runtime)
│ └─ [ ] Automatización de lanzamientos
│
├─ Docker
│ ├─ [ ] Dockerfile de múltiples etapas
│ ├─ [ ] docker-compose.yml (aplicación + base de datos + caché)
│ ├─ [ ] .dockerignore
│ └─ [ ] Endpoint de verificación de salud
│
├─ Calidad de Código
│ ├─ [ ] Linter (ESLint, Ruff, golangci-lint, Clippy)
│ ├─ [ ] Formateador (Prettier, Black/Ruff, gofmt, rustfmt)
│ ├─ [ ] Hooks de pre-commit (Husky, pre-commit)
│ └─ [ ] Verificación de tipos (TypeScript strict, mypy, go vet)
│
├─ Pruebas
│ ├─ [ ] Marco de pruebas configurado (Vitest, pytest, go test)
│ ├─ [ ] Informes de cobertura
│ ├─ [ ] Configuración de base de datos de prueba
│ └─ [ ] Pipeline de pruebas CI
│
├─ Editor
│ ├─ [ ] .editorconfig
│ ├─ [ ] .vscode/settings.json
│ └─ [ ] .vscode/extensions.json
│
└─ Documentación
├─ [ ] README.md (descripción del proyecto, configuración, uso)
├─ [ ] CONTRIBUTING.md
└─ [ ] Documentación de la API (OpenAPI, godoc, rustdoc)
Plantillas de Archivos de Configuración
.editorconfig (Universal)
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{py,rs}]
indent_size = 4
[*.go]
indent_style = tab
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
pyproject.toml (Python)
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.12"
[tool.ruff]
target-version = "py312"
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "SIM"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
[tool.mypy]
strict = true
tsconfig.json (TypeScript - Estricto)
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src"],
"exclude": ["node_modules", "dist"]
}
Errores Comunes
| Error | Por qué Ocurre | Prevención |
|---|
| .gitignore incorrecto para el lenguaje | Se usó una plantilla genérica, faltan entradas específicas del lenguaje | Usa gitignore.io o las plantillas de GitHub para tu stack |
| Se olvidó .env.example | Los miembros del equipo no saben qué vars de entorno se necesitan | Crea .env.example con cada var (valores vacíos) al inicio del proyecto |
| No se confirmó el archivo de bloqueo | Versiones de dependencias inconsistentes entre entornos | Confirma package-lock.json, uv.lock, go.sum, Cargo.lock |
| Puerto/host codificado en el código | Funciona localmente, se rompe en Docker/cloud | Siempre lee desde var de entorno con un valor predeterminado sensato |
| Pruebas acopladas a la base de datos real | Las pruebas fallan sin una DB en ejecución, la configuración de CI es compleja | Usa contenedores de prueba o SQLite en memoria para pruebas unitarias |
| Falta el endpoint de verificación de salud | El orquestador de despliegue no puede verificar la disponibilidad | Añade el endpoint /health que |