From 1fcd81e0a419d325b89ae581cc6773ea800fdcf1 Mon Sep 17 00:00:00 2001 From: Dev Randalpura Date: Tue, 12 May 2026 17:15:04 -0400 Subject: [PATCH] Made context files append instead of replace --- packages/core/src/tools/memoryTool.test.ts | 54 ++++++++++++++++++---- packages/core/src/tools/memoryTool.ts | 47 ++++++++++++++++--- 2 files changed, 85 insertions(+), 16 deletions(-) diff --git a/packages/core/src/tools/memoryTool.test.ts b/packages/core/src/tools/memoryTool.test.ts index c0444514eb..dcc9a14333 100644 --- a/packages/core/src/tools/memoryTool.test.ts +++ b/packages/core/src/tools/memoryTool.test.ts @@ -16,6 +16,7 @@ import { import { MemoryTool, setGeminiMdFilename, + resetGeminiMdFilename, getCurrentGeminiMdFilename, getAllGeminiMdFilenames, DEFAULT_CONTEXT_FILENAME, @@ -77,30 +78,65 @@ describe('MemoryTool', () => { afterEach(() => { vi.restoreAllMocks(); - setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); + resetGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); }); describe('setGeminiMdFilename', () => { - it('should update currentGeminiMdFilename when a valid new name is provided', () => { + it('should append to currentGeminiMdFilename when a valid new name is provided', () => { const newName = 'CUSTOM_CONTEXT.md'; setGeminiMdFilename(newName); - expect(getCurrentGeminiMdFilename()).toBe(newName); + expect(getAllGeminiMdFilenames()).toEqual([ + DEFAULT_CONTEXT_FILENAME, + newName, + ]); }); it('should not update currentGeminiMdFilename if the new name is empty or whitespace', () => { - const initialName = getCurrentGeminiMdFilename(); + const initialNames = getAllGeminiMdFilenames(); setGeminiMdFilename(' '); - expect(getCurrentGeminiMdFilename()).toBe(initialName); + expect(getAllGeminiMdFilenames()).toEqual(initialNames); setGeminiMdFilename(''); - expect(getCurrentGeminiMdFilename()).toBe(initialName); + expect(getAllGeminiMdFilenames()).toEqual(initialNames); }); - it('should handle an array of filenames', () => { + it('should handle adding an array of filenames', () => { const newNames = ['CUSTOM_CONTEXT.md', 'ANOTHER_CONTEXT.md']; setGeminiMdFilename(newNames); - expect(getCurrentGeminiMdFilename()).toBe('CUSTOM_CONTEXT.md'); - expect(getAllGeminiMdFilenames()).toEqual(newNames); + expect(getAllGeminiMdFilenames()).toEqual([ + DEFAULT_CONTEXT_FILENAME, + ...newNames, + ]); + }); + + it('should ensure uniqueness when adding names', () => { + setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); + expect(getAllGeminiMdFilenames()).toEqual([DEFAULT_CONTEXT_FILENAME]); + + setGeminiMdFilename(['NEW.md', 'NEW.md']); + expect(getAllGeminiMdFilenames()).toEqual([ + DEFAULT_CONTEXT_FILENAME, + 'NEW.md', + ]); + }); + }); + + describe('resetGeminiMdFilename', () => { + it('should replace all filenames with the provided one', () => { + setGeminiMdFilename('OTHER.md'); + resetGeminiMdFilename('RESET.md'); + expect(getAllGeminiMdFilenames()).toEqual(['RESET.md']); + }); + + it('should reset to default if no argument provided', () => { + resetGeminiMdFilename('OTHER.md'); + resetGeminiMdFilename(); + expect(getAllGeminiMdFilenames()).toEqual([DEFAULT_CONTEXT_FILENAME]); + }); + + it('should handle array reset', () => { + resetGeminiMdFilename(['A.md', 'B.md']); + expect(getAllGeminiMdFilenames()).toEqual(['A.md', 'B.md']); }); }); diff --git a/packages/core/src/tools/memoryTool.ts b/packages/core/src/tools/memoryTool.ts index 0e0955320b..70f3e7e073 100644 --- a/packages/core/src/tools/memoryTool.ts +++ b/packages/core/src/tools/memoryTool.ts @@ -33,17 +33,50 @@ export const DEFAULT_CONTEXT_FILENAME = 'GEMINI.md'; export const MEMORY_SECTION_HEADER = '## Gemini Added Memories'; export const PROJECT_MEMORY_INDEX_FILENAME = 'MEMORY.md'; -// This variable will hold the currently configured filename for GEMINI.md context files. -// It defaults to DEFAULT_CONTEXT_FILENAME but can be overridden by setGeminiMdFilename. +// This variable will hold the currently configured filenames for GEMINI.md context files. +// It defaults to DEFAULT_CONTEXT_FILENAME but can be extended by setGeminiMdFilename. let currentGeminiMdFilename: string | string[] = DEFAULT_CONTEXT_FILENAME; +/** + * Adds one or more filenames to the current context filenames. + * Ensures uniqueness and maintains order. + */ export function setGeminiMdFilename(newFilename: string | string[]): void { - if (Array.isArray(newFilename)) { - if (newFilename.length > 0) { - currentGeminiMdFilename = newFilename.map((name) => name.trim()); + const filenames = Array.isArray(newFilename) ? newFilename : [newFilename]; + const current = getAllGeminiMdFilenames(); + const next = new Set(current); + + for (const filename of filenames) { + const trimmed = filename.trim(); + if (trimmed !== '') { + next.add(trimmed); } - } else if (newFilename && newFilename.trim() !== '') { - currentGeminiMdFilename = newFilename.trim(); + } + + const result = Array.from(next); + if (result.length > 1) { + currentGeminiMdFilename = result; + } else if (result.length === 1) { + currentGeminiMdFilename = result[0]; + } +} + +/** + * Resets the context filenames to the provided value, or the default if none provided. + * This replaces all current filenames. + */ +export function resetGeminiMdFilename( + filename: string | string[] = DEFAULT_CONTEXT_FILENAME, +): void { + const filenames = Array.isArray(filename) ? filename : [filename]; + const cleaned = filenames.map((f) => f.trim()).filter((f) => f !== ''); + + if (cleaned.length === 0) { + currentGeminiMdFilename = DEFAULT_CONTEXT_FILENAME; + } else if (cleaned.length === 1) { + currentGeminiMdFilename = cleaned[0]; + } else { + currentGeminiMdFilename = cleaned; } }