第 5 章 / 共 10 章
技能加料:动态上下文、附属文件与渐进式披露
5.1 用反引号把实时数据灌进提示
到现在,release-notes 还得靠你把改动贴给它。但发布说明的原料明明就在 git 里。技能支持一种动态上下文注入:在正文里用 !`命令`,Claude Code 会先把这条命令跑掉,把输出替换到那一行,然后模型才读到已经带着数据的正文。
给正文顶部加一行:
## 这次的改动
!`git log $(git describe --tags --abbrev=0)..HEAD --oneline`
## 分类规则
...(照旧)
现在调用 /release-notes,模型看到的正文里已经嵌好了”上个 tag 到现在的所有提交”。它不再需要你贴,也不用自己去猜——数据在它读到指令的同一刻就已经在手边了。
要让这条命令免于每次授权,把它加进 allowed-tools:
---
description: ...
allowed-tools: Bash(git log *), Bash(git describe *)
---
5.2 附属文件:模板、清单、示例
技能是一个目录,不只是一个文件——这是它比命令强的地方。你可以把模板、清单、示例放进去,让正文去引用:
~/.claude/skills/release-notes/
├── SKILL.md
├── template.md # 发布说明的固定骨架
└── references/
└── style.md # 团队的用词与语气规范
然后在 SKILL.md 正文里指路,而不是把内容全抄进来:
按 `template.md` 的骨架输出。
用词和语气拿不准时,读 `references/style.md`。
模型需要时才会去读 template.md 和 style.md。这一步是理解下一节的关键。
5.3 渐进式披露:什么时候才付上下文的钱
把前面几层串起来,你会看到技能真正的设计哲学——渐进式披露:上下文是稀缺的,所以每一层只在被需要时才加载,越晚用到的东西越晚付钱。
description(最先,最省):一直待在技能清单里,只有一行,供模型选择;- 正文(被调用时):技能被挂上时才整段进入上下文;
- 附属文件(最晚,最贵才付):只有模型真的去读
template.md时,它才进上下文。

description 那一行永远在,厚重的 references/ 只在真正用到的那次才付钱。把长规范拆进附属文件,就是把成本从”每次会话”挪到了”真正用到的那一次”。5.4 带一个脚本,并让它免提示运行
有些活儿让模型现写代码既慢又不稳,不如直接带一个写好的脚本。技能目录里可以放脚本,并且有个巧妙的机制让它免提示运行:${CLAUDE_SKILL_DIR} 会被替换成这个技能的实际安装路径,你在正文和 allowed-tools 里用同一个变量,两处就能精确对上:
---
description: ...
allowed-tools: Bash(${CLAUDE_SKILL_DIR}/scripts/changelog.sh *)
---
运行 `${CLAUDE_SKILL_DIR}/scripts/changelog.sh` 生成原始条目,再按规则润色。
因为 allowed-tools 里的规则和正文里让模型跑的命令是同一条,权限精确匹配,脚本就能不弹授权直接跑。这比”让模型每次即兴写一段 shell”既快又可控。
你现在的成果:release-notes 已经是一个完整的技能了——会自动触发、能灌实时数据、带模板和脚本、还几乎不占常驻上下文。下一章我们换一件产物:当一件调查工作大到会拖垮主对话时,怎么给它单开一个上下文。