dsh-memory-nebula 1.1.0 → 1.1.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 +20 -0
- package/README.en.md +151 -148
- package/README.md +8 -5
- package/docs/compatibility.md +2 -1
- package/docs/distribution.md +18 -7
- package/docs/http-api.md +2 -2
- package/docs/market.en.md +109 -0
- package/docs/market.zh.md +109 -0
- package/docs/operations.md +1 -1
- package/docs/release.md +3 -3
- package/docs/testing.md +2 -1
- package/docs/verified.md +11 -0
- package/lib/web/app.js +1 -1
- package/locale/en.json +7 -0
- package/locale/zh.json +7 -0
- package/market/assets/icon.svg +40 -0
- package/market/index.json +101 -0
- package/package.json +70 -68
- package/scripts/release-check.mjs +14 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
本文件记录「记忆星图」每个版本改了什么。日期为落盘日期。
|
|
4
4
|
|
|
5
|
+
## 1.1.1 — 2026-11-10
|
|
6
|
+
|
|
7
|
+
主题「上架」:从 npm 包直接托管 DSH 插件市场索引,不依赖第二个站点。
|
|
8
|
+
|
|
9
|
+
### 插件市场条目
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- `market/index.json`:format 1 索引,分类「记忆与检索」,标签「本地优先 / 可视化 / 中英双语」;
|
|
16
|
+
当前版本指向 npm 源 `dsh-memory-nebula@1.1.1`,`engines.dsh >= 0.2.2-rc.1`。
|
|
17
|
+
- `market/assets/icon.svg`:256×256 的星图图标,随包发布。
|
|
18
|
+
- `locale/zh.json` / `locale/en.json`:市场卡片标题、描述与详情文档入口。
|
|
19
|
+
- `docs/market.zh.md` / `docs/market.en.md`:双语的详细介绍,含空态、示例、证据链、
|
|
20
|
+
范围快照、10k 基准与安装命令;图片走 `docs/assets/`。
|
|
21
|
+
- 索引通过 `@deepseek-ai/dsh-plugin-market-index` 的 `parseMarketIndex` 校验;
|
|
22
|
+
图标相对索引解析为 jsDelivr 上的绝对 URL。
|
|
23
|
+
- 单测 84 → **87**(市场索引/双语详情/图片路径 3 项),release-check 增加上架构件检查。
|
|
24
|
+
|
|
5
25
|
## 1.1.0 — 2026-11-10
|
|
6
26
|
|
|
7
27
|
主题「装得上」:插件跑不起来时,先别猜,跑一遍只读体检。
|
package/README.en.md
CHANGED
|
@@ -1,148 +1,151 @@
|
|
|
1
|
-
# Memory Nebula · memory-nebula
|
|
2
|
-
|
|
3
|
-
A DSH plugin that pulls memories out of every workspace **and every memory plugin**, turns them into a **nebula of evidence-backed connections**, and lets both you and the AI follow those connections the way neurons do.
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
No memories yet? The empty state offers three ways in, plus a built-in demo galaxy:
|
|
8
|
-
|
|
9
|
-

|
|
10
|
-
|
|
11
|
-

|
|
12
|
-
|
|
13
|
-

|
|
14
|
-
|
|
15
|
-
Export the whole graph (text included) as one self-contained HTML for offline reading:
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
- One icon in the sidebar opens the whole nebula (deep-space style: zoom, filter, search).
|
|
20
|
-
- Every other memory database is opened **read-only**. The plugin only writes under `$DSH_HOME/memory-nebula/`.
|
|
21
|
-
- It is not just a picture: the host registers **9 tools** plus a per-turn prompt, so the AI can walk a connection into another project and read the other half of a memory.
|
|
22
|
-
- Sources are **pluggable**: meow-memory SQLite, any notes directory, any SQLite table, or JSONL pushed by a remote service — all behind one adapter contract.
|
|
23
|
-
|
|
24
|
-
## What it does
|
|
25
|
-
|
|
26
|
-
| Capability | Where |
|
|
27
|
-
| --- | --- |
|
|
28
|
-
| Nebula / galaxy / time-spiral views | sidebar icon; `1` `2` `3` |
|
|
29
|
-
| Spreading-activation recall across workspaces | `nebula_recall`, search box `/` |
|
|
30
|
-
| Full text, origin, same-session neighbours, who mentioned it | click any node |
|
|
31
|
-
| Evidence chain: how two memories are actually connected | select one, `Shift`-click another |
|
|
32
|
-
| **Cross-plugin bridge**: what another plugin just injected → the neighbours it did not | `nebula_bridge`, per-turn injection |
|
|
33
|
-
| **Attach a new memory store**: SQLite / notes dir / JSONL | `nebula_sources`, `sources.json` |
|
|
34
|
-
| **Push from a remote memory service** | `nebula_ingest`, `POST /ingest` |
|
|
35
|
-
| Export the whole graph (MD report / JSON) | `GET /export?format=md\|json` |
|
|
36
|
-
| Corrections: mute a wrong edge | `×` next to a neighbour, or `nebula_link(action="mute")` |
|
|
37
|
-
| Memory hygiene (six failure modes) | left panel, board `B`, `nebula_hygiene` |
|
|
38
|
-
| Export visible PNG / subgraph JSON | top bar |
|
|
39
|
-
| First open: three ways in, or a built-in demo galaxy | empty-state card, `?demo=1` |
|
|
40
|
-
| Single-file snapshot: the whole graph (with text) as one offline HTML | Export → “whole graph · single HTML”, `GET /share` |
|
|
41
|
-
| Scoped share: one workspace, one project, or a node’s 2-hop neighbourhood | Export menu, `GET /share?scope=ws:<workspace>` |
|
|
42
|
-
| Privacy filter: drop the diary workspace, a level, a project or a status before export | Export menu, `GET /share?hide=ws:diary` |
|
|
43
|
-
| **Bilingual UI**: interface and offline snapshots in English, untranslated strings fall back to Chinese | top-bar language button, `?lang=en` |
|
|
44
|
-
| **One-click diagnostics**: version, environment, graph size and last error, with no memory text or paths | `?` → “Copy diagnostics”, `GET /diagnostics`, `--diagnose` |
|
|
45
|
-
| First-visit guide: search → open one memory → trace one chain, skippable | appears once, replay from `?` |
|
|
46
|
-
| Time replay (everything up to a day) | timeline in the time view |
|
|
47
|
-
| Keyboard map | `?` |
|
|
48
|
-
|
|
49
|
-
## Quick start
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# 2
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
| [docs/
|
|
107
|
-
| [docs/
|
|
108
|
-
| [docs/
|
|
109
|
-
| [docs/
|
|
110
|
-
| [docs/
|
|
111
|
-
| [docs/
|
|
112
|
-
| [docs/
|
|
113
|
-
| [docs/
|
|
114
|
-
| [docs/
|
|
115
|
-
| [docs/
|
|
116
|
-
| [
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
1
|
+
# Memory Nebula · memory-nebula
|
|
2
|
+
|
|
3
|
+
A DSH plugin that pulls memories out of every workspace **and every memory plugin**, turns them into a **nebula of evidence-backed connections**, and lets both you and the AI follow those connections the way neurons do.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
No memories yet? The empty state offers three ways in, plus a built-in demo galaxy:
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
Export the whole graph (text included) as one self-contained HTML for offline reading:
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
- One icon in the sidebar opens the whole nebula (deep-space style: zoom, filter, search).
|
|
20
|
+
- Every other memory database is opened **read-only**. The plugin only writes under `$DSH_HOME/memory-nebula/`.
|
|
21
|
+
- It is not just a picture: the host registers **9 tools** plus a per-turn prompt, so the AI can walk a connection into another project and read the other half of a memory.
|
|
22
|
+
- Sources are **pluggable**: meow-memory SQLite, any notes directory, any SQLite table, or JSONL pushed by a remote service — all behind one adapter contract.
|
|
23
|
+
|
|
24
|
+
## What it does
|
|
25
|
+
|
|
26
|
+
| Capability | Where |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Nebula / galaxy / time-spiral views | sidebar icon; `1` `2` `3` |
|
|
29
|
+
| Spreading-activation recall across workspaces | `nebula_recall`, search box `/` |
|
|
30
|
+
| Full text, origin, same-session neighbours, who mentioned it | click any node |
|
|
31
|
+
| Evidence chain: how two memories are actually connected | select one, `Shift`-click another |
|
|
32
|
+
| **Cross-plugin bridge**: what another plugin just injected → the neighbours it did not | `nebula_bridge`, per-turn injection |
|
|
33
|
+
| **Attach a new memory store**: SQLite / notes dir / JSONL | `nebula_sources`, `sources.json` |
|
|
34
|
+
| **Push from a remote memory service** | `nebula_ingest`, `POST /ingest` |
|
|
35
|
+
| Export the whole graph (MD report / JSON) | `GET /export?format=md\|json` |
|
|
36
|
+
| Corrections: mute a wrong edge | `×` next to a neighbour, or `nebula_link(action="mute")` |
|
|
37
|
+
| Memory hygiene (six failure modes) | left panel, board `B`, `nebula_hygiene` |
|
|
38
|
+
| Export visible PNG / subgraph JSON | top bar |
|
|
39
|
+
| First open: three ways in, or a built-in demo galaxy | empty-state card, `?demo=1` |
|
|
40
|
+
| Single-file snapshot: the whole graph (with text) as one offline HTML | Export → “whole graph · single HTML”, `GET /share` |
|
|
41
|
+
| Scoped share: one workspace, one project, or a node’s 2-hop neighbourhood | Export menu, `GET /share?scope=ws:<workspace>` |
|
|
42
|
+
| Privacy filter: drop the diary workspace, a level, a project or a status before export | Export menu, `GET /share?hide=ws:diary` |
|
|
43
|
+
| **Bilingual UI**: interface and offline snapshots in English, untranslated strings fall back to Chinese | top-bar language button, `?lang=en` |
|
|
44
|
+
| **One-click diagnostics**: version, environment, graph size and last error, with no memory text or paths | `?` → “Copy diagnostics”, `GET /diagnostics`, `--diagnose` |
|
|
45
|
+
| First-visit guide: search → open one memory → trace one chain, skippable | appears once, replay from `?` |
|
|
46
|
+
| Time replay (everything up to a day) | timeline in the time view |
|
|
47
|
+
| Keyboard map | `?` |
|
|
48
|
+
|
|
49
|
+
## Quick start
|
|
50
|
+
|
|
51
|
+
From the plugin market (recommended): add the index
|
|
52
|
+
`https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json` under
|
|
53
|
+
Plugins → Discover, search for “Memory Nebula”, and install. Run the doctor in step 2.5 afterwards.
|
|
54
|
+
|
|
55
|
+
Or install from this checkout:
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
# 1) link the plugin (either way)
|
|
59
|
+
New-Item -ItemType Junction -Path "<profile>\node_modules\dsh-memory-nebula" -Target "<plugin>"
|
|
60
|
+
npm install <path>\dsh-memory-nebula-1.1.1.tgz --prefix <profile>
|
|
61
|
+
|
|
62
|
+
# 2) profile package.json: add the dependency AND the bundle
|
|
63
|
+
# dependencies: "dsh-memory-nebula": "file:../../plugins/dsh-memory-nebula"
|
|
64
|
+
# dsh.profile.bundles: "dsh-memory-nebula"
|
|
65
|
+
|
|
66
|
+
# 2.5) read-only preflight: Node, dependency, bundles and files; exits 1 only on fail
|
|
67
|
+
node "<profile>\node_modules\dsh-memory-nebula\scripts\doctor.mjs" --profile "<profile>"
|
|
68
|
+
|
|
69
|
+
# 3) restart DSH, open the "Memory Nebula" sidebar panel
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
No restart, or the host still runs old modules:
|
|
73
|
+
|
|
74
|
+
```powershell
|
|
75
|
+
powershell -ExecutionPolicy Bypass -File sidecar.ps1 start # Windows, port 7890, finds node itself
|
|
76
|
+
node lib/standalone.mjs --port 7890 # other systems, scans the current directory
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`sidecar.ps1` also takes `-Port`, `-Root <extra scan dir>` and `-Node <node.exe>`; `status` / `stop` only touch that port.
|
|
80
|
+
|
|
81
|
+
The page probes `/ping` on both legs and picks the newer `build`; a banner explains when the host lacks endpoints.
|
|
82
|
+
|
|
83
|
+
Self-checks:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm test # 84 unit assertions
|
|
87
|
+
npm run check # static release check
|
|
88
|
+
node scripts/smoke.mjs # 63 contract assertions against a live instance
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Attaching a new memory store (three steps)
|
|
92
|
+
|
|
93
|
+
1. Ask the AI: *"run `nebula_sources`, then attach `<where your memories live>`."*
|
|
94
|
+
2. The AI reads [docs/integration-guide.md](docs/integration-guide.md) and picks a path:
|
|
95
|
+
- **on disk (SQLite / notes)** → add a source to `sources.json`; hot-reloaded.
|
|
96
|
+
- **API only** → have that plugin `POST /api/memory-nebula/ingest`, or call `nebula_ingest`.
|
|
97
|
+
- **just need context once** → call `nebula_bridge(memory_ids=[…])`, no source needed.
|
|
98
|
+
3. Confirm with `GET /sources`: the new store must report "N nodes, 0 read errors".
|
|
99
|
+
|
|
100
|
+
Adapter contract and every `sources.json` field: [docs/adapters.md](docs/adapters.md).
|
|
101
|
+
|
|
102
|
+
## Docs
|
|
103
|
+
|
|
104
|
+
| File | Contents |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| [docs/integration-guide.md](docs/integration-guide.md) | **Integration manual for another AI**: three paths, decision tree, verification |
|
|
107
|
+
| [docs/adapters.md](docs/adapters.md) | Adapter contract, four built-in adapters, `sources.json`, safety boundary |
|
|
108
|
+
| [docs/recall-and-tools.md](docs/recall-and-tools.md) | Spreading activation, the nine tools, bridge budget, per-turn injection |
|
|
109
|
+
| [docs/architecture.md](docs/architecture.md) | Module map, request path, invariants |
|
|
110
|
+
| [docs/interface.md](docs/interface.md) | Views, interaction, detail panel, LOD, board / command palette, export |
|
|
111
|
+
| [docs/http-api.md](docs/http-api.md) | HTTP routes, `/ping` fields, ETag/304, error codes, body limits |
|
|
112
|
+
| [docs/security.md](docs/security.md) | Local-only boundary, CORS/CSRF, CSP, read-only guarantee, threat model |
|
|
113
|
+
| [docs/operations.md](docs/operations.md) | Read-only boundary, install, hot reload, known limits |
|
|
114
|
+
| [docs/release.md](docs/release.md) | Release checklist, versioning, packaging, rollback |
|
|
115
|
+
| [docs/compatibility.md](docs/compatibility.md) | Verified OS/Node/browser matrix, explicit non-support |
|
|
116
|
+
| [docs/distribution.md](docs/distribution.md) | Install/upgrade/rollback/uninstall, support flow, marketplace copy |
|
|
117
|
+
| [docs/testing.md](docs/testing.md) | 84 unit tests, 63 smoke checks, 21 security probes, browser probes |
|
|
118
|
+
| [docs/roadmap.md](docs/roadmap.md) | From 0.5 to 1.0: scoped sharing, first-run guidance, 10k-node performance, i18n and release support |
|
|
119
|
+
| [CHANGELOG.md](CHANGELOG.md) | Version history |
|
|
120
|
+
|
|
121
|
+
## Layout
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
lib/
|
|
125
|
+
index.js entry: 9 tools, prompt injection, /api/memory-nebula
|
|
126
|
+
host/
|
|
127
|
+
nebula.js facade: index / cache / refresh / detail / bridge
|
|
128
|
+
graph.js build, score, prune, auditHygiene
|
|
129
|
+
recall.js seeds + spreading activation
|
|
130
|
+
bridge.js complementary bundle: ids → spread → drop seen → fit budget
|
|
131
|
+
ledger.js injection ledger shared across plugins
|
|
132
|
+
adapters/ meow / notes / sqlite / ingest + discovery and config
|
|
133
|
+
live.js hot reload (recursive over lib/host, copy by mtime)
|
|
134
|
+
http.js routes (statically loaded)
|
|
135
|
+
web/ front end (served from disk; refresh to apply)
|
|
136
|
+
scripts/smoke.mjs 63 read-only contract checks
|
|
137
|
+
scripts/release-check.mjs static release check
|
|
138
|
+
scripts/bench.mjs 10k benchmark (build / recall / hygiene / snapshot / memory)
|
|
139
|
+
test/ node:test unit suite (84 assertions)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Privacy and security
|
|
143
|
+
|
|
144
|
+
- Read-only: every memory database is opened with `readOnly`; writes stay under `$DSH_HOME/memory-nebula/`.
|
|
145
|
+
- Local-only: the standalone engine binds `127.0.0.1`; cross-site reads get no CORS, cross-site writes get 403; the page ships a CSP.
|
|
146
|
+
- Full model and verification: [docs/security.md](docs/security.md).
|
|
147
|
+
- Performance budget and 10k measurements: [docs/benchmarks.md](docs/benchmarks.md).
|
|
148
|
+
|
|
149
|
+
## Version
|
|
150
|
+
|
|
151
|
+
`1.1.1`, MIT. Front-end changes apply on refresh; everything under `lib/host/` is hot-reloaded, while `http.js` / `index.js` / `live.js` need a DSH restart (or the standalone engine).
|
package/README.md
CHANGED
|
@@ -72,20 +72,23 @@
|
|
|
72
72
|
|
|
73
73
|
已经装好的机器上(`profiles/desktop`),只要打开「记忆星图」页面就有一张图;页面每 12 秒比一次 `sig`,别的会话写了新记忆会自动长出新星点。库里还没有记忆时,页面会给三条接入路径,也可以先点「看示例」;`…/memory-nebula/?demo=1` 可直达示例星系,逛完退出不会动真实库。
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
从插件市场装(推荐):在 DSH 的「插件 → 发现」里添加索引
|
|
76
|
+
`https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json`,搜索「记忆星图」安装。
|
|
77
|
+
装完按下面的 2.5 跑一次 doctor。
|
|
78
|
+
|
|
79
|
+
也可以从仓库装到 DSH:
|
|
76
80
|
|
|
77
81
|
```powershell
|
|
78
82
|
# 1) 装进 profile(二选一)
|
|
79
83
|
New-Item -ItemType Junction -Path "<profile>\node_modules\dsh-memory-nebula" -Target "<plugin>"
|
|
80
|
-
npm install <path>\dsh-memory-nebula-1.1.
|
|
84
|
+
npm install <path>\dsh-memory-nebula-1.1.1.tgz --prefix <profile>
|
|
81
85
|
|
|
82
86
|
# 2) profile 的 package.json 里加依赖与 bundles(只加 dependencies 不会重组)
|
|
83
87
|
# dependencies: "dsh-memory-nebula": "file:../../plugins/dsh-memory-nebula"
|
|
84
88
|
# dsh.profile.bundles: "dsh-memory-nebula"
|
|
85
89
|
|
|
86
90
|
# 2.5) 装完先体检:只读检查 Node/依赖/bundles/文件,fail 才退出 1
|
|
87
|
-
node <profile>
|
|
88
|
-
ode_modules\dsh-memory-nebula\scripts\doctor.mjs --profile <profile>
|
|
91
|
+
node "<profile>\node_modules\dsh-memory-nebula\scripts\doctor.mjs" --profile "<profile>"
|
|
89
92
|
|
|
90
93
|
# 3) 重启 DSH,打开侧栏「记忆星图」
|
|
91
94
|
```
|
|
@@ -178,6 +181,6 @@ sidecar.ps1 Windows 独立引擎开关
|
|
|
178
181
|
|
|
179
182
|
## 版本与许可
|
|
180
183
|
|
|
181
|
-
- 当前版本 `1.1.
|
|
184
|
+
- 当前版本 `1.1.1`,MIT。
|
|
182
185
|
- 打包内容:`lib/`、`scripts/`、`docs/`、`cordis.patch.yml`、`README.md` / `README.en.md`、`CHANGELOG.md`、`LICENSE`、`sidecar.ps1`(`test/` 与 `dev/` 不进包)。
|
|
183
186
|
- 前端改动刷新页面即生效;`lib/host/` 下所有引擎文件(含 `adapters/`、`bridge.js`、`ledger.js`)由 LiveEngine 热载,`http.js` / `index.js` / `live.js` 改动要重启 DSH 或走独立引擎。
|
package/docs/compatibility.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 兼容矩阵
|
|
2
2
|
|
|
3
|
-
最后更新:2026-11-10(1.1.
|
|
3
|
+
最后更新:2026-11-10(1.1.1 增加市场索引;运行前提未变)
|
|
4
4
|
|
|
5
5
|
这张表只写**真的跑过**的东西。「预期可用」是依据运行前提做的判断,不是实测;
|
|
6
6
|
没有出现的组合就是没有验证,不应当作支持承诺。
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
| 适配器 | meow / notes / sqlite / ingest | 单测 + `sources`/`ingest` 冒烟 |
|
|
23
23
|
| 独立引擎 | `lib/standalone.mjs`,127.0.0.1:7890/7891 | 0.5–0.9 的 `smoke` 与 `--diagnose` |
|
|
24
24
|
| 安装体检 | 真实 desktop profile + 运行中实例 | 1.1.0:9 项全过(含 endpoint ping) |
|
|
25
|
+
| 市场索引 | `@deepseek-ai/dsh-plugin-market-index` format 1 校验 | 1.1.1:`parseMarketIndex` 通过,图标与安装参数可解析 |
|
|
25
26
|
|
|
26
27
|
## 预期可用,但未实测
|
|
27
28
|
|
package/docs/distribution.md
CHANGED
|
@@ -6,28 +6,39 @@
|
|
|
6
6
|
## 包是什么
|
|
7
7
|
|
|
8
8
|
- npm 包名:`dsh-memory-nebula`
|
|
9
|
-
- 当前版本:`1.
|
|
9
|
+
- 当前版本:`1.1.1`
|
|
10
10
|
- 形态:DSH 插件(`cordis.patch.yml` + `lib/client.js`)与独立引擎(`lib/standalone.mjs`)共用一套代码
|
|
11
11
|
- 许可:MIT;没有授权锁、没有遥测、不会把记忆上传到任何服务器
|
|
12
12
|
- 包内容:`lib/`、`scripts/`、`docs/`、`cordis.patch.yml`、`README.md` / `README.en.md`、
|
|
13
|
-
`CHANGELOG.md`、`LICENSE`、`sidecar.ps1
|
|
13
|
+
`CHANGELOG.md`、`LICENSE`、`sidecar.ps1`、`locale/`、`market/`;`test/` 与 `dev/` 不进包
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
16
16
|
|
|
17
|
+
### 从 DSH 插件市场
|
|
18
|
+
|
|
19
|
+
在「插件 → 发现」里添加索引:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
搜索「记忆星图」安装。索引与详情页都在 npm 包里,由 jsDelivr 提供;不需要第二个站点。
|
|
26
|
+
条目声明 `engines.dsh >= 0.2.2-rc.1`,更老的 DSH 会显示不兼容而不是装完才崩。
|
|
27
|
+
|
|
17
28
|
### 从 tgz(离线/客户机器)
|
|
18
29
|
|
|
19
30
|
```powershell
|
|
20
31
|
# Windows PowerShell
|
|
21
|
-
Get-FileHash .\dsh-memory-nebula-1.1.
|
|
32
|
+
Get-FileHash .\dsh-memory-nebula-1.1.1.tgz -Algorithm SHA256
|
|
22
33
|
# 对照同目录的 .sha256 文件;不一致就停,不要装
|
|
23
34
|
|
|
24
|
-
npm install .\dsh-memory-nebula-1.1.
|
|
35
|
+
npm install .\dsh-memory-nebula-1.1.1.tgz --prefix <profile>
|
|
25
36
|
```
|
|
26
37
|
|
|
27
38
|
```bash
|
|
28
39
|
# macOS / Linux
|
|
29
|
-
sha256sum -c dsh-memory-nebula-1.1.
|
|
30
|
-
npm install ./dsh-memory-nebula-1.1.
|
|
40
|
+
sha256sum -c dsh-memory-nebula-1.1.1.tgz.sha256
|
|
41
|
+
npm install ./dsh-memory-nebula-1.1.1.tgz --prefix <profile>
|
|
31
42
|
```
|
|
32
43
|
|
|
33
44
|
然后确认 `<profile>/package.json` 里两处都在:
|
|
@@ -118,7 +129,7 @@ Remove-Item -Recurse -Force "$env:USERPROFILE\.dsh\memory-nebula"
|
|
|
118
129
|
npm run verify # 单测 + release-check;prepack 也会跑
|
|
119
130
|
node scripts/smoke.mjs http://127.0.0.1:7891/api/memory-nebula
|
|
120
131
|
npm pack # 生成 tgz
|
|
121
|
-
sha256sum dsh-memory-nebula-1.1.
|
|
132
|
+
sha256sum dsh-memory-nebula-1.1.1.tgz > dsh-memory-nebula-1.1.1.tgz.sha256
|
|
122
133
|
npm publish # 需要维护者账号;本仓库不自动发布
|
|
123
134
|
```
|
|
124
135
|
|
package/docs/http-api.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
```json
|
|
18
18
|
{
|
|
19
19
|
"ok": true,
|
|
20
|
-
"version": "1.1.
|
|
20
|
+
"version": "1.1.1",
|
|
21
21
|
"build": 1794143336695,
|
|
22
22
|
"startedAt": 1794143336695,
|
|
23
23
|
"mode": "host",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
```text
|
|
48
48
|
memory-nebula diagnostics
|
|
49
49
|
# 不含记忆正文;可以整段贴给支持
|
|
50
|
-
version: 1.1.
|
|
50
|
+
version: 1.1.1
|
|
51
51
|
build: 1794276294467
|
|
52
52
|
started: 2026-11-10T02:20:37.399Z
|
|
53
53
|
mode: standalone
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Memory Nebula
|
|
2
|
+
|
|
3
|
+
Turn memories scattered across workspaces into a star map you can walk, query and carry away.
|
|
4
|
+
|
|
5
|
+
Memories in DSH often live across dozens of workspaces and thousands of sessions. Search returns a list, but not **why** those memories relate; switch projects and the thread disappears. Memory Nebula reads the same stores (meow-memory / OpenViking) and builds a graph: nodes are memories, edges are shared keywords, entities, projects, session co-activation and manual curation. It never copies or rewrites your stores. Everything is computed locally.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
## Three ways to look
|
|
10
|
+
|
|
11
|
+
- **Nebula**: every memory in one cloud, clustered by workspace and coloured by level and link strength. Good for “what does my memory look like as a whole?”
|
|
12
|
+
- **Galaxy**: grouped by workspace; open a cluster to enter that project. Good for “what have I thought about here?”
|
|
13
|
+
- **Time**: memories arranged as a river by creation/update time, with a scrubber. Good for “how did this grow?”
|
|
14
|
+
|
|
15
|
+
All three share the same filters: workspace, level, edge type, minimum strength and importance. Switching views keeps the selection.
|
|
16
|
+
|
|
17
|
+
## From one memory to another
|
|
18
|
+
|
|
19
|
+
Select a node and the right panel shows what it connects to and why: same project, shared keywords, same entity, repeatedly co-mentioned in sessions, or a link you made yourself. Every neighbour carries a weight and a reason, not an evidence-free “similarity 0.87”.
|
|
20
|
+
|
|
21
|
+
Shift-click a second node to find an **evidence chain**: every hop, its reason and the chain strength. If there is no path, it says so instead of inventing one.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
## Search and spread
|
|
26
|
+
|
|
27
|
+
Search covers titles, bodies and keywords. Results mark direct hits versus nodes reached by spreading, and cross-workspace hits are called out so nothing hides behind the current filter.
|
|
28
|
+
|
|
29
|
+
“Spread from here” is not a second search box: it starts at this memory and walks existing links up to two hops, answering “what else is attached to this?”
|
|
30
|
+
|
|
31
|
+
## Hygiene, including the ugly parts
|
|
32
|
+
|
|
33
|
+
Six read-only checks:
|
|
34
|
+
|
|
35
|
+
- near-duplicate memories;
|
|
36
|
+
- oversized memories;
|
|
37
|
+
- stale memories that have not changed in a long time;
|
|
38
|
+
- memories stored but never read;
|
|
39
|
+
- many edges but no strong relation (keyword noise);
|
|
40
|
+
- completely isolated memories.
|
|
41
|
+
|
|
42
|
+
Diagnosis only. It never merges, deletes or rewires anything; that stays your call.
|
|
43
|
+
|
|
44
|
+
## Demo galaxy and first-visit guide
|
|
45
|
+
|
|
46
|
+
An empty store no longer means a black screen: open the **demo galaxy**, 64 fictional memories that are read-only and never touch your stores. First time in a real store, a three-step guide helps you search a word, open one memory and see its evidence, then Shift-click two nodes to see how they connect. Skip it anytime; press `?` to replay.
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
## Share a slice, not the whole store
|
|
51
|
+
|
|
52
|
+
Export the whole map, the current workspace, or “two hops around this memory” as a **single-file HTML**:
|
|
53
|
+
|
|
54
|
+
- double-click to open, no DSH and no network;
|
|
55
|
+
- search, neighbours and evidence chains run locally;
|
|
56
|
+
- read-only, cannot touch your stores;
|
|
57
|
+
- optionally hide the Diary workspace before export; `scope`/`hide` affect the export only;
|
|
58
|
+
- the file is a point-in-time copy **including the text** — check the scope before sending it.
|
|
59
|
+
|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
## Ten thousand memories, still opens
|
|
63
|
+
|
|
64
|
+
Same-machine benchmark with 10,000 memories and 78,593 links:
|
|
65
|
+
|
|
66
|
+
- graph build 1.2 s;
|
|
67
|
+
- first paint about 0.6 s;
|
|
68
|
+
- recall 4.9 ms;
|
|
69
|
+
- single-file snapshot 122 ms / 21 MB;
|
|
70
|
+
- heap 145 MB.
|
|
71
|
+
|
|
72
|
+
Above 3,000 memories it stays in the 2D nebula and asks you to filter before switching to 3D: software rendering would choke, and the map does not pretend otherwise.
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
## Install
|
|
77
|
+
|
|
78
|
+
Add this index in the DSH plugin market:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then search for “Memory Nebula” and install. Or install the npm package directly:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install dsh-memory-nebula@1.1.1
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Run the read-only doctor after installing:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx memory-nebula-doctor --profile <your DSH profile directory>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
It checks the Node version, package files, profile dependency, bundle declaration, memory sources and an optional `/ping` endpoint. Nothing is uploaded.
|
|
97
|
+
|
|
98
|
+
## Boundaries
|
|
99
|
+
|
|
100
|
+
- single-user, local tool: no accounts, do not expose it to the public internet;
|
|
101
|
+
- the stores are read-only: the map never edits memories for you;
|
|
102
|
+
- 3D needs WebGL2;
|
|
103
|
+
- snapshots contain the text inside the selected scope; treat them as plain-text backups;
|
|
104
|
+
- server-side diagnostics and logs are mostly Chinese; the UI is bilingual.
|
|
105
|
+
|
|
106
|
+
## More
|
|
107
|
+
|
|
108
|
+
- architecture, data model, HTTP API, compatibility and distribution docs ship in `docs/`
|
|
109
|
+
- License: MIT
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# 记忆星图
|
|
2
|
+
|
|
3
|
+
把散落在工作区里的记忆,连成一张能走、能查、能带走的星图。
|
|
4
|
+
|
|
5
|
+
DSH 里的记忆常常躺在几十个工作区、几千条会话里。搜索能给出一串结果,但看不到它们**为什么**相关;换一个项目,之前那条线索又断了。记忆星图读同一批记忆库(meow-memory / OpenViking),把它们建成一张图:节点是记忆,边是关键词、实体、项目、会话共现和人工策展。它不复制、不改写你的库,所有计算都在本机完成。
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
## 三种看法
|
|
10
|
+
|
|
11
|
+
- **星云**:全部记忆铺成星云,按工作区聚成星团,按层级与连接强度着色。适合看「我的记忆整体长什么样」。
|
|
12
|
+
- **星系**:按工作区分组,点开一团就进入那个项目。适合回答「这个项目里我都想过什么」。
|
|
13
|
+
- **时间**:按创建/更新时间排成一条河,拖动时间轴回放。适合看「这件事是怎么一步步长出来的」。
|
|
14
|
+
|
|
15
|
+
三种视图共用同一套筛选:工作区、层级、连接类型、最小强度、最低重要度。切视图不丢选中。
|
|
16
|
+
|
|
17
|
+
## 从一条记忆走到另一条
|
|
18
|
+
|
|
19
|
+
选中节点,右侧会告诉你它和谁相连、为什么相连:同项目、共享关键词、同一实体、被同一批会话反复一起提到,或者你亲手连的。每条邻居都带权重和理由,不是「相似度 0.87」这种没有证据的数字。
|
|
20
|
+
|
|
21
|
+
Shift 点第二个节点,会找两点之间的**证据链**:每一跳是哪条边、什么理由、链强度多少。找不到就明说找不到,不编一条路。
|
|
22
|
+
|
|
23
|
+

|
|
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
|
+

|
|
49
|
+
|
|
50
|
+
## 分享一片,而不是整座库
|
|
51
|
+
|
|
52
|
+
可以把整张图、当前工作区、或「以某条记忆为中心 2 跳」导出成一个**单文件 HTML**:
|
|
53
|
+
|
|
54
|
+
- 双击就能看,不需要 DSH、不需要网络;
|
|
55
|
+
- 搜索、邻居、证据链都在本地算;
|
|
56
|
+
- 只读,不能改你的库;
|
|
57
|
+
- 导出前可以勾选「隐去日记工作区」;`scope`/`hide` 只影响导出,不动原库;
|
|
58
|
+
- 分享出去的是时间点副本,正文会一起带走——发给别人前先确认范围。
|
|
59
|
+
|
|
60
|
+

|
|
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
|
+

|
|
75
|
+
|
|
76
|
+
## 安装
|
|
77
|
+
|
|
78
|
+
在 DSH 的插件市场里添加索引:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
然后搜索「记忆星图」安装。也可以直接装 npm 包:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install dsh-memory-nebula@1.1.1
|
|
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
|
package/docs/operations.md
CHANGED
|
@@ -68,7 +68,7 @@ memory-nebula --help # 装成 bin 之后
|
|
|
68
68
|
|
|
69
69
|
## 发布信息
|
|
70
70
|
|
|
71
|
-
- 版本 `1.1.
|
|
71
|
+
- 版本 `1.1.1`,`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.
|
|
63
|
-
干净目录安装后 `--version` = 1.1.
|
|
62
|
+
1.1.1 实测:**72 个文件**,包 2.3 MB、解开 2.9 MB(`docs/assets/` 的预览图与基准脚本占大头)。
|
|
63
|
+
干净目录安装后 `--version` = 1.1.1,导出 `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.
|
|
74
|
+
npm install <path>\dsh-memory-nebula-1.1.1.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/`(
|
|
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,17 @@
|
|
|
2
2
|
|
|
3
3
|
> 下面的数字都是**当时实测**的值,记录的是「这个结论被什么证据支撑过」,不是当前规模——记忆每天在长,规模类数字请以 `node scripts/smoke.mjs` 和界面顶栏为准。
|
|
4
4
|
|
|
5
|
+
## 1.1.1(2026-11-10)上架
|
|
6
|
+
|
|
7
|
+
- **市场索引校验**:`market/index.json` 经 `@deepseek-ai/dsh-plugin-market-index` 的
|
|
8
|
+
`parseMarketIndex` 校验通过;图标相对路径解析为
|
|
9
|
+
`https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/assets/icon.svg`;
|
|
10
|
+
`marketInstallTarget` 返回 `dsh-memory-nebula@1.1.1`。
|
|
11
|
+
- **双语详情**:`locale/zh.json`、`locale/en.json` 指向 `docs/market.zh.md` / `.en.md`;
|
|
12
|
+
5 张详情图都存在于 `docs/assets/`,相对文档路径可解析。
|
|
13
|
+
- **单测**:87/87(新增 market 3 项);包 **72 文件 / 2.3MB / 解开 2.9MB**。
|
|
14
|
+
- **索引地址**:`https://cdn.jsdelivr.net/npm/dsh-memory-nebula@1.1.1/market/index.json`。
|
|
15
|
+
|
|
5
16
|
## 1.1.0(2026-11-10)装得上
|
|
6
17
|
|
|
7
18
|
- **真实 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.
|
|
4
|
+
const APP_VERSION = '1.1.1' // 和 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
package/locale/zh.json
ADDED
|
@@ -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.1",
|
|
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.
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"memory
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-memory-nebula",
|
|
3
|
+
"version": "1.1.1",
|
|
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,20 @@ 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 (!pkg.files?.includes('market') || !pkg.files?.includes('locale')) fail('package.json files 没带 market/locale')
|
|
244
|
+
ok('1.1.1 构件:市场索引 / 双语详情 / 图标')
|
|
231
245
|
|
|
232
246
|
|
|
233
247
|
console.log(`\n发布检查:${pkg.name} v${pkg.version}\n`)
|