Orca 按工作区环境(Per-Workspace Environments):从 skill-stub 到版本一致的运行时配方指南
本文以 skill-stubs/orca-per-workspace-env.md 为主体,讲解 Orca 的「按工作区环境」(per-workspace environment)技能桩(discovery stub)机制:它如何为每个 workspace 按需创建一次性的云沙箱、VM 或本地运行时,如何在本会话中正确解析 orca 可执行文件,如何通过 orca skills get 拉取与二进制版本严格一致的完整操作指南,以及在旧版二进制上如何安全地降级为只读探测。读完后,你将掌握解析 Orca CLI、加载版本匹配指南、运行 vm recipe doctor 静态检查,并理解 environmentRecipes 在 orca.yaml 中的底层类型与校验实现。
1. 为什么是「发现桩」而不是静态使用指南
skill-stubs/orca-per-workspace-env.md 开宗明义:这个文件是一个 discovery stub(发现桩),不是使用指南。完整、版本匹配的 per-workspace 环境参考文档由 orca 二进制自身通过 skills get 命令提供——这是有意为之的设计,目的是让指南永远不会与实际执行命令的二进制发生漂移(drift)。
这意味着一个清晰的分工:
- 技能桩(本文件,位于仓库 skill-stubs/ 目录):只负责「发现」与「定位」——告诉你何时应该启用 Orca 来处理 per-workspace 环境,以及如何拿到真正的指南;
- 完整指南(由二进制内嵌提供):包含 provider 配置、base 快照、auth 快照、
environmentRecipes字段、生命周期脚本、orca vm recipe doctor的全部细节,且与执行你命令的那个二进制版本一一对应。
从源码结构看,完整指南确实被内嵌进了 CLI:src/cli/bundled-skill-guides.ts 中定义了 ORCA_PER_WORKSPACE_ENV_MARKDOWN 常量,其内容与 skills/orca-per-workspace-env/SKILL.md 的 frontmatter(name: orca-per-workspace-env 及 description)保持一致。skills get 命令的实现在 src/cli/handlers/skills.ts,命令规格声明在 src/cli/specs/skills.ts(用法为 orca skills get <topic> [--full] [--json])。
技能桩定义的启用时机(Engage 场景)值得完整保留——当你设置、审查、调试或验证一个 per-workspace 环境配方时应启用 Orca,它覆盖的范围是「按需、一次性的运行时(云沙箱、VM 或本地),为每个 workspace 全新生成」,具体包括:
- 首次搭建:provider 前置条件、可复用的 base 快照、coding-agent 鉴权快照、凭据与状态文件,而不仅仅是 per-workspace 生命周期脚本;
- 修复 orca.yaml 中的某个
environmentRecipes条目; - 搭建 provider 生命周期脚本;
- 解决
orca vm recipe doctor的失败。
同时技能桩划定了 Orca 的能力边界:Orca 是一个 thin wrapper(薄封装层)——你(Agent)负责引导、检测、搭脚手架(scaffold);永远不拥有用户的云账号、账单、镜像或凭据,并且绝不在没有用户明确许可的情况下花钱。
2. 为本会话解析 CLI 可执行文件
技能桩给出的第一段可操作内容是「Resolve the CLI for this session」——选择一个可执行文件并在本会话所有后续命令中复用同一个。解析规则按优先级排列:
ORCA_CLI_COMMAND环境变量已设置 → 直接使用它的值。Orca 为受管理的 WSL 会话导出这个变量;- 否则,处于 dev checkout 且会话暴露了
ORCA_DEV_REPO_ROOT→ 使用orca-dev; - 否则,在 Orca 托管终端之外的 Linux 上 → 使用
orca-ide。技能桩特别警告:不要在那里运行裸orca——在 Orca 终端之外,orca通常解析为 GNOME Orca 屏幕阅读器(/usr/bin/orca),会在用户机器上启动语音朗读; - 否则 → 使用
orca。
后续内容中,ORCA 是一个占位符,指代你解析出的可执行文件:运行任何命令前都要先替换它,不要真的创建 shell 变量、更不要字面执行 ORCA。这套写法在 POSIX shell、PowerShell 和 cmd.exe 中行为一致。
失败处理规则同样明确:如果选定的可执行文件无法运行,报告它的原始错误并停止,不要回退(fall through)到另一个可执行文件——那可能悄悄指向另一个 Orca 构建,造成版本漂移,恰恰违背了 stub 机制的初衷。
3. 运行 Orca 命令前先加载完整指南
技能桩要求:在运行任何 Orca 命令之前,先执行:
ORCA skills get orca-per-workspace-env
这会打印出与将要处理你下一条命令的二进制精确版本匹配的完整指南——涵盖 provider 配置、base 与 auth 快照、orca.yaml 中的 environmentRecipes、生命周期脚本以及 orca vm recipe doctor。先读它,再运行你需要的具体命令。
技能桩同时给出两条纪律:
- 不要凭记忆或凭这份 stub 的缓存副本猜测子命令与 flag。 它们在 Orca 各版本之间会变化,这份文件刻意不再列举它们;
- 用
ORCA status --json确认应用已启动(必要时用ORCA open --json启动),并且Agent 驱动的调用优先使用--json。
4. 旧版 Orca 的有界降级:只有 skills get 不可用时的兜底
技能桩为「较老的 Orca 不认识 skills get」准备了一个严格受限的兜底流程,其触发条件与边界都非常苛刻:
- 仅当选定的二进制明确报告
skills get是一个未知命令时,才使用兜底。任何其他失败都不能作为「二进制过旧」的证据——应当如实报告,而不是猜测或更换可执行文件; - 对已确认的 pre-guide 二进制,只允许使用下面这对有界的、只读的引导命令来定位状态,不要死胡同、不要发明命令:
ORCA status --json
ORCA vm recipe doctor <recipe-id> --repo-path <repo> --json
其中 doctor 命令是免费的静态检查。技能桩特别强调:永远不要在未获得用户明确批准的情况下追加 --provision,因为它会创建 provider 资源并可能产生费用。
之后应告知用户:更新 Orca 即可通过 ORCA skills get orca-per-workspace-env 恢复完整的版本匹配指南。超出上述命令的范围,应当询问用户,而不是猜测这个旧版二进制可能不支持的命令面。
5. 源码级佐证:environmentRecipes 的类型定义与 doctor 校验
技能桩提到的 environmentRecipes 与 orca vm recipe doctor,可以在当前仓库中找到完整的实现证据,这为「按 stub 指路、以二进制为准」的工作方式提供了底层支撑。
5.1 environmentRecipes 的数据结构
在 src/shared/orca-yaml-hook-types.ts 中,environmentRecipes 是 OrcaHooks(即 orca.yaml 的 hook 配置)的一个可选字段,与 scripts.setup、scripts.archive 等并列。每个条目的类型是 OrcaVmRecipe:
export type OrcaVmRecipe = {
id: string
name: string
create: string
checkoutMode?: EphemeralVmCheckoutMode
description?: string
suspend?: string
resume?: string
destroy?: string
destroyDisabled?: boolean
}
字段语义与技能桩描述的生命周期合同一致:create 必填,suspend/resume/destroy 可选,destroyDisabled 对应 destroy: none 的显式禁用;checkoutMode 的取值来自 EphemeralVmCheckoutMode = 'orca-worktree' | 'provisioned-root'。此外,OrcaHooks 上还带有 environmentRecipeDiagnostics 字段(OrcaVmRecipeDiagnostic[],含 index、可选 field 和 message),用于承载解析 environmentRecipes 时的非致命校验问题——也就是说,配方写错不会直接让 orca.yaml 不可读,而是以诊断形式暴露。
解析入口在 src/shared/orca-yaml.ts:normalizeVmRecipes(record.environmentRecipes) 负责归一化,仅当解析出非空配方时才会把 environmentRecipes 字段写回规范化结果。本仓库根目录的 orca.yaml 目前只有 scripts.setup 而没有 environmentRecipes,正说明该字段是项目级的可选配置。
5.2 vm recipe doctor 的静态检查实现
CLI 侧的命令规格在 src/cli/specs/vm.ts,其声明与技能桩的兜底命令完全对应:
orca vm recipe doctor <recipe-id> [--repo-path <path>] [--provision|--connect] [--json]
规格中的 notes 明确写着:默认模式非破坏性、不执行配方命令;只有 --provision 或 --connect 才会真正运行配方、校验其结果并(在配置了清理时)执行清理。这解释了为什么技能桩可以把不带 --provision 的 doctor 称为「免费的静态检查」、而把 --provision 视为需要用户明确批准的危险操作。
静态检查的具体逻辑在 src/shared/ephemeral-vm-recipe-doctor.ts 的 doctorEphemeralVmRecipe 中,可以逐项核对技能桩承诺的检查内容:
- 本地执行目标(v1 限制):
localExecutionSupported为假时直接失败,消息为 “Ephemeral VM recipes run on the local desktop host in v1.”; - repo 路径检查:路径不存在或不是目录即失败,remediation 提示传入包含
orca.yaml的本地仓库; recipe.exists:在environmentRecipes中按id查找配方,未找到即失败;recipe.create命令路径检查:通过firstRecipeCommandToken提取命令首 token(支持引号包裹的 token),空命令失败,绝对路径给出 warn(建议使用仓库相对路径以便跨机器工作);recipe.destroy三分支:destroyDisabled时 warn(“Only use destroy: none when provider resources are cleaned up elsewhere.”);配置了destroy则做路径检查;两者皆无则 warn 要求显式设置destroy: none或补充destroy;suspend/resume成对性:源码注释解释了原因——被suspend挂起的工作区只有存在resume才能被唤醒,只定义其一会把工作区永远“卡睡”,因此单边定义会得到recipe.suspend_resume_pairing的 warn。
这些检查与技能桩“先静态、后花钱”的安全叙事严格吻合:doctor 的默认模式不启动任何东西,--provision 才会跑 create → 校验 → destroy 的真实闭环,因此后者必须获得用户一次性明确批准。
5.3 指南分发链的闭环
把三条证据串起来,可以得到完整的版本一致性链路:
- Agent 通过 skill-stubs/orca-per-workspace-env.md 知道「什么时候该启用 Orca、去哪找完整指南」;
ORCA skills get orca-per-workspace-env从二进制内嵌的 src/cli/bundled-skill-guides.ts 打印出与该二进制同版本的完整指南(skills/orca-per-workspace-env/SKILL.md 是其源形态);- 指南中的一切命令(如
vm recipe doctor)最终由 src/cli/specs/vm.ts 声明的命令面与 src/shared/ephemeral-vm-recipe-doctor.ts 的校验逻辑执行,其结果通过--json供 Agent 消费。
6. 实践要点与边界总结
把技能桩全文提炼为可执行清单:
| 步骤 | 命令 / 动作 | 约束 |
|---|---|---|
| 解析可执行文件 | ORCA_CLI_COMMAND → orca-dev → orca-ide(Linux 非托管终端)→ orca |
一次选定、全程复用;不可运行时报告原错并停止,不得换可执行文件 |
| 加载指南 | ORCA skills get orca-per-workspace-env |
运行任何 Orca 命令之前;不凭记忆猜 flag |
| 确认应用状态 | ORCA status --json(必要时 ORCA open --json) |
Agent 调用优先 --json |
旧版兜底(仅 skills get 明确未知时) |
ORCA status --json + ORCA vm recipe doctor <id> --repo-path <repo> --json |
只读;未经用户明确批准禁止 --provision |
| 告知用户 | 更新 Orca 以恢复完整版本匹配指南 | 超出兜底命令面时询问用户,不猜测 |
边界(Boundaries)方面,技能桩反复强调的两条红线必须内化:其一,Orca 是薄封装——引导、检测、搭脚手架可以,但云账号、账单、镜像、凭据的所有权永远在用户手里;其二,任何可能花钱的操作(provider 资源创建,即 --provision)都必须在用户明确许可之后执行,这一点在技能桩正文、兜底章节中出现两次,与 src/cli/specs/vm.ts 中「默认非破坏性」的规格声明互为印证。
7. 延伸阅读(仓库内路径)
- 技能桩本体:skill-stubs/orca-per-workspace-env.md
- 技能源文件:skills/orca-per-workspace-env/SKILL.md
- 内嵌指南构建:src/cli/bundled-skill-guides.ts、src/cli/handlers/skills.ts、src/cli/specs/skills.ts
- 配方类型定义:src/shared/orca-yaml-hook-types.ts、解析归一化:src/shared/orca-yaml.ts
- doctor 静态校验:src/shared/ephemeral-vm-recipe-doctor.ts、CLI 规格:src/cli/specs/vm.ts、doctor 行为测试:src/cli/index-vm-recipe-doctor.test.ts
- 项目级配置示例(含
scripts.setup,未配置environmentRecipes):orca.yaml
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00