dsh-molbio-tools 0.22.2 → 0.24.1
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/CHANGELOG.md +221 -0
- package/README.md +51 -19
- package/batch.mjs +5 -1
- package/benchmark/README.md +7 -7
- package/benchmark/changed.mjs +4 -3
- package/benchmark/fixtures.mjs +32 -4
- package/benchmark/profile.mjs +1 -1
- package/benchmark/run.mjs +1 -0
- package/benchmark/sequences.mjs +1 -0
- package/benchmark/tasks/02-primers.json +3 -3
- package/benchmark/tasks/06-analysis.json +111 -1
- package/benchmark/tasks/09-formats.json +44 -1
- package/benchmark/verifications.mjs +13 -0
- package/build/client-bundle.mjs +1 -1
- package/build/client-entry.mjs +80 -1
- package/build/panel-core.mjs +85 -0
- package/build/preset-patch.mjs +1 -1
- package/build/release-preflight.mjs +1 -1
- package/charts.mjs +35 -16
- package/contamination.mjs +229 -0
- package/cordis.patch.yml +10 -6
- package/design.mjs +111 -78
- package/docs/capability-gap-survey.md +5 -0
- package/docs/client-panel.md +10 -8
- package/docs/history.md +86 -0
- package/docs/maintainer.md +8 -5
- package/docs/roadmap.md +37 -15
- package/docs/rules.md +5 -2
- package/docs/store-evidence.md +30 -23
- package/docs/store-preset-exemption-issue.md +1 -1
- package/docs/store-preset-exemption.md +1 -1
- package/docs/v24-plan.md +178 -0
- package/docs/workflow.md +11 -10
- package/dotplot.mjs +257 -0
- package/fastq-qc.mjs +31 -16
- package/fastq-trim.mjs +238 -0
- package/host.mjs +2 -2
- package/index.mjs +521 -34
- package/lib/client.js +376 -109
- package/package.json +8 -3
- package/papers.mjs +10 -0
- package/plot.mjs +24 -8
- package/preset/install.mjs +8 -0
- package/preset/molbio-lab/agent.cordis.yml +19 -13
- package/preset/molbio-lab/preset.yml +1 -1
- package/protein-charge.mjs +158 -0
- package/protein-structure.mjs +10 -2
- package/protein.mjs +36 -14
- package/records.mjs +17 -2
- package/seqio.mjs +49 -14
- package/test/charts.mjs +11 -0
- package/test/client.mjs +12 -5
- package/test/contract.mjs +44 -12
- package/test/drift-probe.mjs +15 -1
- package/test/map-card.mjs +139 -1
- package/test/preset-health.mjs +39 -0
- package/test/smoke.mjs +378 -11
package/docs/client-panel.md
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
| **Molbio**(右栏 tab) | 列出会话工作区里的序列文件,选中即画:`.dna`/`.gb`/`.gbk` → 质粒图谱 + 特征表;`.fa`/`.fasta`(≥2 条)→ 序列标识图 | `workspaceFiles.readAll`(二进制,含 SnapGene) |
|
|
14
14
|
| **Papers**(右栏 tab) | 把 `molbio_paper_*` 工具维护的 `papers.json` 渲染成可搜索的阅读列表 + 详情面板(标题/作者/期刊/年份/PMID/URL/标签/笔记,标题链接到 PubMed 或原 URL) | `workspaceFiles.read`(文本) |
|
|
15
15
|
| **图谱调用卡**(`tool.call.toolview`) | `molbio_plasmid_map` / `molbio_plasmid_map_file` 的调用卡:在对话里直接画出这次调用产出的图谱(摘要行 + 写入路径),失败时显示错误文本与 Inspect 入口 | 工具自己声明的 `output.presentationMeta`(见下) |
|
|
16
|
+
| **图形调用卡**(`tool.call.toolview`) | `molbio_sequence_logo` / `molbio_grna_design` 的调用卡:logo 直接画图;gRNA 画 `map_path` 并列出前 5 条 guide(无 map 时仍有摘要与表格) | 同上,kind = `molbio-figure` |
|
|
16
17
|
| **PubMed API key**(`plugins.detail.section`) | 插件 → 已安装插件 → `dsh-molbio-tools` 详情页里的一段表单:password 输入 + Save/Remove,状态只报「已配置 / 来源 / 未配置」,永不回显值 | `ctx.remote.credentials.describe` / `set` / `unset`(host 的凭据 seam) |
|
|
17
18
|
|
|
18
19
|
**解析与渲染全部在浏览器里跑本仓库自己的模块**(`lib/genbank/snapgene/plasmid/msa/logo`),
|
|
@@ -47,11 +48,11 @@ SVG 随 meta 传输有上限(256 KB):真实载体的图谱 20-60 KB,但
|
|
|
47
48
|
| `build/client-bundle-core.mjs` | 打包器的**生成逻辑**(可 import):`createGenerator({entry, baseDir})` → 模块图 + `renderBundle(packageName)`;`test/contract.mjs` 在进程内用它重算产物做新鲜度检查(不 spawn,受限沙箱下也能验证) |
|
|
48
49
|
| `build/browser-api.mjs` | 浏览器安全面:从**包根的 `.mjs` 源文件**再导出面板可用的一切(单一事实来源) |
|
|
49
50
|
| `build/panel-core.mjs` | 面板的数据通路(分类/解码/解析/渲染/文献库投影),不含 React,可在 Node 里单测 |
|
|
50
|
-
| `build/client-entry.mjs` | 浏览器半本体:两个 tab 类型的注册、正文、标题 chip,两个 map 工具的调用卡,以及插件详情页的 key 配置段 |
|
|
51
|
+
| `build/client-entry.mjs` | 浏览器半本体:两个 tab 类型的注册、正文、标题 chip,两个 map 工具与两个 figure 工具的调用卡,以及插件详情页的 key 配置段 |
|
|
51
52
|
| `lib/client.js` | **构建产物**(`exports["./client"]` 指向它;由 `npm run build:client` 生成) |
|
|
52
|
-
| `packages/molbio-panel/` | 面板专用包(宿主半边空实现),面板与
|
|
53
|
+
| `packages/molbio-panel/` | 面板专用包(宿主半边空实现),面板与 64 个工具解耦的交付通道 |
|
|
53
54
|
| `test/client.mjs` | 按加载器的方式执行产物 + 驱动两条数据通路(含真实 pUC118 夹具) |
|
|
54
|
-
| `test/map-card.mjs` |
|
|
55
|
+
| `test/map-card.mjs` | 调用卡的**跨界**检查:地图卡与图形卡(logo/gRNA)的真实投影 → 卡片读取 → 渲染出 SVG(含降级、超限、坏 meta 路径) |
|
|
55
56
|
| `test/client-mount.mjs` | 复刻宿主侧图扫描,证明两个包都能挂上、依赖可解析 |
|
|
56
57
|
|
|
57
58
|
命令:`npm run build:client`(构建)、`npm test`(全部测试)、
|
|
@@ -242,7 +243,7 @@ dsh plugin --profile <profile> add dsh-molbio-tools # 或 npm 包
|
|
|
242
243
|
`/plugins/dsh-molbio-tools/client.js?rev=<hash>` → 页面刷新时按需拉取、物化、执行
|
|
243
244
|
`apply`。**不需要重建 Web 应用**(这正是客户端模块体系的设计目的)。
|
|
244
245
|
|
|
245
|
-
与 preset 渠道共存时:preset 提供
|
|
246
|
+
与 preset 渠道共存时:preset 提供 64 个工具,bundle 提供面板;同名工具由 preset 层
|
|
246
247
|
shadow(无冲突),面板的 `remote`/`slot` 服务不受影响。
|
|
247
248
|
|
|
248
249
|
## 7. 下一步
|
|
@@ -250,10 +251,11 @@ shadow(无冲突),面板的 `remote`/`slot` 服务不受影响。
|
|
|
250
251
|
- **插件详情页的 key 配置**:✅ 已落地(0.22.1,见第 1 与第 4 节)。后续可把同一个
|
|
251
252
|
`plugins.detail.section` 模式用于其它凭据(例如文献库的机构代理),前提是它们也有一个
|
|
252
253
|
稳定的环境变量名。
|
|
253
|
-
- **`tool.call.toolview`**:✅ 已落地(见第 1 与第 3 节),覆盖两个 map
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
0.7.1 的卡片因为裸 `register()` 抢座位而让 GUI
|
|
254
|
+
- **`tool.call.toolview`**:✅ 已落地(见第 1 与第 3 节),覆盖两个 map 工具与
|
|
255
|
+
`molbio_sequence_logo` / `molbio_grna_design`(0.23.0,`molbio-figure` 投影)。
|
|
256
|
+
后续可考虑把同样的卡片给 `molbio_dotplot` 等新画图工具。**任何新卡片上线前先跑
|
|
257
|
+
`test/client.mjs` 的抢座位顺序那一层**:0.7.1 的卡片因为裸 `register()` 抢座位而让 GUI
|
|
258
|
+
起不来(0.7.2 修复,见 §4 第一条);`contract` 会从产物里的 key 表反推投影数。
|
|
257
259
|
- **文献库写回**(可选):若要面板内编辑笔记/标签,需要先定义与 `molbio_paper_*` 工具
|
|
258
260
|
一致的并发契约(乐观版本号或串行化队列),或让工具走同一条 RPC。
|
|
259
261
|
- **上游提案(路径 B)**:preset 渠道挂 client 仍是真实生态需求,可以在社区反馈时
|
package/docs/history.md
CHANGED
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
| 包版本 | preset 版本 | 内容 | 工具数 |
|
|
18
18
|
| --- | --- | --- | --- |
|
|
19
|
+
| 0.24.1 | — | **输入边界与数据安全加固**:BibTeX 不再覆盖文献库、相对读取按会话工作区、批量/glob/并发声明修复、20 万行输入不再 `RangeError`;工具数不变 | 64 |
|
|
20
|
+
| 0.24.0 | — | **数据卫生版**:新增 `molbio_contamination_screen`(内置载体/接头短签名,双链、0–2 错配)与 `molbio_fastq_trim`(质量/接头/引物/poly/N/长度,写 FASTQ/FASTA);修 FASTQ QC 接头表 Small RNA 5' 的 RNA→DNA 静默错 | 62 → 64 |
|
|
21
|
+
| 0.23.0 | — | **2.0 遗留修复 + 2.9a 调用卡 + 两个候选池工具**:跨内含子引物报告真实反向分子(F 在 R 上游)、logo/gRNA 调用卡、`molbio_protein_charge`、`molbio_dotplot`;同版完成 **DSH 0.2.2-rc.1 适配**(删掉上游已移除的 `list-agents` 子路径行、subagent 模型选择改用新键、守卫补上 specifier 解析) | 60 → 62 |
|
|
19
22
|
| 0.22.2 | — | **DSH 0.2.1-rc.5 适配**:基线 rc.3 → rc.5(上游 standard 逐字节未变);contract 声明守卫兼容桌面版裁掉 `lib/types` 的打包形态(+突变自检);engines.node 与 CI 降到 24 | 60 |
|
|
20
23
|
| 0.22.1 | — | **PubMed key 改走 DSH 凭据库**:解析顺序 `api_key` → 凭据库 → 环境变量;无凭据库时行为同 0.22.0 | 60 |
|
|
21
24
|
| 0.22.0 | — | **DSH 0.2.1-rc.3 适配 + PubMed 官方 API**:`molbio_pubmed_search`/`_abstract` 支持 NCBI API key(E-utilities),无 key 行为不变 | 60 |
|
|
@@ -47,6 +50,89 @@
|
|
|
47
50
|
|
|
48
51
|
---
|
|
49
52
|
|
|
53
|
+
## v0.24.1(2026-11-08,包 0.24.1)
|
|
54
|
+
|
|
55
|
+
**三条教训,都是“合法输入 + 默认路径”才会暴露的错。**
|
|
56
|
+
|
|
57
|
+
**(1) “自定义文件名”不能等于“库文件本身”。** `molbio_paper_export_bibtex` 的默认输出是
|
|
58
|
+
`path.replace(/\.json$/i, '.bib')`;当用户传 `file: refs.txt` 时这个替换是 no-op,
|
|
59
|
+
于是导出的 BibTeX **直接覆盖文献库**。修法不是拒绝 `refs.txt`,而是先判断 `.json` 是否存在,
|
|
60
|
+
不存在就追加 `.bib`。教训:**默认值必须是“另一个文件”的证明**,不能依赖字符串替换恰好命中。
|
|
61
|
+
|
|
62
|
+
**(2) 用户规模数组不能 spread 进 `Math.min`/`Math.max`。** 图表接受 200,000 行、
|
|
63
|
+
FASTQ QC 接受约 200,000 条 reads,而 `Math.min(...values)` 在这些规模上会以
|
|
64
|
+
`RangeError` 失败;错误发生在参数个数上限,不是算法。现在所有可能跟随输入增长的极值
|
|
65
|
+
都用循环;固定的 64 项密码子表之类仍可 spread。教训:**先问数组的上界是谁定的**,再决定写法。
|
|
66
|
+
|
|
67
|
+
**(3) `safe` 声明要照着“默认写入”写,不是照着“参数是否为空”写。** 四个画图工具在
|
|
68
|
+
`output_path` 省略时仍会写默认 SVG,旧谓词却返回 `true`;并发调用会互相覆盖文件。
|
|
69
|
+
同样的问题在 `molbio_fasta_fastq extract` 带 `output_path` 时也存在。教训:**并发安全
|
|
70
|
+
是“这次调用碰不碰共享状态”,默认值也算碰。**
|
|
71
|
+
|
|
72
|
+
**顺带记录**:两个客户端产物因 `seqio.mjs` / `protein-structure.mjs` 改动而重建,
|
|
73
|
+
面板包按仓库规则 `0.1.9 → 0.1.10`;工具数保持 64,preset 行清单与 DSH 基线不变。
|
|
74
|
+
`benchmark-changed` 的 POSIX 路径断言在本地沙箱因 Node 无法 spawn `git` 未执行,CI 会执行。
|
|
75
|
+
|
|
76
|
+
## v0.24.0(2026-11-05,包 0.24.0)
|
|
77
|
+
|
|
78
|
+
**三条教训,都关于“表/边界看起来对、实际不对”。**
|
|
79
|
+
|
|
80
|
+
**(1) 接头表是 RNA,reads 是 DNA。** `fastq-qc.mjs` 的 Illumina Small RNA 5' 条目一直是
|
|
81
|
+
`GUUCAG…`(RNA,含 U),而 `adapterContent` 直接拿它去 DNA reads 里做 `indexOf`。正向分子
|
|
82
|
+
永远匹配不上,只有它的反向互补能命中,所以旧测试/使用中会看到“接头只报一半”。这不是算法错,
|
|
83
|
+
是**数据表示**错:现在表放在 `contamination.mjs` 并以 DNA 形式定义(U→T),`fastq-qc` 只是
|
|
84
|
+
导入/再导出;smoke 用正向与反向互补两条 read 断言两者都命中。
|
|
85
|
+
|
|
86
|
+
**(2) 短签名筛查必须把“不是数据库”写进输出。** 内置表能回答“有没有 pUC/pET/attB/Illumina
|
|
87
|
+
接头”,但不能回答“有没有未知载体”。描述、README 与 render 都写明:命中是线索,**未命中
|
|
88
|
+
不等于干净**;默认 exact,`max_mismatches` 才启用 seed-and-verify(不扫描每个窗口)。
|
|
89
|
+
|
|
90
|
+
**(3) 修剪工具的价值在“顺序与边界”,不在旋钮数量。** `molbio_fastq_trim` 固定 5' 引物 →
|
|
91
|
+
3' 接头 → 3' 质量尾 → poly 尾 → 长度/N 的顺序,并把每个阶段的计数与条件回显在 `criteria` 里。
|
|
92
|
+
不做 paired-end merge、semiglobal adapter alignment、UMI;这些另开工具比塞进一个“全能”工具
|
|
93
|
+
更诚实。
|
|
94
|
+
|
|
95
|
+
**顺带记录**:`seqio.mjs` 新增 `toFastq` 进了浏览器半的模块图,所以 0.24.0 虽然不改面板行为,
|
|
96
|
+
仍重建了两个 `lib/client.js` 并把面板包 `0.1.8 → 0.1.9`;不 bump 会在发布时用同版本号发不同字节。
|
|
97
|
+
定向模型跑分覆盖 `contamination-screen` 与 `fastq-trim`,两题 2/2(409,576 tokens,70 s;详见 CHANGELOG)。
|
|
98
|
+
|
|
99
|
+
## v0.23.0(2026-10-31,包 0.23.0)
|
|
100
|
+
|
|
101
|
+
三条教训,都关于"一个约定改了,哪些地方必须跟着改"。
|
|
102
|
+
|
|
103
|
+
**(1) 方向不是标签问题,是约束落在哪个分子上的问题。** 跨内含子工具把两条引物都报成 sense
|
|
104
|
+
子串,看起来只是"名字反了";真正的代价是 GC clamp、末端稳定性、末端 GC、self-end 与发夹
|
|
105
|
+
**全都检查在反向引物的 5' 端**(因为扫描方向反了),而报告的那条分子还不是要订购的。
|
|
106
|
+
修法不是交换两个字段:反向候选要改到剪接转录本的**反向互补**上扫描,才让 3' 约束落到
|
|
107
|
+
真正下单的分子上,再由 `anchor` 映回 sense 坐标。这也解释了为什么 smoke 夹具必须换 seed:
|
|
108
|
+
旧夹具能在错误的约束下通过,改正后同一段序列不再产生合法候选。
|
|
109
|
+
|
|
110
|
+
**(2) 两份字段命名(snake_case/camelCase)之间"看起来能跑"的调用,是静默失效的温床。**
|
|
111
|
+
旧代码把 `mismatchReport` 的 `distance_from_3prime` 报告直接喂给读 `distanceFrom3Prime` 的
|
|
112
|
+
`mismatchPenalty`,于是 3' 关键区加罚在跨内含子模式里**从未生效**——没有报错、没有测试红,
|
|
113
|
+
只是排序少了一项。现在用专门的 `intronMismatchPenalty`,两种命名不再混用。
|
|
114
|
+
|
|
115
|
+
**(3) 把"一个 key 列表"写成常量时,第二个列表不会自己出现。** 加调用卡时最容易漏的是
|
|
116
|
+
守卫:`contract` 原本只读 `MAP_TOOL_KEYS`,新卡片的工具即使没有 `presentationMeta` 也照样绿。
|
|
117
|
+
现在它从产物里的 `MAP_TOOL_KEYS` 与 `FIGURE_TOOL_KEYS` **两处**读 key,并用行首锚定的正则
|
|
118
|
+
数投影——文件头注释里也提到 `presentationMeta(args, value)`,子串计数会把散文当成第四个实现。
|
|
119
|
+
这类"守卫自己的样本过期"在 0.21.0 的 drift-probe 上已经付过一次账。
|
|
120
|
+
|
|
121
|
+
**(4) 包还在,不等于行能挂载。** 0.2.2-rc.1 把 `list_agents` 并入了
|
|
122
|
+
`@deepseek-ai/dsh-tool-subagent-control` 主入口,删掉了 `./list-agents` 子路径导出。preset 仍抄着
|
|
123
|
+
rc.5 的那一行,而 `preset-health` 的 `packageInstalled` 只证明**包目录存在**,随后 import 的还是
|
|
124
|
+
包根的 `exports["."]`——于是"包在、子路径没了"的行一路绿。真正的解析发生在 Loader 里
|
|
125
|
+
(`import.meta.resolve`,受 `exports` 映射约束),所以现在的守卫先用 `createRequire(...).resolve`
|
|
126
|
+
解析行名,再用 `no-such-subpath` 做突变自检。**组合树正确不代表行能挂载**,这和规则 1 记录的是
|
|
127
|
+
同一类失败:静态检查看不见,只有真正解析/启动一次才会暴露。
|
|
128
|
+
|
|
129
|
+
**顺带记录**:新工具的 pK 表与电荷函数从 `protein.mjs` 导出(`PK_SETS`/`netCharge`),
|
|
130
|
+
而不是在 `protein-charge.mjs` 里复制一份;两个工具各自只加一条 benchmark 任务,
|
|
131
|
+
`benchmark-coverage` 的 62/62 与 `benchmark-profile` 的 62 工具是同一批断言的两种读法。
|
|
132
|
+
`dotplot` 的版式在收尾时从 720×720 改为 720×760(绘图区仍是 628 px 正方形),让 x 轴标题与
|
|
133
|
+
图例各占一行;`test/smoke.mjs` 用几何断言盯住「标题不贴底、图例在画布内且在标题下方」。
|
|
134
|
+
定向真实模型跑分(2026-11-05)覆盖 `intron-qpcr` / `protein-charge` / `dotplot`,三题 3/3。
|
|
135
|
+
|
|
50
136
|
## v0.22.1(2026-10-25,包 0.22.1)
|
|
51
137
|
|
|
52
138
|
**环境变量不是唯一选择。** 0.22.0 只从 `api_key` 参数与 `process.env` 读 key;这一版把 DSH 的
|
package/docs/maintainer.md
CHANGED
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
|
|
31
31
|
## 60 秒速览
|
|
32
32
|
|
|
33
|
-
- **包**:`dsh-molbio-tools`,零依赖 DSH 插件包,**
|
|
33
|
+
- **包**:`dsh-molbio-tools`,零依赖 DSH 插件包,**64 个 `molbio_*` 工具**(其中
|
|
34
34
|
`molbio_plot` 一个工具承载 8 种图表)。
|
|
35
|
-
- **基线**:DSH **0.2.
|
|
35
|
+
- **基线**:DSH **0.2.2-rc.1**;`package.json` 版本 0.24.1(DSH 桌面版内嵌 Node 24.21.0)。
|
|
36
36
|
- **两条分发渠道**:根包(工具 + 面板)与 `packages/molbio-panel`(只面板),
|
|
37
37
|
**两个独立的 npm 条目、两条独立的版本线**,必须分别发布。
|
|
38
38
|
- **工具只在专属模式里出现**(设计如此):bundle 的 `cordis.patch.yml` 只插一行**惰性宿主锚点**
|
|
39
|
-
(`molbio-client` → `./host.mjs`),
|
|
39
|
+
(`molbio-client` → `./host.mjs`),64 个工具由同文件里的 preset insert 承载,
|
|
40
40
|
只会挂进 "Molecular Biology Lab" 模式。
|
|
41
41
|
- **测试**:`npm test` = 插件(`smoke`)+ 画面(`svgpng`/`svgio`/`charts`)+ 客户端四套件 +
|
|
42
42
|
DSH 契约(`contract`)+ 组合(`preset-health`)+ 漂移守卫(`drift-probe`)+
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
`build/release-preflight.mjs`,然后用 **OIDC 可信发布**(仓库里没有任何长期 token)分两步发
|
|
46
46
|
两个 npm 条目,最后用 CHANGELOG 该版本段落建 GitHub Release。**首次发布必须手动做一次**
|
|
47
47
|
(可信发布要求包已存在),完整步骤见 [workflow.md](workflow.md) 第 4 节的 CD 段。
|
|
48
|
-
- **benchmark**:`npm run bench` 用真实模型跑 core 档 14 题(`bench:full` 全部
|
|
48
|
+
- **benchmark**:`npm run bench` 用真实模型跑 core 档 14 题(`bench:full` 全部 65 题),分
|
|
49
49
|
`tools_ok` / `args_ok` / `answer_ok` 三项判分;`npm run bench:offline` 零成本校验期望值。
|
|
50
50
|
|
|
51
51
|
包内目录结构:
|
|
52
52
|
|
|
53
53
|
```
|
|
54
54
|
dsh-molbio-tools/
|
|
55
|
-
├── index.mjs # 插件入口:export { name, inject, apply },注册
|
|
55
|
+
├── index.mjs # 插件入口:export { name, inject, apply },注册 64 个工具
|
|
56
56
|
├── lib.mjs # 基础库:IUPAC、翻译、酶表、NN 热力学、qPCR、lab math、甲基化/buffer 参考表
|
|
57
57
|
├── design.mjs # 引物自动设计(含跨内含子 qPCR)
|
|
58
58
|
├── taqman.mjs # TaqMan 水解探针设计(复用 design.mjs 的引物引擎)
|
|
@@ -60,6 +60,9 @@ dsh-molbio-tools/
|
|
|
60
60
|
├── methylation.mjs # 甲基化敏感位点检查 + 双酶切 buffer 兼容
|
|
61
61
|
├── protein.mjs # 蛋白性质 / 肽段酶切 / 密码子优化
|
|
62
62
|
├── protein-structure.mjs # 螺旋轮与疏水性图
|
|
63
|
+
├── protein-charge.mjs # 电荷-pH 滴定曲线 + pI(两套 pK 表)
|
|
64
|
+
├── contamination.mjs # 内置载体/接头短签名 + 双链污染筛查
|
|
65
|
+
├── fastq-trim.mjs # FASTQ 修剪/过滤(质量/接头/引物/poly/N/长度)
|
|
63
66
|
├── genbank.mjs # GenBank flatfile 解析器
|
|
64
67
|
├── snapgene.mjs # SnapGene .dna 二进制解析器
|
|
65
68
|
├── plasmid.mjs # SVG 质粒图谱渲染器
|
package/docs/roadmap.md
CHANGED
|
@@ -10,12 +10,12 @@ L = 需要新机制或外部资源)。
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
## 1. 当前状态(0.
|
|
13
|
+
## 1. 当前状态(0.24.1)
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- 64 个 `molbio_*` 工具,零依赖,随 preset 分发(见 [README](../README.md))。
|
|
16
16
|
- 离线测试金字塔 + 组合漂移守卫全绿;`benchmark/` 提供**模型使用**维度的评估
|
|
17
17
|
(见 [benchmark/README.md](../benchmark/README.md))。
|
|
18
|
-
- 基线:DSH **0.2.
|
|
18
|
+
- 基线:DSH **0.2.2-rc.1**;DSH 桌面版内嵌 Node 24.21.0,`engines.node` 与 CI 矩阵都按这个下限。
|
|
19
19
|
- **CI 已在位**(`.github/workflows/test.yml`,0.18.2 起):push / PR / 手动都跑全套;harness 装
|
|
20
20
|
**钉死版本**,并用 `npm prefix -g` 显式导出 `DSH_HARNESS_ROOT`。0.18.4 起**同时跑
|
|
21
21
|
`ubuntu-latest` 与 `windows-latest`**——3.6 已修,套件不再依赖宿主分隔符。
|
|
@@ -45,6 +45,23 @@ L = 需要新机制或外部资源)。
|
|
|
45
45
|
的 key 解析顺序变为 **`api_key` 参数 → DSH 凭据库 → 环境变量**(环境变量会被 agent 自己的 shell
|
|
46
46
|
子进程继承,凭据库不会);同时插件详情页出现 **PubMed API key** 表单,用户不必改 YAML。
|
|
47
47
|
没有凭据库的组合行为与 0.22.0 相同。
|
|
48
|
+
- **0.24.1 是输入边界与数据安全加固版(工具数不变)**:修掉 BibTeX 导出覆盖文献库、
|
|
49
|
+
相对路径按 provider cwd 解析、四个默认写 SVG 的工具被误标并发安全、批量 glob /
|
|
50
|
+
`max_files` / 坏路径、文献与协议库坏条目,以及 20 万行表格 / 13 万条 reads 触发的
|
|
51
|
+
`Math.min(...)` RangeError。面板包 `0.1.9 → 0.1.10`(客户端产物重建)。
|
|
52
|
+
- **0.24.0 是数据卫生版**:新增 survey #11 载体/接头污染筛查与 #12 FASTQ 修剪/过滤;
|
|
53
|
+
同时修掉 FASTQ QC 接头表里 Small RNA 5' 的 RNA→DNA 归一化静默错(旧表在 DNA reads 上
|
|
54
|
+
只能命中反向互补)。工具 62 → 64,benchmark 63 → 65;客户端产物仅因
|
|
55
|
+
`seqio.mjs` 新增 `toFastq` 重建,面板行为未变(面板包 0.1.8 → 0.1.9)。
|
|
56
|
+
- **0.23.0 是工具行为版**:修掉 2.0 的遗留(跨内含子引物现在报告的真实反向分子、F 在 R 上游),
|
|
57
|
+
落地 2.9a(sequence logo / gRNA 的调用卡),并从候选池新增两个轻量工具:
|
|
58
|
+
`molbio_protein_charge`(survey #34,电荷-pH 滴定 + 可切换 pK 表)与
|
|
59
|
+
`molbio_dotplot`(survey #23,k-mer 直接/反向重复)。工具 60 → 62,benchmark 61 → 63 题。
|
|
60
|
+
- **0.23.0 同版完成 0.2.2-rc.1 适配(工具行为零变化)**:基线 rc.5 → 0.2.2-rc.1。上游把
|
|
61
|
+
`list_agents` 并入 `dsh-tool-subagent-control` 并删除 `./list-agents` 子路径,preset 删掉该行
|
|
62
|
+
(30 → 29)、`tool-subagent` 改用 `modelSelection`/`modelDiscovery`、`tool-fs` 补
|
|
63
|
+
`applyPatch: false`;`preset-health` 增加真实 specifier 解析、`contract` 三处断言改回契约。
|
|
64
|
+
两份 `dshReleases` 增加 `0.2.2-rc.1: compatible`,CI 随基线钉到该版本。
|
|
48
65
|
- **0.22.2 是 rc.5 纯适配版(工具行为零变化)**:基线 rc.3 → rc.5。上游 `standard` 行清单
|
|
49
66
|
**逐字节未变**;真正的变化在**打包形态**——桌面版 `app.asar` 裁掉 `lib/types`,于是
|
|
50
67
|
`contract` 的声明守卫改为"npm 包读 `.d.ts`,桌面版读 `typert.host.js` / runtime 内嵌副本",
|
|
@@ -64,13 +81,17 @@ L = 需要新机制或外部资源)。
|
|
|
64
81
|
`forward`/`reverse` 曾**标反**(F 在下游、R 在上游),按原样送进 `molbio_pcr_simulate`
|
|
65
82
|
得到 **0 个产物**。修法与"为什么只有串联测试看得见"见 [CHANGELOG 0.16.0](../CHANGELOG.md)。
|
|
66
83
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
`
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
### 2.0b ✅ 已修(0.23.0)跨内含子引物的朝向
|
|
85
|
+
|
|
86
|
+
`molbio_design_intron_primers` 曾把两条引物都报成剪接后转录本的 sense 子串:报告的 `reverse`
|
|
87
|
+
不是要订购的分子(真正的反向引物是它的反向互补),而且 `forward` 在 `reverse` 下游。
|
|
88
|
+
0.23.0 起反向候选在**剪接转录本的反向互补**上扫描,因此 3' 端约束(GC clamp、末端稳定性、
|
|
89
|
+
末端 GC、self-end、发夹)落在**真正会订购的那条分子**上;命中再经 `anchor` 映回 sense 坐标。
|
|
90
|
+
报告的 `reverse.sequence` 是可直接下单的 5'→3' 分子,F 在 R 上游,剪接扩增子从 F 的 5' 端到
|
|
91
|
+
R 的 5' 端。`exon` 只出现在正向引物上,`exons`/`junction_*` 只出现在反向引物上;错配的
|
|
92
|
+
`template_base` 对反向引物是转录本碱基的**互补**。这次同时改了渲染、错配报告、
|
|
93
|
+
`test/smoke.mjs` 的断言与 benchmark `intron-qpcr` 的措辞;物理扩增子
|
|
94
|
+
(320-406 spliced / 387 bp genomic)保持不变。
|
|
74
95
|
|
|
75
96
|
### 2.1 ✅ 已修(0.16.0)`molbio_methylation_check` 的表与 NEB 不一致
|
|
76
97
|
|
|
@@ -145,8 +166,9 @@ v16 的 CRISPR 已有订购 CSV 先例,可直接复用格式。
|
|
|
145
166
|
|
|
146
167
|
### 2.9 浏览器面板的候选(客户端半,不动 preset 目录)
|
|
147
168
|
|
|
148
|
-
-
|
|
149
|
-
`
|
|
169
|
+
- ✅ **已做(0.23.0)**:`molbio_sequence_logo` 与 `molbio_grna_design` 有调用卡
|
|
170
|
+
(`molbio-figure` 投影 + `FIGURE_TOOL_KEYS`;logo 画图,gRNA 画图谱并列出前 5 条 guide)。
|
|
171
|
+
`test/map-card.mjs` 现在同时跑两种卡片,`contract` 从产物里的两张 key 表反推投影数。
|
|
150
172
|
- 文献库**写回**需先定并发契约(当前只读);
|
|
151
173
|
- 结构文件的浏览器内预览(`.pdb/.cif/.sdf/.mol`):`ctx.documentPreviews.register` +
|
|
152
174
|
keyed 座位是**容器**,不是现成的 3D 查看器——要么只做 2D 投影(Cα 轨迹/二级结构条带),
|
|
@@ -190,7 +212,7 @@ v18 想做"工具写一个工作区 PNG 文件"而**不能**:`dsh-fs` 明文
|
|
|
190
212
|
|
|
191
213
|
### 3.2 benchmark 的覆盖面
|
|
192
214
|
|
|
193
|
-
-
|
|
215
|
+
- 65 条任务覆盖 **64/64 个工具**(0.15.0 起由 `test/benchmark-coverage.mjs` 机器断言;
|
|
194
216
|
core 档 14 题)。**但多数工具只出现在一条任务里,覆盖是浅的**——见
|
|
195
217
|
[benchmark/README.md](../benchmark/README.md) 的"What this benchmark does NOT measure"。
|
|
196
218
|
- 没有断言 **`attach_image` 交付的图片内容**(只当参数用),也不加载客户端产物。
|
|
@@ -262,7 +284,7 @@ Linux runner 上这些断言会因**分隔符**而失败——那是在报告宿
|
|
|
262
284
|
缺陷。`test/client-mount.mjs` 还有一处同类问题(写死 `%APPDATA%\npm`),**0.18.2 已修**,那也
|
|
263
285
|
正是 workflow 第一次运行全红的原因。
|
|
264
286
|
|
|
265
|
-
|
|
287
|
+
**改法(已在 0.18.4 落地,此处保留施工记录)**:在每个受影响的测试文件顶部加三个助手,把"输入路径"和"期望值"都从
|
|
266
288
|
同一个根推导出来:
|
|
267
289
|
|
|
268
290
|
```js
|
|
@@ -290,7 +312,7 @@ Node 做路径运算(Windows 是 `<prefix>/node_modules`,POSIX 是 `<prefix>
|
|
|
290
312
|
- **agent 驱动浏览器终端**:无 `dsh-tool-terminal`,且面板明确不把输出转给模型。
|
|
291
313
|
`ctx.computerUse`/`ctx.browserUse` 这类 seam 只允许**一个** provider 注册,
|
|
292
314
|
第三方插件即便在未来版本也不能自带一个并行实现去抢。
|
|
293
|
-
- **把
|
|
315
|
+
- **把 64 个工具做成全局可见**:bundle 安装 ≠ 工具全局可见是**设计如此**(工具多了会占
|
|
294
316
|
提示预算)。真要全局可见需要自己加一层宿主行,而那会让专属模式里的同一行变成死行。
|
|
295
317
|
- **持久 shell 进 preset**:收益有限、风险明确(工具名冲突要 disable 一次性那行,
|
|
296
318
|
且需要未经验证的 `isolate: { terminals: true }` 分组),详见
|
package/docs/rules.md
CHANGED
|
@@ -45,7 +45,10 @@ curl.exe -s -b jar -X POST http://127.0.0.1:3099/api/agentPresets/list `
|
|
|
45
45
|
只发 `{}` 只会得到 `arguments-invalid`。验证完删掉 scratch profile。
|
|
46
46
|
|
|
47
47
|
`test/preset-health.mjs` 现在直接盯着这条规则:组合里出现任何 `./plugins/…` 形式的
|
|
48
|
-
specifier 就 FAIL
|
|
48
|
+
specifier 就 FAIL,并已用突变实验证明它会失败。同一套守卫还按 **Loader 的方式解析每个行名**
|
|
49
|
+
(`createRequire(...).resolve`,受包 `exports` 映射约束):0.2.2-rc.1 删掉
|
|
50
|
+
`dsh-tool-subagent-control/list-agents` 子路径时,只查"包目录存在"的旧检查是绿的,
|
|
51
|
+
而那一行在预设挂载时根本 import 不了。
|
|
49
52
|
|
|
50
53
|
---
|
|
51
54
|
|
|
@@ -147,7 +150,7 @@ ctx.effect(() => ctx.slots.inject(座位, () => ctx.slots.register({name: 座位
|
|
|
147
150
|
|
|
148
151
|
这条规则有两道**机器守卫**,它们让"忘了"变成"红":
|
|
149
152
|
|
|
150
|
-
- `test/benchmark-coverage.mjs` 断言 **
|
|
153
|
+
- `test/benchmark-coverage.mjs` 断言 **64/64 个已注册工具都被至少一个任务覆盖**。
|
|
151
154
|
新增工具而没加任务 = **直接 FAIL**。它同时守住 fixture 的前提(Golden Gate 的载体必须
|
|
152
155
|
无 BsaI 位点、诱变模板必须仍能设计出引物)与 tier/占位符的健全性。
|
|
153
156
|
- `test/benchmark-score.mjs` 用**真实模型响应的冻结副本**(`test/fixtures/benchmark-traces.json`)
|
package/docs/store-evidence.md
CHANGED
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"0.2.1-rc.2": "compatible",
|
|
21
21
|
"0.2.1-rc.3": "compatible",
|
|
22
22
|
"0.2.1-rc.4": "unknown",
|
|
23
|
-
"0.2.1-rc.5": "compatible"
|
|
23
|
+
"0.2.1-rc.5": "compatible",
|
|
24
|
+
"0.2.2-rc.1": "compatible"
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -31,7 +32,7 @@
|
|
|
31
32
|
`@deepseek-ai/dsh-app-boot` 的 `unmetRequirements`):带 prerelease 选项时 `<0.3.0`
|
|
32
33
|
会放行 `0.3.0-alpha.1`,而 `-0` 不会。
|
|
33
34
|
|
|
34
|
-
### 为什么 rc.2 / rc.3 / rc.5 是 compatible、rc.1 / rc.4 是 unknown
|
|
35
|
+
### 为什么 rc.2 / rc.3 / rc.5 / 0.2.2-rc.1 是 compatible、rc.1 / rc.4 是 unknown
|
|
35
36
|
|
|
36
37
|
| 版本 | 记录 | 依据 |
|
|
37
38
|
| --- | --- | --- |
|
|
@@ -39,15 +40,16 @@
|
|
|
39
40
|
| 0.2.1-rc.2 | compatible | 0.21.0 / 0.21.1 的发布基线;本文件第 3 节的一次性 Profile 流程在 rc.2 上跑过;`contract` / `preset-health` / `smoke` 均通过 |
|
|
40
41
|
| 0.2.1-rc.3 | compatible | 0.22.0 的发布基线;同一套一次性 Profile 流程在 rc.3 上重跑通过(安装 → 启动 HTTP 200 → 卸载无残留);`contract` / `preset-health` / `drift-probe` / `benchmark-profile` / `smoke` 在 rc.3 上全绿。上游 `standard` 行清单与 rc.2 **逐字节一致** |
|
|
41
42
|
| 0.2.1-rc.4 | unknown | 没有在真实安装上跑过;不能因为"补丁号在 `engines.dsh` 范围内"就写成 compatible |
|
|
42
|
-
| 0.2.1-rc.5 | compatible | 0.22.2 的发布基线(CI
|
|
43
|
+
| 0.2.1-rc.5 | compatible | 0.22.2 的发布基线(CI 曾钉该版本)。在本机 DSH 桌面版 0.2.1-rc.5 上重跑:安装 → 启动 HTTP 200 → `agentPresets/list` 的 `broken` 为空且 molbio-lab 的 `tool-molbio` 为 `fiberPhase: "active"` → 卸载无残留;`contract` 17 / `preset-health` 30 行 / `drift-probe` 16 / `smoke` 60 工具 / `bench:offline` 61 题全绿。上游 `standard` 与 rc.3 **逐字节一致**(6799 B,同一 sha256) |
|
|
44
|
+
| 0.2.2-rc.1 | compatible | 0.23.0 的发布基线(CI 钉该版本)。这一版上游删除了 `@deepseek-ai/dsh-tool-subagent-control/list-agents` 导出(`list_agents` 并入主入口),preset 因此删掉该行(30 → 29),`tool-subagent` 改用 `modelSelection`/`modelDiscovery`、`tool-fs` 补 `applyPatch: false`。在**桌面版 `app.asar` 与 npm 全局安装**两份 0.2.2-rc.1 上核对(两者 `standard.patch.yml` **逐字节一致**,6858 B,sha256 `3006CC3780CDDAA7FB0089E5854E6BBEF4409CF1D425930FD835226B95660AFD`);一次性 tarball Profile:安装 → 启动 HTTP 200(40 311 B,boot 图含 `dsh-molbio-tools/client.js`)→ `agentPresets/list` 的 `broken` 为空、`tool-molbio` 为 `fiberPhase: "active"` → 卸载无残留;`contract` 17 / `preset-health` 29 行 / `drift-probe` 16 项(15 个突变)/ `smoke` 62 工具 / `bench:offline` 63 题全绿;定向真实模型跑分 `intron-qpcr` / `protein-charge` / `dotplot` 3 题 3/3(2026-11-05,541,946 tokens) |
|
|
43
45
|
|
|
44
46
|
## 2. 环境
|
|
45
47
|
|
|
46
48
|
| 项 | 值 |
|
|
47
49
|
| --- | --- |
|
|
48
|
-
| DSH | `0.2.
|
|
49
|
-
| Node.js | `
|
|
50
|
-
| pnpm | `
|
|
50
|
+
| DSH | `0.2.2-rc.1`(桌面版 `app.asar` 与 npm 全局安装各一份,`standard.patch.yml` 逐字节一致) |
|
|
51
|
+
| Node.js | `v26.12.1`(命令行验证;桌面运行时内嵌 `24.21.0`,Electron 44.7.0) |
|
|
52
|
+
| pnpm | `12.15.0`(`dsh plugin` 安装用) |
|
|
51
53
|
| 平台 | Windows(win32 x64) |
|
|
52
54
|
|
|
53
55
|
## 3. 一次性 Profile 的完整流程
|
|
@@ -56,9 +58,9 @@
|
|
|
56
58
|
|
|
57
59
|
```bash
|
|
58
60
|
export DSH_HOME=<workspace>/.tmp/dsh-store-check
|
|
59
|
-
npm pack --pack-destination "$DSH_HOME" # 得到 dsh-molbio-tools-0.
|
|
61
|
+
npm pack --pack-destination "$DSH_HOME" # 得到 dsh-molbio-tools-0.23.0.tgz
|
|
60
62
|
dsh --profile molbio-tgz-check --from-default-profile web --dump-config
|
|
61
|
-
dsh plugin --profile molbio-tgz-check add "$DSH_HOME/dsh-molbio-tools-0.
|
|
63
|
+
dsh plugin --profile molbio-tgz-check add "$DSH_HOME/dsh-molbio-tools-0.23.0.tgz"
|
|
62
64
|
dsh --profile molbio-tgz-check --dump-config # 安装后的组合树
|
|
63
65
|
dsh --profile molbio-tgz-check --no-open --port 0 # 启动,打印 URL
|
|
64
66
|
curl "http://127.0.0.1:<port>/?token=<token>" # 读回页面
|
|
@@ -69,20 +71,20 @@ dsh --profile molbio-tgz-check --dump-config # 卸载后的组合树
|
|
|
69
71
|
安装用 **tarball** 而不是目录,因为 tarball 就是发布物本身:它能同时证明 `files`
|
|
70
72
|
白名单带全了运行文件(`host.mjs`、`lib/client.js`、单个 `cordis.patch.yml` 的两个 insert、preset)。
|
|
71
73
|
|
|
72
|
-
tarball 是 **
|
|
74
|
+
tarball 是 **117 个文件 / 1 049 323 B**(`npm pack` 实测,解包约 3.4 MB;再改文档会让字节数
|
|
73
75
|
小幅浮动,文件数不变),且 `package/packages/**` 为 **0**:根包不再内嵌
|
|
74
76
|
`packages/molbio-panel`,一个 tarball 里只有一个插件清单(面板包按自己的地址单独发布)。
|
|
75
77
|
面板本身没有因此消失——根包的 `lib/client.js` 就带着它,第 3.2 节的回读可以作证。
|
|
76
78
|
|
|
77
|
-
下面这次是在 **0.
|
|
79
|
+
下面这次是在 **0.23.0 的 tarball** 上、用 **dsh 0.2.2-rc.1** 的 CLI 重跑的(2026-11-05),
|
|
78
80
|
文件数与发布物一致;更早的记录只差版本号与文件数,流程未变。
|
|
79
81
|
|
|
80
82
|
### 3.1 安装
|
|
81
83
|
|
|
82
84
|
```
|
|
83
|
-
+ dsh-molbio-tools file:D:/.../dsh-molbio-tools-0.
|
|
85
|
+
+ dsh-molbio-tools file:D:/.../dsh-molbio-tools-0.23.0.tgz
|
|
84
86
|
Packages: +1
|
|
85
|
-
Done in
|
|
87
|
+
Done in 384ms using pnpm v12.15.0
|
|
86
88
|
```
|
|
87
89
|
|
|
88
90
|
安装后的 `--dump-config` 出现 bundle 层,且 `host.mjs` 解析到**已安装包内**:
|
|
@@ -102,24 +104,29 @@ Done in 571ms
|
|
|
102
104
|
### 3.2 启动
|
|
103
105
|
|
|
104
106
|
```
|
|
105
|
-
dsh web: http://127.0.0.1:
|
|
107
|
+
dsh web: http://127.0.0.1:64001/?token=...
|
|
106
108
|
```
|
|
107
109
|
|
|
108
|
-
读回结果:`HTTP 200`、
|
|
110
|
+
读回结果:`HTTP 200`、40311 字节;页面里的 `window.__DSH_BOOT__` 图包含
|
|
109
111
|
`dsh-molbio-tools/client.js&rev=…`(rev 是内容哈希,随产物变化),即浏览器半被宿主 Loader 发现并进了客户端图——
|
|
110
112
|
这是"启动成功"的可观察证据,而不只是进程没退出。(先用 token 换 cookie,再带 cookie 读 `/`,
|
|
111
113
|
否则第一跳是 303。)
|
|
112
114
|
|
|
113
115
|
再用同一 cookie POST `/api/agentPresets/list` 与 `/api/pluginInventory/list`(envelope 见
|
|
114
|
-
[rules.md](rules.md) 规则 1):`broken`
|
|
115
|
-
`tool-molbio` 为 `fiberPhase: "active"`——
|
|
116
|
-
|
|
116
|
+
[rules.md](rules.md) 规则 1):`broken` 为空(空数组时服务端直接省略该键),`presets` 里
|
|
117
|
+
`molbio-lab` 的 `order` 为 5,molbio-lab 的 `tool-molbio` 为 `fiberPhase: "active"`——
|
|
118
|
+
preset 里的 62 个工具**真的挂上了**,而不只是组合树正确。
|
|
119
|
+
|
|
120
|
+
> 0.2.2-rc.1 的这一步顺带证实了 0.23.0 的修复:同一份 preset 在修复前含
|
|
121
|
+
> `@deepseek-ai/dsh-tool-subagent-control/list-agents`,该子路径已随 `list_agents` 并入主入口而删除,
|
|
122
|
+
> 解析即 `ERR_PACKAGE_PATH_NOT_EXPORTED`,`broken` 会有内容。现在 `preset-health` 用
|
|
123
|
+
> `createRequire(...).resolve` 把这种行挡在仓库内。
|
|
117
124
|
|
|
118
125
|
### 3.3 卸载
|
|
119
126
|
|
|
120
127
|
```
|
|
121
|
-
- dsh-molbio-tools file:D:/.../dsh-molbio-tools-0.
|
|
122
|
-
Done in
|
|
128
|
+
- dsh-molbio-tools file:D:/.../dsh-molbio-tools-0.23.0.tgz
|
|
129
|
+
Done in 123ms using pnpm v12.15.0
|
|
123
130
|
```
|
|
124
131
|
|
|
125
132
|
卸载后四项同时回到初始状态:
|
|
@@ -142,10 +149,10 @@ pnpm 的 hoisted linker 会在 `node_modules/` 留下一个指向仓库目录的
|
|
|
142
149
|
|
|
143
150
|
```
|
|
144
151
|
node test/contract.mjs → 17 checks passed(host 契约、client 产物、tarball 覆盖、声明回退的突变自检)
|
|
145
|
-
node test/preset-health.mjs → all
|
|
146
|
-
node test/smoke.mjs → registered
|
|
147
|
-
node test/drift-probe.mjs → 16/16(
|
|
148
|
-
node benchmark/run.mjs --offline →
|
|
152
|
+
node test/preset-health.mjs → all 29 rows load on dsh 0.2.2-rc.1
|
|
153
|
+
node test/smoke.mjs → registered 64 tools, all smoke tests passed
|
|
154
|
+
node test/drift-probe.mjs → 16/16(15 个突变全部被抓到)
|
|
155
|
+
node benchmark/run.mjs --offline → 65 tasks checked against the shipped tools
|
|
149
156
|
```
|
|
150
157
|
|
|
151
158
|
`test/release.mjs` 在完整权限的本地会话里整套通过(包括末尾的 npm 版本探测);
|
|
@@ -37,7 +37,7 @@ disabled、没有覆盖官方行。
|
|
|
37
37
|
`@deepseek-ai/dsh-client-modules` 的 `exactPackageSpecifier` 只接受 `@scope/name` 或裸包名,任何含
|
|
38
38
|
`/` 的非 scoped 说明符返回 `undefined`,`locatePkgJson` 随即返回 `undefined`,该行永远不会被客户端
|
|
39
39
|
扫描发现,右栏 Molbio/Papers 两个 tab 会静默消失。改成包根 `dsh-molbio-tools` 也不可行:根模块是
|
|
40
|
-
工具入口,会把
|
|
40
|
+
工具入口,会把 64 个工具注册进该 profile 的每个会话——这正是本包要避免的。
|
|
41
41
|
|
|
42
42
|
请求:允许「`name` 以 `./` 开头、解析基准为 manifest 所在包目录、解析结果留在包内且文件已分发」的
|
|
43
43
|
自引用 insert 行;或把本固定 commit 送入人工专项审阅,按实际内容判定。
|
|
@@ -163,7 +163,7 @@ function exactPackageSpecifier(specifier) {
|
|
|
163
163
|
避免的故障。路径型(`./`、`file:`、绝对路径)是唯一既能挂一个惰性锚点、又能被扫描器解析的写法,
|
|
164
164
|
而它恰好被身份规则拒绝。
|
|
165
165
|
|
|
166
|
-
改成「包根本身」也不行:根模块是 `index.mjs`,一旦作为宿主行挂载就会把
|
|
166
|
+
改成「包根本身」也不行:根模块是 `index.mjs`,一旦作为宿主行挂载就会把 64 个工具注册进该 profile
|
|
167
167
|
的每个会话——这是本包刻意避免的。
|
|
168
168
|
|
|
169
169
|
关键点:**这条正则扫的是 patch 原始文本**,所以它无法区分
|