page-best-practice
npx skills add https://github.com/forge-town/skills --skill page-best-practice
Agent 安装分布
Skill 文档
页é¢çæå¨ (Page Generator Skill)
ä»»å¡ç®æ
- æ¬ Skill ç¨äºï¼å¨
apps/web/src/pagesç®å½ä¸å¿«éçæç¬¦åé¡¹ç®æ¶æè§èçæ°é¡µé¢ã - æ ¸å¿çå¿µï¼æ¶æå è¡ãå çæç¬¦åè§èç代ç 骨æ¶ï¼èææ¶ï¼ï¼åç±å¼åè æ AI å¡«å ä¸å¡é»è¾ã
å·¥ä½åç
- åæé¡µé¢éæ±ï¼ç¡®å®UIå¤æåº¦åç¶æç®¡çéæ±
- ä¸¥æ ¼åç § best-practice-examples/ ä¸ç代ç ç»æåæ¨¡å¼
- æ ¹æ®UIå¤æåº¦çæç¸åºçContentç»ä»¶
- 妿éè¦Storeï¼å¤ææ¯çææ°Storeè¿æ¯ä½¿ç¨ç°æStoreï¼å¦æçææ°Storeï¼ä½¿ç¨store-best-practiceæè½çæStore模å
- å建Wrapperç»ä»¶å¤çä¾èµæ³¨å ¥
- å®ç°Indexæä»¶æä¾å¹²åçå¯¼åºæ¥å£
- å¨åºç¨ç¨åºä¸æ³¨åè·¯ç±å¹¶ä½¿ç¨çæç页é¢
- è§¦åæ¡ä»¶ï¼å½ç¨æ·è¦æ±âå建æ°é¡µé¢âãâå¢å è·¯ç±é¡µé¢âæâçæé¡µé¢èææ¶âæ¶ã
çææ¨¡å¼ (Generation Modes)
æ¬ Skill æ¯æä¸¤ç§çææ¨¡å¼ï¼ç¨æ·å¯å¨å¼å§æ¶éæ©ï¼
æ çç£çæ (Unsupervised)
- éç¨åºæ¯ï¼Anatomy è§èè¶³å¤å®å¤ï¼AI å¯èªå¨æ¨å¯¼å®æ´ç»æã
- ç¹ç¹ï¼å ¨èªå¨è¿è¡ï¼æ é人工干é¢ã
- æµç¨ï¼ç´æ¥ä½¿ç¨ judgeHasStore.ts çé»è¾å¤æææé项ï¼çæå®æ´ç»æã
æçç£çæ (Supervised)
- éç¨åºæ¯ï¼åå¨é项夿çä¸ç¡®å®æ§ï¼éè¦äººå·¥ç¡®è®¤ã
- ç¹ç¹ï¼å¨å ³é®èç¹ï¼å¦æ¯å¦éè¦ Storeï¼æé®ç¡®è®¤ï¼AI æä¾æ¨èä½ç±ç¨æ·å³çã
- æµç¨ï¼ä½¿ç¨ judgeHasStore.ts çé»è¾å¤ææä¾æ¨èå¼ï¼æé®ç¨æ·ç¡®è®¤æ¯å¦é纳ã
䏻卿¨¡å¼éæ© (Active Mode Selection)
éè¦è¡ä¸ºè¦æ±ï¼æ¬æè½å¿ é¡»å¨å¼å§ä»»ä½çæå·¥ä½å主å¨è¯¢é®ç¨æ·éæ©çææ¨¡å¼ã
è¯¢é®æ¶æº
- è§¦åæ¡ä»¶ï¼å½ç¨æ·è¯·æ±å建æ°é¡µé¢æ¶
- 询é®ä½ç½®ï¼å¨ææåæå夿ä¹å
- 强å¶è¦æ±ï¼ä¸è½è·³è¿æ¤æ¥éª¤æé»è®¤éæ©æ¨¡å¼
éæ©çé¢
æä¾æ¸ æ°çéæ©çé¢ï¼å å«ï¼
- 模å¼åç§°ï¼æ çç£çæ / æçç£çæ
- ç®è¦æè¿°ï¼æ¯ç§æ¨¡å¼çç¹ç¹åéç¨åºæ¯
- æ¨è建议ï¼åºäºé¡µé¢å¤æåº¦çæºè½æ¨èï¼å¯éï¼
ç¨æ·å³ç
- çå¾ ç¡®è®¤ï¼å¿ é¡»çå¾ ç¨æ·æç¡®éæ©ååç»§ç»
- ä¸å¯è·³è¿ï¼å¦æç¨æ·æªéæ©ï¼ä¸å¾ç»§ç»æ§è¡
- å¯åæ¶ï¼å è®¸ç¨æ·åæ¶æä½
UI å¤æåº¦æ§å¶ (UI Complexity Control)
å¤æåº¦ç级
- ç®åæ¨¡å¼ (Simple): åºç¡å¸å± + åºç¡ç»ä»¶ï¼éåå±ç¤ºå页é¢
- æ 忍¡å¼ (Standard): æç´¢/è¿æ»¤ + å表å±ç¤ºï¼éåæ°æ®ç®¡ç页é¢
- å¤ææ¨¡å¼ (Complex): 夿 ç¾é¡µ + é«çº§äº¤äºï¼éååè½ä¸°å¯ç页é¢
åè½éé åå
- åºäºéæ±çæ: æ ¹æ®é¡µé¢å®é 鿱鿩åéçUIå¤æåº¦
- é¿å è¿åº¦è®¾è®¡: ä¸è¦æ·»å ç¨æ·ä¸éè¦çåè½
- ä¿æä¸è´æ§: éµå¾ªç°æé¡µé¢ç设计模å¼åäº¤äºæ¹å¼
å¤æåº¦å¤æé»è¾
- ä½¿ç¨ judgeUIComplexity.ts æºè½å¤æUIå¤æåº¦ç级
- åºäºé¡µé¢åç§°ãæè¿°ååè½éæ±èªå¨æ¨å¯¼
- æ¯ææå¨æå®å¤æåº¦è¦çèªå¨å¤æ
ä½¿ç¨æ¹æ³
æ¤æè½æä¾ææ¡£å示ä¾ãæç §åèæåä¸çæ¥éª¤æä½ï¼
- 页颿佳å®è·µæå – 页é¢è®¾è®¡åå®ç°ç详ç»è§å
- æä½³å®è·µç¤ºä¾ – å¿
é¡»ä¸¥æ ¼åç
§ç 页é¢ç»æå代ç 示ä¾
- standard-with-store/ – 带Storeçæ åå¤æåº¦é¡µé¢ç¤ºä¾
- simple-no-store/ – æ Storeçç®åå¤æåº¦é¡µé¢ç¤ºä¾
éè¦ï¼ å®ç°æ¶å¿ é¡»ä¸¥æ ¼éµå¾ª best-practice-examples ä¸ç代ç ç»æãå½å约å®å模å¼ãä»»ä½ä¿®æ¹é½å¯è½ç ´åæ¶æä¸è´æ§åå¯ç»´æ¤æ§ã
使ç¨ç¤ºä¾ (Usage Examples)
å ¸å使ç¨åºæ¯
ç¨æ·è¾å ¥ï¼å建ä¸ä¸ªç¨æ·ç®¡ç页é¢ï¼éè¦æ¾ç¤ºç¨æ·åè¡¨ãæ¯ææç´¢åçéã
Skill ååºï¼
- 主å¨è¯¢é®çææ¨¡å¼ï¼æ¾ç¤ºæ¨¡å¼éæ©çé¢ï¼è¦æ±ç¨æ·éæ©æ çç£ææçç£çæ
- æ ¹æ®ç¨æ·éæ©ï¼èªå¨åæéæ±ï¼å¤æéè¦ Store åæ åå¤æåº¦
- çæå®æ´ç页é¢ç»æå代ç
- æä¾è·¯ç±æ³¨åæå¯¼
å ·ä½é 置示ä¾è¯·åè TEMPLATE_VIEW.md ä¸çé 置示ä¾é¨åã
è¾åº
æè½å°çæï¼
- Index æä»¶ï¼index.tsï¼æä¾å¹²åçå¯¼åºæ¥å£ï¼
- Wrapper ç»ä»¶ï¼[PageName].tsxï¼å¤çä¾èµæ³¨å ¥ï¼
- Content ç»ä»¶ï¼[PageName]Content.tsxï¼å®ç°UIå交äºï¼
- å¯éç Store 模åï¼_store/ï¼å¦æéè¦ç¶æç®¡çï¼
çæç»æç¤ºä¾
请åè ANATOMY.md çç®å½ç»ææ é¨åã
æ ¸å¿è§è (Knowledge Base)
è¾å ¥åæ°è§è
pageName: 页é¢åç§°ï¼å¿ 须为 PascalCase æ ¼å¼features.hasStore: æ¯å¦éè¦ç¶æç®¡çï¼ç³»ç»èªå¨å¤æï¼features.useExistingStore: 妿éè¦storeï¼æ¯å¦ä½¿ç¨ç°æstoreï¼true/falseï¼ç³»ç»èªå¨å¤æï¼features.existingStorePath: å¦æä½¿ç¨ç°æstoreï¼æå®storeçå¯¼å ¥è·¯å¾ï¼ä¾å¦ “@/pages/UserPage/_store”ï¼features.uiComplexity: UI å¤æåº¦ç级ï¼simple/standard/complexï¼ç³»ç»èªå¨å¤æï¼description: 页é¢åè½æè¿°ï¼ç¨äºæºè½å¤æå¤æåº¦
æ¬ Skill çæ§è¡å®å ¨ä¾èµä»¥ä¸è§èææ¡£ï¼è¯·å¨çæä»£ç æ¶ä»ç»åèï¼
- æ´ä½ç»æ: references/ANATOMY.md (ç®å½ç»æãå½åè§è)
- 页颿佳å®è·µæå: references/page-best-practice-guide.md (页é¢è®¾è®¡åå®ç°ç详ç»è§å)
- æä½³å®è·µç¤ºä¾: best-practice-examples/ (å¿ é¡»ä¸¥æ ¼åç §ç页é¢ç»æå代ç 示ä¾)
- è¾å ¥è§è: references/schema.ts (åæ°æ ¡éª)
- Store夿é»è¾: references/judgeHasStore.ts (æºè½å¤ææ¯å¦éè¦Store)
- UIå¤æåº¦å¤æ: references/judgeUIComplexity.ts (æºè½å¤æUIå¤æåº¦ç级)
- Index模ç: references/TEMPLATE_INDEX.md (å ¥å£æä»¶åæ³)
- Wrapper模ç: references/TEMPLATE_WRAPPER.md (ä¾èµæ³¨å ¥å±åæ³)
- View模ç: references/TEMPLATE_VIEW.md (UIå±åæ³)
ð¡ Store ç¸å
³è§è请åè store-best-practice æè½
è´¨éä¿è¯ (Quality Assurance)
代ç çæåå
- ç±»åå®å ¨: ææçæç代ç å¿ é¡»éè¿ TypeScript ç¼è¯
- æ§è½ä¼å: 强å¶ä½¿ç¨ Zustand selectorsï¼é¿å ä¸å¿ è¦ç鿏²æ
- æ¶æä¸è´æ§: ä¸¥æ ¼éµå¾ªé¡¹ç®çææ¯æ 忍¡å¼
- å¯ç»´æ¤æ§: çæç代ç åºæäºçè§£åæ©å±
é误å¤ç
- çæåéªè¯ç®æ è·¯å¾ä¸åå¨ï¼é¿å è¦ç
- æä¾æ¸ æ°çé误信æ¯åä¿®å¤å»ºè®®
- æ¯æåæ»æºå¶ï¼å¦æçæå¤±è´¥ï¼
注æï¼ è°ç¨å®æ¯æè½åï¼å¼ºå¶æ¥ç æ£æ¥æ¸ åï¼å¹¶ç¡®ä¿è¿åçå 容å®å ¨å¹é æ¸ åä¸çææé¡¹ç®ã
æä½æ¥éª¤ (Workflow)
0. 模å¼éæ© (Mode Selection) – å¿ é¡»ä¸»å¨è¯¢é®
éè¦ï¼å¨å¼å§ä»»ä½çæå·¥ä½åï¼å¿ 须主å¨è¯¢é®ç¨æ·éæ©åªç§çææ¨¡å¼ãä¸è¦é»è®¤ä½¿ç¨æ çç£æ¨¡å¼ã
- 主å¨è¯¢é®ï¼æ¾ç¤ºæ¸ æ°çéæ©çé¢ï¼è®©ç¨æ·éæ©çææ¨¡å¼
- é项说æï¼
- æ çç£çæ (Unsupervised): å ¨èªå¨å¤æææåæ°ï¼éåæ ååºæ¯
- æçç£çæ (Supervised): å¨å ³é®å³çç¹è¯¢é®ç¨æ·ç¡®è®¤ï¼éåä¸ç¡®å®æå¤æåºæ¯
- ç¨æ·å³çï¼çå¾ ç¨æ·æç¡®éæ©ååç»§ç»
0.1. ç°æä»£ç åæ (Existing Code Analysis)
- æ£æ¥ç®æ è·¯å¾æ¯å¦å·²åå¨é¡µé¢æä»¶
- 妿åå¨ï¼åæç°æä»£ç ç»æãæ ·å¼åç»ä»¶ä½¿ç¨
- 询é®ç¨æ·æ¯å¦è¦ï¼
- éæç°æä»£ç ï¼ä¿çä¸å¡é»è¾ä¸æ ·å¼ï¼åªè§èåæ¶æ
- éæ°çæï¼å®å ¨æ¿æ¢ä¸ºæ°æ¶æ
- å¢éæ¹è¿ï¼å¨ç°æåºç¡ä¸æ·»å ç¼ºå¤±çæ¶æå ç´
1. æå¾è§£æä¸æ ¡éª
- 读åç¨æ·æä»¤ï¼ç¡®å®çææ¨¡å¼
- 使ç¨
schema.tsä¸çè§åæ ¡éªåæ° - èªå¨çæé¡µé¢åç§°ï¼æ ¹æ®ç¨æ·æè¿°åæä»¤ï¼èªå¨çæ PascalCase æ ¼å¼ç页é¢åç§°ï¼ä¾å¦ï¼ç¨æ·è¯´”åå»ºç¨æ·ç®¡ç页颔åçæ”UserManagementPage”ï¼
1.1. Store 夿é»è¾
- æ çç£æ¨¡å¼ï¼ç´æ¥è°ç¨
judgeHasStoreFromDescription()èªå¨å¤ææ¯å¦éè¦storeï¼å¦æéè¦ï¼è¿ä¸æ¥è°ç¨judgeUseExistingStoreFromDescription()夿æ¯å¦ä½¿ç¨ç°æstoreï¼å¦æä½¿ç¨ç°æstoreï¼è°ç¨inferExistingStorePath()æ¨å¯¼è·¯å¾ - æçç£æ¨¡å¼ï¼è°ç¨
judgeHasStoreSupervised()è·åæ¨èï¼è¯¢é®ç¨æ·ç¡®è®¤æ¯å¦é纳ï¼å¦æéè¦storeï¼è¿ä¸æ¥è°ç¨judgeUseExistingStoreSupervised()è¯¢é®æ¯å¦ä½¿ç¨ç°æstoreï¼å¦æä½¿ç¨ï¼è¯¢é®ç¨æ·æå®è·¯å¾æä½¿ç¨æ¨å¯¼è·¯å¾ - éè¦ï¼å¦æå¤æéè¦æ°Storeï¼è¯·ä½¿ç¨
store-best-practiceæè½çæç¸åºç Store 模åï¼å¦æä½¿ç¨ç°æstoreï¼åæ éçæ
1.2. UI å¤æåº¦å¤æ
- æ çç£æ¨¡å¼ï¼ç´æ¥è°ç¨
judgeUIComplexity()èªå¨å¤æ - æçç£æ¨¡å¼ï¼è°ç¨
judgeUIComplexitySupervised()è·åæ¨èï¼è¯¢é®ç¨æ·ç¡®è®¤
2. è§åæä»¶å表
æ ¹æ® ANATOMY.md å hasStoreãuseExistingStore åæ°ï¼è§åéè¦å建çæä»¶è·¯å¾ã
- åºç¡æä»¶ï¼
index.ts,[PageName].tsx,[PageName]Content.tsx - å¯éæä»¶ï¼
_store/index.ts,_store/provider.tsx,_store/[camelCase]Slice.ts,_store/[camelCase]Store.ts(ä» å½hasStore=trueä¸useExistingStore=falseï¼éè¿store-best-practiceæè½çæ)
3. 代ç çæ (æé¡ºåº)
请å¤ç¨ References ä¸ç模çï¼å° {{PageName}} å {{camelCasePageName}} æ¿æ¢ä¸ºå®é
å¼ã
æ¥éª¤ 3.1: Store 模åå¤ç
- 妿
hasStore=trueä¸useExistingStore=falseï¼ä½¿ç¨store-best-practiceæè½çæç¸åºç Store 模å - 妿
hasStore=trueä¸useExistingStore=trueï¼ä½¿ç¨æå®çexistingStorePathå¯¼å ¥ç°æ Store - Store æä»¶å°æ¾ç½®å¨
_store/ç®å½ä¸ï¼ä» å½çææ°Storeæ¶ï¼
æ¥éª¤ 3.2: çæ UI è§å¾ (Content)
- åè TEMPLATE_VIEW.mdã
- æ ¹æ®
uiComplexityåæ°éæ©åéçUIå¤æåº¦ï¼- simple: åºç¡å¸å±ï¼æ æç´¢/æåºåè½ï¼ä» åºç¡å±ç¤º
- standard: æ·»å æç´¢åæåºåè½ï¼éåæ°æ®ç®¡ç页é¢
- complex: æ·»å æ ç¾é¡µãé«çº§è¿æ»¤ãæ¹éæä½çï¼éååè½ä¸°å¯ç页é¢
- 妿
hasStore=trueï¼æ¿æ¢{{StoreImport}}为ç¸åºçimportè¯å¥ï¼- 妿
useExistingStore=falseï¼import { useStore } from "zustand"; import { use{{PageName}}Store } from "./_store"; - 妿
useExistingStore=trueï¼import { useStore } from "zustand"; import { use{{PageName}}Store, {{PageName}}StoreProvider } from "{{existingStorePath}}";
- 妿
- 妿
hasStore=trueï¼æ¿æ¢{{StoreConnection}}为const { loading, searchQuery, selectedSort, viewMode } = use{{PageName}}Store();ï¼å¦åæ¿æ¢ä¸ºç©º - 使ç¨
cnå Flex å¸å±çæåºç¡éª¨æ¶ã - éè¦: é¿å è¿åº¦è®¾è®¡ï¼åªçæå®é éè¦çåè½
æ¥éª¤ 3.3: çæ å è£ å¨ (Wrapper)
- åè TEMPLATE_WRAPPER.mdã
- å
³é®: 妿éè¦ Storeï¼Wrapper å¿
é¡»æ£ç¡®å¼å
¥å¹¶åµå¥
<StoreProvider>ï¼- 妿
useExistingStore=falseï¼å¼å ¥{{PageName}}StoreProviderfrom “./_store” - 妿
useExistingStore=trueï¼å¼å ¥{{PageName}}StoreProviderfrom “{{existingStorePath}}”
- 妿
- 妿ä¸éè¦ Storeï¼åä¸è¦å¼å ¥ã
- å¸å±å¤ç: ä¼å 使ç¨è·¯ç±å±é¢çç»ä¸å¸å±ï¼ä» å¨é¡µé¢éè¦ç¬ç¹å¸å±æ¶å¨ Wrapper ä¸å å«å¸å±ç»ä»¶ã
æ¥éª¤ 3.4: çæ å ¥å£ (Index)
- åè TEMPLATE_INDEX.mdã
- åªå¯¼åºå è£ å¨ç»ä»¶ï¼ä¸å¯¼åºContentç»ä»¶
æ¥éª¤ 3.5: è´¨ééªè¯
- éªè¯çæçä»£ç æ¯å¦ç¬¦å项ç®è§è
- æ£æ¥ç±»åå®å ¨å代ç è´¨é
- 确认ä¾èµæ³¨å ¥æ£ç¡®
4. è¾åºç¡®è®¤
- åç¥ç¨æ·é¡µé¢å·²çæè³æå®è·¯å¾ã
- æéç¨æ·éå¨è·¯ç±æä»¶ï¼å¦
routeTreeærouter.tsxï¼ä¸æ³¨å该页é¢ã - æä¾çæçç»ä»¶ä½¿ç¨ç¤ºä¾ã
- 建议è¿è¡æµè¯éªè¯çæä»£ç ã