agent-switchboard 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +45 -0
  2. package/dist/config/mcp-config.d.ts +2 -3
  3. package/dist/config/mcp-config.js +2 -14
  4. package/dist/config/mcp-config.js.map +1 -1
  5. package/dist/hooks/distribution.d.ts +3 -1
  6. package/dist/hooks/distribution.js +4 -1
  7. package/dist/hooks/distribution.js.map +1 -1
  8. package/dist/index.js +130 -18
  9. package/dist/index.js.map +1 -1
  10. package/dist/library/distribute-bundle.js +79 -17
  11. package/dist/library/distribute-bundle.js.map +1 -1
  12. package/dist/library/distribute.js +34 -12
  13. package/dist/library/distribute.js.map +1 -1
  14. package/dist/manifest/store.d.ts +4 -0
  15. package/dist/manifest/store.js +49 -0
  16. package/dist/manifest/store.js.map +1 -1
  17. package/dist/mcp/distribution.js +104 -40
  18. package/dist/mcp/distribution.js.map +1 -1
  19. package/dist/rules/block-merge.d.ts +0 -7
  20. package/dist/rules/block-merge.js +2 -1
  21. package/dist/rules/block-merge.js.map +1 -1
  22. package/dist/rules/distribution.js +12 -1
  23. package/dist/rules/distribution.js.map +1 -1
  24. package/dist/sync/command.js +1 -1
  25. package/dist/sync/command.js.map +1 -1
  26. package/dist/targets/builtin/claude-code.js +3 -1
  27. package/dist/targets/builtin/claude-code.js.map +1 -1
  28. package/dist/targets/builtin/common.d.ts +4 -1
  29. package/dist/targets/builtin/common.js +11 -1
  30. package/dist/targets/builtin/common.js.map +1 -1
  31. package/dist/targets/builtin/opencode.js +3 -1
  32. package/dist/targets/builtin/opencode.js.map +1 -1
  33. package/dist/ui/library-selector.js +9 -6
  34. package/dist/ui/library-selector.js.map +1 -1
  35. package/dist/ui/mcp-ui.d.ts +2 -0
  36. package/dist/ui/mcp-ui.js +4 -4
  37. package/dist/ui/mcp-ui.js.map +1 -1
  38. package/dist/ui/rule-ui.js +4 -4
  39. package/dist/ui/rule-ui.js.map +1 -1
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -183,6 +183,41 @@ asb agent -p team --project /path/to/repo # both
183
183
 
184
184
  When `--project` is used, outputs target the project directory (e.g. `<project>/AGENTS.md`, `<project>/.claude/commands/`).
185
185
 
186
+ Interactive selectors follow the writable layer you target:
187
+
188
+ - User scope shows and edits the merged user selection.
189
+ - `-p/--profile` shows only that profile layer's explicit selection.
190
+ - `-P/--project` shows only that project layer's explicit selection.
191
+
192
+ Inherited entries from higher-priority layers do not participate in scoped sync until you write them into that profile or project layer. Saving an empty scoped selection creates an explicit empty override for that layer.
193
+
194
+ ### Project Distribution Modes
195
+
196
+ Project-scoped sync supports three modes under `[distribution.project]`:
197
+
198
+ ```toml
199
+ [distribution.project]
200
+ mode = "managed" # or: "exclusive", "none"
201
+ collision = "warn-skip" # managed only: "warn-skip", "error", "takeover"
202
+
203
+ [distribution.project.rules]
204
+ placement = "prepend" # or: "append"
205
+ ```
206
+
207
+ | Mode | Behavior |
208
+ |:------------|:---------|
209
+ | `exclusive` | ASB writes project-scoped outputs directly and cleans up inactive entries in target directories. |
210
+ | `managed` | Default. Uses a manifest at `<project>/.asb/state/distribution.json` so cleanup only removes files and directories previously written by ASB. Shared rule files use block merge instead of full replacement. |
211
+ | `none` | Disables all project-scoped writes. Selections can still be edited in `.asb.toml`, but project distribution commands and `asb sync -P <project>` skip output generation. |
212
+
213
+ Managed-mode collision policy controls what happens when ASB encounters a foreign file or directory at a target path:
214
+
215
+ | Policy | Behavior |
216
+ |:------------|:---------|
217
+ | `warn-skip` | Report a conflict and leave the foreign path untouched. |
218
+ | `error` | Report a hard error and fail the affected distribution step. |
219
+ | `takeover` | Treat the path as ASB-managed and overwrite it. |
220
+
186
221
  ## Libraries
187
222
 
188
223
  All library types follow the same pattern:
@@ -345,8 +380,12 @@ asb plugin list # show all discovered plugins
345
380
  asb plugin info context7 # show plugin details + components
346
381
  ```
347
382
 
383
+ Discovered plugin MCP servers appear in the MCP picker alongside locally-defined servers and can be enabled per user, profile, or project scope.
384
+
348
385
  Enabled plugin components are expanded into entry-level `enabled` arrays during `asb sync`. Components appear with a namespace prefix (e.g. `context7:docs-researcher`) and can be individually controlled via per-application overrides.
349
386
 
387
+ Plugin MCP servers are also addressable directly through `[mcp].enabled` and the `asb mcp` selector. As long as the plugin source is discoverable, a plugin MCP server can be enabled directly without adding its parent plugin to `[plugins].enabled`.
388
+
350
389
  ## Sync
351
390
 
352
391
  Push all libraries and MCP config to every active application in one step:
@@ -357,6 +396,12 @@ asb sync [-p <profile>] [-P <path>]
357
396
 
358
397
  This merges layered config, applies per-application overrides, and writes target files in place. Files are only rewritten when content changes.
359
398
 
399
+ For project scope, sync honors `[distribution.project].mode`:
400
+
401
+ - `managed` keeps a manifest and cleans up only ASB-owned project outputs
402
+ - `exclusive` writes directly to the project targets
403
+ - `none` skips project writes entirely
404
+
360
405
  ## Environment
361
406
 
362
407
  | Variable | Default | Purpose |
@@ -3,7 +3,7 @@
3
3
  * mcp.json contains server definitions only; enabled state is in config.toml
4
4
  */
5
5
  import { type McpConfig } from './schemas.js';
6
- import { type ConfigScope } from './scope.js';
6
+ import type { ConfigScope } from './scope.js';
7
7
  /**
8
8
  * Loads the MCP configuration from ~/.agent-switchboard/mcp.json
9
9
  * Parses JSONC (JSON with comments) format
@@ -14,8 +14,7 @@ import { type ConfigScope } from './scope.js';
14
14
  */
15
15
  export declare function loadMcpConfig(): McpConfig;
16
16
  /**
17
- * Loads MCP server definitions from both ~/.asb/mcp.json and enabled plugins.
18
- * Only includes plugin MCP servers whose parent plugin is enabled in `plugins.enabled`.
17
+ * Loads MCP server definitions from both ~/.asb/mcp.json and discovered plugins.
19
18
  * Plugin-sourced servers use namespaced IDs (e.g. "context7:context7").
20
19
  * If a plugin server ID collides with a user-defined server, the user definition wins.
21
20
  */
@@ -8,8 +8,6 @@ import { parse } from 'jsonc-parser';
8
8
  import { buildPluginIndex } from '../plugins/index.js';
9
9
  import { getMcpConfigPath } from './paths.js';
10
10
  import { mcpConfigSchema } from './schemas.js';
11
- import { scopeToLayerOptions } from './scope.js';
12
- import { loadSwitchboardConfig } from './switchboard-config.js';
13
11
  /**
14
12
  * Loads the MCP configuration from ~/.agent-switchboard/mcp.json
15
13
  * Parses JSONC (JSON with comments) format
@@ -52,8 +50,7 @@ export function loadMcpConfig() {
52
50
  }
53
51
  }
54
52
  /**
55
- * Loads MCP server definitions from both ~/.asb/mcp.json and enabled plugins.
56
- * Only includes plugin MCP servers whose parent plugin is enabled in `plugins.enabled`.
53
+ * Loads MCP server definitions from both ~/.asb/mcp.json and discovered plugins.
57
54
  * Plugin-sourced servers use namespaced IDs (e.g. "context7:context7").
58
55
  * If a plugin server ID collides with a user-defined server, the user definition wins.
59
56
  */
@@ -62,18 +59,9 @@ export function loadMcpConfigWithPlugins(scope) {
62
59
  const pluginIndex = buildPluginIndex(scope);
63
60
  if (pluginIndex.mcpServers.length === 0)
64
61
  return base;
65
- const config = loadSwitchboardConfig(scopeToLayerOptions(scope));
66
- // Resolve enabled plugin refs to descriptor IDs via PluginIndex.get(),
67
- // which handles both bare names and name@source disambiguation.
68
- const enabledPluginIds = new Set();
69
- for (const ref of config.plugins.enabled) {
70
- const descriptor = pluginIndex.get(ref);
71
- if (descriptor)
72
- enabledPluginIds.add(descriptor.id);
73
- }
74
62
  const merged = { ...base.mcpServers };
75
63
  for (const ps of pluginIndex.mcpServers) {
76
- if (!(ps.serverId in merged) && enabledPluginIds.has(ps.pluginId)) {
64
+ if (!(ps.serverId in merged)) {
77
65
  merged[ps.serverId] = ps.server;
78
66
  }
79
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/config/mcp-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/config/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -24,4 +24,6 @@ export interface HookDistributionOutcome {
24
24
  * 2. Merge all active hook configs into settings.json
25
25
  * 3. Clean up orphan bundle directories
26
26
  */
27
- export declare function distributeHooks(scope?: ConfigScope, activeAppIds?: string[], assumeInstalled?: ReadonlySet<string>): HookDistributionOutcome;
27
+ export declare function distributeHooks(scope?: ConfigScope, activeAppIds?: string[], assumeInstalled?: ReadonlySet<string>, options?: {
28
+ projectMode?: 'managed' | 'exclusive' | 'none';
29
+ }): HookDistributionOutcome;
@@ -180,7 +180,10 @@ function cleanOrphanBundleDirs(activeIds, scope) {
180
180
  * 2. Merge all active hook configs into settings.json
181
181
  * 3. Clean up orphan bundle directories
182
182
  */
183
- export function distributeHooks(scope, activeAppIds, assumeInstalled) {
183
+ export function distributeHooks(scope, activeAppIds, assumeInstalled, options) {
184
+ if (scope?.project && options?.projectMode === 'none') {
185
+ return { results: [] };
186
+ }
184
187
  const results = [];
185
188
  const platform = 'claude-code';
186
189
  // Skip if claude-code is not installed (unless assumed installed)
@@ -1 +1 @@
1
- {"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/hooks/distribution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/hooks/distribution.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import { distributeCommands } from './commands/distribution.js';
14
14
  import { importCommandFromFile } from './commands/importer.js';
15
15
  import { buildCommandInventory } from './commands/inventory.js';
16
16
  import { loadWritableConfigLayer, updateConfigLayer } from './config/layered-config.js';
17
- import { loadMcpConfig, stripLegacyEnabledFlagsFromMcpJson } from './config/mcp-config.js';
17
+ import { loadMcpConfig, loadMcpConfigWithPlugins, stripLegacyEnabledFlagsFromMcpJson, } from './config/mcp-config.js';
18
18
  import { getAgentsDir, getAgentsHome, getClaudeDir, getCodexDir, getCommandsDir, getCursorDir, getGeminiDir, getHooksDir, getOpencodePath, getSkillsDir, getSourceCacheDir, } from './config/paths.js';
19
19
  import { scopeToLayerOptions } from './config/scope.js';
20
20
  import { loadSwitchboardConfig, loadSwitchboardConfigWithLayers, } from './config/switchboard-config.js';
@@ -23,6 +23,7 @@ import { loadHookLibrary } from './hooks/library.js';
23
23
  import { copyDirRecursive, ensureLibraryDirectories, isDir, isFile, listFilesRecursively, writeFileSecure, } from './library/fs.js';
24
24
  import { addLocalSource, addRemoteSource, getSources, inferSourceName, isGitUrl, parseGitUrl, removeSource, updateRemoteSources, validateSourcePath, } from './library/sources.js';
25
25
  import { loadLibraryStateSection, saveMcpEnabledState } from './library/state.js';
26
+ import { loadManifest, saveManifest } from './manifest/store.js';
26
27
  import { readMarketplace } from './marketplace/reader.js';
27
28
  import { distributeMcp } from './mcp/distribution.js';
28
29
  import { buildPluginIndex } from './plugins/index.js';
@@ -106,6 +107,29 @@ function resolveScope(input) {
106
107
  project: project,
107
108
  };
108
109
  }
110
+ function getScopedProjectMode(scope, config) {
111
+ return scope?.project ? config.distribution.project.mode : undefined;
112
+ }
113
+ function shouldSkipProjectDistribution(scope, config) {
114
+ return getScopedProjectMode(scope, config) === 'none';
115
+ }
116
+ function printProjectDistributionDisabledMessage() {
117
+ console.log(chalk.gray('Project distribution is disabled by `[distribution.project].mode = "none"`.'));
118
+ }
119
+ function loadManagedProjectManifest(scope, projectMode) {
120
+ if (!scope?.project || projectMode !== 'managed')
121
+ return undefined;
122
+ const result = loadManifest(scope.project);
123
+ if (result.corrupt) {
124
+ throw new Error(`Corrupt managed manifest in ${scope.project}. Fix or remove it before retrying.`);
125
+ }
126
+ return result.manifest;
127
+ }
128
+ function saveManagedProjectManifest(scope, projectMode, manifest) {
129
+ if (!scope?.project || projectMode !== 'managed' || !manifest)
130
+ return;
131
+ saveManifest(scope.project, manifest);
132
+ }
109
133
  function defaultCommandSourceDir(platform) {
110
134
  switch (platform) {
111
135
  case 'claude-code':
@@ -280,6 +304,7 @@ program
280
304
  const scope = resolveScope(options);
281
305
  const { config, layers } = loadSwitchboardConfigWithLayers(scopeToLayerOptions(scope));
282
306
  const mcpConfig = loadMcpConfig();
307
+ const pluginIndex = buildPluginIndex(scope);
283
308
  // Determine initial selection:
284
309
  // - If writing to project/profile scope, only use that layer's explicit [mcp].enabled (no fallback).
285
310
  // - If writing to user scope and [mcp].enabled is missing, fall back to legacy mcp.json enabled flags.
@@ -304,10 +329,22 @@ program
304
329
  .map(([name]) => name);
305
330
  }
306
331
  }
332
+ const scopedPluginRefs = scope?.project
333
+ ? (layers.project?.config?.plugins?.enabled ?? [])
334
+ : scope?.profile
335
+ ? (layers.profile?.config?.plugins?.enabled ?? [])
336
+ : (layers.user.config?.plugins?.enabled ?? []);
337
+ const pluginMcpServers = pluginIndex.expand(scopedPluginRefs).mcp;
338
+ const currentActiveSet = new Set(currentActive);
339
+ for (const serverName of pluginMcpServers) {
340
+ currentActiveSet.add(serverName);
341
+ }
342
+ currentActive = [...currentActiveSet];
307
343
  // Step 1: Show UI and get selected servers
308
344
  const selectedServers = await showMcpServerUI({
309
345
  pageSize: config.ui.page_size,
310
346
  enabled: currentActive,
347
+ scope,
311
348
  });
312
349
  // Step 2: Save active state to config.toml (appropriate layer based on scope)
313
350
  const spinner = ora('Updating MCP configuration...').start();
@@ -326,7 +363,18 @@ program
326
363
  }
327
364
  }
328
365
  // Step 3: Apply to registered agents
329
- await distributeMcp(scope, selectedServers);
366
+ const projectMode = getScopedProjectMode(scope, config);
367
+ const manifest = loadManagedProjectManifest(scope, projectMode);
368
+ try {
369
+ await distributeMcp(scope, selectedServers, { manifest, projectMode });
370
+ }
371
+ finally {
372
+ saveManagedProjectManifest(scope, projectMode, manifest);
373
+ }
374
+ if (shouldSkipProjectDistribution(scope, config)) {
375
+ console.log();
376
+ printProjectDistributionDisabledMessage();
377
+ }
330
378
  // Step 4: Show summary
331
379
  showSummary(selectedServers, scope);
332
380
  }
@@ -425,12 +473,12 @@ ruleCommand.action(async (options) => {
425
473
  if (!selection) {
426
474
  return;
427
475
  }
428
- const { rules, writableState: previousState, effectiveState } = loadRuleRuntimeContext(scope);
476
+ const { rules, writableState: previousState, activeState } = loadRuleRuntimeContext(scope);
429
477
  const ruleMap = new Map(rules.map((rule) => [rule.id, rule]));
430
478
  const desiredEnabled = selection.enabled;
431
479
  const selectionChanged = selection.explicitEmpty ||
432
480
  shouldPersistSelection({
433
- effectiveEnabled: effectiveState.enabled,
481
+ effectiveEnabled: activeState.enabled,
434
482
  selectedEnabled: desiredEnabled,
435
483
  });
436
484
  const updatedState = selectionChanged
@@ -459,11 +507,21 @@ ruleCommand.action(async (options) => {
459
507
  }
460
508
  }
461
509
  }
462
- const distribution = distributeRules({
463
- force: !selectionChanged,
464
- activeAppIds: config.applications.enabled,
465
- assumeInstalled: new Set(config.applications.assume_installed),
466
- }, scope);
510
+ const projectMode = getScopedProjectMode(scope, config);
511
+ const manifest = loadManagedProjectManifest(scope, projectMode);
512
+ let distribution;
513
+ try {
514
+ distribution = distributeRules({
515
+ force: !selectionChanged,
516
+ activeAppIds: config.applications.enabled,
517
+ assumeInstalled: new Set(config.applications.assume_installed),
518
+ manifest,
519
+ projectMode,
520
+ }, scope);
521
+ }
522
+ finally {
523
+ saveManagedProjectManifest(scope, projectMode, manifest);
524
+ }
467
525
  if (distribution.results.length > 0) {
468
526
  console.log();
469
527
  printDistributionResults({
@@ -473,6 +531,10 @@ ruleCommand.action(async (options) => {
473
531
  getPath: (result) => result.filePath,
474
532
  });
475
533
  }
534
+ if (shouldSkipProjectDistribution(scope, config)) {
535
+ console.log();
536
+ printProjectDistributionDisabledMessage();
537
+ }
476
538
  const distributionErrors = distribution.results.filter((r) => r.status === 'error');
477
539
  if (distributionErrors.length > 0) {
478
540
  process.exit(1);
@@ -514,7 +576,18 @@ commandRoot.action(async (options) => {
514
576
  return;
515
577
  console.log();
516
578
  printActiveSelection('commands', selection.enabled);
517
- const out = distributeCommands(scope, config.applications.enabled, new Set(config.applications.assume_installed));
579
+ const projectMode = getScopedProjectMode(scope, config);
580
+ const manifest = loadManagedProjectManifest(scope, projectMode);
581
+ let out;
582
+ try {
583
+ out = distributeCommands(scope, config.applications.enabled, new Set(config.applications.assume_installed), {
584
+ manifest,
585
+ projectMode,
586
+ });
587
+ }
588
+ finally {
589
+ saveManagedProjectManifest(scope, projectMode, manifest);
590
+ }
518
591
  if (out.results.length > 0) {
519
592
  console.log();
520
593
  printDistributionResults({
@@ -524,6 +597,10 @@ commandRoot.action(async (options) => {
524
597
  getPath: (result) => result.filePath,
525
598
  });
526
599
  }
600
+ if (shouldSkipProjectDistribution(scope, config)) {
601
+ console.log();
602
+ printProjectDistributionDisabledMessage();
603
+ }
527
604
  // Guidance: unsupported platforms for commands
528
605
  console.log();
529
606
  console.log(chalk.gray('Unsupported platforms (manual steps required): Claude Desktop'));
@@ -664,7 +741,18 @@ agentRoot.action(async (options) => {
664
741
  return;
665
742
  console.log();
666
743
  printActiveSelection('agents', selection.enabled);
667
- const out = distributeSubagents(scope, config.applications.enabled, new Set(config.applications.assume_installed));
744
+ const projectMode = getScopedProjectMode(scope, config);
745
+ const manifest = loadManagedProjectManifest(scope, projectMode);
746
+ let out;
747
+ try {
748
+ out = distributeSubagents(scope, config.applications.enabled, new Set(config.applications.assume_installed), {
749
+ manifest,
750
+ projectMode,
751
+ });
752
+ }
753
+ finally {
754
+ saveManagedProjectManifest(scope, projectMode, manifest);
755
+ }
668
756
  if (out.results.length > 0) {
669
757
  console.log();
670
758
  printDistributionResults({
@@ -674,6 +762,10 @@ agentRoot.action(async (options) => {
674
762
  getPath: (result) => result.filePath,
675
763
  });
676
764
  }
765
+ if (shouldSkipProjectDistribution(scope, config)) {
766
+ console.log();
767
+ printProjectDistributionDisabledMessage();
768
+ }
677
769
  console.log();
678
770
  console.log(chalk.gray('Unsupported platforms (manual steps required): Codex, Gemini'));
679
771
  }
@@ -812,11 +904,21 @@ skillRoot.action(async (options) => {
812
904
  return;
813
905
  console.log();
814
906
  printActiveSelection('skills', selection.enabled);
815
- const out = distributeSkills(scope, {
816
- useAgentsDir: config.distribution.use_agents_dir,
817
- activeAppIds: config.applications.enabled,
818
- assumeInstalled: new Set(config.applications.assume_installed),
819
- });
907
+ const projectMode = getScopedProjectMode(scope, config);
908
+ const manifest = loadManagedProjectManifest(scope, projectMode);
909
+ let out;
910
+ try {
911
+ out = distributeSkills(scope, {
912
+ useAgentsDir: config.distribution.use_agents_dir,
913
+ activeAppIds: config.applications.enabled,
914
+ assumeInstalled: new Set(config.applications.assume_installed),
915
+ manifest,
916
+ projectMode,
917
+ });
918
+ }
919
+ finally {
920
+ saveManagedProjectManifest(scope, projectMode, manifest);
921
+ }
820
922
  if (out.results.length > 0) {
821
923
  console.log();
822
924
  printDistributionResults({
@@ -832,6 +934,10 @@ skillRoot.action(async (options) => {
832
934
  getPath: (result) => result.targetDir,
833
935
  });
834
936
  }
937
+ if (shouldSkipProjectDistribution(scope, config)) {
938
+ console.log();
939
+ printProjectDistributionDisabledMessage();
940
+ }
835
941
  }
836
942
  catch (error) {
837
943
  if (error instanceof Error) {
@@ -961,7 +1067,9 @@ hookRoot.action(async (options) => {
961
1067
  return;
962
1068
  console.log();
963
1069
  printActiveSelection('hooks', selection.enabled);
964
- const out = distributeHooks(scope, config.applications.enabled, new Set(config.applications.assume_installed));
1070
+ const out = distributeHooks(scope, config.applications.enabled, new Set(config.applications.assume_installed), {
1071
+ projectMode: getScopedProjectMode(scope, config),
1072
+ });
965
1073
  if (out.results.length > 0) {
966
1074
  console.log();
967
1075
  printDistributionResults({
@@ -971,6 +1079,10 @@ hookRoot.action(async (options) => {
971
1079
  getPath: (result) => 'filePath' in result ? result.filePath : result.targetDir,
972
1080
  });
973
1081
  }
1082
+ if (shouldSkipProjectDistribution(scope, config)) {
1083
+ console.log();
1084
+ printProjectDistributionDisabledMessage();
1085
+ }
974
1086
  }
975
1087
  catch (error) {
976
1088
  if (error instanceof Error) {
@@ -1117,7 +1229,7 @@ hookRoot
1117
1229
  * Show summary of enabled/disabled servers and applied agents
1118
1230
  */
1119
1231
  function showSummary(selectedServers, scope) {
1120
- const mcpConfig = loadMcpConfig();
1232
+ const mcpConfig = loadMcpConfigWithPlugins(scope);
1121
1233
  const allServers = Object.keys(mcpConfig.mcpServers);
1122
1234
  const enabledServers = selectedServers;
1123
1235
  const disabledServers = allServers.filter((s) => !selectedServers.includes(s));