告别“复读机“AI:用Agent Skills打造你的专属编程副驾

一、为什么你的AI编程助手总是"差点意思"?

1.1 程序员的三大崩溃瞬间

场景A:第108次解释规范

"用Vue3+TS写个表单组件" ------ AI生成了一段Options API的代码。你纠正:"我们要用Composition API"。第二次:"记得用<script setup>语法"。第三次:"Props要用泛型定义"。第四次:"记得加emits声明"... 20分钟后,你终于得到了想要的代码,但Token已经烧了5000+。

场景B:知识断层

团队刚制定了新的《微服务接口设计规范》,AI却还在用旧的REST风格。你尝试把规范文档贴进Prompt,结果超过上下文限制。切成几段喂给AI?它"健忘"地只记住了最后一段。

场景C:跨工具灾难

在Cursor里调教好的代码审查规则,到了Claude Code里要重新写。GitHub Copilot又有一套自己的玩法。团队3个人用3个工具,维护着3套互相冲突的"最佳实践"。

1.2 根本矛盾:通用AI vs 专业场景

问题维度 具体表现 传统解决方案 缺陷
上下文爆炸 长规范文档挤占Token 精简Prompt 信息丢失,AI变"笨"
知识孤岛 团队经验无法沉淀 写Wiki/文档 AI读不懂,人也要翻查
重复调教 每次对话从零开始 保存Prompt模板 缺乏动态性,无法执行
工具割裂 不同AI工具各玩各的 每个平台单独配置 维护成本指数级增长

2026年的破局点:OpenAI Skills和Anthropic的Agent Skills横空出世,配合MCP协议,正在重构AI编程的工作范式。


二、核心概念拆解:Skills、MCP、Rules到底啥关系?

2.1 一张图看懂技术栈

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    你的自然语言指令                           │
│         "帮我按照团队规范审查这个PR的代码"                      │
└──────────────────────┬──────────────────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  Layer 3: Agent Skills (技能层)                              │
│  • 解决"怎么做"的问题 - 代码审查流程、文档生成步骤               │
│  • 渐进式加载:需要时才读取详细规范                            │
│  • 载体:SKILL.md + scripts/ + references/                   │
└──────────────────────┬──────────────────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  Layer 2: MCP (Model Context Protocol)                       │
│  • 解决"能做什么"的问题 - 连接GitHub、数据库、文件系统           │
│  • 标准化接口:一次实现,处处使用                              │
│  • 载体:MCP Server (Python/TypeScript)                      │
└──────────────────────┬──────────────────────────────────────┘
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  Layer 1: Rules (规则层)                                     │
│  • 解决"行为约束"的问题 - 代码风格、回复语言、技术栈偏好          │
│  • 始终生效:每次对话都携带                                    │
│  • 载体:.cursorrules / system prompt                        │
└─────────────────────────────────────────────────────────────┘

2.2 关键对比:别再傻傻分不清

维度 Cursor Rules Agent Skills MCP Server
核心定位 身份卡(你是谁) 工作手册(怎么做) 工具箱(用什么)
加载时机 始终全量加载 按需渐进加载 调用时连接
Token消耗 高(持续占用) 低(触发时加载) 中(仅工具描述)
可执行性 ❌ 纯文本指令 ✅ 可含脚本 ✅ 独立进程
跨平台 ❌ 仅Cursor ✅ 开放标准 ✅ 开放标准
适用内容 简短通用规范 复杂专业流程 外部系统对接

一句话记忆法

  • Rules = 员工守则(贴在墙上,天天看)

  • Skills = 操作手册(放在书架,用时取)

  • MCP = 外接设备(USB-C接口,即插即用)


三、实战:从零搭建你的第一个Agent Skill

3.1 环境准备

支持Skills的主流工具(2026年2月更新):

  • Claude Code (Anthropic官方,原生支持)

  • Cursor (v0.45+,实验性支持)

  • OpenAI Codex CLI (官方支持)

  • Windsurf (通过配置支持)

  • VS Code + Cline插件 (社区支持)

本文以Claude Code为例,其他工具原理相通。

3.2 实战目标:构建"Spring Boot API开发助手" Skill

我们要做一个能自动完成以下工作的Skill:

  1. 根据需求生成符合阿里巴巴Java开发规范的Controller

  2. 自动添加Swagger注解和统一返回格式

  3. 生成配套的Service接口和Mapper

  4. 自动创建数据库表结构(通过MCP调用MySQL)

3.3 目录结构设计

复制代码
mkdir -p ~/.claude/skills/spring-boot-api-assistant/{scripts,references,assets}
cd ~/.claude/skills/spring-boot-api-assistant
tree

预期结构:

复制代码
spring-boot-api-assistant/
├── SKILL.md                 # 核心:技能定义和指令
├── scripts/
│   ├── generate-controller.py   # 生成Controller代码
│   ├── check-style.py           # 代码规范检查
│   └── init-db.sh               # 数据库初始化
├── references/
│   ├── alibaba-java-guide.md    # 阿里巴巴Java规范(节选)
│   ├── api-template.md          # API文档模板
│   └── common-response.md       # 统一返回格式定义
└── assets/
    └── controller-template.java # Controller代码模板

3.4 编写SKILL.md(核心文件)

Markdown

复制代码
---
name: spring-boot-api-assistant
description: 当用户需要创建Spring Boot REST API、生成Controller/Service/Mapper代码、或初始化数据库表结构时调用。支持阿里巴巴Java开发规范、自动生成Swagger文档、统一返回格式。
version: 1.0.0
author: YourName
tags: [java, spring-boot, api, mybatis, code-generation]
---

# Spring Boot API开发助手

## 触发条件
用户输入包含以下关键词时应激活本技能:
- "创建API"、"生成接口"、"写个Controller"
- "Spring Boot CRUD"、"REST API"
- "初始化数据库表"、"生成Mapper"
- "按照阿里规范"、"符合Java开发手册"

## 执行流程(必须严格遵守)

### Phase 1: 需求澄清(不可跳过)
1. 询问用户实体名称(如:User、Order)
2. 询问字段列表(格式:字段名:类型:描述,如"username:String:用户名")
3. 确认是否需要:分页查询、权限控制、乐观锁
4. 确认数据库类型(MySQL/PostgreSQL,默认MySQL)

### Phase 2: 代码生成
按以下顺序生成文件,每生成一个文件后向用户确认:

1. **Entity** (`src/main/java/com/example/entity/{Entity}.java`)
   - 必须包含:@Data、@TableName、@TableId(type = IdType.AUTO)
   - 必须包含:create_time、update_time、deleted字段(逻辑删除)
   - 字段必须加@ApiModelProperty注解

2. **Mapper** (`src/main/java/com/example/mapper/{Entity}Mapper.java`)
   - 继承BaseMapper
   - 添加@Mapper注解

3. **Service接口** (`src/main/java/com/example/service/{Entity}Service.java`)
   - 继承IService
   - 定义业务方法,禁止暴露底层CRUD

4. **Service实现** (`src/main/java/com/example/service/impl/{Entity}ServiceImpl.java`)
   - 继承ServiceImpl
   - 注入Mapper,禁止直接使用Mapper,必须通过Service层

5. **Controller** (`src/main/java/com/example/controller/{Entity}Controller.java`)
   - 必须使用@RestController和@RequestMapping("/api/v1/{entity}s")
   - 必须使用@Tag(name = "{实体}管理")
   - 所有方法必须返回Result<T>统一格式
   - 必须包含:分页查询、详情、创建、更新、删除接口

### Phase 3: 规范检查(自动执行)
调用scripts/check-style.py检查:
- 类名是否符合UpperCamelCase
- 方法名是否符合lowerCamelCase
- 常量是否使用UPPER_SNAKE_CASE
- 是否包含必要的注释

### Phase 4: 数据库初始化(可选)
如果用户需要,调用scripts/init-db.sh生成SQL:
- 表名使用下划线命名(如user_info)
- 必须包含:id(主键)、create_time、update_time、deleted(tinyint)
- 添加索引:create_time、update_time

## 代码规范(强制执行)

### 阿里巴巴Java开发规范(核心条款)
1. 【强制】POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误
2. 【强制】禁止在POJO类中同时存在对应属性xxx的isXxx()和getXxx()方法
3. 【强制】Service层和DAO层方法命名规范:
   - 获取单个对象:getXxx
   - 获取多个对象:listXxx
   - 获取统计值:countXxx
   - 插入:saveXxx
   - 删除:removeXxx
   - 修改:updateXxx
4. 【强制】Controller层必须做参数校验(@Valid),禁止在Service层重复校验

### 统一返回格式
```java
@Data
public class Result<T> {
    private Integer code;      // 200成功,其他失败
    private String message;    // 提示信息
    private T data;           // 数据
    private Long timestamp;   // 时间戳
}

工具使用

  • 使用read_file读取references/下的规范文档

  • 使用write_file生成代码文件

  • 使用execute_bash运行scripts/下的脚本

  • 使用MCP工具mysql执行数据库操作(如已配置)

禁止事项

  • ❌ 禁止生成@Controller(必须用@RestController)

  • ❌ 禁止在Controller中直接调用Mapper

  • ❌ 禁止使用Date类型(必须使用LocalDateTime)

  • ❌ 禁止返回裸对象(必须包装为Result)

    3.5 编写辅助脚本

    scripts/generate-controller.py(Python代码生成器):

    python 复制代码
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Spring Boot Controller代码生成器
    符合阿里巴巴Java开发规范
    """
    
    import sys
    import re
    from datetime import datetime
    from pathlib import Path
    
    def to_camel_case(snake_str):
        """下划线转驼峰"""
        components = snake_str.split('_')
        return components[0] + ''.join(x.title() for x in components[1:])
    
    def to_upper_camel_case(snake_str):
        """下划线转大驼峰"""
        return ''.join(x.title() for x in snake_str.split('_'))
    
    def generate_controller(entity_name, fields, package="com.example"):
        """
        生成Controller代码
        :param entity_name: 实体名(如:UserInfo)
        :param fields: 字段列表,格式:[{"name": "username", "type": "String", "desc": "用户名"}]
        :param package: 包名
        """
        
        entity_lower = entity_name[0].lower() + entity_name[1:]
        entity_snake = re.sub(r'(?<!^)(?=[A-Z])', '_', entity_name).lower()
        
        # 生成字段列表用于Swagger注解示例
        field_examples = []
        for f in fields[:3]:  # 只取前3个作为示例
            field_examples.append(f'     *   "{f["name"]}": "示例{f["desc"]}"')
        
        template = f'''package {package}.controller;
    
    import io.swagger.v3.oas.annotations.Operation;
    import io.swagger.v3.oas.annotations.Parameter;
    import io.swagger.v3.oas.annotations.tags.Tag;
    import lombok.RequiredArgsConstructor;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.*;
    
    import javax.validation.Valid;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import java.util.List;
    
    import {package}.common.Result;
    import {package}.entity.{entity_name};
    import {package}.service.{entity_name}Service;
    
    /**
     * {entity_name}管理接口
     * 生成时间:{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
     * 符合阿里巴巴Java开发规范
     */
    @Tag(name = "{entity_name}管理")
    @RestController
    @RequestMapping("/api/v1/{entity_snake}s")
    @RequiredArgsConstructor
    @Validated
    public class {entity_name}Controller {{
    
        private final {entity_name}Service {entity_lower}Service;
    
        @Operation(summary = "分页查询{entity_name}列表")
        @GetMapping
        public Result<PageResult<{entity_name}>> page(
                @Parameter(description = "页码", example = "1") 
                @RequestParam(defaultValue = "1") @Min(1) Integer page,
                
                @Parameter(description = "每页大小", example = "10") 
                @RequestParam(defaultValue = "10") @Min(1) Integer size,
                
                @Parameter(description = "关键字搜索") 
                @RequestParam(required = false) String keyword) {{
            
            // 参数校验由@Validated自动处理
            PageResult<{entity_name}> result = {entity_lower}Service.pageQuery(page, size, keyword);
            return Result.success(result);
        }}
    
        @Operation(summary = "获取{entity_name}详情")
        @GetMapping("/{{id}}")
        public Result<{entity_name}> detail(
                @Parameter(description = "ID", required = true) 
                @PathVariable @NotNull Long id) {{
            
            {entity_name} entity = {entity_lower}Service.getById(id);
            if (entity == null) {{
                return Result.error(404, "数据不存在");
            }}
            return Result.success(entity);
        }}
    
        @Operation(summary = "创建{entity_name}")
        @PostMapping
        public Result<Long> create(
                @Parameter(description = "{entity_name}信息", required = true) 
                @RequestBody @Valid {entity_name} entity) {{
            
            // 业务校验
            boolean success = {entity_lower}Service.save(entity);
            if (!success) {{
                return Result.error(500, "创建失败");
            }}
            return Result.success(entity.getId());
        }}
    
        @Operation(summary = "更新{entity_name}")
        @PutMapping("/{{id}}")
        public Result<Void> update(
                @Parameter(description = "ID", required = true) 
                @PathVariable @NotNull Long id,
                
                @Parameter(description = "{entity_name}信息", required = true) 
                @RequestBody @Valid {entity_name} entity) {{
            
            entity.setId(id);
            boolean success = {entity_lower}Service.updateById(entity);
            if (!success) {{
                return Result.error(500, "更新失败或数据不存在");
            }}
            return Result.success();
        }}
    
        @Operation(summary = "删除{entity_name}")
        @DeleteMapping("/{{id}}")
        public Result<Void> remove(
                @Parameter(description = "ID", required = true) 
                @PathVariable @NotNull Long id) {{
            
            boolean success = {entity_lower}Service.removeById(id);
            if (!success) {{
                return Result.error(500, "删除失败或数据不存在");
            }}
            return Result.success();
        }}
    }}
    '''
        return template
    
    if __name__ == "__main__":
        if len(sys.argv) < 2:
            print("Usage: python generate-controller.py <EntityName> [field1:type1:desc1,field2:type2:desc2,...]")
            sys.exit(1)
        
        entity = sys.argv[1]
        fields_str = sys.argv[2] if len(sys.argv) > 2 else "name:String:名称"
        
        # 解析字段
        fields = []
        for f in fields_str.split(','):
            parts = f.split(':')
            if len(parts) >= 2:
                fields.append({
                    "name": parts[0],
                    "type": parts[1],
                    "desc": parts[2] if len(parts) > 2 else parts[0]
                })
        
        code = generate_controller(entity, fields)
        print(code)

scripts/check-style.py(代码规范检查):

复制代码
#!/usr/bin/env python3
"""
阿里巴巴Java规范检查脚本
检查项:
1. 类名大驼峰
2. 方法名小驼峰
3. 常量全大写下划线
4. 禁止is前缀的布尔类型
"""

import re
import sys
from pathlib import Path

class JavaStyleChecker:
    def __init__(self):
        self.errors = []
        self.warnings = []
    
    def check_file(self, filepath):
        """检查单个Java文件"""
        content = Path(filepath).read_text(encoding='utf-8')
        lines = content.split('\n')
        
        for i, line in enumerate(lines, 1):
            self._check_line(line, i, filepath)
    
    def _check_line(self, line, line_no, filepath):
        """逐行检查"""
        
        # 检查类名(大驼峰)
        class_match = re.search(r'(?:class|interface|enum)\s+(\w+)', line)
        if class_match:
            class_name = class_match.group(1)
            if not re.match(r'^[A-Z][a-zA-Z0-9]*$', class_name):
                self.errors.append(f"[{filepath}:{line_no}] 类名'{class_name}'不符合UpperCamelCase规范")
        
        # 检查方法名(小驼峰)
        method_match = re.search(r'(?:public|private|protected)\s+\w+\s+(\w+)\s*\(', line)
        if method_match:
            method_name = method_match.group(1)
            if not re.match(r'^[a-z][a-zA-Z0-9]*$', method_name):
                self.errors.append(f"[{filepath}:{line_no}] 方法名'{method_name}'不符合lowerCamelCase规范")
        
        # 检查布尔类型is前缀(阿里巴巴规范)
        bool_field = re.search(r'private\s+Boolean\s+(is\w+);', line)
        if bool_field:
            self.errors.append(f"[{filepath}:{line_no}] 布尔类型字段'{bool_field.group(1)}'禁止使用is前缀,可能引起序列化错误")
        
        # 检查常量(全大写)
        const_match = re.search(r'(?:public|private|protected)\s+static\s+final\s+\w+\s+(\w+)', line)
        if const_match:
            const_name = const_match.group(1)
            if not re.match(r'^[A-Z][A-Z0-9_]*$', const_name):
                self.warnings.append(f"[{filepath}:{line_no}] 常量'{const_name}'建议改为全大写下划线命名")
    
    def report(self):
        """输出检查报告"""
        print("=" * 60)
        print("阿里巴巴Java开发规范检查报告")
        print("=" * 60)
        
        if not self.errors and not self.warnings:
            print("✅ 所有检查通过,代码符合规范!")
            return 0
        
        if self.errors:
            print(f"\n❌ 发现 {len(self.errors)} 个错误(必须修复):")
            for err in self.errors:
                print(f"   {err}")
        
        if self.warnings:
            print(f"\n⚠️  发现 {len(self.warnings)} 个警告(建议修复):")
            for warn in self.warnings:
                print(f"   {warn}")
        
        print("\n" + "=" * 60)
        return 1 if self.errors else 0

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python check-style.py <file1.java> [file2.java ...]")
        sys.exit(1)
    
    checker = JavaStyleChecker()
    for file in sys.argv[1:]:
        if Path(file).exists():
            checker.check_file(file)
        else:
            print(f"文件不存在: {file}")
    
    sys.exit(checker.report())

scripts/init-db.sh(数据库初始化):

复制代码
#!/bin/bash
# 生成MySQL建表语句
# 用法: ./init-db.sh <表名> "<字段定义>"

TABLE_NAME=$1
FIELDS=$2

if [ -z "$TABLE_NAME" ] || [ -z "$FIELDS" ]; then
    echo "Usage: $0 <table_name> \"field1:type1,field2:type2,...\""
    echo "Example: $0 user_info \"username:varchar(50),age:int,email:varchar(100)\""
    exit 1
fi

# 转换为大写下划线命名(保险起见)
TABLE_NAME=$(echo "$TABLE_NAME" | sed 's/\([A-Z]\)/_\1/g' | tr '[:upper:]' '[:lower:]' | sed 's/^_//')

echo "-- 生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "-- 符合阿里巴巴Java开发规范"
echo ""
echo "CREATE TABLE IF NOT EXISTS \`${TABLE_NAME}\` ("
echo "  \`id\` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',"

# 解析字段
IFS=',' read -ra FIELD_ARRAY <<< "$FIELDS"
for field in "${FIELD_ARRAY[@]}"; do
    IFS=':' read -r name type <<< "$field"
    # 转换为下划线命名
    col_name=$(echo "$name" | sed 's/\([A-Z]\)/_\1/g' | tr '[:upper:]' '[:lower:]')
    echo "  \`${col_name}\` ${type} NULL DEFAULT NULL COMMENT '${name}',"
done

echo "  \`create_time\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',"
echo "  \`update_time\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',"
echo "  \`deleted\` TINYINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0:未删除,1:已删除)',"
echo "  PRIMARY KEY (\`id\`),"
echo "  KEY \`idx_create_time\` (\`create_time\`),"
echo "  KEY \`idx_update_time\` (\`update_time\`)"
echo ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='$(echo $TABLE_NAME | sed 's/_/ /g')表';"
echo ""
echo "-- 初始化数据(可选)"
echo "-- INSERT INTO \`${TABLE_NAME}\` (id, ${FIELDS//:/,}) VALUES (1, 'test');"

3.6 测试你的Skill

在Claude Code中测试:

复制代码
# 1. 确保Claude Code已加载技能(通常自动识别~/.claude/skills/下的新技能)
# 2. 输入触发词
帮我创建一个用户管理API,包含用户名、邮箱、手机号字段

预期交互流程

  1. Claude识别到"创建API"关键词,自动加载spring-boot-api-assistant技能

  2. 进入Phase 1:询问具体字段类型和校验规则

  3. 进入Phase 2:依次生成User.java、UserMapper.java、UserService.java、UserController.java

  4. 进入Phase 3:自动运行check-style.py检查代码规范

  5. 询问是否需要生成SQL,如需要则调用init-db.sh


四、进阶:Skills + MCP的强强联合

4.1 为什么需要MCP?

Skills解决了"怎么做"的问题,但AI还需要"能做什么"------比如:

  • 读取真实的GitHub PR内容

  • 查询数据库现有表结构

  • 调用Jira API创建任务

  • 执行单元测试并获取结果

**MCP(Model Context Protocol)**就是AI的"USB-C接口",标准化了AI与外部工具的连接方式。

4.2 实战:为Skill添加MCP能力

场景:让Spring Boot API助手能直接查询数据库生成实体类。

Step 1: 安装MySQL MCP Server

复制代码
# 在Claude Desktop或支持MCP的客户端配置
# claude_desktop_config.json 或 settings.json
{
  "mcpServers": {
    "mysql": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-mysql"],
      "env": {
        "MYSQL_HOST": "localhost",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "root",
        "MYSQL_PASSWORD": "your_password",
        "MYSQL_DATABASE": "test_db"
      }
    }
  }
}

Step 2: 修改SKILL.md,添加MCP工具调用

在SKILL.md的## 工具使用部分添加:

复制代码
## MCP工具使用(增强能力)
当用户要求"根据数据库生成实体"或"逆向工程"时:
1. 使用`mysql_query`工具查询INFORMATION_SCHEMA获取表结构
   ```sql
   SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_COMMENT 
   FROM INFORMATION_SCHEMA.COLUMNS 
   WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'your_table'
  1. 根据返回的字段类型映射为Java类型:

    • varchar -> String

    • int/bigint -> Long

    • datetime -> LocalDateTime

    • decimal -> BigDecimal

  2. 生成带@Column注解的JPA实体类

Step 3: 测试增强版Skill

用户:根据数据库中的user_info表生成实体类

Claude:

  1. 检测到"根据数据库生成"关键词,激活Skill

  2. 调用MCP工具mysql_query获取表结构

  3. 根据返回的字段生成UserInfo.java

  4. 自动添加JPA注解和Swagger注解

4.3 Skills vs MCP的选择矩阵

需求场景 推荐方案 原因
团队编码规范、代码审查流程 Skills 知识密集,需渐进加载
访问外部API(GitHub/Jira/Slack) MCP 需要实时连接和认证
复杂的多步骤工作流 Skills 需要流程控制和决策
文件系统操作、数据库查询 MCP 需要安全沙箱和权限控制
跨团队共享最佳实践 Skills 标准化知识载体
工具生态复用(社区工具) MCP 一次实现,处处使用

黄金法则

  • 如果是知识/流程/方法论 → 用Skills

  • 如果是连接/访问/操作 → 用MCP

  • 如果两者都需要 → Skills调用MCP工具(最佳实践)


五、团队落地:从个人到组织的最佳实践

5.1 团队级Skills仓库设计

复制代码
# 团队共享Skills仓库结构
team-ai-skills/
├── README.md                    # 使用说明和索引
├── .github/
│   └── workflows/
│       └── validate-skills.yml  # CI:验证SKILL.md格式
├── skills/
│   ├── java-api-development/    # Java后端开发技能
│   ├── react-frontend/          # React前端技能
│   ├── code-review-expert/      # 代码审查技能
│   ├── release-automation/      # 发布流程技能
│   └── onboarding-guide/        # 新人上手技能
├── mcp-servers/
│   ├── internal-jira/           # 内部Jira MCP
│   ├── company-gitlab/          # GitLab MCP配置
│   └── test-environment/        # 测试环境MCP
└── templates/
    └── skill-template/          # 创建新Skill的模板

5.2 Skill版本管理策略

语义化版本(SemVer)在Skills中的应用:

复制代码
---
name: java-api-development
version: 2.1.3
changelog: |
  ## [2.1.3] - 2026-02-12
  - 修复:生成的Controller缺少@Validated注解的问题
  - 优化:数据库字段映射支持更多类型
  
  ## [2.0.0] - 2026-01-15
  - 破坏性变更:升级至Spring Boot 3.x,JDK 17+
  - 新增:支持WebFlux响应式编程模式
  
  ## [1.5.0] - 2025-12-01
  - 新增:自动集成Swagger UI配置
---

部署策略

  • 开发环境 :使用main分支最新版

  • 生产环境 :锁定到具体版本号(如v2.1.3

  • 紧急修复 :通过hotfix-分支快速更新

5.3 避坑指南:我们踩过的10个坑

坑点 症状 解决方案
1. Skill过于庞大 加载缓慢,Token爆炸 拆分为多个细粒度Skill(CRUD-Skill、Review-Skill)
2. 描述词不准确 AI无法正确触发Skill 在description中使用高频关键词,多写触发场景
3. 脚本权限问题 执行失败,无错误提示 在SKILL.md中明确说明前置依赖(Python版本、环境变量)
4. 与Rules冲突 AI行为不一致 Skills专注流程,Rules专注约束,避免重复定义
5. 忽视安全 脚本执行危险操作 添加dangerous标签,强制用户确认
6. 没有回退机制 生成错误代码无法撤销 在Skill中集成Git操作,生成前自动commit
7. 版本不兼容 新版AI工具无法识别 关注Agent Skills规范更新,定期测试
8. 缺乏示例 团队成员不会用 在references/中添加5-10个完整示例
9. 过度依赖AI 生成代码不审查直接提交 在Skill中强制添加"人工审查"步骤
10. 忽视反馈 Skill长期不更新,逐渐废弃 建立反馈机制,每月Review Skill效果

六、未来展望:AI编程的范式转移

6.1 2026年技术趋势预测

  1. Skills标准化 :类似Docker镜像,将出现Skills Registry(技能仓库),支持skill pullskill push

  2. AI原生IDE:VS Code、Cursor等将原生支持Skills可视化编辑(低代码配置)

  3. A2A协议普及:Agent间协作标准,你的Spring Boot Skill可以自动调用DBA Agent审查SQL

  4. 动态Skill生成:AI根据对话自动提炼Skill,"刚才的操作不错,要保存为可复用技能吗?"

6.2 给不同角色的建议

个人开发者

  • 立即开始整理你的"Prompt资产",转化为Skills

  • 从1个高频场景入手(如代码审查、API生成)

  • 关注MCP官方仓库,复用社区工具

技术负责人

  • 建立团队Skills规范,纳入代码审查流程

  • 投资MCP Server建设,打通内部系统(GitLab、Jenkins、监控平台)

  • 培养"AI工程师"角色,专门优化人机协作流程

CTO/架构师

  • 将AI Skills纳入技术栈选型考量

  • 规划企业级AI知识库,避免重复造轮子

  • 关注A2A协议,布局多Agent协作架构


七、附录

7.1 SKILL.md完整模板

复制代码
---
name: skill-name
description: 简短描述,包含关键词1、关键词2、关键词3
version: 1.0.0
author: Your Name
tags: [tag1, tag2, tag3]
requires: [mcp-server-name]  # 可选:依赖的MCP
dangerous: false             # 可选:是否执行危险操作
---

# Skill名称

## 触发条件
- 关键词1、关键词2
- 句式:"帮我做XXX"、"生成XXX"

## 执行流程
1. 步骤一(必须)
2. 步骤二(检查点:确认Y)
3. 步骤三(调用工具Z)

## 代码规范/业务规则
- 【强制】规则1
- 【推荐】规则2

## 工具使用
- `tool_name`: 用途说明

## 示例
输入:"示例输入"
输出:"预期输出"

7.2 推荐资源


结语:从"用AI"到"训AI"

2026年是AI编程的分水岭 。之前,我们在学习如何写更好的Prompt;之后,我们在设计如何让AI掌握可复用的专业能力

Skills不是简单的Prompt工程,而是一种知识管理范式的变革------把散落在文档、头脑、聊天记录中的团队智慧,固化为AI可理解、可执行、可传承的数字资产。

现在就开始

  1. 打开你的AI编程工具(Claude Code/Cursor)

  2. 创建~/.claude/skills/my-first-skill/SKILL.md

  3. 写下你最常做的那个重复性任务的工作流程

  4. 明天,让AI帮你做一遍

记住 :未来最值钱的不是会用AI的人,而是会调教AI的人


如果本文对你有帮助,欢迎

  • ⭐ 点赞收藏,方便回顾

  • 💬 评论区留言你的Skill使用心得

  • 🔗 转发给还在重复造轮子的队友

相关推荐
一点一木35 分钟前
🚀 2026 年 8 月 GitHub 十大热门项目排行榜 🔥
人工智能·github
ssshooter40 分钟前
现在网页都能提供 MCP 了?!
前端·人工智能·程序员
京东云开发者1 小时前
Claude Code vs Codex 记忆体系深度对比
人工智能
SelectDB1 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
机械改造鹅1 小时前
从零开始拆解Pi系列——(7)Extension API
agent
plainGeekDev2 小时前
Agent代码审查与批量修复流水线
agent·ai编程·claude
不加辣椒2 小时前
第 4 章 什么是 Harness Engineering
人工智能
桃西西呀2 小时前
上下文窗口都卷到 100 万了,大模型为什么还在为"位置"发愁?
人工智能·llm·ai编程
阿拉斯攀登2 小时前
SpringBoot整合MQTT:后端订阅设备数据、解析传感器报文
人工智能
然我2 小时前
模型不是 Agent:从零实现一个最小 Agent Loop
前端·人工智能·agent