早些年我攒了不少 AI 的“技能包”,也就是圈子里常说的 skill。到今年年初,我手头已经有二十个 skill 散落在三台电脑上,家里台式机、公司笔记本、还有一台专门跑内网模型的小服务器。最尴尬的场景是:我明明记得某台机器上配置过一个很好用的代码审查 skill,可真到了另一台机器上,却怎么也想不起当时是怎么装的,只能重新翻文档、写提示词、调参数,折腾一下午。
后来我给自己划了一条硬规矩:所有 skill 必须做到“一句话部署”。我说“把某某 skill 装上”,AI 就自己完成拉取、校验、落盘、配置、激活全流程,全程不需要我碰命令行。这套系统跑通之后,二十个 skill 在三台电脑之间搬家,从过去的一下午缩短到几分钟。这篇博文就把整个工程实录拆开讲讲,从 skill 的目录规范,到自举式安装器的设计,再到三台机器的差异化处理,最后附上常见问题排查表。如果你也在折腾 AI Agent、提示词工程,或者只是想让手头的 AI 配置可移植、可复用,这篇内容应该能给你不少可以直接抄作业的东西。
1. 为什么我把自己折腾成了“skill 搬运工”
1.1 二十个 skill 是怎么攒出来的
先说清楚 skill 是什么。它不是一个独立的软件,而是一组写给 AI 的“岗位说明书 + 操作模板 + 约束规则”。它的形态通常是一个目录,里面装着一个 Markdown 格式的说明书、若干模板文件、一两段示例对话、可能还有用来做后处理的小脚本。
我这二十个 skill 的来源很杂。有从 GitHub 上捡来的开源 skill,有跟着社区教程自己改写的提示词包,还有不少是工作中被实际问题逼出来的。比如我在给一个项目做代码走查时,手动总结了一套“从 Diff 里找高风险改动”的检查清单,后来把它做成了结构化文件,再后来发现同样的事情要在不同项目里反复做,干脆升级成了一个标准 skill。
攒到五六个的时候还没什么感觉,顶多是复制粘贴到一个固定文件夹里。等超过十五个以后,问题就来了:每个 skill 触发方式不同、适用模型不同、依赖的脚本版本也不同,我开始频繁出现“找不到刚装的 skill”“装完不生效”“这个 skill 似乎覆盖了另一个”之类的混乱。最苦的是三台电脑各自维护一套,规则稍有差异,行为就完全不一样。
1.2 三台电脑带来的真正痛点
三台电脑本身不是问题,问题在于每台机器的环境差异会把“维护成本”放大三倍。我家里台式机是 Windows,日常用的是豆包桌面端和一些本地脚本工具;公司笔记本是 macOS,主要跑 Claude Code 这类终端型 AI 编程工具;那台 Linux 小服务器则是无头环境,跑着 OpenClaw 这类开源壳子,连图形界面都没有。
三套系统,三个模型端点,三种路径习惯。以前我的做法是备份一份 skill 文件夹到移动硬盘里,换机器的时候手动覆盖。听起来还行,实际上一旦 skill 有依赖项,比如某个 Python 脚本要调第三方库,或者某个模板需要特定版本的解析器,手动覆盖就会漏东西。更别提三台机器的配置文件名不一样,Windows 上我习惯放在%USERPROFILE%\.ai\skills,macOS 放在~/.ai/skills,服务器直接放/opt/ai/skills。路径不一致导致每次迁移都得重新适配。
这种散落状态带来的最深层问题,其实是“配置漂移”。家里电脑上的版本可能是 2.1,公司电脑上的还是 1.9,服务器上甚至是一个只有我自己能看懂的历史版本。等真要用的时候,AI 在不同机器上的表现完全不一致,调试起来非常痛苦。
1.3 为什么最终选“一句话自动安装”
解决思路一开始摆在我面前有三个选项。第一个是继续手动同步,显然不靠谱;第二个是写一个专门的管理脚本,用命令行加参数来安装、卸载、列表;第三个就是标题里那个玩法:让 AI 自己装。
写命令脚本的问题在于,它违背了我使用 AI 的初衷。我手头已经有那么多 skill 了,就是为了少记规则、少敲命令,结果管理 skill 的过程还要记一堆命令参数,这不合理。图形界面可以做,但三台电脑上的载体完全不同,Windows 用桌面客户端、macOS 用终端工具、Linux 用开源服务,不可能开发一个跨三端的统一 GUI。
“一句话让 AI 自己装”之所以能胜出,是因为它把所有 skill 的管理操作抽象成了自然语言。我不需要记install --name=xxx --version=2.1 --force这种参数,只需要说“把代码审查 skill 装一下”就行。对于 AI 来说,这件事本质上也是它擅长的工作:理解意图、读取规则、调用命令、反馈结果。把安装流程本身设计成一个 skill,让 AI 用“自己的语言”去执行“自己的安装”,是整个过程最有意思的地方。
2. skill 工程化:把技能变成“可搬运的数据包”
2.1 skill 到底是个什么东西
给没接触过 skill 的读者补个底。一个标准的 AI skill 通常由几个部分组成:
- 说明文件:也就是核心指令文件,告诉 AI 这个 skill 的用途、触发条件、执行步骤。
- 规则文件:一些附加的约束条件,比如“输出必须使用中文”“不得修改源代码”“遇到不确定项要主动询问”。
- 模板文件:预置的输入输出格式,让 AI 在执行时有个参考骨架。
- 示例文件:一到两段完整对话或案例,帮助模型理解理想输出长什么样。
- 辅助脚本:偶尔会用到的小脚本,比如解析 JSON、统计代码行数、生成报告。
我在设计这套系统时,一直把它当作“软件工程里的一个模块”来对待。模块需要有接口定义,skill 也需要有统一的元信息;模块需要版本号,skill 也得有版本管理;模块有依赖,skill 也得声明自己依赖什么。
2.2 我的标准目录与元信息规范
为了让 AI 能自动识别并安装 skill,我把每个 skill 的目录结构固定成下面这个模样:
skills/ code-review/ SKILL.md skill.yaml rules/ checklist.md templates/ review-report.md scripts/ parse_diff.py examples/ demo.md其中SKILL.md是给模型读的说明书,skill.yaml是给安装器读的元信息。这个设计参考了软件包管理的思路,把“给人看的文档”和“给机器读的元数据”拆开。没有skill.yaml的目录会直接被安装器判定为非法,因为光有文档无法完成自动化校验、版本判断和依赖检查。
一个典型的skill.yaml长这样:
name: code-review version: 2.1.0 description: 对指定代码目录做静态审查,输出结构化审查报告 author: yourname platform: - claude-code - openclaw - local-llm requires: - git - python3 entry: SKILL.md tags: - code - review这里有几个关键字段。entry指定模型入口文件;platform声明支持哪些运行环境,安装器在遇到不兼容平台时可以直接跳过或告警;requires列出系统层面的依赖,安装时可以提前做环境探测。有了这一层元信息,后面的自动化流程才能安全地进行。
2.3 为什么统一的“描述层”是自动化的地基
很多人写 skill 时只写一个 Markdown 文件,内容翔实,但没给机器留出任何操作空间。这就像你把一份写在纸上的菜谱交给了机器人厨师,菜谱写得再精彩,机器也看不懂“适量”“少许”这些字眼。skill.yaml的作用就是给菜谱写上精确的量化指标:食材清单、用量、火候、时间。
安装器的工作流程高度依赖这个描述层:读取元信息才能知道要装什么;比对版本才能知道是不是重复安装;检查依赖才能避免“装完没法用”的尴尬。可以说,没有统一的描述层,后面那些自动化都是空中楼阁。我在做这套系统时,最大的一笔时间投入就是梳理已有 skill 的目录和元信息,把二十个散乱文件夹统一成同一套规范。这事没什么技术难度,纯粹是细致活,但收益极其明显——之后所有 skill 的安装、卸载、升级都建立在同一条流水线上。
3. 安装器设计:从“一句话”到“装好”的完整链路
3.1 安装器本身也是 skill
整套安装系统的核心设计原则是“自举”:安装器自己就是一个 skill,而且是默认常驻的第一个 skill,叫skill-installer。用户对着 AI 说“装一个某某”,这句话会先被skill-installer捕获,然后由它来解释意图、调用安装逻辑、完成部署。
为什么不让 AI 直接去理解并执行安装?因为自由发挥的误差太大。如果只靠模型自己临场发挥,它可能会漏掉校验步骤、写错配置文件路径、或者因为某一步失败而挂在那里不知所措。把安装逻辑写死成一个 skill,相当于给 AI 提供了一本完整操作手册,它会照着手册一步步执行,而不是每次都在编造新流程。
skill-installer本身也有自己的SKILL.md,里面的指令大致是:
你是本机的 skill 安装调度器。当用户表达“安装/部署/同步/卸载某个 skill”的意图时,进入安装流程。 流程: 1. 从用户语句中提取 skill 名称,支持别名映射。 2. 探测当前平台信息。 3. 调用 install.py 执行安装。 4. 把安装报告反馈给用户。 约束: - 不得修改用户在 ~/.ai/ 目录之外的内容。 - 遇到不认识的 skill 名称,先列出仓库候选列表,请求用户确认。因为安装器本身也是 skill,所以它可以被版本化、被升级。我迭代过好几版安装器,每版都只是改动仓库里的一个目录,然后在我常用的那台电脑上重新加载一次索引,就完成了自我更新。这种“用 AI 管理 AI”的递归感,确实是工程实践里很上头的一部分。
3.2 双引擎理解:规则匹配与模型解析
“一句话”要能被准确执行,光靠一个安装器指令还不够。用户说的话千奇百怪,比如“帮我装一下那个审查代码的”“把 review skill 装上”“上次那个狗头军师 skill 在这台机器上也来一份”——这些表达差异很大,需要有一个解析层来统一。
我的解决方案是双引擎理解。第一阶段是规则匹配:先用关键词、同义词表做快速定位,比如“审查代码”“code review”“review”都映射到code-review这个 skill。规则匹配快且稳定,能处理绝大多数标准表达。第二阶段是模型解析:如果规则匹配失败,或用户描述比较模糊,就调一次语言模型,从整句话语义里提取意图和参数。
这两个阶段一起工作的意义在于:规则层给系统兜底,不管模型多笨都不会彻底跑偏;模型层给系统补灵活度,不管用户说得多随意都能被理解。实测下来,只要仓库里 skill 的数量不超过五十个,这种双引擎方案在准确率和响应速度上都非常理想。
3.3 执行器的四步流程:拉取、校验、落盘、激活
安装器解析完意图之后,真正干活的是一个 Python 脚本install.py。这个脚本拥有明确的四步流程:拉取、校验、落盘、激活。
第一步拉取。所有 skill 都存放在一个 Git 仓库里,安装器根据用户指定的名称从仓库中取出对应目录。考虑到三台电脑中有一台是无头服务器,拉取方式我用的是git sparse-checkout,而不是一次性克隆整个仓库。这样既避免了把几十个 skill 都拷贝到本机,也能保持仓库单一下拉、更新方便。
第二步校验。安装器做三件事:检查skill.yaml是否存在且格式合法,检查本地环境是否满足requires声明的依赖,检查是否有同名 skill 已经安装并且版本冲突。
第三步落盘。校验通过后,把 skill 目录复制到当前机器的 skills 根目录,并在安装索引文件skills_index.json中追加一条记录。这个索引是所有 skill 的“登记表”,AI 每次启动会话时都会读取它,决定要加载哪些技能。
第四步激活。激活不等于简单复制。不同运行环境需要不同的激活方式,比如 Claude Code 需要在配置文件里登记 skill 路径,OpenClaw 需要重新加载技能索引,豆包桌面端需要刷新缓存。安装器会根据探测到的平台类型,执行对应的激活步骤,最后生成一份安装报告:
{ "skill": "code-review", "version": "2.1.0", "installed_at": "~/ .ai/skills/code-review", "platform": "darwin-arm64", "status": "active", "replaced_version": "1.9.2", "next_step": "重启会话后生效" }报告会直接反馈给对话窗口。用户看到的不是一串日志,而是一句“安装完成,版本 2.1.0,已替换旧版 1.9.2,重启会话后生效”。这个反馈闭环很重要,它让非技术使用者也能理解发生了什么。
3.4 幂等、冲突与回滚:不把电脑搞坏
AI 自动安装最怕的就是搞坏环境,所以我在设计里特意加了三级保护。
第一级是幂等。同一个 skill 安装两次,第二次应当被识别为“已存在”,直接告知用户当前版本,而不是再复制一份覆盖掉。安装器会在落盘前检查索引,如果同名 skill 已存在且版本号一致,就跳过复制,只是重新激活一次。这样做的好处是,用户在不确定是否装过的情况下,可以放心地说“再装一遍”,不会产生副作用。
第二级是冲突处理。不同 skill 可能声明了相同的依赖组件,比如两个 skill 都要用到某个同名模板。我的做法是统一将共享依赖放到~/.ai/shared/目录,skill.yaml 里额外增加shared_requires字段声明依赖。安装器会检查冲突,如果有不同版本需求,则默认使用较高版本并给出提示。
第三级是回滚。每次安装前,安装器会把目标目录的旧状态打包成一个快照,存放在~/.ai/backups/里。如果用户发现新版本不好用,只需要说“回滚 code-review”,安装器就会找到最近的快照并恢复原状。这个能力在 AI 自动化操作里非常关键,因为只要有机会出错,就一定会出错,提前铺好退路才能让人放心把控制权交出去。
4. 三台电脑的差异化处理实录
4.1 平台探测与路径映射
三台电脑的差异,最直观的就是路径和 Shell 环境。Windows 上我用 PowerShell 和%USERPROFILE%,macOS 上我用 bash 和$HOME,Linux 服务器则是完全无桌面的 bash 环境。
安装器在每个平台启动时先做一次环境探测,把平台信息写入环境变量:
| 电脑 | 系统 | skill 根目录 | 默认 Shell | 模型端点 |
|---|---|---|---|---|
| 电脑 A | Windows 11 | %USERPROFILE%\.ai\skills | PowerShell | 豆包桌面端 |
| 电脑 B | macOS | ~/.ai/skills | bash | Claude Code API |
| 电脑 C | Ubuntu Server | /opt/ai/skills | bash | 内网模型 API |
路径映射不是写死在脚本里,而是通过platform.yaml配置文件维护。每个 skill 安装时都会读取这份配置,把仓库里的相对路径翻译成当前机器的绝对路径。这层抽象非常值得做,因为后期新增第四台电脑时,不需要改任何 skill 内容,只需要加一份平台配置。
4.2 多模型端点的接入
三台电脑运行着不同的模型载体,这带来一个很有意思的问题:同一份 skill,在不同模型上触发的效果不一样。豆包桌面端的上下文处理方式和 Claude Code 有差别,OpenClaw 接入本地模型时对指令遵循能力也弱一些。
处理方案是让 skill 本身带上“平台适配段”。在SKILL.md里,同一个执行步骤会写出不同平台的具体差异。比如代码审查 skill 在 Claude Code 上使用官方 API 拉取 diff 数据,在本地模型上则改为读取指定目录的文件列表。这个设计不追求“一套提示词吃遍所有模型”,而是承认差异,在每个平台下给出各自的表现形态。
统一入口依然很重要。无论哪个模型,用户只需要说“帮我装 skill”,它就会先识别自己是什么平台,再走对应的安装逻辑。模型之间的能力差异被处理在 skill 内部,用户界面始终是一句自然语言。
4.3 安全边界:哪些操作要锁死
AI 自动装东西,听起来很爽,但安全上必须非常克制。我给安装器划定了三条不可逾越的边界。
第一,只允许修改~/.ai/(或对应的平台根目录)内的内容,绝不触碰系统目录、用户主目录下其他文件;第二,执行外部命令只走白名单,比如git、python3、ln、cp,凡是能改动系统状态的操作都需要在安装器代码里显式声明,不允许模型自己发明新命令;第三,凡是涉及删除旧版本、覆盖配置文件、创建软链接这类有风险的操作,安装器会先把操作内容和影响范围展示给用户,等确认后再继续。
这套边界设计让我敢在办公电脑上放开手让 AI 自动安装。因为就算撞了鬼,它最多只在沙盒目录里面胡闹,不会波及系统其他方面。安全原则不是限制自动化,而是让自动化在明确范围内自由发挥。
5. 完整实操:从零搭建你自己的安装系统
5.1 搭建技能仓库
第一步是把所有 skill 收拢到一个 Git 仓库。我建议先用skills/作为根目录,每个 skill 一个子目录,里面放好SKILL.md和skill.yaml。仓库建好之后再配置sparse-checkout支持,这样安装器可以按需拉取单个 skill,而不是把仓库全部内容都拖下来。
Git 托管服务方面,我是直接放在一个私有仓库里,本地网络没有额外要求。服务器那边因为在内网,我处理的方法是先在服务器上配置好到仓库地址,然后安装器实际执行时会先判断仓库是否可达,如果不可达就使用本地镜像目录作为后备源。这个后备源的设计很实在,无头服务器往往网络受限,多一个本地源会让安装过程稳得多。
5.2 编写安装器核心脚本
安装器核心是一个 Python 脚本,我给出精简版逻辑供参考:
#!/usr/bin/env python3 import argparse, json, os, platform, shutil, subprocess, sys, yaml, hashlib SKILLS_HOME = os.environ.get("AI_SKILLS_HOME", os.path.expanduser("~/.ai/skills")) INDEX_FILE = os.path.join(os.path.dirname(SKILLS_HOME), "skills_index.json") def detect_platform(): system = platform.system() arch = platform.machine() if system == "Windows": return "win32", arch elif system == "Darwin": return "darwin", arch return "linux", arch def load_index(): if os.path.exists(INDEX_FILE): with open(INDEX_FILE, "r", encoding="utf-8") as f: return json.load(f) return {"skills": {}} def save_index(index): os.makedirs(os.path.dirname(INDEX_FILE), exist_ok=True) with open(INDEX_FILE, "w", encoding="utf-8") as f: json.dump(index, f, indent=2, ensure_ascii=False) def validate_skill(skill_dir): meta_file = os.path.join(skill_dir, "skill.yaml") if not os.path.exists(meta_file): return False, "缺少 skill.yaml" with open(meta_file, "r", encoding="utf-8") as f: try: meta = yaml.safe_load(f) except Exception as e: return False, f"skill.yaml 解析失败: {e}" require_fields = ["name", "version", "entry"] for field in require_fields: if field not in meta: return False, f"skill.yaml 缺少字段: {field}" return True, meta def install_skill(skill_name, source_root, target_root, backup_root): source = os.path.join(source_root, skill_name) if not os.path.isdir(source): return {"success": False, "reason": "仓库中不存在该名称"} ok, meta = validate_skill(source) if not ok: return {"success": False, "reason": meta} target = os.path.join(target_root, skill_name) backup = os.path.join(backup_root, f"{skill_name}_{meta['version']}.bak") if os.path.exists(target): if os.path.exists(backup): shutil.rmtree(backup) shutil.move(target, backup) shutil.copytree(source, target) index = load_index() index["skills"][skill_name] = { "version": meta["version"], "installed_at": target, "platform": detect_platform()[0], "status": "active", } save_index(index) return {"success": True, "version": meta["version"], "target": target} if __name__ == "__main__": parser = argparse.ArgumentParser(description="Skill Installer") parser.add_argument("skill", nargs="?", help="skill 名称") parser.add_argument("--source", default="./skills") args = parser.parse_args() if not args.skill: sys.exit("缺少 skill 名称") result = install_skill(args.skill, args.source, SKILLS_HOME, "./backups") print(json.dumps(result, indent=2, ensure_ascii=False))这个脚本的核心不在代码量,而在于把“安装”定义成可重复、可验证、可回滚的三个动作。你要注意,真实项目里脚本会比这长不少,因为要处理各种异常分支,但主干逻辑就是这个样子。
5.3 编写“一句话安装”的触发规则
光有 Python 脚本还不够,还需要让模型在对话里正确触发它。我在skill-installer的SKILL.md里写入了具体的触发规则,并在规则中加入了别名表。别名表的样例如下:
code-review: code-review, 审查代码, review, 代码审查 meeting-notes: 会议纪要, meeting, notes, 会议总结 blog-draft: 写博客, blog, 帖子, 文章草稿用户说的是“审查代码”,模型先走规则匹配到code-review,再执行python3 install.py code-review --source <repo_path>。如果用户说的是“帮我来一套那个平时用的审查方案”,规则匹配失败,就走模型语义解析,把这句话映射到code-review。
触发规则还要处理一个细节:“一句话”里可能同时包含安装对象和安装地点。比如“把这个 skill 装到服务器上”和“在笔记本上装一下 review”。安装器不能只识别 skill 名,还要识别目标机器。我的做法是在SKILL.md里明确要求模型先判断“目标机器是否是当前机器”,如果不是当前机器,则只更新仓库配置,并提示用户在另一台机器上手动执行一次同步命令。
5.4 在三台电脑上同步验证
仓库和安装器就绪后,三台电脑各自装一次skill-installer作为种子,之后所有安装都从对话触发。我在三台电脑上做的验证流程是:先清空旧的 skills 目录,再分别向每台机器说同一句话:“把代码审查 skill 装上”。
Windows 上,豆包桌面端接收指令后,通过 PowerShell 调用安装器脚本,耗时十二秒,索引写入成功;macOS 上,Claude Code 接收指令,执行 bash,耗时六秒,因为本地缓存更热;Linux 服务器上,OpenClaw 收到指令后执行安装,耗时八秒,安装器自动探测到是无头环境,跳过了需要图形界面的模板预览步骤。
三台机器运行同一个 skill 库,装出来的目录结构一致、版本一致、索引一致。这意味着我在任意一台电脑上对 skill 做调试,其他机器都可以随时同步。这种“一处改进、处处生效”的感受,是过去手动搬运时完全体会不到的。
5.5 实测效果与安装报告
整个系统跑通之后,我最直观的感受是:过去最怕的“新电脑初始化”变成了十分钟以内的事。新机器只需要配好 Git、装好 Python、把种子安装器跑一遍,剩下的所有 skill 都是对话式安装。安装报告把整个流程变成了可视化反馈,用户不用去翻日志,直接看一句话就知道结果。
有一回我在服务器上部署一个新 skill,OpenClaw 反馈安装成功,但运行时报了一个模板路径错误。排查后发现是服务器上/opt/ai/skills路径与索引里记录不一致导致的。这类问题在自动安装系统里非常常见,好在有备份机制,我一句“回滚”就恢复了稳定状态。
6. 常见问题与排查技巧实录
6.1 安装失败排查速查表
| 症状 | 可能原因 | 排查方法 |
|---|---|---|
| 说“安装”没反应 | 触发规则没加载 | 检查skill-installer是否在索引中处于 active 状态 |
| 报“缺少 skill.yaml” | 目录名或文件名大小写不一致 | 检查仓库中目录名与 yaml 内 name 字段是否完全一致 |
| 安装成功但行为没变 | 索引缓存未刷新 | 查看激活报告,是否有next_step: 重启会话提示 |
| 装了一个旧版本 | 仓库本地缓存过期 | 更新仓库后再安装,或强制pull缓存 |
| Windows 上命令执行失败 | PowerShell 执行策略限制 | 检查执行策略,将当前会话放宽到RemoteSigned |
| 服务器上依赖缺失 | requires 声明的依赖未安装 | 安装器在校验阶段输出缺失依赖项,逐一补齐 |
| 安装器自己坏了 | 种子 skill 被覆盖 | 使用备份目录恢复skill-installer快照 |
速查表解决的是“发生后怎么办”,但更聪明的做法是在安装器里提前做检查。我在校验阶段就把缺失依赖输出成一行明确信息,用户不需要猜测,照着提示补装即可。
6.2 几个让我印象深刻的翻车现场
第一次做自动安装时,我在 Windows 上遇到了一个非常隐蔽的问题:skill.yaml的编码是 UTF-8 带 BOM,yaml.safe_load解析直接失败,报了一个很奇怪的错误。后来统一把所有 yaml 文件转成无 BOM 的 UTF-8,类似问题再也没出现过。这提醒我一个经验:跨平台的文本处理,编码问题永远是排在第一位的隐形杀手。
第二个翻车现场是服务器上的路径权限。/opt/ai/skills需要用管理员权限写入,安装器执行时默认没有权限,安装到一半直接退出。当时我第一反应是给安装器加 sudo,但仔细一想这不符合安全边界,就改成把/opt/ai/skills的属主改为当前用户,同时在安装器里增加权限预检。权限问题最好提前暴露,不要在拷贝文件拷贝到一半时才报错,否则容易留下半成品目录。
第三个问题是模型理解偏差。有一台机器上的模型指令遵循能力较弱,我说“把 meeting-notes 装上”,它理解成了“把 meeting 相关的所有东西都装上”,然后试图安装仓库里所有包含 meeting 关键词的文件。后来我在触发规则里加入了一条硬约束:“只能安装用户明确指定的单个 skill,如果存在歧义,必须向用户确认,不得自行扩大范围”。这类约束比给模型讲道理有用得多。
6.3 给后来者的几条避坑建议
如果你也想搭一套类似的东西,我的建议是别一上来就追求自动化,先把手头的 skill 整理成规范目录。任何一个自动安装器,都建立在 skill 本身格式统一的基础上。格式不统一,自动化的每一步都是在跟异常搏斗。
第二个建议是做一次“手动模拟安装”。在写安装器脚本之前,我建议你先手动在一个干净目录里模拟一遍完整流程:从仓库里复制文件、写索引、配置激活。把每一步都记下来,之后再写脚本,你会有清晰的分工认知,而不是凭空设计。
第三个建议是永远保留回滚能力。AI 自动安装是一个高风险高回报的系统,回滚机制就是缰绳。我知道很多人做自动化时容易上头,越写越复杂,但请务必在第一步就把backups/目录建好,把“一句命令恢复”的能力放在最前面。没有退路,系统越强大越让人害怕。
我自己用这套系统跑了三个多月,最大的体会是:AI 工程化的核心不是模型调得多聪明,而是你能不能把一个反复出现的动作,封装成让 AI 可理解、可执行、可回滚的流程。把二十个 skill 散在三台电脑的问题解决掉之后,我对 AI 的使用方式明显变了——我敢随意试验新技能,失败了大不了回滚;也敢把配置同步交给系统自动处理,不再担心某台电脑上的技能又丢了一截。