Claude-skill-registry api-generation
Generate TypeScript API client from Swagger/Go comments. Use when updating API endpoints, adding new routes, or regenerating the frontend API client after backend changes.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/api-generation" ~/.claude/skills/majiayu000-claude-skill-registry-api-generation && rm -rf "$T"
manifest:
skills/data/api-generation/SKILL.mdsource content
API Generation
Generate typed TypeScript API client from Go Swagger comments using swag + Orval.
Workflow
Go Handler → swag init → swagger.json → Orval → TypeScript Hooks
One Command for Everything
make api
This executes:
→ Generatesswag init
from Go commentsbackend/docs/swagger.json
→ Generates TypeScript Hooks inorvalfrontend/src/shared/api/
Adding a New Endpoint
Step 1: Go Handler with Swagger Comments
// internal/handler/product.go // GetProducts godoc // @Summary List all products // @Description Get all products for the authenticated user // @Tags products // @Accept json // @Produce json // @Success 200 {array} ProductResponse // @Failure 401 {object} ErrorResponse // @Security BearerAuth // @Router /products [get] func (h *ProductHandler) GetProducts(w http.ResponseWriter, r *http.Request) { // Implementation } // CreateProduct godoc // @Summary Create a product // @Description Create a new product // @Tags products // @Accept json // @Produce json // @Param request body CreateProductRequest true "Product data" // @Success 201 {object} ProductResponse // @Failure 400 {object} ErrorResponse // @Failure 401 {object} ErrorResponse // @Security BearerAuth // @Router /products [post] func (h *ProductHandler) CreateProduct(w http.ResponseWriter, r *http.Request) { // Implementation }
Step 2: Define Response/Request Types
// In handler or separate types.go type ProductResponse struct { ID string `json:"id" example:"prod_123"` Name string `json:"name" example:"Widget"` Price float64 `json:"price" example:"29.99"` } type CreateProductRequest struct { Name string `json:"name" example:"Widget"` Price float64 `json:"price" example:"29.99"` }
Step 3: Generate API Client
make api
Step 4: Use in Frontend
import { useGetProducts, usePostProducts } from "@/api/endpoints/products/products" function ProductsPage() { const { data, isLoading } = useGetProducts() const createProduct = usePostProducts() const handleCreate = () => { createProduct.mutate({ data: { name: "New", price: 10 } }) } return (...) }
Swagger Annotation Reference
| Annotation | Description |
|---|---|
| Short description |
| Detailed description |
| Grouping (becomes folder in endpoints/) |
| Request Content-Type |
| Response Content-Type |
| Parameter (body, query, path) |
| Success response |
| Error response |
| Auth requirement |
| HTTP path and method |
Generated Files
frontend/src/shared/api/ ├── endpoints/ │ ├── products/ # Grouped by @Tags │ │ └── products.ts # useGetProducts, usePostProducts, etc. │ └── users/ │ └── users.ts ├── models/ # TypeScript Types └── custom-fetch.ts # Fetch Wrapper with Auth
Important Rules
- Never manually edit generated files
- Always run
after handler changesmake api - Tags become folder names →
→@Tags productsendpoints/products/ - operationId is automatically generated from Router path