@google/gemini-cli-core 0.1.0-development.1

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 (365) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +156 -0
  3. package/dist/.last_build +0 -0
  4. package/dist/index.d.ts +7 -0
  5. package/dist/index.js +8 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/__mocks__/fs/promises.d.ts +11 -0
  8. package/dist/src/__mocks__/fs/promises.js +17 -0
  9. package/dist/src/__mocks__/fs/promises.js.map +1 -0
  10. package/dist/src/code_assist/codeAssist.d.ts +8 -0
  11. package/dist/src/code_assist/codeAssist.js +19 -0
  12. package/dist/src/code_assist/codeAssist.js.map +1 -0
  13. package/dist/src/code_assist/converter.d.ts +68 -0
  14. package/dist/src/code_assist/converter.js +125 -0
  15. package/dist/src/code_assist/converter.js.map +1 -0
  16. package/dist/src/code_assist/converter.test.d.ts +6 -0
  17. package/dist/src/code_assist/converter.test.js +229 -0
  18. package/dist/src/code_assist/converter.test.js.map +1 -0
  19. package/dist/src/code_assist/oauth2.d.ts +26 -0
  20. package/dist/src/code_assist/oauth2.js +277 -0
  21. package/dist/src/code_assist/oauth2.js.map +1 -0
  22. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  23. package/dist/src/code_assist/oauth2.test.js +195 -0
  24. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  25. package/dist/src/code_assist/server.d.ts +35 -0
  26. package/dist/src/code_assist/server.js +123 -0
  27. package/dist/src/code_assist/server.js.map +1 -0
  28. package/dist/src/code_assist/server.test.d.ts +6 -0
  29. package/dist/src/code_assist/server.test.js +123 -0
  30. package/dist/src/code_assist/server.test.js.map +1 -0
  31. package/dist/src/code_assist/setup.d.ts +15 -0
  32. package/dist/src/code_assist/setup.js +67 -0
  33. package/dist/src/code_assist/setup.js.map +1 -0
  34. package/dist/src/code_assist/types.d.ts +148 -0
  35. package/dist/src/code_assist/types.js +46 -0
  36. package/dist/src/code_assist/types.js.map +1 -0
  37. package/dist/src/config/config.d.ts +175 -0
  38. package/dist/src/config/config.js +385 -0
  39. package/dist/src/config/config.js.map +1 -0
  40. package/dist/src/config/config.test.d.ts +6 -0
  41. package/dist/src/config/config.test.js +263 -0
  42. package/dist/src/config/config.test.js.map +1 -0
  43. package/dist/src/config/flashFallback.test.d.ts +6 -0
  44. package/dist/src/config/flashFallback.test.js +115 -0
  45. package/dist/src/config/flashFallback.test.js.map +1 -0
  46. package/dist/src/config/models.d.ts +8 -0
  47. package/dist/src/config/models.js +9 -0
  48. package/dist/src/config/models.js.map +1 -0
  49. package/dist/src/core/client.d.ts +39 -0
  50. package/dist/src/core/client.js +386 -0
  51. package/dist/src/core/client.js.map +1 -0
  52. package/dist/src/core/client.test.d.ts +6 -0
  53. package/dist/src/core/client.test.js +630 -0
  54. package/dist/src/core/client.test.js.map +1 -0
  55. package/dist/src/core/contentGenerator.d.ts +29 -0
  56. package/dist/src/core/contentGenerator.js +71 -0
  57. package/dist/src/core/contentGenerator.js.map +1 -0
  58. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  59. package/dist/src/core/contentGenerator.test.js +45 -0
  60. package/dist/src/core/contentGenerator.test.js.map +1 -0
  61. package/dist/src/core/coreToolScheduler.d.ts +104 -0
  62. package/dist/src/core/coreToolScheduler.js +397 -0
  63. package/dist/src/core/coreToolScheduler.js.map +1 -0
  64. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  65. package/dist/src/core/coreToolScheduler.test.js +318 -0
  66. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  67. package/dist/src/core/geminiChat.d.ts +116 -0
  68. package/dist/src/core/geminiChat.js +491 -0
  69. package/dist/src/core/geminiChat.js.map +1 -0
  70. package/dist/src/core/geminiChat.test.d.ts +6 -0
  71. package/dist/src/core/geminiChat.test.js +422 -0
  72. package/dist/src/core/geminiChat.test.js.map +1 -0
  73. package/dist/src/core/geminiRequest.d.ts +13 -0
  74. package/dist/src/core/geminiRequest.js +45 -0
  75. package/dist/src/core/geminiRequest.js.map +1 -0
  76. package/dist/src/core/geminiRequest.test.d.ts +6 -0
  77. package/dist/src/core/geminiRequest.test.js +72 -0
  78. package/dist/src/core/geminiRequest.test.js.map +1 -0
  79. package/dist/src/core/logger.d.ts +35 -0
  80. package/dist/src/core/logger.js +235 -0
  81. package/dist/src/core/logger.js.map +1 -0
  82. package/dist/src/core/logger.test.d.ts +6 -0
  83. package/dist/src/core/logger.test.js +387 -0
  84. package/dist/src/core/logger.test.js.map +1 -0
  85. package/dist/src/core/modelCheck.d.ts +14 -0
  86. package/dist/src/core/modelCheck.js +55 -0
  87. package/dist/src/core/modelCheck.js.map +1 -0
  88. package/dist/src/core/nonInteractiveToolExecutor.d.ts +12 -0
  89. package/dist/src/core/nonInteractiveToolExecutor.js +92 -0
  90. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  91. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  92. package/dist/src/core/nonInteractiveToolExecutor.test.js +181 -0
  93. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  94. package/dist/src/core/prompts.d.ts +12 -0
  95. package/dist/src/core/prompts.js +334 -0
  96. package/dist/src/core/prompts.js.map +1 -0
  97. package/dist/src/core/prompts.test.d.ts +6 -0
  98. package/dist/src/core/prompts.test.js +97 -0
  99. package/dist/src/core/prompts.test.js.map +1 -0
  100. package/dist/src/core/tokenLimits.d.ts +10 -0
  101. package/dist/src/core/tokenLimits.js +27 -0
  102. package/dist/src/core/tokenLimits.js.map +1 -0
  103. package/dist/src/core/turn.d.ts +96 -0
  104. package/dist/src/core/turn.js +125 -0
  105. package/dist/src/core/turn.js.map +1 -0
  106. package/dist/src/core/turn.test.d.ts +6 -0
  107. package/dist/src/core/turn.test.js +236 -0
  108. package/dist/src/core/turn.test.js.map +1 -0
  109. package/dist/src/index.d.ts +46 -0
  110. package/dist/src/index.js +54 -0
  111. package/dist/src/index.js.map +1 -0
  112. package/dist/src/index.test.d.ts +6 -0
  113. package/dist/src/index.test.js +12 -0
  114. package/dist/src/index.test.js.map +1 -0
  115. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  116. package/dist/src/services/fileDiscoveryService.js +91 -0
  117. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  118. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  119. package/dist/src/services/fileDiscoveryService.test.js +102 -0
  120. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  121. package/dist/src/services/gitService.d.ts +21 -0
  122. package/dist/src/services/gitService.js +105 -0
  123. package/dist/src/services/gitService.js.map +1 -0
  124. package/dist/src/services/gitService.test.d.ts +6 -0
  125. package/dist/src/services/gitService.test.js +233 -0
  126. package/dist/src/services/gitService.test.js.map +1 -0
  127. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +33 -0
  128. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +364 -0
  129. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  130. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +43 -0
  131. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +109 -0
  132. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  133. package/dist/src/telemetry/constants.d.ts +19 -0
  134. package/dist/src/telemetry/constants.js +20 -0
  135. package/dist/src/telemetry/constants.js.map +1 -0
  136. package/dist/src/telemetry/index.d.ts +18 -0
  137. package/dist/src/telemetry/index.js +20 -0
  138. package/dist/src/telemetry/index.js.map +1 -0
  139. package/dist/src/telemetry/loggers.d.ts +13 -0
  140. package/dist/src/telemetry/loggers.js +187 -0
  141. package/dist/src/telemetry/loggers.js.map +1 -0
  142. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  143. package/dist/src/telemetry/loggers.test.js +525 -0
  144. package/dist/src/telemetry/loggers.test.js.map +1 -0
  145. package/dist/src/telemetry/metrics.d.ts +19 -0
  146. package/dist/src/telemetry/metrics.js +144 -0
  147. package/dist/src/telemetry/metrics.js.map +1 -0
  148. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  149. package/dist/src/telemetry/metrics.test.js +162 -0
  150. package/dist/src/telemetry/metrics.test.js.map +1 -0
  151. package/dist/src/telemetry/sdk.d.ts +9 -0
  152. package/dist/src/telemetry/sdk.js +116 -0
  153. package/dist/src/telemetry/sdk.js.map +1 -0
  154. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  155. package/dist/src/telemetry/telemetry.test.js +50 -0
  156. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  157. package/dist/src/telemetry/types.d.ts +91 -0
  158. package/dist/src/telemetry/types.js +176 -0
  159. package/dist/src/telemetry/types.js.map +1 -0
  160. package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
  161. package/dist/src/telemetry/uiTelemetry.js +131 -0
  162. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  163. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  164. package/dist/src/telemetry/uiTelemetry.test.js +411 -0
  165. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  166. package/dist/src/tools/diffOptions.d.ts +7 -0
  167. package/dist/src/tools/diffOptions.js +10 -0
  168. package/dist/src/tools/diffOptions.js.map +1 -0
  169. package/dist/src/tools/edit.d.ts +84 -0
  170. package/dist/src/tools/edit.js +359 -0
  171. package/dist/src/tools/edit.js.map +1 -0
  172. package/dist/src/tools/edit.test.d.ts +6 -0
  173. package/dist/src/tools/edit.test.js +500 -0
  174. package/dist/src/tools/edit.test.js.map +1 -0
  175. package/dist/src/tools/glob.d.ts +71 -0
  176. package/dist/src/tools/glob.js +215 -0
  177. package/dist/src/tools/glob.js.map +1 -0
  178. package/dist/src/tools/glob.test.d.ts +6 -0
  179. package/dist/src/tools/glob.test.js +293 -0
  180. package/dist/src/tools/glob.test.js.map +1 -0
  181. package/dist/src/tools/grep.d.ts +81 -0
  182. package/dist/src/tools/grep.js +427 -0
  183. package/dist/src/tools/grep.js.map +1 -0
  184. package/dist/src/tools/grep.test.d.ts +6 -0
  185. package/dist/src/tools/grep.test.js +185 -0
  186. package/dist/src/tools/grep.test.js.map +1 -0
  187. package/dist/src/tools/ls.d.ts +94 -0
  188. package/dist/src/tools/ls.js +215 -0
  189. package/dist/src/tools/ls.js.map +1 -0
  190. package/dist/src/tools/mcp-client.d.ts +56 -0
  191. package/dist/src/tools/mcp-client.js +302 -0
  192. package/dist/src/tools/mcp-client.js.map +1 -0
  193. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  194. package/dist/src/tools/mcp-client.test.js +608 -0
  195. package/dist/src/tools/mcp-client.test.js.map +1 -0
  196. package/dist/src/tools/mcp-tool.d.ts +23 -0
  197. package/dist/src/tools/mcp-tool.js +119 -0
  198. package/dist/src/tools/mcp-tool.js.map +1 -0
  199. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  200. package/dist/src/tools/mcp-tool.test.js +173 -0
  201. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  202. package/dist/src/tools/memoryTool.d.ts +28 -0
  203. package/dist/src/tools/memoryTool.js +171 -0
  204. package/dist/src/tools/memoryTool.js.map +1 -0
  205. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  206. package/dist/src/tools/memoryTool.test.js +181 -0
  207. package/dist/src/tools/memoryTool.test.js.map +1 -0
  208. package/dist/src/tools/modifiable-tool.d.ts +29 -0
  209. package/dist/src/tools/modifiable-tool.js +85 -0
  210. package/dist/src/tools/modifiable-tool.js.map +1 -0
  211. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  212. package/dist/src/tools/modifiable-tool.test.js +204 -0
  213. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  214. package/dist/src/tools/read-file.d.ts +36 -0
  215. package/dist/src/tools/read-file.js +103 -0
  216. package/dist/src/tools/read-file.js.map +1 -0
  217. package/dist/src/tools/read-file.test.d.ts +6 -0
  218. package/dist/src/tools/read-file.test.js +180 -0
  219. package/dist/src/tools/read-file.test.js.map +1 -0
  220. package/dist/src/tools/read-many-files.d.ts +65 -0
  221. package/dist/src/tools/read-many-files.js +344 -0
  222. package/dist/src/tools/read-many-files.js.map +1 -0
  223. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  224. package/dist/src/tools/read-many-files.test.js +300 -0
  225. package/dist/src/tools/read-many-files.test.js.map +1 -0
  226. package/dist/src/tools/shell.d.ts +43 -0
  227. package/dist/src/tools/shell.js +421 -0
  228. package/dist/src/tools/shell.js.map +1 -0
  229. package/dist/src/tools/shell.test.d.ts +6 -0
  230. package/dist/src/tools/shell.test.js +321 -0
  231. package/dist/src/tools/shell.test.js.map +1 -0
  232. package/dist/src/tools/tool-registry.d.ts +67 -0
  233. package/dist/src/tools/tool-registry.js +326 -0
  234. package/dist/src/tools/tool-registry.js.map +1 -0
  235. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  236. package/dist/src/tools/tool-registry.test.js +353 -0
  237. package/dist/src/tools/tool-registry.test.js.map +1 -0
  238. package/dist/src/tools/tools.d.ts +179 -0
  239. package/dist/src/tools/tools.js +88 -0
  240. package/dist/src/tools/tools.js.map +1 -0
  241. package/dist/src/tools/web-fetch.d.ts +29 -0
  242. package/dist/src/tools/web-fetch.js +240 -0
  243. package/dist/src/tools/web-fetch.js.map +1 -0
  244. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  245. package/dist/src/tools/web-fetch.test.js +70 -0
  246. package/dist/src/tools/web-fetch.test.js.map +1 -0
  247. package/dist/src/tools/web-search.d.ts +49 -0
  248. package/dist/src/tools/web-search.js +119 -0
  249. package/dist/src/tools/web-search.js.map +1 -0
  250. package/dist/src/tools/write-file.d.ts +50 -0
  251. package/dist/src/tools/write-file.js +261 -0
  252. package/dist/src/tools/write-file.js.map +1 -0
  253. package/dist/src/tools/write-file.test.d.ts +6 -0
  254. package/dist/src/tools/write-file.test.js +413 -0
  255. package/dist/src/tools/write-file.test.js.map +1 -0
  256. package/dist/src/utils/LruCache.d.ts +13 -0
  257. package/dist/src/utils/LruCache.js +38 -0
  258. package/dist/src/utils/LruCache.js.map +1 -0
  259. package/dist/src/utils/bfsFileSearch.d.ts +22 -0
  260. package/dist/src/utils/bfsFileSearch.js +62 -0
  261. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  262. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  263. package/dist/src/utils/bfsFileSearch.test.js +129 -0
  264. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  265. package/dist/src/utils/editCorrector.d.ts +53 -0
  266. package/dist/src/utils/editCorrector.js +546 -0
  267. package/dist/src/utils/editCorrector.js.map +1 -0
  268. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  269. package/dist/src/utils/editCorrector.test.js +560 -0
  270. package/dist/src/utils/editCorrector.test.js.map +1 -0
  271. package/dist/src/utils/editor.d.ts +28 -0
  272. package/dist/src/utils/editor.js +163 -0
  273. package/dist/src/utils/editor.js.map +1 -0
  274. package/dist/src/utils/editor.test.d.ts +6 -0
  275. package/dist/src/utils/editor.test.js +293 -0
  276. package/dist/src/utils/editor.test.js.map +1 -0
  277. package/dist/src/utils/errorReporting.d.ts +14 -0
  278. package/dist/src/utils/errorReporting.js +88 -0
  279. package/dist/src/utils/errorReporting.js.map +1 -0
  280. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  281. package/dist/src/utils/errorReporting.test.js +124 -0
  282. package/dist/src/utils/errorReporting.test.js.map +1 -0
  283. package/dist/src/utils/errors.d.ts +14 -0
  284. package/dist/src/utils/errors.js +54 -0
  285. package/dist/src/utils/errors.js.map +1 -0
  286. package/dist/src/utils/fetch.d.ts +11 -0
  287. package/dist/src/utils/fetch.js +51 -0
  288. package/dist/src/utils/fetch.js.map +1 -0
  289. package/dist/src/utils/fileUtils.d.ts +49 -0
  290. package/dist/src/utils/fileUtils.js +284 -0
  291. package/dist/src/utils/fileUtils.js.map +1 -0
  292. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  293. package/dist/src/utils/fileUtils.test.js +321 -0
  294. package/dist/src/utils/fileUtils.test.js.map +1 -0
  295. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  296. package/dist/src/utils/flashFallback.integration.test.js +112 -0
  297. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  298. package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
  299. package/dist/src/utils/generateContentResponseUtilities.js +92 -0
  300. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  301. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  302. package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
  303. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  304. package/dist/src/utils/getFolderStructure.d.ts +30 -0
  305. package/dist/src/utils/getFolderStructure.js +247 -0
  306. package/dist/src/utils/getFolderStructure.js.map +1 -0
  307. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  308. package/dist/src/utils/getFolderStructure.test.js +300 -0
  309. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  310. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  311. package/dist/src/utils/gitIgnoreParser.js +64 -0
  312. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  313. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  314. package/dist/src/utils/gitIgnoreParser.test.js +145 -0
  315. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  316. package/dist/src/utils/gitUtils.d.ts +17 -0
  317. package/dist/src/utils/gitUtils.js +61 -0
  318. package/dist/src/utils/gitUtils.js.map +1 -0
  319. package/dist/src/utils/memoryDiscovery.d.ts +14 -0
  320. package/dist/src/utils/memoryDiscovery.js +219 -0
  321. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  322. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  323. package/dist/src/utils/memoryDiscovery.test.js +432 -0
  324. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  325. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  326. package/dist/src/utils/memoryImportProcessor.js +141 -0
  327. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  328. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  329. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  330. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  331. package/dist/src/utils/messageInspectors.d.ts +8 -0
  332. package/dist/src/utils/messageInspectors.js +16 -0
  333. package/dist/src/utils/messageInspectors.js.map +1 -0
  334. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  335. package/dist/src/utils/nextSpeakerChecker.js +111 -0
  336. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  337. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  338. package/dist/src/utils/nextSpeakerChecker.test.js +152 -0
  339. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  340. package/dist/src/utils/paths.d.ts +47 -0
  341. package/dist/src/utils/paths.js +136 -0
  342. package/dist/src/utils/paths.js.map +1 -0
  343. package/dist/src/utils/retry.d.ts +21 -0
  344. package/dist/src/utils/retry.js +220 -0
  345. package/dist/src/utils/retry.js.map +1 -0
  346. package/dist/src/utils/retry.test.d.ts +6 -0
  347. package/dist/src/utils/retry.test.js +322 -0
  348. package/dist/src/utils/retry.test.js.map +1 -0
  349. package/dist/src/utils/schemaValidator.d.ts +17 -0
  350. package/dist/src/utils/schemaValidator.js +50 -0
  351. package/dist/src/utils/schemaValidator.js.map +1 -0
  352. package/dist/src/utils/session.d.ts +6 -0
  353. package/dist/src/utils/session.js +8 -0
  354. package/dist/src/utils/session.js.map +1 -0
  355. package/dist/src/utils/testUtils.d.ts +29 -0
  356. package/dist/src/utils/testUtils.js +70 -0
  357. package/dist/src/utils/testUtils.js.map +1 -0
  358. package/dist/src/utils/user_id.d.ts +17 -0
  359. package/dist/src/utils/user_id.js +70 -0
  360. package/dist/src/utils/user_id.js.map +1 -0
  361. package/dist/src/utils/user_id.test.d.ts +6 -0
  362. package/dist/src/utils/user_id.test.js +42 -0
  363. package/dist/src/utils/user_id.test.js.map +1 -0
  364. package/dist/tsconfig.tsbuildinfo +1 -0
  365. package/package.json +60 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
+ import fsPromises from 'fs/promises';
9
+ import * as fs from 'fs';
10
+ import { getFolderStructure } from './getFolderStructure.js';
11
+ import * as gitUtils from './gitUtils.js';
12
+ 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
+ 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
+ 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
+ });
57
+ });
58
+ afterEach(() => {
59
+ vi.restoreAllMocks(); // Restores spies (like fsPromises.readdir) and resets vi.fn mocks (like path.resolve)
60
+ });
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
+ it('should return basic folder structure', async () => {
92
+ const structure = await getFolderStructure('/testroot/subfolderA');
93
+ const expected = `
94
+ Showing up to 200 items (files + folders).
95
+
96
+ /testroot/subfolderA/
97
+ ├───fileA1.ts
98
+ ├───fileA2.js
99
+ └───subfolderB/
100
+ └───fileB1.md
101
+ `.trim();
102
+ expect(structure.trim()).toBe(expected);
103
+ });
104
+ it('should handle an empty folder', async () => {
105
+ const structure = await getFolderStructure('/testroot/emptyFolder');
106
+ const expected = `
107
+ Showing up to 200 items (files + folders).
108
+
109
+ /testroot/emptyFolder/
110
+ `.trim();
111
+ expect(structure.trim()).toBe(expected.trim());
112
+ });
113
+ it('should ignore folders specified in ignoredFolders (default)', async () => {
114
+ const structure = await getFolderStructure('/testroot');
115
+ const expected = `
116
+ 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
+
118
+ /testroot/
119
+ ├───.hiddenfile
120
+ ├───file1.txt
121
+ ├───emptyFolder/
122
+ ├───node_modules/...
123
+ └───subfolderA/
124
+ ├───fileA1.ts
125
+ ├───fileA2.js
126
+ └───subfolderB/
127
+ └───fileB1.md
128
+ `.trim();
129
+ expect(structure.trim()).toBe(expected);
130
+ });
131
+ it('should ignore folders specified in custom ignoredFolders', async () => {
132
+ const structure = await getFolderStructure('/testroot', {
133
+ ignoredFolders: new Set(['subfolderA', 'node_modules']),
134
+ });
135
+ const expected = `
136
+ 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
+
138
+ /testroot/
139
+ ├───.hiddenfile
140
+ ├───file1.txt
141
+ ├───emptyFolder/
142
+ ├───node_modules/...
143
+ └───subfolderA/...
144
+ `.trim();
145
+ expect(structure.trim()).toBe(expected);
146
+ });
147
+ it('should filter files by fileIncludePattern', async () => {
148
+ const structure = await getFolderStructure('/testroot/subfolderA', {
149
+ fileIncludePattern: /\.ts$/,
150
+ });
151
+ const expected = `
152
+ Showing up to 200 items (files + folders).
153
+
154
+ /testroot/subfolderA/
155
+ ├───fileA1.ts
156
+ └───subfolderB/
157
+ `.trim();
158
+ expect(structure.trim()).toBe(expected);
159
+ });
160
+ it('should handle maxItems truncation for files within a folder', async () => {
161
+ const structure = await getFolderStructure('/testroot/subfolderA', {
162
+ maxItems: 3,
163
+ });
164
+ const expected = `
165
+ Showing up to 3 items (files + folders).
166
+
167
+ /testroot/subfolderA/
168
+ ├───fileA1.ts
169
+ ├───fileA2.js
170
+ └───subfolderB/
171
+ `.trim();
172
+ expect(structure.trim()).toBe(expected);
173
+ });
174
+ it('should handle maxItems truncation for subfolders', async () => {
175
+ const structure = await getFolderStructure('/testroot/manyFolders', {
176
+ maxItems: 4,
177
+ });
178
+ const expectedRevised = `
179
+ 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
+
181
+ /testroot/manyFolders/
182
+ ├───folder-0/
183
+ ├───folder-1/
184
+ ├───folder-2/
185
+ ├───folder-3/
186
+ └───...
187
+ `.trim();
188
+ expect(structure.trim()).toBe(expectedRevised);
189
+ });
190
+ it('should handle maxItems that only allows the root folder itself', async () => {
191
+ const structure = await getFolderStructure('/testroot/subfolderA', {
192
+ maxItems: 1,
193
+ });
194
+ const expectedRevisedMax1 = `
195
+ 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
+
197
+ /testroot/subfolderA/
198
+ ├───fileA1.ts
199
+ ├───...
200
+ └───...
201
+ `.trim();
202
+ expect(structure.trim()).toBe(expectedRevisedMax1);
203
+ });
204
+ 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"');
215
+ });
216
+ it('should handle deep folder structure within limits', async () => {
217
+ const structure = await getFolderStructure('/testroot/deepFolders', {
218
+ maxItems: 10,
219
+ });
220
+ const expected = `
221
+ Showing up to 10 items (files + folders).
222
+
223
+ /testroot/deepFolders/
224
+ └───level1/
225
+ └───level2/
226
+ └───level3/
227
+ └───file.txt
228
+ `.trim();
229
+ expect(structure.trim()).toBe(expected);
230
+ });
231
+ it('should truncate deep folder structure if maxItems is small', async () => {
232
+ const structure = await getFolderStructure('/testroot/deepFolders', {
233
+ maxItems: 3,
234
+ });
235
+ const expected = `
236
+ Showing up to 3 items (files + folders).
237
+
238
+ /testroot/deepFolders/
239
+ └───level1/
240
+ └───level2/
241
+ └───level3/
242
+ `.trim();
243
+ expect(structure.trim()).toBe(expected);
244
+ });
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 [];
270
+ });
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 '';
277
+ });
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,
284
+ });
285
+ expect(structure).not.toContain('ignored.txt');
286
+ expect(structure).toContain('node_modules/...');
287
+ expect(structure).not.toContain('logs.json');
288
+ });
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,
294
+ });
295
+ expect(structure).toContain('ignored.txt');
296
+ // node_modules is still ignored by default
297
+ expect(structure).toContain('node_modules/...');
298
+ });
299
+ });
300
+ //# sourceMappingURL=getFolderStructure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFolderStructure.test.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface GitIgnoreFilter {
7
+ isIgnored(filePath: string): boolean;
8
+ getPatterns(): string[];
9
+ }
10
+ export declare class GitIgnoreParser implements GitIgnoreFilter {
11
+ private projectRoot;
12
+ private ig;
13
+ private patterns;
14
+ constructor(projectRoot: string);
15
+ loadGitRepoPatterns(): void;
16
+ loadPatterns(patternsFileName: string): void;
17
+ private addPatterns;
18
+ isIgnored(filePath: string): boolean;
19
+ getPatterns(): string[];
20
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import ignore from 'ignore';
9
+ import { isGitRepository } from './gitUtils.js';
10
+ export class GitIgnoreParser {
11
+ projectRoot;
12
+ ig = ignore();
13
+ patterns = [];
14
+ constructor(projectRoot) {
15
+ this.projectRoot = path.resolve(projectRoot);
16
+ }
17
+ loadGitRepoPatterns() {
18
+ if (!isGitRepository(this.projectRoot))
19
+ return;
20
+ // Always ignore .git directory regardless of .gitignore content
21
+ this.addPatterns(['.git']);
22
+ const patternFiles = ['.gitignore', path.join('.git', 'info', 'exclude')];
23
+ for (const pf of patternFiles) {
24
+ this.loadPatterns(pf);
25
+ }
26
+ }
27
+ loadPatterns(patternsFileName) {
28
+ const patternsFilePath = path.join(this.projectRoot, patternsFileName);
29
+ let content;
30
+ try {
31
+ content = fs.readFileSync(patternsFilePath, 'utf-8');
32
+ }
33
+ catch (_error) {
34
+ // ignore file not found
35
+ return;
36
+ }
37
+ const patterns = (content ?? '')
38
+ .split('\n')
39
+ .map((p) => p.trim())
40
+ .filter((p) => p !== '' && !p.startsWith('#'));
41
+ this.addPatterns(patterns);
42
+ }
43
+ addPatterns(patterns) {
44
+ this.ig.add(patterns);
45
+ this.patterns.push(...patterns);
46
+ }
47
+ isIgnored(filePath) {
48
+ const relativePath = path.isAbsolute(filePath)
49
+ ? path.relative(this.projectRoot, filePath)
50
+ : filePath;
51
+ if (relativePath === '' || relativePath.startsWith('..')) {
52
+ return false;
53
+ }
54
+ let normalizedPath = relativePath.replace(/\\/g, '/');
55
+ if (normalizedPath.startsWith('./')) {
56
+ normalizedPath = normalizedPath.substring(2);
57
+ }
58
+ return this.ig.ignores(normalizedPath);
59
+ }
60
+ getPatterns() {
61
+ return this.patterns;
62
+ }
63
+ }
64
+ //# sourceMappingURL=gitIgnoreParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitIgnoreParser.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,EAAE,GAAW,MAAM,EAAE,CAAC;IACtB,QAAQ,GAAa,EAAE,CAAC;IAEhC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAE/C,gEAAgE;QAChE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,gBAAwB;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wBAAwB;YACxB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7B,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,WAAW,CAAC,QAAkB;QACpC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC;QAEb,IAAI,YAAY,KAAK,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
7
+ import { GitIgnoreParser } from './gitIgnoreParser.js';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { isGitRepository } from './gitUtils.js';
11
+ // Mock fs module
12
+ vi.mock('fs');
13
+ // Mock gitUtils module
14
+ vi.mock('./gitUtils.js');
15
+ describe('GitIgnoreParser', () => {
16
+ let parser;
17
+ const mockProjectRoot = '/test/project';
18
+ beforeEach(() => {
19
+ parser = new GitIgnoreParser(mockProjectRoot);
20
+ // Reset mocks before each test
21
+ vi.mocked(fs.readFileSync).mockClear();
22
+ vi.mocked(isGitRepository).mockReturnValue(true);
23
+ });
24
+ afterEach(() => {
25
+ vi.restoreAllMocks();
26
+ });
27
+ describe('initialization', () => {
28
+ it('should initialize without errors when no .gitignore exists', () => {
29
+ expect(() => parser.loadGitRepoPatterns()).not.toThrow();
30
+ });
31
+ it('should load .gitignore patterns when file exists', () => {
32
+ const gitignoreContent = `
33
+ # Comment
34
+ node_modules/
35
+ *.log
36
+ /dist
37
+ .env
38
+ `;
39
+ vi.mocked(fs.readFileSync).mockReturnValueOnce(gitignoreContent);
40
+ parser.loadGitRepoPatterns();
41
+ expect(parser.getPatterns()).toEqual([
42
+ '.git',
43
+ 'node_modules/',
44
+ '*.log',
45
+ '/dist',
46
+ '.env',
47
+ ]);
48
+ expect(parser.isIgnored('node_modules/some-lib')).toBe(true);
49
+ expect(parser.isIgnored('src/app.log')).toBe(true);
50
+ expect(parser.isIgnored('dist/index.js')).toBe(true);
51
+ expect(parser.isIgnored('.env')).toBe(true);
52
+ });
53
+ it('should handle git exclude file', () => {
54
+ vi.mocked(fs.readFileSync).mockImplementation((filePath) => {
55
+ if (filePath === path.join(mockProjectRoot, '.git', 'info', 'exclude')) {
56
+ return 'temp/\n*.tmp';
57
+ }
58
+ throw new Error('ENOENT');
59
+ });
60
+ parser.loadGitRepoPatterns();
61
+ expect(parser.getPatterns()).toEqual(['.git', 'temp/', '*.tmp']);
62
+ expect(parser.isIgnored('temp/file.txt')).toBe(true);
63
+ expect(parser.isIgnored('src/file.tmp')).toBe(true);
64
+ });
65
+ it('should handle custom patterns file name', () => {
66
+ vi.mocked(isGitRepository).mockReturnValue(false);
67
+ vi.mocked(fs.readFileSync).mockImplementation((filePath) => {
68
+ if (filePath === path.join(mockProjectRoot, '.geminiignore')) {
69
+ return 'temp/\n*.tmp';
70
+ }
71
+ throw new Error('ENOENT');
72
+ });
73
+ parser.loadPatterns('.geminiignore');
74
+ expect(parser.getPatterns()).toEqual(['temp/', '*.tmp']);
75
+ expect(parser.isIgnored('temp/file.txt')).toBe(true);
76
+ expect(parser.isIgnored('src/file.tmp')).toBe(true);
77
+ });
78
+ it('should initialize without errors when no .geminiignore exists', () => {
79
+ expect(() => parser.loadPatterns('.geminiignore')).not.toThrow();
80
+ });
81
+ });
82
+ describe('isIgnored', () => {
83
+ beforeEach(() => {
84
+ const gitignoreContent = `
85
+ node_modules/
86
+ *.log
87
+ /dist
88
+ /.env
89
+ src/*.tmp
90
+ !src/important.tmp
91
+ `;
92
+ vi.mocked(fs.readFileSync).mockReturnValueOnce(gitignoreContent);
93
+ parser.loadGitRepoPatterns();
94
+ });
95
+ it('should always ignore .git directory', () => {
96
+ expect(parser.isIgnored('.git')).toBe(true);
97
+ expect(parser.isIgnored('.git/config')).toBe(true);
98
+ expect(parser.isIgnored(path.join(mockProjectRoot, '.git', 'HEAD'))).toBe(true);
99
+ });
100
+ it('should ignore files matching patterns', () => {
101
+ expect(parser.isIgnored('node_modules/package/index.js')).toBe(true);
102
+ expect(parser.isIgnored('app.log')).toBe(true);
103
+ expect(parser.isIgnored('logs/app.log')).toBe(true);
104
+ expect(parser.isIgnored('dist/bundle.js')).toBe(true);
105
+ expect(parser.isIgnored('.env')).toBe(true);
106
+ expect(parser.isIgnored('config/.env')).toBe(false); // .env is anchored to root
107
+ });
108
+ it('should ignore files with path-specific patterns', () => {
109
+ expect(parser.isIgnored('src/temp.tmp')).toBe(true);
110
+ expect(parser.isIgnored('other/temp.tmp')).toBe(false);
111
+ });
112
+ it('should handle negation patterns', () => {
113
+ expect(parser.isIgnored('src/important.tmp')).toBe(false);
114
+ });
115
+ it('should not ignore files that do not match patterns', () => {
116
+ expect(parser.isIgnored('src/index.ts')).toBe(false);
117
+ expect(parser.isIgnored('README.md')).toBe(false);
118
+ });
119
+ it('should handle absolute paths correctly', () => {
120
+ const absolutePath = path.join(mockProjectRoot, 'node_modules', 'lib');
121
+ expect(parser.isIgnored(absolutePath)).toBe(true);
122
+ });
123
+ it('should handle paths outside project root by not ignoring them', () => {
124
+ const outsidePath = path.resolve(mockProjectRoot, '../other/file.txt');
125
+ expect(parser.isIgnored(outsidePath)).toBe(false);
126
+ });
127
+ it('should handle relative paths correctly', () => {
128
+ expect(parser.isIgnored('node_modules/some-package')).toBe(true);
129
+ expect(parser.isIgnored('../some/other/file.txt')).toBe(false);
130
+ });
131
+ it('should normalize path separators on Windows', () => {
132
+ expect(parser.isIgnored('node_modules\\package')).toBe(true);
133
+ expect(parser.isIgnored('src\\temp.tmp')).toBe(true);
134
+ });
135
+ });
136
+ describe('getIgnoredPatterns', () => {
137
+ it('should return the raw patterns added', () => {
138
+ const gitignoreContent = '*.log\n!important.log';
139
+ vi.mocked(fs.readFileSync).mockReturnValueOnce(gitignoreContent);
140
+ parser.loadGitRepoPatterns();
141
+ expect(parser.getPatterns()).toEqual(['.git', '*.log', '!important.log']);
142
+ });
143
+ });
144
+ });
145
+ //# sourceMappingURL=gitIgnoreParser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitIgnoreParser.test.js","sourceRoot":"","sources":["../../../src/utils/gitIgnoreParser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Checks if a directory is within a git repository
8
+ * @param directory The directory to check
9
+ * @returns true if the directory is in a git repository, false otherwise
10
+ */
11
+ export declare function isGitRepository(directory: string): boolean;
12
+ /**
13
+ * Finds the root directory of a git repository
14
+ * @param directory Starting directory to search from
15
+ * @returns The git repository root path, or null if not in a git repository
16
+ */
17
+ export declare function findGitRoot(directory: string): string | null;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ /**
9
+ * Checks if a directory is within a git repository
10
+ * @param directory The directory to check
11
+ * @returns true if the directory is in a git repository, false otherwise
12
+ */
13
+ export function isGitRepository(directory) {
14
+ try {
15
+ let currentDir = path.resolve(directory);
16
+ while (true) {
17
+ const gitDir = path.join(currentDir, '.git');
18
+ // Check if .git exists (either as directory or file for worktrees)
19
+ if (fs.existsSync(gitDir)) {
20
+ return true;
21
+ }
22
+ const parentDir = path.dirname(currentDir);
23
+ // If we've reached the root directory, stop searching
24
+ if (parentDir === currentDir) {
25
+ break;
26
+ }
27
+ currentDir = parentDir;
28
+ }
29
+ return false;
30
+ }
31
+ catch (_error) {
32
+ // If any filesystem error occurs, assume not a git repo
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Finds the root directory of a git repository
38
+ * @param directory Starting directory to search from
39
+ * @returns The git repository root path, or null if not in a git repository
40
+ */
41
+ export function findGitRoot(directory) {
42
+ try {
43
+ let currentDir = path.resolve(directory);
44
+ while (true) {
45
+ const gitDir = path.join(currentDir, '.git');
46
+ if (fs.existsSync(gitDir)) {
47
+ return currentDir;
48
+ }
49
+ const parentDir = path.dirname(currentDir);
50
+ if (parentDir === currentDir) {
51
+ break;
52
+ }
53
+ currentDir = parentDir;
54
+ }
55
+ return null;
56
+ }
57
+ catch (_error) {
58
+ return null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=gitUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitUtils.js","sourceRoot":"","sources":["../../../src/utils/gitUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAE7C,mEAAmE;YACnE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3C,sDAAsD;YACtD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,wDAAwD;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,IAAI,CAAC;QACH,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAE7C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YAED,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}