SkillHub 团队 Skill 发布助手
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/letmetry--skillhub-team-publish.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @letmetry/skillhub-team-publish。在 skillhub.cn 网页端自动发布团队 Skill(上传 zip + 填表 + 提交)。首次需人工登录一次,之后用持久化浏览器会话无头自动发布,支持手机远程触发。基于 2026-09-06 真实手动录制还原的选择器,适用于 macOS + 系统 Chrome。支持 –desc 覆盖自动描述。
阅读全文 (展开查看完整说明)
概述
把打包好的 skill zip 自动发布到 skillhub.cn 的团队 Skill 库(团队 Skill 需先在 skillhub.cn 完成入驻)。
前置依赖
- macOS + 系统 Chrome:
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome - Node + Playwright:
~/.workbuddy/binaries/node/workspace/node_modules/playwright - 团队管理员账号:需在 skillhub.cn 完成团队 Skill 入驻并登录(首次登录走腾讯 OneID 手机+短信验证码)。
关键事实(2026-09-05 真实录制,纠正旧误解)
- ❌ 旧记忆「团队登录只能微信扫码」是错的。团队登录 → 授权登录 → 腾讯 OneID 同样支持手机+短信验证码登录,本次录了 3 次全部成功。
- 发布表单有两个
input[type=file]:第 1 个走文件夹(webkitdirectory),第 2 个走 zip。zip 必须选input[type=file][accept*="zip" i](即 nth-of-type(2))。用通用input[type=file]会命中文件夹那个、导致解析失败。 - slug 一旦提交不可改;分类必选(实测漏选分类会导致发布不生效,kvstore 第一次就是卡在这)。
- 描述可点「使用此描述」按钮,从 zip 内 SKILL.md 自动生成,无需手填。
会话模型(核心:一次登录,长期远程复用)
- 登录态保存为明文 cookie JSON:
~/.skillhub-session/cookies.json(由login.cjs通过 Playwright CDPctx.cookies()抓取,已是解密后的明文)。 - publish/keeper 用
chromium.launch(headless)+newContext()+addCookies(json)注入,完全跳过 macOS 上 headless Chrome 无法解密 Keychain cookie 的坑,也避开持久 profile 的残留标签/假阳性。 - ⚠️ 首次必须人工登录一次(腾讯 OneID 有滑块验证,自动化过不了)。之后无需人在电脑旁,手机发指令即可触发发布。
一次性登录(首次 / 会话过期时)
node ~/.workbuddy/skills/skillhub-team-publish/login.cjs打开【可见】Chrome(非持久 context,避开上次残留),停在 /team-skills。你手动走完:团队登录 → 授权登录 → 拖滑块 → 短信验证码 → 勾协议 → Log In。严格判据:必须 /team-skills 页面真的出现「发布团队 Skill」按钮(只有团队管理员登录后才会有,避开 SSO 跳转链上的假阳性)。满足后脚本再等 2.5s 让最后的 Set-Cookie / 重定向落定,然后抓明文 cookie 写到 cookies.json 并关窗。如果 6 分钟内没出现该按钮,脚本超时退出(说明登录没真正完成),不会写 cookie.json——重跑即可。
发布(默认无头,适合远程/手机触发)
node ~/.workbuddy/skills/skillhub-team-publish/publish.cjs
--zip ~/path/skill.zip
--slug my-skill
--name "我的技能"
--category "研发工具"
[--changelog "初始发布"]
[--desc "覆盖用的描述文本"]
[--cookies ~/.skillhub-session/cookies.json]
[--headed] # 可选:显示可见窗口便于观察--desc:覆盖自动描述。默认点「使用此描述」从 zip 内 SKILL.md 自动生成;传--desc会再把它填成你给的文本(1.0.1 新增)。- 脚本无头启动 fresh Chrome、
addCookies(cookies.json)注入会话,直接:进/team-skills→ 校验「发布团队 Skill」按钮 → 点击 → 选「发布 Skill 最快上架」→ 上传 zip → 填 slug/名称 → 选第 1 个预设图标 → 点「使用此描述」→ 选分类 → 点「发布 Skill」→ 跳/enterprise/dashboard判定成功。 - 若 cookie 已失效(无「发布团队 Skill」按钮),打印
SESSION_EXPIRED并退出码 3,不会卡在登录——此时需重跑login.cjs。
每日保活(防会话过期)
node ~/.workbuddy/skills/skillhub-team-publish/keeper.cjs无头 fresh Chrome + addCookies、访问 /team-skills 看「发布团队 Skill」按钮是否还在,打印 KEEPER_STATUS=OK 或 KEEPER_STATUS=EXPIRED。已通过 WorkBuddy 自动化设为每日 09:00 自动运行(详见项目记忆)。EXPIRED 时提醒用户重跑 login.cjs。
完整选择器映射(2026-09-06 真实手动录制 recording.jsonl 校正)
⚠️ slug / 显示名 / 分类等字段没有可用的
name属性,只能靠#id或文本定位;Radix 下拉的
li/checkboxid 每次会话随机,必须按文本选li,不能写死 id。
| 步骤 | 选择器 / 文本 | 备注 |
|---|---|---|
| 登录触发 | header button:has-text("登录") 或 :has-text("发布 Skill") | 未登录时顶栏二者之一 |
| 团队登录 | button:has-text("团队登录") | 文本含 "团队登录 NEW" |
| 授权登录 | button:has-text("授权登录") | 跳腾讯 OneID |
| 手机号 | form.t-form input[type=tel](item1) | 团队管理员注册手机号 |
| 发送验证码 | button:has-text("Send") | |
| 同意协议 | input[type=checkbox](首个) | 不勾 Log In 禁用 |
| 验证码 | form.t-form input[type=text](item2) | 6 位 |
| Log In | button:has-text("Log In") | 登录后跳 /admin?login=success&org_id=<团队ID> |
| 团队技能 | main a:has-text("团队技能") / /team-skills | |
| 发布团队 Skill | button:has-text("发布团队 Skill") | → /enterprise/dashboard/publish |
| 选择发布类型 | button:has-text("发布 Skill 最快上架") | grid 第 1 个(免费最快) |
| 上传 zip | input[type=file][accept*="zip" i] | setInputFiles,绕过系统框;另一个 file input 是 webkitdirectory 文件夹选择,会解析失败 |
| Slug | #skill-slug | 无 name 属性,必须按 id;小写+数字+连字符,提交不可改 |
| 显示名 | #skill-displayName | 无 name 属性,必须按 id |
| 图标 | 未选时 button:has-text("为你的 Skill 选择一个合适的图标") 打开面板 → div.grid button.w-10 img 第 1 个 | 默认选第 1 个预设图标(录制 line 19→21 / 63→64) |
| 描述 | button:has-text("使用此描述") | 表单已从 zip 内 SKILL.md 自动探测到描述,点此采纳(录制 line 25) |
| 分类 | 先点 button:has-text("请选择分类") 等下拉渲染 → 点 li:has-text("研发工具") → 校验 trigger 文本变为已选分类 | 必选;漏选会发布不生效(kvstore 第一次就卡在这);checkbox id 随机按文本选(录制 line 27→29/57) |
| 变更说明 | #skill-changelog | 可选,默认"初始发布"(录制 line 55) |
| 提交 | button:has-text("发布 Skill") 且排除"最快上架" | 跳转 /enterprise/dashboard 即成功(录制 line 37/58) |
⚠️ 关于「Allow remote debugging」对话框(重要)
- 那个浏览器级对话框只出现在 CDP 录屏方案(
recorder_live.cjs/drive_publish.cjs去 attach 你正在运行的 Chrome 的 9222 端口时),自动化点不了,必须人在电脑旁点「Allow」。 - 生产发布路径(
publish.cjs/keeper.cjs/login.cjs)用的是 Playwright 自己起的临时 Chrome 实例,不经过远程调试端口,不会弹那个对话框——所以远程/手机触发发布不受此限制。 - 远程发布的唯一人工门槛是
login.cjs的一次性腾讯 OneID 滑块+短信(之后 cookie JSON 长期复用,keeper 每日保活)。
会话前置(首次必须)
~/.skillhub-session/cookies.json不存在时需先跑一次login.cjs(人工登录,写 cookie)。- 之后
publish.cjs/keeper.cjs才能无头运行;cookie 失效时跑keeper.cjs会打印KEEPER_STATUS=EXPIRED,此时重跑login.cjs。
重录
选择器若失效:node ~/.workbuddy/skills/skillhub-team-publish/recorder.cjs(被动观察器,只记录不驱动,输出到 playwright-recording.jsonl + rec-shots/)。
边界 / TODO
- 自定义图标上传(非预设)未在录制中覆盖,当前默认选第 1 个预设图标。
- 收费 Skill(Pay Skill)需另走 SkillPay 入驻,本 skill 只覆盖免费「最快上架」。