@google/gemini-cli 0.28.0-preview.5 → 0.29.0-nightly.20260206.4ffc349c1
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/dist/google-gemini-cli-0.29.0-nightly.20260203.71f46f116.tgz +0 -0
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions/configure.js +6 -79
- package/dist/src/commands/extensions/configure.js.map +1 -1
- package/dist/src/commands/extensions/configure.test.js +14 -24
- package/dist/src/commands/extensions/configure.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -1
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/utils.d.ts +14 -4
- package/dist/src/commands/extensions/utils.js +88 -7
- package/dist/src/commands/extensions/utils.js.map +1 -1
- package/dist/src/commands/skills/link.d.ts +14 -0
- package/dist/src/commands/skills/link.js +65 -0
- package/dist/src/commands/skills/link.js.map +1 -0
- package/dist/src/commands/skills/link.test.d.ts +6 -0
- package/dist/src/commands/skills/link.test.js +49 -0
- package/dist/src/commands/skills/link.test.js.map +1 -0
- package/dist/src/commands/skills.js +2 -0
- package/dist/src/commands/skills.js.map +1 -1
- package/dist/src/config/config.d.ts +2 -1
- package/dist/src/config/config.js +38 -3
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +206 -5
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extensions/consent.d.ts +1 -1
- package/dist/src/config/extensions/consent.js +6 -4
- package/dist/src/config/extensions/consent.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.js +9 -1
- package/dist/src/config/extensions/extensionSettings.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.test.js +27 -0
- package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +0 -1
- package/dist/src/config/keyBindings.js +11 -15
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policy-engine.integration.test.js +29 -34
- package/dist/src/config/policy-engine.integration.test.js.map +1 -1
- package/dist/src/config/settings.js +4 -1
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +20 -1
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +15 -1
- package/dist/src/config/settingsSchema.js +15 -1
- package/dist/src/config/settingsSchema.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/generated/git-commit.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +4 -2
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +26 -0
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/ui/AppContainer.js +70 -50
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +0 -123
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +75 -0
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.test.js +103 -11
- package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.test.js +1 -0
- package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
- package/dist/src/ui/commands/planCommand.d.ts +7 -0
- package/dist/src/ui/commands/planCommand.js +44 -0
- package/dist/src/ui/commands/planCommand.js.map +1 -0
- package/dist/src/ui/commands/planCommand.test.js +87 -0
- package/dist/src/ui/commands/planCommand.test.js.map +1 -0
- package/dist/src/ui/commands/skillsCommand.js +50 -1
- package/dist/src/ui/commands/skillsCommand.js.map +1 -1
- package/dist/src/ui/commands/skillsCommand.test.js +55 -0
- package/dist/src/ui/commands/skillsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +6 -0
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/BackgroundShellDisplay.js +21 -16
- package/dist/src/ui/components/BackgroundShellDisplay.js.map +1 -1
- package/dist/src/ui/components/BackgroundShellDisplay.test.js +21 -0
- package/dist/src/ui/components/BackgroundShellDisplay.test.js.map +1 -1
- package/dist/src/ui/components/ConfigExtensionDialog.d.ts +19 -0
- package/dist/src/ui/components/ConfigExtensionDialog.js +155 -0
- package/dist/src/ui/components/ConfigExtensionDialog.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.js +83 -34
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.js +283 -9
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/ShellInputPrompt.js +0 -4
- package/dist/src/ui/components/ShellInputPrompt.js.map +1 -1
- package/dist/src/ui/components/ShellInputPrompt.test.js +0 -22
- package/dist/src/ui/components/ShellInputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/messages/ShellToolMessage.js +12 -0
- package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ShellToolMessage.test.js +27 -1
- package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +3 -3
- package/dist/src/ui/components/messages/ToolShared.js +1 -5
- package/dist/src/ui/components/messages/ToolShared.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.test.js +20 -4
- package/dist/src/ui/components/shared/TextInput.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.d.ts +98 -5
- package/dist/src/ui/components/shared/text-buffer.js +228 -29
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.test.js +33 -1
- package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
- package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +18 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.js +156 -42
- package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -1
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js +54 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
- package/dist/src/ui/constants/tips.js +2 -2
- package/dist/src/ui/contexts/KeypressContext.js +15 -2
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +67 -17
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/editors/editorSettingsManager.js +2 -2
- package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
- package/dist/src/ui/hooks/shellReducer.js +2 -6
- package/dist/src/ui/hooks/shellReducer.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +2 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +11 -2
- package/dist/src/ui/hooks/useCommandCompletion.js +30 -18
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js +50 -9
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useCompletion.d.ts +0 -2
- package/dist/src/ui/hooks/useCompletion.js +0 -4
- package/dist/src/ui/hooks/useCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useEditorSettings.js +4 -2
- package/dist/src/ui/hooks/useEditorSettings.js.map +1 -1
- package/dist/src/ui/hooks/useEditorSettings.test.js +5 -5
- package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +5 -0
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistory.d.ts +3 -2
- package/dist/src/ui/hooks/useInputHistory.js +54 -47
- package/dist/src/ui/hooks/useInputHistory.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistory.test.js +194 -13
- package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.js +2 -3
- package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
- package/dist/src/ui/hooks/vim.js +78 -0
- package/dist/src/ui/hooks/vim.js.map +1 -1
- package/dist/src/ui/hooks/vim.test.js +87 -0
- package/dist/src/ui/hooks/vim.test.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
- package/dist/src/ui/utils/terminalSetup.js +72 -56
- package/dist/src/ui/utils/terminalSetup.js.map +1 -1
- package/dist/src/ui/utils/terminalSetup.test.js +21 -1
- package/dist/src/ui/utils/terminalSetup.test.js.map +1 -1
- package/dist/src/ui/utils/terminalUtils.js +1 -3
- package/dist/src/ui/utils/terminalUtils.js.map +1 -1
- package/dist/src/ui/utils/terminalUtils.test.js +0 -5
- package/dist/src/ui/utils/terminalUtils.test.js.map +1 -1
- package/dist/src/utils/skillUtils.d.ts +7 -0
- package/dist/src/utils/skillUtils.js +42 -0
- package/dist/src/utils/skillUtils.js.map +1 -1
- package/dist/src/utils/skillUtils.test.js +55 -1
- package/dist/src/utils/skillUtils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.28.0-preview.4.tgz +0 -0
- package/dist/src/ui/utils/keybindingUtils.d.ts +0 -14
- package/dist/src/ui/utils/keybindingUtils.js +0 -54
- package/dist/src/ui/utils/keybindingUtils.js.map +0 -1
- package/dist/src/ui/utils/keybindingUtils.test.js +0 -44
- package/dist/src/ui/utils/keybindingUtils.test.js.map +0 -1
- /package/dist/src/ui/{utils/keybindingUtils.test.d.ts → commands/planCommand.test.d.ts} +0 -0
|
Binary file
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@google/gemini-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0-nightly.20260206.4ffc349c1",
|
|
4
4
|
"description": "Gemini CLI",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dist"
|
|
27
27
|
],
|
|
28
28
|
"config": {
|
|
29
|
-
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.
|
|
29
|
+
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.29.0-nightly.20260206.4ffc349c1"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@agentclientprotocol/sdk": "^0.12.0",
|
|
@@ -3,12 +3,10 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { getExtensionAndManager, getExtensionManager } from './utils.js';
|
|
6
|
+
import { configureAllExtensions, configureExtension, configureSpecificSetting, getExtensionManager, } from './utils.js';
|
|
8
7
|
import { loadSettings } from '../../config/settings.js';
|
|
9
|
-
import {
|
|
8
|
+
import { coreEvents, debugLogger } from '@google/gemini-cli-core';
|
|
10
9
|
import { exitCli } from '../utils.js';
|
|
11
|
-
import prompts from 'prompts';
|
|
12
10
|
export const configureCommand = {
|
|
13
11
|
command: 'config [name] [setting]',
|
|
14
12
|
describe: 'Configure extension settings.',
|
|
@@ -41,91 +39,20 @@ export const configureCommand = {
|
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
43
41
|
}
|
|
42
|
+
const extensionManager = await getExtensionManager();
|
|
44
43
|
// Case 1: Configure specific setting for an extension
|
|
45
44
|
if (name && setting) {
|
|
46
|
-
await configureSpecificSetting(name, setting, scope);
|
|
45
|
+
await configureSpecificSetting(extensionManager, name, setting, scope);
|
|
47
46
|
}
|
|
48
47
|
// Case 2: Configure all settings for an extension
|
|
49
48
|
else if (name) {
|
|
50
|
-
await configureExtension(name, scope);
|
|
49
|
+
await configureExtension(extensionManager, name, scope);
|
|
51
50
|
}
|
|
52
51
|
// Case 3: Configure all extensions
|
|
53
52
|
else {
|
|
54
|
-
await configureAllExtensions(scope);
|
|
53
|
+
await configureAllExtensions(extensionManager, scope);
|
|
55
54
|
}
|
|
56
55
|
await exitCli();
|
|
57
56
|
},
|
|
58
57
|
};
|
|
59
|
-
async function configureSpecificSetting(extensionName, settingKey, scope) {
|
|
60
|
-
const { extension, extensionManager } = await getExtensionAndManager(extensionName);
|
|
61
|
-
if (!extension || !extensionManager) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
65
|
-
if (!extensionConfig) {
|
|
66
|
-
debugLogger.error(`Could not find configuration for extension "${extensionName}".`);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
await updateSetting(extensionConfig, extension.id, settingKey, promptForSetting, scope, process.cwd());
|
|
70
|
-
}
|
|
71
|
-
async function configureExtension(extensionName, scope) {
|
|
72
|
-
const { extension, extensionManager } = await getExtensionAndManager(extensionName);
|
|
73
|
-
if (!extension || !extensionManager) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
77
|
-
if (!extensionConfig ||
|
|
78
|
-
!extensionConfig.settings ||
|
|
79
|
-
extensionConfig.settings.length === 0) {
|
|
80
|
-
debugLogger.log(`Extension "${extensionName}" has no settings to configure.`);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
debugLogger.log(`Configuring settings for "${extensionName}"...`);
|
|
84
|
-
await configureExtensionSettings(extensionConfig, extension.id, scope);
|
|
85
|
-
}
|
|
86
|
-
async function configureAllExtensions(scope) {
|
|
87
|
-
const extensionManager = await getExtensionManager();
|
|
88
|
-
const extensions = extensionManager.getExtensions();
|
|
89
|
-
if (extensions.length === 0) {
|
|
90
|
-
debugLogger.log('No extensions installed.');
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
for (const extension of extensions) {
|
|
94
|
-
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
95
|
-
if (extensionConfig &&
|
|
96
|
-
extensionConfig.settings &&
|
|
97
|
-
extensionConfig.settings.length > 0) {
|
|
98
|
-
debugLogger.log(`\nConfiguring settings for "${extension.name}"...`);
|
|
99
|
-
await configureExtensionSettings(extensionConfig, extension.id, scope);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async function configureExtensionSettings(extensionConfig, extensionId, scope) {
|
|
104
|
-
const currentScopedSettings = await getScopedEnvContents(extensionConfig, extensionId, scope, process.cwd());
|
|
105
|
-
let workspaceSettings = {};
|
|
106
|
-
if (scope === ExtensionSettingScope.USER) {
|
|
107
|
-
workspaceSettings = await getScopedEnvContents(extensionConfig, extensionId, ExtensionSettingScope.WORKSPACE, process.cwd());
|
|
108
|
-
}
|
|
109
|
-
if (!extensionConfig.settings)
|
|
110
|
-
return;
|
|
111
|
-
for (const setting of extensionConfig.settings) {
|
|
112
|
-
const currentValue = currentScopedSettings[setting.envVar];
|
|
113
|
-
const workspaceValue = workspaceSettings[setting.envVar];
|
|
114
|
-
if (workspaceValue !== undefined) {
|
|
115
|
-
debugLogger.log(`Note: Setting "${setting.name}" is already configured in the workspace scope.`);
|
|
116
|
-
}
|
|
117
|
-
if (currentValue !== undefined) {
|
|
118
|
-
const response = await prompts({
|
|
119
|
-
type: 'confirm',
|
|
120
|
-
name: 'overwrite',
|
|
121
|
-
message: `Setting "${setting.name}" (${setting.envVar}) is already set. Overwrite?`,
|
|
122
|
-
initial: false,
|
|
123
|
-
});
|
|
124
|
-
if (!response.overwrite) {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
await updateSetting(extensionConfig, extensionId, setting.envVar, promptForSetting, scope, process.cwd());
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
58
|
//# sourceMappingURL=configure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/extensions/configure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/extensions/configure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQtC,MAAM,CAAC,MAAM,gBAAgB,GAAyC;IACpE,OAAO,EAAE,yBAAyB;IAClC,QAAQ,EAAE,+BAA+B;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,qCAAqC;QAC/C,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,UAAU,CAAC,SAAS,EAAE;QACrB,QAAQ,EAAE,sDAAsD;QAChE,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,QAAQ,EAAE,kCAAkC;QAC5C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAC9B,OAAO,EAAE,MAAM;KAChB,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QAEpD,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC,EAAE,CAAC;YACtD,UAAU,CAAC,YAAY,CACrB,OAAO,EACP,6GAA6G,CAC9G,CAAC;YACF,MAAM,OAAO,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,WAAW,CAAC,KAAK,CACf,uEAAuE,CACxE,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAErD,sDAAsD;QACtD,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACpB,MAAM,wBAAwB,CAC5B,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,KAA8B,CAC/B,CAAC;QACJ,CAAC;QACD,kDAAkD;aAC7C,IAAI,IAAI,EAAE,CAAC;YACd,MAAM,kBAAkB,CACtB,gBAAgB,EAChB,IAAI,EACJ,KAA8B,CAC/B,CAAC;QACJ,CAAC;QACD,mCAAmC;aAC9B,CAAC;YACJ,MAAM,sBAAsB,CAC1B,gBAAgB,EAChB,KAA8B,CAC/B,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -7,10 +7,10 @@ import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
|
7
7
|
import { configureCommand } from './configure.js';
|
|
8
8
|
import yargs from 'yargs';
|
|
9
9
|
import { debugLogger } from '@google/gemini-cli-core';
|
|
10
|
-
import { updateSetting,
|
|
10
|
+
import { updateSetting, getScopedEnvContents, } from '../../config/extensions/extensionSettings.js';
|
|
11
11
|
import prompts from 'prompts';
|
|
12
12
|
import * as fs from 'node:fs';
|
|
13
|
-
const { mockExtensionManager,
|
|
13
|
+
const { mockExtensionManager, mockGetExtensionManager, mockLoadSettings } = vi.hoisted(() => {
|
|
14
14
|
const extensionManager = {
|
|
15
15
|
loadExtensionConfig: vi.fn(),
|
|
16
16
|
getExtensions: vi.fn(),
|
|
@@ -19,7 +19,6 @@ const { mockExtensionManager, mockGetExtensionAndManager, mockGetExtensionManage
|
|
|
19
19
|
};
|
|
20
20
|
return {
|
|
21
21
|
mockExtensionManager: extensionManager,
|
|
22
|
-
mockGetExtensionAndManager: vi.fn(),
|
|
23
22
|
mockGetExtensionManager: vi.fn(),
|
|
24
23
|
mockLoadSettings: vi.fn().mockReturnValue({ merged: {} }),
|
|
25
24
|
};
|
|
@@ -39,10 +38,13 @@ vi.mock('../../config/extensions/extensionSettings.js', () => ({
|
|
|
39
38
|
vi.mock('../utils.js', () => ({
|
|
40
39
|
exitCli: vi.fn(),
|
|
41
40
|
}));
|
|
42
|
-
vi.mock('./utils.js', () =>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
vi.mock('./utils.js', async (importOriginal) => {
|
|
42
|
+
const actual = await importOriginal();
|
|
43
|
+
return {
|
|
44
|
+
...actual,
|
|
45
|
+
getExtensionManager: mockGetExtensionManager,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
46
48
|
vi.mock('prompts');
|
|
47
49
|
vi.mock('../../config/extensions/consent.js', () => ({
|
|
48
50
|
requestConsentNonInteractive: vi.fn(),
|
|
@@ -61,10 +63,6 @@ describe('extensions configure command', () => {
|
|
|
61
63
|
vi.spyOn(process, 'cwd').mockReturnValue(tempWorkspaceDir);
|
|
62
64
|
// Default behaviors
|
|
63
65
|
mockLoadSettings.mockReturnValue({ merged: {} });
|
|
64
|
-
mockGetExtensionAndManager.mockResolvedValue({
|
|
65
|
-
extension: null,
|
|
66
|
-
extensionManager: null,
|
|
67
|
-
});
|
|
68
66
|
mockGetExtensionManager.mockResolvedValue(mockExtensionManager);
|
|
69
67
|
ExtensionManager.mockImplementation(() => mockExtensionManager);
|
|
70
68
|
});
|
|
@@ -77,11 +75,6 @@ describe('extensions configure command', () => {
|
|
|
77
75
|
};
|
|
78
76
|
const setupExtension = (name, settings = [], id = 'test-id', path = '/test/path') => {
|
|
79
77
|
const extension = { name, path, id };
|
|
80
|
-
mockGetExtensionAndManager.mockImplementation(async (n) => {
|
|
81
|
-
if (n === name)
|
|
82
|
-
return { extension, extensionManager: mockExtensionManager };
|
|
83
|
-
return { extension: null, extensionManager: null };
|
|
84
|
-
});
|
|
85
78
|
mockExtensionManager.getExtensions.mockReturnValue([extension]);
|
|
86
79
|
mockExtensionManager.loadExtensionConfig.mockResolvedValue({
|
|
87
80
|
name,
|
|
@@ -96,13 +89,10 @@ describe('extensions configure command', () => {
|
|
|
96
89
|
]);
|
|
97
90
|
updateSetting.mockResolvedValue(undefined);
|
|
98
91
|
await runCommand('config test-ext TEST_VAR');
|
|
99
|
-
expect(updateSetting).toHaveBeenCalledWith(expect.objectContaining({ name: 'test-ext' }), 'test-id', 'TEST_VAR',
|
|
92
|
+
expect(updateSetting).toHaveBeenCalledWith(expect.objectContaining({ name: 'test-ext' }), 'test-id', 'TEST_VAR', expect.any(Function), 'user', tempWorkspaceDir);
|
|
100
93
|
});
|
|
101
94
|
it('should handle missing extension', async () => {
|
|
102
|
-
|
|
103
|
-
extension: null,
|
|
104
|
-
extensionManager: null,
|
|
105
|
-
});
|
|
95
|
+
mockExtensionManager.getExtensions.mockReturnValue([]);
|
|
106
96
|
await runCommand('config missing-ext TEST_VAR');
|
|
107
97
|
expect(updateSetting).not.toHaveBeenCalled();
|
|
108
98
|
});
|
|
@@ -121,7 +111,7 @@ describe('extensions configure command', () => {
|
|
|
121
111
|
updateSetting.mockResolvedValue(undefined);
|
|
122
112
|
await runCommand('config test-ext');
|
|
123
113
|
expect(debugLogger.log).toHaveBeenCalledWith('Configuring settings for "test-ext"...');
|
|
124
|
-
expect(updateSetting).toHaveBeenCalledWith(expect.objectContaining({ name: 'test-ext' }), 'test-id', 'VAR_1',
|
|
114
|
+
expect(updateSetting).toHaveBeenCalledWith(expect.objectContaining({ name: 'test-ext' }), 'test-id', 'VAR_1', expect.any(Function), 'user', tempWorkspaceDir);
|
|
125
115
|
});
|
|
126
116
|
it('should verify overwrite if setting is already set', async () => {
|
|
127
117
|
const settings = [{ name: 'Setting 1', envVar: 'VAR_1' }];
|
|
@@ -131,7 +121,7 @@ describe('extensions configure command', () => {
|
|
|
131
121
|
return { VAR_1: 'existing' };
|
|
132
122
|
return {};
|
|
133
123
|
});
|
|
134
|
-
prompts.mockResolvedValue({
|
|
124
|
+
prompts.mockResolvedValue({ confirm: true });
|
|
135
125
|
updateSetting.mockResolvedValue(undefined);
|
|
136
126
|
await runCommand('config test-ext');
|
|
137
127
|
expect(prompts).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -156,7 +146,7 @@ describe('extensions configure command', () => {
|
|
|
156
146
|
const settings = [{ name: 'Setting 1', envVar: 'VAR_1' }];
|
|
157
147
|
setupExtension('test-ext', settings);
|
|
158
148
|
getScopedEnvContents.mockResolvedValue({ VAR_1: 'existing' });
|
|
159
|
-
prompts.mockResolvedValue({
|
|
149
|
+
prompts.mockResolvedValue({ confirm: false });
|
|
160
150
|
await runCommand('config test-ext');
|
|
161
151
|
expect(prompts).toHaveBeenCalled();
|
|
162
152
|
expect(updateSetting).not.toHaveBeenCalled();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/configure.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAEV,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACL,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/configure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
6
7
|
import { debugLogger, } from '@google/gemini-cli-core';
|
|
7
8
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
8
9
|
import { INSTALL_WARNING_MESSAGE, requestConsentNonInteractive, } from '../../config/extensions/consent.js';
|
|
@@ -32,7 +33,7 @@ export async function handleLink(args) {
|
|
|
32
33
|
});
|
|
33
34
|
await extensionManager.loadExtensions();
|
|
34
35
|
const extension = await extensionManager.installOrUpdateExtension(installMetadata);
|
|
35
|
-
debugLogger.log(`Extension "${extension.name}" linked successfully and enabled.`);
|
|
36
|
+
debugLogger.log(chalk.green(`Extension "${extension.name}" linked successfully and enabled.`));
|
|
36
37
|
}
|
|
37
38
|
catch (error) {
|
|
38
39
|
debugLogger.error(getErrorMessage(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/commands/extensions/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,GAEZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB;IAChD,IAAI,CAAC;QACH,MAAM,eAAe,GAA6B;YAChD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM;SACb,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO;YACjC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,4BAA4B,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,WAAW,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACxD,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;YAC5C,YAAY;YACZ,cAAc;YACd,cAAc,EAAE,gBAAgB;YAChC,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM;SAC5C,CAAC,CAAC;QACH,MAAM,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACxC,MAAM,SAAS,GACb,MAAM,gBAAgB,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QACnE,WAAW,CAAC,GAAG,CACb,cAAc,SAAS,CAAC,IAAI,oCAAoC,CACjE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,gGAAgG;IAClG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,QAAQ,EACN,6FAA6F;QAC/F,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,UAAU,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;YAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAwB;SAChD,CAAC,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/commands/extensions/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,WAAW,GAEZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB;IAChD,IAAI,CAAC;QACH,MAAM,eAAe,GAA6B;YAChD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM;SACb,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO;YACjC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,4BAA4B,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,WAAW,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACxD,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;YAC5C,YAAY;YACZ,cAAc;YACd,cAAc,EAAE,gBAAgB;YAChC,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM;SAC5C,CAAC,CAAC;QACH,MAAM,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACxC,MAAM,SAAS,GACb,MAAM,gBAAgB,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QACnE,WAAW,CAAC,GAAG,CACb,KAAK,CAAC,KAAK,CACT,cAAc,SAAS,CAAC,IAAI,oCAAoC,CACjE,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,gGAAgG;IAClG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,QAAQ,EACN,6FAA6F;QAC/F,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,UAAU,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;YAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAwB;SAChD,CAAC,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { ExtensionManager } from '../../config/extension-manager.js';
|
|
7
7
|
import { type ResolvedExtensionSetting } from '@google/gemini-cli-core';
|
|
8
|
+
import type { ExtensionConfig } from '../../config/extension.js';
|
|
9
|
+
import { type ExtensionSetting, ExtensionSettingScope } from '../../config/extensions/extensionSettings.js';
|
|
10
|
+
export interface ConfigLogger {
|
|
11
|
+
log(message: string): void;
|
|
12
|
+
error(message: string): void;
|
|
13
|
+
}
|
|
14
|
+
export type RequestSettingCallback = (setting: ExtensionSetting) => Promise<string>;
|
|
15
|
+
export type RequestConfirmationCallback = (message: string) => Promise<boolean>;
|
|
8
16
|
export declare function getExtensionManager(): Promise<ExtensionManager>;
|
|
9
|
-
export declare function getExtensionAndManager(name: string): Promise<{
|
|
17
|
+
export declare function getExtensionAndManager(extensionManager: ExtensionManager, name: string, logger?: ConfigLogger): Promise<{
|
|
10
18
|
extension: null;
|
|
11
|
-
extensionManager: null;
|
|
12
19
|
} | {
|
|
13
20
|
extension: import("@google/gemini-cli-core").GeminiCLIExtension;
|
|
14
|
-
extensionManager: ExtensionManager;
|
|
15
21
|
}>;
|
|
22
|
+
export declare function configureSpecificSetting(extensionManager: ExtensionManager, extensionName: string, settingKey: string, scope: ExtensionSettingScope, logger?: ConfigLogger, requestSetting?: RequestSettingCallback): Promise<void>;
|
|
23
|
+
export declare function configureExtension(extensionManager: ExtensionManager, extensionName: string, scope: ExtensionSettingScope, logger?: ConfigLogger, requestSetting?: RequestSettingCallback, requestConfirmation?: RequestConfirmationCallback): Promise<void>;
|
|
24
|
+
export declare function configureAllExtensions(extensionManager: ExtensionManager, scope: ExtensionSettingScope, logger?: ConfigLogger, requestSetting?: RequestSettingCallback, requestConfirmation?: RequestConfirmationCallback): Promise<void>;
|
|
25
|
+
export declare function configureExtensionSettings(extensionConfig: ExtensionConfig, extensionId: string, scope: ExtensionSettingScope, logger?: ConfigLogger, requestSetting?: RequestSettingCallback, requestConfirmation?: RequestConfirmationCallback): Promise<void>;
|
|
16
26
|
export declare function getFormattedSettingValue(setting: ResolvedExtensionSetting): string;
|
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { ExtensionManager } from '../../config/extension-manager.js';
|
|
7
|
-
import { promptForSetting } from '../../config/extensions/extensionSettings.js';
|
|
8
7
|
import { loadSettings } from '../../config/settings.js';
|
|
9
8
|
import { requestConsentNonInteractive } from '../../config/extensions/consent.js';
|
|
10
9
|
import { debugLogger, } from '@google/gemini-cli-core';
|
|
10
|
+
import prompts from 'prompts';
|
|
11
|
+
import { promptForSetting, updateSetting, getScopedEnvContents, ExtensionSettingScope, } from '../../config/extensions/extensionSettings.js';
|
|
12
|
+
const defaultLogger = {
|
|
13
|
+
log: (message) => debugLogger.log(message),
|
|
14
|
+
error: (message) => debugLogger.error(message),
|
|
15
|
+
};
|
|
16
|
+
const defaultRequestSetting = async (setting) => promptForSetting(setting);
|
|
17
|
+
const defaultRequestConfirmation = async (message) => {
|
|
18
|
+
const response = await prompts({
|
|
19
|
+
type: 'confirm',
|
|
20
|
+
name: 'confirm',
|
|
21
|
+
message,
|
|
22
|
+
initial: false,
|
|
23
|
+
});
|
|
24
|
+
return response.confirm;
|
|
25
|
+
};
|
|
11
26
|
export async function getExtensionManager() {
|
|
12
27
|
const workspaceDir = process.cwd();
|
|
13
28
|
const extensionManager = new ExtensionManager({
|
|
@@ -19,16 +34,82 @@ export async function getExtensionManager() {
|
|
|
19
34
|
await extensionManager.loadExtensions();
|
|
20
35
|
return extensionManager;
|
|
21
36
|
}
|
|
22
|
-
export async function getExtensionAndManager(name) {
|
|
23
|
-
const extensionManager = await getExtensionManager();
|
|
37
|
+
export async function getExtensionAndManager(extensionManager, name, logger = defaultLogger) {
|
|
24
38
|
const extension = extensionManager
|
|
25
39
|
.getExtensions()
|
|
26
40
|
.find((ext) => ext.name === name);
|
|
27
41
|
if (!extension) {
|
|
28
|
-
|
|
29
|
-
return { extension: null
|
|
42
|
+
logger.error(`Extension "${name}" is not installed.`);
|
|
43
|
+
return { extension: null };
|
|
44
|
+
}
|
|
45
|
+
return { extension };
|
|
46
|
+
}
|
|
47
|
+
export async function configureSpecificSetting(extensionManager, extensionName, settingKey, scope, logger = defaultLogger, requestSetting = defaultRequestSetting) {
|
|
48
|
+
const { extension } = await getExtensionAndManager(extensionManager, extensionName, logger);
|
|
49
|
+
if (!extension) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
53
|
+
if (!extensionConfig) {
|
|
54
|
+
logger.error(`Could not find configuration for extension "${extensionName}".`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
await updateSetting(extensionConfig, extension.id, settingKey, requestSetting, scope, process.cwd());
|
|
58
|
+
logger.log(`Setting "${settingKey}" updated.`);
|
|
59
|
+
}
|
|
60
|
+
export async function configureExtension(extensionManager, extensionName, scope, logger = defaultLogger, requestSetting = defaultRequestSetting, requestConfirmation = defaultRequestConfirmation) {
|
|
61
|
+
const { extension } = await getExtensionAndManager(extensionManager, extensionName, logger);
|
|
62
|
+
if (!extension) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
66
|
+
if (!extensionConfig ||
|
|
67
|
+
!extensionConfig.settings ||
|
|
68
|
+
extensionConfig.settings.length === 0) {
|
|
69
|
+
logger.log(`Extension "${extensionName}" has no settings to configure.`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
logger.log(`Configuring settings for "${extensionName}"...`);
|
|
73
|
+
await configureExtensionSettings(extensionConfig, extension.id, scope, logger, requestSetting, requestConfirmation);
|
|
74
|
+
}
|
|
75
|
+
export async function configureAllExtensions(extensionManager, scope, logger = defaultLogger, requestSetting = defaultRequestSetting, requestConfirmation = defaultRequestConfirmation) {
|
|
76
|
+
const extensions = extensionManager.getExtensions();
|
|
77
|
+
if (extensions.length === 0) {
|
|
78
|
+
logger.log('No extensions installed.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
for (const extension of extensions) {
|
|
82
|
+
const extensionConfig = await extensionManager.loadExtensionConfig(extension.path);
|
|
83
|
+
if (extensionConfig &&
|
|
84
|
+
extensionConfig.settings &&
|
|
85
|
+
extensionConfig.settings.length > 0) {
|
|
86
|
+
logger.log(`\nConfiguring settings for "${extension.name}"...`);
|
|
87
|
+
await configureExtensionSettings(extensionConfig, extension.id, scope, logger, requestSetting, requestConfirmation);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function configureExtensionSettings(extensionConfig, extensionId, scope, logger = defaultLogger, requestSetting = defaultRequestSetting, requestConfirmation = defaultRequestConfirmation) {
|
|
92
|
+
const currentScopedSettings = await getScopedEnvContents(extensionConfig, extensionId, scope, process.cwd());
|
|
93
|
+
let workspaceSettings = {};
|
|
94
|
+
if (scope === ExtensionSettingScope.USER) {
|
|
95
|
+
workspaceSettings = await getScopedEnvContents(extensionConfig, extensionId, ExtensionSettingScope.WORKSPACE, process.cwd());
|
|
96
|
+
}
|
|
97
|
+
if (!extensionConfig.settings)
|
|
98
|
+
return;
|
|
99
|
+
for (const setting of extensionConfig.settings) {
|
|
100
|
+
const currentValue = currentScopedSettings[setting.envVar];
|
|
101
|
+
const workspaceValue = workspaceSettings[setting.envVar];
|
|
102
|
+
if (workspaceValue !== undefined) {
|
|
103
|
+
logger.log(`Note: Setting "${setting.name}" is already configured in the workspace scope.`);
|
|
104
|
+
}
|
|
105
|
+
if (currentValue !== undefined) {
|
|
106
|
+
const confirmed = await requestConfirmation(`Setting "${setting.name}" (${setting.envVar}) is already set. Overwrite?`);
|
|
107
|
+
if (!confirmed) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
await updateSetting(extensionConfig, extensionId, setting.envVar, requestSetting, scope, process.cwd());
|
|
30
112
|
}
|
|
31
|
-
return { extension, extensionManager };
|
|
32
113
|
}
|
|
33
114
|
export function getFormattedSettingValue(setting) {
|
|
34
115
|
if (!setting.value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/commands/extensions/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/commands/extensions/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandModule } from 'yargs';
|
|
7
|
+
interface LinkArgs {
|
|
8
|
+
path: string;
|
|
9
|
+
scope?: 'user' | 'workspace';
|
|
10
|
+
consent?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function handleLink(args: LinkArgs): Promise<void>;
|
|
13
|
+
export declare const linkCommand: CommandModule;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { debugLogger } from '@google/gemini-cli-core';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { getErrorMessage } from '../../utils/errors.js';
|
|
9
|
+
import { exitCli } from '../utils.js';
|
|
10
|
+
import { requestConsentNonInteractive, skillsConsentString, } from '../../config/extensions/consent.js';
|
|
11
|
+
import { linkSkill } from '../../utils/skillUtils.js';
|
|
12
|
+
export async function handleLink(args) {
|
|
13
|
+
try {
|
|
14
|
+
const { scope = 'user', consent } = args;
|
|
15
|
+
await linkSkill(args.path, scope, (msg) => debugLogger.log(msg), async (skills, targetDir) => {
|
|
16
|
+
const consentString = await skillsConsentString(skills, args.path, targetDir, true);
|
|
17
|
+
if (consent) {
|
|
18
|
+
debugLogger.log('You have consented to the following:');
|
|
19
|
+
debugLogger.log(consentString);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return requestConsentNonInteractive(consentString);
|
|
23
|
+
});
|
|
24
|
+
debugLogger.log(chalk.green('\nSuccessfully linked skills.'));
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
debugLogger.error(getErrorMessage(error));
|
|
28
|
+
await exitCli(1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const linkCommand = {
|
|
32
|
+
command: 'link <path>',
|
|
33
|
+
describe: 'Links an agent skill from a local path. Updates to the source will be reflected immediately.',
|
|
34
|
+
builder: (yargs) => yargs
|
|
35
|
+
.positional('path', {
|
|
36
|
+
describe: 'The local path of the skill to link.',
|
|
37
|
+
type: 'string',
|
|
38
|
+
demandOption: true,
|
|
39
|
+
})
|
|
40
|
+
.option('scope', {
|
|
41
|
+
describe: 'The scope to link the skill into. Defaults to "user" (global).',
|
|
42
|
+
choices: ['user', 'workspace'],
|
|
43
|
+
default: 'user',
|
|
44
|
+
})
|
|
45
|
+
.option('consent', {
|
|
46
|
+
describe: 'Acknowledge the security risks of linking a skill and skip the confirmation prompt.',
|
|
47
|
+
type: 'boolean',
|
|
48
|
+
default: false,
|
|
49
|
+
})
|
|
50
|
+
.check((argv) => {
|
|
51
|
+
if (!argv.path) {
|
|
52
|
+
throw new Error('The path argument must be provided.');
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}),
|
|
56
|
+
handler: async (argv) => {
|
|
57
|
+
await handleLink({
|
|
58
|
+
path: argv['path'],
|
|
59
|
+
scope: argv['scope'],
|
|
60
|
+
consent: argv['consent'],
|
|
61
|
+
});
|
|
62
|
+
await exitCli();
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/commands/skills/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAQtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzC,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,EACT,KAAK,EACL,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAC7B,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;YAC1B,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAC7C,MAAM,EACN,IAAI,CAAC,IAAI,EACT,SAAS,EACT,IAAI,CACL,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBACxD,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,4BAA4B,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC,CACF,CAAC;QAEF,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,8FAA8F;IAChG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,sCAAsC;QAChD,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,QAAQ,EACN,gEAAgE;QAClE,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;QAC9B,OAAO,EAAE,MAAM;KAChB,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,QAAQ,EACN,qFAAqF;QACvF,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC;SACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,UAAU,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;YAC5B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAyB;YAC5C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAwB;SAChD,CAAC,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { handleLink, linkCommand } from './link.js';
|
|
8
|
+
const mockLinkSkill = vi.hoisted(() => vi.fn());
|
|
9
|
+
const mockRequestConsentNonInteractive = vi.hoisted(() => vi.fn());
|
|
10
|
+
const mockSkillsConsentString = vi.hoisted(() => vi.fn());
|
|
11
|
+
vi.mock('../../utils/skillUtils.js', () => ({
|
|
12
|
+
linkSkill: mockLinkSkill,
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('@google/gemini-cli-core', () => ({
|
|
15
|
+
debugLogger: { log: vi.fn(), error: vi.fn() },
|
|
16
|
+
}));
|
|
17
|
+
vi.mock('../../config/extensions/consent.js', () => ({
|
|
18
|
+
requestConsentNonInteractive: mockRequestConsentNonInteractive,
|
|
19
|
+
skillsConsentString: mockSkillsConsentString,
|
|
20
|
+
}));
|
|
21
|
+
import { debugLogger } from '@google/gemini-cli-core';
|
|
22
|
+
describe('skills link command', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
vi.clearAllMocks();
|
|
25
|
+
vi.spyOn(process, 'exit').mockImplementation(() => undefined);
|
|
26
|
+
});
|
|
27
|
+
describe('linkCommand', () => {
|
|
28
|
+
it('should have correct command and describe', () => {
|
|
29
|
+
expect(linkCommand.command).toBe('link <path>');
|
|
30
|
+
expect(linkCommand.describe).toContain('Links an agent skill');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it('should call linkSkill with correct arguments', async () => {
|
|
34
|
+
const sourcePath = '/source/path';
|
|
35
|
+
mockLinkSkill.mockResolvedValue([
|
|
36
|
+
{ name: 'test-skill', location: '/dest/path' },
|
|
37
|
+
]);
|
|
38
|
+
await handleLink({ path: sourcePath, scope: 'user' });
|
|
39
|
+
expect(mockLinkSkill).toHaveBeenCalledWith(sourcePath, 'user', expect.any(Function), expect.any(Function));
|
|
40
|
+
expect(debugLogger.log).toHaveBeenCalledWith(expect.stringContaining('Successfully linked skills'));
|
|
41
|
+
});
|
|
42
|
+
it('should handle linkSkill failure', async () => {
|
|
43
|
+
mockLinkSkill.mockRejectedValue(new Error('Link failed'));
|
|
44
|
+
await handleLink({ path: '/some/path' });
|
|
45
|
+
expect(debugLogger.error).toHaveBeenCalledWith('Link failed');
|
|
46
|
+
expect(process.exit).toHaveBeenCalledWith(1);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=link.test.js.map
|