Desarrollo
Probar el cookiecutter localmente
pip install -e .[init]
mkdir /tmp/test_scaffold && cd /tmp/test_scaffold
basekit init --no-input \
--extra-context project_name="TestApi" \
--extra-context orm=sqlalchemy \
--extra-context database=postgres
cd testapi
cp .env.example .env
docker compose up --build
Probar la skill (Claude Code)
Luego pide: "Usa la skill fastapi-basekit-crud para crear el recurso Foo con CRUD completo."
Modificar templates
Templates están en fastapi_basekit/templates/project/. Variables vía Jinja: {{ cookiecutter.X }}.
Whitespace control en Jinja
Usa {%- if %} (con dash) para chomp newline previo, NUNCA {%- if -%} ni {%- else -%} antes de líneas indentadas — strippea la indentación y rompe el código Python generado.
Hooks
hooks/pre_gen_project.py — valida inputs antes de generar.
hooks/post_gen_project.py — limpia archivos no usados (alembic si beanie, docker si opt-out).
Build docs
pip install -e .[docs]
mkdocs serve # http://localhost:8001
mkdocs build # site/ estático
mkdocs gh-deploy # publica a GitHub Pages
Versionado de docs (mike)
CI/CD
.github/workflows/:
- tests.yml — pytest + lint en PR
- docs.yml — push a main con cambios de docs → deploy alias dev (preview)
- publish.yml — tag v* push → PyPI + docs versionadas (mike alias X.Y + latest). Manual dispatch permite togglear pypi y deploy_docs independientes.
Release flow
Tres caminos según qué publicar:
Release completo (PyPI + docs) — un solo comando
make release V=0.3.0 # explícito
make release BUMP=patch # 0.2.1 → 0.2.2
make release BUMP=minor # 0.2.1 → 0.3.0
make release BUMP=major # 0.2.1 → 1.0.0
make release-dry V=0.3.0 # preview sin escribir
scripts/release.py orchesta:
- Valida semver + working tree limpio + tag no existe
- Bumpea version en
pyproject.toml,plugin.json,marketplace.json - Prepend stub a
CHANGELOG.md - Commit
chore: release vX.Y.Z - Tag anotado
vX.Y.Z - Push branch + tag (
--follow-tags) - Imprime URLs para monitorear
Tag v* dispara publish.yml en GitHub Actions:
- Build wheel + sdist
- Publica PyPI (OIDC trusted publishing)
mike deploy 0.3 latest→ docs versionadas + aliaslatestmike set-default latest→ root URL apunta a último
publish.yml corre en cada v* tag:
1. Build wheel + sdist
2. Publica PyPI (OIDC trusted publishing)
3. mike deploy 0.3 latest → docs versionadas + alias latest
4. mike set-default latest → URL raíz redirige a último
URLs resultantes:
| URL | Apunta a |
|---|---|
https://mundobien2025.github.io/fastapi-basekit/ |
última (latest alias) |
https://mundobien2025.github.io/fastapi-basekit/0.3/ |
pin a esa versión |
https://mundobien2025.github.io/fastapi-basekit/dev/ |
preview de main |
PyPI sin tocar docs
Bumpea + commit + push (sin tag) + dispatcha publish.yml con pypi=true deploy_docs=false. Útil para patches internos que no cambian docs.
Docs sin tocar PyPI
Bumpea + commit + push + dispatcha con pypi=false deploy_docs=true. Útil para fixes de typos / mejoras de docs sin nueva versión paquete.
Auto-preview de main (dev alias)
docs.yml corre en cada push a main que toque docs/, mkdocs.yml, fastapi_basekit/. Despliega dev sin tocar latest. URL: mundobien2025.github.io/fastapi-basekit/dev/.
Bootstrap inicial (una sola vez)
# 1. Crea gh-pages + primer deploy versionado local
make docs-deploy-version
# 2. GitHub repo → Settings → Pages → Source: gh-pages branch / (root)
# 3. GitHub repo → Settings → Actions → General → Workflow permissions: Read and write
# 4. Configura PyPI Trusted Publishing:
# - PyPI → Account → Publishing → Add pending publisher
# - Owner: mundobien2025
# - Repo: fastapi-basekit
# - Workflow: publish.yml
# - Environment: pypi
Después: make release y todo automático.
Versionado de docs (mike)
mike list # versiones publicadas
mike delete 0.1 # remueve vieja
mike alias 0.3 stable # alias custom
mike set-default latest # cambia URL raíz
Debug del CLI
Probar templates en CI
.github/workflows/template-smoke.yml: