用途:把 iOS 模拟器画面镜像到应用内浏览器,并支持从可导入的 Swift 包热重载 SwiftUI 预览。
浏览器工作流:先从现有 iOS 构建/运行流程或 xcrun simctl list devices available 获取明确的模拟器 UDID。在长期运行的终端中针对该模拟器启动 serve-sim,启动前清理该模拟器已跟踪的陈旧辅助进程,并安装 trap 以便终端退出时清理: SIM="<simulator-udid>" cleanup_serve_sim() { npx --yes serve-sim@latest --kill "$SIM" >/dev/null 2>&1 || true } trap cleanup_serve_sim EXIT INT TERM HUP cleanup_serve_sim npx --yes serve-sim@latest "$SIM" 随后在 Codex 应用内浏览器中打开 serve-sim 打印的本地预览 URL。报告成功前需确认确实渲染出真实画面,仅页面加载不算流健康。使用期间保持终端存活,结束后停止终端并等待其退出以触发 trap。若终端消失或未干净退出,再次镜像前先运行 npx --yes serve-sim@latest --kill "$SIM"。切勿运行未限定范围的 serve-sim --kill。
SwiftUI 预览工作流:当所需预览位于可导入的 Swift 包时,使用内置启动器,指向包清单并选择要显示预览的目标。它会在用户源码树之外生成一次性宿主项目,安装并在模拟器中启动该宿主,并监视包改动:
node <skill-root>/scripts/swiftui-preview-browser.mjs
/absolute/path/to/Package.swift
--package-target "<target>"
--device "<simulator-udid>"
监视模式默认开启,源文件编辑后重建生成的 dylib 并热替换进运行中的宿主,无需重启应用。生成的宿主显示所选目标中发现的所有预览变体,并带模拟器内页面控件;可用 --preview-filter <regex[, ...]> 只显示子集,匹配显示名与代码标识符。启动器打印所选 UDID 后,对同一 UDID 启动 serve-sim 并在应用内浏览器打开其 URL。
支持边界:通过生成的宿主支持 Swift 包支撑的 PreviewProvider 与 #Preview 声明;不要为强制支持预览而修改用户的 .xcodeproj、.xcworkspace、Package.swift、scheme 或构建设置。
验证:浏览器或预览 QA 需截取显示模拟器画面的浏览器截图;热重载 QA 还需报告启动器的热重载输出并展示编辑后的变化画面。