bookmark-research 0.5.0-beta.5 → 0.5.0-beta.7
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/.agents/plugins/marketplace.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +8 -6
- package/README.zh.md +8 -6
- package/bundle.patch.yml +18 -0
- package/docs/bookmark-research-architecture.md +1 -1
- package/docs/distribution.md +1 -1
- package/docs/harness-compatibility.md +7 -5
- package/docs/host-validation.json +42 -0
- package/docs/installation.en.md +10 -1
- package/docs/installation.md +11 -2
- package/docs/release-notes-0.5.0-beta.6.md +30 -0
- package/docs/release-notes-0.5.0-beta.7.md +57 -0
- package/hosts/dsh/package.json +3 -0
- package/hosts/dsh/plugin.js +60 -1
- package/package.json +48 -7
- package/scripts/build_zip.py +1 -0
- package/scripts/export_bundle.py +43 -20
- package/scripts/host_assets.py +4 -0
- package/scripts/host_clients.py +69 -7
- package/scripts/host_install.py +1 -1
- package/scripts/npm_source.py +33 -4
- package/src/bookmark_index.py +230 -23
- package/src/cli.py +84 -4
- package/src/jina.py +2 -1
- package/src/mcp_server.py +41 -10
- package/src/raw_library.py +25 -7
- package/src/release.py +40 -0
- package/src/remote_mcp.py +4 -2
- package/src/research.py +118 -48
- package/src/source_manager.py +105 -0
- package/src/wiki.py +111 -13
package/README.md
CHANGED
|
@@ -22,13 +22,13 @@ Works in **Codex, Claude Code, Pi and DSH (DeepSeek Harness)**.
|
|
|
22
22
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
25
|
-
**Current beta (`0.5.0-beta.
|
|
25
|
+
**Current beta (`0.5.0-beta.7`)**, interactive on macOS, Linux and Windows:
|
|
26
26
|
|
|
27
27
|
```sh
|
|
28
|
-
npx bookmark-research@0.5.0-beta.
|
|
28
|
+
npx bookmark-research@0.5.0-beta.7 install --source npm:bookmark-research@0.5.0-beta.7
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
This pins both the installer and the content. The `@latest` examples below follow the default channel, which remains `0.5.0-beta.3`; `@beta` currently points to `0.5.0-beta.
|
|
31
|
+
This pins both the installer and the content. The `@latest` examples below follow the default channel, which remains `0.5.0-beta.3`; `@beta` currently points to `0.5.0-beta.7`. Changing only the npx selector does not change the installer's default content source.
|
|
32
32
|
|
|
33
33
|
**Default-channel interactive installation:**
|
|
34
34
|
|
|
@@ -51,6 +51,8 @@ For a permanent `bookmark-research` command: `npm install -g bookmark-research`.
|
|
|
51
51
|
|
|
52
52
|
**One release source for all four hosts:** npm contains the shared runtime, Skill and host adapters. The installer downloads the release, prepares the selected host format, then invokes the host’s native commands. Updates retain an npm selector rather than an npx cache path. GitHub hosts source and installation catalogs; unpublished source uses the Python installer. See [distribution policy and official references](docs/distribution.md).
|
|
53
53
|
|
|
54
|
+
**DSH installs the release directly:** the published package declares `dsh.bundle.patch`, so `dsh plugin --profile <name> add bookmark-research@<version>` — or the DSH plugin manager — installs it with no export first, resolving Python and MCP paths from the installed package. DeepSeek Harness Desktop reserves the `desktop` profile for its own carrier, so install that one with the app's CLI. See the [installation guide](docs/installation.en.md).
|
|
55
|
+
|
|
54
56
|
**Windows:** the installer writes the detected Python path into each client's MCP config, because Windows often has no working `python3`. Install Codex with `bookmark-research install codex` rather than adding the repository to Codex directly. `bookmark-research status` shows the interpreter in use.
|
|
55
57
|
|
|
56
58
|
Several at once: `npx bookmark-research@latest install claude dsh --profile web --non-interactive`. Project scope: `--scope project --project /path/to/project` (Claude Code, Pi). All options: [installation guide](docs/installation.en.md).
|
|
@@ -127,7 +129,7 @@ A bundle of one Skill, one local MCP server, and the remote MCPs and services th
|
|
|
127
129
|
| Layer | Component | Runs as | Setup |
|
|
128
130
|
| --- | --- | --- | --- |
|
|
129
131
|
| Skill | [`bookmark-research`](skills/bookmark-research/SKILL.md) and 11 method references, each with a [Chinese copy](skills/bookmark-research/references/zh/skill-guide.md) | Loaded by the client | None |
|
|
130
|
-
| Local MCP | `bookmark-research`,
|
|
132
|
+
| Local MCP | `bookmark-research`, 40 tools (below; the list grows with capabilities) | Python process started by the client | Installed for you |
|
|
131
133
|
| Remote MCPs, called by the local MCP | [Exa](https://exa.ai) (search, page reading), [Parallel](https://parallel.ai) (search, fallback reading), [Tavily](https://tavily.com) (search fallback) | HTTPS, no local process | Optional API keys |
|
|
132
134
|
| HTTP service, called by the local MCP | [Jina Reader](https://jina.ai/reader) (fallback reading; search with a key) | HTTPS | Optional `JINA_API_KEY` |
|
|
133
135
|
| Optional client MCPs | Exa Agent, Parallel Task MCP, Tavily Research | Added to your client by you | `bookmark-research setup` shows the steps |
|
|
@@ -136,12 +138,12 @@ Local MCP tools:
|
|
|
136
138
|
|
|
137
139
|
| Group | Tools |
|
|
138
140
|
| --- | --- |
|
|
139
|
-
| Bookmarks | `sync_package`, `index_status`, `source_history`, `search_bookmarks`, `get_context` |
|
|
141
|
+
| Bookmarks | `sync_package`, `index_status`, `source_history`, `source_remove`, `source_merge`, `search_bookmarks`, `get_context` |
|
|
140
142
|
| Web | `search_web`, `fetch_web`, `search_archive`, `search_providers` |
|
|
141
143
|
| Research | `research_readiness`, `research_start`, `research_status`, `research_search`, `research_fetch`, `research_source`, `research_record`, `research_inventory`, `research_coverage`, `research_import_evidence`, `research_finish`, `research_route` |
|
|
142
144
|
| Research services (optional) | `research_services`, `research_service_prepare`, `_start`, `_status`, `_result`, `_cancel`, `_attach`, `_import` |
|
|
143
145
|
| Settings | `get_settings`, `update_settings` |
|
|
144
|
-
| Wiki and evaluation | `wiki_write`, `wiki_get`, `wiki_list`, `wiki_search`, `wiki_lint`, `evaluate_research` |
|
|
146
|
+
| Wiki and evaluation | `wiki_write`, `wiki_get`, `wiki_list`, `wiki_search`, `wiki_lint`, `wiki_acknowledge`, `evaluate_research` |
|
|
145
147
|
|
|
146
148
|
Tool descriptions: [details](docs/details.en.md#mcp-tools).
|
|
147
149
|
|
package/README.zh.md
CHANGED
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
|
|
23
23
|
## 安装
|
|
24
24
|
|
|
25
|
-
**当前测试版(`0.5.0-beta.
|
|
25
|
+
**当前测试版(`0.5.0-beta.7`)**,支持 macOS、Linux、Windows 交互安装:
|
|
26
26
|
|
|
27
27
|
```sh
|
|
28
|
-
npx bookmark-research@0.5.0-beta.
|
|
28
|
+
npx bookmark-research@0.5.0-beta.7 install --source npm:bookmark-research@0.5.0-beta.7
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
这条命令同时固定安装器和插件内容。下面的 `@latest` 示例使用默认渠道,目前仍为 `0.5.0-beta.3`;`@beta` 当前指向 `0.5.0-beta.
|
|
31
|
+
这条命令同时固定安装器和插件内容。下面的 `@latest` 示例使用默认渠道,目前仍为 `0.5.0-beta.3`;`@beta` 当前指向 `0.5.0-beta.7`。只改 npx 的版本选择,不会改变安装器默认下载的内容来源。
|
|
32
32
|
|
|
33
33
|
**默认渠道的交互安装:**
|
|
34
34
|
|
|
@@ -51,6 +51,8 @@ npx bookmark-research@latest install
|
|
|
51
51
|
|
|
52
52
|
**四个宿主统一发布来源:** npm 包包含共享运行时、Skill 和宿主适配。安装器下载发布包,生成所选宿主格式,再调用宿主原生命令;更新记录 npm 来源,不依赖 npx 临时缓存。GitHub 提供源码和安装清单,未发布源码用 Python 安装器。见[发布约定与官方依据](docs/distribution.md)。
|
|
53
53
|
|
|
54
|
+
**DSH 可直接安装发布包:** 发布包声明 `dsh.bundle.patch`,`dsh plugin --profile <名称> add bookmark-research@<版本>`(或 DSH 插件管理界面)无需先导出即可安装,Python 与 MCP 路径按安装位置解析。DeepSeek Harness 桌面版把 `desktop` profile 保留给自身载体,该 profile 请用桌面版自带 CLI 安装。详见[安装说明](docs/installation.md)。
|
|
55
|
+
|
|
54
56
|
**Windows:** Windows 上常常没有能用的 `python3`,所以安装器会把检测到的 Python 路径写进各宿主的 MCP 配置。Codex 请用 `bookmark-research install codex` 安装,不要直接把仓库加进 Codex。`bookmark-research status` 可以查看实际使用的 Python。
|
|
55
57
|
|
|
56
58
|
一次装多个:`npx bookmark-research@latest install claude dsh --profile web --non-interactive`。装到指定项目:`--scope project --project /path/to/project`(Claude Code、Pi)。全部参数见[安装说明](docs/installation.md)。
|
|
@@ -127,7 +129,7 @@ setup 还会问研究报告和证据放在哪里:统一目录(默认 `<数
|
|
|
127
129
|
| 层 | 组成 | 运行方式 | 需要配置 |
|
|
128
130
|
| --- | --- | --- | --- |
|
|
129
131
|
| Skill | [`bookmark-research`](skills/bookmark-research/SKILL.md) 及 11 份方法参考,每份都有[中文版](skills/bookmark-research/references/zh/skill-guide.md) | 由宿主加载 | 不需要 |
|
|
130
|
-
| 本地 MCP | `bookmark-research`,
|
|
132
|
+
| 本地 MCP | `bookmark-research`,40 个工具(见下表;随能力增长) | 宿主启动的 Python 进程 | 安装器自动完成 |
|
|
131
133
|
| 本地 MCP 调用的远程 MCP | [Exa](https://exa.ai)(搜索、网页读取)、[Parallel](https://parallel.ai)(搜索、备用读取)、[Tavily](https://tavily.com)(备用搜索) | HTTPS,不启动本地进程 | 可选 API Key |
|
|
132
134
|
| 本地 MCP 调用的 HTTP 服务 | [Jina Reader](https://jina.ai/reader)(备用读取;有 Key 时可搜索) | HTTPS | 可选 `JINA_API_KEY` |
|
|
133
135
|
| 可选的宿主 MCP | Exa Agent、Parallel Task MCP、Tavily Research | 需自行加到宿主里 | `bookmark-research setup` 会给出步骤 |
|
|
@@ -136,12 +138,12 @@ setup 还会问研究报告和证据放在哪里:统一目录(默认 `<数
|
|
|
136
138
|
|
|
137
139
|
| 分类 | 工具 |
|
|
138
140
|
| --- | --- |
|
|
139
|
-
| 书签 | `sync_package`、`index_status`、`source_history`、`search_bookmarks`、`get_context` |
|
|
141
|
+
| 书签 | `sync_package`、`index_status`、`source_history`、`source_remove`、`source_merge`、`search_bookmarks`、`get_context` |
|
|
140
142
|
| 网页 | `search_web`、`fetch_web`、`search_archive`、`search_providers` |
|
|
141
143
|
| 研究 | `research_readiness`、`research_start`、`research_status`、`research_search`、`research_fetch`、`research_source`、`research_record`、`research_inventory`、`research_coverage`、`research_import_evidence`、`research_finish`、`research_route` |
|
|
142
144
|
| 专业研究服务(可选) | `research_services`、`research_service_prepare`、`_start`、`_status`、`_result`、`_cancel`、`_attach`、`_import` |
|
|
143
145
|
| 设置 | `get_settings`、`update_settings` |
|
|
144
|
-
| Wiki 与评测 | `wiki_write`、`wiki_get`、`wiki_list`、`wiki_search`、`wiki_lint`、`evaluate_research` |
|
|
146
|
+
| Wiki 与评测 | `wiki_write`、`wiki_get`、`wiki_list`、`wiki_search`、`wiki_lint`、`wiki_acknowledge`、`evaluate_research` |
|
|
145
147
|
|
|
146
148
|
## 更多
|
|
147
149
|
|
package/bundle.patch.yml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# DeepSeek Harness bundle layer. Paths resolve from the installed package through
|
|
2
|
+
# the module's context, so this file is identical in the npm package and in an
|
|
3
|
+
# exported copy; `python` and the forwarded environment come from the module
|
|
4
|
+
# (see hosts/dsh/plugin.js), not from this machine.
|
|
5
|
+
- insert:
|
|
6
|
+
- id: bookmark-research-skill
|
|
7
|
+
name: bookmark-research
|
|
8
|
+
- id: bookmark-research-mcp
|
|
9
|
+
name: '@deepseek-ai/dsh-mcp-client'
|
|
10
|
+
inject: [bookmarkResearchPaths]
|
|
11
|
+
config:
|
|
12
|
+
serverName: bookmark-research
|
|
13
|
+
transport: stdio
|
|
14
|
+
command: !!js ctx.bookmarkResearchPaths.python.command
|
|
15
|
+
args: !!js ctx.bookmarkResearchPaths.mcpArgs
|
|
16
|
+
cwd: !!js ctx.bookmarkResearchPaths.root
|
|
17
|
+
env: !!js ctx.bookmarkResearchPaths.env
|
|
18
|
+
failOnStartupError: true
|
|
@@ -44,7 +44,7 @@ flowchart TB
|
|
|
44
44
|
|
|
45
45
|
subgraph Plugin["Bookmark Research Plugin"]
|
|
46
46
|
Skill["Skill:Markdown 指令<br/>查询方法、研究规则与宿主路由"]
|
|
47
|
-
MCP["本地 MCP 入口<br/>src/mcp_server.py ·
|
|
47
|
+
MCP["本地 MCP 入口<br/>src/mcp_server.py · 工具随能力增长(本版 40 个)"]
|
|
48
48
|
CLI["Python CLI 入口<br/>src/cli.py"]
|
|
49
49
|
Core["共用 Python 运行时<br/>Python 3.9+ 标准库"]
|
|
50
50
|
Sources["来源接入、增量同步与本地查询"]
|
package/docs/distribution.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
发布顺序:修改源码版本并完成 CI,发布已经验证的 npm 包,确认 registry 可取得该版本,再更新 GitHub marketplace 的固定版本。未发布源码不能通过 npm 入口安装;需要先用源码入口测试。
|
|
21
21
|
|
|
22
|
-
测试版使用 npm 的 `beta` 标签;若创建 GitHub 版本说明,则标记为预发布。不会自动移动 npm 的 `latest` 标签。安装测试版时同时固定安装器与内容来源,例如 `npx bookmark-research@0.5.0-beta.
|
|
22
|
+
测试版使用 npm 的 `beta` 标签;若创建 GitHub 版本说明,则标记为预发布。不会自动移动 npm 的 `latest` 标签。安装测试版时同时固定安装器与内容来源,例如 `npx bookmark-research@0.5.0-beta.7 install --source npm:bookmark-research@0.5.0-beta.7`。仅将 npx 改为 `@beta` 不会改变默认内容来源 `latest`;已固定的旧版安装也不会自动换成测试版。
|
|
23
23
|
|
|
24
24
|
## 官方资料与项目实例
|
|
25
25
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# 宿主兼容、工作流与打包
|
|
2
2
|
|
|
3
|
-
更新日期:2026-
|
|
3
|
+
更新日期:2026-10-08。四宿主共用同一 Skill、Python CLI、stdio MCP 和研究档案。当前宿主模型负责规划、搜索/阅读、判断证据、按缺口补查及综合;原生协作支持独立分工。Deep Research 在这条流程上增加持续调查、独立核验、覆盖检查和报告。外部研究 API 可承担具体子问题,缺少它们仍能研究。
|
|
4
4
|
|
|
5
|
-
**正文依据、文件生成、隔离脚本检查、真实 MCP 调用和宿主端到端研究是不同验证层级。**
|
|
5
|
+
**正文依据、文件生成、隔离脚本检查、真实 MCP 调用和宿主端到端研究是不同验证层级。** 本轮在 DSH 桌面版 profile `desktop` 上完成了一次真实安装,并观察到 Skill 注册与 MCP 工具实际应答;Pi 仍未安装,未改全局配置,未启动付费研究模型。具体脚本调用和研究规则见 [宿主工作流参考](../skills/bookmark-research/references/host-workflows.md)。
|
|
6
6
|
|
|
7
7
|
| 宿主 | 协作基础与本插件入口 | 生命周期与限制 |
|
|
8
8
|
| --- | --- | --- |
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
| Claude Code 插件 | `.claude-plugin/plugin.json`;当前文档允许省略 manifest 后按约定发现组件 | 根 `skills/`、`.mcp.json` 或 manifest 配置 | 单独保留 Claude manifest/MCP 配置 |
|
|
59
59
|
| Agent Plugins 1.0.0 标准包 | **根 `plugin.json`**,必填 `$schema` 与 `name` | 固定发现根 `skills/`、`mcp.json` | 从同一源码独立导出标准包 |
|
|
60
60
|
| Pi | `package.json` 的 `pi` 字段,或资源目录约定 | 原生 skills/extensions;MCP 要靠扩展 | `pi.skills`+Skill 调用 CLI;多组任务另登记项目工作流 |
|
|
61
|
-
| DeepSeek Harness(DSH) |
|
|
61
|
+
| DeepSeek Harness(DSH) | 包在 `package.json` 声明 `dsh.bundle.patch`,由 `dsh plugin` 或插件管理器安装;`--patch` 仍可手工加载 Cordis 配置 | 原生 Skill provider;官方 `dsh-mcp-client` 桥接 MCP tools | 发布包自带按安装位置解析的 `bundle.patch.yml`,registry 可直接安装;绝对路径 `cordis.patch.yml` 仅作手工适配 |
|
|
62
62
|
|
|
63
63
|
这些入口不是同一文件的不同别名。符合 Agent Skills 的 `SKILL.md` 和 MCP 协议是主要复用边界;某个客户端能加载 Skill,并不表示它已经支持 Agent Plugins 的根 manifest。[H01][H04][H05][P02][D02]
|
|
64
64
|
|
|
@@ -157,7 +157,9 @@ DSH 的原生运行插件是 Cordis 模块,可导出 `name`、`inject` 和 `ap
|
|
|
157
157
|
|
|
158
158
|
`command` 与 `args` 分开传递。不要在这个 DSH 片段里假设 `${PLUGIN_ROOT}` 会像 Codex/Agent Plugins 一样展开;本轮核实的 MCP 客户端并未定义这种插件根占位符约定。绝对路径片段适合本机 checkout;搬迁或重新安装到其他位置后需要重新生成。DSH 的 patch 文件位置也不会改变模块路径解析所依据的 profile 目录。[D03][D05]
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
发布包现在**自带** `bundle.patch.yml` 并在 `package.json` 声明 `dsh.bundle.patch`,因此 `dsh plugin --profile <name> add bookmark-research@<version>`(以及 DSH 插件管理界面)可以直接从 registry 安装;`dsh` 的 bundle 对账逻辑会把声明了 `dsh.bundle` 且 patch 存在的包自动加入 `dsh.profile.bundles`。层内不写死本机路径:`command`、`args`、`cwd` 与转发的环境变量都由入口模块 `hosts/dsh/plugin.js` 在加载时提供(`bookmarkResearchPaths.python/mcpArgs/env`),模块用与 npm 启动器相同的顺序发现 Python 3.9+/SQLite,所以导出副本、registry 安装和 Windows 都不需要重生成 patch。统一安装器仍导出带校验和的固定副本,用于可验证的托管安装;对不含该文件的旧发布包或旧 Git ref,导出器按模块的旧契约生成等价层,安装不回归。[D02][D03]
|
|
161
|
+
|
|
162
|
+
DSH 桌面版把 profile 名 `desktop` 保留给 Electron 载体:启动器对该名字拒绝一切 boot/dump(`--dump-config` 亦然),只有载体自身可以管理其插件。因此对 `desktop` 的安装须用桌面版自带 CLI(`--dsh "<App>/Contents/Resources/runtime/cli/bin/dsh"`,它自带 pnpm,无需 PATH 中的 pnpm),安装器的验证改为读取持久层:profile 依赖指向该包、`dsh.bundle.patch` 与入口模块按包目录相对解析且文件存在、层内包含 Skill 与 MCP 行。2026-10-08 在本机(macOS、桌面运行时 0.2.0-rc.2、发布包 0.5.0-beta.5)实测:注册后 Skill 出现在宿主目录,`mcp__bookmark-research__*` 工具正常应答,运行中的 MCP 子进程解析到已安装包目录。[D02][D08]
|
|
161
163
|
|
|
162
164
|
导出及查看合并配置的形式是:
|
|
163
165
|
|
|
@@ -166,7 +168,7 @@ python3 scripts/export_bundle.py --format dsh --output /private/tmp/bookmark-res
|
|
|
166
168
|
dsh --profile web --patch /private/tmp/bookmark-research-dsh/cordis.patch.yml --dump-config
|
|
167
169
|
```
|
|
168
170
|
|
|
169
|
-
实际启动可使用 `dsh web --patch
|
|
171
|
+
实际启动可使用 `dsh web --patch <绝对配置路径>`。该手工路线仍属待客户端验证的接入说明,且不覆盖保留的 `desktop` profile。新建任意名称的 profile 默认只有 base bundle;`web` profile 才会按官方模板包含 Web 表面,不应把“创建一个任意 profile”描述成自动创建了完整 Web 应用。[D02][D08]
|
|
170
172
|
|
|
171
173
|
`dsh plugin` 在 profile 目录中通过 pnpm 管理依赖,并把声明了 `dsh.bundle` 的包加入 `dsh.profile.bundles`。没有该声明的 npm 包仍能作为普通依赖安装,但不会自动增加插件配置层。后层 patch 会替换命中行的整个 `config`,不做深度合并。[D02][D08]
|
|
172
174
|
|
|
@@ -294,5 +294,47 @@
|
|
|
294
294
|
"Codex feature state and Claude manifest validation do not prove native tools or account access in an arbitrary session.",
|
|
295
295
|
"Local correlation IDs beginning local: are not native host run IDs."
|
|
296
296
|
]
|
|
297
|
+
},
|
|
298
|
+
"host_install_review": {
|
|
299
|
+
"checked_on": "2026-10-08",
|
|
300
|
+
"host": "dsh",
|
|
301
|
+
"profile": "desktop",
|
|
302
|
+
"runtime_version": "0.2.0-rc.2",
|
|
303
|
+
"package_version": "0.5.0-beta.6",
|
|
304
|
+
"methods": [
|
|
305
|
+
"scripts/install.py install --host dsh --profile desktop with the managed export from this source tree",
|
|
306
|
+
"dsh plugin --profile <throwaway> add <packed release tarball> (registry-equivalent spec)",
|
|
307
|
+
"dsh plugin --profile desktop add bookmark-research@0.5.0-beta.6 (published registry release)"
|
|
308
|
+
],
|
|
309
|
+
"observed": {
|
|
310
|
+
"bundle_selected_into_profile": true,
|
|
311
|
+
"skill_registered_in_host": true,
|
|
312
|
+
"mcp_tools_listed": 37,
|
|
313
|
+
"mcp_child_resolved_to_installed_package": true,
|
|
314
|
+
"composed_rows": [
|
|
315
|
+
"bookmark-research-skill",
|
|
316
|
+
"bookmark-research-mcp"
|
|
317
|
+
],
|
|
318
|
+
"desktop_profile_dump_refused": true,
|
|
319
|
+
"managed_receipt_state": "verified",
|
|
320
|
+
"managed_export_files": 71,
|
|
321
|
+
"unit_tests_passed": 506,
|
|
322
|
+
"temporary_test_profile_removed": true
|
|
323
|
+
},
|
|
324
|
+
"published_release": {
|
|
325
|
+
"version": "0.5.0-beta.6",
|
|
326
|
+
"dist_tag": "beta",
|
|
327
|
+
"tarball_shasum": "7b9a11c7ef89ae9bba442b0b59b9e5ad8d5c0242",
|
|
328
|
+
"tarball_matches_verified_local_build": true,
|
|
329
|
+
"ships_dsh_bundle_layer": true,
|
|
330
|
+
"profile_dependency": "0.5.0-beta.6",
|
|
331
|
+
"installed_as_real_directory": true,
|
|
332
|
+
"bundle_selected_by_dsh": true,
|
|
333
|
+
"mcp_tools_listed_from_installed_copy": 37
|
|
334
|
+
},
|
|
335
|
+
"not_verified": [
|
|
336
|
+
"Windows or Pi installation",
|
|
337
|
+
"the npm cache permission retry on a failing machine (unit-tested only; this machine used npm_config_cache instead)"
|
|
338
|
+
]
|
|
297
339
|
}
|
|
298
340
|
}
|
package/docs/installation.en.md
CHANGED
|
@@ -181,7 +181,16 @@ python3 scripts/install.py install --host dsh --profile web
|
|
|
181
181
|
python3 scripts/install.py verify --host dsh --profile web
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
The installer exports a relocatable `dsh.bundle` and calls `dsh plugin --profile web add PATH`.
|
|
184
|
+
The installer exports a relocatable `dsh.bundle` and calls `dsh plugin --profile web add PATH`. A released package also installs straight from the registry: it declares `dsh.bundle.patch` and ships that layer, so `dsh plugin --profile web add bookmark-research@VERSION` — or the DSH plugin manager — needs no export first. The layer resolves the interpreter, the working directory and the MCP argument list from the installed module, so nothing is tied to the machine that built it; the selected profile must still provide the Skill registry and the official `@deepseek-ai/dsh-mcp-client`.
|
|
185
|
+
|
|
186
|
+
`dsh plugin` delegates to pnpm. A generic CLI therefore needs pnpm on PATH (`npm install -g pnpm` or `corepack enable pnpm`) and the installer stops before creating a profile without it; the DeepSeek Harness Desktop CLI carries its own pnpm and needs none. DeepSeek Harness Desktop reserves the `desktop` profile — its launcher refuses every boot and dump for that name — so install it with the app's own CLI, and verification reads the persisted layer instead of `--dump-config`:
|
|
187
|
+
|
|
188
|
+
```sh
|
|
189
|
+
python3 scripts/install.py install --host dsh --profile desktop \
|
|
190
|
+
--dsh "<DSH app>/Contents/Resources/runtime/cli/bin/dsh"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
The legacy `cordis.patch.yml` still contains absolute paths and requires separate Skill discovery. Workflow execution separately requires the host service/engine; `hosts/dsh/workflow-call.py --research-id RID --run-key KEY` prepares a call without launching it.
|
|
185
194
|
|
|
186
195
|
### Agent Plugins 1.0.0
|
|
187
196
|
|
package/docs/installation.md
CHANGED
|
@@ -237,14 +237,23 @@ pi_subagent_workflow({action:"run",name:"bookmark-research",args:{research_id:"R
|
|
|
237
237
|
|
|
238
238
|
### DSH / DeepSeek Harness
|
|
239
239
|
|
|
240
|
-
所选 DSH profile 需提供 Skill registry 和官方 `@deepseek-ai/dsh-mcp-client
|
|
240
|
+
所选 DSH profile 需提供 Skill registry 和官方 `@deepseek-ai/dsh-mcp-client`。发布包自带 `bundle.patch.yml` 并声明 `dsh.bundle.patch`,因此除统一安装器之外,也可以直接从 registry 安装:`dsh plugin --profile <name> add bookmark-research@VERSION`,或在 DSH 插件管理界面按同一个 spec 安装;DSH 会把声明了 `dsh.bundle` 且 patch 存在的包自动加入 `dsh.profile.bundles`。层内不写死本机路径,Python 解释器、工作目录、MCP 参数与环境转发都由入口模块按安装位置解析。
|
|
241
|
+
|
|
242
|
+
统一安装器生成可搬移的 `dsh.bundle`,调用原生 `dsh plugin --profile web add PATH`,注册 Skill 并从安装后位置解析 Python/MCP 路径:
|
|
241
243
|
|
|
242
244
|
```sh
|
|
243
245
|
python3 scripts/install.py install --host dsh --profile web
|
|
244
246
|
python3 scripts/install.py verify --host dsh --profile web
|
|
245
247
|
```
|
|
246
248
|
|
|
247
|
-
|
|
249
|
+
`dsh plugin` 由 pnpm 执行:通用 CLI 需要 PATH 中的 pnpm(`npm install -g pnpm` 或 `corepack enable pnpm`),缺少时安装器在创建 profile 前停止;DSH 桌面版 CLI 自带 pnpm,无需另装。桌面版把 profile 名 `desktop` 保留给 Electron 载体,其启动器对该名字拒绝 boot/dump,因此用桌面版自带 CLI 安装,验证改为读取持久层而非 `--dump-config`:
|
|
250
|
+
|
|
251
|
+
```sh
|
|
252
|
+
python3 scripts/install.py install --host dsh --profile desktop \
|
|
253
|
+
--dsh "<DSH 应用>/Contents/Resources/runtime/cli/bin/dsh"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
手动分发时使用 `export_bundle.py --format dsh`,再用上述原生命令安装稳定导出目录;不含该层的旧发布包或旧 Git ref 仍会按模块的旧契约生成等价层。保留的旧 `cordis.patch.yml` 仍含绝对路径,需单独配置 Skill 发现;移动后应重新生成。多组研究另需 workflow service、worker-thread engine 和 `workflow` tool。参见 [官方 MCP client 文档](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-client/README.md)。
|
|
248
257
|
|
|
249
258
|
生成可直接传给宿主 `workflow` 工具的完整 JSON:
|
|
250
259
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Bookmark Research 0.5.0 beta 6
|
|
2
|
+
|
|
3
|
+
**Beta / 测试版.** Uses the npm `beta` channel. The npm `latest` tag remains unchanged.
|
|
4
|
+
|
|
5
|
+
## Install this beta
|
|
6
|
+
|
|
7
|
+
Pin both the installer and the plugin content:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npx bookmark-research@0.5.0-beta.6 install --source npm:bookmark-research@0.5.0-beta.6
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Choose Codex, Claude Code, Pi or DSH in the installer. Existing installations retain their recorded source and version selection. The GitHub Codex marketplace advances to this npm version after the registry confirms publication.
|
|
14
|
+
|
|
15
|
+
## Changes
|
|
16
|
+
|
|
17
|
+
- **DSH installs the release directly.** The package now declares `dsh.bundle.patch` and ships `bundle.patch.yml`, so `dsh plugin --profile <name> add bookmark-research@0.5.0-beta.6` — or the DSH plugin manager — installs it with no export step first, and DSH selects the bundle into `dsh.profile.bundles` on its own. Nothing in the layer is tied to the building machine: the entry module supplies the interpreter, working directory, MCP arguments and forwarded environment variables at load time.
|
|
18
|
+
- **No `python3` assumption in the DSH layer.** The module discovers Python 3.9+ with SQLite in the same order as the npm launcher (`BOOKMARK_RESEARCH_PYTHON`, `python3`, `python`, `py -3`) and reports a warning instead of failing silently when none is found, so Windows no longer depends on a `python3` alias.
|
|
19
|
+
- **DSH Desktop's reserved profile is installable.** DeepSeek Harness Desktop refuses to boot or dump the profile name `desktop`, so the installer verifies that profile from the persisted layer (dependency target, package-relative `dsh.bundle.patch`, entry module, Skill and MCP rows) instead of `--dump-config`.
|
|
20
|
+
- **A bundled package manager satisfies the DSH prerequisite.** A CLI that carries its own pnpm — the DeepSeek Harness Desktop CLI does — no longer requires `pnpm` on `PATH`; a generic CLI still fails before creating a profile, with instructions.
|
|
21
|
+
- **Unwritable npm caches are diagnosed and retried.** When npm reports a cache permission failure (for example root-owned files from a privileged install), the download retries once in a scratch cache and otherwise reports the `chown` repair command.
|
|
22
|
+
- **The exported DSH bundle is the released layer.** `export_bundle.py --format dsh` copies the committed `bundle.patch.yml` byte for byte; a source tree that predates the layer (an older published package or Git ref) still exports a working equivalent, so pinned installations do not regress.
|
|
23
|
+
|
|
24
|
+
## Validation and limits
|
|
25
|
+
|
|
26
|
+
The functional diff passed 506 discovered local tests, including new coverage for the released DSH layer, the offline verification of the reserved `desktop` profile, the bundled package manager, and the npm cache retry. A real installation into the DeepSeek Harness Desktop profile (`desktop`, runtime `0.2.0-rc.2`) registered the Skill, listed 37 MCP tools, and resolved the running MCP child to the installed package; a packed release installed in a throwaway profile was selected into `dsh.profile.bundles` automatically.
|
|
27
|
+
|
|
28
|
+
Not verified in this release: Windows and Pi installation, and the cache-retry path on a machine whose npm cache is genuinely unwritable. These are covered by unit tests only. No paid research model was started.
|
|
29
|
+
|
|
30
|
+
Install from [npm](https://www.npmjs.com/package/bookmark-research/v/0.5.0-beta.6). GitHub supplies source, version notes and installation catalogs; npm remains the shared release package for all four hosts.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Bookmark Research 0.5.0 beta 7
|
|
2
|
+
|
|
3
|
+
**Beta / 测试版.** Uses the npm `beta` channel. The npm `latest` tag remains unchanged.
|
|
4
|
+
|
|
5
|
+
## Install this beta
|
|
6
|
+
|
|
7
|
+
Pin both the installer and the plugin content:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npx bookmark-research@0.5.0-beta.7 install --source npm:bookmark-research@0.5.0-beta.7
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Choose Codex, Claude Code, Pi or DSH in the installer. Existing installations retain their recorded source and version selection. The GitHub Codex marketplace advances to this npm version after the registry confirms publication.
|
|
14
|
+
|
|
15
|
+
DSH installs the released layer directly:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
dsh plugin --profile <name> add bookmark-research@0.5.0-beta.7
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Changes
|
|
22
|
+
|
|
23
|
+
### Correctness
|
|
24
|
+
|
|
25
|
+
- **One release-version source.** `src/release.py` reads `package.json`, and the MCP `serverInfo`, the remote client `clientInfo` and both outbound user agents use it. Runtime identity had reported `0.5.0-beta.3` while the manifests said `0.5.0-beta.6`. A regression test fails any build that reintroduces a hardcoded release version outside `release.py`, and asserts that the real handshake matches the manifest.
|
|
26
|
+
- **A copied data directory resolves its own research tasks.** `research-locations.json` carries absolute paths, so a same-machine clone used to read and write the *origin's* task folder even when `--directory` named the clone. The task folder inside the data directory in use now wins, the registry stays the fallback for tasks created beside their input, and a second valid folder for the same id is reported as `location_status: "conflict"` with `alternate_path` instead of being hidden.
|
|
27
|
+
- **The task lock no longer spans a network request.** A provider that answered slowly held the task lock for the whole call, so an independent process recording a finding timed out after ten seconds with a settings-worded error. Reservation, request and commit are now separate: only reserve and commit hold the lock, a mid-request fallback reservation re-reads state under it, and genuine contention returns a retryable "research task is being written by another process".
|
|
28
|
+
- **Every occurrence of a merged body can be enumerated.** `search_archive` truncated a body's occurrences at 50 with no marker and no continuation. Results now carry the true `occurrence_count`, `occurrences_truncated` and `occurrences_next_offset`, and `occurrence_limit` / `occurrence_offset` page through them in a stable order.
|
|
29
|
+
- **A legitimate source change can be resolved.** `source_input_changed` is a warning about the frozen research input version; re-reviewing a page could never clear it. `wiki_write` now accepts `reviewed_input_version`, `wiki acknowledge` records a review without editing content, acknowledgements carry forward while they are still current, and a later source change reopens the warning. `wiki_lint` also reports `severity: "info"` for an acknowledged change instead of leaving only the warning.
|
|
30
|
+
- **`wiki.directory` applies without a restart.** A long-lived stdio server cached the Wiki store built from the directory configured at first use, so `update_settings` appeared to succeed while reads and writes continued against the old location.
|
|
31
|
+
|
|
32
|
+
### Retrieval
|
|
33
|
+
|
|
34
|
+
- **`items_fts` now answers queries.** The shipped FTS table used the default tokenizer, which treats a whole run of CJK characters as one token, so it could not match `推理` inside `推理加速` and the query path used `LIKE` only. The table uses the substring-based **trigram** tokenizer and is rebuilt in place when an existing database is opened. Terms of three or more characters use `MATCH`; one- and two-character terms keep the `LIKE` fallback, because a trigram index cannot answer them. Substring semantics are unchanged (`RAG` still finds `AutoRAG`). When trigram is unavailable the index stays usable and every term falls back to `LIKE`.
|
|
35
|
+
- **Whitespace-separated terms are required together.** A multi-word target was matched as one literal phrase, so `linux.do topic` returned nothing. Each term must now occur; `推理 加速` requires both words.
|
|
36
|
+
- **Canvas text is findable.** Group labels, edge labels and text cards were outside every search field, so asking about "the card labelled 123" returned unrelated short-substring bookmark hits with no sign that `123` was a group label. `search_bookmarks` now reports `canvas_matches` (attributed per target) and states explicitly that they are not bookmark items and never inflate `total`.
|
|
37
|
+
- **Counting guardrails.** A copy anchor reports the shared tree's count, so summing per-card counts over-reported 638 bookmarks as 1239. `context.sections[]` now carries `counted_in_totals` and `anchor_of`, `context.counts` and `search.counts` give instance and unique-URL totals for the scope, `search` warns when the requested card is an anchor, and items report `shown_in_anchors`.
|
|
38
|
+
- **Smaller gaps.** Folders can be enumerated (`item_types` / `--item-type folder`), the synthetic untitled tree root is marked `synthetic` and counted separately as `tree_roots`, `search` returns `next_offset`, `limit=0` / `count_only` returns counts without rows, tag colours are filterable, and Wiki search matches text whose spacing differs from the query (`唯一URL` finds `唯一 URL`).
|
|
39
|
+
|
|
40
|
+
### Operations
|
|
41
|
+
|
|
42
|
+
- **Duplicate imports are no longer silent, and can be undone.** Importing the same canvas from a new folder used to add a second identical source with `warnings: []` and no way back. `sync_package` now reports `duplicate_source_ids` with a warning naming the source to reuse, and `source remove` / `source merge` (MCP `source_remove` / `source_merge`, CLI `source remove` / `source merge`) clean up. Both only report until `confirm: true` / `--confirm` is passed; merge refuses sources whose content versions differ and moves the duplicate's path aliases to the survivor.
|
|
43
|
+
- **`doctor` checks that it can actually write.** An unwritable data directory produced a fully green `doctor` followed by a raw SQLite error from the first import. `doctor.storage` now probes the data directory, the config directory and an existing database, and reports `next_step` with the exact environment variables to set. A read-only failure from any command is rewritten to name `BOOKMARK_RESEARCH_DATA_DIR` and `BOOKMARK_RESEARCH_CONFIG`.
|
|
44
|
+
- **An incomplete DSH install says so.** The DSH entry module preflights `src/cli.py` and the Skill before registering; when either is missing it writes the reason and the reinstall command to stderr and registers nothing, instead of letting the host fail later with a bare `ENOENT`.
|
|
45
|
+
- **`partial` retention is stated up front.** `status` returns `retained_missing_note` when imported files are no longer in the package.
|
|
46
|
+
|
|
47
|
+
## New tools
|
|
48
|
+
|
|
49
|
+
`wiki_acknowledge`, `source_remove` and `source_merge` bring the local MCP surface from 37 to 40 tools. `search_bookmarks` gained `tag_colors`, `item_types` and `count_only`; `search_archive` gained `occurrence_limit` and `occurrence_offset`.
|
|
50
|
+
|
|
51
|
+
## Validation and limits
|
|
52
|
+
|
|
53
|
+
561 discovered local tests pass (three conditional integration tests skipped), up from 506, with new coverage for every change above. Verified end to end on the sample canvas package (638 bookmark instances, 557 unique URLs, 5 sections, 7 canvas nodes, 3 edges): index counts still match an independent parse, the copy anchor is not double counted, `complete` still refuses an incoherent export and keeps the previous index, a fabricated citation is still rejected, and `research_finish` still refuses to claim completion while original URLs are unread.
|
|
54
|
+
|
|
55
|
+
Not verified in this release: Windows and Pi installation; a fresh DSH Desktop profile (the running app still resolves the Skill from a native-install directory that a previous installer created and that no longer exists — restarting the app, or reinstalling into the profile, re-resolves it); ten-thousand-plus URL research budgets; and the still-open items listed in the evaluation report: `context()` N+1 queries, an index time field, and local-only facts entering a research report.
|
|
56
|
+
|
|
57
|
+
Install from [npm](https://www.npmjs.com/package/bookmark-research/v/0.5.0-beta.7). GitHub supplies source, version notes and installation catalogs; npm remains the shared release package for all four hosts.
|
package/hosts/dsh/plugin.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
1
3
|
import { readFile } from "node:fs/promises";
|
|
2
4
|
import { fileURLToPath } from "node:url";
|
|
3
5
|
|
|
@@ -6,6 +8,7 @@ export const inject = ["skills"];
|
|
|
6
8
|
|
|
7
9
|
// The module travels with the Python runtime; no exporting machine's path is embedded.
|
|
8
10
|
const root = fileURLToPath(new URL("../../", import.meta.url));
|
|
11
|
+
const cli = fileURLToPath(new URL("../../src/cli.py", import.meta.url));
|
|
9
12
|
const skillUrl = new URL("../../skills/bookmark-research/SKILL.md", import.meta.url);
|
|
10
13
|
const resourceBase = { kind: "directory", path: fileURLToPath(new URL("./", skillUrl)) };
|
|
11
14
|
const candidate = {
|
|
@@ -20,10 +23,66 @@ const candidate = {
|
|
|
20
23
|
locator: skillUrl,
|
|
21
24
|
};
|
|
22
25
|
|
|
26
|
+
// The MCP child inherits only these variables, so saved data/config paths and
|
|
27
|
+
// provider keys survive without baking values into a published patch. This list
|
|
28
|
+
// must equal the native manifest's mcpServers env_vars; tests assert that parity.
|
|
29
|
+
const FORWARDED_ENV = [
|
|
30
|
+
"BOOKMARK_RESEARCH_DATA_DIR",
|
|
31
|
+
"BOOKMARK_RESEARCH_CONFIG",
|
|
32
|
+
"BOOKMARK_RESEARCH_CREDENTIALS",
|
|
33
|
+
"XDG_DATA_HOME",
|
|
34
|
+
"XDG_CONFIG_HOME",
|
|
35
|
+
"EXA_API_KEY",
|
|
36
|
+
"PARALLEL_API_KEY",
|
|
37
|
+
"TAVILY_API_KEY",
|
|
38
|
+
"JINA_API_KEY",
|
|
39
|
+
"OPENAI_API_KEY",
|
|
40
|
+
"SystemRoot",
|
|
41
|
+
"windir",
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
// The same discovery order as the npm launcher: an explicit interpreter, then
|
|
45
|
+
// the platform aliases, each accepted only with Python 3.9+ and SQLite present.
|
|
46
|
+
const PYTHON_PROBE = "import sys, sqlite3; sys.exit(0 if sys.version_info >= (3, 9) else 3)";
|
|
47
|
+
|
|
48
|
+
function findPython() {
|
|
49
|
+
const candidates = [];
|
|
50
|
+
if (process.env.BOOKMARK_RESEARCH_PYTHON) candidates.push([process.env.BOOKMARK_RESEARCH_PYTHON]);
|
|
51
|
+
candidates.push(["python3"], ["python"]);
|
|
52
|
+
if (process.platform === "win32") candidates.push(["py", "-3"]);
|
|
53
|
+
for (const [command, ...args] of candidates) {
|
|
54
|
+
const probe = spawnSync(command, [...args, "-c", PYTHON_PROBE], { stdio: "ignore", windowsHide: true });
|
|
55
|
+
if (probe.status === 0) return { command, args };
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
23
60
|
export function apply(ctx) {
|
|
61
|
+
let python = findPython();
|
|
62
|
+
if (python === undefined) {
|
|
63
|
+
process.stderr.write("bookmark-research: no Python 3.9+ with SQLite was found; the MCP client will try python3. "
|
|
64
|
+
+ "Set BOOKMARK_RESEARCH_PYTHON to select an interpreter.\n");
|
|
65
|
+
python = { command: "python3", args: [] };
|
|
66
|
+
}
|
|
67
|
+
// Preflight the files this provider advertises. A stale registration used to
|
|
68
|
+
// surface only as an ENOENT when the host tried to load the Skill or start
|
|
69
|
+
// the MCP child, with nothing telling the user how to recover.
|
|
70
|
+
const missing = [cli, fileURLToPath(skillUrl)].filter((path) => !existsSync(path));
|
|
71
|
+
if (missing.length > 0) {
|
|
72
|
+
process.stderr.write("bookmark-research: installation is incomplete; missing " + missing.join(", ") + ".\n"
|
|
73
|
+
+ "Reinstall the plugin (for example: npx --yes --package=bookmark-research@latest bookmark-research install"
|
|
74
|
+
+ " --host dsh) or remove the stale registration that points at a deleted install directory.\n");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const env = Object.fromEntries(FORWARDED_ENV
|
|
78
|
+
.filter((key) => process.env[key] !== undefined)
|
|
79
|
+
.map((key) => [key, process.env[key]]));
|
|
24
80
|
ctx.provide("bookmarkResearchPaths", {
|
|
25
81
|
root,
|
|
26
|
-
cli
|
|
82
|
+
cli,
|
|
83
|
+
python,
|
|
84
|
+
mcpArgs: [...python.args, cli, "serve"],
|
|
85
|
+
env,
|
|
27
86
|
});
|
|
28
87
|
ctx.skills.registerProvider(() => ({
|
|
29
88
|
name,
|
package/package.json
CHANGED
|
@@ -1,12 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bookmark-research",
|
|
3
|
-
"version": "0.5.0-beta.
|
|
3
|
+
"version": "0.5.0-beta.7",
|
|
4
4
|
"description": "Check bookmark URLs or Canvas packages, compare sources with host-led research, and retain verifiable reports.",
|
|
5
5
|
"license": "GPL-3.0-only",
|
|
6
|
-
"repository": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/Browser-bookmark-hub/Bookmark-Research.git"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"bookmark-research",
|
|
12
|
+
"mcp",
|
|
13
|
+
"claude-code",
|
|
14
|
+
"codex",
|
|
15
|
+
"pi-package",
|
|
16
|
+
"deepseek-harness"
|
|
17
|
+
],
|
|
18
|
+
"bin": {
|
|
19
|
+
"bookmark-research": "bin/bookmark-research.js"
|
|
20
|
+
},
|
|
21
|
+
"main": "./hosts/dsh/plugin.js",
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"bin",
|
|
27
|
+
"src",
|
|
28
|
+
"scripts",
|
|
29
|
+
"config",
|
|
30
|
+
"skills",
|
|
31
|
+
"hosts",
|
|
32
|
+
"docs",
|
|
33
|
+
"bundle.patch.yml",
|
|
34
|
+
".codex-plugin/plugin.json",
|
|
35
|
+
".agents/plugins/marketplace.json",
|
|
36
|
+
"install.sh",
|
|
37
|
+
"LICENSE",
|
|
38
|
+
"README.md",
|
|
39
|
+
"README.zh.md",
|
|
40
|
+
"!**/__pycache__",
|
|
41
|
+
"!**/*.pyc"
|
|
42
|
+
],
|
|
43
|
+
"pi": {
|
|
44
|
+
"skills": [
|
|
45
|
+
"./skills"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"dsh": {
|
|
49
|
+
"bundle": {
|
|
50
|
+
"patch": "./bundle.patch.yml"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
12
53
|
}
|