为什么需要
只改 SKILL.md 的 display_name 后,若不重跑同步生成 _skillhub_meta.json,面板读旧 json 不会改变——这是"改了没显示"的头号原因。本技能一步到位,避免遗漏。
用法(在技能目录下执行,脚本自动定位 skills 目录)
python scripts/skill_display_name.py list
python scripts/skill_display_name.py set <技能目录名> --display "中文显示名" [--cn "中文名"]
python scripts/skill_display_name.py batch-zh [--dry-run]
python scripts/skill_display_name.py switch <技能目录名> --to zh|en
python scripts/skill_display_name.py check
说明
- 改名只改显示名,不改动技能文件夹(目录)名称;name 字段(=目录名)永不修改。
- 已发布技能(_skillhub_meta.json 中 source:skillhub)只改 name 字段,不影响 SkillHub 线上副本。
- 无 _skillhub_meta.json 的技能,脚本会自动创建(source:local)。
约束与安全边界
- 显示名仅用于面板展示,不会被当作指令执行;本技能不修改技能功能、逻辑或代码。
- 写入防护:display/cn 值经 YAML 双引号转义,含换行或控制字符直接拒绝,阻断 YAML 字段注入(不会伪造 version/description 等字段)。
- 路径隔离:skill 参数仅允许 [A-Za-z0-9_-],真实路径必须落在 skills 目录内,阻断 ../ 路径遍历。
- 不改动文件夹名:name 字段(=目录名)永不修改,跨引用/调度不受影响。
- 已发布技能:仅改 _skillhub_meta.json 的 name 字段,不影响 SkillHub 线上副本;线上同步需另走发布更新流程。
- 错误处理:所有失败路径以 [ERROR] 输出具体原因并以非零退出码返回(set/switch 返回 1),不静默跳过;YAML/JSON 解析异常会告警并重建,不破坏原文件。
输出格式
- list:表格(目录名 / display_name / 面板meta.name),末尾一行总计。
- set / switch:行内 [OK] / [ERROR] 状态,标明改前→改后。
- batch-zh:[OK] 完成: 已切 N, 跳过 M(加 --dry-run 仅预览不落盘)。
- check:[OK] 校验完成,不一致/异常: N(N=0 即通过)。
- 所有错误以 [ERROR] 开头并给出原因,不静默失败。
发布前自证闸(PF-512:治理者须先对自己过闸)
本技能教人「同步面板中文名」,自己曾是反例:zfl-skill-display-name 的 _skillhub_meta.json 里 name 长期是英文 slug(医者不自医)。2026-09-19 经 P0-1 补齐后已合规,但必须靠闸防复发。
闸一 · 自身一致性(最直接的判据):check 输出中不得出现本技能自己的名字。
python scripts/skill_display_name.py check # 期望:输出无 zfl-skill-display-name 行
闸二 · 自身噪声回归(引擎 zfl-common/scripts/self_gate.py,回归闸非绝对阈值闸):
python ~/.workbuddy/skills/zfl-common/scripts/self_gate.py \
--skill ~/.workbuddy/skills/zfl-skill-display-name \
--json-cmd "python ~/.workbuddy/skills/zfl-skill-panel-cleanup/scripts/audit_panel_noise.py {skill} --json"
- 允许现状脏,只许变好不许变坏;新增命中项或噪声分劣化即阻断(退出码 1)。
- 无基线判 FAIL(退出码 2),空集永不 PASS;有意改动后用
--init重设基线。 - 基线文件:
tests/_self_gate_baseline.json。
> 注:check 是全库校验,输出含他人技能的 WARN 属正常(2026-09-20 实测 22 条,多为市场安装技能缺 _skillhub_meta.json)。本闸只关心自己那一行,不拿全库指纹做判据——否则他人改名会让本技能误报(视角错位)。
示例
输入:
python scripts/skill_display_name.py set zfl-report-verifier --display "测试报告审核器" --cn "测试报告审核器"
输出:
[OK] SKILL.md display_name: zfl-report-verifier -> 测试报告审核器
[OK] _skillhub_meta.json name -> 测试报告审核器
面板:重开技能列表,zfl-report-verifier 显示为「测试报告审核器」。
不适用场景
- 不适用于修改技能功能、工作流或代码逻辑(本技能只改显示名)。
- 不适用于把本地改名同步到 SkillHub 线上副本(仅改本地 _skillhub_meta.json;线上同步需走发布更新流程)。
- 不适用于非 WorkBuddy 的技能系统(机制依赖 WorkBuddy 读取 _skillhub_meta.json 的约定)。
字段模型
| 字段 | 位置 | 作用 |
|---|---|---|
| name | SKILL.md | 英文标识 = 目录名,不可改 |
| display_name | SKILL.md | 用户可见名,可中可英 |
| cn_name | SKILL.md | 中文固定参考名 |
| name | _skillhub_meta.json | 面板真正读取的显示名(本技能自动同步) |
来源
从 zfl-skill-factory 的 07_naming 能力抽取为独立自包含技能,专为"跨电脑单独使用、一步改名"场景设计。