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.
- package/dist/agent/agent.d.ts +9 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +37 -8
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/types.d.ts +5 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +15 -9
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/Messages.js +1 -1
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/ModelSelector.d.ts +4 -3
- package/dist/cli/components/ModelSelector.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.js +54 -37
- package/dist/cli/components/ModelSelector.js.map +1 -1
- package/dist/cli/components/ProviderManager.d.ts +2 -2
- package/dist/cli/components/ProviderManager.d.ts.map +1 -1
- package/dist/cli/components/ProviderManager.js +137 -156
- package/dist/cli/components/ProviderManager.js.map +1 -1
- package/dist/cli/index.js +30 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +5 -5
- package/dist/config/levels.d.ts.map +1 -1
- package/dist/config/levels.js +20 -20
- package/dist/config/levels.js.map +1 -1
- package/dist/config/merger.js +1 -1
- package/dist/config/merger.js.map +1 -1
- package/dist/config/providers-config.d.ts +8 -5
- package/dist/config/providers-config.d.ts.map +1 -1
- package/dist/config/providers-config.js +19 -22
- package/dist/config/providers-config.js.map +1 -1
- package/dist/config/test-utils.d.ts +2 -2
- package/dist/config/test-utils.d.ts.map +1 -1
- package/dist/config/test-utils.js +4 -4
- package/dist/config/test-utils.js.map +1 -1
- package/dist/config/types.d.ts +23 -17
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +14 -14
- package/dist/config/types.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +25 -12
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +241 -112
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/test-utils.d.ts +1 -1
- package/dist/memory/test-utils.d.ts.map +1 -1
- package/dist/memory/test-utils.js +3 -3
- package/dist/memory/test-utils.js.map +1 -1
- package/dist/memory/types.d.ts +20 -10
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +13 -13
- package/dist/memory/types.js.map +1 -1
- package/dist/migration/migrate.d.ts +24 -0
- package/dist/migration/migrate.d.ts.map +1 -0
- package/dist/migration/migrate.js +164 -0
- package/dist/migration/migrate.js.map +1 -0
- package/dist/permissions/persistence.d.ts +2 -2
- package/dist/permissions/persistence.js +4 -4
- package/dist/permissions/persistence.js.map +1 -1
- package/dist/planning/plan-file.d.ts +1 -1
- package/dist/planning/plan-file.js +2 -2
- package/dist/planning/plan-file.js.map +1 -1
- package/dist/prompts/index.d.ts +5 -4
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +11 -8
- package/dist/prompts/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +2 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +7 -0
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/gemini.d.ts +2 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +7 -0
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/index.d.ts +20 -10
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +48 -24
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +7 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +48 -34
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +72 -88
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/store.d.ts +43 -17
- package/dist/providers/store.d.ts.map +1 -1
- package/dist/providers/store.js +112 -19
- package/dist/providers/store.js.map +1 -1
- package/dist/providers/types.d.ts +23 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/vertex-ai.d.ts +15 -7
- package/dist/providers/vertex-ai.d.ts.map +1 -1
- package/dist/providers/vertex-ai.js +46 -13
- package/dist/providers/vertex-ai.js.map +1 -1
- package/dist/session/types.js +1 -1
- package/dist/session/types.js.map +1 -1
- package/docs/config-system-comparison.md +50 -50
- package/docs/cost-tracking-comparison.md +2 -2
- package/docs/memory-system.md +124 -31
- package/docs/permissions.md +2 -2
- package/docs/proposals/0006-memory-system.md +4 -4
- package/docs/proposals/0008-checkpointing.md +109 -2
- package/docs/proposals/0011-custom-commands.md +2 -1
- package/docs/proposals/0021-skills-system.md +2 -1
- package/docs/proposals/0023-permission-enhancements.md +2 -2
- package/docs/proposals/0033-enterprise-deployment.md +1 -1
- package/docs/proposals/0041-configuration-system.md +17 -19
- package/docs/proposals/0042-prompt-optimization.md +17 -9
- package/docs/proposals/README.md +5 -5
- package/docs/providers.md +94 -9
- package/package.json +3 -2
- package/scripts/migrate.ts +449 -0
- package/src/agent/agent.ts +51 -9
- package/src/agent/types.ts +5 -1
- package/src/cli/components/App.tsx +17 -8
- package/src/cli/components/Messages.tsx +1 -1
- package/src/cli/components/ModelSelector.tsx +62 -43
- package/src/cli/components/ProviderManager.tsx +278 -323
- package/src/cli/index.tsx +36 -17
- package/src/config/index.ts +5 -3
- package/src/config/levels.test.ts +22 -22
- package/src/config/levels.ts +22 -22
- package/src/config/loader.test.ts +14 -14
- package/src/config/manager.test.ts +19 -19
- package/src/config/merger.test.ts +23 -23
- package/src/config/merger.ts +1 -1
- package/src/config/providers-config.ts +23 -21
- package/src/config/test-utils.ts +6 -6
- package/src/config/types.ts +30 -20
- package/src/memory/memory-manager.test.ts +242 -24
- package/src/memory/memory-manager.ts +270 -141
- package/src/memory/test-utils.ts +4 -4
- package/src/memory/types.ts +28 -17
- package/src/permissions/persistence.ts +4 -4
- package/src/planning/plan-file.ts +2 -2
- package/src/prompts/index.ts +13 -9
- package/src/providers/anthropic.ts +9 -0
- package/src/providers/gemini.ts +9 -0
- package/src/providers/index.ts +76 -33
- package/src/providers/openai.ts +9 -0
- package/src/providers/registry.ts +116 -111
- package/src/providers/store.ts +130 -28
- package/src/providers/types.ts +33 -1
- package/src/providers/vertex-ai.ts +49 -13
- 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
|
|
38
|
-
await writeMemory(test.projectDir, '
|
|
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 === '
|
|
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, '
|
|
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 === '
|
|
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
|
|
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, '
|
|
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, '
|
|
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, '
|
|
91
|
-
process.env.
|
|
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, '
|
|
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 === '
|
|
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, '
|
|
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, '
|
|
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
|
|
150
|
-
await writeMemory(test.projectDir, '
|
|
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 .
|
|
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
|
|
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, '
|
|
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.
|
|
183
|
+
expect(DEFAULT_MEMORY_CONFIG.genFilename).toBe('GEN.md');
|
|
184
184
|
expect(DEFAULT_MEMORY_CONFIG.claudeFilename).toBe('CLAUDE.md');
|
|
185
|
-
expect(DEFAULT_MEMORY_CONFIG.
|
|
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.
|
|
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
|
+
});
|