redskillhub-upload 1.0.0-alpha.7 → 1.0.0
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 +1 -1
- package/cli/auth-prompt.mjs +3 -2
- package/cli/auth.mjs +2 -2
- package/cli/pack.mjs +18 -3
- package/package.json +1 -1
- package/skill/SKILL.md +6 -2
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ All paths and hosts are centralized in `cli/config.mjs` (`PATHS` + `DEFAULT_API_
|
|
|
44
44
|
|
|
45
45
|
`login` / `whoami` 仍保留用于手动登录和状态诊断。
|
|
46
46
|
|
|
47
|
-
设备码响应中的 `authorize_common_url` 专用于生成二维码,`authorize_h5_url`
|
|
47
|
+
设备码响应中的 `authorize_common_url` 专用于生成二维码,`authorize_h5_url` 专用于返回可点击/复制的授权链接。登录时优先提示用户使用小红书 App 扫描二维码;只有无法扫码时,才引导用户使用手机自带浏览器打开 H5 链接。
|
|
48
48
|
|
|
49
49
|
## Local Dry Run
|
|
50
50
|
|
package/cli/auth-prompt.mjs
CHANGED
|
@@ -46,8 +46,9 @@ export async function renderDeviceAuthPrompt(payload, options = {}) {
|
|
|
46
46
|
});
|
|
47
47
|
const minutes = Math.max(1, Math.ceil(Number(payload.expiresInSeconds || 0) / 60));
|
|
48
48
|
stream.write(`${qr}\n`);
|
|
49
|
-
stream.write(
|
|
50
|
-
stream.write(
|
|
49
|
+
stream.write('请使用小红书 App 扫描上方二维码完成授权。\n');
|
|
50
|
+
stream.write('如果无法扫码,请使用手机自带浏览器打开下面的授权链接:\n');
|
|
51
|
+
stream.write(`${authorizeH5Url}\n`);
|
|
51
52
|
stream.write(`授权码:${payload.userCode}\n`);
|
|
52
53
|
stream.write(`有效期:${minutes} 分钟\n`);
|
|
53
54
|
}
|
package/cli/auth.mjs
CHANGED
|
@@ -360,7 +360,7 @@ export async function login({
|
|
|
360
360
|
authorizeH5Url: pending.authorizeH5Url || pending.authorizeUrl,
|
|
361
361
|
userCode: pending.userCode,
|
|
362
362
|
expiresInSeconds: Math.round((pending.expiresAtMs - now()) / 1000),
|
|
363
|
-
message: '
|
|
363
|
+
message: '请使用小红书 App 扫描二维码完成授权;如果无法扫码,再使用手机自带浏览器打开授权链接'
|
|
364
364
|
}, { agent: Boolean(flags.agent), env, flags, stream: promptStream });
|
|
365
365
|
} else {
|
|
366
366
|
const pkce = await createPkcePair();
|
|
@@ -383,7 +383,7 @@ export async function login({
|
|
|
383
383
|
authorizeH5Url: device.authorizeH5Url,
|
|
384
384
|
userCode: device.userCode,
|
|
385
385
|
expiresInSeconds: device.expiresInSeconds || 600,
|
|
386
|
-
message: '
|
|
386
|
+
message: '请使用小红书 App 扫描二维码完成授权;如果无法扫码,再使用手机自带浏览器打开授权链接'
|
|
387
387
|
}, { agent: Boolean(flags.agent), env, flags, stream: promptStream });
|
|
388
388
|
}
|
|
389
389
|
|
package/cli/pack.mjs
CHANGED
|
@@ -82,17 +82,32 @@ const BINARY_EXTENSIONS = new Set([
|
|
|
82
82
|
]);
|
|
83
83
|
const ARCHIVE_EXTENSIONS = new Set(['.zip', '.tar', '.gz', '.rar', '.7z']);
|
|
84
84
|
|
|
85
|
+
function parseFrontmatterScalar(rawValue) {
|
|
86
|
+
const value = rawValue.trim();
|
|
87
|
+
if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(value);
|
|
90
|
+
} catch {
|
|
91
|
+
return value.slice(1, -1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (value.length >= 2 && value.startsWith("'") && value.endsWith("'")) {
|
|
95
|
+
return value.slice(1, -1).replace(/''/g, "'");
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
|
|
85
100
|
export function parseSkillMarkdown(markdown) {
|
|
86
|
-
const match = markdown.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
101
|
+
const match = markdown.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
87
102
|
if (!match) {
|
|
88
103
|
return { frontmatter: {}, detail: markdown.trim() };
|
|
89
104
|
}
|
|
90
105
|
|
|
91
106
|
const frontmatter = {};
|
|
92
|
-
for (const line of match[1].split(
|
|
107
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
93
108
|
const idx = line.indexOf(':');
|
|
94
109
|
if (idx > 0) {
|
|
95
|
-
frontmatter[line.slice(0, idx).trim()] = line.slice(idx + 1)
|
|
110
|
+
frontmatter[line.slice(0, idx).trim()] = parseFrontmatterScalar(line.slice(idx + 1));
|
|
96
111
|
}
|
|
97
112
|
}
|
|
98
113
|
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -47,10 +47,14 @@ node "<SKILL_DIR>/scripts/ensure-cli.mjs" --env <ENV>
|
|
|
47
47
|
2. 执行「CLI 版本门禁」,确保 PATH 中的 `redskillhub-upload` 是允许版本线内的最新包。
|
|
48
48
|
3. 查找用户给出的本地 Skill 目录或 `.zip` 源包。用户只给名称时,先在当前工作区和常见目录查找唯一匹配目录;找不到或多匹配时询问用户绝对路径。zip 只能作为 CLI 输入源包,不能由 agent 解压或代替 CLI 重新打包。
|
|
49
49
|
4. 直接执行下面的「publish 子流程」,不要预先调用 `whoami` 或 `login`。真实 `publish` 会自动复用或刷新已有凭证;首次登录或 refresh token 失效时,会在同一进程中输出授权 `PROMPT`,授权成功后原地继续发布。
|
|
50
|
-
5. 遇到授权 `PROMPT`
|
|
50
|
+
5. 遇到授权 `PROMPT` 时,必须按以下顺序展示:先提示用户使用小红书 App 扫码,再把 `prompt.qrCodePath` 的本地 PNG 展示或发送给用户,最后才提供手机浏览器兜底链接。文字链接使用 `prompt.authorizeH5Url`(兼容字段 `prompt.authorizeUrl` 也是同一 H5 URL)。二维码由 CLI 使用接口的 `authorize_common_url` 生成,Agent 不得自行换字段或重新编码。授权内容必须照抄模板,只替换 `<QR_CODE_IMAGE>`、`<AUTH_URL>`、`<USER_CODE>`、`<MINUTES>`,不增删措辞;不得在二维码之前引导用户打开链接。
|
|
51
51
|
|
|
52
52
|
````markdown
|
|
53
|
-
|
|
53
|
+
请使用小红书 App 扫描下面的二维码完成授权:
|
|
54
|
+
|
|
55
|
+
<QR_CODE_IMAGE>
|
|
56
|
+
|
|
57
|
+
如果无法扫码,请使用手机自带浏览器打开下面的授权链接,打开后会自动跳转到小红书 App 完成授权:
|
|
54
58
|
|
|
55
59
|
```
|
|
56
60
|
<AUTH_URL>
|