Github 原文:shareAI-lab/learn-claude-code
在 Skill 介绍的部分,我们就介绍了渐进式披露,这里我们会详细的来讲讲。
问题
你的项目有一套 React 组件规范、一份 SQL 风格指南、一份 API 设计文档。你希望 Agent 自动遵守这些规范。最直接的想法,全塞进 system prompt:
SYSTEM = (
f"You are a coding agent. "
+ open("docs/react-style.md").read() # 2000 行
+ open("docs/sql-style.md").read() # 1500 行
+ open("docs/api-design.md").read() # 3000 行
)
6500 行 system prompt。Agent 每次调用 LLM 都带着这些文档——不管是在改 CSS 颜色还是修 SQL 查询。99% 的内容和当前任务无关,白白消耗 token。
解决方案
这里,保留之前的最小 hook 结构、todo_write 和子 Agent,本章重点转向新增的 load_skill 工具。启动时把技能目录注入 SYSTEM prompt,运行时多注册一个工具加载完整内容,用到才花 token。
简单来说,就是做成了 2 层,也就是之前渐进式披露的逻辑,也就是平时每一次都注入的只是 Skill 的名字和 Description,其余内容等到要用到在注入。
| 层 | 位置 | 时机 | 代价 |
|---|---|---|---|
| 1. 目录 | system prompt | 启动时注入(harness 扫描 skills/) | ~100 tokens/skill,每轮都带 |
| 2. 内容 | tool_result | Agent 调用 load_skill 时;SKILL.md 可指引后续的 read_file/bash 调用,用于按需访问额外资源 | ~2000 tokens/skill,按需 |
工作原理
之前Skill 技能介绍过,每个技能一个子目录,包含 SKILL.md 文件,并且说过一定会包含 name+Description,这里就来解释了。
启动时注入目录
harness 启动时调用 _scan_skills() 扫描 skills/ 目录,解析每个 SKILL.md 的 YAML frontmatter(name、description),存入 SKILL_REGISTRY 字典。list_skills() 从注册表生成目录,注入 SYSTEM prompt。Agent 每轮都能看到”我有哪些技能可用”,不花额外 API 调用。
载入 skill
Agent 决定”我需要 SQL 风格指南”,调用 load_skill("sql-style")。通过注册表查找,不走文件路径,没有路径遍历风险。SKILL.md 内容通过 tool_result 注入,并可通过现有的 file 和 bash 工具进一步访问引用的 references/、scripts/ 或 assets/。
总结
技能内容不是 system prompt 的一部分,它作为一次工具结果进入当前 messages。后续调用会随历史一起携带,直到上下文压缩、截断或会话结束。