shadmin-dev
Standardizes feature development within Shadmin's architecture, covering backend API layers and frontend components.
Install
mkdir -p .claude/skills/shadmin-dev && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/10435" && unzip -o skill.zip -d .claude/skills/shadmin-dev && rm skill.zipInstalls to .claude/skills/shadmin-dev
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Apply Shadmin feature-development standards (backend Go/Gin/Ent + frontend React/TS). Use when adding/modifying features, CRUD modules, API routes/controllers/usecases/repositories, Ent schemas, frontend pages/routes, React components, TanStack hooks, or any full-stack work in this project. Trigger whenever the user mentions new features, backend changes, frontend changes, database schema changes, permissions, UI pages, tables, forms, or API endpoints — even if they don't explicitly say "feature development.Key capabilities
- →Manage backend Go/Gin/Ent layers
- →Manage frontend React/TS layers
- →Define Ent database schemas
- →Implement API routes and controllers
- →Implement frontend pages and components
How it works
It enforces a clean architecture pattern, managing the flow between frontend React components and backend Go controllers.
Inputs & outputs
When to use shadmin-dev
- →Add a new CRUD module
- →Define an Ent database schema
- →Create a frontend page with TanStack
- →Implement a new API controller
About this skill
Shadmin Feature Development
Guide full-stack feature development through Shadmin's clean architecture, producing code that compiles, passes lint/tests, and follows established patterns. Most features require both backend and frontend changes — this skill covers the end-to-end workflow.
Architecture Overview
┌─────────────────────────────────────────────────────────────────────┐
│ Frontend (React 19 + TypeScript + Vite) │
│ Route File → Page Component → TanStack Query Hook → API Service │
│ ↕ Zustand (auth-store) ↕ Permission checks │
├─────────────────────────────────────────────────────────────────────┤
│ HTTP (Axios apiClient ← Bearer Token injection) │
├─────────────────────────────────────────────────────────────────────┤
│ Backend (Go + Gin + Ent ORM) │
│ Route → [JWT MW → Casbin MW] → Controller → Usecase → Repository │
│ ↕ Domain (contracts, DTOs, errors) ↕ Ent (DB, migrations) │
└─────────────────────────────────────────────────────────────────────┘
Backend layers — each has exactly one responsibility:
| Layer | Directory | Responsibility |
|---|---|---|
| Domain | domain/ | Entity structs, DTOs, Repository/UseCase interfaces, errors, response helpers |
| Schema | ent/schema/ | DB schema → run go generate ./ent after changes |
| Repository | repository/ | Data access via Ent, domain↔ent conversion, pagination |
| Usecase | usecase/ | Business logic, validation, context.WithTimeout |
| Controller | api/controller/ | HTTP parsing only, Swagger annotations, status code mapping |
| Route | api/route/ | Route registration, middleware wiring |
| Factory | api/route/factory.go | DI: repo → usecase → controller construction |
| Bootstrap | bootstarp/ | App init, DB, Casbin, seeds (directory name typo is intentional) |
Frontend layers:
| Layer | Directory | Responsibility |
|---|---|---|
| Types | frontend/src/types/ | TypeScript interfaces matching backend DTOs |
| Services | frontend/src/services/ | Axios API wrappers, date parsing |
| Features | frontend/src/features/ | Page components, tables, dialogs, forms, hooks |
| Routes | frontend/src/routes/ | TanStack Router file-based routing |
| Stores | frontend/src/stores/ | Zustand state (auth, permissions) |
| Constants | frontend/src/constants/ | Permission strings, enums |
Full-Stack Development Workflow
Step 1: Clarify Scope (before writing code)
State explicitly:
- What entities/fields are involved
- API endpoints: path, method, request/response shapes
- Whether Casbin permission checks are needed
- Frontend: pages, tables, forms, dialogs
- Permission strings (e.g.,
system:project:add)
Step 2: List All Touched Files
Group by layer — this catches missing pieces early:
# Backend (implement in this order)
domain/<resource>.go
ent/schema/<resource>.go
repository/<resource>_repository.go
usecase/<resource>_usecase.go
api/controller/<resource>_controller.go
api/route/<resource>_routes.go (or modify system_routes.go)
api/route/factory.go
# Frontend (implement in this order)
frontend/src/types/<resource>.ts
frontend/src/services/<resource>Api.ts
frontend/src/features/<module>/<resource>/components/*-provider.tsx
frontend/src/features/<module>/<resource>/hooks/use-<resource>.ts
frontend/src/features/<module>/<resource>/components/*-columns.tsx
frontend/src/features/<module>/<resource>/components/*-table.tsx
frontend/src/features/<module>/<resource>/components/*-form-dialog.tsx
frontend/src/features/<module>/<resource>/components/*-dialogs.tsx
frontend/src/features/<module>/<resource>/components/*-primary-buttons.tsx
frontend/src/features/<module>/<resource>/data/schema.ts
frontend/src/features/<module>/<resource>/index.tsx
frontend/src/routes/_authenticated/<module>/<resource>.tsx
frontend/src/constants/permissions.ts (add new permission keys)
Step 3: Implement Backend
Follow the layer order strictly — each layer depends on the one above.
Read references/backend.md for complete code templates and patterns.
Quick reference for key conventions:
- IDs:
xid.New().String()in Ent schemaDefaultFunc - Partial updates: pointer fields in
Update*Request(*string) - Pagination: embed
domain.QueryParams, calldomain.ValidateQueryParams() - Response:
domain.RespSuccess(data)(code=0) /domain.RespError(msg)(code=1) - Usecase: every method starts with
context.WithTimeout+defer cancel() - Errors: sentinel errors in domain,
%wwrapping, map to HTTP status in controller - Factory: repo → usecase → controller, dependencies from
f.db,f.app,f.timeout - Routes: protected system routes use
casbinMiddleware.CheckAPIPermission()
Step 4: Implement Frontend
Follow the order: types → service → feature module → route file.
Read references/frontend.md for complete code templates and patterns.
Quick reference for key conventions:
- API response:
response.data.data(outer.data= Axios, inner.data=domain.Response.Data) - Date parsing: API service converts string dates to
Dateobjects - Query params:
URLSearchParamsconstruction, snake_case to match backend - Table state:
useTableUrlStatehook syncs pagination/filters with URL - Dialog state: string-based via context provider (
open === 'add' | 'edit' | 'delete') - Permissions:
usePermission()hook,PERMISSIONS.SYSTEM.RESOURCE.ACTIONconstants - Toast:
sonnerfor success/error notifications - Forms: React Hook Form + Zod, single hook handles create/edit
- Route file: Zod schema validates URL search params with
.catch()defaults
Step 5: Wire Permissions
Shadmin uses a dual-layer permission model:
Backend (API access): Casbin checks (userID, path, method)
Frontend (UI visibility): Permission strings like "system:project:add"
These are linked through the Role → Menu → API Resources binding:
- Backend auto-scans routes into API resources on startup (
bootstrap.InitApiResources) - API resource IDs are deterministic:
METHOD:/api/v1/path(e.g.,GET:/api/v1/system/project) - Admin assigns menus to roles, each menu binds to API resources
- Frontend fetches permissions from
/api/v1/resourcesand stores in Zustand
To add permissions for a new feature:
- Backend: routes auto-register as API resources on restart
- Frontend: add permission constants in
frontend/src/constants/permissions.ts - Admin panel: create menu entries, bind API resources, assign to roles
Step 6: Generate & Verify
# Backend
go generate ./ent # If schema changed
go fmt ./... && go vet ./... # Format + static analysis
go test ./... # Run tests
swag init -g main.go --output ./docs # If Swagger annotations changed
# Frontend (from frontend/)
pnpm lint # ESLint
pnpm format:check # Prettier
pnpm build # Recommended if routes/build config changed
Key Response Format
// Success (HTTP 200/201)
type Response struct {
Code int `json:"code"` // 0 = success
Msg string `json:"msg"` // "OK"
Data interface{} `json:"data"` // payload
}
// Error (HTTP 400/404/500)
// Code = 1, Msg = error description, Data = nil
// Paginated response (in Data field)
type PagedResult[T any] struct {
List []T `json:"list"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
TotalPages int `json:"total_pages"`
}
Boundaries
Things to never do:
- No business logic in controllers — controllers parse HTTP, call usecase, return response
- No HTTP/permission logic in repositories — repositories do data access only
- No bypassing Casbin on protected APIs
- No new globals — use factory's
f.db,f.app,f.timeout - No inline API calls in React — all API access goes through
services/wrappers - No direct localStorage for auth — use
useAuthStore - No editing
components/ui/— shadcn-generated primitives - No hardcoded menus — menus come from backend
/api/v1/resources - No unnecessary dependencies — frontend or backend
- Minimal changes — only touch files relevant to the feature
Reference Files
For detailed code templates and implementation patterns, read these as needed:
references/backend.md— Complete Go/Gin/Ent code templates for domain, schema, repository, usecase, controller, routes, and factory. Read when implementing backend features.references/frontend.md— Complete React/TypeScript code templates for types, API services, feature modules, hooks, tables, forms, dialogs, routes, and permissions. Read when implementing frontend features.
Further Documentation
The docs/getting-started/ directory contains comprehensive guides:
quickstart.zh.md/quickstart.en.md— Quick start guidearchitecture.zh.md/architecture.en.md— Architecture deep-divedevelopment.zh.md/development.en.md— Full CRUD walkthrough with exampledeployment.zh.md/deployment.en.md— Production deployment guide
When not to use it
- →Bypassing Casbin permissions
- →Editing shadcn primitives
Limitations
- →Requires manual Go generation
How it compares
This provides a strict, end-to-end development workflow compared to ad-hoc full-stack coding.
Compared to similar skills
shadmin-dev side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| shadmin-dev (this skill) | 0 | 1mo | Review | Advanced |
| api | 0 | 6mo | No flags | Advanced |
| add-feature | 0 | 4mo | Review | Advanced |
| zustand | 113 | 2mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
api
birdgg
Create an agent team for full-stack feature development. One agent writes the Haskell Servant backend API, another builds the React frontend UI consuming that API. Use when asked to "build a feature", "add a new page", "create an endpoint with UI", or "fullstack feature".
add-feature
adamint
Adds new features to the application including API endpoints, React pages, components, and curriculum content. USE FOR: implementing new features, adding API endpoints, creating React components, adding curriculum content, writing unit/API tests. DO NOT USE FOR: E2E browser tests (use add-e2e-tests
zustand
lobehub
Zustand state management guide. Use when working with store code (src/store/**), implementing actions, managing state, or creating slices. Triggers on Zustand store development, state management questions, or action implementation.
web-artifacts-builder
anthropics
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
landing-page-guide-v2
bear2u
Create distinctive, high-converting landing pages that combine proven conversion elements with exceptional design quality. Build beautiful, memorable landing pages using Next.js 14+ and ShadCN UI that avoid generic AI aesthetics while following the 11 essential elements framework.
react
lobehub
React component development guide. Use when working with React components (.tsx files), creating UI, using @lobehub/ui components, implementing routing, or building frontend features. Triggers on React component creation, modification, layout implementation, or navigation tasks.