diff --git a/docs/cli/gemini-md.md b/docs/cli/gemini-md.md index 624b2fc566..59bb87f22c 100644 --- a/docs/cli/gemini-md.md +++ b/docs/cli/gemini-md.md @@ -91,18 +91,36 @@ More content here. For more details, see the [Memory Import Processor](../reference/memport.md) documentation. +## Default context file names + +By default, Gemini CLI discovers both `GEMINI.md` and `AGENTS.md` files as +context sources. This means if your codebase uses the +[AGENTS.md](https://agents.md) standard, those instructions will be +automatically loaded alongside any `GEMINI.md` files. + ## Customize the context file name -While `GEMINI.md` is the default filename, you can configure this in your -`settings.json` file. To specify a different name or a list of names, use the -`context.fileName` property. +You can configure which context filenames are discovered in your `settings.json` +file. To specify a different name or a list of names, use the `context.fileName` +property. This overrides the defaults, so you can use it to remove `AGENTS.md` +from discovery if it causes problems. **Example `settings.json`:** ```json { "context": { - "fileName": ["AGENTS.md", "CONTEXT.md", "GEMINI.md"] + "fileName": ["GEMINI.md"] + } +} +``` + +To add additional custom context files alongside the defaults: + +```json +{ + "context": { + "fileName": ["GEMINI.md", "AGENTS.md", "CONTEXT.md"] } } ``` diff --git a/packages/core/src/config/config.test.ts b/packages/core/src/config/config.test.ts index fd97d67eda..19b3711bd2 100644 --- a/packages/core/src/config/config.test.ts +++ b/packages/core/src/config/config.test.ts @@ -129,6 +129,7 @@ vi.mock('../tools/memoryTool', () => ({ setGeminiMdFilename: vi.fn(), getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'), // Mock the original filename DEFAULT_CONTEXT_FILENAME: 'GEMINI.md', + DEFAULT_CONTEXT_FILENAMES: ['GEMINI.md', 'AGENTS.md'], GEMINI_DIR: '.gemini', })); diff --git a/packages/core/src/prompts/snippets.ts b/packages/core/src/prompts/snippets.ts index c420f22ae3..2bf19467f1 100644 --- a/packages/core/src/prompts/snippets.ts +++ b/packages/core/src/prompts/snippets.ts @@ -177,7 +177,9 @@ export function renderPreamble(options?: PreambleOptions): string { export function renderCoreMandates(options?: CoreMandatesOptions): string { if (!options) return ''; - const filenames = options.contextFilenames ?? [DEFAULT_CONTEXT_FILENAME]; + const filenames = options.contextFilenames?.length + ? options.contextFilenames + : [DEFAULT_CONTEXT_FILENAME]; const formattedFilenames = filenames.length > 1 ? filenames @@ -497,7 +499,9 @@ export function renderUserMemory( if (typeof memory === 'string') { const trimmed = memory.trim(); if (trimmed.length === 0) return ''; - const filenames = contextFilenames ?? [DEFAULT_CONTEXT_FILENAME]; + const filenames = contextFilenames?.length + ? contextFilenames + : [DEFAULT_CONTEXT_FILENAME]; const formattedHeader = filenames.join(', '); return ` # Contextual Instructions (${formattedHeader}) diff --git a/packages/core/src/tools/memoryTool.test.ts b/packages/core/src/tools/memoryTool.test.ts index a1fdef4271..e16bb28916 100644 --- a/packages/core/src/tools/memoryTool.test.ts +++ b/packages/core/src/tools/memoryTool.test.ts @@ -18,7 +18,7 @@ import { setGeminiMdFilename, getCurrentGeminiMdFilename, getAllGeminiMdFilenames, - DEFAULT_CONTEXT_FILENAME, + DEFAULT_CONTEXT_FILENAMES, getProjectMemoryFilePath, } from './memoryTool.js'; import type { Storage } from '../config/storage.js'; @@ -76,7 +76,7 @@ describe('MemoryTool', () => { afterEach(() => { vi.restoreAllMocks(); - setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); + setGeminiMdFilename(DEFAULT_CONTEXT_FILENAMES); }); describe('setGeminiMdFilename', () => { @@ -101,6 +101,17 @@ describe('MemoryTool', () => { expect(getCurrentGeminiMdFilename()).toBe('CUSTOM_CONTEXT.md'); expect(getAllGeminiMdFilenames()).toEqual(newNames); }); + + it('should include AGENTS.md in default filenames', () => { + setGeminiMdFilename(DEFAULT_CONTEXT_FILENAMES); + expect(getAllGeminiMdFilenames()).toEqual(['GEMINI.md', 'AGENTS.md']); + expect(getCurrentGeminiMdFilename()).toBe('GEMINI.md'); + }); + + it('should allow overriding defaults to exclude AGENTS.md', () => { + setGeminiMdFilename('GEMINI.md'); + expect(getAllGeminiMdFilenames()).toEqual(['GEMINI.md']); + }); }); describe('execute (instance method)', () => { diff --git a/packages/core/src/tools/memoryTool.ts b/packages/core/src/tools/memoryTool.ts index 6edd5de569..021cc4b34c 100644 --- a/packages/core/src/tools/memoryTool.ts +++ b/packages/core/src/tools/memoryTool.ts @@ -30,11 +30,12 @@ import { MEMORY_DEFINITION } from './definitions/coreTools.js'; import { resolveToolDeclaration } from './definitions/resolver.js'; export const DEFAULT_CONTEXT_FILENAME = 'GEMINI.md'; +export const DEFAULT_CONTEXT_FILENAMES = ['GEMINI.md', 'AGENTS.md']; export const MEMORY_SECTION_HEADER = '## Gemini Added Memories'; -// 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. -let currentGeminiMdFilename: string | string[] = DEFAULT_CONTEXT_FILENAME; +// This variable will hold the currently configured filenames for context files. +// It defaults to DEFAULT_CONTEXT_FILENAMES but can be overridden by setGeminiMdFilename. +let currentGeminiMdFilename: string | string[] = DEFAULT_CONTEXT_FILENAMES; export function setGeminiMdFilename(newFilename: string | string[]): void { if (Array.isArray(newFilename)) { diff --git a/packages/core/src/utils/memoryDiscovery.test.ts b/packages/core/src/utils/memoryDiscovery.test.ts index 9e18a41f66..5de7f0d5b7 100644 --- a/packages/core/src/utils/memoryDiscovery.test.ts +++ b/packages/core/src/utils/memoryDiscovery.test.ts @@ -19,6 +19,7 @@ import { import { setGeminiMdFilename, DEFAULT_CONTEXT_FILENAME, + DEFAULT_CONTEXT_FILENAMES, } from '../tools/memoryTool.js'; import { flattenMemory, type HierarchicalMemory } from '../config/memory.js'; import { FileDiscoveryService } from '../services/fileDiscoveryService.js'; @@ -103,7 +104,7 @@ describe('memoryDiscovery', () => { afterEach(async () => { vi.unstubAllEnvs(); // Some tests set this to a different value. - setGeminiMdFilename(DEFAULT_CONTEXT_FILENAME); + setGeminiMdFilename(DEFAULT_CONTEXT_FILENAMES); // Clean up the temporary directory to prevent resource leaks. // Use maxRetries option for robust cleanup without race conditions await fsPromises.rm(testRootDir, {