v3.1.0
Release Notes — v3.1.0
Date: 2026-03-05
Summary
Template Quality Pass across all stacks and architectures. This release fixes real bugs discovered during manual walkthrough testing of all generated projects. No CLI commands, prompts, or extension points changed — only the generated template code.
What Changed
Bug Fixes
Java Spring Boot
| File | Fix |
|---|---|
mvc/application.yml |
Full rewrite — catastrophic YAML indentation cascade made every block nest inside the previous one |
mvc/StripeService.java |
UUID.fromString(userId) → userId (ID column is VARCHAR, not UUID) |
mvc/PaymentsController.java |
@AuthenticationPrincipal UserDetails → String userId to match what the JWT filter sets as principal |
mvc/SecurityConfig.java |
Added /api/health to permitAll() |
mvc/AuthController.java |
Map.of() → HashMap to allow null name field on registration |
hexagonal/application.properties |
Fixed datasource URL template, JWT secret key, Stripe placeholders |
hexagonal/PaymentService.java |
UUID.fromString(userId) → userId |
clean/application.properties |
Fixed datasource URL, jwt.secret key name, Stripe placeholders |
clean/PaymentUseCase.java |
Full rewrite — file was corrupted with garbled text; fixed UUID→String |
Python FastAPI
| File | Fix |
|---|---|
mvc/payments.py |
Wrong import middleware.auth → middleware.security; added get_current_db_user dependency returning ORM instance instead of plain dict |
mvc/security.py |
Added get_current_db_user() function |
mvc/item.py |
Added price: Optional[float] to ItemCreate and ItemResponse |
hexagonal/payment_service.py |
user.stripe_customer_id = x on frozen=True dataclass → dataclasses.replace() (was raising FrozenInstanceError) |
hexagonal/stripe_adapter.py |
stripe.api_key moved from module level into __init__ (was always None because it ran before load_dotenv()) |
hexagonal/http_adapter.py |
/login endpoint was using RegisterRequest (mandatory name field) — fixed to use new LoginRequest(email, password) |
hexagonal/session.py |
Added async def get_db() generator — was imported everywhere but never defined |
hexagonal/payment_http_adapter.py |
DI factory used AsyncSessionLocal() directly → Depends(get_db) (session leak) |
hexagonal/config.py |
Added STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, FRONTEND_URL; extra="ignore" to prevent startup crash on extra .env vars; load_dotenv() at top |
hexagonal/user.py |
Added created_at: Optional[datetime] field to frozen dataclass |
clean/config.py |
DB name default {{projectName}}_db → {{projectName}}; extra="ignore" |
clean/main.py |
load_dotenv() added before app imports |
clean/auth_controller.py |
Added UserResponse/AuthResponse response models (password hash was leaking); added POST /login endpoint (was missing entirely) |
clean/payment_controller.py |
Wrong import SQLAlchemyUserRepository → PostgresUserRepository; DI via Depends(get_db) |
clean/payment_service.py |
Import UserRepository → IUserRepository |
NestJS — all 3 architectures
docker-compose.yml— removedappservice, removedversion, added healthcheckDockerfile— improvements- Various controller, service, entity, and module fixes across MVC, Hexagonal, Clean
Node.js Express — all 3 architectures
docker-compose.yml— removedappservice, removedversion, added healthcheckDockerfile— improvements- Dependency and entity fixes across all archs
Next.js MVC
docker-compose.yml— DB-only, removedversion, added healthcheckDockerfile— improvements
New Files Added
| Stack | File | Reason |
|---|---|---|
| Java Spring Hexagonal | JwtFilter.java |
Was missing — app couldn't start without it |
| Java Spring Hexagonal | SecurityConfig.java |
Was missing — no request filtering |
| Java Spring Clean | JwtAuthenticationFilter.java |
Was missing |
| Java Spring Clean | SecurityConfig.java |
Was missing |
| Java Spring Clean | JpaUserRepository.java |
Was referenced in code but not in template |
| Java Spring Clean | UserEntity.java |
Was referenced in code but not in template |
| Java Spring Clean | StripeGateway.java |
Was referenced in code but not in template |
| Python FastAPI Hexagonal | app/core/ports/__init__.py |
Was imported but missing |
| Python FastAPI Hexagonal | app/core/ports/user_repository.py |
Was imported but missing |
| Python FastAPI Hexagonal | app/infrastructure/security/__init__.py |
Package marker |
| Python FastAPI Hexagonal | app/infrastructure/security/adapters.py |
Was imported but missing |
| Python FastAPI Hexagonal | app/infrastructure/security/jwt.py |
Was imported but missing |
| Python FastAPI Hexagonal | app/infrastructure/database/user_repository.py |
Was imported but missing |
| Python FastAPI Clean | app/infrastructure/security/jwt.py |
Was imported but missing |
| Python FastAPI Clean | app/domain/usecases/login_user.py |
Login endpoint existed in controller but no usecase |
| NestJS (all archs) | health.controller.ts |
Was missing from all NestJS archs |
| Node.js Express Hexagonal | config.ts, prisma.ts.hbs |
Were missing |
| Node.js Express Clean | config.ts |
Was missing |
Requirements / Dependencies
| Stack | Change |
|---|---|
| Python FastAPI (all) | Added pydantic[email]>=2.5.0 |
| Python FastAPI (all) | Pinned bcrypt>=3.0.0,<4.0.0 — bcrypt 4.x breaks passlib 1.7.4 |
| Python FastAPI Hexagonal/Clean | Added greenlet>=3.0.0 (required by async SQLAlchemy) |
| Python FastAPI Hexagonal | Added email-validator>=2.1.0 |
.gitignore Added to All Templates
12 template directories were missing a .gitignore. Added with sensible defaults for each stack:
java-spring(mvc, hexagonal, clean)nestjs(mvc, hexagonal, clean)nodejs-express(mvc, hexagonal, clean)python-fastapi(mvc, hexagonal, clean)
Upgrade Notes
This release only affects generated project output. If you already generated a project with a previous version of Kybernus and hit any of the bugs above, re-generate the project with npx kybernus@latest init or manually apply the fixes from the CHANGELOG.