agent-switchboard 0.1.29 → 0.2.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.
- package/README.md +94 -46
- package/dist/agents/codex.d.ts +0 -9
- package/dist/agents/codex.js +9 -3
- package/dist/agents/codex.js.map +1 -1
- package/dist/commands/distribution.js +1 -1
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/inventory.js +1 -1
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/library.d.ts +1 -1
- package/dist/commands/library.js +3 -3
- package/dist/commands/library.js.map +1 -1
- package/dist/config/application-config.d.ts +14 -3
- package/dist/config/application-config.js +61 -6
- package/dist/config/application-config.js.map +1 -1
- package/dist/config/mcp-config.d.ts +7 -0
- package/dist/config/mcp-config.js +25 -0
- package/dist/config/mcp-config.js.map +1 -1
- package/dist/config/schemas.d.ts +828 -273
- package/dist/config/schemas.js +62 -18
- package/dist/config/schemas.js.map +1 -1
- package/dist/hooks/distribution.js +3 -1
- package/dist/hooks/distribution.js.map +1 -1
- package/dist/hooks/library.d.ts +1 -1
- package/dist/hooks/library.js +3 -3
- package/dist/hooks/library.js.map +1 -1
- package/dist/index.js +323 -67
- package/dist/index.js.map +1 -1
- package/dist/library/distribute-bundle.d.ts +3 -0
- package/dist/library/distribute-bundle.js +4 -0
- package/dist/library/distribute-bundle.js.map +1 -1
- package/dist/library/distribute.d.ts +1 -0
- package/dist/library/distribute.js +2 -0
- package/dist/library/distribute.js.map +1 -1
- package/dist/library/sources.d.ts +3 -2
- package/dist/library/sources.js +16 -17
- package/dist/library/sources.js.map +1 -1
- package/dist/library/state.d.ts +6 -6
- package/dist/library/state.js +15 -15
- package/dist/library/state.js.map +1 -1
- package/dist/marketplace/plugin-loader.d.ts +3 -0
- package/dist/marketplace/plugin-loader.js +53 -2
- package/dist/marketplace/plugin-loader.js.map +1 -1
- package/dist/marketplace/reader.d.ts +22 -0
- package/dist/marketplace/reader.js +122 -17
- package/dist/marketplace/reader.js.map +1 -1
- package/dist/marketplace/schemas.d.ts +48 -12
- package/dist/marketplace/schemas.js +4 -1
- package/dist/marketplace/schemas.js.map +1 -1
- package/dist/marketplace/source-loader.d.ts +6 -6
- package/dist/marketplace/source-loader.js +8 -8
- package/dist/marketplace/source-loader.js.map +1 -1
- package/dist/plugins/index.d.ts +57 -0
- package/dist/plugins/index.js +304 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/rules/composer.js +4 -4
- package/dist/rules/composer.js.map +1 -1
- package/dist/rules/inventory.js +1 -1
- package/dist/rules/inventory.js.map +1 -1
- package/dist/rules/library.d.ts +1 -1
- package/dist/rules/library.js +19 -3
- package/dist/rules/library.js.map +1 -1
- package/dist/rules/schema.d.ts +3 -3
- package/dist/rules/schema.js +1 -1
- package/dist/rules/schema.js.map +1 -1
- package/dist/rules/state.js +12 -12
- package/dist/rules/state.js.map +1 -1
- package/dist/skills/distribution.js +11 -5
- package/dist/skills/distribution.js.map +1 -1
- package/dist/skills/inventory.js +1 -1
- package/dist/skills/inventory.js.map +1 -1
- package/dist/skills/library.d.ts +1 -1
- package/dist/skills/library.js +3 -3
- package/dist/skills/library.js.map +1 -1
- package/dist/subagents/distribution.js +4 -2
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/inventory.js +1 -1
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/subagents/library.d.ts +1 -1
- package/dist/subagents/library.js +3 -3
- package/dist/subagents/library.js.map +1 -1
- package/dist/ui/library-selector.d.ts +1 -1
- package/dist/ui/library-selector.js +7 -7
- package/dist/ui/library-selector.js.map +1 -1
- package/dist/ui/plugin-ui.d.ts +3 -0
- package/dist/ui/plugin-ui.js +77 -0
- package/dist/ui/plugin-ui.js.map +1 -0
- package/dist/ui/rule-ui.d.ts +1 -1
- package/dist/ui/rule-ui.js +4 -4
- package/dist/ui/rule-ui.js.map +1 -1
- package/dist/util/cli.d.ts +1 -0
- package/dist/util/cli.js +2 -1
- package/dist/util/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/library/state.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { ConfigScope } from '../config/scope.js';
|
|
3
3
|
declare const sectionStateSchema: z.ZodObject<{
|
|
4
|
-
|
|
4
|
+
enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
5
5
|
agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
6
6
|
hash: z.ZodOptional<z.ZodString>;
|
|
7
7
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
@@ -13,7 +13,7 @@ declare const sectionStateSchema: z.ZodObject<{
|
|
|
13
13
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
14
14
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
15
15
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
16
|
-
|
|
16
|
+
enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
17
17
|
agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
18
18
|
hash: z.ZodOptional<z.ZodString>;
|
|
19
19
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
@@ -25,7 +25,7 @@ declare const sectionStateSchema: z.ZodObject<{
|
|
|
25
25
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
26
26
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
27
27
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
28
|
-
|
|
28
|
+
enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
29
29
|
agentSync: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
30
30
|
hash: z.ZodOptional<z.ZodString>;
|
|
31
31
|
updatedAt: z.ZodOptional<z.ZodString>;
|
|
@@ -39,9 +39,9 @@ declare const sectionStateSchema: z.ZodObject<{
|
|
|
39
39
|
}, z.ZodTypeAny, "passthrough">>;
|
|
40
40
|
export type SectionState = z.infer<typeof sectionStateSchema>;
|
|
41
41
|
export type LibrarySection = 'commands' | 'agents' | 'skills' | 'hooks';
|
|
42
|
-
export declare function
|
|
43
|
-
export declare function
|
|
44
|
-
export declare function
|
|
42
|
+
export declare function loadMcpEnabledState(scope?: ConfigScope): string[];
|
|
43
|
+
export declare function hasMcpEnabledInConfig(scope?: ConfigScope): boolean;
|
|
44
|
+
export declare function saveMcpEnabledState(enabled: string[], scope?: ConfigScope): void;
|
|
45
45
|
export declare function loadLibraryStateSection(section: LibrarySection, scope?: ConfigScope): SectionState;
|
|
46
46
|
export declare function saveLibraryStateSection(section: LibrarySection, state: SectionState, scope?: ConfigScope): void;
|
|
47
47
|
export declare function updateLibraryStateSection(section: LibrarySection, mutator: (current: SectionState) => SectionState, scope?: ConfigScope): SectionState;
|
package/dist/library/state.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { resolveEffectiveSectionConfig } from '../config/application-config.js';
|
|
3
3
|
import { loadMergedSwitchboardConfig, updateConfigLayer } from '../config/layered-config.js';
|
|
4
4
|
import { scopeToLayerOptions } from '../config/scope.js';
|
|
5
5
|
const appSyncEntrySchema = z
|
|
@@ -10,29 +10,29 @@ const appSyncEntrySchema = z
|
|
|
10
10
|
.passthrough();
|
|
11
11
|
const sectionStateSchema = z
|
|
12
12
|
.object({
|
|
13
|
-
|
|
13
|
+
enabled: z.array(z.string().trim().min(1)).default([]),
|
|
14
14
|
agentSync: z.record(z.string(), appSyncEntrySchema).default({}),
|
|
15
15
|
})
|
|
16
16
|
.passthrough();
|
|
17
|
-
export function
|
|
17
|
+
export function loadMcpEnabledState(scope) {
|
|
18
18
|
const layerOptions = scopeToLayerOptions(scope);
|
|
19
19
|
const { config } = loadMergedSwitchboardConfig(layerOptions);
|
|
20
|
-
return [...config.mcp.
|
|
20
|
+
return [...config.mcp.enabled];
|
|
21
21
|
}
|
|
22
|
-
export function
|
|
22
|
+
export function hasMcpEnabledInConfig(scope) {
|
|
23
23
|
const layerOptions = scopeToLayerOptions(scope);
|
|
24
24
|
const { layers } = loadMergedSwitchboardConfig(layerOptions);
|
|
25
|
-
const checkLayer = (layer) => layer?.config?.mcp !== undefined && Array.isArray(layer.config.mcp.
|
|
25
|
+
const checkLayer = (layer) => layer?.config?.mcp !== undefined && Array.isArray(layer.config.mcp.enabled);
|
|
26
26
|
return checkLayer(layers.user) || checkLayer(layers.profile) || checkLayer(layers.project);
|
|
27
27
|
}
|
|
28
|
-
export function
|
|
28
|
+
export function saveMcpEnabledState(enabled, scope) {
|
|
29
29
|
const layerOptions = scopeToLayerOptions(scope);
|
|
30
30
|
updateConfigLayer((layer) => {
|
|
31
31
|
const next = { ...layer };
|
|
32
32
|
const currentMcp = (next.mcp ?? {});
|
|
33
33
|
next.mcp = {
|
|
34
34
|
...currentMcp,
|
|
35
|
-
|
|
35
|
+
enabled: [...enabled],
|
|
36
36
|
};
|
|
37
37
|
return next;
|
|
38
38
|
}, layerOptions);
|
|
@@ -43,15 +43,15 @@ const agentSyncCache = {
|
|
|
43
43
|
skills: {},
|
|
44
44
|
hooks: {},
|
|
45
45
|
};
|
|
46
|
-
function
|
|
46
|
+
function getConfigSectionEnabled(section, options) {
|
|
47
47
|
const { config } = loadMergedSwitchboardConfig(options);
|
|
48
|
-
return [...config[section].
|
|
48
|
+
return [...config[section].enabled];
|
|
49
49
|
}
|
|
50
50
|
export function loadLibraryStateSection(section, scope) {
|
|
51
51
|
const layerOptions = scopeToLayerOptions(scope);
|
|
52
|
-
const
|
|
52
|
+
const configEnabled = getConfigSectionEnabled(section, layerOptions);
|
|
53
53
|
return {
|
|
54
|
-
|
|
54
|
+
enabled: configEnabled,
|
|
55
55
|
agentSync: { ...agentSyncCache[section] },
|
|
56
56
|
};
|
|
57
57
|
}
|
|
@@ -63,7 +63,7 @@ export function saveLibraryStateSection(section, state, scope) {
|
|
|
63
63
|
const current = (next[section] ?? {});
|
|
64
64
|
next[section] = {
|
|
65
65
|
...current,
|
|
66
|
-
|
|
66
|
+
enabled: [...validated.enabled],
|
|
67
67
|
};
|
|
68
68
|
return next;
|
|
69
69
|
}, layerOptions);
|
|
@@ -80,9 +80,9 @@ export function updateLibraryStateSection(section, mutator, scope) {
|
|
|
80
80
|
* Merges the global section config with application-specific add/remove overrides.
|
|
81
81
|
*/
|
|
82
82
|
export function loadLibraryStateSectionForApplication(section, appId, scope) {
|
|
83
|
-
const appConfig =
|
|
83
|
+
const appConfig = resolveEffectiveSectionConfig(section, appId, scope);
|
|
84
84
|
return {
|
|
85
|
-
|
|
85
|
+
enabled: appConfig.enabled,
|
|
86
86
|
agentSync: { ...agentSyncCache[section] },
|
|
87
87
|
};
|
|
88
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/library/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAG7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChE,CAAC;KACD,WAAW,EAAE,CAAC;AAKjB,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,KAAyE,EAAE,EAAE,CAC/F,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9E,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAiB,EAAE,KAAmB;IACxE,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAA2B,EAAE,GAAG,KAAK,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;QAC/D,IAAI,CAAC,GAAG,GAAG;YACT,GAAG,UAAU;YACb,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;SACW,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,YAAY,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAGhB;IACF,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,SAAS,uBAAuB,CAC9B,OAAuB,EACvB,OAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAuB,EACvB,KAAmB;IAEnB,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrE,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAuB,EACvB,KAAmB,EACnB,KAAmB;IAEnB,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAElD,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAA2B,EAAE,GAAG,KAAK,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,IAAgC,CAAC,OAAO,CAAC,GAAG;YAC3C,GAAG,OAAO;YACV,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;SAChC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,YAAY,CAAC,CAAC;IACjB,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAuB,EACvB,OAAgD,EAChD,KAAmB;IAEnB,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CACnD,OAAuB,EACvB,KAAa,EACb,KAAmB;IAEnB,MAAM,SAAS,GAAG,6BAA6B,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -26,5 +26,8 @@ export interface PluginComponents {
|
|
|
26
26
|
/**
|
|
27
27
|
* Load all components (commands, agents, skills) from a single plugin directory.
|
|
28
28
|
* The namespace is the plugin name, producing IDs like "plugin-name:component-id".
|
|
29
|
+
*
|
|
30
|
+
* When `customPaths` is present on the plugin (from strict mode resolution),
|
|
31
|
+
* commands/agents are loaded from those specific files instead of scanning directories.
|
|
29
32
|
*/
|
|
30
33
|
export declare function loadPluginComponents(plugin: ResolvedPlugin): PluginComponents;
|
|
@@ -18,16 +18,67 @@ function toId(fileName) {
|
|
|
18
18
|
/**
|
|
19
19
|
* Load all components (commands, agents, skills) from a single plugin directory.
|
|
20
20
|
* The namespace is the plugin name, producing IDs like "plugin-name:component-id".
|
|
21
|
+
*
|
|
22
|
+
* When `customPaths` is present on the plugin (from strict mode resolution),
|
|
23
|
+
* commands/agents are loaded from those specific files instead of scanning directories.
|
|
21
24
|
*/
|
|
22
25
|
export function loadPluginComponents(plugin) {
|
|
23
26
|
const namespace = plugin.name;
|
|
24
27
|
const result = { commands: [], agents: [], skills: [], hooks: [] };
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
if (plugin.customPaths?.commands) {
|
|
29
|
+
result.commands = loadFromCustomPaths(plugin.localPath, plugin.customPaths.commands, namespace, 'command');
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
result.commands = loadMarkdownEntries(path.join(plugin.localPath, 'commands'), namespace, 'command');
|
|
33
|
+
}
|
|
34
|
+
if (plugin.customPaths?.agents) {
|
|
35
|
+
result.agents = loadFromCustomPaths(plugin.localPath, plugin.customPaths.agents, namespace, 'agent');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
result.agents = loadMarkdownEntries(path.join(plugin.localPath, 'agents'), namespace, 'agent');
|
|
39
|
+
}
|
|
27
40
|
result.skills = loadSkillEntries(plugin.localPath, namespace);
|
|
28
41
|
result.hooks = loadHookEntries(plugin.localPath, namespace);
|
|
29
42
|
return result;
|
|
30
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Load entries from explicit file paths (custom component paths from marketplace/plugin.json).
|
|
46
|
+
* Paths are relative to the plugin root. Supports glob-like patterns for directory refs.
|
|
47
|
+
*/
|
|
48
|
+
function loadFromCustomPaths(pluginRoot, customPaths, namespace, kind) {
|
|
49
|
+
const result = [];
|
|
50
|
+
for (const customPath of customPaths) {
|
|
51
|
+
const absolutePath = path.resolve(pluginRoot, customPath);
|
|
52
|
+
if (fs.existsSync(absolutePath) && fs.statSync(absolutePath).isDirectory()) {
|
|
53
|
+
result.push(...loadMarkdownEntries(absolutePath, namespace, kind));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!fs.existsSync(absolutePath))
|
|
57
|
+
continue;
|
|
58
|
+
if (!isMarkdownFile(path.basename(absolutePath)))
|
|
59
|
+
continue;
|
|
60
|
+
try {
|
|
61
|
+
const rawContent = fs.readFileSync(absolutePath, 'utf-8');
|
|
62
|
+
const parsed = parseLibraryMarkdown(rawContent);
|
|
63
|
+
const bareId = toId(path.basename(absolutePath));
|
|
64
|
+
const id = `${namespace}:${bareId}`;
|
|
65
|
+
result.push({
|
|
66
|
+
id,
|
|
67
|
+
bareId,
|
|
68
|
+
namespace,
|
|
69
|
+
source: path.dirname(absolutePath),
|
|
70
|
+
filePath: absolutePath,
|
|
71
|
+
metadata: parsed.metadata,
|
|
72
|
+
content: parsed.content,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
77
|
+
throw new Error(`Failed to parse plugin ${kind} at custom path "${customPath}": ${msg}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
31
82
|
/**
|
|
32
83
|
* Load markdown-based library entries (commands or agents) from a directory.
|
|
33
84
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/marketplace/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAuBzD,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAC9C,CAAC;AAED,SAAS,IAAI,CAAC,QAAgB;IAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/marketplace/plugin-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* A marketplace is a repository containing `.claude-plugin/marketplace.json`.
|
|
5
5
|
* Each plugin is either a relative path within the same repo or a standalone
|
|
6
6
|
* directory with `.claude-plugin/plugin.json`.
|
|
7
|
+
*
|
|
8
|
+
* PhaseB additions:
|
|
9
|
+
* - `github` / `git` URL source types resolve via shallow clone + cache
|
|
10
|
+
* - `strict` mode semantics (true => marketplace entry is authoritative)
|
|
11
|
+
* - `npm` / `pip` sources emit warnings (not yet implemented)
|
|
12
|
+
* - `ref` / `sha` pin support for reproducible builds
|
|
7
13
|
*/
|
|
8
14
|
import { type PluginManifest } from './schemas.js';
|
|
9
15
|
export interface ResolvedPlugin {
|
|
@@ -16,6 +22,17 @@ export interface ResolvedPlugin {
|
|
|
16
22
|
manifest?: PluginManifest;
|
|
17
23
|
/** Whether plugin is in strict mode */
|
|
18
24
|
strict: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Custom component paths from the marketplace entry (strict mode) or
|
|
27
|
+
* plugin.json (non-strict). Used by the plugin loader to override
|
|
28
|
+
* default directory scanning.
|
|
29
|
+
*/
|
|
30
|
+
customPaths?: {
|
|
31
|
+
commands?: string[];
|
|
32
|
+
agents?: string[];
|
|
33
|
+
};
|
|
34
|
+
/** MCP servers declared in the marketplace entry or plugin.json */
|
|
35
|
+
mcpServers?: Record<string, unknown>;
|
|
19
36
|
}
|
|
20
37
|
export interface MarketplaceReadResult {
|
|
21
38
|
name: string;
|
|
@@ -30,6 +47,11 @@ export interface MarketplaceReadResult {
|
|
|
30
47
|
* Check whether a local path is a Claude Code marketplace (has .claude-plugin/marketplace.json).
|
|
31
48
|
*/
|
|
32
49
|
export declare function isMarketplace(localPath: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Check whether a local path is a formal single plugin (has .claude-plugin/plugin.json
|
|
52
|
+
* but NOT marketplace.json).
|
|
53
|
+
*/
|
|
54
|
+
export declare function isFormalPlugin(localPath: string): boolean;
|
|
33
55
|
/**
|
|
34
56
|
* Read and resolve a marketplace, returning all resolvable plugins with metadata.
|
|
35
57
|
*/
|
|
@@ -4,9 +4,17 @@
|
|
|
4
4
|
* A marketplace is a repository containing `.claude-plugin/marketplace.json`.
|
|
5
5
|
* Each plugin is either a relative path within the same repo or a standalone
|
|
6
6
|
* directory with `.claude-plugin/plugin.json`.
|
|
7
|
+
*
|
|
8
|
+
* PhaseB additions:
|
|
9
|
+
* - `github` / `git` URL source types resolve via shallow clone + cache
|
|
10
|
+
* - `strict` mode semantics (true => marketplace entry is authoritative)
|
|
11
|
+
* - `npm` / `pip` sources emit warnings (not yet implemented)
|
|
12
|
+
* - `ref` / `sha` pin support for reproducible builds
|
|
7
13
|
*/
|
|
14
|
+
import { execFileSync } from 'node:child_process';
|
|
8
15
|
import fs from 'node:fs';
|
|
9
16
|
import path from 'node:path';
|
|
17
|
+
import { getSourceCacheDir } from '../config/paths.js';
|
|
10
18
|
import { marketplaceManifestSchema, pluginManifestSchema, } from './schemas.js';
|
|
11
19
|
const MARKETPLACE_MANIFEST = '.claude-plugin/marketplace.json';
|
|
12
20
|
const PLUGIN_MANIFEST = '.claude-plugin/plugin.json';
|
|
@@ -17,6 +25,16 @@ export function isMarketplace(localPath) {
|
|
|
17
25
|
const manifestPath = path.join(localPath, MARKETPLACE_MANIFEST);
|
|
18
26
|
return fs.existsSync(manifestPath);
|
|
19
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Check whether a local path is a formal single plugin (has .claude-plugin/plugin.json
|
|
30
|
+
* but NOT marketplace.json).
|
|
31
|
+
*/
|
|
32
|
+
export function isFormalPlugin(localPath) {
|
|
33
|
+
if (isMarketplace(localPath))
|
|
34
|
+
return false;
|
|
35
|
+
const pluginPath = path.join(localPath, PLUGIN_MANIFEST);
|
|
36
|
+
return fs.existsSync(pluginPath);
|
|
37
|
+
}
|
|
20
38
|
/**
|
|
21
39
|
* Read and resolve a marketplace, returning all resolvable plugins with metadata.
|
|
22
40
|
*/
|
|
@@ -27,8 +45,9 @@ export function readMarketplace(localPath) {
|
|
|
27
45
|
const manifest = marketplaceManifestSchema.parse(raw);
|
|
28
46
|
const pluginRoot = manifest.metadata?.pluginRoot ?? '';
|
|
29
47
|
const plugins = [];
|
|
48
|
+
const marketplaceNamespace = manifest.name.replace(/[^a-zA-Z0-9_-]/g, '-');
|
|
30
49
|
for (const entry of manifest.plugins) {
|
|
31
|
-
const resolved = resolvePluginDir(localPath, pluginRoot, entry.name, entry.source);
|
|
50
|
+
const resolved = resolvePluginDir(localPath, pluginRoot, entry.name, entry.source, marketplaceNamespace, entry.ref);
|
|
32
51
|
if (!resolved) {
|
|
33
52
|
warnings.push(`Plugin "${entry.name}": unsupported source type, skipped`);
|
|
34
53
|
continue;
|
|
@@ -38,14 +57,8 @@ export function readMarketplace(localPath) {
|
|
|
38
57
|
continue;
|
|
39
58
|
}
|
|
40
59
|
const pluginManifest = readPluginManifest(resolved);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
description: entry.description ?? pluginManifest?.description,
|
|
44
|
-
version: entry.version ?? pluginManifest?.version,
|
|
45
|
-
localPath: resolved,
|
|
46
|
-
manifest: pluginManifest ?? undefined,
|
|
47
|
-
strict: entry.strict,
|
|
48
|
-
});
|
|
60
|
+
const plugin = applyStrictMode(entry, pluginManifest, resolved);
|
|
61
|
+
plugins.push(plugin);
|
|
49
62
|
}
|
|
50
63
|
return {
|
|
51
64
|
name: manifest.name,
|
|
@@ -54,27 +67,119 @@ export function readMarketplace(localPath) {
|
|
|
54
67
|
warnings,
|
|
55
68
|
};
|
|
56
69
|
}
|
|
70
|
+
// ── Strict mode ────────────────────────────────────────────────────
|
|
57
71
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
72
|
+
* Apply strict mode semantics to produce the final ResolvedPlugin.
|
|
73
|
+
*
|
|
74
|
+
* When `strict: true` (default): the marketplace entry is authoritative.
|
|
75
|
+
* - `commands`, `agents`, `mcpServers` from the entry take precedence.
|
|
76
|
+
* - `plugin.json` values are only used as fallback.
|
|
77
|
+
*
|
|
78
|
+
* When `strict: false`: `plugin.json` is authoritative.
|
|
79
|
+
* - The marketplace entry provides the source/name/version only.
|
|
80
|
+
* - Component paths and mcpServers come from `plugin.json`.
|
|
61
81
|
*/
|
|
62
|
-
function
|
|
82
|
+
function applyStrictMode(entry, pluginManifest, localPath) {
|
|
83
|
+
const isStrict = entry.strict;
|
|
84
|
+
const primary = isStrict ? entry : (pluginManifest ?? entry);
|
|
85
|
+
const fallback = isStrict ? (pluginManifest ?? entry) : entry;
|
|
86
|
+
const customCommands = normalizeStringArray(primary.commands) ?? normalizeStringArray(fallback.commands);
|
|
87
|
+
const customAgents = normalizeStringArray(primary.agents) ?? normalizeStringArray(fallback.agents);
|
|
88
|
+
const mcpServers = primary.mcpServers ??
|
|
89
|
+
fallback.mcpServers;
|
|
90
|
+
const plugin = {
|
|
91
|
+
name: entry.name,
|
|
92
|
+
description: entry.description ?? pluginManifest?.description,
|
|
93
|
+
version: entry.version ?? pluginManifest?.version,
|
|
94
|
+
localPath,
|
|
95
|
+
manifest: pluginManifest ?? undefined,
|
|
96
|
+
strict: isStrict,
|
|
97
|
+
};
|
|
98
|
+
if (customCommands || customAgents) {
|
|
99
|
+
plugin.customPaths = {};
|
|
100
|
+
if (customCommands)
|
|
101
|
+
plugin.customPaths.commands = customCommands;
|
|
102
|
+
if (customAgents)
|
|
103
|
+
plugin.customPaths.agents = customAgents;
|
|
104
|
+
}
|
|
105
|
+
if (mcpServers && Object.keys(mcpServers).length > 0) {
|
|
106
|
+
plugin.mcpServers = mcpServers;
|
|
107
|
+
}
|
|
108
|
+
return plugin;
|
|
109
|
+
}
|
|
110
|
+
function normalizeStringArray(value) {
|
|
111
|
+
if (typeof value === 'string')
|
|
112
|
+
return [value];
|
|
113
|
+
if (Array.isArray(value))
|
|
114
|
+
return value.filter((v) => typeof v === 'string');
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
// ── Source resolution ──────────────────────────────────────────────
|
|
118
|
+
function resolvePluginDir(marketplaceRoot, pluginRoot, pluginName, source, marketplaceNamespace, pinRef) {
|
|
63
119
|
if (typeof source === 'string') {
|
|
64
120
|
if (source.startsWith('./') || source.startsWith('../') || !source.includes(':')) {
|
|
65
121
|
return path.resolve(marketplaceRoot, pluginRoot, source);
|
|
66
122
|
}
|
|
67
123
|
return null;
|
|
68
124
|
}
|
|
125
|
+
// Local path source
|
|
69
126
|
if (source.path && typeof source.path === 'string') {
|
|
70
127
|
return path.resolve(marketplaceRoot, pluginRoot, source.path);
|
|
71
128
|
}
|
|
72
|
-
//
|
|
129
|
+
// GitHub shorthand: "org/repo" or full URL
|
|
130
|
+
if (source.github && typeof source.github === 'string') {
|
|
131
|
+
const ghUrl = source.github.includes('/')
|
|
132
|
+
? source.github.startsWith('http')
|
|
133
|
+
? source.github
|
|
134
|
+
: `https://github.com/${source.github}`
|
|
135
|
+
: null;
|
|
136
|
+
if (!ghUrl)
|
|
137
|
+
return null;
|
|
138
|
+
const cloneUrl = ghUrl.endsWith('.git') ? ghUrl : `${ghUrl}.git`;
|
|
139
|
+
const ref = pinRef ?? source.ref;
|
|
140
|
+
return cloneToCacheDir(marketplaceNamespace, pluginName, cloneUrl, ref);
|
|
141
|
+
}
|
|
142
|
+
// Git URL
|
|
143
|
+
if (source.git && typeof source.git === 'string') {
|
|
144
|
+
const ref = pinRef ?? source.ref;
|
|
145
|
+
return cloneToCacheDir(marketplaceNamespace, pluginName, source.git, ref);
|
|
146
|
+
}
|
|
147
|
+
// npm / pip: not yet implemented
|
|
148
|
+
if (source.npm && typeof source.npm === 'string') {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
if (source.pip && typeof source.pip === 'string') {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
73
154
|
return null;
|
|
74
155
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
156
|
+
// ── Git caching ────────────────────────────────────────────────────
|
|
157
|
+
function cloneToCacheDir(marketplaceNamespace, pluginName, cloneUrl, ref) {
|
|
158
|
+
const cacheBase = path.join(getSourceCacheDir(), '.plugin-cache', marketplaceNamespace, pluginName);
|
|
159
|
+
try {
|
|
160
|
+
if (!fs.existsSync(path.join(cacheBase, '.git'))) {
|
|
161
|
+
fs.mkdirSync(path.dirname(cacheBase), { recursive: true });
|
|
162
|
+
const args = ['clone', '--depth', '1'];
|
|
163
|
+
if (ref)
|
|
164
|
+
args.push('--branch', ref);
|
|
165
|
+
args.push(cloneUrl, cacheBase);
|
|
166
|
+
runGit(args);
|
|
167
|
+
}
|
|
168
|
+
return cacheBase;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function runGit(args, options) {
|
|
175
|
+
return execFileSync('git', args, {
|
|
176
|
+
...options,
|
|
177
|
+
stdio: 'pipe',
|
|
178
|
+
encoding: 'utf-8',
|
|
179
|
+
timeout: 120_000,
|
|
180
|
+
}).trim();
|
|
181
|
+
}
|
|
182
|
+
// ── Plugin manifest ────────────────────────────────────────────────
|
|
78
183
|
function readPluginManifest(pluginDir) {
|
|
79
184
|
const manifestPath = path.join(pluginDir, PLUGIN_MANIFEST);
|
|
80
185
|
if (!fs.existsSync(manifestPath))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/marketplace/reader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/marketplace/reader.ts"],"names":[],"mappings":"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"}
|