fix(hooks): enable /hooks disable to reliably stop single hooks (#16804)

This commit is contained in:
Abhi
2026-01-16 19:28:36 -05:00
committed by GitHub
parent ee8d425603
commit 1998a713e2
4 changed files with 97 additions and 59 deletions

View File

@@ -22,6 +22,7 @@ describe('hooksCommand', () => {
let mockConfig: {
getHookSystem: ReturnType<typeof vi.fn>;
getEnableHooks: ReturnType<typeof vi.fn>;
updateDisabledHooks: ReturnType<typeof vi.fn>;
};
let mockSettings: {
merged: {
@@ -51,6 +52,7 @@ describe('hooksCommand', () => {
mockConfig = {
getHookSystem: vi.fn().mockReturnValue(mockHookSystem),
getEnableHooks: vi.fn().mockReturnValue(true),
updateDisabledHooks: vi.fn(),
};
// Create mock settings
@@ -429,7 +431,7 @@ describe('hooksCommand', () => {
});
});
it('should return info when hook is already disabled', async () => {
it('should synchronize with hook system even if hook is already in disabled list', async () => {
// Update the context's settings with the hook already disabled
mockContext.services.settings.merged.hooks.disabled = ['test-hook'];
@@ -443,11 +445,15 @@ describe('hooksCommand', () => {
const result = await disableCmd.action(mockContext, 'test-hook');
expect(mockContext.services.settings.setValue).not.toHaveBeenCalled();
expect(mockHookSystem.setHookEnabled).not.toHaveBeenCalled();
expect(mockHookSystem.setHookEnabled).toHaveBeenCalledWith(
'test-hook',
false,
);
expect(mockConfig.updateDisabledHooks).toHaveBeenCalled();
expect(result).toEqual({
type: 'message',
messageType: 'info',
content: 'Hook "test-hook" is already disabled.',
content: 'Hook "test-hook" disabled successfully.',
});
});

View File

@@ -89,6 +89,9 @@ async function enableAction(
: SettingScope.User;
settings.setValue(scope, 'hooks.disabled', newDisabledHooks);
// Update core config so re-initialization (e.g. extension reload) respects the change
config.updateDisabledHooks(settings.merged.hooks.disabled);
// Enable in hook system
hookSystem.setHookEnabled(hookName, true);
@@ -144,36 +147,32 @@ async function disableAction(
const settings = context.services.settings;
const disabledHooks = settings.merged.hooks.disabled;
// Add to disabled list if not already present
if (!disabledHooks.includes(hookName)) {
const newDisabledHooks = [...disabledHooks, hookName];
try {
if (!disabledHooks.includes(hookName)) {
const newDisabledHooks = [...disabledHooks, hookName];
// Update settings (setValue automatically saves)
try {
const scope = settings.workspace
? SettingScope.Workspace
: SettingScope.User;
settings.setValue(scope, 'hooks.disabled', newDisabledHooks);
// Disable in hook system
hookSystem.setHookEnabled(hookName, false);
return {
type: 'message',
messageType: 'info',
content: `Hook "${hookName}" disabled successfully.`,
};
} catch (error) {
return {
type: 'message',
messageType: 'error',
content: `Failed to disable hook: ${getErrorMessage(error)}`,
};
}
} else {
// Update core config so re-initialization (e.g. extension reload) respects the change
config.updateDisabledHooks(settings.merged.hooks.disabled);
// Always disable in hook system to ensure in-memory state matches settings
hookSystem.setHookEnabled(hookName, false);
return {
type: 'message',
messageType: 'info',
content: `Hook "${hookName}" is already disabled.`,
content: `Hook "${hookName}" disabled successfully.`,
};
} catch (error) {
return {
type: 'message',
messageType: 'error',
content: `Failed to disable hook: ${getErrorMessage(error)}`,
};
}
}
@@ -253,6 +252,9 @@ async function enableAllAction(
: SettingScope.User;
settings.setValue(scope, 'hooks.disabled', []);
// Update core config so re-initialization (e.g. extension reload) respects the change
config.updateDisabledHooks(settings.merged.hooks.disabled);
for (const hook of disabledHooks) {
const hookName = getHookDisplayName(hook);
hookSystem.setHookEnabled(hookName, true);
@@ -323,6 +325,9 @@ async function disableAllAction(
: SettingScope.User;
settings.setValue(scope, 'hooks.disabled', allHookNames);
// Update core config so re-initialization (e.g. extension reload) respects the change
config.updateDisabledHooks(settings.merged.hooks.disabled);
for (const hook of enabledHooks) {
const hookName = getHookDisplayName(hook);
hookSystem.setHookEnabled(hookName, false);