diff options
Diffstat (limited to 'packages/cli/src')
| -rw-r--r-- | packages/cli/src/config/config.ts | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 4f91482b..53780bb3 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -130,8 +130,22 @@ async function collectDownwardGeminiFiles( directory: string, debugMode: boolean, ignoreDirs: string[], + scannedDirCount: { count: number }, + maxScanDirs: number, ): Promise<string[]> { - if (debugMode) logger.debug(`Recursively scanning downward in: ${directory}`); + if (scannedDirCount.count >= maxScanDirs) { + if (debugMode) + logger.debug( + `Max directory scan limit (${maxScanDirs}) reached. Stopping downward scan at: ${directory}`, + ); + return []; + } + scannedDirCount.count++; + + if (debugMode) + logger.debug( + `Scanning downward for ${GEMINI_MD_FILENAME} files in: ${directory} (scanned: ${scannedDirCount.count}/${maxScanDirs})`, + ); const collectedPaths: string[] = []; try { const entries = await fs.readdir(directory, { withFileTypes: true }); @@ -147,6 +161,8 @@ async function collectDownwardGeminiFiles( fullPath, debugMode, ignoreDirs, + scannedDirCount, + maxScanDirs, ); collectedPaths.push(...subDirPaths); } else if (entry.isFile() && entry.name === GEMINI_MD_FILENAME) { @@ -154,11 +170,13 @@ async function collectDownwardGeminiFiles( await fs.access(fullPath, fsSync.constants.R_OK); collectedPaths.push(fullPath); if (debugMode) - logger.debug(`Found readable downward GEMINI.md: ${fullPath}`); + logger.debug( + `Found readable downward ${GEMINI_MD_FILENAME}: ${fullPath}`, + ); } catch { if (debugMode) logger.debug( - `Downward GEMINI.md not readable, skipping: ${fullPath}`, + `Downward ${GEMINI_MD_FILENAME} not readable, skipping: ${fullPath}`, ); } } @@ -186,18 +204,22 @@ export async function getGeminiMdFilePaths( const paths: string[] = []; if (debugMode) - logger.debug(`Searching for GEMINI.md starting from CWD: ${resolvedCwd}`); + logger.debug( + `Searching for ${GEMINI_MD_FILENAME} starting from CWD: ${resolvedCwd}`, + ); if (debugMode) logger.debug(`User home directory: ${resolvedHome}`); try { await fs.access(globalMemoryPath, fsSync.constants.R_OK); paths.push(globalMemoryPath); if (debugMode) - logger.debug(`Found readable global GEMINI.md: ${globalMemoryPath}`); + logger.debug( + `Found readable global ${GEMINI_MD_FILENAME}: ${globalMemoryPath}`, + ); } catch { if (debugMode) logger.debug( - `Global GEMINI.md not found or not readable: ${globalMemoryPath}`, + `Global ${GEMINI_MD_FILENAME} not found or not readable: ${globalMemoryPath}`, ); } @@ -215,7 +237,9 @@ export async function getGeminiMdFilePaths( currentDir !== path.dirname(currentDir) ) { if (debugMode) - logger.debug(`Checking for GEMINI.md in (upward scan): ${currentDir}`); + logger.debug( + `Checking for ${GEMINI_MD_FILENAME} in (upward scan): ${currentDir}`, + ); if (currentDir === path.join(resolvedHome, GEMINI_CONFIG_DIR)) { if (debugMode) logger.debug(`Skipping check inside global config dir: ${currentDir}`); @@ -226,11 +250,13 @@ export async function getGeminiMdFilePaths( await fs.access(potentialPath, fsSync.constants.R_OK); upwardPaths.unshift(potentialPath); if (debugMode) - logger.debug(`Found readable upward GEMINI.md: ${potentialPath}`); + logger.debug( + `Found readable upward ${GEMINI_MD_FILENAME}: ${potentialPath}`, + ); } catch { if (debugMode) logger.debug( - `Upward GEMINI.md not found or not readable in: ${currentDir}`, + `Upward ${GEMINI_MD_FILENAME} not found or not readable in: ${currentDir}`, ); } const parentDir = path.dirname(currentDir); @@ -245,15 +271,19 @@ export async function getGeminiMdFilePaths( if (debugMode) logger.debug(`Starting downward scan from CWD: ${resolvedCwd}`); + const MAX_DIRECTORIES_TO_SCAN_FOR_MEMORY = 200; // Define the cap + const scannedDirCount = { count: 0 }; const downwardPaths = await collectDownwardGeminiFiles( resolvedCwd, debugMode, DEFAULT_IGNORE_DIRECTORIES, + scannedDirCount, + MAX_DIRECTORIES_TO_SCAN_FOR_MEMORY, ); downwardPaths.sort(); if (debugMode && downwardPaths.length > 0) logger.debug( - `Found downward GEMINI.md files (sorted): ${JSON.stringify(downwardPaths)}`, + `Found downward ${GEMINI_MD_FILENAME} files (sorted): ${JSON.stringify(downwardPaths)}`, ); for (const dPath of downwardPaths) { if (!paths.includes(dPath)) { @@ -263,7 +293,7 @@ export async function getGeminiMdFilePaths( if (debugMode) logger.debug( - `Final ordered GEMINI.md paths to read: ${JSON.stringify(paths)}`, + `Final ordered ${GEMINI_MD_FILENAME} paths to read: ${JSON.stringify(paths)}`, ); return paths; } @@ -289,7 +319,7 @@ async function readGeminiMdFiles( } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); logger.warn( - `Warning: Could not read GEMINI.md file at ${filePath}. Error: ${message}`, + `Warning: Could not read ${GEMINI_MD_FILENAME} file at ${filePath}. Error: ${message}`, ); results.push({ filePath, content: null }); if (debugMode) logger.debug(`Failed to read: ${filePath}`); |
