@google/gemini-cli-core 0.1.13 → 0.1.15

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.
Files changed (234) hide show
  1. package/README.md +22 -1
  2. package/dist/google-gemini-cli-core-0.1.13.tgz +0 -0
  3. package/dist/src/code_assist/codeAssist.js +2 -2
  4. package/dist/src/code_assist/codeAssist.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.js +9 -2
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +99 -7
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/code_assist/server.d.ts +4 -6
  10. package/dist/src/code_assist/server.js +4 -69
  11. package/dist/src/code_assist/server.js.map +1 -1
  12. package/dist/src/code_assist/setup.d.ts +6 -1
  13. package/dist/src/code_assist/setup.js +4 -1
  14. package/dist/src/code_assist/setup.js.map +1 -1
  15. package/dist/src/code_assist/setup.test.js +4 -1
  16. package/dist/src/code_assist/setup.test.js.map +1 -1
  17. package/dist/src/code_assist/types.d.ts +2 -2
  18. package/dist/src/config/config.d.ts +28 -7
  19. package/dist/src/config/config.js +52 -16
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/config.test.js +1 -23
  22. package/dist/src/config/config.test.js.map +1 -1
  23. package/dist/src/config/flashFallback.test.js +1 -1
  24. package/dist/src/config/flashFallback.test.js.map +1 -1
  25. package/dist/src/core/client.d.ts +5 -2
  26. package/dist/src/core/client.js +39 -17
  27. package/dist/src/core/client.js.map +1 -1
  28. package/dist/src/core/client.test.js +51 -0
  29. package/dist/src/core/client.test.js.map +1 -1
  30. package/dist/src/core/contentGenerator.d.ts +1 -1
  31. package/dist/src/core/contentGenerator.js +1 -1
  32. package/dist/src/core/contentGenerator.js.map +1 -1
  33. package/dist/src/core/geminiChat.d.ts +4 -3
  34. package/dist/src/core/geminiChat.js +8 -11
  35. package/dist/src/core/geminiChat.js.map +1 -1
  36. package/dist/src/core/geminiRequest.js +2 -37
  37. package/dist/src/core/geminiRequest.js.map +1 -1
  38. package/dist/src/core/logger.js +6 -0
  39. package/dist/src/core/logger.js.map +1 -1
  40. package/dist/src/core/logger.test.js +1 -1
  41. package/dist/src/core/logger.test.js.map +1 -1
  42. package/dist/src/core/nonInteractiveToolExecutor.test.js +5 -5
  43. package/dist/src/core/prompts.js +42 -18
  44. package/dist/src/core/prompts.js.map +1 -1
  45. package/dist/src/core/prompts.test.js +121 -4
  46. package/dist/src/core/prompts.test.js.map +1 -1
  47. package/dist/src/core/turn.d.ts +7 -2
  48. package/dist/src/core/turn.js +9 -0
  49. package/dist/src/core/turn.js.map +1 -1
  50. package/dist/src/core/turn.test.js +129 -0
  51. package/dist/src/core/turn.test.js.map +1 -1
  52. package/dist/src/ide/ide-client.d.ts +28 -0
  53. package/dist/src/ide/ide-client.js +88 -0
  54. package/dist/src/ide/ide-client.js.map +1 -0
  55. package/dist/src/ide/ideContext.d.ts +174 -0
  56. package/dist/src/{services → ide}/ideContext.js +28 -25
  57. package/dist/src/ide/ideContext.js.map +1 -0
  58. package/dist/src/{services → ide}/ideContext.test.js +39 -39
  59. package/dist/src/ide/ideContext.test.js.map +1 -0
  60. package/dist/src/index.d.ts +8 -1
  61. package/dist/src/index.js +11 -1
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  64. package/dist/src/mcp/google-auth-provider.js +63 -0
  65. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  66. package/dist/src/mcp/google-auth-provider.test.js +54 -0
  67. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  68. package/dist/src/mcp/oauth-provider.d.ts +5 -1
  69. package/dist/src/mcp/oauth-provider.js +36 -11
  70. package/dist/src/mcp/oauth-provider.js.map +1 -1
  71. package/dist/src/mcp/oauth-provider.test.js +2 -2
  72. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  73. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  74. package/dist/src/mcp/oauth-token-storage.js +3 -1
  75. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  76. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  77. package/dist/src/prompts/mcp-prompts.js +13 -0
  78. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  79. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  80. package/dist/src/prompts/prompt-registry.js +47 -0
  81. package/dist/src/prompts/prompt-registry.js.map +1 -0
  82. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  83. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  84. package/dist/src/services/gitService.test.js +67 -86
  85. package/dist/src/services/gitService.test.js.map +1 -1
  86. package/dist/src/services/loopDetectionService.d.ts +48 -5
  87. package/dist/src/services/loopDetectionService.js +124 -38
  88. package/dist/src/services/loopDetectionService.js.map +1 -1
  89. package/dist/src/services/loopDetectionService.test.js +39 -112
  90. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  91. package/dist/src/services/shellExecutionService.d.ts +70 -0
  92. package/dist/src/services/shellExecutionService.js +152 -0
  93. package/dist/src/services/shellExecutionService.js.map +1 -0
  94. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  95. package/dist/src/services/shellExecutionService.test.js +258 -0
  96. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  97. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
  98. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +17 -2
  99. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  100. package/dist/src/telemetry/constants.d.ts +1 -0
  101. package/dist/src/telemetry/constants.js +1 -0
  102. package/dist/src/telemetry/constants.js.map +1 -1
  103. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  104. package/dist/src/telemetry/file-exporters.js +62 -0
  105. package/dist/src/telemetry/file-exporters.js.map +1 -0
  106. package/dist/src/telemetry/loggers.d.ts +2 -1
  107. package/dist/src/telemetry/loggers.js +17 -1
  108. package/dist/src/telemetry/loggers.js.map +1 -1
  109. package/dist/src/telemetry/sdk.js +17 -6
  110. package/dist/src/telemetry/sdk.js.map +1 -1
  111. package/dist/src/telemetry/types.d.ts +9 -2
  112. package/dist/src/telemetry/types.js +13 -1
  113. package/dist/src/telemetry/types.js.map +1 -1
  114. package/dist/src/tools/edit.js +10 -4
  115. package/dist/src/tools/edit.js.map +1 -1
  116. package/dist/src/tools/edit.test.js +12 -0
  117. package/dist/src/tools/edit.test.js.map +1 -1
  118. package/dist/src/tools/glob.test.js +7 -4
  119. package/dist/src/tools/glob.test.js.map +1 -1
  120. package/dist/src/tools/grep.test.js +5 -5
  121. package/dist/src/tools/grep.test.js.map +1 -1
  122. package/dist/src/tools/ls.d.ts +5 -2
  123. package/dist/src/tools/ls.js +39 -10
  124. package/dist/src/tools/ls.js.map +1 -1
  125. package/dist/src/tools/mcp-client.d.ts +31 -3
  126. package/dist/src/tools/mcp-client.js +478 -38
  127. package/dist/src/tools/mcp-client.js.map +1 -1
  128. package/dist/src/tools/mcp-client.test.js +99 -7
  129. package/dist/src/tools/mcp-client.test.js.map +1 -1
  130. package/dist/src/tools/mcp-tool.js +1 -1
  131. package/dist/src/tools/mcp-tool.js.map +1 -1
  132. package/dist/src/tools/mcp-tool.test.js +34 -0
  133. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  134. package/dist/src/tools/modifiable-tool.test.js +51 -62
  135. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  136. package/dist/src/tools/read-file.test.js +98 -69
  137. package/dist/src/tools/read-file.test.js.map +1 -1
  138. package/dist/src/tools/read-many-files.d.ts +5 -3
  139. package/dist/src/tools/read-many-files.js +62 -22
  140. package/dist/src/tools/read-many-files.js.map +1 -1
  141. package/dist/src/tools/read-many-files.test.js +5 -2
  142. package/dist/src/tools/read-many-files.test.js.map +1 -1
  143. package/dist/src/tools/shell.d.ts +3 -23
  144. package/dist/src/tools/shell.js +165 -296
  145. package/dist/src/tools/shell.js.map +1 -1
  146. package/dist/src/tools/shell.test.js +254 -392
  147. package/dist/src/tools/shell.test.js.map +1 -1
  148. package/dist/src/tools/tool-registry.d.ts +13 -1
  149. package/dist/src/tools/tool-registry.js +46 -2
  150. package/dist/src/tools/tool-registry.js.map +1 -1
  151. package/dist/src/tools/tool-registry.test.js +5 -5
  152. package/dist/src/tools/tool-registry.test.js.map +1 -1
  153. package/dist/src/utils/bfsFileSearch.d.ts +2 -0
  154. package/dist/src/utils/bfsFileSearch.js +4 -1
  155. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  156. package/dist/src/utils/bfsFileSearch.test.js +108 -105
  157. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  158. package/dist/src/utils/editCorrector.js +4 -4
  159. package/dist/src/utils/editCorrector.js.map +1 -1
  160. package/dist/src/utils/editCorrector.test.js +1 -1
  161. package/dist/src/utils/editor.js +16 -10
  162. package/dist/src/utils/editor.js.map +1 -1
  163. package/dist/src/utils/editor.test.js +128 -28
  164. package/dist/src/utils/editor.test.js.map +1 -1
  165. package/dist/src/utils/errorReporting.d.ts +1 -1
  166. package/dist/src/utils/errorReporting.js +2 -2
  167. package/dist/src/utils/errorReporting.js.map +1 -1
  168. package/dist/src/utils/errorReporting.test.js +44 -38
  169. package/dist/src/utils/errorReporting.test.js.map +1 -1
  170. package/dist/src/utils/fileUtils.d.ts +4 -4
  171. package/dist/src/utils/fileUtils.js +31 -15
  172. package/dist/src/utils/fileUtils.js.map +1 -1
  173. package/dist/src/utils/fileUtils.test.js +37 -37
  174. package/dist/src/utils/fileUtils.test.js.map +1 -1
  175. package/dist/src/utils/formatters.d.ts +6 -0
  176. package/dist/src/utils/formatters.js +16 -0
  177. package/dist/src/utils/formatters.js.map +1 -0
  178. package/dist/src/utils/getFolderStructure.d.ts +3 -2
  179. package/dist/src/utils/getFolderStructure.js +27 -28
  180. package/dist/src/utils/getFolderStructure.js.map +1 -1
  181. package/dist/src/utils/getFolderStructure.test.js +169 -187
  182. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  183. package/dist/src/utils/gitIgnoreParser.js +4 -7
  184. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  185. package/dist/src/utils/gitIgnoreParser.test.js +70 -61
  186. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  187. package/dist/src/utils/memoryDiscovery.d.ts +2 -1
  188. package/dist/src/utils/memoryDiscovery.js +11 -5
  189. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  190. package/dist/src/utils/memoryDiscovery.test.js +160 -371
  191. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  192. package/dist/src/utils/partUtils.d.ts +14 -0
  193. package/dist/src/utils/partUtils.js +65 -0
  194. package/dist/src/utils/partUtils.js.map +1 -0
  195. package/dist/src/utils/partUtils.test.d.ts +6 -0
  196. package/dist/src/utils/partUtils.test.js +130 -0
  197. package/dist/src/utils/partUtils.test.js.map +1 -0
  198. package/dist/src/utils/paths.d.ts +11 -0
  199. package/dist/src/utils/paths.js +17 -1
  200. package/dist/src/utils/paths.js.map +1 -1
  201. package/dist/src/utils/quotaErrorDetection.js +0 -2
  202. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  203. package/dist/src/utils/retry.js +1 -1
  204. package/dist/src/utils/retry.js.map +1 -1
  205. package/dist/src/utils/schemaValidator.d.ts +1 -1
  206. package/dist/src/utils/schemaValidator.js +6 -3
  207. package/dist/src/utils/schemaValidator.js.map +1 -1
  208. package/dist/src/utils/shell-utils.d.ts +78 -0
  209. package/dist/src/utils/shell-utils.js +306 -0
  210. package/dist/src/utils/shell-utils.js.map +1 -0
  211. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  212. package/dist/src/utils/shell-utils.test.js +200 -0
  213. package/dist/src/utils/shell-utils.test.js.map +1 -0
  214. package/dist/src/utils/summarizer.js +1 -30
  215. package/dist/src/utils/summarizer.js.map +1 -1
  216. package/dist/src/utils/systemEncoding.d.ts +40 -0
  217. package/dist/src/utils/systemEncoding.js +149 -0
  218. package/dist/src/utils/systemEncoding.js.map +1 -0
  219. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  220. package/dist/src/utils/systemEncoding.test.js +368 -0
  221. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  222. package/dist/src/utils/textUtils.d.ts +13 -0
  223. package/dist/src/utils/textUtils.js +28 -0
  224. package/dist/src/utils/textUtils.js.map +1 -0
  225. package/dist/tsconfig.tsbuildinfo +1 -1
  226. package/package.json +2 -1
  227. package/dist/google-gemini-cli-core-0.1.12.tgz +0 -0
  228. package/dist/src/core/geminiRequest.test.js +0 -72
  229. package/dist/src/core/geminiRequest.test.js.map +0 -1
  230. package/dist/src/services/ideContext.d.ts +0 -126
  231. package/dist/src/services/ideContext.js.map +0 -1
  232. package/dist/src/services/ideContext.test.js.map +0 -1
  233. /package/dist/src/{services → ide}/ideContext.test.d.ts +0 -0
  234. /package/dist/src/{core/geminiRequest.test.d.ts → mcp/google-auth-provider.test.d.ts} +0 -0
@@ -6,6 +6,7 @@
6
6
  import * as fs from 'fs/promises';
7
7
  import * as path from 'path';
8
8
  import { getErrorMessage, isNodeError } from './errors.js';
9
+ import { DEFAULT_FILE_FILTERING_OPTIONS } from '../config/config.js';
9
10
  const MAX_ITEMS = 200;
10
11
  const TRUNCATION_INDICATOR = '...';
11
12
  const DEFAULT_IGNORED_FOLDERS = new Set(['node_modules', '.git', 'dist']);
@@ -68,8 +69,12 @@ async function readFullStructure(rootPath, options) {
68
69
  }
69
70
  const fileName = entry.name;
70
71
  const filePath = path.join(currentPath, fileName);
71
- if (options.respectGitIgnore && options.fileService) {
72
- if (options.fileService.shouldGitIgnoreFile(filePath)) {
72
+ if (options.fileService) {
73
+ const shouldIgnore = (options.fileFilteringOptions.respectGitIgnore &&
74
+ options.fileService.shouldGitIgnoreFile(filePath)) ||
75
+ (options.fileFilteringOptions.respectGeminiIgnore &&
76
+ options.fileService.shouldGeminiIgnoreFile(filePath));
77
+ if (shouldIgnore) {
73
78
  continue;
74
79
  }
75
80
  }
@@ -97,13 +102,15 @@ async function readFullStructure(rootPath, options) {
97
102
  // This logic is tricky. Let's try a simpler: if we can't add this item, mark and break.
98
103
  const subFolderName = entry.name;
99
104
  const subFolderPath = path.join(currentPath, subFolderName);
100
- let isIgnoredByGit = false;
101
- if (options.respectGitIgnore && options.fileService) {
102
- if (options.fileService.shouldGitIgnoreFile(subFolderPath)) {
103
- isIgnoredByGit = true;
104
- }
105
+ let isIgnored = false;
106
+ if (options.fileService) {
107
+ isIgnored =
108
+ (options.fileFilteringOptions.respectGitIgnore &&
109
+ options.fileService.shouldGitIgnoreFile(subFolderPath)) ||
110
+ (options.fileFilteringOptions.respectGeminiIgnore &&
111
+ options.fileService.shouldGeminiIgnoreFile(subFolderPath));
105
112
  }
106
- if (options.ignoredFolders.has(subFolderName) || isIgnoredByGit) {
113
+ if (options.ignoredFolders.has(subFolderName) || isIgnored) {
107
114
  const ignoredSubFolder = {
108
115
  name: subFolderName,
109
116
  path: subFolderPath,
@@ -151,7 +158,7 @@ function formatStructure(node, currentIndent, isLastChildOfParent, isProcessingR
151
158
  // Its children are printed relative to that conceptual root.
152
159
  // Ignored root nodes ARE printed with a connector.
153
160
  if (!isProcessingRootNode || node.isIgnored) {
154
- builder.push(`${currentIndent}${connector}${node.name}/${node.isIgnored ? TRUNCATION_INDICATOR : ''}`);
161
+ builder.push(`${currentIndent}${connector}${node.name}${path.sep}${node.isIgnored ? TRUNCATION_INDICATOR : ''}`);
155
162
  }
156
163
  // Determine the indent for the children of *this* node.
157
164
  // If *this* node was the root of the whole structure, its children start with no indent before their connectors.
@@ -201,7 +208,7 @@ export async function getFolderStructure(directory, options) {
201
208
  ignoredFolders: options?.ignoredFolders ?? DEFAULT_IGNORED_FOLDERS,
202
209
  fileIncludePattern: options?.fileIncludePattern,
203
210
  fileService: options?.fileService,
204
- respectGitIgnore: options?.respectGitIgnore ?? true,
211
+ fileFilteringOptions: options?.fileFilteringOptions ?? DEFAULT_FILE_FILTERING_OPTIONS,
205
212
  };
206
213
  try {
207
214
  // 1. Read the structure using BFS, respecting maxItems
@@ -214,30 +221,22 @@ export async function getFolderStructure(directory, options) {
214
221
  // Pass true for isRoot for the initial call
215
222
  formatStructure(structureRoot, '', true, true, structureLines);
216
223
  // 3. Build the final output string
217
- const displayPath = resolvedPath.replace(/\\/g, '/');
218
- let disclaimer = '';
219
- // Check if truncation occurred anywhere or if ignored folders are present.
220
- // A simple check: if any node indicates more files/subfolders, or is ignored.
221
- let truncationOccurred = false;
222
- function checkForTruncation(node) {
224
+ function isTruncated(node) {
223
225
  if (node.hasMoreFiles || node.hasMoreSubfolders || node.isIgnored) {
224
- truncationOccurred = true;
226
+ return true;
225
227
  }
226
- if (!truncationOccurred) {
227
- for (const sub of node.subFolders) {
228
- checkForTruncation(sub);
229
- if (truncationOccurred)
230
- break;
228
+ for (const sub of node.subFolders) {
229
+ if (isTruncated(sub)) {
230
+ return true;
231
231
  }
232
232
  }
233
+ return false;
233
234
  }
234
- checkForTruncation(structureRoot);
235
- if (truncationOccurred) {
236
- disclaimer = `Folders or files indicated with ${TRUNCATION_INDICATOR} contain more items not shown, were ignored, or the display limit (${mergedOptions.maxItems} items) was reached.`;
235
+ let summary = `Showing up to ${mergedOptions.maxItems} items (files + folders).`;
236
+ if (isTruncated(structureRoot)) {
237
+ summary += ` Folders or files indicated with ${TRUNCATION_INDICATOR} contain more items not shown, were ignored, or the display limit (${mergedOptions.maxItems} items) was reached.`;
237
238
  }
238
- const summary = `Showing up to ${mergedOptions.maxItems} items (files + folders). ${disclaimer}`.trim();
239
- const output = `${summary}\n\n${displayPath}/\n${structureLines.join('\n')}`;
240
- return output;
239
+ return `${summary}\n\n${resolvedPath}${path.sep}\n${structureLines.join('\n')}`;
241
240
  }
242
241
  catch (error) {
243
242
  console.error(`Error getting folder structure for ${resolvedPath}:`, error);
@@ -1 +1 @@
1
- {"version":3,"file":"getFolderStructure.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getFolderStructure.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.ts"],"names":[],"mappings":"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"}
@@ -3,298 +3,280 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- /* eslint-disable @typescript-eslint/no-explicit-any */
7
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
6
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
7
  import fsPromises from 'fs/promises';
9
- import * as fs from 'fs';
8
+ import * as nodePath from 'path';
9
+ import * as os from 'os';
10
10
  import { getFolderStructure } from './getFolderStructure.js';
11
- import * as gitUtils from './gitUtils.js';
12
11
  import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
13
- vi.mock('path', async (importOriginal) => {
14
- const original = (await importOriginal());
15
- return {
16
- ...original,
17
- resolve: vi.fn((str) => str),
18
- // Other path functions (basename, join, normalize, etc.) will use original implementation
19
- };
20
- });
21
- vi.mock('fs/promises');
22
- vi.mock('fs');
23
- vi.mock('./gitUtils.js');
24
- // Import 'path' again here, it will be the mocked version
25
12
  import * as path from 'path';
26
- // Helper to create Dirent-like objects for mocking fs.readdir
27
- const createDirent = (name, type) => ({
28
- name,
29
- isFile: () => type === 'file',
30
- isDirectory: () => type === 'dir',
31
- isBlockDevice: () => false,
32
- isCharacterDevice: () => false,
33
- isSymbolicLink: () => false,
34
- isFIFO: () => false,
35
- isSocket: () => false,
36
- path: '',
37
- parentPath: '',
38
- });
39
13
  describe('getFolderStructure', () => {
40
- beforeEach(() => {
41
- vi.resetAllMocks();
42
- // path.resolve is now a vi.fn() due to the top-level vi.mock.
43
- // We ensure its implementation is set for each test (or rely on the one from vi.mock).
44
- // vi.resetAllMocks() clears call history but not the implementation set by vi.fn() in vi.mock.
45
- // If we needed to change it per test, we would do it here:
46
- path.resolve.mockImplementation((str) => str);
47
- // Re-apply/define the mock implementation for fsPromises.readdir for each test
48
- fsPromises.readdir.mockImplementation(async (dirPath) => {
49
- // path.normalize here will use the mocked path module.
50
- // Since normalize is spread from original, it should be the real one.
51
- const normalizedPath = path.normalize(dirPath.toString());
52
- if (mockFsStructure[normalizedPath]) {
53
- return mockFsStructure[normalizedPath];
54
- }
55
- throw Object.assign(new Error(`ENOENT: no such file or directory, scandir '${normalizedPath}'`), { code: 'ENOENT' });
56
- });
14
+ let testRootDir;
15
+ async function createEmptyDir(...pathSegments) {
16
+ const fullPath = path.join(testRootDir, ...pathSegments);
17
+ await fsPromises.mkdir(fullPath, { recursive: true });
18
+ }
19
+ async function createTestFile(...pathSegments) {
20
+ const fullPath = path.join(testRootDir, ...pathSegments);
21
+ await fsPromises.mkdir(path.dirname(fullPath), { recursive: true });
22
+ await fsPromises.writeFile(fullPath, '');
23
+ return fullPath;
24
+ }
25
+ beforeEach(async () => {
26
+ testRootDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'folder-structure-test-'));
57
27
  });
58
- afterEach(() => {
59
- vi.restoreAllMocks(); // Restores spies (like fsPromises.readdir) and resets vi.fn mocks (like path.resolve)
28
+ afterEach(async () => {
29
+ await fsPromises.rm(testRootDir, { recursive: true, force: true });
60
30
  });
61
- const mockFsStructure = {
62
- '/testroot': [
63
- createDirent('file1.txt', 'file'),
64
- createDirent('subfolderA', 'dir'),
65
- createDirent('emptyFolder', 'dir'),
66
- createDirent('.hiddenfile', 'file'),
67
- createDirent('node_modules', 'dir'),
68
- ],
69
- '/testroot/subfolderA': [
70
- createDirent('fileA1.ts', 'file'),
71
- createDirent('fileA2.js', 'file'),
72
- createDirent('subfolderB', 'dir'),
73
- ],
74
- '/testroot/subfolderA/subfolderB': [createDirent('fileB1.md', 'file')],
75
- '/testroot/emptyFolder': [],
76
- '/testroot/node_modules': [createDirent('somepackage', 'dir')],
77
- '/testroot/manyFilesFolder': Array.from({ length: 10 }, (_, i) => createDirent(`file-${i}.txt`, 'file')),
78
- '/testroot/manyFolders': Array.from({ length: 5 }, (_, i) => createDirent(`folder-${i}`, 'dir')),
79
- ...Array.from({ length: 5 }, (_, i) => ({
80
- [`/testroot/manyFolders/folder-${i}`]: [
81
- createDirent('child.txt', 'file'),
82
- ],
83
- })).reduce((acc, val) => ({ ...acc, ...val }), {}),
84
- '/testroot/deepFolders': [createDirent('level1', 'dir')],
85
- '/testroot/deepFolders/level1': [createDirent('level2', 'dir')],
86
- '/testroot/deepFolders/level1/level2': [createDirent('level3', 'dir')],
87
- '/testroot/deepFolders/level1/level2/level3': [
88
- createDirent('file.txt', 'file'),
89
- ],
90
- };
91
31
  it('should return basic folder structure', async () => {
92
- const structure = await getFolderStructure('/testroot/subfolderA');
93
- const expected = `
32
+ await createTestFile('fileA1.ts');
33
+ await createTestFile('fileA2.js');
34
+ await createTestFile('subfolderB', 'fileB1.md');
35
+ const structure = await getFolderStructure(testRootDir);
36
+ expect(structure.trim()).toBe(`
94
37
  Showing up to 200 items (files + folders).
95
38
 
96
- /testroot/subfolderA/
39
+ ${testRootDir}${path.sep}
97
40
  ├───fileA1.ts
98
41
  ├───fileA2.js
99
- └───subfolderB/
42
+ └───subfolderB${path.sep}
100
43
  └───fileB1.md
101
- `.trim();
102
- expect(structure.trim()).toBe(expected);
44
+ `.trim());
103
45
  });
104
46
  it('should handle an empty folder', async () => {
105
- const structure = await getFolderStructure('/testroot/emptyFolder');
106
- const expected = `
47
+ const structure = await getFolderStructure(testRootDir);
48
+ expect(structure.trim()).toBe(`
107
49
  Showing up to 200 items (files + folders).
108
50
 
109
- /testroot/emptyFolder/
110
- `.trim();
111
- expect(structure.trim()).toBe(expected.trim());
51
+ ${testRootDir}${path.sep}
52
+ `
53
+ .trim()
54
+ .trim());
112
55
  });
113
56
  it('should ignore folders specified in ignoredFolders (default)', async () => {
114
- const structure = await getFolderStructure('/testroot');
115
- const expected = `
57
+ await createTestFile('.hiddenfile');
58
+ await createTestFile('file1.txt');
59
+ await createEmptyDir('emptyFolder');
60
+ await createTestFile('node_modules', 'somepackage', 'index.js');
61
+ await createTestFile('subfolderA', 'fileA1.ts');
62
+ await createTestFile('subfolderA', 'fileA2.js');
63
+ await createTestFile('subfolderA', 'subfolderB', 'fileB1.md');
64
+ const structure = await getFolderStructure(testRootDir);
65
+ expect(structure.trim()).toBe(`
116
66
  Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
117
67
 
118
- /testroot/
68
+ ${testRootDir}${path.sep}
119
69
  ├───.hiddenfile
120
70
  ├───file1.txt
121
- ├───emptyFolder/
122
- ├───node_modules/...
123
- └───subfolderA/
71
+ ├───emptyFolder${path.sep}
72
+ ├───node_modules${path.sep}...
73
+ └───subfolderA${path.sep}
124
74
  ├───fileA1.ts
125
75
  ├───fileA2.js
126
- └───subfolderB/
76
+ └───subfolderB${path.sep}
127
77
  └───fileB1.md
128
- `.trim();
129
- expect(structure.trim()).toBe(expected);
78
+ `.trim());
130
79
  });
131
80
  it('should ignore folders specified in custom ignoredFolders', async () => {
132
- const structure = await getFolderStructure('/testroot', {
81
+ await createTestFile('.hiddenfile');
82
+ await createTestFile('file1.txt');
83
+ await createEmptyDir('emptyFolder');
84
+ await createTestFile('node_modules', 'somepackage', 'index.js');
85
+ await createTestFile('subfolderA', 'fileA1.ts');
86
+ const structure = await getFolderStructure(testRootDir, {
133
87
  ignoredFolders: new Set(['subfolderA', 'node_modules']),
134
88
  });
135
89
  const expected = `
136
90
  Showing up to 200 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (200 items) was reached.
137
91
 
138
- /testroot/
92
+ ${testRootDir}${path.sep}
139
93
  ├───.hiddenfile
140
94
  ├───file1.txt
141
- ├───emptyFolder/
142
- ├───node_modules/...
143
- └───subfolderA/...
95
+ ├───emptyFolder${path.sep}
96
+ ├───node_modules${path.sep}...
97
+ └───subfolderA${path.sep}...
144
98
  `.trim();
145
99
  expect(structure.trim()).toBe(expected);
146
100
  });
147
101
  it('should filter files by fileIncludePattern', async () => {
148
- const structure = await getFolderStructure('/testroot/subfolderA', {
102
+ await createTestFile('fileA1.ts');
103
+ await createTestFile('fileA2.js');
104
+ await createTestFile('subfolderB', 'fileB1.md');
105
+ const structure = await getFolderStructure(testRootDir, {
149
106
  fileIncludePattern: /\.ts$/,
150
107
  });
151
108
  const expected = `
152
109
  Showing up to 200 items (files + folders).
153
110
 
154
- /testroot/subfolderA/
111
+ ${testRootDir}${path.sep}
155
112
  ├───fileA1.ts
156
- └───subfolderB/
113
+ └───subfolderB${path.sep}
157
114
  `.trim();
158
115
  expect(structure.trim()).toBe(expected);
159
116
  });
160
117
  it('should handle maxItems truncation for files within a folder', async () => {
161
- const structure = await getFolderStructure('/testroot/subfolderA', {
118
+ await createTestFile('fileA1.ts');
119
+ await createTestFile('fileA2.js');
120
+ await createTestFile('subfolderB', 'fileB1.md');
121
+ const structure = await getFolderStructure(testRootDir, {
162
122
  maxItems: 3,
163
123
  });
164
124
  const expected = `
165
125
  Showing up to 3 items (files + folders).
166
126
 
167
- /testroot/subfolderA/
127
+ ${testRootDir}${path.sep}
168
128
  ├───fileA1.ts
169
129
  ├───fileA2.js
170
- └───subfolderB/
130
+ └───subfolderB${path.sep}
171
131
  `.trim();
172
132
  expect(structure.trim()).toBe(expected);
173
133
  });
174
134
  it('should handle maxItems truncation for subfolders', async () => {
175
- const structure = await getFolderStructure('/testroot/manyFolders', {
135
+ for (let i = 0; i < 5; i++) {
136
+ await createTestFile(`folder-${i}`, 'child.txt');
137
+ }
138
+ const structure = await getFolderStructure(testRootDir, {
176
139
  maxItems: 4,
177
140
  });
178
141
  const expectedRevised = `
179
142
  Showing up to 4 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (4 items) was reached.
180
143
 
181
- /testroot/manyFolders/
182
- ├───folder-0/
183
- ├───folder-1/
184
- ├───folder-2/
185
- ├───folder-3/
144
+ ${testRootDir}${path.sep}
145
+ ├───folder-0${path.sep}
146
+ ├───folder-1${path.sep}
147
+ ├───folder-2${path.sep}
148
+ ├───folder-3${path.sep}
186
149
  └───...
187
150
  `.trim();
188
151
  expect(structure.trim()).toBe(expectedRevised);
189
152
  });
190
153
  it('should handle maxItems that only allows the root folder itself', async () => {
191
- const structure = await getFolderStructure('/testroot/subfolderA', {
154
+ await createTestFile('fileA1.ts');
155
+ await createTestFile('fileA2.ts');
156
+ await createTestFile('subfolderB', 'fileB1.ts');
157
+ const structure = await getFolderStructure(testRootDir, {
192
158
  maxItems: 1,
193
159
  });
194
- const expectedRevisedMax1 = `
160
+ const expected = `
195
161
  Showing up to 1 items (files + folders). Folders or files indicated with ... contain more items not shown, were ignored, or the display limit (1 items) was reached.
196
162
 
197
- /testroot/subfolderA/
163
+ ${testRootDir}${path.sep}
198
164
  ├───fileA1.ts
199
165
  ├───...
200
166
  └───...
201
167
  `.trim();
202
- expect(structure.trim()).toBe(expectedRevisedMax1);
168
+ expect(structure.trim()).toBe(expected);
203
169
  });
204
170
  it('should handle non-existent directory', async () => {
205
- // Temporarily make fsPromises.readdir throw ENOENT for this specific path
206
- const originalReaddir = fsPromises.readdir;
207
- fsPromises.readdir.mockImplementation(async (p) => {
208
- if (p === '/nonexistent') {
209
- throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
210
- }
211
- return originalReaddir(p);
212
- });
213
- const structure = await getFolderStructure('/nonexistent');
214
- expect(structure).toContain('Error: Could not read directory "/nonexistent"');
171
+ const nonExistentPath = path.join(testRootDir, 'non-existent');
172
+ const structure = await getFolderStructure(nonExistentPath);
173
+ expect(structure).toContain(`Error: Could not read directory "${nonExistentPath}". Check path and permissions.`);
215
174
  });
216
175
  it('should handle deep folder structure within limits', async () => {
217
- const structure = await getFolderStructure('/testroot/deepFolders', {
176
+ await createTestFile('level1', 'level2', 'level3', 'file.txt');
177
+ const structure = await getFolderStructure(testRootDir, {
218
178
  maxItems: 10,
219
179
  });
220
180
  const expected = `
221
181
  Showing up to 10 items (files + folders).
222
182
 
223
- /testroot/deepFolders/
224
- └───level1/
225
- └───level2/
226
- └───level3/
183
+ ${testRootDir}${path.sep}
184
+ └───level1${path.sep}
185
+ └───level2${path.sep}
186
+ └───level3${path.sep}
227
187
  └───file.txt
228
188
  `.trim();
229
189
  expect(structure.trim()).toBe(expected);
230
190
  });
231
191
  it('should truncate deep folder structure if maxItems is small', async () => {
232
- const structure = await getFolderStructure('/testroot/deepFolders', {
192
+ await createTestFile('level1', 'level2', 'level3', 'file.txt');
193
+ const structure = await getFolderStructure(testRootDir, {
233
194
  maxItems: 3,
234
195
  });
235
196
  const expected = `
236
197
  Showing up to 3 items (files + folders).
237
198
 
238
- /testroot/deepFolders/
239
- └───level1/
240
- └───level2/
241
- └───level3/
199
+ ${testRootDir}${path.sep}
200
+ └───level1${path.sep}
201
+ └───level2${path.sep}
202
+ └───level3${path.sep}
242
203
  `.trim();
243
204
  expect(structure.trim()).toBe(expected);
244
205
  });
245
- });
246
- describe('getFolderStructure gitignore', () => {
247
- beforeEach(() => {
248
- vi.resetAllMocks();
249
- path.resolve.mockImplementation((str) => str);
250
- fsPromises.readdir.mockImplementation(async (p) => {
251
- const path = p.toString();
252
- if (path === '/test/project') {
253
- return [
254
- createDirent('file1.txt', 'file'),
255
- createDirent('node_modules', 'dir'),
256
- createDirent('ignored.txt', 'file'),
257
- createDirent('.gemini', 'dir'),
258
- ];
259
- }
260
- if (path === '/test/project/node_modules') {
261
- return [createDirent('some-package', 'dir')];
262
- }
263
- if (path === '/test/project/.gemini') {
264
- return [
265
- createDirent('config.yaml', 'file'),
266
- createDirent('logs.json', 'file'),
267
- ];
268
- }
269
- return [];
206
+ describe('with gitignore', () => {
207
+ beforeEach(async () => {
208
+ await fsPromises.mkdir(path.join(testRootDir, '.git'), {
209
+ recursive: true,
210
+ });
270
211
  });
271
- fs.readFileSync.mockImplementation((p) => {
272
- const path = p.toString();
273
- if (path === '/test/project/.gitignore') {
274
- return 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml';
275
- }
276
- return '';
212
+ it('should ignore files and folders specified in .gitignore', async () => {
213
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt\nnode_modules/\n.gemini/*\n!/.gemini/config.yaml');
214
+ await createTestFile('file1.txt');
215
+ await createTestFile('node_modules', 'some-package', 'index.js');
216
+ await createTestFile('ignored.txt');
217
+ await createTestFile('.gemini', 'config.yaml');
218
+ await createTestFile('.gemini', 'logs.json');
219
+ const fileService = new FileDiscoveryService(testRootDir);
220
+ const structure = await getFolderStructure(testRootDir, {
221
+ fileService,
222
+ });
223
+ expect(structure).not.toContain('ignored.txt');
224
+ expect(structure).toContain(`node_modules${path.sep}...`);
225
+ expect(structure).not.toContain('logs.json');
226
+ expect(structure).toContain('config.yaml');
227
+ expect(structure).toContain('file1.txt');
277
228
  });
278
- vi.mocked(gitUtils.isGitRepository).mockReturnValue(true);
279
- });
280
- it('should ignore files and folders specified in .gitignore', async () => {
281
- const fileService = new FileDiscoveryService('/test/project');
282
- const structure = await getFolderStructure('/test/project', {
283
- fileService,
229
+ it('should not ignore files if respectGitIgnore is false', async () => {
230
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.gitignore'), 'ignored.txt');
231
+ await createTestFile('file1.txt');
232
+ await createTestFile('ignored.txt');
233
+ const fileService = new FileDiscoveryService(testRootDir);
234
+ const structure = await getFolderStructure(testRootDir, {
235
+ fileService,
236
+ fileFilteringOptions: {
237
+ respectGeminiIgnore: false,
238
+ respectGitIgnore: false,
239
+ },
240
+ });
241
+ expect(structure).toContain('ignored.txt');
242
+ expect(structure).toContain('file1.txt');
284
243
  });
285
- expect(structure).not.toContain('ignored.txt');
286
- expect(structure).toContain('node_modules/...');
287
- expect(structure).not.toContain('logs.json');
288
244
  });
289
- it('should not ignore files if respectGitIgnore is false', async () => {
290
- const fileService = new FileDiscoveryService('/test/project');
291
- const structure = await getFolderStructure('/test/project', {
292
- fileService,
293
- respectGitIgnore: false,
245
+ describe('with geminiignore', () => {
246
+ it('should ignore geminiignore files by default', async () => {
247
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
248
+ await createTestFile('file1.txt');
249
+ await createTestFile('node_modules', 'some-package', 'index.js');
250
+ await createTestFile('ignored.txt');
251
+ await createTestFile('.gemini', 'config.yaml');
252
+ await createTestFile('.gemini', 'logs.json');
253
+ const fileService = new FileDiscoveryService(testRootDir);
254
+ const structure = await getFolderStructure(testRootDir, {
255
+ fileService,
256
+ });
257
+ expect(structure).not.toContain('ignored.txt');
258
+ expect(structure).toContain(`node_modules${path.sep}...`);
259
+ expect(structure).not.toContain('logs.json');
260
+ });
261
+ it('should not ignore files if respectGeminiIgnore is false', async () => {
262
+ await fsPromises.writeFile(nodePath.join(testRootDir, '.geminiignore'), 'ignored.txt\nnode_modules/\n.gemini/\n!/.gemini/config.yaml');
263
+ await createTestFile('file1.txt');
264
+ await createTestFile('node_modules', 'some-package', 'index.js');
265
+ await createTestFile('ignored.txt');
266
+ await createTestFile('.gemini', 'config.yaml');
267
+ await createTestFile('.gemini', 'logs.json');
268
+ const fileService = new FileDiscoveryService(testRootDir);
269
+ const structure = await getFolderStructure(testRootDir, {
270
+ fileService,
271
+ fileFilteringOptions: {
272
+ respectGeminiIgnore: false,
273
+ respectGitIgnore: true, // Explicitly disable gemini ignore only
274
+ },
275
+ });
276
+ expect(structure).toContain('ignored.txt');
277
+ // node_modules is still ignored by default
278
+ expect(structure).toContain(`node_modules${path.sep}...`);
294
279
  });
295
- expect(structure).toContain('ignored.txt');
296
- // node_modules is still ignored by default
297
- expect(structure).toContain('node_modules/...');
298
280
  });
299
281
  });
300
282
  //# sourceMappingURL=getFolderStructure.test.js.map