@google/gemini-cli-core 0.24.0-nightly.20260103.30f5c4af4 → 0.25.0-nightly.20260112.15891721a

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 (489) hide show
  1. package/README.md +1 -1
  2. package/dist/docs/changelogs/index.md +22 -0
  3. package/dist/docs/changelogs/latest.md +137 -209
  4. package/dist/docs/changelogs/preview.md +116 -114
  5. package/dist/docs/changelogs/releases.md +273 -7
  6. package/dist/docs/cli/model-routing.md +1 -1
  7. package/dist/docs/cli/model.md +1 -1
  8. package/dist/docs/cli/settings.md +67 -52
  9. package/dist/docs/cli/skills.md +156 -0
  10. package/dist/docs/cli/telemetry.md +3 -3
  11. package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
  12. package/dist/docs/cli/tutorials.md +4 -0
  13. package/dist/docs/core/policy-engine.md +3 -2
  14. package/dist/docs/extensions/index.md +57 -7
  15. package/dist/docs/get-started/configuration.md +44 -11
  16. package/dist/docs/get-started/gemini-3.md +2 -17
  17. package/dist/docs/hooks/best-practices.md +1 -1
  18. package/dist/docs/hooks/index.md +47 -11
  19. package/dist/docs/hooks/reference.md +19 -9
  20. package/dist/docs/hooks/writing-hooks.md +19 -1
  21. package/dist/docs/sidebar.json +4 -0
  22. package/dist/docs/troubleshooting.md +9 -3
  23. package/dist/google-gemini-cli-core-0.25.0-nightly.20260107.59a18e710.tgz +0 -0
  24. package/dist/src/agents/a2a-client-manager.d.ts +9 -0
  25. package/dist/src/agents/a2a-client-manager.js +130 -0
  26. package/dist/src/agents/a2a-client-manager.js.map +1 -1
  27. package/dist/src/agents/a2a-client-manager.test.js +71 -1
  28. package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
  29. package/dist/src/agents/a2aUtils.d.ts +28 -0
  30. package/dist/src/agents/a2aUtils.js +111 -0
  31. package/dist/src/agents/a2aUtils.js.map +1 -0
  32. package/dist/src/agents/a2aUtils.test.js +147 -0
  33. package/dist/src/agents/a2aUtils.test.js.map +1 -0
  34. package/dist/src/agents/agentLoader.d.ts +68 -0
  35. package/dist/src/agents/{toml-loader.js → agentLoader.js} +83 -78
  36. package/dist/src/agents/agentLoader.js.map +1 -0
  37. package/dist/src/agents/agentLoader.test.js +283 -0
  38. package/dist/src/agents/agentLoader.test.js.map +1 -0
  39. package/dist/src/agents/{introspection-agent.d.ts → cli-help-agent.d.ts} +3 -2
  40. package/dist/src/agents/{introspection-agent.js → cli-help-agent.js} +17 -11
  41. package/dist/src/agents/cli-help-agent.js.map +1 -0
  42. package/dist/src/agents/{introspection-agent.test.js → cli-help-agent.test.js} +26 -8
  43. package/dist/src/agents/cli-help-agent.test.js.map +1 -0
  44. package/dist/src/agents/delegate-to-agent-tool.d.ts +2 -2
  45. package/dist/src/agents/delegate-to-agent-tool.js +23 -16
  46. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
  47. package/dist/src/agents/delegate-to-agent-tool.test.js +88 -16
  48. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
  49. package/dist/src/agents/local-executor.js +36 -2
  50. package/dist/src/agents/local-executor.js.map +1 -1
  51. package/dist/src/agents/local-executor.test.js +55 -2
  52. package/dist/src/agents/local-executor.test.js.map +1 -1
  53. package/dist/src/agents/local-invocation.d.ts +2 -2
  54. package/dist/src/agents/local-invocation.js +3 -3
  55. package/dist/src/agents/local-invocation.js.map +1 -1
  56. package/dist/src/agents/local-invocation.test.js +7 -5
  57. package/dist/src/agents/local-invocation.test.js.map +1 -1
  58. package/dist/src/agents/registry.d.ts +10 -0
  59. package/dist/src/agents/registry.js +61 -26
  60. package/dist/src/agents/registry.js.map +1 -1
  61. package/dist/src/agents/registry.test.js +66 -11
  62. package/dist/src/agents/registry.test.js.map +1 -1
  63. package/dist/src/agents/remote-invocation.d.ts +17 -3
  64. package/dist/src/agents/remote-invocation.js +106 -6
  65. package/dist/src/agents/remote-invocation.js.map +1 -1
  66. package/dist/src/agents/remote-invocation.test.js +184 -18
  67. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  68. package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
  69. package/dist/src/agents/subagent-tool-wrapper.js +6 -5
  70. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  71. package/dist/src/agents/subagent-tool-wrapper.test.js +17 -10
  72. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  73. package/dist/src/agents/types.d.ts +6 -0
  74. package/dist/src/availability/fallbackIntegration.test.js +58 -0
  75. package/dist/src/availability/fallbackIntegration.test.js.map +1 -0
  76. package/dist/src/code_assist/experiments/experiments.d.ts +1 -1
  77. package/dist/src/code_assist/experiments/experiments.js +21 -0
  78. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  79. package/dist/src/code_assist/experiments/experiments_local.test.js +110 -0
  80. package/dist/src/code_assist/experiments/experiments_local.test.js.map +1 -0
  81. package/dist/src/code_assist/oauth-credential-storage.js +3 -4
  82. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  83. package/dist/src/code_assist/oauth2.js +31 -1
  84. package/dist/src/code_assist/oauth2.js.map +1 -1
  85. package/dist/src/code_assist/oauth2.test.js +105 -8
  86. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  87. package/dist/src/code_assist/server.d.ts +5 -0
  88. package/dist/src/code_assist/server.js +19 -4
  89. package/dist/src/code_assist/server.js.map +1 -1
  90. package/dist/src/code_assist/server.test.js +19 -0
  91. package/dist/src/code_assist/server.test.js.map +1 -1
  92. package/dist/src/code_assist/setup.js +6 -4
  93. package/dist/src/code_assist/setup.js.map +1 -1
  94. package/dist/src/code_assist/setup.test.js +63 -0
  95. package/dist/src/code_assist/setup.test.js.map +1 -1
  96. package/dist/src/code_assist/telemetry.js +2 -1
  97. package/dist/src/code_assist/telemetry.js.map +1 -1
  98. package/dist/src/code_assist/telemetry.test.js +2 -1
  99. package/dist/src/code_assist/telemetry.test.js.map +1 -1
  100. package/dist/src/code_assist/types.d.ts +25 -0
  101. package/dist/src/code_assist/types.js +7 -0
  102. package/dist/src/code_assist/types.js.map +1 -1
  103. package/dist/src/config/config.d.ts +45 -9
  104. package/dist/src/config/config.js +128 -62
  105. package/dist/src/config/config.js.map +1 -1
  106. package/dist/src/config/config.test.js +94 -7
  107. package/dist/src/config/config.test.js.map +1 -1
  108. package/dist/src/config/models.d.ts +7 -0
  109. package/dist/src/config/models.js +17 -4
  110. package/dist/src/config/models.js.map +1 -1
  111. package/dist/src/config/models.test.js +37 -1
  112. package/dist/src/config/models.test.js.map +1 -1
  113. package/dist/src/config/storage.d.ts +1 -0
  114. package/dist/src/config/storage.js +5 -2
  115. package/dist/src/config/storage.js.map +1 -1
  116. package/dist/src/core/client.js +66 -15
  117. package/dist/src/core/client.js.map +1 -1
  118. package/dist/src/core/client.test.js +171 -22
  119. package/dist/src/core/client.test.js.map +1 -1
  120. package/dist/src/core/contentGenerator.js +1 -1
  121. package/dist/src/core/contentGenerator.js.map +1 -1
  122. package/dist/src/core/contentGenerator.test.js +1 -1
  123. package/dist/src/core/contentGenerator.test.js.map +1 -1
  124. package/dist/src/core/coreToolHookTriggers.d.ts +8 -4
  125. package/dist/src/core/coreToolHookTriggers.js +43 -5
  126. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  127. package/dist/src/core/coreToolHookTriggers.test.js +11 -9
  128. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
  129. package/dist/src/core/coreToolScheduler.d.ts +2 -8
  130. package/dist/src/core/coreToolScheduler.js +84 -166
  131. package/dist/src/core/coreToolScheduler.js.map +1 -1
  132. package/dist/src/core/coreToolScheduler.test.js +51 -29
  133. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  134. package/dist/src/core/geminiChat.d.ts +26 -1
  135. package/dist/src/core/geminiChat.js +74 -8
  136. package/dist/src/core/geminiChat.js.map +1 -1
  137. package/dist/src/core/geminiChat.test.js +109 -0
  138. package/dist/src/core/geminiChat.test.js.map +1 -1
  139. package/dist/src/core/geminiChatHookTriggers.d.ts +8 -4
  140. package/dist/src/core/geminiChatHookTriggers.js +31 -9
  141. package/dist/src/core/geminiChatHookTriggers.js.map +1 -1
  142. package/dist/src/core/geminiChatHookTriggers.test.d.ts +6 -0
  143. package/dist/src/core/geminiChatHookTriggers.test.js +153 -0
  144. package/dist/src/core/geminiChatHookTriggers.test.js.map +1 -0
  145. package/dist/src/core/loggingContentGenerator.js +19 -2
  146. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  147. package/dist/src/core/loggingContentGenerator.test.js +30 -0
  148. package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
  149. package/dist/src/core/nonInteractiveToolExecutor.test.js +4 -2
  150. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  151. package/dist/src/core/prompts.js +9 -9
  152. package/dist/src/core/prompts.js.map +1 -1
  153. package/dist/src/core/prompts.test.js +4 -2
  154. package/dist/src/core/prompts.test.js.map +1 -1
  155. package/dist/src/core/tokenLimits.js +6 -12
  156. package/dist/src/core/tokenLimits.js.map +1 -1
  157. package/dist/src/core/tokenLimits.test.js +8 -4
  158. package/dist/src/core/tokenLimits.test.js.map +1 -1
  159. package/dist/src/core/turn.d.ts +18 -2
  160. package/dist/src/core/turn.js +16 -0
  161. package/dist/src/core/turn.js.map +1 -1
  162. package/dist/src/generated/git-commit.d.ts +2 -2
  163. package/dist/src/generated/git-commit.js +2 -2
  164. package/dist/src/hooks/hookEventHandler.d.ts +9 -5
  165. package/dist/src/hooks/hookEventHandler.js +51 -11
  166. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  167. package/dist/src/hooks/hookEventHandler.test.js +176 -8
  168. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  169. package/dist/src/hooks/hookRunner.d.ts +2 -2
  170. package/dist/src/hooks/hookRunner.js +12 -4
  171. package/dist/src/hooks/hookRunner.js.map +1 -1
  172. package/dist/src/hooks/hookRunner.test.js +33 -0
  173. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  174. package/dist/src/hooks/hookSystem.d.ts +12 -0
  175. package/dist/src/hooks/hookSystem.js +36 -0
  176. package/dist/src/hooks/hookSystem.js.map +1 -1
  177. package/dist/src/hooks/hookTranslator.js +2 -1
  178. package/dist/src/hooks/hookTranslator.js.map +1 -1
  179. package/dist/src/hooks/index.d.ts +0 -1
  180. package/dist/src/hooks/index.js +0 -2
  181. package/dist/src/hooks/index.js.map +1 -1
  182. package/dist/src/hooks/types.d.ts +21 -0
  183. package/dist/src/hooks/types.js +0 -15
  184. package/dist/src/hooks/types.js.map +1 -1
  185. package/dist/src/hooks/types.test.js +4 -28
  186. package/dist/src/hooks/types.test.js.map +1 -1
  187. package/dist/src/ide/detect-ide.d.ts +4 -0
  188. package/dist/src/ide/detect-ide.js +7 -2
  189. package/dist/src/ide/detect-ide.js.map +1 -1
  190. package/dist/src/ide/detect-ide.test.js +10 -0
  191. package/dist/src/ide/detect-ide.test.js.map +1 -1
  192. package/dist/src/ide/ide-installer.js +2 -2
  193. package/dist/src/ide/ide-installer.js.map +1 -1
  194. package/dist/src/ide/ide-installer.test.js +11 -2
  195. package/dist/src/ide/ide-installer.test.js.map +1 -1
  196. package/dist/src/index.d.ts +11 -2
  197. package/dist/src/index.js +13 -3
  198. package/dist/src/index.js.map +1 -1
  199. package/dist/src/mcp/token-storage/file-token-storage.js +2 -2
  200. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  201. package/dist/src/policy/config.js +60 -22
  202. package/dist/src/policy/config.js.map +1 -1
  203. package/dist/src/policy/config.test.js +21 -0
  204. package/dist/src/policy/config.test.js.map +1 -1
  205. package/dist/src/policy/persistence.test.js +1 -1
  206. package/dist/src/policy/persistence.test.js.map +1 -1
  207. package/dist/src/policy/policies/agent.toml +1 -1
  208. package/dist/src/policy/policies/yolo.toml +1 -0
  209. package/dist/src/policy/policy-engine.js +22 -6
  210. package/dist/src/policy/policy-engine.js.map +1 -1
  211. package/dist/src/policy/policy-engine.test.js +206 -1
  212. package/dist/src/policy/policy-engine.test.js.map +1 -1
  213. package/dist/src/policy/policy-updater.test.js +3 -3
  214. package/dist/src/policy/policy-updater.test.js.map +1 -1
  215. package/dist/src/policy/toml-loader.d.ts +0 -8
  216. package/dist/src/policy/toml-loader.js +7 -70
  217. package/dist/src/policy/toml-loader.js.map +1 -1
  218. package/dist/src/policy/toml-loader.test.js +16 -6
  219. package/dist/src/policy/toml-loader.test.js.map +1 -1
  220. package/dist/src/policy/utils.d.ts +21 -0
  221. package/dist/src/policy/utils.js +45 -0
  222. package/dist/src/policy/utils.js.map +1 -0
  223. package/dist/src/policy/utils.test.d.ts +6 -0
  224. package/dist/src/policy/utils.test.js +92 -0
  225. package/dist/src/policy/utils.test.js.map +1 -0
  226. package/dist/src/routing/routingStrategy.d.ts +2 -0
  227. package/dist/src/routing/strategies/classifierStrategy.js +1 -1
  228. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  229. package/dist/src/routing/strategies/classifierStrategy.test.js +16 -0
  230. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  231. package/dist/src/routing/strategies/fallbackStrategy.d.ts +1 -1
  232. package/dist/src/routing/strategies/fallbackStrategy.js +2 -2
  233. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  234. package/dist/src/routing/strategies/fallbackStrategy.test.js +13 -0
  235. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  236. package/dist/src/routing/strategies/overrideStrategy.d.ts +1 -1
  237. package/dist/src/routing/strategies/overrideStrategy.js +5 -5
  238. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  239. package/dist/src/routing/strategies/overrideStrategy.test.js +14 -0
  240. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
  241. package/dist/src/scheduler/tool-executor.d.ts +22 -0
  242. package/dist/src/scheduler/tool-executor.js +198 -0
  243. package/dist/src/scheduler/tool-executor.js.map +1 -0
  244. package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
  245. package/dist/src/scheduler/tool-executor.test.js +231 -0
  246. package/dist/src/scheduler/tool-executor.test.js.map +1 -0
  247. package/dist/src/scheduler/tool-modifier.d.ts +23 -0
  248. package/dist/src/scheduler/tool-modifier.js +50 -0
  249. package/dist/src/scheduler/tool-modifier.js.map +1 -0
  250. package/dist/src/scheduler/tool-modifier.test.d.ts +6 -0
  251. package/dist/src/scheduler/tool-modifier.test.js +159 -0
  252. package/dist/src/scheduler/tool-modifier.test.js.map +1 -0
  253. package/dist/src/services/chatCompressionService.js +3 -10
  254. package/dist/src/services/chatCompressionService.js.map +1 -1
  255. package/dist/src/services/chatCompressionService.test.js +1 -0
  256. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  257. package/dist/src/services/chatRecordingService.d.ts +7 -1
  258. package/dist/src/services/chatRecordingService.js +20 -2
  259. package/dist/src/services/chatRecordingService.js.map +1 -1
  260. package/dist/src/services/chatRecordingService.test.js +43 -0
  261. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  262. package/dist/src/services/environmentSanitization.js +4 -3
  263. package/dist/src/services/environmentSanitization.js.map +1 -1
  264. package/dist/src/services/gitService.test.js +10 -2
  265. package/dist/src/services/gitService.test.js.map +1 -1
  266. package/dist/src/services/modelConfig.integration.test.js +2 -2
  267. package/dist/src/services/modelConfig.integration.test.js.map +1 -1
  268. package/dist/src/services/modelConfigService.d.ts +29 -1
  269. package/dist/src/services/modelConfigService.js +116 -69
  270. package/dist/src/services/modelConfigService.js.map +1 -1
  271. package/dist/src/services/modelConfigService.test.js +116 -0
  272. package/dist/src/services/modelConfigService.test.js.map +1 -1
  273. package/dist/src/services/shellExecutionService.js +1 -1
  274. package/dist/src/services/shellExecutionService.js.map +1 -1
  275. package/dist/src/services/shellExecutionService.test.js +43 -2
  276. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  277. package/dist/src/skills/skillLoader.d.ts +31 -0
  278. package/dist/src/skills/skillLoader.js +77 -0
  279. package/dist/src/skills/skillLoader.js.map +1 -0
  280. package/dist/src/skills/skillLoader.test.d.ts +6 -0
  281. package/dist/src/skills/skillLoader.test.js +75 -0
  282. package/dist/src/skills/skillLoader.test.js.map +1 -0
  283. package/dist/src/{services → skills}/skillManager.d.ts +18 -19
  284. package/dist/src/skills/skillManager.js +108 -0
  285. package/dist/src/skills/skillManager.js.map +1 -0
  286. package/dist/src/skills/skillManager.test.d.ts +6 -0
  287. package/dist/src/skills/skillManager.test.js +164 -0
  288. package/dist/src/skills/skillManager.test.js.map +1 -0
  289. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +9 -6
  290. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +20 -16
  291. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  292. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +43 -4
  293. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  294. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -2
  295. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -4
  296. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  297. package/dist/src/telemetry/loggers.d.ts +3 -3
  298. package/dist/src/telemetry/loggers.js +4 -4
  299. package/dist/src/telemetry/loggers.js.map +1 -1
  300. package/dist/src/telemetry/loggers.test.js +7 -5
  301. package/dist/src/telemetry/loggers.test.js.map +1 -1
  302. package/dist/src/telemetry/types.d.ts +7 -7
  303. package/dist/src/telemetry/types.js +14 -12
  304. package/dist/src/telemetry/types.js.map +1 -1
  305. package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
  306. package/dist/src/test-utils/mock-message-bus.js +29 -0
  307. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  308. package/dist/src/test-utils/mock-tool.d.ts +5 -3
  309. package/dist/src/test-utils/mock-tool.js +11 -10
  310. package/dist/src/test-utils/mock-tool.js.map +1 -1
  311. package/dist/src/tools/activate-skill.d.ts +2 -2
  312. package/dist/src/tools/activate-skill.js +28 -10
  313. package/dist/src/tools/activate-skill.js.map +1 -1
  314. package/dist/src/tools/activate-skill.test.js +31 -11
  315. package/dist/src/tools/activate-skill.test.js.map +1 -1
  316. package/dist/src/tools/confirmation-policy.test.js +2 -12
  317. package/dist/src/tools/confirmation-policy.test.js.map +1 -1
  318. package/dist/src/tools/edit.d.ts +27 -5
  319. package/dist/src/tools/edit.js +446 -137
  320. package/dist/src/tools/edit.js.map +1 -1
  321. package/dist/src/tools/edit.test.js +257 -525
  322. package/dist/src/tools/edit.test.js.map +1 -1
  323. package/dist/src/tools/get-internal-docs.d.ts +2 -2
  324. package/dist/src/tools/get-internal-docs.js +17 -24
  325. package/dist/src/tools/get-internal-docs.js.map +1 -1
  326. package/dist/src/tools/get-internal-docs.test.js +2 -1
  327. package/dist/src/tools/get-internal-docs.test.js.map +1 -1
  328. package/dist/src/tools/glob.d.ts +2 -2
  329. package/dist/src/tools/glob.js +1 -1
  330. package/dist/src/tools/glob.js.map +1 -1
  331. package/dist/src/tools/glob.test.js +2 -1
  332. package/dist/src/tools/glob.test.js.map +1 -1
  333. package/dist/src/tools/grep.d.ts +2 -2
  334. package/dist/src/tools/grep.js +1 -1
  335. package/dist/src/tools/grep.js.map +1 -1
  336. package/dist/src/tools/grep.test.js +5 -4
  337. package/dist/src/tools/grep.test.js.map +1 -1
  338. package/dist/src/tools/ls.d.ts +2 -2
  339. package/dist/src/tools/ls.js +2 -2
  340. package/dist/src/tools/ls.js.map +1 -1
  341. package/dist/src/tools/ls.test.js +2 -1
  342. package/dist/src/tools/ls.test.js.map +1 -1
  343. package/dist/src/tools/mcp-client.d.ts +2 -2
  344. package/dist/src/tools/mcp-client.js +2 -1
  345. package/dist/src/tools/mcp-client.js.map +1 -1
  346. package/dist/src/tools/mcp-tool.d.ts +20 -5
  347. package/dist/src/tools/mcp-tool.js +8 -8
  348. package/dist/src/tools/mcp-tool.js.map +1 -1
  349. package/dist/src/tools/mcp-tool.test.js +11 -6
  350. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  351. package/dist/src/tools/memoryTool.d.ts +3 -3
  352. package/dist/src/tools/memoryTool.js +2 -2
  353. package/dist/src/tools/memoryTool.js.map +1 -1
  354. package/dist/src/tools/memoryTool.test.js +5 -2
  355. package/dist/src/tools/memoryTool.test.js.map +1 -1
  356. package/dist/src/tools/message-bus-integration.test.js +10 -37
  357. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  358. package/dist/src/tools/read-file.d.ts +2 -2
  359. package/dist/src/tools/read-file.js +1 -1
  360. package/dist/src/tools/read-file.js.map +1 -1
  361. package/dist/src/tools/read-file.test.js +3 -2
  362. package/dist/src/tools/read-file.test.js.map +1 -1
  363. package/dist/src/tools/read-many-files.d.ts +2 -2
  364. package/dist/src/tools/read-many-files.js +2 -3
  365. package/dist/src/tools/read-many-files.js.map +1 -1
  366. package/dist/src/tools/read-many-files.test.js +3 -2
  367. package/dist/src/tools/read-many-files.test.js.map +1 -1
  368. package/dist/src/tools/ripGrep.d.ts +2 -2
  369. package/dist/src/tools/ripGrep.js +3 -4
  370. package/dist/src/tools/ripGrep.js.map +1 -1
  371. package/dist/src/tools/ripGrep.test.js +7 -6
  372. package/dist/src/tools/ripGrep.test.js.map +1 -1
  373. package/dist/src/tools/shell.d.ts +3 -4
  374. package/dist/src/tools/shell.js +9 -35
  375. package/dist/src/tools/shell.js.map +1 -1
  376. package/dist/src/tools/shell.test.js +40 -57
  377. package/dist/src/tools/shell.test.js.map +1 -1
  378. package/dist/src/tools/tool-error.d.ts +4 -0
  379. package/dist/src/tools/tool-error.js +4 -0
  380. package/dist/src/tools/tool-error.js.map +1 -1
  381. package/dist/src/tools/tool-registry.d.ts +11 -6
  382. package/dist/src/tools/tool-registry.js +13 -8
  383. package/dist/src/tools/tool-registry.js.map +1 -1
  384. package/dist/src/tools/tool-registry.test.js +14 -10
  385. package/dist/src/tools/tool-registry.test.js.map +1 -1
  386. package/dist/src/tools/tools.d.ts +7 -5
  387. package/dist/src/tools/tools.js +15 -17
  388. package/dist/src/tools/tools.js.map +1 -1
  389. package/dist/src/tools/tools.test.js +3 -1
  390. package/dist/src/tools/tools.test.js.map +1 -1
  391. package/dist/src/tools/web-fetch.d.ts +2 -2
  392. package/dist/src/tools/web-fetch.js +4 -4
  393. package/dist/src/tools/web-fetch.js.map +1 -1
  394. package/dist/src/tools/web-fetch.test.js +17 -19
  395. package/dist/src/tools/web-fetch.test.js.map +1 -1
  396. package/dist/src/tools/web-search.d.ts +2 -2
  397. package/dist/src/tools/web-search.js +3 -4
  398. package/dist/src/tools/web-search.js.map +1 -1
  399. package/dist/src/tools/web-search.test.js +2 -1
  400. package/dist/src/tools/web-search.test.js.map +1 -1
  401. package/dist/src/tools/write-file.d.ts +2 -2
  402. package/dist/src/tools/write-file.js +5 -3
  403. package/dist/src/tools/write-file.js.map +1 -1
  404. package/dist/src/tools/write-file.test.js +4 -1
  405. package/dist/src/tools/write-file.test.js.map +1 -1
  406. package/dist/src/tools/write-todos.d.ts +2 -2
  407. package/dist/src/tools/write-todos.js +5 -4
  408. package/dist/src/tools/write-todos.js.map +1 -1
  409. package/dist/src/tools/write-todos.test.js +2 -1
  410. package/dist/src/tools/write-todos.test.js.map +1 -1
  411. package/dist/src/utils/apiConversionUtils.d.ts +12 -0
  412. package/dist/src/utils/apiConversionUtils.js +46 -0
  413. package/dist/src/utils/apiConversionUtils.js.map +1 -0
  414. package/dist/src/utils/apiConversionUtils.test.d.ts +6 -0
  415. package/dist/src/utils/apiConversionUtils.test.js +150 -0
  416. package/dist/src/utils/apiConversionUtils.test.js.map +1 -0
  417. package/dist/src/utils/editCorrector.test.js +1 -1
  418. package/dist/src/utils/editCorrector.test.js.map +1 -1
  419. package/dist/src/utils/editor.d.ts +2 -2
  420. package/dist/src/utils/editor.js +19 -2
  421. package/dist/src/utils/editor.js.map +1 -1
  422. package/dist/src/utils/editor.test.js +27 -4
  423. package/dist/src/utils/editor.test.js.map +1 -1
  424. package/dist/src/utils/events.d.ts +52 -1
  425. package/dist/src/utils/events.js +28 -0
  426. package/dist/src/utils/events.js.map +1 -1
  427. package/dist/src/utils/events.test.js +25 -0
  428. package/dist/src/utils/events.test.js.map +1 -1
  429. package/dist/src/utils/fileDiffUtils.d.ts +18 -0
  430. package/dist/src/utils/fileDiffUtils.js +37 -0
  431. package/dist/src/utils/fileDiffUtils.js.map +1 -0
  432. package/dist/src/utils/fileDiffUtils.test.d.ts +6 -0
  433. package/dist/src/utils/fileDiffUtils.test.js +84 -0
  434. package/dist/src/utils/fileDiffUtils.test.js.map +1 -0
  435. package/dist/src/utils/gitIgnoreParser.js +9 -10
  436. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  437. package/dist/src/utils/installationManager.test.js +11 -3
  438. package/dist/src/utils/installationManager.test.js.map +1 -1
  439. package/dist/src/utils/memoryDiscovery.js +1 -2
  440. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  441. package/dist/src/utils/memoryDiscovery.test.js +9 -0
  442. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  443. package/dist/src/utils/paths.d.ts +10 -0
  444. package/dist/src/utils/paths.js +20 -1
  445. package/dist/src/utils/paths.js.map +1 -1
  446. package/dist/src/utils/terminal.d.ts +2 -0
  447. package/dist/src/utils/terminal.js +6 -0
  448. package/dist/src/utils/terminal.js.map +1 -1
  449. package/dist/src/utils/tokenCalculation.js +20 -5
  450. package/dist/src/utils/tokenCalculation.js.map +1 -1
  451. package/dist/src/utils/tokenCalculation.test.js +11 -2
  452. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  453. package/dist/src/utils/tool-utils.test.js +2 -1
  454. package/dist/src/utils/tool-utils.test.js.map +1 -1
  455. package/dist/src/utils/userAccountManager.test.js +5 -5
  456. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  457. package/dist/tsconfig.tsbuildinfo +1 -1
  458. package/package.json +3 -2
  459. package/dist/docs/cli/configuration.md +0 -780
  460. package/dist/docs/get-started/deployment.md +0 -143
  461. package/dist/google-gemini-cli-core-0.24.0-nightly.20251227.37be16243.tgz +0 -0
  462. package/dist/src/agents/introspection-agent.js.map +0 -1
  463. package/dist/src/agents/introspection-agent.test.js.map +0 -1
  464. package/dist/src/agents/toml-loader.d.ts +0 -74
  465. package/dist/src/agents/toml-loader.js.map +0 -1
  466. package/dist/src/agents/toml-loader.test.js +0 -309
  467. package/dist/src/agents/toml-loader.test.js.map +0 -1
  468. package/dist/src/core/sessionHookTriggers.d.ts +0 -28
  469. package/dist/src/core/sessionHookTriggers.js +0 -68
  470. package/dist/src/core/sessionHookTriggers.js.map +0 -1
  471. package/dist/src/services/skillManager.js +0 -157
  472. package/dist/src/services/skillManager.js.map +0 -1
  473. package/dist/src/services/skillManager.test.js +0 -169
  474. package/dist/src/services/skillManager.test.js.map +0 -1
  475. package/dist/src/tools/smart-edit.d.ts +0 -78
  476. package/dist/src/tools/smart-edit.js +0 -722
  477. package/dist/src/tools/smart-edit.js.map +0 -1
  478. package/dist/src/tools/smart-edit.test.js +0 -591
  479. package/dist/src/tools/smart-edit.test.js.map +0 -1
  480. package/dist/src/utils/shell-permissions.d.ts +0 -52
  481. package/dist/src/utils/shell-permissions.js +0 -188
  482. package/dist/src/utils/shell-permissions.js.map +0 -1
  483. package/dist/src/utils/shell-permissions.test.js +0 -342
  484. package/dist/src/utils/shell-permissions.test.js.map +0 -1
  485. /package/dist/src/agents/{introspection-agent.test.d.ts → a2aUtils.test.d.ts} +0 -0
  486. /package/dist/src/agents/{toml-loader.test.d.ts → agentLoader.test.d.ts} +0 -0
  487. /package/dist/src/{services/skillManager.test.d.ts → agents/cli-help-agent.test.d.ts} +0 -0
  488. /package/dist/src/{tools/smart-edit.test.d.ts → availability/fallbackIntegration.test.d.ts} +0 -0
  489. /package/dist/src/{utils/shell-permissions.test.d.ts → code_assist/experiments/experiments_local.test.d.ts} +0 -0
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as os from 'node:os';
9
+ import * as path from 'node:path';
10
+ import { loadSkillsFromDir } from './skillLoader.js';
11
+ import { coreEvents } from '../utils/events.js';
12
+ import { debugLogger } from '../utils/debugLogger.js';
13
+ describe('skillLoader', () => {
14
+ let testRootDir;
15
+ beforeEach(async () => {
16
+ testRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'skill-loader-test-'));
17
+ vi.spyOn(coreEvents, 'emitFeedback');
18
+ vi.spyOn(debugLogger, 'debug').mockImplementation(() => { });
19
+ });
20
+ afterEach(async () => {
21
+ await fs.rm(testRootDir, { recursive: true, force: true });
22
+ vi.restoreAllMocks();
23
+ });
24
+ it('should load skills from a directory with valid SKILL.md', async () => {
25
+ const skillDir = path.join(testRootDir, 'my-skill');
26
+ await fs.mkdir(skillDir, { recursive: true });
27
+ const skillFile = path.join(skillDir, 'SKILL.md');
28
+ await fs.writeFile(skillFile, `---\nname: my-skill\ndescription: A test skill\n---\n# Instructions\nDo something.\n`);
29
+ const skills = await loadSkillsFromDir(testRootDir);
30
+ expect(skills).toHaveLength(1);
31
+ expect(skills[0].name).toBe('my-skill');
32
+ expect(skills[0].description).toBe('A test skill');
33
+ expect(skills[0].location).toBe(skillFile);
34
+ expect(skills[0].body).toBe('# Instructions\nDo something.');
35
+ expect(coreEvents.emitFeedback).not.toHaveBeenCalled();
36
+ });
37
+ it('should emit feedback when no valid skills are found in a non-empty directory', async () => {
38
+ const notASkillDir = path.join(testRootDir, 'not-a-skill');
39
+ await fs.mkdir(notASkillDir, { recursive: true });
40
+ await fs.writeFile(path.join(notASkillDir, 'some-file.txt'), 'hello');
41
+ const skills = await loadSkillsFromDir(testRootDir);
42
+ expect(skills).toHaveLength(0);
43
+ expect(debugLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Failed to load skills from'));
44
+ });
45
+ it('should ignore empty directories and not emit feedback', async () => {
46
+ const skills = await loadSkillsFromDir(testRootDir);
47
+ expect(skills).toHaveLength(0);
48
+ expect(coreEvents.emitFeedback).not.toHaveBeenCalled();
49
+ });
50
+ it('should ignore directories without SKILL.md', async () => {
51
+ const notASkillDir = path.join(testRootDir, 'not-a-skill');
52
+ await fs.mkdir(notASkillDir, { recursive: true });
53
+ // With a subdirectory, even if empty, it might still trigger readdir
54
+ // But my current logic is if discoveredSkills.length === 0, then check readdir
55
+ // If readdir is empty, it's fine.
56
+ const skills = await loadSkillsFromDir(testRootDir);
57
+ expect(skills).toHaveLength(0);
58
+ // If notASkillDir is empty, no warning.
59
+ });
60
+ it('should ignore SKILL.md without valid frontmatter and emit warning if directory is not empty', async () => {
61
+ const skillDir = path.join(testRootDir, 'invalid-skill');
62
+ await fs.mkdir(skillDir, { recursive: true });
63
+ const skillFile = path.join(skillDir, 'SKILL.md');
64
+ await fs.writeFile(skillFile, '# No frontmatter here');
65
+ const skills = await loadSkillsFromDir(testRootDir);
66
+ expect(skills).toHaveLength(0);
67
+ expect(debugLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Failed to load skills from'));
68
+ });
69
+ it('should return empty array for non-existent directory', async () => {
70
+ const skills = await loadSkillsFromDir('/non/existent/path');
71
+ expect(skills).toEqual([]);
72
+ expect(coreEvents.emitFeedback).not.toHaveBeenCalled();
73
+ });
74
+ });
75
+ //# sourceMappingURL=skillLoader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillLoader.test.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.test.ts"],"names":[],"mappings":"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"}
@@ -4,13 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { Storage } from '../config/storage.js';
7
- export interface SkillMetadata {
8
- name: string;
9
- description: string;
10
- location: string;
11
- body: string;
12
- disabled?: boolean;
13
- }
7
+ import { type SkillDefinition } from './skillLoader.js';
8
+ import type { GeminiCLIExtension } from '../config/config.js';
9
+ export { type SkillDefinition };
14
10
  export declare class SkillManager {
15
11
  private skills;
16
12
  private activeSkillNames;
@@ -19,28 +15,32 @@ export declare class SkillManager {
19
15
  */
20
16
  clearSkills(): void;
21
17
  /**
22
- * Discovers skills from standard user and project locations.
23
- * Project skills take precedence over user skills.
18
+ * Discovers skills from standard user and project locations, as well as extensions.
19
+ * Precedence: Extensions (lowest) -> User -> Project (highest).
24
20
  */
25
- discoverSkills(storage: Storage): Promise<void>;
26
- private addSkillsWithPrecedence;
21
+ discoverSkills(storage: Storage, extensions?: GeminiCLIExtension[]): Promise<void>;
27
22
  /**
28
- * Discovered skills in the provided paths and adds them to the manager.
29
- * Internal helper for tiered discovery.
23
+ * Discovers built-in skills.
30
24
  */
31
- discoverSkillsInternal(paths: string[]): Promise<SkillMetadata[]>;
25
+ private discoverBuiltinSkills;
26
+ private addSkillsWithPrecedence;
32
27
  /**
33
28
  * Returns the list of enabled discovered skills.
34
29
  */
35
- getSkills(): SkillMetadata[];
30
+ getSkills(): SkillDefinition[];
31
+ /**
32
+ * Returns the list of enabled discovered skills that should be displayed in the UI.
33
+ * This excludes built-in skills.
34
+ */
35
+ getDisplayableSkills(): SkillDefinition[];
36
36
  /**
37
37
  * Returns all discovered skills, including disabled ones.
38
38
  */
39
- getAllSkills(): SkillMetadata[];
39
+ getAllSkills(): SkillDefinition[];
40
40
  /**
41
41
  * Filters discovered skills by name.
42
42
  */
43
- filterSkills(predicate: (skill: SkillMetadata) => boolean): void;
43
+ filterSkills(predicate: (skill: SkillDefinition) => boolean): void;
44
44
  /**
45
45
  * Sets the list of disabled skill names.
46
46
  */
@@ -48,7 +48,7 @@ export declare class SkillManager {
48
48
  /**
49
49
  * Reads the full content (metadata + body) of a skill by name.
50
50
  */
51
- getSkill(name: string): SkillMetadata | null;
51
+ getSkill(name: string): SkillDefinition | null;
52
52
  /**
53
53
  * Activates a skill by name.
54
54
  */
@@ -57,5 +57,4 @@ export declare class SkillManager {
57
57
  * Checks if a skill is active.
58
58
  */
59
59
  isSkillActive(name: string): boolean;
60
- private parseSkillFile;
61
60
  }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Storage } from '../config/storage.js';
7
+ import { loadSkillsFromDir } from './skillLoader.js';
8
+ export {};
9
+ export class SkillManager {
10
+ skills = [];
11
+ activeSkillNames = new Set();
12
+ /**
13
+ * Clears all discovered skills.
14
+ */
15
+ clearSkills() {
16
+ this.skills = [];
17
+ }
18
+ /**
19
+ * Discovers skills from standard user and project locations, as well as extensions.
20
+ * Precedence: Extensions (lowest) -> User -> Project (highest).
21
+ */
22
+ async discoverSkills(storage, extensions = []) {
23
+ this.clearSkills();
24
+ // 1. Built-in skills (lowest precedence)
25
+ await this.discoverBuiltinSkills();
26
+ // 2. Extension skills
27
+ for (const extension of extensions) {
28
+ if (extension.isActive && extension.skills) {
29
+ this.addSkillsWithPrecedence(extension.skills);
30
+ }
31
+ }
32
+ // 3. User skills
33
+ const userSkills = await loadSkillsFromDir(Storage.getUserSkillsDir());
34
+ this.addSkillsWithPrecedence(userSkills);
35
+ // 4. Project skills (highest precedence)
36
+ const projectSkills = await loadSkillsFromDir(storage.getProjectSkillsDir());
37
+ this.addSkillsWithPrecedence(projectSkills);
38
+ }
39
+ /**
40
+ * Discovers built-in skills.
41
+ */
42
+ async discoverBuiltinSkills() {
43
+ // Built-in skills can be added here.
44
+ // For now, this is a placeholder for where built-in skills will be loaded from.
45
+ // They could be loaded from a specific directory within the package.
46
+ }
47
+ addSkillsWithPrecedence(newSkills) {
48
+ const skillMap = new Map();
49
+ for (const skill of [...this.skills, ...newSkills]) {
50
+ skillMap.set(skill.name, skill);
51
+ }
52
+ this.skills = Array.from(skillMap.values());
53
+ }
54
+ /**
55
+ * Returns the list of enabled discovered skills.
56
+ */
57
+ getSkills() {
58
+ return this.skills.filter((s) => !s.disabled);
59
+ }
60
+ /**
61
+ * Returns the list of enabled discovered skills that should be displayed in the UI.
62
+ * This excludes built-in skills.
63
+ */
64
+ getDisplayableSkills() {
65
+ return this.skills.filter((s) => !s.disabled && !s.isBuiltin);
66
+ }
67
+ /**
68
+ * Returns all discovered skills, including disabled ones.
69
+ */
70
+ getAllSkills() {
71
+ return this.skills;
72
+ }
73
+ /**
74
+ * Filters discovered skills by name.
75
+ */
76
+ filterSkills(predicate) {
77
+ this.skills = this.skills.filter(predicate);
78
+ }
79
+ /**
80
+ * Sets the list of disabled skill names.
81
+ */
82
+ setDisabledSkills(disabledNames) {
83
+ const lowercaseDisabledNames = disabledNames.map((n) => n.toLowerCase());
84
+ for (const skill of this.skills) {
85
+ skill.disabled = lowercaseDisabledNames.includes(skill.name.toLowerCase());
86
+ }
87
+ }
88
+ /**
89
+ * Reads the full content (metadata + body) of a skill by name.
90
+ */
91
+ getSkill(name) {
92
+ const lowercaseName = name.toLowerCase();
93
+ return (this.skills.find((s) => s.name.toLowerCase() === lowercaseName) ?? null);
94
+ }
95
+ /**
96
+ * Activates a skill by name.
97
+ */
98
+ activateSkill(name) {
99
+ this.activeSkillNames.add(name);
100
+ }
101
+ /**
102
+ * Checks if a skill is active.
103
+ */
104
+ isSkillActive(name) {
105
+ return this.activeSkillNames.has(name);
106
+ }
107
+ }
108
+ //# sourceMappingURL=skillManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillManager.js","sourceRoot":"","sources":["../../../src/skills/skillManager.ts"],"names":[],"mappings":"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"}
@@ -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,164 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import * as fs from 'node:fs/promises';
8
+ import * as os from 'node:os';
9
+ import * as path from 'node:path';
10
+ import { SkillManager } from './skillManager.js';
11
+ import { Storage } from '../config/storage.js';
12
+ import {} from '../config/config.js';
13
+ describe('SkillManager', () => {
14
+ let testRootDir;
15
+ beforeEach(async () => {
16
+ testRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'skill-manager-test-'));
17
+ });
18
+ afterEach(async () => {
19
+ await fs.rm(testRootDir, { recursive: true, force: true });
20
+ vi.restoreAllMocks();
21
+ });
22
+ it('should discover skills from extensions, user, and project with precedence', async () => {
23
+ const userDir = path.join(testRootDir, 'user');
24
+ const projectDir = path.join(testRootDir, 'project');
25
+ await fs.mkdir(path.join(userDir, 'skill-a'), { recursive: true });
26
+ await fs.mkdir(path.join(projectDir, 'skill-b'), { recursive: true });
27
+ await fs.writeFile(path.join(userDir, 'skill-a', 'SKILL.md'), `---
28
+ name: skill-user
29
+ description: user-desc
30
+ ---
31
+ `);
32
+ await fs.writeFile(path.join(projectDir, 'skill-b', 'SKILL.md'), `---
33
+ name: skill-project
34
+ description: project-desc
35
+ ---
36
+ `);
37
+ const mockExtension = {
38
+ name: 'test-ext',
39
+ version: '1.0.0',
40
+ isActive: true,
41
+ path: '/ext',
42
+ contextFiles: [],
43
+ id: 'ext-id',
44
+ skills: [
45
+ {
46
+ name: 'skill-extension',
47
+ description: 'ext-desc',
48
+ location: '/ext/skills/SKILL.md',
49
+ body: 'body',
50
+ },
51
+ ],
52
+ };
53
+ vi.spyOn(Storage, 'getUserSkillsDir').mockReturnValue(userDir);
54
+ const storage = new Storage('/dummy');
55
+ vi.spyOn(storage, 'getProjectSkillsDir').mockReturnValue(projectDir);
56
+ const service = new SkillManager();
57
+ await service.discoverSkills(storage, [mockExtension]);
58
+ const skills = service.getSkills();
59
+ expect(skills).toHaveLength(3);
60
+ const names = skills.map((s) => s.name);
61
+ expect(names).toContain('skill-extension');
62
+ expect(names).toContain('skill-user');
63
+ expect(names).toContain('skill-project');
64
+ });
65
+ it('should respect precedence: Project > User > Extension', async () => {
66
+ const userDir = path.join(testRootDir, 'user');
67
+ const projectDir = path.join(testRootDir, 'project');
68
+ await fs.mkdir(path.join(userDir, 'skill'), { recursive: true });
69
+ await fs.mkdir(path.join(projectDir, 'skill'), { recursive: true });
70
+ await fs.writeFile(path.join(userDir, 'skill', 'SKILL.md'), `---
71
+ name: same-name
72
+ description: user-desc
73
+ ---
74
+ `);
75
+ await fs.writeFile(path.join(projectDir, 'skill', 'SKILL.md'), `---
76
+ name: same-name
77
+ description: project-desc
78
+ ---
79
+ `);
80
+ const mockExtension = {
81
+ name: 'test-ext',
82
+ version: '1.0.0',
83
+ isActive: true,
84
+ path: '/ext',
85
+ contextFiles: [],
86
+ id: 'ext-id',
87
+ skills: [
88
+ {
89
+ name: 'same-name',
90
+ description: 'ext-desc',
91
+ location: '/ext/skills/SKILL.md',
92
+ body: 'body',
93
+ },
94
+ ],
95
+ };
96
+ vi.spyOn(Storage, 'getUserSkillsDir').mockReturnValue(userDir);
97
+ const storage = new Storage('/dummy');
98
+ vi.spyOn(storage, 'getProjectSkillsDir').mockReturnValue(projectDir);
99
+ const service = new SkillManager();
100
+ await service.discoverSkills(storage, [mockExtension]);
101
+ const skills = service.getSkills();
102
+ expect(skills).toHaveLength(1);
103
+ expect(skills[0].description).toBe('project-desc');
104
+ // Test User > Extension
105
+ vi.spyOn(storage, 'getProjectSkillsDir').mockReturnValue('/non-existent');
106
+ await service.discoverSkills(storage, [mockExtension]);
107
+ expect(service.getSkills()[0].description).toBe('user-desc');
108
+ });
109
+ it('should filter disabled skills in getSkills but not in getAllSkills', async () => {
110
+ const skillDir = path.join(testRootDir, 'skill1');
111
+ await fs.mkdir(skillDir, { recursive: true });
112
+ await fs.writeFile(path.join(skillDir, 'SKILL.md'), `---
113
+ name: skill1
114
+ description: desc1
115
+ ---
116
+ `);
117
+ const storage = new Storage('/dummy');
118
+ vi.spyOn(storage, 'getProjectSkillsDir').mockReturnValue(testRootDir);
119
+ vi.spyOn(Storage, 'getUserSkillsDir').mockReturnValue('/non-existent');
120
+ const service = new SkillManager();
121
+ await service.discoverSkills(storage);
122
+ service.setDisabledSkills(['skill1']);
123
+ expect(service.getSkills()).toHaveLength(0);
124
+ expect(service.getAllSkills()).toHaveLength(1);
125
+ expect(service.getAllSkills()[0].disabled).toBe(true);
126
+ });
127
+ it('should filter built-in skills in getDisplayableSkills', async () => {
128
+ const service = new SkillManager();
129
+ // @ts-expect-error accessing private property for testing
130
+ service.skills = [
131
+ {
132
+ name: 'regular-skill',
133
+ description: 'regular',
134
+ location: 'loc1',
135
+ body: 'body',
136
+ isBuiltin: false,
137
+ },
138
+ {
139
+ name: 'builtin-skill',
140
+ description: 'builtin',
141
+ location: 'loc2',
142
+ body: 'body',
143
+ isBuiltin: true,
144
+ },
145
+ {
146
+ name: 'disabled-builtin',
147
+ description: 'disabled builtin',
148
+ location: 'loc3',
149
+ body: 'body',
150
+ isBuiltin: true,
151
+ disabled: true,
152
+ },
153
+ ];
154
+ const displayable = service.getDisplayableSkills();
155
+ expect(displayable).toHaveLength(1);
156
+ expect(displayable[0].name).toBe('regular-skill');
157
+ const all = service.getAllSkills();
158
+ expect(all).toHaveLength(3);
159
+ const enabled = service.getSkills();
160
+ expect(enabled).toHaveLength(2);
161
+ expect(enabled.map((s) => s.name)).toContain('builtin-skill');
162
+ });
163
+ });
164
+ //# sourceMappingURL=skillManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillManager.test.js","sourceRoot":"","sources":["../../../src/skills/skillManager.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { HttpsProxyAgent } from 'https-proxy-agent';
7
- import type { StartSessionEvent, UserPromptEvent, ToolCallEvent, ApiRequestEvent, ApiResponseEvent, ApiErrorEvent, LoopDetectedEvent, NextSpeakerCheckEvent, SlashCommandEvent, MalformedJsonResponseEvent, IdeConnectionEvent, ConversationFinishedEvent, ChatCompressionEvent, FileOperationEvent, InvalidChunkEvent, ContentRetryEvent, ContentRetryFailureEvent, ExtensionInstallEvent, ToolOutputTruncatedEvent, ExtensionUninstallEvent, ModelRoutingEvent, ExtensionEnableEvent, ModelSlashCommandEvent, ExtensionDisableEvent, SmartEditStrategyEvent, SmartEditCorrectionEvent, AgentStartEvent, AgentFinishEvent, RecoveryAttemptEvent, WebFetchFallbackAttemptEvent, ExtensionUpdateEvent, LlmLoopCheckEvent, HookCallEvent } from '../types.js';
7
+ import type { StartSessionEvent, UserPromptEvent, ToolCallEvent, ApiRequestEvent, ApiResponseEvent, ApiErrorEvent, LoopDetectedEvent, NextSpeakerCheckEvent, SlashCommandEvent, MalformedJsonResponseEvent, IdeConnectionEvent, ConversationFinishedEvent, ChatCompressionEvent, FileOperationEvent, InvalidChunkEvent, ContentRetryEvent, ContentRetryFailureEvent, ExtensionInstallEvent, ToolOutputTruncatedEvent, ExtensionUninstallEvent, ModelRoutingEvent, ExtensionEnableEvent, ModelSlashCommandEvent, ExtensionDisableEvent, EditStrategyEvent, EditCorrectionEvent, AgentStartEvent, AgentFinishEvent, RecoveryAttemptEvent, WebFetchFallbackAttemptEvent, ExtensionUpdateEvent, LlmLoopCheckEvent, HookCallEvent } from '../types.js';
8
8
  import { EventMetadataKey } from './event-metadata-key.js';
9
9
  import type { Config } from '../../config/config.js';
10
10
  export declare enum EventNames {
@@ -38,8 +38,8 @@ export declare enum EventNames {
38
38
  TOOL_OUTPUT_TRUNCATED = "tool_output_truncated",
39
39
  MODEL_ROUTING = "model_routing",
40
40
  MODEL_SLASH_COMMAND = "model_slash_command",
41
- SMART_EDIT_STRATEGY = "smart_edit_strategy",
42
- SMART_EDIT_CORRECTION = "smart_edit_correction",
41
+ EDIT_STRATEGY = "edit_strategy",
42
+ EDIT_CORRECTION = "edit_correction",
43
43
  AGENT_START = "agent_start",
44
44
  AGENT_FINISH = "agent_finish",
45
45
  RECOVERY_ATTEMPT = "recovery_attempt",
@@ -53,6 +53,9 @@ export interface LogResponse {
53
53
  export interface LogEventEntry {
54
54
  event_time_ms: number;
55
55
  source_extension_json: string;
56
+ exp?: {
57
+ gws_experiment: number[];
58
+ };
56
59
  }
57
60
  export interface EventValue {
58
61
  gemini_cli_key: EventMetadataKey;
@@ -101,7 +104,7 @@ export declare class ClearcutLogger {
101
104
  static getInstance(config?: Config): ClearcutLogger | undefined;
102
105
  /** For testing purposes only. */
103
106
  static clearInstance(): void;
104
- enqueueHelper(event: LogEvent): void;
107
+ enqueueHelper(event: LogEvent, experimentIds?: number[]): void;
105
108
  enqueueLogEvent(event: LogEvent): void;
106
109
  enqueueLogEventAfterExperimentsLoadAsync(event: LogEvent): Promise<void>;
107
110
  createBasicLogEvent(eventName: EventNames, data?: EventValue[]): LogEvent;
@@ -137,8 +140,8 @@ export declare class ClearcutLogger {
137
140
  logExtensionEnableEvent(event: ExtensionEnableEvent): Promise<void>;
138
141
  logModelSlashCommandEvent(event: ModelSlashCommandEvent): void;
139
142
  logExtensionDisableEvent(event: ExtensionDisableEvent): Promise<void>;
140
- logSmartEditStrategyEvent(event: SmartEditStrategyEvent): void;
141
- logSmartEditCorrectionEvent(event: SmartEditCorrectionEvent): void;
143
+ logEditStrategyEvent(event: EditStrategyEvent): void;
144
+ logEditCorrectionEvent(event: EditCorrectionEvent): void;
142
145
  logAgentStartEvent(event: AgentStartEvent): void;
143
146
  logAgentFinishEvent(event: AgentFinishEvent): void;
144
147
  logRecoveryAttemptEvent(event: RecoveryAttemptEvent): void;
@@ -45,8 +45,8 @@ export var EventNames;
45
45
  EventNames["TOOL_OUTPUT_TRUNCATED"] = "tool_output_truncated";
46
46
  EventNames["MODEL_ROUTING"] = "model_routing";
47
47
  EventNames["MODEL_SLASH_COMMAND"] = "model_slash_command";
48
- EventNames["SMART_EDIT_STRATEGY"] = "smart_edit_strategy";
49
- EventNames["SMART_EDIT_CORRECTION"] = "smart_edit_correction";
48
+ EventNames["EDIT_STRATEGY"] = "edit_strategy";
49
+ EventNames["EDIT_CORRECTION"] = "edit_correction";
50
50
  EventNames["AGENT_START"] = "agent_start";
51
51
  EventNames["AGENT_FINISH"] = "agent_finish";
52
52
  EventNames["RECOVERY_ATTEMPT"] = "recovery_attempt";
@@ -164,18 +164,22 @@ export class ClearcutLogger {
164
164
  // @ts-expect-error - ClearcutLogger is a singleton, but we need to clear it for tests.
165
165
  ClearcutLogger.instance = undefined;
166
166
  }
167
- enqueueHelper(event) {
167
+ enqueueHelper(event, experimentIds) {
168
168
  // Manually handle overflow for FixedDeque, which throws when full.
169
169
  const wasAtCapacity = this.events.size >= MAX_EVENTS;
170
170
  if (wasAtCapacity) {
171
171
  this.events.shift(); // Evict oldest element to make space.
172
172
  }
173
- this.events.push([
174
- {
175
- event_time_ms: Date.now(),
176
- source_extension_json: safeJsonStringify(event),
177
- },
178
- ]);
173
+ const logEventEntry = {
174
+ event_time_ms: Date.now(),
175
+ source_extension_json: safeJsonStringify(event),
176
+ };
177
+ if (experimentIds !== undefined) {
178
+ logEventEntry.exp = {
179
+ gws_experiment: experimentIds,
180
+ };
181
+ }
182
+ this.events.push([logEventEntry]);
179
183
  if (wasAtCapacity && this.config?.getDebugMode()) {
180
184
  debugLogger.debug(`ClearcutLogger: Dropped old event to prevent memory leak (queue size: ${this.events.size})`);
181
185
  }
@@ -203,7 +207,7 @@ export class ClearcutLogger {
203
207
  ];
204
208
  event.event_metadata = [[...event.event_metadata[0], ...exp_id_data]];
205
209
  }
206
- this.enqueueHelper(event);
210
+ this.enqueueHelper(event, experiments?.experimentIds);
207
211
  });
208
212
  }
209
213
  catch (error) {
@@ -988,24 +992,24 @@ export class ClearcutLogger {
988
992
  debugLogger.debug('Error flushing to Clearcut:', error);
989
993
  });
990
994
  }
991
- logSmartEditStrategyEvent(event) {
995
+ logEditStrategyEvent(event) {
992
996
  const data = [
993
997
  {
994
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SMART_EDIT_STRATEGY,
998
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_EDIT_STRATEGY,
995
999
  value: event.strategy,
996
1000
  },
997
1001
  ];
998
- this.enqueueLogEvent(this.createLogEvent(EventNames.SMART_EDIT_STRATEGY, data));
1002
+ this.enqueueLogEvent(this.createLogEvent(EventNames.EDIT_STRATEGY, data));
999
1003
  this.flushIfNeeded();
1000
1004
  }
1001
- logSmartEditCorrectionEvent(event) {
1005
+ logEditCorrectionEvent(event) {
1002
1006
  const data = [
1003
1007
  {
1004
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SMART_EDIT_CORRECTION,
1008
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_EDIT_CORRECTION,
1005
1009
  value: event.correction,
1006
1010
  },
1007
1011
  ];
1008
- this.enqueueLogEvent(this.createLogEvent(EventNames.SMART_EDIT_CORRECTION, data));
1012
+ this.enqueueLogEvent(this.createLogEvent(EventNames.EDIT_CORRECTION, data));
1009
1013
  this.flushIfNeeded();
1010
1014
  }
1011
1015
  logAgentStartEvent(event) {