技能改名 + 安全发布编排器
把「改名 → 五源同步 → 清理 → 门禁 → 发布」这条易错链路固化成可复用流程。
复用而非重造:发布调 zfl-skill-factory/scripts/publish_to_skillhub.py,五源校验调 five_source_check.py,显示名调 zfl-skill-display-name/scripts/skill_display_name.py。本技能只写「slug 跨源同步 + 目录改名 + 清理/验证编排 + 发布策略」这层胶水。
依赖与降级(v1.1.0 起)
本技能复用两个私有工具:zfl-skill-factory(发布器 + 五源门禁)、zfl-skill-display-name(显示名)。
启动即自检二者是否存在;任一缺失时不崩溃,就地降级,保证无 zfl 工具链的外部用户也能用:
| 缺失的依赖 | 降级行为 |
|---|---|
| zfl-skill-factory(发布器) | 自动复用;若缺失且未指定自有通道,则打印「改名就绪 + 手动发布指引」 |
| zfl-skill-factory(五源门禁) | 门禁改用内联最小三轴校验(version / slug / displayName==meta.name) |
| zfl-skill-display-name | 显示名改为内联直改 frontmatter.displayName + _skillhub_meta.json.name |
对内用户(已装 factory)仍全自动复用,DRY 不破。降级场景举例:对外用户无 factory 时,--new-slug X --display-name 中文 --bump --clean --publish 会完成本地改名+校验,最后给出手动发布指引而非崩溃。
发布后端:三层解析(v1.2.0 起,可复用他人发布通道)
--publish 不再硬绑死我的 factory。发布后端按优先级自动解析:
- L1 显式指定(最高优先)——
--publish-cmd "<命令>"或环境变量ZFL_PUBLISH_CMD="<命令>"。命令模板支持占位符{dir}(技能目录)、{changelog}(发布说明)、{dry}(--dry-run);未写占位符时自动在末尾追加目录与--dry-run。这是「复用别人的发布通道」的直接入口:外人只要把自己已有的、已预授权的发布脚本配进来,本技能就调它,无需知道 token 长啥样。 - L2 自动探测——存在
zfl-skill-factory/scripts/publish_to_skillhub.py则调它(生态内默认)。 - L3 兜底——以上皆无,打印手动发布指引(目录路径 + 网页端导入 / 配
ZFL_PUBLISH_CMD)。
> 关键边界:发布是带凭据的动作。本技能绝不替调用方保管 token;"复用他人通道"=调用对方已有的预授权命令,而非本技能直接打 SkillHub API。这也是可插拔命令优于"内联通用发布器"的原因——不重复造轮子、不碰凭据。
编排脚本
scripts/rename_publish.py,默认 dry-run(只报告,不改动),加 --apply 才真改。
1) 先看会改什么(强烈建议先 dry-run)
2) 确认无误后真改 + 发布
参数:
- --new-slug X:改身份(新建条目)。必须配合 --apply,否则只报告。会同步 SKILL.md(name/slug) + _skillhub_meta.json.slug + _meta.json.slug + 目录重命名 + 正文路径引用替换。
- --display-name "中文":改面板显示名(调 zfl-skill-display-name,只动 display_name/cn_name + _skillhub_meta.json.name,不动 slug)。
- --bump:版本号 patch +1;或 --version X.Y.Z 指定。同步 5 源 + _meta.json + 脚本内版本打印(软)。
- --clean:删运行产物(cleanup_log_*.txt/verify_report.txt/__pycache__/*.tmp)。dry-run 先列清单。
- --publish:解析发布后端并发布(需 --changelog)。五源门禁 FAIL 则中止,绝不强行发。
- --publish-cmd "<命令>":显式指定发布命令(L1,最高优先)。支持占位符 {dir} {changelog} {dry};未写则自动追加目录与 --dry-run。等效环境变量 ZFL_PUBLISH_CMD。例:--publish-cmd "python /my/publish.py {dir} --note {changelog} {dry}"。
- --apply:真正写入/发布。缺省仅报告。
发布策略对照
| 你想做的事 | slug 变不变 | 结果 | 关键参数 |
|---|---|---|---|
| 改名重新发布,旧版保留 | 变 | 新 skillId,旧版 99718 之类不受影响 | --new-slug 新名 --apply |
| 更新已发布技能的新版本 | 不变 | 同 skillId 新增版本 | 不加 --new-slug,--bump --publish |
| 只改面板中文名 | 不变 | 本地+线上显示名变,版本不变 | --display-name "中文" --apply(线上需再 --publish) |
必踩的坑(已固化为纪律)
.skillignore对 SkillHub 发布无效:publish_to_skillhub.py会先把.skillignore/_skillhub_meta.json移出目录再调 CLI;CLI 本身不读忽略文件,纯按扩展名白名单打包。靠它排除运行日志是误区 → 根因做法是让脚本把日志写到$env:TEMP(本技能--clean只是事后补救,正解是源头不生成进包)。- 发布前会临时移出无扩展名根文件(LICENSE→LICENSE.md、VERSION 等),发布后严格恢复,本地打包约定不受影响,无需手动。
- 五源一致性是硬门禁:SKILL.md(frontmatter/metadata/CHANGELOG 行) + VERSION +
_skillhub_meta.json+_meta.json。five_source_check.py任意硬不一致即中止发布。 - 身份轴独立:数字版本全对,但
name仍是旧名 → 发布出门禁(轴③)。rename_publish.py改 slug 时同步name==slug与_skillhub_meta.json.slug。 - 先验证后发布:真发布前务必本地跑一次技能(预览
-WhatIf+ 只读诊断),确认包内无运行产物、双引擎/护栏正常。详见references/rename_publish_cookbook.md。
约束与错误处理
约束(执行纪律)
- 默认 dry-run:任何写入/改名/发布都需显式 --apply,否则只打印计划。
- 改名必须 --apply:仅传 --new-slug 不加 --apply 只报告,不重命名目录、不创建新 SkillHub 条目。
- 门禁优先:五源一致性 FAIL 立即中止,绝不带病发布。
- 凭据边界:本技能不持有任何发布 token;复用他人通道只调其已预授权命令。
错误处理(降级而非崩溃)
- 依赖缺失:zfl-skill-factory / zfl-skill-display-name 任一不存在时,门禁/发布/改名就地降级(内联最小校验 / 手动指引 / 内联改名),不抛 FileNotFoundError。
- 发布命令失败:L1/L2 后端返回非 0 退出码时,原样透传该退出码,调用方据此判定发布成败;改名与本地校验已先完成,不会半成品。
- 路径安全:skill_dir 必须含 SKILL.md,否则直接报错退出(退出码 1),不误改其它目录。
示例
完整改名重发(换 slug → SkillHub 新建条目,旧版保留):
先预览
确认无误,真改 + 发布
复用他人发布通道(L1,无需 factory):
输出格式
stdout 为分阶段进度报告,结构如下:
[deps]三行:zfl 工具链依赖自检结果(OK / 缺失→降级说明)。- 各步骤进度:
[slug]/[display]/[version]/[clean]/[gate]/[publish]前缀的逐行报告。 - 退出码:0=全部成功(或 pure dry-run 完成);1=门禁 FAIL / 缺
--changelog/ 技能目录无效,调用方可据此接入 CI 阻断。
适用 / 不适用
- ✅ 已发布技能的改名重发、版本更新、显示名中文化、发布前清理与校验。
- ❌ 从零首次发布(用
zfl-skill-factory原流程)。 - ❌ 跨账号/跨平台的 token 与凭据管理(不在本技能范围)。
> 完整版本历史见 CHANGELOG.md(含每版详细变更说明)
自检与成功标准
- 成功标准:输出满足任务声明的全部要求,关键信息完整无遗漏,视为完成。
- 输出前自检:核对输出是否覆盖全部要求项、数据是否准确、格式是否符合规范。