news 2026/9/8 16:36:10

Orca 工程规范全解:AGENTS.md 如何约束一个三端并行的 Electron 多智能体开发环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Orca 工程规范全解:AGENTS.md 如何约束一个三端并行的 Electron 多智能体开发环境

Orca 工程规范全解:AGENTS.md 如何约束一个三端并行的 Electron 多智能体开发环境

【免费下载链接】orcaOrca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.项目地址: https://gitcode.com/GitHub_Trending/orca48/orca

Orca 的仓库根目录 AGENTS.md 是一份面向 AI 协作与人类贡献者共同的工程宪法:它规定设计系统取舍、代码风格边界、验证命令,以及跨平台、SSH、Git 兼容性等高风险区域的硬性约束。本篇以该文档为骨架逐节展开,并结合 package.json、src/shared/child-process/run-process.ts、src/shared/wsl-login-shell-command.ts 等源码印证每条规则背后的真实实现,读完你会掌握 Orca 的完整验证链路(pnpm tc/pnpm test/ oxlint 体系)、Windows/WSL/Linux 三平台的进程与命令边界,以及 Git 能力探测与远程线协议兼容的设计原则。

项目背景:Orca 是什么,为什么需要这份规范

Orca 的定位是"管理并行智能体舰队的 ADE(Agent Development Environment)"——package.json 中描述为Next-gen IDE for parallel agentic development,支持在用户自己的订阅上运行任意编码智能体,覆盖桌面、移动端与远程运行时。这意味着它的代码同时运行在三类宿主上:

  • 原生桌面宿主:Electron 主进程(src/main/,含 369 个文件的daemon/、316 个文件的ssh/、198 个文件的github/等模块);
  • WSL 发行版:通过wsl.exe执行用户环境中的 Git 与 shell;
  • SSH 远程主机:通过 src/main/ssh/ 的通道执行远端工作。

加上独立的 mobile/ Expo 工程与 cloud/ 中继服务,同一个仓库内并存 Electron、浏览器、Node、移动、云五类运行时。AGENTS.md 的绝大多数条款——跨平台行为、远程线兼容、Git 二进制兼容——正是为这种"一仓多宿主"结构而写:它们不是风格偏好,而是防止在 A 宿主上验证通过的改动在 B 宿主上崩溃的护栏。

设计系统:token 唯一真源与解析顺序

AGENTS.md 开篇即声明设计系统规则:所有 UI 工作(布局、颜色、字体、间距、组件选型、UX 行为)必须遵循 docs/STYLEGUIDE.md;颜色与排版 token 以 src/renderer/src/assets/main.css 为唯一真源(canonical source),组件基元取自src/renderer/src/components/ui/下的 shadcn primitives;禁止在已有 token 覆盖该角色时新造颜色值、字号或阴影层级。当 STYLEGUIDE.md 未覆盖某场景时,按该文档最后一节的解析顺序(resolution order)处理。

这与依赖声明互相印证:package.json 的 devDependencies 中包含shadcntailwindcssradix-uiclass-variance-authoritytailwind-merge,说明 Orca 的组件体系正是 Tailwind v4 + Radix + shadcn 的 token 驱动方案。对贡献者的实操含义是:改 UI 前先在 main.css 中检索是否已有对应 token,而不是新增硬编码值。

紧随其后的Electron UI Validation条款规定:渲染后 Orca UI 的验证应使用$electronskill 与 Playwright CDP,禁止使用 computer-use 做 Orca UI 验证。这与 tests/playwright.config.ts 中的electron-headless/electron-headful两个 project 对应——仓库中大量test:e2e:*脚本(如 package.json 的test:e2e定义)都显式指定--project electron-headless,即通过 CDP 协议直接驱动 Electron 渲染进程,而非像素级操作模拟。

代码风格四条军规

AGENTS.md 的 Style 部分给出四条规则,每一条都有对应的机械化检查。

先复用,再重写(Reuse Before Reimplementing)

任何规模的改动——函数、组件、IPC 通道、状态 store 乃至整个子系统——动手前先检查是否已有实现(或近乎满足的实现);有则扩展或泛化,没有才从零写。且检查必须与成本相称:琐碎代码快速搜一下即可,构建重要模块前必须认真检索。这条规则直击多宿主仓库的通病:src/main/ipc/已有 978 个文件,src/shared/有 1761 个文件,不先检索几乎必然写出平行实现。

注释只写非显然的 WHY

不写冗长注释、不解释显然内容、不逐行走读代码("WHY not HOW"),能一句话说清就不写两行。在 src/shared/child-process/run-process.ts 中可以看到该规范的执行样本:常量PROCESS_EXIT_GRACE_MS上方用一段"Why give up at all"解释为何要放弃等待子进程退出,但全部聚焦动机而非机制。

禁止禁用 max-lines

绝不添加任何形式的max-lines禁用(eslint-disable max-linesoxlint-disable max-lines或行级变体),也绝不修改 mobile/.oxlintrc.json 中按文件放宽max-lines的值。配套的机械化实现是 ratchet(棘轮)机制:config/max-lines-baseline.txt 的头部注释明确写着——

This is a RATCHET: the list may only SHRINK. Do NOT add entries to get CI green — split the oversized file instead (AGENTS.md → "Do Not Disable Max Lines").

即基线清单只允许缩短、不允许变长,超限文件必须拆分而非豁免。CI 侧由pnpm check:max-lines-ratchet(对应 config/scripts/check-max-lines-ratchet.mjs)与--prune参数(仅移除失效条目)执行。同类的棘轮还有check:ts-nocheck-ratchetcheck:runtime-electron-ratchet,在 package.json 的lint脚本中串联执行。

文件命名:拒绝 helpers / utils / common

禁止用helpersutilscommonmisc等零信息命名,文件应按其实际内容命名,优先具体领域概念(tab-group-state.tsterminal-orphan-cleanup.ts)而非泛化角色(tabs-helpers.tsterminal-utils.ts)。文档给出的诊断法值得注意:"当你想叫helpers时,这个文件多半承担了多个职责,应该拆分;或者代码里藏着一个更好的名字,能描述这些函数真正操作的对象。"从src/shared/child-process/目录的实际命名可以验证该规范落地:bounded-output-sink.tsprocess-tree-termination.tsretryable-process-exit-proof.ts——每个文件名都是其职责的精确陈述。

此外文档要求类型声明优先.ts而非.d.ts(该节在原文中仅有标题,具体判据留待 STYLEGUIDE 与仓库惯例)。

验证变更的标准链路

AGENTS.md 给出三条日常验证命令,全部可在 package.json 中逐一对应:

命令实际展开说明
pnpm tcnode config/scripts/run-typecheck-projects-in-parallel.mjs并行跑 node / cli / web 三个 tsconfig 项目;单项目可用tc:node(config/tsconfig.node.json)、tc:cli(config/tsconfig.tc.cli.json)、tc:web(config/tsconfig.tc.web.json)
pnpm test [path/to/file.test.ts]node config/scripts/ensure-native-runtime.mjs --runtime=node && vitest run --config config/vitest.config.ts测试前先经ensure-native-runtime校验 node-pty 等原生运行时,保证本地环境与 CI 一致
pnpm run check:code-quality:changednode config/scripts/check-changed-code-quality.mjs仅对变更文件做 oxlint 代码质量检查;完整的pnpm lint很慢(串联 10 个 audit/check 步骤)

格式化统一为pnpm format(底层是oxfmt --write .)。值得注意 package.json 中lint-staged配置:提交时对!(cloud)/**的 ts/tsx/js/json/css 文件依次执行oxlintoxlint --config config/oxlint-react-doctor.json(React 专项规则)、oxfmt --write,即风格规则在钩子层就已强制执行,而engines.node = 24packageManager = pnpm@12.0.0则框定了验证环境的前提。

跨平台约束:从规范条文到源码实现

AGENTS.md 篇幅最重的部分。核心前提是:Orca 面向 macOS、Linux、Windows 三端,所有平台相关行为必须藏在运行时检查之后。文档逐条列出约束,以下结合源码展开。

键盘快捷键:平台探测 + CmdOrCtrl

永不硬编码e.metaKey;用平台检查(如navigator.userAgent.includes('Mac'))在 Mac 上选metaKey、在 Linux/Windows 上选ctrlKey;Electron 菜单 accelerator 一律用CmdOrCtrl。UI 显示层同理:Mac 显示/,其他平台显示Ctrl+/Shift+

文件路径:永远用 path 工具

使用path.join或 Electron/Node 的路径工具,绝不假设/\分隔符。

Windows 子进程:runProcess / spawnProcess 是唯一入口

这是 AGENTS.md 中证据链最完整的一条:Windows 子进程必须经 src/shared/child-process/ 的runProcess/spawnProcess启动,永不直接child_process。其承诺是:固定windowsHide、拒绝shell: true、编码.cmd/.bat参数,使CommandLineToArgvWcmd.exe都无法篡改参数;且"一个 ratchet 测试会对任何新的直接 import 失败"。

run-process.ts 的resolveSpawn函数把三条承诺全部落实,且注释解释了"为什么":

  • windowsHide: true无条件开启——因为 Orca 主进程是 GUI 子系统、不拥有控制台,任何它启动的控制台子系统子进程都会抢出一个可见的 conhost 黑窗抢占前台,"那一刻敲进 Orca 终端的按键会落进黑盒里";
  • shell: false硬编码——shell: true会无转义拼接参数(Node 官方警告 DEP0190),并静默使windowsHide失效;
  • .cmd/.bat程序被重定向为ComSpec(cmd.exe)+buildWindowsCmdShimCommandLine构造的单条命令行,并置windowsVerbatimArguments: true——因为 Node 出于 CVE-2024-27980 缓解拒绝在无 shell 下 spawn.cmd,必须自己拼命令行才能既保住参数完整又藏住控制台。

边界由 src/shared/child-process/child-process-import-boundary.test.ts 守护,这正是文档所说的"任何新直接 import 都会让 ratchet 测试失败"的实现。

Windows 进程枚举:一张表取代七个 PowerShell 读者

AGENTS.md 规定:读取进程表必须走 src/main/windows/windows-process-table.ts,永不 forkpowershell.exe,并指向 docs/reference/windows-process-enumeration.md。

该模块的头部注释(windows-process-table.ts)给出了完整的动机与实测数据:此前有七个独立读者各自 forkpowershell.exeGet-CimInstance Win32_Process(外加已被 Windows 11 24H2 移除的wmic回退),后果是 PowerShell 转录策略录下约 289 GB / 140 万个文件(扫描约每 2 秒一次)、组策略或 AV 拦截把"查询不可用"误读为"无证据"从而让 PTY 进程树存活过自己的拆除、以及约 700 ms 的单次成本随终端面板数线性放大。改为本模块后,用 Toolhelp32 快照在同一问题域上无子进程作答:在 Windows 11(1050 进程)实测 p50/p95 为15.9 / 17.5 ms(pid+ppid+name)、30.6 / 33.7 ms(加 memory+commandLine),而 PowerShell CIM 是706 / 723 ms。从源码结构看,该模块通过 optionalDependency@vscode/windows-process-treegetAllProcesses完成快照,这正是 AGENTS.md 该条目的量化支撑。

Windows EDR 行为姿态

在 docs/reference/windows-edr-posture.md 之前,不要添加-ExecutionPolicy Bypass-EncodedCommand、带转义自由文本的cmd.exe /c、按操作 spawn 解释器、或运行时Add-Type编译——行为型 EDR 对每一项单独评分,"已签名"并不能豁免。这条约束的含义是:任何看似无害的 Windows 脚本形态变化都会改变终端用户的 EDR 评分,改动前必须先读参考文档。

WSL 命令:--exec与登录 shell 围栏

AGENTS.md 要求:argv 必须用buildWslExecArgs构造(永远--exec——因为在--之后,wsl.exe会在每个参数里展开$name,静默改写脚本);对需要解析 stdout 的命令用buildWslCapturedLoginShellCommand加围栏,因为交互式登录 shell 会把发行版 banner 打到 stdout。

两个函数在 src/shared/wsl-login-shell-command.ts 中实现,源码注释给出了具体失效模式:

  • buildWslExecArgs(L15-L20)返回['-d', distro?, '--exec', ...shellArgs]。注释举例:wsl.exe -- /usr/bin/printf %s '$HOME'会打印出/home/you,因为wsl.exe在参数进入 guest 前就做了环境变量展开——awk '{print $2}'这类脚本会被悄悄改掉,"我们这边再怎么转义都不可靠";而--exec跳过该预处理,argv 原样通过。
  • buildWslCapturedLoginShellCommand(L71 起)则解决相反方向的问题:bash/zsh 必须交互式(-ilc)才能让 PATH 匹配用户自己的终端(nvm/mise/asdf 都装在只有交互式 shell 才读的 rc 文件里),但交互式 shell 又跑 rc/motd,stock Ubuntu 会把"以管理员运行"的提示写到stdout。方案是生成一次性 nonce 围栏标记__ORCA_WSL_CAPTURE_BEGIN_<nonce>__/__ORCA_WSL_CAPTURE_END_<nonce>__,调用方按标记切片取真正的载荷。nonce 每次调用随机生成(注释说明:cat一个恰好引用了固定标记的文件会截断文件内容,一次性 nonce 是唯一能同时保证标记不在前置 rc 输出与后置数据中的写法)。

shell 选择逻辑也值得注意:先getent passwd查用户真实 shell,bash/zsh/ksh/mksh/ash 用-ilc,sh/dash 用-lc(避免 dash 下交互模式的噪音),找不到则逐级回退到/bin/sh -lc

Linux 原生模块:glibc 地板 2.31

Linux 原生模块保持 glibc 地板为Ubuntu 20.04 / glibc 2.31。风险机制:在新版 runner 上从源码编译的模块可能引用地板版本上不存在的符号版本,导致应用在老系统上启动即崩。详见 docs/reference/linux-glibc-compatibility.md;打包流程若发现某个打包原生二进制需要更新的 glibc 会直接失败——对应脚本 config/scripts/verify-linux-glibc-floor.cjs。Windows 侧的 setup/issue 脚本同理:runner 是.cmd批处理文件(除非脚本以#!开头),永不从用户的终端 shell 偏好推导,也永不在 Git Bash 面板里用裸cmd.exe /c启动.cmd(MSYS 会改写/c),细节见 docs/reference/windows-setup-shell.md。

SSH 执行边界:失联不是死亡

AGENTS.md 规定:所有变更必须考虑 SSH 场景,不要假设只有本地执行。在改动任何"上报、停止或列出远端工作"的代码前,先读 docs/reference/ssh-execution-boundary.md,其核心原则是:

  1. 执行宿主拥有一切接触执行的东西——判断、状态、清理都归执行宿主所有;
  2. 失联永不是进程死亡的证据——verdict 词汇表只有三个词:live/unverifiable/exited,且不允许同义词。

这条规则对实现的影响可以从src/shared/child-process/的测试文件名读出影子:retryable-process-exit-proof.tsclose-process-registry.ts等模块处理的是"如何证明进程真的退了"而非"进程大概还在",与unverifiable语义一脉相承。

工作区形态:folder workspace 与 git worktree 并存

"所有变更必须同时考虑 folder workspace 与 git worktree,不要假设每个 workspace 都是 git worktree。"Orca 的 workspace 抽象既覆盖 git worktree(src/main/git/,266 个文件)也覆盖普通文件夹工作区,任何依赖.git元数据存在的代码路径都必须为文件夹形态留出路。

远程线兼容:新旧版本混合是常态

客户端与远端 Orca 服务器独立升级,混合版本是正常状态。改动任何成对客户端与宿主交换的内容(RPC 参数、流帧、任一侧发布的内容)前,须遵循 docs/reference/remote-wire-compatibility.md。文档给出三条精确的兼容判据:

  • 新增可选字段是安全的——旧解码器忽略未知字段即可;
  • 新增流 opcode 必须走能力协商(capability negotiation)——因为旧解码器会静默丢弃未知 opcode,不协商就发帧等于丢数据且无人报错;
  • 改变宿主发布的内容,即使线格式不变也会触达旧客户端——内容语义是隐式协议的一部分。

Git 二进制兼容:2.25 基线与能力缓存

Orca 在原生、WSL、SSH 三类宿主上运行用户自己的Git 二进制,版本可能各不相同。AGENTS.md 规定以Git 2.25为核心工作流基线,细则见 docs/reference/git-compatibility.md。新增或改动 Git 命令时须遵守五条:

  1. 查清每个子命令与选项的引入版本;对更新的行为保留基线兼容回退或安全降级;
  2. 使用GitCapabilityCache并配窄的"不支持"错误谓词,让重复操作不再重试已知无效的命令;不要只信git --version——simple-git之类的封装并不消除宿主版本差异;
  3. 能力状态按执行 Git 的宿主隔离:原生、WSL 发行版、SSH provider、relay 连接各自一份。测试须覆盖首次回退、后续缓存调用、并发探测、宿主隔离四个维度;
  4. 保持 PR CI 中的真二进制兼容契约最新:采用新 Git 特性时,加上版本边界,让首选命令与回退命令都针对代表性 Git 发行版运行;
  5. 保留以全局选项开头的命令形态,如子命令前的-c(worktree-create fetch 使用的 auto-maintenance 抑制依赖它)。

Git 扫描安全:拒绝 ref × tree 扇出

三条操作性规则,直指大规模仓库上的性能陷阱:

  • 永不枚举全部 ref 后对每个 ref 各跑一次git ls-tree -rgit show——这种 ref × tree 扇出可能在下游sort -u或检索取得进展前保留数 GB 输出;
  • 源码检索优先rg;查历史或 ref 时用命名 ref、显式 namespace/path、--max-count与有界输出,不要把无界--all扫描当作首选诊断;
  • 仓库级命令限定在当前仓库与 worktree;确需无界扫描时,先测量 ref 数量、说明代价、取得确认再执行。

提供者兼容与 CLI 限流

最后两条横向约束:GitLab 与其他支持的 git provider 必须与 GitHub 同等对待——provider 特定行为放在显式检查之后,通用 review 概念禁用 GitHub-only 命名(对应仓库中gitlab/bitbucket/gitea/azure-devops/github/五个并行的 provider 模块);留意用户ghCLI 的 API 速率限制——批量请求、避免不必要调用,且所有代码、命令、脚本必须同时兼容 macOS、Linux、Windows。

结语:把规范变成可执行的护栏

AGENTS.md 的真正价值不在条文本身,而在每条条文几乎都对应一个机械化检查:max-lines规则对应 config/max-lines-baseline.txt 与check:max-lines-ratchetchild_process直接 import 禁令对应 child-process-import-boundary.test.ts;glibc 地板对应 verify-linux-glibc-floor.cjs;Git 2.25 基线对应 PR CI 中的真二进制兼容契约。对新贡献者的最佳路径是:先通读 AGENTS.md 与其引用的 docs/reference/ 系列文档,按"先检索复用 → 遵循 token 与命名规范 →pnpm tc/pnpm test/check:code-quality:changed三步验证"的闭环工作,并始终用"这条改动在 WSL、SSH 宿主、旧版客户端上是否依然成立"作为自检问题。

【免费下载链接】orcaOrca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.项目地址: https://gitcode.com/GitHub_Trending/orca48/orca

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 16:36:06

CTF实战复盘:符号链接文件上传与可预测时间种子漏洞利用

周六比完的半决赛&#xff0c;回来之后我没有急着整理截图&#xff0c;而是把 MediaDrive 和 easy_time 这两道题重新在本机跑了一遍。很多人觉得“复现”就是照着别人的 writeup 敲几个 curl&#xff0c;把 flag 重新打出来一遍。我不太认同这种复现方式&#xff0c;真正有价值…

作者头像 李华
网站建设 2026/9/8 16:35:52

智慧场馆解决方案小程序开发全流程实战指南

智慧场馆解决方案小程序开发全流程实战指南 当下传统场馆的运营管理正面临信息化升级的刚性需求。无论是综合体育馆、游泳馆还是运动培训中心&#xff0c;一套完整的智慧场馆解决方案小程序开发&#xff0c;能够有效整合场地预约、会员管理、课程排期、设备控制等前后端业务&am…

作者头像 李华
网站建设 2026/9/8 16:33:36

书霸AI文献综述清单:从检索到成稿

书霸AI官网&#xff1a;www.shubaai.com 微信公众号搜一搜&#xff1a;书霸AI写作写文献综述&#xff0c;难点往往不只是“写得长”&#xff0c;而是要把分散的研究成果整理成一条清晰的学术线索&#xff1a;谁提出了什么观点&#xff0c;研究走到了哪一步&#xff0c;还留下了…

作者头像 李华
网站建设 2026/9/8 16:32:55

GitNexus架构解析:如何为AI代码变更加上安全护栏

1. 项目概述 1.1 先聊一个扎心的场景 最近小半年&#xff0c;我身边越来越多同事开始让AI Agent直接改代码&#xff0c;Git提交记录里“AI: refactor xxx”、“AI: fix bug”这类信息肉眼可见地变多。但伴随而来的是一系列让人血压升高的时刻&#xff1a;早上来上班发现昨晚AI…

作者头像 李华
网站建设 2026/9/8 16:31:07

新能源车辆车型大全API:从品牌到车系再到车型配置

一、车型数据的特点汽车行业的数据有一个天然的结构特征——它是一个树状的层级体系。一辆车的身份不是单一维度&#xff0c;而是由多个层级叠加定义的&#xff1a;品牌&#xff08;Brand&#xff09;└── 车系&#xff08;Series&#xff09;└── 具体车型&#xff08;Mod…

作者头像 李华
网站建设 2026/9/8 16:30:45

汇率查询接口全景指南:币种列表、实时汇率、单币种全汇率、银行牌价

一、汇率接口全景汇率查询 API 通常提供四个子接口&#xff0c;覆盖从币种枚举到银行牌价的完整场景&#xff1a;接口路径功能所有货币种类列表/list获取系统支持的所有币种代码和名称实时汇率查询换算/index指定两种货币和金额&#xff0c;实时换算单个货币汇率列表/single一次…

作者头像 李华