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 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` 专用于返回可点击/复制的授权链接;Agent 模式会同时输出二维码图片路径和 H5 链接。
47
+ 设备码响应中的 `authorize_common_url` 专用于生成二维码,`authorize_h5_url` 专用于返回可点击/复制的授权链接。登录时优先提示用户使用小红书 App 扫描二维码;只有无法扫码时,才引导用户使用手机自带浏览器打开 H5 链接。
48
48
 
49
49
  ## Local Dry Run
50
50
 
@@ -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(`${payload.message}\n`);
50
- stream.write(`授权链接:${authorizeH5Url}\n`);
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: '请用手机自带浏览器打开授权链接,页面会自动跳转至小红书 App 授权;授权页输入授权码后 CLI 会自动轮询'
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('\n')) {
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).trim();
110
+ frontmatter[line.slice(0, idx).trim()] = parseFrontmatterScalar(line.slice(idx + 1));
96
111
  }
97
112
  }
98
113
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redskillhub-upload",
3
- "version": "1.0.0-alpha.7",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
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` 时,必须同时返回二维码图片和链接:把 `prompt.qrCodePath` 的本地 PNG 展示或发送给用户;文字链接使用 `prompt.authorizeH5Url`(兼容字段 `prompt.authorizeUrl` 也是同一 H5 URL)。二维码由 CLI 使用接口的 `authorize_common_url` 生成,Agent 不得自行换字段或重新编码。二维码图片不计入下方文字模板;授权文字必须照抄模板,只替换 `<AUTH_URL>`、`<USER_CODE>`、`<MINUTES>`,不增删措辞。
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
- 请用手机自带浏览器打开下面的授权链接,打开后会自动跳转到小红书 App 完成授权:
53
+ 请使用小红书 App 扫描下面的二维码完成授权:
54
+
55
+ <QR_CODE_IMAGE>
56
+
57
+ 如果无法扫码,请使用手机自带浏览器打开下面的授权链接,打开后会自动跳转到小红书 App 完成授权:
54
58
 
55
59
  ```
56
60
  <AUTH_URL>