Skip to content

Releases: zhz8888/dsh-ios-simulator-helper

v1.1.3

Choose a tag to compare

@zhz8888 zhz8888 released this 20 Oct 06:56

参数页搬进「插件」详情,DSH 版本要求升到 0.2.1-rc.2

v1.1.2 之后的补丁版本。21 个工具、17 个设置字段、参数与结果结构都没有变化,运行时接口也没动;本版改的是参数在 DSH 里的位置,以及随之而来的版本要求。DSH 0.2.1 起,一个自带配置页的插件不再往「设置」对话框里塞一个新分区,而是把表单注册到「插件」页该插件自己的详情里;本插件原先注册的 settings.section 在新 harness 上既位置不对、插件详情里又什么都看不到。表单因此改注册到 plugins.bundle.config 槽,键为 npm 包名;详情页负责画标题、图标、面包屑与描述,表单只贡献一行「改动何时生效」的说明、五张分类卡片、诊断卡片和底部粘性保存栏。版本要求同步从 >=0.2.0-rc.2 抬到 >=0.2.1-rc.2——那个槽就是这一版引入的。四张市场截图随之在新位置重拍。

包含内容

  • 参数页迁到「插件」页的插件详情里:浏览器半侧不再注册 settings.section,改为注册 plugins.bundle.config 键控槽,键是插件管理器清点时比对的包名(不是设置命名空间——那是 patch 行 id,同一份代码可以被挂到别的行下)。注册仍挂在 whileServed 上:host 半侧不提供该命名空间时,页面上不留任何痕迹。插件详情页自己画标题、图标、面包屑和包描述,表单不再重复画一遍自己的标题与导航标签。
  • DSH 版本要求抬到 >=0.2.1-rc.2:peerDependencies 的 @deepseek-ai/dsh-tools、engines.dsh、dsh.compatibility.dsh 三处逐字一致,dshReleases 记下实际验证的 0.2.1-rc.2;lockfile 的 peer 解析随之落到 0.2.1-rc.2 的包。0.2.1 的 loader 直接读 engines.dsh(自带该字段时它单独决定成败),三处副本一旦漂移就是「插件被拒绝挂载」。
  • 一致性闸门盯住新的落点:scripts/check-bundle.mjs 新增插件面检查——槽名必须是 plugins.bundle.config、键与 PACKAGE_NAME 必须等于 package.json 的 name、且代码里不得再出现 "settings.section"。
  • 所有指向页面的文案跟着改:/ios-dev 报告的末行、诊断的修复建议(收敛为一个导出的 PAGE_LOCATION 常量,两处插值都有测试计数)、locale/*.json 的插件描述、随包 skill 文档,全部改成「插件」页该插件的详情。
  • 四张市场截图在新位置重拍:DSH harness 0.2.1-rc.2、中文界面、1598×1588、无暂存保存条与覆盖徽章;最后一张停在表单底部,不露出组件行的本地代码来源。
  • 文档:两份 README 的章节改名「配置页面」,开头一句话与图注全部指向新位置;徽章与版本闸门段落同步新的下界,新的「元组预发布」例子改成 0.2.2-alpha.1(0.2.1-alpha.1 现在排在下界之下,不再是并列的例子)。

相对 v1.1.2 的变化

  • 运行时零变化:21 个工具、17 个设置字段、参数与结果结构与 v1.1.2 一致,升级不需要改任何调用。
  • 位置变化:参数从「设置 → iOS 模拟器」搬到了「插件 → 已安装插件 → iOS 模拟器助手」的详情页。
  • 兼容性变化:要求 DSH >=0.2.1-rc.2;在 0.2.0-rc.2 上插件能挂载,但表单无处可渲染。
  • 开发侧变化:一致性闸门多了一层插件面检查;测试从 105 项增加到 108 项(槽位与键、未服务命名空间不注册槽位、覆盖徽章与重置控件)。

安装

已发布到 npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop 在「插件」页添加同一包名;已装旧版的地方用 @latest 升级,dist-tags.latest 已指向 1.1.3。

校验

  • pnpm run check,跑在 tag 指向的提交 d078273 上(工作区干净):108 项测试全部通过;check-bundle 通过(bundle id = 包名、命名空间 = patch 行 id、插件面槽位与键 = 包名且无 settings.section、17 个字段、3 条路由、macOS 判定与脚本形态);verify-mount 在真实 Cordis Context 与真实 ToolRuntime 上通过——21 个工具注册、17 个字段全部 volatile、dispose 后归零,并断言挂载不产生任何子进程、整轮不触及 Apple 工具。
  • 独立 DSH 0.2.1-rc.2 web 实例(临时 profile,验证后已删除)上的 Playwright 走查:表单在插件详情里就地渲染(中文界面),改一个值经表单保存后整页刷新仍然保留;bundle 里已不再注册任何 settings.section,闸门会在它重新出现时直接失败。
  • 未覆盖:pnpm run smoke 与 smoke:simulator 本次未重跑——本次没有改动构建/安装/启动的运行时逻辑,只是页面注册位置与版本声明;5 个 ios_ui_* 工具仍只验证到「缺 idb 时的拒绝」。
  • 发行由账号持有人手动完成:npm 的 2FA 网页授权在非交互终端里拿不到完整链接,自动化发布会在 EOTP 处停下。

发行侧

  • GitHub:tag v1.1.3 → 提交 d078273c42cc116a5de75c0c0a7adc597c18ab1a,已推送到 origin(GitHub)与 gitea 镜像。
  • npm:@zhz8888/dsh-ios-simulator-helper@1.1.3 —— https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.3
  • tarball:25 个文件、打包 116,386 B、解包 283,493 B,dist.shasum(sha1)0d5446ed74343a7fd10f7054728d353cb250078f、sha256 6bd341ab1ec8c07405184ab35db0ea6fb9c23aa98c7f94056e78adedc9819353
  • 已核对:npm 记录的 gitHead = tag v1.1.3 指向的提交 d078273c42cc116a5de75c0c0a7adc597c18ab1a;registry 上的 tarball 与本机 npm pack 逐字节一致(dist.shasum 相同,重新下载后 sha256 相同);dist-tags.latest 已指向 1.1.3。

The parameter page moves into the plugin detail, and the DSH floor rises to 0.2.1-rc.2

The patch release after v1.1.2. The tool count (21), the settings fields (17), every argument and every result shape are unchanged, and no runtime interface moved. What this release changes is where the parameters live in DSH, and the version requirement that follows. Since DSH 0.2.1, a plugin that owns a configuration page no longer adds another section to the Settings dialog: it registers the form on the Plugins page, inside the plugin's own detail view. The settings.section this plugin still registered landed in the wrong place on the new harness, and the plugin detail showed no configuration at all. The form now registers into the plugins.bundle.config keyed slot, keyed by the npm package name — the value the plugin manager's inventory compares against, not the settings namespace, which is the patch row id and may be mounted under another row. The detail page draws the title, icon, crumb and package description itself, so the form contributes only one line saying when an edit takes effect, the five category cards, the diagnostics card and the sticky save bar. The version requirement moves with it, from >=0.2.0-rc.2 to >=0.2.1-rc.2: that slot is what this release introduced. The four marketplace screenshots are re-shot at the new location.

What it contains

  • The parameter page now lives in the plugin's detail view on the Plugins page: the browser half no longer registers settings.section. It registers the plugins.bundle.config keyed slot instead, keyed by the plugin's package name. Registration still hangs off whileServed, so a deployment whose host half does not serve the namespace leaves no trace of the form. The detail page draws the title, icon, crumb and description, so the form no longer repeats a title or a Settings nav label of its own.
  • The DSH floor rises to >=0.2.1-rc.2: the @deepseek-ai/dsh-tools peer range, engines.dsh and dsh.compatibility.dsh state it verbatim, dshReleases records the release actually exercised (0.2.1-rc.2), and the lockfile's peer resolution moves to the 0.2.1-rc.2 packages. The 0.2.1 loader reads engines.dsh directly — an own engines.dsh decides alone there — so a copy that drifts means a plugin the loader refuses to mount.
  • The consistency gate watches the new surface: scripts/check-bundle.mjs gained a plugin-surface check — the slot must be plugins.bundle.config, the key and PACKAGE_NAME must equal package.json's name, and "settings.section" must not appear in the bundle any more.
  • Every pointer to the page follows: the last line of the /ios-dev report, the diagnostic fix hints (now one exported PAGE_LOCATION constant, with both interpolations counted by a test), the plugin descriptions in locale/*.json and the bundled skill document all name the plugin's detail view in the Plugins panel.
  • The four marketplace screenshots were re-shot at the new location: DSH harness 0.2.1-rc.2, Chinese locale, 1598 × 1588, no staged save bar and no override badge; the last frame stops at the form's bottom instead of exposing the component row's local code source.
  • Docs: both READMEs rename the section to "Configuration page", and the opening line and every caption point at the new location; the badge and the version-gate section state the new floor, and the new-tuple prerelease example moves to 0.2.2-alpha.1 (0.2.1-alpha.1 now sorts below the floor rather than beside it).

Changes since v1.1.2

  • No runtime change: 21 tools, 17 settings fields, the same arguments and result shapes as v1.1.2, so an upgrade needs no call-site change.
  • Placement change: the parameters move from "Settings → iOS Simulator" to the detail page of "Plugins → Installed plugins → iOS Simulator Helper".
  • Compatibility change: DSH >=0.2.1-rc.2 is now required; on 0.2.0-rc.2 the plugin mounts but has nowhere to render its form.
  • Development side: the consistency gate gained a plugin-surface check, and the suite grew from 105 to 108 tests (the slot and key, no slot entry when the namespace is not served, the override badge and its reset control).

Install

Published to npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

In DSH Desktop, add the same package name on the Plugins page; an older install upgrades with @latest, and dist-tags.latest now points at 1.1.3.

Verification

  • pnpm run check on the commit the tag points at, d078273, with a clean working tree: 108 tests pass; check-bundle passes (bundle id = package name, namespace = patch row id, plugin-surface slot and key = package name with no settings.section registration, 17 fields, 3 routes, the macOS verdict and script shape); verify-mount passes on a real Cordis Context and the real ToolRuntime — 21 tools registered, all 17 fields volatile, nothing left registered after dispose — and asserts that mounting starts no subprocess and that the run never reaches Apple's tooling.
  • A Playwright pass over an isolated DSH 0.2.1-rc.2 web instance (a scratch profile, deleted afterwards): the form renders inline in the plugin detail in the Chinese locale, a value edited through the form survives a full page reload; the bundle registers no Settings section at all, and the gate fails the moment settings.section reappears.
  • Not covered: pnpm run smoke and smoke:simulator were not re-run — this release changes no build/install/launch runtime logic, only where the page registers and what the version declaration says; the five ios_ui_* tools are still verified only to the "idb missing" refusal.
  • The publish was done by hand by the account owner: npm's 2FA web authorization does not print a usable link from a non-interactive terminal, so the automated publish stops at EOTP.

Release artifact

  • GitHub: tag v1.1.3 → commit d078273c42cc116a5de75c0c0a7adc597c18ab1a, pushed to origin (GitHub) and the gitea mirror.
  • npm: @zhz8888/dsh-ios-simulator-helper@1.1.3 — https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.3
  • Tarball: 25 files, 116,386 B packed, 283,493 B unpacked, dist.shasum (sha1) 0d5446ed74343a7fd10f7054728d353cb250078f, sha256 6bd341ab1ec8c07405184ab35db0ea6fb9c23aa98c7f94056e78adedc9819353
  • Checked: npm's gitHead equals the commit tag v1.1.3 points at, d078273c42cc116a5de75c0c0a7adc597c18ab1a; the registry tarball is byte-identical to the local npm pack (same dist.shasum, same sha256 after re-download); dist-tags.latest points at 1.1.3.

v1.1.2

Choose a tag to compare

@zhz8888 zhz8888 released this 19 Oct 10:26

校验不再触碰模拟器栈、图标去掉灰底:一次资源与视觉的补丁

v1.1.1 之后的补丁版本。21 个工具、17 个设置字段、参数与结果结构都没有变化,也没有改动任何运行时接口——本版修的是两件「没人要求却每次都会发生」的事:插件自己的测试与挂载校验每次运行都会执行 xcodebuild、xcrun simctl 与 idb(测试套件在目标未启动时甚至真的会 simctl boot),以及 ios_install_app 在拒绝一个非法路径之前就已经解析并可能启动模拟器。另外把插件图标的灰底整体抠掉,收紧设置页卡片内部间距,四张市场截图随之换成本次发布前的真实界面。

包含内容

  • 测试与挂载校验不再触碰 Apple 工具:scripts/verify-mount.mjs(pnpm run check 的一环)默认只派发 ios_discover_project,两个真机工具改为 --with-simulator 显式开启;test/host.test.js 中三处会走到真实 provider 的用例改由 test/helpers/offline-seam.mjs 离线应答——除 6 个只读动词(help、list、appinfo、listapps、getenv、get_app_container)之外的所有 simctl 动词一律拒绝并记账,守卫用例在任何用例试图改动模拟器状态时直接失败。实测整条 gate 的子进程从 10 条降到 1 条(test/providers.test.js 里那个故意写错的 idb 路径),pnpm test 现在不需要安装 Xcode。
  • ios_install_app 先校验、后解析:appPath 的越界检查移到 simProvider.boot() 之前,被拒绝的调用不再解析甚至启动模拟器;合法路径的行为与拒绝文案都逐字未变。
  • 图标去掉灰底:ios-simulator.png 仍是 ZCode 市场那张图,去掉其 #F5F5F7 平铺底——深色列表里不再是一块发白的方块。新增 PNG 解码契约测试:四角全透明、无半透明像素残留底色、图形本身保持不透明;朴素 -fuzz 抠图或过度抠图都会让测试失败。
  • 卡片内间距收紧:字段之间 20→14px、末字段到卡片底 26→8px、卡片之间 20→16px,宿主检测卡片补上缺失的间距。
  • 四张市场截图重拍:同窗口、同取景(1598×1588)、中文界面、无保存操作条;第 3 张的图注随画面调整(顶部改为 DerivedData 目录,末尾进入输出目录)。
  • 文档:两份 README 的仓库内链接改为相对路径(GitHub、npm 页、克隆后都可用),语言切换只链另一版;AGENTS.md 与代码现状对齐(该文件不进发布包)。

相对 v1.1.1 的变化

  • 运行时零变化:21 个工具、17 个设置字段、参数与结果结构都与 v1.1.1 一致,升级不需要改任何调用。
  • 开发侧变化:pnpm test 与 pnpm run check 现在完全不依赖 Xcode/模拟器;真机校验在 pnpm run smoke,以及 verify-mount --with-simulator。
  • 视觉变化:图标透明底、卡片内间距、四张市场截图。

安装

已发布到 npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop 在「插件」页添加同一包名;已装旧版的地方用 @latest 升级,dist-tags.latest 已指向 1.1.2。

校验

  • pnpm run check,跑在 tag 指向的提交 8d56452 上(工作区干净):105 项测试全部通过;check-bundle 通过(bundle id = 包名、命名空间 = patch 行 id、17 个字段、3 条路由、macOS 判定与脚本形态);verify-mount 在真实 Cordis Context 与真实 ToolRuntime 上通过——21 个工具注册、17 个字段全部 volatile、dispose 后归零,并断言挂载不产生任何子进程、整轮不触及 Apple 工具。
  • pnpm run smoke(只读真机探测):5 步 0 失败,preflight 结论 ready;ios_ui_status 如实报告本机没有 idb;跑完后没有任何设备处于 Booted。
  • 独立复核:另一个会话对本次改动做了两轮独立验证与反证。反证方式是把「先 boot 后校验」改回去、并把假设备设为 Shutdown——此时用例确实会走到 xcrun simctl boot,两条守卫分别以 a refused call must not touch a simulator、a unit test tried to change simulator state 失败,证明改动真实生效而非空转。
  • 未覆盖:smoke:simulator 全链路本次未重跑——它会真实启动一台模拟器,而本次没有改动构建/安装/启动的运行时逻辑;ios_install_app 的两行顺序调整由单元测试与上述反证覆盖。5 个 ios_ui_* 工具仍只验证到「缺 idb 时的拒绝」。

发行侧

  • GitHub:tag v1.1.2 → 提交 8d5645212bdb71582a70110998924ee870e3dc37,已推送到 origin(GitHub)与 gitea 镜像。
  • npm:@zhz8888/dsh-ios-simulator-helper@1.1.2 —— https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.2
  • tarball:25 个文件、打包 115,069 B、解包 279,344 B,dist.shasum(sha1)88aa4b5db68ac4ff306db08fbe4d0e3d42b40d20、sha256 f91af78976b9eb5fb6e2b78c850ed2421bfbbcba23a2773e2697815f733ff202
  • 已核对:npm 记录的 gitHead = tag v1.1.2 指向的提交 8d5645212bdb71582a70110998924ee870e3dc37;registry 上的 tarball 与本机 npm pack 逐字节一致(dist.shasum 相同,重新下载后 sha256 相同)

A patch about resources and pixels: verification stops touching the simulator stack, and the icon loses its grey tile

The patch release after v1.1.1. The tool count (21), the settings fields (17), every argument and every result shape are unchanged, and no runtime interface moved. What it fixes is two things nobody asked for that happened anyway: the plugin's own tests and its mount check ran xcodebuild, xcrun simctl and idb on every run — the suite could even run simctl boot when no simulator was booted — and ios_install_app resolved a target, and could start one, before it refused an unusable path. It also keys the grey tile out of the plugin icon, tightens the settings-page card rhythm, and re-shoots the four marketplace screenshots against the page this release ships.

What it contains

  • The tests and the mount check no longer reach Apple's tooling: scripts/verify-mount.mjs, part of pnpm run check, dispatches ios_discover_project alone by default; the two real-machine tools sit behind --with-simulator. The three test/host.test.js cases that reach a real provider are answered by test/helpers/offline-seam.mjs, which refuses every simctl verb except the six that only read (help, list, appinfo, listapps, getenv, get_app_container) and records what it was asked for; a guard case fails if any case tries to change simulator state. Measured: the whole gate went from ten child processes to one (the deliberately wrong idb path in test/providers.test.js), and pnpm test no longer needs Xcode installed.
  • ios_install_app validates before it resolves: the appPath boundary check now runs before simProvider.boot(), so a refused call no longer resolves — let alone starts — a simulator. A valid path behaves exactly as before, and the refusal message is unchanged word for word.
  • The icon loses its grey tile: ios-simulator.png is still the artwork ZCode's marketplace serves, with its flat #F5F5F7 backdrop keyed out, so it is no longer a washed-out square in a dark list. A new PNG-decoding contract test pins it: the four corners fully transparent, no half-transparent pixel still carrying the tile colour, the artwork itself opaque — a naive -fuzz key or an over-aggressive one fails the suite.
  • A tighter card rhythm on the settings page: 20→14px between fields, 26→8px from the last field to the card's bottom edge, 20→16px between cards, and the host-check card gets the spacing it was missing.
  • The four marketplace screenshots were re-shot: same window, same framing (1598×1588), Chinese locale, no save bar; caption 3 moved with its frame — it now opens at the DerivedData directory and ends in the output directories.
  • Docs: both READMEs link repository files relatively (GitHub, the npm page and a clone all resolve them), the language switch links only the other edition, and AGENTS.md was aligned with the code (that file does not ship).

Changes since v1.1.1

  • No runtime change: 21 tools, 17 settings fields, the same arguments and result shapes as v1.1.1, so an upgrade needs no call-site change.
  • Development side: pnpm test and pnpm run check no longer depend on Xcode or a simulator at all; the real-machine checks are pnpm run smoke and verify-mount --with-simulator.
  • Visual side: the transparent icon, the card rhythm, and the four marketplace screenshots.

Install

Published to npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

In DSH Desktop, add the same package name on the Plugins page; an older install upgrades with @latest, and dist-tags.latest now points at 1.1.2.

Verification

  • pnpm run check on the commit the tag points at, 8d56452, with a clean working tree: 105 tests pass; check-bundle passes (bundle id = package name, namespace = patch row id, 17 fields, 3 routes, the macOS verdict and script shape); verify-mount passes on a real Cordis Context and the real ToolRuntime — 21 tools registered, all 17 fields volatile, nothing left registered after dispose — and asserts that mounting starts no subprocess and that the run never reaches Apple's tooling.
  • pnpm run smoke (read-only probes against this machine): 5 steps, 0 failed, preflight verdict ready; ios_ui_status reports truthfully that idb is missing; no device is left booted afterwards.
  • Independent review: a separate session verified this change over two rounds and falsified it — restoring boot-before-validate and switching the stubbed device to Shutdown makes the suite really reach xcrun simctl boot, and the two guards fail with a refused call must not touch a simulator and a unit test tried to change simulator state. The guards bite rather than pass vacuously.
  • Not covered: the full smoke:simulator loop was not re-run — it boots a real simulator, and no build/install/launch runtime logic changed here; the two-line ios_install_app reorder is covered by the suite and the falsification above. The five ios_ui_* tools are still verified only to the "idb missing" refusal.

Release artifact

  • GitHub: tag v1.1.2 → commit 8d5645212bdb71582a70110998924ee870e3dc37, pushed to origin (GitHub) and the gitea mirror.
  • npm: @zhz8888/dsh-ios-simulator-helper@1.1.2 — https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.2
  • Tarball: 25 files, 115,069 B packed, 279,344 B unpacked, dist.shasum (sha1) 88aa4b5db68ac4ff306db08fbe4d0e3d42b40d20, sha256 f91af78976b9eb5fb6e2b78c850ed2421bfbbcba23a2773e2697815f733ff202
  • Checked: npm's gitHead equals the commit tag v1.1.2 points at, 8d5645212bdb71582a70110998924ee870e3dc37; the registry tarball is byte-identical to the local npm pack (same dist.shasum, same sha256 after re-download)

v1.1.1

Choose a tag to compare

@zhz8888 zhz8888 released this 17 Oct 14:20

兼容声明与文档版本:DSH 依赖区间改为只有下界

v1.1.0 之后的补丁版本,工具数量(21 个)与设置字段(17 个)不变,运行时行为也没有改动:本版改的是「插件对 DSH 的依赖怎么声明」以及「仓库文档怎么组织」。核心是把 DSH 兼容范围改成只有下界、三处逐字一致,使 harness 或 peer 升大版本时不必重发插件;同时两份 README 收敛为纯用户文档,开发规范移入 AGENTS.md,四张市场截图换成当前设置页的真实界面。

包含内容

  • DSH 依赖声明改为只有下界:peerDependencies 现为 @deepseek-ai/cordis >=4.0.4、@deepseek-ai/dsh-tools >=0.2.0-rc.2、@deepseek-ai/schemastery >=3.18.4(原先是 ^4.0.4 || ^4.0.5-alpha.1 这类带元组分叉的写法);engines.dsh 与 dsh.compatibility.dsh 逐字重述 @deepseek-ai/dsh-tools 的区间,dsh.compatibility.dshReleases 记下实测过的 0.2.0-rc.2。代价是 node-semver 默认不放行新元组的预发布(例如 0.2.1-alpha.1),README 的「版本闸门」一节给出两种绕过方式。
  • 测试锁住这三处声明:test/manifest.test.js 现在断言三处区间逐字相同,且每个 peer 区间都以 >= 开头——写回上界会在 pnpm check 阶段直接失败。
  • README 变为纯用户文档:安装、设置页 17 个字段、四张截图、21 个工具、与原插件的差异、已知限制,并保留「目录」便于跳转。开发规范(仓库地图、不变式、四层验证、提交与发布约定、插件市场要求)全部移入 AGENTS.md。
  • 修正一处不实说明:旧 README 称「非 macOS 时所有 ios_* 工具都会拒绝」,实际只有 17 个会(走 requireMacOS 的模拟器、构建、截图、日志与 UI 工具);ios_preflight 是报告宿主检查失败,ios_ui_status、ios_discover_project、ios_create_app 仍正常返回。
  • 四张市场截图重拍:替换拍于设置页改版之前的旧图(旧图是无卡片的流式布局、开关带 on 标签、启动超时以毫秒显示 120000)。新图是当前卡片布局与整秒超时;第 3、4 张的文案也按实际内容重新划分(DerivedData 与代码签名在第 3 张,输出目录与宿主检测在第 4 张)。

相对 v1.1.0 的变化

  • 运行时行为不变:21 个工具、17 个设置字段、参数与结果结构都与 v1.1.0 一致,升级无需改动任何调用。
  • 依赖区间写法变化:稳定版(0.2.0、0.3.0、1.0.0…)一律放行;0.2.1-alpha.1 这类新元组预发布需按 README 的两种方式之一处理——给该元组补一条分支,或 --config.strict-peer-dependencies=false。
  • 文档形态变化:npm 页上的 README 会更短并带目录;AGENTS.md 承担开发规范(该文件不进发布包)。

安装

已发布到 npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop 则在「插件」页里添加同一个包名;已装 1.0.0 或 1.1.0 的地方用 @latest 即可升到本版,dist-tags.latest 已指向 1.1.1。

校验

  • pnpm run check,跑在 tag 指向的提交 eeeca0a 上(工作区干净):102 项测试全部通过;check-bundle 通过(bundle id = 包名、命名空间 = patch 行 id、17 个字段、3 条路由、macOS 判定与脚本形态);verify-mount 在真实 Cordis Context 与真实 ToolRuntime 上通过(21 个工具注册、17 个字段全部 volatile、dispose 后工具归零)。
  • pnpm run smoke(只读真机探测):5 步 0 失败,preflight 结论为 ready;ios_ui_status 如实报告本机没有 idb。
  • 结构镜像:两份 README 仍逐标题、逐表格对齐(各 224 行,17 个标题行号一致)。
  • 未覆盖:smoke:simulator 全链路本次未重跑——自 v1.1.0 起没有改动任何运行时代码,而 v1.1.0 的发布记录中该链路跑过 12 步 0 失败;5 个 ios_ui_* 工具仍只验证到「缺 idb 时可执行的拒绝」。

发行侧

  • GitHub:tag v1.1.1 → 提交 eeeca0a34ea7c085ebb26872233276eeb459fdd3,已推送到 origin(GitHub)与 gitea 镜像。
  • npm:@zhz8888/dsh-ios-simulator-helper@1.1.1 —— https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.1 ,dist-tags.latest 已指向本版
  • tarball:25 个文件、打包 100,398 B、解包 264,621 B,dist.shasum(sha1)2391b2e4ab5ea4843cb85ddba5d937ea1d229bcd、sha256 835d82280fd7360029721d8df64ecfbf947dfeb6743a9a5bbd8dea7dd9a5bb2f
  • 已核对:npm 记录的 gitHead 为 eeeca0a34ea7c085ebb26872233276eeb459fdd3,等于 tag v1.1.1 指向的提交;dist.shasum 等于本机 npm pack 打出的 tarball;从 registry 下载同一 tarball 重算的 sha256 也与上值一致

The compatibility declaration and the docs: a DSH range with no upper bound

The patch release after v1.1.0; the tool count (21) and the settings-field count (17) are unchanged, and no runtime behaviour moved. What changed is how the plugin declares its DSH dependency and how this repository organises its documentation. The core is a DSH compatibility range that states a lower bound only and is written identically in three places, so a harness or peer major bump no longer forces a re-release; the two READMEs also became the user document, the development conventions moved into AGENTS.md, and the four marketplace screenshots were re-shot against the current settings page.

What it contains

  • The DSH requirement is now a lower bound only: peerDependencies state @deepseek-ai/cordis >=4.0.4, @deepseek-ai/dsh-tools >=0.2.0-rc.2 and @deepseek-ai/schemastery >=3.18.4 (they used to carry tuple branches such as ^4.0.4 || ^4.0.5-alpha.1); engines.dsh and dsh.compatibility.dsh restate the @deepseek-ai/dsh-tools range verbatim, and dsh.compatibility.dshReleases names the release actually exercised, 0.2.0-rc.2. The cost: node-semver does not admit a new tuple's prerelease such as 0.2.1-alpha.1 by default, and README → Install → Version gate documents the two workarounds.
  • A test keeps the three declarations honest: test/manifest.test.js now asserts the three ranges are identical and that every peer range starts with >= — putting an upper bound back fails pnpm check outright.
  • The READMEs are the user document now: install, the 17 settings fields, the four screenshots, the 21 tools, the differences from the original plugin and the known limitations, with the Contents list back for navigation. The development conventions — repository map, invariants, the four verification layers, commit and release rules, the marketplace requirements — moved into AGENTS.md.
  • One false claim corrected: the old README said every ios_* tool refuses off macOS. Only the 17 that call requireMacOS do (the simulator, build, screenshot, log and UI tools); ios_preflight reports the failed host check instead, and ios_ui_status, ios_discover_project and ios_create_app still answer.
  • The four marketplace screenshots were re-shot: they replace shots taken before the settings-page rework (the old ones show the flow layout with no cards, switches labelled on, and the boot timeout in milliseconds, 120000). The new ones show the current card layout and whole-second timeouts, and captions 3 and 4 were re-cut to what they actually show — DerivedData and code signing in shot 3, the output directories and the host check in shot 4.

Changes since v1.1.0

  • No runtime behaviour changed: 21 tools, 17 settings fields, the same arguments and result shapes as v1.1.0, so an upgrade needs no call-site change.
  • The range syntax changed: stable releases (0.2.0, 0.3.0, 1.0.0, …) are always admitted; a new tuple's prerelease such as 0.2.1-alpha.1 needs one of the two documented routes — a range branch for that tuple, or --config.strict-peer-dependencies=false.
  • The documentation changed shape: the README rendered on npm is shorter and carries a Contents list, and AGENTS.md holds the development conventions (that file is not part of the published package).

Install

Published on npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

In DSH Desktop, add the same package name on the Plugins page; an existing 1.0.0 or 1.1.0 install upgrades with @latest, since dist-tags.latest now points here.

Verification

  • pnpm run check on the commit this tag points at, eeeca0a (clean tree): 102 tests pass; check-bundle passes (bundle id = package name, namespace = patch row id, 17 fields, 3 routes, the macOS verdict and script hygiene); verify-mount passes on a real Cordis Context and the real ToolRuntime (21 tools registered, all 17 fields volatile, every tool unregistered after dispose).
  • pnpm run smoke (read-only probes on the real machine): 5 steps, none failed, preflight verdict ready; ios_ui_status truthfully reports that idb is absent here.
  • Structural mirror: the two READMEs still line up heading for heading and table for table (224 lines each, the same 17 headings at the same line numbers).
  • Not covered: the full smoke:simulator loop was not re-run for this release — no runtime code changed since v1.1.0, whose release ran it end to end with 12 steps and no failure; and the five ios_ui_* tools are still verified only up to their actionable refusal without idb.

Release artifact

  • GitHub: tag v1.1.1 → commit eeeca0a34ea7c085ebb26872233276eeb459fdd3, pushed to origin (GitHub) and the gitea mirror.
  • npm: @zhz8888/dsh-ios-simulator-helper@1.1.1 — https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.1 ; dist-tags.latest now points at this version
  • tarball: 25 files, 100,398 B packed, 264,621 B unpacked, dist.shasum (sha1) 2391b2e4ab5ea4843cb85ddba5d937ea1d229bcd, sha256 835d82280fd7360029721d8df64ecfbf947dfeb6743a9a5bbd8dea7dd9a5bb2f
  • Verified: npm records the gitHead eeeca0a34ea7c085ebb26872233276eeb459fdd3, the commit tag v1.1.1 points at; dist.shasum equals the tarball npm pack produced locally; and the sha256 recomputed from the same tarball downloaded off the registry matches the value above

v1.1.0

Choose a tag to compare

@zhz8888 zhz8888 released this 17 Oct 09:49

Xcode 26/27 适配版本:模拟器窗口、沙箱内构建与设备选择

v1.0.0 之后的第一个版本,工具数量(21 个)与设置字段(17 个)都没有变化。核心是在当前 Xcode 上把插件真正跑通:Apple 用 Device Hub 取代了 Simulator.app,而插件里所有「打开模拟器窗口」的路径都先于对应的 simctl 命令执行,于是在 Xcode 26 及以上版本里,ios_launch_app、ios_open_url、ios_show_simulator 以及所有会开窗的启动与构建调用都会直接失败。同一次发布前全量测试还修掉了沙箱内构建、设备名匹配与两处路径、文案问题。

包含内容

  • 模拟器窗口应用(本版关键修复):按 Xcode 的实际发布形态解析窗口应用——先按历史名称 Simulator,再按开发者目录与 /Applications 下的 Simulator.app / Device Hub.app,最后按 bundle id com.apple.iphonesimulator / com.apple.dt.Devices。开窗改为尽力而为:失败时在结果里给出 opened: false 与 openWarning,不再连累 simctl 步骤;ios_show_simulator(开窗就是它的本职)仍会失败,但会说明它找过哪两个应用。-CurrentDeviceUDID 只传给 Simulator.app——Device Hub 没有公开的逐设备参数。
  • 沙箱内构建自动重试:swift-plugin-server 要在自己嵌套的 sandbox-exec 里做宏展开,调用方本身已在沙箱内(DSH bash 工具、CI runner)时无法启动,插件自己生成的模板(用了 @State、#Preview)就会编译失败。ios_build_app 现在精确识别该签名,改用 OTHER_SWIFT_FLAGS=-disable-sandbox 重试一次,并在结果里标记 macroSandboxRetry: true;真实编译错误不会触发重试,调用方没被沙箱包裹时也不会多花时间。
  • 设备名精确匹配:device: "iPhone 17" 过去会选中 iPhone 17e——先命中的子串,而 simctl 列表里 17e 排在前面。现在先做大小写不敏感的精确匹配,再退回子串匹配。
  • 构建日志路径:日志位于插件数据目录,当 DSH_HOME 在工作区之外时会返回 ../../.dsh/... 这类逃逸相对路径;现在工作区之外的日志一律给出绝对路径。
  • idb 缺失时的拒绝信息:状态详情与修复建议原本黏成一句(…stay unavailable Install idb and idb-companion…),现在会先归一化句末标点再拼接。
  • v1.0.0 之后已在 main 上的两项:设置页改成卡片式布局加底部常驻操作条(仅在草稿、写入中或写入失败时出现,带 Discard changes 与 Save,草稿无效时禁用保存),三个超时字段改为以秒存储,旧的 IOS_SIM_*_MS 变量语义不变;插件图标换成 ZCode 官方市场使用的那张原图(192×192 不透明 PNG),插件页显示名统一为「iOS 模拟器助手 / iOS Simulator Helper」,并在两种语言的描述里写明与 Apple 无隶属关系。

相对 v1.0.0 的变化

  • 工具与设置字段数量不变,ios_* 名称与参数不变:为原 ios_simulator MCP 服务器写的工作流可以直接迁移。
  • 需要留意的行为变化:ios_boot_simulator、ios_launch_app、ios_open_url、ios_build_and_run 结果里的 opened 现在表示「窗口确实打开了」,打不开时新增 openWarning;ios_build_app 在沙箱内构建成功时新增 macroSandboxRetry;ios_build_app 的 logPath 在工作区之外时是绝对路径。
  • 设置页的三个超时以秒显示(120 / 60 / 600);IOS_SIM_*_MS 环境变量的拼写与含义不变。
  • assets/ 里那四张市场截图拍于设置页改版之前,README 已注明这一点,重新截图后该说明即可移除。

安装

已发布到 npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop 则在「插件」页里添加同一个包名;已装 1.0.0 的地方用 @latest 即可升到本版。

校验

  • pnpm check(102 项测试 + check-bundle + 真实 Cordis Context 与真实 ToolRuntime 挂载)全绿,跑在 tag 指向的那个提交上。
  • 真机全链路:pnpm run smoke:simulator -- --device "iPhone 17" → create → build → install → launch → screenshot → logs → terminate → shutdown,12 步 0 失败;macroSandboxRetry: true、xcodebuild 退出码 0、截图 94,430 字节,并用独立写的 PNG 像素分析确认抓到的是应用界面(不是空白或黑屏)。
  • 窗口应用:Xcode 27.1 上 show() 返回 app: "DeviceHub",boot(open: true) 返回 opened: true。
  • 只读探测 5/5 通过;21 个工具在本机运行中的 DSH Desktop(desktop profile 以 link: 挂载本仓库)里实际派发过;工作区逃逸路径被拒绝。
  • 未覆盖:设置页的真实 GUI(desktop 端已关闭普通浏览器访问,沙箱内取不到证),以及 5 个 ios_ui_* 工具的端到端行为(本机未安装 idb,只验证到「不可用时报错可执行」)。

发行侧

  • npm:@zhz8888/dsh-ios-simulator-helper@1.1.0 —— https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.0 ,dist-tags.latest 已指向本版
  • tarball:25 个文件,打包 108.3 kB(108,307 B),解包 285,174 B,sha256 ae427dff10b2ac9b7bc66a1199c11bf0df92a9d65f7add5957505a43c19e53b2
  • 已核对:npm 记录的 gitHead 为 5a2d6e813d2bd8d708a52ed8b237f7983350bd7c,与 tag v1.1.0 指向的提交一致;dist.shasum 为 c1d7944feaedf02e2b8886169da34005363130c5,等于本机 npm pack 打出的 tarball

Xcode 26/27 compatibility: the simulator window, sandboxed builds and device selection

The first release after v1.0.0; the tool count (21) and the settings-field count (17) are unchanged. Its core is making the plugin actually work on a current Xcode: Apple replaced Simulator.app with Device Hub, and every path that showed the simulator window ran before its simctl command — so on Xcode 26 and later ios_launch_app, ios_open_url, ios_show_simulator and every boot or build that opens a window failed outright. The same pre-release test pass fixed the sandboxed build, the device-name match, and two path and wording problems.

What it contains

  • The simulator window app (the release's key fix): the window app is resolved the way Xcode actually ships it — the historical Simulator name first, then Simulator.app / Device Hub.app under the selected developer directory and /Applications, then the bundle ids com.apple.iphonesimulator / com.apple.dt.Devices. Opening the window is now best-effort: a failure is reported as opened: false plus openWarning instead of taking the simctl steps down with it; ios_show_simulator, where opening the window is the operation, still fails, and now names both apps it looked for. -CurrentDeviceUDID goes to Simulator.app only — Device Hub publishes no per-device argument.
  • Sandboxed builds retry automatically: swift-plugin-server expands macros under its own nested sandbox-exec, which cannot start when the caller is itself sandboxed (the DSH bash tool, a CI runner), so the template this plugin generates — @State and #Preview — failed to compile. ios_build_app now recognizes that exact signature, retries once with OTHER_SWIFT_FLAGS=-disable-sandbox, and reports macroSandboxRetry: true; a real compile error never triggers the retry, and a caller that was never sandboxed never pays for it.
  • Exact device names: device: "iPhone 17" used to select iPhone 17e — the first substring hit, and simctl lists 17e first. A case-insensitive exact match is now tried before the substring match.
  • The build-log path: the log lives under the plugin data directory, and when DSH_HOME sits outside the session workspace the result carried a ../../.dsh/… path that escaped the workspace; a log outside the workspace is now reported absolutely.
  • The idb refusal: the status detail and the fix ran together (…stay unavailable Install idb and idb-companion…); the sentence ending is normalized before they are joined.
  • Two changes already on main since v1.0.0: the settings page became cards with a sticky action bar (present only while a write is staged, in flight or failed, with Discard changes and Save, and Save disabled while the draft is invalid), and the three timeouts are stored in seconds while the legacy IOS_SIM_*_MS variables keep their meaning. The icon is now the artwork ZCode's own marketplace shows for this plugin (a 192×192 opaque PNG), and the plugin page is named "iOS Simulator Helper / iOS 模拟器助手" in both languages, with the non-affiliation line in each description.

Changes since v1.0.0

  • Tool and settings-field counts are unchanged, and the ios_* names and arguments are unchanged: workflows written for the original ios_simulator MCP server still migrate as they are.
  • Behaviour worth knowing: in the results of ios_boot_simulator, ios_launch_app, ios_open_url and ios_build_and_run, opened now means "the window actually opened", and a window that could not open adds openWarning; ios_build_app adds macroSandboxRetry when it had to retry under a sandbox; ios_build_app's logPath is absolute when the log is outside the workspace.
  • The three timeouts show as seconds on the settings page (120 / 60 / 600); the IOS_SIM_*_MS variables keep their spelling and meaning.
  • The four marketplace screenshots in assets/ were captured before the settings-page rework; the README now says so, and that note goes away once they are re-shot.

Install

Published on npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop: add the same package name on the Plugins page; an existing 1.0.0 install upgrades with @latest.

Verification

  • pnpm check (102 tests, plus check-bundle and a mount on a real Cordis Context and the real ToolRuntime) is green, on the commit this tag points at.
  • Real-machine loop: pnpm run smoke:simulator -- --device "iPhone 17" → create → build → install → launch → screenshot → logs → terminate → shutdown, 12 steps, none failed; macroSandboxRetry: true, xcodebuild exit 0, a 94,430-byte screenshot, and an independently written PNG pixel analysis confirming the capture is the app's UI rather than a blank or black frame.
  • Window app: on Xcode 27.1 show() returns app: "DeviceHub" and boot(open: true) returns opened: true.
  • The read-only probes pass 5/5; all 21 tools were dispatched inside the DSH Desktop running on this machine (its desktop profile mounts this repository with link:); workspace-escaping paths were refused.
  • Not covered: the settings page in the real GUI (ordinary browser access is disabled on the Desktop host, so a sandboxed session cannot reach it), and end-to-end behaviour of the five ios_ui_* tools (idb is not installed here, so they were verified up to their actionable refusal).

Release artifact

  • npm: @zhz8888/dsh-ios-simulator-helper@1.1.0 — https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper/v/1.1.0 ; dist-tags.latest now points at this version
  • tarball: 25 files, 108.3 kB packed (108,307 B), 285,174 B unpacked, sha256 ae427dff10b2ac9b7bc66a1199c11bf0df92a9d65f7add5957505a43c19e53b2
  • Verified: npm records the gitHead 5a2d6e813d2bd8d708a52ed8b237f7983350bd7c, the commit tag v1.1.0 points at, and dist.shasum c1d7944feaedf02e2b8886169da34005363130c5, which is the tarball npm pack produced locally

v1.0.0

Choose a tag to compare

@zhz8888 zhz8888 released this 16 Oct 18:52

首个正式版本:把 iOS 模拟器接进 DeepSeek Harness

把 ZCode 官方 ios-simulator@0.1.0 插件移植为 DSH 原生插件后的第一个正式版本。原有 20 个工具全部保留为原生 ios_* 工具,另加一个 ios_shutdown_simulator(原插件能启动模拟器却无法停止),并新增一个完整的设置页;本版同时按 awesome-dsh-plugin 贡献指南整理了包结构、scoped 包名与插件页显示名。

包含内容

  • 21 个 ios_* 原生工具:工程发现与脚手架、模拟器启用/安装/启动/结束、截图、日志,以及可选的 idb UI 自动化。工具名与参数名与原插件完全一致,为原 ios_simulator MCP 服务器写的工作流可直接迁移。
  • 设置页(设置 → iOS 模拟器):5 组 17 个字段,全部实时生效;空值按「设置页 → 原插件 IOS_SIM_* 环境变量 → 内置默认值」回落。
  • 宿主检测:非 macOS 时页面顶部常驻提示,且所有 ios_* 工具以一句话拒绝执行,而不是抛出 spawn xcrun ENOENT。
  • ios-dev skill 与 /ios-dev [goal] 命令:命令只运行环境诊断并打印结论与修复建议(DSH 用户命令不会创建模型消息)。
  • 结构:dsh.bundle.patch 声明的补丁层只挂载一行宿主记录;设置命名空间 = 补丁行 id = ios-simulator-helper。

与原插件的差异

  • 新增 ios_shutdown_simulator;ios_build_and_run 的 bundle id 解析改为四级顺序(显式参数 → 刚构建出的 .app 的 CFBundleIdentifier → 同一 -derivedDataPath 的 -showBuildSettings → project.pbxproj 中的标识符),并回报 bundleIdSource,修掉原插件「构建成功却报 bundle id 解析失败」的静默行为。
  • 截图、构建日志与 DerivedData 的落盘位置可在设置页配置,默认根目录为 $DSH_HOME/ios-simulator-helper。
  • 原插件的 userConfig 与 IOS_SIM_* 环境变量仍作为回落生效,已有 ZCode / CI 配置无需改动。

安装

已发布到 npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop 则在「插件」页里添加同一个包名。package.json 声明了 dsh.bundle.patch,DSH 的 reconcile 会把本包追加进 dsh.profile.bundles,启动时合并补丁层并挂载唯一一行宿主记录。

校验

  • pnpm check:86 项测试全部通过;check-bundle(bundle id = 包名、命名空间一致、host/client 两份字段表一致、三个路由、macOS 判定)与 verify-mount(真实 Cordis Context + 真实 ToolRuntime 上挂载 21 个工具)均通过。
  • assets/ 中 4 张截图取自真实安装后的设置页,不是示意图。
  • 包内无运行时依赖;@deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery 一律为 peer 依赖。

发行侧

  • npm:@zhz8888/dsh-ios-simulator-helper@1.0.0 —— https://www.npmjs.com/package/@zhz8888/dsh-ios-simulator-helper
  • tarball:25 个文件、打包 74.3 kB(解包 232,081 B),sha256 7a5860326213cf0759b353b3497fb4774a93ea1fd2d8f1af63fcc8728f4dace3
  • npm 记录的 gitHead 为 e9b7b6b,与 tag v1.0.0 指向的提交一致

First stable release: the iOS Simulator inside DeepSeek Harness

First stable release of the DSH-native port of the official ZCode ios-simulator@0.1.0 plugin. All 20 original tools are preserved as native ios_* tools, one tool is added — ios_shutdown_simulator, because the original could boot a simulator but never stop one — and a full settings page joins them. This version also reshapes the package for the awesome-dsh-plugin contributing guide: scoped package name, listing metadata, and a plugin-page name that comes from locale/.

What it contains

  • 21 native ios_* tools: Xcode project discovery and scaffolding, simulator boot/install/launch/terminate, screenshots, logs, and optional idb UI automation. Tool and argument names are identical to the original, so workflows written for the ios_simulator MCP server keep working.
  • Settings page (Settings → iOS Simulator): 17 fields in 5 groups, all live-editable; an empty field falls back to the original plugin's IOS_SIM_* variable, then to the built-in default.
  • Host check: on a non-macOS host the page states that this plugin only supports macOS, and every ios_* tool refuses in one clear sentence instead of failing with spawn xcrun ENOENT.
  • ios-dev skill and the /ios-dev [goal] command: the command runs the environment diagnostic and prints the verdict and the fixes (DSH user commands deliberately create no model message).
  • Structure: the patch layer declared by dsh.bundle.patch mounts exactly one host row; settings namespace = patch row id = ios-simulator-helper.

Differences from the original

  • ios_shutdown_simulator is new; ios_build_and_run resolves the bundle id in four steps (explicit argument → CFBundleIdentifier of the .app just built → -showBuildSettings with the same -derivedDataPath → identifiers found in project.pbxproj) and reports bundleIdSource, fixing the original's silent "the build succeeded but the bundle id could not be resolved".
  • Screenshot, build-log and DerivedData locations are configurable on the settings page; the default root is $DSH_HOME/ios-simulator-helper.
  • The original's userConfig and IOS_SIM_* environment variables still work as fallbacks, so an existing ZCode or CI setup needs no change.

Install

Published on npm:

dsh plugin --profile <profile> add @zhz8888/dsh-ios-simulator-helper

DSH Desktop: add the same package name on the Plugins page. package.json declares dsh.bundle.patch, so DSH's reconcile step appends this package to dsh.profile.bundles, merges the patch at boot, and mounts exactly one host row.

Verification

  • pnpm check: 86 tests pass, together with check-bundle (bundle id = package name, namespace, both field tables, the three routes, the macOS gate) and verify-mount (21 tools registered on a real Cordis Context and the real ToolRuntime).
  • The four screenshots in assets/ are the live settings page after a real install, not mockups.
  • No runtime dependencies; @deepseek-ai/cordis, @deepseek-ai/dsh-tools and @deepseek-ai/schemastery are peer dependencies.

Release artifact