Skip to content

Commit bdf80ea

Browse files
chrstnbjacob314
andauthored
fix(cli): Prevent stdout/stderr patching for extension commands (#13600)
Co-authored-by: jacob314 <[email protected]>
1 parent 5e218a5 commit bdf80ea

30 files changed

+83
-14
lines changed

packages/cli/src/commands/extensions.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ import { enableCommand } from './extensions/enable.js';
1414
import { linkCommand } from './extensions/link.js';
1515
import { newCommand } from './extensions/new.js';
1616
import { validateCommand } from './extensions/validate.js';
17+
import { initializeOutputListenersAndFlush } from '../gemini.js';
1718

1819
export const extensionsCommand: CommandModule = {
1920
command: 'extensions <command>',
2021
aliases: ['extension'],
2122
describe: 'Manage Gemini CLI extensions.',
2223
builder: (yargs) =>
2324
yargs
25+
.middleware(() => initializeOutputListenersAndFlush())
2426
.command(installCommand)
2527
.command(uninstallCommand)
2628
.command(listCommand)

packages/cli/src/commands/extensions/disable.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ vi.mock('../../config/extensions/consent.js', () => ({
5656
vi.mock('../../config/extensions/extensionSettings.js', () => ({
5757
promptForSetting: vi.fn(),
5858
}));
59+
vi.mock('../utils.js', () => ({
60+
exitCli: vi.fn(),
61+
}));
5962

6063
describe('extensions disable command', () => {
6164
const mockLoadSettings = vi.mocked(loadSettings);

packages/cli/src/commands/extensions/disable.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { debugLogger } from '@google/gemini-cli-core';
1111
import { ExtensionManager } from '../../config/extension-manager.js';
1212
import { requestConsentNonInteractive } from '../../config/extensions/consent.js';
1313
import { promptForSetting } from '../../config/extensions/extensionSettings.js';
14+
import { exitCli } from '../utils.js';
1415

1516
interface DisableArgs {
1617
name: string;
@@ -81,5 +82,6 @@ export const disableCommand: CommandModule = {
8182
name: argv['name'] as string,
8283
scope: argv['scope'] as string,
8384
});
85+
await exitCli();
8486
},
8587
};

packages/cli/src/commands/extensions/enable.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ vi.mock('../../config/extension-manager.js');
5858
vi.mock('../../config/settings.js');
5959
vi.mock('../../config/extensions/consent.js');
6060
vi.mock('../../config/extensions/extensionSettings.js');
61+
vi.mock('../utils.js', () => ({
62+
exitCli: vi.fn(),
63+
}));
6164

6265
describe('extensions enable command', () => {
6366
const mockLoadSettings = vi.mocked(loadSettings);

packages/cli/src/commands/extensions/enable.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getErrorMessage,
1515
} from '@google/gemini-cli-core';
1616
import { promptForSetting } from '../../config/extensions/extensionSettings.js';
17+
import { exitCli } from '../utils.js';
1718

1819
interface EnableArgs {
1920
name: string;
@@ -86,5 +87,6 @@ export const enableCommand: CommandModule = {
8687
name: argv['name'] as string,
8788
scope: argv['scope'] as string,
8889
});
90+
await exitCli();
8991
},
9092
};

packages/cli/src/commands/extensions/install.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ vi.mock('node:fs/promises', () => ({
4848
},
4949
}));
5050

51+
vi.mock('../utils.js', () => ({
52+
exitCli: vi.fn(),
53+
}));
54+
5155
describe('extensions install command', () => {
5256
it('should fail if no source is provided', () => {
5357
const validationParser = yargs([]).command(installCommand).fail(false);

packages/cli/src/commands/extensions/install.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
import { ExtensionManager } from '../../config/extension-manager.js';
1919
import { loadSettings } from '../../config/settings.js';
2020
import { promptForSetting } from '../../config/extensions/extensionSettings.js';
21+
import { exitCli } from '../utils.js';
2122

2223
interface InstallArgs {
2324
source: string;
@@ -130,5 +131,6 @@ export const installCommand: CommandModule = {
130131
allowPreRelease: argv['pre-release'] as boolean | undefined,
131132
consent: argv['consent'] as boolean | undefined,
132133
});
134+
await exitCli();
133135
},
134136
};

packages/cli/src/commands/extensions/link.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ vi.mock('../../config/extensions/consent.js', () => ({
5252
vi.mock('../../config/extensions/extensionSettings.js', () => ({
5353
promptForSetting: vi.fn(),
5454
}));
55+
vi.mock('../utils.js', () => ({
56+
exitCli: vi.fn(),
57+
}));
5558

5659
describe('extensions link command', () => {
5760
const mockLoadSettings = vi.mocked(loadSettings);

packages/cli/src/commands/extensions/link.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { requestConsentNonInteractive } from '../../config/extensions/consent.js
1515
import { ExtensionManager } from '../../config/extension-manager.js';
1616
import { loadSettings } from '../../config/settings.js';
1717
import { promptForSetting } from '../../config/extensions/extensionSettings.js';
18+
import { exitCli } from '../utils.js';
1819

1920
interface InstallArgs {
2021
path: string;
@@ -60,5 +61,6 @@ export const linkCommand: CommandModule = {
6061
await handleLink({
6162
path: argv['path'] as string,
6263
});
64+
await exitCli();
6365
},
6466
};

packages/cli/src/commands/extensions/list.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ vi.mock('../../config/extensions/consent.js', () => ({
4444
vi.mock('../../config/extensions/extensionSettings.js', () => ({
4545
promptForSetting: vi.fn(),
4646
}));
47+
vi.mock('../utils.js', () => ({
48+
exitCli: vi.fn(),
49+
}));
4750

4851
describe('extensions list command', () => {
4952
const mockLoadSettings = vi.mocked(loadSettings);

0 commit comments

Comments
 (0)