From 3e08186d3ec0fec6b4ea2320aea744791698ff0c Mon Sep 17 00:00:00 2001 From: can1357 Date: Sun, 15 Mar 2026 17:04:08 +0100 Subject: [PATCH] feat(coding-agent): added disabledExtensions setting to filter skills Fixes #413 --- packages/coding-agent/CHANGELOG.md | 4 ++++ packages/coding-agent/src/config/settings-schema.ts | 1 + packages/coding-agent/src/extensibility/skills.ts | 5 +++++ packages/coding-agent/src/sdk.ts | 7 ++++++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index c855b7661..906b7bc6e 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog ## [Unreleased] +### Added + +- Added `disabledExtensions` setting to allow disabling specific extensions and skills by ID +- Added support for filtering skills by disabled extension IDs with `skill:` prefix ## [13.12.1] - 2026-03-15 ### Added diff --git a/packages/coding-agent/src/config/settings-schema.ts b/packages/coding-agent/src/config/settings-schema.ts index d81ded9d0..08db2fcfa 100644 --- a/packages/coding-agent/src/config/settings-schema.ts +++ b/packages/coding-agent/src/config/settings-schema.ts @@ -1574,6 +1574,7 @@ export interface SkillsSettings { customDirectories?: string[]; ignoredSkills?: string[]; includeSkills?: string[]; + disabledExtensions?: string[]; } export interface CommitSettings { diff --git a/packages/coding-agent/src/extensibility/skills.ts b/packages/coding-agent/src/extensibility/skills.ts index 7309b04dc..d9f865ab1 100644 --- a/packages/coding-agent/src/extensibility/skills.ts +++ b/packages/coding-agent/src/extensibility/skills.ts @@ -83,6 +83,7 @@ export async function loadSkills(options: LoadSkillsOptions = {}): Promise new Bun.Glob(pattern).match(name)); } + const disabledSkillNames = new Set( + (disabledExtensions ?? []).filter(id => id.startsWith("skill:")).map(id => id.slice(6)), + ); // Filter skills by source and patterns first const filteredSkills = result.items.filter(capSkill => { + if (disabledSkillNames.has(capSkill.name)) return false; if (!isSourceEnabled(capSkill._source)) return false; if (matchesIgnorePatterns(capSkill.name)) return false; if (!matchesIncludePatterns(capSkill.name)) return false; diff --git a/packages/coding-agent/src/sdk.ts b/packages/coding-agent/src/sdk.ts index 8fe8b5832..57c84c2a9 100644 --- a/packages/coding-agent/src/sdk.ts +++ b/packages/coding-agent/src/sdk.ts @@ -627,8 +627,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} modelRegistry.refreshInBackground(); } const skillsSettings = settings.getGroup("skills") as SkillsSettings; + const disabledExtensionIds = settings.get("disabledExtensions") ?? []; const discoveredSkillsPromise = - options.skills === undefined ? discoverSkills(cwd, agentDir, skillsSettings) : undefined; + options.skills === undefined + ? discoverSkills(cwd, agentDir, { ...skillsSettings, disabledExtensions: disabledExtensionIds }) + : undefined; // Initialize provider preferences from settings const webSearchProvider = settings.get("providers.webSearch"); @@ -1006,12 +1009,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} ...(options.additionalExtensionPaths ?? []), ...((settings.get("extensions") as string[]) ?? []), ]; + const disabledExtensionIds = settings.get("disabledExtensions") ?? []; extensionsResult = await logger.timeAsync( "discoverAndLoadExtensions", discoverAndLoadExtensions, configuredPaths, cwd, eventBus, + disabledExtensionIds, ); for (const { path, error } of extensionsResult.errors) { logger.error("Failed to load extension", { path, error });