DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

AngChow /

AngChow/xrxs-dsh-harmony-publish

Verified

DSH plugin: safe HarmonyOS build, Bugly symbol upload, AppGallery Connect upload and review submission with credential redaction and human approval

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@93f0d881

xrxs-dsh-harmony-publish

ci

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),插件只负责标题与正文。

安全模型

  1. 凭据零暴露:AGC_CLIENT_ID / AGC_CLIENT_SECRET / BUGLY_APP_ID / BUGLY_APP_KEY 只在每次操作时经 DSH 凭据库解析(credentialRefs → ref 名),只注入子进程环境; 模型可见输出、任务缓冲、审计日志全部经精确子串脱敏。凭据值永不出现在 argv 中。
  2. 项目明文凭据隔离:插件驱动运行时始终设置 HARMONY_PUBLISH_DISABLE_PROJECT_ENV=1, 脚本侧 load_agc_env() / load_bugly_env() 遇该变量直接返回,项目里的 .agc_env、.bugly_env 不再被读取(独立 CLI 使用脚本时才允许)。
  3. 模型不能传任意旗标/凭据:环境键白名单(secret 形只能走 credentialRefs,其余走 plainEnv); --skip-*、--i-know-this-submits-to-production、HARMONY_CONFIRM_SUBMIT=YES 全部由 profile 策略与审批结果推导。
  4. 三道闸门:allowSubmit: true + 预检查通过 + 用户在审批卡片点选「确认提审」。任一缺失则什么都不启动。
  5. 默认拒绝:allowSubmit 默认 false;allowedModes 默认只有 buildOnly + upload; requireManagedCredentialSource 默认 true(提审要求凭据来源为托管库 file)。
  6. 签名切换 fail-closed:只在能精确定位目标 product 的 signingConfig 时改写 build-profile.json5,无法安全定位就报错交人工;storeFile(.p12)永不修改。
  7. 审计:<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)。

使用流程

  1. harmony_publish_doctor { profileId } — 确认 Python/Java/devecocli/证书/凭据都到位
  2. harmony_publish_preflight { profileId } — 确认签名状态与「本地版本 > 在架版本」
  3. harmony_publish_start { profileId, mode, remark } — 审批后启动后台任务
  4. 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

—/ 5

No ratings yet

Verified DSH bundle

Commit 93f0d881d2f8

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout