@lotaber_wang/openclaw-dc-plugin 0.1.16 → 0.1.17

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
@@ -9,7 +9,7 @@
9
9
  请这样安装:
10
10
 
11
11
  ```bash
12
- openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.16
12
+ openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.17
13
13
  ```
14
14
 
15
15
  不要这样安装:
@@ -67,7 +67,7 @@ openclaw gateway restart
67
67
  ## 推荐安装流程
68
68
 
69
69
  ```bash
70
- openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.16
70
+ openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.17
71
71
  openclaw plugins inspect openclaw-dc-plugin
72
72
  echo 'TapTap DC 插件已安装完成。OpenClaw 接下来如需重启 Gateway,应先通过飞书或其他通信插件通知用户;重启完成后即可使用 taptap_dc_* 工具。'
73
73
  openclaw gateway restart
@@ -77,7 +77,7 @@ openclaw gateway restart
77
77
 
78
78
  - `install` 负责把插件包装进 OpenClaw
79
79
  - `inspect` 用来确认插件元信息、skills、tools 是否已被 Gateway 识别
80
- - 从 `0.1.16` 开始,插件包不再声明 `openclaw` 的 `peerDependencies`,避免误用 `npm install` 时把 OpenClaw 宿主大依赖树一起拉下来
80
+ - 从 `0.1.17` 开始,插件包不再声明 `openclaw` 的 `peerDependencies`,避免误用 `npm install` 时把 OpenClaw 宿主大依赖树一起拉下来
81
81
  - 如果有人误用 `npm install` 或 `npm install -g`,插件包会在 `postinstall` 阶段打印醒目的纠正提示
82
82
  - 如果宿主判断需要重启 Gateway,必须先通过飞书或其他通信插件通知用户,再重启
83
83
  - 如果 10-30 秒后还没生效,再手动执行 `gateway restart`
@@ -147,7 +147,7 @@ openclaw gateway restart
147
147
 
148
148
  如果安装后看不到 `taptap_dc_*` 工具,优先按这个顺序排查:
149
149
 
150
- 1. 确认安装的是 `@lotaber_wang/openclaw-dc-plugin@0.1.16` 或更新版本
150
+ 1. 确认安装的是 `@lotaber_wang/openclaw-dc-plugin@0.1.17` 或更新版本
151
151
  2. 执行 `openclaw plugins inspect openclaw-dc-plugin`
152
152
  3. 如果宿主要求重启 Gateway,先通过飞书或其他通信插件向用户发送安装完成提示
153
153
  4. 再执行 `openclaw gateway restart`
@@ -175,7 +175,7 @@ openclaw gateway restart
175
175
  - OpenClaw 进程是否有临时目录写权限
176
176
  - OpenClaw 是否已经完成 Gateway 重启
177
177
 
178
- 从 `0.1.16` 开始,插件安装链路与 bridge 会额外做这些兼容处理:
178
+ 从 `0.1.17` 开始,插件安装链路与 bridge 会额外做这些兼容处理:
179
179
 
180
180
  - 在 `package.json` 中补充 `openclaw.install.npmSpec`,让安装链路更稳定
181
181
  - 在 `package.json` 的 `openclaw.install` 中补充 `preferredCommand` / `doNotUseCommands` / `wrongInstallHint`
@@ -196,3 +196,4 @@ openclaw gateway restart
196
196
  - 授权结果会把裸授权直链放在最前面,并在 `details.preferred_auth_url` / `details.auth_links` 中重复返回,降低宿主偶发吞链路时的影响
197
197
  - 如果原始 tool 调用直接抛出“缺少认证信息”错误,bridge 也会从错误文本里提取 `wrapped_auth_url`,并补出 `preferred_auth_url`、手机端点击链接,以及“从 code 参数 decodeURIComponent 得到直链”的解析提示
198
198
  - 从这版开始,授权提示会同时保留 `desktop_scan_url` 和 `mobile_click_url`;只要发生转发就默认保留这两条,因为飞书消息也可能在 PC 端打开。同时明确要求在飞书等 IM 中优先使用 markdown 链接格式,避免 `_` 等字符导致裸链接被截断
199
+ - 同时,bridge 会返回 `forward_message_markdown` / `forward_message_autolink` 模板,并显式提示 Agent:禁止把 `[text](url)` 改写成 `**text:** url` 或 HTML
package/index.js CHANGED
@@ -5,7 +5,7 @@ import { TapTapMcpBridge } from './lib/mcp-bridge.js';
5
5
  const RESTART_NOTICE =
6
6
  'TapTap DC 插件已安装完成。OpenClaw 接下来如需重启 Gateway,应先通过飞书或其他通信插件通知用户;重启完成后即可使用 taptap_dc_* 工具。';
7
7
  const PREFERRED_INSTALL_COMMAND =
8
- 'openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.16';
8
+ 'openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.17';
9
9
  const WRONG_INSTALL_HINT =
10
10
  '这是 OpenClaw 插件包,不是普通 npm CLI 包。请不要直接用 npm install,改用 openclaw plugins install。';
11
11
 
@@ -82,6 +82,28 @@ function buildAutolink(url) {
82
82
  return `<${url}>`;
83
83
  }
84
84
 
85
+ function buildExactAuthForwardTemplate(desktopScanUrl, mobileClickUrl) {
86
+ const markdownLines = [];
87
+ const autolinkLines = [];
88
+
89
+ if (desktopScanUrl) {
90
+ markdownLines.push(buildMarkdownLink('PC 扫码授权页', desktopScanUrl));
91
+ autolinkLines.push(buildAutolink(desktopScanUrl));
92
+ }
93
+
94
+ if (mobileClickUrl) {
95
+ markdownLines.push(buildMarkdownLink('手机直接授权', mobileClickUrl));
96
+ autolinkLines.push(buildAutolink(mobileClickUrl));
97
+ }
98
+
99
+ return {
100
+ markdown_lines: markdownLines,
101
+ autolink_lines: autolinkLines,
102
+ markdown_block: markdownLines.join('\n'),
103
+ autolink_block: autolinkLines.join('\n'),
104
+ };
105
+ }
106
+
85
107
  function tryParseUrl(value) {
86
108
  if (!value || typeof value !== 'string') {
87
109
  return null;
@@ -120,6 +142,7 @@ function extractUrlsFromText(value) {
120
142
  function buildAuthLinkParseHint(wrappedAuthUrl, directAuthUrl, preferredAuthUrl) {
121
143
  const desktopScanUrl = wrappedAuthUrl || null;
122
144
  const mobileClickUrl = preferredAuthUrl || directAuthUrl || wrappedAuthUrl || null;
145
+ const forwardTemplate = buildExactAuthForwardTemplate(desktopScanUrl, mobileClickUrl);
123
146
  return {
124
147
  desktop_scan_url: desktopScanUrl,
125
148
  mobile_click_url: mobileClickUrl,
@@ -129,6 +152,10 @@ function buildAuthLinkParseHint(wrappedAuthUrl, directAuthUrl, preferredAuthUrl)
129
152
  mobile_click_markdown: mobileClickUrl
130
153
  ? buildMarkdownLink('手机直接授权', mobileClickUrl)
131
154
  : null,
155
+ forward_message_markdown_lines: forwardTemplate.markdown_lines,
156
+ forward_message_autolink_lines: forwardTemplate.autolink_lines,
157
+ forward_message_markdown: forwardTemplate.markdown_block,
158
+ forward_message_autolink: forwardTemplate.autolink_block,
132
159
  parse_rule:
133
160
  wrappedAuthUrl && directAuthUrl
134
161
  ? '如果只有 wrapped_auth_url,请读取其中的 code 参数,并执行一次 decodeURIComponent(code),得到 direct_auth_url。手机端优先打开 direct_auth_url。'
@@ -137,6 +164,12 @@ function buildAuthLinkParseHint(wrappedAuthUrl, directAuthUrl, preferredAuthUrl)
137
164
  '如果需要转发给用户,默认同时保留 desktop_scan_url 和 mobile_click_url 两条链接;即使是飞书消息也这样处理,因为飞书可能在 PC 端打开。手机端对话时可以额外再单独发一次 mobile_click_url。',
138
165
  lark_render_rule:
139
166
  '飞书或其他 IM 中,转发时默认同时给出 [PC 扫码授权页](desktop_scan_url) 与 [手机直接授权](mobile_click_url) 两条 markdown 链接;如果 markdown 被吞掉,再分别单独发送两行 <URL>。',
167
+ forbidden_rewrites: [
168
+ '**PC 扫码授权页:** URL',
169
+ '**手机直接授权:** URL',
170
+ '<a href="URL">文本</a>',
171
+ '仅保留一条链接',
172
+ ],
140
173
  };
141
174
  }
142
175
 
@@ -364,6 +397,7 @@ function buildAuthGuideText(authPayload) {
364
397
  const qrcodeUrl = enriched?.qrcode_url;
365
398
  const desktopScanUrl = wrappedAuthUrl || qrcodeUrl || null;
366
399
  const mobileClickUrl = preferredAuthUrl || directAuthUrl || wrappedAuthUrl || null;
400
+ const forwardTemplate = buildExactAuthForwardTemplate(desktopScanUrl, mobileClickUrl);
367
401
  const lines = ['当前还没有完成 TapTap 授权,请先完成一次授权。'];
368
402
 
369
403
  if (desktopScanUrl) {
@@ -426,10 +460,31 @@ function buildAuthGuideText(authPayload) {
426
460
  '- 只要发生转发,就默认同时展示 `desktop_scan_url` 和 `mobile_click_url`,不要只保留其中一条,因为飞书也可能在 PC 端打开。',
427
461
  '- 如果当前是手机端对话,可以把 `mobile_click_url` 单独再发一条消息给用户,方便直接点击授权,但仍要保留 `desktop_scan_url`。',
428
462
  '- 通过飞书或其他通信插件转发时,优先使用 markdown 链接格式:`[PC 扫码授权页](desktop_scan_url)` 与 `[手机直接授权](mobile_click_url)`;如果 markdown 被吞掉,再分别发两条仅包含 `<URL>` 的消息。',
463
+ '- 格式强制:必须原样保留 `[文本](URL)` markdown 链接,禁止改写成 `**文本:** URL`、HTML `<a>`,或其它“标题 + 裸 URL”格式。',
429
464
  '- 如果你只拿到了 TapTap 包装授权页(`wrapped_auth_url`),请取其中的 `code` 参数,再执行一次 `decodeURIComponent(code)`,即可得到更适合手机端直接点击的 `direct_auth_url`。',
430
465
  '- 如果宿主把 markdown 链接吞掉了,请直接输出 `details.preferred_auth_url` 这条裸 URL,不要只说“请扫码”。'
431
466
  );
432
467
 
468
+ if (forwardTemplate.markdown_block) {
469
+ lines.push(
470
+ '',
471
+ '请优先原样转发下面这段 markdown,不要自行改写格式:',
472
+ '```md',
473
+ forwardTemplate.markdown_block,
474
+ '```'
475
+ );
476
+ }
477
+
478
+ if (forwardTemplate.autolink_block) {
479
+ lines.push(
480
+ '',
481
+ '如果 markdown 链接在当前宿主里仍然被改写,再退回到下面这段逐行 `<URL>` 文本,同样两条都要保留:',
482
+ '```text',
483
+ forwardTemplate.autolink_block,
484
+ '```'
485
+ );
486
+ }
487
+
433
488
  return lines.join('\n');
434
489
  }
435
490
 
@@ -2,7 +2,7 @@
2
2
  "id": "openclaw-dc-plugin",
3
3
  "name": "TapTap DC",
4
4
  "description": "面向 OpenClaw 的 TapTap DC 插件。请使用 openclaw plugins install 安装,不要直接 npm install;如需重启 Gateway,应先通过飞书或其他通信插件通知用户。",
5
- "version": "0.1.16",
5
+ "version": "0.1.17",
6
6
  "enabledByDefault": true,
7
7
  "skills": ["./skills"],
8
8
  "configSchema": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lotaber_wang/openclaw-dc-plugin",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "type": "module",
5
5
  "description": "TapTap DC 的 OpenClaw 插件。请使用 openclaw plugins install 安装,不要直接 npm install;如需重启 Gateway,应先通过飞书或其他通信插件通知用户。",
6
6
  "main": "index.js",
@@ -13,12 +13,12 @@
13
13
  ],
14
14
  "install": {
15
15
  "npmSpec": "@lotaber_wang/openclaw-dc-plugin",
16
- "preferredCommand": "openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.16",
16
+ "preferredCommand": "openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.17",
17
17
  "doNotUseCommands": [
18
18
  "npm install @lotaber_wang/openclaw-dc-plugin",
19
19
  "npm install -g @lotaber_wang/openclaw-dc-plugin"
20
20
  ],
21
- "wrongInstallHint": "这是 OpenClaw 插件包,不是普通 npm CLI 包。请改用 openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.16。",
21
+ "wrongInstallHint": "这是 OpenClaw 插件包,不是普通 npm CLI 包。请改用 openclaw plugins install @lotaber_wang/openclaw-dc-plugin@0.1.17。",
22
22
  "postInstallMessage": "TapTap DC 插件已安装完成。OpenClaw 接下来如需重启 Gateway,应先通过飞书或其他通信插件通知用户;重启完成后即可使用 taptap_dc_* 工具。",
23
23
  "restartRequired": true,
24
24
  "restartCommand": "openclaw gateway restart",
@@ -1,7 +1,7 @@
1
1
  import process from 'node:process';
2
2
 
3
3
  const PACKAGE_NAME = '@lotaber_wang/openclaw-dc-plugin';
4
- const PACKAGE_VERSION = '0.1.16';
4
+ const PACKAGE_VERSION = '0.1.17';
5
5
  const PREFERRED_COMMAND = `openclaw plugins install ${PACKAGE_NAME}@${PACKAGE_VERSION}`;
6
6
  const DISCOURAGED_COMMANDS = [
7
7
  `npm install ${PACKAGE_NAME}`,
@@ -20,6 +20,9 @@ description: 生成 TapTap 当前游戏 DC 运营简报与结论解读(商店/
20
20
  - 如果用户给了 `app_id`,直接把 `app_id` 传进去
21
21
  2. 如果未授权
22
22
  - `taptap_dc_quick_brief` 会直接返回授权信息,其中最前面的裸链接和 `details.preferred_auth_url` 都应视为首选授权入口
23
+ - 当工具结果里给出 `details.auth_link_parse_hint.forward_message_markdown` 时,优先**原样复用**这段 markdown 发送给用户
24
+ - 禁止把 `[PC 扫码授权页](URL)` / `[手机直接授权](URL)` 改写成 `**PC 扫码授权页:** URL`、`**手机直接授权:** URL`、HTML `<a>`,或任何“标题 + 裸 URL”格式
25
+ - 如果 markdown 链接在当前宿主里仍然会被改写,再退回到 `details.auth_link_parse_hint.forward_message_autolink`,并逐行原样发送 `<URL>`
23
26
  - 如果用户当前在手机上对话,优先引导用户直接点击第一条裸链接,不要先强调扫码
24
27
  - 如果用户当前在桌面端对话,再引导用户打开授权页直链并扫码或转发到手机
25
28
  - 用户确认后调用 `taptap_dc_complete_authorization`
@@ -46,6 +49,10 @@ description: 生成 TapTap 当前游戏 DC 运营简报与结论解读(商店/
46
49
 
47
50
  - 这些 plugin tools 返回的是 **raw JSON**,你要自己完成解读,不要把 JSON 原样长篇贴回给用户
48
51
  - 当授权工具已经返回授权链接时,优先直接复用第一条裸直链;如果文本里链接缺失,就从 `details.preferred_auth_url` 取值,不要直接退化成“去扫二维码”
52
+ - 只要发生转发,就默认同时保留 PC 扫码授权页和手机直接授权两条链接,因为飞书消息也可能在 PC 端打开
53
+ - 如果工具结果里已经给出了 `forward_message_markdown`,必须原样复用,不要自行“优化格式”
54
+ - 严禁把 markdown 链接 `[text](url)` 改写成 `**text:** url`
55
+ - 严禁把 markdown 链接改写成 HTML `<a href="...">text</a>`
49
56
  - `page_view_count` 应写成“详情页访问量(PV)”,不要偷换成别的口径
50
57
  - `taptap_dc_like_review` / `taptap_dc_reply_review` 只能在用户明确确认后调用
51
58
  - 如果回复结果里出现 `need_confirmation=true`,必须先把草稿给用户确认,再决定是否带 `confirm_high_risk=true` 重试