Pular para o conteúdo principal
D

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-hmos

README

DwGuard-Dsh-Hmos

CI License: MIT npm

DSH 侧的鸿蒙双 Agent 编排与外部审计插件。 它把「DSH 编排 + DevEco Code 执行」的协作方式,从一份提示词文档变成一组有闸门的工程动作:任务包冻结、派发前对抗预审、Goal 模式派发、四维外部审计、返工单、验收报告、知识沉淀。

核心主张只有一句:交付物必须自己证明自己,DSH 不采信执行者的自述结论。

English: README.en.md · 变更记录:CHANGELOG.md


为什么需要它

让一个 Agent 自己写、自己测、自己说"完成了",等于没有验收。这个插件把 DSH 的职责钉死在三件事上:

  1. 先把"做完"定义清楚:功能 / 审美 / 性能 / 无障碍四维判据,每条都必须可证伪、有独立验证方式。写不出来就不许派发。
  2. 派发前先自我攻击:从性能、生命周期、并发、API 兼容四个视角质询任务包,阻断项必须经历一次反驳尝试。
  3. 交付后自己取证:截图、布局树、日志、测量值,一条判据一段证据。四维没覆盖、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)
命令行 profiledsh 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 headlessweb / tui / …dsh plugin --profile <name> add …

桌面版:应用内安装

  1. 左侧栏打开 插件 → 右上 添加插件;
  2. 包名填 dwguard-dsh-hmos(固定版本就填 dwguard-dsh-hmos@0.6.6)→ 安装、选配置层、确认;
  3. 装完按提示重启应用(托盘里也要退出)。

同一个对话框里的 安装第三方插件 也接受 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:

  1. 点图标:拦截侧栏行的点击(stopPropagation),直接 openTab,主区域完全不动;
  2. 点行/文字:行会先选中本插件在主区域的启动器面板——启动器在 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 个子代理并行取证        │  │
 │  ●功能  ●审美  ●性能  ●无障碍              │  │
 │  ● 审计闸门 ✓/✗ ──────────────────────────┘  │
 │  ● 知识沉淀 ④ → ○ 报告 → ○ 确认               │
 └──────────────────────────────────────────────┴──┘
   左栏:任务包层回退        右栏:实现层回退(返工)

审计中:两个维度已回、两个还在跑(640px) 还没有任务包时的灰态全景(640px) 返工中的竖向流程图(640px) 窄栏下的 2×2 审计扇出(400px)

阶段映射(由 .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)

审美判据不再每轮重新争论:

  1. dwguard_aesthetic 的 learn 从用户确认/驳回、审计发现、校准漏检与项目 resources/base/element/color.json / float.json 里确定性抽取偏好(间距/圆角/字号/配色/动效/深色/图标/卡片),默认只返回提议与冲突,不写档案;
  2. 用户裁决后带 apply: true + confirmed: true(多领域冲突用 choices 逐个指定,单 choice 有歧义会被拒绝)写入 knowledge/aesthetic-profile.md,历史追加到 aesthetic-history.jsonl,旧值标 superseded 而不删除;
  3. dwguard_spec 的审美判据可带 profileRef: "AES-RADIUS-01";dwguard_audit 校验引用存在且 active,并在审计/验收报告里渲染「审美档案」列;
  4. 通过审计 + 用户确认后可用 baseline save 存视觉基线;下一轮用 compare 做数值回归(间距/圆角 ±2vp,字号/颜色 0 容差),差异自动进验收报告的「审美基线差异」小节。

设计参考库(0.6.2–0.6.5)

dwguard_design 把「参考什么」变成可检索、可追溯、两个 Agent 都能读的资产:

  1. 建库:library init 写 .shared/design-library/(manifest / chunks / index)并生成零依赖只读 query.mjs;
  2. 摄取:library ingest 从审美规则目录播种卡片,也可以吃 inbox/<name>.meta.json(title / tags / tokens / stylePriority / antiPatterns / checklist / dimensions / brand / source / license;图片会按 sha256 复制进 refs/);
  3. 检索:确定性 BM25(中文 bigram + 同义词表)+ token/tag 精确加权 + 审美档案领域加成;可用 appType / platform / style / kind 过滤(默认只返回 pattern);hybrid 先做 语义召回(全卡向量 top-30)再与 BM25 候选并集融合,零字面重合也能命中;search 支持 image(pHash + 颜色直方图)与 imageText(多模态文本→图);
  4. 简报与问答:brief 按任务包生成 tasks/design-brief.md 并写 inspiration 回执;品牌卡(source.kind: brand)强制注入「品牌与业务约束」小节;DevEco 可写 design-request 请求补充,DSH 用 brief request: "q-1" 应答;dwguard_dispatch 会自动生成并引用简报;
  5. 闸门与报告:审美判据/检查可带 designRefs(DSG-*)与 antiPatternRefs(AP-*);引用 DSG 卡时卡上的 antiPatterns 自动进入审计清单(0.6.5,报告标「继承 DSG-xxxx」);spec 写入时校验存在且 active,审计闸门拒绝缺失/blocked 引用,报告输出「参考对照」「反模式对照」列;
  6. 返工检索桥(0.6.3 F):审计失败时按未通过的审美判据写 rework-suggestions.json,返工单给出建议检索词与参考;下一轮 brief 自动带入「上一轮返工定向参考」,审计通过后清空;
  7. 预算(0.6.3 C):maxAuditRounds / maxDesignSearches 本轮上限,dwguard_status 显示「本轮预算」,用尽即硬停;
  8. 反馈与捕获:feedback(useful / off / block / unblock)调整权重或隐藏卡片;通过审计 + 用户确认后 capture 把视觉基线存成 project 卡,下一轮可直接命中;
  9. 以图搜图(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,坏图/越界路径直接拒绝;
  10. 跨项目模板(0.6.4):dwguard_aesthetic template export/import 把 active 审美档案存到全局目录(默认 ~/.dsh/dwguard/aesthetic-templates);import 必须 confirmed: true,merge 会 supersede 本地冲突;
  11. 多模态 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、文本→图明确报错;
  12. 卡片包(0.6.5):pack export/import 把整个库的 active 卡片(含图片)打包到全局 designPacksDir;import 需 confirmed: true,自动重映射 id、按语义去重并重建索引;
  13. 两个读者: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-playbookhdc 截图/布局树/日志/性能采集命令、四维审计流程、假通过清单、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,它生成一份自足的简报:

  1. DSH 调 dwguard_dispatch,返回的 detail 就是简报全文(同时写到 tasks/goal-brief.md)。
  2. 你把它粘进 DevEco Code 的 Goal 模式。
  3. DevEco 按简报里的「交付记录格式」把结果追加到 outbox-deveco.md。
  4. 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。

验证顺序(与本次交付一致):

  1. npm run build 零错误;
  2. 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 优先路由、证据复用、后台任务、卡住看门狗、发布脚本与版本一致性、注册);
  3. dsh --profile web --dump-config 出现 # == dwguard-dsh-hmos;
  4. 另起一个实例 dsh --profile web --no-open --port 0 真实加载,无 dwguard 相关失败;
  5. 重启 GUI 后在会话里调 dwguard_status 验证。

许可

MIT

Plugins relacionados