gencode-ai 0.2.0 → 0.3.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 (150) hide show
  1. package/dist/agent/agent.d.ts +9 -2
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js +37 -8
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/types.d.ts +5 -1
  6. package/dist/agent/types.d.ts.map +1 -1
  7. package/dist/cli/components/App.d.ts.map +1 -1
  8. package/dist/cli/components/App.js +15 -9
  9. package/dist/cli/components/App.js.map +1 -1
  10. package/dist/cli/components/Messages.js +1 -1
  11. package/dist/cli/components/Messages.js.map +1 -1
  12. package/dist/cli/components/ModelSelector.d.ts +4 -3
  13. package/dist/cli/components/ModelSelector.d.ts.map +1 -1
  14. package/dist/cli/components/ModelSelector.js +54 -37
  15. package/dist/cli/components/ModelSelector.js.map +1 -1
  16. package/dist/cli/components/ProviderManager.d.ts +2 -2
  17. package/dist/cli/components/ProviderManager.d.ts.map +1 -1
  18. package/dist/cli/components/ProviderManager.js +137 -156
  19. package/dist/cli/components/ProviderManager.js.map +1 -1
  20. package/dist/cli/index.js +30 -13
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/config/index.d.ts +2 -2
  23. package/dist/config/index.d.ts.map +1 -1
  24. package/dist/config/index.js +1 -1
  25. package/dist/config/index.js.map +1 -1
  26. package/dist/config/levels.d.ts +5 -5
  27. package/dist/config/levels.d.ts.map +1 -1
  28. package/dist/config/levels.js +20 -20
  29. package/dist/config/levels.js.map +1 -1
  30. package/dist/config/merger.js +1 -1
  31. package/dist/config/merger.js.map +1 -1
  32. package/dist/config/providers-config.d.ts +8 -5
  33. package/dist/config/providers-config.d.ts.map +1 -1
  34. package/dist/config/providers-config.js +19 -22
  35. package/dist/config/providers-config.js.map +1 -1
  36. package/dist/config/test-utils.d.ts +2 -2
  37. package/dist/config/test-utils.d.ts.map +1 -1
  38. package/dist/config/test-utils.js +4 -4
  39. package/dist/config/test-utils.js.map +1 -1
  40. package/dist/config/types.d.ts +23 -17
  41. package/dist/config/types.d.ts.map +1 -1
  42. package/dist/config/types.js +14 -14
  43. package/dist/config/types.js.map +1 -1
  44. package/dist/memory/memory-manager.d.ts +25 -12
  45. package/dist/memory/memory-manager.d.ts.map +1 -1
  46. package/dist/memory/memory-manager.js +241 -112
  47. package/dist/memory/memory-manager.js.map +1 -1
  48. package/dist/memory/test-utils.d.ts +1 -1
  49. package/dist/memory/test-utils.d.ts.map +1 -1
  50. package/dist/memory/test-utils.js +3 -3
  51. package/dist/memory/test-utils.js.map +1 -1
  52. package/dist/memory/types.d.ts +20 -10
  53. package/dist/memory/types.d.ts.map +1 -1
  54. package/dist/memory/types.js +13 -13
  55. package/dist/memory/types.js.map +1 -1
  56. package/dist/migration/migrate.d.ts +24 -0
  57. package/dist/migration/migrate.d.ts.map +1 -0
  58. package/dist/migration/migrate.js +164 -0
  59. package/dist/migration/migrate.js.map +1 -0
  60. package/dist/permissions/persistence.d.ts +2 -2
  61. package/dist/permissions/persistence.js +4 -4
  62. package/dist/permissions/persistence.js.map +1 -1
  63. package/dist/planning/plan-file.d.ts +1 -1
  64. package/dist/planning/plan-file.js +2 -2
  65. package/dist/planning/plan-file.js.map +1 -1
  66. package/dist/prompts/index.d.ts +5 -4
  67. package/dist/prompts/index.d.ts.map +1 -1
  68. package/dist/prompts/index.js +11 -8
  69. package/dist/prompts/index.js.map +1 -1
  70. package/dist/providers/anthropic.d.ts +2 -1
  71. package/dist/providers/anthropic.d.ts.map +1 -1
  72. package/dist/providers/anthropic.js +7 -0
  73. package/dist/providers/anthropic.js.map +1 -1
  74. package/dist/providers/gemini.d.ts +2 -1
  75. package/dist/providers/gemini.d.ts.map +1 -1
  76. package/dist/providers/gemini.js +7 -0
  77. package/dist/providers/gemini.js.map +1 -1
  78. package/dist/providers/index.d.ts +20 -10
  79. package/dist/providers/index.d.ts.map +1 -1
  80. package/dist/providers/index.js +48 -24
  81. package/dist/providers/index.js.map +1 -1
  82. package/dist/providers/openai.d.ts +2 -1
  83. package/dist/providers/openai.d.ts.map +1 -1
  84. package/dist/providers/openai.js +7 -0
  85. package/dist/providers/openai.js.map +1 -1
  86. package/dist/providers/registry.d.ts +48 -34
  87. package/dist/providers/registry.d.ts.map +1 -1
  88. package/dist/providers/registry.js +72 -88
  89. package/dist/providers/registry.js.map +1 -1
  90. package/dist/providers/store.d.ts +43 -17
  91. package/dist/providers/store.d.ts.map +1 -1
  92. package/dist/providers/store.js +112 -19
  93. package/dist/providers/store.js.map +1 -1
  94. package/dist/providers/types.d.ts +23 -0
  95. package/dist/providers/types.d.ts.map +1 -1
  96. package/dist/providers/vertex-ai.d.ts +15 -7
  97. package/dist/providers/vertex-ai.d.ts.map +1 -1
  98. package/dist/providers/vertex-ai.js +46 -13
  99. package/dist/providers/vertex-ai.js.map +1 -1
  100. package/dist/session/types.js +1 -1
  101. package/dist/session/types.js.map +1 -1
  102. package/docs/config-system-comparison.md +50 -50
  103. package/docs/cost-tracking-comparison.md +2 -2
  104. package/docs/memory-system.md +124 -31
  105. package/docs/permissions.md +2 -2
  106. package/docs/proposals/0006-memory-system.md +4 -4
  107. package/docs/proposals/0008-checkpointing.md +109 -2
  108. package/docs/proposals/0011-custom-commands.md +2 -1
  109. package/docs/proposals/0021-skills-system.md +2 -1
  110. package/docs/proposals/0023-permission-enhancements.md +2 -2
  111. package/docs/proposals/0033-enterprise-deployment.md +1 -1
  112. package/docs/proposals/0041-configuration-system.md +17 -19
  113. package/docs/proposals/0042-prompt-optimization.md +17 -9
  114. package/docs/proposals/README.md +5 -5
  115. package/docs/providers.md +94 -9
  116. package/package.json +3 -2
  117. package/scripts/migrate.ts +449 -0
  118. package/src/agent/agent.ts +51 -9
  119. package/src/agent/types.ts +5 -1
  120. package/src/cli/components/App.tsx +17 -8
  121. package/src/cli/components/Messages.tsx +1 -1
  122. package/src/cli/components/ModelSelector.tsx +62 -43
  123. package/src/cli/components/ProviderManager.tsx +278 -323
  124. package/src/cli/index.tsx +36 -17
  125. package/src/config/index.ts +5 -3
  126. package/src/config/levels.test.ts +22 -22
  127. package/src/config/levels.ts +22 -22
  128. package/src/config/loader.test.ts +14 -14
  129. package/src/config/manager.test.ts +19 -19
  130. package/src/config/merger.test.ts +23 -23
  131. package/src/config/merger.ts +1 -1
  132. package/src/config/providers-config.ts +23 -21
  133. package/src/config/test-utils.ts +6 -6
  134. package/src/config/types.ts +30 -20
  135. package/src/memory/memory-manager.test.ts +242 -24
  136. package/src/memory/memory-manager.ts +270 -141
  137. package/src/memory/test-utils.ts +4 -4
  138. package/src/memory/types.ts +28 -17
  139. package/src/permissions/persistence.ts +4 -4
  140. package/src/planning/plan-file.ts +2 -2
  141. package/src/prompts/index.ts +13 -9
  142. package/src/providers/anthropic.ts +9 -0
  143. package/src/providers/gemini.ts +9 -0
  144. package/src/providers/index.ts +76 -33
  145. package/src/providers/openai.ts +9 -0
  146. package/src/providers/registry.ts +116 -111
  147. package/src/providers/store.ts +130 -28
  148. package/src/providers/types.ts +33 -1
  149. package/src/providers/vertex-ai.ts +49 -13
  150. package/src/session/types.ts +1 -1
@@ -34,11 +34,11 @@ describe('MemoryManager Integration', () => {
34
34
  afterEach(() => test.cleanup());
35
35
 
36
36
  describe('load', () => {
37
- it('should load AGENT.md from .gencode directory', async () => {
38
- await writeMemory(test.projectDir, 'gencode', '# GenCode\n\nTest content - MARKER_123');
37
+ it('should load GEN.md from .gen directory', async () => {
38
+ await writeMemory(test.projectDir, 'gen', '# GenCode\n\nTest content - MARKER_123');
39
39
 
40
40
  const memory = await new MemoryManager().load({ cwd: test.projectDir });
41
- const file = memory.files.find((f) => f.namespace === 'gencode' && f.level === 'project');
41
+ const file = memory.files.find((f) => f.namespace === 'gen' && f.level === 'project');
42
42
 
43
43
  expect(file?.content).toContain('MARKER_123');
44
44
  });
@@ -54,29 +54,29 @@ describe('MemoryManager Integration', () => {
54
54
 
55
55
  it('should load from both namespaces with correct order (claude first, gencode second)', async () => {
56
56
  await writeMemory(test.projectDir, 'claude', '# Claude - ORDER_TEST');
57
- await writeMemory(test.projectDir, 'gencode', '# GenCode - ORDER_TEST');
57
+ await writeMemory(test.projectDir, 'gen', '# GenCode - ORDER_TEST');
58
58
 
59
59
  const memory = await new MemoryManager().load({ cwd: test.projectDir });
60
60
  const projectFiles = memory.files.filter((f) => f.level === 'project');
61
61
 
62
62
  const claudeIdx = projectFiles.findIndex((f) => f.namespace === 'claude');
63
- const gencodeIdx = projectFiles.findIndex((f) => f.namespace === 'gencode');
63
+ const gencodeIdx = projectFiles.findIndex((f) => f.namespace === 'gen');
64
64
 
65
65
  expect(claudeIdx).toBeLessThan(gencodeIdx); // gencode appears later = higher priority
66
66
  });
67
67
 
68
- it('should load root-level AGENT.md and CLAUDE.md', async () => {
68
+ it('should load root-level GEN.md and CLAUDE.md', async () => {
69
69
  await writeMemory(test.projectDir, 'claude', '# Root Claude', { inDir: false });
70
- await writeMemory(test.projectDir, 'gencode', '# Root GenCode', { inDir: false });
70
+ await writeMemory(test.projectDir, 'gen', '# Root GenCode', { inDir: false });
71
71
 
72
- const memory = await new MemoryManager().load({ cwd: test.projectDir });
72
+ const memory = await new MemoryManager().load({ cwd: test.projectDir, strategy: 'both' });
73
73
 
74
74
  expect(memory.context).toContain('Root Claude');
75
75
  expect(memory.context).toContain('Root GenCode');
76
76
  });
77
77
 
78
78
  it('should load local memory files', async () => {
79
- await writeMemory(test.projectDir, 'gencode', '# Local Notes\n\nPersonal content', { local: true });
79
+ await writeMemory(test.projectDir, 'gen', '# Local Notes\n\nPersonal content', { local: true });
80
80
 
81
81
  const memory = await new MemoryManager().load({ cwd: test.projectDir });
82
82
  const localFile = memory.files.find((f) => f.level === 'local');
@@ -87,8 +87,8 @@ describe('MemoryManager Integration', () => {
87
87
  it('should load from extra config dirs', async () => {
88
88
  const extraDir = path.join(test.tempDir, 'extra-config');
89
89
  await fs.mkdir(extraDir, { recursive: true });
90
- await fs.writeFile(path.join(extraDir, 'AGENT.md'), '# Extra\n\nShared team content');
91
- process.env.GENCODE_CONFIG_DIRS = extraDir;
90
+ await fs.writeFile(path.join(extraDir, 'GEN.md'), '# Extra\n\nShared team content');
91
+ process.env.GEN_CONFIG = extraDir;
92
92
 
93
93
  const memory = await new MemoryManager().load({ cwd: test.projectDir });
94
94
  const extraFile = memory.files.find((f) => f.level === 'extra');
@@ -100,14 +100,14 @@ describe('MemoryManager Integration', () => {
100
100
  describe('getLoadedFileList', () => {
101
101
  it('should return list with namespace information', async () => {
102
102
  await writeMemory(test.projectDir, 'claude', '# Claude');
103
- await writeMemory(test.projectDir, 'gencode', '# GenCode');
103
+ await writeMemory(test.projectDir, 'gen', '# GenCode');
104
104
 
105
105
  const manager = new MemoryManager();
106
- await manager.load({ cwd: test.projectDir });
106
+ await manager.load({ cwd: test.projectDir, strategy: 'both' });
107
107
  const list = manager.getLoadedFileList().filter((f) => f.level === 'project');
108
108
 
109
109
  expect(list.find((f) => f.namespace === 'claude')).toBeDefined();
110
- expect(list.find((f) => f.namespace === 'gencode')).toBeDefined();
110
+ expect(list.find((f) => f.namespace === 'gen')).toBeDefined();
111
111
  });
112
112
  });
113
113
 
@@ -117,7 +117,7 @@ describe('MemoryManager Integration', () => {
117
117
 
118
118
  expect(manager.getDebugSummary()).toBe('Memory not loaded');
119
119
 
120
- await writeMemory(test.projectDir, 'gencode', '# Test');
120
+ await writeMemory(test.projectDir, 'gen', '# Test');
121
121
  await manager.load({ cwd: test.projectDir });
122
122
 
123
123
  expect(manager.getDebugSummary()).toContain('Memory Sources');
@@ -126,7 +126,7 @@ describe('MemoryManager Integration', () => {
126
126
 
127
127
  describe('hasMemory', () => {
128
128
  it('should return true when memory files exist', async () => {
129
- await writeMemory(test.projectDir, 'gencode', '# Test', { inDir: false });
129
+ await writeMemory(test.projectDir, 'gen', '# Test', { inDir: false });
130
130
 
131
131
  const manager = new MemoryManager();
132
132
  await manager.load({ cwd: test.projectDir });
@@ -146,12 +146,12 @@ describe('MemoryManager Integration', () => {
146
146
  // No memory initially
147
147
  expect(await manager.hasProjectMemory(test.projectDir)).toBe(false);
148
148
 
149
- // Root AGENT.md
150
- await writeMemory(test.projectDir, 'gencode', '# Test', { inDir: false });
149
+ // Root GEN.md
150
+ await writeMemory(test.projectDir, 'gen', '# Test', { inDir: false });
151
151
  expect(await manager.hasProjectMemory(test.projectDir)).toBe(true);
152
152
  });
153
153
 
154
- it('should detect CLAUDE.md and .gencode/AGENT.md', async () => {
154
+ it('should detect CLAUDE.md and .gen/GEN.md', async () => {
155
155
  const manager = new MemoryManager();
156
156
 
157
157
  await writeMemory(test.projectDir, 'claude', '# Claude', { inDir: false });
@@ -160,12 +160,12 @@ describe('MemoryManager Integration', () => {
160
160
  });
161
161
 
162
162
  describe('quickAdd', () => {
163
- it('should create or append to AGENT.md', async () => {
163
+ it('should create or append to GEN.md', async () => {
164
164
  const manager = new MemoryManager();
165
165
 
166
166
  // Create new
167
167
  const filePath = await manager.quickAdd('First content', 'project', test.projectDir);
168
- expect(filePath).toBe(path.join(test.projectDir, 'AGENT.md'));
168
+ expect(filePath).toBe(path.join(test.projectDir, 'GEN.md'));
169
169
  expect(await fs.readFile(filePath, 'utf-8')).toContain('First content');
170
170
 
171
171
  // Append
@@ -180,11 +180,11 @@ describe('MemoryManager Integration', () => {
180
180
  describe('MemoryConfig', () => {
181
181
  describe('DEFAULT_MEMORY_CONFIG', () => {
182
182
  it('should have correct filenames and directories', () => {
183
- expect(DEFAULT_MEMORY_CONFIG.gencodeFilename).toBe('AGENT.md');
183
+ expect(DEFAULT_MEMORY_CONFIG.genFilename).toBe('GEN.md');
184
184
  expect(DEFAULT_MEMORY_CONFIG.claudeFilename).toBe('CLAUDE.md');
185
- expect(DEFAULT_MEMORY_CONFIG.gencodeLocalFilename).toBe('AGENT.local.md');
185
+ expect(DEFAULT_MEMORY_CONFIG.genLocalFilename).toBe('GEN.local.md');
186
186
  expect(DEFAULT_MEMORY_CONFIG.claudeLocalFilename).toBe('CLAUDE.local.md');
187
- expect(DEFAULT_MEMORY_CONFIG.gencodeDir).toBe('.gencode');
187
+ expect(DEFAULT_MEMORY_CONFIG.genDir).toBe('.gen');
188
188
  expect(DEFAULT_MEMORY_CONFIG.claudeDir).toBe('.claude');
189
189
  expect(DEFAULT_MEMORY_CONFIG.rulesDir).toBe('rules');
190
190
  });
@@ -196,3 +196,221 @@ describe('MemoryConfig', () => {
196
196
  });
197
197
  });
198
198
  });
199
+
200
+ describe('Memory Merge Strategies', () => {
201
+ let test: TestProject;
202
+
203
+ beforeEach(async () => {
204
+ test = await createTestProject('gencode-strategy-');
205
+ });
206
+
207
+ afterEach(() => test.cleanup());
208
+
209
+ describe('fallback strategy', () => {
210
+ it('should load only GEN.md when both files exist', async () => {
211
+ await writeMemory(test.projectDir, 'claude', '# Claude Content');
212
+ await writeMemory(test.projectDir, 'gen', '# GenCode Content');
213
+
214
+ const memory = await new MemoryManager().load({
215
+ cwd: test.projectDir,
216
+ strategy: 'fallback',
217
+ });
218
+
219
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
220
+ expect(projectFiles.length).toBe(1);
221
+ expect(projectFiles[0].namespace).toBe('gen');
222
+ expect(projectFiles[0].content).toContain('GenCode Content');
223
+
224
+ // Check that CLAUDE.md was skipped
225
+ expect(memory.skippedFiles.some((f) => f.includes('CLAUDE.md'))).toBe(true);
226
+ });
227
+
228
+ it('should load CLAUDE.md when only CLAUDE.md exists', async () => {
229
+ await writeMemory(test.projectDir, 'claude', '# Only Claude');
230
+
231
+ const memory = await new MemoryManager().load({
232
+ cwd: test.projectDir,
233
+ strategy: 'fallback',
234
+ });
235
+
236
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
237
+ expect(projectFiles.length).toBe(1);
238
+ expect(projectFiles[0].namespace).toBe('claude');
239
+ expect(projectFiles[0].content).toContain('Only Claude');
240
+
241
+ // No project-level files should be skipped (GEN.md doesn't exist at project level)
242
+ const projectSkipped = memory.skippedFiles.filter((f) => f.includes(test.projectDir));
243
+ expect(projectSkipped.length).toBe(0);
244
+ });
245
+
246
+ it('should load GEN.md when only GEN.md exists', async () => {
247
+ await writeMemory(test.projectDir, 'gen', '# Only GenCode');
248
+
249
+ const memory = await new MemoryManager().load({
250
+ cwd: test.projectDir,
251
+ strategy: 'fallback',
252
+ });
253
+
254
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
255
+ expect(projectFiles.length).toBe(1);
256
+ expect(projectFiles[0].namespace).toBe('gen');
257
+ expect(projectFiles[0].content).toContain('Only GenCode');
258
+ });
259
+
260
+ it('should load nothing when neither file exists', async () => {
261
+ const memory = await new MemoryManager().load({
262
+ cwd: test.projectDir,
263
+ strategy: 'fallback',
264
+ });
265
+
266
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
267
+ expect(projectFiles.length).toBe(0);
268
+ });
269
+ });
270
+
271
+ describe('both strategy', () => {
272
+ it('should load both CLAUDE.md and GEN.md when they exist', async () => {
273
+ await writeMemory(test.projectDir, 'claude', '# Claude Content');
274
+ await writeMemory(test.projectDir, 'gen', '# GenCode Content');
275
+
276
+ const memory = await new MemoryManager().load({
277
+ cwd: test.projectDir,
278
+ strategy: 'both',
279
+ });
280
+
281
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
282
+ expect(projectFiles.length).toBe(2);
283
+
284
+ const claudeFile = projectFiles.find((f) => f.namespace === 'claude');
285
+ const gencodeFile = projectFiles.find((f) => f.namespace === 'gen');
286
+
287
+ expect(claudeFile?.content).toContain('Claude Content');
288
+ expect(gencodeFile?.content).toContain('GenCode Content');
289
+
290
+ // No files should be skipped in 'both' mode
291
+ expect(memory.skippedFiles.length).toBe(0);
292
+ });
293
+
294
+ it('should load whatever exists when only one file exists', async () => {
295
+ await writeMemory(test.projectDir, 'gen', '# Only GenCode');
296
+
297
+ const memory = await new MemoryManager().load({
298
+ cwd: test.projectDir,
299
+ strategy: 'both',
300
+ });
301
+
302
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
303
+ expect(projectFiles.length).toBe(1);
304
+ expect(projectFiles[0].content).toContain('Only GenCode');
305
+ });
306
+ });
307
+
308
+ describe('gen-only strategy', () => {
309
+ it('should load only GEN.md even when both exist', async () => {
310
+ await writeMemory(test.projectDir, 'claude', '# Claude Content');
311
+ await writeMemory(test.projectDir, 'gen', '# GenCode Content');
312
+
313
+ const memory = await new MemoryManager().load({
314
+ cwd: test.projectDir,
315
+ strategy: 'gen-only',
316
+ });
317
+
318
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
319
+ expect(projectFiles.length).toBe(1);
320
+ expect(projectFiles[0].namespace).toBe('gen');
321
+ expect(projectFiles[0].content).toContain('GenCode Content');
322
+
323
+ // CLAUDE.md should be marked as skipped
324
+ expect(memory.skippedFiles.some((f) => f.includes('CLAUDE.md'))).toBe(true);
325
+ });
326
+
327
+ it('should load nothing when only CLAUDE.md exists', async () => {
328
+ await writeMemory(test.projectDir, 'claude', '# Only Claude');
329
+
330
+ const memory = await new MemoryManager().load({
331
+ cwd: test.projectDir,
332
+ strategy: 'gen-only',
333
+ });
334
+
335
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
336
+ expect(projectFiles.length).toBe(0);
337
+ });
338
+ });
339
+
340
+ describe('claude-only strategy', () => {
341
+ it('should load only CLAUDE.md even when both exist', async () => {
342
+ await writeMemory(test.projectDir, 'claude', '# Claude Content');
343
+ await writeMemory(test.projectDir, 'gen', '# GenCode Content');
344
+
345
+ const memory = await new MemoryManager().load({
346
+ cwd: test.projectDir,
347
+ strategy: 'claude-only',
348
+ });
349
+
350
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
351
+ expect(projectFiles.length).toBe(1);
352
+ expect(projectFiles[0].namespace).toBe('claude');
353
+ expect(projectFiles[0].content).toContain('Claude Content');
354
+
355
+ // GEN.md should be marked as skipped
356
+ expect(memory.skippedFiles.some((f) => f.includes('GEN.md'))).toBe(true);
357
+ });
358
+
359
+ it('should load nothing when only GEN.md exists', async () => {
360
+ await writeMemory(test.projectDir, 'gen', '# Only GenCode');
361
+
362
+ const memory = await new MemoryManager().load({
363
+ cwd: test.projectDir,
364
+ strategy: 'claude-only',
365
+ });
366
+
367
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
368
+ expect(projectFiles.length).toBe(0);
369
+ });
370
+ });
371
+
372
+ describe('default strategy', () => {
373
+ it('should default to fallback when no strategy specified', async () => {
374
+ await writeMemory(test.projectDir, 'claude', '# Claude Content');
375
+ await writeMemory(test.projectDir, 'gen', '# GenCode Content');
376
+
377
+ const memory = await new MemoryManager().load({
378
+ cwd: test.projectDir,
379
+ // No strategy specified
380
+ });
381
+
382
+ const projectFiles = memory.files.filter((f) => f.level === 'project');
383
+ expect(projectFiles.length).toBe(1);
384
+ expect(projectFiles[0].namespace).toBe('gen');
385
+ expect(memory.skippedFiles.some((f) => f.includes('CLAUDE.md'))).toBe(true);
386
+ });
387
+ });
388
+
389
+ describe('getVerboseSummary', () => {
390
+ it('should show strategy and skipped files', async () => {
391
+ await writeMemory(test.projectDir, 'claude', '# Claude');
392
+ await writeMemory(test.projectDir, 'gen', '# GenCode');
393
+
394
+ const manager = new MemoryManager();
395
+ await manager.load({ cwd: test.projectDir, strategy: 'fallback' });
396
+
397
+ const summary = manager.getVerboseSummary('fallback');
398
+ expect(summary).toContain('[Memory] Strategy: fallback');
399
+ expect(summary).toContain('Skipped:');
400
+ expect(summary).toContain('CLAUDE.md');
401
+ expect(summary).toContain('skipped)');
402
+ });
403
+
404
+ it('should show no skipped files in both mode', async () => {
405
+ await writeMemory(test.projectDir, 'claude', '# Claude');
406
+ await writeMemory(test.projectDir, 'gen', '# GenCode');
407
+
408
+ const manager = new MemoryManager();
409
+ await manager.load({ cwd: test.projectDir, strategy: 'both' });
410
+
411
+ const summary = manager.getVerboseSummary('both');
412
+ expect(summary).toContain('[Memory] Strategy: both');
413
+ expect(summary).toContain('files loaded, 0 skipped');
414
+ });
415
+ });
416
+ });