dsh-plugin-marketplace 0.3.2 → 0.3.4

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Scorp1o117
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Scorp1o117
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,87 +1,95 @@
1
- # dsh-plugin-marketplace
2
-
3
- [![中文文档](https://img.shields.io/badge/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3-blue)](README.zh.md)
4
-
5
- **GitHub**: [Scorp1o117/dsh-plugin-marketplace](https://github.com/Scorp1o117/dsh-plugin-marketplace) · **npm**: [dsh-plugin-marketplace](https://www.npmjs.com/package/dsh-plugin-marketplace)
6
-
7
- [![Enhancement Suite](https://img.shields.io/badge/part%20of-Enhancement%20Suite-3964fe)](https://github.com/Scorp1o117/dsh-enhancement-suite) [![npm](https://img.shields.io/npm/v/dsh-enhancement-suite)](https://www.npmjs.com/package/dsh-enhancement-suite)
8
-
9
- Part of the [DeepSeek Harness Enhancement Suite](https://github.com/Scorp1o117/dsh-enhancement-suite) — Vision · Soul/Persona · Long-term Memory · Plugin Marketplace.
10
-
11
- A **plugin marketplace** inside the DeepSeek Harness Web UI: browse
12
- [github.com/topics/dsh-plugin](https://github.com/topics/dsh-plugin) right
13
- from the settings page — no terminal needed.
14
-
15
- - **Search** the topic by keyword, **sort** by stars or last update
16
- - **Plugin cards** with description, stars, language, and update date
17
- - **Detail panel**: GitHub README summary, install command, repo/npm links
18
- - **AI explain**: one click asks the configured default model what a plugin
19
- roughly does, answered in the UI — no need to read the README yourself
20
- - Powered by the public GitHub search API (CORS-enabled, no key needed;
21
- unauthenticated rate limit 60 req/h)
22
- - Zero client dependencies (React only), no build step — hand-written
23
- ModuleLoader bundle
1
+ # dsh-plugin-marketplace
2
+
3
+ [![中文文档](https://img.shields.io/badge/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3-blue)](README.zh.md)
4
+
5
+ **GitHub**: [Scorp1o117/dsh-plugin-marketplace](https://github.com/Scorp1o117/dsh-plugin-marketplace) · **npm**: [dsh-plugin-marketplace](https://www.npmjs.com/package/dsh-plugin-marketplace)
6
+
7
+ [![Enhancement Suite](https://img.shields.io/badge/part%20of-Enhancement%20Suite-3964fe)](https://github.com/Scorp1o117/dsh-enhancement-suite) [![npm](https://img.shields.io/npm/v/dsh-enhancement-suite)](https://www.npmjs.com/package/dsh-enhancement-suite)
8
+
9
+ Part of the [DeepSeek Harness Enhancement Suite](https://github.com/Scorp1o117/dsh-enhancement-suite) — Vision · Soul/Persona · Long-term Memory · Plugin Marketplace.
10
+
11
+ A **plugin marketplace** inside the DeepSeek Harness Web UI: browse
12
+ [github.com/topics/dsh-plugin](https://github.com/topics/dsh-plugin) right
13
+ from the settings page — no terminal needed.
14
+
15
+ - **Search** the topic by keyword, **sort** by stars or last update
16
+ - **Plugin cards** with description, stars, language, and update date
17
+ - **Detail panel**: GitHub README summary, install command, repo/npm links
18
+ - **AI explain**: one click asks the configured default model what a plugin
19
+ roughly does, answered in the UI — no need to read the README yourself
20
+ - Powered by the public GitHub search API (CORS-enabled, no key needed;
21
+ unauthenticated rate limit 60 req/h)
22
+ - Zero client dependencies (React only), no build step — hand-written
23
+ ModuleLoader bundle
24
+
25
+ ## Compatibility (v0.3.4)
26
+
27
+ Verified in a DSH `0.1.5-rc.3` (`next`) disposable Web profile; DSH
28
+ `0.1.5-rc.2` remains `latest`. The rc.3 host currently references an
29
+ unpublished `dsh-client-ui-sidebar-documentpreview@0.1.5-rc.3`, so the smoke
30
+ profile temporarily used that unrelated UI package at rc.2. A clean rc.3
31
+ installation is blocked upstream. Alpha releases remain `unknown`.
24
32
 
25
33
  ## Install
26
-
27
- As a profile bundle (recommended):
28
-
29
- ```
30
- dsh plugin --profile web add dsh-plugin-marketplace
31
- ```
32
-
33
- or via the package's `dsh.bundle.patch` layer — add `dsh-plugin-marketplace`
34
- to `dsh.profile.bundles` in `$DSH_HOME/profiles/web/package.json`.
35
-
36
- Manual mount in `$DSH_HOME/profiles/web/cordis.patch.yml`:
37
-
38
- ```yaml
39
- - insert:
40
- - id: plugin-marketplace
41
- name: 'dsh-plugin-marketplace'
42
- ```
43
-
44
- > **Upgrading from ≤ 0.2.2?** If you previously mounted the plugin manually,
45
- > **remove that row from `cordis.patch.yml`** before switching to the bundle
46
- > install — the bundle layer already inserts the entry, and two entries with
47
- > the same id abort boot with `duplicate loader entry id: plugin-marketplace`.
48
- > The two ways are alternatives, not both.
49
-
50
- Then restart `dsh web` (new client plugins require a process restart to be
51
- scanned into the browser roster) and open **Settings → Plugin Marketplace**.
52
-
53
- DSH `0.1.0-rc.7` and newer expose every registered settings namespace, so the
54
- marketplace works without patching official files. Version 0.2.8 and newer
55
- therefore require DSH `0.1.0-rc.7` or newer. DSH `0.1.0-rc.6` users must pin
56
- `dsh-plugin-marketplace@0.2.6`, the last release carrying the legacy
57
- settings-allowlist compatibility patch.
58
-
59
- DSH `0.1.2-rc.1` removed the client-side `connection.api` (the legacy settings
60
- RPC face); version 0.3.1 therefore writes through the bound `settingsScope`'s
61
- own `mutate` (hosts older than `0.1.2-rc.1` still use the legacy channel).
62
- Note: when dsh web is opened from a non-loopback origin (a LAN IP, say), DSH
63
- keeps settings writes process-local, so install / AI-explain requests never
64
- reach the host.
65
-
66
- ## How it works
67
-
68
- | Layer | File | Role |
69
- |---|---|---|
70
- | host shell | `index.js` | settings-backed install + AI-explain flows; `dsh.bundle.patch` makes the package a proper profile bundle |
71
- | browser half | `client.js` | registers the `settings.section` "marketplace" tab; fetches GitHub search API; renders cards + detail; "AI explain" button |
72
- | manifest | `package.json` | `dsh.bundle: { patch: "./cordis.patch.yml" }` + `dsh.client: { platform: "web" }` + `exports["./client"]` — discovered by `dsh-client-modules` |
73
-
74
- The browser half needs no `dsh.client.inject` packages: it only uses `react`
75
- (provided by the web runtime) and the `slots` / `locale` client services.
76
-
77
- ## Notes
78
-
79
- - The GitHub search API returns at most 1000 results; the topic currently has
80
- 280+ repos, so paging covers everything.
81
- - READMEs are fetched per plugin on demand and truncated to ~1200 chars.
82
- - If you see "rate-limited", wait an hour or run the web through a proxy that
83
- adds a GitHub token.
84
-
85
- ## License
86
-
87
- MIT
34
+
35
+ As a profile bundle (recommended):
36
+
37
+ ```
38
+ dsh plugin --profile web add dsh-plugin-marketplace
39
+ ```
40
+
41
+ or via the package's `dsh.bundle.patch` layer — add `dsh-plugin-marketplace`
42
+ to `dsh.profile.bundles` in `$DSH_HOME/profiles/web/package.json`.
43
+
44
+ Manual mount in `$DSH_HOME/profiles/web/cordis.patch.yml`:
45
+
46
+ ```yaml
47
+ - insert:
48
+ - id: plugin-marketplace
49
+ name: 'dsh-plugin-marketplace'
50
+ ```
51
+
52
+ > **Upgrading from ≤ 0.2.2?** If you previously mounted the plugin manually,
53
+ > **remove that row from `cordis.patch.yml`** before switching to the bundle
54
+ > install — the bundle layer already inserts the entry, and two entries with
55
+ > the same id abort boot with `duplicate loader entry id: plugin-marketplace`.
56
+ > The two ways are alternatives, not both.
57
+
58
+ Then restart `dsh web` (new client plugins require a process restart to be
59
+ scanned into the browser roster) and open **Settings → Plugin Marketplace**.
60
+
61
+ DSH `0.1.0-rc.7` and newer expose every registered settings namespace, so the
62
+ marketplace works without patching official files. Version 0.2.8 and newer
63
+ therefore require DSH `0.1.0-rc.7` or newer. DSH `0.1.0-rc.6` users must pin
64
+ `dsh-plugin-marketplace@0.2.6`, the last release carrying the legacy
65
+ settings-allowlist compatibility patch.
66
+
67
+ DSH `0.1.2-rc.1` removed the client-side `connection.api` (the legacy settings
68
+ RPC face); version 0.3.1 therefore writes through the bound `settingsScope`'s
69
+ own `mutate` (hosts older than `0.1.2-rc.1` still use the legacy channel).
70
+ Note: when dsh web is opened from a non-loopback origin (a LAN IP, say), DSH
71
+ keeps settings writes process-local, so install / AI-explain requests never
72
+ reach the host.
73
+
74
+ ## How it works
75
+
76
+ | Layer | File | Role |
77
+ |---|---|---|
78
+ | host shell | `index.js` | settings-backed install + AI-explain flows; `dsh.bundle.patch` makes the package a proper profile bundle |
79
+ | browser half | `client.js` | registers the `settings.section` "marketplace" tab; fetches GitHub search API; renders cards + detail; "AI explain" button |
80
+ | manifest | `package.json` | `dsh.bundle: { patch: "./cordis.patch.yml" }` + `dsh.client: { platform: "web" }` + `exports["./client"]` — discovered by `dsh-client-modules` |
81
+
82
+ The browser half needs no `dsh.client.inject` packages: it only uses `react`
83
+ (provided by the web runtime) and the `slots` / `locale` client services.
84
+
85
+ ## Notes
86
+
87
+ - The GitHub search API returns at most 1000 results; the topic currently has
88
+ 280+ repos, so paging covers everything.
89
+ - READMEs are fetched per plugin on demand and truncated to ~1200 chars.
90
+ - If you see "rate-limited", wait an hour or run the web through a proxy that
91
+ adds a GitHub token.
92
+
93
+ ## License
94
+
95
+ MIT
package/README.zh.md CHANGED
@@ -1,72 +1,89 @@
1
- # dsh-plugin-marketplace
2
-
3
- **GitHub**: [Scorp1o117/dsh-plugin-marketplace](https://github.com/Scorp1o117/dsh-plugin-marketplace) · **npm**: [dsh-plugin-marketplace](https://www.npmjs.com/package/dsh-plugin-marketplace) · [English](README.md)
4
-
5
- [![Enhancement Suite](https://img.shields.io/badge/part%20of-Enhancement%20Suite-3964fe)](https://github.com/Scorp1o117/dsh-enhancement-suite) [![npm](https://img.shields.io/npm/v/dsh-enhancement-suite)](https://www.npmjs.com/package/dsh-enhancement-suite)
6
-
7
- 属于 [DeepSeek Harness Enhancement Suite](https://github.com/Scorp1o117/dsh-enhancement-suite) —— Vision · Soul/Persona · 长期记忆 · 插件市场。
8
-
9
- 在 DeepSeek Harness **Web UI 里内置的插件市场**:直接在设置页浏览
10
- [github.com/topics/dsh-plugin](https://github.com/topics/dsh-plugin),无需打开终端。
11
-
12
- - **搜索**:按关键词搜索主题下的插件,按 Star 或更新时间**排序**
13
- - **插件卡片**:名称、简介、Star 数、语言、更新时间一目了然
14
- - **详情面板**:GitHub README 摘要、安装命令、仓库 / npm 链接
15
- - **AI 解释**:一键调用已配置的默认模型,用中文直接告诉你这个插件大概是干嘛的,不用自己啃 README
16
- - 基于 GitHub 公开搜索 API(浏览器 CORS 直连,无需密钥;未认证限流 60 次/小时)
17
- - 零客户端依赖(只用 React),无构建步骤 —— 手写 ModuleLoader bundle
1
+ # dsh-plugin-marketplace
2
+
3
+ **GitHub**: [Scorp1o117/dsh-plugin-marketplace](https://github.com/Scorp1o117/dsh-plugin-marketplace) · **npm**: [dsh-plugin-marketplace](https://www.npmjs.com/package/dsh-plugin-marketplace) · [English](README.md)
4
+
5
+ [![Enhancement Suite](https://img.shields.io/badge/part%20of-Enhancement%20Suite-3964fe)](https://github.com/Scorp1o117/dsh-enhancement-suite) [![npm](https://img.shields.io/npm/v/dsh-enhancement-suite)](https://www.npmjs.com/package/dsh-enhancement-suite)
6
+
7
+ 属于 [DeepSeek Harness Enhancement Suite](https://github.com/Scorp1o117/dsh-enhancement-suite) —— Vision · Soul/Persona · 长期记忆 · 插件市场。
8
+
9
+ 在 DeepSeek Harness **Web UI 里内置的插件市场**:直接在设置页浏览
10
+ [github.com/topics/dsh-plugin](https://github.com/topics/dsh-plugin),无需打开终端。
11
+
12
+ - **搜索**:按关键词搜索主题下的插件,按 Star 或更新时间**排序**
13
+ - **插件卡片**:名称、简介、Star 数、语言、更新时间一目了然
14
+ - **详情面板**:GitHub README 摘要、安装命令、仓库 / npm 链接
15
+ - **AI 解释**:一键调用已配置的默认模型,用中文直接告诉你这个插件大概是干嘛的,不用自己啃 README
16
+ - 基于 GitHub 公开搜索 API(浏览器 CORS 直连,无需密钥;未认证限流 60 次/小时)
17
+ - 零客户端依赖(只用 React),无构建步骤 —— 手写 ModuleLoader bundle
18
+
19
+ ## 兼容性(v0.3.4)
20
+
21
+ 已在 DSH `0.1.5-rc.3`(`next`)的一次性 Web Profile 中验证;`0.1.5-rc.2`
22
+ 仍是 `latest`。rc.3 宿主目前引用尚未发布的
23
+ `dsh-client-ui-sidebar-documentpreview@0.1.5-rc.3`,烟测仅将这一无关的 UI
24
+ 包临时回退为 rc.2;rc.3 原样安装仍受上游阻塞。alpha 版本继续标记 `unknown`。
18
25
 
19
26
  ## 安装
20
-
21
- 作为 profile bundle 安装(推荐):
22
-
23
- ```
24
- dsh plugin --profile web add dsh-plugin-marketplace
25
- ```
26
-
27
- 或通过包的 `dsh.bundle.patch` 层:把 `dsh-plugin-marketplace` 加进
28
- `$DSH_HOME/profiles/web/package.json` 的 `dsh.profile.bundles`。
29
-
30
- 手动挂载(`$DSH_HOME/profiles/web/cordis.patch.yml`):
31
-
32
- ```yaml
33
- - insert:
34
- - id: plugin-marketplace
35
- name: 'dsh-plugin-marketplace'
36
- ```
37
-
38
- > **从 ≤ 0.2.2 升级?** 如果你之前是手动挂载的,切到 bundle 安装前**先删掉
39
- > `cordis.patch.yml` 里那一行**——bundle 层自己会插入条目,两行同 id 会让启动
40
- > 直接报 `duplicate loader entry id: plugin-marketplace`。两种方式二选一,别同时用。
41
-
42
- 然后重启 `dsh web`(新客户端插件需要重启进程才会被扫描进浏览器清单),打开 **设置 → 插件市场**。
43
-
44
- DSH `0.1.0-rc.7` 起会公开全部已注册的 settings 命名空间,插件市场无需再修改官方文件。
45
- 因此从 `0.2.8` 起最低支持 DSH `0.1.0-rc.7`。仍使用 DSH `0.1.0-rc.6` 的用户
46
- 请锁定 `dsh-plugin-marketplace@0.2.6`;这是最后一个包含旧 settings 白名单兼容
47
- 补丁的版本。
48
-
49
- DSH `0.1.2-rc.1` 移除了客户端的 `connection.api`(旧 settings RPC 入口),
50
- `0.3.1` 起改用 `settingsScope` 自带的 `mutate` 写入(`0.1.2-rc.1` 之前的主机仍走
51
- 旧通道)。注意:非本机回环(如局域网 IP)访问 dsh web 时,DSH 的设置写入是
52
- 进程本地的,安装 / AI 解释请求不会到达宿主。
53
-
54
- ## 实现方式
55
-
56
- | 层 | 文件 | 作用 |
57
- |---|---|---|
58
- | 服务端壳 | `index.js` | settings 通道的安装 + AI 解释流程;`dsh.bundle.patch` 让包成为标准 profile bundle |
59
- | 浏览器端 | `client.js` | 注册 `settings.section` 的 "marketplace" 分区;调用 GitHub 搜索 API;渲染卡片 + 详情;"AI 解释"按钮 |
60
- | 清单 | `package.json` | `dsh.bundle: { patch: "./cordis.patch.yml" }` + `dsh.client: { platform: "web" }` + `exports["./client"]` —— 被 `dsh-client-modules` 扫描发现 |
61
-
62
- 浏览器端不需要任何 `dsh.client.inject` 依赖包:只用 `react`(web 运行时自带)和 `slots` / `locale` 客户端服务。
63
-
64
- ## 备注
65
-
66
- - GitHub 搜索 API 最多返回 1000 条;该主题目前有 280+ 仓库,翻页可以覆盖全部。
67
- - README 按需按插件拉取,截断到约 1200 字符。
68
- - 遇到 "rate-limited":等一小时,或让 web 走带 GitHub token 的代理。
69
-
70
- ## License
71
-
72
- MIT
27
+
28
+ 作为 profile bundle 安装(推荐):
29
+
30
+ ```
31
+ dsh plugin --profile web add dsh-plugin-marketplace
32
+ ```
33
+
34
+ 或通过包的 `dsh.bundle.patch` 层:把 `dsh-plugin-marketplace` 加进
35
+ `$DSH_HOME/profiles/web/package.json` 的 `dsh.profile.bundles`。
36
+
37
+ 手动挂载(`$DSH_HOME/profiles/web/cordis.patch.yml`):
38
+
39
+ ```yaml
40
+ - insert:
41
+ - id: plugin-marketplace
42
+ name: 'dsh-plugin-marketplace'
43
+ ```
44
+
45
+ > **从 ≤ 0.2.2 升级?** 如果你之前是手动挂载的,切到 bundle 安装前**先删掉
46
+ > `cordis.patch.yml` 里那一行**——bundle 层自己会插入条目,两行同 id 会让启动
47
+ > 直接报 `duplicate loader entry id: plugin-marketplace`。两种方式二选一,别同时用。
48
+
49
+ 然后重启 `dsh web`(新客户端插件需要重启进程才会被扫描进浏览器清单),打开 **设置 → 插件市场**。
50
+
51
+ DSH `0.1.0-rc.7` 起会公开全部已注册的 settings 命名空间,插件市场无需再修改官方文件。
52
+ 因此从 `0.2.8` 起最低支持 DSH `0.1.0-rc.7`。仍使用 DSH `0.1.0-rc.6` 的用户
53
+ 请锁定 `dsh-plugin-marketplace@0.2.6`;这是最后一个包含旧 settings 白名单兼容
54
+ 补丁的版本。
55
+
56
+ DSH `0.1.2-rc.1` 移除了客户端的 `connection.api`(旧 settings RPC 入口),
57
+ `0.3.1` 起改用 `settingsScope` 自带的 `mutate` 写入(`0.1.2-rc.1` 之前的主机仍走
58
+ 旧通道)。注意:非本机回环(如局域网 IP)访问 dsh web 时,DSH 的设置写入是
59
+ 进程本地的,安装 / AI 解释请求不会到达宿主。
60
+
61
+ ## 实现方式
62
+
63
+ | 层 | 文件 | 作用 |
64
+ |---|---|---|
65
+ | 服务端壳 | `index.js` | settings 通道的安装 + AI 解释流程;`dsh.bundle.patch` 让包成为标准 profile bundle |
66
+ | 浏览器端 | `client.js` | 注册 `settings.section` 的 "marketplace" 分区;调用 GitHub 搜索 API;渲染卡片 + 详情;"AI 解释"按钮 |
67
+ | 清单 | `package.json` | `dsh.bundle: { patch: "./cordis.patch.yml" }` + `dsh.client: { platform: "web" }` + `exports["./client"]` —— 被 `dsh-client-modules` 扫描发现 |
68
+
69
+ 浏览器端不需要任何 `dsh.client.inject` 依赖包:只用 `react`(web 运行时自带)和 `slots` / `locale` 客户端服务。
70
+
71
+ ## v0.3.3:写入改为校验而非假定
72
+
73
+ `writeField` 在走 settings scope 时只检查了 `snapshot.status === "ready"` 就返回成功。
74
+ 但 scope 的契约是「完成写入与恢复读取后结算」,**被宿主以 `settings/conflict` 拒绝的
75
+ 写入同样会 resolve**——而拒绝之后命名空间依然注册着,恢复读取也会把它重新渲染成
76
+ `ready`,所以这个检查恒真,被拒的写入会被报成成功。
77
+
78
+ 现在改为比对 section 自身的值(`settings-not-applied`),调用方拿到的 `{ok:false}` 才
79
+ 真的代表写入没生效。
80
+
81
+ ## 备注
82
+
83
+ - GitHub 搜索 API 最多返回 1000 条;该主题目前有 280+ 仓库,翻页可以覆盖全部。
84
+ - README 按需按插件拉取,截断到约 1200 字符。
85
+ - 遇到 "rate-limited":等一小时,或让 web 走带 GitHub token 的代理。
86
+
87
+ ## License
88
+
89
+ MIT