@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.
- package/README.md +1 -1
- package/dist/docs/changelogs/index.md +22 -0
- package/dist/docs/changelogs/latest.md +137 -209
- package/dist/docs/changelogs/preview.md +116 -114
- package/dist/docs/changelogs/releases.md +273 -7
- package/dist/docs/cli/model-routing.md +1 -1
- package/dist/docs/cli/model.md +1 -1
- package/dist/docs/cli/settings.md +67 -52
- package/dist/docs/cli/skills.md +156 -0
- package/dist/docs/cli/telemetry.md +3 -3
- package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
- package/dist/docs/cli/tutorials.md +4 -0
- package/dist/docs/core/policy-engine.md +3 -2
- package/dist/docs/extensions/index.md +57 -7
- package/dist/docs/get-started/configuration.md +44 -11
- package/dist/docs/get-started/gemini-3.md +2 -17
- package/dist/docs/hooks/best-practices.md +1 -1
- package/dist/docs/hooks/index.md +47 -11
- package/dist/docs/hooks/reference.md +19 -9
- package/dist/docs/hooks/writing-hooks.md +19 -1
- package/dist/docs/sidebar.json +4 -0
- package/dist/docs/troubleshooting.md +9 -3
- package/dist/google-gemini-cli-core-0.25.0-nightly.20260107.59a18e710.tgz +0 -0
- package/dist/src/agents/a2a-client-manager.d.ts +9 -0
- package/dist/src/agents/a2a-client-manager.js +130 -0
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/a2a-client-manager.test.js +71 -1
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
- package/dist/src/agents/a2aUtils.d.ts +28 -0
- package/dist/src/agents/a2aUtils.js +111 -0
- package/dist/src/agents/a2aUtils.js.map +1 -0
- package/dist/src/agents/a2aUtils.test.js +147 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -0
- package/dist/src/agents/agentLoader.d.ts +68 -0
- package/dist/src/agents/{toml-loader.js → agentLoader.js} +83 -78
- package/dist/src/agents/agentLoader.js.map +1 -0
- package/dist/src/agents/agentLoader.test.js +283 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -0
- package/dist/src/agents/{introspection-agent.d.ts → cli-help-agent.d.ts} +3 -2
- package/dist/src/agents/{introspection-agent.js → cli-help-agent.js} +17 -11
- package/dist/src/agents/cli-help-agent.js.map +1 -0
- package/dist/src/agents/{introspection-agent.test.js → cli-help-agent.test.js} +26 -8
- package/dist/src/agents/cli-help-agent.test.js.map +1 -0
- package/dist/src/agents/delegate-to-agent-tool.d.ts +2 -2
- package/dist/src/agents/delegate-to-agent-tool.js +23 -16
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.test.js +88 -16
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
- package/dist/src/agents/local-executor.js +36 -2
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +55 -2
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +2 -2
- package/dist/src/agents/local-invocation.js +3 -3
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +7 -5
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +10 -0
- package/dist/src/agents/registry.js +61 -26
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +66 -11
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +17 -3
- package/dist/src/agents/remote-invocation.js +106 -6
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +184 -18
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
- package/dist/src/agents/subagent-tool-wrapper.js +6 -5
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +17 -10
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +6 -0
- package/dist/src/availability/fallbackIntegration.test.js +58 -0
- package/dist/src/availability/fallbackIntegration.test.js.map +1 -0
- package/dist/src/code_assist/experiments/experiments.d.ts +1 -1
- package/dist/src/code_assist/experiments/experiments.js +21 -0
- package/dist/src/code_assist/experiments/experiments.js.map +1 -1
- package/dist/src/code_assist/experiments/experiments_local.test.js +110 -0
- package/dist/src/code_assist/experiments/experiments_local.test.js.map +1 -0
- package/dist/src/code_assist/oauth-credential-storage.js +3 -4
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +31 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +105 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +5 -0
- package/dist/src/code_assist/server.js +19 -4
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +19 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.js +6 -4
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +63 -0
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/telemetry.js +2 -1
- package/dist/src/code_assist/telemetry.js.map +1 -1
- package/dist/src/code_assist/telemetry.test.js +2 -1
- package/dist/src/code_assist/telemetry.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +25 -0
- package/dist/src/code_assist/types.js +7 -0
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/config/config.d.ts +45 -9
- package/dist/src/config/config.js +128 -62
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +94 -7
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.d.ts +7 -0
- package/dist/src/config/models.js +17 -4
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +37 -1
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +1 -0
- package/dist/src/config/storage.js +5 -2
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/client.js +66 -15
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +171 -22
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +1 -1
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +8 -4
- package/dist/src/core/coreToolHookTriggers.js +43 -5
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js +11 -9
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +2 -8
- package/dist/src/core/coreToolScheduler.js +84 -166
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +51 -29
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +26 -1
- package/dist/src/core/geminiChat.js +74 -8
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +109 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChatHookTriggers.d.ts +8 -4
- package/dist/src/core/geminiChatHookTriggers.js +31 -9
- package/dist/src/core/geminiChatHookTriggers.js.map +1 -1
- package/dist/src/core/geminiChatHookTriggers.test.d.ts +6 -0
- package/dist/src/core/geminiChatHookTriggers.test.js +153 -0
- package/dist/src/core/geminiChatHookTriggers.test.js.map +1 -0
- package/dist/src/core/loggingContentGenerator.js +19 -2
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +30 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +4 -2
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +9 -9
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +4 -2
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/tokenLimits.js +6 -12
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/tokenLimits.test.js +8 -4
- package/dist/src/core/tokenLimits.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +18 -2
- package/dist/src/core/turn.js +16 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookEventHandler.d.ts +9 -5
- package/dist/src/hooks/hookEventHandler.js +51 -11
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +176 -8
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.d.ts +2 -2
- package/dist/src/hooks/hookRunner.js +12 -4
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +33 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +12 -0
- package/dist/src/hooks/hookSystem.js +36 -0
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +2 -1
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/index.d.ts +0 -1
- package/dist/src/hooks/index.js +0 -2
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/types.d.ts +21 -0
- package/dist/src/hooks/types.js +0 -15
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/hooks/types.test.js +4 -28
- package/dist/src/hooks/types.test.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +4 -0
- package/dist/src/ide/detect-ide.js +7 -2
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +10 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-installer.js +2 -2
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +11 -2
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/index.d.ts +11 -2
- package/dist/src/index.js +13 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js +2 -2
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
- package/dist/src/policy/config.js +60 -22
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +21 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/persistence.test.js +1 -1
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policies/agent.toml +1 -1
- package/dist/src/policy/policies/yolo.toml +1 -0
- package/dist/src/policy/policy-engine.js +22 -6
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +206 -1
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.js +3 -3
- package/dist/src/policy/policy-updater.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +0 -8
- package/dist/src/policy/toml-loader.js +7 -70
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +16 -6
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/utils.d.ts +21 -0
- package/dist/src/policy/utils.js +45 -0
- package/dist/src/policy/utils.js.map +1 -0
- package/dist/src/policy/utils.test.d.ts +6 -0
- package/dist/src/policy/utils.test.js +92 -0
- package/dist/src/policy/utils.test.js.map +1 -0
- package/dist/src/routing/routingStrategy.d.ts +2 -0
- package/dist/src/routing/strategies/classifierStrategy.js +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +16 -0
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +2 -2
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +13 -0
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +5 -5
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.test.js +14 -0
- package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.d.ts +22 -0
- package/dist/src/scheduler/tool-executor.js +198 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -0
- package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
- package/dist/src/scheduler/tool-executor.test.js +231 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -0
- package/dist/src/scheduler/tool-modifier.d.ts +23 -0
- package/dist/src/scheduler/tool-modifier.js +50 -0
- package/dist/src/scheduler/tool-modifier.js.map +1 -0
- package/dist/src/scheduler/tool-modifier.test.d.ts +6 -0
- package/dist/src/scheduler/tool-modifier.test.js +159 -0
- package/dist/src/scheduler/tool-modifier.test.js.map +1 -0
- package/dist/src/services/chatCompressionService.js +3 -10
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +1 -0
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +7 -1
- package/dist/src/services/chatRecordingService.js +20 -2
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +43 -0
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/environmentSanitization.js +4 -3
- package/dist/src/services/environmentSanitization.js.map +1 -1
- package/dist/src/services/gitService.test.js +10 -2
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/modelConfig.integration.test.js +2 -2
- package/dist/src/services/modelConfig.integration.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +29 -1
- package/dist/src/services/modelConfigService.js +116 -69
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +116 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +1 -1
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +43 -2
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/skills/skillLoader.d.ts +31 -0
- package/dist/src/skills/skillLoader.js +77 -0
- package/dist/src/skills/skillLoader.js.map +1 -0
- package/dist/src/skills/skillLoader.test.d.ts +6 -0
- package/dist/src/skills/skillLoader.test.js +75 -0
- package/dist/src/skills/skillLoader.test.js.map +1 -0
- package/dist/src/{services → skills}/skillManager.d.ts +18 -19
- package/dist/src/skills/skillManager.js +108 -0
- package/dist/src/skills/skillManager.js.map +1 -0
- package/dist/src/skills/skillManager.test.d.ts +6 -0
- package/dist/src/skills/skillManager.test.js +164 -0
- package/dist/src/skills/skillManager.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +9 -6
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +20 -16
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +43 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -4
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +3 -3
- package/dist/src/telemetry/loggers.js +4 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +7 -5
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +7 -7
- package/dist/src/telemetry/types.js +14 -12
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
- package/dist/src/test-utils/mock-message-bus.js +29 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +5 -3
- package/dist/src/test-utils/mock-tool.js +11 -10
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/activate-skill.d.ts +2 -2
- package/dist/src/tools/activate-skill.js +28 -10
- package/dist/src/tools/activate-skill.js.map +1 -1
- package/dist/src/tools/activate-skill.test.js +31 -11
- package/dist/src/tools/activate-skill.test.js.map +1 -1
- package/dist/src/tools/confirmation-policy.test.js +2 -12
- package/dist/src/tools/confirmation-policy.test.js.map +1 -1
- package/dist/src/tools/edit.d.ts +27 -5
- package/dist/src/tools/edit.js +446 -137
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +257 -525
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/get-internal-docs.d.ts +2 -2
- package/dist/src/tools/get-internal-docs.js +17 -24
- package/dist/src/tools/get-internal-docs.js.map +1 -1
- package/dist/src/tools/get-internal-docs.test.js +2 -1
- package/dist/src/tools/get-internal-docs.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +2 -2
- package/dist/src/tools/glob.js +1 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +2 -1
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +2 -2
- package/dist/src/tools/grep.js +1 -1
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +5 -4
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +2 -2
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +2 -1
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +2 -2
- package/dist/src/tools/mcp-client.js +2 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +20 -5
- package/dist/src/tools/mcp-tool.js +8 -8
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +11 -6
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +3 -3
- package/dist/src/tools/memoryTool.js +2 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +5 -2
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/message-bus-integration.test.js +10 -37
- package/dist/src/tools/message-bus-integration.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -2
- package/dist/src/tools/read-file.js +1 -1
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +3 -2
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +2 -2
- package/dist/src/tools/read-many-files.js +2 -3
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +3 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +2 -2
- package/dist/src/tools/ripGrep.js +3 -4
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +7 -6
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +3 -4
- package/dist/src/tools/shell.js +9 -35
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +40 -57
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +4 -0
- package/dist/src/tools/tool-error.js +4 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +11 -6
- package/dist/src/tools/tool-registry.js +13 -8
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +14 -10
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +7 -5
- package/dist/src/tools/tools.js +15 -17
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +3 -1
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +2 -2
- package/dist/src/tools/web-fetch.js +4 -4
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +17 -19
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +2 -2
- package/dist/src/tools/web-search.js +3 -4
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +2 -1
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +2 -2
- package/dist/src/tools/write-file.js +5 -3
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +4 -1
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +2 -2
- package/dist/src/tools/write-todos.js +5 -4
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +2 -1
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/apiConversionUtils.d.ts +12 -0
- package/dist/src/utils/apiConversionUtils.js +46 -0
- package/dist/src/utils/apiConversionUtils.js.map +1 -0
- package/dist/src/utils/apiConversionUtils.test.d.ts +6 -0
- package/dist/src/utils/apiConversionUtils.test.js +150 -0
- package/dist/src/utils/apiConversionUtils.test.js.map +1 -0
- package/dist/src/utils/editCorrector.test.js +1 -1
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +2 -2
- package/dist/src/utils/editor.js +19 -2
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +27 -4
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +52 -1
- package/dist/src/utils/events.js +28 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +25 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/fileDiffUtils.d.ts +18 -0
- package/dist/src/utils/fileDiffUtils.js +37 -0
- package/dist/src/utils/fileDiffUtils.js.map +1 -0
- package/dist/src/utils/fileDiffUtils.test.d.ts +6 -0
- package/dist/src/utils/fileDiffUtils.test.js +84 -0
- package/dist/src/utils/fileDiffUtils.test.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.js +9 -10
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/installationManager.test.js +11 -3
- package/dist/src/utils/installationManager.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +1 -2
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +9 -0
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +10 -0
- package/dist/src/utils/paths.js +20 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +2 -0
- package/dist/src/utils/terminal.js +6 -0
- package/dist/src/utils/terminal.js.map +1 -1
- package/dist/src/utils/tokenCalculation.js +20 -5
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +11 -2
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +2 -1
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/src/utils/userAccountManager.test.js +5 -5
- package/dist/src/utils/userAccountManager.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/dist/docs/cli/configuration.md +0 -780
- package/dist/docs/get-started/deployment.md +0 -143
- package/dist/google-gemini-cli-core-0.24.0-nightly.20251227.37be16243.tgz +0 -0
- package/dist/src/agents/introspection-agent.js.map +0 -1
- package/dist/src/agents/introspection-agent.test.js.map +0 -1
- package/dist/src/agents/toml-loader.d.ts +0 -74
- package/dist/src/agents/toml-loader.js.map +0 -1
- package/dist/src/agents/toml-loader.test.js +0 -309
- package/dist/src/agents/toml-loader.test.js.map +0 -1
- package/dist/src/core/sessionHookTriggers.d.ts +0 -28
- package/dist/src/core/sessionHookTriggers.js +0 -68
- package/dist/src/core/sessionHookTriggers.js.map +0 -1
- package/dist/src/services/skillManager.js +0 -157
- package/dist/src/services/skillManager.js.map +0 -1
- package/dist/src/services/skillManager.test.js +0 -169
- package/dist/src/services/skillManager.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -722
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -591
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- package/dist/src/utils/shell-permissions.d.ts +0 -52
- package/dist/src/utils/shell-permissions.js +0 -188
- package/dist/src/utils/shell-permissions.js.map +0 -1
- package/dist/src/utils/shell-permissions.test.js +0 -342
- package/dist/src/utils/shell-permissions.test.js.map +0 -1
- /package/dist/src/agents/{introspection-agent.test.d.ts → a2aUtils.test.d.ts} +0 -0
- /package/dist/src/agents/{toml-loader.test.d.ts → agentLoader.test.d.ts} +0 -0
- /package/dist/src/{services/skillManager.test.d.ts → agents/cli-help-agent.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → availability/fallbackIntegration.test.d.ts} +0 -0
- /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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
*
|
|
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
|
-
*
|
|
29
|
-
* Internal helper for tiered discovery.
|
|
23
|
+
* Discovers built-in skills.
|
|
30
24
|
*/
|
|
31
|
-
|
|
25
|
+
private discoverBuiltinSkills;
|
|
26
|
+
private addSkillsWithPrecedence;
|
|
32
27
|
/**
|
|
33
28
|
* Returns the list of enabled discovered skills.
|
|
34
29
|
*/
|
|
35
|
-
getSkills():
|
|
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():
|
|
39
|
+
getAllSkills(): SkillDefinition[];
|
|
40
40
|
/**
|
|
41
41
|
* Filters discovered skills by name.
|
|
42
42
|
*/
|
|
43
|
-
filterSkills(predicate: (skill:
|
|
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):
|
|
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,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,
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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["
|
|
49
|
-
EventNames["
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
995
|
+
logEditStrategyEvent(event) {
|
|
992
996
|
const data = [
|
|
993
997
|
{
|
|
994
|
-
gemini_cli_key: EventMetadataKey.
|
|
998
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EDIT_STRATEGY,
|
|
995
999
|
value: event.strategy,
|
|
996
1000
|
},
|
|
997
1001
|
];
|
|
998
|
-
this.enqueueLogEvent(this.createLogEvent(EventNames.
|
|
1002
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.EDIT_STRATEGY, data));
|
|
999
1003
|
this.flushIfNeeded();
|
|
1000
1004
|
}
|
|
1001
|
-
|
|
1005
|
+
logEditCorrectionEvent(event) {
|
|
1002
1006
|
const data = [
|
|
1003
1007
|
{
|
|
1004
|
-
gemini_cli_key: EventMetadataKey.
|
|
1008
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_EDIT_CORRECTION,
|
|
1005
1009
|
value: event.correction,
|
|
1006
1010
|
},
|
|
1007
1011
|
];
|
|
1008
|
-
this.enqueueLogEvent(this.createLogEvent(EventNames.
|
|
1012
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.EDIT_CORRECTION, data));
|
|
1009
1013
|
this.flushIfNeeded();
|
|
1010
1014
|
}
|
|
1011
1015
|
logAgentStartEvent(event) {
|