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.
Files changed (3) hide show
  1. package/README.md +125 -60
  2. package/cli/auth.mjs +0 -3
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,100 +1,165 @@
1
- # SkillHub Upload CLI
1
+ # redskillhub-upload
2
2
 
3
- Node.js CLI for uploading local Skills to 小红书 SkillHub.
3
+ 用于将本地 Skill 发布到小红书 SkillHub 的命令行工具。
4
4
 
5
- 支持 macOS Windows(PowerShell / cmd)。要求 Node.js 18 或更高版本;包含空格或中文的本地路径应使用双引号包裹。
5
+ CLI 负责完整发布链路:登录授权、本地校验、重新打包、上传、参数确认和最终提交。输入可以是 Skill 目录,也可以是 `.zip` 文件。
6
6
 
7
- Install from the public npm registry:
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
- The CLI owns the executable flow: authorization, local packaging, upload, submit prompts, and final submit. `skill/SKILL.md` is a thin agent workflow that translates chat requests into CLI invocations.
21
+ 确认安装成功:
14
22
 
15
- Publish input can be a local Skill directory or a `.zip` file. User-provided zip archives are unpacked and validated as source containers; the zip uploaded to COS is always regenerated by this CLI after local validation.
23
+ ```bash
24
+ redskillhub-upload whoami
25
+ ```
16
26
 
17
- ## API Endpoints
27
+ ## 发布 Skill
18
28
 
19
- All paths and hosts are centralized in `cli/config.mjs` (`PATHS` + `DEFAULT_API_BASE` / `BETA_API_BASE`).
29
+ 发布本地目录:
20
30
 
21
- | Path Key | Path | Host | Description |
22
- |----------|------|------|-------------|
23
- | `UPLOAD_TOKEN` | `/api/sns/v2/red_skill/upload/permit` | `DEFAULT_API_BASE` | 获取上传授权(COS 临时凭证) |
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
- - `DEFAULT_API_BASE` = `https://edith.xiaohongshu.com` — 生产业务接口
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
- ## Auth Flow
37
+ ```bash
38
+ redskillhub-upload publish "/absolute/path/to/skill.zip"
39
+ ```
40
+
41
+ Agent 模式:
38
42
 
39
- `publish` 会自动保证登录可用,不需要先执行 `whoami` 或 `login`:
43
+ ```bash
44
+ redskillhub-upload publish "/absolute/path/to/skill" --agent
45
+ ```
40
46
 
41
- 1. access_token 有效:直接继续发布
42
- 2. access_token 过期但 refresh_token 有效:自动调用 `refreshToken` 静默续期后继续发布
43
- 3. 首次登录或 refresh_token 也过期:自动进入设备码 OAuth(`createCliOauthDeviceCode` → 用户授权 → `pollCliOauthDeviceToken` → `exchangeToken`),授权成功后原地继续发布
47
+ `publish` 会自动检查登录状态,无需预先执行 `login` 或 `whoami`。
44
48
 
45
- `login` / `whoami` 仍保留用于手动登录和状态诊断。
49
+ ## 登录授权
46
50
 
47
- 设备码响应中的 `authorize_common_url` 专用于生成二维码,`authorize_h5_url` 专用于返回可点击/复制的授权链接。登录时优先提示用户使用小红书 App 扫描二维码;只有无法扫码时,才引导用户使用手机自带浏览器打开 H5 链接。
51
+ 首次发布或登录凭证失效时,CLI 会自动进入扫码授权流程:
48
52
 
49
- ## Local Dry Run
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
- cd tools/redskillhub-upload
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
- Dry-run examples may use numeric tag IDs because the backend contract accepts `contentTagIds`. Multiple tags are comma-separated; `--tag` can also accept display names resolved from the live tag dictionary.
65
+ Agent 模式登录:
58
66
 
59
- ## Commands
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 login --env prod
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
- 所有命令默认使用生产环境。验证 beta 环境时在命令末尾追加 `--env beta`,例如:
83
+ 退出登录:
74
84
 
75
85
  ```bash
76
- redskillhub-upload login --agent --env beta
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
- Windows 路径示例:
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 --env prod
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 Protocol
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
- See `docs/protocol.md` for the line protocol:
145
+ - 拒绝符号链接和越界路径。
146
+ - 忽略系统元数据和隐藏文件。
147
+ - 限制文件类型、单文件大小和总包大小。
148
+ - 校验 `SKILL.md` 和必要的元数据。
149
+ - 计算最终 ZIP 的大小与 SHA-256。
93
150
 
94
- - `PROMPT:<json>` requests user or agent input.
95
- - `RESULT_JSON:<json>` reports terminal command state.
96
- - `UPLOAD_PROGRESS:<number>` reports upload progress.
151
+ 用户提供的 ZIP 只作为输入容器,不会被原样上传。
97
152
 
98
- See `docs/design.md` for the full tool architecture, auth/upload flow, boundaries, and verification plan.
153
+ ## 本地开发
99
154
 
100
- Dry-run never calls external services. Real OAuth, COS upload, and submit adapters are wired; production use depends on the SkillHub OpenAPI endpoints being reachable and configured.
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));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redskillhub-upload",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",