skills/skill-publish-yashu/SKILL.md
把私有技能按白名单复制到公开技能目录。激活条件:用户消息须包含以下关键词之一:`发布技能`、`把技能公开`、`复制技能到公开目录`、`发布私有技能`。
npx skillsauth add steelan9199/wechat-publisher-skill skill-publish-yashuInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
本 Skill 用于把私有技能目录中的技能,按白名单规则复制一份到公开技能目录,确保只发布应当公开的文件,私密文件(license-key、备份、测试用例、临时文件等)绝不外泄。采用"白名单为主 + 每技能可覆写 + 硬黑名单兜底"三层防护机制。
适用场景:把开发完成的私有技能发布到公开技能库;私有技能更新后同步到公开技能库。每次只发布一个技能,不支持批量或全部发布。
cmd1 && cmd2cmd1; if ($?) { cmd2 }(PowerShell 5 不支持 &&)&$SKILL_DIR 仅为文档占位符,不是环境变量,执行命令时必须替换为本 Skill 的实际绝对路径| 配置项 | 位置 | 说明 |
| ------------------------ | ----------------------------------------------------- | ------------------------ |
| 源目录(私有技能目录) | $SKILL_DIR/scripts/config.json 的 sourceDir | 待发布的私有技能所在目录 |
| 目标目录(公开技能目录) | $SKILL_DIR/scripts/config.json 的 targetDir | 发布目标目录 |
| 全局白名单 | $SKILL_DIR/scripts/config.json 的 globalWhitelist | 允许复制的顶层条目清单 |
| 硬黑名单 | $SKILL_DIR/scripts/config.json 的 hardBlacklist | 任意层级命中即排除的条目 |
AI 执行脚本前必须将 $SKILL_DIR 替换为实际绝对路径,再 cd 到 $SKILL_DIR/scripts 运行命令。配置字段详细说明见 发布流程与配置参考。
| 层级 | 作用 | 配置位置 |
| ------------------ | ---------------------------------- | ------------------------------------ |
| 第一层:全局白名单 | 顶层条目必须在白名单中才复制 | config.json 的 globalWhitelist |
| 第二层:每技能覆写 | 单个技能可声明额外要包含的顶层条目 | 技能目录下的 .publish-include 文件 |
| 第三层:硬黑名单 | 任意层级命中即排除,防御性兜底 | config.json 的 hardBlacklist |
判定顺序:硬黑名单 > 白名单/覆写。即先排除黑名单,再判断白名单。node_modules 在任意层级都排除(它可能出现在 scripts/ 等白名单文件夹内部,体积巨大)。
为什么用白名单:发布是安全边界,要排除的私密文件名字发散且不可预知(测试用例、备份、缓存、笔记),而要保留的结构标准化(SKILL.md、scripts、references)。白名单"默认安全",漏项表现为"少发"(很快发现且可挽回),黑名单漏项表现为"泄露"(难发现且不可挽回)。
| 步骤 | 执行动作 | 具体命令/操作 |
| ---- | ------------ | -------------------------------------------------------------------------------------------------------- |
| 1 | 确认配置 | 读取 $SKILL_DIR/scripts/config.json,确认 sourceDir、targetDir 指向正确 |
| 2 | 确定发布范围 | 用户指定单个技能名 -> 发布该技能(每次只能发布一个技能,不支持 all/批量) |
| 3 | 执行发布 | 运行 cd $SKILL_DIR/scripts; if ($?) { node publish.js <技能名> } |
| 4 | 查看报告 | 脚本输出该技能的"已复制/已跳过"清单,检查跳过项是否有误伤的合法文件 |
| 5 | 补救误伤 | 若有合法文件被跳过(原因"不在白名单"),在该技能目录下创建 .publish-include 文件登记额外条目,重新发布 |
node publish.js <技能名> # 发布单个技能(每次只能发布一个)
node publish.js # 不带参数时打印用法并列出可用技能
脚本对每个技能输出结构化报告:
== 技能: coze-low-code-caller-yashu ==
源目录: <sourceDir>/coze-low-code-caller-yashu
目标目录: <targetDir>/coze-low-code-caller-yashu
已复制 (12):
+ SKILL.md
+ scripts/check_status.js
+ references/bot-api.md
已跳过 (5):
- scripts-backup [原因: 硬黑名单]
- license-key.txt [原因: 硬黑名单]
- 测试用例.md [原因: 不在白名单]
- temp [原因: 不在白名单]
- scripts/node_modules [原因: 硬黑名单(任意层级)]
结果: 成功
.publish-include 文件格式与完整示例见 发布流程与配置参考。
| 脚本 | 功能 |
| ------------------------------- | ------------------------------------------------------------------------ |
| $SKILL_DIR/scripts/publish.js | 按白名单+硬黑名单规则把技能从源目录复制到目标目录,输出已复制/已跳过清单 |
cd 到 $SKILL_DIR/scripts 目录console.error 输出日志.publish-include 文件本身不会被复制到目标目录(在硬黑名单中)config.json(含用户私有路径)不在全局白名单中,不会被发布;只发布 config.default.json 模板| 错误场景 | 错误表现 | 处理方式 |
| ------------------ | -------------------------- | -------------------------------------------------------------------------------- |
| config.json 不存在 | 脚本报错找不到配置 | 从 config.default.json 复制一份为 config.json,填写 sourceDir、targetDir |
| 源技能不存在 | 脚本报错找不到技能目录 | 检查技能名拼写,不带参数运行脚本可列出可用技能 |
| 目标技能目录已存在 | 脚本提示"技能文件夹已存在" | 确认是否需要覆盖;如需重新发布,请先手动删除目标目录下该技能的文件夹 |
| 目标目录不可写 | 脚本报错权限不足 | 检查目标目录权限,关闭占用该目录的程序 |
| 源目录等于目标目录 | 脚本拒绝执行 | 提示源目录不能与目标目录相同 |
| 合法文件被误跳过 | 报告中显示"不在白名单" | 在该技能目录下创建 .publish-include 登记该条目,重新发布 |
content-media
自动启停视频课程录制所需的辅助程序。激活条件:用户消息须包含以下关键词之一:`我要录制视频课程`、`开始录制视频课程`、`准备录课`、`视频课程录完了`、`录课结束`、`停止录制`。
content-media
生成扁平的 SVG 图(架构图、中心辐射图、流程图、简易时序图、思维导图、组织架构图、2×2对比矩阵、时间线、循环图、鱼骨图),也支持把已有 SVG 文件转成 PNG 图片。激活条件(满足任一即可):生成类关键词 `画架构图`、`画中心辐射图`、`画流程图`、`画时序图`、`画思维导图`、`画脑图`、`画组织架构图`、`画树形图`、`画对比矩阵`、`画四象限`、`画时间线`、`画循环图`、`画鱼骨图`、`画因果分析图`;转换类关键词`SVG 转图片`、`把 SVG 转成图片`、`把 SVG 转成 PNG`。
testing
检查指定技能文档中的废话文字并输出诊断报告。激活条件:用户消息须包含以下关键词之一:`检查技能废话`、`这个技能文档有没有多余内容`、`清理技能文档废话`、`审查技能文档废话`、`清理技能文档历史说明`。
testing
评审一个技能是否「自包含」——即其知识、经验、规范是否全部内置在技能文件内(SKILL.md + references/),不依赖特定 AI 客户端专有的知识接口命令(如 read_me / modules: / show_widget / Visualizer)去外部拉取,也不硬编码某个 AI 软件的私有路径(如 .workbuddy)。同时检查工具依赖(node、浏览器、命令行)是否仅作为用户自备工具声明、未写死私有路径。当用户要求「评审这个技能是否自包含 / 独立」「检查技能知识是否内置」「审查技能的独立性 / 可移植性」「audit / review a skill for self-containment」时触发。产出评审报告:结论(自包含 / 不独立)+ 问题清单(文件:行号 + 引用的外部依赖 + 为何影响独立性)+ 整改建议。