read-before-edit
npx skills add https://github.com/cityfish91159/maihouses --skill read-before-edit
Agent 安装分布
Skill 文档
Read Before Edit Skill
鿝 maihouses å°æ¡çæ ¸å¿è¦ç¯ï¼çµå°ç¦æ¢å¨æ²æé±è®æªæ¡çæ æ³ä¸é²è¡ä¿®æ¹ã
ð¨ æ ¸å¿åå
ð READ â ð§ UNDERSTAND â âï¸ EDIT
æ°¸é ä¸è¦è·³é READ æ¥é©ï¼
ð¯ å·è¡ææ©
- æ¯æ¬¡ä½¿ç¨
Editå·¥å ·å - æ¯æ¬¡ä½¿ç¨
Writeå·¥å ·å - ç¨æ¶è¦æ±ä¿®æ¹ä»»ä½æªæ¡æ
- ç¨æ¶è¦æ±å¯¦ä½æ°åè½æ
ð å¿ è®æªæ¡æ¸ å®
ä¿®æ¹æªæ¡åï¼å¿ é é±è®ï¼
è¦ä¿®æ¹çæªæ¡æ¬èº«
â
âââ è©²æªæ¡ import çæææ¨¡çµ
â
âââ ç¸éçé¡åå®ç¾©æªæ¡ (types.ts, *.d.ts)
â
âââ ç¸éç API/æåå±¤æªæ¡
â
âââ ç¸éç hooks å context
â
âââ ç¸éççµä»¶æªæ¡
â
âââ ç¸éçå·¥å
·å½æ¸
ð 實éç¯ä¾
ç¯ä¾ 1: ä¿®æ¹ React çµä»¶
ä»»åï¼ ä¿®æ¹ src/pages/Login.tsx
å¿ é é±è®çæªæ¡ï¼
# 1. è¦ä¿®æ¹çæªæ¡æ¬èº«
Read: file_path="src/pages/Login.tsx"
# 2. æå°ç¸éé¡åå®ç¾©
Glob: pattern="**/types/*auth*.ts"
Read: file_path="src/types/auth.ts"
# 3. æå°ç¸é API
Grep: pattern="login|auth" glob="**/api/**/*.ts" output_mode="files_with_matches"
Read: file_path="src/api/auth.ts"
# 4. æå°ç¸é hooks
Grep: pattern="useAuth" glob="**/hooks/**/*.ts" output_mode="files_with_matches"
Read: file_path="src/hooks/useAuth.ts"
# 5. æå°ç¸é context
Glob: pattern="**/context/*Auth*.tsx"
Read: file_path="src/context/AuthContext.tsx"
# 6. 檢æ¥ç¸éçµä»¶
Grep: pattern="LoginForm|Button" glob="**/components/**/*.tsx" output_mode="files_with_matches"
Read: file_path="src/components/LoginForm.tsx"
# 7. 檢æ¥å·¥å
·å½æ¸
Grep: pattern="validate" glob="**/utils/**/*.ts" output_mode="files_with_matches"
Read: file_path="src/utils/validation.ts"
ç¯ä¾ 2: ä¿®æ¹ API 層
ä»»åï¼ ä¿®æ¹ src/api/users.ts
å¿ é é±è®çæªæ¡ï¼
# 1. API æªæ¡æ¬èº«
Read: file_path="src/api/users.ts"
# 2. ç¸éé¡åå®ç¾©
Read: file_path="src/types/user.ts"
Read: file_path="src/types/api.ts"
# 3. API åºç¤é
ç½®
Grep: pattern="axios|fetch|baseURL" glob="**/api/**/*.ts" output_mode="files_with_matches"
Read: file_path="src/api/client.ts"
# 4. é¯èª¤èçæ¨¡çµ
Grep: pattern="handleError|ApiError" glob="**/api/**/*.ts" output_mode="files_with_matches"
Read: file_path="src/api/errorHandler.ts"
# 5. èªèç¸éï¼å¦æ API éè¦èªèï¼
Read: file_path="src/api/auth.ts"
ç¯ä¾ 3: æ°å¢åè½
ä»»åï¼ å¯¦ä½ãå¿è¨å¯ç¢¼ãåè½
å¿ é é±è®çæªæ¡ï¼
# 1. äºè§£ç¾æèªèæµç¨
Read: file_path="src/pages/Login.tsx"
Read: file_path="src/api/auth.ts"
Read: file_path="src/types/auth.ts"
# 2. äºè§£è¡¨å®èçæ¨¡å¼
Grep: pattern="handleSubmit|onSubmit" glob="**/pages/**/*.tsx" output_mode="content" -B=2 -C=5
Read: file_path="src/components/Form.tsx"
# 3. äºè§£é©è模å¼
Read: file_path="src/utils/validation.ts"
# 4. äºè§£é¯èª¤èçæ¨¡å¼
Grep: pattern="try.*catch" glob="**/pages/**/*.tsx" output_mode="content" -B=2 -C=5
# 5. äºè§£è·¯ç±é
ç½®
Grep: pattern="route|path" glob="**/router/**/*.tsx" output_mode="files_with_matches"
Read: file_path="src/router/routes.tsx"
â é±è®æª¢æ¥æ¸ å®
å¨éå§ä¿®æ¹åï¼ç¢ºèªå·²çè§£ï¼
- éåæªæ¡ç主è¦åè½
- ææ import çæ¨¡çµä¾èªåªè£¡ãåä»éº¼
- 使ç¨çé¡åå®ç¾©æ¯ä»éº¼
- ç¾æçä»£ç¢¼é¢¨æ ¼åæ¨¡å¼
- é¯èª¤èçæ¹å¼
- è®æ¸å½åæ £ä¾
- 彿¸çµæ§åçµç¹æ¹å¼
- ç¸ä¾çå ¶ä»æ¨¡çµå¦ä½éä½
ð« çµå°ç¦æ¢çè¡çº
// â æ²æå
Read å°±ç´æ¥ Edit
Edit: file_path="src/api/users.ts" ...
// â åªè®è¦ä¿®æ¹çæªæ¡ï¼ä¸è®ç¸éæªæ¡
Read: file_path="src/pages/Login.tsx"
Edit: file_path="src/pages/Login.tsx" ...
// è·³éäº types, api, hooks, context!
// â é¨ä¾¿æ¾ä¸äºæªæ¡è®ï¼åè£æå¨ç
Read: file_path="src/index.tsx" // ä¸ç¸é
Read: file_path="README.md" // ä¸ç¸é
Edit: file_path="src/pages/Login.tsx" ...
// â è®äºä½æ²ç解就éå§æ¹
Read: file_path="src/api/auth.ts"
// ç«å³
Edit: file_path="src/api/auth.ts" ...
// æ²æçè§£ç¾ææ¶æ§ï¼
â æ£ç¢ºçæµç¨
// â
æ¥é© 1: èå¥è¦ä¿®æ¹çæªæ¡
ä»»å: ä¿®æ¹ç»å
¥é é¢å å
¥ãè¨ä½æãåè½
// â
æ¥é© 2: ååºææç¸éæªæ¡
ç¸éæªæ¡:
- src/pages/Login.tsx (è¦ä¿®æ¹çæªæ¡)
- src/types/auth.ts (é¡åå®ç¾©)
- src/api/auth.ts (API å¼å«)
- src/hooks/useAuth.ts (èªè hook)
- src/utils/storage.ts (localStorage å·¥å
·)
// â
æ¥é© 3: 宿´é±è®æææªæ¡
Read: file_path="src/pages/Login.tsx"
Read: file_path="src/types/auth.ts"
Read: file_path="src/api/auth.ts"
Read: file_path="src/hooks/useAuth.ts"
Read: file_path="src/utils/storage.ts"
// â
æ¥é© 4: çè§£ç¾ææ¶æ§
- Login.tsx ä½¿ç¨ useAuth hook
- 表å®çæ
ç¨ useState 管ç
- API å¼å«æå®æ´é¯èª¤èç
- ä½¿ç¨ LoginCredentials interface
- storage.ts å·²æ localStorage å°è£
// â
æ¥é© 5: è¦åä¿®æ¹
1. å¨ LoginCredentials å å
¥ rememberMe?: boolean
2. å¨ Login.tsx å å
¥ checkbox
3. å¨ useAuth èç rememberMe é輯
4. ä½¿ç¨ storage.ts å²åç»å
¥çæ
// â
æ¥é© 6: éå§ä¿®æ¹
Edit: file_path="src/types/auth.ts" ...
Edit: file_path="src/pages/Login.tsx" ...
Edit: file_path="src/hooks/useAuth.ts" ...
ð é±è®è¦èçæª¢æ¥
ä¿®æ¹åï¼ç¢ºèªé±è®è¦èçï¼
### é±è®è¦èçå ±å
#### å·²é±è® â
- [x] src/pages/Login.tsx (è¦ä¿®æ¹çæªæ¡)
- [x] src/types/auth.ts (é¡åå®ç¾©)
- [x] src/api/auth.ts (API 層)
- [x] src/hooks/useAuth.ts (hooks)
- [x] src/context/AuthContext.tsx (context)
- [x] src/utils/validation.ts (å·¥å
·å½æ¸)
#### è¦èç: 100%
â
å¯ä»¥å®å
¨éå§ä¿®æ¹
ð¯ çºä»éº¼å¿ é 鿍£åï¼
é¿å çåé¡ï¼
- ç ´å£ç¾æåè½ – ä¸çè§£ä»£ç¢¼å°±ä¿®æ¹æç ´å£å ¶ä»åè½
- é¡åä¸å¹é – ä¸ç¥éç¾æé¡åå®ç¾©å°è´é¡åé¯èª¤
- é¢¨æ ¼ä¸ä¸è´ – ä¸äºè§£ä»£ç¢¼é¢¨æ ¼å°è´æ··äº
- éè¤é è¼ªå – ä¸ç¥éå·²æå·¥å ·å½æ¸èéè¤å¯¦ä½
- å¼å ¥ bug – ä¸çè§£é輯æµç¨èå¼å ¥é¯èª¤
好èï¼
- çè§£ä¸ä¸æ – ç¥é代碼å¨åä»éº¼ãçºä»éº¼é樣å
- ä¿æä¸è´æ§ – ä¿®æ¹ç¬¦åç¾æé¢¨æ ¼åæ¨¡å¼
- é¿å éè¤ – ç¥éå¯ä»¥éç¨åªäºä»£ç¢¼
- æ£ç¢ºä½¿ç¨é¡å – ä½¿ç¨æ£ç¢ºç interface/type
- é«å質代碼 – ä¿®æ¹æ´æºç¢ºãæ´å®å ¨
ð¨ ç£ç£ç³»çµ±
å°æ¡å·²é
ç½® hooks ç£ç£ç³»çµ±ï¼è¦ settings.jsonï¼ï¼æå¨ Edit/Write åæª¢æ¥æ¯å¦å·² Readã
妿éåè¦åï¼æçå°ï¼
ð« [ç£ç£ç³»çµ±] Edit è¢«é»æ¢ï¼å¿
é å
Read è©²æªæ¡
é䏿¯å»ºè°ï¼èæ¯å¼·å¶è¦åã
ð 宿´æ¡ä¾ç ç©¶
è¦å°æ¡æ ¹ç®éç CLAUDE.md 第 “ð å¼·å¶é±è®è¦ç¯” ç« ç¯ã
ð¡ å¿«éæç¤º
ä¿®æ¹æªæ¡åçèªææª¢æ¥ï¼
- â ææè®ééåæªæ¡åï¼
- â æçè§£å®çææ import åï¼
- â æç¥éç¸éçé¡åå®ç¾©åï¼
- â æäºè§£å®å¦ä½èå ¶ä»æ¨¡çµäºååï¼
- â ææ¸ æ¥ç¾æçä»£ç¢¼é¢¨æ ¼åï¼
妿æä»»ä½ä¸åçæ¡æ¯ãå¦ãï¼å°±ä¸è¦éå§ Editï¼
ð åèè¦ç¯
- 宿´è¦ç¯:
CLAUDE.md(å°æ¡æ ¹ç®é) - ç£ç£ç³»çµ±:
.claude/settings.jsonhooks é ç½® - ç¨½æ ¸è
³æ¬:
scripts/ai-supervisor.sh
è¨ä½ï¼Read is not optional. Read is mandatory.