Provision CLI:将AI工作流转化为可复用技能,破解团队知识孤岛
1. 项目概述:从零散经验到可复用的AI技能
在AI工具深度融入日常工作的今天,一个普遍且令人头疼的现象是:团队里总有人能摸索出一套高效的工作流,比如用Claude Code快速生成特定业务场景的代码,或者用Cursor精准地重构某个模块。但当其他人想复用时,往往只能得到几句模糊的Slack消息、一个零散的文档链接,或者一段需要自己琢磨的提示词。这种“知识孤岛”不仅效率低下,更让团队难以形成标准化的AI协作能力。Provision CLI的出现,正是为了解决这个痛点。它的核心思想很简单:将你或同事的最佳实践,无论是通过屏幕操作还是文字描述,转化为一种结构化的、可被多种AI工具(如Claude Code, Cursor, Codex, OpenClaw)直接理解和执行的“技能”。你可以把它理解为一个“AI工作流录制与分发工具”,但它做的远不止录制,而是深度解析你的意图和步骤,生成一份机器可读的“操作手册”。
我最初接触这个工具,是因为团队内部在数据清洗流程上存在巨大差异。同样的需求,A同事用Claude写出的Python脚本高效优雅,B同事却总在正则表达式上卡壳。我们尝试过编写共享的提示词模板,但效果时好时坏,因为提示词无法捕捉到操作中的细微决策(比如为什么选择这个库而不是另一个,遇到某种报错时该如何调整)。Provision CLI的“视频教学”功能让我眼前一亮——它允许你直接录制屏幕操作,AI会分析你的每一步点击、输入和跳转,甚至能理解你操作时的旁白解释,最终生成一个包含完整上下文和决策逻辑的技能文件。这意味着,任何团队成员,无论其原有水平如何,都能通过安装这个技能,让他们的AI助手“继承”最佳实践者的经验。
2. 核心设计思路与方案选型
Provision CLI的设计哲学建立在两个关键洞察之上,这也决定了它为何采用现有的技术方案。
2.1 核心问题拆解:为什么传统的知识共享方式失效?
在AI辅助编程和工作流自动化场景下,知识共享的难点在于其高度情境化和隐含性。
- 情境依赖性强:一个有效的提示词或操作序列,往往依赖于特定的工具状态、项目结构甚至个人偏好。一句“用Claude生成一个FastAPI的CRUD端点”,缺少了项目依赖、数据库模型、认证方式等关键上下文,生成的代码几乎不可用。
- 隐含知识难以传递:有经验的开发者知道在代码生成后需要检查哪些地方(如导入语句、环境变量引用),遇到编译错误时首先排查哪个环节。这些“肌肉记忆”和“直觉”很难通过文档传递。
- 工具碎片化:团队可能混合使用Claude Code、Cursor、VSCode Copilot等多种工具。为每个工具单独维护一套最佳实践,成本极高。
因此,一个理想的解决方案必须能:捕获完整情境、显化隐含知识、实现跨平台分发。Provision CLI选择“技能”(Skill)作为核心抽象,正是因为它是一个足够结构化、又能承载丰富信息的载体。一个Skill不仅包含步骤列表,还定义了所需的工具(如浏览器、终端)、环境变量、以及每一步的预期目标和回退方案。
2.2 技术方案选型:视频分析与大模型推理的结合
Provision CLI提供了两种技能创建方式:文本描述和视频分析。这两种方式背后是截然不同的技术路径,但共同服务于“降低创建门槛”的目标。
视频分析路径(
provision teach -v):- 技术栈: 这 likely 结合了计算机视觉(CV)和大语言模型(LLM)。首先,通过CV库(可能是基于FFmpeg和某种帧分析技术)处理视频,提取关键帧、识别UI元素(按钮、输入框)、光学字符识别(OCR)获取屏幕文本,并追踪鼠标轨迹与点击事件。
- 工作流: 将提取出的视觉序列(如“在地址栏输入linkedin.com -> 点击登录按钮 -> 在用户名框输入...”)与可能的音频转录文本(你的旁白)一起,送入一个大语言模型(如Gemini)。LLM的任务是理解这一系列低级操作背后的高级意图(“登录LinkedIn Sales Navigator”),并将其重构为结构化的、面向目标的步骤描述。
- 优势: 这是最具革命性的方式。它能捕获那些你根本想不到要写下来的细节,比如在某个下拉菜单中需要选择第二项而不是第一项,或者需要等待某个页面元素加载完成后再进行下一步。这极大地降低了技能创建的门槛,尤其适合复杂的、图形界面的操作流程。
文本描述路径(
provision teach -d):- 技术栈: 完全依赖大语言模型(LLM)的自然语言理解和代码生成能力。
- 工作流: 你将工作流用自然语言描述出来,CLI将其发送给LLM(默认是Gemini API)。LLM需要根据描述,生成符合OpenClaw Skill标准的结构化文档(
SKILL.md)和元数据(skill.json)。这要求LLM对目标AI工具的能力有深入了解,并能将模糊的需求转化为可执行指令。 - 优势: 快速、直接,适合逻辑清晰、易于表述的流程。例如,“监控Hacker News首页,提取所有包含‘AI’和‘funding’的帖子标题和链接,并保存到CSV文件”。
为什么选择Gemini API作为默认离线引擎?从项目配置看,它支持用户自带GEMINI_API_KEY。这很可能是因为Gemini API在多模态理解(结合视频帧和文本)和长上下文任务上表现良好,且提供了免费的额度,降低了用户试用成本。而对于已登录Provision AI平台的用户,则使用平台后端可能集成的更强大或定制的模型。
技能格式标准的选择:Provision CLI生成的技能遵循OpenClaw Skill标准。这是一个明智的、生态驱动的选择。OpenClaw本身是一个开源的AI智能体框架,其技能格式正在成为一种事实标准。采用它意味着生成的技能不仅能用于Provision自家的云智能体,还能无缝安装到任何兼容此标准的AI工具中(如原生的OpenClaw、Cursor等),极大地提高了技能的通用性和生命周期。
3. 核心功能解析与实操要点
Provision CLI的功能围绕技能的“创建-管理-分发”生命周期展开。下面我们深入每个核心命令,拆解其使用细节和背后的逻辑。
3.1 技能创建:provision teach的两种模式深度解析
provision teach是核心中的核心。无论是通过视频还是文本,其最终目标都是生成一个高质量的SKILL.md文件。
视频教学模式 (-v):当你执行provision teach -v demo.mp4时,会发生以下几步:
- 视频预处理:CLI会检查视频格式和大小(支持MP4, WebM, MOV,<100MB)。它可能对视频进行抽帧,并非逐帧分析,而是提取有显著变化的帧以提高效率。
- 多模态分析:视频帧和音频(如果有)被编码并发送给AI模型。AI的任务是生成一个“操作叙述”。
- 交互式确认:AI会输出它理解的工作流步骤,并让你确认。这是关键纠偏环节。例如:
我理解您的工作流是: 1. 打开浏览器,访问 https://github.com。 2. 在搜索框输入“provision-cli”。 3. 点击第一个仓库链接。 4. 点击“Code”按钮,复制HTTPS链接。 5. 打开终端,输入 `git clone ` 并粘贴链接。 是否准确?[是] [否,需要编辑] [取消]- 如果选择“编辑”:你可以直接输入自然语言进行修正,如“不是克隆,而是fork这个仓库”。AI会基于你的反馈重新理解视频。
- 如果选择“是”:CLI会基于确认的叙述,生成结构化的Skill文件。
实操心得:如何录制一个“好教”的视频?
- 旁白是你的秘密武器:一边操作一边说出你的思考。“我现在要点击这个筛选器,因为我们需要找员工数在50人以上的公司...哦,这里弹出了登录框,我需要先用测试账号登录。”这些语音信息是AI理解你意图的黄金数据。
- 保持连贯,但不必完美:不需要像做教程一样一气呵成。如果操作错了,退回去重做即可。AI能理解“探索”和“纠正”的过程,这反而有助于它生成更健壮的技能(包含错误处理逻辑)。
- 聚焦关键界面:尽量让浏览器或应用窗口占据大部分屏幕,减少无关的桌面切换。清晰的UI有助于AI更准确地识别元素。
- 控制时长与复杂度:对于极其复杂的流程(超过50步),考虑拆分成2-3个关联的技能,而不是一个超长视频。这有利于技能的复用和组合。
文本描述模式 (-d):执行provision teach -d “描述你的工作流”时,你是在直接定义技能的“目标”。描述的质量直接决定生成技能的质量。
- 好的描述:“登录AWS控制台,进入S3管理页面,创建一个以‘project-data-’为前缀、后面接今日日期(格式YYYYMMDD)的新存储桶,并为其启用版本控制和默认加密。”
- 模糊的描述:“弄一下S3存数据的东西。”后者会让AI产生大量不确定的猜测,生成技能可能无法使用。
注意事项:环境变量与敏感信息技能中经常会涉及API密钥、登录凭证等敏感信息。Provision CLI生成的
skill.json文件会定义requiredEnv字段。切勿将真实的密钥写在技能描述或视频旁白中。正确的做法是:在描述中指明需要哪些环境变量,例如“此技能需要AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY”。在实际安装和使用技能前,用户需要在自己的环境中配置这些变量。CLI在安装时会提示用户。
3.2 技能管理:本地编辑、迭代与查看
创建技能后,provision skills系列命令让你能像管理代码一样管理技能。
provision skills edit <name>:这是技能迭代的核心。它支持三种模式,对应三种不同的迭代场景:
- 自然语言编辑 (
-d):当你发现技能有缺陷或需要增强时,无需重录视频或重写整个描述。例如,provision skills edit># 1. 检查Node.js版本(需>=18) node --version # 2. 选择使用模式:这里我们使用npx,无需安装 # 无需执行 npm install -g # 3. 获取Gemini API Key(用于离线模式) # 访问 https://aistudio.google.com/apikey 免费创建 # 将获得的API Key设置为环境变量,或后续在命令中指定 export GEMINI_API_KEY=your_actual_api_key_here4.2 通过文本描述创建技能
我们首先尝试用文本描述来创建这个技能。
# 使用离线模式(Gemini API)创建技能 GEMINI_API_KEY=$GEMINI_API_KEY npx @provision-ai/cli teach -d “打开浏览器,访问技术博客 ‘example.com/blog’。定位文章列表区域,提取前5篇文章的标题和对应的文章详情页链接。将结果整理成JSON格式,并保存到当前目录下的 ‘latest_posts.json’ 文件中。” -n scrape-tech-blog执行后,CLI会与AI交互,生成技能草案。它会输出类似以下内容并等待确认:
我将创建一个名为 ‘scrape-tech-blog’ 的技能。 根据您的描述,我理解步骤是: 1. 启动浏览器,导航至 ‘https://example.com/blog‘。 2. 等待页面加载完成,定位文章列表容器(可能通过CSS选择器如 ‘.post-list’ 或 ‘article’)。 3. 遍历前5个文章元素。 4. 从每个元素中提取标题文本和链接(href属性)。 5. 将提取的数据构造成一个包含’title’和’url’键的JSON数组。 6. 使用文件系统工具,将该JSON数组写入 ‘./latest_posts.json’。 请确认以上步骤是否准确,或需要进行修改。 [确认] [编辑] [取消]选择“确认”后,CLI会在
~/.provision/skills/scrape-tech-blog/目录下生成技能文件。4.3 审查与测试生成的技能
生成后,不要急于发布。先仔细审查技能内容,并在本地测试。
# 1. 查看技能详情 npx @provision-ai/cli skills info scrape-tech-blog # 2. 查看生成的SKILL.md文件内容 cat ~/.provision/skills/scrape-tech-blog/SKILL.md打开
SKILL.md,你会看到一份结构化的指令,可能如下所示:# scrape-tech-blog **目标**: 从 example.com/blog 抓取最新5篇文章的标题和链接,保存为JSON。 **所需工具**: browser, filesystem **步骤**: 1. 使用 browser 工具打开 https://example.com/blog。 2. 等待页面加载完成。使用 browser.page.waitForSelector(‘.post-list’) 或类似方法确保内容就绪。 3. 使用 browser.page.$$eval(‘.post-list article:not(:nth-child(n+6))’, articles => { … }) 提取前5篇文章的数据。 4. 将提取的数据(数组形式)传递给 filesystem 工具,写入文件 ‘latest_posts.json’。发现问题:AI生成的CSS选择器(
.post-list article)是猜测的。如果目标网站的结构不同,技能就会失败。这就是文本描述的局限性。4.4 通过视频教学进行精准修正
为了确保技能能精准定位元素,我们改用视频教学来“录制”一次准确的操作。
- 录制屏幕:使用系统自带的录屏工具(如macOS QuickTime, Windows Xbox Game Bar),清晰完整地录制一次访问
example.com/blog、滚动到文章列表、并打开开发者工具(F12)检查元素的过程。在录制时,可以这样旁白:“现在我在打开博客首页…页面加载完成了。我需要找到文章列表,让我检查一下元素…看,文章都包裹在一个CSS类为 ‘.posts-container’ 的div里,每个文章标题是 h2 > a 标签。” - 使用视频重新教学或编辑:
# 方法A:直接用视频创建新技能(如果之前没创建) # GEMINI_API_KEY=$GEMINI_API_KEY npx @provision-ai/cli teach -v ~/Desktop/blog_recording.mp4 -n scrape-tech-blog-precise # 方法B:更推荐,用视频编辑已存在的技能(迭代) GEMINI_API_KEY=$GEMINI_API_KEY npx @provision-ai/cli skills edit scrape-tech-blog -v ~/Desktop/blog_recording.mp4 - AI会分析视频,并很可能识别出你使用开发者工具检查元素的动作,从而生成一个使用正确选择器(如
’.posts-container article h2 a’)的技能。它会提示你:“检测到您使用了开发者工具,并查看了元素结构。我将把选择器更新为 ‘.posts-container article h2 a’。是否确认?”
4.5 登录Provision平台并发布技能
本地技能测试无误后,可以将其分享给团队。
# 1. 登录Provision平台(首次需要) npx @provision-ai/cli login # 按提示在浏览器中完成授权 # 2. 发布技能到团队库 npx @provision-ai/cli publish scrape-tech-blog -c “初始版本,通过视频教学修正了CSS选择器,确保能准确定位文章元素。”发布成功后,你会得到一个URL,可以在Provision的Web界面查看该技能。
4.6 安装技能到本地AI工具
现在,你或你的队友可以在自己的机器上安装这个技能。
# 1. 登录(如果尚未登录) npx @provision-ai/cli login # 2. 从团队库安装技能 npx @provision-ai/cli install scrape-tech-blogCLI会弹出多选框,让你选择安装到哪些AI工具。假设你选择了Claude Code和Cursor,技能文件就会被分别复制到
~/.claude/skills/scrape-tech-blog/和~/.cursor/skills/scrape-tech-blog/。4.7 在AI工具中使用技能
安装完成后,打开你的AI工具(如Claude Code)。
- 在聊天界面中,通常会有触发技能的快捷方式或命令。例如,在Claude Code中,你可能可以输入
/skills来查看已安装的技能列表。 - 找到
scrape-tech-blog并执行它。AI助手会读取SKILL.md中的指令,自动控制浏览器打开网页、抓取数据、并保存文件。 - 你可以在当前目录下找到生成的
latest_posts.json文件。
5. 常见问题排查与实战技巧
在实际使用中,你可能会遇到一些问题。以下是一些常见情况的排查思路和解决方案。
5.1 技能创建阶段问题
问题1:视频分析时间过长或失败。
- 可能原因:视频文件过大(超过100MB)、网络不稳定、或AI服务暂时不可用。
- 解决方案:
- 压缩视频文件。使用工具(如HandBrake)将视频转换为分辨率适中(如720p)、帧率较低的MP4格式。
- 检查网络连接,并确认你的Gemini API Key有效且额度充足。
- 如果使用Provision平台,查看其服务状态页面。
问题2:生成的技能步骤不准确或遗漏关键细节。
- 可能原因:视频内容过于复杂/模糊,或文本描述不够精确。
- 解决方案:
- 对于视频:确保录制时操作连贯、界面清晰。添加详细的旁白解释“为什么”要这么做。对于复杂流程,拆分成多个子技能。
- 对于文本:采用“目标-步骤-约束”的描述格式。例如:“目标:在Github创建新仓库。步骤:1. 登录Github。2. 点击‘+’图标选择‘New repository’。… 约束:仓库需设置为Private,初始化时添加一个MIT License的README文件。”
- 通用:善用
provision skills edit -d进行自然语言修正。告诉AI哪里错了,应该改成什么样。
问题3:
provision teach命令卡住或无响应。- 可能原因:CLI在等待AI响应时超时,或者与本地编辑器(如配置了
EDITOR环境变量)的交互出现问题。 - 解决方案:
- 增加超时时间(如果CLI支持相关环境变量)。
- 检查
~/.provision/config.json文件,确保没有错误的配置。 - 尝试使用
-d或-v参数直接提供输入,避免进入交互模式。
5.2 技能执行阶段问题
问题1:AI助手执行技能时失败,报错“找不到元素”或“超时”。
- 可能原因:目标网站结构发生变化,或者技能中的等待逻辑不足。
- 解决方案:
- 更新技能:使用
provision skills edit -v重新录制一段针对当前网站的视频,让AI学习新的页面结构。 - 增强健壮性:手动编辑
SKILL.md,增加更智能的等待条件。例如,将waitForSelector(‘.posts-container’)改为waitForSelector(‘.posts-container, .new-posts-list’, { timeout: 10000 }),以兼容可能的类名变化,并设置明确超时。 - 添加错误处理:在技能描述中增加容错指令,如“如果找不到
.posts-container元素,则尝试查找.article-list元素”。
- 更新技能:使用
问题2:技能需要环境变量(如API Key),但执行时未设置。
- 可能原因:技能定义了
requiredEnv,但用户未在运行AI工具的环境中导出这些变量。 - 解决方案:
- 在运行AI工具(如Claude Code)的终端或环境配置文件中,导出所需的环境变量。
export GITHUB_TOKEN=your_token_here # 然后在此终端中启动你的AI工具- 某些AI工具可能提供了图形化界面来管理技能的环境变量,请查阅对应工具的文档。
问题3:安装技能时,提示“目标目录不存在”或“权限被拒绝”。
- 可能原因:目标AI工具(如Cursor)的技能目录路径可能因版本或自定义安装而不同,或者当前用户没有写入权限。
- 解决方案:
- 手动确认目标AI工具的技能目录路径。例如,Cursor的技能目录可能在
~/.cursor/skills/或~/Library/Application Support/Cursor/skills/。 - 使用
provision install时,如果提供的路径不存在,CLI可能会尝试创建。如果权限不足,需要使用sudo(不推荐)或修改目录权限。更好的做法是检查AI工具的文档,确认正确的技能安装位置。
- 手动确认目标AI工具的技能目录路径。例如,Cursor的技能目录可能在
5.3 团队协作与平台问题
问题1:
provision publish失败,提示“未授权”或“技能已存在”。- 可能原因:登录令牌过期,或尝试发布一个与你本地版本冲突的远程技能。
- 解决方案:
- 运行
provision logout然后重新provision login获取新令牌。 - “技能已存在”通常意味着远程有同名技能。你可以选择:
- 更新:CLI通常会提示你更新版本,直接确认即可。
- 重命名:使用
provision skills edit -d “将技能名称改为scrape-tech-blog-v2”修改本地技能名后再发布。
- 运行
问题2:从团队库
install的技能不是最新版本。- 可能原因:本地缓存,或者安装时未选择最新版本。
- 解决方案:
- 先运行
provision pull <skill-name>强制从服务器拉取最新版本到本地~/.provision/skills/。 - 然后再运行
provision install <skill-name>进行安装。
- 先运行
问题3:云智能体(Agent)执行技能时权限不足。
- 可能原因:部署到云智能体的技能,其执行环境是云端容器,可能无法访问你本地的文件系统或需要内网访问的资源。
- 解决方案:
- 对于文件操作,技能应设计为将结果上传到云存储(如S3)或发送到Webhook,而非写入本地文件。
- 对于需要访问内部系统的技能,需要确保Provision云智能体所在的网络能够访问这些系统,或者将技能改为由在可控内网环境中运行的智能体(如自托管OpenClaw)来执行。
5.4 实战技巧与高级用法
技能组合与模块化:不要试图创建一个“巨无霸”技能。将复杂流程拆分为多个单一职责的小技能。例如,“数据抓取”是一个技能,“数据清洗”是另一个,“数据入库”是第三个。然后可以创建一个“编排”技能,按顺序调用它们。这提高了复用性和可维护性。
利用
skill.json进行配置:除了SKILL.md,skill.json文件中的metadata字段可以用来存储技能的配置项。例如,可以为抓取技能设置一个maxPosts参数。在SKILL.md中,可以通过变量引用的方式使用它,使得技能更灵活。为技能编写高质量的
README.md:SKILL.md是给AI看的,README.md是给人看的。在README中写明技能的用途、输入输出、所需环境变量、常见问题以及更新日志。这对于团队协作至关重要。离线模式的灵活应用:即使团队使用Provision平台,个人在探索和创建技能原型时,使用离线模式(自带Gemini API Key)可以避免消耗团队平台的额度,并且响应速度可能更快。待技能成熟后再发布到团队库。
安全第一:永远不要在技能文件、视频旁白或文本描述中硬编码任何密码、密钥或个人访问令牌(PAT)。始终通过环境变量来传递。在
skill.json的requiredEnv字段中明确声明,并在README.md中说明如何设置。
- 录制屏幕:使用系统自带的录屏工具(如macOS QuickTime, Windows Xbox Game Bar),清晰完整地录制一次访问
