Skip to main content

new-page

Scaffold a complete new Next.js dashboard page for the WealthWise web app. Triggers when asked to "add a page", "create a dashboard screen", "build a UI for <feature>", or scaffold any new frontend feature end-to-end. Does not trigger for API-only or backend tasks.

跳到安装

来源信息

仓库
hoangsonww/WealthWise-Finance-Tracker
最近来源活动
2026年3月3日 20:48
检测到的 SKILL.md 语言
英语
星标
24
分支
12

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
new-page
description
Scaffold a complete new Next.js dashboard page for the WealthWise web app. Triggers when asked to "add a page", "create a dashboard screen", "build a UI for <feature>", or scaffold any new frontend feature end-to-end. Does not trigger for API-only or backend tasks.
Scaffold a complete new dashboard page for the WealthWise web app following all project conventions. The page/feature name is provided in the task prompt. ## Scope Create all four layers in this order: ### 1. TanStack Query hooks — `apps/web/src/hooks/use-<entity>.ts` ```typescript import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { apiClient } from '@/lib/api-client'; import { toast } from 'sonner'; export const use<Entity>s = () => useQuery({ queryKey: ['<entities>'], queryFn: () => apiClient.get<{ data: <Entity>Response[] }>('<entities>'), }); export const use<Entity> = (id: string) => useQuery({ queryKey: ['<entities>', id], queryFn: () => apiClient.get<{ data: <Entity>Response }>(`<entities>/${id}`), enabled: !!id, }); export const useCreate<Entity> = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: Create<Entity>Input) => apiClient.post<{ data: <Entity>Response }>('<entities>', data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['<entities>'] }); toast.success('<Entity> created successfully'); }, onError: () => toast.error('Failed to create <entity>'), }); }; // useUpdate<Entity> and useDelete<Entity> follow same pattern ``` Rules: - Always use `apiClient` from `@/lib/api-client` — never raw `fetch` - TanStack Query v5 syntax (`useQuery`, `useMutation`) - Sonner toast on every mutation success AND error - Proper cache invalidation in `onSuccess` ### 2. Components — `apps/web/src/components/<entity>/` Create at minimum: - `<Entity>List.tsx` — table or card list with loading skeleton, error state, empty state - `<Entity>Form.tsx` — create/edit form All components must: - Use React Hook Form + `zodResolver` with schema from `@wealthwise/shared-types` - Use shadcn/ui from `components/ui/` before building custom elements - Handle loading (use `<Skeleton />`), error, and empty states explicitly - Work in both light and dark themes (always check `.dark` class) - Named exports only (no default exports) - Tailwind CSS only — no inline styles except dynamic CSS custom properties ### 3. Page — `apps/web/src/app/(dashboard)/<route>/page.tsx` ```typescript import { Metadata } from 'next'; import { Suspense } from 'react'; export const metadata: Metadata = { title: '<Feature> | WealthWise', }; export default function <Feature>Page() { return ( <Suspense fallback={<SkeletonFallback />}> <Feature>Content /> </Suspense> ); } ``` Default export required by Next.js. ### 4. Sidebar link — `apps/web/src/components/layout/sidebar.tsx` - Add nav item with appropriate `lucide-react` icon - Place in correct section (main nav vs settings) - Use the correct route path ## Standards - No `any` types. No raw `fetch`. No `useEffect` + fetch patterns. - Named exports everywhere except the page itself. - Every form uses `zodResolver` with schemas from `@wealthwise/shared-types`. - Strict null checks — handle `undefined` from queries explicitly. ## Verification After scaffolding, run: ```bash npx turbo lint --filter=@wealthwise/web npx turbo test --filter=@wealthwise/web ``` Report all created file paths and the URL path for the new page.
在 GitHub 查看