你有没有算过,一天里有多少次在终端里输入同样的指令,向 AI 助手重复解释同一个项目的背景,再把同样的需求用不同的措辞发给不同的工具?我之前统计过自己一周的工作流,发现最消耗心力的根本不是写代码,而是"把脑子里已经想清楚的事,重新翻译给工具听"。OpenCode、Claude Code、VS Code 这三样工具单独拿出来都很能打,但各用各的,就变成了三套割裂的对话流。直到我把"技能"这个概念引入工作流,把高频动作沉淀成可复用的资产,才真正从这种重复里解放出来。
这篇文章我会完整拆解这套"技能资产化"的打法:OpenCode 和 Claude Code 各自的技能机制怎么用,VS Code 怎么作为统一入口把两者串起来,以及我在落地过程中踩过的坑和做出的取舍。适合正在用终端型 AI 编程助手、但对重复劳动开始感到厌烦的开发者,尤其是团队里想统一 AI 工作流的同学。
1. 重复劳动的真实成本:为什么非要有"技能"这层抽象
1.1 日常编码中的高频重复场景
先说我自己的真实情况。我同时维护几个项目,每个项目的技术栈、目录结构、代码规范都不一样。每天打开编辑器之后,我会让 AI 助手帮我做这些事:审查新写的代码、生成 commit message、补充单元测试、跑一遍 lint 并修复问题、把需求拆成任务清单。听起来都是小事,但问题在于——每换一个项目,每换一次会话,我都要把这些背景重新说一遍。
"这个项目用的是 pnpm 和 monorepo,后端是 FastAPI,测试放在 tests/ 目录下……"这种话我一天要打好几遍。有时候换了一个终端工具,连说话的方式都要调整。后来我意识到,这不只是"麻烦"的问题,而是我的时间和注意力被大量地消耗在了"沟通成本"上,真正用在思考和决策上的时间反而被挤占了。
1.2 交互式 AI 助手的短板:上下文每次都从零开始
无论是 OpenCode 还是 Claude Code,底层都是大语言模型驱动的对话式代理。它们的会话(session)是有状态的,但项目与项目之间、会话与会话之间,是完全没有记忆的。今天你跟 Claude Code 详细介绍了项目的架构,明天新开会话,它照样一无所知。OpenCode 也一样,你昨天给它定义的代码风格偏好,今天它还是会问"这个项目有什么特殊要求吗"。
这种"每次从零开始"的本质原因,是大模型本身不持久化任何项目知识。会话上下文更像是工作内存,关掉就清空。想让 AI 稳定地按照你的标准干活,唯一可持续的方式,就是把那些"你反复交代的内容"从聊天里抽出来,变成一个独立的、结构化的、可被工具自动加载的文件。这就是技能(skill)机制存在的意义。
1.3 "技能"的本质:把多步操作封装成声明式资产
技能这个词听起来玄乎,其实本质很简单:就像你把一长串 git 命令写成一个 shell alias 一样,你把一段复杂的、多步骤的 AI 工作流写成一个 Markdown 文件,告诉模型"当用户请求这件事时,请按这个流程执行"。它不是一个提示词模板,而是一份"操作手册"。
区别在哪里?提示词模板是你复制给 AI 的一段话,它依赖你还记得去复制;技能是放在固定目录下的一个文件,只要用户触发对应关键词,模型自动加载相关背景、步骤和标准。技能把你的经验沉淀成了资产——它不随会话消失,可以跨工具复用,可以提交到 Git 仓库里跟团队共享。这才是"从重复中解放"的真正含义:你只写一次,之后反复调用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三款工具的角色分工:OpenCode、Claude Code 与 VS Code 各管哪一段
2.1 OpenCode:轻量、模型无关的终端助理
OpenCode 是一个开源的终端 AI 编程代理,跟 Claude Code 定位类似,但有一个关键区别:它不绑定特定模型。你可以让它接 Anthropic 的模型,也可以接 OpenAI、Google 的模型,甚至可以通过配置接上本地跑的 Ollama 模型。这个特性让它在实际落地中非常灵活——尤其是在某些模型服务不稳定或不可用的时候,OpenCode 可以作为替补方案顶上。
OpenCode 对技能机制的支持也做得比较早。它会在你进入一个项目时扫描技能文件,并在合适的时候自动调用。因为它本身是开源的,社区里已经有不少人开始把自己团队的规范写成 OpenCode 技能文件来共享,这正好契合了"资产化"这件事——技能文件是纯文本,天然适合放进 Git 里做版本管理。
2.2 Claude Code:Agent 能力更强,但依赖 Anthropic 账号
Claude Code 是 Anthropic 官方推出的终端编程代理,Agent 能力非常强,尤其在代码库理解、多文件修改、工具调用方面表现出色。它内置的 Agent Skills 机制,允许你把任意领域知识封装成 SKILL.md 文件,放在 .claude/skills/ 目录下,Claude Code 会在回答相关问题的时候自动加载。
不过 Claude Code 有个现实制约:它在部分地区和网络环境下可能无法直接使用,而且需要一个可用的 Anthropic 账号。我在实际使用中遇到过登录不了、服务不可用的情况。这时候,"技能资产化"的优势就体现出来了——我写的那些 SKILL.md 文件不依赖 Claude Code 这个工具本身,换到 OpenCode 一样用。技能是工具无关的,但工具是可替代的。
2.3 VS Code:统一入口与编辑器内协作
VS Code 在这套工作流里的角色,不是去替代 OpenCode 或 Claude Code,而是作为"主会场"。为什么需要它?因为终端工具做得再好,代码阅读、调试、diff 对比、Git 操作这些高频动作,还是编辑器里最顺手。一天里你把 70% 的时间花在 VS Code 里,如果在编辑器里切一下终端就能调用 AI 能力,你会减少大量的窗口切换焦虑。
具体来说,VS Code 可以通过自定义终端 Profile、任务(Tasks)、快捷键等方式,把 OpenCode 和 Claude Code 的常用指令做成"一键触发"的入口。甚至可以在 VS Code 的插件市场里找到直接集成两者的插件。这样你的完整工作流就变成了:在 VS Code 里写代码,在集成终端里唤出 AI 助手,用统一的技能资产去执行确定性任务。
2.4 选型建议表:什么时候用谁
我整理了一张简表,是我在这套体系里实际使用的判断标准:
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 日常快速问答、生成代码片段 | OpenCode | 响应快,可接低成本模型,不心疼额度 |
| 大型重构、跨文件修改 | Claude Code | Agent 能力强,多文件追踪更稳 |
| 模型服务不可用时的兜底 | OpenCode + Ollama | 完全本地运行,不依赖外网 |
| 写代码、看 diff、跑 Git | VS Code | 编辑器原生体验,集成终端直接唤出 |
| 团队统一 AI 规范 | 技能目录(Skills) | 工具无关,就是一堆 Markdown,进 Git 管理 |
这套分工的核心逻辑是:不要把鸡蛋放在一个工具上。每个工具都有自己最强的场景,技能资产则是串联它们的那根线。
3. 技能文件的编写与沉淀:把"怎么做"变成资产
3.1 SKILL.md 的结构:frontmatter 加正文步骤
技能文件的核心是 SKILL.md,它的格式看起来很像一篇带元信息的 Markdown。先是一段 YAML frontmatter,声明这个技能叫什么、在什么情况下用;然后是正文,用清晰的步骤告诉模型怎么执行任务。
看一个具体的最小结构:
markdown复制---
name: code-review
description: 当用户要求对代码进行审查时使用。适用于提交 PR 前的自查,或对已完成函数、模块做质量检查。
---
# 代码审查操作指南
当我请求代码审查时,请严格遵循以下步骤:
1. 先快速浏览项目 README 和文档,确认项目整体的代码风格和约束。
2. 定位本次需要审查的文件,逐文件阅读,找出逻辑错误、边界条件遗漏、安全隐患。
3. 结合项目的既有约定,给出修改建议。建议必须具体到行号或函数名。
4. 审查完成后,用"问题列表 + 严重程度"的表格输出结果,并按 P0/P1/P2 分级。
你可能觉得这看起来像个普通的"提示词模板",但它跟提示词模板有本质区别:这个文件是放到特定目录里的,工具会在相关请求发生时自动加载它,不需要用户手动粘贴;而且它可以有非常多的细节——支持什么、不支持什么、输出格式是什么、执行顺序怎样,全部写清楚。提示词是一句话,技能是一整套操作规范。
3.2 一个可复用的"代码审查"技能实例
我拿自己最常用的代码审查技能来展开,看看一份真正能落地的 SKILL.md 应该长什么样。这份技能我在 OpenCode 和 Claude Code 里都在用,跨工具没有任何问题。
markdown复制---
name: code-review
description: 当用户提到"review""审查代码""检查 PR"等关键词时自动触发,对整个分支或指定文件做静态审查。
model_hint: 如果项目包含 Java 代码,请额外关注空指针与并发安全问题。
---
# 代码审查执行步骤
1. **范围确认**:首先确认当前需要审查的范围。若用户未指定,默认审查当前分支相对主分支的全部改动文件。
2. **环境理解**:读取项目根目录的 README、配置文件(pom.xml/package.json/go.mod 等),确认依赖和核心业务方向。
3. **逐文件检查**:
- 对于新增文件,检查逻辑完整性、异常处理、资源释放。
- 对于改动文件,检查 diff 是否符合最小改动原则,是否破坏既有接口。
- 对于删除文件,确认是否有其他文件引用了被删除的方法或类。
4. **安全专项**:重点关注硬编码密钥、SQL 注入、命令注入、不安全的反序列化等常见问题。
5. **输出格式**:
| 严重级别 | 说明 | 文件:行号 |
| P0 | 会导致系统不可用或严重安全问题 | 示例:UserService.java:47 |
| P1 | 逻辑缺陷或边界条件保护不足 | 示例:PaymentService.java:112 |
| P2 | 代码风格、命名等建议性问题 | 示例:OrderServiceImpl.java:30 |
6. **收尾建议**:最后给出最多 3 条最重要的修改优先级建议,不追求罗列所有问题。
写这份技能的时候,我特意加了两点设计:一是"范围确认",避免 AI 每次问我"要审查哪些文件",这是重复劳动的重灾区;二是"输出格式固定",让审查结果始终是同一套结构,我扫一眼就知道该处理哪个 P0。实践下来,这两点对体验的提升最大。
3.3 把技能放到哪里:多项目共享的 skills 目录
技能文件的存放位置是有讲究的。如果你只有一个项目,放在项目根目录下的 .claude/skills/ 或 .opencode/skills/ 里就够了。但如果你像我一样,很多技能是全项目通用的——代码审查、commit message 生成、测试用例补全——那应该放到全局配置目录,让所有项目共享。
以 Claude Code 为例,它支持用户级的 skills 目录,放在 ~/.claude/skills/ 下的技能对所有项目生效。OpenCode 的全局技能目录在 ~/.config/opencode/skills/(macOS/Linux 系统,Windows 下路径可能略有差异)。把通用技能放这里,把项目特有的技能放项目目录里,就形成了一套"通用 + 特定"的叠加逻辑。
我的习惯是:先搭全局技能库,把跨项目的普适工作流沉淀进去;遇到某个项目特有规范时,才在项目 .claude/skills/ 下新增一条。这样避免了每个项目里都复制一份相同技能的冗余,也让新成员加入时,拉下仓库就能获得一套完整的 AI 协作规范。
3.4 技能不是提示词:写成操作手册而非聊天开场白
这一点是我踩坑最多的地方,必须单独说。很多人第一次写技能,会把它写成"你是一个资深工程师,请帮我……"这种角色扮演式的提示词。但实测下来,这种写法的稳定度很低——模型很可能只读一遍就当闲聊带过,并没有真正按步骤执行。
技能应该写成"操作手册"而不是"开场白"。它有明确的流程、可验证的步骤、固定的输出格式。比如上面代码审查例子里的第 5 步,我直接规定了输出表格的列名和分级标准,模型没有发挥空间,也不需要发挥空间。步骤越多、越具体、越可验证,技能的执行稳定性就越高。
我个人的经验是:写技能的时候想象自己在教一个新来的实习生,才入职第一天,什么背景都没有。你交代他做事的每一步,都会写在文档里,而不是嘴上说。这样写出来的技能,AI 才能照着做。
4. 从终端到编辑器:VS Code 端的打通配置与日常协作流
4.1 环境准备:安装 OpenCode 与 Claude Code 并解决 PATH 问题
这一节回到最实际的问题:怎么把工具装好。OpenCode 的安装,官方提供脚本命令,执行完通常会自动配置 PATH;Claude Code 则通过 npm 全局安装。我建议在终端环境变量里确认好安装路径,否则很容易遇到"无法将'opencode'项识别为 cmdlet、函数、脚本文件或可运行程序的名称"——这个报错我在不同机器上见过很多次,本质就是 PATH 没有配置好。
安装完毕后,在 VS Code 的集成终端里跑一下 opencode --version 和 claude --version,确认两个命令都能正常唤出。这两个工具能出现在终端里,后续在 VS Code 里的集成才有基础。建议再配一个 alias,比如 alias oc='opencode',减少敲击次数——这点小细节,高频使用时感知特别明显。
4.2 在 VS Code 里集成:终端 Profile、任务与快捷键
VS Code 的集成终端支持自定义 Profile,你可以把 OpenCode 和 Claude Code 直接做成两个终端入口。在 .vscode/settings.json 或者用户设置里加一段配置,就能在终端下拉菜单里一键打开一个预置好命令的终端会话。
code复制// .vscode/settings.json
{
"terminal.integrated.profiles.windows": {
"OpenCode": {
"path": "cmd.exe",
"args": ["/k", "opencode"]
},
"Claude Code": {
"path": "cmd.exe",
"args": ["/k", "claude"]
}
},
"terminal.integrated.defaultProfile.windows": "OpenCode"
}
更进阶的玩法是用 VS Code 的任务(Tasks)功能。你可以定义一个 Task,把"运行代码审查"绑定到一个 Ctrl+Shift+R 快捷键上——按一下就启动一个带技能上下文的 OpenCode 会话。这样你甚至不用把双手离开键盘区去敲命令,工具的使用成本被压到了最低。"技能资产化"要成立的必要条件,就是使用技能的步骤必须足够短,短到你不会因为嫌麻烦而弃用。
4.3 一个顺畅的日常循环:编码、AI 审查、自动提交
讲一个我每天都在用的完整闭环,你可以直接抄作业。大致的节奏是:
- 在 VS Code 里写代码,按 `Ctrl+`` 打开集成终端,默认就是 OpenCode。
- 写完一个功能模块后,在终端输入
opencode,然后说"review 当前分支的改动",触发 code-review 技能。技能自动加载后,它会完成环境理解、逐文件扫描、输出分级问题表格。 - 根据 P0/P1 的问题改完代码,在终端里说"生成 commit message",触发另一个 commit 技能。技能按项目的提交规范生成一份 commit message,我复制粘贴到 git 提交里。
- 涉及的测试如果没跑,会让 AI 用测试补全技能去生成用例。
这套循环里,我不需要重复交代项目背景,因为技能文件已经写清楚了;不需要在工具间来回切换,因为 VS Code 的终端 Profile 让两个工具都在手边。整个过程的摩擦非常低,重复劳动的占比从过去的 40% 降到了不到 10%。
4.4 团队共享:把技能资产纳入版本库
技能资产化这件事,一个人用是提效,一个团队用是规范。你可以把团队公共的 skills 目录抽成一个独立的 Git 仓库,比如 team-ai-skills,然后在各项目里通过 submodule 或软链接引到这个仓库。这样团队里的代码风格规范、安全审查红线、测试要求,全都沉淀成了 AI 会自动执行的资产。
我有个很深的感触:以前团队定规范,靠的是文档 + 人为提醒,效果看心情;现在把规范写进技能文件,AI 在每次执行时都会自动加载、按规范执行、并按规范输出。相当于团队多了一个永远在线、永远记得所有规范的隐形成员。这个价值,比单纯的"提效"大得多。
5. 落地过程中绕不开的坑与我的取舍
5.1 两个工具的 skills 解析差异
虽然 OpenCode 和 Claude Code 的技能机制都基于 SKILL.md,但它们的目录扫描逻辑和触发策略并不完全一致。Claude Code 的 Agent Skills 更强调"在回答相关问题时自动加载相关技能文件",它会根据用户当前的意图做语义匹配;OpenCode 则更依赖你显式或半显式地触发。
我在实际使用时发现,同一个 skill 文件,在两个工具里的表现可能有差异。Claude Code 更倾向于在回答过程中自然融入技能指导,OpenCode 则更像"按手册办事"的流程执行。这个差异并不影响同一套技能资产的使用,但会让体验有一些微妙的区别。建议你先在主用工具上把技能调通,跨工具兼容性保持文件格式标准即可,不用追求 100% 行为一致。
5.2 Claude 不可用时的 OpenCode 替代方案
热搜词里有一条很扎眼:"unfortunately, claude is not available to new users right now",而我也确实遇到过 Claude Code 在某些时刻不可用的情况。这种时候,我通常会切到 OpenCode,并把它配到本地模型或免费模型上。OpenCode 对模型接入的开放性,让它成为这个体系里最可靠的"应急预案"。
具体做法是在 OpenCode 的配置文件里定义一个使用 Ollama 的 Provider,指向本地跑着的模型:
code复制// ~/.config/opencode/opencode.json
{
"provider": {
"ollama": {
"baseUrl": "http://localhost:11434/v1",
"models": ["qwen2.5-coder:32b"]
}
}
}
把代码审查、commit 生成这些不太依赖顶尖模型能力的技能切到本地模型上,照样能跑。虽然复杂任务的完成度比 Claude 弱一些,但在"不可用"的场景下,有一套本地兜底方案,绝对是一件你能感受到安全感的事情。技能资产化让这种切换几乎无感——技能文件不需要改,换个工具和模型就能接着用。
5.3 技能膨胀问题:怎么维护技能库
技能写多了以后,你会发现一个新的问题:技能库在膨胀。每个人都有技能,每次加一个人就加一份,最后库里有几十个文件,互相重叠、甚至冲突。我一度陷入了为所有事情都写技能的狂热里,后来发现维护成本甚至超过了省下的时间。
我的解决方案是三条原则。第一,只沉淀高频动作,一个星期用不到两次的,不写;第二,技能尽量被拆解,一个大而全的"万能技能"不如几个小而准的独立技能,这样模型能更精准地触发目标技能,不会误加载不相关的内容;第三,定期归并,每两个星期 review 一次技能目录,删掉废弃的、合并重复的。这套维护节奏让我的技能库一直保持在 8-10 条的高质量状态,而不是失控膨胀。
5.4 我对这套工作流的真实评价与适用边界
说了这么多好处,也得讲讲边界。技能资产化这套打法,最适用的场景是:确定性强、重复度高、有明确验收标准的开发辅助动作,比如代码审查、commit 生成、测试补全。它不太适用于探索性极强的任务——比如"帮我重构这块架构",这种任务本身没有标准答案,写技能没有什么可沉淀的。
另外,技能文件的质量直接决定了效果。如果你写的技能本身逻辑混乱、步骤含糊,AI 一定执行得更乱,这跟代码重构之前写好测试是一个道理:资产化之前,先标准化。我见过有人把"写一个技能"本身变成了重复劳动,那是本末倒置。
最后说一句我的核心体会:真正让我从重复中解放出来的,不是某一个工具,而是"资产化"这个思维方式。OpenCode、Claude Code、VS Code 都只是载体,你沉淀下来的那些技能文件,才是随时间积累、越来越值钱的东西。把这些技能纳入版本管理、与团队共享,你会发现自己终于可以把注意力放回写代码和想问题上——那才是我们做这行的初衷。
