redskillhub-upload 1.0.0 → 1.0.2
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 +125 -60
- package/cli/auth.mjs +0 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,100 +1,165 @@
|
|
|
1
|
-
#
|
|
1
|
+
# redskillhub-upload
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
用于将本地 Skill 发布到小红书 SkillHub 的命令行工具。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
CLI 负责完整发布链路:登录授权、本地校验、重新打包、上传、参数确认和最终提交。输入可以是 Skill 目录,也可以是 `.zip` 文件。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 环境要求
|
|
8
|
+
|
|
9
|
+
- Node.js 18 或更高版本
|
|
10
|
+
- macOS
|
|
11
|
+
- Windows(PowerShell / cmd)
|
|
12
|
+
|
|
13
|
+
路径包含空格或中文时,请使用双引号包裹。
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
8
16
|
|
|
9
17
|
```bash
|
|
10
18
|
npm install -g redskillhub-upload
|
|
11
19
|
```
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
确认安装成功:
|
|
14
22
|
|
|
15
|
-
|
|
23
|
+
```bash
|
|
24
|
+
redskillhub-upload whoami
|
|
25
|
+
```
|
|
16
26
|
|
|
17
|
-
##
|
|
27
|
+
## 发布 Skill
|
|
18
28
|
|
|
19
|
-
|
|
29
|
+
发布本地目录:
|
|
20
30
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
| `SUBMIT_SKILL_VERSION` | `/api/sns/v1/openapi/skillhub/submit_skill_version` | `DEFAULT_API_BASE` | 提交 skill 版本 |
|
|
25
|
-
| `CREATE_CLI_OAUTH_DEVICE_CODE` | `/api/sns/v1/creator/red_skill/create_cli_oauth_device_code` | `DEFAULT_API_BASE` | 创建 CLI OAuth 设备码 |
|
|
26
|
-
| `POLL_CLI_OAUTH_DEVICE_TOKEN` | `/api/sns/v1/creator/red_skill/poll_cli_oauth_device_token` | `DEFAULT_API_BASE` | 轮询 CLI OAuth 授权状态 |
|
|
27
|
-
| `EXCHANGE_CLI_OAUTH_TOKEN` | `/api/sns/v1/creator/red_skill/exchange_cli_oauth_token` | `DEFAULT_API_BASE` / `BETA_API_BASE` | 通过 SkillHub 服务端换取 access_token |
|
|
28
|
-
| `REFRESH_CLI_OAUTH_TOKEN` | `/api/sns/v1/creator/red_skill/refresh_cli_oauth_token` | `DEFAULT_API_BASE` / `BETA_API_BASE` | 通过 SkillHub 服务端续期 access_token |
|
|
31
|
+
```bash
|
|
32
|
+
redskillhub-upload publish "/absolute/path/to/skill"
|
|
33
|
+
```
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
- `BETA_API_BASE` = `https://edith.beta.xiaohongshu.com` — beta 业务接口
|
|
32
|
-
- 所有命令都支持 `--env prod|beta`,默认 `prod`;`--env beta` 时业务接口使用 `BETA_API_BASE`
|
|
33
|
-
- prod 沿用 `~/.skillhub-upload`,beta 使用 `~/.skillhub-upload/beta`,凭证、待授权、二维码、标签缓存和临时包相互隔离
|
|
34
|
-
- 业务接口 host 可通过 `--api-base` 参数或 `SKILLHUB_UPLOAD_API_BASE` 环境变量覆盖
|
|
35
|
-
- OAuth token 换取与刷新统一走 SkillHub 服务端 broker,CLI 不保存 appSecret
|
|
35
|
+
发布 ZIP:
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
```bash
|
|
38
|
+
redskillhub-upload publish "/absolute/path/to/skill.zip"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Agent 模式:
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
```bash
|
|
44
|
+
redskillhub-upload publish "/absolute/path/to/skill" --agent
|
|
45
|
+
```
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
2. access_token 过期但 refresh_token 有效:自动调用 `refreshToken` 静默续期后继续发布
|
|
43
|
-
3. 首次登录或 refresh_token 也过期:自动进入设备码 OAuth(`createCliOauthDeviceCode` → 用户授权 → `pollCliOauthDeviceToken` → `exchangeToken`),授权成功后原地继续发布
|
|
47
|
+
`publish` 会自动检查登录状态,无需预先执行 `login` 或 `whoami`。
|
|
44
48
|
|
|
45
|
-
|
|
49
|
+
## 登录授权
|
|
46
50
|
|
|
47
|
-
|
|
51
|
+
首次发布或登录凭证失效时,CLI 会自动进入扫码授权流程:
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+
1. 优先提示使用小红书 App 扫描二维码。
|
|
54
|
+
2. 无法扫码时,使用手机自带浏览器打开授权链接。
|
|
55
|
+
3. 授权成功后,当前发布流程会自动继续。
|
|
56
|
+
|
|
57
|
+
CLI 会复用有效的 access token,并在 refresh token 可用时静默续期。token 换取和刷新统一由 SkillHub 服务端处理,CLI 不保存 appSecret,也不会在正常输出中展示 token 明文。
|
|
58
|
+
|
|
59
|
+
手动登录:
|
|
50
60
|
|
|
51
61
|
```bash
|
|
52
|
-
|
|
53
|
-
npm install
|
|
54
|
-
node cli/index.mjs publish test/fixtures/minimal-skill --dry-run --agent --source original --tag-id 101,102 --yes
|
|
62
|
+
redskillhub-upload login
|
|
55
63
|
```
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
Agent 模式登录:
|
|
58
66
|
|
|
59
|
-
|
|
67
|
+
```bash
|
|
68
|
+
redskillhub-upload login --agent
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
取消正在等待的登录:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
redskillhub-upload login --cancel
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
查看登录状态:
|
|
60
78
|
|
|
61
79
|
```bash
|
|
62
|
-
redskillhub-upload
|
|
63
|
-
redskillhub-upload login --agent --env prod
|
|
64
|
-
redskillhub-upload login --cancel --env prod
|
|
65
|
-
redskillhub-upload tags --env prod
|
|
66
|
-
redskillhub-upload publish "/absolute/path/to/skill" --env prod
|
|
67
|
-
redskillhub-upload publish "/absolute/path/to/skill" --agent --env prod
|
|
68
|
-
redskillhub-upload publish "/absolute/path/to/skill.zip" --agent --env prod
|
|
69
|
-
redskillhub-upload whoami --env prod
|
|
70
|
-
redskillhub-upload logout --env prod
|
|
80
|
+
redskillhub-upload whoami
|
|
71
81
|
```
|
|
72
82
|
|
|
73
|
-
|
|
83
|
+
退出登录:
|
|
74
84
|
|
|
75
85
|
```bash
|
|
76
|
-
redskillhub-upload
|
|
77
|
-
redskillhub-upload tags --env beta
|
|
78
|
-
redskillhub-upload publish "/absolute/path/to/skill" --agent --env beta
|
|
79
|
-
redskillhub-upload whoami --env beta
|
|
80
|
-
redskillhub-upload logout --env beta
|
|
86
|
+
redskillhub-upload logout
|
|
81
87
|
```
|
|
82
88
|
|
|
83
|
-
|
|
89
|
+
## 发布参数
|
|
90
|
+
|
|
91
|
+
查看可用标签:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
redskillhub-upload tags
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
指定原创内容和标签:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
redskillhub-upload publish "/absolute/path/to/skill" --source original --tag "效率工具,内容创作"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
转载内容需要提供来源:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
redskillhub-upload publish "/absolute/path/to/skill" --source repost --repost-source "来源名称" --tag "内容创作"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
只生成并检查待提交数据,不上传或提交:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
redskillhub-upload publish "/absolute/path/to/skill" --dry-run --agent --source original --tag "效率工具"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
真实发布前,CLI 会展示待提交信息并要求明确确认。未收到 `submit` 时不会执行最终提交。
|
|
116
|
+
|
|
117
|
+
## Windows 示例
|
|
118
|
+
|
|
119
|
+
PowerShell 和 cmd 中均使用双引号包裹路径:
|
|
120
|
+
|
|
121
|
+
```powershell
|
|
122
|
+
redskillhub-upload publish "C:\Users\name\path\to\skill" --agent
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
向 Agent 模式写入确认指令:
|
|
84
126
|
|
|
85
127
|
```powershell
|
|
86
|
-
redskillhub-upload publish "C:\Users\name\path\to\skill" --agent --
|
|
87
|
-
node -e "process.stdout.write('submit\n')" | redskillhub-upload publish "C:\Users\name\path\to\skill" --agent --source original --tag "效率工具" --env prod
|
|
128
|
+
node -e "process.stdout.write('submit\n')" | redskillhub-upload publish "C:\Users\name\path\to\skill" --agent --source original --tag "效率工具"
|
|
88
129
|
```
|
|
89
130
|
|
|
90
|
-
## Agent
|
|
131
|
+
## Agent 输出协议
|
|
132
|
+
|
|
133
|
+
Agent 模式通过逐行结构化输出与调用方通信:
|
|
134
|
+
|
|
135
|
+
- `PROMPT:<json>`:需要用户或 Agent 处理的交互信息。
|
|
136
|
+
- `RESULT_JSON:<json>`:命令最终状态和结果。
|
|
137
|
+
- `UPLOAD_PROGRESS:<number>`:上传进度。
|
|
138
|
+
|
|
139
|
+
登录提示中的二维码图片路径位于 `PROMPT.qrCodePath`。Agent 应把该文件作为图片发送给用户,不能只展示本地路径。二维码无法使用时,再展示 `PROMPT.authorizeH5Url`。
|
|
140
|
+
|
|
141
|
+
## 本地包校验
|
|
142
|
+
|
|
143
|
+
CLI 会校验 Skill 目录或 ZIP 内容,并重新生成最终上传包:
|
|
91
144
|
|
|
92
|
-
|
|
145
|
+
- 拒绝符号链接和越界路径。
|
|
146
|
+
- 忽略系统元数据和隐藏文件。
|
|
147
|
+
- 限制文件类型、单文件大小和总包大小。
|
|
148
|
+
- 校验 `SKILL.md` 和必要的元数据。
|
|
149
|
+
- 计算最终 ZIP 的大小与 SHA-256。
|
|
93
150
|
|
|
94
|
-
|
|
95
|
-
- `RESULT_JSON:<json>` reports terminal command state.
|
|
96
|
-
- `UPLOAD_PROGRESS:<number>` reports upload progress.
|
|
151
|
+
用户提供的 ZIP 只作为输入容器,不会被原样上传。
|
|
97
152
|
|
|
98
|
-
|
|
153
|
+
## 本地开发
|
|
99
154
|
|
|
100
|
-
|
|
155
|
+
```bash
|
|
156
|
+
npm install
|
|
157
|
+
npm test
|
|
158
|
+
npm pack --dry-run
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
执行 dry-run:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
node cli/index.mjs publish "/absolute/path/to/skill" --dry-run --agent --source original --tag-id 101,102 --yes
|
|
165
|
+
```
|
package/cli/auth.mjs
CHANGED
|
@@ -427,15 +427,12 @@ export async function login({
|
|
|
427
427
|
throw error;
|
|
428
428
|
}
|
|
429
429
|
|
|
430
|
-
console.log(authorizationCode);
|
|
431
|
-
console.log(codeVerifier);
|
|
432
430
|
const token = await exchangeToken({
|
|
433
431
|
authorizationCode,
|
|
434
432
|
codeVerifier,
|
|
435
433
|
tokenUrl: `${apiBase}${PATHS.EXCHANGE_CLI_OAUTH_TOKEN}`,
|
|
436
434
|
fetchImpl
|
|
437
435
|
});
|
|
438
|
-
console.log(token);
|
|
439
436
|
await writeCredentials(buildCredentialsFromToken(token, now(), 'OAS_TOKEN_EXCHANGE_INVALID_RESPONSE'), env, flags);
|
|
440
437
|
await clearPendingAuth(env, flags);
|
|
441
438
|
return maskCredentials(await readCredentials(env, flags));
|