xrxs-dsh-harmony-publish
DeepSeek Harness (DSH) 插件:把 harmony-agc-publish Codex skill 的鸿蒙发布流水线
(签名检查 → 版本校验 → devecocli 打包 → Bugly 符号表 → 上传 AGC → 提审)以安全、可审计的方式暴露给 DSH Agent。
- 目标 DSH 版本:
>=0.2.1-rc.5 <0.3.0(engines.dsh) - 平台:macOS(AGC 上传/提审仅限 darwin;构建依赖
devecocli) - 与
xrxs-dsh-android-publish同一套安全模型与工具形状,便于两个平台并行维护
流程与工具映射
| Skill 步骤 | 插件里的位置 |
|---|---|
| Step 1 签名检查/切换 | pre_check.py(只读判定)+ check_signing.py(构建前切换) |
| Step 2 版本号校验 | check_version.py(本地 vs AGC 在架版本) |
| Step 3 Release 打包 | build_and_submit.py 调 devecocli build --product <p> --build-mode release |
| Step 3.5 Bugly 符号表 | upload_bugly_symbol.py(Debug SO / nameCache.json / sourceMaps.json) |
| Step 4 上传 AGC | upload_app.py(OBS 预签名地址 + app-package-info 登记) |
| Step 5 提交审核 | submit_review.py(双重安全锁,写线上) |
三个发布模式(mode):
| mode | 行为 | 写入面 |
|---|---|---|
buildOnly |
签名检查 + 构建 + Bugly 符号表 | 仅本地 + Bugly |
upload |
上述 + 版本校验 + 上传 AGC 软件包 | + AGC 草稿态 |
submit |
上述 + app-submit 提审 |
+ AGC 线上审核流程 |
界面(DSH Web 客户端)
插件带一个客户端半身(dsh.client + lib/client.js),在桌面端/Web 端把 5 个工具渲染成发布卡片:
- 标题 + 状态徽标(运行中 / 通过 / 失败 / 已取消),一行摘要带产品与发布模式;
- 展开后是事实表、七步流程(预检 → 签名 → 版本号 → 构建 → Bugly 符号表 → 上传 AGC → 提交审核)、
警告与输出尾部;
status会按子进程返回的steps还原每一步的完成/失败/跳过状态。 - 卡片数据走
output.presentationMeta的结构化通道(客户端读block.meta),不解析模型可见文本; 旧会话里没有 meta 时回退展示原文本。 - 客户端包只依赖宿主提供的
react,不引用任何@deepseek-ai/dsh-client-*包。 - 升级宿主版本后需要重新
pnpm build,重新生成lib/client.js。
审批卡片仍由宿主 userQuestions 渲染(plan-review),插件只负责标题与正文。
安全模型
- 凭据零暴露:
AGC_CLIENT_ID/AGC_CLIENT_SECRET/BUGLY_APP_ID/BUGLY_APP_KEY只在每次操作时经 DSH 凭据库解析(credentialRefs→ ref 名),只注入子进程环境; 模型可见输出、任务缓冲、审计日志全部经精确子串脱敏。凭据值永不出现在 argv 中。 - 项目明文凭据隔离:插件驱动运行时始终设置
HARMONY_PUBLISH_DISABLE_PROJECT_ENV=1, 脚本侧load_agc_env()/load_bugly_env()遇该变量直接返回,项目里的.agc_env、.bugly_env不再被读取(独立 CLI 使用脚本时才允许)。 - 模型不能传任意旗标/凭据:环境键白名单(secret 形只能走
credentialRefs,其余走plainEnv);--skip-*、--i-know-this-submits-to-production、HARMONY_CONFIRM_SUBMIT=YES全部由 profile 策略与审批结果推导。 - 三道闸门:
allowSubmit: true+ 预检查通过 + 用户在审批卡片点选「确认提审」。任一缺失则什么都不启动。 - 默认拒绝:
allowSubmit默认false;allowedModes默认只有buildOnly+upload;requireManagedCredentialSource默认true(提审要求凭据来源为托管库file)。 - 签名切换 fail-closed:只在能精确定位目标 product 的
signingConfig时改写build-profile.json5,无法安全定位就报错交人工;storeFile(.p12)永不修改。 - 审计:
<runtimeDir>/audit.ndjson记录preflight/start/approval_denied/complete/failed/cancelled。
模型工具
| 工具 | 用途 |
|---|---|
harmony_publish_doctor |
体检:Python/requests、Java、devecocli、工程结构、发布证书与 Profile、Bugly jar、凭据配置状态(只报状态,永不报值) |
harmony_publish_plan |
生成确定性发布计划(校验模式/工程/路径/凭据,不执行) |
harmony_publish_preflight |
跑 pre_check.py(签名状态 + 在架版本对比),不构建不上传 |
harmony_publish_start |
启动构建/上传/提审后台任务;upload 与 submit 都走审批卡片 |
harmony_publish_status |
非消费式读取任务状态与脱敏输出 |
安装
桌面版 DSH(推荐:插件管理器)
把本仓库目录(或 Releases 里的
xrxs-dsh-harmony-publish-<version>.tgz)交给 DSH 的插件安装入口即可,profile 的
package.json / cordis.patch.yml 由安装动作维护,不要手写。
自行构建:
pnpm install
pnpm run build # 产物在 lib/,不入库
pnpm pack # 生成 xrxs-dsh-harmony-publish-<version>.tgz
CLI 版
dsh plugin --profile <name> add /absolute/path/to/xrxs-dsh-harmony-publish
dsh --profile <name> --dump-config # 检查组合
⚠️
@deepseek-ai/dsh-*绝不能出现在本插件的dependencies里,它们由宿主提供。 一旦被复制进 profile 的node_modules,进程内会出现两份工具调度器 Symbol, 该实例下所有工具调用都会失败。
配置
在 profile 覆盖层里按 id 整行覆盖配置(整对象替换,非深合并):
- id: xrxs-harmony-publish
name: xrxs-dsh-harmony-publish
config:
pythonExecutable: /opt/homebrew/opt/python@3.11/libexec/bin/python3
profiles:
xrxs-harmony:
displayName: 薪人薪事 鸿蒙
projectRoot: /Users/ang/workspace_codex/mobile_harmony
productName: default
bundleName: com.client.xrxs.app
allowedModes: [buildOnly, upload, submit]
# 提审总开关:需要提审时才改成 true(工具会强制弹审批卡)
allowSubmit: false
# required = 符号表上传失败/缺失即中断;optional = 失败只警告;disabled = 完全跳过
symbolPolicy: optional
requireManagedCredentialSource: true
appArtifactGlob: "**/build/outputs/**/*-signed.app"
credentialRefs:
AGC_CLIENT_ID: HARMONY_PUBLISH_XRXS_AGC_CLIENT_ID
AGC_CLIENT_SECRET: HARMONY_PUBLISH_XRXS_AGC_CLIENT_SECRET
BUGLY_APP_ID: HARMONY_PUBLISH_XRXS_BUGLY_APP_ID
BUGLY_APP_KEY: HARMONY_PUBLISH_XRXS_BUGLY_APP_KEY
plainEnv:
AGC_APP_ID: "109600000000000000"
DEVECO_CLI: /opt/homebrew/bin/devecocli
HARMONY_KEYSTORE_DIR: /Users/ang/develop/keystore/harmony
HARMONY_RELEASE_PROFILE: /Users/ang/develop/keystore/harmony/发布Profile/Release_Profile.p7b
HARMONY_RELEASE_CERT: /Users/ang/develop/keystore/harmony/发布证书/薪人薪事发布证书.cer
JAVA_HOME: /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
允许的 plainEnv 键
AGC_APP_ID、DEVECO_CLI、DEVECO_HOME、HARMONY_KEYSTORE_DIR、HARMONY_RELEASE_PROFILE、
HARMONY_RELEASE_CERT、BUGLY_JAR_PATH、JAVA_HOME。
凭据放哪里
密钥形变量只允许通过 credentialRefs 指向 DSH 凭据库,例如写入托管库
~/.dsh/.credentials.yaml:
version: 1
refs:
HARMONY_PUBLISH_XRXS_AGC_CLIENT_ID: "..."
HARMONY_PUBLISH_XRXS_AGC_CLIENT_SECRET: "..."
HARMONY_PUBLISH_XRXS_BUGLY_APP_ID: "..."
HARMONY_PUBLISH_XRXS_BUGLY_APP_KEY: "..."
首次配置后调用 harmony_publish_doctor 即可看到每个 ref 是否 configured(不显示值)。
也支持 ~/.dsh/.env 作为只读兜底层,但提审(requireManagedCredentialSource: true)要求来源为托管文件(file)。
使用流程
harmony_publish_doctor { profileId }— 确认 Python/Java/devecocli/证书/凭据都到位harmony_publish_preflight { profileId }— 确认签名状态与「本地版本 > 在架版本」harmony_publish_start { profileId, mode, remark }— 审批后启动后台任务harmony_publish_status { jobId }— 轮询进度与脱敏日志
mode: submit 时用户必须点「确认提审」;拒绝则不会有任何 AGC 写操作。
脚本退出码
| 脚本 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
pre_check.py |
通过 | 存在阻塞问题 | AGC 查询失败 | — |
check_version.py |
本地 > 在架 | 版本未升级 | AGC 查询失败 | — |
check_signing.py |
已是发布 / 已切换 | 无法安全切换 | — | dry-run 且需要切换 |
build_and_submit.py |
全流程成功 | 某步失败 | submit 安全锁未满足 | — |
submit_review.py |
提交成功 | 提交失败 | 安全锁未满足 | — |
与 Codex skill 的差异
- 凭据从 DSH 凭据库注入,不读
.agc_env/.bugly_env(插件模式下) - 签名检查拆成「只读判定」与「可写切换」两步,
pre_check.py绝不改文件 - 双签名配置只改目标 product 的
signingConfig,多个 product 共用调试配置名时也安全 - 提审安全锁为
--i-know-this-submits-to-production+HARMONY_CONFIRM_SUBMIT=YES(与 skill 同构,变量名前缀改为 HARMONY) - Bugly jar 的查找顺序:
BUGLY_JAR_PATH→resources/tools/→~/.dsh/harmony-publish/tools缓存 →BUGLY_JAR_SEARCH_DIRS(冒号分隔,可指向 Codex skill 的tools/)→ 下载(BUGLY_JAR_URL可覆盖)。 官方下载链接会失效,建议本机放一份 jar 到缓存目录 symbolPolicy: required时「没有任何符号表可上传」也算失败(fail-closed);optional只警告
目录结构
xrxs-dsh-harmony-publish/
├── src/ # Host 插件实现(工具注册、凭据解析、脱敏、任务)
├── resources/
│ ├── python/plugin_runner.py # 子进程脱敏包装器(进度/结果协议)
│ └── scripts/ # 鸿蒙发布脚本(可独立 CLI 运行)
├── locale/{en,zh}.json # 插件管理器显示元数据
├── icon.svg
└── tests/ # vitest
许可证
MIT
No comments yet. Be the first to write one.