- Início
- Plugins
- Fluxos e automação
- dwguard-dsh-hmos
dwguard-dsh-hmos
dogwind221/dwguard-dsh-hmos
HarmonyOS delivery orchestration for DSH: freezes a four-dimension acceptance pack whose measurable criteria carry machine-checkable assertions, runs an adversarial pre-review before dispatch, hands the work to DevEco Code in Goal mode, then audits the delivery with independently gathered evidence (screenshots, UI tree, logs, hashed evidence bundle), recomputing assertion verdicts against measured values and filing rework orders; includes a cited rule catalog, a user-confirmation state and a gate calibration ledger.
Instalar
dsh plugin --profile web add github:dogwind221/dwguard-dsh-hmosREADME
DwGuard-Dsh-Hmos
DSH 侧的鸿蒙双 Agent 编排与外部审计插件。 它把「DSH 编排 + DevEco Code 执行」的协作方式,从一份提示词文档变成一组有闸门的工程动作:任务包冻结、派发前对抗预审、Goal 模式派发、四维外部审计、返工单、验收报告、知识沉淀。
核心主张只有一句:交付物必须自己证明自己,DSH 不采信执行者的自述结论。
English: README.en.md · 变更记录:CHANGELOG.md
为什么需要它
让一个 Agent 自己写、自己测、自己说"完成了",等于没有验收。这个插件把 DSH 的职责钉死在三件事上:
- 先把"做完"定义清楚:功能 / 审美 / 性能 / 无障碍四维判据,每条都必须可证伪、有独立验证方式。写不出来就不许派发。
- 派发前先自我攻击:从性能、生命周期、并发、API 兼容四个视角质询任务包,阻断项必须经历一次反驳尝试。
- 交付后自己取证:截图、布局树、日志、测量值,一条判据一段证据。四维没覆盖、must 判据没证据,闸门就不开。
架构
flowchart TD
U["用户需求"] --> S["dwguard_spec<br/>冻结任务包(四维判据)"]
S --> P["dwguard_prereview<br/>对抗预审(四视角 + 反驳)"]
P -- 阻断项未清 --> S
P -- 通过 --> D["dwguard_dispatch<br/>生成 Goal 简报"]
D --> E["DevEco 执行闭环<br/>理解任务包 → 编码 → 构建 → 推设备 → 自验"]
E --> C{"自评 / 澄清<br/>双方无异议?"}
C -- "实现层分歧" --> E
C -- "任务包层分歧" --> S
C -- 无异议 --> A["dwguard_audit<br/>独立取证(截图/布局树/日志/数值)"]
SH["增量② 影子审查<br/>只读中间代码与产物"] -. 结构性风险 .-> C
A -- 未通过 --> R["tasks/rework-n.md<br/>返工单"] --> E
A -- 通过 --> ACC["artifacts/acceptance-report.md<br/>验收报告"]
ACC --> K["dwguard_knowledge<br/>沉淀经验"]
K --> U
Q["dwguard_status<br/>阶段 / 未读交付 / 下一步"] -.-> S
Q -.-> A
两个回环,不要混:
- 实现层(Spec 没问题,是实现偏差)→ 回「编码实现」,出返工单/返工项;
- 任务包层(Spec 歧义、判据不可达、架构方向错)→ 停线 → 改任务包、升版本 → 重跑预审 → 重新派发,执行者回到「理解任务包」;
- 影子审查(增量②)的结论先落到「自评 / 澄清」这个闸门:双方无异议才交付,有分歧先澄清再决定回哪一层。
与原始框架文档的四个增量一一对应:
| 文档中的增量 | 本插件里的落点 |
|---|---|
| ① 派发前架构预审 | dwguard_prereview(阻断项需 rebuttal,未关闭不得派发) |
| ② 并行影子审查者 | 编码期只读巡检 → 风险分层:任务包层停线改包重预审(回「理解任务包」),实现层记返工项(回「编码实现」);dwguard_status 汇总 |
| ③ 外部审计(不采信自验) | dwguard_audit(逐条 checks + 独立证据 + 四维覆盖闸门;四维各派一个子代理并行取证) |
| ④ 知识沉淀 | dwguard_knowledge(按主题归档,索引去重) |
安装
要求:DSH 0.2.1-rc.x(engines.dsh: >=0.2.1-rc.0 <0.3.0)。插件以 bundle 形式安装,注册一个 host 行。
已发布到 npm:dwguard-dsh-hmos(当前 0.6.6)。
从 npm 拉取(推荐)
注意:安装插件不是
npm install。npm install只会把包放进node_modules,不会注册到 DSH 的 profile;正确入口是 DSH 的插件安装器,由它从 npm 拉取并注册。
| 入口 | 命令 / 操作 |
|---|---|
| 桌面版 | 侧栏 插件 → 添加插件,包名填 dwguard-dsh-hmos(固定版本 dwguard-dsh-hmos@0.6.6) |
| 命令行 profile | dsh plugin --profile web add dwguard-dsh-hmos@0.6.6 |
没有 dsh 命令 | npx @deepseek-ai/dsh@0.2.1-rc.5 plugin --profile web add dwguard-dsh-hmos@0.6.6 |
安装器会从 npm registry 解析版本;想跟最新版就省略 @0.6.6。下文分别说明桌面版与 CLI profile 的细节。
先确认你跑的是哪种入口——desktop profile 由桌面应用独占管理,命令行改不了它(dsh plugin --profile desktop … 会被明确拒绝),所以两种入口的安装方式不同:
| 启动方式 | profile | 安装入口 |
|---|---|---|
桌面应用(DeepSeek Harness.exe,默认场景) | desktop | 侧栏 插件 → 添加插件(应用内) |
命令行 dsh web / dsh tui / dsh headless | web / tui / … | dsh plugin --profile <name> add … |
桌面版:应用内安装
- 左侧栏打开 插件 → 右上 添加插件;
- 包名填
dwguard-dsh-hmos(固定版本就填dwguard-dsh-hmos@0.6.6)→ 安装、选配置层、确认; - 装完按提示重启应用(托盘里也要退出)。
同一个对话框里的 安装第三方插件 也接受 Git 仓库地址和本地目录,所以「GitHub 直装 / 本地 checkout」在桌面版也走这里。
命令行 profile:CLI 安装
# 需要在 PATH 上有 pnpm —— dsh plugin 会把参数转发给 pnpm
dsh plugin --profile web add dwguard-dsh-hmos
# 固定版本
dsh plugin --profile web add dwguard-dsh-hmos@0.6.6
# 机器上没有 dsh 命令时,用 npm 上的 CLI 包
npx @deepseek-ai/dsh@0.2.1-rc.5 plugin --profile web add dwguard-dsh-hmos
也可以从 GitHub 或本地目录装(同样只适用于命令行 profile):
# 在仓库根目录执行;把 . 换成绝对路径也可以
dsh plugin --profile web add .
dsh plugin --profile web add https://github.com/Dogwind221/dwguard-dsh-hmos
确认装好了
- 桌面版:插件 页出现
DwGuard-Dsh-Hmos; - 命令行:
dsh --profile web --dump-config里能看到# == dwguard-dsh-hmos。
装好后,新开的会话都会拿到 15 个工具、3 个 skill 和一段策略提示词。让 DSH「给鸿蒙做个 XX 页面」,它会自动加载 dwguard-hmos skill。已经打开的旧会话如果没热加载到新工具,新开一个会话即可(工具表在会话开始时就固定了)。
可选:独立的 Agent 预设
Bundle 已经全局注册,预设只是让新会话选择器里多一个「DwGuard 鸿蒙双代理」入口(工具集偏向编排与取证,不含实现类工具):
# 方式一:作为叠加层启动一次(命令行 profile;桌面版用方式二;在仓库根目录执行)
dsh --profile web --patch "preset/dwguard-hmos.cordis.yml"
# 方式二:把 preset/dwguard-hmos.cordis.yml 里 - insert: 的整段粘贴进
# %USERPROFILE%\.dsh\profiles\<desktop 或 web>\cordis.patch.yml,然后重启
预设依赖部署里有 @deepseek-ai/dsh-agent-preset(Web 版自带)。不想用就不装,工具照常可用。
卸载
- 桌面版:插件 → 已安装插件 →
DwGuard-Dsh-Hmos→ 移除; - 命令行 profile:
dsh plugin --profile web remove dwguard-dsh-hmos(tui等换成对应 profile 名)。
界面入口:DshHoms(右侧栏看板)
侧边栏新增一行 DshHoms,位置在 插件(order 0)与 自动化任务(order 10)之间(本插件 order 5)。
点它不会顶掉对话:看板以标签页形式开在 右侧栏(tab 标题 DshHoms),主区域保持当前会话。左侧再点一次会复用已打开的标签,不会重复开。
点击路径有两条,因为右侧栏的 openTab 依赖「对话占据主列」时的会话 surface:
- 点图标:拦截侧栏行的点击(
stopPropagation),直接openTab,主区域完全不动; - 点行/文字:行会先选中本插件在主区域的启动器面板——启动器在
useLayoutEffect里立刻selectPanel(null)交还会话,再以 30ms 起、60ms 间隔重试openTab(最多 ~1.5s),surface 挂载后打开。
因此不会出现「右侧栏打不开 / no session surface is mounted」——除非当前根本没有打开会话。
看板是一张暗色竖向流程图,最大宽度 640px、按右侧栏宽度自适应(ResizeObserver 实测,卡片随栏宽伸缩并保持居中,两侧留出画回退线的空间),从上到下 规划 → 执行 → 验收;同一层的并行模块也画在视图里:
- 打开就有图:还没有任务包时,整张图以灰态展示、第一张卡待命——先让人看见流程,再让流程亮起来;
- 亮起来:本轮开始后,当前模块的呼吸描边 + 卡片入场逐个浮起 + 该行一圈淡蓝光晕,顶部出现
进行中呼吸点; - 并行行:
编码实现 ②与影子审查 ②并排;进入时一条线分叉(fork),离开时两条线合流(merge),两个模块各自有状态; - 四维审计行:
功能 / 审美 / 性能 / 无障碍四张子代理卡并排(栏宽 ≥560 时一行四列,更窄时 2×2);每张卡显示自己的通过/总数,子代理回来一个就落绿一个,没回来的继续转圈——状态来自artifacts/audit-progress.json,不是"同时开始同时结束"的假动画; - 进行中:卡片左侧转圈 + 呼吸描边;指向下一个模块的连线有流动虚线;
- 返工:闸门卡琥珀色,右栏回退线高亮并流动;
- 左栏(蓝/紫虚线,任务包层):预审不通过 → 生成任务包;澄清 Spec 有误 → 生成任务包;影子审查的结构性风险 → 理解任务包;
- 右栏(琥珀虚线,实现层):自评有分歧 → 编码实现;审计返工 → 编码实现;
- 历史时间线:图下方按时间倒序列出预审 / 派发 / 审计 / 返工 / 影子审查 / 用户确认,一眼看到这一轮怎么走到现在的;
- 语言与无障碍:刷新左侧有
中 / EN切换(localStorage 记忆,阶段 / 下一步 / 历史一起切);可跟随宿主语言;阶段变化用role="status"播报;系统开启「减少动态效果」时关闭转圈/光晕/流动动画。
执行段里有一张 自评 · 澄清 / 反馈 卡:DevEco 说「自认为达标」只是声明,不是交付。闸门只放三种结果:
| 情况 | 走向 |
|---|---|
双方无异议(影子风险已改、question.md 已答、结构没跑偏) | 交付 → 外部审计 |
| 实现层分歧(代码写法/性能/生命周期不合规) | 回「编码实现」(右栏琥珀回退线) |
| 任务包层分歧(Spec 歧义、判据不可达、方向错) | 回「生成任务包」→ 升版本 → 重跑预审 → 重新派发(执行者重新「理解任务包」) |
┌ 规划 ──────────────────────────────────────────────
│ ● 需求澄清
│ ● 生成任务包 ◄───────────┐◄─────────────┐ 判据 6 · must 5
│ ● 派发前预审 ① │ │
│ ● 派发给 DevEco │ │
├ 执行 ─────────────────────┼──────────────┼───────
│ ● 理解任务包 ◄────────────┼──────────────┼──┐
│ ┌──────────┐ ┌─────────┐ │ │ │
│ │◉ 编码实现②│ │┄影子审查②│ │ │ │ ← 同行并行
│ └────┬─────┘ └────┬────┘ │ │ │
│ └─────┬──────┘ │ │ │
│ ● 自评 · 澄清 / 反馈 ─────┘ │ │
│ ● 交付结果 │ │
├ 验收 ────────────────────────────────────┼──┼───
│ 四维外部审计 ③ · 4 个子代理并行取证 │ │
│ ●功能 ●审美 ●性能 ●无障碍 │ │
│ ● 审计闸门 ✓/✗ ──────────────────────────┘ │
│ ● 知识沉淀 ④ → ○ 报告 → ○ 确认 │
└──────────────────────────────────────────────┴──┘
左栏:任务包层回退 右栏:实现层回退(返工)

阶段映射(由 .shared/ 产物推导,不靠口头声明):
| 阶段 | 进行中的节点 |
|---|---|
intake | 需求澄清 |
spec / spec-invalid | 生成任务包 |
prereview | 派发前预审 |
ready | 派发给 DevEco |
dispatched(无未读) | 编码实现 + 影子审查(同一行并行,两个 spinner) |
dispatched(有未读交付) | 四张审计卡同时 active(4 个子代理并行取证) |
rework | 编码实现 + 影子审查(闸门标琥珀,澄清/交付/审计保持已完成) |
accepted | 知识沉淀(等待 dwguard_confirm) |
confirmed | 整张图全绿、无 spinner(本轮已由用户确认) |
数据来自插件注册的只读接口 GET /dwguard/board(同源、无写入、cache-control: no-store)。工作区列表来自工具调用时记录的 ~/.dsh/dwguard/workspaces.json——先跑一次任意 DwGuard 工具,看板才有工作区可选。
右侧栏是按会话的:没有打开的会话时,入口会提示「右侧栏打不开」,打开会话后再点即可。
| 组件 | 文件 |
|---|---|
| 侧边栏入口 + 右侧栏标签(浏览器模块,无构建步骤) | lib/client.js |
| 看板接口 | src/web.ts |
| 看板投影 | src/board.ts |
| 工作区记录 | src/workspaces.ts |
入口与右侧栏标签在应用启动时装配:改完需要完全退出 DSH 再打开(托盘里也要退出)。若面板提示「看板接口不可用」,工具、Skill 与闸门仍然照常工作——只是实时看板读不到。
十五个工具
| 工具 | 阶段 | 作用 | 关键闸门 |
|---|---|---|---|
dwguard_spec | 立项 → 任务包 | 写入 / 复检 / 查看任务包,首次调用会脚手架 .shared/ | 四维至少各 1 条;拒绝纯形容词、缺验证方式、依赖自述的判据;ruleId 必须在规则目录内;至少 1 条 must;判据可带 assertion(matcher + 期望值),非法断言写入前直接拒绝 |
dwguard_prereview | 派发前预审 | 记录对抗审查发现 | 阻断项必须有 rebuttal;未关闭的阻断项不许派发;零发现必须写审阅范围 |
dwguard_dispatch | 派发 | 生成 tasks/goal-brief.md 并写 outbox-dsh.md;executor: cli 时另写 tasks/cli-brief.md | 任务包合法 + 最近一次预审通过(可配置关闭) |
dwguard_deveco | 执行期 / 取证 | 调 DevEco CLI 取证:env / build / run / log / lint / device / uiHelp / ui / screenshot / layout / a11y / verify / attach / jobs / stop,命令、退出码与输出落到 artifacts/deveco-<n>/;截图落 artifacts/devshots/,布局树落 layout.json;缺省设备取设备池直板机,设备动作经 .shared/.device-lock.json 串行 | 只跑固定子命令;超时/找不到 devecocli 明确失败;ui 参数按白名单校验;自动探测 npm 全局安装的 devecocli |
dwguard_scan | 取证前 | 独立 ArkTS/ArkUI 静态扫描(只读):嵌套属性赋值、any、@ohos.*、V1/V2 混用、伪包、ForEach、定时器、无障碍文本 | 每条命中带规则 ID 与 file:line;写 artifacts/scan-<n>.json;must 级要进审计 findings |
dwguard_shadow | 执行期 | 影子审查:增量扫描(只看上次之后改过的文件),自动尝试调用宿主的 harmony_ui_tree(失败则需手动传 uiTree),写 artifacts/shadow-<n>.json;只把新增的 must 级风险写 shadow-risk 出站 | 只在 dispatched / rework 阶段可跑;status 超过 shadowIntervalMinutes 会提醒;同一问题不会重复刷屏 |
dwguard_rules | 全程 | 查规则目录(list / get,支持别名)与本地官方语料(search,返回 file:line + 出处 URL) | 语料目录由 docsDir / DWG_DOCS_DIR 指定;get 未知 ID 直接报错 |
dwguard_audit_dimension | 审计取证 | 单个维度子代理返回后立刻记录(passed / failed / note) | 写 artifacts/audit-progress.json;面板据此让四张卡逐张落地,而不是同时亮 |
dwguard_audit | 外部审计 | 汇总逐条检查与发现,自动出返工单或验收报告 | must 全覆盖、四维全评估、无未关闭 blocker/major、失败项不许记成 unverified;带 assertion 的判据必须给 actual 实测值,闸门重算断言并拒绝矛盾结论;matrix 模式(主机内存 ≥32GB)下 checks 必须带 device+family,审美/无障碍缺屏族会被拒绝;profileRef 引用不存在/已 superseded 的审美档案 → error;证据文件缺失或超过 20MB/份、100MB/包整次拒绝;完成后清空进度文件;每次审计自动记账 |
dwguard_aesthetic | 审美学习(0.6.1–0.6.4) | profile、baseline、compare、learn、template(list/get/export/import 跨项目审美模板) | 写档案必须带 source + confidence,改已有领域的值需 confirmed: true;learn 默认只提议不落盘,apply 必须 confirmed: true;baseline save 必须有通过审计 + 用户确认;template import 必须 confirmed: true(merge 会 supersede 本地冲突) |
dwguard_design | 设计参考库(0.6.2–0.6.6) | library init/ingest/list、search(关键词 + 维度过滤 + image 以图搜图 + imageText 多模态文本→图)、brief、feedback、capture、pack list/export/import、stats | 默认 lexical 零网络;hybrid 支持 openai/dashscope provider,imageText 需多模态端点;DashScope 原生 qwen3-vl-embedding / tongyi-embedding-vision-flash 可同时给文本/图片出向量;失败显式回退/报错;query.mjs 始终 lexical;capture/pack import 必须 confirmed: true;检索/审计轮次受预算硬停 |
dwguard_calibration | 收尾 | 闸门准确率账本:report 算四维漏检率,miss 记录"审计通过但用户后来发现问题" | miss 必须针对已通过的审计;账本 knowledge/calibration.jsonl 只追加 |
dwguard_confirm | 收尾 | 记录用户对验收报告的决定:accept 结束本轮,new_round 迭代号 +1 | 必须有通过的审计与 acceptance-report;写 artifacts/confirmation-<n>.json 并更新 state |
dwguard_knowledge | 沉淀 | 追加到 knowledge/<topic>.md | 索引按 kind+结论去重 |
dwguard_status | 全程 | 从产物反推阶段、未读交付、下一步;显示主机内存、单机/矩阵模式、屏幕族缺口与当前设备锁 | 不改状态,只读 + 可选前移游标 |
每个工具都返回同一个信封:{ ok, summary, detail, files, next }。detail 是可直接展示的 Markdown;next 是唯一的下一步建议。
规则来源与"官方文档还没学什么"分开记录:docs/rule-sources.md(已引用出处)与 docs/learning-backlog.md(未覆盖清单 + 0.4 优先顺序)。0.4.0 范围与验收见 docs/0.4.0-plan.md。
审美学习(0.6.1)
审美判据不再每轮重新争论:
dwguard_aesthetic的learn从用户确认/驳回、审计发现、校准漏检与项目resources/base/element/color.json/float.json里确定性抽取偏好(间距/圆角/字号/配色/动效/深色/图标/卡片),默认只返回提议与冲突,不写档案;- 用户裁决后带
apply: true+confirmed: true(多领域冲突用choices逐个指定,单choice有歧义会被拒绝)写入knowledge/aesthetic-profile.md,历史追加到aesthetic-history.jsonl,旧值标superseded而不删除; dwguard_spec的审美判据可带profileRef: "AES-RADIUS-01";dwguard_audit校验引用存在且 active,并在审计/验收报告里渲染「审美档案」列;- 通过审计 + 用户确认后可用
baseline save存视觉基线;下一轮用compare做数值回归(间距/圆角 ±2vp,字号/颜色 0 容差),差异自动进验收报告的「审美基线差异」小节。
设计参考库(0.6.2–0.6.5)
dwguard_design 把「参考什么」变成可检索、可追溯、两个 Agent 都能读的资产:
- 建库:
library init写.shared/design-library/(manifest / chunks / index)并生成零依赖只读query.mjs; - 摄取:
library ingest从审美规则目录播种卡片,也可以吃inbox/<name>.meta.json(title / tags / tokens / stylePriority / antiPatterns / checklist / dimensions / brand / source / license;图片会按 sha256 复制进refs/); - 检索:确定性 BM25(中文 bigram + 同义词表)+ token/tag 精确加权 + 审美档案领域加成;可用
appType/platform/style/kind过滤(默认只返回 pattern);hybrid先做 语义召回(全卡向量 top-30)再与 BM25 候选并集融合,零字面重合也能命中;search支持image(pHash + 颜色直方图)与imageText(多模态文本→图); - 简报与问答:
brief按任务包生成tasks/design-brief.md并写inspiration回执;品牌卡(source.kind: brand)强制注入「品牌与业务约束」小节;DevEco 可写design-request请求补充,DSH 用brief request: "q-1"应答;dwguard_dispatch会自动生成并引用简报; - 闸门与报告:审美判据/检查可带
designRefs(DSG-*)与antiPatternRefs(AP-*);引用 DSG 卡时卡上的 antiPatterns 自动进入审计清单(0.6.5,报告标「继承 DSG-xxxx」);spec 写入时校验存在且 active,审计闸门拒绝缺失/blocked 引用,报告输出「参考对照」「反模式对照」列; - 返工检索桥(0.6.3 F):审计失败时按未通过的审美判据写
rework-suggestions.json,返工单给出建议检索词与参考;下一轮brief自动带入「上一轮返工定向参考」,审计通过后清空; - 预算(0.6.3 C):
maxAuditRounds/maxDesignSearches本轮上限,dwguard_status显示「本轮预算」,用尽即硬停; - 反馈与捕获:
feedback(useful / off / block / unblock)调整权重或隐藏卡片;通过审计 + 用户确认后capture把视觉基线存成project卡,下一轮可直接命中; - 以图搜图(0.6.4):
search image: "artifacts/query.png"在.shared/内取 PNG,零依赖解码后算 64-bit DCT pHash + 4×4×4 颜色直方图,按0.6×pHash + 0.4×直方图排序;卡片图片特征缓存在image-features.json,坏图/越界路径直接拒绝; - 跨项目模板(0.6.4):
dwguard_aesthetic template export/import把 active 审美档案存到全局目录(默认~/.dsh/dwguard/aesthetic-templates);import 必须confirmed: true,merge 会 supersede 本地冲突; - 多模态 embedding(0.6.5–0.6.6):
designClipProvider: "dashscope"时走 DashScope 原生multimodal-embedding端点,qwen3-vl-embedding/tongyi-embedding-vision-flash同一个模型同时给文本和图片出向量;search image把 pHash 与语义分融合(designClipWeight),search imageText: "红色海报"直接文本→图;向量缓存在clip-embeddings.json,失败时以图搜图回退 pHash、文本→图明确报错; - 卡片包(0.6.5):
pack export/import把整个库的 active 卡片(含图片)打包到全局designPacksDir;import 需confirmed: true,自动重映射 id、按语义去重并重建索引; - 两个读者:DSH 用
dwguard_design;DevEco 在 IDE 终端直接跑node .shared/design-library/query.mjs "深色 卡片 间距" --top 5 --json(支持--app-type/--platform/--style/--kind),词法排序与工具 parity;hybrid、以图搜图、多模态只在 DSH 侧(CLI 无端点/凭据),以简报/工具结果为准。
设计取舍与分阶段路线见 docs/0.6.2-plan.md、docs/0.6.3-plan.md、docs/0.6.4-plan.md、docs/0.6.5-plan.md 与 docs/0.6.6-plan.md。
三个 Skill
| Skill | 内容 |
|---|---|
dwguard-hmos | 七阶段编排协议、角色边界、10 条硬规则、反模式、第一轮启动顺序 |
hmos-acceptance-rubric | 四维判据写法 + 规则库 DW-FN/AES/PERF/A11Y + 阈值 + 好/坏示例 |
hmos-audit-playbook | hdc 截图/布局树/日志/性能采集命令、四维审计流程、假通过清单、6 个审计子代理提示词 |
Skill 正文在 skills/*.md,可以直接改;插件启动时按包内相对路径读取(读不到时回退到内置精简版,不影响加载)。
.shared/ 产物
首次 dwguard_spec 会创建:
.shared/
├─ README.md # 协议说明(所有权 / 记录格式 / 阶段)
├─ state.json # 计数器与未读游标
├─ outbox-dsh.md # DSH → DevEco Code
├─ outbox-deveco.md # DevEco Code → DSH(追加交付记录)
├─ tasks/
│ ├─ spec.md / spec.json # 冻结的任务包
│ ├─ goal-brief.md # 粘贴给 DevEco 的 Goal 简报
│ ├─ design-brief.md # 设计参考简报(0.6.2 P1;dispatch 自动引用)
│ ├─ rework-<n>.md # 返工单(审计未通过时)
│ └─ question.md # 执行者的提问(需求真模糊时)
├─ artifacts/
│ ├─ prereview-<n>.md|json # 预审记录
│ ├─ audit-<n>.md|json # 审计记录
│ ├─ audit-<n>/ # 证据包:manifest.json + evidence/(每份带 sha256)
│ ├─ scan-<n>.json # 独立静态扫描结果(规则 ID + file:line)
│ ├─ shadow-<n>.json # 影子审查记录(含可选 UI 树摘要)
│ ├─ confirmation-<n>.json # 用户确认记录(accept / new_round)
│ ├─ visual-baseline/<specVersion>/ # 视觉基线:bounds JSON + 截图(每份带 sha256)
│ ├─ aesthetic/compare-latest.json # 最近一次审美基线 diff(验收报告引用)
│ └─ acceptance-report.md # 验收报告(通过时)
├─ design-library/ # 0.6.2–0.6.4:设计参考库
│ ├─ manifest.json # 卡片(DSG-* / AP-*)+ chunks/index(确定性、可重建)
│ ├─ chunks.jsonl # 卡片分段文本 + sha256
│ ├─ index.json # BM25 postings/df(可随时由 chunks 重建)
│ ├─ query.mjs # 零依赖只读 CLI(DevEco 在 IDE 终端用;仅词法)
│ ├─ feedback.jsonl # useful/off/block/unblock 账本
│ ├─ rework-suggestions.json # 上次失败审美审计的建议检索队列(下一轮 brief 带入)
│ ├─ embeddings.json # hybrid 语义重排的向量缓存(按 model+sha256)
│ ├─ image-features.json # 以图搜图的 pHash/直方图缓存(按 sha256)
│ ├─ clip-embeddings.json # CLIP 图片/文本向量缓存(0.6.5)
│ ├─ refs/ # 参考图(sha256 命名)
│ └─ inbox/ # 用户投递:<name>.png + <name>.meta.json
└─ knowledge/
├─ index.json # 去重索引
├─ calibration.jsonl # 闸门账本:审计/确认/漏检(每行一条)
├─ aesthetic-profile.md # 审美档案(表格 + JSON 块)
├─ aesthetic-history.jsonl# 追加式:applied / superseded / conflict
└─ <topic>.md # 按主题沉淀
两个 outbox 都是只追加,每条记录以 ## [ISO 时间] <kind> · #<id> · from=… to=… · re=#<id> | 标题 开头
(kind = dispatch | ack | deliver | question | answer | blocked | shadow-risk | rework | inspiration | design-request),dwguard_status
用一个游标统计未读,并单独列出发出但没回执的 dispatch(没有 re=#d-N 的记录不算回执,v2 之前的老记录按 legacy 兼容)。
审计的 checks[].evidenceFiles 写相对 .shared/ 的路径;工具会校验文件存在(否则整次审计不落盘)、复制进 artifacts/audit-<n>/evidence/,并在 manifest.json 里记 sha256。报告里的"证据"从此可复核:同一份字节、可校验哈希。
规则 ID 是任务包、静态扫描、审计三处的共同语言:dwguard_spec 的判据可带 ruleId(DW-A11Y-02、STATE-NESTED-01、AGC-RJ-013 等,目录外一律拒绝),dwguard_scan 的命中与 dwguard_audit 的 findings 用同一套 ID。
DevEco Code 侧怎么配合
插件不驱动 DevEco Studio,它生成一份自足的简报:
- DSH 调
dwguard_dispatch,返回的detail就是简报全文(同时写到tasks/goal-brief.md)。 - 你把它粘进 DevEco Code 的 Goal 模式。
- DevEco 按简报里的「交付记录格式」把结果追加到
outbox-deveco.md。 - DSH 用
dwguard_status读交付,再自己取证审计。
简报里写死了角色、路径、逐条判据、约束、执行闭环、交付格式、提问协议与禁止事项——不需要在 DevEco 侧装任何东西。
混合执行模式(executor: auto,IDE 优先)
0.3 起可以换执行器,协议不变。默认 IDE 优先:
auto(默认):DevEco Code 先上;只有任务没有视觉 must 判据、且需求/规格/约束明确是批量、回归、CI、重构或脚本时,才让 CLI 介入;- 任务包可以钉死
executor: ide或cli(dwguard_spec的executor参数);显式配置仍然优先; - 进入 CLI 模式时,派发同时写
tasks/cli-brief.md,外部 CLI Agent 用devecocli build / run / run --apply / log实现与回归; - DSH 用
dwguard_deveco独立取构建/运行/日志/设备证据(落artifacts/deveco-<n>/);screenshot/layout/verify直接调真实devecocli ui与devecocli verify;attach可以把已有的构建日志登记为证据,不重复构建;background: true让长构建后台跑,jobs/stop管理,不阻塞对话; dwguard_status带 watchdog:派发后超过stallMinutes仍无回执/交付会直接标"卡住";waitSeconds可以长轮询等一次交付事件;- 截图与 UI 树仍由 DSH 自己在设备上取;
dwguard_deveco不替代审计。
视觉/设备取证仍归 DSH——执行者自述永远不会直接变成 pass。
配置
写在 cordis.patch.yml 里覆盖默认值(或用 --patch):
- id: dwguard-hmos
config:
sharedDir: .shared # 相对工作区,或绝对路径
promptSection: true # 注册团队策略提示词片段
installSkills: true # 注册三个 skill
minCriteriaPerDimension: 1 # 每个维度最少判据数
requireRebuttalOnBlocker: true # 阻断项必须记录反驳尝试
requirePrereviewBeforeDispatch: true # 没有通过的预审不许派发
knowledgeMaxEntriesPerTopic: 200 # 单主题知识条目提示阈值
docsDir: '' # 官方语料目录;空 = 自动探测(DWG_DOCS_DIR 等)
shadowIntervalMinutes: 10 # 影子审查多久没跑就在 status 里提醒
stallMinutes: 30 # 派发后多久无回执/交付算卡住
executor: auto # auto(IDE 优先)| ide | cli
devecocliPath: '' # devecocli 路径;空 = 自动探测(PATH / npm 全局)
hostMemoryGb: 0 # 0 = 自动探测;>0 = 手动覆盖(CI/容器)
deviceMode: auto # auto(按内存)| single | matrix
matrixMinMemoryGb: 32 # < 32GB 强制单机;>= 32GB 才允许矩阵
deviceMatrix: [phone, widefold, foldable, triplefold]
matrixScope: {} # 每维度需要的屏幕族;空 = 默认(功能/性能=直板机,审美/无障碍=全族)
allowMissingMatrixFamilies: false # true = 缺族降级为警告
devicePool: [] # { sn, family, apiLevel, kind: emulator|real }
maxConcurrency: 0 # 0 = 按主机内存自动(32GB→2,64GB→4)
deviceLockTimeoutMs: 600000 # 设备锁超过该时长视为过期并回收
designTopK: 5 # 设计库检索默认条数
designMaxChunks: 2000 # 块数上限(超出警告,不阻断)
designRanker: hybrid # lexical(默认)| hybrid(语义召回+融合,失败显式回退)
designEmbeddingProvider: dashscope # openai(兼容 /embeddings)| dashscope(原生 contents)
designEmbeddingEndpoint: "" # dashscope 下空 = 官方 multimodal-embedding 端点
designEmbeddingModel: qwen3-vl-embedding # 同一多模态模型给文本/图片出向量;备选 tongyi-embedding-vision-flash
designEmbeddingApiKeyEnv: DWG_DESIGN_EMBEDDING_KEY # 从该环境变量读 key
designEmbeddingTimeoutMs: 8000
designEmbeddingWeight: 0.35 # 语义分数权重(0–1)
designBriefCards: 5 # 每份 design-brief.md 的卡片数
designBrandCards: 3 # 强制注入的品牌卡上限(0 = 关闭)
maxAuditRounds: 5 # 本轮审计轮次硬上限
maxDesignSearches: 12 # 本轮设计检索次数硬上限
aestheticTemplatesDir: "" # 跨项目模板目录;空 = ~/.dsh/dwguard/aesthetic-templates
designPacksDir: "" # 卡片包目录;空 = ~/.dsh/dwguard/design-packs
designClipProvider: dashscope # custom(自有契约)| dashscope(原生 contents)
designClipEndpoint: "" # dashscope 下空 = 官方 multimodal-embedding 端点
designClipModel: qwen3-vl-embedding # 或 tongyi-embedding-vision-flash
designClipApiKeyEnv: DWG_DESIGN_CLIP_KEY
designClipTimeoutMs: 8000
designClipWeight: 0.5 # 以图搜图中的语义权重(0–1)
designLicenseRequired: true # true = license: unknown 的卡片不进检索结果
设备矩阵(0.6.0):hostMemoryGb 自动探测;< 32GB 只做单机验证(16GB 机器不会开矩阵,配置矩阵会得到警告);>= 32GB 才按华为屏幕族(直板机 / 阔折叠 / 双折叠 / 三折叠)跑矩阵。matrixScope 默认功能/性能只跑直板机、审美/无障碍跑全部四族;矩阵模式下 dwguard_audit 的每条 check 必须带 device + family,缺族会被闸门拒绝(allowMissingMatrixFamilies: true 可显式降级)。
覆盖是整段替换(DSH 的补丁语义),所以要把想保留的字段一起写上。
设计取舍与边界
- DSH 不写应用代码:插件只写
.shared/;改代码必须变成返工单或预审发现。这条写在策略提示词、skill 和工具描述三处,减少越界。 - 闸门是硬的:
must判据unverified、四维缺一维、开放 blocker/major,都会让dwguard_audit返回ok:false并生成返工单。没有"带病通过"的开关。 - 证据不可代填:
checks[].evidence只接受"怎么取的 + 取到了什么";像"自测通过/已确认"这类自述会被警告。 - 不做自动截图:设备型号、hdc 版本、API 版本差异太大,插件给出命令与取证清单(skill),由 DSH 在会话里执行,证据落盘。这样审计记录可复核。
- 不接管 DevEco:跨进程驱动另一个 IDE 的 Agent 不稳定,文件协议 + 人工粘贴是当前最可靠的边界。
- 状态从产物反推:
state.json只存计数器,阶段由 spec / prereview / audit 的存在与闸门结果推导,手改文件不会让状态失真。
与同类工具的对比
dsh-collaboration(多智能体套件)、dsh-deveco(harmony_ui_tree 结构化 UI 树)、
harmonyos-ai-workspace / harmonyos-skills(鸿蒙规则库)、hmharness(自进化运行时)
各自强在哪、我们差在哪、该借什么,见 docs/benchmark-integrations.md。
一句话:它们提供工具、规则或运行时,只有我们提供交付闸门;我们要补的是证据的客观性与规则库广度。
开发(源码构建与测试)
这里的
npm install只用于源码开发/测试,不是安装插件的方式;用户安装请看上方 安装。
lib/ 是随仓库提交的构建产物,使用插件不需要编译。只有改 src/ 时才需要重新构建并一起提交:
# 一次装齐编译与测试依赖(typescript、@types/node、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery)
npm install
# 编译(src → lib,strict TS)
npm run build
# 单元 + 集成测试(node:test;会自动先跑 scripts/preflight.mjs 检查宿主测试依赖)
npm test
src/dsh.d.ts 自带 DSH 模块声明,编译不依赖 DSH 的类型包;测试会调用真实的 defineTool,所以需要能解析 @deepseek-ai/dsh-tools 与 @deepseek-ai/schemastery——两者已列在 devDependencies,npm install 即可。想跳过 devDependencies 时也可以单独装:
npm install --no-save typescript @types/node @deepseek-ai/dsh-tools@0.2.1-rc.5 @deepseek-ai/schemastery@3.18.5
npm test 前的 preflight 在缺包时会直接给出上面这条命令,而不是抛一个 ERR_MODULE_NOT_FOUND。
注意:以 link 方式装进 profile 时,不要在包内保留
node_modules——否则包内会解析到另一份@deepseek-ai/dsh-tools,与宿主运行时混版本。测试完可以删掉。
CI 在 .github/workflows/ci.yml:ubuntu + windows、Node 22,依次跑 typecheck → build → test。
发版:npm run release:dry 预览版本号,npm run release -- --bump=minor 更新 package.json、重建 lib/ 并 npm pack;脚本不会自动 publish。打 tag 并推送即触发 CI 用 trusted publishing (OIDC) 自动发布到 npm(附 provenance,无需 NPM_TOKEN):git tag v0.6.6 && git push origin v0.6.6。版本记录见 CHANGELOG.md。
验证顺序(与本次交付一致):
npm run build零错误;npm test全绿(129 个用例:闸门规则、判据断言化(spec 校验 / 审计重算 / 矛盾拒绝)、设备策略(内存闸门 / 屏幕族矩阵 / 设备锁串行)、审美学习(AEST-A~K)、跨项目模板(export/merge/replace/confirmed)、设计参考库(RAG-A/B/C/E;P1 brief/design-request;P2 designRefs/antiPatternRefs 闸门与报告列;P3 feedback/capture;0.6.3 结构化过滤/品牌注入/预算/返工桥;0.6.4 AP 硬闸门、hybrid 重排与缓存、PNG pHash/直方图以图搜图;0.6.5 AP 自动继承、卡片包 export/import、CLIP 文本→图与多模态融合;0.6.6 DashScope 原生 embedding provider、语义召回并集与零字面重合召回)、spec 校验、完整工作流、逐维审计进度、证据包、静态扫描、规则目录、协议回执、影子审查与去重、UI 树自动抓取、用户确认、跨轮隔离、校准账本、看板历史、客户端装配、DevEco CLI 取证、设备取证动作、IDE 优先路由、证据复用、后台任务、卡住看门狗、发布脚本与版本一致性、注册);dsh --profile web --dump-config出现# == dwguard-dsh-hmos;- 另起一个实例
dsh --profile web --no-open --port 0真实加载,无dwguard相关失败; - 重启 GUI 后在会话里调
dwguard_status验证。
许可
MIT
Plugins relacionados
webnovel-writer
lingfengqaq/webnovel-writer
loopx (dsh-loopx-plugin)
loopx-project/loopx
ouroboros (dsh-plugin)
q00/ouroboros
loopx (dsh-loopx-plugin)
huangruiteng/loopx