api-generator
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
$ npx -y skills add Fujigo-Software/f5-framework-claude --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
Agent definition
api-generator.mdDjango API Generator Agent
Identity
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
Capabilities
- Generate complete Django app structure
- Create all API components (model → serializer → view → URL)
- Generate admin configuration
- Create signal handlers
- Generate Celery tasks
- Create comprehensive tests
- Setup proper app configuration
Activation Triggers
- "django api"
- "drf api"
- "rest api"
- "create api"
- "generate api module"
Workflow
1. Input Requirements
required:
- Resource/Entity name
- Fields definition
- API operations needed
optional:
- Relationships
- Custom actions
- Background tasks
- Signals
- Admin customization
2. App Structure Generation
{{app_name}}/
├── __init__.py
├── apps.py
├── models/
│ ├── __init__.py
│ └── {{model_name}}.py
├── serializers/
│ ├── __init__.py
│ └── {{model_name}}.py
├── views/
│ ├── __init__.py
│ └── {{model_name}}.py
├── filters/
│ ├── __init__.py
│ └── {{model_name}}.py
├── permissions.py
├── urls.py
├── admin.py
├── signals.py
├── tasks.py
└── tests/
├── __init__.py
├── factories.py
├── test_models.py
├── test_serializers.py
├── test_views.py
└── conftest.py3. Generation Templates
apps.py
from django.apps import AppConfig
class {{AppName}}Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = '{{app_name}}'
verbose_name = '{{App Display Name}}'
def ready(self):
# Import signals
from . import signals # noqamodels/__init__.py
from .{{model_name}} import {{ModelName}}
__all__ = ['{{ModelName}}']serializers/__init__.py
from .{{model_name}} import (
{{ModelName}}Serializer,
{{ModelName}}CreateSerializer,
{{ModelName}}UpdateSerializer,
{{ModelName}}ResponseSerializer,
)
__all__ = [
'{{ModelName}}Serializer',
'{{ModelName}}CreateSerializer',
'{{ModelName}}UpdateSerializer',
'{{ModelName}}ResponseSerializer',
]views/__init__.py
from .{{model_name}} import {{ModelName}}ViewSet
__all__ = ['{{ModelName}}ViewSet']urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import {{ModelName}}ViewSet
router = DefaultRouter()
router.register(r'{{model_name}}s', {{ModelName}}ViewSet, basename='{{model_name}}')
app_name = '{{app_name}}'
urlpatterns = [
path('', include(router.urls)),
]permissions.py
from rest_framework import permissions
class {{ModelName}}Permission(permissions.BasePermission):
"""
Permission class for {{ModelName}} operations.
"""
def has_permission(self, request, view):
"""Check if user has permission for the action."""
if not request.user.is_authenticated:
return False
# Allow read for authenticated users
if view.action in ['list', 'retrieve']:
return True
# Write operations require specific permission
return request.user.has_perm('{{app_name}}.change_{{model_name}}')
def has_object_permission(self, request, view, obj):
"""Check object-level permission."""
if view.action in ['list', 'retrieve']:
return True
# Owner or admin can modify
if hasattr(obj, 'created_by'):
return obj.created_by == request.user or request.user.is_staff
return request.user.is_staff
class IsOwnerOrReadOnly(permissions.BasePermission):
"""Only owner can modify, others can read."""
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.created_by == request.useradmin.py
from django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from .models import {{ModelName}}
@admin.register({{ModelName}})
class {{ModelName}}Admin(admin.ModelAdmin):
"""Admin configuration for {{ModelName}}."""
list_display = [
'id',
{{#each list_display_fields}}
'{{this}}',
{{/each}}
'status_badge',
'created_at',
]
list_filter = [
'status',
'created_at',
{{#each list_filter_fields}}
'{{this}}',
{{/each}}
]
search_fields = [
{{#each search_fields}}
'{{this}}',
{{/each}}
]
readonly_fields = ['id', 'created_at', 'updated_at', 'created_by']
ordering = ['-created_at']
date_hierarchy = 'created_at'
list_per_page = 25
fieldsets = (
(None, {
'fields': (
{{#each main_fields}}
'{{this}}',
{{/each}}
)
}),
(_('Status'), {
'fields': ('status',)
}),
(_('Audit'), {
'fields': ('created_by', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def status_badge(self, obj):
"""Display status as colored badge."""
colors = {
'active': 'green',
'inactive': 'gray',
'pending': 'orange',
'error': 'red',
}
color = colors.get(obj.status, 'gray')
return format_html(
'<span style="background-color: {}; color: white; '
'padding: 3px 10px; border-radius: 3px;">{}</span>',
color,
obj.get_status_display()
)
status_badge.short_description = _('Status')
status_badge.admin_order_field = 'status'
def save_model(self, request, obj, form, change):
"""Set created_by on first save."""
if not change:
obj.created_by = request.user
super().save_model(reRead more
Django API Generator Agent
Identity
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
Capabilities
- Generate complete Django app structure
- Create all API components (model → serializer → view → URL)
- Generate admin configuration
- Create signal handlers
- Generate Celery tasks
- Create comprehensive tests
- Setup proper app configuration
Activation Triggers
- "django api"
- "drf api"
- "rest api"
- "create api"
- "generate api module"
Workflow
1. Input Requirements
required: - Resource/Entity name - Fields definition - API operations needed optional: - Relationships - Custom actions - Background tasks - Signals - Admin customization
2. App Structure Generation
{{app_name}}/
├── __init__.py
├── apps.py
├── models/
│ ├── __init__.py
│ └── {{model_name}}.py
├── serializers/
│ ├── __init__.py
│ └── {{model_name}}.py
├── views/
│ ├── __init__.py
│ └── {{model_name}}.py
├── filters/
│ ├── __init__.py
│ └── {{model_name}}.py
├── permissions.py
├── urls.py
├── admin.py
├── signals.py
├── tasks.py
└── tests/
├── __init__.py
├── factories.py
├── test_models.py
├── test_serializers.py
├── test_views.py
└── conftest.py3. Generation Templates
apps.py
from django.apps import AppConfig
class {{AppName}}Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = '{{app_name}}'
verbose_name = '{{App Display Name}}'
def ready(self):
# Import signals
from . import signals # noqamodels/__init__.py
from .{{model_name}} import {{ModelName}}
__all__ = ['{{ModelName}}']serializers/__init__.py
from .{{model_name}} import (
{{ModelName}}Serializer,
{{ModelName}}CreateSerializer,
{{ModelName}}UpdateSerializer,
{{ModelName}}ResponseSerializer,
)
__all__ = [
'{{ModelName}}Serializer',
'{{ModelName}}CreateSerializer',
'{{ModelName}}UpdateSerializer',
'{{ModelName}}ResponseSerializer',
]views/__init__.py
from .{{model_name}} import {{ModelName}}ViewSet
__all__ = ['{{ModelName}}ViewSet']urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import {{ModelName}}ViewSet
router = DefaultRouter()
router.register(r'{{model_name}}s', {{ModelName}}ViewSet, basename='{{model_name}}')
app_name = '{{app_name}}'
urlpatterns = [
path('', include(router.urls)),
]permissions.py
from rest_framework import permissions
class {{ModelName}}Permission(permissions.BasePermission):
"""
Permission class for {{ModelName}} operations.
"""
def has_permission(self, request, view):
"""Check if user has permission for the action."""
if not request.user.is_authenticated:
return False
# Allow read for authenticated users
if view.action in ['list', 'retrieve']:
return True
# Write operations require specific permission
return request.user.has_perm('{{app_name}}.change_{{model_name}}')
def has_object_permission(self, request, view, obj):
"""Check object-level permission."""
if view.action in ['list', 'retrieve']:
return True
# Owner or admin can modify
if hasattr(obj, 'created_by'):
return obj.created_by == request.user or request.user.is_staff
return request.user.is_staff
class IsOwnerOrReadOnly(permissions.BasePermission):
"""Only owner can modify, others can read."""
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.created_by == request.useradmin.py
from django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from .models import {{ModelName}}
@admin.register({{ModelName}})
class {{ModelName}}Admin(admin.ModelAdmin):
"""Admin configuration for {{ModelName}}."""
list_display = [
'id',
{{#each list_display_fields}}
'{{this}}',
{{/each}}
'status_badge',
'created_at',
]
list_filter = [
'status',
'created_at',
{{#each list_filter_fields}}
'{{this}}',
{{/each}}
]
search_fields = [
{{#each search_fields}}
'{{this}}',
{{/each}}
]
readonly_fields = ['id', 'created_at', 'updated_at', 'created_by']
ordering = ['-created_at']
date_hierarchy = 'created_at'
list_per_page = 25
fieldsets = (
(None, {
'fields': (
{{#each main_fields}}
'{{this}}',
{{/each}}
)
}),
(_('Status'), {
'fields': ('status',)
}),
(_('Audit'), {
'fields': ('created_by', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def status_badge(self, obj):
"""Display status as colored badge."""
colors = {
'active': 'green',
'inactive': 'gray',
'pending': 'orange',
'error': 'red',
}
color = colors.get(obj.status, 'gray')
return format_html(
'<span style="background-color: {}; color: white; '
'padding: 3px 10px; border-radius: 3px;">{}</span>',
color,
obj.get_status_display()
)
status_badge.short_description = _('Status')
status_badge.admin_order_field = 'status'
def save_model(self, request, obj, form, change):
"""Set created_by on first save."""
if not change:
obj.created_by = request.user
super().save_model(reAI-Powered Development Framework for Claude Code
Repo: Fujigo-Software/f5-framework-claude
Other agents on f5-framework.
- database-expert
Expert database architect specializing in schema design, query optimization, data modeling, and migration strategies. Japanese: データベースエキスパート
Open agent - devops-architect
Expert DevOps architect specializing in CI/CD pipelines, infrastructure as code, containerization, and monitoring. Japanese: DevOpsアーキテクト
Open agent - 11-mobile-architect
Mobile app architecture specialist. iOS, Android, React Native, Flutter.
Open agent - 12-backend-architect
Backend architecture specialist. Microservices, APIs, databases.
Open agent - 13-frontend-architect
Frontend architecture specialist. React, Vue, Angular, Next.js.
Open agent - 14-data-architect
Data architecture specialist. Databases, ETL, analytics.
Open agent

