redskillhub-upload 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/cli/auth-prompt.mjs +41 -0
- package/cli/auth.mjs +453 -0
- package/cli/config.mjs +51 -0
- package/cli/errors.mjs +30 -0
- package/cli/fetch.mjs +127 -0
- package/cli/index.mjs +311 -0
- package/cli/output.mjs +15 -0
- package/cli/pack.mjs +494 -0
- package/cli/prompt.mjs +115 -0
- package/cli/redact.mjs +8 -0
- package/cli/submit.mjs +253 -0
- package/cli/tags.mjs +149 -0
- package/cli/upload.mjs +214 -0
- package/package.json +29 -0
- package/skill/SKILL.md +115 -0
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redskillhub-upload
|
|
3
|
+
description: 当用户要求按照 upload.md 将本地 Skill 上传到小红书 SkillHub 时使用。通过 Red Skill Upload CLI 完成授权、打包、上传和提交确认。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# redskillhub-upload
|
|
7
|
+
|
|
8
|
+
## 触发
|
|
9
|
+
|
|
10
|
+
当用户说“按照 https://redskill.xiaohongshu.net/upload.md 把 <skill-name-or-path> 上传到小红书 SkillHub”或提出等价上传请求时,读取 upload.md 指令,并使用本 skill 驱动 `redskillhub-upload` CLI。
|
|
11
|
+
|
|
12
|
+
## 目标流程
|
|
13
|
+
|
|
14
|
+
1. 回复用户:收到。我会在电脑上读取 upload.md 说明,检查 Red Skill CLI 和本地 Skill。
|
|
15
|
+
2. 确认 CLI 可用:优先使用当前仓库的 `tools/redskillhub-upload`,或确认 `redskillhub-upload` 已在 PATH 中。不可用时先说明缺少 CLI。
|
|
16
|
+
3. 查找用户给出的本地 Skill 目录或 `.zip` 源包。用户只给名称时,先在当前工作区和常见目录查找唯一匹配目录;找不到或多匹配时询问用户绝对路径。zip 只能作为 CLI 输入源包,不能由 agent 解压或代替 CLI 重新打包。
|
|
17
|
+
4. 直接执行下面的「publish 子流程」,不要预先调用 `whoami` 或 `login`。真实 `publish` 会自动复用或刷新已有凭证;首次登录或 refresh token 失效时,会在同一进程中输出授权 `PROMPT`,授权成功后原地继续发布。
|
|
18
|
+
5. 遇到授权 `PROMPT` 且存在 `prompt.qrCodePath` 时,先把本地 PNG 作为二维码图片展示或发送给用户,再把授权链接和 `XXXX-XXXX` 用户授权码转成聊天消息。二维码图片不计入下方文字模板;授权文字必须照抄模板,只替换 `<AUTH_URL>`、`<USER_CODE>`、`<MINUTES>`,不增删措辞。
|
|
19
|
+
|
|
20
|
+
````markdown
|
|
21
|
+
请用手机自带浏览器打开下面的授权链接,打开后会自动跳转到小红书 App 完成授权:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
<AUTH_URL>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
授权码:<USER_CODE>
|
|
28
|
+
有效期:<MINUTES> 分钟
|
|
29
|
+
|
|
30
|
+
我会继续等待 CLI 自动完成授权。如果你已经在手机上完成授权但我没有自动响应,你再回复「好了」。
|
|
31
|
+
````
|
|
32
|
+
|
|
33
|
+
6. 正常情况下等待 CLI 轮询完成并在同一 `publish` 进程中自动继续。用户回复”好了”只是兜底唤醒:仅当 CLI 轮询已完成但 agent 没有恢复时使用;进程中断或状态丢失时,重新执行原 `publish` 命令,CLI 会自动从磁盘恢复未完成的授权状态,无需用户重新打开授权链接。
|
|
34
|
+
用户明确要求取消登录等待时,执行 `redskillhub-upload login --cancel`;不要仅终止当前 shell,因为取消命令还会清理待授权状态和二维码。
|
|
35
|
+
7. 所有发布字段值取自用户当前会话答复,不要从 SKILL.md / 目录名 / 文件结构 / 上下文对话推断。
|
|
36
|
+
8. publish 子流程结束后,把 `RESULT_JSON` 的成功结果、失败原因或取消状态如实转述给用户。
|
|
37
|
+
|
|
38
|
+
## publish 子流程
|
|
39
|
+
|
|
40
|
+
固定 4 步,按顺序执行;步骤 1 用 AskUserQuestion 一次性收齐参数,步骤 2-3 把参数全部以 CLI flag 传入,避开 stdin piping。
|
|
41
|
+
|
|
42
|
+
### Step 1 — 一次性收齐 publish 参数
|
|
43
|
+
|
|
44
|
+
(a) 先拉一次实时标签列表,命令:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node -e "import('./cli/tags.mjs').then(({loadContentTags}) => loadContentTags().then(t => console.log(JSON.stringify(t.map(x => x.name)))))"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
(如果跑的是 PATH 上的 `redskillhub-upload` 而非仓库源码,没有 tags.mjs 入口,就直接 curl `https://edith-skillhub.sl.beta.xiaohongshu.com/api/sns/v1/activity_platform/config/query_config?material_id=750&module_id=811` 取 `data[].tagName`。两条路只能挑一条,**不要硬编码标签清单**。)
|
|
51
|
+
|
|
52
|
+
(b) 用 AskUserQuestion 一次发两题:
|
|
53
|
+
|
|
54
|
+
- 「source:原创 / 转载」二选一
|
|
55
|
+
- 「tag:<上一步拉到的中文名数组>」多选,用户可选一个或多个
|
|
56
|
+
|
|
57
|
+
(c) 用户 source 选 `转载` 才追问 `repost_source`(自由文本,最多 15 字符);选 `原创` 直接跳过。
|
|
58
|
+
|
|
59
|
+
### Step 2 — dry-run 出待提交载荷给用户审阅
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
redskillhub-upload publish <absolute-path> --dry-run --agent \
|
|
63
|
+
--source <original|repost> --tag <中文标签名[,中文标签名...]> [--repost-source <来源名>]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
读 `RESULT_JSON.payload`,把关键字段摘出来给用户看:`name`、Skill ID(payload 字段 `skill_identifier`)、`version`、`description`、`original`、`repost_source`、`content_tag_ids`。标签字段展示**中文名列表**,不要只甩 `tagId`。
|
|
67
|
+
|
|
68
|
+
**Skill ID 派生失败的兜底**:如果 dry-run 抛 `Skill ID 为空,无法从名称...或目录名...自动生成,请输入 Skill ID` 错误(名称和目录名都派生不出合法 kebab-case),按以下顺序处理:
|
|
69
|
+
|
|
70
|
+
1. 基于 skill 的 `name` / `description` 语义推一个 kebab-case Skill ID(如「微信读书」→ `weread`,「飞书文档助手」→ `feishu-docs`)
|
|
71
|
+
2. 用 `AskUserQuestion` 给用户「采纳推荐 `<推荐值>` / 自定义其他名字」两个选项
|
|
72
|
+
3. 必须告知用户:**Skill ID 是平台上的 skill 主键,提交后跨版本不可改名**,请慎重
|
|
73
|
+
4. 拿到最终 Skill ID 后追加 `--identifier <值>` 重跑 Step 2
|
|
74
|
+
|
|
75
|
+
### Step 3 — 用户明确说「提交 / 确认 / submit」后真实提交
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
printf 'submit\n' | redskillhub-upload publish <absolute-path> --agent \
|
|
79
|
+
--source <original|repost> --tag <中文标签名[,中文标签名...]> [--repost-source <来源名>]
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
不要带 `--yes`,让 CLI 进 confirm 阶段;`submit\n` 从 stdin 推给它即可。用户说「取消 / cancel」就把第二条命令换成 `printf 'cancel\n' | ...`。用户回复「好了」不能当成提交触发词。
|
|
83
|
+
|
|
84
|
+
该命令会自动检查并恢复登录:凭证有效时直接发布,access token 过期时尝试静默刷新,必须重新授权时输出设备码 `PROMPT`;授权成功后仍由当前进程继续上传和提交,不要另起 `login` 命令。
|
|
85
|
+
|
|
86
|
+
### Step 4 — 转述结果
|
|
87
|
+
|
|
88
|
+
把最终 `RESULT_JSON` 的 `status`(submitted / cancelled / error)+ 关键回执(`skillId` 或错误码 + 文案)发给用户。
|
|
89
|
+
|
|
90
|
+
## CLI 调用约定
|
|
91
|
+
|
|
92
|
+
本 skill 只负责把聊天请求翻译成 CLI 调用,不复制打包、上传、提交逻辑。
|
|
93
|
+
上传入口接受本地 skill 目录或 `.zip` 源包;zip 必须由 CLI 在本地解包、过滤、校验并重新生成上传包,不能由 agent 直接上传或改包。
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
redskillhub-upload publish /absolute/path/to/skill --agent
|
|
97
|
+
redskillhub-upload publish /absolute/path/to/skill.zip --agent
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`redskillhub-upload whoami`、`redskillhub-upload login --agent`、`redskillhub-upload login --cancel` 仅用于诊断、显式预登录或取消等待,不属于标准发布前置步骤。
|
|
101
|
+
|
|
102
|
+
本地验证可使用 dry-run。标签可直接传一个或多个中文名(CLI 内部完成 name→id 映射,多个用逗号分隔),也允许调试时传数字 id:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
node cli/index.mjs publish test/fixtures/minimal-skill --dry-run --agent --source original --tag 效率工具,内容创作 --yes
|
|
106
|
+
# 或调试用:--tag-id 1001,1002
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 禁止事项
|
|
110
|
+
|
|
111
|
+
- 不自行拼授权链接。
|
|
112
|
+
- 不要求用户复制 token、cookie 或 authorization code。
|
|
113
|
+
- 不展示 access token / refresh token。
|
|
114
|
+
- 不代替用户或 CLI 解压、过滤、zip/tar 打包;只把本地 skill 目录或 `.zip` 源包交给 CLI。
|
|
115
|
+
- 不使用浏览器自动化或 `/tmp/skillhub-*` 信号文件。
|