agent-switchboard 0.2.3 → 0.3.1

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 (104) hide show
  1. package/README.md +29 -28
  2. package/dist/agents/registry.d.ts +0 -6
  3. package/dist/agents/registry.js +0 -13
  4. package/dist/agents/registry.js.map +1 -1
  5. package/dist/commands/distribution.d.ts +3 -4
  6. package/dist/commands/distribution.js +18 -116
  7. package/dist/commands/distribution.js.map +1 -1
  8. package/dist/config/application-config.d.ts +1 -1
  9. package/dist/config/application-config.js +2 -10
  10. package/dist/config/application-config.js.map +1 -1
  11. package/dist/config/mcp-config.js +1 -3
  12. package/dist/config/mcp-config.js.map +1 -1
  13. package/dist/config/paths.d.ts +11 -7
  14. package/dist/config/paths.js +29 -9
  15. package/dist/config/paths.js.map +1 -1
  16. package/dist/config/schemas.d.ts +331 -43
  17. package/dist/config/schemas.js +109 -15
  18. package/dist/config/schemas.js.map +1 -1
  19. package/dist/config/switchboard-config.js +0 -1
  20. package/dist/config/switchboard-config.js.map +1 -1
  21. package/dist/extensions/api.d.ts +49 -0
  22. package/dist/extensions/api.js +41 -0
  23. package/dist/extensions/api.js.map +1 -0
  24. package/dist/extensions/loader.d.ts +17 -0
  25. package/dist/extensions/loader.js +73 -0
  26. package/dist/extensions/loader.js.map +1 -0
  27. package/dist/hooks/distribution.js +1 -16
  28. package/dist/hooks/distribution.js.map +1 -1
  29. package/dist/index.js +77 -123
  30. package/dist/index.js.map +1 -1
  31. package/dist/library/distribute-bundle.js +1 -19
  32. package/dist/library/distribute-bundle.js.map +1 -1
  33. package/dist/library/fs.d.ts +12 -0
  34. package/dist/library/fs.js +81 -0
  35. package/dist/library/fs.js.map +1 -1
  36. package/dist/library/sources.d.ts +6 -1
  37. package/dist/library/sources.js +73 -16
  38. package/dist/library/sources.js.map +1 -1
  39. package/dist/rules/agents.d.ts +0 -4
  40. package/dist/rules/agents.js +0 -10
  41. package/dist/rules/agents.js.map +1 -1
  42. package/dist/rules/distribution.d.ts +1 -2
  43. package/dist/rules/distribution.js +20 -79
  44. package/dist/rules/distribution.js.map +1 -1
  45. package/dist/skills/distribution.d.ts +0 -22
  46. package/dist/skills/distribution.js +70 -185
  47. package/dist/skills/distribution.js.map +1 -1
  48. package/dist/skills/importer.js +2 -33
  49. package/dist/skills/importer.js.map +1 -1
  50. package/dist/subagents/codex-distribute.d.ts +13 -0
  51. package/dist/subagents/codex-distribute.js +273 -0
  52. package/dist/subagents/codex-distribute.js.map +1 -0
  53. package/dist/subagents/distribution.d.ts +3 -4
  54. package/dist/subagents/distribution.js +30 -410
  55. package/dist/subagents/distribution.js.map +1 -1
  56. package/dist/targets/builtin/claude-code.d.ts +2 -0
  57. package/dist/targets/builtin/claude-code.js +73 -0
  58. package/dist/targets/builtin/claude-code.js.map +1 -0
  59. package/dist/targets/builtin/claude-desktop.d.ts +2 -0
  60. package/dist/targets/builtin/claude-desktop.js +14 -0
  61. package/dist/targets/builtin/claude-desktop.js.map +1 -0
  62. package/dist/targets/builtin/codex.d.ts +3 -0
  63. package/dist/targets/builtin/codex.js +57 -0
  64. package/dist/targets/builtin/codex.js.map +1 -0
  65. package/dist/targets/builtin/common.d.ts +22 -0
  66. package/dist/targets/builtin/common.js +55 -0
  67. package/dist/targets/builtin/common.js.map +1 -0
  68. package/dist/targets/builtin/cursor.d.ts +2 -0
  69. package/dist/targets/builtin/cursor.js +95 -0
  70. package/dist/targets/builtin/cursor.js.map +1 -0
  71. package/dist/targets/builtin/gemini.d.ts +2 -0
  72. package/dist/targets/builtin/gemini.js +62 -0
  73. package/dist/targets/builtin/gemini.js.map +1 -0
  74. package/dist/targets/builtin/index.d.ts +10 -0
  75. package/dist/targets/builtin/index.js +19 -0
  76. package/dist/targets/builtin/index.js.map +1 -0
  77. package/dist/targets/builtin/opencode.d.ts +2 -0
  78. package/dist/targets/builtin/opencode.js +67 -0
  79. package/dist/targets/builtin/opencode.js.map +1 -0
  80. package/dist/targets/builtin/trae.d.ts +3 -0
  81. package/dist/targets/builtin/trae.js +56 -0
  82. package/dist/targets/builtin/trae.js.map +1 -0
  83. package/dist/targets/dsl/compiler.d.ts +13 -0
  84. package/dist/targets/dsl/compiler.js +215 -0
  85. package/dist/targets/dsl/compiler.js.map +1 -0
  86. package/dist/targets/dsl/index.d.ts +2 -0
  87. package/dist/targets/dsl/index.js +3 -0
  88. package/dist/targets/dsl/index.js.map +1 -0
  89. package/dist/targets/dsl/transforms.d.ts +77 -0
  90. package/dist/targets/dsl/transforms.js +159 -0
  91. package/dist/targets/dsl/transforms.js.map +1 -0
  92. package/dist/targets/init.d.ts +14 -0
  93. package/dist/targets/init.js +28 -0
  94. package/dist/targets/init.js.map +1 -0
  95. package/dist/targets/registry.d.ts +38 -0
  96. package/dist/targets/registry.js +101 -0
  97. package/dist/targets/registry.js.map +1 -0
  98. package/dist/targets/types.d.ts +93 -0
  99. package/dist/targets/types.js +28 -0
  100. package/dist/targets/types.js.map +1 -0
  101. package/dist/ui/plugin-ui.d.ts +1 -1
  102. package/dist/ui/plugin-ui.js +5 -12
  103. package/dist/ui/plugin-ui.js.map +1 -1
  104. package/package.json +1 -1
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Application Target registry.
3
+ *
4
+ * Merges built-in targets with extension-registered targets.
5
+ * Distribution modules query this registry to discover active targets.
6
+ */
7
+ import { BUILTIN_TARGETS } from './builtin/index.js';
8
+ import { compileTargetSpec } from './dsl/compiler.js';
9
+ const extensionTargets = [];
10
+ /** Get a target by ID (built-in or extension-registered) */
11
+ export function getTargetById(id) {
12
+ return extensionTargets.find((t) => t.id === id) ?? BUILTIN_TARGETS.find((t) => t.id === id);
13
+ }
14
+ /** Get all known target IDs (built-in + extension) */
15
+ export function allTargetIds() {
16
+ const ids = new Set();
17
+ for (const t of BUILTIN_TARGETS)
18
+ ids.add(t.id);
19
+ for (const t of extensionTargets)
20
+ ids.add(t.id);
21
+ return [...ids];
22
+ }
23
+ /** Check if a target ID is known (built-in or extension-registered) */
24
+ export function isKnownTarget(id) {
25
+ return getTargetById(id) !== undefined;
26
+ }
27
+ /**
28
+ * Get active targets filtered by a specific section capability.
29
+ * Only returns targets that: (1) are in activeAppIds, (2) support the section.
30
+ */
31
+ export function getActiveTargetsForSection(section, activeAppIds) {
32
+ const result = [];
33
+ for (const appId of activeAppIds) {
34
+ const target = getTargetById(appId);
35
+ if (!target)
36
+ continue;
37
+ if (target[section])
38
+ result.push(target);
39
+ }
40
+ return result;
41
+ }
42
+ /**
43
+ * Register an extension-provided target.
44
+ * Extension targets take precedence over built-in targets with the same ID.
45
+ */
46
+ export function registerExtensionTarget(target) {
47
+ const existing = extensionTargets.findIndex((t) => t.id === target.id);
48
+ if (existing >= 0) {
49
+ extensionTargets[existing] = target;
50
+ }
51
+ else {
52
+ extensionTargets.push(target);
53
+ }
54
+ }
55
+ /**
56
+ * Get all targets (built-in + extension) that support a given section,
57
+ * regardless of whether they are in `applications.active`.
58
+ * Used by distribution modules to enumerate all known platforms.
59
+ */
60
+ export function getTargetsForSection(section) {
61
+ const seen = new Set();
62
+ const result = [];
63
+ for (const t of extensionTargets) {
64
+ if (t[section]) {
65
+ result.push(t);
66
+ seen.add(t.id);
67
+ }
68
+ }
69
+ for (const t of BUILTIN_TARGETS) {
70
+ if (seen.has(t.id))
71
+ continue;
72
+ if (t[section])
73
+ result.push(t);
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Register targets defined via [targets.<id>] in config.toml.
79
+ * Each entry is compiled from its TargetSpec into an ApplicationTarget.
80
+ */
81
+ export function registerConfigTargets(targets) {
82
+ for (const [id, spec] of Object.entries(targets)) {
83
+ try {
84
+ const target = compileTargetSpec(id, spec);
85
+ registerExtensionTarget(target);
86
+ }
87
+ catch (error) {
88
+ const msg = error instanceof Error ? error.message : String(error);
89
+ console.warn(`[asb] Failed to compile config target "${id}": ${msg}`);
90
+ }
91
+ }
92
+ }
93
+ /** Filter targets to only those that are installed (or have no detection). */
94
+ export function filterInstalled(targets) {
95
+ return targets.filter((t) => t.isInstalled?.() !== false);
96
+ }
97
+ /** Clear all extension targets (for testing) */
98
+ export function clearExtensionTargets() {
99
+ extensionTargets.length = 0;
100
+ }
101
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/targets/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Application Target type definitions.
3
+ *
4
+ * A Target represents a distribution target application (claude-code, cursor, etc.)
5
+ * and encapsulates all section-specific distribution logic: paths, rendering, merging.
6
+ */
7
+ import type { McpServer } from '../config/schemas.js';
8
+ import type { ConfigScope } from '../config/scope.js';
9
+ import type { DistributionResult } from '../library/distribute.js';
10
+ export type TargetSection = 'mcp' | 'rules' | 'commands' | 'agents' | 'skills' | 'hooks';
11
+ /**
12
+ * Generic library entry shape, structurally compatible with CommandEntry and SubagentEntry.
13
+ * Target handlers receive this instead of concrete entry types.
14
+ */
15
+ export interface GenericLibraryEntry {
16
+ readonly id: string;
17
+ readonly bareId: string;
18
+ readonly namespace?: string;
19
+ readonly metadata: {
20
+ readonly description?: string;
21
+ readonly extras?: Record<string, unknown>;
22
+ [key: string]: unknown;
23
+ };
24
+ readonly content: string;
25
+ }
26
+ /** MCP distribution handler */
27
+ export interface TargetMcpHandler {
28
+ configPath(): string;
29
+ projectConfigPath?(projectRoot: string): string;
30
+ applyConfig(config: {
31
+ mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
32
+ }): void;
33
+ applyProjectConfig?(projectRoot: string, config: {
34
+ mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
35
+ }): void;
36
+ }
37
+ /** Rules distribution handler */
38
+ export interface TargetRulesHandler {
39
+ resolveFilePath(scope?: ConfigScope): string;
40
+ render(composedContent: string): string;
41
+ }
42
+ /** Single-file library distribution handler (commands, subagents) */
43
+ export interface TargetLibraryHandler {
44
+ resolveTargetDir(scope?: ConfigScope): string;
45
+ getFilename(id: string): string;
46
+ render(entry: GenericLibraryEntry): string;
47
+ extractIdFromFilename(filename: string): string | null;
48
+ }
49
+ /** Custom agents distribution handler (e.g., Codex TOML + config injection) */
50
+ export interface TargetCustomAgentsHandler {
51
+ readonly custom: true;
52
+ distribute(allEntries: GenericLibraryEntry[], byId: Map<string, GenericLibraryEntry>, scope?: ConfigScope): DistributionResult<string>[];
53
+ }
54
+ /** Skills (bundle) distribution handler */
55
+ export interface TargetSkillsHandler {
56
+ resolveParentDir(scope?: ConfigScope): string;
57
+ resolveTargetDir(id: string, scope?: ConfigScope): string;
58
+ isReservedDir?(id: string): boolean;
59
+ shouldDedup?(scope?: ConfigScope): boolean;
60
+ }
61
+ /** Hooks distribution handler (opaque - each target owns its full logic) */
62
+ export interface TargetHooksHandler {
63
+ distribute(scope?: ConfigScope): {
64
+ results: Array<{
65
+ platform: string;
66
+ filePath?: string;
67
+ targetDir?: string;
68
+ status: string;
69
+ reason?: string;
70
+ error?: string;
71
+ entryId?: string;
72
+ }>;
73
+ };
74
+ }
75
+ /**
76
+ * Application Target: unified abstraction for a distribution target.
77
+ * Presence of a section handler indicates the target supports that section.
78
+ */
79
+ export interface ApplicationTarget {
80
+ readonly id: string;
81
+ /** Returns false if the application is definitively not installed. Undefined means assumed installed. */
82
+ readonly isInstalled?: () => boolean;
83
+ readonly mcp?: TargetMcpHandler;
84
+ readonly rules?: TargetRulesHandler;
85
+ readonly commands?: TargetLibraryHandler;
86
+ readonly agents?: TargetLibraryHandler | TargetCustomAgentsHandler;
87
+ readonly skills?: TargetSkillsHandler;
88
+ readonly hooks?: TargetHooksHandler;
89
+ }
90
+ /** Type guard: check if an agents handler uses custom distribution */
91
+ export declare function isCustomAgentsHandler(handler: TargetLibraryHandler | TargetCustomAgentsHandler): handler is TargetCustomAgentsHandler;
92
+ /** List sections supported by a target */
93
+ export declare function getTargetSections(target: ApplicationTarget): TargetSection[];
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Application Target type definitions.
3
+ *
4
+ * A Target represents a distribution target application (claude-code, cursor, etc.)
5
+ * and encapsulates all section-specific distribution logic: paths, rendering, merging.
6
+ */
7
+ /** Type guard: check if an agents handler uses custom distribution */
8
+ export function isCustomAgentsHandler(handler) {
9
+ return 'custom' in handler && handler.custom === true;
10
+ }
11
+ /** List sections supported by a target */
12
+ export function getTargetSections(target) {
13
+ const sections = [];
14
+ if (target.mcp)
15
+ sections.push('mcp');
16
+ if (target.rules)
17
+ sections.push('rules');
18
+ if (target.commands)
19
+ sections.push('commands');
20
+ if (target.agents)
21
+ sections.push('agents');
22
+ if (target.skills)
23
+ sections.push('skills');
24
+ if (target.hooks)
25
+ sections.push('hooks');
26
+ return sections;
27
+ }
28
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/targets/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkGH,sEAAsE;AACtE,MAAM,UAAU,qBAAqB,CACnC,OAAyD;IAEzD,OAAO,QAAQ,IAAI,OAAO,IAAK,OAAqC,CAAC,MAAM,KAAK,IAAI,CAAC;AACvF,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { PluginDescriptor } from '../plugins/index.js';
2
2
  export declare function printPluginInfo(plugin: PluginDescriptor): void;
3
- export declare function printPluginList(plugins: PluginDescriptor[], enabledMap: Record<string, boolean>): void;
3
+ export declare function printPluginList(plugins: PluginDescriptor[], enabledList: string[]): void;
@@ -48,25 +48,18 @@ export function printPluginInfo(plugin) {
48
48
  }
49
49
  }
50
50
  }
51
- export function printPluginList(plugins, enabledMap) {
51
+ export function printPluginList(plugins, enabledList) {
52
52
  if (plugins.length === 0) {
53
53
  console.log(chalk.yellow('No plugins discovered from configured sources.'));
54
54
  console.log(chalk.dim('Use: asb plugin marketplace add <path-or-url>'));
55
55
  return;
56
56
  }
57
+ const enabledSet = new Set(enabledList);
57
58
  for (const p of plugins) {
58
59
  const ref = p.meta.sourceKind === 'marketplace' ? `${p.id}@${p.meta.sourceName}` : p.id;
59
- const enabledState = enabledMap[ref];
60
- const statusIcon = enabledState === true
61
- ? chalk.green('')
62
- : enabledState === false
63
- ? chalk.red('○')
64
- : chalk.gray('·');
65
- const statusLabel = enabledState === true
66
- ? chalk.green('enabled')
67
- : enabledState === false
68
- ? chalk.yellow('disabled')
69
- : chalk.gray('not installed');
60
+ const isEnabled = enabledSet.has(ref);
61
+ const statusIcon = isEnabled ? chalk.green('●') : chalk.gray('○');
62
+ const statusLabel = isEnabled ? chalk.green('enabled') : chalk.gray('available');
70
63
  console.log(` ${statusIcon} ${chalk.cyan(ref)} ${sourceKindTag(p)} ${chalk.dim(statusLabel)}`);
71
64
  const summary = pluginComponentSummary(p);
72
65
  if (summary) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-ui.js","sourceRoot":"","sources":["../../src/ui/plugin-ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-ui.js","sourceRoot":"","sources":["../../src/ui/plugin-ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-switchboard",
3
- "version": "0.2.3",
3
+ "version": "0.3.1",
4
4
  "description": "Unified MCP server manager for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {