From 0c155768df774c5746a6f6a943176aa5a97a47b5 Mon Sep 17 00:00:00 2001 From: zy6p Date: Wed, 4 Mar 2026 16:22:18 +0800 Subject: [PATCH 1/2] fix(cli): keep AGENTS.md in default context file set --- packages/cli/src/config/config.test.ts | 37 ++++++++++++++++++++++++++ packages/cli/src/config/config.ts | 10 ++++--- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index 5f08dd382..4956ccfce 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -548,6 +548,43 @@ describe('loadCliConfig', () => { vi.restoreAllMocks(); }); + it('should reset context file names to QWEN.md and AGENTS.md by default', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = {}; + const setGeminiMdFilenameSpy = vi.spyOn( + ServerConfig, + 'setGeminiMdFilename', + ); + + await loadCliConfig(settings, argv); + + expect(setGeminiMdFilenameSpy).toHaveBeenCalledTimes(1); + expect(setGeminiMdFilenameSpy).toHaveBeenCalledWith([ + ServerConfig.DEFAULT_CONTEXT_FILENAME, + ServerConfig.AGENT_CONTEXT_FILENAME, + ]); + }); + + it('should use configured context file name when settings.context.fileName is set', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = { + context: { + fileName: 'CUSTOM_AGENTS.md', + }, + }; + const setGeminiMdFilenameSpy = vi.spyOn( + ServerConfig, + 'setGeminiMdFilename', + ); + + await loadCliConfig(settings, argv); + + expect(setGeminiMdFilenameSpy).toHaveBeenCalledTimes(1); + expect(setGeminiMdFilenameSpy).toHaveBeenCalledWith('CUSTOM_AGENTS.md'); + }); + it('should propagate stream-json formats to config', async () => { process.argv = [ 'node', diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 48961cdca..e11979701 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -6,12 +6,13 @@ import { ApprovalMode, + AGENT_CONTEXT_FILENAME, AuthType, Config, + DEFAULT_CONTEXT_FILENAME, DEFAULT_QWEN_EMBEDDING_MODEL, FileDiscoveryService, FileEncoding, - getCurrentGeminiMdFilename, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, resolveTelemetrySettings, @@ -688,8 +689,11 @@ export async function loadCliConfig( if (settings.context?.fileName) { setServerGeminiMdFilename(settings.context.fileName); } else { - // Reset to default if not provided in settings. - setServerGeminiMdFilename(getCurrentGeminiMdFilename()); + // Reset to default context filenames if not provided in settings. + setServerGeminiMdFilename([ + DEFAULT_CONTEXT_FILENAME, + AGENT_CONTEXT_FILENAME, + ]); } // Automatically load output-language.md if it exists From d7d2ffb304004f28db30e526802730e08931ca97 Mon Sep 17 00:00:00 2001 From: zy6p Date: Thu, 5 Mar 2026 10:33:52 +0800 Subject: [PATCH 2/2] fix: follow review for default context filename handling --- packages/cli/src/config/config.test.ts | 29 +++++++++++++++++++ packages/cli/src/config/config.ts | 8 ++--- packages/core/src/config/config.test.ts | 1 + .../core/src/utils/ignorePatterns.test.ts | 7 ++++- packages/core/src/utils/ignorePatterns.ts | 10 ++++--- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index 4956ccfce..2fdc62a9c 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -604,6 +604,35 @@ describe('loadCliConfig', () => { expect(config.getIncludePartialMessages()).toBe(true); }); + it('should reset context filenames to defaults when context.fileName is not configured', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = {}; + const defaultContextFiles = ['QWEN.md', 'AGENTS.md']; + const getAllSpy = vi + .spyOn(ServerConfig, 'getAllGeminiMdFilenames') + .mockReturnValue(defaultContextFiles); + const setFilenameSpy = vi.spyOn(ServerConfig, 'setGeminiMdFilename'); + + await loadCliConfig(settings, argv); + + expect(getAllSpy).toHaveBeenCalledTimes(1); + expect(setFilenameSpy).toHaveBeenCalledWith(defaultContextFiles); + }); + + it('should use context.fileName from settings when provided', async () => { + process.argv = ['node', 'script.js']; + const argv = await parseArguments(); + const settings: Settings = { context: { fileName: 'CUSTOM_CONTEXT.md' } }; + const getAllSpy = vi.spyOn(ServerConfig, 'getAllGeminiMdFilenames'); + const setFilenameSpy = vi.spyOn(ServerConfig, 'setGeminiMdFilename'); + + await loadCliConfig(settings, argv); + + expect(setFilenameSpy).toHaveBeenCalledWith('CUSTOM_CONTEXT.md'); + expect(getAllSpy).not.toHaveBeenCalled(); + }); + it('should initialize native LSP service when enabled', async () => { process.argv = ['node', 'script.js', '--experimental-lsp']; const argv = await parseArguments(); diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index e11979701..67a6c1d8e 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -6,13 +6,12 @@ import { ApprovalMode, - AGENT_CONTEXT_FILENAME, AuthType, Config, - DEFAULT_CONTEXT_FILENAME, DEFAULT_QWEN_EMBEDDING_MODEL, FileDiscoveryService, FileEncoding, + getAllGeminiMdFilenames, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, resolveTelemetrySettings, @@ -690,10 +689,7 @@ export async function loadCliConfig( setServerGeminiMdFilename(settings.context.fileName); } else { // Reset to default context filenames if not provided in settings. - setServerGeminiMdFilename([ - DEFAULT_CONTEXT_FILENAME, - AGENT_CONTEXT_FILENAME, - ]); + setServerGeminiMdFilename(getAllGeminiMdFilenames()); } // Automatically load output-language.md if it exists diff --git a/packages/core/src/config/config.test.ts b/packages/core/src/config/config.test.ts index 2be01125f..828ef9c3e 100644 --- a/packages/core/src/config/config.test.ts +++ b/packages/core/src/config/config.test.ts @@ -118,6 +118,7 @@ vi.mock('../tools/memoryTool', () => ({ MemoryTool: createToolMock('save_memory'), setGeminiMdFilename: vi.fn(), getCurrentGeminiMdFilename: vi.fn(() => 'QWEN.md'), // Mock the original filename + getAllGeminiMdFilenames: vi.fn(() => ['QWEN.md', 'AGENTS.md']), DEFAULT_CONTEXT_FILENAME: 'QWEN.md', QWEN_CONFIG_DIR: '.qwen', })); diff --git a/packages/core/src/utils/ignorePatterns.test.ts b/packages/core/src/utils/ignorePatterns.test.ts index 646c4b6bb..722f72edb 100644 --- a/packages/core/src/utils/ignorePatterns.test.ts +++ b/packages/core/src/utils/ignorePatterns.test.ts @@ -14,7 +14,7 @@ import type { Config } from '../config/config.js'; // Mock the memoryTool module vi.mock('../tools/memoryTool.js', () => ({ - getCurrentGeminiMdFilename: vi.fn(() => 'GEMINI.md'), + getAllGeminiMdFilenames: vi.fn(() => ['GEMINI.md', 'AGENTS.md']), })); describe('FileExclusions', () => { @@ -56,6 +56,7 @@ describe('FileExclusions', () => { // Should include dynamic patterns expect(patterns).toContain('**/GEMINI.md'); + expect(patterns).toContain('**/AGENTS.md'); }); it('should respect includeDefaults option', () => { @@ -68,6 +69,7 @@ describe('FileExclusions', () => { expect(patterns).not.toContain('**/node_modules/**'); expect(patterns).not.toContain('**/.git/**'); expect(patterns).not.toContain('**/GEMINI.md'); + expect(patterns).not.toContain('**/AGENTS.md'); expect(patterns).toHaveLength(0); }); @@ -101,7 +103,9 @@ describe('FileExclusions', () => { }); expect(patternsWithDynamic).toContain('**/GEMINI.md'); + expect(patternsWithDynamic).toContain('**/AGENTS.md'); expect(patternsWithoutDynamic).not.toContain('**/GEMINI.md'); + expect(patternsWithoutDynamic).not.toContain('**/AGENTS.md'); }); }); @@ -114,6 +118,7 @@ describe('FileExclusions', () => { expect(patterns).toContain('**/node_modules/**'); expect(patterns).toContain('**/.git/**'); expect(patterns).toContain('**/GEMINI.md'); + expect(patterns).toContain('**/AGENTS.md'); // Should include additional excludes expect(patterns).toContain('**/*.log'); diff --git a/packages/core/src/utils/ignorePatterns.ts b/packages/core/src/utils/ignorePatterns.ts index 9f9776db5..b4a4c2e40 100644 --- a/packages/core/src/utils/ignorePatterns.ts +++ b/packages/core/src/utils/ignorePatterns.ts @@ -6,7 +6,7 @@ import path from 'node:path'; import type { Config } from '../config/config.js'; -import { getCurrentGeminiMdFilename } from '../tools/memoryTool.js'; +import { getAllGeminiMdFilenames } from '../tools/memoryTool.js'; /** * Common ignore patterns used across multiple tools for basic exclusions. @@ -119,7 +119,7 @@ export interface ExcludeOptions { runtimePatterns?: string[]; /** - * Whether to include dynamic patterns like the current Gemini MD filename. Defaults to true. + * Whether to include dynamic patterns like configured context filenames. Defaults to true. */ includeDynamicPatterns?: boolean; } @@ -158,9 +158,11 @@ export class FileExclusions { patterns.push(...DEFAULT_FILE_EXCLUDES); } - // Add dynamic patterns (like current Gemini MD filename) + // Add dynamic patterns (like context filenames) if (includeDynamicPatterns) { - patterns.push(`**/${getCurrentGeminiMdFilename()}`); + for (const filename of getAllGeminiMdFilenames()) { + patterns.push(`**/${filename}`); + } } // Add custom patterns from configuration