dsh-memory-nebula 1.1.0 → 1.1.2

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.
@@ -0,0 +1,109 @@
1
+ # 记忆星图
2
+
3
+ 把散落在工作区里的记忆,连成一张能走、能查、能带走的星图。
4
+
5
+ DSH 里的记忆常常躺在几十个工作区、几千条会话里。搜索能给出一串结果,但看不到它们**为什么**相关;换一个项目,之前那条线索又断了。记忆星图读同一批记忆库(meow-memory / OpenViking),把它们建成一张图:节点是记忆,边是关键词、实体、项目、会话共现和人工策展。它不复制、不改写你的库,所有计算都在本机完成。
6
+
7
+ ![记忆星图:一千多条记忆与它们的连接](assets/preview.png)
8
+
9
+ ## 三种看法
10
+
11
+ - **星云**:全部记忆铺成星云,按工作区聚成星团,按层级与连接强度着色。适合看「我的记忆整体长什么样」。
12
+ - **星系**:按工作区分组,点开一团就进入那个项目。适合回答「这个项目里我都想过什么」。
13
+ - **时间**:按创建/更新时间排成一条河,拖动时间轴回放。适合看「这件事是怎么一步步长出来的」。
14
+
15
+ 三种视图共用同一套筛选:工作区、层级、连接类型、最小强度、最低重要度。切视图不丢选中。
16
+
17
+ ## 从一条记忆走到另一条
18
+
19
+ 选中节点,右侧会告诉你它和谁相连、为什么相连:同项目、共享关键词、同一实体、被同一批会话反复一起提到,或者你亲手连的。每条邻居都带权重和理由,不是「相似度 0.87」这种没有证据的数字。
20
+
21
+ Shift 点第二个节点,会找两点之间的**证据链**:每一跳是哪条边、什么理由、链强度多少。找不到就明说找不到,不编一条路。
22
+
23
+ ![选中一条记忆:正文、邻居、每条边的理由](assets/demo.jpg)
24
+
25
+ ## 搜索与扩散
26
+
27
+ 搜索是全文的:标题、正文、关键词都算。结果里会标出是直接命中,还是从别的节点扩散过来的;跨工作区命中会单独标出来,避免「明明有却搜不到」。
28
+
29
+ 「以它为种子扩散」不是搜索的替代品:它从这条记忆出发,沿已有连接看两跳内的邻居,告诉你「还有哪些东西和它连着」。
30
+
31
+ ## 体检:不只看漂亮的那面
32
+
33
+ 星图会做六类只读体检:
34
+
35
+ - 近似重复的记忆;
36
+ - 过长的记忆;
37
+ - 很久没更新、可能过时的记忆;
38
+ - 存了但从没被读过的记忆;
39
+ - 边很多但没有一条强关系(关键词撞出来的);
40
+ - 完全孤立的记忆。
41
+
42
+ 只诊断,不自动改库。要不要合并、删掉、补连接,由你决定。
43
+
44
+ ## 示例星系与首访引导
45
+
46
+ 第一次打开时,如果库还是空的,不会只给你一片黑:可以进「示例星系」逛一圈。示例是 64 条**虚构**记忆,只读,不写盘,退出后回到你自己的库。第一次进真实库还有三步引导:搜一个词、点开一条看证据、Shift 点两条看它们怎么连。跳过随时可以按 `?` 重看。
47
+
48
+ ![第一次来?三步就够](assets/onboard.jpg)
49
+
50
+ ## 分享一片,而不是整座库
51
+
52
+ 可以把整张图、当前工作区、或「以某条记忆为中心 2 跳」导出成一个**单文件 HTML**:
53
+
54
+ - 双击就能看,不需要 DSH、不需要网络;
55
+ - 搜索、邻居、证据链都在本地算;
56
+ - 只读,不能改你的库;
57
+ - 导出前可以勾选「隐去日记工作区」;`scope`/`hide` 只影响导出,不动原库;
58
+ - 分享出去的是时间点副本,正文会一起带走——发给别人前先确认范围。
59
+
60
+ ![导出的离线快照:文件里只有被选中的那一片](assets/snapshot.jpg)
61
+
62
+ ## 一万条也敢开
63
+
64
+ 10,000 条记忆、78,593 条连接的同机基准:
65
+
66
+ - 建图 1.2 秒;
67
+ - 首屏约 0.6 秒;
68
+ - 检索 4.9 毫秒;
69
+ - 单文件快照 122 毫秒 / 21MB;
70
+ - 堆内存 145MB。
71
+
72
+ 超过 3,000 条时默认留在二维星云,并提示先筛选再切三维:软件渲染下三维会卡,星图不假装自己扛得住。
73
+
74
+ ![一万条记忆的二维星云](assets/bench-10k.jpg)
75
+
76
+ ## 安装
77
+
78
+ 在 DSH 的插件市场里添加索引:
79
+
80
+ ```text
81
+ https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json
82
+ ```
83
+
84
+ 然后搜索「记忆星图」安装。也可以直接装 npm 包:
85
+
86
+ ```bash
87
+ npm install dsh-memory-nebula@1.1.2
88
+ ```
89
+
90
+ 装完先体检:
91
+
92
+ ```bash
93
+ npx memory-nebula-doctor --profile <你的 DSH profile 目录>
94
+ ```
95
+
96
+ 它会检查 Node 版本、包文件、profile 依赖、bundle 声明、记忆源和可选的 `/ping` 端点。只读,不上传任何东西。
97
+
98
+ ## 边界
99
+
100
+ - 本机单用户工具,没有账号系统,不要把它暴露到公网;
101
+ - 记忆库是只读的:星图不会替你改记忆;
102
+ - 三维视图需要 WebGL2;
103
+ - 单文件快照包含被选中范围内的正文,按明文备份对待;
104
+ - 服务端诊断与日志仍以中文为主,界面中英双语。
105
+
106
+ ## 更多
107
+
108
+ - 架构、数据模型、HTTP 接口、兼容矩阵与分发说明都随包发布,见 `docs/`
109
+ - 许可:MIT
@@ -68,7 +68,7 @@ memory-nebula --help # 装成 bin 之后
68
68
 
69
69
  ## 发布信息
70
70
 
71
- - 版本 `1.1.0`,`license: MIT`,无运行时依赖。
71
+ - 版本 `1.1.2`,`license: MIT`,无运行时依赖。
72
72
  - `files`:`lib/`、`cordis.patch.yml`、`README.md`、`README.en.md`、`docs/`、`CHANGELOG.md`、
73
73
  `LICENSE`、`scripts/`、`sidecar.ps1`。
74
74
  - 装完先体检:`node scripts/doctor.mjs --profile <profile> [--root DIR] [--base URL] [--json]`;
package/docs/release.md CHANGED
@@ -59,8 +59,8 @@ npm pack --dry-run
59
59
  npm pack # 生成 dsh-memory-nebula-<version>.tgz
60
60
  ```
61
61
 
62
- 1.1.0 实测:**66 个文件**,包 2.3 MB、解开 3.0 MB(`docs/assets/` 的预览图与基准脚本占大头)。
63
- 干净目录安装后 `--version` = 1.1.0,导出 `apply,inject,name,version`;
62
+ 1.1.2 实测:**72 个文件**,包 2.3 MB、解开 2.9 MB(`docs/assets/` 的预览图与基准脚本占大头)。
63
+ 干净目录安装后 `--version` = 1.1.2,导出 `apply,inject,name,version`;
64
64
  安装包起 7896 实测 `/share?scope=ws:DSHLive2D&hide=level:lesson` → 200、601,177 字节。
65
65
  清单里应含 `sidecar.ps1`、`scripts/`、`test/` 不含(单测只在仓库里跑)、`dev/` 与截图不含。
66
66
 
@@ -71,7 +71,7 @@ npm pack # 生成 dsh-memory-nebula-<version>.tgz
71
71
  New-Item -ItemType Junction -Path "<profile>\node_modules\dsh-memory-nebula" -Target "<plugin>"
72
72
 
73
73
  # 方式 B:tarball
74
- npm install <path>\dsh-memory-nebula-1.1.0.tgz --prefix <profile>
74
+ npm install <path>\dsh-memory-nebula-1.1.2.tgz --prefix <profile>
75
75
  ```
76
76
 
77
77
  然后确认 profile `package.json` 里:
package/docs/testing.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  三层自动检查 + 一层人工验收。前三层都能在干净仓库里跑,不依赖 DSH 正在运行。
6
6
 
7
- ## 一、单元测试:`test/`(84 项)
7
+ ## 一、单元测试:`test/`(87 项)
8
8
 
9
9
  ```bash
10
10
  npm test
@@ -25,6 +25,7 @@ node --test "test/*.test.mjs"
25
25
  | `i18n.test.mjs` | 7 | 字典非空、回退中文、语言优先级、applyDom、T/静态 key 全覆盖 |
26
26
  | `diagnostics.test.mjs` | 2 | 报告结构、无 path/dbPath、文本不含盘符与库名、空图格式化 |
27
27
  | `doctor.test.mjs` | 8 | 版本下界、包文件、profile 依赖/bundles/已安装、warn 不阻断、文本/JSON 报告 |
28
+ | `market.test.mjs` | 3 | 市场索引版本/分类/标签、双语详情与图标存在、详情图片路径可解析 |
28
29
  | `package.test.mjs` | 7 | 包身份与导出、`files` 不夹带测试、清单文件存在、死文件不再进包、CHANGELOG 与版本一致、Cordis patch、相对 import 可解析 |
29
30
 
30
31
  > 注意:`node --test test` 会把 `test` 当模块解析并报 `MODULE_NOT_FOUND`,要带 glob 或用 `npm test`。
package/docs/verified.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  > 下面的数字都是**当时实测**的值,记录的是「这个结论被什么证据支撑过」,不是当前规模——记忆每天在长,规模类数字请以 `node scripts/smoke.mjs` 和界面顶栏为准。
4
4
 
5
+ ## 1.1.2(2026-11-10)换个门牌
6
+
7
+ - **CDN 选择**:本机 `curl` 与 Node fetch 访问 jsDelivr 均为 `ECONNRESET`;unpkg 的 Node fetch 200。
8
+ - **远程索引**:`https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json` 经
9
+ `parseMarketIndex` 解析通过,1 个插件、版本 1.1.2;`marketInstallTarget` 返回
10
+ `dsh-memory-nebula@1.1.2`。
11
+ - **详情资产**:icon.svg(image/svg+xml)、locale/zh.json、docs/market.zh.md、
12
+ docs/assets/demo.jpg 均 200。
13
+ - **本包**:87/87 单测;release-check 1.1.2 全绿;干净安装 `--version` = 1.1.2。
14
+ - **发布**:npm `latest` = 1.1.2;registry 安装 `dsh-memory-nebula@1.1.2` 后 doctor 通过。
15
+ - **市场端**:DSH 索引配置后可在发现页搜索「记忆星图」并安装;若宿主网络无法访问 unpkg,
16
+ 改用本机 `file://` 索引或 npm 直装,不影响包本身。
17
+
18
+ ## 1.1.1(2026-11-10)上架
19
+
20
+ - **市场索引校验**:`market/index.json` 经 `@deepseek-ai/dsh-plugin-market-index` 的
21
+ `parseMarketIndex` 校验通过;图标相对路径解析为
22
+ `https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/assets/icon.svg`;
23
+ `marketInstallTarget` 返回 `dsh-memory-nebula@1.1.1`。
24
+ - **双语详情**:`locale/zh.json`、`locale/en.json` 指向 `docs/market.zh.md` / `.en.md`;
25
+ 5 张详情图都存在于 `docs/assets/`,相对文档路径可解析。
26
+ - **单测**:87/87(新增 market 3 项);包 **72 文件 / 2.3MB / 解开 2.9MB**。
27
+ - **索引地址**:`https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json`。
28
+
5
29
  ## 1.1.0(2026-11-10)装得上
6
30
 
7
31
  - **真实 desktop profile 体检**(`node scripts/doctor.mjs --profile C:\Users\Administrator\.dsh\profiles\desktop`):
package/lib/web/app.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* 记忆星图 —— 界面逻辑
2
2
  数据:/api/memory-nebula/*(同源)。渲染交给 render.js。 */
3
3
  ;(function () {
4
- const APP_VERSION = '1.1.0' // 和 package.json 同步(release-check 会核对)
4
+ const APP_VERSION = '1.1.2' // 和 package.json 同步(release-check 会核对)
5
5
  'use strict'
6
6
  /** 中文即源文:英文模式查 i18n.js 的表,查不到就原样返回中文。 */
7
7
  const T = (zh, vars) => (window.NebulaI18n ? window.NebulaI18n.t(zh, vars) : zh)
package/locale/en.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "meta": {
3
+ "title": "Memory Nebula",
4
+ "description": "Turn meow-memory / OpenViking memories into an interactive star map: recall, evidence chains, hygiene checks, scoped snapshots and single-file sharing.",
5
+ "detail": "docs/market.en.md"
6
+ }
7
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "meta": {
3
+ "title": "记忆星图",
4
+ "description": "把 meow-memory / OpenViking 的记忆连成一张可交互的星图:检索、证据链、体检、范围快照与单文件分享。",
5
+ "detail": "docs/market.zh.md"
6
+ }
7
+ }
@@ -0,0 +1,40 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
2
+ <defs>
3
+ <radialGradient id="bg" cx="50%" cy="46%" r="72%">
4
+ <stop offset="0" stop-color="#13283a"/>
5
+ <stop offset="1" stop-color="#070d16"/>
6
+ </radialGradient>
7
+ <radialGradient id="core" cx="50%" cy="50%" r="50%">
8
+ <stop offset="0" stop-color="#ffe9a8"/>
9
+ <stop offset="0.55" stop-color="#f4c766"/>
10
+ <stop offset="1" stop-color="#f4c766" stop-opacity="0"/>
11
+ </radialGradient>
12
+ <filter id="glow" x="-80%" y="-80%" width="260%" height="260%">
13
+ <feGaussianBlur stdDeviation="5" result="b"/>
14
+ <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
15
+ </filter>
16
+ </defs>
17
+ <rect width="256" height="256" rx="56" fill="url(#bg)"/>
18
+ <g stroke="#5de3d0" stroke-width="1.4" opacity="0.55">
19
+ <path d="M128 128 L62 72 M128 128 L196 70 M128 128 L46 156 M128 128 L206 154 M128 128 L88 206 M128 128 L172 208 M62 72 L196 70 M46 156 L88 206 M206 154 L172 208 M62 72 L46 156 M196 70 L206 154"/>
20
+ </g>
21
+ <g fill="#7ff0dc" filter="url(#glow)">
22
+ <circle cx="62" cy="72" r="5.5"/>
23
+ <circle cx="196" cy="70" r="5.5"/>
24
+ <circle cx="46" cy="156" r="5.5"/>
25
+ <circle cx="206" cy="154" r="5.5"/>
26
+ <circle cx="88" cy="206" r="5.5"/>
27
+ <circle cx="172" cy="208" r="5.5"/>
28
+ <circle cx="92" cy="120" r="3.4" opacity="0.8"/>
29
+ <circle cx="166" cy="112" r="3.4" opacity="0.8"/>
30
+ <circle cx="112" cy="176" r="3.4" opacity="0.8"/>
31
+ </g>
32
+ <circle cx="128" cy="128" r="42" fill="url(#core)" opacity="0.35"/>
33
+ <circle cx="128" cy="128" r="13" fill="#ffe7a0" filter="url(#glow)"/>
34
+ <g fill="#fff6d8" opacity="0.9">
35
+ <circle cx="104" cy="92" r="1.6"/>
36
+ <circle cx="158" cy="94" r="1.6"/>
37
+ <circle cx="74" cy="188" r="1.4"/>
38
+ <circle cx="186" cy="186" r="1.4"/>
39
+ </g>
40
+ </svg>
@@ -0,0 +1,101 @@
1
+ {
2
+ "format": 1,
3
+ "title": {
4
+ "zh": "小代码酱的星图货架",
5
+ "en": "Little Code Sauce's Nebula Shelf"
6
+ },
7
+ "description": {
8
+ "zh": "给 DSH 用的记忆可视化与检索扩展。所有数据留在本机。",
9
+ "en": "Memory visualization and recall for DSH. Everything stays on this machine."
10
+ },
11
+ "metadata": {
12
+ "categories": {
13
+ "memory": {
14
+ "title": {
15
+ "zh": "记忆与检索",
16
+ "en": "Memory & recall"
17
+ }
18
+ }
19
+ },
20
+ "labels": {
21
+ "local-first": {
22
+ "title": {
23
+ "zh": "本地优先",
24
+ "en": "Local-first"
25
+ }
26
+ },
27
+ "visualization": {
28
+ "title": {
29
+ "zh": "可视化",
30
+ "en": "Visualization"
31
+ }
32
+ },
33
+ "bilingual": {
34
+ "title": {
35
+ "zh": "中英双语",
36
+ "en": "Bilingual"
37
+ }
38
+ }
39
+ },
40
+ "sortKeys": {
41
+ "featured": {
42
+ "title": {
43
+ "zh": "推荐度",
44
+ "en": "Featured"
45
+ },
46
+ "order": "desc"
47
+ }
48
+ }
49
+ },
50
+ "plugins": [
51
+ {
52
+ "name": "dsh-memory-nebula",
53
+ "title": {
54
+ "zh": "记忆星图",
55
+ "en": "Memory Nebula"
56
+ },
57
+ "description": {
58
+ "zh": "把 meow-memory / OpenViking 的记忆连成一张可交互的星图:检索、证据链、体检、范围快照与单文件分享。",
59
+ "en": "Turn meow-memory / OpenViking memories into an interactive star map: recall, evidence chains, hygiene checks, scoped snapshots and single-file sharing."
60
+ },
61
+ "icon": "assets/icon.svg",
62
+ "author": "主人 & 小代码酱",
63
+ "homepage": "https://www.npmjs.com/package/dsh-memory-nebula",
64
+ "metadata": {
65
+ "category": "memory",
66
+ "keywords": [
67
+ "memory",
68
+ "visualization",
69
+ "recall",
70
+ "knowledge graph",
71
+ "meow-memory",
72
+ "openviking",
73
+ "记忆",
74
+ "星图",
75
+ "检索",
76
+ "知识图谱"
77
+ ],
78
+ "labels": [
79
+ "local-first",
80
+ "visualization",
81
+ "bilingual"
82
+ ],
83
+ "sortKeys": {
84
+ "featured": 100
85
+ }
86
+ },
87
+ "versions": [
88
+ {
89
+ "version": "1.1.2",
90
+ "publishTimestamp": 1794324000,
91
+ "source": {
92
+ "type": "npm"
93
+ },
94
+ "engines": {
95
+ "dsh": ">=0.2.2-rc.1"
96
+ }
97
+ }
98
+ ]
99
+ }
100
+ ]
101
+ }
package/package.json CHANGED
@@ -1,68 +1,70 @@
1
- {
2
- "name": "dsh-memory-nebula",
3
- "version": "1.1.0",
4
- "private": false,
5
- "description": "记忆星图 Memory Nebula —— 把 DSH 里所有记忆插件的记忆只读抽取出来,连成一张可交互的神经元星云;并提供跨项目记忆的扩散检索(spreading activation)。",
6
- "type": "module",
7
- "main": "lib/index.js",
8
- "bin": {
9
- "memory-nebula": "lib/standalone.mjs",
10
- "memory-nebula-doctor": "scripts/doctor.mjs"
11
- },
12
- "exports": {
13
- ".": "./lib/index.js",
14
- "./client": "./lib/client.js",
15
- "./cordis.patch.yml": "./cordis.patch.yml",
16
- "./package.json": "./package.json"
17
- },
18
- "files": [
19
- "lib",
20
- "cordis.patch.yml",
21
- "README.md",
22
- "README.en.md",
23
- "docs",
24
- "CHANGELOG.md",
25
- "LICENSE",
26
- "scripts",
27
- "sidecar.ps1"
28
- ],
29
- "scripts": {
30
- "test": "node --test \"test/*.test.mjs\"",
31
- "smoke": "node scripts/smoke.mjs",
32
- "bench": "node --expose-gc scripts/bench.mjs",
33
- "check": "node scripts/release-check.mjs",
34
- "standalone": "node lib/standalone.mjs",
35
- "start": "node lib/standalone.mjs",
36
- "verify": "npm test && npm run check",
37
- "prepack": "npm run verify",
38
- "doctor": "node scripts/doctor.mjs"
39
- },
40
- "publishConfig": {
41
- "access": "public"
42
- },
43
- "license": "MIT",
44
- "dsh": {
45
- "bundle": {
46
- "patch": "./cordis.patch.yml"
47
- },
48
- "client": {
49
- "platform": "web",
50
- "inject": []
51
- }
52
- },
53
- "engines": {
54
- "node": ">=22.13.0"
55
- },
56
- "keywords": [
57
- "deepseek-harness",
58
- "dsh-plugin",
59
- "memory",
60
- "nebula",
61
- "graph",
62
- "relational-memory",
63
- "spreading-activation",
64
- "memory-adapter",
65
- "visualization"
66
- ],
67
- "author": "主人 & 小代码酱"
68
- }
1
+ {
2
+ "name": "dsh-memory-nebula",
3
+ "version": "1.1.2",
4
+ "private": false,
5
+ "description": "记忆星图 Memory Nebula —— 把 DSH 里所有记忆插件的记忆只读抽取出来,连成一张可交互的神经元星云;并提供跨项目记忆的扩散检索(spreading activation)。",
6
+ "type": "module",
7
+ "main": "lib/index.js",
8
+ "bin": {
9
+ "memory-nebula": "lib/standalone.mjs",
10
+ "memory-nebula-doctor": "scripts/doctor.mjs"
11
+ },
12
+ "exports": {
13
+ ".": "./lib/index.js",
14
+ "./client": "./lib/client.js",
15
+ "./cordis.patch.yml": "./cordis.patch.yml",
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "lib",
20
+ "cordis.patch.yml",
21
+ "README.md",
22
+ "README.en.md",
23
+ "docs",
24
+ "CHANGELOG.md",
25
+ "LICENSE",
26
+ "scripts",
27
+ "sidecar.ps1",
28
+ "locale",
29
+ "market"
30
+ ],
31
+ "scripts": {
32
+ "test": "node --test \"test/*.test.mjs\"",
33
+ "smoke": "node scripts/smoke.mjs",
34
+ "bench": "node --expose-gc scripts/bench.mjs",
35
+ "check": "node scripts/release-check.mjs",
36
+ "standalone": "node lib/standalone.mjs",
37
+ "start": "node lib/standalone.mjs",
38
+ "verify": "npm test && npm run check",
39
+ "prepack": "npm run verify",
40
+ "doctor": "node scripts/doctor.mjs"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "license": "MIT",
46
+ "dsh": {
47
+ "bundle": {
48
+ "patch": "./cordis.patch.yml"
49
+ },
50
+ "client": {
51
+ "platform": "web",
52
+ "inject": []
53
+ }
54
+ },
55
+ "engines": {
56
+ "node": ">=22.13.0"
57
+ },
58
+ "keywords": [
59
+ "deepseek-harness",
60
+ "dsh-plugin",
61
+ "memory",
62
+ "nebula",
63
+ "graph",
64
+ "relational-memory",
65
+ "spreading-activation",
66
+ "memory-adapter",
67
+ "visualization"
68
+ ],
69
+ "author": "主人 & 小代码酱"
70
+ }
@@ -228,6 +228,22 @@ if (!pkg.bin?.['memory-nebula-doctor']) fail('package.json 缺 doctor bin')
228
228
  if (!read('docs/distribution.md').includes('装完先体检')) fail('distribution.md 缺 doctor 体检段')
229
229
  if (!read('README.md').includes('doctor.mjs')) fail('README.md 没提 doctor')
230
230
  ok('1.1.0 构件:安装体检 / doctor CLI / 文档')
231
+ const market = JSON.parse(read('market/index.json'))
232
+ if (market.format !== 1) fail('market/index.json 不是 format 1')
233
+ if (!market.title?.en) fail('market/index.json 缺英文标题')
234
+ const marketEntry = market.plugins?.find((entry) => entry.name === pkg.name)
235
+ if (!marketEntry) fail('market/index.json 没有本包条目')
236
+ if (!marketEntry.versions?.some((version) => version.version === pkg.version)) {
237
+ fail(`market/index.json 没声明当前版本 ${pkg.version}`)
238
+ }
239
+ if (!read('market/assets/icon.svg').includes('<svg')) fail('market 图标缺失或不是 SVG')
240
+ if (!read('locale/zh.json').includes('docs/market.zh.md')) fail('locale/zh.json 没指向中文详情')
241
+ if (!read('locale/en.json').includes('docs/market.en.md')) fail('locale/en.json 没指向英文详情')
242
+ if (!read('docs/market.zh.md').includes(`dsh-memory-nebula@${pkg.version}`)) fail('中文详情缺市场索引步骤')
243
+ if (!read('docs/market.zh.md').includes('https://unpkg.com/')) fail('中文详情没走 unpkg 索引')
244
+ if (!read('docs/market.en.md').includes('https://unpkg.com/')) fail('英文详情没走 unpkg 索引')
245
+ if (!pkg.files?.includes('market') || !pkg.files?.includes('locale')) fail('package.json files 没带 market/locale')
246
+ ok('1.1.2 构件:市场索引 / unpkg / 双语详情 / 图标')
231
247
 
232
248
 
233
249
  console.log(`\n发布检查:${pkg.name} v${pkg.version}\n`)