Skip to content

Commit 4417c8f

Browse files
gxklclaude
andauthored
feat(skills): add ajv-validate and background-task skills with eval framework (#5834)
## Summary - Add `ajv-validate.md` reference for egg-controller skill (Ajv + TypeBox parameter validation) - Add `background-task.md` reference for egg-core skill (BackgroundTaskHelper async tasks) - Extract skills guidelines from root CLAUDE.md to `packages/skills/CLAUDE.md` - Add eval cases and document evaluation workflow ## Changes ### New skill content - **`egg-controller/references/ajv-validate.md`** — Common errors table, TypeBox schema definition, built-in formats, transform preprocessing - **`egg-core/references/background-task.md`** — Common errors table (setTimeout vs run()), timeout config, error handling, lifecycle explanation - **`egg-core/SKILL.md`** — Added async task decision tree (BackgroundTask vs EventBus vs Schedule), import path guidance - **`egg-controller/SKILL.md`** — Added ajv validation quick reference - **`egg/SKILL.md`** — Added BackgroundTaskHelper routing keywords ### Eval cases - 7 ajv-validate cases (evals-egg-controller.json id 19-25) - 8 background-task cases (evals-egg-core.json id 19-26) - Eval workflow documented in `packages/skills/CLAUDE.md` with prompt templates and environment constraints ### CLAUDE.md refactoring - Moved skills writing conventions and eval workflow to `packages/skills/CLAUDE.md` (loaded on demand by Claude Code) - Root CLAUDE.md reduced by ~160 lines ## Eval results (iteration-4, 59 cases) | Category | Skill wins | Site-docs wins | Ties | |----------|-----------|----------------|------| | egg-core (26) | 15 | 2 | 9 | | egg-controller (25) | 14 | 3 | 8 | | routing (8) | 6 | 0 | 2 | | **Total** | **35 (59%)** | **5 (8%)** | **19 (32%)** | With-skill pass rate: **100%** (59/59 based on expected_output) ## Test plan - [ ] Verify skill content accuracy with framework maintainers - [ ] Review eval prompt templates for fairness - [ ] Confirm packages/skills/CLAUDE.md loads correctly in subdirectory context 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **Documentation** * Added comprehensive guides for API parameter validation using Ajv and TypeBox schemas * Introduced background task execution patterns for post-request asynchronous operations * Enhanced Egg Skills architecture documentation with expanded decision guides * Expanded evaluation examples demonstrating validation and async workflow best practices <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 29eac24 commit 4417c8f

File tree

9 files changed

+658
-120
lines changed

9 files changed

+658
-120
lines changed

CLAUDE.md

Lines changed: 7 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -451,111 +451,13 @@ Key points:
451451

452452
### Skills Package Structure
453453

454-
The `packages/skills/` directory contains AI agent skills — pure markdown documentation that guides AI assistants when working with the Egg framework. Skills are published as the `@eggjs/skills` npm package containing only `.md` files.
455-
456-
> **Skill 编写基础知识**:SKILL.md 格式、frontmatter 规范、目录结构、progressive disclosure、写作风格等通用知识请使用 `/ant-skill-creator` skill 获取指导。以下仅记录 Egg 项目特有的约定。
457-
458-
#### Egg Skills 架构
459-
460-
Skills 采用分层路由模式:
461-
462-
- **入口 skill** (`egg/`) — 分析用户意图,通过关键词匹配和决策逻辑路由到专业 skill
463-
- **专业 skills** — 提供特定领域的深度指导:
464-
- `egg-core/` — 核心概念:模块、依赖注入、生命周期、AccessLevel
465-
- `controller/` — 实现指导:HTTPController、MCPController、Schedule
466-
467-
#### Egg Skill Frontmatter 约定
468-
469-
- **`name`**:入口 skill 使用 `egg`,专业 skill 以 `egg-` 为前缀(如 `egg-controller``egg-core`
470-
- **`allowed-tools`**:统一使用 `Read`(纯文档指导型,不修改文件)
471-
- **`description`**
472-
- 中文:以"本技能用于..."开头,包含触发关键词
473-
- 英文:以"Use when..."开头,包含触发关键词
474-
475-
#### 专业 Skill 编写规范
476-
477-
**入口 Skill(如 `egg/`)编写要点:**
478-
479-
对应 ant-skill-creator 的 **Workflow-Based** 模式。
480-
481-
1. 决策框架包含明确步骤:识别意图 → 检查模糊意图 → 协议/用例特定指示
482-
2. 为每个专业 skill 列出中英文触发关键词
483-
3. 冲突解决规则:明确意图模糊时的优先级(如"基础优先"——核心概念优先于控制器实现)
484-
4. 示例分析:多个完整示例,格式为 用户查询 → 分析 → 决策 → 响应策略
485-
5. 快速参考表:用户意图 → 关键词 → 推荐 skill 映射
486-
6. 交叉引用话术:回答完主问题后,附"如需了解 X,请参阅 `@eggjs/skills-xxx`"
487-
488-
**专业 Skill 两种组织模式:**
489-
490-
| 模式 | ant-skill-creator 对应 | 适用场景 | SKILL.md 内容 | references/ 用途 |
491-
| ------------------------------ | ---------------------- | ------------------ | ----------------------- | ------------------ |
492-
| **概念型**(如 `egg-core/`| Reference-Based | 概念解释、架构理解 | 自包含的深度内容 | 更深入的专题文档 |
493-
| **索引型**(如 `controller/`| Workflow-Based | 多种实现方式的选择 | 精简的决策树 + 快速参考 | 每种实现的详细指南 |
494-
495-
**概念型 Skill 内容结构:**
496-
497-
1. 概述(一段话说明覆盖范围)
498-
2. 按概念分块,每个概念包含:定义 → 使用场景 → 装饰器/API 模式 → 代码示例
499-
3. 重要约束(反模式、限制)
500-
4. 快速决策指南表(场景 → 推荐方式)
501-
5. 最佳实践
502-
6. 参考资料链接
503-
504-
**索引型 Skill 内容结构:**
505-
506-
1. 决策树(根据需求选择实现方式)
507-
2. 每种类型的快速参考(装饰器、参数、特点)
508-
3. 最佳实践
509-
4. 参考资料链接
510-
511-
#### Reference 文档编写要点
512-
513-
Reference 文档(`references/*.md`**不需要 YAML frontmatter**,只有 `SKILL.md` 才需要。
514-
515-
**核心原则:Skill 不是文档的重新排版,而是填补"文档到生产代码"之间的缝隙。**
516-
517-
Skill 的价值 = 文档 + 实践经验 - 重复内容。如果内容和 `site/docs/` 中的文档高度重复,说明 skill 写得不对。
518-
519-
| 内容类型 | 该放文档(site/docs/) | 该放 Skill(packages/skills/) |
520-
| ------------------- | ---------------------- | ------------------------------ |
521-
| API 签名、参数说明 | Yes | No(引用文档即可) |
522-
| 易错点 / 常见错误 | 部分 | **Yes(重点)** |
523-
| 完整端到端模式 | No | **Yes** |
524-
| 跨模块集成知识 | 散落各处 | **Yes(聚合)** |
525-
| 文件放置 / 命名约定 | 部分 | **Yes** |
526-
| 场景化决策树 | No | **Yes** |
527-
528-
**编写 Reference 文档的具体步骤:**
529-
530-
1. **先读对应的文档**(如 `site/docs/zh-CN/basics/mcpcontroller.md`),理解已有内容
531-
2. **向维护者提问,收集文档未覆盖的知识**,重点关注:
532-
- 导入路径、命名约定等易错点(AI 最容易犯的错)
533-
- 文件应该放在哪个目录?命名规则是什么?
534-
- 和其他模块(Module、Service、DI)的集成关系
535-
- 哪些配置参数实际开发中需要关心,哪些用默认值即可
536-
- 哪些是内部扩展机制不需要暴露给应用开发者
537-
3. **以常见错误表开头** — 把 AI 最容易写错的地方放在最醒目的位置(如错误的导入路径、错误的 API 用法)
538-
4. **文件约定** — 目录结构、命名规则、配置文件位置,这些文档里通常不会详细说明
539-
5. **场景化决策树** — 从用户意图出发("让 AI 查数据"),而非从 API 出发("@MCPTool")
540-
6. **端到端完整示例** — 从配置文件到控制器到 Service 到测试,展示所有相关文件和它们的关系
541-
7. **精简的装饰器对照表放末尾** — 仅作为速查,不展开 API 详解
542-
543-
#### 添加新 Skill
544-
545-
1.`packages/skills/` 下创建目录:`packages/skills/<skill-name>/`
546-
2. 创建 `SKILL.md`(格式规范参考 `/ant-skill-creator`,frontmatter 遵循上述 Egg 约定)
547-
3. 创建 `references/` 目录(初始为空时放置 `.gitkeep`
548-
4. 按需在 `references/*.md` 中添加详细参考文档
549-
5. 更新入口 skill(`egg/SKILL.md`)的路由逻辑以包含新 skill
550-
6. 如果 skill 涉及 controller 类型,同时更新 `controller/SKILL.md` 决策树
551-
552-
#### 添加新 Reference 文档
553-
554-
1. 在 skill 的 `references/` 目录中创建 `.md` 文件
555-
2. 遵循命名规范(kebab-case,描述性命名:`http-controller.md``mcp-controller.md`
556-
3. 包含完整的代码示例和决策树
557-
4. 更新父级 `SKILL.md` 引用新文档
558-
5. 如果 `references/` 中已有文件,移除 `.gitkeep`
454+
- **`packages/skills/`** - AI agent skills for Egg framework (@eggjs/skills)
455+
- 纯 markdown 文档包,指导 AI 助手使用 Egg 框架
456+
- `egg/` — 入口 skill,路由到专业 skill
457+
- `egg-core/` — 核心概念:模块、依赖注入、生命周期
458+
- `egg-controller/` — 控制器:HTTPController、MCPController、Schedule、Ajv 校验
459+
- `eval/` — 评测用例和输出
460+
- Skill 编写规范、评测流程等详见 `packages/skills/CLAUDE.md`
559461

560462
### Tool Packages Structure
561463

packages/skills/CLAUDE.md

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
# Skills 编写与评测规范
2+
3+
`packages/skills/` 目录包含 AI agent skills — 纯 markdown 文档,指导 AI 助手使用 Egg 框架。以 `@eggjs/skills` npm 包发布,仅含 `.md` 文件。
4+
5+
> **Skill 编写基础知识**:SKILL.md 格式、frontmatter 规范、目录结构、progressive disclosure、写作风格等通用知识请使用 `/ant-skill-creator` skill 获取指导。以下仅记录 Egg 项目特有的约定。
6+
7+
## Egg Skills 架构
8+
9+
Skills 采用分层路由模式:
10+
11+
- **入口 skill** (`egg/`) — 分析用户意图,通过关键词匹配和决策逻辑路由到专业 skill
12+
- **专业 skills** — 提供特定领域的深度指导:
13+
- `egg-core/` — 核心概念:模块、依赖注入、生命周期、AccessLevel
14+
- `controller/` — 实现指导:HTTPController、MCPController、Schedule
15+
16+
## Egg Skill Frontmatter 约定
17+
18+
- **`name`**:入口 skill 使用 `egg`,专业 skill 以 `egg-` 为前缀(如 `egg-controller``egg-core`
19+
- **`allowed-tools`**:统一使用 `Read`(纯文档指导型,不修改文件)
20+
- **`description`**
21+
- 中文:以"本技能用于..."开头,包含触发关键词
22+
- 英文:以"Use when..."开头,包含触发关键词
23+
24+
## 专业 Skill 编写规范
25+
26+
**入口 Skill(如 `egg/`)编写要点:**
27+
28+
对应 ant-skill-creator 的 **Workflow-Based** 模式。
29+
30+
1. 决策框架包含明确步骤:识别意图 → 检查模糊意图 → 协议/用例特定指示
31+
2. 为每个专业 skill 列出中英文触发关键词
32+
3. 冲突解决规则:明确意图模糊时的优先级(如"基础优先"——核心概念优先于控制器实现)
33+
4. 示例分析:多个完整示例,格式为 用户查询 → 分析 → 决策 → 响应策略
34+
5. 快速参考表:用户意图 → 关键词 → 推荐 skill 映射
35+
6. 交叉引用话术:回答完主问题后,附"如需了解 X,请参阅 `@eggjs/skills-xxx`"
36+
37+
**专业 Skill 两种组织模式:**
38+
39+
| 模式 | ant-skill-creator 对应 | 适用场景 | SKILL.md 内容 | references/ 用途 |
40+
| ------------------------------ | ---------------------- | ------------------ | ----------------------- | ------------------ |
41+
| **概念型**(如 `egg-core/`| Reference-Based | 概念解释、架构理解 | 自包含的深度内容 | 更深入的专题文档 |
42+
| **索引型**(如 `controller/`| Workflow-Based | 多种实现方式的选择 | 精简的决策树 + 快速参考 | 每种实现的详细指南 |
43+
44+
**概念型 Skill 内容结构:**
45+
46+
1. 概述(一段话说明覆盖范围)
47+
2. 按概念分块,每个概念包含:定义 → 使用场景 → 装饰器/API 模式 → 代码示例
48+
3. 重要约束(反模式、限制)
49+
4. 快速决策指南表(场景 → 推荐方式)
50+
5. 最佳实践
51+
6. 参考资料链接
52+
53+
**索引型 Skill 内容结构:**
54+
55+
1. 决策树(根据需求选择实现方式)
56+
2. 每种类型的快速参考(装饰器、参数、特点)
57+
3. 最佳实践
58+
4. 参考资料链接
59+
60+
## Reference 文档编写要点
61+
62+
Reference 文档(`references/*.md`**不需要 YAML frontmatter**,只有 `SKILL.md` 才需要。
63+
64+
**核心原则:Skill 不是文档的重新排版,而是填补"文档到生产代码"之间的缝隙。**
65+
66+
Skill 的价值 = 文档 + 实践经验 - 重复内容。如果内容和 `site/docs/` 中的文档高度重复,说明 skill 写得不对。
67+
68+
| 内容类型 | 该放文档(site/docs/) | 该放 Skill(packages/skills/) |
69+
| ------------------- | ---------------------- | ------------------------------ |
70+
| API 签名、参数说明 | Yes | No(引用文档即可) |
71+
| 易错点 / 常见错误 | 部分 | **Yes(重点)** |
72+
| 完整端到端模式 | No | **Yes** |
73+
| 跨模块集成知识 | 散落各处 | **Yes(聚合)** |
74+
| 文件放置 / 命名约定 | 部分 | **Yes** |
75+
| 场景化决策树 | No | **Yes** |
76+
77+
**编写 Reference 文档的具体步骤:**
78+
79+
1. **先读对应的文档**(如 `site/docs/zh-CN/basics/mcpcontroller.md`),理解已有内容
80+
2. **向维护者提问,收集文档未覆盖的知识**,重点关注:
81+
- 导入路径、命名约定等易错点(AI 最容易犯的错)
82+
- 文件应该放在哪个目录?命名规则是什么?
83+
- 和其他模块(Module、Service、DI)的集成关系
84+
- 哪些配置参数实际开发中需要关心,哪些用默认值即可
85+
- 哪些是内部扩展机制不需要暴露给应用开发者
86+
3. **以常见错误表开头** — 把 AI 最容易写错的地方放在最醒目的位置(如错误的导入路径、错误的 API 用法)
87+
4. **文件约定** — 目录结构、命名规则、配置文件位置,这些文档里通常不会详细说明
88+
5. **场景化决策树** — 从用户意图出发("让 AI 查数据"),而非从 API 出发("@MCPTool")
89+
6. **端到端完整示例** — 从配置文件到控制器到 Service 到测试,展示所有相关文件和它们的关系
90+
7. **精简的装饰器对照表放末尾** — 仅作为速查,不展开 API 详解
91+
92+
## 添加新 Skill
93+
94+
1.`packages/skills/` 下创建目录:`packages/skills/<skill-name>/`
95+
2. 创建 `SKILL.md`(格式规范参考 `/ant-skill-creator`,frontmatter 遵循上述 Egg 约定)
96+
3. 创建 `references/` 目录(初始为空时放置 `.gitkeep`
97+
4. 按需在 `references/*.md` 中添加详细参考文档
98+
5. 更新入口 skill(`egg/SKILL.md`)的路由逻辑以包含新 skill
99+
6. 如果 skill 涉及 controller 类型,同时更新 `controller/SKILL.md` 决策树
100+
101+
## 添加新 Reference 文档
102+
103+
1. 在 skill 的 `references/` 目录中创建 `.md` 文件
104+
2. 遵循命名规范(kebab-case,描述性命名:`http-controller.md``mcp-controller.md`
105+
3. 包含完整的代码示例和决策树
106+
4. 更新父级 `SKILL.md` 引用新文档
107+
5. 如果 `references/` 中已有文件,移除 `.gitkeep`
108+
109+
## Skill 评测
110+
111+
评测用例存放在 `packages/skills/eval/` 目录下,用于验证 AI 使用 skill 后的回答质量。
112+
113+
**评测文件结构:**
114+
115+
```
116+
packages/skills/eval/
117+
├── evals-egg-core.json # egg-core skill 评测用例
118+
├── evals-egg-controller.json # egg-controller skill 评测用例
119+
├── evals-routing.json # 入口路由评测用例
120+
├── .gitignore # 忽略 workspace/ 和 egg-workspace/
121+
└── egg-workspace/ # 评测输出(gitignored),由 /skill-creator 管理
122+
└── iteration-N/
123+
├── REPORT.md # 对比评分报告
124+
├── GRADING.md # with-skill 通过率报告
125+
└── {prefix}-{id}/ # 每个用例一个目录
126+
├── eval_metadata.json
127+
├── with_skill/outputs/
128+
└── without_skill/outputs/
129+
```
130+
131+
**评测用例 JSON 格式:**
132+
133+
```json
134+
{
135+
"skill_name": "egg-controller",
136+
"description": "控制器评测:覆盖 http-controller、mcp-controller、schedule、ajv-validate",
137+
"evals": [
138+
{
139+
"id": 1,
140+
"prompt": "用户的任务描述",
141+
"expected_output": "期望输出的关键要素描述",
142+
"files": [
143+
{ "path": "相对路径", "content": "文件内容(可选,用于提供上下文或有 bug 的代码)" }
144+
]
145+
}
146+
]
147+
}
148+
```
149+
150+
**评测流程:**
151+
152+
使用 `/skill-creator` skill 运行评测和生成结果展示。评测流程概述:
153+
154+
1. **编写评测用例** — 在对应的 `evals-*.json` 中添加用例
155+
2. **运行评测** — 通过 `/skill-creator` 为每个用例启动两个并行 subagent(with-skill 和 site-docs),使用下方 prompt 模板
156+
3. **评分和展示**`/skill-creator` 负责评分、生成对比报告、启动可视化 viewer 供人工 review
157+
4. **改进 skill** — 根据评分结果和人工 feedback 改进 skill 内容,开启新的 iteration
158+
159+
**评测对比的两组环境:**
160+
161+
每个评测用例需要在两种环境下分别运行,对比 skill 是否有效。Prompt 中不应包含任何流程指引(如"先判断使用哪个 skill"),只提供参考资料和访问约束,让 AI 自然行动。
162+
163+
| 环境 | system prompt | 可访问范围(prompt 约束) |
164+
| -------------- | ------------------------------------------------------------------------------------- | -------------------------- |
165+
| **with-skill** | `egg/SKILL.md`(入口 skill)的完整内容 |`packages/skills/` 目录 |
166+
| **site-docs** | 角色声明 + `site/docs/` 的完整文件目录列表(通过 `find site/docs -name '*.md'` 生成) |`site/docs/` 目录 |
167+
168+
**Prompt 模板:**
169+
170+
with-skill 环境:
171+
172+
```
173+
你是 EGG 框架开发专家。你只能通过 Read 工具读取 packages/skills/ 目录下的文件,不能访问 site/docs/ 或项目源码。
174+
175+
{egg/SKILL.md 的完整内容}
176+
177+
---
178+
{eval prompt}
179+
```
180+
181+
site-docs 环境:
182+
183+
```
184+
你是 EGG 框架开发专家。你只能通过 Read 工具读取 site/docs/ 目录下的文件,不能访问 packages/skills/ 或项目源码。项目文档目录如下:
185+
186+
{完整的 site/docs/ 文件列表,通过 find site/docs -name '*.md' | sort 生成}
187+
188+
---
189+
{eval prompt}
190+
```
191+
192+
两组 prompt 的差异仅在于参考资料不同,不包含额外的流程提示。subagent 均具备 Read 工具权限。访问范围通过 prompt 约束(软限制,非技术硬限制)。
193+
194+
两组使用相同的 eval prompt,对比输出质量差异。如果 with-skill 没有明显优于 site-docs,说明 skill 内容需要改进——要么缺少文档未覆盖的知识,要么存在与文档的不必要重复。
195+
196+
**输出目录:**
197+
198+
评测结果保存到 `egg-workspace/iteration-N/` 目录下,具体目录结构由 `/skill-creator` 管理。
199+
200+
**评测用例设计原则:**
201+
202+
每个 reference 文档至少覆盖 5 个以上评测用例,需覆盖以下场景类型:
203+
204+
| 场景类型 | 说明 | 示例 |
205+
| -------------------- | --------------------------------------- | -------------------------------------------------------- |
206+
| **泛化需求描述** | 不了解框架术语,用口语化描述需求 | "帮我加个参数校验" |
207+
| **精确需求描述** | 明确指定技术方案和约束 | "用 TypeBox 定义 Schema,email 用 format: email" |
208+
| **使用咨询** | 询问用法、区别、选型 | "Optional 和 Null 有什么区别" |
209+
| **问题排查** | 提供有 bug 的代码(附 files),要求诊断 | "校验跑不起来,帮我看看" |
210+
| **新项目代码生成** | 在全新项目中从零开始生成功能代码 | "帮我写一个创建订单的接口,需要做参数校验" |
211+
| **存量项目代码生成** | 在包含老 egg 代码的项目中生成或迁移代码 | "帮我把这个老的 egg controller 改成 HTTPController 写法" |
212+
| **不常用 API** | 需要查外部文档链接才能回答 | "用 Tuple 定义元组校验" |

0 commit comments

Comments
 (0)