Claude Code技能工程实战:从编写到演化的AI编程范式
1. 项目概述:从“写代码”到“演化技能”的范式转变
如果你还在把 Claude Code 当成一个更聪明的代码补全工具,那可能就有点“大材小用”了。最近几个月,围绕 Claude Code 的讨论焦点,已经从“怎么写一段函数”彻底转向了“如何构建和演化一套可复用的 Skills”。这不仅仅是功能的叠加,而是一种开发范式的根本性迁移。Claude Code Harness 12 的发布,以及社区里铺天盖地的 Skills 推荐、安装教程和排行榜,都在指向一个核心事实:AI 编程的竞争,已经从模型能力的比拼,进化到了“技能工程”体系的构建。
简单来说,Skills 就是为 Claude Code 这个“大脑”安装的“应用程序”或“插件包”。一个 Skill 封装了特定的任务理解、上下文处理逻辑和代码生成策略。比如,一个“测试用例生成 Skill”不仅知道要写测试,还深谙你项目中 Jest、Vitest 或 Pytest 的惯用模式,甚至能根据你的代码风格生成匹配的断言语句。而“Harness”,你可以理解为 Skills 的“运行时环境”和“管理框架”,它负责调度、组合不同的 Skills,并确保它们能在正确的上下文、遵循正确的约束下工作。Harness 12 的迭代,重点就在于优化了 Skills 的编写、调试和演化的全链路体验。
所以,“Skills 从编写到演化”这个标题,精准地概括了当前高阶玩家们的核心工作流: 第一步是“编写” ,即如何从零开始,将一个模糊的需求(如“帮我做代码审查”)转化为一个稳定、可靠的 Skill; 第二步是“演化” ,即这个 Skill 如何在真实、复杂的项目中使用反馈数据不断自我改进,适应不同的代码库和团队规范,甚至与其他 Skills 协同产生“1+1>2”的效果。这个过程,远比单纯调教一个 Prompt 要复杂和深刻得多。接下来,我将结合实战,拆解从构思一个 Skill 到让它在你团队中“活”起来并持续进化的完整路径。
2. 核心思路:Skill 的本质与 Harness 的定位
在动手写第一行 Skill 配置之前,我们必须先统一思想:Skill 到底是什么?它和普通的 Prompt 模板或代码片段有本质区别。
2.1 Skill 的三层结构:意图、上下文与约束
一个成熟的 Skill,绝不是一个加强版的 system 提示词。我认为它应该包含三个紧密耦合的层次:
-
意图层 :这是 Skill 的“灵魂”。它明确定义了这个 Skill 要解决什么问题,其输入和输出是什么。例如,“生成 React 组件单元测试”是一个意图,“重构冗长函数以符合 SOLID 原则”是另一个意图。意图描述必须精准、无歧义,最好能用一两个简单的用户故事(User Story)来定义。比如:“作为开发者,当我选中一个 React 函数组件时,我希望 Skill 能为我生成覆盖其主要渲染逻辑和 Props 变化的 Jest 测试用例。”
-
上下文层 :这是 Skill 的“眼睛和耳朵”。它决定了 Claude Code 在执行该 Skill 时,能“看到”哪些信息。这包括:
- 文件上下文 :是只看到当前文件,还是需要看到相关的导入文件、类型定义文件、测试文件范例?
- 项目上下文 :是否需要读取
package.json、tsconfig.json或项目的目录结构来理解技术栈和配置? - 对话历史 :是否参考本次会话中之前关于此代码块的讨论?
- 外部知识 :是否需要通过 RAG 检索项目文档、API 手册或特定的设计规范? Harness 12 强化了上下文管理的粒度,允许 Skill 作者精细地控制上下文的摄入范围、优先级和格式化方式,避免无关信息干扰核心任务。
-
约束与策略层 :这是 Skill 的“行为准则”。它规定了代码生成必须遵守的规则。这比简单的“代码风格”要求深入得多:
- 架构约束 :例如,“新生成的函数必须是无副作用的纯函数”,“不允许使用
any类型”。 - 安全约束 :例如,“生成的 SQL 查询必须使用参数化绑定,禁止字符串拼接”。
- 性能约束 :例如,“循环体内的操作时间复杂度必须为 O(1)”。
- 生成策略 :例如,“优先使用递归而非迭代”,“优先返回
Result类型而非抛出异常”。 这些约束通常通过结构化、机器可读的规则配置在 Harness 中,而不仅仅是写在自然语言提示里,这能显著提高 AI 遵循的准确性和一致性。
- 架构约束 :例如,“新生成的函数必须是无副作用的纯函数”,“不允许使用
2.2 Harness 12:从“执行器”到“演化工坊”
Harness 早期版本更像一个管道,把用户输入、上下文和 Skill 打包发给模型。Harness 12 的定位发生了关键转变,它开始承担起 Skill 生命周期管理的职责。
- 组合与编排 :支持 Skills 的链式调用(Chain)或并行执行(Parallel)。例如,一个“需求澄清”Skill 的输出,可以作为“TDD 测试驱动开发”Skill 的输入;而“代码生成”和“代码审查”Skill 可以并行运行,对比结果。
- 反馈闭环 :这是“演化”的核心。Harness 12 可以更便捷地收集用户对 Skill 输出结果的反馈(如“采纳”、“修改后采纳”、“拒绝”),并将这些反馈与当时的输入上下文关联起来,形成训练数据。
- A/B 测试与版本管理 :你可以为同一个意图部署多个不同版本的 Skill(例如,一个激进重构版,一个保守优化版),让 Harness 在后台进行小流量 A/B 测试,根据采纳率等指标自动选择最优版本,实现 Skill 的灰度发布与滚动更新。
- 可观测性 :提供了更详细的日志和指标,让你能看清一个 Skill 被调用的频率、耗时、token 消耗以及最终输出结果的采纳率,为优化提供数据支撑。
理解了这些,我们就能明白,编写 Skill 是在定义“原子能力”,而配置 Harness 是在设计“能力如何被组织、评估和进化”。两者结合,才能构建出真正适应你团队、具有生命力的 AI 编程辅助体系。
3. 实战:编写你的第一个定制化 Skill
理论说再多不如动手。我们以一个实际且高频的需求为例: 为一个前端项目编写一个“Vue 3 Composition API 工具函数生成” Skill 。这个 Skill 的意图是:当开发者描述一个工具函数的功能时(如“一个防抖函数”),能自动生成符合项目规范、类型完备、可直接复用的 Vue 3 Composition API 代码。
3.1 环境准备与项目结构
首先,确保你使用的是支持 Harness 12 的 Claude Code 环境(通常是桌面版或特定插件)。Skill 的物理形态通常是一个目录,里面包含配置文件、示例和可能的工具脚本。
一个典型的 Skill 目录结构如下:
vue3-composable-generator/
├── skill.yaml # Skill 的核心元数据与配置
├── prompts/ # 提示词模板目录
│ ├── system.md # 系统角色定义
│ ├── user.md # 用户输入模板
│ └── few_shot.md # 少样本示例
├── examples/ # 示例输入输出对,用于测试和演示
│ ├── debounce.json
│ └── useLocalStorage.json
├── constraints/ # 约束规则文件(如 ESLint 规则子集)
│ └── vue3-composable.eslint.yaml
└── context_spec.yaml # 定义 Skill 所需的上下文信息
3.2 核心配置解析: skill.yaml 与提示词工程
skill.yaml 是这个 Skill 的“身份证”和“说明书”。我们来看关键部分:
# skill.yaml
name: vue3-composable-generator
version: 1.0.0
description: 生成符合项目规范的 Vue 3 Composition API 工具函数。
author: YourName
tags: [vue, frontend, utility, typescript]
# 定义意图触发器
triggers:
- type: command
pattern: "/gen-composable"
- type: natural_language
patterns: ["生成一个vue3组合式函数", "写一个composable用于"]
# 定义输入模式
input_schema:
type: object
properties:
function_name:
type: string
description: "组合式函数的名称,如 useDebounce"
description:
type: string
description: "功能的详细描述"
options:
type: object
properties:
is_ref_returned: { type: boolean }
# ... 其他可配置项
required: [function_name, description]
# 关联的提示词和上下文文件
prompts:
system: prompts/system.md
user_template: prompts/user.md
few_shot: prompts/few_shot.md
context: context_spec.yaml
constraints: constraints/vue3-composable.eslint.yaml
关键点解析 :
triggers:定义了如何触发这个 Skill。除了命令模式,自然语言模式能让交互更自然。这里的模式要具体,避免误触发。input_schema: 极其重要 。它用 JSON Schema 定义了 Skill 需要的结构化输入。这强制用户在调用时必须提供清晰、完整的信息,避免了模糊的需求描述,是提升 Skill 输出质量的第一步。Harness 会据此生成一个输入表单或引导对话。
接下来是提示词。 system.md 定义了 Skill 的“人格”和核心任务:
# prompts/system.md
你是一个专注于 Vue 3 开发的专家。你的任务是根据用户提供的详细描述,生成高质量、类型安全、可复用的 Vue 3 Composition API 函数。
**核心原则:**
1. 严格使用 `<script setup>` 语法和 Composition API。
2. 优先使用 `ref` 和 `computed`,仅在必要时使用 `reactive`。
3. 函数必须具有完整的 TypeScript 类型定义,包括参数、返回值和泛型。
4. 遵循 Vue 3 的最佳实践,如正确的生命周期钩子使用、副作用清理。
5. 生成的代码必须可直接复制到 `.vue` 文件或 `.ts` 文件中使用。
**输出格式:**
请直接输出完整的函数代码,并附上简要的使用示例注释。不要输出任何解释性文字。
user.md 则是一个模板,用于将 input_schema 接收到的结构化数据,转化为给模型的自然语言指令:
# prompts/user.md
请生成一个名为 `{{function_name}}` 的 Vue 3 Composition API 函数。
函数功能描述:{{description}}
{% if options %}
额外要求:
- 是否返回 ref:{{options.is_ref_returned}}
{% endif %}
请确保代码符合上述所有原则。
实操心得 :在
system提示中,把“不要输出解释性文字”作为强制要求,能极大提升输出结果的“即用性”。否则,AI 总会附带一段说明,你每次都要手动删除,体验很差。另外,user模板中使用{{variable}}的插值语法,能确保输入信息被准确、格式化地传递。
3.3 上下文与约束:让 Skill 更懂你的项目
context_spec.yaml 定义了 Skill 执行时需要“看到”的背景信息。对于这个 Skill,我们可能希望它参考项目里已有的 composable 的写法风格。
# context_spec.yaml
sources:
- type: file_pattern
patterns:
- "src/composables/**/*.ts"
- "src/composables/**/*.vue"
purpose: "参考现有组合式函数的代码风格和工具库使用习惯"
max_tokens: 2000
- type: file
path: "package.json"
purpose: "了解项目依赖的 Vue 和工具库版本"
constraints/vue3-composable.eslint.yaml 则可以嵌入一组具体的代码规则。Harness 可以在生成后或生成过程中,用这些规则对输出进行校验或引导。
# 约束示例 (简化)
rules:
- rule: "no-console"
level: "error"
- rule: "prefer-ref"
description: "在组合式函数中,优先返回 ref 而非 reactive 对象,除非有明确理由。"
- custom_rule:
pattern: "any"
message: "禁止使用 any 类型,必须使用明确的类型或泛型。"
通过组合 精准的意图定义(Schema) 、 专业的角色提示(System Prompt) 、 项目特定的上下文 和 严格的代码约束 ,你的 Skill 就不再是一个通用的代码生成器,而是一个深刻理解你团队技术栈和编码规范的“虚拟专家”。
4. 进阶:Skill 的调试、评估与迭代演化
写完 Skill 的初版只是开始。如何确保它好用,并让它越用越好,才是“演化”的精髓。
4.1 调试与单元测试:为 Skill 建立质量防线
不要盲目相信第一次生成的提示词就能 work。你需要像测试普通软件一样测试你的 Skill。
- 建立测试用例集 :在
examples/目录下,为每个典型场景创建 JSON 文件。文件应包含输入(匹配input_schema)和期望的输出代码片段。// examples/debounce.json { "input": { "function_name": "useDebounce", "description": "创建一个防抖函数,常用于搜索框输入。返回一个经过防抖处理的 ref 值。", "options": { "is_ref_returned": true } }, "expected_output_snippet": "export function useDebounce<T>(value: Ref<T>, delay = 300) { ... }" // 关键部分 } - 使用 Harness 的测试模式 :大多数 Harness 框架都提供了 CLI 或 UI 工具来运行这些测试用例,对比实际输出与期望输出,计算匹配度或进行语义相似度比较。
- 人工审查与修正 :对于未通过的测试,分析是提示词不清晰、上下文不足还是约束太强。反复调整提示词和配置,直到在测试集上达到满意的通过率。
避坑技巧 :测试时,不要只追求代码功能正确,更要关注 代码风格 和 非功能性需求 。例如,生成的函数是否易于测试?是否有清晰的错误处理?这些在长期维护中至关重要,必须在 Skill 设计阶段就通过约束和示例加以引导。
4.2 部署与收集反馈:让 Skill 在真实场景中运行
将 Skill 部署到团队的共享 Harness 实例中。鼓励团队成员在日常工作中使用。关键在于建立 低摩擦的反馈机制 。
- 内置反馈按钮 :配置 Harness,在 Skill 生成的代码旁显示“👍 采纳”、“✏️ 需修改”、“👎 不适用”等快速反馈按钮。
- 记录修正内容 :当用户选择“✏️ 需修改”并亲自修改了代码后,Harness 可以(在用户授权后)记录下原始的 AI 输出和用户最终采纳的版本。这个“差异”是极其宝贵的训练数据,它直接反映了 Skill 的不足和用户的真实偏好。
- 关联上下文快照 :收集反馈时,必须同时保存触发此次 Skill 的完整上下文(输入 Schema、相关文件、对话历史)。这样你才能复现问题,而不是凭空猜测。
4.3 数据分析与迭代演化:从数据中学习
定期(比如每周)查看 Skill 的使用数据面板:
- 使用频率 :哪些 Skill 最受欢迎?哪些无人问津?无人问津的可能是因为需求不痛、触发词难记,还是效果不好?
- 采纳率 :这是核心指标。直接生成的代码被“👍 采纳”的比例是多少?如果采纳率低于 60%,说明 Skill 质量有待大幅提升。
- 平均修改时间 :从生成到用户修改后采纳,平均花了多久?修改时间过长,可能意味着生成的代码离“可用”差距太大。
- 常见修改模式 :通过分析“差异”数据,你能发现模式。例如,用户总是在生成的函数开头添加特定的导入语句,或者总是修改某个命名约定。这说明你的 Skill 遗漏了项目的通用模式。
基于数据的迭代 :
- 提示词优化 :如果发现 AI 总在某个地方犯错(比如错误处理方式),就在
system.md或few_shot.md中增加明确的指导和正面示例。 - 上下文增强 :如果发现 Skill 因为不了解项目的某个工具库而生成错误代码,就在
context_spec.yaml中添加对该库主要 API 文档的引用。 - 约束调整 :如果某个代码风格约束(如强制单引号)导致用户频繁修改,考虑放宽这个约束,或者使其可配置。
- 创建 Skill 变体 :对于同一个“生成工具函数”的意图,你可能会发现团队内部有“简洁派”和“稳健派”两种风格需求。这时,可以基于同一个
input_schema,创建两个 Skill 变体(vue3-composable-concise和vue3-composable-robust),使用不同的system提示词(一个强调简洁,一个强调错误处理和日志)。通过 A/B 测试,观察哪个变体的采纳率更高,或者让用户自行选择。
这个过程—— 编写 → 部署 → 收集反馈 → 分析数据 → 优化迭代 ——就构成了 Skill 的“演化循环”。一个优秀的 Skill 不是一蹴而就的,而是在真实开发环境的反馈中不断打磨、适应,最终成为团队不可或缺的“标准操作程序”。
5. 高阶模式:Skill 的组合、管理与选型建议
当个人或团队积累了十几个甚至几十个 Skills 后,如何管理和使用它们就成了新问题。
5.1 Skill 的组合与工作流编排
Harness 的强大之处在于能让 Skills 像乐高一样组合。假设我们有一个需求:“为这个新写的 UserProfile.vue 组件生成单元测试,并检查其可访问性(a11y)。”
你可以手动依次运行两个 Skill,但更高效的方式是创建一个 “组件上线检查”工作流 ,在 Harness 中配置一个链式调用:
- 触发 :用户对
UserProfile.vue文件执行此工作流。 - Skill 1:单元测试生成 :接收该组件文件,生成 Jest/Vitest 测试文件。
- Skill 2:代码审查 :接收原始组件和生成的测试,进行基础代码质量审查。
- Skill 3:A11y 检查 :接收组件代码,根据 WCAG 标准生成潜在的可访问性问题列表。
- 汇总输出 :Harness 将三个 Skill 的结果整理成一份报告,呈现给用户。
这种编排将多个原子能力串联成一个高阶的、价值更大的复合能力,极大地提升了开发效率和质量保障的自动化程度。
5.2 团队 Skill 管理策略
- 中心化仓库 :在内部 Git 仓库建立
team-skills项目,每个 Skill 一个目录,方便版本管理和协作改进。 - 分级与分类 :对 Skills 进行分类(如“前端”、“后端”、“测试”、“DevOps”)和分级(如“官方推荐”、“实验性”、“已废弃”)。
- 文档与示例 :每个 Skill 必须包含清晰的
README.md,说明其意图、输入格式、使用示例和已知限制。 - 负责人制度 :每个 Skill 应有明确的负责人(或团队),负责其维护、问题解答和基于反馈的迭代。
5.3 个人 Skill 选型与“技能栈”构建
面对社区海量的 Skills(如网络热词中提到的测试用例生成、TDD、代码审查、UI设计、渗透测试等),个人该如何选择?
我建议采取“核心-扩展”策略来构建你的“AI 编程技能栈”:
-
核心基础层(必装) :解决你 80% 日常重复工作的 Skills。
- 代码生成类 :针对你主力语言和框架的组件/函数生成 Skill。
- 代码转换/重构类 :如“代码风格统一”、“语言版本迁移”(如 JS 转 TS)、“设计模式应用”。
- 测试类 :单元测试、集成测试生成 Skill。
- 文档类 :自动生成 JSDoc/TSDoc、更新
README。
-
效率增强层(选装) :针对特定场景,能大幅提升效率的 Skills。
- 领域特定 :如果你做数据分析,可以找“Pandas 操作生成”;如果做游戏,可以找“GSAP 动画技能”。
- 代码审查 :集成 ESLint、Stylelint 等规则,进行自动化静态检查并提出改进建议。
- 需求澄清 :将模糊的自然语言需求,转化为清晰的技术任务清单(类似 Product Manager Skills 的功能)。
-
探索实验层 :关注社区热门、前沿的 Skills(如“逆向分析”、“Vibe Coding”),偶尔尝试,了解 AI 能力的边界,或许能发现意想不到的用法。
安装建议 :不要一次性安装几十个 Skills。先从核心层开始,每个 Skill 都花时间阅读其文档,用几个例子测试,理解其能力和局限。确保你安装的每一个 Skill,你都知道在什么情况下该用它,以及如何用它。否则,过多的 Skills 只会造成干扰,降低效率。
Claude Code 配合 Harness 和 Skills,正在将 AI 编程从一个“黑盒魔法”变成一个可工程化、可定制、可演化的“白盒系统”。掌握从编写到演化 Skills 的能力,意味着你不仅能使用 AI,更能 塑造和培养 专属于你和你的团队的 AI 能力。这不再是简单的工具使用,而是人机协同模式下,一种全新的、更高维度的“元编程”能力。
更多推荐



所有评论(0)