设计 Skill 系统,这 3 个坑我替你踩过了
设计 Skill ç³»ç»ï¼è¿ 3 ä¸ªåææ¿ä½ 踩è¿äº
AIå¼åå°å 2026-08-21 14 é 读8åéåè¨
Skill æ¯ä»ä¹ï¼è¯´ç½äºå°±æ¯ä¸ä¸ªæè½å ï¼æ ¸å¿æ¯ä¸ä¸ª SKILL.md æä»¶ãAgent å¹²æ´»çæ¶åï¼ä¼æ ¹æ®ä»»å¡éè¦æéå 载对åºç Skillï¼æ¯å¦è¦å UI 设计ã代ç 审æ¥ï¼å°±å è½½ç¸åºçé£ä¸ä¸ªã
å¬èµ·æ¥æ¯ä¸æ¯æºç®åï¼ä½ å¯è½å·²ç»æå¼ AI ç¼ç¨å·¥å ·ï¼åå¤ç´æ¥ä¸¢ä¸å¥"帮æå®ç° Skill æºå¶"è¿å»ã
çä¸ä¸ ï¼å 嫿¥ã Skill å¬çç®åï¼ä½ä½ ççæ³æ¸ æ¥æä¹å¨ Agent ç³»ç»éå®ç°å®äºåï¼å çè¿å 个é®é¢ä½ è½ä¸è½ç䏿¥ï¼
- SKILL.md éé¤äº name å descriptionï¼è¿æä»ä¹å¤´é¨å ä¿¡æ¯ï¼
- Agent è¦ç¨æä¸ª Skill çæ¶åï¼å¦ä½å®ä½ä»¥åå¦ä½è°ç¨ Skill çï¼
- Skill å»éæ¯å¦æèèè¿ï¼
妿è¿å 个é®é¢ä½ è¿æ²¡æ³æç½ï¼é£æ¥ä¸æ¥æå°±ä¸ä¸ªä¸ä¸ªæï¼ææ´å¥ Skill æºå¶çè®¾è®¡è®²æ¸ æ¥ã
ä¸ãè®¤è¯ SKILL.mdï¼å¤´é¨å ä¿¡æ¯
请å
æ¥æ¶ Claude Code 宿¹ç»çæ åSkill头忮µï¼code.claude.com/docs/zh-CN/â¦
è¿éææå 个å
¸åç讲ï¼
| åæ®µ | ä½ç¨ |
|---|---|
name | å±ç°åç§° |
description | ç»æ¨¡åçï¼å³å®ä½æ¶ç¨ |
allowed-tools | å·¥å ·ç½åå |
disallowed-tools | å·¥å ·é»åå |
model | é宿¨¡å |
metadata | èªå®ä¹é®å¼ |
agent | æå®æ§è¡ç¨ç subagent |
context | æ§è¡æ¶æ¯å¦å¼è¾ç¬ç«åä¸ä¸æ |
-
å ¶ä¸
nameådescriptionå³å®äº Agent ä»ä¹æ¶åè°ç¨å®ã -
allowed-toolså¯è½å¾å¤äººä¼ç解为åªå 许使ç¨ä»ä¹å·¥å ·ï¼å®é 䏿¯èµäº Agent æ§è¡è¿äºå·¥å ·çæéï¼æ éä½ åç¯çç¹åæã -
disallowed-tools忝å颿æï¼ç¡¬æ§ç¦æ¢æäºå·¥å ·/å½ä»¤ï¼å³ä½¿æ¨¡åæ³è°ä¹ä¼è¢«ç³»ç»æ¦æªã
è¿éæä¸ªåï¼æ¤æ¬¡ç¦ç¨çå·¥å ·ï¼éè¦å¨ä¸ä¸ä¸ªååï¼turnï¼æ¢å¤ï¼å¦åè¿äºå·¥å ·ä¼å¨è¿ä¸ªä¼è¯éä¸ç´è¢«ç¦ç¨ï¼å½±ååç»æä½ãã
ï¼turn æ¯ä»ä¹ï¼åé¢æç« ä¼ä¸é¨è®²ï¼è¿éå æè¿ä¸ªçè§£ï¼turn å°±æ¯ä¸æ¬¡ä¼è¯ååãï¼
[第 1 åå] ä½ åæ¶æ¯ â æ¨¡åè°ç¨æ Skill â Skill è¿å
¥ active
â disallowed-tools éçå·¥å
·è¢«ä»å¯ç¨å·¥å
·æ± éç§»é¤
â è¿ä¸ååéï¼æ¨¡åæ ¹æ¬"çä¸å°" Write / Editï¼æ³è°é½è°ä¸äº
[第 2 åå] ä½ åä¸ä¸æ¡æ¶æ¯ â éå¶æ¸
é¤ â Write / Edit æ¢å¤å¯ç¨
-
disallowed-toolsåallowed-tools䏿 ·ï¼é½æ¯ä¸´æ¶ä½ç¨åãåªå¨è°ç¨ Skill çé£ä¸ªåå颿¹å -
model忝å¯ä»¥æå®è¿ä¸ª Skill åªå¨ç¹å®æ¨¡åä¸å¯ç¨ï¼å«ç模åå è½½ä¸å°ãå ¸åç¨æ³æä¸¤ç§ï¼æä¸ª Skill ä¾èµé¿ä¸ä¸ææå¤ææ¨çï¼å°æ¨¡åæä¸ä½ï¼å°±éå®å®åªç¨å¤§æ¨¡åï¼å å¾è·å´©ï¼åè¿æ¥ï¼ç®åç Skill ä¹å¯ä»¥éå®ç¨å°æ¨¡åï¼çé±ã -
contextåagent忝é åç¨çï¼contextå³å®è¿ä¸ª Skill æ¯å¨ä¸»å¯¹è¯éè·ï¼è¿æ¯å¼è¾ä¸ä¸ªç¬ç«åä¸ä¸æåç¬è·ï¼agentå³å®ç¨åªä¸ªå Agent æ¥æ§è¡ãå ¸ååºæ¯æ¯ï¼æä¸ª Skill è¿ç¨å¾èââ读å å个æä»¶ãè·ä¸å å½ä»¤ââä½ä½ åªå ³å¿æç»ç»æãè¿æ¶è®¾context: forkï¼è®©å®è·å¨ç¬ç«ä¸ä¸æéã䏿±¡æä¸»å¯¹è¯ï¼åæå®ä¸ä¸ªå Agent å»å¹²è¿ç¥¨éæ´»ã -
metadataåæ¯ç¨æ¥å¡ä»»æèªå®ä¹é®å¼çå°æ¹ï¼æ¨¡åä¸è¬ä¸è¯»å®ãé常æ¯ç»å¢éç管çãå®¡è®¡ãææ¬æ ¸ç®ç¨çââæ¯å¦è®°ownerãtagsãcost-centerï¼Skill 管ç平尿«ç®å½æ¶å¯ä»¥æè¿äºå段åç±»ç»è®¡ãå®ä¸å½±å Agent æä¹è·ï¼åªå½±åä½ æä¹ç®¡ã
Skillæ¡ä¾
ç®ååºæ¯ï¼åæ¶ä¹æ¯å¤§å¤æ°Skillç头é¨å ä¿¡æ¯
---
name: frontend-ui-engineering
description: æå»ºç产级åè´¨çç¨æ·çé¢ãå¨æå»ºæä¿®æ¹é¢åç¨æ·çç颿¶ä½¿ç¨ãå¨å建ç»ä»¶ãå®ç°å¸å±ã管çç¶æï¼æéè¦è¾åºçèµ·æ¥è¾¾å°ç产级åè´¨èéâAI çææâæ¶ä½¿ç¨ã
---
夿ä¸ç¹çï¼
---
name: code-review
description: å½ç¨æ·è¦æ±å®¡æ¥ä»£ç ãæ£æ¥ PRãææ¥æ¾æ½å¨ bug æ¶ä½¿ç¨ã
allowed-tools:
- Read
- Grep
- Bash(git diff:*)
model: claude-sonnet-4-5
disable-model-invocation: false
license: MIT
version: 1.2.0
metadata:
scope: project
agents: [backend-bot, reviewer-bot]
---
ï¼ç¤ºä¾éç licenseãdisable-model-invocationãversion å±äºå®æ¹æ åéçå
¶ä»å段ï¼åºç¡çå¯ä»¥å
ä¸å¤çãï¼
ç»è®ºï¼å¦æä½ å®ç°çæ¯åºç¡ Skill ç³»ç»ï¼åªå¤ç name å description å°±å¤äºï¼åç»è¦æ©å±ï¼ååºäºä¸é¢è¿äºå段å¾ä¸å ã
äºãæ·±å ¥äºè§£ Skill ä¸ Agent ç交äº
 1. Agent å¦ä½ è°ç¨ Skill
Agentæ¯æä¹è°ç¨ Skillç ? ç®åæä¸¤ç§ä¸»æµçåæ³ï¼
- åç¬ä¸ºSkill设计ä¸ä¸ªå·¥å
·ï¼Agent éè¿
skill_nameå è½½ Skill
SKILL_TOOL = {
"name": "skill",
"description": "æ name å è½½ä¸ä¸ªå·²æ³¨åç Skillï¼è¿åå®ç宿´æä»¤ã",
"parameters": {
"skill_name": {
"type": "string",
"description": "è¦å è½½ç Skill åç§°",
"required": True,
},
},
}
def execute_skill_tool(skill_name: str) -> str:
skill = find_skill_by_name(skill_name) # 卿³¨åè¡¨éæ name æ¾
if not skill:
return f"æªæ¾å° Skill: {skill_name}"
body = load_body(skill["path"]) # æ£æ
apply_permissions(skill["meta"]) # åºç¨ allowed/disallowed-tools
# è¿åä¸ä»¶å¥ï¼æ£æä½ä¸º tool result 注å
¥ä¸ä¸æ
return {
"activation": f"<command-name>{skill_name}</command-name>", # æ¿æ´»æ è®°
"base_dir": skill["base_dir"], # æ ¹ç®å½ï¼æ£æéçç¸å¯¹è·¯å¾é å®
"body": body, # æ£ææä»¤
}
注æè¿ä¸ªè¿åå¼ä¸åªæ¯ Skill.md æä»¶éé¢çå 容ï¼èæ¯ä¸æ ·ä¸è¥¿ï¼
- activationï¼æ¿æ´»æ è®°ï¼ ï¼
<command-name>{skill_name}</command-name>ãè¿æ¯ç»ç³»ç»ççââ表示"è¿ä¸ª Skill 已被è°ç¨"ï¼ç¨æ¥åå»éåç¶æè¿½è¸ªï¼ä¸æä½è§£éï¼ï¼ä¹æ¹ä¾¿å端å±ç¤ºè°ç¨äºä»¶ã - base_dirï¼æ ¹ç®å½ï¼ ï¼Skill æå¨çç®å½ã
- bodyï¼æ£æï¼ ï¼SKILL.md æ£æå 容ã
- éè¿ ReadFile å·¥å ·æ ¹æ®è·¯å¾è¯»å SKILL.md æ£æ
READ_FILE_TOOL = {
"name": "read_file",
"description": "æè·¯å¾è¯»åæä»¶å
容ã",
"parameters": {
"path": {
"type": "string",
"description": "æä»¶è·¯å¾",
"required": True,
},
},
}
def execute_read_file_tool(path: str) -> str:
return Path(path).read_text(encoding="utf-8")
SKILL_TOOLè½æå ä¿¡æ¯å段é½å©ç¨èµ·æ¥ââç»ç²åº¦æéãæ§è¡ä¸ä¸æãæ¿æ´»æ è®°ï¼éå夿 Skill ç³»ç»ï¼ReadFileåªè½è¯»å ¨æï¼ç®åï¼å¤åæç¨
顺带补å ä¸ä¸ªå°ç¥è¯ï¼Skill çç»æä¸åªæ SKILL.md è¿ä¸ä¸ªæä»¶ãé¤äº SKILL.mdï¼è¿å¯ä»¥å¸¦ç¥è¯ææ¡£ã坿§è¡èæ¬ãéæèµæºçï¼
{skill_name}/
âââ SKILL.md # å¿
å¡«ï¼å
¥å£ï¼YAML frontmatter + Markdown æä»¤ï¼
âââ scripts/ # å¯éï¼å¯æ§è¡èæ¬ï¼Python / Bashï¼
âââ references/ # å¯éï¼é¿ææ¡£ãè§èã示ä¾
âââ assets/ # å¯éï¼æ¨¡æ¿ã徿 ãåä½çéæèµæº
æä»¥è°ç¨Skillçæ¬è´¨å ¶å®æ¯å·¥å ·è°ç¨ï¼ä½¿ç¨ è¯»å·¥å · 读SKILL.md æè å ¶ä»ç¥è¯æä»¶,ä½¿ç¨ Bash å·¥å ·æ§è¡èæ¬ã
ä¸è¿å¨Codex䏿忝åç°å ¶å é¨ä½¿ç¨ PowerShell ç cat å½ä»¤è·åSKILL.mdã
Claude Code å°±ååä½¿ç¨ SKILL_TOOL 宿Skillçå è½½
 2. Agent å¦ä½ å®ä½ Skill
ç¬¬ä¸æ¥ç³»ç»é¦å æ«ä¸éæå®ç®å½ï¼æ¾å°ææ skillæä»¶å¤¹ä¸çSKILL.mdï¼åªè¯»å¤´é¨ç name å descriptionï¼æ¶è¿æ³¨å表ä¸
def register_skills(skill_dir: str) -> list[dict]:
skills = []
for path in Path(skill_dir).rglob("SKILL.md"):
meta = parse_frontmatter(path) # åªè¯»å¤´é¨ name å description
skills.append({
"name": meta["name"],
"description": meta["description"],
"path": str(path),
})
return skills
æ¥çæè¿äºä¿¡æ¯æ³¨å ¥ç³»ç»æç¤ºè¯ã两ç§å·¥å ·å¯¹åºçæ³¨å ¥å 容ä¸ä¸æ ·ï¼
- ç¨ SKILL_TOOL çæ¹å¼ï¼åªæ³¨å ¥ name å description
- ç¨ ReadFile çæ¹å¼ï¼é¤äº name å descriptionï¼è¿è¦æ SKILL.md çè·¯å¾ä¹æ³¨å ¥ï¼è®©æ¨¡åç¥éå»åªè¯»
Skill å¨ä¸ä¸æéçæ¾ç¤ºå¤§æ¦é¿è¿æ ·ï¼
<available_skills>
<skill>
<name>pdf</name>
<description>Comprehensive PDF manipulation toolkit for extracting text and tables, merging/splitting documents, and handling forms.</description>
<path>/absolute/path/to/pdf/SKILL.md</path>
</skill>
</available_skills>
ï¼<path> æ¯ç» ReadFile æ¹å¼å®ä½æä»¶ç¨çï¼å¦ææ¯ Skill å·¥å
·æ¹å¼ï¼è·¯å¾ç卿³¨å表éï¼ä¸æ´é²ç»æ¨¡åãï¼
注æï¼è¿éåªæ¾äº name å descriptionï¼æ²¡æ¾æ£æãè¿æ¯æ´ä¸ª Skill ç³»ç»éæå ³é®çä¸ä¸ªè®¾è®¡ï¼æ³¨åè¦è½»ã 妿è¿ä¸æ¥å°±ææ£æå ¨å¡è¿å»ï¼åé¢ç"å¹é "å"å è½½"就没æä¹äºï¼ä¸ä¸æä¹ä¼è¢«æ å ³å å®¹å æ»¡ã
ä¸ãSkill çæ¿æ´»æ è®°ï¼å»éä¸ç¶æè¿½è¸ª
å»éï¼å«æåä¸ä¸ª Skill éå¤å è½½
䏿¬¡ä»»å¡éï¼æ¨¡åå¯è½å夿³ç¨åä¸ä¸ª Skillãæ¯å¦ç¨æ·è¿ç»é®ä¸¤è½®"å帮æå®¡æ¥ä¸ä¸ä»£ç "ï¼æ¨¡åå¯è½ä¸¤æ¬¡é½æ³è° code-reviewã
å¦ææ²¡æå»éï¼code-review çæ£æä¼è¢«æ³¨å
¥ä¸¤æ¬¡ï¼ç½ç½æµªè´¹ tokenï¼ä¸ä¸æéè¿å¤äºä»½éå¤å
容ã
ææ¿æ´»æ è®° + å»éï¼ç³»ç»å°±è½å¤æï¼
code-reviewå·²ç»æ¿æ´»è¿äºï¼è¿æ¬¡ä¸é夿³¨å ¥ï¼ç´æ¥å¤ç¨ã
ä¸å¥è¯æ»ç»å°±æ¯ï¼å»é = 鲿¢åä¸ä¸ª Skill çæ£æè¢«åå¤å¡è¿ä¸ä¸æã
ç¶æè¿½è¸ªï¼è®°ä½"ç°å¨åªäº Skill æ¯æ¿æ´»ç"
ç³»ç»éè¦ç»´æ¤ä¸ä¸ª"å½åæ¿æ´»ä¸ç Skill å表"ï¼å 为好å ä»¶äºé½é å®ï¼
- æéï¼Skill æ¿æ´»æé´ï¼å®ç allowed/disallowed-tools çæï¼ä¸æ¦éåºæ¿æ´»ï¼å°±è¦ææéæ¶åæ¥ãç³»ç»å¾ç¥é"ç°å¨è¯¥æ¶è°çæé"ã
- å端å±ç¤ºï¼çé¢ä¸æ¾ç¤º"å½åæ£å¨æ§è¡ code-review"ï¼ä¹æ¯ä»è¿ä¸ªå表读çã
- çå½å¨æï¼è®°å½ Skill ä»ä¹æ¶åè¿ activeãä»ä¹æ¶åéåºã
ä¸å¥è¯æ»ç»å°±æ¯ï¼ç¶æè¿½è¸ª = ç³»ç»ç»´æ¤ä¸å¼ "è°æ£å¨æ¿æ´»"ç表ï¼ç¨æ¥ç®¡æéçæåæ¢å¤ã
æ¾å°ä½ ç Skill ç³»ç»å®ç°éï¼å¤§æ¦å°±æ¯ï¼
active_skills = set() # å½åæ¿æ´»ç Skill éå
def activate(skill_name):
if skill_name in active_skills:
return "å·²æ¿æ´»ï¼è·³è¿" # å»é
active_skills.add(skill_name) # ç¶æè¿½è¸ª
apply_permissions(skill)
def deactivate(skill_name):
active_skills.discard(skill_name)
restore_permissions()
active_skills è¿ä¸ªéåï¼åæ¶å¹²äº"å»é"å"ç¶æè¿½è¸ª"两件äºââ夿éå¤é å®ï¼ç¥é该æ¢å¤è°ä¹é å®ã
Aitishiku.com