Convenciones para estructurar proyectos FastAPI separando lógica de negocio, persistencia y servicios externos. Pragmático, sin Clean Architecture purista. Listo para Cursor, Claude Code, Codex, OpenCode, Continue, Aider, Cline / Roo Code, Windsurf y cualquier asistente que acepte system prompt.
Cubre: routers/Depends/lifespan, casos de uso, repositorios (SQLAlchemy o PyMongo async), schemas Pydantic, Celery 5.4, auth Clerk JWT RS256 + API keys SHA-256, testing con dependency_overrides, mapeo de excepciones de dominio a HTTP.
Instalá la skill con el CLI de skills.sh (documentación; repo del CLI: vercel-labs/skills):
# Instalar en el agente que detecte el CLI
npx skills add fulit103/fastapi-clean
# Varios agentes a la vez (Claude Code, Cursor, Codex, etc.)
npx skills add fulit103/fastapi-clean -a claude-code -a cursor -a codex
# Global (disponible en todos tus proyectos)
npx skills add fulit103/fastapi-clean -gDesde un clon local del repo:
cd /ruta/a/fastapi-clean/
npx skills add . --list
npx skills add . -a cursorfastapi-clean/
├── SKILL.md # Skill (skills.sh, Agent Skills spec)
├── cursor-rule/
│ └── fastapi-clean-architecture.mdc # Regla Cursor (.mdc con globs)
├── README.md # Este archivo
├── LICENSE # MIT
├── references/
│ ├── multi_subagent_workflow.md # Modo multi-subagent + contrato compartido
│ ├── celery_5_4.md # Tasks Celery 5.4 idempotentes y resilientes
│ ├── pymongo_async.md # AsyncMongoClient + repos por Protocol
│ ├── clerk_jwt.md # Verificación JWT RS256 + AuthenticatedPrincipal
│ ├── api_keys_sha256.md # secrets.token_urlsafe + SHA-256/HMAC + compare_digest
│ ├── testing.md # dependency_overrides + fakes de Protocol
│ └── error_handling.md # Excepciones de dominio → HTTP handlers
└── assets/
├── domain_entity_template.py # dataclass(frozen=True) + invariantes
├── port_template.py # Protocol del repositorio
├── use_case_template.py # Use case con __init__(repo) + execute(command)
├── pydantic_schemas_template.py # Create / Update / Response + to_command()
├── sqlalchemy_repository_template.py # Repo async + mappers _to_domain/_to_orm
├── mongo_repository_template.py # Repo async + mappers _to_domain/_to_document
├── router_template.py # APIRouter delgado con response_model
├── deps_template.py # Providers: db, repo, use case
├── lifespan_template.py # AsyncMongoClient + ping + close
├── celery_task_template.py # Task con autoretry + asyncio.run
└── settings_template.py # BaseSettings + @lru_cache get_settings()
Cursor lee reglas desde .cursor/rules/*.mdc (recomendado) o un .cursorrules en la raíz.
Opción A — Como regla .mdc (recomendado):
- En tu proyecto FastAPI, crea la carpeta
.cursor/rules/si no existe. - Copia
cursor-rule/fastapi-clean-architecture.mdca.cursor/rules/fastapi-clean-architecture.mdc. - (Opcional) copia también las referencias para poder linkearlas:
.cursor/rules/ ├── fastapi-clean-architecture.mdc └── fastapi-clean-refs/ ├── multi_subagent_workflow.md ├── celery_5_4.md ├── pymongo_async.md ├── clerk_jwt.md ├── api_keys_sha256.md ├── testing.md └── error_handling.md - Reinicia Cursor (o recarga la ventana). La regla se activará automáticamente cuando trabajes en archivos que matcheen los
globs(app/**,api/**,modules/**,use_cases/**,repositories/**,routers/**,worker*.py,celery*.py).
Opción B — Como .cursorrules en la raíz:
- Copia el contenido de
SKILL.md(ocursor-rule/fastapi-clean-architecture.mdc) a.cursorrulesen la raíz del proyecto. - Eliminá el frontmatter YAML (las líneas entre
---al inicio). - Cursor lo aplicará a todo el proyecto.
Tip: cuando le pidas a Cursor crear un módulo nuevo, mencionalo explícitamente: "Crea el módulo users con User entidad, CreateUser y GetUserByClerkId use cases, repositorio Mongo, siguiendo las convenciones de fastapi-clean-architecture". La regla se carga sola, pero ser explícito ayuda al modelo a darle peso.
Claude Code lee instrucciones desde:
CLAUDE.mden la raíz del proyecto (instrucciones globales del repo).~/.claude/skills/<name>/SKILL.mdo.claude/skills/<name>/SKILL.md(skill estructurada).
Opción A — Skill instalada (recomendado, vía skills.sh):
npx skills add fulit103/fastapi-clean -a claude-codeEsto deja la skill en .claude/skills/fastapi-clean-architecture/SKILL.md y Claude Code la descubre automáticamente al disparar los triggers ("caso de uso", "router FastAPI", "clean architecture", etc.).
Opción B — Como CLAUDE.md del proyecto:
- Copia el contenido de
SKILL.mdaCLAUDE.mden la raíz del repo. - Eliminá el frontmatter YAML.
- (Opcional) copia las referencias a
docs/architecture/y mencionalas enCLAUDE.md:Para detalles, consulta
docs/architecture/celery_5_4.md,docs/architecture/pymongo_async.md, etc.
Claude Code descubre CLAUDE.md automáticamente al iniciar sesión.
Codex CLI lee desde ~/.codex/instructions.md o un context file pasado por flag.
npx skills add fulit103/fastapi-clean -a codexO manualmente:
- Copiá el contenido de
SKILL.mda~/.codex/instructions.md(sin el frontmatter YAML). - Codex usará esas instrucciones como system prompt en futuras sesiones.
Alternativa: pasalo como contexto en cada llamada con el flag de contexto que use tu versión de Codex CLI.
OpenCode soporta context files configurables en su settings. Verificá la versión actual:
opencode --helpPatrones típicos:
.opencode/rules/*.mden la raíz del proyecto.- Configuración global en
~/.opencode/config.yamlapuntando a archivos de rules.
Pasos:
- Crea
.opencode/rules/fastapi-clean-architecture.mdcon el contenido deSKILL.md(sin frontmatter). - (Opcional) copia las referencias a
.opencode/rules/fastapi-clean-refs/.
Si tu versión de OpenCode usa otro path, ajustá. Si no hay path estándar, copialos a CONVENTIONS.md o similar en la raíz y OpenCode los recogerá como contexto del proyecto.
Continue usa "rules" en ~/.continue/config.yaml o archivos del workspace.
- Crea
~/.continue/rules/fastapi-clean-architecture.mdcon el contenido deSKILL.md(sin frontmatter YAML). - Editá
~/.continue/config.yamly agregá la regla a la lista de rules activas:rules: - path: ~/.continue/rules/fastapi-clean-architecture.md
Aider lee de un archivo CONVENTIONS.md o de archivos que le pases con --read.
aider --read fastapi-clean/SKILL.md \
--read fastapi-clean/references/pymongo_async.md \
--read fastapi-clean/references/multi_subagent_workflow.md \
app/modules/users/O agregá el contenido de SKILL.md a CONVENTIONS.md en la raíz del repo y aider lo cargará automáticamente.
Cline lee .clinerules en la raíz del proyecto.
- Copia
SKILL.mda.clinerulesen la raíz. - Eliminá el frontmatter YAML.
Windsurf lee desde .windsurfrules en la raíz del proyecto.
- Copia
SKILL.mda.windsurfrulesen la raíz. - Eliminá el frontmatter YAML.
Si tu herramienta acepta cargar archivos como contexto del modelo:
- Carga
SKILL.mdcomo instrucciones del sistema o "rules". - Carga las referencias en
references/solo cuando el modelo las necesite (típicamente, las plantillas y el ejemplo end-to-end son útiles cuando vas a generar código nuevo).
Para no mantener el archivo en N copias, una opción cómoda:
- Mantené los archivos
.mden una carpetadocs/architecture/del repo (versionada en git). - En cada herramienta, creá solo un archivo de entrada que apunte a esos docs:
- Cursor:
.cursor/rules/fastapi-clean-architecture.mdccon un párrafo corto que diga "verdocs/architecture/SKILL.md" + las reglas clave inline. - Claude Code:
CLAUDE.mdcon "Sigo las convenciones endocs/architecture/SKILL.md". - Aider: agregá
docs/architecture/SKILL.mdaCONVENTIONS.mdo pasalo con--read.
- Cursor:
Así el contenido vive en un solo lugar versionado y cada herramienta lo descubre a su manera.
Sentite libre de editar los archivos para adaptarlos a tu equipo:
- Cambiar la estructura de carpetas si tu codebase usa otra convención (
app/<feature>/plano en lugar demodules/<feature>/{domain,application,infrastructure}). - Cambiar persistencia: si usás SQL exclusivamente, podés borrar
references/pymongo_async.mdy el template Mongo; si usás Mongo, borrar el template SQL. - Cambiar auth: si no usás Clerk, reemplazá
references/clerk_jwt.mdpor tu provider (Auth0, Cognito, custom). - Cambiar idioma: todo está en español (Rioplatense). Los términos técnicos quedan en inglés cuando son universales (Protocol, Repository, etc.).
- Quitar secciones que no apliquen (Celery si no usás colas, API keys si solo tenés Clerk).
El skill no es prescriptivo: es un punto de partida pragmático.
- CRUD plano sin reglas de negocio: un router con SQLModel +
response_modeles más simple. - Scripts ad-hoc o jobs únicos.
- Proofs of concept donde la velocidad importa más que la testabilidad.
- Equipos chicos en sprint inicial: aplicá el patrón cuando el dolor aparezca, no antes.
La regla de oro: el patrón paga cuando aparece un servicio externo, una segunda forma de disparar la misma lógica, o tests que duelen mantener. Antes de eso, suele ser overkill.
MIT — ver LICENSE.