很多人 “养龙虾”(部署 OpenClaw)只停留在用官方自带功能的阶段,总觉得差了点意思:想让它自动整理杂乱的下载文件夹?想让它一键生成你常用的项目模板?想让它对接你私藏的本地工具链?其实不用等官方更新,不用花钱买付费插件,甚至不用申请任何开发者资质 —— 零成本就能给你的终端龙虾做一场「技能植入手术」,自己二次开发专属 Skill,想加什么功能就焊什么功能。

这是一份纯落地的自研手册,全程只用免费开源工具,所有逻辑都在本地运行,不联网、不收费、无授权限制。从技能底层原理到完整代码实操,从调试排坑到永久挂载,每一步都拆解得明明白白,照着做就能搓出独属于你的龙虾超能力。

一、术前准备:搭好龙虾技能开发台

二次开发 Skill 不需要付费 IDE、不需要企业级框架,一台装了 OpenClaw 源码的电脑就能开工,所有工具全免费。

1. 必备基础环境

  • 源码版 OpenClaw:npm 安装版只适合直接使用,二次开发必须用 Git 源码模式,方便修改、调试和热重载。
    • macOS/Linux 安装命令: bash运行curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git
    • Windows 安装命令: powershell& ([scriptblock]::Create((irm https://openclaw.ai/install.ps1))) -InstallMethod git
  • 代码编辑器:VS Code(完全免费)或任意你顺手的文本编辑器即可,不需要特殊插件。
  • 基础能力门槛:懂一点点 JavaScript/TypeScript 语法就能上手,完全新手也可以照着模板改参数实现定制化。

2. 验证开发环境就绪

进入 OpenClaw 源码根目录,执行命令启动开发模式:

bash

运行

pnpm dev

新开一个终端窗口输入 openclaw --version,能正常输出版本号,就代表开发台搭建完成,可以开始 “做手术” 了。

二、先搞懂:龙虾 Skill 的「身体构造」

你可以把 Skill 理解成龙虾的一块 “功能芯片”—— 它是一个符合 OpenClaw 规范的独立模块,插进去就能让龙虾获得一项新能力,拔出来也不影响主程序运行。

一个标准的自定义 Skill 固定由这几部分组成,少一个都没法被龙虾正常识别:

plaintext

your-skill-name/
├── skill.json          # 技能身份证:名称、触发词、权限、功能描述
├── index.js            # 技能主逻辑:核心功能代码全部写在这里
├── README.md           # 技能说明:备注用法、参数、更新记录(可选但推荐)
└── assets/             # 技能资源包:图标、模板文件、配置文件等(可选)

核心文件拆解

  1. skill.json:技能的身份证 这是龙虾识别技能的唯一入口,必须严格遵循格式,关键字段作用如下: json{ "name": "auto-archive", "version": "1.0.0", "trigger": ["归档下载目录", "整理文件"], "description": "自动将下载目录内的文件按后缀名分类归档到对应文件夹", "author": "你的名字", "permissions": ["file:read", "file:write"], "entry": "index.js" }
    • trigger:触发词数组,用户在对话里提到这些关键词,龙虾就会自动调用这个技能。
    • permissions:权限声明,OpenClaw 有沙箱机制,没声明的权限绝对不能调用,比如读写文件、执行系统命令都要提前申请。
    • entry:技能主逻辑的入口文件路径,默认是 index.js。
  2. index.js:技能的大脑 所有功能逻辑都写在这里,固定导出一个默认执行函数,接收龙虾主程序传入的上下文参数和用户输入,执行完成后返回结果即可。 基础模板长这样: javascript运行module.exports = async function (context, userInput) { // context:龙虾提供的内置能力,比如文件操作、日志、模型调用 // userInput:用户触发技能时的完整输入内容 // 你的功能逻辑写在这里 const result = await doSomething(userInput); // 返回给龙虾的结果,会直接展示给用户 return { success: true, message: result, data: {} }; };

三、第一台植入手术:从零搓一个「批量文件归档」Skill

我们拿最实用的场景练手 —— 做一个自动整理下载目录的技能:用户说 “归档下载目录”,龙虾就自动把下载里的图片、文档、视频、压缩包分别挪到对应文件夹。

步骤 1:新建技能目录

在 OpenClaw 用户配置目录下新建技能文件夹(放这里更新主程序不会丢失):

  • Windows:C:\Users\你的用户名\.openclaw\skills\auto-archive
  • macOS/Linux:~/.openclaw/skills/auto-archive

步骤 2:写技能身份证 skill.json

在目录里新建 skill.json,粘贴下面的配置,触发词和描述可以自己改:

json

{
  "name": "auto-archive",
  "version": "1.0.0",
  "trigger": ["归档下载目录", "整理下载文件", "分类文件"],
  "description": "自动将系统下载目录内的文件按类型分类归档到对应子文件夹",
  "author": "custom",
  "permissions": ["file:read", "file:write", "system:path"],
  "entry": "index.js"
}

步骤 3:写核心逻辑 index.js

新建 index.js,粘贴完整实现代码,每一步都加了注释,可以直接用,也可以自己增删分类规则:

javascript

运行

const fs = require('fs').promises;
const path = require('path');
const os = require('os');

// 文件分类规则,可自行增删
const TYPE_MAP = {
  图片: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg'],
  文档: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt', '.md'],
  视频: ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv'],
  音频: ['.mp3', '.wav', '.flac', '.aac', '.ogg'],
  压缩包: ['.zip', '.rar', '.7z', '.tar', '.gz'],
  程序: ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm']
};

module.exports = async function (context, userInput) {
  try {
    // 获取系统下载目录路径
    const downloadDir = path.join(os.homedir(), 'Downloads');
    
    // 读取下载目录下所有文件
    const files = await fs.readdir(downloadDir);
    const fileList = files.filter(file => {
      const fullPath = path.join(downloadDir, file);
      return fs.stat(fullPath).then(stat => stat.isFile());
    });

    if (fileList.length === 0) {
      return {
        success: true,
        message: '下载目录空空如也,不需要归档~'
      };
    }

    let movedCount = 0;
    // 遍历每个文件,按后缀分类移动
    for (const file of files) {
      const fullPath = path.join(downloadDir, file);
      const stat = await fs.stat(fullPath);
      if (!stat.isFile()) continue;

      const ext = path.extname(file).toLowerCase();
      let targetFolder = '其他';
      
      // 匹配文件类型
      for (const [folder, exts] of Object.entries(TYPE_MAP)) {
        if (exts.includes(ext)) {
          targetFolder = folder;
          break;
        }
      }

      // 创建目标文件夹
      const targetDir = path.join(downloadDir, targetFolder);
      await fs.mkdir(targetDir, { recursive: true });

      // 移动文件
      const targetPath = path.join(targetDir, file);
      await fs.rename(fullPath, targetPath);
      movedCount++;
    }

    return {
      success: true,
      message: `归档完成!共整理了 ${movedCount} 个文件,已按类型分类到下载目录的对应子文件夹中。`,
      data: { movedCount }
    };

  } catch (error) {
    return {
      success: false,
      message: `归档失败:${error.message}`
    };
  }
};

步骤 4:让龙虾识别新技能

打开 OpenClaw 配置文件(~/.openclaw/openclaw.json),在技能加载配置里加上自定义技能目录,保存后重启龙虾:

json

{
  "skills": {
    "localPaths": ["~/.openclaw/skills"]
  }
}

四、术后调试:唤醒新技能,排查排异反应

写完不等于能用,这一步教你怎么验证技能是否正常加载,以及解决常见的 “排异反应”。

1. 验证技能加载

执行体检命令,看你的技能有没有出现在已加载列表里:

bash

运行

openclaw doctor --non-interactive

在「技能加载状态」里能看到 auto-archive v1.0.0,就代表龙虾已经识别到这块 “新芯片” 了。

2. 功能触发测试

在终端输入 openclaw 进入交互模式,说一句 “帮我归档下载目录”。

  • 能正常返回归档结果,说明技能植入成功;
  • 龙虾说 “不知道怎么处理”,检查触发词是不是和配置里的一致,有没有大小写、空格问题;
  • 提示权限不足,回到 skill.json 里检查 permissions 字段,缺什么权限补什么。

3. 热重载调试技巧

开发阶段不用每次改完代码都重启龙虾:

  • 在源码目录开启开发模式 pnpm dev,修改技能代码后会自动热更新;
  • 加日志调试:在 index.js 里用 context.log.info('xxx') 打印调试信息,执行时会在日志里显示。

五、永久挂载:让龙虾把新技能刻进骨子里

调试通过的技能,做好这两步就能永久生效,就算升级 OpenClaw 主程序也不会丢失。

1. 独立目录存放

永远不要把自定义技能放在 OpenClaw 源码目录里,统一放在用户配置目录 ~/.openclaw/skills 下 —— 主程序更新只会动源码目录,不会碰用户配置,技能永远不会丢。

2. 设置快捷触发别名

如果觉得每次说完整触发词太麻烦,可以在配置里加快捷别名,比如输入 #gd 就触发归档:

json

"skills": {
  "aliases": {
    "#gd": "auto-archive"
  }
}

3. 打包分享(可选)

把整个技能文件夹压缩成 zip,发给同样养龙虾的朋友,对方解压放到自己的 skills 目录里就能直接用,零成本分享你的定制功能。

六、进阶魔改:解锁龙虾技能的高阶玩法

掌握基础开发后,你可以给龙虾焊上更离谱的超能力,所有玩法全免费、全本地。

  1. 对接本地大模型 在技能里调用本地 Ollama 运行的大模型,做专属内容处理 —— 比如写一个 “代码注释生成” 技能,把代码丢进去,本地模型自动补全中文注释,全程离线不泄密。
  2. 调用系统命令封装 把你常用的复杂终端命令封装成技能,比如一键清理系统垃圾、一键启动开发环境、一键备份数据库,不用再记冗长的参数,说句话就能执行。
  3. 多 Agent 专属技能 给不同的智能体分配专属技能 —— 比如只给 “程序员 Agent” 开放代码格式化、Git 提交技能,只给 “文员 Agent” 开放文档排版、表格整理技能,分工更精准。
  4. 联动本地工具链 对接你电脑上的免费工具,比如调用 ffmpeg 做批量视频转码、调用 pandoc 做文档格式转换、调用 tesseract 做图片文字识别,把零散工具全部收进龙虾里统一调用。

七、排异急救包:Skill 开发高频踩坑解答

这些都是实操中最容易踩、网上搜不到的坑,提前避开少走弯路。

  1. 技能加载不显示 优先检查 skill.json 的 JSON 格式有没有语法错误,逗号、引号有没有漏;再检查 entry 字段的文件名和实际文件是不是一致,大小写有没有错。
  2. 提示权限不足 OpenClaw 的沙箱机制是强制的,哪怕代码里写了文件操作,skill.json 里没加 file:read/file:write 权限也一定会被拦截,缺什么权限补什么即可。
  3. 相对路径失效 技能里读写文件不要用相对路径,一定要用绝对路径 —— 可以用 context.path.workspace 获取当前工作区路径,或者用 os.homedir() 获取用户目录,避免路径漂移。
  4. 更新主程序后技能消失 确认技能是不是放在了源码目录里,移到用户配置目录 ~/.openclaw/skills 下即可解决;同时检查配置文件里的 localPaths 有没有被重置。
  5. 执行长时间任务卡住 不要在技能里写阻塞式的长耗时代码,用异步 + 进度回调的方式处理,龙虾会实时展示进度,不会假死。

说到底,二次开发 OpenClaw Skill 的本质,就是把你日常重复的终端工作,封装成一句口令就能触发的功能。全程零成本、无门槛、完全可控,不用等官方更新,不用迁就通用功能 —— 这才是 “养龙虾” 真正的乐趣:你不是在装一个现成的终端助手,而是在驯化一只完全适配你工作流的专属打工人。