告别“复读机“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使用心得

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

相关推荐
龙山云仓1 小时前
No152:AI中国故事-对话祖冲之——圆周率与AI精度:数学直觉与极限探索
大数据·开发语言·人工智能·python·机器学习
陈广亮2 小时前
OpenClaw 入门实战:5分钟搭建你的自托管 AI 助手
人工智能
琅琊榜首20202 小时前
AI+Python实操指南:用编程赋能高质量网络小说创作
开发语言·人工智能·python
JinchuanMaster2 小时前
Ubuntu20.04安装50系显卡驱动[不黑屏版本]
linux·人工智能·深度学习·ubuntu·机器学习·机器人·gpu算力
草莓熊Lotso2 小时前
Linux 程序地址空间深度解析:虚拟地址背后的真相
java·linux·运维·服务器·开发语言·c++·人工智能
Baihai_IDP2 小时前
Prompt caching 技术是如何实现 1 折的推理成本优化的?
人工智能·面试·llm
山东布谷网络科技2 小时前
对标Yalla和Chamet:海外直播语聊APP中多人派对房的关键技术细节
java·开发语言·人工智能·php·语音识别·软件需求·海外电商系统开发
爱吃rabbit的mq2 小时前
第27章:模型部署:从训练到生产
人工智能·ai·语言模型
智能汽车人2 小时前
自动驾驶---无地图导航
人工智能·机器学习·自动驾驶