codebase-understanding
npx skills add https://github.com/yulong-me/skills --skill codebase-understanding
Agent 安装分布
Skill 文档
Codebase Understanding
æ¦è¿°
æ¬æè½æä¾èªåºåä¸ç代ç åºåææ¹æ³ï¼éè¿ä¸ºæ¯ä¸ªç®å½çæ README.md ææ¡£ï¼å½¢ææ ç¶ç代ç çè§£ä½ç³»ã
æ ¸å¿ç¹æ§:
- èªåºåä¸: ä»å¶åç®å½å¼å§åæï¼éå±å䏿±æ»
- ä¸å¥è¯æè¿°: æ¯ä¸ªç±»ã彿°ç¨ä¸å¥è¯æ¦æ¬åè½
- ç¶ææä¹ å: æ¯ææç¹ç»ä¼ ï¼ä¸æåå¯ç»§ç»åæ
- å¢éæ´æ°: åªåæä¿®æ¹è¿çæä»¶ï¼æé«æç
使ç¨åºæ¯
1. çè§£æ°é¡¹ç®
ç¨æ·è¯·æ±ç¤ºä¾:
- “帮æçè§£è¿ä¸ªé¡¹ç®ç代ç ç»æ”
- “è¿ä¸ªä»£ç åºæ¯åä»ä¹çï¼æåªäºä¸»è¦æ¨¡åï¼”
- “æåæ¥æè¿ä¸ªé¡¹ç®ï¼éè¦äºè§£æ´ä½æ¶æ”
æä½æ¥éª¤:
- ä½¿ç¨ Glob å·¥å ·æ«ææºä»£ç ç®å½ç»æ
- åå§å
.analysis-state.jsonç¶ææä»¶ - ä»å¶åç®å½å¼å§åæå¹¶çæ README.md
- éå±åä¸çæç¶ç®å½ç README.md
- æåçææ ¹ç®å½çæºä»£ç æ¦è§ README.md
2. çæææ¯ææ¡£
ç¨æ·è¯·æ±ç¤ºä¾:
- “为è¿ä¸ªé¡¹ç®çæå®æ´çä»£ç ææ¡£”
- “éè¦ä¸ä»½ä»£ç åºçåèææ¡£”
- “çæ API ææ¡£åæ¶æè¯´æ”
æä½æ¥éª¤:
- æ£æ¥æ¯å¦å·²æåæç¶æï¼å¦ææåç»§ç»
- 宿ææç®å½ç README.md çæ
- 卿 ¹ç®å½çææ´ä½æ¶æææ¡£
- æä¾å ³é®æä»¶å彿°çç´¢å¼
3. åæåè½å®ç°
ç¨æ·è¯·æ±ç¤ºä¾:
- “è¿ä¸ªåè½å¨åªéå®ç°çï¼”
- “æ¥æ¾å¤çç¨æ·ç»å½çä»£ç ”
- “追踪订åå建ç宿´æµç¨”
æä½æ¥éª¤:
- ä½¿ç¨ Grep å·¥å ·æç´¢å ³é®è¯ï¼å¦ “login”, “authentication”ï¼
- 读åç¸å ³æä»¶ï¼çè§£åè½å®ç°
- è¿½è¸ªå½æ°è°ç¨é¾
- å¨å¯¹åºç®å½ç README.md 䏿 æ³¨å ³é®æµç¨
工使µç¨
é¶æ®µ 1: åå¤åæ«æ
# 1. è¯å«æºä»£ç ç®å½
src_dirs = ["src", "lib", "app", "server"]
# 2. æ«æç®å½æ ç»æ
ä½¿ç¨ Bash å·¥å
·: find src -type d | sort
# 3. åå§åæå è½½ç¶ææä»¶
妿 .analysis-state.json åå¨ â å è½½ç¶æ
妿ä¸åå¨ â å建æ°çç¶ææä»¶
ç¶ææä»¶ç»æ: è§ references/state-management.md
é¶æ®µ 2: åæå¶åç®å½
å¶åç®å½ = ä¸å å«åç®å½çç®å½ï¼åªææºä»£ç æä»¶ï¼
æ¥éª¤:
-
ååºç®å½ä¸æææä»¶
Glob: **/*.{js,ts,py,java,go,rs,cpp,c,h} -
对æ¯ä¸ªæä»¶æ§è¡åæ
- 读åæä»¶å
容:
Read(path/to/file) - è¯å«ç±»å®ä¹ã彿°å®ä¹
- æå彿°ç¾åï¼å½æ°åãåæ°ãè¿åç±»åï¼
- åæå½æ°ä½ï¼çè§£åè½
è¯¦ç»æ¹æ³: è§ references/file-analysis.md
- 读åæä»¶å
容:
-
çæä¸å¥è¯æè¿°
- 模æ¿:
[å¨è¯] + [对象] + [æ¹å¼] + [ç»æ] - 示ä¾:
éªè¯ç¨æ·é®ç®±åå¯ç å¹¶è¿åç¨æ·å¯¹è±¡
- 模æ¿:
-
çæ README.md
- ä½¿ç¨æ¨¡æ¿: assets/leaf-readme-template.md
- åå
¥æä»¶:
Write(path/to/README.md, content)
-
æ´æ°ç¶æ
{ "src/utils/auth": { "status": "completed", "readmeGenerated": true, "files": ["login.js", "register.js"], "fileHashes": { "login.js": "abc123", ... } } }
å¹¶è¡å¤ç: å¤ä¸ªå¶åç®å½å¯ä»¥å¹¶è¡åæï¼æé«æçã
é¶æ®µ 3: åæåæ¯ç®å½
忝ç®å½ = å å«åç®å½çç®å½
æ¥éª¤:
-
è¯»åææåç®å½ç README.md
for (subdir of subdirs) { readme = Read(subdir/README.md); æå"ç®å½æ¦è¿°"é¨å; } -
åæå½åç®å½çæä»¶ï¼å¦ææï¼
- åå¶åç®å½çæä»¶åææ¹æ³
-
çæ README.md
- ä½¿ç¨æ¨¡æ¿: assets/branch-readme-template.md
- å å«åç®å½æ¦è¿°æè¦
- å å«å½åç®å½æä»¶åæ
-
æ´æ°ç¶æ
{ "src/services": { "status": "completed", "subdirs": ["user", "order", "payment"], "completedSubdirs": ["user", "order", "payment"] } }
ä¾èµå ³ç³»: å¿ é¡»çå¾ ææåç®å½å®æåååæç¶ç®å½ã
é¶æ®µ 4: çææ ¹ç®å½ææ¡£
æ¥éª¤:
- æ¶éææä¸çº§ç®å½çæ¦è¿°
- åæææ¯æ
- 读å package.json / requirements.txt / pom.xml
- è¯å«ä¸»è¦ä¾èµåæ¡æ¶
- çææ¶æå¾
- è¯å«åå±ç»æ
- ç»å¶æ¨¡åå ³ç³»å¾
- çæ README.md
- ä½¿ç¨æ¨¡æ¿: assets/root-readme-template.md
ç¶æç®¡çåæç¹ç»ä¼
ç¶ææä»¶ä½ç½®
é¡¹ç®æ ¹ç®å½/.analysis-state.json
ç¶ææ£æ¥åæ¢å¤
å¼å§åæå:
if (exists('.analysis-state.json')) {
state = load('.analysis-state.json');
print("åç°å·²æåæç¶æ:");
print(`已宿: ${state.stats.analyzedDirectories}/${state.stats.totalDirectories}`);
print("ä»ä¸æ¬¡ä¸æå¤ç»§ç»...");
} else {
print("馿¬¡åæï¼åå§åç¶ææä»¶...");
state = init();
}
ç»§ç»ä¸æçåæ:
pending_dirs = state.get_pending_directories();
for (dir of pending_dirs) {
if (state.should_analyze(dir)) {
analyze_directory(dir);
}
}
å¢éæ´æ°çç¥
å½éæ°åææ¶ï¼
- è®¡ç®æä»¶ç MD5 åå¸
- ä¸ç¶ææä»¶ä¸ä¿åçåå¸å¯¹æ¯
- 妿åå¸ä¸å â æä»¶å·²ä¿®æ¹ï¼éæ°åæ
- 妿åå¸ç¸å â è·³è¿ï¼ä½¿ç¨å·²æç»æ
详ç»è¯´æ: è§ references/state-management.md
è¯è¨æ¯æ
JavaScript / TypeScript
è¯å«æ¨¡å¼:
export class UserService { }
export function createUser() { }
export const validate = () => { }
æå: ç±»åã彿°åãåæ°ãè¿åç±»åãasync æ è®°
Python
è¯å«æ¨¡å¼:
class UserService:
def create_user():
async def fetch_data():
æå: ç±»åã彿°åãåæ°ãè¿åç±»åãè£ é¥°å¨
Java
è¯å«æ¨¡å¼:
public class UserService { }
public void createUser() { }
æå: ç±»åãæ¹æ³åãåæ°ãè¿åç±»åãæ³¨è§£
Go
è¯å«æ¨¡å¼:
type UserService struct { }
func CreateUser() { }
func (s *UserService) Method() { }
æå: ç±»ååã彿°åãæ¹æ³åãåæ°ãè¿åç±»å
è¯¦ç»æ¹æ³: è§ references/file-analysis.md
彿°æè¿°è§è
ä¸å¥è¯æè¿°æ¨¡æ¿
| 彿°ç±»å | æ¨¡æ¿ | ç¤ºä¾ |
|---|---|---|
| æ°æ®å¤ç | [å¨è¯] + [对象] + [æ¹å¼] + [ç»æ] |
éªè¯ç¨æ·é®ç®±å¹¶è¿åéªè¯ç»æ |
| æ¥è¯¢è·å | ä» [æ°æ®æº] æ¥è¯¢ [æ¡ä»¶] |
仿°æ®åºè·åç¨æ·ä¿¡æ¯ |
| æä½æ§è¡ | [å¨è¯] + [对象] + [ç»æ] |
åééªè¯é®ä»¶å°ç¨æ·é®ç®± |
| å·¥å ·è¾ å© | [å¨è¯] + [对象] + [转æ¢] |
æ ¼å¼åæ¥æä¸ºæ¬å°åå符串 |
è´¨éæ å
â 好çæè¿°:
- éªè¯ç¨æ·ç»å½åè¯å¹¶è¿å JWT token
- 计ç®è´ç©è½¦ä¸ååçæ»ææ£éé¢
- ä» Redis è·åç¨æ·ä¼è¯ä¿¡æ¯
â ä¸å¥½çæè¿°:
- å¤çæ°æ®ï¼å¤ªæ¨¡ç³ï¼
- helper 彿°ï¼æ²¡æè¯´æåè½ï¼
- get, setï¼ç¼ºå°ä¸ä¸æï¼
è¾åºææ¡£ç»æ
åæå®æåï¼é¡¹ç®ä¸çæ¯ä¸ªç®å½é½æä¸ä¸ª README.mdï¼
project/
âââ README.md (æ ¹ç®å½æ¦è§)
âââ src/
â âââ README.md (src æ¦è¿°)
â âââ utils/
â â âââ README.md (utils ç®å½è¯´æ)
â â âââ auth/
â â â âââ README.md (auth 模å详ç»è¯´æ)
â â â âââ login.js
â â â âââ register.js
â â âââ date/
â â âââ README.md (date 模å详ç»è¯´æ)
â â âââ helpers.js
â âââ services/
â âââ README.md (services 说æ)
â âââ user/
â â âââ README.md (user æå¡è¯´æ)
â â âââ service.js
â âââ order/
â âââ README.md (order æå¡è¯´æ)
â âââ service.js
æ¯ä¸ª README.md å å«è¯¥å±çº§çç¸å ³ä¿¡æ¯ï¼å½¢æå®æ´çææ¡£æ ã
æä½³å®è·µ
1. å¹¶è¡å¤ç
- å¶åç®å½å¯ä»¥å¹¶è¡åæ
- ä½¿ç¨ Task å·¥å ·å¯å¨å¤ä¸ª Explore agent å¹¶è¡å·¥ä½
- ç¶ç®å½å¿ é¡»çå¾ åç®å½å®æ
2. è¿åº¦è¿½è¸ª
ä½¿ç¨ TodoWrite å·¥å ·å®æ¶æ´æ°è¿åº¦ï¼
TodoWrite([
{ content: "åæ src/utils/auth/", status: "in_progress" },
{ content: "åæ src/utils/date/", status: "pending" },
{ content: "çæ src/utils/ README.md", status: "pending" }
]);
3. é误å¤ç
éå°é误æ¶ï¼
- è®°å½é误å°ç¶ææä»¶
- æ è®°ç®å½ä¸º “failed”
- ç»§ç»å¤çå ¶ä»ç®å½
- æåæä¾é误æ¥å
4. æ§è½ä¼å
- ä½¿ç¨ Glob è䏿¯ find å½ä»¤æç´¢æä»¶
- æ¹é读åæä»¶åå° I/O æä½
- å¹¶è¡å¤çç¬ç«çç®å½
- ä½¿ç¨æä»¶åå¸é¿å éå¤åæ
5. è´¨éæ£æ¥
çæ README.md 忣æ¥ï¼
- â æææä»¶é½å·²åæ
- â ææç±»å彿°é½ææè¿°
- â æè¿°ç®æ´åç¡®
- â Markdown æ ¼å¼æ£ç¡®
æ§è¡ç¤ºä¾
ç¤ºä¾ 1: åæå°å项ç®
// 1. æ«æç®å½
dirs = Glob("src/**")
// ["src/utils", "src/services", "src/models"]
// 2. è¯å«å¶åç®å½
leaf_dirs = ["src/utils/auth", "src/utils/format", "src/services/user"]
// 3. å¹¶è¡åæå¶åç®å½
for (dir of leaf_dirs) {
analyze_leaf_directory(dir);
}
// 4. åæç¶ç®å½
analyze_branch_directory("src/utils");
analyze_branch_directory("src/services");
// 5. çææ ¹ç®å½
generate_root_readme("src");
ç¤ºä¾ 2: ç»§ç»ä¸æçåæ
// 1. å è½½ç¶æ
state = load_state(".analysis-state.json");
// 2. è·åå¾
å¤çç®å½
pending = state.get_pending_directories();
// ["src/services/order", "src/services/payment"]
// 3. ç»§ç»åæ
for (dir of pending) {
analyze_directory(dir);
}
// 4. 宿å©ä½ç¶ç®å½
if (all_subdirs_completed("src/services")) {
analyze_branch_directory("src/services");
}
常è§é®é¢
Q: åæä¸æäºæä¹åï¼
A: ç¶ææä»¶ä¼ä¿åææè¿åº¦ã䏿¬¡è¿è¡æ¶ä¼èªå¨ä»ä¸æ¬¡ä¸æå¤ç»§ç»ã
Q: 代ç ä¿®æ¹åéè¦éæ°åæåï¼
A: ç³»ç»ä¼æ£æµæä»¶åå¸ï¼åªåæä¿®æ¹è¿çæä»¶ï¼æªä¿®æ¹çæä»¶ä¼è·³è¿ã
Q: å¦ä½åªåæç¹å®ç®å½ï¼
A: å¯ä»¥å¨ç¶ææä»¶ä¸æ è®°å ¶ä»ç®å½ä¸º “skipped”ï¼æç´æ¥æå®è¦åæçç®å½è·¯å¾ã
Q: çæç README.md ä¼è¦çå·²ææä»¶åï¼
A: ä¼ã建议å°çæç README.md éå½åæå¤ä»½ï¼é¿å è¦çæå¨ç¼åçéè¦ææ¡£ã
èµæº
references/
- state-management.md: ç¶æç®¡çåæç¹ç»ä¼ ç详ç»å®ç°
- file-analysis.md: æä»¶åææ¹æ³åè¯è¨ç¹å®æ¨¡å¼
assets/
- leaf-readme-template.md: å¶åç®å½ README 模æ¿
- branch-readme-template.md: 忝ç®å½ README 模æ¿
- root-readme-template.md: æ ¹ç®å½ README 模æ¿