大数跨境

OpenCode Day4:2026年如果只学一个功能的话,那就是Skills!

OpenCode Day4:2026年如果只学一个功能的话,那就是Skills! 创见AI实验室
2026-02-27
2
导读:你能想象吗?我用 OpenCode Skills 搭建了一个自动化代码生成流水线,把常规功能的开发时间从约 3 小时压缩到约 10 分钟(不含需求分析和人工调优)。
飞书文档 - 图片
如果 2026 年只学一个 OpenCode 功能,我的答案很明确:一定是 Skills。

因为我自己用完 Skills 后,我发现 Skills 太实用了!强烈推荐!!!

你能想象吗?我用 OpenCode Skills 搭建了一个自动化代码生成流水线,把常规功能的开发时间从约 3 小时压缩到约 10 分钟(不含需求分析和人工调优)。

这个变化让我更确定一件事:2026 年真正拉开差距的,不是“谁更会和 AI 聊天”,而是“谁先把 AI 变成可复用的自动化工作流”。

2026 年有个非常明显的分水岭:

  • 一批人还在网页里和 AI 聊天,问一句答一句。
  • 另一批人已经把 AI 变成自动化生产线,交代任务后让流程自己跑完。

这个分水岭就叫 Skills。

会用 Skills 自动化工作流的人,效率通常会比不会用的人高 5-10 倍,而且差距还在继续拉大。

因为 Skills 是可以积累的:今天做一个,明天做一个,一年后你手里不是几条提示词,而是几十个可复用流程。

飞书文档 - 图片
一、2026年的真正差距在于会不会搭流程

现在的效率差距已经很清楚了。

同样是做 AI 编程项目:

  • 有人还在每次从空白开始,重复解释背景、重复修格式、重复返工。
  • 有人已经把这些重复动作打包成 Skills,交代目标后让系统自动推进。

前者是在“使用AI”。

后者是在“管理AI产能”。

这两者看起来只差一步,实际是两个时代。

二、为什么我说Skills是“OpenCode最值得优先学”的功能
1)它有复利

学一个提示词,收益是一次性的。

做一个 Skill,收益是长期的。

今天做一个代码生成,明天做一个测试用例,后天做一个文档整理。

时间越久,你手里的不是经验,而是资产。

2)它可迁移

Skills 不是只服务一个场景。

你在React项目里搭好的组件生成流程,稍改参数就能迁移到 Vue、Svelte、小程序。

你学到的不是“写这个组件的方法”,而是“稳定产出任何组件的方法”。

3)它能把人从重复劳动里解放出来

真正消耗你的,不是思考,而是重复决策。

Skills 把重复决策前置成规则,让你把精力放在高价值动作:

选架构、做判断、拍板设计。

三、Skills的基本原理:渐进式披露,而不是“全量灌输”

OpenCode 的 Skills 并不是一上来就把所有工具说明都塞进上下文。它更像一种“渐进式披露(progressive disclosure)”机制:

  • 启动时,模型只知道每个 skill 的两个信息:name 和 description
  • 只有当当前任务“确实需要某个 skill”时,OpenCode 才会把这个 skill 的完整内容加载进来(也就是 SKILL.md 里的执行指令、代码路径、注意事项等)

这件事带来的好处非常直接:

  • 上下文负担明显降低
    :不用每次对话都背着一堆工具说明跑
  • token 花在刀刃上
    :真正要执行时再加载,不执行就不浪费
  • 技能库可以无限扩展
    :你可以有几十上百个 skill,但不会因为“技能太多”导致系统变慢或模型记忆混乱

换句话说,Skills 的设计思想是:让 agent 像一个会“按需打开工具箱”的人,而不是让它一直背着整个工具仓库走路。

四、如何安装与启用Skills

OpenCode 扫描 skills 的顺序(优先级从低到高):

1)全局配置目录(所有项目共享)
  • Windows:%USERPROFILE%/.config/opencode/skills/
  • macOS/Linux:~/.config/opencode/skills/
2)项目本地目录
  • .opencode/skills/
  • .claude/skills/
    (兼容 Claude Code)
  • .agents/skills/
    (兼容 Agent 标准)
方法1:手动下载(适合直接用现成skill)

步骤很简单:

# 1. 创建技能目录mkdir -p .opencode/skills/my-skill# 2. 创建 SKILL.md 文件cat > .opencode/skills/my-skill/SKILL.md << 'EOF'---name: my-skilldescription: 一个用于帮助我处理特定任务的自定义技能license: MIT---# 我的自定义技能此技能可帮助您完成特定任务。## 指令1. 首先,执行此操作2. 然后,执行那个操作3. 最后,验证结果您可以引用支持文件,如 `scripts/helper.py` 或 `references/docs.md`EOF# 3. 重启 OpenCode 或执行 /init 重新扫描
方法2:让OpenCode自动创建(适合定制能力)

这也是 Skills 最“爽”的地方:你甚至不需要先写代码,而是直接在对话里把需求说清楚。

比如你可以这样提:

Code

请帮我创建一个能自动生成 React 函数组件的 skill,支持 TypeScript、Props 类型定义、Hooks 集成,并包含基本样式。

OpenCode 会按需求生成完整技能结构,常见包括:

Code

.opencode/skills/react-component/
├── SKILL.md
├── scripts/
│   └── generate_component.py
├── references/
│   └── react-best-practices.md
└── opencode.json(配置更新)

这就是很多人说的“描述即代码”:你说清楚要什么能力,它给你产出可运行、可复用、可版本控制的技能包。

五、调用与运行Skills:自动触发、手动点名、以及自检
1)自动触发:描述命中就会执行

只要你说的话与 skill 的 description 语义匹配,agent 会自己决定是否调用。

例如你输入:

Code

请帮我生成一个用户登录表单组件。

如果你的技能库里有react-component,而它的描述就是“自动生成React组件”,那 agent 通常会自动加载并执行。

这也是渐进式披露的价值:不需要你每次都写“我要调用某某工具”,模型能理解意图并自己选工具。

2)手动指定:@点名,或者直接调工具函数

有时候你不想让 agent 自己猜(比如你有两个相似 skill),那就手动指定:

  • 输入@react-component,用方向键选择后回车
  • 或者直接调用生成的工具函数,例如:skillsreactcomponent(type="form", name="LoginForm")

我个人习惯是:日常让它自动触发;当结果不稳定或需要强约束时,用 @ 点名。

3)验证当前可用skills:先确认“工具箱里有什么”

在 OpenCode 里输入一句:

Code

我能使用什么 skills?

它会列出当前已加载的所有 skill 名称与描述。

排查“为什么没触发”“是不是没扫描到”时,这句话非常好用。

六、实战示例:创建一个“代码审查”skill

用“代码审查”这个场景最容易理解 Skills 的价值:很多人写代码后需要人工审查,既耗时又容易漏掉细节。

一个典型的代码审查 skill,可以由三部分组成:

1)SKILL.md:告诉 agent 这个技能是什么、怎么用

创建文件.opencode/skills/code-review/SKILL.md

---name: code-reviewdescription: 自动审查代码质量,检查潜在问题并提供改进建议license: MITcompatibility: opencodemetadata:  audience: developers  workflow: code-review---## 功能- 检查代码风格是否符合团队规范- 识别潜在的安全风险(SQL注入、XSS等)- 分析性能瓶颈- 提供具体的改进建议和示例代码## 使用方法1. 提供要审查的代码文件或代码片段2. 指定审查重点(安全性、性能、可读性等)3. 获取详细的审查报告## 审查标准### 安全性- 输入验证是否充分- 是否存在 SQL 注入风险- XSS 防护是否到位### 性能- 是否存在不必要的重复计算- 数据库查询是否优化- 内存使用是否合理### 可读性- 变量命名是否清晰- 函数长度是否适中- 注释是否充分且准确
2)Python脚本:真正干活的程序

创建文件.opencode/skills/code-review/scripts/review.py

#!/usr/bin/env python3"""代码审查工具支持检查:安全性、性能、代码风格"""import astimport refrom typing import ListDictAnyclass CodeReviewer:    def __init__(self, code: str, language: str = "python"):        self.code = code        self.language = language        self.issues = []
    def check_security(self):        """检查安全风险"""        # SQL注入风险        sql_patterns = [            r"execute\s*\(\s*['\"]",            r"executemany\s*\(\s*['\"]",            r"cursor\.execute\s*\(\s*['\"]",        ]
        for pattern in sql_patterns:            if re.search(pattern, self.code, re.IGNORECASE):                self.issues.append({                    "type""security",                    "level""high",                    "message""发现可能的SQL注入风险,请使用参数化查询",                    "suggestion""使用 ? 占位符或命名参数代替字符串拼接"                })
        # XSS风险        xss_patterns = [            r"innerHTML\s*=",            r"\.html\(",            r"document\.write",        ]
        for pattern in xss_patterns:            if re.search(pattern, self.code):                self.issues.append({                    "type""security",                    "level""medium",                    "message""发现可能的XSS风险",                    "suggestion""使用 textContent 或安全的模板引擎"                })
    def check_performance(self):        """检查性能问题"""        # 循环内的数据库查询        if "for" in self.code and "SELECT" in self.code:            lines = self.code.split('\n')            for i, line in enumerate(lines):                if "for" in line and i + 1 < len(lines):                    next_line = lines[i + 1]                    if "SELECT" in next_line or "query" in next_line:                        self.issues.append({                            "type""performance",                            "level""high",                            "message""循环内执行数据库查询,可能导致性能问题",                            "suggestion""考虑批量查询或使用 JOIN"                        })
        # 不必要的重复计算        if "re.compile" in self.code and "for" in self.code:            self.issues.append({                "type""performance",                "level""medium",                "message""循环内重复编译正则表达式",                "suggestion""将 re.compile 移到循环外部"            })
    def check_style(self):        """检查代码风格"""        try:            tree = ast.parse(self.code)
            # 检查函数长度            for node in ast.walk(tree):                if isinstance(node, ast.FunctionDef):                    func_lines = len(node.body)                    if func_lines > 50:                        self.issues.append({                            "type""style",                            "level""medium",                            "message"f"函数 {node.name} 过长 ({func_lines} 行)",                            "suggestion""考虑拆分成多个小函数"                        })
        except SyntaxError:            # 如果不是Python代码,跳过语法检查            pass
    def review(self) -> Dict[strAny]:        """执行完整审查"""        self.check_security()        self.check_performance()        self.check_style()
        return {            "total_issues"len(self.issues),            "issues"self.issues,            "summary"self._generate_summary()        }
    def _generate_summary(self) -> str:        """生成总结报告"""        high_count = sum(1 for issue in self.issues if issue["level"] == "high")        medium_count = sum(1 for issue in self.issues if issue["level"] == "medium")
        return f"""审查完成!==========发现 {len(self.issues)} 个问题:- 高风险:{high_count} 个- 中风险:{medium_count} 个- 低风险:{len(self.issues) - high_count - medium_count} 个建议:1. 优先处理高风险问题2. 中风险问题在下次重构时解决3. 低风险问题可在代码审查中讨论"""# 使用示例if __name__ == "__main__":    sample_code = """def get_user_data(user_id):    conn = sqlite3.connect('database.db')    cursor = conn.cursor()    query = "SELECT * FROM users WHERE id = " + user_id    cursor.execute(query)    return cursor.fetchall()"""
    reviewer = CodeReviewer(sample_code)    result = reviewer.review()    print(result["summary"])
3)opencode.json配置:权限管理

更新或创建opencode.json

{  "$schema""https://opencode.ai/config.json",  "permission": {    "skill": {      "*""allow",      "code-review""allow",      "internal-*""deny",      "experimental-*""ask"    }  },  "provider": {    "openai": {      "apiKey""${OPENAI_API_KEY}",      "models": ["gpt-4""gpt-3.5-turbo"]    },    "anthropic": {      "apiKey""${ANTHROPIC_API_KEY}",      "models": ["claude-3-5-sonnet""claude-3-haiku"]    }  }}

完成后你就可以在 OpenCode 里直接说:

Code

请用 code-review 技能审查这段代码。

agent 会走完整流程:识别需求 → 加载 skill → 执行代码审查 → 输出详细报告。

七、权限管理的三种状态

OpenCode 的 skill 权限有三种配置状态:

支持通配符模式配置:

  • internal-*
    :匹配所有 internal 开头的 skill
  • experimental-*
    :匹配所有 experimental 开头的 skill
  • *
    :匹配所有 skill
八、常见问题排查

如果 skill 没有生效,按照这个清单检查:

1. 文件名是否正确:必须是SKILL.md(全大写)
2. frontmatter是否完整:必须包含namedescription
3. 技能名称是否唯一:不能与其他 skill 重名
4. 权限配置:检查opencode.json是否设置为deny
5. 路径是否正确:skill 必须放在正确的扫描目录下
6. 重启OpenCode:添加/修改 skill 后需要重启生效
九、2026年的关键,不是谁懂得最多,而是谁先把能力工程化

今天你领先 10%,明天别人能追上。但你把能力做成 Skills 后,别人追的是你的系统,不是你的单篇代码。

这就是我判断 2026 学习 OpenCode Skills 的原因:

真正拉开差距的,不是谁更会提问,而是谁先把 AI 变成自己的生产系统。

结语

如果你今年打算用 OpenCode 提升编程效率,我建议是先学 Skills。

别再把 AI 当聊天工具,开始把它当流程引擎。先做第一个 Skill。然后做第二个。

一年后你会感谢现在这个决定。

创见AI实验室,我们不只是介绍工具,我们共同创造工作方式的未来。
OpenCode系列 往期精选








【声明】内容源于网络
0
0
创见AI实验室
创见AI实验室,我们不只是介绍工具,我们共同创造工作方式的未来。
内容 147
粉丝 0
创见AI实验室 创见AI实验室,我们不只是介绍工具,我们共同创造工作方式的未来。
总阅读20
粉丝0
内容147