mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-11 14:40:52 -07:00
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2026 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { SettingScope } from '../config/settings.js';
|
|
import type { HookActionResult } from './hookSettings.js';
|
|
|
|
/**
|
|
* Shared logic for building the core hook action message while allowing the
|
|
* caller to control how each scope and its path are rendered (e.g., bolding or
|
|
* dimming).
|
|
*/
|
|
export function renderHookActionFeedback(
|
|
result: HookActionResult,
|
|
formatScope: (label: string, path: string) => string,
|
|
): string {
|
|
const { hookName, action, status, error } = result;
|
|
|
|
if (status === 'error') {
|
|
return (
|
|
error ||
|
|
`An error occurred while attempting to ${action} hook "${hookName}".`
|
|
);
|
|
}
|
|
|
|
if (status === 'no-op') {
|
|
return `Hook "${hookName}" is already ${action === 'enable' ? 'enabled' : 'disabled'}.`;
|
|
}
|
|
|
|
const isEnable = action === 'enable';
|
|
const actionVerb = isEnable ? 'enabled' : 'disabled';
|
|
const preposition = isEnable
|
|
? 'by removing it from the disabled list in'
|
|
: 'by adding it to the disabled list in';
|
|
|
|
const formatScopeItem = (s: { scope: SettingScope; path: string }) => {
|
|
const label =
|
|
s.scope === SettingScope.Workspace ? 'workspace' : s.scope.toLowerCase();
|
|
return formatScope(label, s.path);
|
|
};
|
|
|
|
const totalAffectedScopes = [
|
|
...result.modifiedScopes,
|
|
...result.alreadyInStateScopes,
|
|
];
|
|
|
|
if (totalAffectedScopes.length === 0) {
|
|
// This case should ideally not happen, but as a safeguard, return a generic message.
|
|
return `Hook "${hookName}" ${actionVerb}.`;
|
|
}
|
|
|
|
if (totalAffectedScopes.length === 2) {
|
|
const s1 = formatScopeItem(totalAffectedScopes[0]);
|
|
const s2 = formatScopeItem(totalAffectedScopes[1]);
|
|
|
|
if (isEnable) {
|
|
return `Hook "${hookName}" ${actionVerb} ${preposition} ${s1} and ${s2} settings.`;
|
|
} else {
|
|
return `Hook "${hookName}" is now disabled in both ${s1} and ${s2} settings.`;
|
|
}
|
|
}
|
|
|
|
const s = formatScopeItem(totalAffectedScopes[0]);
|
|
return `Hook "${hookName}" ${actionVerb} ${preposition} ${s} settings.`;
|
|
}
|