@yun-zero/claw-memory 0.1.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.
Files changed (131) hide show
  1. package/.claude/settings.local.json +68 -0
  2. package/README.md +323 -0
  3. package/dist/config/llm.d.ts +13 -0
  4. package/dist/config/llm.d.ts.map +1 -0
  5. package/dist/config/llm.js +96 -0
  6. package/dist/config/llm.js.map +1 -0
  7. package/dist/config/plugin.d.ts +15 -0
  8. package/dist/config/plugin.d.ts.map +1 -0
  9. package/dist/config/plugin.js +32 -0
  10. package/dist/config/plugin.js.map +1 -0
  11. package/dist/db/entityRepository.d.ts +21 -0
  12. package/dist/db/entityRepository.d.ts.map +1 -0
  13. package/dist/db/entityRepository.js +55 -0
  14. package/dist/db/entityRepository.js.map +1 -0
  15. package/dist/db/repository.d.ts +22 -0
  16. package/dist/db/repository.d.ts.map +1 -0
  17. package/dist/db/repository.js +77 -0
  18. package/dist/db/repository.js.map +1 -0
  19. package/dist/db/schema.d.ts +5 -0
  20. package/dist/db/schema.d.ts.map +1 -0
  21. package/dist/db/schema.js +112 -0
  22. package/dist/db/schema.js.map +1 -0
  23. package/dist/db/todoRepository.d.ts +26 -0
  24. package/dist/db/todoRepository.d.ts.map +1 -0
  25. package/dist/db/todoRepository.js +54 -0
  26. package/dist/db/todoRepository.js.map +1 -0
  27. package/dist/hooks/bootstrap.d.ts +3 -0
  28. package/dist/hooks/bootstrap.d.ts.map +1 -0
  29. package/dist/hooks/bootstrap.js +28 -0
  30. package/dist/hooks/bootstrap.js.map +1 -0
  31. package/dist/hooks/message.d.ts +18 -0
  32. package/dist/hooks/message.d.ts.map +1 -0
  33. package/dist/hooks/message.js +52 -0
  34. package/dist/hooks/message.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +46 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mcp/tools.d.ts +26 -0
  40. package/dist/mcp/tools.d.ts.map +1 -0
  41. package/dist/mcp/tools.js +360 -0
  42. package/dist/mcp/tools.js.map +1 -0
  43. package/dist/plugin.d.ts +18 -0
  44. package/dist/plugin.d.ts.map +1 -0
  45. package/dist/plugin.js +62 -0
  46. package/dist/plugin.js.map +1 -0
  47. package/dist/services/entityGraphService.d.ts +87 -0
  48. package/dist/services/entityGraphService.d.ts.map +1 -0
  49. package/dist/services/entityGraphService.js +271 -0
  50. package/dist/services/entityGraphService.js.map +1 -0
  51. package/dist/services/memory.d.ts +26 -0
  52. package/dist/services/memory.d.ts.map +1 -0
  53. package/dist/services/memory.js +281 -0
  54. package/dist/services/memory.js.map +1 -0
  55. package/dist/services/memoryIndex.d.ts +34 -0
  56. package/dist/services/memoryIndex.d.ts.map +1 -0
  57. package/dist/services/memoryIndex.js +100 -0
  58. package/dist/services/memoryIndex.js.map +1 -0
  59. package/dist/services/metadataExtractor.d.ts +16 -0
  60. package/dist/services/metadataExtractor.d.ts.map +1 -0
  61. package/dist/services/metadataExtractor.js +75 -0
  62. package/dist/services/metadataExtractor.js.map +1 -0
  63. package/dist/services/retrieval.d.ts +24 -0
  64. package/dist/services/retrieval.d.ts.map +1 -0
  65. package/dist/services/retrieval.js +40 -0
  66. package/dist/services/retrieval.js.map +1 -0
  67. package/dist/services/scheduler.d.ts +122 -0
  68. package/dist/services/scheduler.d.ts.map +1 -0
  69. package/dist/services/scheduler.js +434 -0
  70. package/dist/services/scheduler.js.map +1 -0
  71. package/dist/services/summarizer.d.ts +43 -0
  72. package/dist/services/summarizer.d.ts.map +1 -0
  73. package/dist/services/summarizer.js +252 -0
  74. package/dist/services/summarizer.js.map +1 -0
  75. package/dist/services/tagService.d.ts +64 -0
  76. package/dist/services/tagService.d.ts.map +1 -0
  77. package/dist/services/tagService.js +281 -0
  78. package/dist/services/tagService.js.map +1 -0
  79. package/dist/tools/memory.d.ts +3 -0
  80. package/dist/tools/memory.d.ts.map +1 -0
  81. package/dist/tools/memory.js +114 -0
  82. package/dist/tools/memory.js.map +1 -0
  83. package/dist/types.d.ts +128 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +6 -0
  86. package/dist/types.js.map +1 -0
  87. package/docs/plans/2026-03-02-claw-memory-design.md +445 -0
  88. package/docs/plans/2026-03-02-incremental-summary-design.md +157 -0
  89. package/docs/plans/2026-03-02-incremental-summary-implementation.md +468 -0
  90. package/docs/plans/2026-03-02-memory-index-design.md +163 -0
  91. package/docs/plans/2026-03-02-memory-index-implementation.md +836 -0
  92. package/docs/plans/2026-03-02-mvp-implementation.md +1703 -0
  93. package/docs/plans/2026-03-02-testing-implementation.md +395 -0
  94. package/docs/plans/2026-03-02-testing-plan.md +93 -0
  95. package/docs/plans/2026-03-03-claw-memory-openclaw-plugin-design.md +285 -0
  96. package/docs/plans/2026-03-03-claw-memory-plugin-implementation.md +642 -0
  97. package/docs/plans/2026-03-03-entity-graph-design.md +121 -0
  98. package/docs/plans/2026-03-03-entity-graph-implementation.md +687 -0
  99. package/docs/plans/2026-03-03-llm-generic-config-design.md +43 -0
  100. package/docs/plans/2026-03-03-llm-generic-config-implementation.md +186 -0
  101. package/docs/plans/2026-03-03-memory-e2e-stress-test-design.md +110 -0
  102. package/docs/plans/2026-03-03-memory-e2e-stress-test-implementation.md +464 -0
  103. package/docs/plans/2026-03-03-minimax-llm-fix.md +156 -0
  104. package/docs/plans/2026-03-03-scheduler-design.md +165 -0
  105. package/docs/plans/2026-03-03-scheduler-implementation.md +777 -0
  106. package/docs/plans/2026-03-03-tags-visualization-design.md +73 -0
  107. package/docs/plans/2026-03-03-tags-visualization-implementation.md +539 -0
  108. package/openclaw.plugin.json +11 -0
  109. package/package.json +41 -0
  110. package/src/config/llm.ts +129 -0
  111. package/src/config/plugin.ts +47 -0
  112. package/src/db/entityRepository.ts +80 -0
  113. package/src/db/repository.ts +106 -0
  114. package/src/db/schema.ts +121 -0
  115. package/src/db/todoRepository.ts +76 -0
  116. package/src/hooks/bootstrap.ts +36 -0
  117. package/src/hooks/message.ts +84 -0
  118. package/src/index.ts +50 -0
  119. package/src/plugin.ts +85 -0
  120. package/src/services/entityGraphService.ts +367 -0
  121. package/src/services/memory.ts +338 -0
  122. package/src/services/memoryIndex.ts +140 -0
  123. package/src/services/metadataExtractor.ts +89 -0
  124. package/src/services/retrieval.ts +71 -0
  125. package/src/services/scheduler.ts +529 -0
  126. package/src/services/summarizer.ts +318 -0
  127. package/src/services/tagService.ts +335 -0
  128. package/src/tools/memory.ts +137 -0
  129. package/src/types.ts +139 -0
  130. package/tsconfig.json +20 -0
  131. package/vitest.config.ts +16 -0
@@ -0,0 +1,395 @@
1
+ # Claw-Memory 测试实现计划
2
+
3
+ > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
4
+
5
+ **Goal:** 为 Claw-Memory 核心业务逻辑添加边界测试和异常处理测试,达到 80%+ 覆盖率
6
+
7
+ **Architecture:** 使用 Vitest 框架,按照现有测试结构扩展 memory service 和 retrieval service 的测试用例,覆盖边界条件和异常场景
8
+
9
+ **Tech Stack:** Vitest, TypeScript, Node.js
10
+
11
+ ---
12
+
13
+ ## Task 1: 扩展 memory.test.ts - saveMemory 边界测试
14
+
15
+ **Files:**
16
+ - Modify: `tests/services/memory.test.ts`
17
+
18
+ **Step 1: 添加边界测试用例**
19
+
20
+ ```typescript
21
+ describe('saveMemory boundaries', () => {
22
+ it('should save memory with empty content', async () => {
23
+ const result = await service.saveMemory({
24
+ content: '',
25
+ metadata: { summary: 'Empty content test' }
26
+ });
27
+ expect(result.id).toBeDefined();
28
+ });
29
+
30
+ it('should save memory without metadata', async () => {
31
+ const result = await service.saveMemory({
32
+ content: 'Test content only'
33
+ });
34
+ expect(result.id).toBeDefined();
35
+ expect(result.importance).toBe(0.5); // default
36
+ });
37
+
38
+ it('should save memory with custom importance=1.0', async () => {
39
+ const result = await service.saveMemory({
40
+ content: 'High importance',
41
+ metadata: { importance: 1.0 }
42
+ });
43
+ expect(result.importance).toBe(1.0);
44
+ });
45
+
46
+ it('should save memory with custom importance=0', async () => {
47
+ const result = await service.saveMemory({
48
+ content: 'Zero importance',
49
+ metadata: { importance: 0 }
50
+ });
51
+ expect(result.importance).toBe(0);
52
+ });
53
+
54
+ it('should save memory with long content', async () => {
55
+ const longContent = 'a'.repeat(10000);
56
+ const result = await service.saveMemory({
57
+ content: longContent,
58
+ metadata: { summary: 'Long content' }
59
+ });
60
+ expect(result.id).toBeDefined();
61
+ expect(result.tokenCount).toBeGreaterThan(0);
62
+ });
63
+ });
64
+ ```
65
+
66
+ **Step 2: 运行测试验证**
67
+
68
+ Run: `npm test tests/services/memory.test.ts`
69
+ Expected: PASS (5 new tests)
70
+
71
+ **Step 3: 提交**
72
+
73
+ ```bash
74
+ git add tests/services/memory.test.ts
75
+ git commit -m "test: add saveMemory boundary tests"
76
+ ```
77
+
78
+ ---
79
+
80
+ ## Task 2: 扩展 memory.test.ts - searchMemory 边界测试
81
+
82
+ **Files:**
83
+ - Modify: `tests/services/memory.test.ts`
84
+
85
+ **Step 1: 添加搜索边界测试**
86
+
87
+ ```typescript
88
+ describe('searchMemory boundaries', () => {
89
+ beforeEach(async () => {
90
+ await service.saveMemory({ content: 'Test 1', metadata: { summary: 'Test 1' } });
91
+ await service.saveMemory({ content: 'Test 2', metadata: { summary: 'Test 2' } });
92
+ });
93
+
94
+ it('should return all memories with empty query', async () => {
95
+ const results = await service.searchMemory({ query: '', limit: 10 });
96
+ expect(results.length).toBeGreaterThanOrEqual(2);
97
+ });
98
+
99
+ it('should return empty array for non-existent query', async () => {
100
+ const results = await service.searchMemory({ query: 'xyznonexistent', limit: 10 });
101
+ expect(results).toEqual([]);
102
+ });
103
+
104
+ it('should return empty array when limit=0', async () => {
105
+ const results = await service.searchMemory({ query: '', limit: 0 });
106
+ expect(results).toEqual([]);
107
+ });
108
+
109
+ it('should respect limit parameter', async () => {
110
+ const results = await service.searchMemory({ query: '', limit: 1 });
111
+ expect(results.length).toBe(1);
112
+ });
113
+
114
+ it('should handle large limit', async () => {
115
+ const results = await service.searchMemory({ query: '', limit: 10000 });
116
+ expect(results.length).toBeGreaterThan(0);
117
+ });
118
+ });
119
+ ```
120
+
121
+ **Step 2: 运行测试**
122
+
123
+ Run: `npm test tests/services/memory.test.ts`
124
+ Expected: PASS
125
+
126
+ **Step 3: 提交**
127
+
128
+ ```bash
129
+ git add tests/services/memory.test.ts
130
+ git commit -m "test: add searchMemory boundary tests"
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Task 3: 扩展 memory.test.ts - getContext 边界测试
136
+
137
+ **Files:**
138
+ - Modify: `tests/services/memory.test.ts`
139
+
140
+ **Step 1: 添加上下文边界测试**
141
+
142
+ ```typescript
143
+ describe('getContext boundaries', () => {
144
+ it('should return empty string when no memories', async () => {
145
+ const db = new Database(':memory:');
146
+ initializeDatabase(db);
147
+ const emptyService = new MemoryService(db, './test_ctx');
148
+ const result = await emptyService.getContext({ query: 'test', maxTokens: 100 });
149
+ expect(result).toBe('');
150
+ });
151
+
152
+ it('should return empty when maxTokens=0', async () => {
153
+ const result = await service.getContext({ query: 'test', maxTokens: 0 });
154
+ expect(result).toBe('');
155
+ });
156
+
157
+ it('should handle very large maxTokens', async () => {
158
+ const result = await service.getContext({ query: 'test', maxTokens: 100000 });
159
+ expect(result.length).toBeGreaterThan(0);
160
+ });
161
+
162
+ it('should truncate when single memory exceeds maxTokens', async () => {
163
+ const longMemory = await service.saveMemory({
164
+ content: 'a'.repeat(5000),
165
+ metadata: { summary: 'Long' }
166
+ });
167
+ const result = await service.getContext({ query: 'Long', maxTokens: 100 });
168
+ // Should handle gracefully
169
+ expect(typeof result).toBe('string');
170
+ });
171
+ });
172
+ ```
173
+
174
+ **Step 2: 运行测试**
175
+
176
+ Run: `npm test tests/services/memory.test.ts`
177
+ Expected: PASS
178
+
179
+ **Step 3: 提交**
180
+
181
+ ```bash
182
+ git add tests/services/memory.test.ts
183
+ git commit -m "test: add getContext boundary tests"
184
+ ```
185
+
186
+ ---
187
+
188
+ ## Task 4: 扩展 retrieval.test.ts - 权重计算边界测试
189
+
190
+ **Files:**
191
+ - Modify: `tests/services/retrieval.test.ts`
192
+
193
+ **Step 1: 添加权重边界测试**
194
+
195
+ ```typescript
196
+ describe('calculateWeight boundaries', () => {
197
+ const baseConfig = DEFAULT_TIME_DECAY;
198
+
199
+ it('should return max weight for today', () => {
200
+ const today = new Date().toISOString().split('T')[0];
201
+ const weight = calculateWeight({
202
+ entityMatch: 4,
203
+ timeDecay: baseConfig,
204
+ memoryDate: today,
205
+ tagMatch: 10,
206
+ importance: 1.0
207
+ });
208
+ expect(weight).toBeGreaterThan(30);
209
+ });
210
+
211
+ it('should return lower weight for 1 week ago', () => {
212
+ const lastWeek = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
213
+ const weight = calculateWeight({
214
+ entityMatch: 4,
215
+ timeDecay: baseConfig,
216
+ memoryDate: lastWeek,
217
+ tagMatch: 10,
218
+ importance: 1.0
219
+ });
220
+ expect(weight).toBeLessThan(30);
221
+ });
222
+
223
+ it('should return lower weight for 1 year ago', () => {
224
+ const lastYear = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
225
+ const weight = calculateWeight({
226
+ entityMatch: 4,
227
+ timeDecay: baseConfig,
228
+ memoryDate: lastYear,
229
+ tagMatch: 10,
230
+ importance: 1.0
231
+ });
232
+ expect(weight).toBeLessThan(10);
233
+ });
234
+
235
+ it('should return 0 weight when importance=0', () => {
236
+ const today = new Date().toISOString().split('T')[0];
237
+ const weight = calculateWeight({
238
+ entityMatch: 0,
239
+ timeDecay: baseConfig,
240
+ memoryDate: today,
241
+ tagMatch: 0,
242
+ importance: 0
243
+ });
244
+ expect(weight).toBe(0);
245
+ });
246
+
247
+ it('should cap entityMatch at 40', () => {
248
+ const today = new Date().toISOString().split('T')[0];
249
+ const weight = calculateWeight({
250
+ entityMatch: 10, // should cap at 4
251
+ timeDecay: baseConfig,
252
+ memoryDate: today,
253
+ tagMatch: 0,
254
+ importance: 0
255
+ });
256
+ // entityMatch * 10 = 40, capped
257
+ expect(weight).toBe(16); // 40*0.4 + 30*0.3
258
+ });
259
+
260
+ it('should cap tagMatch at 20', () => {
261
+ const today = new Date().toISOString().split('T')[0];
262
+ const weight = calculateWeight({
263
+ entityMatch: 0,
264
+ timeDecay: baseConfig,
265
+ memoryDate: today,
266
+ tagMatch: 20, // should cap at 10
267
+ importance: 0
268
+ });
269
+ // tagMatch * 2 = 40, capped to 20
270
+ expect(weight).toBe(6); // 20*0.2 + 30*0.3
271
+ });
272
+
273
+ it('should handle future dates gracefully', () => {
274
+ const future = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString().split('T')[0];
275
+ const weight = calculateWeight({
276
+ entityMatch: 0,
277
+ timeDecay: baseConfig,
278
+ memoryDate: future,
279
+ tagMatch: 0,
280
+ importance: 0.5
281
+ });
282
+ expect(weight).toBeGreaterThanOrEqual(0);
283
+ });
284
+ });
285
+ ```
286
+
287
+ **Step 2: 运行测试**
288
+
289
+ Run: `npm test tests/services/retrieval.test.ts`
290
+ Expected: PASS
291
+
292
+ **Step 3: 提交**
293
+
294
+ ```bash
295
+ git add tests/services/retrieval.test.ts
296
+ git commit -m "test: add retrieval weight boundary tests"
297
+ ```
298
+
299
+ ---
300
+
301
+ ## Task 5: 添加异常处理测试
302
+
303
+ **Files:**
304
+ - Create: `tests/services/error-handling.test.ts`
305
+
306
+ **Step 1: 创建错误处理测试**
307
+
308
+ ```typescript
309
+ import { describe, it, expect, beforeEach } from 'vitest';
310
+ import Database from 'better-sqlite3';
311
+ import { initializeDatabase } from '../../src/db/schema.js';
312
+ import { MemoryService } from '../../src/services/memory.js';
313
+
314
+ describe('Error Handling', () => {
315
+ let db: Database.Database;
316
+ let service: MemoryService;
317
+
318
+ beforeEach(() => {
319
+ db = new Database(':memory:');
320
+ initializeDatabase(db);
321
+ service = new MemoryService(db, './test_errors');
322
+ });
323
+
324
+ it('should handle missing content field gracefully', async () => {
325
+ // This should use default value or handle gracefully
326
+ const result = await service.saveMemory({
327
+ content: 'Valid content'
328
+ } as any);
329
+ expect(result.id).toBeDefined();
330
+ });
331
+
332
+ it('should handle invalid importance value', async () => {
333
+ const result = await service.saveMemory({
334
+ content: 'Test',
335
+ metadata: { importance: 2.0 } as any // Invalid, should cap at 1
336
+ });
337
+ expect(result.importance).toBeLessThanOrEqual(1);
338
+ });
339
+
340
+ it('should handle negative importance', async () => {
341
+ const result = await service.saveMemory({
342
+ content: 'Test',
343
+ metadata: { importance: -0.5 } as any
344
+ });
345
+ expect(result.importance).toBeGreaterThanOrEqual(0);
346
+ });
347
+
348
+ it('searchMemory should handle missing query gracefully', async () => {
349
+ const results = await service.searchMemory({} as any);
350
+ expect(Array.isArray(results)).toBe(true);
351
+ });
352
+ });
353
+ ```
354
+
355
+ **Step 2: 运行测试**
356
+
357
+ Run: `npm test tests/services/error-handling.test.ts`
358
+ Expected: PASS
359
+
360
+ **Step 3: 提交**
361
+
362
+ ```bash
363
+ git add tests/services/error-handling.test.ts
364
+ git commit -m "test: add error handling tests"
365
+ ```
366
+
367
+ ---
368
+
369
+ ## Task 6: 验证覆盖率
370
+
371
+ **Step 1: 运行所有测试**
372
+
373
+ Run: `npm test`
374
+ Expected: All tests pass
375
+
376
+ **Step 2: 检查覆盖率**
377
+
378
+ Run: `npx vitest --coverage`
379
+ Expected: 80%+ coverage on core modules
380
+
381
+ **Step 3: 提交**
382
+
383
+ ```bash
384
+ git add .
385
+ git commit -m "test: complete boundary and error tests"
386
+ ```
387
+
388
+ ---
389
+
390
+ ## 完成
391
+
392
+ 测试实现完成后,预期:
393
+ - 当前: 24 tests
394
+ - 目标: 50+ tests
395
+ - 覆盖率: 80%+ on memory service and retrieval service
@@ -0,0 +1,93 @@
1
+ # Claw-Memory 测试方案设计
2
+
3
+ > 创建日期: 2026-03-02
4
+ > 状态: 待批准
5
+
6
+ ## 1. 测试目标
7
+
8
+ - **范围**: 核心业务逻辑 (memory service, retrieval service)
9
+ - **策略**: 基础测试 + 边界测试 + 异常处理
10
+ - **覆盖率**: 80%+
11
+
12
+ ## 2. 测试结构
13
+
14
+ ```
15
+ tests/
16
+ ├── services/
17
+ │ ├── memory.test.ts # 扩展: 边界 + 异常
18
+ │ └── retrieval.test.ts # 扩展: 边界 + 异常
19
+ └── db/
20
+ └── repository.test.ts # 扩展: 边界测试
21
+ ```
22
+
23
+ ## 3. 测试用例设计
24
+
25
+ ### 3.1 MemoryService
26
+
27
+ #### saveMemory 边界测试
28
+
29
+ | 测试项 | 输入 | 预期 |
30
+ |-------|------|------|
31
+ | 正常保存 | 完整 metadata | 成功返回 memory 对象 |
32
+ | 空 content | content: "" | 允许空内容 |
33
+ | 无 metadata | 无 metadata 字段 | 使用默认值 |
34
+ | 缺失 tags | metadata: {} | tags 为空数组 |
35
+ | 自定义 importance | importance: 1.0 | 正确保存 |
36
+ | 超长 content | 10000+ 字符 | 正确处理 |
37
+
38
+ #### searchMemory 边界测试
39
+
40
+ | 测试项 | 输入 | 预期 |
41
+ |-------|------|------|
42
+ | 空 query | query: "" | 返回所有记忆 |
43
+ | 空结果 | query: "不存在" | 返回空数组 |
44
+ | limit=0 | limit: 0 | 返回空数组 |
45
+ | limit=1 | limit: 1 | 返回 1 条 |
46
+ | 超大 limit | limit: 10000 | 正确限制 |
47
+
48
+ #### getContext 边界测试
49
+
50
+ | 测试项 | 输入 | 预期 |
51
+ |-------|------|------|
52
+ | 空结果 | 无记忆 | 返回空字符串 |
53
+ | maxTokens=0 | maxTokens: 0 | 返回空 |
54
+ | 超大 maxTokens | maxTokens: 100000 | 正确处理 |
55
+ | 单条记忆超限 | 单条 > maxTokens | 截断 |
56
+
57
+ ### 3.2 RetrievalService
58
+
59
+ #### calculateWeight 边界测试
60
+
61
+ | 测试项 | 输入 | 预期 |
62
+ |-------|------|------|
63
+ | 今天 | memoryDate: 今天 | 最高权重 |
64
+ | 1周前 | memoryDate: 7天前 | 中等权重 |
65
+ | 1年前 | memoryDate: 365天前 | 较低权重 |
66
+ | 重要性=0 | importance: 0 | 权重 0 |
67
+ | 重要性=1 | importance: 1 | 权重 10 |
68
+ | entityMatch=0 | entityMatch: 0 | 权重 0 |
69
+ | entityMatch=10 | entityMatch: 10 | 权重 40 (上限) |
70
+
71
+ ### 3.3 异常处理测试
72
+
73
+ | 场景 | 预期行为 |
74
+ |-----|---------|
75
+ | 数据库连接失败 | 抛出明确错误 |
76
+ | 文件写入失败 | 返回错误信息 |
77
+ | 非法 JSON | 错误处理 |
78
+
79
+ ## 4. 覆盖率目标
80
+
81
+ | 模块 | 当前测试数 | 目标测试数 |
82
+ |-----|----------|----------|
83
+ | memory.ts | 3 | 15+ |
84
+ | retrieval.ts | 2 | 10+ |
85
+ | repository.ts | 5 | 8+ |
86
+
87
+ ## 5. 执行计划
88
+
89
+ 1. 扩展 memory.test.ts - 添加 12 个边界测试
90
+ 2. 扩展 retrieval.test.ts - 添加 8 个边界测试
91
+ 3. 扩展 repository.test.ts - 添加 3 个边界测试
92
+ 4. 添加异常场景测试
93
+ 5. 运行测试确保 80%+ 覆盖率