@ilaomianyang/dsh-memory-graph 0.10.0
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 +259 -0
- package/LICENSE +21 -0
- package/README.en.md +466 -0
- package/README.md +459 -0
- package/client.js +1953 -0
- package/cordis.patch.yml +13 -0
- package/docs/auto-settings.png +0 -0
- package/docs/distill-button.png +0 -0
- package/docs/graph-dark.png +0 -0
- package/docs/graph-light.png +0 -0
- package/docs/session-tab-cards.png +0 -0
- package/docs/session-tab-open.png +0 -0
- package/docs/session-tab.png +0 -0
- package/docs/vault-panel.png +0 -0
- package/eval/REPORT.md +437 -0
- package/eval/questions.json +277 -0
- package/eval/run.mjs +460 -0
- package/eval/seed.mjs +489 -0
- package/icon.svg +26 -0
- package/index.js +243 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +77 -0
- package/src/auto.js +194 -0
- package/src/capture.js +237 -0
- package/src/config.js +280 -0
- package/src/distillapi.js +30 -0
- package/src/distillrun.js +106 -0
- package/src/extract.js +660 -0
- package/src/graph.js +1582 -0
- package/src/graphdata.js +475 -0
- package/src/http.js +32 -0
- package/src/pageapi.js +40 -0
- package/src/privacy.js +78 -0
- package/src/schema.js +323 -0
- package/src/search.js +317 -0
- package/src/tools.js +534 -0
- package/src/vault.js +888 -0
- package/test/auto.mjs +295 -0
- package/test/capture.mjs +264 -0
- package/test/client.mjs +1035 -0
- package/test/distillapi.mjs +212 -0
- package/test/extract.mjs +660 -0
- package/test/graphdata.mjs +295 -0
- package/test/live-supersede.mjs +78 -0
- package/test/live.mjs +156 -0
- package/test/page.mjs +116 -0
- package/test/schema.mjs +256 -0
- package/test/smoke.mjs +428 -0
- package/test/tools.mjs +238 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"about": "25 questions a real owner of this vault would ask, in the phrasing they would actually use, plus 8 paired history/current questions scored as their own group. Annotations were written before any score was taken.",
|
|
4
|
+
"vault": "built by eval/seed.mjs: 38 cards, 3 projects (memory-graph / blog-engine / infra), 5 kinds, 7 cross-project entity bridges, 4 supersede chains, 1 retracted card",
|
|
5
|
+
"retrieval": { "limit": 5, "hops": 1 },
|
|
6
|
+
"legend": {
|
|
7
|
+
"keyword": "答案就写在某张卡的标题或正文里,靠词面匹配就该找到",
|
|
8
|
+
"entity-bridge": "答案在另一个项目里,只有共享实体(零依赖 / sqlite / deepseek / github-actions / esm / 写作偏好)把它们连起来,期望命中多张卡",
|
|
9
|
+
"temporal": "问的是「现在」,旧卡被 supersede 链压过;expect 是当前有效的卡,demote 是必须排在其后的旧卡。mode=history 的题反过来问旧卡,考的是它没被藏起来",
|
|
10
|
+
"history": "成对出现:pair 相同、side=history 的一侧期望老的(被 supersede 的)卡,side=current 的一侧期望新的卡。两侧都要期望卡在前五,且对侧那张卡不得排在它前面——只答对一边不算过。单独出分,单独门槛,不进原 25 条的判定",
|
|
11
|
+
"negative": "库里根本没有这个话题,正确行为是低分或空,返回高分即误报"
|
|
12
|
+
},
|
|
13
|
+
"questions": [
|
|
14
|
+
{
|
|
15
|
+
"id": "k1",
|
|
16
|
+
"kind": "keyword",
|
|
17
|
+
"query": "为什么记忆不用 sqlite 存",
|
|
18
|
+
"expect": ["c-20260305-0001"],
|
|
19
|
+
"note": "最常被问的一句,答案就是那条决策卡"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "k2",
|
|
23
|
+
"kind": "keyword",
|
|
24
|
+
"query": "tokenize 中文是怎么切的",
|
|
25
|
+
"expect": ["c-20260618-0004"],
|
|
26
|
+
"note": "中英混写,技术词用英文原样打"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "k3",
|
|
30
|
+
"kind": "keyword",
|
|
31
|
+
"query": "vault 目录结构是怎样的",
|
|
32
|
+
"expect": ["c-20260901-0009"],
|
|
33
|
+
"note": "想知道磁盘上都有什么;注意 vault 这个词在很多卡的实体里"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "k4",
|
|
37
|
+
"kind": "keyword",
|
|
38
|
+
"query": "评论系统现在用什么",
|
|
39
|
+
"expect": ["c-20260512-0016"],
|
|
40
|
+
"project": "blog-engine",
|
|
41
|
+
"note": "带项目过滤问,用户知道这是博客的事"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "k5",
|
|
45
|
+
"kind": "keyword",
|
|
46
|
+
"query": "restic backup B2 多久跑一次",
|
|
47
|
+
"expect": ["c-20260320-0025"],
|
|
48
|
+
"note": "全英文关键词,运维的人就这么打"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "k6",
|
|
52
|
+
"kind": "keyword",
|
|
53
|
+
"query": "Hetzner 那台机器什么配置",
|
|
54
|
+
"expect": ["c-20260425-0026"],
|
|
55
|
+
"note": "先想起牌子再想起配置"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "k7",
|
|
59
|
+
"kind": "keyword",
|
|
60
|
+
"query": "封面图怎么处理的",
|
|
61
|
+
"expect": ["c-20260905-0020"],
|
|
62
|
+
"note": "口语化,没有出现 Cloudflare"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "k8",
|
|
66
|
+
"kind": "keyword",
|
|
67
|
+
"query": "RSS 输出全文还是摘要",
|
|
68
|
+
"expect": ["c-20261024-0023"],
|
|
69
|
+
"note": "英文字母缩写 + 中文,看缩写能不能命中"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "k9",
|
|
73
|
+
"kind": "keyword",
|
|
74
|
+
"query": "日志保留多久",
|
|
75
|
+
"expect": ["c-20261030-0034"],
|
|
76
|
+
"note": "六个字,信息量最低的问法"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "e1",
|
|
80
|
+
"kind": "entity-bridge",
|
|
81
|
+
"query": "我是不是定过所有项目都要零依赖",
|
|
82
|
+
"expect": ["c-20260520-0003", "c-20260310-0014", "c-20260809-0029"],
|
|
83
|
+
"note": "一个实体横跨三个项目,三张卡都该出来"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "e2",
|
|
87
|
+
"kind": "entity-bridge",
|
|
88
|
+
"query": "sqlite 我到底在哪些地方用过",
|
|
89
|
+
"expect": ["c-20260305-0001", "c-20260512-0016"],
|
|
90
|
+
"note": "记忆库和博客评论都用了 sqlite,跨两个项目"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "e3",
|
|
94
|
+
"kind": "entity-bridge",
|
|
95
|
+
"query": "deepseek 的钱我都花在哪了",
|
|
96
|
+
"expect": ["c-20260802-0007", "c-20261002-0031"],
|
|
97
|
+
"note": "抽取器扣费和 infra 账单告警是两张卡,同一个实体"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "e4",
|
|
101
|
+
"kind": "entity-bridge",
|
|
102
|
+
"query": "github actions 上都跑了些什么任务",
|
|
103
|
+
"expect": ["c-20260708-0018", "c-20261016-0032"],
|
|
104
|
+
"note": "博客部署和夜间备份,两个项目共用一套 Actions"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "e5",
|
|
108
|
+
"kind": "entity-bridge",
|
|
109
|
+
"query": "写作偏好这条最早是在哪里记下来的",
|
|
110
|
+
"expect": ["c-20261029-0013"],
|
|
111
|
+
"note": "最新的是博客那两条,但最早那条在记忆库项目里,考的是别被新卡盖住"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "e6",
|
|
115
|
+
"kind": "entity-bridge",
|
|
116
|
+
"query": "esm 这个选择在几个项目里一致吗",
|
|
117
|
+
"expect": ["c-20260310-0014", "c-20261101-0024", "c-20260912-0030"],
|
|
118
|
+
"note": "三个项目都提过 esm/ESM;记忆库自己那条(0003)人所共知,不计入期望"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "t1",
|
|
122
|
+
"kind": "temporal",
|
|
123
|
+
"query": "抽取模型现在默认开着吗",
|
|
124
|
+
"expect": ["c-20260802-0007"],
|
|
125
|
+
"demote": ["c-20260715-0006"],
|
|
126
|
+
"note": "旧卡说默认关闭,新卡改成显式调用,问的是哪条还算数"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "t2",
|
|
130
|
+
"kind": "temporal",
|
|
131
|
+
"query": "监控现在到底是什么方案",
|
|
132
|
+
"expect": ["c-20260706-0028"],
|
|
133
|
+
"demote": ["c-20260530-0027"],
|
|
134
|
+
"note": "两代方案,问现在"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "t3",
|
|
138
|
+
"kind": "temporal",
|
|
139
|
+
"query": "Zabbix 那套还在用吗",
|
|
140
|
+
"expect": ["c-20260706-0028"],
|
|
141
|
+
"demote": ["c-20260530-0027"],
|
|
142
|
+
"note": "用旧方案的名字提问,新卡标题和正文里都没有 Zabbix 这个词"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "t4",
|
|
146
|
+
"kind": "temporal",
|
|
147
|
+
"mode": "history",
|
|
148
|
+
"query": "最早那版抽取方案是什么",
|
|
149
|
+
"expect": ["c-20260715-0006"],
|
|
150
|
+
"note": "反过来问历史:被 superseded 的卡仍然应该查得到,不能被藏起来"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "t5",
|
|
154
|
+
"kind": "temporal",
|
|
155
|
+
"query": "最近关于监控和日志的决定",
|
|
156
|
+
"expect": ["c-20260706-0028", "c-20261030-0034"],
|
|
157
|
+
"demote": ["c-20260530-0027"],
|
|
158
|
+
"kinds": ["decision"],
|
|
159
|
+
"note": "带 kinds 过滤问最近决定,跨两个话题"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "h1h",
|
|
163
|
+
"kind": "history",
|
|
164
|
+
"pair": "h1",
|
|
165
|
+
"side": "history",
|
|
166
|
+
"query": "抽取最早是不是默认开着的",
|
|
167
|
+
"expect": ["c-20260715-0006"],
|
|
168
|
+
"rival": ["c-20260802-0007"],
|
|
169
|
+
"note": "问过去那一版;对侧 h1c 问现状。答对一边不算过"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "h1c",
|
|
173
|
+
"kind": "history",
|
|
174
|
+
"pair": "h1",
|
|
175
|
+
"side": "current",
|
|
176
|
+
"query": "抽取现在是显式调用才跑吗",
|
|
177
|
+
"expect": ["c-20260802-0007"],
|
|
178
|
+
"rival": ["c-20260715-0006"],
|
|
179
|
+
"note": "问现状;旧卡不能因为措辞接近就排上来"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"id": "h2h",
|
|
183
|
+
"kind": "history",
|
|
184
|
+
"pair": "h2",
|
|
185
|
+
"side": "history",
|
|
186
|
+
"query": "监控当初用 Zabbix 的时候是怎么弄的",
|
|
187
|
+
"expect": ["c-20260530-0027"],
|
|
188
|
+
"rival": ["c-20260706-0028"],
|
|
189
|
+
"note": "用旧方案的名字问旧方案;这是 t3 反面,t3 问的是它还在不在用"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "h2c",
|
|
193
|
+
"kind": "history",
|
|
194
|
+
"pair": "h2",
|
|
195
|
+
"side": "current",
|
|
196
|
+
"query": "监控现在是用 Prometheus 还是 Kuma",
|
|
197
|
+
"expect": ["c-20260706-0028"],
|
|
198
|
+
"rival": ["c-20260530-0027"],
|
|
199
|
+
"note": "两个候选都点名,考的是哪一代算数"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "h3h",
|
|
203
|
+
"kind": "history",
|
|
204
|
+
"pair": "h3",
|
|
205
|
+
"side": "history",
|
|
206
|
+
"query": "告警最早是发邮件的吗",
|
|
207
|
+
"expect": ["c-20260110-0036"],
|
|
208
|
+
"rival": ["c-20261102-0035"],
|
|
209
|
+
"note": "邮件 vs 邮箱 是两个 token,看旧卡能不能靠它自己的措辞被捞出来"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"id": "h3c",
|
|
213
|
+
"kind": "history",
|
|
214
|
+
"pair": "h3",
|
|
215
|
+
"side": "current",
|
|
216
|
+
"query": "告警现在只发手机吗",
|
|
217
|
+
"expect": ["c-20261102-0035"],
|
|
218
|
+
"rival": ["c-20260110-0036"],
|
|
219
|
+
"note": "问现状"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": "h4h",
|
|
223
|
+
"kind": "history",
|
|
224
|
+
"pair": "h4",
|
|
225
|
+
"side": "history",
|
|
226
|
+
"query": "证书当初是手动 renew 的吗",
|
|
227
|
+
"expect": ["c-20260105-0037"],
|
|
228
|
+
"rival": ["c-20260128-0038"],
|
|
229
|
+
"note": "旧卡独占 renew 这个词,新卡只提过手动"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"id": "h4c",
|
|
233
|
+
"kind": "history",
|
|
234
|
+
"pair": "h4",
|
|
235
|
+
"side": "current",
|
|
236
|
+
"query": "证书现在自动续期吗",
|
|
237
|
+
"expect": ["c-20260128-0038"],
|
|
238
|
+
"rival": ["c-20260105-0037"],
|
|
239
|
+
"note": "问现状"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"id": "n1",
|
|
243
|
+
"kind": "negative",
|
|
244
|
+
"query": "WASM 沙箱的 benchmark 跑出来多少",
|
|
245
|
+
"expect": [],
|
|
246
|
+
"note": "库里没有 rust/wasm。但跑出来、多少这类高频二元组可能撞上不相干的卡"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"id": "n2",
|
|
250
|
+
"kind": "negative",
|
|
251
|
+
"query": "Rust borrow checker 的 lifetime 标注怎么写",
|
|
252
|
+
"expect": [],
|
|
253
|
+
"note": "整句都是另一个技术栈的词"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "n3",
|
|
257
|
+
"kind": "negative",
|
|
258
|
+
"query": "我妈生日是哪天",
|
|
259
|
+
"expect": [],
|
|
260
|
+
"note": "生活类问题,库里一条都没有"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"id": "n4",
|
|
264
|
+
"kind": "negative",
|
|
265
|
+
"query": "GraphQL schema 的 codegen 流程是什么",
|
|
266
|
+
"expect": [],
|
|
267
|
+
"note": "英文技术名词,没记过"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"id": "n5",
|
|
271
|
+
"kind": "negative",
|
|
272
|
+
"query": "iOS 的 TestFlight 审核过了吗",
|
|
273
|
+
"expect": [],
|
|
274
|
+
"note": "另一个完全没碰过的平台"
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
}
|