Files
market/skills/skill-creator/SKILL.zh-CN.md
Yige 0b9aa38699 fix(skills): 禁止自动注入完整技能内容 (#49)
## Summary

- 将 dashscope-image-gen、image-to-image、markdown、tech-diagram、xiaomi-tts
改为仅按需加载,并递增 patch 版本
- 在 Market validator 与 JSON Schema 中禁止 `disable-model-invocation: false`
- 将回归测试接入 `i18n Validate`,同步中英文技能编写规范

## Root cause and impact

这 5 个技能在首次引入时即声明 `disable-model-invocation: false`,导致完整技能正文进入普通请求的
system prompt。修改后市场技能只能声明 `true` 或省略该字段,完整内容仅在显式调用 Skill 工具后加载。

## Validation

- `uv run --quiet scripts/i18n/test_validate_i18n.py`
- `uv run --quiet scripts/i18n/validate-i18n.py`
- `uv run --quiet scripts/i18n/translate.py --check`
- `python3 -m json.tool
scripts/i18n/schema/skill-frontmatter.schema.json`
- `actionlint .github/workflows/i18n-validate.yml`
- `git diff --check`
2026-07-14 11:55:22 +08:00

12 KiB
Raw Blame History

skill-creator 技能

L0:一句话摘要

引导用户将需求、经验和工作流封装为结构化的 SKILL.md 技能包。

L1:概述与使用场景

能力描述

skill-creator 是一个元技能(Meta-Skill),赋予 Agent 创建和编辑技能的能力。技能是模块化、自包含的能力包,通过 SKILL.md 为 Agent 提供专业知识、工作流和工具集成——将 Agent 从通用助手转变为领域专家。

使用场景

  • 用户想把反复执行的工作流封装为可复用技能
  • 用户想创建新技能教会 Agent 新的能力
  • 用户想更新已有技能、优化其效果
  • 用户分享了参考资料,需要组织为结构化的技能包

核心价值

  • 沉淀经验:将个人知识和工作流固化为可复用的 Skill
  • 自我扩展:创建的技能让 Agent 能力持续增长
  • 规范化:生成符合标准的 SKILL.md,确保技能系统正确解析和分发

L2:详细规范

关于技能

技能是模块化、自包含的能力包,为 Agent 提供:

  1. 专业工作流 — 特定领域的多步骤流程
  2. 工具集成 — 处理特定文件格式或 API 的指南
  3. 领域知识 — 公司规范、业务逻辑、专业 Schema
  4. 捆绑资源 — 脚本、参考文档和资产文件

核心原则

简洁优先

上下文窗口是公共资源。技能与系统提示、对话历史、其他技能元数据和用户请求共享上下文窗口。

默认假设:AI 已经非常聪明。 只添加 AI 不知道的内容。对每条信息问自己:"AI 真的需要这个解释吗?" "这段话值得它的 Token 成本吗?"

优先使用简洁的例子而非冗长的解释。

设置适当的自由度

根据任务的脆弱性和可变性匹配指令的具体程度:

  • 高自由度(文本指引):多种方案都可行时,决策依赖上下文
  • 中自由度(伪代码或带参脚本):存在首选模式,允许一定变化
  • 低自由度(固定脚本,少量参数):操作脆弱易错,一致性至关重要

渐进式披露

技能使用三层加载系统高效管理上下文:

  1. 元数据(name + description) — 始终在上下文中(~100 词)
  2. SKILL.md body — 技能触发时加载(<5k 词)
  3. 捆绑资源 — Agent 按需加载(无限制,脚本可直接执行无需读入上下文)

技能结构

skill-name/
├── SKILL.md          (必须:技能定义文件)
├── scripts/          (可选:可执行脚本)
├── references/       (可选:参考文档)
└── assets/           (可选:输出用资源文件)

SKILL.md 格式

SKILL.md 由两部分组成:Frontmatter(YAML 元数据) 和 Body(Markdown 指令)。

Frontmatter 字段

必填:

字段 类型 说明
description string 技能用途描述。必须包含 "Use when" 触发提示——AI 据此判断何时使用该技能

推荐:

字段 类型 说明 默认值
name string 技能显示名称 目录名
version string 语义版本号(如 1.0.0) —
type enum procedural / conversational / meta —
risk_level enum low / medium / high —
status enum enabled / disabled enabled
tags string[] 标签列表 —
metadata object author、updated_at —

功能控制:

字段 类型 默认 说明
disable-model-invocation boolean true 必须为 true 或省略。禁止把完整 SKILL.md 自动注入 system prompt;Agent 必须显式调用 Skill 工具后才加载指令。
user-invocable boolean true false=不出现在命令补全,仅作为背景知识
allowed-tools string[] — 限制执行时可用的工具列表
requires object — 依赖声明:tools、optional_tools、connections

完整字段表(含市场发布、JSON 输出、fork 执行等高级字段)见 references/desirecore-format.md。

Claude Code 兼容说明:Claude Code 仅使用 name + description(+ 可选 license、compatibility)。这些字段在 DesireCore 中完全合法——DesireCore 格式是 Claude Code 的超集。

Body 结构

推荐使用 L0/L1/L2 分层:

# skill-id 技能

## L0:一句话摘要
用一句话描述这个技能做什么。

## L1:概述与使用场景
### 能力描述 / ### 使用场景 / ### 核心价值

## L2:详细规范
### 具体操作步骤 / ### 错误处理

分层加载机制:

  • L0(~50 字):快速理解技能做什么
  • L1(~300 字):判断是否适用于当前任务
  • L2(不限):完整的执行指南

分层不是强制的。如果技能内容简短(<100 行),可以不分层——解析器会以整段内容作为 fallback。Claude Code 的无分层格式在 DesireCore 中同样正常工作。

Bundled Resources

Scripts(scripts/)

可执行代码(Python/Bash 等),用于需要确定性可靠性或被反复编写的任务。

  • 何时使用:相同代码被反复编写,或需要确定性可靠性
  • 示例:scripts/rotate_pdf.py(PDF 旋转)、scripts/fill_form.py(表单填充)
  • 优势:Token 高效,确定性,可直接执行无需读入上下文
  • 注意:脚本可能仍需被 AI 读取以做环境适配
References(references/)

文档和参考资料,按需加载到上下文中。

  • 何时使用:AI 工作时需要参考的详细文档
  • 示例:API 文档、数据库 Schema、领域知识、公司政策
  • 最佳实践:大文件(>10k 词)在 SKILL.md 中提供 grep 搜索模式
  • 避免重复:信息只放 SKILL.md 或 references 中的一处
Assets(assets/)

不加载到上下文、而是用于输出的文件。

  • 何时使用:技能需要在最终输出中使用的文件
  • 示例:PPT 模板、HTML 骨架、logo 图片、字体文件
  • 优势:将输出资源与文档分离

不应包含的内容

技能应只包含 AI 执行任务所需的文件。不要创建:README.md、INSTALLATION_GUIDE.md、CHANGELOG.md 等辅助文档。

渐进式披露模式

保持 SKILL.md body 在 500 行以内。接近限制时拆分到 references。

模式 1:高层指南 + 参考文件

# PDF Processing

## Quick start
[核心代码示例]

## Advanced features
- **Form filling**: See [FORMS.md](FORMS.md)
- **API reference**: See [REFERENCE.md](REFERENCE.md)

模式 2:按领域组织

bigquery-skill/
├── SKILL.md (overview)
└── references/
    ├── finance.md
    ├── sales.md
    └── product.md

用户问销售指标时,AI 只读 sales.md。

模式 3:基本内容 + 条件高级内容

## Editing documents
For simple edits, modify the XML directly.
**For tracked changes**: See [REDLINING.md](REDLINING.md)

重要:避免深层嵌套引用——references 只从 SKILL.md 直接链接一层。长 reference 文件(>100 行)在顶部加目录。

创建流程

  1. 用具体例子理解技能需求
  2. 规划可复用资源(脚本、参考、资产)
  3. 初始化技能(运行 init_skill.py)
  4. 编辑技能(实现资源,编写 SKILL.md)
  5. 验证技能(运行 quick_validate.py)
  6. 安装技能
  7. 迭代优化

步骤 1:理解技能需求

跳过此步仅当技能的使用模式已经完全清晰。即使处理已有技能时,此步仍有价值。

通过具体例子理解技能将如何被使用。例如构建 image-editor 技能时:

  • "这个技能应支持哪些功能?编辑、旋转、其他?"
  • "能举几个使用场景吗?"
  • "什么操作应该触发这个技能?"

避免一次问太多问题——从最重要的开始,按需跟进。当对技能应支持的功能有清晰认知时,结束此步。

步骤 2:规划资源

分析每个例子:

  1. 考虑如何从零执行
  2. 识别哪些脚本、参考、资产在反复执行时有帮助

示例分析:

  • pdf-editor 处理"旋转 PDF"→ 每次都要写相同代码 → scripts/rotate_pdf.py
  • frontend-webapp-builder 处理"创建 todo app"→ 每次都要写样板代码 → assets/hello-world/
  • big-query 处理"今天多少用户登录"→ 每次都要查 Schema → references/schema.md

步骤 3:初始化

使用 init_skill.py 创建模板:

# DesireCore 完整格式(默认,推荐)
scripts/init_skill.py <skill-name> --path <output-directory>

# Claude Code 基础格式
scripts/init_skill.py <skill-name> --path <output-directory> --format basic

默认生成 DesireCore 格式(含完整 frontmatter + L0/L1/L2 结构)。--format basic 生成 Claude Code 兼容的最小格式。

初始化后,根据需要定制或删除生成的示例文件。

步骤 4:编辑技能

学习设计模式

根据技能需求查阅参考:

从资源开始

先实现步骤 2 识别的资源文件(scripts/、references/、assets/)。此步骤可能需要用户输入,如品牌资产需要用户提供 logo。

添加的脚本必须实际运行测试,确保无 bug 且输出符合预期。不需要的示例文件应删除。

编写 SKILL.md

Frontmatter 编写要点:

  • description 是最关键的字段——AI 据此判断何时触发技能
  • 在 description 中包含 "Use when" 触发提示和典型使用场景
  • 所有 "when to use" 信息放 description 中,不放 body 里(body 只在触发后加载)

Body 编写要点:

  • 始终使用祈使句/不定式形式
  • L0 不超过一句话
  • L1 用于判断适用性,不超过 300 字
  • L2 放完整的操作步骤、API 调用、错误处理

步骤 5:验证

scripts/quick_validate.py <path/to/skill-folder>

验证 SKILL.md 格式、frontmatter 字段合法性和目录结构。

步骤 6:安装

方式 A:通过 API 安装(推荐,需 Agent Service 运行中)

PORT=$(cat ${DESIRECORE_ROOT}/agent-service.port 2>/dev/null)

# 安装为全局技能(所有 Agent 可见)
curl -k -X POST "https://127.0.0.1:${PORT}/api/skills" \
  -H "Content-Type: application/json" \
  -d "{\"skillId\": \"<skill-name>\", \"content\": \"$(cat path/to/SKILL.md | jq -Rsa .)\"}"

# 安装为 Agent 级技能(仅指定 Agent 可见)
curl -k -X POST "https://127.0.0.1:${PORT}/api/agents/<agentId>/skills" \
  -H "Content-Type: application/json" \
  -d "{\"id\": \"<skill-name>\", \"fullContent\": \"$(cat path/to/SKILL.md | jq -Rsa .)\"}"

方式 B:文件系统直写

# 全局技能
cp -r path/to/skill-name ${DESIRECORE_ROOT}/skills/

# Agent 级技能
cp -r path/to/skill-name ${DESIRECORE_ROOT}/agents/<agentId>/skills/

方式 C:打包为 .skill 文件(Claude Code 兼容)

scripts/package_skill.py <path/to/skill-folder>

生成 skill-name.skill 文件(ZIP 格式),可在 Claude Code 中使用。

安装完成后,必须向用户报告:

  • 技能已安装到的完整路径
  • 安装的作用域(Global / Agent / Project)
  • 如何在后续对话中触发该技能

步骤 7:迭代

  1. 在真实任务中使用技能
  2. 观察不足或低效之处
  3. 确定 SKILL.md 或资源需要如何改进
  4. 实施修改并再次测试

作用域说明

技能存在三个作用域层级,按优先级从高到低:

优先级 作用域 路径 可见范围
最高 Project .claude/skills/ 当前项目所有 Agent
中 Agent ${DESIRECORE_ROOT}/agents/{agentId}/skills/ 仅该 Agent
最低 Global ${DESIRECORE_ROOT}/skills/ 所有 Agent

同名技能按优先级覆盖——高优先级的技能会遮蔽低优先级的同名技能。