frontend-development — community frontend-development, ams-ai, community, ide skills, Claude Code, Cursor, Windsurf

v1.0.0

About this Skill

Ideal for UI-focused Agents requiring efficient frontend development with Ant Design v6, React 18, and TypeScript. Frontend development conventions - Use when creating or modifying AMS-AI React pages/components, including form development, page structure, i18n, and API integration

citywalki citywalki
[0]
[0]
Updated: 3/1/2026

Killer-Skills Review

Decision support comes first. Repository text comes second.

Reviewed Landing Page Review Score: 9/11

Killer-Skills keeps this page indexable because it adds recommendation, limitations, and review signals beyond the upstream repository text.

Original recommendation layer Concrete use-case guidance Explicit limitations and caution Quality floor passed for review Locale and body language aligned
Review Score
9/11
Quality Score
57
Canonical Locale
en
Detected Body Locale
en

Ideal for UI-focused Agents requiring efficient frontend development with Ant Design v6, React 18, and TypeScript. Frontend development conventions - Use when creating or modifying AMS-AI React pages/components, including form development, page structure, i18n, and API integration

Core Value

Empowers agents to build efficient UI components using Ant Design v6, React 18, and TypeScript, enabling the creation of complex web applications with features like server-side pagination and dialog-based create/edit functionality, all while leveraging TypeScript for robust type checking and React 18 for seamless component management.

Ideal Agent Persona

Ideal for UI-focused Agents requiring efficient frontend development with Ant Design v6, React 18, and TypeScript.

Capabilities Granted for frontend-development

Building standard CRUD pages with separate search input state and query state
Implementing server-side pagination with parameters like page, size, and x-total-count
Creating dialog-based create/edit interfaces with relationship selection for complex data models

! Prerequisites & Limits

  • Requires knowledge of Ant Design v6, React 18, and TypeScript
  • Limited to web application development
  • Dependent on specific project structure, such as the reference implementation in app-web/src/pages/admin/RoleManagementPage.tsx

Source Boundary

The section below is supporting source material from the upstream repository. Use the Killer-Skills review above as the primary decision layer.

Labs Demo

Browser Sandbox Environment

⚡️ Ready to unleash?

Experience this Agent in a zero-setup browser environment powered by WebContainers. No installation required.

Boot Container Sandbox

FAQ & Installation Steps

These questions and steps mirror the structured data on this page for better search understanding.

? Frequently Asked Questions

What is frontend-development?

Ideal for UI-focused Agents requiring efficient frontend development with Ant Design v6, React 18, and TypeScript. Frontend development conventions - Use when creating or modifying AMS-AI React pages/components, including form development, page structure, i18n, and API integration

How do I install frontend-development?

Run the command: npx killer-skills add citywalki/ams-ai/frontend-development. It works with Cursor, Windsurf, VS Code, Claude Code, and 19+ other IDEs.

What are the use cases for frontend-development?

Key use cases include: Building standard CRUD pages with separate search input state and query state, Implementing server-side pagination with parameters like page, size, and x-total-count, Creating dialog-based create/edit interfaces with relationship selection for complex data models.

Which IDEs are compatible with frontend-development?

This skill is compatible with Cursor, Windsurf, VS Code, Trae, Claude Code, OpenClaw, Aider, Codex, OpenCode, Goose, Cline, Roo Code, Kiro, Augment Code, Continue, GitHub Copilot, Sourcegraph Cody, and Amazon Q Developer. Use the Killer-Skills CLI for universal one-command installation.

Are there any limitations for frontend-development?

Requires knowledge of Ant Design v6, React 18, and TypeScript. Limited to web application development. Dependent on specific project structure, such as the reference implementation in app-web/src/pages/admin/RoleManagementPage.tsx.

How To Install

  1. 1. Open your terminal

    Open the terminal or command line in your project directory.

  2. 2. Run the install command

    Run: npx killer-skills add citywalki/ams-ai/frontend-development. The CLI will automatically detect your IDE or AI agent and configure the skill.

  3. 3. Start using the skill

    The skill is now active. Your AI agent can use frontend-development immediately in the current project.

Imported Repository Instructions

The section below is supporting source material from the upstream repository. Use the Killer-Skills review above as the primary decision layer.

Supporting Evidence

frontend-development

Install frontend-development, an AI agent skill for AI agent workflows and automation. Works with Claude Code, Cursor, and Windsurf with one-command setup.

SKILL.md
Readonly
Imported Repository Instructions
The section below is supporting source material from the upstream repository. Use the Killer-Skills review above as the primary decision layer.
Supporting Evidence

AMS-AI Frontend Development Conventions

Overview

UI Framework: Ant Design v6 + React 18 + TypeScript

Reference implementation: app-web/src/pages/admin/RoleManagementPage.tsx

Standard CRUD page features:

  • Separate search input state from query state
  • Server-side pagination (page, size, x-total-count)
  • Dialog-based create/edit with relationship selection

Development Workflow

  1. Define Types → lib/types.ts or features/*/types.ts
  2. Add i18n → i18n/locales/zh-CN.json and en-US.json
  3. Add API → features/*/queries.ts (GraphQL) or mutations.ts (REST)
  4. Build Page → pages/*/XManagementPage.tsx
  5. Configure Routes → Router.tsx
  6. Browser Verification → Use frontend-ui-verification skill

Internationalization (i18n)

All user-visible text must use i18n

Language Files

  • app-web/src/i18n/locales/zh-CN.json
  • app-web/src/i18n/locales/en-US.json

Naming Conventions

PatternExampleDescription
pages.{pageName}.titlepages.roleManagement.titlePage title
pages.{pageName}.columns.{field}pages.roleManagement.columns.nameTable columns
pages.{pageName}.form.{field}pages.roleManagement.form.nameForm labels
pages.{pageName}.dialog.{action}pages.roleManagement.dialog.createTitleDialog titles
pages.{pageName}.messages.{type}pages.roleManagement.messages.createSuccessToast messages

Usage

tsx
1import { useTranslation } from 'react-i18next'; 2 3const { t } = useTranslation(); 4 5// Page title 6<CardTitle>{t('pages.xManagement.title')}</CardTitle> 7 8// Input placeholder 9<Input placeholder={t('pages.xManagement.searchPlaceholder')} /> 10 11// Toast message 12message.success(t('pages.xManagement.messages.createSuccess'));

Predefined Common Keys

  • common.loading, common.submit, common.cancel, common.confirm
  • common.save, common.delete, common.edit, common.add, common.search
  • common.loadFailed, common.retry

API Architecture

Directory Structure

lib/
├── apiClient.ts      # Axios REST client
├── graphqlClient.ts  # Graffle GraphQL client
├── queryClient.ts    # React Query config
├── queryKeys.ts      # Query key definitions
├── types.ts          # Shared types (UserItem, RoleItem, etc.)
└── utils.ts

features/admin/*/
├── mutations.ts      # REST commands + useMutation
├── queries.ts        # GraphQL queries
├── types.ts          # Feature-specific types
└── components/       # Dialog components

Query (GraphQL)

typescript
1// features/admin/roles/queries.ts 2import { graphqlClient } from '@/lib/graphqlClient'; 3import { useQuery } from '@tanstack/react-query'; 4import { queryKeys } from '@/lib/queryKeys'; 5 6export const ROLES_QUERY = ` 7 query Roles($page: Int, $size: Int, $keyword: String) { 8 roles(page: $page, size: $size, keyword: $keyword) { 9 content { id name code description } 10 totalElements 11 } 12 } 13`; 14 15export function useRoles(page: number, size: number, keyword?: string) { 16 return useQuery({ 17 queryKey: queryKeys.roles.list(page, size, keyword), 18 queryFn: () => graphqlClient.request(ROLES_QUERY, { page, size, keyword }), 19 }); 20}

Mutation (REST)

typescript
1// features/admin/roles/mutations.ts 2import { useMutation, useQueryClient } from '@tanstack/react-query'; 3import { apiClient } from '@/lib/apiClient'; 4import { queryKeys } from '@/lib/queryKeys'; 5 6export function useCreateRole() { 7 const queryClient = useQueryClient(); 8 return useMutation({ 9 mutationFn: (data: RolePayload) => apiClient.post('/api/system/roles', data), 10 onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.roles.all() }), 11 }); 12}

Type Definitions

typescript
1// lib/types.ts 2export type Id = number | string; 3 4export interface PageResponse<T> { 5 content?: T[]; 6 items?: T[]; 7 totalElements?: number; 8 totalCount?: number; 9} 10 11// features/admin/roles/types.ts 12export interface RoleItem { 13 id: Id; 14 name: string; 15 code: string; 16 description?: string; 17} 18 19export interface RolePayload { 20 name: string; 21 code: string; 22 description?: string; 23}

Ant Design Form Development

Form Layout

All forms must use horizontal layout (labels left, inputs right):

tsx
1<Form form={form} layout="horizontal" onFinish={handleSubmit}> 2 <Form.Item label={t('pages.xxx.form.name')} name="name" rules={[{ required: true }]}> 3 <Input /> 4 </Form.Item> 5</Form>

Dialog with Form

tsx
1import { Form, Modal, Input } from 'antd'; 2import { useTranslation } from 'react-i18next'; 3 4interface Props { 5 open: boolean; 6 mode: 'create' | 'edit'; 7 initialValues?: RoleItem; 8 onClose: () => void; 9 onSubmit: (values: RolePayload) => Promise<void>; 10} 11 12export function RoleFormDialog({ open, mode, initialValues, onClose, onSubmit }: Props) { 13 const { t } = useTranslation(); 14 const [form] = Form.useForm(); 15 const [loading, setLoading] = useState(false); 16 17 useEffect(() => { 18 if (open) { 19 form.resetFields(); 20 if (initialValues) form.setFieldsValue(initialValues); 21 } 22 }, [open, initialValues, form]); 23 24 const handleOk = async () => { 25 const values = await form.validateFields(); 26 setLoading(true); 27 try { 28 await onSubmit(values); 29 onClose(); 30 } finally { 31 setLoading(false); 32 } 33 }; 34 35 return ( 36 <Modal 37 open={open} 38 title={mode === 'create' ? t('pages.roleManagement.dialog.createTitle') : t('pages.roleManagement.dialog.editTitle')} 39 onOk={handleOk} 40 onCancel={onClose} 41 confirmLoading={loading} 42 > 43 <Form form={form} layout="horizontal" labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}> 44 <Form.Item label={t('pages.roleManagement.form.name')} name="name" rules={[{ required: true }]}> 45 <Input /> 46 </Form.Item> 47 <Form.Item label={t('pages.roleManagement.form.code')} name="code" rules={[{ required: true }]}> 48 <Input /> 49 </Form.Item> 50 </Form> 51 </Modal> 52 ); 53}

Required Field Markers

Ant Design automatically shows red asterisk * when rules={[{ required: true }]} is set.

tsx
1// ✅ Correct - Use rules for required 2<Form.Item name="name" rules={[{ required: true, message: t('common.required') }]}> 3 <Input /> 4</Form.Item> 5 6// ❌ Wrong - Don't add asterisk manually 7<Form.Item label="Name*"> 8 <Input /> 9</Form.Item>

Page Component Construction

State Patterns

typescript
1const [items, setItems] = useState<XItem[]>([]); 2const [loading, setLoading] = useState(false); 3const [error, setError] = useState<Error | null>(null); 4 5// Search: Separate input state from query state 6const [searchKeyword, setSearchKeyword] = useState(''); 7const [queryKeyword, setQueryKeyword] = useState(''); 8 9// Pagination: UI uses 1-based 10const [currentPage, setCurrentPage] = useState(1); 11const [pageSize, setPageSize] = useState(20); 12const [total, setTotal] = useState(0); 13 14// Dialog 15const [dialogOpen, setDialogOpen] = useState(false); 16const [dialogMode, setDialogMode] = useState<'create' | 'edit'>('create'); 17const [editingItem, setEditingItem] = useState<XItem | null>(null);

Loading Pattern

typescript
1const loadItems = useCallback(async () => { 2 setLoading(true); 3 setError(null); 4 try { 5 const params = { 6 page: Math.max(currentPage - 1, 0), // Convert to zero-based 7 size: pageSize, 8 keyword: queryKeyword || undefined, 9 }; 10 const res = await xApi.getList(params); 11 const list = res.data.content ?? res.data.items ?? []; 12 const totalHeader = res.headers?.['x-total-count']; 13 const totalCount = Number(totalHeader) || res.data.totalElements || list.length; 14 15 setItems(list); 16 setTotal(totalCount); 17 } catch (err) { 18 setError(err instanceof Error ? err : new Error('Load failed')); 19 } finally { 20 setLoading(false); 21 } 22}, [currentPage, pageSize, queryKeyword]);

Table with Actions

tsx
1const columns: ColumnsType<XItem> = [ 2 { title: t('pages.xxx.columns.code'), dataIndex: 'code', key: 'code' }, 3 { title: t('pages.xxx.columns.name'), dataIndex: 'name', key: 'name' }, 4 { 5 title: t('pages.xxx.columns.actions'), 6 key: 'actions', 7 render: (_, record) => ( 8 <Space> 9 <Button type="link" onClick={() => handleEdit(record)}>{t('common.edit')}</Button> 10 <Popconfirm title={t('common.deleteConfirm')} onConfirm={() => handleDelete(record.id)}> 11 <Button type="link" danger>{t('common.delete')}</Button> 12 </Popconfirm> 13 </Space> 14 ), 15 }, 16]; 17 18<Table 19 columns={columns} 20 dataSource={items} 21 rowKey="id" 22 loading={loading} 23 pagination={{ 24 current: currentPage, 25 pageSize, 26 total, 27 showSizeChanger: true, 28 showTotal: (total) => t('common.totalItems', { total }), 29 onChange: (page, size) => { 30 setCurrentPage(page); 31 setPageSize(size); 32 }, 33 }} 34/>

Common Mistakes

MistakeCorrection
Hardcoded text in componentsUse t('pages.xxx.key') for all user text
Adding i18n key to only one language fileMust add to both zh-CN.json and en-US.json
Using searchKeyword directly when loadingKeep queryKeyword separate from input state
Sending 1-based page to backendUse Math.max(currentPage - 1, 0) to convert
Ignoring x-total-count headerPrefer response header, then fallback to body
JS long integer precision issuesUse string or number | string for ID fields
Not handling empty page after deleteGo back one page when current page becomes empty

Verification

bash
1cd app-web && pnpm lint 2cd app-web && pnpm build

After completion, use the frontend-ui-verification skill for browser verification.

Ant Design Reference

Documentation URLs

URLPurpose
https://ant.design/llms.txtIndex - Navigation to all docs
https://ant.design/llms-full.txtFull API - All 73 components (EN)
https://ant.design/llms-full-cn.txtFull API - All 73 components (CN)
https://ant.design/llms-semantic.mdSemantic DOM - Styling guide (EN)

Key Design Docs

Key Components

ComponentUse CaseKey Props
FormData entry formslayout="horizontal", Form.Item, name, rules
TableData display with paginationcolumns, dataSource, pagination, rowKey
ModalDialogsopen, onCancel, onOk, title, confirmLoading
SelectDropdown selectionoptions, value, onChange, mode="multiple"
InputText inputplaceholder, value, onChange
ButtonActionstype, loading, disabled, icon
CardContent containertitle, extra
SpaceLayout spacingdirection, size
messageToast notificationssuccess(), error(), warning()
PopconfirmDelete confirmationtitle, onConfirm, okText

Type Utilities (v5+)

tsx
1import type { GetProps, GetRef, GetProp } from 'antd'; 2 3type SelectProps = GetProps<typeof Select>; 4type SelectRef = GetRef<typeof Select>; 5type OptionType = GetProp<typeof Select, 'options'>[number];

Related Skills

Looking for an alternative to frontend-development or another community skill for your workflow? Explore these related open-source skills.

View All

openclaw-release-maintainer

Logo of openclaw
openclaw

Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

333.8k
0
AI

widget-generator

Logo of f
f

Generate customizable widget plugins for the prompts.chat feed system

149.6k
0
AI

flags

Logo of vercel
vercel

The React Framework

138.4k
0
Browser

pr-review

Logo of pytorch
pytorch

Tensors and Dynamic neural networks in Python with strong GPU acceleration

98.6k
0
Developer