agent-switchboard 0.1.26 → 0.1.28
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.
- package/README.md +37 -11
- package/dist/commands/distribution.js +2 -2
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/library.d.ts +1 -1
- package/dist/commands/library.js +5 -6
- package/dist/commands/library.js.map +1 -1
- package/dist/config/application-config.d.ts +37 -0
- package/dist/config/application-config.js +83 -0
- package/dist/config/application-config.js.map +1 -0
- package/dist/config/layered-config.js +43 -2
- package/dist/config/layered-config.js.map +1 -1
- package/dist/config/paths.d.ts +13 -2
- package/dist/config/paths.js +21 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +408 -43
- package/dist/config/schemas.js +32 -22
- package/dist/config/schemas.js.map +1 -1
- package/dist/config/switchboard-config.d.ts +3 -6
- package/dist/config/switchboard-config.js +3 -6
- package/dist/config/switchboard-config.js.map +1 -1
- package/dist/hooks/distribution.d.ts +27 -0
- package/dist/hooks/distribution.js +235 -0
- package/dist/hooks/distribution.js.map +1 -0
- package/dist/hooks/library.d.ts +40 -0
- package/dist/hooks/library.js +143 -0
- package/dist/hooks/library.js.map +1 -0
- package/dist/hooks/schema.d.ts +542 -0
- package/dist/hooks/schema.js +49 -0
- package/dist/hooks/schema.js.map +1 -0
- package/dist/index.js +708 -168
- package/dist/index.js.map +1 -1
- package/dist/library/fs.d.ts +1 -3
- package/dist/library/fs.js +24 -7
- package/dist/library/fs.js.map +1 -1
- package/dist/library/schema.d.ts +1 -1
- package/dist/library/schema.js +1 -1
- package/dist/library/sources.d.ts +75 -0
- package/dist/library/sources.js +285 -0
- package/dist/library/sources.js.map +1 -0
- package/dist/library/state.d.ts +4 -5
- package/dist/library/state.js +15 -31
- package/dist/library/state.js.map +1 -1
- package/dist/marketplace/plugin-loader.d.ts +30 -0
- package/dist/marketplace/plugin-loader.js +178 -0
- package/dist/marketplace/plugin-loader.js.map +1 -0
- package/dist/marketplace/reader.d.ts +36 -0
- package/dist/marketplace/reader.js +90 -0
- package/dist/marketplace/reader.js.map +1 -0
- package/dist/marketplace/schemas.d.ts +467 -0
- package/dist/marketplace/schemas.js +57 -0
- package/dist/marketplace/schemas.js.map +1 -0
- package/dist/marketplace/source-loader.d.ts +32 -0
- package/dist/marketplace/source-loader.js +45 -0
- package/dist/marketplace/source-loader.js.map +1 -0
- package/dist/rules/agents.d.ts +4 -4
- package/dist/rules/agents.js +10 -4
- package/dist/rules/agents.js.map +1 -1
- package/dist/rules/composer.d.ts +2 -2
- package/dist/rules/composer.js +5 -5
- package/dist/rules/composer.js.map +1 -1
- package/dist/rules/distribution.js +48 -112
- package/dist/rules/distribution.js.map +1 -1
- package/dist/rules/library.d.ts +1 -1
- package/dist/rules/library.js +4 -5
- package/dist/rules/library.js.map +1 -1
- package/dist/skills/distribution.js +6 -6
- package/dist/skills/distribution.js.map +1 -1
- package/dist/skills/library.d.ts +1 -2
- package/dist/skills/library.js +6 -7
- package/dist/skills/library.js.map +1 -1
- package/dist/subagents/distribution.d.ts +1 -1
- package/dist/subagents/distribution.js +319 -20
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/importer.d.ts +1 -1
- package/dist/subagents/importer.js +61 -1
- package/dist/subagents/importer.js.map +1 -1
- package/dist/subagents/inventory.js +3 -3
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/subagents/library.d.ts +2 -2
- package/dist/subagents/library.js +14 -20
- package/dist/subagents/library.js.map +1 -1
- package/dist/ui/hook-ui.d.ts +8 -0
- package/dist/ui/hook-ui.js +17 -0
- package/dist/ui/hook-ui.js.map +1 -0
- package/dist/ui/library-selector.d.ts +1 -1
- package/dist/ui/subagent-ui.js +3 -3
- package/dist/ui/subagent-ui.js.map +1 -1
- package/dist/util/cli.d.ts +20 -0
- package/dist/util/cli.js +107 -14
- package/dist/util/cli.js.map +1 -1
- package/package.json +3 -2
- package/dist/config/agent-config.d.ts +0 -35
- package/dist/config/agent-config.js +0 -88
- package/dist/config/agent-config.js.map +0 -1
- package/dist/library/subscriptions.d.ts +0 -42
- package/dist/library/subscriptions.js +0 -116
- package/dist/library/subscriptions.js.map +0 -1
|
@@ -8,8 +8,8 @@ export interface SubagentEntry {
|
|
|
8
8
|
metadata: LibraryFrontmatter;
|
|
9
9
|
content: string;
|
|
10
10
|
}
|
|
11
|
-
export declare function
|
|
11
|
+
export declare function ensureAgentsDirectory(): string;
|
|
12
12
|
/**
|
|
13
|
-
* Load all
|
|
13
|
+
* Load all agents from default library, flat sources, and marketplace sources.
|
|
14
14
|
*/
|
|
15
15
|
export declare function loadSubagentLibrary(): SubagentEntry[];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { getAgentsDir } from '../config/paths.js';
|
|
4
4
|
import { parseLibraryMarkdown } from '../library/parser.js';
|
|
5
|
-
import {
|
|
5
|
+
import { loadEntriesFromSources } from '../marketplace/source-loader.js';
|
|
6
6
|
function isMarkdownFile(fileName) {
|
|
7
7
|
const extension = path.extname(fileName).toLowerCase();
|
|
8
8
|
return extension === '.md' || extension === '.markdown';
|
|
@@ -10,19 +10,14 @@ function isMarkdownFile(fileName) {
|
|
|
10
10
|
function toId(fileName) {
|
|
11
11
|
return path.basename(fileName, path.extname(fileName));
|
|
12
12
|
}
|
|
13
|
-
export function
|
|
14
|
-
const directory =
|
|
13
|
+
export function ensureAgentsDirectory() {
|
|
14
|
+
const directory = getAgentsDir();
|
|
15
15
|
if (!fs.existsSync(directory)) {
|
|
16
16
|
fs.mkdirSync(directory, { recursive: true });
|
|
17
17
|
}
|
|
18
18
|
return directory;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
* Load subagents from a specific directory
|
|
22
|
-
* @param directory - Directory to load subagents from
|
|
23
|
-
* @param namespace - Optional namespace prefix for IDs
|
|
24
|
-
*/
|
|
25
|
-
function loadSubagentsFromDirectory(directory, namespace) {
|
|
20
|
+
function loadAgentsFromDirectory(directory, namespace) {
|
|
26
21
|
if (!fs.existsSync(directory)) {
|
|
27
22
|
return [];
|
|
28
23
|
}
|
|
@@ -51,7 +46,7 @@ function loadSubagentsFromDirectory(directory, namespace) {
|
|
|
51
46
|
}
|
|
52
47
|
catch (error) {
|
|
53
48
|
if (error instanceof Error) {
|
|
54
|
-
throw new Error(`Failed to parse
|
|
49
|
+
throw new Error(`Failed to parse agent file "${entry.name}": ${error.message}`);
|
|
55
50
|
}
|
|
56
51
|
throw error;
|
|
57
52
|
}
|
|
@@ -59,19 +54,18 @@ function loadSubagentsFromDirectory(directory, namespace) {
|
|
|
59
54
|
return result;
|
|
60
55
|
}
|
|
61
56
|
/**
|
|
62
|
-
* Load all
|
|
57
|
+
* Load all agents from default library, flat sources, and marketplace sources.
|
|
63
58
|
*/
|
|
64
59
|
export function loadSubagentLibrary() {
|
|
65
60
|
const result = [];
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const subagentsDir = path.join(basePath, 'subagents');
|
|
73
|
-
result.push(...loadSubagentsFromDirectory(subagentsDir, namespace));
|
|
61
|
+
const defaultDir = ensureAgentsDirectory();
|
|
62
|
+
result.push(...loadAgentsFromDirectory(defaultDir));
|
|
63
|
+
const { flatSources, marketplaceEntries } = loadEntriesFromSources();
|
|
64
|
+
for (const { namespace, basePath } of flatSources) {
|
|
65
|
+
const agentsDir = path.join(basePath, 'agents');
|
|
66
|
+
result.push(...loadAgentsFromDirectory(agentsDir, namespace));
|
|
74
67
|
}
|
|
68
|
+
result.push(...marketplaceEntries.agents);
|
|
75
69
|
result.sort((a, b) => a.id.localeCompare(b.id));
|
|
76
70
|
return result;
|
|
77
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/subagents/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/subagents/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConfigScope } from '../config/scope.js';
|
|
2
|
+
import { type GenericSelectionResult } from './library-selector.js';
|
|
3
|
+
export type HookSelectionResult = GenericSelectionResult;
|
|
4
|
+
export interface HookSelectorOptions {
|
|
5
|
+
scope?: ConfigScope;
|
|
6
|
+
pageSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function showHookSelector(options?: HookSelectorOptions): Promise<HookSelectionResult | null>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { loadHookLibrary } from '../hooks/library.js';
|
|
2
|
+
import { showLibrarySelector } from './library-selector.js';
|
|
3
|
+
export async function showHookSelector(options) {
|
|
4
|
+
return showLibrarySelector({
|
|
5
|
+
section: 'hooks',
|
|
6
|
+
noun: 'hook',
|
|
7
|
+
emptyHint: 'asb hook load <path>',
|
|
8
|
+
allowOrdering: false,
|
|
9
|
+
loadEntries: () => loadHookLibrary(),
|
|
10
|
+
getId: (e) => e.id,
|
|
11
|
+
getTitle: (e) => e.name ?? e.id,
|
|
12
|
+
getDescription: (e) => e.description,
|
|
13
|
+
scope: options?.scope,
|
|
14
|
+
pageSize: options?.pageSize,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=hook-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-ui.js","sourceRoot":"","sources":["../../src/ui/hook-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAA+B,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AASzF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA6B;IAE7B,OAAO,mBAAmB,CAAY;QACpC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,sBAAsB;QACjC,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;QACpC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;QAC/B,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW;QACpC,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,QAAQ,EAAE,OAAO,EAAE,QAAQ;KAC5B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,7 +3,7 @@ export interface GenericSelectionResult {
|
|
|
3
3
|
active: string[];
|
|
4
4
|
}
|
|
5
5
|
export interface LibrarySelectorOptions<TEntry> {
|
|
6
|
-
section: 'commands' | '
|
|
6
|
+
section: 'commands' | 'agents' | 'skills' | 'hooks';
|
|
7
7
|
emptyHint: string;
|
|
8
8
|
loadEntries: () => TEntry[];
|
|
9
9
|
getId: (e: TEntry) => string;
|
package/dist/ui/subagent-ui.js
CHANGED
|
@@ -2,9 +2,9 @@ import { loadSubagentLibrary } from '../subagents/library.js';
|
|
|
2
2
|
import { showLibrarySelector } from './library-selector.js';
|
|
3
3
|
export async function showSubagentSelector(options) {
|
|
4
4
|
return showLibrarySelector({
|
|
5
|
-
section: '
|
|
6
|
-
noun: '
|
|
7
|
-
emptyHint: 'asb
|
|
5
|
+
section: 'agents',
|
|
6
|
+
noun: 'agent',
|
|
7
|
+
emptyHint: 'asb agent load <platform> [path] [-r]',
|
|
8
8
|
allowOrdering: false,
|
|
9
9
|
loadEntries: () => loadSubagentLibrary(),
|
|
10
10
|
getId: (e) => e.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-ui.js","sourceRoot":"","sources":["../../src/ui/subagent-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAA+B,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AASzF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAiC;IAEjC,OAAO,mBAAmB,CAAgB;QACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"subagent-ui.js","sourceRoot":"","sources":["../../src/ui/subagent-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAA+B,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AASzF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAiC;IAEjC,OAAO,mBAAmB,CAAgB;QACxC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,uCAAuC;QAClD,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE;QACxC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,CAAC,GAAI,CAAC,CAAC,QAAoC,CAAC,KAAgB,CAAC;YACnE,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,CAAC;QACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAA6C,CAAC;YACxE,MAAM,EAAE,GAAI,MAAM,EAAE,CAAC,aAAa,CAA6B,IAAI,SAAS,CAAC;YAC7E,MAAM,EAAE,GAAI,MAAM,EAAE,QAAoC,IAAI,SAAS,CAAC;YACtE,MAAM,EAAE,GAAI,MAAM,EAAE,MAAkC,IAAI,SAAS,CAAC;YACpE,MAAM,EAAE,GAAG,EAAE,EAAE,KAAsC,CAAC;YACtD,MAAM,EAAE,GAAG,EAAE,EAAE,KAAsC,CAAC;YACtD,MAAM,EAAE,GAAG,EAAE,EAAE,KAAsC,CAAC;YACtD,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACnD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAC9C,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;wBAC9C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,SAAS,CAAC;QACpB,CAAC;QACD,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,QAAQ,EAAE,OAAO,EAAE,QAAQ;KAC5B,CAAC,CAAC;AACL,CAAC"}
|
package/dist/util/cli.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare function shortenPath(p: string): string;
|
|
1
2
|
export type Cell = {
|
|
2
3
|
plain: string;
|
|
3
4
|
formatted: string;
|
|
@@ -9,6 +10,15 @@ export interface DistributionResultLike {
|
|
|
9
10
|
reason?: string;
|
|
10
11
|
error?: string;
|
|
11
12
|
}
|
|
13
|
+
export interface DistributionCounts {
|
|
14
|
+
written: number;
|
|
15
|
+
skipped: number;
|
|
16
|
+
deleted: number;
|
|
17
|
+
errors: number;
|
|
18
|
+
skippedByTarget: Map<string, number>;
|
|
19
|
+
}
|
|
20
|
+
export declare function countDistributionResults<T extends DistributionResultLike>(results: T[], getTargetLabel: (result: T) => string): DistributionCounts;
|
|
21
|
+
export declare function formatDistributionSummary(counts: DistributionCounts): string;
|
|
12
22
|
export declare function printDistributionResults<T extends DistributionResultLike>({ title, results, getTargetLabel, getPath, emptyMessage, }: {
|
|
13
23
|
title: string;
|
|
14
24
|
results: T[];
|
|
@@ -16,6 +26,16 @@ export declare function printDistributionResults<T extends DistributionResultLik
|
|
|
16
26
|
getPath: (result: T) => string;
|
|
17
27
|
emptyMessage?: string;
|
|
18
28
|
}): void;
|
|
29
|
+
export interface CompactDistributionSection<T extends DistributionResultLike> {
|
|
30
|
+
label: string;
|
|
31
|
+
results: T[];
|
|
32
|
+
getTargetLabel: (result: T) => string;
|
|
33
|
+
getPath: (result: T) => string;
|
|
34
|
+
emptyMessage?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function printCompactDistributions(sections: CompactDistributionSection<DistributionResultLike>[]): {
|
|
37
|
+
hasErrors: boolean;
|
|
38
|
+
};
|
|
19
39
|
export declare function printActiveSelection(label: string, ids: string[]): void;
|
|
20
40
|
export declare function formatSyncTimestamp(value: string | undefined): string;
|
|
21
41
|
export declare function printAgentSyncStatus(options: {
|
package/dist/util/cli.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
1
2
|
import chalk from 'chalk';
|
|
3
|
+
const HOME = os.homedir();
|
|
4
|
+
export function shortenPath(p) {
|
|
5
|
+
if (p.startsWith(HOME)) {
|
|
6
|
+
return `~${p.slice(HOME.length)}`;
|
|
7
|
+
}
|
|
8
|
+
return p;
|
|
9
|
+
}
|
|
2
10
|
export function printTable(header, rows) {
|
|
3
11
|
const widths = header.map((col, i) => Math.max(col.length, ...rows.map((r) => r[i].plain.length)));
|
|
4
12
|
const formatRow = (cells) => cells
|
|
@@ -9,6 +17,55 @@ export function printTable(header, rows) {
|
|
|
9
17
|
console.log(formatRow(r));
|
|
10
18
|
});
|
|
11
19
|
}
|
|
20
|
+
export function countDistributionResults(results, getTargetLabel) {
|
|
21
|
+
let written = 0;
|
|
22
|
+
let skipped = 0;
|
|
23
|
+
let deleted = 0;
|
|
24
|
+
let errors = 0;
|
|
25
|
+
const skippedByTarget = new Map();
|
|
26
|
+
for (const result of results) {
|
|
27
|
+
const target = getTargetLabel(result);
|
|
28
|
+
switch (result.status) {
|
|
29
|
+
case 'written':
|
|
30
|
+
written++;
|
|
31
|
+
break;
|
|
32
|
+
case 'skipped':
|
|
33
|
+
skipped++;
|
|
34
|
+
skippedByTarget.set(target, (skippedByTarget.get(target) ?? 0) + 1);
|
|
35
|
+
break;
|
|
36
|
+
case 'deleted':
|
|
37
|
+
deleted++;
|
|
38
|
+
break;
|
|
39
|
+
case 'error':
|
|
40
|
+
errors++;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { written, skipped, deleted, errors, skippedByTarget };
|
|
45
|
+
}
|
|
46
|
+
export function formatDistributionSummary(counts) {
|
|
47
|
+
const { written, skipped, deleted, errors, skippedByTarget } = counts;
|
|
48
|
+
const parts = [];
|
|
49
|
+
if (written > 0)
|
|
50
|
+
parts.push(`${chalk.green(String(written))} written`);
|
|
51
|
+
if (deleted > 0)
|
|
52
|
+
parts.push(`${chalk.yellow(String(deleted))} deleted`);
|
|
53
|
+
if (errors > 0)
|
|
54
|
+
parts.push(`${chalk.red(String(errors))} error`);
|
|
55
|
+
if (skipped > 0) {
|
|
56
|
+
const entries = [...skippedByTarget.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
57
|
+
const uniqueCounts = new Set(skippedByTarget.values());
|
|
58
|
+
const showBreakdown = entries.length > 0 && uniqueCounts.size > 1;
|
|
59
|
+
if (showBreakdown) {
|
|
60
|
+
const breakdown = entries.map(([target, count]) => `${target}:${count}`).join(', ');
|
|
61
|
+
parts.push(`${chalk.gray(String(skipped))} up-to-date${chalk.gray(` (${breakdown})`)}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
parts.push(`${chalk.gray(String(skipped))} up-to-date`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return parts.join(chalk.gray(', '));
|
|
68
|
+
}
|
|
12
69
|
export function printDistributionResults({ title, results, getTargetLabel, getPath, emptyMessage, }) {
|
|
13
70
|
console.log(chalk.blue(`${title}:`));
|
|
14
71
|
if (results.length === 0) {
|
|
@@ -17,26 +74,62 @@ export function printDistributionResults({ title, results, getTargetLabel, getPa
|
|
|
17
74
|
}
|
|
18
75
|
return;
|
|
19
76
|
}
|
|
77
|
+
const counts = countDistributionResults(results, getTargetLabel);
|
|
20
78
|
for (const result of results) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
79
|
+
if (result.status === 'skipped')
|
|
80
|
+
continue;
|
|
81
|
+
printResultLine(result, getTargetLabel, getPath, 2);
|
|
82
|
+
}
|
|
83
|
+
const summary = formatDistributionSummary(counts);
|
|
84
|
+
if (summary) {
|
|
85
|
+
console.log(` ${chalk.gray('Summary:')} ${summary}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function printResultLine(result, getTargetLabel, getPath, indent) {
|
|
89
|
+
const pad = ' '.repeat(indent);
|
|
90
|
+
const pathLabel = chalk.dim(shortenPath(getPath(result)));
|
|
91
|
+
const targetLabel = chalk.cyan(getTargetLabel(result));
|
|
92
|
+
if (result.status === 'written') {
|
|
93
|
+
const reason = result.reason ? chalk.gray(` (${result.reason})`) : '';
|
|
94
|
+
console.log(`${pad}${chalk.green('✓')} ${targetLabel} ${pathLabel}${reason}`);
|
|
95
|
+
}
|
|
96
|
+
else if (result.status === 'deleted') {
|
|
97
|
+
const reason = result.reason ? chalk.gray(` (${result.reason})`) : '';
|
|
98
|
+
console.log(`${pad}${chalk.yellow('−')} ${targetLabel} ${pathLabel}${reason}`);
|
|
99
|
+
}
|
|
100
|
+
else if (result.status === 'error') {
|
|
101
|
+
const errorLabel = result.error ? ` ${chalk.red(result.error)}` : '';
|
|
102
|
+
console.log(`${pad}${chalk.red('✗')} ${targetLabel} ${pathLabel}${errorLabel}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function printCompactDistributions(sections) {
|
|
106
|
+
console.log(chalk.blue('Distribution:'));
|
|
107
|
+
const maxLabelLen = Math.max(...sections.map((s) => s.label.length));
|
|
108
|
+
let hasErrors = false;
|
|
109
|
+
for (const section of sections) {
|
|
110
|
+
const label = section.label.padEnd(maxLabelLen);
|
|
111
|
+
if (section.results.length === 0) {
|
|
112
|
+
console.log(` ${chalk.gray(`${label}:`)} ${chalk.gray(section.emptyMessage || 'none')}`);
|
|
113
|
+
continue;
|
|
30
114
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
115
|
+
const counts = countDistributionResults(section.results, section.getTargetLabel);
|
|
116
|
+
if (counts.errors > 0)
|
|
117
|
+
hasErrors = true;
|
|
118
|
+
const summary = formatDistributionSummary(counts);
|
|
119
|
+
const hasChanges = counts.written > 0 || counts.deleted > 0 || counts.errors > 0;
|
|
120
|
+
if (!hasChanges) {
|
|
121
|
+
console.log(` ${chalk.gray(`${label}:`)} ${summary}`);
|
|
34
122
|
}
|
|
35
123
|
else {
|
|
36
|
-
|
|
37
|
-
|
|
124
|
+
console.log(` ${label}: ${summary}`);
|
|
125
|
+
for (const result of section.results) {
|
|
126
|
+
if (result.status === 'skipped')
|
|
127
|
+
continue;
|
|
128
|
+
printResultLine(result, section.getTargetLabel, section.getPath, 4);
|
|
129
|
+
}
|
|
38
130
|
}
|
|
39
131
|
}
|
|
132
|
+
return { hasErrors };
|
|
40
133
|
}
|
|
41
134
|
export function printActiveSelection(label, ids) {
|
|
42
135
|
console.log(chalk.green(`✓ Updated active ${label}:`));
|
package/dist/util/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/util/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/util/cli.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.1.
|
|
3
|
+
"version": "0.1.28",
|
|
4
4
|
"description": "Unified MCP server manager for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"format": "biome format --write .",
|
|
17
17
|
"test": "tsx --test tests/*.test.ts",
|
|
18
18
|
"prepublishOnly": "pnpm run build",
|
|
19
|
-
"
|
|
19
|
+
"postinstall": "git config core.hooksPath .githooks || true",
|
|
20
|
+
"release": "scripts/release.sh"
|
|
20
21
|
},
|
|
21
22
|
"keywords": [
|
|
22
23
|
"mcp",
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent-specific configuration resolution
|
|
3
|
-
* Supports per-agent overrides using add/remove incremental syntax
|
|
4
|
-
*/
|
|
5
|
-
import type { IncrementalSelection, SwitchboardConfig } from './schemas.js';
|
|
6
|
-
import type { ConfigScope } from './scope.js';
|
|
7
|
-
export type ConfigSection = 'mcp' | 'commands' | 'subagents' | 'skills' | 'rules';
|
|
8
|
-
export interface ResolvedSectionConfig {
|
|
9
|
-
active: string[];
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Merge incremental selection with base active list
|
|
13
|
-
*
|
|
14
|
-
* Priority: active > add/remove
|
|
15
|
-
* Formula: (base - remove) ∪ add
|
|
16
|
-
*/
|
|
17
|
-
export declare function mergeIncrementalSelection(base: string[], override?: IncrementalSelection): string[];
|
|
18
|
-
/**
|
|
19
|
-
* Get per-agent override configuration for a specific section
|
|
20
|
-
*/
|
|
21
|
-
export declare function getAgentOverride(config: SwitchboardConfig, agentId: string, section: ConfigSection): IncrementalSelection | undefined;
|
|
22
|
-
/**
|
|
23
|
-
* Resolve effective configuration for a specific agent and section
|
|
24
|
-
*
|
|
25
|
-
* Applies per-agent overrides to the global section config
|
|
26
|
-
*/
|
|
27
|
-
export declare function resolveAgentSectionConfig(section: ConfigSection, agentId: string, scope?: ConfigScope): ResolvedSectionConfig;
|
|
28
|
-
/**
|
|
29
|
-
* Check if an agent has any overrides configured
|
|
30
|
-
*/
|
|
31
|
-
export declare function hasAgentOverrides(config: SwitchboardConfig, agentId: string): boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Get list of agents that have overrides configured
|
|
34
|
-
*/
|
|
35
|
-
export declare function getAgentsWithOverrides(config: SwitchboardConfig): string[];
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent-specific configuration resolution
|
|
3
|
-
* Supports per-agent overrides using add/remove incremental syntax
|
|
4
|
-
*/
|
|
5
|
-
import { loadMergedSwitchboardConfig } from './layered-config.js';
|
|
6
|
-
import { scopeToLayerOptions } from './scope.js';
|
|
7
|
-
/**
|
|
8
|
-
* Merge incremental selection with base active list
|
|
9
|
-
*
|
|
10
|
-
* Priority: active > add/remove
|
|
11
|
-
* Formula: (base - remove) ∪ add
|
|
12
|
-
*/
|
|
13
|
-
export function mergeIncrementalSelection(base, override) {
|
|
14
|
-
if (!override)
|
|
15
|
-
return base;
|
|
16
|
-
// If active is specified, use it as complete override
|
|
17
|
-
if (override.active && override.active.length > 0) {
|
|
18
|
-
return override.active;
|
|
19
|
-
}
|
|
20
|
-
let result = [...base];
|
|
21
|
-
// Apply remove first
|
|
22
|
-
if (override.remove && override.remove.length > 0) {
|
|
23
|
-
const removeSet = new Set(override.remove);
|
|
24
|
-
result = result.filter((id) => !removeSet.has(id));
|
|
25
|
-
}
|
|
26
|
-
// Then apply add
|
|
27
|
-
if (override.add && override.add.length > 0) {
|
|
28
|
-
const existing = new Set(result);
|
|
29
|
-
for (const id of override.add) {
|
|
30
|
-
if (!existing.has(id)) {
|
|
31
|
-
result.push(id);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return result;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Get per-agent override configuration for a specific section
|
|
39
|
-
*/
|
|
40
|
-
export function getAgentOverride(config, agentId, section) {
|
|
41
|
-
// agents object may contain per-agent overrides as additional keys (via passthrough)
|
|
42
|
-
const agents = config.agents;
|
|
43
|
-
const agentOverrides = agents[agentId];
|
|
44
|
-
if (!agentOverrides || typeof agentOverrides !== 'object') {
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
const overrideObj = agentOverrides;
|
|
48
|
-
return overrideObj[section];
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Resolve effective configuration for a specific agent and section
|
|
52
|
-
*
|
|
53
|
-
* Applies per-agent overrides to the global section config
|
|
54
|
-
*/
|
|
55
|
-
export function resolveAgentSectionConfig(section, agentId, scope) {
|
|
56
|
-
const layerOptions = scopeToLayerOptions(scope);
|
|
57
|
-
const { config } = loadMergedSwitchboardConfig(layerOptions);
|
|
58
|
-
// Get global active list for the section
|
|
59
|
-
const globalActive = [...config[section].active];
|
|
60
|
-
// Get agent-specific override
|
|
61
|
-
const override = getAgentOverride(config, agentId, section);
|
|
62
|
-
// Merge and return
|
|
63
|
-
return {
|
|
64
|
-
active: mergeIncrementalSelection(globalActive, override),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Check if an agent has any overrides configured
|
|
69
|
-
*/
|
|
70
|
-
export function hasAgentOverrides(config, agentId) {
|
|
71
|
-
const agents = config.agents;
|
|
72
|
-
const agentOverrides = agents[agentId];
|
|
73
|
-
return agentOverrides !== undefined && typeof agentOverrides === 'object';
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Get list of agents that have overrides configured
|
|
77
|
-
*/
|
|
78
|
-
export function getAgentsWithOverrides(config) {
|
|
79
|
-
const agents = config.agents;
|
|
80
|
-
const result = [];
|
|
81
|
-
for (const key of Object.keys(agents)) {
|
|
82
|
-
if (key !== 'active' && typeof agents[key] === 'object') {
|
|
83
|
-
result.push(key);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return result;
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=agent-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../../src/config/agent-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Library subscription management utilities
|
|
3
|
-
* Handles adding, removing, and listing library source subscriptions
|
|
4
|
-
*/
|
|
5
|
-
export interface Subscription {
|
|
6
|
-
namespace: string;
|
|
7
|
-
path: string;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Get all library subscriptions from config
|
|
11
|
-
*/
|
|
12
|
-
export declare function getSubscriptions(): Subscription[];
|
|
13
|
-
/**
|
|
14
|
-
* Get subscriptions as a record (namespace -> path)
|
|
15
|
-
*/
|
|
16
|
-
export declare function getSubscriptionsRecord(): Record<string, string>;
|
|
17
|
-
/**
|
|
18
|
-
* Add a library subscription
|
|
19
|
-
* @param namespace - Unique namespace for this subscription
|
|
20
|
-
* @param libraryPath - Path to the library directory
|
|
21
|
-
* @throws Error if namespace already exists or path is invalid
|
|
22
|
-
*/
|
|
23
|
-
export declare function addSubscription(namespace: string, libraryPath: string): void;
|
|
24
|
-
/**
|
|
25
|
-
* Remove a library subscription by namespace
|
|
26
|
-
* @param namespace - Namespace to remove
|
|
27
|
-
* @throws Error if namespace doesn't exist
|
|
28
|
-
*/
|
|
29
|
-
export declare function removeSubscription(namespace: string): void;
|
|
30
|
-
/**
|
|
31
|
-
* Check if a subscription namespace exists
|
|
32
|
-
*/
|
|
33
|
-
export declare function hasSubscription(namespace: string): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Validate a subscription path has expected library structure
|
|
36
|
-
* Returns list of found library types
|
|
37
|
-
*/
|
|
38
|
-
export declare function validateSubscriptionPath(libraryPath: string): {
|
|
39
|
-
valid: boolean;
|
|
40
|
-
found: string[];
|
|
41
|
-
missing: string[];
|
|
42
|
-
};
|