手写AI编码Agent生产级Skill模板:从GitHub爆火项目抄作业
周亦航 | 实战派,不画饼
今天GitHub Star榜第一的项目addyosmani/agent-skills,一天涨了6万多星。看起来很唬人,打开一看——其实就是一堆Markdown文件。但这堆Markdown,可能是2025年AI工程化最值得抄的作业。
先说我读完的印象:它不是教你如何写Agent,而是教你如何给Agent写专业级“技能卡”。每个Skill告诉你:在什么场景下,用什么样的约束和范例,让Coding Agent输出稳定的高质量代码。
我长期做自动化脚本和可复用能力模块,看到这个结构就觉得对味了。本文将带你从零写一个可用的代码审查Skill,并拆解背后的设计原则。读完你不仅能直接拿来用,还会知道如何为自己的业务场景定制Skill。
1. 这个Skill解决什么具体问题
多数人跟Coding Agent对话是这样的:
“Review this code.”
Agent会回一段不疼不痒的评论,可能说“考虑加个注释”“注意命名”。但如果你要上线一个微服务,这种反馈没有任何生产价值。
问题本质:Agent缺少两个东西——
- 职责边界:它不知道自己是以什么角色审查(安全工程师?架构师?代码规范机器人?)
- 检查清单:没有明确的强制项,它只凭印象输出,漏掉关键问题
Production-grade Skill就是给Agent预设这些边界和清单。一个Skill文件定义了:
- 触发条件(何时激活这个技能)
- 角色与责任(你是谁,必须关注什么)
- 检查项目(必须覆盖的维度)
- 输出格式(决定返回结构,便于后续处理)
当Agent被“挂载”了足够多的Skill,它就不再是那个对着通用问题胡扯的聊天机器人,而是一个能按规程办事的工程师。
2. Skill的触发条件和适用场景
触发条件:以GitHub PR场景为例,当一个新的Pull Request被创建或更新,Coding Agent自动触发review skill。
trigger:
type: github_pull_request
events:
- opened
- synchronize
适用场景:任何需要Agent稳定输出专业级工作的场合。比如:
- 代码合规审查(安全漏洞检测)
- 单元测试生成(指定覆盖率要求)
- 文档同步(检测代码与注释是否一致)
- 性能预检(识别潜在慢查询、未缓存点)
不适用场景:创意思考、模糊需求。Skill的特点是严格约束,不适合需要发散的任务。
3. 完整Skill结构(SKILL.md示例)
下面是一个可直接复用的code-review.skill.md模板。注意它包含了YAML元数据和Markdown指令。
---
name: code-review
version: 1.0
description: Production-grade code review against team standards
trigger:
type: command
pattern: /review
role: senior code reviewer
priority: high
---
# Code Review Skill
You are a senior code reviewer with 10+ years in production systems.
Your job is to find bugs, security issues, and maintainability problems.
## Mandatory checks (in order)
### 1. Security
- [ ] SQL injection (parameterized query used?)
- [ ] XSS (any user input not escaped?)
- [ ] Hardcoded secrets
- [ ] Unsafe deserialization
### 2. Correctness
- [ ] Off-by-one errors
- [ ] Unhandled edge cases (empty list, null, division by zero)
- [ ] Race conditions (shared mutable state without lock)
### 3. Maintainability
- [ ] Functions > 50 lines? -> suggest refactor
- [ ] Deeply nested conditionals (>3 levels) -> flag
- [ ] Duplicated logic (copy-paste) -> extract method
### 4. Performance
- [ ] Unnecessary loops or DB queries in loop
- [ ] Large objects in memory without cleanup
## Output Format
Return a JSON array of issues. Each issue object:
```json
{
"severity": "critical|major|minor",
"file": "path/to/file",
"line": 42,
"category": "security|correctness|maintainability|performance",
"description": "Short description",
"suggestion": "How to fix"
}
If no issues, return empty array.
Examples
Example 1: SQL injection
# Input
query = f"SELECT * FROM users WHERE id = {user_input}"
# Expected output
{
"severity": "critical",
"file": "app/db.py",
"line": 15,
"category": "security",
"description": "SQL injection via f-string concatenation of user input",
"suggestion": "Use parameterized query: cursor.execute('SELECT * FROM users WHERE id = %s', (user_input,))"
}
Example 2: Off-by-one
# Input
for i in range(1, len(arr)):
print(arr[i])
# Missing index 0
# Expected output
{
"severity": "major",
"file": "app/utils.py",
"line": 5,
"category": "correctness",
"description": "Loop starts at 1 instead of 0, missing first element",
"suggestion": "Change to range(len(arr))"
}
**为什么这样写有效?**
- **清单化**:Agent面对“检验这些点”比“检查一下代码”更容易执行。每个小方框迫使它逐项检查,不会遗忘。
- **输出格式化**:要求JSON,之后可以自动解析写入数据库、发通知,而不是一段散文。这是生产级和玩具级的分水岭。
- **示例提前**:给Agent看两个期望输出,它就知道输出的样式和详细程度。相当于“这是满分答案,照此回答”。
---
## 4. 实际案例演示
### 差Prompt vs 好Prompt对比
**差Prompt**(最常见写法):
Review this Python code for the /users endpoint.
Agent回复示例(我实际测试过):
> “整体代码结构清晰,建议考虑异常处理。另外注意一下变量命名风格。”
——毫无建设性,无法融入CI流程。
**好Prompt**(使用上面的Skill模板):
/review
File: users.py
@app.get("/users/{id}")
def get_user(id):
query = f"SELECT * FROM users WHERE id = {id}"
results = db.execute(query)
return results[0] if results else None
Agent使用Skill后输出:
```json
[
{
"severity": "critical",
"file": "users.py",
"line": 3,
"category": "security",
"description": "SQL injection via f-string concatenation of user input 'id'",
"suggestion": "Replace with parameterized query: db.execute('SELECT * FROM users WHERE id = %s', (id,))"
},
{
"severity": "major",
"file": "users.py",
"line": 5,
"category": "correctness",
"description": "If `results` is empty list, accessing index 0 raises IndexError",
"suggestion": "Check if results is not empty before indexing"
}
]
效果差距:差Prompt输出不可用;好Prompt输出的JSON可以直接插入PR评论或保存为issue。
原理:差Prompt缺乏角色、清单、示例,Agent只能依赖通用的“代码审查”知识,而这些知识通常来自训练数据中的教程级答案,缺少生产警惕性。好Prompt把隐式的专业准则显式化为清单和示例,Agent的注意力被强制引导到关键点上。清单中的“SQL注入”让Agent必须思考参数化,而示例给出了具体格式,减少了输出空间方差。
5. 复用和组合技巧
5.1 参数化Skill
不要让Skill硬编码所有细节。用YAML front matter的params字段让用户按需调整:
params:
- name: strictness
type: enum
values: [low, medium, high]
default: medium
- name: focus
type: string
default: "security"
在指令中引用:严格模式($strictness)时,所有major以上必须修复。
5.2 组合多个Skill成一个工作流
假设你有三个Skill:code-review, unit-test-gen, doc-check。你可以写一个Meta-Skillpre-merge-check,按顺序调用它们:
name: pre-merge-check
steps:
- skill: code-review
params:
strictness: high
- skill: unit-test-gen
params:
coverage: 80
- skill: doc-check
Agent会依次执行,且后一个可以引用前一个的输出。这种组合降低了单个Skill的复杂度,同时保证了整体流程的可编排性。
5.3 变体示例
变体1:安全检查Skill(专注OWASP Top 10)
name: security-audit
checklist:
- [ ] OWASP A1 (Injection)
- [ ] OWASP A2 (Broken Authentication)
- [ ] OWASP A3 (Sensitive Data Exposure)
...
变体2:重构建议Skill(专注代码简化)
name: refactor-suggest
rules:
- max_lines: 30
- max_params: 4
- duplication_threshold: 10 lines
变体3:测试生成Skill(要求输出标准pytest用例)
输出格式限定为pytest函数,并指定覆盖率。
我的观点
addyosmani/agent-skills火得有理。它做的不是发明新东西,而是把过去几年我们写Prompt的技巧提炼成了一套可共享的文件格式。它的核心价值是“知识显式化”——你把一个高级工程师头脑里模糊的检查项写成了机器可读的清单和模板。
但注意,这只是第一步。真正的生产级Agent需要两个东西:
- Skill的版本管理和测试——评审Skill本身正确吗?需要写单元测试验证输出JSON格式。
- Skill的自动选择——Agent不能每次把所有Skill都跑一遍,需要通过触发条件按场景激活。
好在,这个项目的结构让你可以很容易地扩展。我建议你立刻动手:
- 下载或fork这个仓库
- 针对你日常最头疼的review任务,写一个3~5个检查项的Skill
- 把它挂载到你的CI流水线中(GitHub Actions触发Agent运行)
你会立刻发现,Agent的输出质量从“小学生作文”变成了“实习生干活”。这,就是生产级Skill的价值。