@google/gemini-cli-core 0.1.21 → 0.2.0-preview.0

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 (296) hide show
  1. package/README.md +26 -28
  2. package/dist/src/code_assist/converter.d.ts +1 -0
  3. package/dist/src/code_assist/converter.js +1 -0
  4. package/dist/src/code_assist/converter.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.d.ts +2 -0
  6. package/dist/src/code_assist/oauth2.js +44 -22
  7. package/dist/src/code_assist/oauth2.js.map +1 -1
  8. package/dist/src/code_assist/oauth2.test.js +99 -8
  9. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  10. package/dist/src/code_assist/server.js +1 -1
  11. package/dist/src/code_assist/server.js.map +1 -1
  12. package/dist/src/code_assist/setup.js +1 -1
  13. package/dist/src/code_assist/setup.js.map +1 -1
  14. package/dist/src/code_assist/setup.test.js +14 -8
  15. package/dist/src/code_assist/setup.test.js.map +1 -1
  16. package/dist/src/config/config.d.ts +21 -2
  17. package/dist/src/config/config.js +36 -10
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/config.test.js +22 -0
  20. package/dist/src/config/config.test.js.map +1 -1
  21. package/dist/src/core/client.d.ts +4 -11
  22. package/dist/src/core/client.js +51 -30
  23. package/dist/src/core/client.js.map +1 -1
  24. package/dist/src/core/client.test.js +296 -1
  25. package/dist/src/core/client.test.js.map +1 -1
  26. package/dist/src/core/contentGenerator.js +19 -9
  27. package/dist/src/core/contentGenerator.js.map +1 -1
  28. package/dist/src/core/contentGenerator.test.js +39 -15
  29. package/dist/src/core/contentGenerator.test.js.map +1 -1
  30. package/dist/src/core/coreToolScheduler.d.ts +2 -1
  31. package/dist/src/core/coreToolScheduler.js +26 -4
  32. package/dist/src/core/coreToolScheduler.js.map +1 -1
  33. package/dist/src/core/coreToolScheduler.test.js +230 -69
  34. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  35. package/dist/src/core/geminiChat.js +1 -1
  36. package/dist/src/core/geminiChat.js.map +1 -1
  37. package/dist/src/core/logger.d.ts +22 -1
  38. package/dist/src/core/logger.js +103 -17
  39. package/dist/src/core/logger.js.map +1 -1
  40. package/dist/src/core/logger.test.js +86 -20
  41. package/dist/src/core/logger.test.js.map +1 -1
  42. package/dist/src/core/loggingContentGenerator.d.ts +1 -5
  43. package/dist/src/core/loggingContentGenerator.js +4 -6
  44. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  45. package/dist/src/core/nonInteractiveToolExecutor.d.ts +2 -2
  46. package/dist/src/core/nonInteractiveToolExecutor.js +11 -3
  47. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  48. package/dist/src/core/nonInteractiveToolExecutor.test.js +95 -46
  49. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  50. package/dist/src/core/prompts.js +4 -4
  51. package/dist/src/core/prompts.js.map +1 -1
  52. package/dist/src/core/subagent.js +5 -5
  53. package/dist/src/core/subagent.js.map +1 -1
  54. package/dist/src/core/subagent.test.js +3 -3
  55. package/dist/src/core/subagent.test.js.map +1 -1
  56. package/dist/src/generated/git-commit.d.ts +7 -0
  57. package/dist/src/generated/git-commit.js +10 -0
  58. package/dist/src/generated/git-commit.js.map +1 -0
  59. package/dist/src/ide/constants.d.ts +6 -0
  60. package/dist/src/ide/constants.js +7 -0
  61. package/dist/src/ide/constants.js.map +1 -0
  62. package/dist/src/ide/detect-ide.js +8 -8
  63. package/dist/src/ide/detect-ide.js.map +1 -1
  64. package/dist/src/ide/ide-client.d.ts +9 -1
  65. package/dist/src/ide/ide-client.js +92 -22
  66. package/dist/src/ide/ide-client.js.map +1 -1
  67. package/dist/src/ide/ide-client.test.d.ts +6 -0
  68. package/dist/src/ide/ide-client.test.js +43 -0
  69. package/dist/src/ide/ide-client.test.js.map +1 -0
  70. package/dist/src/ide/ide-installer.js +22 -8
  71. package/dist/src/ide/ide-installer.js.map +1 -1
  72. package/dist/src/ide/ide-installer.test.js +6 -4
  73. package/dist/src/ide/ide-installer.test.js.map +1 -1
  74. package/dist/src/ide/ideContext.d.ts +6 -6
  75. package/dist/src/ide/process-utils.d.ts +19 -0
  76. package/dist/src/ide/process-utils.js +140 -0
  77. package/dist/src/ide/process-utils.js.map +1 -0
  78. package/dist/src/index.d.ts +4 -0
  79. package/dist/src/index.js +4 -0
  80. package/dist/src/index.js.map +1 -1
  81. package/dist/src/mcp/oauth-provider.js +176 -58
  82. package/dist/src/mcp/oauth-provider.js.map +1 -1
  83. package/dist/src/mcp/oauth-provider.test.js +132 -62
  84. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  85. package/dist/src/mcp/oauth-utils.d.ts +3 -1
  86. package/dist/src/mcp/oauth-utils.js +50 -12
  87. package/dist/src/mcp/oauth-utils.js.map +1 -1
  88. package/dist/src/mcp/oauth-utils.test.js +17 -2
  89. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  90. package/dist/src/services/chatRecordingService.d.ts +150 -0
  91. package/dist/src/services/chatRecordingService.js +318 -0
  92. package/dist/src/services/chatRecordingService.js.map +1 -0
  93. package/dist/src/services/chatRecordingService.test.d.ts +6 -0
  94. package/dist/src/services/chatRecordingService.test.js +288 -0
  95. package/dist/src/services/chatRecordingService.test.js.map +1 -0
  96. package/dist/src/services/fileSystemService.d.ts +31 -0
  97. package/dist/src/services/fileSystemService.js +18 -0
  98. package/dist/src/services/fileSystemService.js.map +1 -0
  99. package/dist/src/services/fileSystemService.test.d.ts +6 -0
  100. package/dist/src/services/fileSystemService.test.js +41 -0
  101. package/dist/src/services/fileSystemService.test.js.map +1 -0
  102. package/dist/src/services/loopDetectionService.js +5 -5
  103. package/dist/src/services/loopDetectionService.js.map +1 -1
  104. package/dist/src/services/shellExecutionService.d.ts +8 -10
  105. package/dist/src/services/shellExecutionService.js +289 -133
  106. package/dist/src/services/shellExecutionService.js.map +1 -1
  107. package/dist/src/services/shellExecutionService.test.js +274 -30
  108. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +31 -6
  110. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +101 -121
  111. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  112. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
  113. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +97 -36
  114. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  115. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -2
  116. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +12 -11
  117. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  118. package/dist/src/telemetry/constants.d.ts +1 -0
  119. package/dist/src/telemetry/constants.js +1 -0
  120. package/dist/src/telemetry/constants.js.map +1 -1
  121. package/dist/src/telemetry/index.d.ts +2 -2
  122. package/dist/src/telemetry/index.js +2 -2
  123. package/dist/src/telemetry/index.js.map +1 -1
  124. package/dist/src/telemetry/integration.test.circular.js +1 -0
  125. package/dist/src/telemetry/integration.test.circular.js.map +1 -1
  126. package/dist/src/telemetry/loggers.d.ts +2 -1
  127. package/dist/src/telemetry/loggers.js +24 -6
  128. package/dist/src/telemetry/loggers.js.map +1 -1
  129. package/dist/src/telemetry/loggers.test.js +37 -7
  130. package/dist/src/telemetry/loggers.test.js.map +1 -1
  131. package/dist/src/telemetry/metrics.d.ts +5 -1
  132. package/dist/src/telemetry/metrics.js +23 -9
  133. package/dist/src/telemetry/metrics.js.map +1 -1
  134. package/dist/src/telemetry/metrics.test.js +31 -1
  135. package/dist/src/telemetry/metrics.test.js.map +1 -1
  136. package/dist/src/telemetry/sdk.js +67 -39
  137. package/dist/src/telemetry/sdk.js.map +1 -1
  138. package/dist/src/telemetry/sdk.test.d.ts +6 -0
  139. package/dist/src/telemetry/sdk.test.js +82 -0
  140. package/dist/src/telemetry/sdk.test.js.map +1 -0
  141. package/dist/src/telemetry/types.d.ts +9 -1
  142. package/dist/src/telemetry/types.js +14 -0
  143. package/dist/src/telemetry/types.js.map +1 -1
  144. package/dist/src/telemetry/uiTelemetry.d.ts +4 -0
  145. package/dist/src/telemetry/uiTelemetry.js +14 -1
  146. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  147. package/dist/src/telemetry/uiTelemetry.test.js +45 -9
  148. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  149. package/dist/src/test-utils/tools.d.ts +29 -8
  150. package/dist/src/test-utils/tools.js +79 -15
  151. package/dist/src/test-utils/tools.js.map +1 -1
  152. package/dist/src/tools/edit.d.ts +1 -1
  153. package/dist/src/tools/edit.js +15 -9
  154. package/dist/src/tools/edit.js.map +1 -1
  155. package/dist/src/tools/edit.test.js +11 -1
  156. package/dist/src/tools/edit.test.js.map +1 -1
  157. package/dist/src/tools/glob.d.ts +1 -1
  158. package/dist/src/tools/glob.js +8 -8
  159. package/dist/src/tools/glob.js.map +1 -1
  160. package/dist/src/tools/glob.test.js +20 -0
  161. package/dist/src/tools/glob.test.js.map +1 -1
  162. package/dist/src/tools/grep.d.ts +1 -1
  163. package/dist/src/tools/grep.js +1 -6
  164. package/dist/src/tools/grep.js.map +1 -1
  165. package/dist/src/tools/ls.d.ts +1 -1
  166. package/dist/src/tools/ls.js +1 -6
  167. package/dist/src/tools/ls.js.map +1 -1
  168. package/dist/src/tools/mcp-client-manager.d.ts +38 -0
  169. package/dist/src/tools/mcp-client-manager.js +74 -0
  170. package/dist/src/tools/mcp-client-manager.js.map +1 -0
  171. package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
  172. package/dist/src/tools/mcp-client-manager.test.js +39 -0
  173. package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
  174. package/dist/src/tools/mcp-client.d.ts +43 -0
  175. package/dist/src/tools/mcp-client.js +157 -11
  176. package/dist/src/tools/mcp-client.js.map +1 -1
  177. package/dist/src/tools/mcp-client.test.js +59 -273
  178. package/dist/src/tools/mcp-client.test.js.map +1 -1
  179. package/dist/src/tools/mcp-tool.js +21 -3
  180. package/dist/src/tools/mcp-tool.js.map +1 -1
  181. package/dist/src/tools/mcp-tool.test.js +74 -17
  182. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  183. package/dist/src/tools/memoryTool.d.ts +1 -1
  184. package/dist/src/tools/memoryTool.js +1 -6
  185. package/dist/src/tools/memoryTool.js.map +1 -1
  186. package/dist/src/tools/read-file.d.ts +1 -1
  187. package/dist/src/tools/read-file.js +5 -7
  188. package/dist/src/tools/read-file.js.map +1 -1
  189. package/dist/src/tools/read-file.test.js +8 -0
  190. package/dist/src/tools/read-file.test.js.map +1 -1
  191. package/dist/src/tools/read-many-files.d.ts +0 -1
  192. package/dist/src/tools/read-many-files.js +16 -11
  193. package/dist/src/tools/read-many-files.js.map +1 -1
  194. package/dist/src/tools/read-many-files.test.js +34 -0
  195. package/dist/src/tools/read-many-files.test.js.map +1 -1
  196. package/dist/src/tools/shell.d.ts +1 -1
  197. package/dist/src/tools/shell.js +35 -32
  198. package/dist/src/tools/shell.js.map +1 -1
  199. package/dist/src/tools/shell.test.js +23 -19
  200. package/dist/src/tools/shell.test.js.map +1 -1
  201. package/dist/src/tools/tool-error.d.ts +1 -0
  202. package/dist/src/tools/tool-error.js +1 -0
  203. package/dist/src/tools/tool-error.js.map +1 -1
  204. package/dist/src/tools/tool-registry.d.ts +8 -3
  205. package/dist/src/tools/tool-registry.js +58 -34
  206. package/dist/src/tools/tool-registry.js.map +1 -1
  207. package/dist/src/tools/tool-registry.test.js +9 -21
  208. package/dist/src/tools/tool-registry.test.js.map +1 -1
  209. package/dist/src/tools/tools.d.ts +17 -74
  210. package/dist/src/tools/tools.js +60 -104
  211. package/dist/src/tools/tools.js.map +1 -1
  212. package/dist/src/tools/tools.test.js +91 -2
  213. package/dist/src/tools/tools.test.js.map +1 -1
  214. package/dist/src/tools/web-fetch.d.ts +1 -1
  215. package/dist/src/tools/web-fetch.js +1 -6
  216. package/dist/src/tools/web-fetch.js.map +1 -1
  217. package/dist/src/tools/web-search.d.ts +4 -5
  218. package/dist/src/tools/web-search.js +47 -51
  219. package/dist/src/tools/web-search.js.map +1 -1
  220. package/dist/src/tools/web-search.test.d.ts +6 -0
  221. package/dist/src/tools/web-search.test.js +139 -0
  222. package/dist/src/tools/web-search.test.js.map +1 -0
  223. package/dist/src/tools/write-file.d.ts +15 -11
  224. package/dist/src/tools/write-file.js +133 -145
  225. package/dist/src/tools/write-file.js.map +1 -1
  226. package/dist/src/tools/write-file.test.js +82 -126
  227. package/dist/src/tools/write-file.test.js.map +1 -1
  228. package/dist/src/utils/browser.js +4 -3
  229. package/dist/src/utils/browser.js.map +1 -1
  230. package/dist/src/utils/editCorrector.js +13 -13
  231. package/dist/src/utils/editCorrector.js.map +1 -1
  232. package/dist/src/utils/editor.js +1 -1
  233. package/dist/src/utils/editor.js.map +1 -1
  234. package/dist/src/utils/editor.test.js +10 -10
  235. package/dist/src/utils/editor.test.js.map +1 -1
  236. package/dist/src/utils/environmentContext.js +2 -2
  237. package/dist/src/utils/environmentContext.js.map +1 -1
  238. package/dist/src/utils/environmentContext.test.js +3 -2
  239. package/dist/src/utils/environmentContext.test.js.map +1 -1
  240. package/dist/src/utils/fileUtils.d.ts +2 -1
  241. package/dist/src/utils/fileUtils.js +3 -3
  242. package/dist/src/utils/fileUtils.js.map +1 -1
  243. package/dist/src/utils/fileUtils.test.js +18 -17
  244. package/dist/src/utils/fileUtils.test.js.map +1 -1
  245. package/dist/src/utils/filesearch/crawler.d.ts +15 -0
  246. package/dist/src/utils/filesearch/crawler.js +50 -0
  247. package/dist/src/utils/filesearch/crawler.js.map +1 -0
  248. package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  249. package/dist/src/utils/filesearch/crawler.test.js +468 -0
  250. package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
  251. package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
  252. package/dist/src/utils/filesearch/fileSearch.js +62 -117
  253. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  254. package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
  255. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  256. package/dist/src/utils/filesearch/ignore.d.ts +7 -0
  257. package/dist/src/utils/filesearch/ignore.js +25 -0
  258. package/dist/src/utils/filesearch/ignore.js.map +1 -1
  259. package/dist/src/utils/filesearch/ignore.test.js +89 -2
  260. package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
  261. package/dist/src/utils/getPty.d.ts +19 -0
  262. package/dist/src/utils/getPty.js +23 -0
  263. package/dist/src/utils/getPty.js.map +1 -0
  264. package/dist/src/utils/memoryDiscovery.js +3 -3
  265. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  266. package/dist/src/utils/memoryDiscovery.test.js +3 -2
  267. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  268. package/dist/src/utils/memoryImportProcessor.js +2 -6
  269. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  270. package/dist/src/utils/paths.d.ts +7 -0
  271. package/dist/src/utils/paths.js +15 -0
  272. package/dist/src/utils/paths.js.map +1 -1
  273. package/dist/src/utils/paths.test.js +74 -2
  274. package/dist/src/utils/paths.test.js.map +1 -1
  275. package/dist/src/utils/secure-browser-launcher.js +4 -3
  276. package/dist/src/utils/secure-browser-launcher.js.map +1 -1
  277. package/dist/src/utils/shell-utils.d.ts +39 -0
  278. package/dist/src/utils/shell-utils.js +72 -2
  279. package/dist/src/utils/shell-utils.js.map +1 -1
  280. package/dist/src/utils/shell-utils.test.js +132 -4
  281. package/dist/src/utils/shell-utils.test.js.map +1 -1
  282. package/dist/src/utils/systemEncoding.js +1 -1
  283. package/dist/src/utils/systemEncoding.js.map +1 -1
  284. package/dist/src/utils/systemEncoding.test.js +23 -23
  285. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  286. package/dist/src/utils/user_account.js +58 -48
  287. package/dist/src/utils/user_account.js.map +1 -1
  288. package/dist/src/utils/user_account.test.js +76 -9
  289. package/dist/src/utils/user_account.test.js.map +1 -1
  290. package/dist/src/utils/workspaceContext.d.ts +22 -7
  291. package/dist/src/utils/workspaceContext.js +81 -55
  292. package/dist/src/utils/workspaceContext.js.map +1 -1
  293. package/dist/src/utils/workspaceContext.test.js +221 -137
  294. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  295. package/dist/tsconfig.tsbuildinfo +1 -1
  296. package/package.json +20 -7
@@ -0,0 +1,468 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import * as cache from './crawlCache.js';
10
+ import { crawl } from './crawler.js';
11
+ import { createTmpDir, cleanupTmpDir } from '@google/gemini-cli-test-utils';
12
+ import { loadIgnoreRules } from './ignore.js';
13
+ describe('crawler', () => {
14
+ let tmpDir;
15
+ afterEach(async () => {
16
+ if (tmpDir) {
17
+ await cleanupTmpDir(tmpDir);
18
+ }
19
+ vi.restoreAllMocks();
20
+ });
21
+ it('should use .geminiignore rules', async () => {
22
+ tmpDir = await createTmpDir({
23
+ '.geminiignore': 'dist/',
24
+ dist: ['ignored.js'],
25
+ src: ['not-ignored.js'],
26
+ });
27
+ const ignore = loadIgnoreRules({
28
+ projectRoot: tmpDir,
29
+ useGitignore: false,
30
+ useGeminiignore: true,
31
+ ignoreDirs: [],
32
+ });
33
+ const results = await crawl({
34
+ crawlDirectory: tmpDir,
35
+ cwd: tmpDir,
36
+ ignore,
37
+ cache: false,
38
+ cacheTtl: 0,
39
+ });
40
+ expect(results).toEqual(expect.arrayContaining([
41
+ '.',
42
+ 'src/',
43
+ '.geminiignore',
44
+ 'src/not-ignored.js',
45
+ ]));
46
+ });
47
+ it('should combine .gitignore and .geminiignore rules', async () => {
48
+ tmpDir = await createTmpDir({
49
+ '.gitignore': 'dist/',
50
+ '.geminiignore': 'build/',
51
+ dist: ['ignored-by-git.js'],
52
+ build: ['ignored-by-gemini.js'],
53
+ src: ['not-ignored.js'],
54
+ });
55
+ const ignore = loadIgnoreRules({
56
+ projectRoot: tmpDir,
57
+ useGitignore: true,
58
+ useGeminiignore: true,
59
+ ignoreDirs: [],
60
+ });
61
+ const results = await crawl({
62
+ crawlDirectory: tmpDir,
63
+ cwd: tmpDir,
64
+ ignore,
65
+ cache: false,
66
+ cacheTtl: 0,
67
+ });
68
+ expect(results).toEqual(expect.arrayContaining([
69
+ '.',
70
+ 'src/',
71
+ '.geminiignore',
72
+ '.gitignore',
73
+ 'src/not-ignored.js',
74
+ ]));
75
+ });
76
+ it('should use ignoreDirs option', async () => {
77
+ tmpDir = await createTmpDir({
78
+ logs: ['some.log'],
79
+ src: ['main.js'],
80
+ });
81
+ const ignore = loadIgnoreRules({
82
+ projectRoot: tmpDir,
83
+ useGitignore: false,
84
+ useGeminiignore: false,
85
+ ignoreDirs: ['logs'],
86
+ });
87
+ const results = await crawl({
88
+ crawlDirectory: tmpDir,
89
+ cwd: tmpDir,
90
+ ignore,
91
+ cache: false,
92
+ cacheTtl: 0,
93
+ });
94
+ expect(results).toEqual(expect.arrayContaining(['.', 'src/', 'src/main.js']));
95
+ });
96
+ it('should handle negated directories', async () => {
97
+ tmpDir = await createTmpDir({
98
+ '.gitignore': ['build/**', '!build/public', '!build/public/**'].join('\n'),
99
+ build: {
100
+ 'private.js': '',
101
+ public: ['index.html'],
102
+ },
103
+ src: ['main.js'],
104
+ });
105
+ const ignore = loadIgnoreRules({
106
+ projectRoot: tmpDir,
107
+ useGitignore: true,
108
+ useGeminiignore: false,
109
+ ignoreDirs: [],
110
+ });
111
+ const results = await crawl({
112
+ crawlDirectory: tmpDir,
113
+ cwd: tmpDir,
114
+ ignore,
115
+ cache: false,
116
+ cacheTtl: 0,
117
+ });
118
+ expect(results).toEqual(expect.arrayContaining([
119
+ '.',
120
+ 'build/',
121
+ 'build/public/',
122
+ 'src/',
123
+ '.gitignore',
124
+ 'build/public/index.html',
125
+ 'src/main.js',
126
+ ]));
127
+ });
128
+ it('should handle root-level file negation', async () => {
129
+ tmpDir = await createTmpDir({
130
+ '.gitignore': ['*.mk', '!Foo.mk'].join('\n'),
131
+ 'bar.mk': '',
132
+ 'Foo.mk': '',
133
+ });
134
+ const ignore = loadIgnoreRules({
135
+ projectRoot: tmpDir,
136
+ useGitignore: true,
137
+ useGeminiignore: false,
138
+ ignoreDirs: [],
139
+ });
140
+ const results = await crawl({
141
+ crawlDirectory: tmpDir,
142
+ cwd: tmpDir,
143
+ ignore,
144
+ cache: false,
145
+ cacheTtl: 0,
146
+ });
147
+ expect(results).toEqual(expect.arrayContaining(['.', '.gitignore', 'Foo.mk', 'bar.mk']));
148
+ });
149
+ it('should handle directory negation with glob', async () => {
150
+ tmpDir = await createTmpDir({
151
+ '.gitignore': [
152
+ 'third_party/**',
153
+ '!third_party/foo',
154
+ '!third_party/foo/bar',
155
+ '!third_party/foo/bar/baz_buffer',
156
+ ].join('\n'),
157
+ third_party: {
158
+ foo: {
159
+ bar: {
160
+ baz_buffer: '',
161
+ },
162
+ },
163
+ ignore_this: '',
164
+ },
165
+ });
166
+ const ignore = loadIgnoreRules({
167
+ projectRoot: tmpDir,
168
+ useGitignore: true,
169
+ useGeminiignore: false,
170
+ ignoreDirs: [],
171
+ });
172
+ const results = await crawl({
173
+ crawlDirectory: tmpDir,
174
+ cwd: tmpDir,
175
+ ignore,
176
+ cache: false,
177
+ cacheTtl: 0,
178
+ });
179
+ expect(results).toEqual(expect.arrayContaining([
180
+ '.',
181
+ 'third_party/',
182
+ 'third_party/foo/',
183
+ 'third_party/foo/bar/',
184
+ '.gitignore',
185
+ 'third_party/foo/bar/baz_buffer',
186
+ ]));
187
+ });
188
+ it('should correctly handle negated patterns in .gitignore', async () => {
189
+ tmpDir = await createTmpDir({
190
+ '.gitignore': ['dist/**', '!dist/keep.js'].join('\n'),
191
+ dist: ['ignore.js', 'keep.js'],
192
+ src: ['main.js'],
193
+ });
194
+ const ignore = loadIgnoreRules({
195
+ projectRoot: tmpDir,
196
+ useGitignore: true,
197
+ useGeminiignore: false,
198
+ ignoreDirs: [],
199
+ });
200
+ const results = await crawl({
201
+ crawlDirectory: tmpDir,
202
+ cwd: tmpDir,
203
+ ignore,
204
+ cache: false,
205
+ cacheTtl: 0,
206
+ });
207
+ expect(results).toEqual(expect.arrayContaining([
208
+ '.',
209
+ 'dist/',
210
+ 'src/',
211
+ '.gitignore',
212
+ 'dist/keep.js',
213
+ 'src/main.js',
214
+ ]));
215
+ });
216
+ it('should initialize correctly when ignore files are missing', async () => {
217
+ tmpDir = await createTmpDir({
218
+ src: ['file1.js'],
219
+ });
220
+ const ignore = loadIgnoreRules({
221
+ projectRoot: tmpDir,
222
+ useGitignore: true,
223
+ useGeminiignore: true,
224
+ ignoreDirs: [],
225
+ });
226
+ const results = await crawl({
227
+ crawlDirectory: tmpDir,
228
+ cwd: tmpDir,
229
+ ignore,
230
+ cache: false,
231
+ cacheTtl: 0,
232
+ });
233
+ expect(results).toEqual(expect.arrayContaining(['.', 'src/', 'src/file1.js']));
234
+ });
235
+ it('should handle empty or commented-only ignore files', async () => {
236
+ tmpDir = await createTmpDir({
237
+ '.gitignore': '# This is a comment\n\n \n',
238
+ src: ['main.js'],
239
+ });
240
+ const ignore = loadIgnoreRules({
241
+ projectRoot: tmpDir,
242
+ useGitignore: true,
243
+ useGeminiignore: false,
244
+ ignoreDirs: [],
245
+ });
246
+ const results = await crawl({
247
+ crawlDirectory: tmpDir,
248
+ cwd: tmpDir,
249
+ ignore,
250
+ cache: false,
251
+ cacheTtl: 0,
252
+ });
253
+ expect(results).toEqual(expect.arrayContaining(['.', 'src/', '.gitignore', 'src/main.js']));
254
+ });
255
+ it('should always ignore the .git directory', async () => {
256
+ tmpDir = await createTmpDir({
257
+ '.git': ['config', 'HEAD'],
258
+ src: ['main.js'],
259
+ });
260
+ const ignore = loadIgnoreRules({
261
+ projectRoot: tmpDir,
262
+ useGitignore: false,
263
+ useGeminiignore: false,
264
+ ignoreDirs: [],
265
+ });
266
+ const results = await crawl({
267
+ crawlDirectory: tmpDir,
268
+ cwd: tmpDir,
269
+ ignore,
270
+ cache: false,
271
+ cacheTtl: 0,
272
+ });
273
+ expect(results).toEqual(expect.arrayContaining(['.', 'src/', 'src/main.js']));
274
+ });
275
+ describe('with in-memory cache', () => {
276
+ beforeEach(() => {
277
+ cache.clear();
278
+ vi.useFakeTimers();
279
+ });
280
+ afterEach(() => {
281
+ vi.useRealTimers();
282
+ });
283
+ it('should hit the cache for subsequent crawls', async () => {
284
+ tmpDir = await createTmpDir({ 'file1.js': '' });
285
+ const ignore = loadIgnoreRules({
286
+ projectRoot: tmpDir,
287
+ useGitignore: false,
288
+ useGeminiignore: false,
289
+ ignoreDirs: [],
290
+ });
291
+ const options = {
292
+ crawlDirectory: tmpDir,
293
+ cwd: tmpDir,
294
+ ignore,
295
+ cache: true,
296
+ cacheTtl: 10,
297
+ };
298
+ const crawlSpy = vi.spyOn(cache, 'read');
299
+ await crawl(options);
300
+ expect(crawlSpy).toHaveBeenCalledTimes(1);
301
+ await crawl(options);
302
+ expect(crawlSpy).toHaveBeenCalledTimes(2);
303
+ // fdir should not have been called a second time.
304
+ // We can't spy on it directly, but we can check the cache was hit.
305
+ const cacheKey = cache.getCacheKey(options.crawlDirectory, options.ignore.getFingerprint(), undefined);
306
+ expect(cache.read(cacheKey)).toBeDefined();
307
+ });
308
+ it('should miss the cache when ignore rules change', async () => {
309
+ tmpDir = await createTmpDir({
310
+ '.gitignore': 'a.txt',
311
+ 'a.txt': '',
312
+ 'b.txt': '',
313
+ });
314
+ const getIgnore = () => loadIgnoreRules({
315
+ projectRoot: tmpDir,
316
+ useGitignore: true,
317
+ useGeminiignore: false,
318
+ ignoreDirs: [],
319
+ });
320
+ const getOptions = (ignore) => ({
321
+ crawlDirectory: tmpDir,
322
+ cwd: tmpDir,
323
+ ignore,
324
+ cache: true,
325
+ cacheTtl: 10000,
326
+ });
327
+ // Initial crawl to populate the cache
328
+ const ignore1 = getIgnore();
329
+ const results1 = await crawl(getOptions(ignore1));
330
+ expect(results1).toEqual(expect.arrayContaining(['.', '.gitignore', 'b.txt']));
331
+ // Modify the ignore file
332
+ await fs.writeFile(path.join(tmpDir, '.gitignore'), 'b.txt');
333
+ // Second crawl should miss the cache and trigger a recrawl
334
+ const ignore2 = getIgnore();
335
+ const results2 = await crawl(getOptions(ignore2));
336
+ expect(results2).toEqual(expect.arrayContaining(['.', '.gitignore', 'a.txt']));
337
+ });
338
+ it('should miss the cache after TTL expires', async () => {
339
+ tmpDir = await createTmpDir({ 'file1.js': '' });
340
+ const ignore = loadIgnoreRules({
341
+ projectRoot: tmpDir,
342
+ useGitignore: false,
343
+ useGeminiignore: false,
344
+ ignoreDirs: [],
345
+ });
346
+ const options = {
347
+ crawlDirectory: tmpDir,
348
+ cwd: tmpDir,
349
+ ignore,
350
+ cache: true,
351
+ cacheTtl: 10, // 10 seconds
352
+ };
353
+ const readSpy = vi.spyOn(cache, 'read');
354
+ const writeSpy = vi.spyOn(cache, 'write');
355
+ await crawl(options);
356
+ expect(readSpy).toHaveBeenCalledTimes(1);
357
+ expect(writeSpy).toHaveBeenCalledTimes(1);
358
+ // Advance time past the TTL
359
+ await vi.advanceTimersByTimeAsync(11000);
360
+ await crawl(options);
361
+ expect(readSpy).toHaveBeenCalledTimes(2);
362
+ expect(writeSpy).toHaveBeenCalledTimes(2);
363
+ });
364
+ it('should miss the cache when maxDepth changes', async () => {
365
+ tmpDir = await createTmpDir({ 'file1.js': '' });
366
+ const ignore = loadIgnoreRules({
367
+ projectRoot: tmpDir,
368
+ useGitignore: false,
369
+ useGeminiignore: false,
370
+ ignoreDirs: [],
371
+ });
372
+ const getOptions = (maxDepth) => ({
373
+ crawlDirectory: tmpDir,
374
+ cwd: tmpDir,
375
+ ignore,
376
+ cache: true,
377
+ cacheTtl: 10000,
378
+ maxDepth,
379
+ });
380
+ const readSpy = vi.spyOn(cache, 'read');
381
+ const writeSpy = vi.spyOn(cache, 'write');
382
+ // 1. First crawl with maxDepth: 1
383
+ await crawl(getOptions(1));
384
+ expect(readSpy).toHaveBeenCalledTimes(1);
385
+ expect(writeSpy).toHaveBeenCalledTimes(1);
386
+ // 2. Second crawl with maxDepth: 2, should be a cache miss
387
+ await crawl(getOptions(2));
388
+ expect(readSpy).toHaveBeenCalledTimes(2);
389
+ expect(writeSpy).toHaveBeenCalledTimes(2);
390
+ // 3. Third crawl with maxDepth: 1 again, should be a cache hit.
391
+ await crawl(getOptions(1));
392
+ expect(readSpy).toHaveBeenCalledTimes(3);
393
+ expect(writeSpy).toHaveBeenCalledTimes(2); // No new write
394
+ });
395
+ });
396
+ describe('with maxDepth', () => {
397
+ beforeEach(async () => {
398
+ tmpDir = await createTmpDir({
399
+ 'file-root.txt': '',
400
+ level1: {
401
+ 'file-level1.txt': '',
402
+ level2: {
403
+ 'file-level2.txt': '',
404
+ level3: {
405
+ 'file-level3.txt': '',
406
+ },
407
+ },
408
+ },
409
+ });
410
+ });
411
+ const getCrawlResults = (maxDepth) => {
412
+ const ignore = loadIgnoreRules({
413
+ projectRoot: tmpDir,
414
+ useGitignore: false,
415
+ useGeminiignore: false,
416
+ ignoreDirs: [],
417
+ });
418
+ return crawl({
419
+ crawlDirectory: tmpDir,
420
+ cwd: tmpDir,
421
+ ignore,
422
+ cache: false,
423
+ cacheTtl: 0,
424
+ maxDepth,
425
+ });
426
+ };
427
+ it('should only crawl top-level files when maxDepth is 0', async () => {
428
+ const results = await getCrawlResults(0);
429
+ expect(results).toEqual(expect.arrayContaining(['.', 'level1/', 'file-root.txt']));
430
+ });
431
+ it('should crawl one level deep when maxDepth is 1', async () => {
432
+ const results = await getCrawlResults(1);
433
+ expect(results).toEqual(expect.arrayContaining([
434
+ '.',
435
+ 'level1/',
436
+ 'level1/level2/',
437
+ 'file-root.txt',
438
+ 'level1/file-level1.txt',
439
+ ]));
440
+ });
441
+ it('should crawl two levels deep when maxDepth is 2', async () => {
442
+ const results = await getCrawlResults(2);
443
+ expect(results).toEqual(expect.arrayContaining([
444
+ '.',
445
+ 'level1/',
446
+ 'level1/level2/',
447
+ 'level1/level2/level3/',
448
+ 'file-root.txt',
449
+ 'level1/file-level1.txt',
450
+ 'level1/level2/file-level2.txt',
451
+ ]));
452
+ });
453
+ it('should perform a full recursive crawl when maxDepth is undefined', async () => {
454
+ const results = await getCrawlResults(undefined);
455
+ expect(results).toEqual(expect.arrayContaining([
456
+ '.',
457
+ 'level1/',
458
+ 'level1/level2/',
459
+ 'level1/level2/level3/',
460
+ 'file-root.txt',
461
+ 'level1/file-level1.txt',
462
+ 'level1/level2/file-level2.txt',
463
+ 'level1/level2/level3/file-level3.txt',
464
+ ]));
465
+ });
466
+ });
467
+ });
468
+ //# sourceMappingURL=crawler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawler.test.js","sourceRoot":"","sources":["../../../../src/utils/filesearch/crawler.test.ts"],"names":[],"mappings":"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"}
@@ -3,15 +3,16 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export type FileSearchOptions = {
6
+ export interface FileSearchOptions {
7
7
  projectRoot: string;
8
8
  ignoreDirs: string[];
9
9
  useGitignore: boolean;
10
10
  useGeminiignore: boolean;
11
11
  cache: boolean;
12
12
  cacheTtl: number;
13
+ enableRecursiveFileSearch: boolean;
13
14
  maxDepth?: number;
14
- };
15
+ }
15
16
  export declare class AbortError extends Error {
16
17
  constructor(message?: string);
17
18
  }
@@ -23,59 +24,14 @@ export declare class AbortError extends Error {
23
24
  * @returns A promise that resolves to the filtered and sorted list of paths.
24
25
  */
25
26
  export declare function filter(allPaths: string[], pattern: string, signal: AbortSignal | undefined): Promise<string[]>;
26
- export type SearchOptions = {
27
+ export interface SearchOptions {
27
28
  signal?: AbortSignal;
28
29
  maxResults?: number;
29
- };
30
- /**
31
- * Provides a fast and efficient way to search for files within a project,
32
- * respecting .gitignore and .geminiignore rules, and utilizing caching
33
- * for improved performance.
34
- */
35
- export declare class FileSearch {
36
- private readonly options;
37
- private readonly absoluteDir;
38
- private readonly ignore;
39
- private resultCache;
40
- private allFiles;
41
- private fzf;
42
- /**
43
- * Constructs a new `FileSearch` instance.
44
- * @param options Configuration options for the file search.
45
- */
46
- constructor(options: FileSearchOptions);
47
- /**
48
- * Initializes the file search engine by loading ignore rules, crawling the
49
- * file system, and building the in-memory cache. This method must be called
50
- * before performing any searches.
51
- */
30
+ }
31
+ export interface FileSearch {
52
32
  initialize(): Promise<void>;
53
- /**
54
- * Searches for files matching a given pattern.
55
- * @param pattern The picomatch pattern to search for (e.g., '*.js', 'src/**').
56
- * @param options Search options, including an AbortSignal and maxResults.
57
- * @returns A promise that resolves to a list of matching file paths, relative
58
- * to the project root.
59
- */
60
33
  search(pattern: string, options?: SearchOptions): Promise<string[]>;
61
- /**
62
- * Loads ignore rules from .gitignore and .geminiignore files, and applies
63
- * any additional ignore directories specified in the options.
64
- */
65
- private loadIgnoreRules;
66
- /**
67
- * Crawls the file system to get a list of all files and directories,
68
- * optionally using a cache for faster initialization.
69
- */
70
- private crawlFiles;
71
- /**
72
- * Performs the actual file system crawl using `fdir`, applying directory
73
- * ignore rules.
74
- * @returns A promise that resolves to a list of all files and directories.
75
- */
76
- private performCrawl;
77
- /**
78
- * Builds the in-memory cache for fast pattern matching.
79
- */
80
- private buildResultCache;
34
+ }
35
+ export declare class FileSearchFactory {
36
+ static create(options: FileSearchOptions): FileSearch;
81
37
  }