Editor's note

ZSeven-W/dsh-ios

DeepSeek Harness (DSH) plugin: a live iOS Simulator — and a USB-connected iPhone — inside the conversation. 22 agent tools for booting, building, driving the UI by accessibility identity, OCR text or list rows, plus a streaming sidebar panel you can tap and drag on.

This is a DeepSeek Harness (DSH) plugin. Review its GitHub README, installation information, maintenance status, and public security signals here.

DSH iOS

DSH iOS 模拟器

DeepSeek Harness 对话里嵌入一台实时、可交互的 iOS 模拟器——USB 连接的真机 iPhone 同样支持。
22 个智能体工具 • 侧边栏实时 MJPEG 面板 • 模拟器与 USB 真机 • 列表/信息流行级操作 • SwiftUI 预览热重载

npm: @zseven-w/dsh-ios · 当前插件版本:0.1.0-rc.3 · 已在 DSH 0.1.1-rc.1 验证

English · 简体中文 · 繁體中文 · 日本語 · 한국어 · Français · Español · Deutsch · Português · Русский · हिन्दी · Türkçe · ไทย · Tiếng Việt · Bahasa Indonesia

npm: @zseven-w/dsh-ios · 当前插件版本: 0.1.0-rc.3 · 已在 DSH 0.1.1-rc.1 验证


DSH iOS Simulator — a real iPhone inside the conversation

在 DSH 对话中直接操作真机 —— 左侧是 Agent 的工具调用,右侧是实时设备面板

为什么选择 DSH iOS 模拟器

DSH iOS 模拟器让智能体在对话里拥有一台真正的 iOS 模拟器,也让你亲眼看到画面。智能体可以启动设备、用 Xcode 工程或 Swift 包构建并运行 App、按无障碍身份或 OCR 文字驱动界面、读取统一日志,还能检查进程、调用栈与内存泄漏;与此同时,设备的实时画面会渲染在常驻的侧边栏面板里,你可以在视频上直接点按、拖拽、旋转、按 Home 键。同样的操作也能作用于 USB 连接的真机 iPhone:插件会在手机上构建并启动 WebDriverAgent,把控制与画面端口经回环隧道转发,把设备画面投进同一套面板、卡片与工具。整个过程不用图片内容块,也没有录屏文件——视觉数据只会通过 DSH webserver 签发的限时 URL 进入界面。

🖥️ 对话里的实时模拟器已启动设备的 serve-sim MJPEG 画面,经签名后的 /_dsh/dsh-ios/* 路由代理进常驻的右侧面板——浏览器永远不会接触 serve-sim 的端口。
📱 USB 真机 iPhoneios_real_start_wda 在已连接的手机上构建并启动 WebDriverAgent,把控制(REST)与画面(MJPEG)端口经回环隧道转发;同一套面板、工具、卡片与状态胶囊即可驱动真机。设备必须处于解锁状态,真机账户上的每一次点按都受插件的“先识别、再点按”规则约束。
🛠️ 22 个智能体工具设备列表、启动/关闭、截图、交互、构建运行、统一日志、基于 AXe 的 UI 树与按元素点击、列表/信息流行级操作、Vision OCR 找字/点字、SwiftUI 预览热重载、进程列表、调用栈、泄漏分析、App 信息。
👆 可交互面板在实时画面上点按、拖拽;Home / 旋转 / 截图 / 刷新图标工具栏(悬停提示);尺寸模式(适应 · 50–125% · S/M/L);边框样式(无框 / 边框 / 真机框);拖拽调宽上限 960px、双击复位;横屏自动加宽。
🧾 列表与信息流行ios_sim_ui_rows 把深层无障碍快照转成带索引、标签与通用解析计数器的行;ios_sim_tap_row 在行内按相对坐标点按,并用计数器符合预期的 ±1 变化验证操作是否生效——这是列表类 App 唯一可靠的确认方式。
🔐 仅回环的传输serve-sim 只绑定 127.0.0.1 的专属端口段;每条路由都要求回环对端、回环 Host 与 Fetch-Metadata/Origin 校验;HMAC 能力令牌 10 分钟内过期。。
SwiftUI 预览热重载ios_sim_preview 在包之外生成一次性宿主 App,把你的预览编译成 dylib,编辑后无需重启即可热替换进正在运行的模拟器(约 2–5 秒)。
🧭 语义化 UI 自动化ios_sim_ui_tree 导出无障碍元素树(基于 AXe),ios_sim_tap_element 按标签或标识符点击;当元素树为空或退化时,ios_sim_find_text 直接对屏幕做 OCR,ios_sim_tap_text 点击命中的文字——按身份或按文字点击,而不是猜坐标。

工具

全部 22 个工具在任何主机上都会注册,且只返回纯 JSON——视觉数据只通过 presentationMeta + 签名路由进入界面,绝不以图片块形式返回。模拟器 udid 自动走 simctl/serve-sim,真机 udid 自动走 WebDriverAgent。非 macOS 主机(或 serve-sim 无法解析)上工具仍然注册,但调用时会返回明确的错误;唯一的例外是 ios_sim_previewstatus,它在任何主机上都会如实返回 { running: false }

核心模拟器工具

工具作用关键参数
ios_sim_devices列出这台 Mac 上可用的 iOS 模拟器设备(udid、名称、运行时、状态)以及哪些已启动,另外在 realDevices 里列出 USB 连接的真机 iPhone(udid、名称、osVersion、model、state、developerMode)。先用它发现要传给其他工具的 udid 或名称。
ios_sim_boot启动指定设备并开始其 serve-sim 实时推流;推流在对话期间保持存活,面板可以实时展示模拟器。udid(必填——udid 或设备名称)
ios_sim_shutdown关闭指定设备;若推流目标正是该设备,则同时停止推流。udid(必填)
ios_sim_screenshot截取一张 PNG,返回简短的 JSON 摘要(路径、字节数、尺寸、设备);图片在卡片/面板中渲染,绝不会以图片块形式返回。正在推流的模拟器与 USB 连接的真机(经 WebDriverAgent)都可以截。udid(可选——默认取正在推流的设备,其次取第一个已启动的模拟器)
ios_sim_interact与正在推流的设备交互——模拟器或 USB 真机均可:在 0..1 归一化坐标上点按、输入文字(模拟器为美式键盘)、按下硬件按键(homelockvolumeUp…)、滚动或发送触摸手势;操作稳定后(约 300 毫秒)附带一张新截图展示效果。action(必填——tap/type/button/gesture/scroll),x/ytextnamejson
ios_sim_list_apps列出模拟器或已连接真机上已安装的 App(bundle id、显示名、版本、是否系统 App)——第三方 App 的 bundle id 无法猜测,先列出它,或给 ios_sim_launch_appname。列举失败会抛错(例如“设备当前无法通过 CoreDevice 访问”)而不是返回空列表,所以 count: 0 一定意味着设备上确实没有匹配的 App。udid(可选)、query(对显示名与 bundle id 同时做不区分大小写的子串匹配,支持中文)、include_system(默认 false)
ios_sim_launch_app启动已安装的 App(模拟器或已连接真机均可):既可以传 bundleId,也可以传 name(对显示名做不区分大小写的子串匹配,走同一套列举逻辑,支持中文)。两者只能给其一;启动失败或名称有歧义时,错误里会直接给出下一步该怎么做(从源码构建请用 ios_sim_build_run)。bundleIdname(二选一)、udidrelaunch
ios_sim_build_run为模拟器构建 .xcodeproj.xcworkspace 或 Swift 包,安装生成的 .app 并启动;真机 udid 则改为在手机上构建、安装并启动(需要 Apple Development 签名)。构建失败时返回过滤后的 xcodebuild 报错尾部。完整构建通常需要几分钟。projectPath(必填)、schemeudid(推流设备 → 已启动设备 → 最新运行时 iPhone,会自动启动)、configuration(默认 Debug
ios_real_start_wda在 USB 连接的真机 iPhone 上启动 WebDriverAgent(WDA)——仅限真机,绝不用于模拟器。若已有 WDA 在响应则直接接管,否则执行 xcodebuild 构建/启动(冷构建可能耗时数分钟),然后等待 WDA 就绪并返回实时面板所用的控制/MJPEG 端口。当 ios_sim_screenshot / ios_sim_interact / ios_sim_ui_tree / ios_sim_tap_element 报告该设备 WDA 未运行时,先调用本工具。udid(必填——来自 ios_sim_devices.realDevices 的真机 udid)

UI 树工具(基于 AXe)

工具作用关键参数
ios_sim_ui_tree导出前台 App 的无障碍元素树(标签、标识符、取值、以点为单位的 frame)以及屏幕尺寸(点)——模拟器走 AXe,USB 真机走 WebDriverAgent(真机默认限制快照深度:繁忙 App 的不限深快照实测约 32 秒 / 751 KB,限深后约 2 秒);输出上限约 40 KB(超出时裁掉最深层级,并置 truncated + 提示)。udid(可选)、max_depthfilter(对标签/标识符/类型做不区分大小写的子串匹配)
ios_sim_tap_element按身份点击元素——先精确匹配,再做不区分大小写的子串匹配(identifier/label);嵌套重复元素折叠为同一个目标,若有多个不同元素匹配则逐一列出候选。点击落在元素中心(模拟器走 AXe HID,真机走 WebDriverAgent),随后约 300 毫秒截一张效果图;传 expect_text / expect_gone 则点击与验证合并为一次往返(expected.matched)。udid(可选)、identifierlabelexpect_textexpect_gone

列表与信息流行

列表/信息流类 App 把每条内容聚合进一个无障碍 Cell——标签里包含整条摘要与全部计数器(“57 回复。18 喜欢。592 次查看”),没有可以匹配的逐控件子按钮,而且这些行只有在深层快照里才会出现。下面两个工具把这种结构暴露为“行”,并在行内操作。

工具作用关键参数
ios_sim_ui_rows把前台 App 可见的列表/信息流行读成“行”而不是原始树:每一行包含索引、以点为单位的 frame、聚合标签,以及从标签里通用解析出的计数器(数字 + 分类词,如 57 回复 → 回复=57,中文或英文——不内置任何 App 词汇)。行只有在深层快照里才出现:真机上默认 max_depth 为 60,每次调用约 15–25 秒 / ~0.5 MB(WDA 串行处理请求)——先考虑廉价的观察手段(ios_sim_find_text / ios_sim_ui_tree)。计数器按启发式解析、键值可原样回传:给 ios_sim_tap_row.expect_count 传键时务必与列表完全一致。找不到行时结果会说明原因(深度太浅 / 不是列表页 / 深度读取后确实没有无障碍信息)——浅读绝不会被报告成“该 App 没有无障碍信息”;屏幕外的行会被排除并计入 omittedOffscreenudid(可选)、max_depth(仅真机生效;默认 60)
ios_sim_tap_row在一条可见列表行内按相对位置点按(行由 ios_sim_ui_rows 报告:0 基索引;x/y 为该行 frame 的比例——0 = 左/上边缘,1 = 右/下边缘,默认 0.5 = 中心),模拟器走 AXe、USB 真机走 WebDriverAgent。行的 frame 来自一次全新的树读取,绝不猜测绝对屏幕坐标;索引越界直接失败(绝不截断收拢)。安全闸:传 expect_count={key,delta} 时工具会重新读取行标签,校验计数器恰好变化 +1/−1(countCheck.verified);若键不在该行解析出的计数器里,点按会在执行前被拒绝——真机上的点按绝不是试探。不传 expect_count 时点按仍会执行(明确的相对位置本身就是定位),但不会有任何验证。udid(可选)、index(必填)、xy(0..1 比例)、max_depthexpect_count{key, delta}

OCR 工具(Vision)

工具作用关键参数
ios_sim_find_text用插件编译的 Vision 助手对已启动模拟器或 USB 真机的当前屏幕做 OCR(识别准确,zh-Hans + en-US,首次使用由 swiftc 编译进 ~/Library/Caches/dsh-ios/bin/ocr)。适用于无障碍树为空或退化、文字以图形渲染(角标数字、嵌进图片的价格)或需要独立核对屏幕内容的场景。先截取一张新截图,再返回 {device, size, items:[{text, confidence, rect}]}——rect 是以设备点为单位的框(原点在左上),按置信度排序,输出上限约 40 KB(truncated 表示丢掉了置信度最低的尾部;可用 query 收窄或调高 min_confidence)。udid(可选)、query(不区分大小写的子串)、min_confidence(默认 0.3)
ios_sim_tap_text对当前屏幕做 OCR 并点按最佳文字匹配的中心——沿用与 ios_sim_tap_element 相同的“先精确、再忽略大小写包含、多候选报歧义”规则,适用于无障碍树看不到的文字(无 a11y 的 App、角标数字、嵌进图片的文字)。真机上通过 WebDriverAgent 落在设备绝对坐标;模拟器上经 serve-sim 控制以归一化坐标下发(先调用 ios_sim_boot)。约 300 毫秒后附一张新截图展示效果;传 expect_text / expect_gone 则点击与验证合并为一次往返(expected.matched)。在真机上每一次点按都有真实后果——绝不靠点按来试探一个未识别的控件。udid(可选)、query(必填)、min_confidenceexpect_textexpect_gone
ios_sim_wait_for等待某段文字在屏幕上出现或消失:复用 ios_sim_find_text 的截图+OCR 流水线轮询,直到条件成立或超时(默认 8 秒,上限 60 秒)。超时是正常的 matched:false 结果,绝不抛错——一次调用替代手动循环 find_text(真机上每轮约 1.2 秒)。命中时 item 携带 OCR 文字、置信度与设备点坐标框。udid(可选)、text(必填)、modeappear/disappear)、timeout_msmin_confidence

日志工具

工具作用关键参数
ios_sim_logs从设备统一日志读取 App 运行时的输出:snapshotlog show --last <duration>,默认 2m)或 follow(有界实时捕获 duration_seconds,默认 10 秒、上限 60——绝不会挂起不返回)。输出上限约 300 行 / 30 KB,并附收窄提示。udid(可选)、modesnapshot/follow)、durationduration_secondsbundle_idpredicate(原始 NSPredicate,优先于 bundle_id)、leveldefault/info/debug)、grep

预览工具

工具作用关键参数
ios_sim_preview在模拟器里实时热重载 SwiftUI 预览:start(默认)校验包、在插件缓存里生成一次性宿主 App(绝不会写进你的包)、把包编译为模拟器 dylib、安装并启动宿主、然后监听源码——每次编辑都会重新构建并热替换,无需重启(约 2–5 秒)。编译错误不会杀死会话:宿主保留最后一次成功的预览,错误尾部通过 status 返回;同一时间只能运行一个预览会话。packagePathstart 时必填)、udidactionstart/status/stop)、previewFilter(对预览名称做不区分大小写的子串匹配)

调试工具

工具作用关键参数
ios_sim_processes从模拟器自身的 launchd 列出其运行中的 App 进程(宿主机可见的 pid、进程名、bundle id)——backtrace/leaks 的 pid 来源;真机 udid 则改经 devicectl 列出手机上的进程。udid(可选)、filter(对进程名/bundle id 做不区分大小写的子串匹配)
ios_sim_backtrace一次性批量 LLDB(attach → thread backtrace → detach,绝非常驻会话);输出上限约 200 行、主线程在前,目标进程必定被验证已恢复运行。当 macOS 拒绝 attach(开发者模式未开启)时,回退到 Xcode 的 sample 引擎(不挂起进程)并给出开启提示。仅支持模拟器——真机会被明确拒绝并说明原因。udid(可选)、pid / bundle_idall_threads(默认 true)
ios_sim_leaks用 Xcode 的 leaks 工具分析泄漏:summary(泄漏数、泄漏总字节、前约 30 种泄漏类型)或 memgraph(生成 .memgraph 工件,用 Xcode Instruments 打开,插件绝不解析)。扫描期间 App 会被挂起,但之后必定恢复。仅支持模拟器。udid(可选)、pid / bundle_idmodesummary/memgraph
ios_sim_app_info读取已安装 App 的信息:App 包路径、可写数据容器、Info.plist 关键字段——模拟器走 simctl appinfo(附 get_app_container 回退),USB 真机走 devicectl;未安装时返回 installed: false,并在 note 中提示改用 ios_sim_list_appsudid(可选)、bundle_id(必填)

展示面

  • 侧边栏面板——“iOS 模拟器”。 实时画面位于常驻的右侧面板(固定停靠、把对话区让开;窄视口下退化为居中浮层)。面板渲染实时 MJPEG 画面,支持在视频上直接点按、拖拽手势,并有图标工具栏(Home、截图、旋转、刷新),按钮带悬停提示。尺寸控制提供适应(铺满面板宽度)、50–125%(按设备逻辑宽度缩放)以及 S / M / L 预设(按设备短边定尺寸;横屏时按显示比例缩放,保持设备物理大小)。边框样式为无框 / 边框 / 真机框(frameless / bezel / 逼真的设备外壳),圆角按比例计算。设备旋转为横屏时面板自动加宽到舒适尺寸,转回竖屏时恢复你原来的宽度——横屏期间你手动拖过宽度则以你的选择为准。左侧边缘的把手可以拖宽/收窄面板(上限 960px;双击恢复默认宽度)。当推流目标是 USB 连接的 iPhone 时,同一个面板显示手机经 WebDriverAgent 的 MJPEG 画面,操作方式完全一致。
  • 紧凑对话卡片。 工具结果渲染为单行卡片,不含任何内联图片:统一的“iOS 模拟器”标题 + 操作副标签(启动 / 截图 / 交互 / 构建运行 / 启动 WebDriverAgent)+ 设备名 + 状态徽标 + “在侧边栏打开”提示。点击卡片所在行即可打开面板;点击按钮、链接或实时画面本身不会触发。
  • 输入框上方的状态胶囊。 面板关闭且推流在线时,输入框上方会出现一个绿点小胶囊(<设备名> · 实时),点击即可打开面板。它受会话门控:只有当当前会话里挂载着模拟器结果时才渲染并轮询,切换到没有结果的会话即自动隐藏。
  • 标准模式与 Code 模式。 标准会话使用宿主下发的 presentationMeta;Code 模式(PTC)的嵌套调用不会携带 meta,客户端会从结果中的完整 JSON 重建出完全一致的 meta——面板、卡片和状态胶囊在两种模式下都能工作。

安全

  • 浏览器永远不会接触 serve-sim 的端口。所有流量都经由 DSH webserver 源站上的 /_dsh/dsh-ios/* 路由:/stream/<token>(MJPEG 代理)、/screenshot/<token>(缓存 PNG)、/ws?token=…(HID 控制转发),以及 /grant/capture/status 端点。
  • 令牌是 HMAC-SHA256 能力凭证(base64url(payload).base64url(mac)),10 分钟内过期,用每个 DSH 主目录私有的密钥签名(<DSH_HOME>/cache/dsh-ios/stream-access.key,0600,原子创建)。
  • 每条路由在检查任何能力之前先应用回环/可信传输围栏:回环对端地址、回环 Host(拒绝 DNS 重绑定)、Fetch-Metadata/Origin 校验。截图路由只提供插件缓存目录内的文件(拒绝符号链接,并做 realpath 包含性校验)。
  • serve-sim 以前台子进程方式运行,仅绑定回环地址的专属端口段(3181–3244),绝不会动用户自己在 3100 端口上的 serve-sim;从不使用 --host。。
  • 孤儿进程收养/回收——若上一个 DSH 宿主被异常杀死、其 serve-sim 子进程存活了下来:同一设备会被直接收养(孤儿进程的握手信息视为权威);若残留进程占用槽位却服务着别的设备,则通过 serve-sim -k 回收并重试一次。
  • 保活与空闲停止——推流崩溃后约 5 秒会在后台自动重启;当没有消费者时,空闲 5 分钟自动停止。主动停止绝不会被保活逻辑对抗。(真机 runner 有意豁免空闲回收:重启它意味着一次数分钟的 xcodebuild 重新构建。)

环境要求

  • macOS + 完整版 Xcode——仅装 Command Line Tools 不够。xcodebuildxcrun simctl 和模拟器运行时都随 Xcode 提供。
  • Xcode 中至少安装一个 iOS 模拟器运行时
  • DSH ≥ 0.1.0-rc.6 且使用 Web 版,才能显示面板。无头(headless)配置下插件同样可用:22 个工具照常工作,只是没有实时画面。
  • 非 macOS 主机:插件依然能加载,22 个工具也会注册,但每次调用都会返回明确的错误信息(iOS Simulator requires macOS with Xcode …)。
  • serve-sim 作为本插件的 npm 依赖随包安装,正式安装时会从本地解析;开发目录则回退到 npx -y serve-sim(首次使用需要联网)。
  • AXe(可选——只有基于 AXe 的工具需要:ios_sim_ui_tree / ios_sim_tap_element,以及模拟器上的 ios_sim_ui_rows / ios_sim_tap_row):brew install cameroncooke/axe/axe,或让插件自动下载固定版本(v1.8.0,校验 SHA-256)到 ~/Library/Caches/dsh-ios/binDSH_IOS_AXE_BIN 可覆盖解析结果;DSH_IOS_AXE_OFFLINE=1 可禁用下载。
  • Vision OCR(可选——只有 ios_sim_find_text / ios_sim_tap_text 需要):插件首次使用时用 swiftc 把内置的 assets/ocr.swift 编译到 ~/Library/Caches/dsh-ios/bin/ocr(识别 zh-Hans + en-US)。
  • lldb attach 需要 macOS 开发者模式:执行一次 sudo DevToolsSecurity -enable。在此之前 ios_sim_backtrace 会改用 Xcode 的 sample 引擎(不挂起进程),ios_sim_leaks 会带着开启提示降级运行。。首次 WDA 构建会安装签名的 WebDriverAgentRunner:按提示在设备上信任其证书;免费团队签名描述文件 7 天过期后需重新运行 ios_real_start_wda

安装到 DSH

dsh plugin --profile web add @zseven-w/dsh-ios@latest
dsh web

快速开始

一次典型的对话流程:

  1. 发现设备——“列出可用的模拟器。” → ios_sim_devices
  2. 启动——“启动 iPhone 17 Pro。” → ios_sim_boot。推流开始,“iOS 模拟器”面板随之打开:设备在侧边栏里实时显示。(点击任意模拟器卡片所在行,或输入框上方的状态胶囊,即可重新打开。)
  3. 在画面上点按——直接在面板上点按、拖拽;或让智能体驱动界面:“打开设置,然后点 General。” → ios_sim_interact(按元素身份点击用 ios_sim_ui_tree + ios_sim_tap_element;按文字点击用 ios_sim_find_text + ios_sim_tap_text;列表/信息流 App 用 ios_sim_ui_rows + ios_sim_tap_row)。
  4. 构建并运行你的 App——“构建并运行 /path/to/MyApp.xcodeproj。” → ios_sim_build_run。完整构建需要几分钟;完成后 App 会在模拟器里启动,你可以在面板里实时观看。
  5. 预览热重载——“显示 /path/to/MyPackage 的 SwiftUI 预览。” → ios_sim_preview start。修改源码后,预览会在约 2–5 秒内热替换进正在运行的模拟器——无需重启。
  6. 驱动真机 iPhone——用 USB 数据线连接手机并解锁,然后说“在手机上启动 WebDriverAgent。” → ios_real_start_wda。面板切到手机的实时画面,所有工具都接受其 realDevices 里的 udid;调用失败时读面板状态里的编码原因(device-lockedcert-untrustedprofile-expiredtunnel-faileddevice-unplugged)。

疑难排查

  • backtrace 用的是 sample 而不是 lldb,或 leaks 提示受限检查——macOS 开发者模式未开启。执行一次 sudo DevToolsSecurity -enable 后重试。在此之前工具会平滑降级:ios_sim_backtrace 回退到 Xcode 的 sample(已符号化、不挂起进程),ios_sim_leaks 会给出开启提示。
  • ios_sim_ui_tree / ios_sim_tap_element 需要 AXe——用 brew install cameroncooke/axe/axe 安装,或让插件在首次使用时自动下载固定版本(需要能访问 github.com)。错误信息里始终附带完整的安装提示;DSH_IOS_AXE_BIN=/path/to/axe 可覆盖解析结果。行工具(ios_sim_ui_rows / ios_sim_tap_row)在模拟器上同样需要 AXe。
  • ios_sim_find_text / ios_sim_tap_text 报告缺少 OCR 助手——首次使用会用 swiftc(需要 Xcode)把内置的 assets/ocr.swift 编译到 ~/Library/Caches/dsh-ios/bin/ocr;错误信息里带具体路径与提示。
  • ios_sim_ui_rows 找不到行——结果会说明原因:深度太浅(调大 max_depth;真机上每次更深快照约 15–25 秒)、不是列表页,或深度读取后确实没有无障碍信息。浅读绝不会被误报为“缺少无障碍支持”。
  • iOS 26.2 模拟器上的 ios_sim_leaks 怪癖——在 iOS 26.2 运行时上,即使开发者模式已开启,Xcode 的 leaks 也可能无法分析模拟器进程,报出 Failed to get DYLD info 或 minimal-corpse 之类的致命诊断。工具会平滑降级:你能看到原始诊断,目标进程必定被验证恢复,不会卡住。插件侧没有修复办法——遇到时试试 mode: "memgraph" 或换一个运行时。。
  • 推流自己停了——这是空闲策略,不是崩溃:没有消费者(面板关闭、没有挂载的卡片、没有活跃路由)时,推流会在 5 分钟后停止,并在下一次工具调用或打开面板时重启。崩溃的推流则会在约 5 秒内于后台自动重启。

开发

pnpm install
pnpm run build      # 宿主 tsc + 客户端打包 → lib/
pnpm run typecheck

scripts/ 下的冒烟测试会验证编译产物 lib/(需要启动模拟器或连接真机 USB 的部分仅限 macOS;设置 DSH_IOS_SMOKE_SKIP_SIM=1 可跳过这些部分):

脚本覆盖内容
node scripts/dev-smoke.mjs模拟器宿主:二进制解析、推流启动、控制、保活、dispose。
node scripts/dev-tools-smoke.mjs [--full-build]在真实模拟器上验证核心工具(加 --full-build 还会执行一次真实构建)。
node scripts/dev-routes-smoke.mjs签名 Web 路由:grant、推流代理、截图、ws 转发、围栏、过期。
node scripts/dev-card-smoke.mjs客户端卡片:静态 SSR(断言无 <img>)、status/capture 契约、近实时的网络部分。
node scripts/dev-panel-smoke.mjs面板组件、尺寸模式、边框样式、停靠/触发/胶囊逻辑(纯静态)。
node scripts/dev-logs-smoke.mjsios_sim_logs 的 snapshot/follow、过滤器、上限、进程回收。
node scripts/dev-uitree-smoke.mjsUI 树工具:AXe 解析/下载管线、选择器、真实模拟器上的树与点击。
node scripts/dev-debug-smoke.mjs调试工具:进程、调用栈(lldb + sample)、泄漏、App 信息。
node scripts/dev-preview-smoke.mjs预览热重载:启动、编辑 → 不重启的热替换、错误恢复、停止。
node scripts/dev-orphan-smoke.mjs宿主被异常杀死后孤儿 serve-sim 的收养/回收。
node scripts/dev-ocr-smoke.mjsVision-OCR 工具:助手解析、swiftc 编译缓存、识别管线、tap-text 路由。
node scripts/dev-wda-smoke.mjsWebDriverAgent 宿主:ServerURLHere 解析、失败分类、隧道、保活(mock;可选实测)。
node scripts/dev-realdevice-smoke.mjs对 USB 连接的 iPhone 执行 xcrun devicectl——工具所用的真实代码路径。
node scripts/dev-realstart-smoke.mjs/real-start 路由:围栏、编码拒绝、构建/启动门控(纯静态)。
node scripts/dev-realtools-smoke.mjsios_sim_screenshot / ios_sim_interact / ios_sim_ui_tree / ios_sim_tap_element 的真机后端,以及 ios_real_start_wda

生态

  • DSH Android — 在对话中运行 Android 模拟器或 USB 真机,全部由 adb 驱动
  • DSH Crew — 从 Claude Code / Codex 把任务派给 DSH agent
  • DSH Noema — DSH 的长期记忆
  • DSH OpenPencil — 在对话中查看和编辑 .op 设计文档

致谢与许可证

  • serve-sim —— Evan Bacon —— 模拟器推流引擎(Apache-2.0;随包安装的运行时依赖)。
  • AXe —— Cameron Cooke —— UI 树工具所依赖的无障碍 CLI(MIT)。
  • WebDriverAgent —— 插件在真机上构建并启动的 WebDriver 服务器(BSD 许可)。
  • 架构受 Codex 的 “Build iOS Apps” 插件启发;SwiftUI 预览引擎是对其公开文档所述方案的洁净室(clean-room)重实现,未复制任何 Codex 代码。
  • 完整声明见 THIRD_PARTY_NOTICES.md

许可证:MIT

REPOSITORY SIGNALS

Security & install evidence

This score is based solely on public repository metadata and the install evidence registered here — it is not a code security audit.

Traceable source

From a public plugin catalog, linked to a public GitHub repository.

License

The repository declares the MIT license.

Maintenance activity

Code updates within the last 180 days.

Install evidence

No verifiable install metadata registered yet — please review the repository instructions manually.

Install lifecycle scripts

The inspected package metadata declares no install lifecycle scripts.