关于 huawei-cloud-publish-work-to-gallery
引导将项目发布到华为云高校作品平台的技能。脚本工作流涵盖项目选择、元数据与图片准备及发布,并在各环节设置检查门禁。
主要功能
- 01扫描候选项目
- 02解析账号域并获取 STS 凭证
- 03读取 Git 仓库信息和作品名
- 04准备封面图与详情压缩包
- 05发布前检查前置条件
适用场景
- 01向高校作品平台发布项目
- 02准备项目封面和详情包
- 03为作品选择训练营
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-publish-work-to-gallery安装后在 Claude Code 中输入/huawei-cloud-publish-work-to-gallery确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-spec.mdcodearts-sandbox.mddevbridge-tunnel.mderror-codes.mdiam-policies.mdmock-server-template.mdself-verify-publish.mdtroubleshooting.mdwindows-setup.mdwork-preparation-linux.mdwork-preparation-windows.mdwork-preparation.mdscripts/api.mjsbrowser_launch.pybuild-cover.mjsbuild-detail-zip.mjscheck-gates.mjscheck-version.mjscount-cjk.mjsdetect-env.mjsdownload-noto-color-emoji.shensure-git-root.mjsensure-gitcode-credential.mjsensure-user-bindir.mjsensure-user-tool.mjsensure-utf8.mjsextract-fonts.mjsextract-workname.mjsgen_sts.pygenerate_cover.py详细介绍
Publish Work to Gallery
发布作品至华为云高校运营平台。优先调用内置脚本(单入口、fail-fast、自带 --help),报错才查 references/troubleshooting.md。
Pipeline
Step 1 (workDir, domainID, STS)
Step 2 (port→变量, envUrl→变量) ← 依赖 Step 1
├── Step 3 (gitUrl, gitBranch, workName) ← 只依赖 workDir
├── Step 5 (introduction, camps) ← 只依赖 workDir + STS
├── Step 4 (coverImage) ← 依赖 port + workName
└── Step 6 (detailZip) ← 依赖 workName + 代码分析
Step 7 (trainingCampId) ← 依赖 Step 5 camps
Step 8 (publish) ← 依赖以上全部
并行(Step 2 完成后):Step 3/4/5/6 互不依赖,四者全并行(取最长路径 Step 4 ~90s,而非串行 160s)。Step 4 内 10 分钟)——脚本已内置门禁:缺 preflight + ensure-utf8 再并行。注意 Step 6 的隐性依赖:generate_diagram.py 用 Playwright,由 Step 4 的 preflight 安装(首次含 CJK 字体 + Chromium,5font-gate-ok 标记时 exit 1 提示等待,不报 ModuleNotFoundError。并行跑 Step 6 收到该提示 → 等 preflight(轮询日志/标记)完成后再重跑本步,不是真失败。
变量贯穿:port/workName/envUrl 在最早步骤确定后作为变量传递全流程,禁止硬编码(隧道 URL 含 port,换端口时 envUrl 随之变)。
执行模型:① 脚本契约优先——按 stdout 成功信号判定,成功路径零源码读取;失败才 脚本提示 → troubleshooting 对应节 → grep 脚本源码 逐级查 ② 禁止手工绕过门禁 ③ 网络超时统一 3s ④ detect-env.mjs 确定平台后只读对应平台 reference(按目录跳转,不全读)⑤ 合并无依赖的 bash 调用:用 ; 串联进一条命令,减少工具往返(每次 ~1-2s) ⑥ 需用户交互的命令一律把链接/二维码原样展示给用户,禁止用 agent 内置浏览器/工具(browser_use_open 等)代开——脚本本地已起回调服务器,用户在任意浏览器授权后脚本自动拿到 token,agent 全程不需要浏览器。
Core Commands(脚本契约速查)
$SKILL_DIR定义:本 skill 的安装目录绝对路径(含 SKILL.md 的目录)。执行前先设置export SKILL_DIR=/path/to/huawei-cloud-publish-work-to-gallery(示例:$HOME/.local/share/huawei-cloud-publish-work-to-gallery)。所有脚本均为可执行文件(带 shebang),直接用$SKILL_DIR/scripts/…前缀调用,无需node/python/bash解释器前缀(该说法仅 Linux 成立;Windows 下 .mjs/.py 需node/python前缀、preflight.ps1需powershell前缀);若安装器未恢复可执行位(Linux 直接调用报Permission denied),先执行一次chmod +x "$SKILL_DIR/scripts/"*自愈,不改脚本;参数一律用可解析的示例值(无<…>占位符,避免命令提取器剥离后缺参/空值)。W/R 标注:W= 平台写操作(发布作品,必须经用户确认后才执行);R= 只读查询/本地辅助命令。
| 步骤 | 脚本/命令 | W/R | 成功信号(exit 0 且) | 失败(exit 1;2=参数错误) |
|---|---|---|---|---|
| 前置 | $SKILL_DIR/scripts/api.mjs GET /v1/gallery/announcements/current --prefix open-api-guest | R | stdout 首行 #status=200 | 超时/拒绝连接 → 提示排查网络 |
| 前置 | $SKILL_DIR/scripts/check-version.mjs(读取自身 name/version,调用 /v1/gallery/skills/status 进行判定) | R | exit 0 且首行 status=ok/status=skip | exit 1(status=outdated + 平台升级文案)→ 原样提示升级并停止;判定规则见 api-spec |
| 5/7 | $SKILL_DIR/scripts/api.mjs GET "/v1/gallery/camps" --creds-file ./sts-creds.json --fields "id,name,school,status,startsAt,endsAt" | R | #status=200 | 401 → 刷新 STS |
| 1 | $SKILL_DIR/scripts/scan-projects.mjs | R | stdout #project <n> <path> <type> | exit 1=无候选项 |
| 1 | $SKILL_DIR/scripts/resolve-domain.mjs --hcloud /usr/local/bin/hcloud | R | stdout #domain=<id> name=<name> | exit 1=hcloud 失败(stderr 含排查指引) |
| 1 | $SKILL_DIR/scripts/gen_sts.py --account 100000000000 --hcloud /usr/local/bin/hcloud --creds-out ./sts-creds.json --sh-out ./sts-creds.sh | R | 写入 ./sts-creds.json(含 _refresh)+./sts-creds.sh(相对路径,后续 --creds-file ./sts-creds.json 可直接使用) | 见 [troubleshooting#domain-id-resolution-issues] |
| 3 | $SKILL_DIR/scripts/ensure-git-root.mjs /path/to/project | R | exit 0(git -C /path/to/project rev-parse --git-dir = .git) | exit 1=workDir 不是仓库根目录 → 禁止读取 remote,按 Step 3 处置 |
| 3 | $SKILL_DIR/scripts/read-git-info.mjs /path/to/project | R | #gitUrl=<https://… .git> #gitBranch=<分支>(已核实远端确有该分支) | exit 1=非 git 仓库 / url 校验失败 / #branchAbsent=1(远端不存在该分支——按 SHA 给出唯一处置:checkout 或 push,转述 stderr 即可);因网络/凭证原因无法核实时,stderr 会发出警告但不拦截(发布时服务端会校验分支是否存在) |
| 3 | $SKILL_DIR/scripts/ensure-gitcode-credential.mjs | R | #credential=found(有凭证)或 #credential=missing(无凭证,走 OAuth) | exit 0;无手动备选方案 |
| 3 | $SKILL_DIR/scripts/gitcode-oauth.ensure.mjs --start | R | #oauth=ready(有 token)/ #oauth=started session_id=123456 login_url=https://example.com(stdout 立即返回,二维码输出到 stderr) | 缺少 #oauth=absent,exit 1;失败 #oauth=failed reason=timeout,exit 1 |
| 3 | $SKILL_DIR/scripts/gitcode-oauth.ensure.mjs --wait 123456 --timeout 300 | R | #oauth=done(token 已写入 ~/.gitcode/auth.toml) | #oauth=failed reason=timeout|finish|…,exit 1 |
| 3 | $SKILL_DIR/scripts/extract-workname.mjs /path/to/project | R | stdout #name=MyWork source=frontmatter | exit 1=workDir 不存在 |
| 2 | $SKILL_DIR/scripts/spawn-detached.mjs --out /tmp/spawn.out --pidfile /tmp/app.pid --cwd /path/to/project -- npm run dev | R | #spawn=ok pid=12345 out=/tmp/spawn.out | exit 1=启动失败 |
| 2 | 隧道:先运行 $SKILL_DIR/scripts/detect-env.mjs 查看 tunnel 字段;true(Linux)→ 加载内置 skill huawei-cloud-devbridge-tunnel 开启隧道;false(Windows/macOS)→ 禁止加载,envUrl="" | R | 获取 envUrl;skill 不可用/失败 → envUrl="",照常发布 | tunnel=false 时仍尝试开启隧道 = 违反契约 |
| 4 | $SKILL_DIR/scripts/preflight.sh(Win: powershell $SKILL_DIR/scripts/preflight.ps1) | R | 写入 font-gate-ok(ok=true gate=preflight) | 禁止截图/封面/图表 |
| 4 | $SKILL_DIR/scripts/ensure-utf8.mjs /path/to/project | R | 写入 utf8-gate-ok | 编码不是 UTF-8 → 禁止截图 |
| 4 | $SKILL_DIR/scripts/build-cover.mjs --url http://127.0.0.1:8080 --project-dir /path/to/project --title "MyWork" --out /tmp/cover.png | R | stdout 一行 #cover=/tmp/cover.png layout=… multi=yes tmp=/tmp/shots(内部调用 screenshot_guard.py+generate_cover.py) | exit 1 → 截图/校验/合成任一步骤失败,详情见 stderr |
| 4 | $SKILL_DIR/scripts/generate_cover.py --screenshot /tmp/shots/shot-index.png --title "MyWork" --out /tmp/cover.png | R | 封面 PNG,然后通过 verify-glyphs.py 校验 | exit 1 → 禁止继续合成 |
| 4/6 | $SKILL_DIR/scripts/verify-glyphs.py /tmp/cover.png --quiet | R | exit 0(stdout 仅 1 行,节省 token) | exit 1 → 疑似出现豆腐块 → 修复字体 |
| 5 | $SKILL_DIR/scripts/count-cjk.mjs --file /tmp/intro.txt | R | 总字符数为 15~50 | exit 1 → 改写简介后重新计数 |
| 6 | $SKILL_DIR/scripts/generate_diagram.py --html /tmp/diagram.html --out /tmp/diagram.png --width 1280 | R | 图表 PNG,然后通过 verify-glyphs.py --quiet 校验 | 同封面;缺少 font-gate-ok → exit 1,提示等待 preflight(隐性依赖,见并行说明) |
| 6 | $SKILL_DIR/scripts/build-detail-zip.mjs --readme README.md --resources /path/to/project/resources --out /tmp/detail.zip | R | 一步完成打包和校验 | exit 1 → 根据输出修复后重新打包 |
| 8 | $SKILL_DIR/scripts/check-gates.mjs --cover /tmp/cover.png --detail /tmp/detail.zip --strict --max-age 3600 --quiet | R | exit 0(stdout 仅 1 行,节省 token) | exit 1 → 回退并重新运行门禁 |
| 8 | $SKILL_DIR/scripts/publish-work.mjs /tmp/params.json --max-age 3600 | W | #status=201(仅输出 workId/workUrl/reward) | envUrl 无法访问 → exit 1(提示检查本地服务);409/其他 → 原样输出完整响应 |
标记文件位置:Linux
/tmp/;Windowsos.tmpdir()(%TEMP%)。
参数确认(参数确认)
| 参数 | 必需 | 说明 | 来源 |
|---|---|---|---|
workDir | 是 | 作品项目根目录(须为 git 仓库根) | Step 1(用户选择) |
domainID | 是 | 华为云账号 Domain ID | Step 1(resolve-domain.mjs) |
credsFile | 是 | STS 临时凭证 JSON(sts-creds.json) | Step 1(gen_sts.py) |
port | 条件 | 本地服务端口(用户拒绝运行项目则无) | Step 2 |
envUrl | 条件 | DevBridge 隧道公网 URL(失败则为空串) | Step 2 |
gitUrl / gitBranch | 是 | 作品仓库地址 / 分支 | Step 3 |
workName | 是 | 作品名(<30 字符) | Step 3(extract-workname.mjs) |
coverImagePath | 是 | 封面 PNG(须通过 verify-glyphs 校验) | Step 4 |
introduction | 是 | 一句话简介(总字符数 15~50) | Step 5(count-cjk.mjs) |
detailsZipPath | 是 | 作品详情 zip(README.md@根 + resources/) | Step 6 |
trainingCampId | 是 | 训练营/活动 ID | Step 7(用户回序号选择) |
前置条件与依赖锁定(前置条件与依赖锁定)
- hcloud + AK/SK:Step 1 需要。未安装/未配置 → troubleshooting#domain-id-resolution-issues。
- git:Step 3。zip 仅在
build-detail-zip.mjs不可用时作为备选(Linuxyum install zip;Windows .NETZipFile,见 windows-setup.md)。 - Git Bash 前置:
source $SKILL_DIR/scripts/setup-env.sh(防止 MSYS 路径转换)。PowerShell/CMD 无需。 - OAuth 与本地环境依赖(自动化/沙箱限制):发布流程依赖用户 GitCode OAuth 授权(Step 3)与本地项目运行(Step 2 隧道 / Step 8 发布)。无人值守或沙箱环境(无用户浏览器授权)无法访问真实平台 API——此类用例需标注
requires manual verification,并在真实用户环境中复验。
核心工作流
Step 1:选择作品目录并解析 IAM Domain 信息
- 告知用户(选择目录即表示同意):将创建 IAM 自委托
SELF_VERIFY以生成 STS 临时凭证(900s),永久 AK/SK 留在本地,不会上传。 - 扫描项目根目录:
$SKILL_DIR/scripts/scan-projects.mjs——自动递归搜索**/README.md,检查指示文件,排除skills//node_modules//dist/等目录,扫描 CodeArts 沙箱目录。stdout 每行格式为#project <n> <path> <type>。 - 列出候选项,等待用户选择 →
workDir。 - 解析 Domain ID:
$SKILL_DIR/scripts/resolve-domain.mjs --hcloud /usr/local/bin/hcloud——自动执行hcloud configure set --region+IAM KeystoneListAuthDomains+ 提取domain_id,stdout 格式为#domain=<id> name=<name>。凭证优先级:环境变量 → hcloud 已配置 → 引导用户(troubleshooting#2)。Windows 已由install-hcloud.ps1安装并写入用户 PATH,通常无需--hcloud。 - 生成 STS:
$SKILL_DIR/scripts/gen_sts.py --account 100000000000 --hcloud /usr/local/bin/hcloud --creds-out ./sts-creds.json --sh-out ./sts-creds.sh→./sts-creds.json(含_refresh,可在 401 时自动刷新)。凭证文件使用相对路径读写(同一 CWD 会话内保持一致,跨平台无需区分/tmp/%TEMP%);⚠️ 请勿git add/提交此凭证文件,Step 8 结束后统一清理。hcloud 探测顺序与 resolve-domain 一致。 - 输出:
已获取 IAM Domain ID: <id>,用于将作品关联至您的华为云账号。
输出: workDir、domainID、credsFile。
Step 2:运行项目并打开隧道
先运行 $SKILL_DIR/scripts/detect-env.mjs 获取 tunnel 字段:true(Linux)→ 询问是否打开隧道;false(Windows/macOS)→ 直接跳过隧道,envUrl="",禁止尝试加载 DevBridge skill。询问用户是否运行项目;若拒绝,则设 envUrl="" → Step 3。
- 清理端口:
netstat -ano | findstr :<port>(Win),终止残留进程。 - 启动项目:
$SKILL_DIR/scripts/spawn-detached.mjs --out /tmp/spawn.out --pidfile /tmp/app.pid --cwd /path/to/project -- npm run dev→#spawn=ok pid=12345。必须传入--cwd <workDir>(脚本默认使用process.cwd();若执行目录不是 workDir,http-server .会服务错误目录,导致截图空白——2026-09-20 的教训)。优先使用入口脚本(npm run dev/python main.py);纯前端项目使用http-server . -p <port>。在 ≤30s 内进行健康检查:curl -sf --max-time 3 http://localhost:<port>。 - 隧道(DevBridge):Linux 加载目标环境内置的 skill
huawei-cloud-devbridge-tunnel,按照其操作说明打开隧道并获取envUrl——禁止臆造/自行拼接 devbridge 命令;若该 skill 不可用或隧道失败,则设envUrl="",照常发布。Windows 不使用 DevBridge(无内置隧道能力)→envUrl=""。禁止在发布结束后自动清理隧道——发布结束 ≠ 隧道生命周期结束(隧道可能被后续发布 / 409 改名重试复用);仅在用户明确要求清理时,才按照内置 skill 的说明停止流量/删除隧道。详见 devbridge-tunnel.md。
输出: port、envUrl(或 "")。
Step 3: Git Repository Info & Work Name
gitUrl 必填,gitBranch 必须显式读取。workName 从 README 解析/合成(<30 字符)。
- 仓库根检测(fail-stop):
$SKILL_DIR/scripts/ensure-git-root.mjs /path/to/project——硬检测 workDir 自身是否为 git 仓库根(git -C /path/to/project rev-parse --git-dir必须返回.git)。若不是(如 workDir 无 .git 但父目录有,git 会向上递归返回父仓库 remote),脚本 exit 1 并提示。此时 禁止 直接git -C /path/to/project remote get-url origin(会拿到父仓库 URL)。处理方式:① 问用户手动提供gitUrl+gitBranch;② 或在 workDirgit init+ 推到远端后再读。检测通过才继续。 $SKILL_DIR/scripts/read-git-info.mjs /path/to/project一步取 gitUrl/gitBranch(含仓库自检 + 凭证剥离 + 远端分支核对,契约见上表)。#branchAbsent=1→ 转述 stderr 的唯一处置(脚本已按 SHA 判定:远端某分支与本地当前提交一致 →git checkout <该分支>后重跑,无损且优于 push;否则 →git push -u origin <branch>后重跑,切到远端旧分支会提交旧代码)。- 凭证排查:
$SKILL_DIR/scripts/ensure-gitcode-credential.mjs——有凭证即#credential=found。无凭证时走 gitcode-oauth 两阶段授权(契约见上方gitcode-oauth.ensure.mjs --start/--wait):①--start拿登录链接/二维码原样展示给用户,请用户在任意浏览器打开授权(禁止用 agent 内置浏览器代开),脚本本地已起回调服务器;②--wait <session_id>阻塞轮询到 token 落盘。 - 命名:
$SKILL_DIR/scripts/extract-workname.mjs /path/to/project——按优先级 frontmatter → H1 → manifest →index.html <title>→ 目录名提取。stdout#name=<name> source=<来源>。source=dirname时 agent 可合成/修改(<30 字符)。
Output: gitUrl、gitBranch、workName。
Step 4: Cover Image
门禁(并行):
| 门禁 | 命令 | 标记 |
|---|---|---|
| 渲染 | $SKILL_DIR/scripts/preflight.sh(Win: $SKILL_DIR/scripts/preflight.ps1) | font-gate-ok |
| 编码 | $SKILL_DIR/scripts/ensure-utf8.mjs /path/to/project | utf8-gate-ok |
门禁失败禁止截图/合成。preflight 以标记文件 ok=true 为准,Linux 一律后台化启动(首次下载 Chromium 慢网 5~10 分钟)。轮询上限与心跳/卡死换源判定见 work-preparation-linux.md#preflight-后台化与轮询linux。
封面一键生成(内置:页数判定 + 单/多图概率抽样 + 截图 + 合成 + 校验):
$SKILL_DIR/scripts/build-cover.mjs \
--url "http://127.0.0.1:8080" --project-dir /path/to/project \
--title "MyWork" --tagline "一句话简介" --description "主体介绍,1~3 句" \
--out /tmp/cover.png
- 布局决策在脚本内部闭环(单/多页自动判定 + 布局概率抽样 + 失败页自动跳过,agent 无感知),规则详见 work-preparation.md。
- stdout 仅输出一行结果:
#cover=… layout=… multi=yes|no pages=<n> scheme=… tmp=<截图临时目录>;日志走 stderr。失败 exit 1。 - 截图临时目录
tmp=<abs>保留到整体流程结束(供 Step 8 409 改名复用原截图,见下),由 Step 8 发布成功/放弃后统一清理(Remove-Item -Recurse -Force <abs>或rm -rf <abs>),build-cover 不删。
⚠️ workName↔封面强依赖: 封面标题即
--title "${workName}"。一旦之后因 409 改名,必须用新 workName 重新合成封面(见 Step 8 改名重推流程),禁止旧封面配新名发布。
输出
coverTmp:从 build-cover stdout 的tmp=提取并作为变量贯穿到 Step 8(409 改名时--screenshot ${coverTmp}/shot-index.png)。
排布规则、视觉基线见 work-preparation.md#screenshot-layout-rules。
Output: coverImage(封面 PNG 绝对路径)。
Step 5: Introduction
读写 README 生成一句话简介。总字符数 15~50,脚本计数通过才继续:
$SKILL_DIR/scripts/count-cjk.mjs --file "$env:TEMP\intro.txt" # Win 必须 --file(GBK 转码问题)
规则见 work-preparation.md#introduction-generation。
⏩ 并行:预取活动列表供 Step 7——表行 5/7 命令 +
--query "pageNo=1&pageSize=100&periodYear=${currentYear}"。
Output: introduction。
Step 6: Work Details
生成详解文章(500–1500 字)配图并打包 zip。
- 图表:必选系统架构图;可选 0–2 张(路由/依赖/统计图)。用 DevLens/GitNexus 理解项目后出图。禁用 emoji。
$SKILL_DIR/scripts/generate_diagram.py --html /path/to/project/diagram.html --out /path/to/project/resources/architecture.png --width 1280 $SKILL_DIR/scripts/verify-glyphs.py /path/to/project/resources/architecture.png --quiet # 每张含中文图必跑 - 打包 zip + 校验一步到位(
build-detail-zip.mjs内置正确目录结构 README.md@根 + resources/,打包后自动跑服务端同源校验,跨平台无需 zip/ZipFile):$SKILL_DIR/scripts/build-detail-zip.mjs --readme /path/to/project/README.md --resources /path/to/project/resources --out /tmp/detail.zip
Output: detailZip(详情 zip 绝对路径)。
Step 7: Select Activity
- 获取活动列表(Step 5 预取则直接用,
$SKILL_DIR/scripts/api.mjs GET /v1/gallery/camps输出items数组)。 - 依据
startsAt/endsAt/status判定投稿状态(api-spec.md#submission-status-determination)。 - 分「可投稿」/「不可投稿」两表展示,每行按当前列表顺序编号(
<n>. <activity name> — <school>(状态)),必须包含school(学校)列;school为空时显示—。用户回序号选择活动(编号对应items数组下标序),选不可投稿项提示「未开放投稿」。
Output: trainingCampId。
Step 8:发布
- 宣布
开始发布作品 ${workName}。 - 门禁复核:
$SKILL_DIR/scripts/check-gates.mjs --cover /tmp/cover.png --detail /tmp/detail.zip --strict --max-age 3600 --quiet(只有 exit 0 才能继续;publish-work.mjs内置的verifyGates()也会拦截)。publish-work.mjs还会在发送请求前校验envUrl是否可达(curl -sf --max-time 10),隧道不通则 exit 1,并提示检查本地服务。 - 参数写入 UTF-8 JSON,Idempotency-Key=
gallery-publish-${domainID}-${timestamp}。参数 key 见publish-work.mjs --help(取值对应输出变量:coverImage←Step 4、detailZip←Step 6、trainingCampId←Step 7、gitUrl/gitBranch←Step 3、envUrl←Step 2)。domainId不作为参数(仅拼入 Idempotency-Key)、credsFile不放入 JSON(STS 三个字段accessKeyId/secretAccessKey/securityToken内联):$SKILL_DIR/scripts/publish-work.mjs /tmp/params.json --max-age 3600 # 成功仅输出 workId/workName/workUrl/reward;失败原样输出完整响应 - 201 → 成功,获取
workId/workUrl/reward,清理临时文件(包括 Step 4 的coverTmp截图目录)。积分提示(无论是否成功都必须提示「每日仅限一次」):is_success===true:✅ 积分领取请求已提交。⚠️ 每日仅限一次。前往查看余额:https://developer.huaweicloud.com/growis_success===false:积分领取未成功:<error_msg>+ 每日限一次提示 + 成长中心地址 + 反馈入口https://gallery.developer.huaweicloud.com/gallery/profile?tab=feedback。
- 409 DUPLICATE → 停止当前发布。提供选项:① 放弃 ② 改名重发。若改名重发,必须联动:
- 新名称
workName'(<30 个字符):由用户自定,或在不带版本号的常规名称基础上加序号(如扫雷→扫雷-2)。禁止随意拼接无关字符。 - 重新生成封面(封面标题须与新名称一致):复用 Step 4 保留的原截图(
${coverTmp}/shot-index.png) + 原 tagline/description,仅替换--title "<workName'>"后重新运行build-cover.mjs(一键覆盖截图、合成和校验,退出后不再处理 tmp):
若$SKILL_DIR/scripts/build-cover.mjs --url http://127.0.0.1:8080 --project-dir /path/to/project \ --screenshot ${coverTmp}/shot-index.png --title "NewName" \ --tagline "原tagline" --description "原description" --out /tmp/cover-new.png $SKILL_DIR/scripts/verify-glyphs.py /tmp/cover-new.png --quiet # 只有 exit 0 才可继续coverTmp已被清理或不存在,重新运行build-cover.mjs时不带--screenshot(会重新截图,需确保本地服务仍在运行)。 - 门禁复核(封面已更新,须重新运行):
$SKILL_DIR/scripts/check-gates.mjs --cover /tmp/cover-new.png --detail /tmp/detail.zip --strict --max-age 3600 --quiet。 - 使用新的
workName'+ 新封面和新 Idempotency-Key 重新发布(返回第 3 步)。最终成功或放弃后,同样清理各coverTmp。 注意:详情 zip 通常无需重做;仅当 zip 内 README 的标题或正文写有旧作品名(与新名称不一致)时,才需要将旧名称改为新名称并重新打包详情 zip。
- 新名称
- 其他错误 → 告知
<msg>(<code>),保留临时文件,并询问是否修改后重发。错误码见 error-codes.md。
参考资料
| 文档 | 用途 | 何时阅读 |
|---|---|---|
| troubleshooting.md | 网络/各步骤失败排查 | 脚本报错→先查这里 |
| error-codes.md | 平台 API 全错误码表 | API 返回非 2xx 时查表 |
| api-spec.md | API 契约、投稿状态判定 | Step 7/8 解析响应 |
| work-preparation.md | 命名/封面/简介/详情/图表统一规则 | Step 3–6 需了解细节时按目录跳转 |
| work-preparation-windows.md | Windows 专属:PowerShell 预检/字体/zip | 仅 Windows |
| work-preparation-linux.md | Linux 专属:bash 预检/yum/fontconfig | 仅 Linux |
| windows-setup.md | Windows 首次准备:编码/Playwright/zip | Windows 环境首次使用 |
| self-verify-publish.md | 自委托 SELF_VERIFY 与 STS 原理 | Step 1 出问题时 |
| iam-policies.md | 最小权限 IAM 策略(Domain 查询 + SELF_VERIFY 自委托) | Step 1 配置 AK/SK 权限时 |
| devbridge-tunnel.md | DevBridge 隧道:Linux 使用内置 huawei-cloud-devbridge-tunnel skill / Windows 弃用 | Step 2 隧道(Linux/Windows) |
| codearts-sandbox.md | CodeArts 沙箱目录 | Step 1 命中沙箱 |