# @delacour/warden 中文文档

规范地址：https://npmcn.com/package/%40delacour/warden/

版本：0\.16\.0
npm 元数据更新时间：2026-11-09T12:11:05.140Z
中文译文更新时间：2026-11-11T21:32:42.067Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40delacour/warden
原文对照：https://npmcn.com/package/%40delacour/warden/?lang=original
项目主页：https://warden.co.nz/
源码仓库：https://github.com/delacournz/warden

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：71.1 kB，6 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=18
- 运行依赖：0 个
- 首次发布：2026-10-19T13:35:50.717Z
- 最新版本发布：2026-11-09T12:11:04.743Z
- 近 30 天下载量：4887（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：19（近 12 个月 19 个）

## 中文简介

React Introduct and Expo的AI代理工具包:每个编码代理都获得自己的iOS模拟器或Android仿真器来驱动,调试,配置和E2E测试应用程序,并配有设备,端口和app构建了租赁的全机器

## 安装

```sh
npm install @delacour/warden
```

也可以使用：`pnpm add @delacour/warden`、`yarn add @delacour/warden`、`bun add @delacour/warden`

## README

# 典狱长

一个用于React Index, Exposition和原生iOS和Android应用程序的AI代理工具包:您的代理驱动器,调试器,配置和E2E在自己的模拟器上测试该应用程序. 警卫租约 **iOS 模拟器、Android 模拟器、端口和本地应用程序** 全机用于特工,Orca工作树,再生和人类共享一Mac. 一个车主租用的装置或港口从未交给另一个车主.

-   **租赁** 生活在一个 sqlite db (`~/.warden/warden.db`(原始内容存档于2017-06-25)., WAL. 索赔 `BEGIN IMMEDIATE`,将它们串行于各个过程.
-   **拥有者**: 克劳德会议(Stdin, `CLAUDE_CODE_SESSION_ID`, (中文(简体) ), `WARDEN_SESSION_ID`),CI (中文(简体) )`CI`, (中文(简体) ), `GITHUB_RUN_ID`),或用户外壳(parent pid). Repo和worktree被录制为消息.
-   **活 动**: 租借在租借期中存活或心跳在TTL内(默认为30分钟;空) `warden claim` 由代理获得5分钟并打印出提示,所以只有包装或 `warden heartbeat` 持有一个设备更长。 在每项索赔中,由Stale租赁收回 `warden gc`A. 租赁 `warden run` 编号 : `dev` 编号 : `batch` 编号 : `e2e` 死了三个心跳(90秒)后就停止了.
-   **设备**: 管理员自行创建和再利用 `warden-<profile>-N` 模拟和发射 `-read-only` 模拟者。 它从不分配、关闭或抹去它没有创建的设备,除非你通过 `--adopt`。 。 。 .
-   **构建**: 博览会指纹 已安装 · 本地缓存 · EAS · 本地建筑. 所有工作树的Repo共享一个缓存.

## 安装

```bash
npm i -g @delacour/warden && warden install    # or: bun add -g @delacour/warden && warden install
```

`warden install` 每个检测到的剂(Claude Code / Codex)的接线钩,显示diff并先询问. 钩子呼叫 `~/.local/bin/warden`,用于安装与全局软件包的链接,所以 `npm i -g @delacour/warden@latest` 两者都升级.

一发,没有安装全球:

```bash
npx @delacour/warden install     # or: bunx @delacour/warden install
```

此复制二进制为 `~/.local/bin/warden` 并接接钩. 只有这样 `warden` 在你身边 `PATH` 若为 `~/.local/bin` 已经在上面( MacOS 不默认添加) 。 若为 `warden` 使用上面的全局安装。 要更新一发安装, 运行 `warden update`,从 npm 获取,或重运行 `npx @delacour/warden@latest install`。 。 。 .

Npm 软件包是一个小节点shim+每个平台一个预建的二进制(`@delacour/warden-{darwin,linux}-{arm64,x64}`,作为可选依赖安装). 视窗不支持. 跳过可选依赖的软件包管理器( E)`--omit=optional`)使相去而无二进制也,所言也.

来源:

```bash
bun install
bun run --cwd apps/cli install:global   # local build of this checkout → ~/.local/bin/warden
warden install                           # binary + hooks for every detected agent (Claude Code / Codex); shows diff, asks first
warden install --claude                  # force Claude Code only: skill + SessionEnd hook
warden install --codex                   # force Codex only: hooks in $CODEX_HOME/hooks.json
warden doctor
```

狱长本身的工作: `bun run cli:link` 点 `~/.local/bin/warden` (没有重建),以及 `bun run cli:unlink` 把以前的东西放回去.

代理技能,仅供克劳德代码, Codex, Cursor等人通过 [`skills`](https://github.com/vercel-labs/skills) CLI: 爱丽丝

```bash
warden skill show | pbcopy                 # raw SKILL.md to paste by hand
warden skill show --file references/ui.md  # print one file of the skill folder
warden skill install                       # bunx skills add ~/.warden/skill --skill warden -g (this binary's copy)
warden skill install --from github         # bunx skills add delacournz/warden --skill warden -g (updatable via `skills update`)
warden skill install --project -a claude-code -y   # into the current project, one agent, no prompts
```

技能是一个文件夹, `skills/warden/` (单位:千美元)`SKILL.md` + 键 `references/{ui,specs,suites,troubleshooting}.md`),嵌入于二进制. `npx` 当 `bunx` 无法使用; `--dry-run` 打印命令.

对于源建和一发安装, `~/.local/bin` 必须是在 `PATH`设置 `WARDEN_HOME` 要覆盖 `~/.warden`。 。 。 .

## 更新

`warden update` 对於典狱官,确是一件善事`warden version` 显示 :

| 构建 | `warden update` |
| --- | --- |
| **备忘**: 从源头运行( n)`bun apps/cli/src/cli.ts update`(中文(简体) ) | 编译 a `local` 此复选的二进制 `~/.local/bin/warden` |
| **当地**: 从一次结账中编译 | 从结账中重建`--release` 切换为释放) |
| **释放**: 从 GitHub 下载 | `gh release view` 新来的? 下载 `warden-<os>-<arch>` □ 核查sha256 □ 自我检查 □ 互换到位。 如果无法达到 GitHub 释放( 否) `gh`,没有 repo 访问,它回到npm |
| **释放**: 复制者为 `npx`编号 :`bunx @delacour/warden install` | npm 注册 : `@delacour/warden/latest` 新来的? 下载 `@delacour/warden-<os>-<arch>` · 核查 sha512 `dist.integrity` · 进行自我检查 · 进行互换 |
| **无**数字 : `@delacour/warden` 由 npm / bun / pnpm / npx / bunx 组成 | 打印软件包管理器的升级命令(例如:. `npm i -g @delacour/warden@latest`, (中文(简体) ), `npx @delacour/warden@latest install`叶子 `node_modules` 单独一人; `--to <path>` 仍然安装独立的释放二进制 |

二进制是在相同的路径上进行原子交换,所以下一个 `warden` 在您当前外壳中运行新版本。 没有新的外壳或 `source` 需要;如果 `PATH` 决定 `warden` 别的地方,更新提醒你。 旗帜 : `--check` (仅报告), `--release` (安装最新的 GitHub 发布;同时向它切换一个dev/局部建筑), `--force`, (中文(简体) ), `--to <path>`, (中文(简体) ), `--json`。释放来自公众 `delacournz/warden` 重传通过 `gh`设置 `WARDEN_RELEASE_REPO` 使用另一个还原,以及 `WARDEN_NPM_REGISTRY` 以使用另一个 npm 注册.

### 释放

1.  目标 `develop`一个改变什么 `@delacour/warden` 舰只增加一个变换器: `bun changeset`选择 `@delacour/warden`,选择补丁 / 小/ 主,写出一行摘要. `@delacour/warden-e2e` 紧跟在锁上 只有医生和内部的公关不需要.
2.  每一次推动 `develop` 打开或更新“ QQ core( 释放): vX. Y. Z ” PR, 标题为它将要传送的版本 。 它撞倒了版本,写着 `CHANGELOG.md` 并消耗更改.
3.  合并公关. `promote.yml` 快速前进 `main` 并按下标签 `v<version>`没有人推动 `main` 或手持标签.
4.  `main` 是文件网站部署的 标签运行 `.github/workflows/release.yml`,用于检查标签是否匹配版本,运行类型检查/检查/测试,构建 `warden-{darwin,linux}-{arm64,x64}` 加号 `checksums.txt` 并出版"GitHub"发行.
5.  相同的工作流程阶段是 npm 软件包(`bun run --cwd apps/cli build:npm` → `apps/cli/dist/npm/`并出版 `@delacour/warden-<os>-<arch>`,则 `@delacour/warden`,则 `@delacour/warden-e2e`,通过 npm 信任的出版(OIDC,没有符号)公开访问和出处. npm 上的版本被跳过, 因此重运行完成部分发布 .

永不编辑 `version` 手边. `bun run release <version>` 是 CI 下架时的断层镜: 它绕过更改器和版本 PR .

## 使用量

```bash
warden claim ios --json                          # lease 1 sim (reuse → boot → create), booted + ready
warden claim android --profile pixel-10 --count 2
warden claim ios --count 2 --wait 10m --ttl 1h --label e2e
warden claim ios --priority high --no-wait       # WARDEN_CAPACITY=on + host full → queue by priority (default --wait 30m); --no-wait fails fast
warden capacity [--json]                         # host budget (RAM + perf cores), usage, what binds, whether limits are enforced (off by default)
warden queue [--json]                            # claims waiting for a boot slot: position, priority, age
warden release --mine [--label x] [--shutdown]   # or <leaseId…> | --udid X | --session S; --label = only --mine leases with that label; --shutdown = warden-created or self-booted sims
warden release <leaseId> --bad [reason]          # release + quarantine the device (claims skip it); clear: warden sim unquarantine <udid>
warden sim slim <udid> [--restore] [--except <ids>] # iOS sims warden creates are slim by default (--no-slim / WARDEN_SLIM=0 opts out); a plain `warden claim` no longer restores, --restore does
warden sim profiles | warden sim measure [udid]     # slim categories for --except; a sim's real memory (also: warden devices --mem)
warden ls                                        # leases: resource, state, owner, repo/worktree, age, heartbeat
warden clone <udid|name> [--name x]              # duplicate a shut-down sim into the pool (seconds, no first boot)
warden golden ensure|ls|prune [--all]            # golden iOS images / Android snapshots new devices start from
warden arrange                                   # tile warden simulator windows in name order (macOS; also runs after iOS claims)
warden telemetry [status|enable|disable]         # anonymous usage telemetry: on by default, commands + flag names only; off with WARDEN_TELEMETRY_DISABLED=1 / DO_NOT_TRACK=1
warden doctor [--json]                           # check home, db, device tools, helper, install method, hooks, stale leases
warden devices [ios|android]                     # every sim/emulator (booted or not) + AVDs, warden-owned?, leased by (alias: list)
warden sims [--max-size 40G]                     # disk audit: every sim + runtime, size, owner, lease, what can go
warden sims prune [--dry-run|--yes]              # delete idle/orphaned/broken warden sims (+ LRU over --max-size)
warden sims delete [udids...|--suggested] [-y]   # multi-select → confirm → delete sims; stale/dead/duplicate ones pre-ticked (--dry-run)
warden check --udid <udid>                       # exit 2 if another owner holds it
warden heartbeat --mine
warden gc [--idle 20m]                           # reclaim stale leases, shut down idle warden devices

warden port claim --from 8091 --span 20 --json
warden port release --mine
```

### 在 GitHub 动作中安装管理员

Npm 软件包对 CI 不要求: 发布工作流程附加每个平台一个已编译的单文件二进制(`warden-darwin-arm64` ...,还有 `checksums.txt`)到每个 GitHub 发布时,在此回放中一个复合动作安装正确的一个:

```yaml
- uses: delacournz/warden/.github/actions/install-warden@main
  # with:
  #   version: v0.1.0   # optional pin; token defaults to github.token
```

`token` (它驱动器) `gh`)默认工作流程本身 `github.token`,这就足够了,因为repo是公开的,所以不需要PAT和动作访问设置. 行动验证了Sha256,并显示 `warden` 打开 `PATH`。一个裸体的剧本也会起作用: `gh release download --repo delacournz/warden --pattern warden-darwin-arm64 --pattern checksums.txt`。 。 。 .

干净的 macOS 跑车不需要前置状态: `--profile` 以权利要求创建(从首次使用时所构建的金色图像上克隆出来,约一至二分;缓存) `~/Library/Developer/CoreSimulator/Devices` 在运行之间保持它) 倒回 `simctl create`。运行者必须安装 iOS 运行时间 .

### 快速新模拟器:黄金图像

全新的模拟器的首个启动器(Applelogo + Progress bar)需要1–10分,其中约80%是一次性的数据迁移. 显著的e2e测量(SAL-GOLDEN):

| 假设 | 时间 |
| --- | --- |
| 新鲜创建 + 第一个启动 | 146至239 s (中文(简体) ) |
| 复制一个固定的金色+靴子 | 3.7 s + 11.9 s (中文(简体) ) |
| 3个平行发射的克隆 | ~20 s 时 |

所以当 `warden claim ios` 需要一个 **新设** 池子设备,它 `simctl clone`从一个 **金色图像**这是一次启动的模拟警报器,等待数据传输完成(`DMLastMigrationResults`,从 `bootstatus -b` 它的CPU已经解决,然后关闭。 金色是先用后用 Xcode 构建 + 运行时间 + 运行时间 构建 + 设备类型 + 食谱,所以 Xcode 或运行时间的升级只是构建了一个新的 ()`warden golden prune` 删除旧的). 克伦斯是APFS复制-写作(每个~30 MB). 如果克隆失败,典狱长会回到 `simctl create`设置 `WARDEN_GOLDEN=0` 关闭克隆.

-   `warden golden ensure [--profile iphone-17]`:先建后建,故先取主张而后不取.
-   一个必须造出金色指纹的说法 `building golden for <profile> … prewarm with: warden golden ensure --profile <profile>` 首先,在斯特德尔.
-   `warden clone <udid|name> [--name x]`: 复制任意 **关闭** sim,例如你用手设置的, 进入典狱长的游泳池。 典狱长拒绝发射源 而不是关闭它.
-   黄金从不分配,收养,由 `gc` 或计算在池中,以及 `warden devices` 标签 `golden`。 。 。 .
-   已经存在的池子设备总是首先被再用;第二只靴子需要~6.5 s.

### 设备健康

-   在启动(或重用)iOS sim后, `warden claim` 探测到: `simctl spawn <udid> launchctl print system` 必须在5秒内回答,而SpringBoard必须运行。 一个失败的图像被隔离(和关闭),另一个被声称,最多2次重复,然后是一个明显的错误。 失败的外国设备仅被跳过 。 Android还没有探测器.
-   `warden release <id> --bad [reason]` 用手隔离释放的警报器. `warden devices` 显示 `quarantined` 编号 : `slim`。 。 。 . `warden sim unquarantine <udid|serial>` 释出.
-   `warden app ensure` 当设备上的应用程序不再匹配缓存构建(iOS: `CFBundleVersion`,可执行大小和 `main.jsbundle` 大小).

### 一个新的博览会应用 : `warden init`, (中文(简体) ), `warden dev`, (中文(简体) ), `warden e2e`

```bash
warden init --bundle-id com.example.app   # bundle id → app.json, warden.config.ts, e2e/smoke.e2e.ts
warden dev                                # lease a sim, build / reuse the dev client, own Metro port, open the app
warden e2e --count 3                      # the e2e/ specs on the dev client, spread over 3 leased sims
```

-   `warden dev [platform]` 默认为 iOS. 每跑一次都会租赁自己的地铁港(`8081:100`)),因此不同工作树上的特工相并而行. 在租赁任何东西之前,它检查 捆绑的ID和 `expo-dev-client` 并打印修复.
-   默认的本地 iOS 构建本身准备了新的检出 : `expo prebuild` 何时 `ios/Podfile` 失踪了, `pod install` 当Pods 丢失或同步不同步,那么 `expo run:ios`组合 `build.ios` 以书面运行.
-   没有 `e2e` 套房在配置中, `warden e2e` 运行 `*.e2e.ts` 下划线 `e2e/` 与 `@delacour/warden-e2e` (一个) `bun test` 每个设备的流程)超过2个模拟器,在dev客户端上和一个地铁管理员开始. `warden init` 写出套房以便您编辑它。 它为要安装的软件包命名( E)`expo-dev-client`, (中文(简体) ), `@delacour/warden-e2e@<warden version>`)并安装无.

### e2e 脚本 : `warden run`

```bash
warden run ios --count 2 --port 8091:20 --port 3208:20 [--app] -- bun run e2e
```

`warden run` 操作命令 `WARDEN_UDIDS`, (中文(简体) ), `WARDEN_UDID_<i>`, (中文(简体) ), `WARDEN_LEASE_IDS`, (中文(简体) ), `WARDEN_PORTS` 财务报告和审定财务报表 `WARDEN_PORT_<i>` 设置。 它每30秒心跳一次,转发SIGINT/SIGTERM,在出站时释放出所有内容并传递出站代码. 与 `--app`,它首先确保dev构建安装在每个设备上(`WARDEN_APP_PATH` 编号 : `WARDEN_APP_HASH`) (中文(简体) ).

### 蝙蝠侠: `warden batch`

```bash
ls specs | warden batch ios --count 5 --max 5 --port 8091:20 --serve "bun run metro" --serve-ready tcp:8091 --jobs-from - --retry 1 -- bun run e2e:spec {job} --device {udid}
```

`warden batch` 要求 N 设备并运行一个任务队列, 每个设备有一个工人: `{job}`, (中文(简体) ), `{udid}`, (中文(简体) ), `{worker}` 财务报告和审定财务报表 `{seq}` 替换到命令中, 命令也得到 `WARDEN_UDID`, (中文(简体) ), `WARDEN_WORKER`, (中文(简体) ), `WARDEN_JOB` 财务报告和审定财务报表 `WARDEN_JOB_SEQ`。 。 。 . `--serve` 开始长寿进程( Metro) 先等待 `--serve-ready`. 实时网格跟踪每个设备,以及 `--record <dir>` (iOS)捕获每个模拟器,网格和a `batch.json` 时间表`scripts/demo/compose.ts` 把它们打入一个视频 只有在每份工作都通过时,才有0出口.

保存一个批次 `warden.config.ts` 并运行它的名称:

```ts
export default defineConfig({
  batches: {
    "salient-e2e": {
      project: "salient", platform: "ios", count: 5, max: 5, profile: "iphone-17",
      ports: ["8091:20"], app: true, retry: 1,
      env: { E2E_SESSION_FILE: "e2e-artifacts/batch/session.json" },
      serve: "bun scripts/e2e/run-ios.ts --session", serveReady: "file:e2e-artifacts/batch/session.json", serveTimeout: "20m",
      jobsFrom: { command: "bun scripts/e2e/select-specs.ts --list --offline" },
      cmd: ["bun", "scripts/e2e/run-ios.ts", "--attach", "{job}", "--device", "{udid}"]
    }
  }
});
```

```bash
warden batch salient-e2e                        # the preset as-is
warden batch salient-e2e --count 2 -- bun e2e {job}   # passed flags and -- <cmd> override it
```

您通过的旗帜覆盖了预设( 命令默认值不会) . `--jobs` 编号 : `--jobs-from` 替换其工作来源,以及 `-- <cmd>` 替换 `cmd`与 `project`、服务、工作以及 `jobsFrom.command` 运行在项目的根,相对预设的路径解析 `app` 安装工程的构建。 无 `project`,预设的cwd是配置文件的目录. CLI 路径解决您的 cwd. `env` 被添加到服务和工作环境. `label` 默认预设名称,也适用于港口租赁。 工作数量少于 `count` 每个任务都有一个装置.

### 受影响的e2e: `warden affected` 编号 : `warden e2e`

```bash
warden affected mobile --base origin/main --explain   # which specs this branch needs, and why
warden e2e mobile --base origin/main --count 2        # run them on leased devices; exit 1 if a required one fails
```

一个 `e2e.<suite>` 内 `warden.config.ts` 将 spec 文件映射到他们驱动的屏幕上(`entries`)和花花样(`paths`) (中文(简体) ). 典狱长将 git diff 与合并基数对齐, 用 TypeScript 解析器( tsconfig) 来行走每个光谱的导入图 `paths`,工作空间软件包,每个平台 `.ios` 编号 : `.android` 文件,仅输入字型已丢弃),并仅运行已更改文件到达的光谱,其中 `runAll` globs (锁文件, 本地 dirs) 选择一切 . `warden e2e` 运行它们像 `warden batch`,每个 `passes` 时间和写作 `e2e-report.json`见 [受影响的 e2e 指南](https://npmcn.com/package/%40delacour/warden/apps/docs/content/docs/e2e/affected.mdx)。 。 。 .

开发客户套件 `metro: {}`数字 : `warden e2e <suite>` 然后租出一个端口,在项目根开始自己的地铁,等待该端口被证明服务于此检查(另一个工作树的地铁在它上失败了运行而不是被附着),预发了捆绑和输出 `WARDEN_METRO_URL` 编号 : `WARDEN_PORT` 切入到光谱进程. `devices: [{ profile, count, env, default }]` 同时运行多条设备腿( name`--devices all`),每个设备的 spec进程运行在它共享的 specs ()`isolate: "spec"` 运行一个光谱,并且 `jobTimeoutMs` (默认每 spec 10 分) 杀死一个挂起的 spec 进程 .

光谱是 `*.e2e.ts` 以 `@delacour/warden-e2e` (单位:千美元)`bun add -d @delacour/warden-e2e`,与典狱长相同),运行于 `bun test --preload @delacour/warden-e2e/preload` (或 a 个) `bunfig.toml` 前加载 : `test("…", async ({ app, device, screen }) => { await expect(screen.getByTestId("x")).toBeVisible(); })`。 。 。 . `warden e2e` 租赁设备,安装构件和装置 `WARDEN_UDID` 编号 : `WARDEN_BUNDLE_ID` 编号 : `WARDEN_LAUNCH_ARGS` 和朋友, 并判断每个谱 从谱 `results.jsonl`· ; `spec: { bundleId, launchArgs, timeout, actionTimeout, assertionTimeout }` 套房的曲调, `warmDrivers: false` (或 `--no-warm`)跳过iOS帮助预热. 一个测试失败的叶子 `failure.png`, (中文(简体) ), `screen-at-failure.txt` 财务报告和审定财务报表 `trace.jsonl` 下级 `<batchDir>/e2e/<worker>-<seq>/`。见文件指南 _写入规格_ (单位:千美元)`e2e/specs`) (中文(简体) ).

### 基准

`packages/e2e-bench` 通过典狱长、大师、Detox和退休的Argent、代理和测试员,经营同样的8个测试套房。 军队在一个租赁设备上,写出Markdown + HTML报告(套装和每测试时间、冷启动、资源、残留).

最新iOS运行于EAS(2026-10-25,典狱长0.3.1):典狱长运行于86.30 s,1.56×快于Argent,1.06×快于代理设备,1.54×快于测试器. 陆军,每步中位数为85米相对321至481米相对. 完整的桌子和每件文物: [典狱长.co.nz/docs/e2e/bench/比较](https://warden.co.nz/docs/e2e/bench/comparison)。 。 。 .

```bash
bun run bench doctor && bun run bench run --platform ios --runs 3
```

见 [软件包/e2e-bench/README.md](https://npmcn.com/package/%40delacour/warden/packages/e2e-bench/README.md) 公平规则和说明,以及 [文件/基准/基准](https://npmcn.com/package/%40delacour/warden/docs/bench/) 已公布结果.

### App 构建

```bash
warden app fingerprint ios
warden app ensure ios --udid <udid> --json   # { appPath, hash, source: installed|cache|eas|build, installed }
warden builds ls | prune --max-size 20G | import <App.app> --hash <h>
```

可选 `warden.config.ts` 在还原根( r)`bun add -d @delacour/warden` 用于自动补全; `warden.config.json` 还在工作:

```ts
import { defineConfig } from "@delacour/warden/config";

export default defineConfig({
  projects: [{
    name: "salient",
    root: "apps/salient/app",
    bundleId: { ios: "com.example.salient", android: "com.example.salient" },
    fingerprint: { command: "bun run --silent fingerprint:{platform}" },
    eas: { profile: "development-simulator", workflow: ".eas/workflows/dev-build.yml", trigger: false },
    build: { ios: "bunx expo run:ios --no-install --no-bundler" }
  }]
});
```

由于没有配置, 典狱长从中检测单个工程 `app.json` 编号 : `app.config.*` (通过) `--bundle-id` 用于动态配置。 它按此顺序解决: 已经安装在这个散列上 `~/.warden/builds/<projectKey>/<platform>/<hash>` • 遗产缓存`build:list --fingerprint-hash`,然后下载;在飞行中等待构建;只有在 `trigger` 根据指纹核实的当地建筑。 一个建筑锁阻止了两个特工两次下载或建造相同的散列.

`warden install` 电线钩入它侦测到的每一个毒剂: Claude Code(`~/.claude` 或者说 `claude` (关于PATH)和代码x(`$CODEX_HOME` 编号 : `~/.codex` 或者说 `codex` 在路径. `--claude` 编号 : `--codex` 强制一(或两者兼有),而不论检测结果如何。 每个代理配置变化都显示 diff 并先询问(`--yes` 跳过, `--dry-run` 仅指印,非TTY `--yes` 跳过). 合并是一能之道,并保持所有其他的配置.

### 驱动设备(代理人)

声称,然后明确通过设备: `warden claim ios --json` 使用返回的 `udid` (Android: the serial) 每通电话。 光线代理索赔持续约5分钟,没有东西可以刷新;只有 `warden dev` 编号 : `run` 编号 : `batch` 编号 : `e2e` 或明示 `warden heartbeat <leaseId>` 保持一个设备更长。 勘探,跑 `warden dev ios --json` 在背景中( 请求并持有一个设备 + 一个地铁端口, 启动一个经过验证的地铁来服务此检查, 打开dev客户端) 并瞄准 `udid` 从它的第一条出线。 潜水员从不打电话 `release --mine`: 使用 `release <leaseId>`,或向 `--label x` 财务报告和审定财务报表 `release --mine --label x`。查看并驱动设备 `warden ui`,用于同一驱动器的 CLI 代理 : `warden ui open <bundleId> --udid <udid>` → `snapshot -i` (屏幕为 `@eN` 页:1 `press @e3 --settle` 编号 : `fill id=email "…"` 编号 : `scroll down --until text=Done` → `wait id=todos-screen` 编号 : `is` 编号 : `get` → `close --release`它检查每一次呼叫的租约(外国或失踪一次的2次离境); `--claim` 租赁设备)和 `--json` 打印一个 `{ok, …}` 文档。 选择器 : `id=… label=… text=… role=… value=… editable=… nth=…`。指南:应用程序/文件 `agents/ui`。 。 。 .

要创建 e2e 光谱,请在 `warden ui record start <id>` 财务报告和审定财务报表 `warden ui record stop`数字 : `record note|undo|status|cancel` 把它塑造成, `stop` 写入 `e2e/<id>.e2e.ts` 并运行一次在同一设备上(`--no-verify` 跳过; `--helper <module#fn>` 写入可重复使用的函数. `snapshot -i` 没有测试ID的标记元素 `[no-id]`· ; `fill --secure` 读取 `WARDEN_UI_SECRET_<NAME>`。指南:应用程序/文件 `guides/author-specs`。 。 。 .

### 克劳德代码

`warden install --claude` 添加:

-   (单位:千美元) **结束会话** 钩子 **关闭会话模拟** 并释放其租借物,故一切事务无一例外。 惟有狱卒被创造,或课会自发地被关闭, 一个已经运行的图像 当代理把它捡起来, 比如你自己的模拟器。 应用程序一,发布但留在。 打开 `/clear` (理由 `clear`) sims 继续运行: 对话重新开始, 工作通常继续, 新会话用它的下一个重取 sim `warden claim`租赁一个仍然运行 `warden e2e` 编号 : `batch` 编号 : `run` 编号 : `dev` 持仓人也保留;其租赁被解除的跑道停止,并说是这样.
-   **未结束的会话** (死亡或终端关闭):他们的租约在TTL(30分;光线代理索赔5分)之后停止. `warden gc` 然后关闭那些sims 根据同样的规则, 但仅仅10+分钟后 租约停止运行, 从来没有 当一个非Apple应用程序运行在sim。 gc 最多每10分钟在背景中自动运行,由 `claim`编号 :`run` (单位:千美元)`WARDEN_AUTO_GC=0` 关了它,以及按要求.
-   技能文件夹( e)`SKILL.md` + 键 `references/`)),上演 `$WARDEN_HOME/skill/warden/` 并安装了动词技能CLI(`bunx skills add <dir> --skill warden -g -a claude-code -y`, (中文(简体) ), `npx` 倒计时; `--dry-run` 打印命令,将其放在 `~/.agents/skills/warden` 和符号链接 `~/.claude/skills/warden`。没有包或节点,此步骤将被跳过;使用 `warden skill show`直接写下规则 `~/.claude/rules/warden.md`所剩无几 `~/.claude/rules/agent-device.md` 或者说 `argent.md` 报告已退休的设置,但从未删除.

它也会移除 `PreToolUse` 安装旧式设备租赁钩(`warden hook pretool` 保持不动,所以一个旧的配置 继续工作.

### 代码

`warden install --codex` 将会话尾端勾钩合并到 `$CODEX_HOME/hooks.json` (默认) `~/.codex/hooks.json`; 已声明的钩子 `config.toml` `[[hooks.*]]` 表格计数为已安装)。 代码钩子使用克洛德的格式和stdin JSON,所以 `warden hook session-end` 两种代理人的服务不变:

```json
{
  "hooks": {
    "SessionEnd": [{ "hooks": [{ "type": "command", "command": "$HOME/.local/bin/warden hook session-end", "timeout": 3 }] }]
  }
}
```

-   代码 **跳过新钩或已更改的钩子,直到您信任它们为止**: 运行 `/hooks` 安装后在 Codex 中一次.
-   3 s 的编码封顶接尾钩, 并总是发出理由 `other`,所以请 `/clear` 保持-sims-running例外从不适用。 任何无法及时完成的勾勾都由 `warden gc` 租约一旦失效.
-   对于Codex中的技能,使用 `warden skill install`。 。 。 .

## 发展

```bash
bun run test        # turbo: core + cli (incl. cross-process race tests)
bun run typecheck
bun run check       # biome
```

见 [一般事务人员(其他职等)](https://npmcn.com/package/%40delacour/warden/AGENTS.md) 计划 [文档/计划/wdn-warden-cli.md](https://npmcn.com/package/%40delacour/warden/docs/plans/wdn-warden-cli.md)。 。 。 .

## 许可证

[麻省理工学院](https://npmcn.com/package/%40delacour/warden/LICENSE)

## 常见问题

### @delacour/warden 是什么？

React Introduct and Expo的AI代理工具包:每个编码代理都获得自己的iOS模拟器或Android仿真器来驱动,调试,配置和E2E测试应用程序,并配有设备,端口和app构建了租赁的全机器

### 如何安装 @delacour/warden？

在项目目录运行 npm install @delacour/warden，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 warden，可以用 npx warden 直接运行。

### @delacour/warden 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @delacour/warden 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @delacour/warden 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=18。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @delacour/warden 可以商用吗？

@delacour/warden 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @delacour/warden 的下载量有多少？

根据 npm 官方下载统计，@delacour/warden 在 2026/10/12 – 2026/11/10 这 30 天内被下载 4,887 次，日均约 163 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @delacour/warden 还在维护吗？

最新版本 0\.16\.0 发布于 2026/11/09（2 天前）；至今共发布 19 个版本，其中过去 12 个月发布了 19 个；首次发布于 2026/10/19。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

