/` für Geschäfts-Scheiben, `api/router.py` als zentrale Aggregationsstelle, `tests/` als Spiegel der Laufzeitmodule.
+- **Domäne hinzufügen**: `items/` kopieren, Entity / Schemas / Klassen umbenennen, Re-Exports in `__init__.py` aktualisieren, Router in `src/app/api/router.py` registrieren, Testmodul ergänzen. Keine Änderung an `main.py`.
diff --git a/docs/de/tutorial/first-project.md b/docs/de/tutorial/first-project.md
new file mode 100644
index 0000000..26cf657
--- /dev/null
+++ b/docs/de/tutorial/first-project.md
@@ -0,0 +1,1252 @@
+# Ihr erstes Projekt
+
+Bauen Sie eine vollständige Blog-API mit Nutzerverwaltung, Beitragserstellung und Kommentarsystem mit FastAPI-fastkit.
+
+## Projektüberblick
+
+In diesem Tutorial erstellen wir eine **Blog-API** mit folgenden Funktionen:
+
+- **Nutzerverwaltung**: Registrierung, Authentifizierung und Nutzerprofile
+- **Beitragsverwaltung**: Blog-Beiträge erstellen, lesen, aktualisieren und löschen
+- **Kommentarsystem**: Kommentare zu Blog-Beiträgen hinzufügen
+- **Datenvalidierung**: robuste Eingabevalidierung und Fehlerbehandlung
+- **API-Dokumentation**: automatische OpenAPI-Dokumentation
+- **Testen**: vollständige Test-Suite
+
+### Was Sie lernen werden
+
+Am Ende dieses Tutorials werden Sie verstehen:
+
+- Erweiterte Struktur von FastAPI-fastkit-Projekten
+- Datenbankintegration mit SQLAlchemy
+- Authentifizierung und Autorisierung von Nutzern
+- Komplexe Datenbeziehungen
+- Fehlerbehandlung und Validierung
+- Best Practices beim Testen
+
+## Voraussetzungen
+
+Bevor Sie starten, stellen Sie sicher, dass Sie:
+
+- das [Tutorial Erste Schritte](getting-started.md) abgeschlossen haben
+- grundlegendes Verständnis von REST-APIs haben
+- Python 3.12+ installiert haben
+- einen Texteditor oder eine IDE bereit haben
+
+## Schritt 1: Das Projekt erstellen
+
+Beginnen wir mit der Erstellung eines neuen Projekts mit dem **STANDARD**-Stack für Datenbankunterstützung:
+
+
+
+```console
+$ fastkit init
+Enter the project name: blog-api
+Enter the author name: Your Name
+Enter the author email: your.email@example.com
+Enter the project description: A complete blog API with users, posts, and comments
+
+ Project Information
+┌──────────────┬─────────────────────────────────────────┐
+│ Project Name │ blog-api │
+│ Author │ Your Name │
+│ Author Email │ your.email@example.com │
+│ Description │ A complete blog API with users, posts, │
+│ │ and comments │
+└──────────────┴─────────────────────────────────────────┘
+
+Available Stacks and Dependencies:
+ MINIMAL Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ pydantic │
+│ Dependency 4 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+ STANDARD Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ sqlalchemy │
+│ Dependency 4 │ alembic │
+│ Dependency 5 │ pytest │
+│ Dependency 6 │ pydantic │
+│ Dependency 7 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+Select stack (minimal, standard, full): standard
+
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'blog-api' has been created successfully!
+```
+
+
+
+## Schritt 2: Das Projekt einrichten
+
+Wechseln Sie in das Projekt und aktivieren Sie die virtuelle Umgebung:
+
+
+
+```console
+$ cd blog-api
+$ source .venv/bin/activate
+```
+
+
+
+## Schritt 3: Benötigte Routen hinzufügen
+
+Fügen wir die Hauptressourcen unserer Blog-API hinzu:
+
+
+
+```console
+$ fastkit addroute users blog-api
+✨ Successfully added new route 'users' to project 'blog-api'
+
+$ fastkit addroute posts blog-api
+✨ Successfully added new route 'posts' to project 'blog-api'
+
+$ fastkit addroute comments blog-api
+✨ Successfully added new route 'comments' to project 'blog-api'
+```
+
+
+
+## Schritt 4: Die Datenmodelle entwerfen
+
+Entwerfen wir unsere Datenschemata. Wir beginnen damit, das Nutzer-Schema realistischer zu gestalten.
+
+### Nutzer-Schema aktualisieren
+
+Bearbeiten Sie `src/schemas/users.py`:
+
+```python
+from typing import Optional, List
+from datetime import datetime
+from pydantic import BaseModel, EmailStr, Field
+
+class UserBase(BaseModel):
+ email: EmailStr
+ username: str = Field(..., min_length=3, max_length=50)
+ full_name: Optional[str] = None
+ bio: Optional[str] = Field(None, max_length=500)
+ is_active: bool = True
+
+class UserCreate(UserBase):
+ password: str = Field(..., min_length=8)
+
+class UserUpdate(BaseModel):
+ email: Optional[EmailStr] = None
+ username: Optional[str] = Field(None, min_length=3, max_length=50)
+ full_name: Optional[str] = None
+ bio: Optional[str] = Field(None, max_length=500)
+ is_active: Optional[bool] = None
+
+class User(UserBase):
+ id: int
+ created_at: datetime
+ posts_count: int = 0
+
+ class Config:
+ from_attributes = True
+
+class UserInDB(User):
+ hashed_password: str
+```
+
+### Beitrags-Schema erstellen
+
+Bearbeiten Sie `src/schemas/posts.py`:
+
+```python
+from typing import Optional, List
+from datetime import datetime
+from pydantic import BaseModel, Field
+
+class PostBase(BaseModel):
+ title: str = Field(..., min_length=1, max_length=200)
+ content: str = Field(..., min_length=1)
+ published: bool = True
+
+class PostCreate(PostBase):
+ pass
+
+class PostUpdate(BaseModel):
+ title: Optional[str] = Field(None, min_length=1, max_length=200)
+ content: Optional[str] = Field(None, min_length=1)
+ published: Optional[bool] = None
+
+class Post(PostBase):
+ id: int
+ author_id: int
+ created_at: datetime
+ updated_at: datetime
+ comments_count: int = 0
+
+ class Config:
+ from_attributes = True
+
+class PostWithAuthor(Post):
+ author: "User"
+
+class PostWithComments(Post):
+ comments: List["Comment"] = []
+
+# Import to avoid circular imports
+from src.schemas.users import User
+from src.schemas.comments import Comment
+PostWithAuthor.model_rebuild()
+PostWithComments.model_rebuild()
+```
+
+### Kommentar-Schema erstellen
+
+Bearbeiten Sie `src/schemas/comments.py`:
+
+```python
+from typing import Optional
+from datetime import datetime
+from pydantic import BaseModel, Field
+
+class CommentBase(BaseModel):
+ content: str = Field(..., min_length=1, max_length=1000)
+
+class CommentCreate(CommentBase):
+ post_id: int
+
+class CommentUpdate(BaseModel):
+ content: Optional[str] = Field(None, min_length=1, max_length=1000)
+
+class Comment(CommentBase):
+ id: int
+ post_id: int
+ author_id: int
+ created_at: datetime
+ updated_at: datetime
+
+ class Config:
+ from_attributes = True
+
+class CommentWithAuthor(Comment):
+ author: "User"
+
+# Import to avoid circular imports
+from src.schemas.users import User
+CommentWithAuthor.model_rebuild()
+```
+
+## Schritt 5: Erweiterte CRUD-Operationen implementieren
+
+### Erweitertes Nutzer-CRUD
+
+Aktualisieren Sie `src/crud/users.py`:
+
+```python
+from typing import List, Optional
+from datetime import datetime
+import hashlib
+from src.schemas.users import UserCreate, UserUpdate, UserInDB
+
+class UsersCRUD:
+ def __init__(self):
+ self._users: List[UserInDB] = []
+ self._next_id = 1
+
+ def _hash_password(self, password: str) -> str:
+ """Simple password hashing (use bcrypt in production)"""
+ return hashlib.sha256(password.encode()).hexdigest()
+
+ def _verify_password(self, plain_password: str, hashed_password: str) -> bool:
+ """Verify password against hash"""
+ return self._hash_password(plain_password) == hashed_password
+
+ def get_all(self) -> List[UserInDB]:
+ """Get all users"""
+ return [user for user in self._users if user.is_active]
+
+ def get_by_id(self, user_id: int) -> Optional[UserInDB]:
+ """Get user by ID"""
+ return next((user for user in self._users if user.id == user_id), None)
+
+ def get_by_email(self, email: str) -> Optional[UserInDB]:
+ """Get user by email"""
+ return next((user for user in self._users if user.email == email), None)
+
+ def get_by_username(self, username: str) -> Optional[UserInDB]:
+ """Get user by username"""
+ return next((user for user in self._users if user.username == username), None)
+
+ def create(self, user: UserCreate) -> UserInDB:
+ """Create a new user with validation"""
+ # Check for duplicates
+ if self.get_by_email(user.email):
+ raise ValueError("Email already registered")
+ if self.get_by_username(user.username):
+ raise ValueError("Username already taken")
+
+ new_user = UserInDB(
+ id=self._next_id,
+ email=user.email,
+ username=user.username,
+ full_name=user.full_name,
+ bio=user.bio,
+ is_active=user.is_active,
+ created_at=datetime.now(),
+ posts_count=0,
+ hashed_password=self._hash_password(user.password)
+ )
+ self._next_id += 1
+ self._users.append(new_user)
+ return new_user
+
+ def update(self, user_id: int, user_update: UserUpdate) -> Optional[UserInDB]:
+ """Update an existing user"""
+ user = self.get_by_id(user_id)
+ if not user:
+ return None
+
+ # Check for duplicates on email/username changes
+ update_data = user_update.dict(exclude_unset=True)
+ if "email" in update_data and update_data["email"] != user.email:
+ if self.get_by_email(update_data["email"]):
+ raise ValueError("Email already registered")
+
+ if "username" in update_data and update_data["username"] != user.username:
+ if self.get_by_username(update_data["username"]):
+ raise ValueError("Username already taken")
+
+ for field, value in update_data.items():
+ setattr(user, field, value)
+
+ return user
+
+ def delete(self, user_id: int) -> bool:
+ """Soft delete user (deactivate)"""
+ user = self.get_by_id(user_id)
+ if user:
+ user.is_active = False
+ return True
+ return False
+
+ def authenticate(self, email: str, password: str) -> Optional[UserInDB]:
+ """Authenticate user by email and password"""
+ user = self.get_by_email(email)
+ if user and self._verify_password(password, user.hashed_password):
+ return user
+ return None
+
+users_crud = UsersCRUD()
+```
+
+### Beitrags-CRUD
+
+Aktualisieren Sie `src/crud/posts.py`:
+
+```python
+from typing import List, Optional
+from datetime import datetime
+from src.schemas.posts import PostCreate, PostUpdate, Post
+
+class PostsCRUD:
+ def __init__(self):
+ self._posts: List[Post] = []
+ self._next_id = 1
+
+ def get_all(self, skip: int = 0, limit: int = 100, published_only: bool = True) -> List[Post]:
+ """Get all posts with pagination"""
+ posts = self._posts
+ if published_only:
+ posts = [post for post in posts if post.published]
+ return posts[skip:skip + limit]
+
+ def get_by_id(self, post_id: int) -> Optional[Post]:
+ """Get post by ID"""
+ return next((post for post in self._posts if post.id == post_id), None)
+
+ def get_by_author(self, author_id: int, skip: int = 0, limit: int = 100) -> List[Post]:
+ """Get posts by author"""
+ author_posts = [post for post in self._posts if post.author_id == author_id]
+ return author_posts[skip:skip + limit]
+
+ def create(self, post: PostCreate, author_id: int) -> Post:
+ """Create a new post"""
+ now = datetime.now()
+ new_post = Post(
+ id=self._next_id,
+ title=post.title,
+ content=post.content,
+ published=post.published,
+ author_id=author_id,
+ created_at=now,
+ updated_at=now,
+ comments_count=0
+ )
+ self._next_id += 1
+ self._posts.append(new_post)
+
+ # Update author's post count
+ from src.crud.users import users_crud
+ author = users_crud.get_by_id(author_id)
+ if author:
+ author.posts_count += 1
+
+ return new_post
+
+ def update(self, post_id: int, post_update: PostUpdate, author_id: int) -> Optional[Post]:
+ """Update an existing post"""
+ post = self.get_by_id(post_id)
+ if not post or post.author_id != author_id:
+ return None
+
+ update_data = post_update.dict(exclude_unset=True)
+ for field, value in update_data.items():
+ setattr(post, field, value)
+
+ post.updated_at = datetime.now()
+ return post
+
+ def delete(self, post_id: int, author_id: int) -> bool:
+ """Delete a post"""
+ post = self.get_by_id(post_id)
+ if post and post.author_id == author_id:
+ self._posts.remove(post)
+
+ # Update author's post count
+ from src.crud.users import users_crud
+ author = users_crud.get_by_id(author_id)
+ if author:
+ author.posts_count = max(0, author.posts_count - 1)
+
+ return True
+ return False
+
+ def search(self, query: str, skip: int = 0, limit: int = 100) -> List[Post]:
+ """Search posts by title or content"""
+ query_lower = query.lower()
+ matching_posts = [
+ post for post in self._posts
+ if post.published and (
+ query_lower in post.title.lower() or
+ query_lower in post.content.lower()
+ )
+ ]
+ return matching_posts[skip:skip + limit]
+
+posts_crud = PostsCRUD()
+```
+
+### Kommentar-CRUD
+
+Aktualisieren Sie `src/crud/comments.py`:
+
+```python
+from typing import List, Optional
+from datetime import datetime
+from src.schemas.comments import CommentCreate, CommentUpdate, Comment
+
+class CommentsCRUD:
+ def __init__(self):
+ self._comments: List[Comment] = []
+ self._next_id = 1
+
+ def get_all(self) -> List[Comment]:
+ """Get all comments"""
+ return self._comments
+
+ def get_by_id(self, comment_id: int) -> Optional[Comment]:
+ """Get comment by ID"""
+ return next((comment for comment in self._comments if comment.id == comment_id), None)
+
+ def get_by_post(self, post_id: int, skip: int = 0, limit: int = 100) -> List[Comment]:
+ """Get comments for a specific post"""
+ post_comments = [comment for comment in self._comments if comment.post_id == post_id]
+ return post_comments[skip:skip + limit]
+
+ def get_by_author(self, author_id: int, skip: int = 0, limit: int = 100) -> List[Comment]:
+ """Get comments by author"""
+ author_comments = [comment for comment in self._comments if comment.author_id == author_id]
+ return author_comments[skip:skip + limit]
+
+ def create(self, comment: CommentCreate, author_id: int) -> Comment:
+ """Create a new comment"""
+ # Verify post exists
+ from src.crud.posts import posts_crud
+ post = posts_crud.get_by_id(comment.post_id)
+ if not post:
+ raise ValueError("Post not found")
+
+ now = datetime.now()
+ new_comment = Comment(
+ id=self._next_id,
+ content=comment.content,
+ post_id=comment.post_id,
+ author_id=author_id,
+ created_at=now,
+ updated_at=now
+ )
+ self._next_id += 1
+ self._comments.append(new_comment)
+
+ # Update post's comment count
+ post.comments_count += 1
+
+ return new_comment
+
+ def update(self, comment_id: int, comment_update: CommentUpdate, author_id: int) -> Optional[Comment]:
+ """Update an existing comment"""
+ comment = self.get_by_id(comment_id)
+ if not comment or comment.author_id != author_id:
+ return None
+
+ update_data = comment_update.dict(exclude_unset=True)
+ for field, value in update_data.items():
+ setattr(comment, field, value)
+
+ comment.updated_at = datetime.now()
+ return comment
+
+ def delete(self, comment_id: int, author_id: int) -> bool:
+ """Delete a comment"""
+ comment = self.get_by_id(comment_id)
+ if comment and comment.author_id == author_id:
+ self._comments.remove(comment)
+
+ # Update post's comment count
+ from src.crud.posts import posts_crud
+ post = posts_crud.get_by_id(comment.post_id)
+ if post:
+ post.comments_count = max(0, post.comments_count - 1)
+
+ return True
+ return False
+
+comments_crud = CommentsCRUD()
+```
+
+## Schritt 6: Erweiterte API-Routen implementieren
+
+### Erweiterte Nutzer-Routen
+
+Aktualisieren Sie `src/api/routes/users.py`:
+
+```python
+from typing import List
+from fastapi import APIRouter, HTTPException, status, Depends, Query
+from src.schemas.users import User, UserCreate, UserUpdate
+from src.crud.users import users_crud
+
+router = APIRouter()
+
+# Helper function to get current user (simplified for tutorial)
+def get_current_user_id() -> int:
+ # In a real app, this would verify JWT token and return user ID
+ return 1 # For tutorial purposes
+
+@router.get("/", response_model=List[User])
+def read_users(
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100)
+):
+ """Get all users with pagination"""
+ users = users_crud.get_all()[skip:skip + limit]
+ return [User(**user.dict()) for user in users]
+
+@router.post("/", response_model=User, status_code=status.HTTP_201_CREATED)
+def create_user(user: UserCreate):
+ """Register a new user"""
+ try:
+ new_user = users_crud.create(user)
+ return User(**new_user.dict())
+ except ValueError as e:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail=str(e)
+ )
+
+@router.get("/{user_id}", response_model=User)
+def read_user(user_id: int):
+ """Get a specific user"""
+ user = users_crud.get_by_id(user_id)
+ if not user:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail=f"User with id {user_id} not found"
+ )
+ return User(**user.dict())
+
+@router.put("/{user_id}", response_model=User)
+def update_user(
+ user_id: int,
+ user_update: UserUpdate,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Update user profile"""
+ if user_id != current_user_id:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail="You can only update your own profile"
+ )
+
+ try:
+ updated_user = users_crud.update(user_id, user_update)
+ if not updated_user:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="User not found"
+ )
+ return User(**updated_user.dict())
+ except ValueError as e:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail=str(e)
+ )
+
+@router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
+def delete_user(
+ user_id: int,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Deactivate user account"""
+ if user_id != current_user_id:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail="You can only delete your own account"
+ )
+
+ success = users_crud.delete(user_id)
+ if not success:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="User not found"
+ )
+
+@router.post("/login")
+def login(email: str, password: str):
+ """Authenticate user"""
+ user = users_crud.authenticate(email, password)
+ if not user:
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Invalid email or password"
+ )
+
+ # In a real app, return JWT token
+ return {
+ "message": "Login successful",
+ "user_id": user.id,
+ "username": user.username
+ }
+```
+
+### Erweiterte Beitrags-Routen
+
+Aktualisieren Sie `src/api/routes/posts.py`:
+
+```python
+from typing import List, Optional
+from fastapi import APIRouter, HTTPException, status, Depends, Query
+from src.schemas.posts import Post, PostCreate, PostUpdate
+from src.crud.posts import posts_crud
+
+router = APIRouter()
+
+def get_current_user_id() -> int:
+ return 1 # Simplified for tutorial
+
+@router.get("/", response_model=List[Post])
+def read_posts(
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100),
+ search: Optional[str] = Query(None)
+):
+ """Get all posts with optional search"""
+ if search:
+ posts = posts_crud.search(search, skip, limit)
+ else:
+ posts = posts_crud.get_all(skip, limit)
+ return posts
+
+@router.post("/", response_model=Post, status_code=status.HTTP_201_CREATED)
+def create_post(
+ post: PostCreate,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Create a new blog post"""
+ new_post = posts_crud.create(post, current_user_id)
+ return new_post
+
+@router.get("/{post_id}", response_model=Post)
+def read_post(post_id: int):
+ """Get a specific post"""
+ post = posts_crud.get_by_id(post_id)
+ if not post:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Post not found"
+ )
+ return post
+
+@router.put("/{post_id}", response_model=Post)
+def update_post(
+ post_id: int,
+ post_update: PostUpdate,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Update a blog post"""
+ updated_post = posts_crud.update(post_id, post_update, current_user_id)
+ if not updated_post:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Post not found or you don't have permission to edit it"
+ )
+ return updated_post
+
+@router.delete("/{post_id}", status_code=status.HTTP_204_NO_CONTENT)
+def delete_post(
+ post_id: int,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Delete a blog post"""
+ success = posts_crud.delete(post_id, current_user_id)
+ if not success:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Post not found or you don't have permission to delete it"
+ )
+
+@router.get("/author/{author_id}", response_model=List[Post])
+def read_posts_by_author(
+ author_id: int,
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100)
+):
+ """Get posts by a specific author"""
+ posts = posts_crud.get_by_author(author_id, skip, limit)
+ return posts
+```
+
+### Erweiterte Kommentar-Routen
+
+Aktualisieren Sie `src/api/routes/comments.py`:
+
+```python
+from typing import List
+from fastapi import APIRouter, HTTPException, status, Depends, Query
+from src.schemas.comments import Comment, CommentCreate, CommentUpdate
+from src.crud.comments import comments_crud
+
+router = APIRouter()
+
+def get_current_user_id() -> int:
+ return 1 # Simplified for tutorial
+
+@router.get("/", response_model=List[Comment])
+def read_comments(
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100)
+):
+ """Get all comments"""
+ comments = comments_crud.get_all()[skip:skip + limit]
+ return comments
+
+@router.post("/", response_model=Comment, status_code=status.HTTP_201_CREATED)
+def create_comment(
+ comment: CommentCreate,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Create a new comment"""
+ try:
+ new_comment = comments_crud.create(comment, current_user_id)
+ return new_comment
+ except ValueError as e:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail=str(e)
+ )
+
+@router.get("/{comment_id}", response_model=Comment)
+def read_comment(comment_id: int):
+ """Get a specific comment"""
+ comment = comments_crud.get_by_id(comment_id)
+ if not comment:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Comment not found"
+ )
+ return comment
+
+@router.put("/{comment_id}", response_model=Comment)
+def update_comment(
+ comment_id: int,
+ comment_update: CommentUpdate,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Update a comment"""
+ updated_comment = comments_crud.update(comment_id, comment_update, current_user_id)
+ if not updated_comment:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Comment not found or you don't have permission to edit it"
+ )
+ return updated_comment
+
+@router.delete("/{comment_id}", status_code=status.HTTP_204_NO_CONTENT)
+def delete_comment(
+ comment_id: int,
+ current_user_id: int = Depends(get_current_user_id)
+):
+ """Delete a comment"""
+ success = comments_crud.delete(comment_id, current_user_id)
+ if not success:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Comment not found or you don't have permission to delete it"
+ )
+
+@router.get("/post/{post_id}", response_model=List[Comment])
+def read_comments_by_post(
+ post_id: int,
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100)
+):
+ """Get comments for a specific post"""
+ comments = comments_crud.get_by_post(post_id, skip, limit)
+ return comments
+
+@router.get("/author/{author_id}", response_model=List[Comment])
+def read_comments_by_author(
+ author_id: int,
+ skip: int = Query(0, ge=0),
+ limit: int = Query(100, ge=1, le=100)
+):
+ """Get comments by a specific author"""
+ comments = comments_crud.get_by_author(author_id, skip, limit)
+ return comments
+```
+
+## Schritt 7: Ihre Blog-API testen
+
+Starten wir den Server und testen unsere vollständige Blog-API:
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000
+```
+
+
+
+### Nutzerregistrierung testen
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/users/" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "email": "john@example.com",
+ "username": "john_doe",
+ "full_name": "John Doe",
+ "bio": "Software developer and blogger",
+ "password": "securepassword123"
+ }'
+
+{
+ "id": 1,
+ "email": "john@example.com",
+ "username": "john_doe",
+ "full_name": "John Doe",
+ "bio": "Software developer and blogger",
+ "is_active": true,
+ "created_at": "2023-12-07T10:30:00",
+ "posts_count": 0
+}
+```
+
+
+
+### Nutzeranmeldung testen
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/users/login" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "email": "john@example.com",
+ "password": "securepassword123"
+ }'
+
+{
+ "message": "Login successful",
+ "user_id": 1,
+ "username": "john_doe"
+}
+```
+
+
+
+### Beitragserstellung testen
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/posts/" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "title": "My First Blog Post",
+ "content": "This is the content of my first blog post. It is about learning FastAPI with FastAPI-fastkit!",
+ "published": true
+ }'
+
+{
+ "id": 1,
+ "title": "My First Blog Post",
+ "content": "This is the content of my first blog post. It is about learning FastAPI with FastAPI-fastkit!",
+ "published": true,
+ "author_id": 1,
+ "created_at": "2023-12-07T10:35:00",
+ "updated_at": "2023-12-07T10:35:00",
+ "comments_count": 0
+}
+```
+
+
+
+### Kommentarerstellung testen
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/comments/" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "content": "Great post! I learned a lot from this.",
+ "post_id": 1
+ }'
+
+{
+ "id": 1,
+ "content": "Great post! I learned a lot from this.",
+ "post_id": 1,
+ "author_id": 1,
+ "created_at": "2023-12-07T10:40:00",
+ "updated_at": "2023-12-07T10:40:00"
+}
+```
+
+
+
+### Suchfunktion testen
+
+
+
+```console
+$ curl "http://127.0.0.1:8000/api/v1/posts/?search=FastAPI"
+
+[
+ {
+ "id": 1,
+ "title": "My First Blog Post",
+ "content": "This is the content of my first blog post. It is about learning FastAPI with FastAPI-fastkit!",
+ "published": true,
+ "author_id": 1,
+ "created_at": "2023-12-07T10:35:00",
+ "updated_at": "2023-12-07T10:35:00",
+ "comments_count": 1
+ }
+]
+```
+
+
+
+## Schritt 8: API-Dokumentation
+
+Besuchen Sie [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), um die vollständige Dokumentation Ihrer API zu sehen. Sie sollten nun sehen:
+
+- **Users**: Registrierung, Anmeldung, Profilverwaltung
+- **Posts**: CRUD-Operationen, Suche, Filterung nach Autor
+- **Comments**: CRUD-Operationen, Filterung nach Beitrag/Autor
+- **Items**: ursprüngliche Beispiel-Endpunkte
+
+Die Dokumentation zeigt:
+
+- alle verfügbaren Endpunkte
+- Anfrage-/Antwortschemas
+- Datenvalidierungsregeln
+- Fehlerantworten
+
+## Schritt 9: Tests schreiben
+
+Erstellen wir umfassende Tests für unsere Blog-API. Legen Sie `tests/test_blog_api.py` an:
+
+```python
+from fastapi.testclient import TestClient
+from src.main import app
+
+client = TestClient(app)
+
+class TestUserAPI:
+ def test_create_user(self):
+ user_data = {
+ "email": "test@example.com",
+ "username": "testuser",
+ "full_name": "Test User",
+ "bio": "Test bio",
+ "password": "testpassword123"
+ }
+ response = client.post("/api/v1/users/", json=user_data)
+ assert response.status_code == 201
+ data = response.json()
+ assert data["email"] == user_data["email"]
+ assert data["username"] == user_data["username"]
+ assert "id" in data
+ assert "hashed_password" not in data # Should not expose password
+
+ def test_duplicate_email(self):
+ # First user
+ user_data1 = {
+ "email": "duplicate@example.com",
+ "username": "user1",
+ "password": "password123"
+ }
+ response1 = client.post("/api/v1/users/", json=user_data1)
+ assert response1.status_code == 201
+
+ # Second user with same email
+ user_data2 = {
+ "email": "duplicate@example.com",
+ "username": "user2",
+ "password": "password123"
+ }
+ response2 = client.post("/api/v1/users/", json=user_data2)
+ assert response2.status_code == 400
+ assert "Email already registered" in response2.json()["detail"]
+
+ def test_login(self):
+ # Create user first
+ user_data = {
+ "email": "login@example.com",
+ "username": "loginuser",
+ "password": "loginpassword123"
+ }
+ client.post("/api/v1/users/", json=user_data)
+
+ # Test login
+ login_data = {
+ "email": "login@example.com",
+ "password": "loginpassword123"
+ }
+ response = client.post("/api/v1/users/login", json=login_data)
+ assert response.status_code == 200
+ data = response.json()
+ assert "user_id" in data
+ assert data["username"] == "loginuser"
+
+class TestPostAPI:
+ def test_create_post(self):
+ post_data = {
+ "title": "Test Post",
+ "content": "This is a test post content",
+ "published": True
+ }
+ response = client.post("/api/v1/posts/", json=post_data)
+ assert response.status_code == 201
+ data = response.json()
+ assert data["title"] == post_data["title"]
+ assert data["content"] == post_data["content"]
+ assert "id" in data
+ assert "author_id" in data
+
+ def test_read_posts(self):
+ response = client.get("/api/v1/posts/")
+ assert response.status_code == 200
+ data = response.json()
+ assert isinstance(data, list)
+
+ def test_search_posts(self):
+ # Create a post with specific content
+ post_data = {
+ "title": "FastAPI Tutorial",
+ "content": "Learn how to build APIs with FastAPI",
+ "published": True
+ }
+ client.post("/api/v1/posts/", json=post_data)
+
+ # Search for the post
+ response = client.get("/api/v1/posts/?search=FastAPI")
+ assert response.status_code == 200
+ data = response.json()
+ assert len(data) > 0
+ assert any("FastAPI" in post["title"] or "FastAPI" in post["content"] for post in data)
+
+class TestCommentAPI:
+ def test_create_comment(self):
+ # Create a post first
+ post_data = {
+ "title": "Post for Comments",
+ "content": "This post will receive comments",
+ "published": True
+ }
+ post_response = client.post("/api/v1/posts/", json=post_data)
+ post_id = post_response.json()["id"]
+
+ # Create comment
+ comment_data = {
+ "content": "This is a test comment",
+ "post_id": post_id
+ }
+ response = client.post("/api/v1/comments/", json=comment_data)
+ assert response.status_code == 201
+ data = response.json()
+ assert data["content"] == comment_data["content"]
+ assert data["post_id"] == post_id
+
+ def test_get_comments_by_post(self):
+ # Create post and comment first
+ post_data = {
+ "title": "Post with Comments",
+ "content": "This post has comments",
+ "published": True
+ }
+ post_response = client.post("/api/v1/posts/", json=post_data)
+ post_id = post_response.json()["id"]
+
+ comment_data = {
+ "content": "Comment on post",
+ "post_id": post_id
+ }
+ client.post("/api/v1/comments/", json=comment_data)
+
+ # Get comments for the post
+ response = client.get(f"/api/v1/comments/post/{post_id}")
+ assert response.status_code == 200
+ data = response.json()
+ assert len(data) > 0
+ assert all(comment["post_id"] == post_id for comment in data)
+
+# Run the tests
+if __name__ == "__main__":
+ import pytest
+ pytest.main([__file__])
+```
+
+### Tests ausführen
+
+
+
+```console
+$ python -m pytest tests/test_blog_api.py -v
+======================== test session starts ========================
+tests/test_blog_api.py::TestUserAPI::test_create_user PASSED
+tests/test_blog_api.py::TestUserAPI::test_duplicate_email PASSED
+tests/test_blog_api.py::TestUserAPI::test_login PASSED
+tests/test_blog_api.py::TestPostAPI::test_create_post PASSED
+tests/test_blog_api.py::TestPostAPI::test_read_posts PASSED
+tests/test_blog_api.py::TestPostAPI::test_search_posts PASSED
+tests/test_blog_api.py::TestCommentAPI::test_create_comment PASSED
+tests/test_blog_api.py::TestCommentAPI::test_get_comments_by_post PASSED
+======================== 8 passed in 1.23s ========================
+```
+
+
+
+## Was Sie gebaut haben
+
+Glückwunsch! Sie haben erfolgreich eine vollständige Blog-API gebaut mit:
+
+### ✅ Implementierte Funktionen
+
+- **Nutzerverwaltung**
+ - Nutzerregistrierung mit Validierung
+ - Nutzerauthentifizierung (Login)
+ - Profilverwaltung
+ - Verhinderung von Duplikaten
+
+- **Blog-Beiträge**
+ - Beiträge erstellen, lesen, aktualisieren, löschen
+ - Filterung nach Autor
+ - Suchfunktionalität
+ - Veröffentlicht-/Entwurf-Status
+
+- **Kommentarsystem**
+ - Kommentare zu Beiträgen hinzufügen
+ - Kommentare nach Beitrag oder Autor anzeigen
+ - Kommentarverwaltung
+
+- **Datenvalidierung**
+ - E-Mail-Validierung
+ - Anforderungen an Passwörter
+ - Inhaltslängen-Begrenzungen
+ - Validierung von Pflichtfeldern
+
+- **Fehlerbehandlung**
+ - Passende HTTP-Statuscodes
+ - Aussagekräftige Fehlermeldungen
+ - Validierungsfehler bei Eingaben
+
+- **API-Dokumentation**
+ - automatische OpenAPI-Generierung
+ - interaktive Testoberfläche
+ - Anfrage-/Antwortschemas
+
+- **Tests**
+ - umfassende Testabdeckung
+ - Unit-Tests für alle Endpunkte
+ - Tests für Grenzfälle
+
+## Nächste Schritte
+
+### Mögliche Erweiterungen
+
+1. **Echte Authentifizierung**
+ - JWT-Tokens implementieren
+ - Passwort-Hashing mit bcrypt
+ - rollenbasierte Berechtigungen
+
+2. **Datenbankintegration**
+ - PostgreSQL oder MySQL verwenden
+ - echte Datenbankmodelle implementieren
+ - Datenbankmigrationen hinzufügen
+
+3. **Erweiterte Funktionen**
+ - Datei-Uploads für Bilder
+ - E-Mail-Benachrichtigungen
+ - Beitragskategorien/-tags
+ - Like/Dislike-System
+
+4. **Produktionsreife**
+ - Logging hinzufügen
+ - Caching implementieren
+ - Rate-Limiting ergänzen
+ - Umgebungskonfiguration
+
+### Weiter lernen
+
+1. **[Vorlagen verwenden](../user-guide/using-templates.md)**: erkunden Sie die Vorlage `fastapi-psql-orm` für Datenbankintegration
+2. **[Routen hinzufügen](../user-guide/adding-routes.md)**: lernen Sie fortgeschrittenere Routenmuster
+3. **[Mitwirken](../contributing/development-setup.md)**: tragen Sie zu FastAPI-fastkit bei
+
+!!! tip "Best Practices, die Sie gelernt haben"
+ - **Modulare Architektur**: Trennung der Belange in Schemas, CRUD und Routen
+ - **Datenvalidierung**: Pydantic für robuste Eingabevalidierung nutzen
+ - **Fehlerbehandlung**: passende HTTP-Statuscodes und Fehlermeldungen
+ - **Testen**: umfassende Testabdeckung für alle Funktionen
+ - **Dokumentation**: automatische Generierung der API-Dokumentation ausnutzen
+
+Sie haben nun die Fähigkeiten, produktionsreife APIs mit FastAPI-fastkit zu bauen! 🚀
diff --git a/docs/de/tutorial/getting-started.md b/docs/de/tutorial/getting-started.md
new file mode 100644
index 0000000..4b468fe
--- /dev/null
+++ b/docs/de/tutorial/getting-started.md
@@ -0,0 +1,564 @@
+# Erste Schritte
+
+Ein umfassendes Schritt-für-Schritt-Tutorial zum Einstieg in FastAPI-fastkit. Dieser Leitfaden führt Sie in etwa 15 Minuten von der Installation bis zum Ausführen Ihrer ersten API.
+
+## Voraussetzungen
+
+Bevor Sie starten, stellen Sie sicher, dass Sie haben:
+
+- **Python 3.12 oder höher** auf Ihrem System installiert
+- **Grundkenntnisse in Python** (Variablen, Funktionen, Klassen)
+- Zugang zum **Terminal / zur Kommandozeile**
+- **Einen Texteditor oder eine IDE** (VS Code, PyCharm usw.)
+
+## Schritt 1: Installation
+
+Zuerst installieren wir FastAPI-fastkit. Wir empfehlen die Nutzung einer virtuellen Umgebung, um Ihre Projekte zu isolieren.
+
+### Option A: mit pip (klassisch)
+
+
+
+```console
+$ pip install fastapi-fastkit
+---> 100%
+Successfully installed fastapi-fastkit
+```
+
+
+
+### Option B: mit UV (empfohlen — schneller)
+
+UV ist ein schneller Python-Paketmanager. Falls Sie UV nicht installiert haben:
+
+
+
+```console
+# Install UV first
+$ curl -LsSf https://astral.sh/uv/install.sh | sh
+
+# Then install FastAPI-fastkit
+$ uv pip install fastapi-fastkit
+---> 100%
+Successfully installed fastapi-fastkit
+```
+
+
+
+### Option C: mit virtueller Umgebung
+
+
+
+```console
+$ python -m venv fastapi-env
+$ source fastapi-env/bin/activate # On Windows: fastapi-env\Scripts\activate
+$ pip install fastapi-fastkit
+```
+
+
+
+### Installation überprüfen
+
+Überprüfen Sie, dass FastAPI-fastkit korrekt installiert ist:
+
+
+
+```console
+$ fastkit --version
+FastAPI-fastkit version 1.0.0
+```
+
+
+
+## Schritt 2: Ihr erstes Projekt erstellen
+
+Erstellen wir nun Ihr erstes FastAPI-Projekt mit dem interaktiven Befehl `init`:
+
+
+
+```console
+$ fastkit init
+Enter the project name: my-first-api
+Enter the author name: Your Name
+Enter the author email: your.email@example.com
+Enter the project description: My first FastAPI project
+
+ Project Information
+┌──────────────┬─────────────────────────┐
+│ Project Name │ my-first-api │
+│ Author │ Your Name │
+│ Author Email │ your.email@example.com │
+│ Description │ My first FastAPI project│
+└──────────────┴─────────────────────────┘
+
+Available Stacks and Dependencies:
+ MINIMAL Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ pydantic │
+│ Dependency 4 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+ STANDARD Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ sqlalchemy │
+│ Dependency 4 │ alembic │
+│ Dependency 5 │ pytest │
+│ Dependency 6 │ pydantic │
+│ Dependency 7 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+Select stack (minimal, standard, full): minimal
+
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+Creating virtual environment...
+Installing dependencies...
+✨ FastAPI project 'my-first-api' has been created successfully!
+```
+
+
+
+!!! note "Stack-Auswahl"
+ Wir haben für dieses Tutorial **MINIMAL** gewählt, um es einfach zu halten. Für echte Projekte ziehen Sie **STANDARD** (mit Datenbankunterstützung) oder **FULL** (mit Hintergrundaufgaben) in Betracht.
+
+## Schritt 3: In Ihr Projekt wechseln
+
+Wechseln Sie in das neu erstellte Projektverzeichnis:
+
+
+
+```console
+$ cd my-first-api
+$ ls -la
+total 32
+drwxr-xr-x 8 user user 256 Dec 7 10:30 .
+drwxr-xr-x 3 user user 96 Dec 7 10:30 ..
+drwxr-xr-x 5 user user 160 Dec 7 10:30 .venv
+-rw-r--r-- 1 user user 156 Dec 7 10:30 README.md
+-rw-r--r-- 1 user user 243 Dec 7 10:30 requirements.txt
+drwxr-xr-x 3 user user 96 Dec 7 10:30 scripts
+-rw-r--r-- 1 user user 1245 Dec 7 10:30 setup.py
+drwxr-xr-x 8 user user 256 Dec 7 10:30 src
+drwxr-xr-x 3 user user 96 Dec 7 10:30 tests
+```
+
+
+
+## Schritt 4: Virtuelle Umgebung aktivieren
+
+Ihr Projekt enthält eine vorkonfigurierte virtuelle Umgebung. Aktivieren Sie sie:
+
+
+
+```console
+$ source .venv/bin/activate # On Windows: .venv\Scripts\activate
+(my-first-api) $
+```
+
+
+
+Beachten Sie, dass Ihre Terminal-Eingabeaufforderung jetzt `(my-first-api)` anzeigt, was darauf hinweist, dass die virtuelle Umgebung aktiv ist.
+
+## Schritt 5: Entwicklungsserver starten
+
+Nun kommt der spannende Teil — starten wir Ihren FastAPI-Server:
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+INFO: Started reloader process [28720] using StatReload
+INFO: Started server process [28722]
+INFO: Waiting for application startup.
+INFO: Application startup complete.
+```
+
+
+
+🎉 **Glückwunsch!** Ihr FastAPI-Server läuft jetzt.
+
+## Schritt 6: Ihre API testen
+
+Lassen Sie uns Ihre API auf mehrere Arten testen:
+
+### Methode 1: Browser
+
+Öffnen Sie Ihren Browser und besuchen Sie:
+
+- **Haupt-API-Endpunkt**: [http://127.0.0.1:8000](http://127.0.0.1:8000)
+
+Sie sollten sehen:
+```json
+{"message": "Hello World"}
+```
+
+### Methode 2: Interaktive API-Dokumentation
+
+Besuchen Sie die automatisch generierte API-Dokumentation:
+
+- **Swagger UI**: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)
+- **ReDoc**: [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)
+
+Die Swagger UI ist besonders nützlich — Sie können:
+
+- alle verfügbaren Endpunkte sehen
+- Endpunkte direkt im Browser testen
+- Anfrage-/Antwortschemas einsehen
+- OpenAPI-Spezifikationen herunterladen
+
+### Methode 3: Kommandozeile
+
+Öffnen Sie ein neues Terminal (lassen Sie den Server weiterlaufen) und testen Sie mit curl:
+
+
+
+```console
+$ curl http://127.0.0.1:8000
+{"message":"Hello World"}
+
+$ curl http://127.0.0.1:8000/api/v1/items/
+[]
+
+$ curl -X POST "http://127.0.0.1:8000/api/v1/items/" \
+ -H "Content-Type: application/json" \
+ -d '{"title": "My First Item", "description": "This is a test item"}'
+{
+ "id": 1,
+ "title": "My First Item",
+ "description": "This is a test item"
+}
+```
+
+
+
+## Schritt 7: Ihre Projektstruktur verstehen
+
+Erkunden wir, was FastAPI-fastkit für Sie generiert hat:
+
+
+
+```console
+$ tree src
+src/
+├── __init__.py
+├── main.py # Einstiegspunkt der FastAPI-Anwendung
+├── core/
+│ ├── __init__.py
+│ └── config.py # Anwendungskonfiguration
+├── api/
+│ ├── __init__.py
+│ ├── api.py # Haupt-Router der API
+│ └── routes/
+│ ├── __init__.py
+│ └── items.py # API-Endpunkte für Items
+├── crud/
+│ ├── __init__.py
+│ └── items.py # Geschäftslogik für Items
+├── schemas/
+│ ├── __init__.py
+│ └── items.py # Schemas zur Datenvalidierung
+└── mocks/
+ ├── __init__.py
+ └── mock_items.json # Beispieldaten
+```
+
+
+
+### Wichtige Dateien erklärt
+
+**`src/main.py`** — das Herz Ihrer Anwendung:
+```python
+from fastapi import FastAPI
+from src.api.api import api_router
+from src.core.config import settings
+
+app = FastAPI(
+ title=settings.PROJECT_NAME,
+ version=settings.VERSION,
+ openapi_url=f"{settings.API_V1_STR}/openapi.json"
+)
+
+app.include_router(api_router, prefix=settings.API_V1_STR)
+
+@app.get("/")
+def read_root():
+ return {"message": "Hello World"}
+```
+
+**`src/core/config.py`** — Anwendungseinstellungen:
+```python
+from pydantic_settings import BaseSettings
+
+class Settings(BaseSettings):
+ PROJECT_NAME: str = "my-first-api"
+ VERSION: str = "1.0.0"
+ API_V1_STR: str = "/api/v1"
+
+ class Config:
+ env_file = ".env"
+
+settings = Settings()
+```
+
+**`src/api/routes/items.py`** — API-Endpunkte:
+```python
+from typing import List
+from fastapi import APIRouter, HTTPException
+from src.schemas.items import Item, ItemCreate, ItemUpdate
+from src.crud.items import items_crud
+
+router = APIRouter()
+
+@router.get("/", response_model=List[Item])
+def read_items():
+ """Get all items"""
+ return items_crud.get_all()
+
+@router.post("/", response_model=Item)
+def create_item(item: ItemCreate):
+ """Create a new item"""
+ return items_crud.create(item)
+```
+
+## Schritt 8: Ihre erste benutzerdefinierte Route hinzufügen
+
+Fügen wir eine neue API-Route hinzu, um das Gelernte zu üben:
+
+
+
+```console
+$ fastkit addroute users my-first-api
+ Adding New Route
+┌──────────────────┬──────────────────────────────────────────┐
+│ Project │ my-first-api │
+│ Route Name │ users │
+│ Target Directory │ ~/my-first-api │
+└──────────────────┴──────────────────────────────────────────┘
+
+Do you want to add route 'users' to project 'my-first-api'? [Y/n]: y
+
+✨ Successfully added new route 'users' to project 'my-first-api'
+```
+
+
+
+Der Server startet automatisch neu und Sie verfügen nun über neue Endpunkte:
+
+- `GET /api/v1/users/` — alle Nutzer abrufen
+- `POST /api/v1/users/` — einen neuen Nutzer anlegen
+- `GET /api/v1/users/{user_id}` — einen bestimmten Nutzer abrufen
+- und mehr…
+
+### Ihre neue Route testen
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/users/" \
+ -H "Content-Type: application/json" \
+ -d '{"title": "John Doe", "description": "Software Developer"}'
+{
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+}
+
+$ curl http://127.0.0.1:8000/api/v1/users/
+[
+ {
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+ }
+]
+```
+
+
+
+## Schritt 9: Den Code erkunden und anpassen
+
+Nehmen wir eine kleine Anpassung vor, um zu verstehen, wie der Code funktioniert.
+
+### Die Willkommensnachricht anpassen
+
+Öffnen Sie `src/main.py` in Ihrem Texteditor und ändern Sie den Root-Endpunkt:
+
+```python
+@app.get("/")
+def read_root():
+ return {"message": "Welcome to my first FastAPI application!"}
+```
+
+Speichern Sie die Datei. Dank automatischem Neuladen startet Ihr Server automatisch neu.
+
+### Die Änderung testen
+
+
+
+```console
+$ curl http://127.0.0.1:8000
+{"message":"Welcome to my first FastAPI application!"}
+```
+
+
+
+### Einen neuen Endpunkt hinzufügen
+
+Fügen wir einen einfachen Endpunkt in `src/main.py` hinzu:
+
+```python
+@app.get("/hello/{name}")
+def say_hello(name: str):
+ return {"message": f"Hello, {name}!"}
+```
+
+### Den neuen Endpunkt testen
+
+
+
+```console
+$ curl http://127.0.0.1:8000/hello/World
+{"message":"Hello, World!"}
+
+$ curl http://127.0.0.1:8000/hello/FastAPI
+{"message":"Hello, FastAPI!"}
+```
+
+
+
+## Schritt 10: Tests ausführen
+
+Ihr Projekt enthält vorkonfigurierte Tests. Lassen Sie sie laufen:
+
+
+
+```console
+$ python -m pytest
+======================== test session starts ========================
+collected 5 items
+
+tests/test_items.py::test_create_item PASSED
+tests/test_items.py::test_read_items PASSED
+tests/test_items.py::test_read_item PASSED
+tests/test_items.py::test_update_item PASSED
+tests/test_items.py::test_delete_item PASSED
+
+======================== 5 passed in 0.45s ========================
+```
+
+
+
+## Kernkonzepte verstehen
+
+### 1. Struktur einer FastAPI-Anwendung
+
+FastAPI-fastkit folgt einer **modularen Architektur**:
+
+- **`main.py`**: Einstiegspunkt der Anwendung und globale Endpunkte
+- **`api/`**: Organisation der API-Routen
+- **`core/`**: Konfiguration und Einstellungen der Anwendung
+- **`crud/`**: Geschäftslogik und Datenoperationen
+- **`schemas/`**: Datenvalidierung und Serialisierung
+- **`tests/`**: Automatisierte Tests
+
+### 2. Abhängigkeitsverwaltung
+
+Ihr Projekt nutzt moderne Python-Abhängigkeitsverwaltung:
+
+- **Virtuelle Umgebung**: isolierte Python-Umgebung
+- **requirements.txt**: listet alle Abhängigkeiten
+- **Automatische Installation**: Abhängigkeiten werden bei der Projekterstellung installiert
+
+### 3. Entwicklungsserver
+
+FastAPI-fastkit verwendet **Uvicorn** als ASGI-Server:
+
+- **Automatisches Neuladen**: startet automatisch neu, wenn sich Code ändert
+- **Schneller Start**: schnelle Entwicklungsiteration
+- **Produktionsreif**: derselbe Server wird in der Produktion verwendet
+
+### 4. API-Dokumentation
+
+FastAPI generiert automatisch:
+
+- **OpenAPI-Spezifikation**: branchenstandardisierte API-Dokumentation
+- **Swagger UI**: interaktive Testoberfläche
+- **ReDoc**: alternative Dokumentationsansicht
+
+## Nächste Schritte
+
+Glückwunsch! Sie haben erfolgreich:
+
+✅ FastAPI-fastkit installiert
+✅ Ihr erstes Projekt erstellt
+✅ den Entwicklungsserver gestartet
+✅ Ihre API-Endpunkte getestet
+✅ eine neue Route hinzugefügt
+✅ vorhandenen Code angepasst
+✅ Tests ausgeführt
+
+### Weiter lernen
+
+1. **[Ihr erstes Projekt](first-project.md)**: bauen Sie eine vollständige Blog-API mit fortgeschrittenen Funktionen
+2. **[Routen hinzufügen](../user-guide/adding-routes.md)**: lernen Sie, komplexe API-Endpunkte zu erstellen
+3. **[Vorlagen verwenden](../user-guide/using-templates.md)**: erkunden Sie vorgefertigte Projektvorlagen
+
+### Mehr experimentieren
+
+Probieren Sie diese Herausforderungen aus:
+
+1. **Validierung hinzufügen**: erweitern Sie Schemata um Validierungsregeln
+2. **Benutzerdefinierte Antworten**: ändern Sie Antwortformate in Routen
+3. **Umgebungsvariablen**: nutzen Sie `.env`-Dateien für Konfiguration
+4. **Middleware hinzufügen**: implementieren Sie CORS oder Authentifizierung
+5. **Datenbankintegration**: wechseln Sie auf den STANDARD-Stack für Datenbankunterstützung
+
+### Häufige Probleme und Lösungen
+
+**Server startet nicht:**
+
+- Prüfen Sie, dass Sie im Projektverzeichnis sind
+- Stellen Sie sicher, dass die virtuelle Umgebung aktiviert ist
+- Überprüfen Sie, dass keine Syntaxfehler im Code vorliegen
+
+**Import-Fehler:**
+
+- Stellen Sie sicher, dass alle `__init__.py`-Dateien existieren
+- Prüfen Sie, dass Ihre Importpfade korrekt sind
+- Vergewissern Sie sich, dass Sie die virtuelle Umgebung nutzen
+
+**Port bereits in Verwendung:**
+```console
+$ fastkit runserver --port 8080
+```
+
+## Best Practices, die Sie gelernt haben
+
+1. **Virtuelle Umgebungen**: immer isolierte Umgebungen verwenden
+2. **Projektstruktur**: organisierter, modularer Architektur folgen
+3. **Automatisches Neuladen**: Entwicklungsserver für schnelle Iteration nutzen
+4. **API-Dokumentation**: automatische Dokumentationsgenerierung ausnutzen
+5. **Testen**: Tests während der Entwicklung regelmäßig ausführen
+
+!!! tip "Entwicklungstipps"
+ - Halten Sie den Entwicklungsserver während des Codens am Laufen
+ - Nutzen Sie die interaktive Doku (`/docs`), um Ihre APIs zu testen
+ - Beobachten Sie das Terminal auf hilfreiche Fehlermeldungen
+ - Committen Sie Ihren Code regelmäßig in die Versionsverwaltung
+
+Sie sind nun bereit, beeindruckende APIs mit FastAPI-fastkit zu bauen! 🚀
diff --git a/docs/de/tutorial/mcp-integration.md b/docs/de/tutorial/mcp-integration.md
new file mode 100644
index 0000000..4189256
--- /dev/null
+++ b/docs/de/tutorial/mcp-integration.md
@@ -0,0 +1,1730 @@
+# MCP-Integration (Model Context Protocol)
+
+Lernen Sie, wie Sie das Model Context Protocol (MCP) mit FastAPI integrieren, um ein System aufzubauen, in dem KI-Modelle API-Endpunkte als Werkzeuge nutzen können. Wir implementieren eine vollständige KI-integrierte API mit Authentifizierung, Berechtigungsverwaltung und MCP-Server-Implementierung anhand der Vorlage `fastapi-mcp`.
+
+## Was Sie in diesem Tutorial lernen
+
+- Konzepte und Implementierung des Model Context Protocol (MCP)
+- Ein JWT-basiertes Authentifizierungssystem aufbauen
+- Rollenbasierte Zugriffskontrolle (RBAC) implementieren
+- MCP-Werkzeuge bereitstellen und verwalten
+- Sichere API-Kommunikation mit KI-Modellen
+- Verwaltung von Nutzersitzungen und Kontext
+
+## Voraussetzungen
+
+- Das [Tutorial Benutzerdefinierte Antwortbehandlung](custom-response-handling.md) abgeschlossen
+- Verständnis der Grundkonzepte von JWT und OAuth2
+- Konzepte der API-Kommunikation mit KI/LLM-Modellen
+- Grundkenntnisse des MCP-Protokolls
+
+## Was ist das Model Context Protocol (MCP)?
+
+MCP ist ein standardisiertes Protokoll, das es KI-Modellen ermöglicht, mit externen Systemen zu interagieren.
+
+### Klassischer Ansatz vs. MCP
+
+**Klassischer Ansatz (direkte API-Aufrufe):**
+```
+AI Model → HTTP Request → API Server → Response
+```
+
+**MCP-Ansatz:**
+```
+AI Model → MCP Client → MCP Server (FastAPI) → Safe Tool Execution → Response
+```
+
+### Vorteile von MCP
+
+- **Sicherheit**: integrierte Authentifizierung und Berechtigungsverwaltung
+- **Standardisierung**: konsistente Schnittstellenbereitstellung
+- **Kontextverwaltung**: sitzungsbasierter Statuserhalt
+- **Werkzeug-Abstraktion**: komplexe APIs als einfache Werkzeuge bereitstellen
+
+## Schritt 1: Ein MCP-Integrationsprojekt erstellen
+
+Erstellen Sie ein Projekt mit der Vorlage `fastapi-mcp`:
+
+
+
+```console
+$ fastkit startdemo fastapi-mcp
+Enter the project name: ai-integrated-api
+Enter the author name: Developer Kim
+Enter the author email: developer@example.com
+Enter the project description: MCP-based API server integrated with AI models
+Deploying FastAPI project using 'fastapi-mcp' template
+
+ Project Information
+┌──────────────┬─────────────────────────────────────────────┐
+│ Project Name │ ai-integrated-api │
+│ Author │ Developer Kim │
+│ Author Email │ developer@example.com │
+│ Description │ MCP-based API server integrated with AI models │
+└──────────────┴─────────────────────────────────────────────┘
+
+ Template Dependencies
+┌──────────────┬────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ pydantic │
+│ Dependency 4 │ python-jose │
+│ Dependency 5 │ passlib │
+│ Dependency 6 │ python-multipart│
+│ Dependency 7 │ mcp │
+└──────────────┴────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'ai-integrated-api' from 'fastapi-mcp' has been created successfully!
+```
+
+
+
+## Schritt 2: Projektstruktur analysieren
+
+Sehen wir uns die Struktur des generierten Projekts an:
+
+```
+ai-integrated-api/
+├── src/
+│ ├── main.py # FastAPI application
+│ ├── auth/
+│ │ ├── __init__.py
+│ │ ├── models.py # Authentication-related data models
+│ │ ├── jwt_handler.py # JWT token processing
+│ │ ├── dependencies.py # Authentication dependencies
+│ │ └── routes.py # Authentication router
+│ ├── mcp/
+│ │ ├── __init__.py
+│ │ ├── server.py # MCP server implementation
+│ │ ├── tools.py # MCP tool definitions
+│ │ └── client.py # MCP client (for testing)
+│ ├── api/
+│ │ ├── __init__.py
+│ │ ├── api.py # Sammlung der API-Router
+│ │ └── routes/
+│ │ ├── items.py # API zur Item-Verwaltung
+│ │ ├── users.py # API zur Benutzerverwaltung
+│ │ └── admin.py # Admin-API
+│ ├── schemas/
+│ │ ├── __init__.py
+│ │ ├── auth.py # Authentication schemas
+│ │ ├── users.py # User schemas
+│ │ └── items.py # Item schemas
+│ └── core/
+│ ├── __init__.py
+│ ├── config.py # Configuration
+│ ├── database.py # Database (in-memory)
+│ └── security.py # Security configuration
+└── tests/
+ ├── test_auth.py # Authentication tests
+ ├── test_mcp.py # MCP tests
+ └── test_integration.py # Integration tests
+```
+
+## Schritt 3: Authentifizierungssystem implementieren
+
+### Verarbeitung von JWT-Tokens (`src/auth/jwt_handler.py`)
+
+```python
+from datetime import datetime, timedelta
+from typing import Optional, Dict, Any
+from jose import JWTError, jwt
+from passlib.context import CryptContext
+
+from src.core.config import settings
+
+# Password hashing
+pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+
+def verify_password(plain_password: str, hashed_password: str) -> bool:
+ """Password verification"""
+ return pwd_context.verify(plain_password, hashed_password)
+
+def get_password_hash(password: str) -> str:
+ """Password hashing"""
+ return pwd_context.hash(password)
+
+def create_access_token(data: Dict[str, Any], expires_delta: Optional[timedelta] = None) -> str:
+ """Access token generation"""
+ to_encode = data.copy()
+
+ if expires_delta:
+ expire = datetime.utcnow() + expires_delta
+ else:
+ expire = datetime.utcnow() + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
+
+ to_encode.update({"exp": expire, "iat": datetime.utcnow()})
+
+ encoded_jwt = jwt.encode(
+ to_encode,
+ settings.SECRET_KEY,
+ algorithm=settings.ALGORITHM
+ )
+
+ return encoded_jwt
+
+def create_refresh_token(user_id: str) -> str:
+ """Refresh token generation"""
+ data = {"sub": user_id, "type": "refresh"}
+ expire = datetime.utcnow() + timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS)
+
+ to_encode = data.copy()
+ to_encode.update({"exp": expire, "iat": datetime.utcnow()})
+
+ return jwt.encode(
+ to_encode,
+ settings.SECRET_KEY,
+ algorithm=settings.ALGORITHM
+ )
+
+def decode_token(token: str) -> Optional[Dict[str, Any]]:
+ """Token decoding"""
+ try:
+ payload = jwt.decode(
+ token,
+ settings.SECRET_KEY,
+ algorithms=[settings.ALGORITHM]
+ )
+ return payload
+ except JWTError:
+ return None
+
+def verify_token(token: str, token_type: str = "access") -> Optional[str]:
+ """Token verification and user ID return"""
+ payload = decode_token(token)
+
+ if not payload:
+ return None
+
+ # Token type verification
+ if token_type == "refresh" and payload.get("type") != "refresh":
+ return None
+
+ user_id = payload.get("sub")
+ if not user_id:
+ return None
+
+ return user_id
+
+class TokenManager:
+ """Token management class"""
+
+ def __init__(self):
+ self.blacklisted_tokens = set()
+
+ def blacklist_token(self, token: str):
+ """Add token to blacklist"""
+ self.blacklisted_tokens.add(token)
+
+ def is_blacklisted(self, token: str) -> bool:
+ """Check if token is blacklisted"""
+ return token in self.blacklisted_tokens
+
+ def create_token_pair(self, user_id: str, user_role: str) -> Dict[str, str]:
+ """Create access/refresh token pair"""
+ access_token_data = {
+ "sub": user_id,
+ "role": user_role,
+ "type": "access"
+ }
+
+ access_token = create_access_token(access_token_data)
+ refresh_token = create_refresh_token(user_id)
+
+ return {
+ "access_token": access_token,
+ "refresh_token": refresh_token,
+ "token_type": "bearer"
+ }
+
+# Global token manager
+token_manager = TokenManager()
+```
+
+### Nutzermodelle und Datenbank (`src/auth/models.py`)
+
+```python
+from typing import List, Optional, Dict, Any
+from pydantic import BaseModel, EmailStr
+from enum import Enum
+from datetime import datetime
+
+class UserRole(str, Enum):
+ """User roles"""
+ ADMIN = "admin"
+ USER = "user"
+ AI_AGENT = "ai_agent"
+ READONLY = "readonly"
+
+class Permission(str, Enum):
+ """Permissions"""
+ READ_ITEMS = "read:items"
+ WRITE_ITEMS = "write:items"
+ DELETE_ITEMS = "delete:items"
+ MANAGE_USERS = "manage:users"
+ USE_MCP_TOOLS = "use:mcp_tools"
+ ADMIN_MCP = "admin:mcp"
+
+class User(BaseModel):
+ """User model"""
+ id: str
+ email: EmailStr
+ username: str
+ full_name: Optional[str] = None
+ role: UserRole
+ permissions: List[Permission]
+ is_active: bool = True
+ created_at: datetime
+ last_login: Optional[datetime] = None
+ api_key: Optional[str] = None # For MCP client
+
+class UserInDB(User):
+ """User model for database storage"""
+ hashed_password: str
+
+class UserCreate(BaseModel):
+ """User creation schema"""
+ email: EmailStr
+ username: str
+ password: str
+ full_name: Optional[str] = None
+ role: UserRole = UserRole.USER
+
+class UserUpdate(BaseModel):
+ """User update schema"""
+ email: Optional[EmailStr] = None
+ username: Optional[str] = None
+ full_name: Optional[str] = None
+ role: Optional[UserRole] = None
+ is_active: Optional[bool] = None
+
+class LoginRequest(BaseModel):
+ """Login request schema"""
+ username: str
+ password: str
+
+class TokenResponse(BaseModel):
+ """Token response schema"""
+ access_token: str
+ refresh_token: str
+ token_type: str = "bearer"
+ expires_in: int
+ user: User
+
+# Default permission mapping by role
+ROLE_PERMISSIONS = {
+ UserRole.ADMIN: [
+ Permission.READ_ITEMS,
+ Permission.WRITE_ITEMS,
+ Permission.DELETE_ITEMS,
+ Permission.MANAGE_USERS,
+ Permission.USE_MCP_TOOLS,
+ Permission.ADMIN_MCP
+ ],
+ UserRole.USER: [
+ Permission.READ_ITEMS,
+ Permission.WRITE_ITEMS,
+ Permission.USE_MCP_TOOLS
+ ],
+ UserRole.AI_AGENT: [
+ Permission.READ_ITEMS,
+ Permission.WRITE_ITEMS,
+ Permission.USE_MCP_TOOLS
+ ],
+ UserRole.READONLY: [
+ Permission.READ_ITEMS
+ ]
+}
+
+class UserDatabase:
+ """Memory-based user database"""
+
+ def __init__(self):
+ self.users: Dict[str, UserInDB] = {}
+ self._init_default_users()
+
+ def _init_default_users(self):
+ """Create default users"""
+ from src.auth.jwt_handler import get_password_hash
+ import uuid
+
+ # Admin account
+ admin_id = str(uuid.uuid4())
+ self.users[admin_id] = UserInDB(
+ id=admin_id,
+ email="admin@example.com",
+ username="admin",
+ full_name="System Administrator",
+ role=UserRole.ADMIN,
+ permissions=ROLE_PERMISSIONS[UserRole.ADMIN],
+ hashed_password=get_password_hash("admin123"),
+ created_at=datetime.utcnow(),
+ api_key=str(uuid.uuid4())
+ )
+
+ # AI agent account
+ ai_id = str(uuid.uuid4())
+ self.users[ai_id] = UserInDB(
+ id=ai_id,
+ email="ai@example.com",
+ username="ai_agent",
+ full_name="AI Assistant",
+ role=UserRole.AI_AGENT,
+ permissions=ROLE_PERMISSIONS[UserRole.AI_AGENT],
+ hashed_password=get_password_hash("ai123"),
+ created_at=datetime.utcnow(),
+ api_key=str(uuid.uuid4())
+ )
+
+ def get_user_by_username(self, username: str) -> Optional[UserInDB]:
+ """Get user by username"""
+ return next(
+ (user for user in self.users.values() if user.username == username),
+ None
+ )
+
+ def get_user_by_id(self, user_id: str) -> Optional[UserInDB]:
+ """Get user by ID"""
+ return self.users.get(user_id)
+
+ def get_user_by_api_key(self, api_key: str) -> Optional[UserInDB]:
+ """Get user by API key"""
+ return next(
+ (user for user in self.users.values() if user.api_key == api_key),
+ None
+ )
+
+ def create_user(self, user_create: UserCreate) -> UserInDB:
+ """Create user"""
+ import uuid
+ from src.auth.jwt_handler import get_password_hash
+
+ user_id = str(uuid.uuid4())
+ user = UserInDB(
+ id=user_id,
+ email=user_create.email,
+ username=user_create.username,
+ full_name=user_create.full_name,
+ role=user_create.role,
+ permissions=ROLE_PERMISSIONS[user_create.role],
+ hashed_password=get_password_hash(user_create.password),
+ created_at=datetime.utcnow(),
+ api_key=str(uuid.uuid4())
+ )
+
+ self.users[user_id] = user
+ return user
+
+ def update_user(self, user_id: str, user_update: UserUpdate) -> Optional[UserInDB]:
+ """Update user"""
+ if user_id not in self.users:
+ return None
+
+ user = self.users[user_id]
+ update_data = user_update.dict(exclude_unset=True)
+
+ for field, value in update_data.items():
+ setattr(user, field, value)
+
+ # Update permissions if role changed
+ if "role" in update_data:
+ user.permissions = ROLE_PERMISSIONS[user.role]
+
+ return user
+
+ def update_last_login(self, user_id: str):
+ """Update last login time"""
+ if user_id in self.users:
+ self.users[user_id].last_login = datetime.utcnow()
+
+# Global database instance
+user_db = UserDatabase()
+```
+
+## Schritt 4: Authentifizierungs-Dependencies implementieren
+
+### Authentifizierungs-Dependencies (`src/auth/dependencies.py`)
+
+```python
+from typing import Optional, List
+from fastapi import Depends, HTTPException, status, Security
+from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials, APIKeyHeader
+from jose import JWTError
+
+from src.auth.jwt_handler import decode_token, token_manager
+from src.auth.models import User, UserInDB, Permission, user_db
+
+# Security schema
+security = HTTPBearer()
+api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
+
+async def get_current_user(
+ credentials: HTTPAuthorizationCredentials = Security(security)
+) -> User:
+ """Get current authenticated user"""
+ credentials_exception = HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Could not validate credentials",
+ headers={"WWW-Authenticate": "Bearer"},
+ )
+
+ try:
+ token = credentials.credentials
+
+ # Check blacklist
+ if token_manager.is_blacklisted(token):
+ raise credentials_exception
+
+ payload = decode_token(token)
+ if payload is None:
+ raise credentials_exception
+
+ user_id: str = payload.get("sub")
+ if user_id is None:
+ raise credentials_exception
+
+ except JWTError:
+ raise credentials_exception
+
+ user = user_db.get_user_by_id(user_id)
+ if user is None:
+ raise credentials_exception
+
+ if not user.is_active:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail="Inactive user"
+ )
+
+ return User(**user.dict())
+
+async def get_current_user_by_api_key(
+ api_key: Optional[str] = Security(api_key_header)
+) -> Optional[User]:
+ """Authenticate user by API key"""
+ if not api_key:
+ return None
+
+ user = user_db.get_user_by_api_key(api_key)
+ if not user or not user.is_active:
+ return None
+
+ return User(**user.dict())
+
+async def get_current_user_flexible(
+ token_user: Optional[User] = Depends(get_current_user),
+ api_key_user: Optional[User] = Depends(get_current_user_by_api_key)
+) -> User:
+ """Authenticate user by token or API key (flexible authentication)"""
+ user = token_user or api_key_user
+
+ if not user:
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Authentication required"
+ )
+
+ return user
+
+def require_permissions(*required_permissions: Permission):
+ """Dependency requiring specific permissions"""
+ def permission_checker(current_user: User = Depends(get_current_user_flexible)) -> User:
+ for permission in required_permissions:
+ if permission not in current_user.permissions:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail=f"Permission '{permission}' required"
+ )
+ return current_user
+
+ return permission_checker
+
+def require_roles(*required_roles):
+ """Dependency requiring specific roles"""
+ def role_checker(current_user: User = Depends(get_current_user_flexible)) -> User:
+ if current_user.role not in required_roles:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail=f"Role must be one of: {', '.join(required_roles)}"
+ )
+ return current_user
+
+ return role_checker
+
+# Common permission dependencies
+RequireAdmin = require_roles("admin")
+RequireReadItems = require_permissions(Permission.READ_ITEMS)
+RequireWriteItems = require_permissions(Permission.WRITE_ITEMS)
+RequireDeleteItems = require_permissions(Permission.DELETE_ITEMS)
+RequireMCPTools = require_permissions(Permission.USE_MCP_TOOLS)
+RequireAdminMCP = require_permissions(Permission.ADMIN_MCP)
+```
+
+### Authentifizierungs-Router (`src/auth/routes.py`)
+
+```python
+from datetime import timedelta
+from fastapi import APIRouter, Depends, HTTPException, status
+from fastapi.security import OAuth2PasswordRequestForm
+
+from src.auth.models import (
+ User, UserCreate, UserUpdate, LoginRequest, TokenResponse,
+ user_db, UserRole
+)
+from src.auth.jwt_handler import (
+ verify_password, token_manager, verify_token, create_access_token
+)
+from src.auth.dependencies import get_current_user, RequireAdmin
+from src.core.config import settings
+
+router = APIRouter(prefix="/auth", tags=["authentication"])
+
+@router.post("/register", response_model=User)
+async def register_user(user_create: UserCreate):
+ """Register user"""
+ # Check duplicate username
+ if user_db.get_user_by_username(user_create.username):
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail="Username already registered"
+ )
+
+ # First user is automatically set as admin
+ if not user_db.users:
+ user_create.role = UserRole.ADMIN
+
+ user = user_db.create_user(user_create)
+ return User(**user.dict())
+
+@router.post("/login", response_model=TokenResponse)
+async def login_user(form_data: OAuth2PasswordRequestForm = Depends()):
+ """User login"""
+ user = user_db.get_user_by_username(form_data.username)
+
+ if not user or not verify_password(form_data.password, user.hashed_password):
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Incorrect username or password",
+ headers={"WWW-Authenticate": "Bearer"},
+ )
+
+ if not user.is_active:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail="Inactive user"
+ )
+
+ # Create token
+ tokens = token_manager.create_token_pair(user.id, user.role)
+
+ # Update last login time
+ user_db.update_last_login(user.id)
+
+ return TokenResponse(
+ access_token=tokens["access_token"],
+ refresh_token=tokens["refresh_token"],
+ token_type=tokens["token_type"],
+ expires_in=settings.ACCESS_TOKEN_EXPIRE_MINUTES * 60,
+ user=User(**user.dict())
+ )
+
+@router.post("/refresh", response_model=dict)
+async def refresh_token(refresh_token: str):
+ """Refresh token"""
+ user_id = verify_token(refresh_token, "refresh")
+
+ if not user_id:
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Invalid refresh token"
+ )
+
+ user = user_db.get_user_by_id(user_id)
+ if not user or not user.is_active:
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="User not found or inactive"
+ )
+
+ # Create new token pair
+ tokens = token_manager.create_token_pair(user.id, user.role)
+
+ return {
+ "access_token": tokens["access_token"],
+ "refresh_token": tokens["refresh_token"],
+ "token_type": tokens["token_type"],
+ "expires_in": settings.ACCESS_TOKEN_EXPIRE_MINUTES * 60
+ }
+
+@router.post("/logout")
+async def logout_user(current_user: User = Depends(get_current_user)):
+ """Benutzer abmelden"""
+ # In einer echten Implementierung würde das Token hier auf eine Sperrliste gesetzt
+ return {"message": "Successfully logged out"}
+
+@router.get("/me", response_model=User)
+async def get_current_user_info(current_user: User = Depends(get_current_user)):
+ """Get current user information"""
+ return current_user
+
+@router.put("/me", response_model=User)
+async def update_current_user(
+ user_update: UserUpdate,
+ current_user: User = Depends(get_current_user)
+):
+ """Update current user information"""
+ # Normal users cannot change role
+ if user_update.role and current_user.role != UserRole.ADMIN:
+ user_update.role = None
+
+ updated_user = user_db.update_user(current_user.id, user_update)
+ if not updated_user:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="User not found"
+ )
+
+ return User(**updated_user.dict())
+
+@router.get("/users", response_model=list[User])
+async def list_users(admin_user: User = Depends(RequireAdmin)):
+ """Get user list (admin only)"""
+ return [User(**user.dict()) for user in user_db.users.values()]
+
+@router.post("/users/{user_id}/generate-api-key")
+async def generate_api_key(
+ user_id: str,
+ admin_user: User = Depends(RequireAdmin)
+):
+ """Create user API key (admin only)"""
+ import uuid
+
+ user = user_db.get_user_by_id(user_id)
+ if not user:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="User not found"
+ )
+
+ # Create new API key
+ new_api_key = str(uuid.uuid4())
+ user.api_key = new_api_key
+
+ return {
+ "api_key": new_api_key,
+ "message": "API key generated successfully"
+ }
+```
+
+## Schritt 5: MCP-Server implementieren
+
+### Werkzeugdefinitionen (`src/mcp/tools.py`)
+
+```python
+from typing import Dict, Any, List, Optional
+from pydantic import BaseModel, Field
+from enum import Enum
+
+class ToolCategory(str, Enum):
+ """Tool category"""
+ DATA_MANAGEMENT = "data_management"
+ SEARCH = "search"
+ ANALYSIS = "analysis"
+ ADMIN = "admin"
+
+class MCPTool(BaseModel):
+ """MCP tool definition"""
+ name: str = Field(..., description="Tool name")
+ description: str = Field(..., description="Tool description")
+ category: ToolCategory = Field(..., description="Tool category")
+ parameters: Dict[str, Any] = Field(default_factory=dict, description="Parameter schema")
+ required_permissions: List[str] = Field(default_factory=list, description="Required permissions")
+ examples: List[Dict[str, Any]] = Field(default_factory=list, description="Usage examples")
+
+class ToolRegistry:
+ """Tool registry"""
+
+ def __init__(self):
+ self.tools: Dict[str, MCPTool] = {}
+ self._register_default_tools()
+
+ def _register_default_tools(self):
+ """Register default tools"""
+
+ # Create item tool
+ self.register_tool(MCPTool(
+ name="create_item",
+ description="Create a new item",
+ category=ToolCategory.DATA_MANAGEMENT,
+ parameters={
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Item name"
+ },
+ "description": {
+ "type": "string",
+ "description": "Item description"
+ },
+ "price": {
+ "type": "number",
+ "description": "Item price",
+ "minimum": 0
+ },
+ "category": {
+ "type": "string",
+ "description": "Item category"
+ }
+ },
+ "required": ["name", "price"]
+ },
+ required_permissions=["write:items"],
+ examples=[
+ {
+ "name": "Notebook",
+ "description": "High-performance gaming notebook",
+ "price": 1500000,
+ "category": "electronics"
+ }
+ ]
+ ))
+
+ # Search item tool
+ self.register_tool(MCPTool(
+ name="search_items",
+ description="Search for items",
+ category=ToolCategory.SEARCH,
+ parameters={
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "description": "Search query"
+ },
+ "category": {
+ "type": "string",
+ "description": "Category filter"
+ },
+ "min_price": {
+ "type": "number",
+ "description": "Minimum price"
+ },
+ "max_price": {
+ "type": "number",
+ "description": "Maximum price"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "Result count limit",
+ "default": 10,
+ "maximum": 100
+ }
+ },
+ "required": ["query"]
+ },
+ required_permissions=["read:items"],
+ examples=[
+ {
+ "query": "Notebook",
+ "category": "electronics",
+ "max_price": 2000000,
+ "limit": 5
+ }
+ ]
+ ))
+
+ # Analyze item tool
+ self.register_tool(MCPTool(
+ name="analyze_items",
+ description="Analyze item data",
+ category=ToolCategory.ANALYSIS,
+ parameters={
+ "type": "object",
+ "properties": {
+ "analysis_type": {
+ "type": "string",
+ "enum": ["price_distribution", "category_breakdown", "trend_analysis"],
+ "description": "Analysis type"
+ },
+ "date_range": {
+ "type": "object",
+ "properties": {
+ "start_date": {"type": "string", "format": "date"},
+ "end_date": {"type": "string", "format": "date"}
+ },
+ "description": "Analysis period"
+ }
+ },
+ "required": ["analysis_type"]
+ },
+ required_permissions=["read:items"],
+ examples=[
+ {
+ "analysis_type": "price_distribution",
+ "date_range": {
+ "start_date": "2024-01-01",
+ "end_date": "2024-12-31"
+ }
+ }
+ ]
+ ))
+
+ # Manage user tool (admin only)
+ self.register_tool(MCPTool(
+ name="manage_users",
+ description="Manage users",
+ category=ToolCategory.ADMIN,
+ parameters={
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["list", "create", "update", "deactivate"],
+ "description": "Action to perform"
+ },
+ "user_data": {
+ "type": "object",
+ "description": "User data (create/update)"
+ },
+ "user_id": {
+ "type": "string",
+ "description": "User ID (update/deactivate)"
+ }
+ },
+ "required": ["action"]
+ },
+ required_permissions=["manage:users"],
+ examples=[
+ {
+ "action": "list"
+ },
+ {
+ "action": "create",
+ "user_data": {
+ "username": "newuser",
+ "email": "newuser@example.com",
+ "role": "user"
+ }
+ }
+ ]
+ ))
+
+ def register_tool(self, tool: MCPTool):
+ """Register tool"""
+ self.tools[tool.name] = tool
+
+ def get_tool(self, tool_name: str) -> Optional[MCPTool]:
+ """Get tool"""
+ return self.tools.get(tool_name)
+
+ def list_tools(self, user_permissions: List[str] = None) -> List[MCPTool]:
+ """List tools by user permissions"""
+ if user_permissions is None:
+ return list(self.tools.values())
+
+ available_tools = []
+ for tool in self.tools.values():
+ # Check permissions
+ if all(perm in user_permissions for perm in tool.required_permissions):
+ available_tools.append(tool)
+
+ return available_tools
+
+ def get_tools_by_category(self, category: ToolCategory, user_permissions: List[str] = None) -> List[MCPTool]:
+ """List tools by category"""
+ tools = self.list_tools(user_permissions)
+ return [tool for tool in tools if tool.category == category]
+
+# Global tool registry
+tool_registry = ToolRegistry()
+```
+
+### MCP-Server-Implementierung (`src/mcp/server.py`)
+
+```python
+from typing import Dict, Any, List, Optional
+from fastapi import HTTPException, status
+import asyncio
+import json
+
+from src.mcp.tools import tool_registry, ToolCategory
+from src.auth.models import User, Permission
+from src.api.routes.items import ItemCRUD
+from src.auth.models import user_db
+
+class MCPServer:
+ """Model Context Protocol server"""
+
+ def __init__(self):
+ self.item_crud = ItemCRUD()
+ self.active_sessions: Dict[str, Dict[str, Any]] = {}
+
+ async def create_session(self, user: User) -> str:
+ """Create MCP session"""
+ import uuid
+
+ session_id = str(uuid.uuid4())
+ self.active_sessions[session_id] = {
+ "user_id": user.id,
+ "user": user,
+ "created_at": datetime.utcnow(),
+ "context": {},
+ "tool_usage_count": 0,
+ "last_activity": datetime.utcnow()
+ }
+
+ return session_id
+
+ async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
+ """Get session"""
+ session = self.active_sessions.get(session_id)
+ if session:
+ session["last_activity"] = datetime.utcnow()
+ return session
+
+ async def close_session(self, session_id: str):
+ """Close session"""
+ if session_id in self.active_sessions:
+ del self.active_sessions[session_id]
+
+ async def list_tools(self, user: User) -> List[Dict[str, Any]]:
+ """List tools available to user"""
+ user_permissions = [perm.value for perm in user.permissions]
+ tools = tool_registry.list_tools(user_permissions)
+
+ return [
+ {
+ "name": tool.name,
+ "description": tool.description,
+ "category": tool.category,
+ "parameters": tool.parameters,
+ "examples": tool.examples
+ }
+ for tool in tools
+ ]
+
+ async def execute_tool(
+ self,
+ tool_name: str,
+ parameters: Dict[str, Any],
+ user: User,
+ session_id: Optional[str] = None
+ ) -> Dict[str, Any]:
+ """Execute tool"""
+
+ # Check if tool exists
+ tool = tool_registry.get_tool(tool_name)
+ if not tool:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail=f"Tool '{tool_name}' not found"
+ )
+
+ # Check permissions
+ user_permissions = [perm.value for perm in user.permissions]
+ for required_perm in tool.required_permissions:
+ if required_perm not in user_permissions:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail=f"Permission '{required_perm}' required for tool '{tool_name}'"
+ )
+
+ # Update session
+ if session_id:
+ session = await self.get_session(session_id)
+ if session:
+ session["tool_usage_count"] += 1
+
+ # Execute tool
+ try:
+ result = await self._execute_tool_logic(tool_name, parameters, user)
+
+ return {
+ "success": True,
+ "tool": tool_name,
+ "result": result,
+ "timestamp": datetime.utcnow().isoformat()
+ }
+
+ except Exception as e:
+ return {
+ "success": False,
+ "tool": tool_name,
+ "error": str(e),
+ "timestamp": datetime.utcnow().isoformat()
+ }
+
+ async def _execute_tool_logic(
+ self,
+ tool_name: str,
+ parameters: Dict[str, Any],
+ user: User
+ ) -> Any:
+ """Execute tool logic"""
+
+ if tool_name == "create_item":
+ return await self._create_item(parameters)
+
+ elif tool_name == "search_items":
+ return await self._search_items(parameters)
+
+ elif tool_name == "analyze_items":
+ return await self._analyze_items(parameters)
+
+ elif tool_name == "manage_users":
+ return await self._manage_users(parameters, user)
+
+ else:
+ raise ValueError(f"Tool '{tool_name}' implementation not found")
+
+ async def _create_item(self, parameters: Dict[str, Any]) -> Dict[str, Any]:
+ """Create item tool implementation"""
+ from src.schemas.items import ItemCreate
+
+ try:
+ item_create = ItemCreate(**parameters)
+ created_item = await self.item_crud.create(item_create)
+
+ return {
+ "action": "create_item",
+ "item": created_item.dict(),
+ "message": f"Item '{created_item.name}' created successfully"
+ }
+ except Exception as e:
+ raise ValueError(f"Failed to create item: {str(e)}")
+
+ async def _search_items(self, parameters: Dict[str, Any]) -> Dict[str, Any]:
+ """Search item tool implementation"""
+ query = parameters.get("query", "")
+ category = parameters.get("category")
+ min_price = parameters.get("min_price")
+ max_price = parameters.get("max_price")
+ limit = parameters.get("limit", 10)
+
+ # Search logic implementation
+ all_items = await self.item_crud.get_all()
+ filtered_items = []
+
+ for item in all_items:
+ # Text search
+ if query.lower() not in item.name.lower() and query.lower() not in (item.description or "").lower():
+ continue
+
+ # Category filter
+ if category and getattr(item, 'category', None) != category:
+ continue
+
+ # Price filter
+ if min_price is not None and item.price < min_price:
+ continue
+ if max_price is not None and item.price > max_price:
+ continue
+
+ filtered_items.append(item)
+
+ # Result limit
+ result_items = filtered_items[:limit]
+
+ return {
+ "action": "search_items",
+ "query": query,
+ "total_found": len(filtered_items),
+ "returned_count": len(result_items),
+ "items": [item.dict() for item in result_items]
+ }
+
+ async def _analyze_items(self, parameters: Dict[str, Any]) -> Dict[str, Any]:
+ """Analyze item tool implementation"""
+ analysis_type = parameters.get("analysis_type")
+ date_range = parameters.get("date_range", {})
+
+ all_items = await self.item_crud.get_all()
+
+ if analysis_type == "price_distribution":
+ prices = [item.price for item in all_items]
+ if not prices:
+ return {"analysis": "price_distribution", "result": "No items found"}
+
+ return {
+ "analysis": "price_distribution",
+ "result": {
+ "total_items": len(prices),
+ "min_price": min(prices),
+ "max_price": max(prices),
+ "average_price": sum(prices) / len(prices),
+ "price_ranges": {
+ "under_100k": len([p for p in prices if p < 100000]),
+ "100k_to_500k": len([p for p in prices if 100000 <= p < 500000]),
+ "500k_to_1m": len([p for p in prices if 500000 <= p < 1000000]),
+ "over_1m": len([p for p in prices if p >= 1000000])
+ }
+ }
+ }
+
+ elif analysis_type == "category_breakdown":
+ categories = {}
+ for item in all_items:
+ category = getattr(item, 'category', 'uncategorized')
+ categories[category] = categories.get(category, 0) + 1
+
+ return {
+ "analysis": "category_breakdown",
+ "result": {
+ "total_categories": len(categories),
+ "categories": categories
+ }
+ }
+
+ else:
+ raise ValueError(f"Unknown analysis type: {analysis_type}")
+
+ async def _manage_users(self, parameters: Dict[str, Any], requesting_user: User) -> Dict[str, Any]:
+ """Manage user tool implementation"""
+ action = parameters.get("action")
+
+ # Check admin permissions
+ if Permission.MANAGE_USERS not in requesting_user.permissions:
+ raise ValueError("Insufficient permissions for user management")
+
+ if action == "list":
+ users = [User(**user.dict()) for user in user_db.users.values()]
+ return {
+ "action": "list_users",
+ "total_users": len(users),
+ "users": [user.dict() for user in users]
+ }
+
+ elif action == "create":
+ user_data = parameters.get("user_data", {})
+ from src.auth.models import UserCreate
+
+ user_create = UserCreate(**user_data)
+ created_user = user_db.create_user(user_create)
+
+ return {
+ "action": "create_user",
+ "user": User(**created_user.dict()).dict(),
+ "message": f"User '{created_user.username}' created successfully"
+ }
+
+ else:
+ raise ValueError(f"Unknown user management action: {action}")
+
+# Global MCP server instance
+mcp_server = MCPServer()
+```
+
+## Schritt 6: MCP-API-Endpunkte implementieren
+
+### MCP-API-Router (`src/api/routes/mcp.py`)
+
+```python
+from typing import Dict, Any, Optional
+from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks
+from pydantic import BaseModel
+
+from src.auth.dependencies import get_current_user_flexible, RequireMCPTools
+from src.auth.models import User
+from src.mcp.server import mcp_server
+from src.mcp.tools import ToolCategory
+
+router = APIRouter(prefix="/mcp", tags=["MCP"])
+
+class ToolExecuteRequest(BaseModel):
+ """Tool execution request"""
+ tool_name: str
+ parameters: Dict[str, Any]
+ session_id: Optional[str] = None
+
+class SessionCreateResponse(BaseModel):
+ """Session creation response"""
+ session_id: str
+ message: str
+
+@router.post("/session", response_model=SessionCreateResponse)
+async def create_mcp_session(
+ current_user: User = Depends(RequireMCPTools)
+):
+ """Create MCP session"""
+ session_id = await mcp_server.create_session(current_user)
+
+ return SessionCreateResponse(
+ session_id=session_id,
+ message=f"MCP session created (User: {current_user.username})"
+ )
+
+@router.delete("/session/{session_id}")
+async def close_mcp_session(
+ session_id: str,
+ current_user: User = Depends(RequireMCPTools)
+):
+ """Close MCP session"""
+ session = await mcp_server.get_session(session_id)
+
+ if not session:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Session not found"
+ )
+
+ # Check session owner
+ if session["user_id"] != current_user.id:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail="Cannot close another user's session"
+ )
+
+ await mcp_server.close_session(session_id)
+
+ return {"message": "Session closed successfully"}
+
+@router.get("/tools")
+async def list_mcp_tools(
+ category: Optional[ToolCategory] = None,
+ current_user: User = Depends(RequireMCPTools)
+):
+ """List available MCP tools"""
+ tools = await mcp_server.list_tools(current_user)
+
+ if category:
+ tools = [tool for tool in tools if tool["category"] == category]
+
+ return {
+ "user": current_user.username,
+ "total_tools": len(tools),
+ "tools": tools
+ }
+
+@router.post("/execute")
+async def execute_mcp_tool(
+ request: ToolExecuteRequest,
+ background_tasks: BackgroundTasks,
+ current_user: User = Depends(RequireMCPTools)
+):
+ """Execute MCP tool"""
+
+ # Check session (optional)
+ if request.session_id:
+ session = await mcp_server.get_session(request.session_id)
+ if not session:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail="Session not found"
+ )
+
+ if session["user_id"] != current_user.id:
+ raise HTTPException(
+ status_code=status.HTTP_403_FORBIDDEN,
+ detail="Cannot use another user's session"
+ )
+
+ # Execute tool
+ result = await mcp_server.execute_tool(
+ tool_name=request.tool_name,
+ parameters=request.parameters,
+ user=current_user,
+ session_id=request.session_id
+ )
+
+ # Log tool usage in background
+ background_tasks.add_task(
+ log_tool_usage,
+ current_user.id,
+ request.tool_name,
+ result["success"]
+ )
+
+ return result
+
+@router.get("/sessions")
+async def list_user_sessions(
+ current_user: User = Depends(RequireMCPTools)
+):
+ """List active user sessions"""
+ user_sessions = []
+
+ for session_id, session_data in mcp_server.active_sessions.items():
+ if session_data["user_id"] == current_user.id:
+ user_sessions.append({
+ "session_id": session_id,
+ "created_at": session_data["created_at"],
+ "tool_usage_count": session_data["tool_usage_count"],
+ "last_activity": session_data["last_activity"]
+ })
+
+ return {
+ "user": current_user.username,
+ "active_sessions": len(user_sessions),
+ "sessions": user_sessions
+ }
+
+@router.get("/stats")
+async def get_mcp_stats(
+ current_user: User = Depends(RequireMCPTools)
+):
+ """MCP usage statistics"""
+ total_sessions = len(mcp_server.active_sessions)
+ user_sessions = len([
+ s for s in mcp_server.active_sessions.values()
+ if s["user_id"] == current_user.id
+ ])
+
+ return {
+ "user_stats": {
+ "username": current_user.username,
+ "active_sessions": user_sessions,
+ "permissions": [perm.value for perm in current_user.permissions]
+ },
+ "server_stats": {
+ "total_active_sessions": total_sessions,
+ "available_tools": len(await mcp_server.list_tools(current_user))
+ }
+ }
+
+async def log_tool_usage(user_id: str, tool_name: str, success: bool):
+ """Log tool usage (background job)"""
+ import logging
+
+ logger = logging.getLogger("mcp.usage")
+ logger.info(
+ f"Tool usage - User: {user_id}, Tool: {tool_name}, Success: {success}"
+ )
+```
+
+## Schritt 7: Anwendungsintegration und Tests
+
+### Hauptanwendung (`src/main.py`)
+
+```python
+from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
+
+from src.auth.routes import router as auth_router
+from src.api.routes.items import router as items_router
+from src.api.routes.mcp import router as mcp_router
+from src.core.config import settings
+
+app = FastAPI(
+ title="AI Integrated API",
+ description="AI model integrated MCP-based API server",
+ version="1.0.0"
+)
+
+# CORS settings
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=settings.ALLOWED_HOSTS,
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+
+# Include routers
+app.include_router(auth_router)
+app.include_router(items_router, prefix="/api/v1")
+app.include_router(mcp_router, prefix="/api/v1")
+
+@app.get("/")
+async def root():
+ return {
+ "message": "AI Integrated API with MCP Support",
+ "version": "1.0.0",
+ "endpoints": {
+ "authentication": "/auth",
+ "items": "/api/v1/items",
+ "mcp": "/api/v1/mcp",
+ "docs": "/docs"
+ }
+ }
+
+@app.get("/health")
+async def health_check():
+ """Health check endpoint"""
+ return {
+ "status": "healthy",
+ "version": "1.0.0",
+ "services": {
+ "auth": "operational",
+ "mcp": "operational",
+ "database": "operational"
+ }
+ }
+```
+
+### Server starten und testen
+
+
+
+```console
+$ cd ai-integrated-api
+$ fastkit runserver
+Starting FastAPI server at 127.0.0.1:8000...
+
+# User login
+$ curl -X POST "http://localhost:8000/auth/login" \
+ -H "Content-Type: application/x-www-form-urlencoded" \
+ -d "username=admin&password=admin123"
+
+{
+ "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
+ "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
+ "token_type": "bearer",
+ "expires_in": 1800,
+ "user": {
+ "id": "123e4567-e89b-12d3-a456-426614174000",
+ "email": "admin@example.com",
+ "username": "admin",
+ "role": "admin",
+ "permissions": ["read:items", "write:items", ...]
+ }
+}
+
+# Create MCP session
+$ curl -X POST "http://localhost:8000/api/v1/mcp/session" \
+ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
+
+{
+ "session_id": "abc123-def456-ghi789",
+ "message": "MCP session created (User: admin)"
+}
+
+# List available tools
+$ curl "http://localhost:8000/api/v1/mcp/tools" \
+ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
+
+{
+ "user": "admin",
+ "total_tools": 4,
+ "tools": [
+ {
+ "name": "create_item",
+ "description": "Create a new item",
+ "category": "data_management",
+ "parameters": {...},
+ "examples": [...]
+ },
+ ...
+ ]
+}
+
+# Execute MCP tool (create item)
+$ curl -X POST "http://localhost:8000/api/v1/mcp/execute" \
+ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "tool_name": "create_item",
+ "parameters": {
+ "name": "AI generated item",
+ "description": "MCP through AI generated item",
+ "price": 500000,
+ "category": "ai_generated"
+ },
+ "session_id": "abc123-def456-ghi789"
+ }'
+
+{
+ "success": true,
+ "tool": "create_item",
+ "result": {
+ "action": "create_item",
+ "item": {
+ "id": 1,
+ "name": "AI generated item",
+ "description": "MCP through AI generated item",
+ "price": 500000,
+ "category": "ai_generated",
+ "created_at": "2024-01-01T12:00:00Z"
+ },
+ "message": "Item 'AI generated item' created successfully"
+ },
+ "timestamp": "2024-01-01T12:00:00.123456Z"
+}
+
+# Execute MCP tool (search item)
+$ curl -X POST "http://localhost:8000/api/v1/mcp/execute" \
+ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
+ -H "Content-Type: application/json" \
+ -d '{
+ "tool_name": "search_items",
+ "parameters": {
+ "query": "AI",
+ "limit": 5
+ }
+ }'
+```
+
+
+
+## Schritt 8: Beispiel eines KI-Clients
+
+### Python-MCP-Client-Beispiel
+
+```python
+# client_example.py
+import asyncio
+import aiohttp
+from typing import Dict, Any, List
+
+class MCPClient:
+ """MCP client example"""
+
+ def __init__(self, base_url: str, api_key: str):
+ self.base_url = base_url
+ self.api_key = api_key
+ self.session_id = None
+ self.session = None
+
+ async def __aenter__(self):
+ self.session = aiohttp.ClientSession(
+ headers={"X-API-Key": self.api_key}
+ )
+ return self
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ if self.session_id:
+ await self.close_session()
+ if self.session:
+ await self.session.close()
+
+ async def create_session(self) -> str:
+ """Create MCP session"""
+ async with self.session.post(f"{self.base_url}/api/v1/mcp/session") as resp:
+ data = await resp.json()
+ self.session_id = data["session_id"]
+ return self.session_id
+
+ async def close_session(self):
+ """Close MCP session"""
+ if self.session_id:
+ async with self.session.delete(f"{self.base_url}/api/v1/mcp/session/{self.session_id}"):
+ pass
+ self.session_id = None
+
+ async def list_tools(self) -> List[Dict[str, Any]]:
+ """List available tools"""
+ async with self.session.get(f"{self.base_url}/api/v1/mcp/tools") as resp:
+ data = await resp.json()
+ return data["tools"]
+
+ async def execute_tool(self, tool_name: str, parameters: Dict[str, Any]) -> Dict[str, Any]:
+ """Execute tool"""
+ payload = {
+ "tool_name": tool_name,
+ "parameters": parameters,
+ "session_id": self.session_id
+ }
+
+ async with self.session.post(
+ f"{self.base_url}/api/v1/mcp/execute",
+ json=payload
+ ) as resp:
+ return await resp.json()
+
+ async def ai_assistant_workflow(self, user_request: str) -> str:
+ """AI assistant workflow simulation"""
+
+ # 1. Create session
+ await self.create_session()
+ print(f"Session created: {self.session_id}")
+
+ # 2. Analyze user request and select appropriate tool
+ if "Create item" in user_request or "Create" in user_request:
+ # Create item request
+ result = await self.execute_tool("create_item", {
+ "name": "AI recommended item",
+ "description": "AI generated item based on user request",
+ "price": 100000,
+ "category": "ai_recommended"
+ })
+
+ if result["success"]:
+ item_name = result["result"]["item"]["name"]
+ return f"✅ '{item_name}' item created successfully!"
+ else:
+ return f"❌ Item creation failed: {result.get('error', 'Unknown error')}"
+
+ elif "Search" in user_request or "Find" in user_request:
+ # Search request
+ search_query = "Item" # Actually extracted from NLP
+ result = await self.execute_tool("search_items", {
+ "query": search_query,
+ "limit": 5
+ })
+
+ if result["success"]:
+ items = result["result"]["items"]
+ item_list = "\n".join([f"- {item['name']} (₩{item['price']:,})" for item in items])
+ return f"🔍 Search results ({len(items)} items):\n{item_list}"
+ else:
+ return f"❌ Search failed: {result.get('error', 'Unknown error')}"
+
+ elif "Analyze" in user_request:
+ # Analyze request
+ result = await self.execute_tool("analyze_items", {
+ "analysis_type": "price_distribution"
+ })
+
+ if result["success"]:
+ analysis = result["result"]["result"]
+ return f"📊 Price analysis:\nAverage price: ₩{analysis['average_price']:,.0f}\nMinimum: ₩{analysis['min_price']:,} - Maximum: ₩{analysis['max_price']:,}"
+ else:
+ return f"❌ Analysis failed: {result.get('error', 'Unknown error')}"
+
+ else:
+ return "Sorry, I couldn't find a tool to handle that request."
+
+async def main():
+ """Client test"""
+ async with MCPClient("http://localhost:8000", "your-api-key-here") as client:
+
+ # List available tools
+ tools = await client.list_tools()
+ print(f"Available tools: {len(tools)}")
+ for tool in tools:
+ print(f"- {tool['name']}: {tool['description']}")
+
+ print("\n" + "="*50 + "\n")
+
+ # AI assistant simulation
+ test_requests = [
+ "Create a new item",
+ "Search for items",
+ "Analyze price distribution"
+ ]
+
+ for request in test_requests:
+ print(f"User request: {request}")
+ response = await client.ai_assistant_workflow(request)
+ print(f"AI response: {response}")
+ print("-" * 30)
+
+if __name__ == "__main__":
+ asyncio.run(main())
+```
+
+
+
+
+
+## Zusammenfassung
+
+In diesem Tutorial haben wir die MCP-Integration (Model Context Protocol) umgesetzt mit:
+
+- ✅ Aufbau eines JWT-basierten Authentifizierungssystems
+- ✅ Implementierung rollenbasierter Zugriffskontrolle (RBAC)
+- ✅ Implementierung eines MCP-Servers und Werkzeugsystems
+- ✅ Sitzungsbasierter Kontextverwaltung
+- ✅ Sicherer API-Kommunikation mit KI-Modellen
+- ✅ Berechtigungsverwaltung und Nutzungsverfolgung für Werkzeuge
+- ✅ Implementierung eines konkreten KI-Client-Beispiels
+
+Jetzt können Sie ein vollständiges MCP-basiertes System aufbauen, in dem KI-Modelle Ihre API-Funktionen sicher und effizient nutzen können!
diff --git a/docs/de/user-guide/adding-routes.md b/docs/de/user-guide/adding-routes.md
new file mode 100644
index 0000000..c8c2c7c
--- /dev/null
+++ b/docs/de/user-guide/adding-routes.md
@@ -0,0 +1,581 @@
+# Routen hinzufügen
+
+Lernen Sie, wie Sie neue API-Routen zu Ihrem bestehenden FastAPI-Projekt hinzufügen.
+
+## Grundlegendes Hinzufügen einer Route
+
+### Den Befehl `addroute` verwenden
+
+Der Befehl `addroute` von FastAPI-fastkit erleichtert das Hinzufügen neuer Routen:
+
+
+
+```console
+$ fastkit addroute users my-awesome-api
+ Adding New Route
+┌──────────────────┬──────────────────────────────────────────┐
+│ Project │ my-awesome-api │
+│ Route Name │ users │
+│ Target Directory │ ~/my-awesome-api │
+└──────────────────┴──────────────────────────────────────────┘
+
+Do you want to add route 'users' to project 'my-awesome-api'? [Y/n]: y
+
+╭──────────────────────── Info ────────────────────────╮
+│ ℹ Updated main.py to include the API router │
+╰──────────────────────────────────────────────────────╯
+╭─────────────────────── Success ───────────────────────╮
+│ ✨ Successfully added new route 'users' to project │
+│ `my-awesome-api` │
+╰───────────────────────────────────────────────────────╯
+```
+
+
+
+## Was wird erstellt
+
+Wenn Sie eine Route hinzufügen, erzeugt FastAPI-fastkit automatisch:
+
+### 1. Routen-Datei: `src/api/routes/users.py`
+
+```python
+from typing import List
+from fastapi import APIRouter, HTTPException, status
+from src.schemas.users import User, UserCreate, UserUpdate
+from src.crud.users import users_crud
+
+router = APIRouter()
+
+@router.get("/", response_model=List[User])
+def read_users():
+ """Get all users"""
+ return users_crud.get_all()
+
+@router.post("/", response_model=User, status_code=status.HTTP_201_CREATED)
+def create_user(user: UserCreate):
+ """Create a new user"""
+ return users_crud.create(user)
+
+@router.get("/{user_id}", response_model=User)
+def read_user(user_id: int):
+ """Get a specific user"""
+ user = users_crud.get_by_id(user_id)
+ if user is None:
+ raise HTTPException(status_code=404, detail="User not found")
+ return user
+
+@router.put("/{user_id}", response_model=User)
+def update_user(user_id: int, user: UserUpdate):
+ """Update a user"""
+ updated_user = users_crud.update(user_id, user)
+ if updated_user is None:
+ raise HTTPException(status_code=404, detail="User not found")
+ return updated_user
+
+@router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
+def delete_user(user_id: int):
+ """Delete a user"""
+ success = users_crud.delete(user_id)
+ if not success:
+ raise HTTPException(status_code=404, detail="User not found")
+```
+
+### 2. CRUD-Operationen: `src/crud/users.py`
+
+```python
+from typing import List, Optional
+from src.schemas.users import User, UserCreate, UserUpdate
+
+class UsersCRUD:
+ def __init__(self):
+ self._users: List[User] = []
+ self._next_id = 1
+
+ def get_all(self) -> List[User]:
+ """Get all users"""
+ return self._users
+
+ def get_by_id(self, user_id: int) -> Optional[User]:
+ """Get user by ID"""
+ return next((user for user in self._users if user.id == user_id), None)
+
+ def create(self, user: UserCreate) -> User:
+ """Create a new user"""
+ new_user = User(
+ id=self._next_id,
+ title=user.title,
+ description=user.description
+ )
+ self._next_id += 1
+ self._users.append(new_user)
+ return new_user
+
+ def update(self, user_id: int, user: UserUpdate) -> Optional[User]:
+ """Update an existing user"""
+ existing_user = self.get_by_id(user_id)
+ if existing_user:
+ update_data = user.dict(exclude_unset=True)
+ for field, value in update_data.items():
+ setattr(existing_user, field, value)
+ return existing_user
+ return None
+
+ def delete(self, user_id: int) -> bool:
+ """Delete a user"""
+ user = self.get_by_id(user_id)
+ if user:
+ self._users.remove(user)
+ return True
+ return False
+
+users_crud = UsersCRUD()
+```
+
+### 3. Pydantic-Schemas: `src/schemas/users.py`
+
+```python
+from typing import Optional
+from pydantic import BaseModel
+
+class UserBase(BaseModel):
+ title: str
+ description: Optional[str] = None
+
+class UserCreate(UserBase):
+ pass
+
+class UserUpdate(BaseModel):
+ title: Optional[str] = None
+ description: Optional[str] = None
+
+class User(UserBase):
+ id: int
+
+ class Config:
+ from_attributes = True
+```
+
+### 4. Router-Registrierung
+
+Der Befehl aktualisiert `src/api/api.py` automatisch, um den neuen Router einzubinden:
+
+```python
+from fastapi import APIRouter
+from src.api.routes import items, users
+
+api_router = APIRouter()
+
+api_router.include_router(items.router, prefix="/items", tags=["items"])
+api_router.include_router(users.router, prefix="/users", tags=["users"])
+```
+
+## Generierte API-Endpunkte
+
+Nach dem Hinzufügen der Route `users` stehen Ihnen folgende Endpunkte zur Verfügung:
+
+| Methode | Endpunkt | Beschreibung |
+|--------|----------|-------------|
+| `GET` | `/api/v1/users/` | Alle Nutzer abrufen |
+| `POST` | `/api/v1/users/` | Einen neuen Nutzer anlegen |
+| `GET` | `/api/v1/users/{user_id}` | Einen bestimmten Nutzer abrufen |
+| `PUT` | `/api/v1/users/{user_id}` | Einen Nutzer aktualisieren |
+| `DELETE` | `/api/v1/users/{user_id}` | Einen Nutzer löschen |
+
+## Ihre neuen Routen testen
+
+### 1. Server starten
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000
+```
+
+
+
+### 2. API-Dokumentation prüfen
+
+Besuchen Sie [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), um Ihre neuen Endpunkte in der interaktiven Dokumentation zu sehen.
+
+### 3. Mit curl testen
+
+**Einen Nutzer anlegen:**
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/users/" \
+ -H "Content-Type: application/json" \
+ -d '{"title": "John Doe", "description": "Software Developer"}'
+
+{
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+}
+```
+
+
+
+**Alle Nutzer abrufen:**
+
+
+```console
+$ curl http://127.0.0.1:8000/api/v1/users/
+
+[
+ {
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+ }
+]
+```
+
+
+
+**Einen bestimmten Nutzer abrufen:**
+
+
+```console
+$ curl http://127.0.0.1:8000/api/v1/users/1
+
+{
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+}
+```
+
+
+
+## Generierten Code anpassen
+
+Der generierte Code ist vollständig anpassbar. Hier sind häufige Anpassungen:
+
+### 1. Erweitertes Nutzer-Schema
+
+Bearbeiten Sie `src/schemas/users.py` für realistischere Nutzerdaten:
+
+```python
+from typing import Optional
+from datetime import datetime
+from pydantic import BaseModel, EmailStr, Field
+
+class UserBase(BaseModel):
+ email: EmailStr
+ username: str = Field(..., min_length=3, max_length=50)
+ full_name: Optional[str] = None
+ is_active: bool = True
+
+class UserCreate(UserBase):
+ password: str = Field(..., min_length=8)
+
+class UserUpdate(BaseModel):
+ email: Optional[EmailStr] = None
+ username: Optional[str] = Field(None, min_length=3, max_length=50)
+ full_name: Optional[str] = None
+ is_active: Optional[bool] = None
+
+class User(UserBase):
+ id: int
+ created_at: datetime
+
+ class Config:
+ from_attributes = True
+
+class UserInDB(User):
+ hashed_password: str
+```
+
+### 2. CRUD mit Validierung erweitern
+
+Aktualisieren Sie `src/crud/users.py` um bessere Validierung:
+
+```python
+from typing import List, Optional
+from datetime import datetime
+import hashlib
+from src.schemas.users import UserCreate, UserUpdate, UserInDB
+
+class UsersCRUD:
+ def __init__(self):
+ self._users: List[UserInDB] = []
+ self._next_id = 1
+
+ def _hash_password(self, password: str) -> str:
+ """Simple password hashing (use bcrypt in production)"""
+ return hashlib.sha256(password.encode()).hexdigest()
+
+ def get_by_email(self, email: str) -> Optional[UserInDB]:
+ """Get user by email"""
+ return next((user for user in self._users if user.email == email), None)
+
+ def get_by_username(self, username: str) -> Optional[UserInDB]:
+ """Get user by username"""
+ return next((user for user in self._users if user.username == username), None)
+
+ def create(self, user: UserCreate) -> UserInDB:
+ """Create a new user with validation"""
+ # Check for duplicates
+ if self.get_by_email(user.email):
+ raise ValueError("Email already registered")
+ if self.get_by_username(user.username):
+ raise ValueError("Username already taken")
+
+ new_user = UserInDB(
+ id=self._next_id,
+ email=user.email,
+ username=user.username,
+ full_name=user.full_name,
+ is_active=user.is_active,
+ created_at=datetime.now(),
+ hashed_password=self._hash_password(user.password)
+ )
+ self._next_id += 1
+ self._users.append(new_user)
+ return new_user
+
+users_crud = UsersCRUD()
+```
+
+### 3. Route mit Fehlerbehandlung erweitern
+
+Aktualisieren Sie `src/api/routes/users.py` um eine bessere Fehlerbehandlung:
+
+```python
+from typing import List
+from fastapi import APIRouter, HTTPException, status
+from src.schemas.users import User, UserCreate, UserUpdate
+from src.crud.users import users_crud
+
+router = APIRouter()
+
+@router.post("/", response_model=User, status_code=status.HTTP_201_CREATED)
+def create_user(user: UserCreate):
+ """Create a new user"""
+ try:
+ new_user = users_crud.create(user)
+ # Return user without password hash
+ return User(**new_user.dict())
+ except ValueError as e:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail=str(e)
+ )
+
+@router.get("/{user_id}", response_model=User)
+def read_user(user_id: int):
+ """Get a specific user"""
+ user = users_crud.get_by_id(user_id)
+ if not user:
+ raise HTTPException(
+ status_code=status.HTTP_404_NOT_FOUND,
+ detail=f"User with id {user_id} not found"
+ )
+ return User(**user.dict())
+```
+
+## Mehrere Routen hinzufügen
+
+Sie können mehrere Routen hinzufügen, um eine vollständige API aufzubauen:
+
+
+
+```console
+# Weitere Ressourcenrouten hinzufügen (zuerst der Routenname, dann das Projektverzeichnis)
+$ fastkit addroute products my-awesome-api
+$ fastkit addroute orders my-awesome-api
+$ fastkit addroute categories my-awesome-api
+
+# Jede davon erzeugt die vollständige CRUD-Struktur
+```
+
+
+
+Dies erzeugt eine umfassende API mit:
+
+- `/api/v1/users/` — Nutzerverwaltung
+- `/api/v1/products/` — Produktkatalog
+- `/api/v1/orders/` — Bestellabwicklung
+- `/api/v1/categories/` — Kategorienverwaltung
+
+## Routenorganisation
+
+### Verwandte Endpunkte gruppieren
+
+Sie können Routen nach Domäne organisieren:
+
+```python
+# src/api/api.py
+from fastapi import APIRouter
+from src.api.routes import users, products, orders, categories
+
+api_router = APIRouter()
+
+# User management
+api_router.include_router(
+ users.router,
+ prefix="/users",
+ tags=["User Management"]
+)
+
+# E-commerce
+api_router.include_router(
+ products.router,
+ prefix="/products",
+ tags=["E-commerce"]
+)
+api_router.include_router(
+ orders.router,
+ prefix="/orders",
+ tags=["E-commerce"]
+)
+api_router.include_router(
+ categories.router,
+ prefix="/categories",
+ tags=["E-commerce"]
+)
+```
+
+### Routen-Abhängigkeiten hinzufügen
+
+Fügen Sie Authentifizierung oder andere Abhängigkeiten hinzu:
+
+```python
+from fastapi import APIRouter, Depends
+from src.core.auth import get_current_user
+
+router = APIRouter()
+
+@router.get("/profile", response_model=User)
+def get_user_profile(current_user: User = Depends(get_current_user)):
+ """Get current user's profile"""
+ return current_user
+
+@router.post("/", response_model=User)
+def create_user(
+ user: UserCreate,
+ current_user: User = Depends(get_current_user)
+):
+ """Create a new user (admin only)"""
+ if not current_user.is_admin:
+ raise HTTPException(status_code=403, detail="Admin access required")
+ return users_crud.create(user)
+```
+
+## Best Practices
+
+### 1. Einheitliche Benennung
+
+Halten Sie sich an einheitliche Benennungskonventionen:
+
+- **Routennamen**: Substantive im Plural verwenden (`users`, `products`, `orders`)
+- **Schema-Namen**: Singular verwenden (`User`, `Product`, `Order`)
+- **CRUD-Klassen**: mit `CRUD` enden (`UsersCRUD`, `ProductsCRUD`)
+
+### 2. Fehlerbehandlung
+
+Behandeln Sie Fehler immer sauber:
+
+```python
+@router.post("/", response_model=User)
+def create_user(user: UserCreate):
+ try:
+ return users_crud.create(user)
+ except ValueError as e:
+ raise HTTPException(status_code=400, detail=str(e))
+ except Exception as e:
+ raise HTTPException(status_code=500, detail="Internal server error")
+```
+
+### 3. Dokumentation
+
+Schreiben Sie ausführliche Docstrings:
+
+```python
+@router.get("/{user_id}", response_model=User)
+def read_user(user_id: int):
+ """
+ Get a specific user by ID.
+
+ Args:
+ user_id: The unique identifier for the user
+
+ Returns:
+ User: The user object with all details
+
+ Raises:
+ HTTPException: 404 if user not found
+ """
+ user = users_crud.get_by_id(user_id)
+ if not user:
+ raise HTTPException(status_code=404, detail="User not found")
+ return user
+```
+
+### 4. Testen
+
+Testen Sie Ihre neuen Routen immer:
+
+```python
+# tests/test_users.py
+from fastapi.testclient import TestClient
+from src.main import app
+
+client = TestClient(app)
+
+def test_create_user():
+ user_data = {
+ "email": "test@example.com",
+ "username": "testuser",
+ "password": "securepassword123"
+ }
+ response = client.post("/api/v1/users/", json=user_data)
+ assert response.status_code == 201
+ assert response.json()["email"] == user_data["email"]
+
+def test_get_user():
+ response = client.get("/api/v1/users/1")
+ assert response.status_code == 200
+```
+
+## Fehlerbehebung
+
+### Route erscheint nicht
+
+Wenn Ihre Route nicht in der API-Dokumentation auftaucht:
+
+1. **Router-Registrierung prüfen** in `src/api/api.py`
+2. **Server neu starten** nach dem Hinzufügen von Routen
+3. **Auf Import-Fehler** in der Routen-Datei prüfen
+
+### Import-Fehler
+
+Wenn Sie Import-Fehler erhalten:
+
+1. **Dateistruktur prüfen** — sie sollte dem erwarteten Layout entsprechen
+2. **Schema-Imports** in Routen- und CRUD-Dateien überprüfen
+3. **Sicherstellen, dass alle `__init__.py`-Dateien existieren**
+
+### Server startet nicht
+
+Wenn der Server nach dem Hinzufügen von Routen nicht startet:
+
+1. **Auf Syntaxfehler** in den generierten Dateien prüfen
+2. **Schema-Kompatibilität** zwischen Dateien überprüfen
+3. **Logs prüfen** auf konkrete Fehlermeldungen
+
+## Nächste Schritte
+
+Jetzt, da Sie Routen hinzufügen können:
+
+1. **[Ihr erstes Projekt](../tutorial/first-project.md)**: bauen Sie eine vollständige Blog-API
+2. **[CLI-Referenz](cli-reference.md)**: lernen Sie alle verfügbaren Befehle
+3. **[Vorlagen verwenden](using-templates.md)**: erkunden Sie vorgefertigte Projektvorlagen
+
+!!! tip "Tipps zur Routenentwicklung"
+ - Testen Sie neue Routen immer in der interaktiven Doku (`/docs`)
+ - Verwenden Sie aussagekräftige HTTP-Statuscodes
+ - Implementieren Sie eine ordentliche Fehlerbehandlung für alle Endpunkte
+ - Halten Sie Routen-Handler schlank und delegieren Sie Geschäftslogik an CRUD-Klassen
diff --git a/docs/de/user-guide/choosing-a-starter.md b/docs/de/user-guide/choosing-a-starter.md
new file mode 100644
index 0000000..c89694d
--- /dev/null
+++ b/docs/de/user-guide/choosing-a-starter.md
@@ -0,0 +1,145 @@
+# Welchen Starter soll ich wählen?
+
+FastAPI-fastkit bietet mehrere Wege, ein Projekt zu starten. Diese Seite ist eine **Entscheidungshilfe** für Einsteiger: Wählen Sie hier einen Pfad und springen Sie dann zum [Schnellstart](quick-start.md), um das Projekt tatsächlich zu erstellen.
+
+Wenn Sie unsicher sind, lautet die kurze Antwort:
+
+> **Beginnen Sie mit `fastkit init --interactive` und wählen Sie das Preset `domain-starter`.** Es ist der empfohlene Standard für moderne API-Projekte.
+
+Der Rest dieser Seite erklärt, warum das so ist und wann eine andere Wahl sinnvoller sein kann.
+
+## TL;DR — Wahl nach Benutzertyp
+
+| Sie sind … | Beginnen Sie mit |
+|---|---|
+| Neu bei FastAPI und möchten eine geführte Tour | `fastkit init --interactive` (Preset: **`domain-starter`**) |
+| Möchten eine funktionierende CRUD-Demo zum Lesen und Anpassen | `fastkit startdemo fastapi-default` |
+| Möchten das kleinstmögliche Gerüst | `fastkit init --interactive` (Preset: **`minimal`**) |
+| Schreiben einen schnellen Prototyp / ein Single-File-Skript | `fastkit init --interactive` (Preset: **`single-module`**) |
+| Brauchen eine echte Datenbank (PostgreSQL + SQLAlchemy + Alembic) | `fastkit startdemo fastapi-psql-orm` |
+| Möchten ein produktionsnahes domänenorientiertes Layout für eine mittelgroße API | `fastkit init --interactive` (Preset: **`domain-starter`**) |
+
+## `startdemo` vs. `init --interactive` — wo ist der Unterschied?
+
+Dies sind die beiden Haupteinstiegspunkte. Sie decken unterschiedliche Bedürfnisse ab.
+
+### `fastkit startdemo `
+
+Legt ein **vollständiges, funktionierendes Beispielprojekt** auf der Festplatte ab, basierend auf einer der mitgelieferten Vorlagen (`fastapi-default`, `fastapi-async-crud`, `fastapi-psql-orm`, `fastapi-domain-starter`, …). Der Quellcode der Vorlage wird unverändert übernommen, wobei Platzhalter für Metadaten (`` usw.) gefüllt werden.
+
+- ✅ Der schnellste Weg zu einer lauffähigen Demo.
+- ✅ Aller Code ist real und lesbar — ideal zum Lernen anhand von Beispielen.
+- ❌ Stack und Struktur der Vorlage stehen fest; Sie können also nicht nebenbei CORS auswählen und gleichzeitig die Authentifizierung weglassen.
+
+```console
+$ fastkit list-templates # show what's available
+$ fastkit startdemo fastapi-default # generate a project from one
+```
+
+### `fastkit init --interactive`
+
+Führt Sie durch einen **geführten Assistenten**: Projektmetadaten → Architektur-Preset → Funktionsauswahl (Datenbank, Authentifizierung, Tests, Deployment, …) → Paketmanager → Bestätigung. Der Generator wählt pro Preset eine geeignete Basisvorlage und überlagert die ausgewählten Funktionen.
+
+- ✅ Sie stellen den Stack zusammen, den Sie wirklich wollen.
+- ✅ Das Architektur-Preset formt das Projekt-Layout (Single-File, geschichtet, domänenorientiert, …).
+- ❌ Die umfangreicheren Presets, bei denen die mitgelieferte `main.py` erhalten bleibt (`classic-layered`, `domain-starter`), erzeugen zwar Konfigurationsmodule, erwarten aber, dass Sie diese selbst in die vorhandenen Router einbinden. Die genaue Vereinbarung pro Preset und pro Funktion finden Sie in der [Architektur-Preset-Matrix](../reference/preset-feature-matrix.md).
+
+```console
+$ fastkit init --interactive
+```
+
+## Die vier Architektur-Presets
+
+Diese erscheinen in `fastkit init --interactive` nach den Projektinformations-Eingaben. Nutzen Sie diesen Abschnitt, um Ihre Wahl zu treffen.
+
+### `minimal` — möglichst einfach starten, später wachsen
+
+Die kleinstmögliche lauffähige FastAPI-App. Leeres Gerüst + eine einzige `src/main.py`, die aus Ihren Funktions-Flags regeneriert wird. CORS, Rate-Limiting und Prometheus-Instrumentierung werden automatisch in `main.py` eingebaut, sofern ausgewählt.
+
+- 👤 **Wer**: Personen, die Struktur selbst hinzufügen möchten, wenn das Projekt wächst, oder die FastAPI ohne vorgefertigte Layout-Meinungen erkunden.
+- 📦 **Basisvorlage**: `fastapi-empty`.
+- 🧠 **Mentales Modell**: „Gib mir eine Datei mit importiertem FastAPI, den Rest ergänze ich selbst.“
+
+### `single-module` — Prototyp im Skriptstil
+
+Alles lebt in einem einzigen Modul. Dieselbe `main.py`-Regenerierung wie bei `minimal`.
+
+- 👤 **Wer**: Sie schreiben ein Klebescript, einen kleinen Webhook oder einen Eintages-Prototyp, der keine Paketgrenzen braucht.
+- 📦 **Basisvorlage**: `fastapi-single-module`.
+- 🧠 **Mentales Modell**: „ich will eine Python-Datei, die ich am Stück ausführen und lesen kann."
+
+### `classic-layered` — geschichtetes Layout (api / crud / schemas / core)
+
+Das „Django-artige“ Layout: Der Code wird horizontal nach Verantwortungsbereichen getrennt, also Router in `api/`, CRUD-Logik in `crud/`, Pydantic-Schemas in `schemas/` und die Konfiguration in `core/`. Die mitgelieferte `main.py` bleibt **erhalten** (CORS ist dort bereits eingebunden); generierte Datenbank-/Auth-Konfigurationen landen unter `src/core/`.
+
+- 👤 **Wer**: Teams, die mit Django-/Rails-Layouts vertraut sind, Projekte mit vielen kleinen Endpunkten, die sich gemeinsame CRUD-Infrastruktur teilen.
+- 📦 **Basisvorlage**: `fastapi-default`.
+- 🧠 **Mentales Modell**: „Code danach teilen, was er _ist_."
+
+### `domain-starter` — domänenorientiert (empfohlener Standard)
+
+Code wird vertikal nach **Geschäftskonzept** geteilt: Jede Domäne besitzt ihren eigenen Router, Service, Repository und ihre Schemas unter `src/app/domains//`. Wird mit einem `/health`-Endpunkt und einer Beispieldomäne `items` geliefert, die Sie für jedes neue Konzept kopieren und umbenennen. Die mitgelieferte `main.py` (unter `src/app/`) bleibt erhalten; generierte Konfigurationen landen unter `src/app/core/`.
+
+- 👤 **Wer**: mittelgroße APIs, die mehrere unterschiedliche Konzepte aufnehmen werden (users, orders, billing, …). Die empfohlene Standardlösung für moderne APIs.
+- 📦 **Basisvorlage**: `fastapi-domain-starter`.
+- 🧠 **Mentales Modell**: „Code danach teilen, was er _für das Geschäft tut_."
+
+## Vergleichsmatrix
+
+Eine Übersicht auf einen Blick.
+
+| | `minimal` | `single-module` | `classic-layered` | `domain-starter` |
+|---|---|---|---|---|
+| Basisvorlage | `fastapi-empty` | `fastapi-single-module` | `fastapi-default` | `fastapi-domain-starter` |
+| Projekteinstieg | `src/main.py` | `src/main.py` | `src/main.py` | `src/app/main.py` |
+| Speicherort der Router | (Sie fügen sie hinzu) | (innerhalb von `main.py`) | `src/api/routes/` | `src/app/domains//router.py` |
+| Ordner pro Domäne | ❌ | ❌ | ❌ | ✅ |
+| Eingebauter `/health`-Endpunkt | ✅ | ✅ | ❌ | ✅ |
+| `main.py` aus Funktionen regeneriert | ✅ | ✅ | ❌ | ❌ |
+| CORS in `main.py` vorverdrahtet | wird bei Auswahl ergänzt | wird bei Auswahl ergänzt | ja (env-gesteuert) | ja (env-gesteuert) |
+| pyproject-first | optional | optional | optional | ✅ |
+| Am besten für | „ich baue meine Struktur selbst auf" | „Single-File-Prototyp" | „nach Anliegen teilen" | „nach Geschäftskonzept teilen" |
+
+Für den vollständigen Vertrag pro Funktion (Zielpfade von Datenbank-/Auth-Konfigurationen, welche Auswahlen manuelle Verdrahtung statt automatischer benötigen, wann Warnungen ausgelöst werden) siehe die [Architektur-Preset-Matrix](../reference/preset-feature-matrix.md).
+
+## Eine `startdemo`-Vorlage wählen
+
+`fastkit startdemo ` ist am besten geeignet, wenn Sie ein **vollständiges, lauffähiges Beispiel** statt einer geführten Zusammenstellung wollen. Die meisten Vorlagen entsprechen grob einem der vier Presets oben, bringen aber zusätzlichen Beispielcode mit (CRUD-Endpunkte über einem Mock-Speicher, benutzerdefinierte Antwortbehandlung, Docker-Werkzeuge usw.).
+
+| Vorlage | Nächstes Preset | Wann auswählen |
+|---|---|---|
+| `fastapi-default` | `classic-layered` | Funktionierende CRUD-Demo mit dem geschichteten Layout. Gute Anlaufstelle. |
+| `fastapi-empty` | `minimal` | Nacktes Gerüst; gleiche Form, die `minimal` produziert. |
+| `fastapi-single-module` | `single-module` | Single-File-Demo. |
+| `fastapi-domain-starter` | `domain-starter` | Empfohlener moderner Standard; bringt ein items-Domänenbeispiel mit. |
+| `fastapi-async-crud` | `classic-layered` | Asynchrone Variante von `fastapi-default`. |
+| `fastapi-custom-response` | `classic-layered` | Demonstriert benutzerdefinierte Response-Hüllen / Formatierung. |
+| `fastapi-dockerized` | `classic-layered` | Fügt dem Standard-Layout ein produktionstaugliches Dockerfile hinzu. |
+| `fastapi-psql-orm` | (kein direktes Preset) | PostgreSQL + SQLAlchemy + Alembic. Wählen Sie dies, wenn Sie eine echte Datenbank brauchen. |
+| `fastapi-mcp` | (kein direktes Preset) | Integration des Model Context Protocol. |
+
+`fastkit list-templates` zeigt die aktuelle Liste mit einzeiligen Beschreibungen.
+
+## Häufige Fragen
+
+**F. Muss ich mich gleich am Anfang auf ein Preset / eine Vorlage festlegen?**
+Nein — Sie können den generierten Code später jederzeit von Hand reorganisieren. Die Presets sind Ausgangspunkte, keine Verträge. Überdenken Sie die Wahl nicht zu lange.
+
+**F. Was ist die „moderne" Wahl?**
+`domain-starter`. Dieses Preset ist pyproject-first, bringt einen `/health`-Endpunkt mit und nutzt ein Layout, auf das viele gut gepflegte mittelgroße FastAPI-Projekte früher oder später hinauslaufen.
+
+**F. Kann ich später von `classic-layered` zu `domain-starter` wechseln?**
+Ja, aber das ist ein manuelles Refactoring — es gibt keinen Migrationsbefehl. Wenn Sie meinen, Ihr Projekt wird groß genug, um Domänenordner zu brauchen, starten Sie gleich dort.
+
+**F. Was, wenn ich einfach nur FastAPI lernen will?**
+Beginnen Sie mit `fastkit startdemo fastapi-default` — lesen Sie den Code, lassen Sie die Tests laufen, ändern Sie ein paar Endpunkte. Sobald Sie sich wohlfühlen, ist `fastkit init --interactive` mit dem Preset `domain-starter` der natürliche nächste Schritt.
+
+**F. Wo sehe ich die genauen Dateien, die jedes Preset generiert?**
+Die [Architektur-Preset-Matrix](../reference/preset-feature-matrix.md) ist die Referenzseite dafür.
+
+## Nächste Schritte
+
+- [Schnellstart](quick-start.md) — erstellen Sie tatsächlich Ihr erstes Projekt.
+- [Projekte erstellen](creating-projects.md) — ausführlichere Vorstellung der CLI-Optionen.
+- [Tutorial Domänenorientiertes Projekt](../tutorial/domain-starter.md) — wenn Sie `domain-starter` gewählt haben, führt Sie dieses Tutorial Schritt für Schritt durch den generierten Projektbaum, das mitgelieferte `items`-Beispiel und das Hinzufügen Ihrer nächsten Domäne.
+- [Architektur-Preset-Matrix](../reference/preset-feature-matrix.md) — der vollständige Vertrag pro Preset / pro Funktion.
diff --git a/docs/de/user-guide/cli-reference.md b/docs/de/user-guide/cli-reference.md
new file mode 100644
index 0000000..c8d5ed2
--- /dev/null
+++ b/docs/de/user-guide/cli-reference.md
@@ -0,0 +1,832 @@
+# CLI-Referenz
+
+Vollständige Referenz aller Befehle der FastAPI-fastkit-Kommandozeilenschnittstelle.
+
+## Globale Optionen
+
+Alle Befehle unterstützen diese globalen Optionen:
+
+```console
+$ fastkit [GLOBAL_OPTIONS] COMMAND [COMMAND_OPTIONS]
+```
+
+### Globale Optionen
+
+| Option | Beschreibung |
+|--------|-------------|
+| `--version` | Die Version von FastAPI-fastkit anzeigen |
+| `--help` | Die Hilfenachricht anzeigen |
+
+### Beispiele
+
+
+
+```console
+$ fastkit --version
+FastAPI-fastkit version 1.0.0
+
+$ fastkit --help
+Usage: fastkit [OPTIONS] COMMAND [ARGS]...
+
+ FastAPI-fastkit CLI
+
+Options:
+ --version Show the version and exit.
+ --help Show this message and exit.
+
+Commands:
+ addroute Add a new route to FastAPI project
+ init Create a new FastAPI project
+ list-templates List available FastAPI templates
+ runserver Start FastAPI development server
+ startdemo Create FastAPI project from template
+```
+
+
+
+## Befehle
+
+### `init`
+
+Ein neues FastAPI-Projekt mit interaktiver Einrichtung erstellen.
+
+#### Syntax
+
+```console
+$ fastkit init [OPTIONS]
+```
+
+#### Optionen
+
+| Option | Beschreibung | Standard |
+|--------|-------------|---------|
+| `--package-manager` | Zu verwendender Paketmanager (pip, uv, pdm, poetry) | uv |
+| `--help` | Hilfe zum Befehl anzeigen | - |
+
+#### Interaktive Eingabeaufforderungen
+
+Der Befehl `init` fragt Sie ab:
+
+1. **Projektname**: Verzeichnis- und Paketname
+2. **Name des Autors**: Information zum Autor des Pakets
+3. **E-Mail des Autors**: Kontakt-E-Mail des Pakets
+4. **Projektbeschreibung**: kurze Beschreibung des Projekts
+5. **Stack-Auswahl**: Wahl zwischen minimal, standard oder full
+6. **Paketmanager-Auswahl**: Wahl zwischen pip, uv, pdm oder poetry (außer wenn mit `--package-manager` angegeben)
+
+#### Stack-Optionen
+
+**MINIMAL-Stack:**
+
+- `fastapi` — FastAPI-Framework
+- `uvicorn` — ASGI-Server
+- `pydantic` — Datenvalidierung
+- `pydantic-settings` — Konfigurationsverwaltung
+
+**STANDARD-Stack:**
+
+- Alle Pakete des MINIMAL-Stacks
+- `sqlalchemy` — SQL-Toolkit und ORM
+- `alembic` — Werkzeug für Datenbankmigrationen
+- `pytest` — Test-Framework
+
+**FULL-Stack:**
+
+- Alle Pakete des STANDARD-Stacks
+- `redis` — In-Memory-Datenspeicher
+- `celery` — verteilte Aufgabenwarteschlange
+
+#### Beispiele
+
+
+
+```console
+$ fastkit init
+Enter the project name: my-api
+Enter the author name: John Doe
+Enter the author email: john@example.com
+Enter the project description: My awesome API
+
+Select stack (minimal, standard, full): standard
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'my-api' has been created successfully!
+```
+
+
+
+#### Generierte Struktur
+
+Erstellt ein Projekt mit folgender Struktur:
+
+```
+my-api/
+├── .venv/ # Virtuelle Umgebung
+├── src/
+│ ├── __init__.py
+│ ├── main.py # FastAPI-Anwendung
+│ ├── core/
+│ │ ├── __init__.py
+│ │ └── config.py # Konfiguration
+│ ├── api/
+│ │ ├── __init__.py
+│ │ ├── api.py # Sammlung der API-Router
+│ │ └── routes/
+│ │ ├── __init__.py
+│ │ └── items.py # Beispielroute
+│ ├── crud/
+│ │ ├── __init__.py
+│ │ └── items.py # CRUD-Operationen
+│ ├── schemas/
+│ │ ├── __init__.py
+│ │ └── items.py # Pydantic-Schemas
+│ └── mocks/
+│ ├── __init__.py
+│ └── mock_items.json # Testdaten
+├── tests/
+├── scripts/
+├── requirements.txt
+├── setup.py
+└── README.md
+```
+
+### `addroute`
+
+Eine neue API-Route zu einem bestehenden FastAPI-Projekt hinzufügen.
+
+#### Syntax
+
+```console
+$ fastkit addroute ROUTE_NAME [PROJECT_DIR] [OPTIONS]
+```
+
+#### Argumente
+
+| Argument | Beschreibung | Erforderlich |
+|----------|-------------|----------|
+| `ROUTE_NAME` | Name der neuen Route (Plural empfohlen) | Ja |
+| `PROJECT_DIR` | Projektverzeichnis unterhalb Ihres Workspaces (Standard `.`, das aktuelle Verzeichnis) | Nein |
+
+#### Optionen
+
+| Option | Beschreibung | Standard |
+|--------|-------------|---------|
+| `--help` | Hilfe zum Befehl anzeigen | - |
+
+#### Beispiele
+
+
+
+```console
+$ cd my-api
+$ fastkit addroute users
+ Adding New Route
+┌──────────────────┬──────────────────────────────────────────┐
+│ Project │ my-api │
+│ Route Name │ users │
+│ Target Directory │ ~/my-api │
+└──────────────────┴──────────────────────────────────────────┘
+
+Do you want to add route 'users' to project 'my-api'? [Y/n]: y
+
+✨ Successfully added new route 'users' to project 'my-api'
+```
+
+
+
+Sie können auch ein Projekt unter Ihrem Workspace per Namen ansteuern, ohne mit `cd` hineinzuwechseln:
+
+
+
+```console
+$ fastkit addroute users my-api
+```
+
+
+
+#### Generierte Dateien
+
+Erstellt diese Dateien im Projekt:
+
+- `src/api/routes/users.py` — Routen-Handler
+- `src/crud/users.py` — CRUD-Operationen
+- `src/schemas/users.py` — Pydantic-Schemas
+
+Aktualisiert außerdem `src/api/api.py`, um den neuen Router einzubinden.
+
+#### Generierte Endpunkte
+
+Erstellt vollständige CRUD-Endpunkte:
+
+| Methode | Endpunkt | Beschreibung |
+|--------|----------|-------------|
+| `GET` | `/api/v1/users/` | Alle Nutzer abrufen |
+| `POST` | `/api/v1/users/` | Neuen Nutzer anlegen |
+| `GET` | `/api/v1/users/{user_id}` | Bestimmten Nutzer abrufen |
+| `PUT` | `/api/v1/users/{user_id}` | Nutzer aktualisieren |
+| `DELETE` | `/api/v1/users/{user_id}` | Nutzer löschen |
+
+### `startdemo`
+
+Ein FastAPI-Projekt aus einer vorgefertigten Vorlage erstellen.
+
+#### Syntax
+
+```console
+$ fastkit startdemo [OPTIONS]
+```
+
+#### Optionen
+
+| Option | Beschreibung | Standard |
+|--------|-------------|---------|
+| `--package-manager` | Zu verwendender Paketmanager (pip, uv, pdm, poetry) | uv |
+| `--help` | Hilfe zum Befehl anzeigen | - |
+
+#### Interaktive Eingabeaufforderungen
+
+Der Befehl `startdemo` fragt Sie ab:
+
+1. **Projektname**: Verzeichnisname für das neue Projekt
+2. **Name des Autors**: Information zum Autor des Pakets
+3. **E-Mail des Autors**: Kontakt-E-Mail
+4. **Projektbeschreibung**: kurze Beschreibung
+5. **Paketmanager-Auswahl**: Wahl zwischen pip, uv, pdm oder poetry (außer wenn mit `--package-manager` angegeben)
+
+#### Verfügbare Vorlagen
+
+| Vorlage | Beschreibung | Funktionen |
+|----------|-------------|----------|
+| `fastapi-default` | Einfaches FastAPI-Projekt | Basis-CRUD, Mock-Daten |
+| `fastapi-async-crud` | Asynchrone Item-Management-API | Async/await, Performance |
+| `fastapi-custom-response` | Benutzerdefiniertes Antwortsystem | Benutzerdefinierte Antworten, Paginierung |
+| `fastapi-dockerized` | Dockerisierte FastAPI-API | Docker, produktionsreif |
+| `fastapi-psql-orm` | PostgreSQL-FastAPI-API | PostgreSQL, SQLAlchemy, Alembic |
+| `fastapi-empty` | Minimales FastAPI-Projekt | Absolutes Minimum |
+
+#### Beispiele
+
+
+
+```console
+$ fastkit startdemo fastapi-psql-orm
+Enter the project name: my-blog
+Enter the author name: Jane Smith
+Enter the author email: jane@example.com
+Enter the project description: Blog API with PostgreSQL
+
+Select package manager (pip, uv, pdm, poetry) [uv]: poetry
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'my-blog' from 'fastapi-psql-orm' has been created!
+```
+
+
+
+### `runserver`
+
+Den FastAPI-Entwicklungsserver starten.
+
+#### Syntax
+
+```console
+$ fastkit runserver [OPTIONS]
+```
+
+#### Optionen
+
+| Option | Kurz | Beschreibung | Standard |
+|--------|-------|-------------|---------|
+| `--host` | `-h` | Host, an den gebunden werden soll | `127.0.0.1` |
+| `--port` | `-p` | Port, an den gebunden werden soll | `8000` |
+| `--reload` | `-r` | Automatisches Neuladen aktivieren | `True` |
+| `--workers` | `-w` | Anzahl der Worker | `1` |
+| `--help` | | Hilfe zum Befehl anzeigen | - |
+
+#### Beispiele
+
+
+
+```console
+# Grundlegende Verwendung (Standardeinstellungen)
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000
+
+# Eigener Host und Port
+$ fastkit runserver --host 0.0.0.0 --port 8080
+INFO: Uvicorn running on http://0.0.0.0:8080
+
+# Automatisches Neuladen deaktivieren
+$ fastkit runserver --no-reload
+INFO: Uvicorn running on http://127.0.0.1:8000
+
+# Mehrere Worker (Produktion)
+$ fastkit runserver --workers 4
+INFO: Uvicorn running on http://127.0.0.1:8000
+```
+
+
+
+#### Voraussetzungen
+
+- Muss aus dem Verzeichnis eines FastAPI-Projekts ausgeführt werden
+- Das Projekt muss `src/main.py` mit einer FastAPI-App enthalten
+- Die virtuelle Umgebung sollte aktiviert sein
+
+### `list-templates`
+
+Alle verfügbaren FastAPI-Projektvorlagen auflisten.
+
+#### Syntax
+
+```console
+$ fastkit list-templates [OPTIONS]
+```
+
+#### Optionen
+
+| Option | Beschreibung | Standard |
+|--------|-------------|---------|
+| `--help` | Hilfe zum Befehl anzeigen | - |
+
+#### Beispiele
+
+
+
+```console
+$ fastkit list-templates
+ Available Templates
+┌─────────────────────────┬───────────────────────────────────┐
+│ fastapi-custom-response │ Async Item Management API with │
+│ │ Custom Response System │
+│ fastapi-dockerized │ Dockerized FastAPI Item │
+│ │ Management API │
+│ fastapi-empty │ No description │
+│ fastapi-async-crud │ Async Item Management API Server │
+│ fastapi-psql-orm │ Dockerized FastAPI Item │
+│ │ Management API with PostgreSQL │
+│ fastapi-default │ Simple FastAPI Project │
+└─────────────────────────┴───────────────────────────────────┘
+```
+
+
+
+## Umgebungsvariablen
+
+FastAPI-fastkit berücksichtigt folgende Umgebungsvariablen:
+
+| Variable | Beschreibung | Standard |
+|----------|-------------|---------|
+| `FASTKIT_CONFIG_DIR` | Konfigurationsverzeichnis | `~/.fastkit` |
+| `FASTKIT_TEMPLATES_DIR` | Verzeichnis für benutzerdefinierte Vorlagen | Integrierte Vorlagen |
+| `FASTKIT_LOG_LEVEL` | Log-Level | `INFO` |
+
+### Beispiele
+
+
+
+```console
+# Eigenes Konfigurationsverzeichnis
+$ export FASTKIT_CONFIG_DIR=~/my-fastkit-config
+$ fastkit init
+
+# Eigenes Vorlagenverzeichnis
+$ export FASTKIT_TEMPLATES_DIR=~/my-templates
+$ fastkit list-templates
+
+# Debug-Logging
+$ export FASTKIT_LOG_LEVEL=DEBUG
+$ fastkit init
+```
+
+
+
+## Konfigurationsdateien
+
+FastAPI-fastkit kann Konfigurationsdateien für Standardwerte verwenden.
+
+### Ort der Konfigurationsdatei
+
+1. `$FASTKIT_CONFIG_DIR/config.yaml` (falls `FASTKIT_CONFIG_DIR` gesetzt ist)
+2. `~/.fastkit/config.yaml` (Standard)
+3. `./fastkit.yaml` (projektspezifisch)
+
+### Konfigurationsformat
+
+```yaml
+# ~/.fastkit/config.yaml
+default:
+ author:
+ name: "Your Name"
+ email: "your.email@example.com"
+
+ project:
+ stack: "standard"
+ create_venv: true
+ install_deps: true
+
+ server:
+ host: "127.0.0.1"
+ port: 8000
+ reload: true
+
+templates:
+ custom_dir: "~/my-templates"
+
+logging:
+ level: "INFO"
+ file: "~/.fastkit/logs/fastkit.log"
+```
+
+## Häufige Workflows
+
+### 1. Neues Projekt erstellen
+
+
+
+```console
+# Create a new project
+$ fastkit init
+# Follow prompts...
+
+# Navigate to project
+$ cd my-awesome-api
+
+# Activate virtual environment
+$ source .venv/bin/activate
+
+# Start development server
+$ fastkit runserver
+```
+
+
+
+### 2. Funktionen zu einem bestehenden Projekt hinzufügen
+
+
+
+```console
+# Mehrere Routen hinzufügen (Projektname als zweites Positionsargument = Projekt im Workspace)
+$ fastkit addroute users my-api
+$ fastkit addroute products my-api
+$ fastkit addroute orders my-api
+
+# API testen
+$ fastkit runserver
+# Öffnen Sie danach http://127.0.0.1:8000/docs
+```
+
+
+
+### 3. Vorlagen für komplexe Projekte nutzen
+
+
+
+```console
+# Verfügbare Vorlagen auflisten
+$ fastkit list-templates
+
+# Projekt aus Vorlage erzeugen
+$ fastkit startdemo
+# Für ein Datenbankprojekt fastapi-psql-orm auswählen
+
+# Datenbank einrichten (für die PostgreSQL-Vorlage)
+$ cd my-project
+$ docker-compose up -d postgres
+$ source .venv/bin/activate
+$ alembic upgrade head
+$ fastkit runserver
+```
+
+
+
+## Fehlerbehebung
+
+### Befehl nicht gefunden
+
+Falls der Befehl `fastkit` nicht gefunden wird:
+
+1. **Installation prüfen:**
+
+ ```console
+ $ pip show fastapi-fastkit
+ ```
+
+
+2. **Falls nötig neu installieren:**
+
+ ```console
+ $ pip uninstall fastapi-fastkit
+ $ pip install fastapi-fastkit
+ ```
+
+
+3. **PATH prüfen:**
+
+ ```console
+ $ which fastkit
+ ```
+
+
+### Probleme mit der virtuellen Umgebung
+
+Falls die Erstellung der virtuellen Umgebung fehlschlägt:
+
+1. **Python-Version prüfen:**
+
+ ```console
+ $ python --version # Should be 3.12+
+ ```
+
+
+2. **venv-Modul prüfen:**
+
+ ```console
+ $ python -m venv --help
+ ```
+
+
+3. **Manuelle virtuelle Umgebung:**
+
+ ```console
+ $ python -m venv .venv
+ $ source .venv/bin/activate
+ $ pip install -r requirements.txt
+ ```
+
+
+### Server startet nicht
+
+Falls `fastkit runserver` fehlschlägt:
+
+1. **Prüfen Sie, dass Sie im Projektverzeichnis sind**
+2. **Sicherstellen, dass `src/main.py` existiert**
+3. **Virtuelle Umgebung aktivieren:**
+
+ ```console
+ $ source .venv/bin/activate
+ ```
+
+
+4. **Auf Syntaxfehler prüfen:**
+
+ ```console
+ $ python -c "from src.main import app"
+ ```
+
+
+### Port bereits in Verwendung
+
+Falls Port 8000 belegt ist:
+
+
+
+```console
+# Use different port
+$ fastkit runserver --port 8080
+
+# Or kill existing process
+$ lsof -ti:8000 | xargs kill -9
+```
+
+
+
+## Fortgeschrittene Nutzung
+
+### Benutzerdefinierte Vorlagen
+
+Sie können benutzerdefinierte Vorlagen erstellen, indem Sie:
+
+1. **Ein Vorlagenverzeichnis anlegen:**
+ ```
+ my-template/
+ ├── src/
+ │ └── main.py-tpl
+ ├── requirements.txt-tpl
+ └── setup.py-tpl
+ ```
+
+2. **Eine Umgebungsvariable setzen:**
+
+ ```console
+ $ export FASTKIT_TEMPLATES_DIR=~/my-templates
+ ```
+
+
+3. **Die benutzerdefinierte Vorlage verwenden:**
+
+ ```console
+ $ fastkit startdemo
+ # Your custom templates will appear in the list
+ ```
+
+
+### Skripten mit FastAPI-fastkit
+
+Sie können FastAPI-fastkit in Skripten verwenden:
+
+```bash
+#!/bin/bash
+# create-microservices.sh
+
+for service in users products orders; do
+ echo "Creating $service service..."
+ fastkit init <
+
+```console
+$ fastkit init --package-manager uv
+# Creates pyproject.toml with UV configuration
+```
+
+
+
+#### PDM
+- **Modern**: PEP-582- und PEP-621-Unterstützung
+- **Fortgeschritten**: ausgefeilte Abhängigkeitsauflösung
+- **Flexibel**: mehrere Projekt-Layouts
+
+
+
+```console
+$ fastkit init --package-manager pdm
+# Creates pyproject.toml with PDM configuration
+```
+
+
+
+#### Poetry
+- **Etabliert**: ausgereift und weit verbreitet
+- **Integriert**: Build- und Veröffentlichungs-Unterstützung
+- **Lockfile**: poetry.lock für reproduzierbare Builds
+
+
+
+```console
+$ fastkit init --package-manager poetry
+# Creates pyproject.toml with Poetry configuration
+```
+
+
+
+#### PIP
+- **Standard**: in Python enthalten
+- **Kompatibel**: funktioniert überall
+- **Einfach**: geradlinige Abhängigkeitsverwaltung
+
+
+
+```console
+$ fastkit init --package-manager pip
+# Creates requirements.txt
+```
+
+
+
+### Arbeiten mit Projekten
+
+Nach dem Erstellen eines Projekts mit einem bestimmten Paketmanager:
+
+#### UV-Projekte
+```console
+cd my-project
+uv sync # Abhängigkeiten installieren
+uv add requests # Neue Abhängigkeit hinzufügen
+uv run pytest # Befehle in der Umgebung ausführen
+```
+
+#### PDM-Projekte
+```console
+cd my-project
+pdm install # Abhängigkeiten installieren
+pdm add requests # Neue Abhängigkeit hinzufügen
+pdm run pytest # Befehle in der Umgebung ausführen
+```
+
+#### Poetry-Projekte
+```console
+cd my-project
+poetry install # Abhängigkeiten installieren
+poetry add requests # Neue Abhängigkeit hinzufügen
+poetry run pytest # Befehle in der Umgebung ausführen
+```
+
+#### PIP-Projekte
+```console
+cd my-project
+source .venv/bin/activate # Linux/macOS
+.venv\Scripts\activate # Windows
+pip install -r requirements.txt
+pip install requests
+pytest
+```
+
+## Nächste Schritte
+
+Jetzt, da Sie die CLI verstehen:
+
+1. **[Schnellstart](quick-start.md)**: probieren Sie die Befehle praktisch aus
+2. **[Ihr erstes Projekt](../tutorial/first-project.md)**: bauen Sie eine vollständige Anwendung
+3. **[Mitwirken](../contributing/development-setup.md)**: tragen Sie zu FastAPI-fastkit bei
+
+!!! tip "CLI-Tipps"
+ - Verwenden Sie `--help` mit jedem Befehl für detaillierte Hilfe
+ - Konfigurieren Sie Standardwerte, um die Projekterstellung zu beschleunigen
+ - Verwenden Sie Vorlagen für komplexe Projekt-Setups
+ - Kombinieren Sie Befehle für leistungsstarke Workflows
diff --git a/docs/de/user-guide/creating-projects.md b/docs/de/user-guide/creating-projects.md
new file mode 100644
index 0000000..16ee6af
--- /dev/null
+++ b/docs/de/user-guide/creating-projects.md
@@ -0,0 +1,540 @@
+# Projekte erstellen
+
+Eine ausführliche Anleitung zum Erstellen verschiedener Arten von FastAPI-Projekten mit FastAPI-fastkit.
+
+## Grundlegende Projekterstellung
+
+### 1. Projekterstellung im interaktiven Modus
+
+Die einfachste Möglichkeit, ein Projekt interaktiv zu erstellen:
+
+
+
+```console
+$ fastkit init
+Enter the project name: my-awesome-api
+Enter the author name: John Doe
+Enter the author email: john@example.com
+Enter the project description: Awesome FastAPI project
+
+ Project Information
+┌──────────────┬─────────────────────────┐
+│ Project Name │ my-awesome-api │
+│ Author │ John Doe │
+│ Author Email │ john@example.com │
+│ Description │ Awesome FastAPI project │
+└──────────────┴─────────────────────────┘
+```
+
+
+
+### 2. Stack-Auswahl
+
+Wählen Sie den Abhängigkeits-Stack, den Sie in Ihr Projekt aufnehmen möchten:
+
+#### MINIMAL-Stack (Standard)
+
+Das schlichteste FastAPI-Projekt:
+
+- `fastapi` — FastAPI-Framework
+- `uvicorn` — ASGI-Server
+- `pydantic` — Datenvalidierung
+- `pydantic-settings` — Einstellungsverwaltung
+
+**Am besten für:**
+
+- FastAPI lernen
+- Einfache APIs
+- Prototypen
+- Microservices
+
+#### STANDARD-Stack
+
+Enthält Datenbankunterstützung und Tests:
+
+- Alle MINIMAL-Abhängigkeiten
+- `sqlalchemy` — ORM für Datenbankoperationen
+- `alembic` — Datenbankmigrationen
+- `pytest` — Test-Framework
+
+**Am besten für:**
+
+- Die meisten Webanwendungen
+- APIs mit Datenbankspeicherung
+- Produktionsreife Anwendungen
+- Teamprojekte
+
+#### FULL-Stack
+
+Vollständige Entwicklungsumgebung:
+
+- Alle STANDARD-Abhängigkeiten
+- `redis` — Caching und Session-Speicher
+- `celery` — Verarbeitung von Hintergrundaufgaben
+
+**Am besten für:**
+
+- Große Anwendungen
+- Hohe Leistungsanforderungen
+- Komplexe Geschäftslogik
+- Unternehmensanwendungen
+
+## Erweiterte Projektoptionen
+
+### Benutzerdefinierte Projektkonfiguration
+
+Sie können Ihr Projekt während der Erstellung anpassen:
+
+
+
+```console
+$ fastkit init
+Enter the project name: advanced-api
+Enter the author name: Development Team
+Enter the author email: dev@company.com
+Enter the project description: Advanced FastAPI application with custom features
+
+# Choose STANDARD stack for database support
+Select stack (minimal, standard, full): standard
+Do you want to proceed with project creation? [y/N]: y
+```
+
+
+
+### Erklärung der Projektstruktur
+
+Wenn Sie ein Projekt erstellen, generiert FastAPI-fastkit folgende Struktur:
+
+```
+my-awesome-api/
+├── .venv/ # Virtuelle Umgebung
+├── src/ # Quellcode
+│ ├── __init__.py
+│ ├── main.py # Einstiegspunkt der Anwendung
+│ ├── core/ # Zentrale Konfiguration
+│ │ ├── __init__.py
+│ │ └── config.py # Einstellungen und Konfiguration
+│ ├── api/ # API-Schicht
+│ │ ├── __init__.py
+│ │ ├── api.py # Haupt-Router der API
+│ │ └── routes/ # Einzelne Routenmodule
+│ │ ├── __init__.py
+│ │ └── items.py # Beispiel-Endpunkte für Items
+│ ├── crud/ # Datenbankoperationen
+│ │ ├── __init__.py
+│ │ └── items.py # CRUD-Operationen für Items
+│ ├── schemas/ # Pydantic-Modelle
+│ │ ├── __init__.py
+│ │ └── items.py # Schemas zur Datenvalidierung
+│ └── mocks/ # Testdaten
+│ ├── __init__.py
+│ └── mock_items.json # Beispieldaten für die Entwicklung
+├── tests/ # Testsuite
+│ ├── __init__.py
+│ ├── conftest.py # Testkonfiguration
+│ └── test_items.py # Beispieltests
+├── scripts/ # Hilfsskripte
+│ ├── test.sh # Tests ausführen
+│ ├── coverage.sh # Testabdeckung
+│ └── lint.sh # Code-Linting
+├── requirements.txt # Python-Abhängigkeiten
+├── setup.py # Paketkonfiguration
+└── README.md # Projektdokumentation
+```
+
+### 3. Paketmanager-Auswahl
+
+FastAPI-fastkit unterstützt mehrere Python-Paketmanager. Wählen Sie den, der am besten zu Ihrem Workflow passt:
+
+#### Verfügbare Paketmanager
+
+
+
+```console
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+```
+
+
+
+Jeder Paketmanager hat seine Stärken:
+
+#### UV (Standard — empfohlen)
+
+**Schneller Paketmanager auf Rust-Basis**
+
+- ⚡ **Ultraschnell**: 10–100× schneller als pip
+- 🔧 **Direkter Ersatz**: kompatibel mit pip-Workflows
+- 📦 **Modern**: vollständige PEP-621-Unterstützung
+- 🛠️ **Zuverlässig**: deterministische Auflösung
+
+**Generierte Dateien:**
+
+- `pyproject.toml` (PEP-621-Format)
+- `uv.lock` (Lockfile)
+
+**Nutzung nach der Erstellung:**
+```console
+cd my-project
+uv sync # Abhängigkeiten installieren
+uv add requests # Neue Abhängigkeit hinzufügen
+uv run pytest # Tests ausführen
+```
+
+#### PDM
+
+**Moderne Python-Abhängigkeitsverwaltung**
+
+- 🚀 **Modern**: Unterstützung von PEP 582 und PEP 621
+- 🧠 **Intelligent**: fortgeschrittene Abhängigkeitsauflösung
+- 💼 **Professionell**: Unterstützung für Workspaces und Multi-Projekt-Setups
+- 📊 **Analytisch**: Werkzeuge zur Analyse der Abhängigkeiten
+
+**Generierte Dateien:**
+
+- `pyproject.toml` (PEP-621-Format)
+- `pdm.lock` (Lockfile)
+
+**Nutzung nach der Erstellung:**
+```console
+cd my-project
+pdm install # Abhängigkeiten installieren
+pdm add requests # Neue Abhängigkeit hinzufügen
+pdm run pytest # Tests ausführen
+```
+
+#### Poetry
+
+**Ausgereifte Abhängigkeitsverwaltung und Packaging**
+
+- ✅ **Etabliert**: ausgereift und weit verbreitet
+- 📦 **Integriert**: Unterstützung für Build und Veröffentlichung
+- 🔒 **Reproduzierbar**: poetry.lock für exakte Versionen
+- 🏗️ **Komplett**: vollständige Verwaltung des Projektlebenszyklus
+
+**Generierte Dateien:**
+
+- `pyproject.toml` (Poetry-Format)
+- `poetry.lock` (Lockfile)
+
+**Nutzung nach der Erstellung:**
+```console
+cd my-project
+poetry install # Abhängigkeiten installieren
+poetry add requests # Neue Abhängigkeit hinzufügen
+poetry run pytest # Tests ausführen
+```
+
+#### PIP
+
+**Standard-Python-Paketmanager**
+
+- 🏠 **Eingebaut**: in Python enthalten
+- 🌍 **Universell**: funktioniert überall
+- 📚 **Vertraut**: die meisten Entwickler kennen ihn
+- 🔧 **Einfach**: geradliniger Workflow
+
+**Generierte Dateien:**
+
+- `requirements.txt`
+
+**Nutzung nach der Erstellung:**
+```console
+cd my-project
+source .venv/bin/activate # Linux/macOS
+.venv\Scripts\activate # Windows
+pip install -r requirements.txt
+pip install requests
+pytest
+```
+
+#### Paketmanager angeben
+
+Sie können Ihren bevorzugten Paketmanager angeben:
+
+**Interaktive Auswahl (Standard):**
+```console
+$ fastkit init
+# ... prompts for package manager selection
+```
+
+**Kommandozeilenoption:**
+```console
+$ fastkit init --package-manager poetry
+$ fastkit init --package-manager pdm
+$ fastkit init --package-manager uv
+$ fastkit init --package-manager pip
+```
+
+### Die einzelnen Verzeichnisse verstehen
+
+#### `src/`-Verzeichnis
+
+Enthält den gesamten Quellcode Ihrer Anwendung nach dem **src-Layout**-Muster, einer Best Practice für Python-Packaging.
+
+#### `core/`-Modul
+
+- **config.py**: Anwendungseinstellungen, Umgebungsvariablen und Konfiguration
+- Zentralisiert die gesamte Konfigurationsverwaltung
+- Unterstützt eine `.env`-Datei für umgebungsspezifische Einstellungen
+
+#### `api/`-Modul
+
+- **api.py**: Haupt-API-Router, der alle Unter-Router einbindet
+- **routes/**: einzelne Routenmodule für verschiedene Ressourcen
+- Saubere Trennung der Zuständigkeiten für verschiedene API-Endpunkte
+
+#### `crud/`-Modul
+
+- Datenbankoperationen und Geschäftslogik
+- **C**reate, **R**ead, **U**pdate, **D**elete
+- Abstraktionsschicht zwischen API-Routen und Datenspeicher
+
+#### `schemas/`-Modul
+
+- Pydantic-Modelle zur Datenvalidierung
+- Anfrage-/Antwortschemata
+- Typdefinitionen und Datenmodelle
+
+#### `tests/`-Verzeichnis
+
+- Vollständige Test-Suite für Ihre Anwendung
+- Enthält Unit-Tests und Integrationstests
+- Vorkonfiguriert mit pytest
+
+## Stack-Vergleich
+
+| Funktion | MINIMAL | STANDARD | FULL |
+|---------|---------|----------|------|
+| FastAPI & Uvicorn | ✅ | ✅ | ✅ |
+| Datenvalidierung | ✅ | ✅ | ✅ |
+| Datenbankunterstützung | ❌ | ✅ | ✅ |
+| Migrationen | ❌ | ✅ | ✅ |
+| Test-Framework | ❌ | ✅ | ✅ |
+| Caching (Redis) | ❌ | ❌ | ✅ |
+| Hintergrundaufgaben | ❌ | ❌ | ✅ |
+| **Am besten für** | Lernen, einfache APIs | Die meisten Anwendungen | Enterprise, komplexe Apps |
+
+## Beispiele zur Projekterstellung
+
+### Beispiel 1: Lernprojekt
+
+
+
+```console
+$ fastkit init
+Enter the project name: fastapi-learning
+Enter the author name: Student
+Enter the author email: student@example.com
+Enter the project description: Learning FastAPI basics
+
+Select stack (minimal, standard, full): minimal
+Do you want to proceed with project creation? [y/N]: y
+```
+
+
+
+### Beispiel 2: E-Commerce-API
+
+
+
+```console
+$ fastkit init
+Enter the project name: ecommerce-api
+Enter the author name: E-commerce Team
+Enter the author email: team@ecommerce.com
+Enter the project description: E-commerce platform API
+
+Select stack (minimal, standard, full): standard
+Do you want to proceed with project creation? [y/N]: y
+```
+
+
+
+### Beispiel 3: Hochleistungsanwendung
+
+
+
+```console
+$ fastkit init
+Enter the project name: enterprise-api
+Enter the author name: Enterprise Team
+Enter the author email: enterprise@company.com
+Enter the project description: High-performance enterprise API
+
+Select stack (minimal, standard, full): full
+Do you want to proceed with project creation? [y/N]: y
+```
+
+
+
+## Nach der Projekterstellung
+
+### 1. Virtuelle Umgebung aktivieren
+
+
+
+```console
+$ cd my-awesome-api
+$ source .venv/bin/activate # Linux/macOS
+$ .venv\Scripts\activate # Windows
+```
+
+
+
+### 2. Installation überprüfen
+
+
+
+```console
+$ pip list
+Package Version
+fastapi 0.104.1
+uvicorn 0.24.0
+pydantic 2.5.0
+...
+```
+
+
+
+### 3. Mit der Entwicklung beginnen
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000
+```
+
+
+
+## Konfigurationsverwaltung
+
+### Umgebungsvariablen
+
+Ihr Projekt unterstützt umgebungsbasierte Konfiguration über `.env`-Dateien:
+
+Erstellen Sie eine `.env`-Datei im Projekt-Stammverzeichnis:
+
+```env
+# .env
+APP_NAME=My Awesome API
+APP_VERSION=1.0.0
+DEBUG=True
+DATABASE_URL=sqlite:///./app.db
+SECRET_KEY=your-secret-key-here
+```
+
+### Konfiguration im Code
+
+Die generierte `src/core/config.py` lädt diese Variablen automatisch:
+
+```python
+from pydantic_settings import BaseSettings
+
+class Settings(BaseSettings):
+ APP_NAME: str = "FastAPI Application"
+ APP_VERSION: str = "1.0.0"
+ DEBUG: bool = False
+ DATABASE_URL: str = "sqlite:///./app.db"
+ SECRET_KEY: str = "dev-secret-key"
+
+ class Config:
+ env_file = ".env"
+
+settings = Settings()
+```
+
+## Anpassungsmöglichkeiten
+
+### Benutzerdefinierte Abhängigkeiten hinzufügen
+
+Nach der Projekterstellung können Sie weitere Abhängigkeiten hinzufügen:
+
+
+
+```console
+$ pip install requests httpx python-jose
+$ pip freeze > requirements.txt
+```
+
+
+
+### Projektstruktur anpassen
+
+Die generierte Struktur folgt Best Practices, lässt sich aber anpassen:
+
+- Neue Module in `src/` hinzufügen
+- Weitere Routendateien in `api/routes/` anlegen
+- CRUD-Operationen in `crud/` erweitern
+- Weitere Schemata in `schemas/` hinzufügen
+
+## Best Practices
+
+### 1. Virtuelle Umgebung
+
+Verwenden Sie immer virtuelle Umgebungen, um Projektabhängigkeiten zu isolieren:
+
+```bash
+# Create project with virtual environment
+$ fastkit init # Automatically creates .venv/
+
+# Activate when working
+$ source .venv/bin/activate
+```
+
+### 2. Versionsverwaltung
+
+Initialisieren Sie ein Git-Repository nach der Projekterstellung:
+
+
+
+```console
+$ cd my-awesome-api
+$ git init
+$ git add .
+$ git commit -m "Initial commit - FastAPI project setup"
+```
+
+
+
+### 3. Umgebungskonfiguration
+
+- Verwenden Sie `.env`-Dateien für die lokale Entwicklung
+- Verwenden Sie Umgebungsvariablen für die Produktion
+- Committen Sie niemals sensible Daten in die Versionsverwaltung
+
+### 4. Testen
+
+Nutzen Sie das mitgelieferte Test-Framework:
+
+
+
+```console
+$ python -m pytest
+$ bash scripts/test.sh
+```
+
+
+
+## Nächste Schritte
+
+Nachdem Sie Ihr Projekt erstellt haben:
+
+1. **[Routen hinzufügen](adding-routes.md)**: lernen Sie, wie Sie neue API-Endpunkte hinzufügen
+2. **[CLI-Referenz](cli-reference.md)**: meistern Sie alle verfügbaren Befehle
+3. **[Tutorial – Ihr erstes Projekt](../tutorial/first-project.md)**: bauen Sie eine vollständige Anwendung
+
+!!! tip "Tipps zur Projekterstellung"
+ - Wählen Sie den Stack, der zu Ihren Projektanforderungen passt
+ - Beginnen Sie mit MINIMAL zum Lernen, nutzen Sie STANDARD für die meisten Projekte
+ - Die Projektstruktur ist auf Skalierbarkeit und Wartbarkeit ausgelegt
+ - Der gesamte generierte Code folgt FastAPI-Best-Practices
diff --git a/docs/de/user-guide/installation.md b/docs/de/user-guide/installation.md
new file mode 100644
index 0000000..d374560
--- /dev/null
+++ b/docs/de/user-guide/installation.md
@@ -0,0 +1,209 @@
+# Installation
+
+Diese Anleitung erklärt, wie FastAPI-fastkit installiert wird.
+
+## Voraussetzungen
+
+Um FastAPI-fastkit zu verwenden, müssen die folgenden Voraussetzungen erfüllt sein:
+
+- **Python**: 3.12 oder höher
+- **Betriebssystem**: Windows, macOS, Linux unterstützt
+
+## Installationsmethoden
+
+### Installation mit pip (empfohlen)
+
+Die einfachste Installationsmethode:
+
+
+
+```console
+$ pip install FastAPI-fastkit
+---> 100%
+Successfully installed FastAPI-fastkit
+```
+
+
+
+### Eine bestimmte Version installieren
+
+Um eine bestimmte Version zu installieren:
+
+
+
+```console
+$ pip install FastAPI-fastkit==1.0.0
+---> 100%
+Successfully installed FastAPI-fastkit-1.0.0
+```
+
+
+
+### Entwicklungsversion installieren
+
+Um die neueste Entwicklungsversion direkt von GitHub zu installieren:
+
+
+
+```console
+$ pip install git+https://github.com/bnbong/FastAPI-fastkit.git
+---> 100%
+Successfully installed FastAPI-fastkit
+```
+
+
+
+!!! warning "Hinweis zur Entwicklungsversion"
+ Entwicklungsversionen können instabil sein und werden für Produktionsumgebungen nicht empfohlen.
+
+## Einrichtung einer virtuellen Umgebung (empfohlen)
+
+Es wird dringend empfohlen, eine virtuelle Umgebung zu verwenden, um Abhängigkeitskonflikte zu vermeiden:
+
+### Mit venv
+
+
+
+```console
+$ python -m venv fastapi-env
+$ source fastapi-env/bin/activate # Linux/macOS
+$ fastapi-env\Scripts\activate # Windows
+$ pip install FastAPI-fastkit
+```
+
+
+
+### Mit conda
+
+
+
+```console
+$ conda create -n fastapi-env python=3.12
+$ conda activate fastapi-env
+$ pip install FastAPI-fastkit
+```
+
+
+
+## Installation überprüfen
+
+Überprüfen Sie nach der Installation, dass FastAPI-fastkit korrekt installiert ist:
+
+
+
+```console
+$ fastkit --version
+FastAPI-fastkit version 1.0.0
+```
+
+
+
+
+
+```console
+$ fastkit --help
+Usage: fastkit [OPTIONS] COMMAND [ARGS]...
+
+ FastAPI-fastkit CLI
+
+Options:
+ --version Show the version and exit.
+ --help Show this message and exit.
+
+Commands:
+ addroute Add a new route to FastAPI project
+ init Create a new FastAPI project
+ list-templates List available FastAPI templates
+ runserver Start FastAPI development server
+ startdemo Create FastAPI project from template
+```
+
+
+
+## Fehlerbehebung
+
+### Befehl nicht gefunden
+
+Wenn Sie den Fehler „command not found" erhalten:
+
+1. **Prüfen Sie, ob FastAPI-fastkit installiert ist**:
+
+
+ ```console
+ $ pip show FastAPI-fastkit
+ ```
+
+
+2. **Prüfen Sie Ihre virtuelle Umgebung**:
+
+
+ ```console
+ $ which python
+ $ which pip
+ ```
+
+
+3. **Installieren Sie FastAPI-fastkit erneut**:
+
+
+ ```console
+ $ pip uninstall FastAPI-fastkit
+ $ pip install FastAPI-fastkit
+ ```
+
+
+### Berechtigungsfehler
+
+Wenn Sie bei der Installation auf Berechtigungsfehler stoßen:
+
+**Unter Linux/macOS:**
+
+
+
+```console
+$ pip install --user FastAPI-fastkit
+```
+
+
+
+**Unter Windows (als Administrator ausführen):**
+
+
+
+```console
+$ pip install FastAPI-fastkit
+```
+
+
+
+### Python-Versionskompatibilität
+
+FastAPI-fastkit erfordert Python 3.12+. Überprüfen Sie Ihre Python-Version:
+
+
+
+```console
+$ python --version
+Python 3.12.0
+```
+
+
+
+Falls Sie eine ältere Version haben, aktualisieren Sie Python:
+
+- **Offizielles Python**: [python.org/downloads](https://www.python.org/downloads/)
+- **Mit pyenv**: `pyenv install 3.12.0`
+- **Mit conda**: `conda install python=3.12`
+
+## Nächste Schritte
+
+Sobald die Installation abgeschlossen ist:
+
+1. **[Schnellstart](quick-start.md)**: erstellen Sie Ihr erstes Projekt in 5 Minuten
+2. **[Tutorial – Erste Schritte](../tutorial/getting-started.md)**: detailliertes Schritt-für-Schritt-Tutorial
+3. **[CLI-Referenz](cli-reference.md)**: vollständige Befehlsreferenz
+
+!!! tip "Installationstipps"
+ - Verwenden Sie immer virtuelle Umgebungen, um Projekte zu isolieren
+ - Halten Sie FastAPI-fastkit auf der neuesten Version
+ - Im [GitHub-Repository](https://github.com/bnbong/FastAPI-fastkit) finden Sie Updates und Issues
diff --git a/docs/de/user-guide/quick-start.md b/docs/de/user-guide/quick-start.md
new file mode 100644
index 0000000..5d5917c
--- /dev/null
+++ b/docs/de/user-guide/quick-start.md
@@ -0,0 +1,368 @@
+# Schnellstart
+
+Erstellen Sie Ihr erstes FastAPI-Projekt mit FastAPI-fastkit in weniger als 5 Minuten!
+
+!!! tip "Unsicher, welchen Starter Sie wählen sollen?"
+ Siehe [**Welchen Starter soll ich wählen?**](choosing-a-starter.md) für einen einsteigerfreundlichen Vergleich der `startdemo`-Vorlagen und der interaktiven Architektur-Presets (`minimal` / `single-module` / `classic-layered` / `domain-starter`). Kurz gesagt: **`fastkit init --interactive` mit dem Preset `domain-starter` ist die empfohlene Standardlösung für moderne APIs.**
+
+## 1. Projekt erstellen
+
+Verwenden Sie den Befehl `init` von FastAPI-fastkit, um ein neues Projekt zu erstellen:
+
+
+
+```console
+$ fastkit init
+Enter the project name: my-first-app
+Enter the author name: Your Name
+Enter the author email: your.email@example.com
+Enter the project description: My first FastAPI application
+
+ Project Information
+┌──────────────┬─────────────────────────────┐
+│ Project Name │ my-first-app │
+│ Author │ Your Name │
+│ Author Email │ your.email@example.com │
+│ Description │ My first FastAPI application│
+└──────────────┴─────────────────────────────┘
+
+Available Stacks and Dependencies:
+ MINIMAL Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ pydantic │
+│ Dependency 4 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+ STANDARD Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ sqlalchemy │
+│ Dependency 4 │ alembic │
+│ Dependency 5 │ pytest │
+│ Dependency 6 │ pydantic │
+│ Dependency 7 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+ FULL Stack
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ sqlalchemy │
+│ Dependency 4 │ alembic │
+│ Dependency 5 │ pytest │
+│ Dependency 6 │ redis │
+│ Dependency 7 │ celery │
+│ Dependency 8 │ pydantic │
+│ Dependency 9 │ pydantic-settings │
+└──────────────┴───────────────────┘
+
+Select stack (minimal, standard, full): minimal
+
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'my-first-app' has been created successfully!
+```
+
+
+
+## 2. Virtuelle Umgebung aktivieren
+
+Wechseln Sie in Ihr Projekt und aktivieren Sie die virtuelle Umgebung:
+
+
+
+```console
+$ cd my-first-app
+$ source .venv/bin/activate # Linux/macOS
+$ .venv\Scripts\activate # Windows
+```
+
+
+
+## 3. Entwicklungsserver starten
+
+Starten Sie den FastAPI-Entwicklungsserver:
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+INFO: Started reloader process [28720]
+INFO: Started server process [28722]
+INFO: Waiting for application startup.
+INFO: Application startup complete.
+```
+
+
+
+!!! success "Glückwunsch!"
+ Ihr FastAPI-Server läuft jetzt! Öffnen Sie Ihren Browser, um ihn zu erkunden.
+
+## 4. Ihre API testen
+
+Öffnen Sie Ihren Browser und rufen Sie diese URLs auf:
+
+### Hauptendpunkt
+
+Besuchen Sie [http://127.0.0.1:8000](http://127.0.0.1:8000)
+
+Sie sehen:
+
+```json
+{"message": "Hello World"}
+```
+
+### Interaktive API-Dokumentation
+
+Besuchen Sie [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)
+
+Dies ist die automatisch generierte **Swagger-UI**-Dokumentation, mit der Sie können:
+
+- alle Ihre API-Endpunkte sehen
+- Endpunkte direkt im Browser testen
+- Anfrage- und Antwortschemas einsehen
+
+### Alternative Dokumentation
+
+Besuchen Sie [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)
+
+Dies ist die **ReDoc**-Dokumentationsoberfläche mit einem anderen, schlichten Design.
+
+## 5. Ihre erste Route hinzufügen
+
+Lassen Sie uns eine neue API-Route zu Ihrem Projekt hinzufügen:
+
+
+
+```console
+$ fastkit addroute users my-first-app
+ Adding New Route
+┌──────────────────┬──────────────────────────────────────────┐
+│ Project │ my-first-app │
+│ Route Name │ users │
+│ Target Directory │ ~/my-first-app │
+└──────────────────┴──────────────────────────────────────────┘
+
+Do you want to add route 'users' to project 'my-first-app'? [Y/n]: y
+
+╭──────────────────────── Info ────────────────────────╮
+│ ℹ Updated main.py to include the API router │
+╰──────────────────────────────────────────────────────╯
+╭─────────────────────── Success ───────────────────────╮
+│ ✨ Successfully added new route 'users' to project │
+│ `my-first-app` │
+╰───────────────────────────────────────────────────────╯
+```
+
+
+
+Der Server lädt automatisch neu, und Sie haben nun neue Endpunkte:
+
+- `GET /api/v1/users/` — alle Nutzer abrufen
+- `POST /api/v1/users/` — einen neuen Nutzer anlegen
+- `GET /api/v1/users/{user_id}` — einen bestimmten Nutzer abrufen
+- `PUT /api/v1/users/{user_id}` — einen Nutzer aktualisieren
+- `DELETE /api/v1/users/{user_id}` — einen Nutzer löschen
+
+## 6. Die neue API testen
+
+### Mit curl
+
+**Alle Nutzer abrufen:**
+
+
+
+```console
+$ curl http://127.0.0.1:8000/api/v1/users/
+[]
+```
+
+
+
+**Einen neuen Nutzer anlegen:**
+
+
+
+```console
+$ curl -X POST "http://127.0.0.1:8000/api/v1/users/" \
+ -H "Content-Type: application/json" \
+ -d '{"title": "John Doe", "description": "Software Developer"}'
+{
+ "id": 1,
+ "title": "John Doe",
+ "description": "Software Developer"
+}
+```
+
+
+
+### Über die interaktive Dokumentation
+
+1. Besuchen Sie [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)
+2. Klappen Sie den Abschnitt **„users"** auf
+3. Klicken Sie auf **„POST /api/v1/users/"**
+4. Klicken Sie auf **„Try it out"**
+5. Füllen Sie den Request-Body aus:
+ ```json
+ {
+ "title": "Jane Smith",
+ "description": "Product Manager"
+ }
+ ```
+6. Klicken Sie auf **„Execute"**
+
+## 7. Ihre Projektstruktur erkunden
+
+Ihr generiertes Projekt hat eine klare, organisierte Struktur:
+
+```
+my-first-app/
+├── .venv/ # Virtuelle Umgebung
+├── src/
+│ ├── __init__.py
+│ ├── main.py # Einstiegspunkt der FastAPI-App
+│ ├── core/
+│ │ ├── __init__.py
+│ │ └── config.py # App-Konfiguration
+│ ├── api/
+│ │ ├── __init__.py
+│ │ ├── api.py # Sammlung der API-Router
+│ │ └── routes/
+│ │ ├── __init__.py
+│ │ ├── items.py # Standardroute für Items
+│ │ └── users.py # Ihre neue Users-Route
+│ ├── crud/
+│ │ ├── __init__.py
+│ │ ├── items.py # CRUD-Operationen für Items
+│ │ └── users.py # CRUD-Operationen für Users
+│ ├── schemas/
+│ │ ├── __init__.py
+│ │ ├── items.py # Pydantic-Schemas für Items
+│ │ └── users.py # Pydantic-Schemas für Users
+│ └── mocks/
+│ ├── __init__.py
+│ └── mock_items.json # Testdaten
+├── tests/ # Testdateien
+├── scripts/ # Hilfsskripte
+├── requirements.txt # Python-Abhängigkeiten
+├── setup.py # Paketkonfiguration
+└── README.md # Projektdokumentation
+```
+
+## 8. Paketmanager-Optionen
+
+FastAPI-fastkit unterstützt mehrere Python-Paketmanager, passend zu Ihren Vorlieben:
+
+### Verfügbare Paketmanager
+
+| Manager | Beschreibung | Am besten für |
+|---------|-------------|----------|
+| **UV** | Schneller Python-Paketmanager (Standard) | Geschwindigkeit und Leistung |
+| **PDM** | Moderne Python-Abhängigkeitsverwaltung | Fortgeschrittene Abhängigkeitsauflösung |
+| **Poetry** | Python-Abhängigkeitsverwaltung und Packaging | Poetry-basierte Workflows |
+| **PIP** | Standard-Python-Paketmanager | Klassische Python-Entwicklung |
+
+### Paketmanager angeben
+
+Sie können Ihren bevorzugten Paketmanager auf mehrere Arten angeben:
+
+#### 1. Interaktive Auswahl (Standard)
+
+Wenn Sie `fastkit init` oder `fastkit startdemo` ausführen, werden Sie zur Auswahl aufgefordert:
+
+
+
+```console
+$ fastkit init
+# ... after project details and stack selection ...
+
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+```
+
+
+
+#### 2. Kommandozeilenoption
+
+Überspringen Sie die interaktive Eingabeaufforderung, indem Sie den Paketmanager direkt angeben:
+
+
+
+```console
+$ fastkit init --package-manager poetry
+$ fastkit startdemo --package-manager pdm
+```
+
+
+
+### Generierte Abhängigkeitsdateien
+
+Jeder Paketmanager erzeugt die jeweils passenden Abhängigkeitsdateien:
+
+- **UV/PDM**: `pyproject.toml` (PEP-621-Format)
+- **Poetry**: `pyproject.toml` (Poetry-Format)
+- **PIP**: `requirements.txt`
+
+## 9. Wie geht es weiter?
+
+Glückwunsch! Sie haben erfolgreich:
+
+✅ Ihr erstes FastAPI-Projekt erstellt
+✅ den Entwicklungsserver gestartet
+✅ eine neue API-Route hinzugefügt
+✅ Ihre APIs getestet
+
+### Weiter lernen
+
+1. **[Ihr erstes Projekt](../tutorial/first-project.md)**: bauen Sie eine umfassendere Blog-API
+2. **[Projekte erstellen](creating-projects.md)**: lernen Sie verschiedene Stacks und Optionen kennen
+3. **[Routen hinzufügen](adding-routes.md)**: meistern Sie die API-Entwicklung
+4. **[Vorlagen verwenden](using-templates.md)**: erkunden Sie vorgefertigte Projektvorlagen
+
+### Mehr experimentieren
+
+Probieren Sie diese Befehle aus, um weitere Funktionen zu erkunden:
+
+
+
+```console
+# List available templates
+$ fastkit list-templates
+
+# Create a project from a template
+$ fastkit startdemo
+
+# Add more routes (route name first, project dir second)
+$ fastkit addroute products my-first-app
+$ fastkit addroute orders my-first-app
+```
+
+
+
+!!! tip "Entwicklungstipps"
+ - Der Server lädt automatisch neu, wenn Sie Dateien ändern
+ - Prüfen Sie immer die interaktive Doku unter `/docs`, wenn Sie neue Funktionen hinzufügen
+ - Verwenden Sie die virtuelle Umgebung, um Abhängigkeiten zu isolieren
+ - Erkunden Sie den generierten Code, um die Projektstruktur zu verstehen
diff --git a/docs/de/user-guide/using-templates.md b/docs/de/user-guide/using-templates.md
new file mode 100644
index 0000000..2228eea
--- /dev/null
+++ b/docs/de/user-guide/using-templates.md
@@ -0,0 +1,608 @@
+# Vorlagen verwenden
+
+FastAPI-fastkit bietet vorgefertigte Projektvorlagen, mit denen Sie schnell mit verschiedenen Tech-Stacks starten können.
+
+## Verfügbare Vorlagen
+
+Prüfen Sie die verfügbaren Vorlagen mit dem Befehl `list-templates`:
+
+
+
+```console
+$ fastkit list-templates
+ Available Templates
+┌─────────────────────────┬───────────────────────────────────┐
+│ fastapi-custom-response │ Async Item Management API with │
+│ │ Custom Response System │
+│ fastapi-dockerized │ Dockerized FastAPI Item │
+│ │ Management API │
+│ fastapi-empty │ No description │
+│ fastapi-async-crud │ Async Item Management API Server │
+│ fastapi-psql-orm │ Dockerized FastAPI Item │
+│ │ Management API with PostgreSQL │
+│ fastapi-default │ Simple FastAPI Project │
+└─────────────────────────┴───────────────────────────────────┘
+```
+
+
+
+## Beschreibungen der Vorlagen
+
+### 1. `fastapi-default`
+
+**Einfaches FastAPI-Projekt**
+
+- Grundlegende FastAPI-Einrichtung mit essenziellen Funktionen
+- Itemverwaltung mit Mock-Daten
+- Ideal zum Lernen und für einfache APIs
+- Enthält grundlegende CRUD-Operationen
+
+**Am besten für:**
+
+- FastAPI-Einsteiger
+- Einfache Web-APIs
+- Lernen und Prototyping
+
+### 2. `fastapi-async-crud`
+
+**Asynchrone Item-Management-API**
+
+- Vollständig asynchrone FastAPI-Anwendung
+- Erweiterte CRUD-Operationen mit async/await
+- Bessere Leistung bei I/O-Operationen
+- Mock-Datenspeicher mit asynchronen Mustern
+
+**Am besten für:**
+
+- Hochleistungsanwendungen
+- I/O-intensive Operationen
+- Moderne asynchrone Python-Entwicklung
+
+### 3. `fastapi-custom-response`
+
+**Asynchrone Item-Management-API mit benutzerdefiniertem Antwortsystem**
+
+- Benutzerdefinierte Antwortmodelle und Formatierung
+- Erweiterte Fehlerbehandlung
+- Unterstützung für Paginierung
+- Benutzerdefinierte HTTP-Statuscodes und Antworten
+
+**Am besten für:**
+
+- APIs, die bestimmte Antwortformate benötigen
+- Erweiterte Anforderungen an die Fehlerbehandlung
+- Benutzerdefinierte Geschäftslogik in Antworten
+
+### 4. `fastapi-dockerized`
+
+**Dockerisierte FastAPI-Item-Management-API**
+
+- Vollständige Docker-Containerisierung
+- Produktionsreife Deployment-Konfiguration
+- Mehrstufige Docker-Builds
+- Umgebungsbasierte Konfiguration
+
+**Am besten für:**
+
+- Produktionsdeployments
+- Containerisierte Umgebungen
+- DevOps- und CI/CD-Pipelines
+
+### 5. `fastapi-psql-orm`
+
+**Dockerisierte FastAPI-Item-Management-API mit PostgreSQL**
+
+- PostgreSQL-Datenbankintegration
+- SQLAlchemy-ORM mit Alembic-Migrationen
+- Docker Compose für die lokale Entwicklung
+- Vollständige CRUD-Operationen auf der Datenbank
+
+**Am besten für:**
+
+- Datenbankgetriebene Anwendungen
+- Produktionsreife Datenspeicherung
+- Komplexe Datenbeziehungen
+
+### 6. `fastapi-empty`
+
+**Minimales FastAPI-Projekt**
+
+- Absolute Minimal-Einrichtung von FastAPI
+- Keine vorgefertigten Funktionen
+- Leere Leinwand für individuelle Entwicklung
+
+**Am besten für:**
+
+- Bei Null beginnen
+- Minimale Abhängigkeiten
+- Spezielle Architekturanforderungen
+
+## Ein Projekt aus einer Vorlage erstellen
+
+Verwenden Sie den Befehl `startdemo`, um ein Projekt aus einer Vorlage zu erstellen:
+
+
+
+```console
+$ fastkit startdemo
+Enter the project name: my-blog-api
+Enter the author name: John Doe
+Enter the author email: john@example.com
+Enter the project description: Blog API with PostgreSQL
+
+Available Templates:
+ fastapi-default
+┌─────────────┬──────────────────────┐
+│ Description │ Simple FastAPI │
+│ │ Project │
+│ Stack │ FastAPI, Uvicorn │
+│ Database │ Mock Data │
+│ Features │ Basic CRUD │
+└─────────────┴──────────────────────┘
+
+ fastapi-psql-orm
+┌─────────────┬──────────────────────┐
+│ Description │ Dockerized FastAPI │
+│ │ Item Management API │
+│ │ with PostgreSQL │
+│ Stack │ FastAPI, PostgreSQL, │
+│ │ SQLAlchemy, Docker │
+│ Database │ PostgreSQL │
+│ Features │ Full ORM, Migrations │
+└─────────────┴──────────────────────┘
+
+Select template (fastapi-default, fastapi-async-crud, fastapi-custom-response, fastapi-dockerized, fastapi-psql-orm, fastapi-empty): fastapi-psql-orm
+
+ Project Information
+┌──────────────┬─────────────────────┐
+│ Project Name │ my-blog-api │
+│ Author │ John Doe │
+│ Author Email │ john@example.com │
+│ Description │ Blog API with │
+│ │ PostgreSQL │
+└──────────────┴─────────────────────┘
+
+ Template Dependencies
+┌──────────────┬───────────────────┐
+│ Dependency 1 │ fastapi │
+│ Dependency 2 │ uvicorn │
+│ Dependency 3 │ sqlalchemy │
+│ Dependency 4 │ alembic │
+│ Dependency 5 │ psycopg2-binary │
+│ Dependency 6 │ python-dotenv │
+│ Dependency 7 │ pytest │
+└──────────────┴───────────────────┘
+
+Available Package Managers:
+ Package Managers
+┌────────┬────────────────────────────────────────────┐
+│ PIP │ Standard Python package manager │
+│ UV │ Fast Python package manager │
+│ PDM │ Modern Python dependency management │
+│ POETRY │ Python dependency management and packaging │
+└────────┴────────────────────────────────────────────┘
+
+Select package manager (pip, uv, pdm, poetry) [uv]: uv
+Do you want to proceed with project creation? [y/N]: y
+
+✨ FastAPI project 'my-blog-api' from 'fastapi-psql-orm' has been created successfully!
+```
+
+
+
+## Funktionsvergleich der Vorlagen
+
+| Funktion | Default | Async CRUD | Custom Response | Dockerized | PostgreSQL ORM | Empty |
+|---------|---------|------------|-----------------|------------|----------------|-------|
+| **FastAPI-Basis** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| **Mock-Daten** | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
+| **Async-Unterstützung** | Basis | ✅ | ✅ | ✅ | ✅ | ❌ |
+| **Benutzerdefinierte Antworten** | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
+| **Docker** | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
+| **Datenbank** | Mock | Mock | Mock | Mock | PostgreSQL | Keine |
+| **ORM** | ❌ | ❌ | ❌ | ❌ | SQLAlchemy | ❌ |
+| **Migrationen** | ❌ | ❌ | ❌ | ❌ | Alembic | ❌ |
+| **Testen** | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
+| **Am besten für** | Lernen | Leistung | Benutzerdefinierte APIs | Produktion | Datenbank-Apps | Individuelles |
+
+## Vorlagenspezifische Einrichtung
+
+### `fastapi-psql-orm` verwenden
+
+Diese Vorlage enthält eine vollständige PostgreSQL-Einrichtung. Nach der Erstellung:
+
+1. **PostgreSQL mit Docker starten:**
+
+
+
+```console
+$ cd my-blog-api
+$ docker-compose up -d postgres
+Starting my-blog-api_postgres_1 ... done
+```
+
+
+
+2. **Datenbankmigrationen ausführen:**
+
+
+
+```console
+$ source .venv/bin/activate
+$ alembic upgrade head
+INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
+INFO [alembic.runtime.migration] Will assume transactional DDL.
+INFO [alembic.runtime.migration] Running upgrade -> bedcdc35b64a, first alembic
+```
+
+
+
+3. **API-Server starten:**
+
+
+
+```console
+$ fastkit runserver
+INFO: Uvicorn running on http://127.0.0.1:8000
+```
+
+
+
+### `fastapi-dockerized` verwenden
+
+Diese Vorlage bietet vollständige Docker-Unterstützung:
+
+1. **Docker-Image bauen:**
+
+
+
+```console
+$ cd my-dockerized-api
+$ docker build -t my-dockerized-api .
+Successfully built abc123def456
+Successfully tagged my-dockerized-api:latest
+```
+
+
+
+2. **Container ausführen:**
+
+
+
+```console
+$ docker run -p 8000:8000 my-dockerized-api
+INFO: Uvicorn running on http://0.0.0.0:8000
+```
+
+
+
+### `fastapi-custom-response` verwenden
+
+Diese Vorlage enthält fortgeschrittene Antwortbehandlung:
+
+1. **Benutzerdefinierte Antwortmodelle:**
+
+```python
+from src.helper.pagination import PaginatedResponse
+from src.schemas.base import StandardResponse
+
+@router.get("/", response_model=PaginatedResponse[Item])
+def read_items(skip: int = 0, limit: int = 10):
+ items = items_crud.get_multi(skip=skip, limit=limit)
+ total = items_crud.count()
+
+ return PaginatedResponse(
+ data=items,
+ total=total,
+ page=skip // limit + 1,
+ pages=(total + limit - 1) // limit
+ )
+
+@router.post("/", response_model=StandardResponse[Item])
+def create_item(item: ItemCreate):
+ new_item = items_crud.create(item)
+ return StandardResponse(
+ data=new_item,
+ message="Item created successfully",
+ status_code=201
+ )
+```
+
+2. **Erweiterte Fehlerbehandlung:**
+
+```python
+from src.helper.exceptions import ItemNotFoundError, ValidationError
+
+@router.get("/{item_id}", response_model=StandardResponse[Item])
+def read_item(item_id: int):
+ try:
+ item = items_crud.get(item_id)
+ return StandardResponse(data=item)
+ except ItemNotFoundError:
+ raise HTTPException(
+ status_code=404,
+ detail=f"Item with id {item_id} not found"
+ )
+```
+
+## Projektstruktur der Vorlagen
+
+Jede Vorlage folgt einer konsistenten, aber angepassten Struktur:
+
+### Struktur von `fastapi-default`
+```
+my-project/
+├── src/
+│ ├── main.py
+│ ├── core/config.py
+│ ├── api/
+│ │ ├── api.py
+│ │ └── routes/items.py
+│ ├── crud/items.py
+│ ├── schemas/items.py
+│ └── mocks/mock_items.json
+├── tests/
+├── scripts/
+└── requirements.txt
+```
+
+### Struktur von `fastapi-psql-orm`
+```
+my-project/
+├── src/
+│ ├── main.py
+│ ├── core/
+│ │ ├── config.py
+│ │ └── db.py
+│ ├── api/
+│ │ ├── api.py
+│ │ ├── deps.py
+│ │ └── routes/items.py
+│ ├── crud/items.py
+│ ├── schemas/items.py
+│ ├── alembic/
+│ │ ├── env.py
+│ │ └── versions/
+│ └── utils/
+├── tests/
+├── scripts/
+├── docker-compose.yml
+├── Dockerfile
+├── alembic.ini
+└── requirements.txt
+```
+
+## Vorlagen anpassen
+
+Nachdem Sie ein Projekt aus einer Vorlage erstellt haben, können Sie es anpassen:
+
+### 1. Neue Routen hinzufügen
+
+
+
+```console
+$ fastkit addroute posts my-blog-api
+$ fastkit addroute users my-blog-api
+$ fastkit addroute comments my-blog-api
+```
+
+
+
+### 2. Konfiguration anpassen
+
+Bearbeiten Sie `src/core/config.py` nach Ihren Bedürfnissen:
+
+```python
+from pydantic_settings import BaseSettings
+
+class Settings(BaseSettings):
+ PROJECT_NAME: str = "My Blog API"
+ VERSION: str = "1.0.0"
+ API_V1_STR: str = "/api/v1"
+
+ # Database settings (for PostgreSQL templates)
+ DATABASE_URL: str = "postgresql://user:password@localhost/dbname"
+
+ # Security settings
+ SECRET_KEY: str = "your-secret-key-here"
+ ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
+
+ class Config:
+ env_file = ".env"
+
+settings = Settings()
+```
+
+### 3. Umgebungsvariablen hinzufügen
+
+Erstellen Sie eine `.env`-Datei im Projekt-Stammverzeichnis:
+
+```env
+# .env
+PROJECT_NAME=My Blog API
+VERSION=1.0.0
+DEBUG=True
+
+# Database (for PostgreSQL templates)
+DATABASE_URL=postgresql://user:password@localhost:5432/myblogdb
+POSTGRES_USER=user
+POSTGRES_PASSWORD=password
+POSTGRES_DB=myblogdb
+
+# Security
+SECRET_KEY=your-super-secret-key-here
+ACCESS_TOKEN_EXPIRE_MINUTES=30
+```
+
+## Vorlagen testen
+
+Jede Vorlage wird mit vorkonfigurierten Tests ausgeliefert:
+
+
+
+```console
+$ cd my-blog-api
+$ source .venv/bin/activate
+$ python -m pytest
+
+======================== test session starts ========================
+tests/test_items.py::test_create_item PASSED
+tests/test_items.py::test_read_items PASSED
+tests/test_items.py::test_read_item PASSED
+tests/test_items.py::test_update_item PASSED
+tests/test_items.py::test_delete_item PASSED
+======================== 5 passed in 0.23s ========================
+```
+
+
+
+## Entwicklungs-Workflow mit Vorlagen
+
+### 1. Die passende Vorlage wählen
+
+- **Lernen / einfache APIs**: `fastapi-default`
+- **Hohe Leistung**: `fastapi-async-crud`
+- **Benutzerdefinierte Antwortformate**: `fastapi-custom-response`
+- **Produktions-Deployment**: `fastapi-dockerized`
+- **Datenbankanwendungen**: `fastapi-psql-orm`
+- **Eigene Architektur**: `fastapi-empty`
+
+### 2. Erstellen und Einrichten
+
+
+
+```console
+$ fastkit startdemo
+# Follow the prompts
+$ cd your-project
+$ source .venv/bin/activate
+```
+
+
+
+### 3. Entwicklung
+
+
+
+```console
+# Start development server
+$ fastkit runserver
+
+# Tests ausführen
+$ python -m pytest
+
+# Neue Funktionen hinzufügen
+$ fastkit addroute new-resource your-project
+```
+
+
+
+### 4. Deployment
+
+Für die Produktionsvorlagen (`fastapi-dockerized`, `fastapi-psql-orm`):
+
+
+
+```console
+# Build for production
+$ docker build -t your-app .
+
+# Deploy with Docker Compose
+$ docker-compose up -d
+```
+
+
+
+## Best Practices
+
+### 1. Vorlagen mit Bedacht wählen
+
+- Beginnen Sie mit einfacheren Vorlagen zum Lernen
+- Nutzen Sie Datenbankvorlagen für datengetriebene Apps
+- Verwenden Sie Docker-Vorlagen für Produktionsdeployments
+
+### 2. Umgebungsverwaltung
+
+- Verwenden Sie immer `.env`-Dateien für die Konfiguration
+- Committen Sie niemals sensible Daten in die Versionsverwaltung
+- Nutzen Sie unterschiedliche Umgebungen für Entwicklung/Produktion
+
+### 3. Anpassungsstrategie
+
+- Fügen Sie neue Routen mit `fastkit addroute` hinzu
+- Passen Sie vorhandenen Code an Ihre Geschäftslogik an
+- Halten Sie die Projektstruktur übersichtlich
+
+### 4. Testen
+
+- Führen Sie Tests während der Entwicklung regelmäßig aus
+- Ergänzen Sie Tests für neu implementierte Funktionen
+- Nutzen Sie die mitgelieferte Teststruktur als Leitfaden
+
+## Fehlerbehebung
+
+### Probleme mit der Datenbankverbindung (PostgreSQL-Vorlagen)
+
+Wenn Sie keine Verbindung zu PostgreSQL herstellen können:
+
+1. **Prüfen Sie, ob Docker läuft:**
+
+
+ ```console
+ $ docker ps
+ ```
+
+
+2. **PostgreSQL-Container überprüfen:**
+
+
+ ```console
+ $ docker-compose logs postgres
+ ```
+
+
+3. **Umgebungsvariablen prüfen:**
+
+ ```env
+ DATABASE_URL=postgresql://user:password@localhost:5432/dbname
+ ```
+
+### Fehlgeschlagene Docker-Builds
+
+Wenn der Docker-Build fehlschlägt:
+
+1. **Syntax des Dockerfile prüfen**
+2. **Sicherstellen, dass alle Dateien vorhanden sind**
+3. **Prüfen, ob der Docker-Daemon läuft**
+
+### Fehlende Abhängigkeiten
+
+Wenn Sie Import-Fehler erhalten:
+
+1. **Aktivieren Sie die virtuelle Umgebung:**
+
+ ```console
+ $ source .venv/bin/activate
+ ```
+
+
+2. **Abhängigkeiten installieren:**
+
+ ```console
+ $ pip install -r requirements.txt
+ ```
+
+
+## Nächste Schritte
+
+Jetzt, da Sie die Vorlagen verstehen:
+
+1. **[Ihr erstes Projekt](../tutorial/first-project.md)**: bauen Sie eine vollständige Anwendung
+2. **[Routen hinzufügen](adding-routes.md)**: erweitern Sie Ihr vorlagenbasiertes Projekt
+3. **[CLI-Referenz](cli-reference.md)**: meistern Sie alle verfügbaren Befehle
+
+!!! tip "Tipps zu Vorlagen"
+ - Vorlagen sind hervorragende Ausgangspunkte, keine fertigen Lösungen
+ - Passen Sie Vorlagen an Ihre spezifischen Anforderungen an
+ - Studieren Sie den Code der Vorlagen, um FastAPI-Best-Practices zu lernen
+ - Nutzen Sie Versionsverwaltung, um Ihre Anpassungen nachzuhalten
diff --git a/docs/en/reference/translation-status.md b/docs/en/reference/translation-status.md
index 59e4750..2627235 100644
--- a/docs/en/reference/translation-status.md
+++ b/docs/en/reference/translation-status.md
@@ -39,9 +39,9 @@ next section explains).
| 🇨🇳 Chinese (`zh`) | 🔴 Skeleton | 0 / 26 | Build target only. Every page falls back to English. |
| 🇪🇸 Spanish (`es`) | ✅ Complete | 26 / 26 | All locale pages are present. Phase 1: top-level + core user-guide; Phase 2: remaining user-guide + all tutorials; Phase 3: contributing + reference. `docs/es/changelog.md` intentionally reuses the canonical English `CHANGELOG.md`. |
| 🇫🇷 French (`fr`) | ✅ Complete | 26 / 26 | All locale pages are present. Phase 1: top-level + core user-guide; Phase 2: remaining user-guide + all tutorials; Phase 3: contributing + reference. `docs/fr/changelog.md` intentionally reuses the canonical English `CHANGELOG.md`. |
-| 🇩🇪 German (`de`) | 🔴 Skeleton | 0 / 26 | Build target only. Every page falls back to English. |
+| 🇩🇪 German (`de`) | ✅ Complete | 26 / 26 | All locale pages are present. Phase 1: top-level + core user-guide; Phase 2: remaining user-guide + all tutorials; Phase 3: contributing + reference. `docs/de/changelog.md` intentionally reuses the canonical English `CHANGELOG.md`. |
-*Snapshot verified 2026-05-15; fr row recounted for the current branch after Phase 3 (contributing + reference) landed. French now has all locale pages present, while `docs/fr/changelog.md` intentionally points to the canonical English changelog.* These counts are maintained by hand;
+*Snapshot verified 2026-05-17; de row recounted for the current branch after Phase 3 (contributing + reference) landed. German now has all locale pages present, while `docs/de/changelog.md` intentionally points to the canonical English changelog.* These counts are maintained by hand;
to recount the current state from the repo root, run:
```console
diff --git a/docs/es/reference/translation-status.md b/docs/es/reference/translation-status.md
index 63b29d1..c456dd2 100644
--- a/docs/es/reference/translation-status.md
+++ b/docs/es/reference/translation-status.md
@@ -24,9 +24,9 @@ Los números siguientes cuentan páginas Markdown presentes en el árbol de cada
| 🇪🇸 Español (`es`) | ✅ Completo | 26 / 26 | Todas las páginas del idioma están presentes. Phase 1: nivel superior + user-guide principal; Phase 2: user-guide restante + todos los tutorials; Phase 3: contributing + reference. `docs/es/changelog.md` reutiliza intencionadamente el `CHANGELOG.md` canónico en inglés. |
| 🇨🇳 Chino (`zh`) | 🔴 Esqueleto | 0 / 26 | Solo está configurado como destino de compilación. Cada página muestra la versión en inglés. |
| 🇫🇷 Francés (`fr`) | ✅ Completo | 26 / 26 | Todas las páginas del idioma están presentes. Phase 1: nivel superior + núcleo del user-guide; Phase 2: resto del user-guide + todos los tutoriales; Phase 3: contributing + reference. `docs/fr/changelog.md` reutiliza intencionadamente el `CHANGELOG.md` canónico en inglés. |
-| 🇩🇪 Alemán (`de`) | 🔴 Esqueleto | 0 / 26 | Solo está configurado como destino de compilación. Cada página muestra la versión en inglés. |
+| 🇩🇪 Alemán (`de`) | ✅ Completo | 26 / 26 | Todas las páginas del idioma están presentes. Phase 1: nivel superior + núcleo del user-guide; Phase 2: resto del user-guide + todos los tutoriales; Phase 3: contributing + reference. `docs/de/changelog.md` reutiliza intencionadamente el `CHANGELOG.md` canónico en inglés. |
-*Verificado el 2026-05-15; la fila de `fr` se volvió a contar para la rama actual tras completar Phase 3 (contributing + reference). El francés ya tiene todas las páginas del idioma presentes, mientras que `docs/fr/changelog.md` apunta al changelog canónico en inglés.* Esta cuenta se mantiene a mano; para volver a contar el estado actual desde la raíz del repositorio, ejecuta:
+*Verificado el 2026-05-17; la fila de `de` se volvió a contar para la rama actual tras completar Phase 3 (contributing + reference). El alemán ya tiene todas las páginas del idioma presentes, mientras que `docs/de/changelog.md` apunta al changelog canónico en inglés.* Esta cuenta se mantiene a mano; para volver a contar el estado actual desde la raíz del repositorio, ejecuta:
```console
$ for loc in en ko ja zh es fr de; do
diff --git a/docs/fr/changelog.md b/docs/fr/changelog.md
index bf802e6..f4d16fd 100644
--- a/docs/fr/changelog.md
+++ b/docs/fr/changelog.md
@@ -1,4 +1 @@
-> Cette page réutilise le `CHANGELOG.md` canonique en anglais à la racine du dépôt.
-> L'historique des versions n'est pas maintenu séparément en français.
-
{!CHANGELOG.md!}
diff --git a/docs/fr/reference/translation-status.md b/docs/fr/reference/translation-status.md
index 716daac..7722be9 100644
--- a/docs/fr/reference/translation-status.md
+++ b/docs/fr/reference/translation-status.md
@@ -24,9 +24,9 @@ Les nombres ci-dessous comptent les pages Markdown dans l'arborescence de chaque
| 🇨🇳 Chinois (`zh`) | 🔴 Squelette | 0 / 26 | Cible de build uniquement. Toutes les pages retombent sur l'anglais. |
| 🇪🇸 Espagnol (`es`) | ✅ Complet | 26 / 26 | Toutes les pages de la locale sont présentes. Phase 1 : top-level + cœur du guide de l'utilisateur ; Phase 2 : reste du guide de l'utilisateur + tous les tutoriels ; Phase 3 : pages de contribution + de référence. `docs/es/changelog.md` réutilise intentionnellement le `CHANGELOG.md` canonique en anglais. |
| 🇫🇷 Français (`fr`) | ✅ Complet | 26 / 26 | Toutes les pages de la locale sont présentes. Phase 1 : top-level + cœur du guide de l'utilisateur ; Phase 2 : reste du guide de l'utilisateur + tous les tutoriels ; Phase 3 : pages de contribution + de référence. `docs/fr/changelog.md` réutilise intentionnellement le `CHANGELOG.md` canonique en anglais. |
-| 🇩🇪 Allemand (`de`) | 🔴 Squelette | 0 / 26 | Cible de build uniquement. Toutes les pages retombent sur l'anglais. |
+| 🇩🇪 Allemand (`de`) | ✅ Complet | 26 / 26 | Toutes les pages de la locale sont présentes. Phase 1 : top-level + cœur du guide de l'utilisateur ; Phase 2 : reste du guide de l'utilisateur + tous les tutoriels ; Phase 3 : contributing + reference. `docs/de/changelog.md` réutilise intentionnellement le `CHANGELOG.md` canonique en anglais. |
-*Instantané vérifié le 2026-05-15 ; la ligne `fr` a été recomptée sur la branche actuelle après la fin de la Phase 3 (pages de contribution + de référence). Le français comporte désormais toutes les pages de la locale et `docs/fr/changelog.md` pointe vers le changelog canonique en anglais.* Ces compteurs sont maintenus à la main ; pour recompter l'état actuel depuis la racine du dépôt, exécutez :
+*Instantané vérifié le 2026-05-17 ; la ligne `de` a été recomptée sur la branche actuelle après la fin de la Phase 3 (contributing + reference). L'allemand comporte désormais toutes les pages de la locale et `docs/de/changelog.md` pointe vers le changelog canonique en anglais.* Ces compteurs sont maintenus à la main ; pour recompter l'état actuel depuis la racine du dépôt, exécutez :
```console
$ for loc in en ko ja zh es fr de; do
diff --git a/docs/ja/reference/translation-status.md b/docs/ja/reference/translation-status.md
index 3cee416..41223fb 100644
--- a/docs/ja/reference/translation-status.md
+++ b/docs/ja/reference/translation-status.md
@@ -24,9 +24,9 @@ FastAPI-fastkit のドキュメントは複数の言語でビルドされます
| 🇨🇳 Chinese (`zh`) | 🔴 スケルトン | 0 / 26 | ビルドターゲットのみ。すべてのページが英語にフォールバックします。 |
| 🇪🇸 Spanish (`es`) | ✅ 完了 | 26 / 26 | ロケール側のページはすべて存在します。Phase 1: トップレベル + コアの user-guide、Phase 2: 残りの user-guide + すべての tutorial、Phase 3: contributing + reference。`docs/es/changelog.md` は英語の `CHANGELOG.md` を意図的に再利用しています。 |
| 🇫🇷 French (`fr`) | ✅ 完了 | 26 / 26 | ロケール側のページはすべて存在します。Phase 1: トップレベル + コアの user-guide、Phase 2: 残りの user-guide + すべての tutorial、Phase 3: contributing + reference。`docs/fr/changelog.md` は英語の `CHANGELOG.md` を意図的に再利用しています。 |
-| 🇩🇪 German (`de`) | 🔴 スケルトン | 0 / 26 | ビルドターゲットのみ。すべてのページが英語にフォールバックします。 |
+| 🇩🇪 German (`de`) | ✅ 完了 | 26 / 26 | ロケール側のページはすべて存在します。Phase 1: トップレベル + コアの user-guide、Phase 2: 残りの user-guide + すべての tutorial、Phase 3: contributing + reference。`docs/de/changelog.md` は英語の `CHANGELOG.md` を意図的に再利用しています。 |
-*スナップショット検証日: 2026-05-15。Phase 3 (contributing + reference) を反映した現在のブランチを基準に `fr` 行を再集計しました。フランス語はロケール側のページがすべてそろっており、`docs/fr/changelog.md` は英語版 changelog をそのまま指しています。* この表は手動で管理されています。リポジトリルートで現在の状態を再カウントしたい場合は、次のコマンドを実行してください:
+*スナップショット検証日: 2026-05-17。Phase 3 (contributing + reference) を反映した現在のブランチを基準に `de` 行を再集計しました。ドイツ語はロケール側のページがすべてそろっており、`docs/de/changelog.md` は英語版 changelog をそのまま指しています。* この表は手動で管理されています。リポジトリルートで現在の状態を再カウントしたい場合は、次のコマンドを実行してください:
```console
$ for loc in en ko ja zh es fr de; do
diff --git a/docs/ko/reference/translation-status.md b/docs/ko/reference/translation-status.md
index c492e6c..da1e35f 100644
--- a/docs/ko/reference/translation-status.md
+++ b/docs/ko/reference/translation-status.md
@@ -24,9 +24,9 @@ FastAPI-fastkit 문서는 여러 언어로 빌드되지만, 모든 번역이 **
| 🇨🇳 중국어 (`zh`) | 🔴 기본 구조만 있음 | 0 / 26 | 빌드 대상만 설정되어 있으며, 모든 페이지는 영어 원문으로 표시됩니다. |
| 🇪🇸 스페인어 (`es`) | ✅ 완료 | 26 / 26 | 언어별 페이지는 모두 존재합니다. Phase 1: 최상위 + 핵심 user-guide, Phase 2: 나머지 user-guide + 모든 tutorial, Phase 3: contributing + reference. `docs/es/changelog.md` 는 영문 기준 `CHANGELOG.md` 를 그대로 사용합니다. |
| 🇫🇷 프랑스어 (`fr`) | ✅ 완료 | 26 / 26 | 모든 로케일 페이지가 존재합니다. Phase 1: 최상위 + 핵심 user-guide; Phase 2: 나머지 user-guide + 모든 tutorial; Phase 3: contributing + reference. `docs/fr/changelog.md` 는 영문 기준 `CHANGELOG.md` 를 그대로 재사용합니다. |
-| 🇩🇪 독일어 (`de`) | 🔴 기본 구조만 있음 | 0 / 26 | 빌드 대상만 설정되어 있으며, 모든 페이지는 영어 원문으로 표시됩니다. |
+| 🇩🇪 독일어 (`de`) | ✅ 완료 | 26 / 26 | 모든 로케일 페이지가 존재합니다. Phase 1: 최상위 + 핵심 user-guide; Phase 2: 나머지 user-guide + 모든 tutorial; Phase 3: contributing + reference. `docs/de/changelog.md` 는 영문 기준 `CHANGELOG.md` 를 그대로 재사용합니다. |
-*스냅샷 검증 시점: 2026-05-15. Phase 3(contributing + reference) 작업이 반영된 현재 브랜치 기준으로 `fr` 행을 다시 집계했습니다. 프랑스어는 이제 모든 로케일 페이지를 보유하며 `docs/fr/changelog.md` 는 영문 기준 changelog를 그대로 가리킵니다.* 이 표는 수동으로 관리됩니다. 리포지토리 루트에서 현재 상태를 다시 세고 싶다면 다음 명령을 실행하세요:
+*스냅샷 검증 시점: 2026-05-17. Phase 3(contributing + reference) 작업이 반영된 현재 브랜치 기준으로 `de` 행을 다시 집계했습니다. 독일어는 이제 모든 로케일 페이지를 보유하며 `docs/de/changelog.md` 는 영문 기준 changelog를 그대로 가리킵니다.* 이 표는 수동으로 관리됩니다. 리포지토리 루트에서 현재 상태를 다시 세고 싶다면 다음 명령을 실행하세요:
```console
$ for loc in en ko ja zh es fr de; do