Repository navigation
Releases
v0.29.0
0.29.0 — 2026-11-12
能问「这台设备上装了没有、什么版本」。 harmony 的 app 动作多了 op=query:不用先 build 也不用猜包名,直接读设备上的 bm dump,回答「已安装 / 未安装 + 版本号 + 分发类型 + 更新时间」。
解决的是「我以为装上了」这类问题:run 成功、start 成功,但设备上那份可能是三天前的包;多台设备时更明显——一台装了新版、另一台还是旧版。op=query 用 device=all 可以一次问遍。
它是只读的,plan 模式下也能用(start/stop/clear/uninstall 仍然只在 build 模式下允许)。
安装:plugin_manager install_bundle <仓库目录>,重启 Harness 后新会话选 HarmonyOS 预设。
v0.28.0
0.28.0 — 2026-11-12
快照能起名、能导出、能删了。 以前快照只有「10:31:02」这种时间戳,存满 6 条就自动挤掉最旧的,也没法拿给别人看。现在展开对比面板就能看到快照列表,每行可以改名(回车保存)、导出成 .log 文件、以及单独删除。
- 名字会跟着快照存进浏览器本地存储,刷新面板、重启 Harness 都还在;旧快照没有名字,继续按时间显示,不会因为升级而丢。
- 导出的文件名用「名字 + 设备」,没起名就用时间——发给别人时至少能看出是哪台机器。
- 删除是单条删除,不再只有「全部清除」;对比里选中的那一份被删掉时,下拉会自动清空而不是指向不存在的 id。
安装:plugin_manager install_bundle <本仓库目录>(或 dsh plugin add 指向本地目录),重启 Harness 后新会话选 HarmonyOS 预设。
v0.27.0
0.27.0 — 2026-11-12
ui op=assert:把「界面应该长这样」写成一次调用。 之前判断界面到没到,只能 dump 完自己读,或用 wait 等某个字出现;改一个控件就可能悄悄坏掉。现在断言三件事:文字在不在、有几个、还是不是同一个界面(op=dump 会给一个 16 位指纹,assert fingerprint= 拿它对)。
- 三种期望分开报:
absent说「不该出现」,count说「恰好 N 个」,fingerprint说「还是那一屏」;没有期望值直接算失败——空断言不是通过。 - 指纹按节点集合排序后取哈希,所以同一屏重抓一次仍然一致,不受遍历顺序影响。
assert只读界面,plan 模式下可用;dump也会带data.fingerprint,方便先取一次再固定下来。
安装:plugin_manager install_bundle <本仓库目录>(或 dsh plugin add 指向本地目录),重启 Harness 后新会话选 HarmonyOS 预设。
v0.26.0
0.26.0 — 2026-11-12
doctor 能修了,但只修它当场验得出来的三类问题。 加上 fix: true 后,诊断会顺手处理:残留的构建锁(持有进程已退出,或持有超过 30 分钟)、缺失的 pnpm wrapper(从真实 ~/.hvigor 补种)、以及 shared 模块缺 signed HSP(跑一次 assembleHsp)。
- 只修「验得出坏」的东西:锁被活进程持有时明确写「未动」并标
!,不猜、不强删。 - 修了什么会单独列在 summary 的「已修:」段,并进
data.repairs;fix默认false,不加就是只读报告。 - 修完重新计算 ✓ / ! / ✗,所以「修好了」和「本来就没问题」不会混在一起。
安装:plugin_manager install_bundle <本仓库目录>(或 dsh plugin add 指向本地目录),重启 Harness 后新会话选 HarmonyOS 预设。
v0.25.0
0.25.0 — 2026-11-12
失败时直接给下一步。 run 以前会告诉你「安装阶段失败,exit=1」,下一步靠推。现在按第一处真实错误归类,末尾多一行「接下来:编译错误 —— 按文件与行号改完,用 compile 复查」。
- 六类可判:编译(给
文件:行)、签名(指向action=sign)、缺 HSP(hsp: true)、无设备、启动失败、运行崩溃(指向action=crash);判不出来就说判不出来,并建议先跑doctor。 - 规则按「能最快动手」排序:编译错误优先于签名与安装,因为后面的步骤没跑在真实代码上。
- 归类结果同时进
data.attribution,脚本调用方不必读 summary 文本。
安装:plugin_manager 装本目录,重启 Harness 后新会话选 HarmonyOS 预设。
v0.24.0
0.24.0 — 2026-11-12
同一个工程不会同时跑两个构建。 之前 build 和 run 一起发出去,两个 hvigor 会同时写 .hvigor,产物一半是这次的一半是上次的,错误要到装机时才以「dependent module does not exist」出现。
- 构建前在
<工程>/.hvigor/dsh-harmony.build.lock上抢锁,第二个构建直接返回「已有一个构建在进行(进程 N,已持有 M 秒)」,不再白跑五分钟。 - 锁里记 pid 与起始时间:进程已退出、或持有超过 30 分钟,视为残留并自动接管;退出时在
finally里释放,异常路径也不留锁。 - 只覆盖本工具自己的构建;DevEco Studio 的构建仍按 EBUSY 处理——自动重试一次,并提示关掉 DevEco 里的构建。
安装:plugin_manager 装本目录(或 dsh plugin add),重启 Harness 后新会话选 HarmonyOS 预设。
v0.23.0
0.23.0 — 2026-11-12
点完按钮之后,等页面到位再继续。 以前流程是「tap → 下一轮再 dump 看有没有变化」,一次交互多花一到两轮;现在 ui op=wait 直接等:
op=wait text=首页:每 0.4 秒看一次 UI 树,直到文字出现;absent: true则等它消失(验证弹窗关了、加载页过了)。- 超时默认 10 秒,可用
timeoutMs改;报告实际等了多久、探测了几次、当前有多少可见节点,超时不会含糊地说「大概没等到」。 - 等待循环抽成
lib/wait.js的waitUntil,时钟与 sleep 可注入,单测不真的睡眠。 - plan 模式下
dump/find/wait都只读,不再一律拦截。
安装:plugin_manager 装本目录,或 dsh plugin add;重启 Harness 后新会话选 HarmonyOS 预设。
v0.22.0
0.22.0 — 2026-11-12
签名问题在构建之前回答。 签名不对时,你要等 90 秒编译、再等安装失败,才看到 9568289;现在 action=sign 直接告诉你用哪份配置、三个材料文件在不在、证书什么时候过期。
- 读
build-profile.json5的signingConfigs,逐项核对 cert / p7b / p12 是否存在,并检查products引用的名字是否真的有对应配置。 - 证书用 Node 自带的
X509Certificate解析(不依赖 keytool 的本地化输出):主体、签发者、到期时间、剩余天数,过期和「还没生效」分开报。 - 认出 DevEco 本地加密的密码串,直说「只有 DevEco 自己能解密」,避免误以为是明文密码。
安装:plugin_manager 装本目录,或 dsh plugin add;重启 Harness 后新会话选 HarmonyOS 预设。
v0.21.1
0.21.1 — 2026-11-12
设备徽标会告诉你「下一条命令会落在哪台」,并且可以点一下改。 之前列表第一台标「默认」,但那只是「没写 device 时的第一台」,和工具实际选的设备(记住上次成功的那台)不是一回事。
- 标「上次使用」的是工具真的会选的那台;点其它任意一行即可把它设为默认(Host 侧写入,只接受当前在线的 id,避免记住一台已拔掉的设备)。
- 徽标关闭时的轮询从 20 秒放宽到 60 秒:一分钟一次足够发现设备来去,也让空闲页面几乎不产生请求。
安装:dsh plugin add(或 plugin_manager 装本目录),重启 Harness 后新会话选 HarmonyOS 预设。
v0.21.0
0.21.0 — 2026-11-12
doctor 现在保证会回来。 之前每一项探测都排着队等,一个卡住的 hdc 就能把整个体检拖上几分钟——而体检恰恰是「感觉不对」时才跑的,最不该卡。现在每项外部探测单独限时 2 秒、整轮共享 8 秒预算,结果分五态:✓ 正常、! 需要注意、✗ 不可用、⏱ 超时没返回、… 预算用完没来得及跑。
「超时」和「没来得及开始」是两件事:前者说明那条命令本身有问题(多半是设备/驱动),后者说明前面的项吃掉了时间,处置完全不同。输出末尾会写这一轮实际花了多久。
安装:在 DSH 里 plugin_manager 装本目录(或 dsh plugin add),重启 Harness 后新会话选 HarmonyOS 预设。