diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 93537565..f2107d55 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- `--no-extensions` flag to disable extension discovery and loading + ## [0.37.8] - 2026-01-07 ## [0.37.7] - 2026-01-07 diff --git a/packages/coding-agent/src/cli/args.ts b/packages/coding-agent/src/cli/args.ts index cbb11a79..e8da9a08 100644 --- a/packages/coding-agent/src/cli/args.ts +++ b/packages/coding-agent/src/cli/args.ts @@ -27,6 +27,7 @@ export interface Args { models?: string[]; tools?: ToolName[]; extensions?: string[]; + noExtensions?: boolean; print?: boolean; export?: string; noSkills?: boolean; @@ -116,6 +117,8 @@ export function parseArgs(args: string[], extensionFlags?: Map Set thinking level: off, minimal, low, medium, high, xhigh --extension, -e Load an extension file (can be used multiple times) + --no-extensions Disable extensions discovery and loading --no-skills Disable skills discovery and loading --skills Comma-separated glob patterns to filter skills (e.g., git-*,docker) --export Export session file to HTML and exit diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index da8d0e6c..d6f2ae9b 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -294,8 +294,11 @@ function buildSessionOptions( options.skills = []; } - // Pre-loaded extensions (from early CLI flag discovery) - if (preloadedExtensions && preloadedExtensions.length > 0) { + // Extensions + if (parsed.noExtensions) { + options.extensions = []; + } else if (preloadedExtensions && preloadedExtensions.length > 0) { + // Pre-loaded extensions (from early CLI flag discovery) options.preloadedExtensions = preloadedExtensions; } @@ -317,16 +320,21 @@ export async function main(args: string[]) { const firstPass = parseArgs(args); time("parseArgs-firstPass"); - // Early load extensions to discover their CLI flags + // Early load extensions to discover their CLI flags (unless --no-extensions) const cwd = process.cwd(); const agentDir = getAgentDir(); const eventBus = createEventBus(); const settingsManager = SettingsManager.create(cwd); time("SettingsManager.create"); - // Merge CLI --extension args with settings.json extensions - const extensionPaths = [...settingsManager.getExtensionPaths(), ...(firstPass.extensions ?? [])]; - const { extensions: loadedExtensions } = await discoverAndLoadExtensions(extensionPaths, cwd, agentDir, eventBus); - time("discoverExtensionFlags"); + + let loadedExtensions: LoadedExtension[] = []; + if (!firstPass.noExtensions) { + // Merge CLI --extension args with settings.json extensions + const extensionPaths = [...settingsManager.getExtensionPaths(), ...(firstPass.extensions ?? [])]; + const result = await discoverAndLoadExtensions(extensionPaths, cwd, agentDir, eventBus); + loadedExtensions = result.extensions; + time("discoverExtensionFlags"); + } // Collect all extension flags const extensionFlags = new Map(); diff --git a/packages/coding-agent/test/args.test.ts b/packages/coding-agent/test/args.test.ts index 9f809a51..2b3a8af6 100644 --- a/packages/coding-agent/test/args.test.ts +++ b/packages/coding-agent/test/args.test.ts @@ -150,6 +150,20 @@ describe("parseArgs", () => { }); }); + describe("--no-extensions flag", () => { + test("parses --no-extensions flag", () => { + const result = parseArgs(["--no-extensions"]); + expect(result.noExtensions).toBe(true); + }); + }); + + describe("--no-skills flag", () => { + test("parses --no-skills flag", () => { + const result = parseArgs(["--no-skills"]); + expect(result.noSkills).toBe(true); + }); + }); + describe("messages and file args", () => { test("parses plain text messages", () => { const result = parseArgs(["hello", "world"]);