Awesome-omni-skill add-feature
Scaffold a new frontend feature module with page, components, API service, and hooks
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/add-feature-signalbeam-io" ~/.claude/skills/diegosouzapw-awesome-omni-skill-add-feature-8149f1 && rm -rf "$T"
manifest:
skills/development/add-feature-signalbeam-io/SKILL.mdsource content
Add Frontend Feature
Scaffold a new feature module following the project's React + TypeScript conventions.
Arguments
— Feature name in kebab-case (e.g.,{feature}
,alerts
)rollouts
Structure
Creates the following structure under
web/src/features/{feature}/:
{feature}/ ├── pages/ │ └── {feature}-page.tsx └── components/ └── {feature}-overview.tsx
And adds an API service at
web/src/api/services/{feature}.api.ts.
1. API Service (web/src/api/services/{feature}.api.ts
)
web/src/api/services/{feature}.api.ts/** * {Feature} API client */ import { apiRequest } from '../client' import { appendTenantId } from './tenant' import type { PaginatedResponse } from '../types' // Define types inline or in ../types/index.ts export interface {Entity} { id: string // fields } const BASE_PATH = '/api/{feature}' export const {feature}Api = { /** * Get paginated list */ async getAll(page = 1, pageSize = 20): Promise<PaginatedResponse<{Entity}>> { const params = new URLSearchParams() appendTenantId(params) params.set('pageNumber', page.toString()) params.set('pageSize', pageSize.toString()) return apiRequest({ url: BASE_PATH, params }) }, /** * Get by ID */ async getById(id: string): Promise<{Entity}> { const params = new URLSearchParams() appendTenantId(params) return apiRequest({ url: `${BASE_PATH}/${id}`, params }) }, }
2. Page (web/src/features/{feature}/pages/{feature}-page.tsx
)
web/src/features/{feature}/pages/{feature}-page.tsximport { {Feature}Overview } from '../components/{feature}-overview' export function {Feature}Page() { return ( <div className="container mx-auto py-6"> <{Feature}Overview /> </div> ) }
3. Overview Component (web/src/features/{feature}/components/{feature}-overview.tsx
)
web/src/features/{feature}/components/{feature}-overview.tsximport { useQuery } from '@tanstack/react-query' import { {feature}Api } from '@/api/services/{feature}.api' export function {Feature}Overview() { const { data, isLoading, error } = useQuery({ queryKey: ['{feature}'], queryFn: () => {feature}Api.getAll(), staleTime: 30_000, }) if (isLoading) return <div>Loading...</div> if (error) return <div>Error loading {feature}</div> return ( <div> <h1 className="text-2xl font-bold mb-4">{Feature}</h1> {/* Render data */} </div> ) }
4. Add Route
Remind the user to add the route in
web/src/routes/:
import { {Feature}Page } from '@/features/{feature}/pages/{feature}-page' // Add to router config: { path: '/{feature}', element: <{Feature}Page /> }
Checklist
- API service uses
andapiRequestappendTenantId - Types defined as interfaces, no
any - TanStack Query for server state
- Functional components only
- shadcn/ui components with Tailwind CSS
- Route added to router config
Guidelines
- Follow existing features (e.g.,
,devices/
) as referencebundles/ - Keep components small and focused
- Use barrel exports where the project already does
Related Skills
to create the backend API endpoint this feature calls/add-query
to create mutation endpoints/add-command