name: new-feature description: Scaffold a new full-stack feature for ServerKit with Flask backend (model, service, API blueprint) and React frontend (page, styles, route). Use when creating new modules, pages, or API endpoints. disable-model-invocation: true argument-hint: "[feature-name]"
Scaffold a new full-stack feature named $ARGUMENTS for ServerKit.
Follow these steps in order:
1. Backend Model
Create backend/app/models/$ARGUMENTS.py with:
- SQLAlchemy model class (PascalCase name)
- Standard columns:
id,created_at,updated_at - A
to_dict()method returning JSON-serializable data - Follow existing model patterns in
backend/app/models/
2. Backend Service
Create backend/app/services/${ARGUMENTS}_service.py with:
- Stateless module functions (no classes unless stateful)
- CRUD operations:
create_*,get_*,get_all_*,update_*,delete_* - Consistent error handling returning
{'error': 'message'}, status_code - Import and use the model from step 1
3. Backend API Blueprint
Create backend/app/api/$ARGUMENTS.py with:
- Flask Blueprint named
${ARGUMENTS}_bp - RESTful routes prefixed with the feature name
- All routes decorated with
@jwt_required() - JSON request parsing and response formatting
- Call service functions from step 2
Then register the blueprint in backend/app/__init__.py:
from app.api.$ARGUMENTS import ${ARGUMENTS}_bp
app.register_blueprint(${ARGUMENTS}_bp, url_prefix='/api/v1/$ARGUMENTS')
4. Frontend API Methods
Add methods to frontend/src/services/api.js in the ApiService class:
get$ARGUMENTS(),create$ARGUMENTS(),update$ARGUMENTS(),delete$ARGUMENTS()- Follow the existing pattern of other API methods in that file
5. Frontend Page
Create frontend/src/pages/$ARGUMENTS.jsx with:
- Functional component using React hooks
- Fetch data on mount using the API methods from step 4
- Basic CRUD UI with table/list and form
- Loading states and error handling
- Import the LESS stylesheet from step 6
Then add the route in frontend/src/App.jsx inside the authenticated routes.
6. Frontend Styles
Create frontend/src/styles/pages/$ARGUMENTS.less with:
- BEM-like naming:
.${ARGUMENTS}__element--modifier - Use existing design system variables (
@card-bg,@primary-color,@spacing-md, etc.) - Import the new file in
frontend/src/styles/main.less
Rules
- Python: PEP 8, type hints where helpful
- React: Functional components with hooks only, PascalCase filenames
- LESS: No inline styles, use design system variables
- One logical change per commit