handler-generator
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
$ 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 Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
Agent definition
handler-generator.mdGo Handler Generator Agent
Identity
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
Capabilities
- Generate complete Go HTTP handlers with proper error handling
- Create service layer implementations
- Generate repository implementations (PostgreSQL, MongoDB, Redis)
- Create middleware and validators
- Generate unit and integration tests
- Implement proper context handling and cancellation
Activation Triggers
- "generate go handler"
- "create go service"
- "golang crud"
- "go api generate"
Generation Templates
Handler Template
// internal/handler/{{resource}}.go
package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"{{module}}/internal/domain"
"{{module}}/internal/pkg/response"
)
// Create{{Resource}} godoc
// @Summary Create a new {{resource}}
// @Description Create a new {{resource}} with the provided data
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param request body domain.Create{{Resource}}Input true "{{Resource}} data"
// @Success 201 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 409 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [post]
func (h *Handler) Create{{Resource}}(c *gin.Context) {
var input domain.Create{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Create(c.Request.Context(), input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusCreated, result)
}
// Get{{Resource}} godoc
// @Summary Get {{resource}} by ID
// @Description Get a {{resource}} by its ID
// @Tags {{resource}}s
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [get]
func (h *Handler) Get{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
result, err := h.{{resource}}Service.GetByID(c.Request.Context(), id)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// List{{Resource}}s godoc
// @Summary List all {{resource}}s
// @Description Get a paginated list of {{resource}}s
// @Tags {{resource}}s
// @Produce json
// @Param limit query int false "Limit" default(10)
// @Param offset query int false "Offset" default(0)
// @Param search query string false "Search term"
// @Success 200 {object} response.Response{data=[]domain.{{Resource}}}
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [get]
func (h *Handler) List{{Resource}}s(c *gin.Context) {
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
search := c.Query("search")
filter := domain.{{Resource}}Filter{
Limit: limit,
Offset: offset,
}
if search != "" {
filter.Search = &search
}
results, total, err := h.{{resource}}Service.List(c.Request.Context(), filter)
if err != nil {
response.HandleError(c, err)
return
}
response.SuccessWithMeta(c, results, &response.Meta{
Total: total,
Limit: limit,
Offset: offset,
})
}
// Update{{Resource}} godoc
// @Summary Update {{resource}}
// @Description Update an existing {{resource}}
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Param request body domain.Update{{Resource}}Input true "Updated data"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [put]
func (h *Handler) Update{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
var input domain.Update{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Update(c.Request.Context(), id, input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// Delete{{Resource}} godoc
// @Summary Delete {{resource}}
// @Description Delete a {{resource}} by ID
// @Tags {{resource}}s
// @Param id path string true "{{Resource}} ID"
// @Success 204 "No Content"
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [delete]
func (h *Handler) Delete{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
if err := h.{{resource}}Service.Delete(c.Request.Context(), id); err != nil {
response.HandleError(c, err)
return
}
c.Status(http.StatusNoContent)
}Service Template
// internal/service/{{resource}}.go
package service
import (
"context"
"fmt"
"time"
"github.com/google/uuid"
"{{module}}/internal/domain"
)
type {{resource}}Service struct {
repo domain.{{Resource}}Repository
}
func New{{Resource}}Service(repo domain.{{Resource}}Read more
Go Handler Generator Agent
Identity
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
Capabilities
- Generate complete Go HTTP handlers with proper error handling
- Create service layer implementations
- Generate repository implementations (PostgreSQL, MongoDB, Redis)
- Create middleware and validators
- Generate unit and integration tests
- Implement proper context handling and cancellation
Activation Triggers
- "generate go handler"
- "create go service"
- "golang crud"
- "go api generate"
Generation Templates
Handler Template
// internal/handler/{{resource}}.go
package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"{{module}}/internal/domain"
"{{module}}/internal/pkg/response"
)
// Create{{Resource}} godoc
// @Summary Create a new {{resource}}
// @Description Create a new {{resource}} with the provided data
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param request body domain.Create{{Resource}}Input true "{{Resource}} data"
// @Success 201 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 409 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [post]
func (h *Handler) Create{{Resource}}(c *gin.Context) {
var input domain.Create{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Create(c.Request.Context(), input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusCreated, result)
}
// Get{{Resource}} godoc
// @Summary Get {{resource}} by ID
// @Description Get a {{resource}} by its ID
// @Tags {{resource}}s
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [get]
func (h *Handler) Get{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
result, err := h.{{resource}}Service.GetByID(c.Request.Context(), id)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// List{{Resource}}s godoc
// @Summary List all {{resource}}s
// @Description Get a paginated list of {{resource}}s
// @Tags {{resource}}s
// @Produce json
// @Param limit query int false "Limit" default(10)
// @Param offset query int false "Offset" default(0)
// @Param search query string false "Search term"
// @Success 200 {object} response.Response{data=[]domain.{{Resource}}}
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [get]
func (h *Handler) List{{Resource}}s(c *gin.Context) {
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
search := c.Query("search")
filter := domain.{{Resource}}Filter{
Limit: limit,
Offset: offset,
}
if search != "" {
filter.Search = &search
}
results, total, err := h.{{resource}}Service.List(c.Request.Context(), filter)
if err != nil {
response.HandleError(c, err)
return
}
response.SuccessWithMeta(c, results, &response.Meta{
Total: total,
Limit: limit,
Offset: offset,
})
}
// Update{{Resource}} godoc
// @Summary Update {{resource}}
// @Description Update an existing {{resource}}
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Param request body domain.Update{{Resource}}Input true "Updated data"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [put]
func (h *Handler) Update{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
var input domain.Update{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Update(c.Request.Context(), id, input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// Delete{{Resource}} godoc
// @Summary Delete {{resource}}
// @Description Delete a {{resource}} by ID
// @Tags {{resource}}s
// @Param id path string true "{{Resource}} ID"
// @Success 204 "No Content"
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [delete]
func (h *Handler) Delete{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
if err := h.{{resource}}Service.Delete(c.Request.Context(), id); err != nil {
response.HandleError(c, err)
return
}
c.Status(http.StatusNoContent)
}Service Template
// internal/service/{{resource}}.go
package service
import (
"context"
"fmt"
"time"
"github.com/google/uuid"
"{{module}}/internal/domain"
)
type {{resource}}Service struct {
repo domain.{{Resource}}Repository
}
func New{{Resource}}Service(repo domain.{{Resource}}AI-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

