@dsh-cc/plugin-loader 0.7.1 → 0.8.0-rc.2
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.i18n.yaml +1 -1
- package/README.md +30 -0
- package/lib/actor-contract-gate.d.ts +66 -0
- package/lib/actor-contract-gate.d.ts.map +1 -0
- package/lib/actor-contract-gate.js +83 -0
- package/lib/actor-contract-gate.js.map +1 -0
- package/lib/agents.d.ts +5 -1
- package/lib/agents.d.ts.map +1 -1
- package/lib/agents.js +65 -21
- package/lib/agents.js.map +1 -1
- package/lib/commands.d.ts +1 -0
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +84 -10
- package/lib/commands.js.map +1 -1
- package/lib/discovery.d.ts +20 -0
- package/lib/discovery.d.ts.map +1 -1
- package/lib/discovery.js +37 -1
- package/lib/discovery.js.map +1 -1
- package/lib/hooks.d.ts +8 -0
- package/lib/hooks.d.ts.map +1 -1
- package/lib/hooks.js +74 -5
- package/lib/hooks.js.map +1 -1
- package/lib/index.d.ts +17 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +30 -8
- package/lib/index.js.map +1 -1
- package/lib/manifest.d.ts +11 -1
- package/lib/manifest.d.ts.map +1 -1
- package/lib/manifest.js +54 -1
- package/lib/manifest.js.map +1 -1
- package/lib/mcp.d.ts +1 -0
- package/lib/mcp.d.ts.map +1 -1
- package/lib/mcp.js +81 -5
- package/lib/mcp.js.map +1 -1
- package/lib/resolve-manifest.d.ts +15 -1
- package/lib/resolve-manifest.d.ts.map +1 -1
- package/lib/resolve-manifest.js +37 -12
- package/lib/resolve-manifest.js.map +1 -1
- package/lib/rules.d.ts +37 -0
- package/lib/rules.d.ts.map +1 -0
- package/lib/rules.js +171 -0
- package/lib/rules.js.map +1 -0
- package/lib/seams.d.ts +11 -1
- package/lib/seams.d.ts.map +1 -1
- package/lib/seams.js.map +1 -1
- package/lib/skills.d.ts +1 -0
- package/lib/skills.d.ts.map +1 -1
- package/lib/skills.js +45 -8
- package/lib/skills.js.map +1 -1
- package/lib/types.d.ts +31 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +17 -14
package/lib/discovery.d.ts
CHANGED
|
@@ -42,8 +42,28 @@ export interface DiscoverCcPluginRootsOptions {
|
|
|
42
42
|
}
|
|
43
43
|
/** Nested Claude Code manifest path, preferred over a top-level `plugin.json`. */
|
|
44
44
|
export declare const NESTED_MANIFEST: string;
|
|
45
|
+
/** Cursor dialect nested manifest path (plan §3.1), between cc-nested and legacy top-level. */
|
|
46
|
+
export declare const CURSOR_MANIFEST: string;
|
|
45
47
|
/** Legacy / fixture manifest path at the plugin root. */
|
|
46
48
|
export declare const TOP_LEVEL_MANIFEST = "plugin.json";
|
|
49
|
+
/**
|
|
50
|
+
* Ordered manifest candidate dirs (plan §3.1): first existing hit wins.
|
|
51
|
+
* CC dialect first so existing behavior is stable when both dialects exist.
|
|
52
|
+
*/
|
|
53
|
+
export declare const MANIFEST_CANDIDATE_DIRS: readonly string[];
|
|
54
|
+
/** Ordered marketplace overlay files (plan §3.1), symmetric with the manifest dirs. */
|
|
55
|
+
export declare const MARKETPLACE_CANDIDATE_FILES: readonly string[];
|
|
56
|
+
/** Ordered absolute manifest candidate paths for one plugin root (first hit wins). */
|
|
57
|
+
export declare function findPluginManifestPaths(root: string): string[];
|
|
58
|
+
/** First-hit winning manifest path for one plugin root, if the root is a plugin. */
|
|
59
|
+
export declare function findPluginManifestPath(root: string): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* First-hit marketplace manifest path for a marketplace repo root (plan §3.1
|
|
62
|
+
* symmetric overlay: claude first, then cursor), or undefined when neither
|
|
63
|
+
* exists. Shared by the loader overlay and the plugin-manager reads so the
|
|
64
|
+
* dialect selection lives in exactly one place.
|
|
65
|
+
*/
|
|
66
|
+
export declare function findMarketplaceManifestPath(root: string): string | undefined;
|
|
47
67
|
/**
|
|
48
68
|
* Discover plugin roots for the glue to mount.
|
|
49
69
|
* @param options - explicit dirs or the Claude-home / cwd pair for the default path.
|
package/lib/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,gIAAgI;IAChI,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC5E;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,QAAwC,CAAA;AAEpE,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,kBAAkB,EAAE,CAQtG;AAED,gHAAgH;AAChH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtD;AAOD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D"}
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,gIAAgI;IAChI,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC5E;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,QAAwC,CAAA;AAEpE,+FAA+F;AAC/F,eAAO,MAAM,eAAe,QAAwC,CAAA;AAEpE,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,gBAAgB,CAAA;AAE/C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAyC,CAAA;AAE9F,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAGxD,CAAA;AAED,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI9D;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,kBAAkB,EAAE,CAQtG;AAED,gHAAgH;AAChH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtD;AAOD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK3D"}
|
package/lib/discovery.js
CHANGED
|
@@ -17,8 +17,44 @@ import { resolveDshHome } from '@deepseek-ai/dsh-home-paths';
|
|
|
17
17
|
import { resolveLocalSettingsDir } from '@dsh-cc/settings-cascade/local-root';
|
|
18
18
|
/** Nested Claude Code manifest path, preferred over a top-level `plugin.json`. */
|
|
19
19
|
export const NESTED_MANIFEST = join('.claude-plugin', 'plugin.json');
|
|
20
|
+
/** Cursor dialect nested manifest path (plan §3.1), between cc-nested and legacy top-level. */
|
|
21
|
+
export const CURSOR_MANIFEST = join('.cursor-plugin', 'plugin.json');
|
|
20
22
|
/** Legacy / fixture manifest path at the plugin root. */
|
|
21
23
|
export const TOP_LEVEL_MANIFEST = 'plugin.json';
|
|
24
|
+
/**
|
|
25
|
+
* Ordered manifest candidate dirs (plan §3.1): first existing hit wins.
|
|
26
|
+
* CC dialect first so existing behavior is stable when both dialects exist.
|
|
27
|
+
*/
|
|
28
|
+
export const MANIFEST_CANDIDATE_DIRS = ['.claude-plugin', '.cursor-plugin'];
|
|
29
|
+
/** Ordered marketplace overlay files (plan §3.1), symmetric with the manifest dirs. */
|
|
30
|
+
export const MARKETPLACE_CANDIDATE_FILES = [
|
|
31
|
+
join('.claude-plugin', 'marketplace.json'),
|
|
32
|
+
join('.cursor-plugin', 'marketplace.json'),
|
|
33
|
+
];
|
|
34
|
+
/** Ordered absolute manifest candidate paths for one plugin root (first hit wins). */
|
|
35
|
+
export function findPluginManifestPaths(root) {
|
|
36
|
+
const candidates = MANIFEST_CANDIDATE_DIRS.map(dir => join(root, dir, TOP_LEVEL_MANIFEST));
|
|
37
|
+
candidates.push(join(root, TOP_LEVEL_MANIFEST));
|
|
38
|
+
return candidates.filter(path => existsSync(path));
|
|
39
|
+
}
|
|
40
|
+
/** First-hit winning manifest path for one plugin root, if the root is a plugin. */
|
|
41
|
+
export function findPluginManifestPath(root) {
|
|
42
|
+
return findPluginManifestPaths(root)[0];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* First-hit marketplace manifest path for a marketplace repo root (plan §3.1
|
|
46
|
+
* symmetric overlay: claude first, then cursor), or undefined when neither
|
|
47
|
+
* exists. Shared by the loader overlay and the plugin-manager reads so the
|
|
48
|
+
* dialect selection lives in exactly one place.
|
|
49
|
+
*/
|
|
50
|
+
export function findMarketplaceManifestPath(root) {
|
|
51
|
+
for (const file of MARKETPLACE_CANDIDATE_FILES) {
|
|
52
|
+
const path = join(root, file);
|
|
53
|
+
if (existsSync(path))
|
|
54
|
+
return path;
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
22
58
|
/**
|
|
23
59
|
* Discover plugin roots for the glue to mount.
|
|
24
60
|
* @param options - explicit dirs or the Claude-home / cwd pair for the default path.
|
|
@@ -90,7 +126,7 @@ function flattenPluginDirs(dirs) {
|
|
|
90
126
|
* Missing files are not a plugin root; unreadable/invalid JSON still is (basename fallback).
|
|
91
127
|
*/
|
|
92
128
|
function nameHintFromRoot(dir) {
|
|
93
|
-
for (const file of [NESTED_MANIFEST, TOP_LEVEL_MANIFEST]) {
|
|
129
|
+
for (const file of [NESTED_MANIFEST, CURSOR_MANIFEST, TOP_LEVEL_MANIFEST]) {
|
|
94
130
|
const text = readText(join(dir, file));
|
|
95
131
|
if (text === undefined)
|
|
96
132
|
continue;
|
package/lib/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/lib/hooks.d.ts
CHANGED
|
@@ -7,6 +7,13 @@
|
|
|
7
7
|
* seam is absent the component is reported skipped, never failed, so a
|
|
8
8
|
* deployment without the bridge keeps loading the rest of the plugin.
|
|
9
9
|
*
|
|
10
|
+
* Cursor-flavored plugins go through the verified dialect mapping table
|
|
11
|
+
* (plan §3.5, S0 probe verdict DIVERGENT): camelCase cursor events map onto
|
|
12
|
+
* their CC equivalents, cursor wire entries (`{command, matcher?, loop_limit?}`)
|
|
13
|
+
* become CC matcher groups, `${CURSOR_PLUGIN_ROOT}` expands to the plugin root,
|
|
14
|
+
* unmapped events skip with a warning, and `loop_limit` warns. CC-flavored
|
|
15
|
+
* plugins pass through untouched.
|
|
16
|
+
*
|
|
10
17
|
* @module
|
|
11
18
|
*/
|
|
12
19
|
import type { CcPluginManifest } from './types.ts';
|
|
@@ -42,5 +49,6 @@ export interface MountHooksOptions {
|
|
|
42
49
|
export declare function mountHooks(options: MountHooksOptions): {
|
|
43
50
|
disposers: (() => void)[];
|
|
44
51
|
tally: ComponentTally;
|
|
52
|
+
warnings: string[];
|
|
45
53
|
};
|
|
46
54
|
//# sourceMappingURL=hooks.d.ts.map
|
package/lib/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAmB3C,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB;;;;;;;OAOG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAA;CACvF;AAED,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;CACtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAyB/H"}
|
package/lib/hooks.js
CHANGED
|
@@ -7,11 +7,34 @@
|
|
|
7
7
|
* seam is absent the component is reported skipped, never failed, so a
|
|
8
8
|
* deployment without the bridge keeps loading the rest of the plugin.
|
|
9
9
|
*
|
|
10
|
+
* Cursor-flavored plugins go through the verified dialect mapping table
|
|
11
|
+
* (plan §3.5, S0 probe verdict DIVERGENT): camelCase cursor events map onto
|
|
12
|
+
* their CC equivalents, cursor wire entries (`{command, matcher?, loop_limit?}`)
|
|
13
|
+
* become CC matcher groups, `${CURSOR_PLUGIN_ROOT}` expands to the plugin root,
|
|
14
|
+
* unmapped events skip with a warning, and `loop_limit` warns. CC-flavored
|
|
15
|
+
* plugins pass through untouched.
|
|
16
|
+
*
|
|
10
17
|
* @module
|
|
11
18
|
*/
|
|
12
19
|
import { readFileSync } from 'node:fs';
|
|
13
20
|
import { join, resolve } from 'node:path';
|
|
14
21
|
import { ComponentTally } from "./seams.js";
|
|
22
|
+
/**
|
|
23
|
+
* Cursor → CC hooks event mapping (plan §3.5, verified table). Cursor events
|
|
24
|
+
* absent here have no CC equivalent and skip with a warning.
|
|
25
|
+
*/
|
|
26
|
+
const CURSOR_HOOK_EVENT_MAP = {
|
|
27
|
+
sessionStart: 'SessionStart',
|
|
28
|
+
sessionEnd: 'SessionEnd',
|
|
29
|
+
preToolUse: 'PreToolUse',
|
|
30
|
+
postToolUse: 'PostToolUse',
|
|
31
|
+
postToolUseFailure: 'PostToolUseFailure',
|
|
32
|
+
subagentStart: 'SubagentStart',
|
|
33
|
+
subagentStop: 'SubagentStop',
|
|
34
|
+
beforeSubmitPrompt: 'UserPromptSubmit',
|
|
35
|
+
preCompact: 'PreCompact',
|
|
36
|
+
stop: 'Stop',
|
|
37
|
+
};
|
|
15
38
|
/** Hooks live under this file in a plugin root, when present. */
|
|
16
39
|
export const STANDARD_HOOKS_FILE = 'hooks/hooks.json';
|
|
17
40
|
/**
|
|
@@ -22,22 +45,68 @@ export const STANDARD_HOOKS_FILE = 'hooks/hooks.json';
|
|
|
22
45
|
export function mountHooks(options) {
|
|
23
46
|
const tally = new ComponentTally('hooks');
|
|
24
47
|
const disposers = [];
|
|
48
|
+
const warnings = [];
|
|
25
49
|
if (options.hooks === undefined) {
|
|
26
50
|
tally.addSkipped('hooks seam "hooks" is not mounted');
|
|
27
|
-
return { disposers, tally };
|
|
51
|
+
return { disposers, tally, warnings };
|
|
28
52
|
}
|
|
29
53
|
const hooks = resolveHooks(options.pluginRoot, options.manifest);
|
|
30
54
|
if (hooks.error !== undefined) {
|
|
31
55
|
tally.addFailed(hooks.error);
|
|
32
|
-
return { disposers, tally };
|
|
56
|
+
return { disposers, tally, warnings };
|
|
33
57
|
}
|
|
34
58
|
if (hooks.value === undefined) {
|
|
35
59
|
tally.addSkipped('plugin declares no hooks');
|
|
36
|
-
return { disposers, tally };
|
|
60
|
+
return { disposers, tally, warnings };
|
|
37
61
|
}
|
|
38
|
-
|
|
62
|
+
let value = hooks.value;
|
|
63
|
+
if (options.manifest.flavor === 'cursor') {
|
|
64
|
+
const translated = translateCursorHooks(hooks.value, options.pluginRoot, tally, warnings);
|
|
65
|
+
value = translated;
|
|
66
|
+
}
|
|
67
|
+
disposers.push(options.hooks.mergePluginHooks(options.manifest.name, value, options.pluginRoot));
|
|
39
68
|
tally.addLoaded();
|
|
40
|
-
return { disposers, tally };
|
|
69
|
+
return { disposers, tally, warnings };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Translate a cursor hooks map (plan §3.5) into the CC `ClaudeCodeHookConfig`
|
|
73
|
+
* shape: camelCase event keys map through {@link CURSOR_HOOK_EVENT_MAP}, flat
|
|
74
|
+
* `{command, matcher?, loop_limit?}` entries become matcher groups,
|
|
75
|
+
* `${CURSOR_PLUGIN_ROOT}` expands to the plugin root, unmapped events tally as
|
|
76
|
+
* skipped, and unsupported entry fields surface as warnings.
|
|
77
|
+
*/
|
|
78
|
+
function translateCursorHooks(value, pluginRoot, tally, warnings) {
|
|
79
|
+
const source = value;
|
|
80
|
+
const out = {};
|
|
81
|
+
for (const [event, entries] of Object.entries(source)) {
|
|
82
|
+
const ccEvent = CURSOR_HOOK_EVENT_MAP[event];
|
|
83
|
+
if (ccEvent === undefined) {
|
|
84
|
+
tally.addSkipped(`skipped hook event "${event}": no Claude Code equivalent`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (!Array.isArray(entries))
|
|
88
|
+
continue;
|
|
89
|
+
const groups = [];
|
|
90
|
+
for (const raw of entries) {
|
|
91
|
+
if (typeof raw !== 'object' || raw === null)
|
|
92
|
+
continue;
|
|
93
|
+
const entry = raw;
|
|
94
|
+
if (typeof entry['command'] !== 'string')
|
|
95
|
+
continue;
|
|
96
|
+
const unsupported = Object.keys(entry).filter(key => !['command', 'matcher', 'loop_limit'].includes(key));
|
|
97
|
+
if (unsupported.length > 0 || entry['loop_limit'] !== undefined) {
|
|
98
|
+
const reason = `hook event "${event}": unsupported hook fields ignored (${entry['loop_limit'] !== undefined ? 'loop_limit' : unsupported.join(', ')})`;
|
|
99
|
+
warnings.push(reason);
|
|
100
|
+
}
|
|
101
|
+
groups.push({
|
|
102
|
+
...typeof entry['matcher'] === 'string' ? { matcher: entry['matcher'] } : {},
|
|
103
|
+
hooks: [{ type: 'command', command: entry['command'].split('${CURSOR_PLUGIN_ROOT}').join(pluginRoot) }],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (groups.length > 0)
|
|
107
|
+
out[ccEvent] = groups;
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
41
110
|
}
|
|
42
111
|
/** Resolve the plugin's hooks map, or a failure reason. */
|
|
43
112
|
function resolveHooks(pluginRoot, manifest) {
|
package/lib/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -21,14 +21,20 @@ import type { PluginLoadReport } from './types.ts';
|
|
|
21
21
|
import { type SkillsSeam } from './skills.ts';
|
|
22
22
|
import { type ResolveModel, type SubagentsSeam } from './agents.ts';
|
|
23
23
|
import { type MountedPluginCommand } from './commands.ts';
|
|
24
|
-
|
|
24
|
+
import { type RulesSeam } from './rules.ts';
|
|
25
|
+
import { type ActorContractGate } from './actor-contract-gate.ts';
|
|
26
|
+
export { ACTOR_CONTRACT_NAMESPACE, DEFAULT_ACTOR_CONTRACT_MODELS, actorContractSettingsSchema, gateCandidates, mountActorContractGate, ActorContractGate, } from './actor-contract-gate.ts';
|
|
27
|
+
export type { ActorContractSettings } from './actor-contract-gate.ts';
|
|
28
|
+
export type { CcPluginManifest, CcCommand, CcSkillRef, CcAgentRef, CcMcpServer, ComponentKind, ComponentResult, PluginLoadReport, PluginFlavor } from './types.ts';
|
|
25
29
|
export type { CcPluginCommandInfo, MountedPluginCommand } from './commands.ts';
|
|
26
30
|
export { parsePluginManifest } from './manifest.ts';
|
|
27
|
-
export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, TOP_LEVEL_MANIFEST } from './discovery.ts';
|
|
31
|
+
export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, CURSOR_MANIFEST, TOP_LEVEL_MANIFEST, MANIFEST_CANDIDATE_DIRS, MARKETPLACE_CANDIDATE_FILES, findPluginManifestPath, findPluginManifestPaths, findMarketplaceManifestPath, } from './discovery.ts';
|
|
28
32
|
export type { DiscoveredCcPlugin, DiscoverCcPluginRootsOptions } from './discovery.ts';
|
|
29
33
|
export { AgentProvider, STANDARD_AGENTS_DIR, PLUGIN_AGENT_PROVIDER_BRAND, isPluginAgentProvider } from './agents.ts';
|
|
30
34
|
export type { ResolveModel } from './agents.ts';
|
|
31
|
-
export type { McpSeam, HooksSeam } from './seams.ts';
|
|
35
|
+
export type { McpSeam, HooksSeam, RulesSeam } from './seams.ts';
|
|
36
|
+
export type { RuleEntry } from './types.ts';
|
|
37
|
+
export { mountRules } from './rules.ts';
|
|
32
38
|
export { skillToolRestriction, resolveSkillExecution, forbidsInlineShell, activationFor, registerSkillPathActivator, applySkillRestriction, PROVIDER, type AgentScope, type SkillExecution, type SkillActivation, } from './skill-semantics.ts';
|
|
33
39
|
/** The plugin.json file name at a plugin root (legacy / fixture path). */
|
|
34
40
|
export declare const MANIFEST_FILE = "plugin.json";
|
|
@@ -44,6 +50,8 @@ export interface MountedSeams {
|
|
|
44
50
|
settings?: SettingsSeam | undefined;
|
|
45
51
|
/** Hooks bridge seam (guest; absent in the harness today). */
|
|
46
52
|
hooks?: HooksSeam | undefined;
|
|
53
|
+
/** Rules merge seam (guest; absent in the harness today). */
|
|
54
|
+
rules?: RulesSeam | undefined;
|
|
47
55
|
/** MCP server seam (guest; absent in the harness today). */
|
|
48
56
|
mcp?: McpSeam | undefined;
|
|
49
57
|
}
|
|
@@ -68,6 +76,12 @@ export interface CcPluginMount {
|
|
|
68
76
|
* Recall every mounted component. Effect-scoped: calling it also releases
|
|
69
77
|
* the Cordis effect, and a context teardown calls it automatically.
|
|
70
78
|
*/
|
|
79
|
+
/**
|
|
80
|
+
* The plugin mount's local actor-contract gate (the live reader
|
|
81
|
+
* `AgentProvider.start` consults; drive `setSource`/`onChange` to simulate
|
|
82
|
+
* a settings hot reload).
|
|
83
|
+
*/
|
|
84
|
+
gate: ActorContractGate;
|
|
71
85
|
dispose(): void;
|
|
72
86
|
}
|
|
73
87
|
/**
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -18,12 +18,16 @@ import { mountSkills } from "./skills.js";
|
|
|
18
18
|
import { mountAgents } from "./agents.js";
|
|
19
19
|
import { mountCommands } from "./commands.js";
|
|
20
20
|
import { mountHooks } from "./hooks.js";
|
|
21
|
+
import { mountRules } from "./rules.js";
|
|
21
22
|
import { mountMcpServers } from "./mcp.js";
|
|
22
23
|
import { mountSettings } from "./settings.js";
|
|
23
24
|
import { resolvePluginManifest } from "./resolve-manifest.js";
|
|
25
|
+
import { mountActorContractGate } from "./actor-contract-gate.js";
|
|
26
|
+
export { ACTOR_CONTRACT_NAMESPACE, DEFAULT_ACTOR_CONTRACT_MODELS, actorContractSettingsSchema, gateCandidates, mountActorContractGate, ActorContractGate, } from "./actor-contract-gate.js";
|
|
24
27
|
export { parsePluginManifest } from "./manifest.js";
|
|
25
|
-
export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, TOP_LEVEL_MANIFEST } from "./discovery.js";
|
|
28
|
+
export { discoverCcPluginRoots, resolveClaudeHome, NESTED_MANIFEST, CURSOR_MANIFEST, TOP_LEVEL_MANIFEST, MANIFEST_CANDIDATE_DIRS, MARKETPLACE_CANDIDATE_FILES, findPluginManifestPath, findPluginManifestPaths, findMarketplaceManifestPath, } from "./discovery.js";
|
|
26
29
|
export { AgentProvider, STANDARD_AGENTS_DIR, PLUGIN_AGENT_PROVIDER_BRAND, isPluginAgentProvider } from "./agents.js";
|
|
30
|
+
export { mountRules } from "./rules.js";
|
|
27
31
|
export { skillToolRestriction, resolveSkillExecution, forbidsInlineShell, activationFor, registerSkillPathActivator, applySkillRestriction, PROVIDER, } from "./skill-semantics.js";
|
|
28
32
|
/** The plugin.json file name at a plugin root (legacy / fixture path). */
|
|
29
33
|
export const MANIFEST_FILE = 'plugin.json';
|
|
@@ -39,10 +43,18 @@ export async function mountCcPlugin(ctx, options) {
|
|
|
39
43
|
const resolved = resolvePluginManifest(root, options.nameHint);
|
|
40
44
|
const manifest = parsePluginManifest(resolved.raw, root, {
|
|
41
45
|
skillsReplaceDefault: resolved.skillsReplaceDefault,
|
|
46
|
+
flavor: resolved.flavor,
|
|
47
|
+
warnings: resolved.warnings,
|
|
42
48
|
});
|
|
43
49
|
const probed = await probeSeams(ctx, options.seams);
|
|
44
50
|
const disposers = [];
|
|
45
51
|
const components = [];
|
|
52
|
+
const mountWarnings = [];
|
|
53
|
+
// Actor-contract gate (§3.2): install the settings section (no cordis
|
|
54
|
+
// service — the task package owns `ccActorContractGate`) and thread the
|
|
55
|
+
// live patterns into every mounted agent's spawn seam.
|
|
56
|
+
const gate = mountActorContractGate(ctx);
|
|
57
|
+
const gatePatterns = () => gate.patterns();
|
|
46
58
|
let commandMount;
|
|
47
59
|
try {
|
|
48
60
|
fold(components, disposers, await mountSkills({
|
|
@@ -51,23 +63,30 @@ export async function mountCcPlugin(ctx, options) {
|
|
|
51
63
|
manifest,
|
|
52
64
|
skills: probed.skills,
|
|
53
65
|
subagentsPresent: probed.subagents !== undefined,
|
|
54
|
-
}));
|
|
66
|
+
}), mountWarnings);
|
|
55
67
|
fold(components, disposers, await mountAgents({
|
|
56
68
|
pluginRoot: root,
|
|
57
69
|
manifest,
|
|
58
70
|
subagents: probed.subagents,
|
|
59
71
|
...options.resolveModel !== undefined ? { resolveModel: options.resolveModel } : {},
|
|
72
|
+
gatePatterns,
|
|
60
73
|
// Same name-resolution chain as the manifest itself: manifest name (the
|
|
61
74
|
// parse/synthesis in resolve-manifest already falls back to nameHint,
|
|
62
75
|
// then the root basename), used to namespace agent provider names.
|
|
63
76
|
namespacePrefix: manifest.name,
|
|
64
|
-
}));
|
|
77
|
+
}), mountWarnings);
|
|
65
78
|
commandMount = mountCommands({ pluginRoot: root, manifest, commands: probed.commands });
|
|
66
79
|
components.push(commandMount.tally.result());
|
|
80
|
+
mountWarnings.push(...commandMount.warnings ?? []);
|
|
67
81
|
disposers.push(...commandMount.disposers);
|
|
68
|
-
fold(components, disposers, mountHooks({ pluginRoot: root, manifest, hooks: probed.hooks }));
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
fold(components, disposers, mountHooks({ pluginRoot: root, manifest, hooks: probed.hooks }), mountWarnings);
|
|
83
|
+
// Rules (Cursor dialect) mount after hooks, before mcpServers (plan §3.3).
|
|
84
|
+
// A manifest declaring no rules mounts no rules component (cc zero-change).
|
|
85
|
+
if (manifest.rules.length > 0) {
|
|
86
|
+
fold(components, disposers, await mountRules({ pluginRoot: root, manifest, rules: probed.rules }), mountWarnings);
|
|
87
|
+
}
|
|
88
|
+
fold(components, disposers, mountMcpServers({ pluginRoot: root, manifest, mcp: probed.mcp }), mountWarnings);
|
|
89
|
+
fold(components, disposers, mountSettings({ manifest, settings: probed.settings }), mountWarnings);
|
|
71
90
|
}
|
|
72
91
|
catch (error) {
|
|
73
92
|
// Component-level rollback: a component mount that throws after earlier
|
|
@@ -83,8 +102,9 @@ export async function mountCcPlugin(ctx, options) {
|
|
|
83
102
|
};
|
|
84
103
|
const effectDisposer = ctx.effect(() => tearDown, 'cc-plugin-loader.mount');
|
|
85
104
|
return {
|
|
86
|
-
report: { name: manifest.name, components },
|
|
105
|
+
report: { name: manifest.name, flavor: manifest.flavor, warnings: [...manifest.warnings, ...mountWarnings], components },
|
|
87
106
|
commands: commandMount.mounted,
|
|
107
|
+
gate,
|
|
88
108
|
dispose: () => effectDisposer(),
|
|
89
109
|
};
|
|
90
110
|
}
|
|
@@ -96,12 +116,14 @@ async function probeSeams(ctx, overrides) {
|
|
|
96
116
|
commands: overrides?.commands ?? ctx.get('commands'),
|
|
97
117
|
settings: overrides?.settings ?? ctx.get('settings'),
|
|
98
118
|
hooks: overrides?.hooks ?? ctx.get('hooks'),
|
|
119
|
+
rules: overrides?.rules ?? ctx.get('rules'),
|
|
99
120
|
mcp: overrides?.mcp ?? ctx.get('mcp'),
|
|
100
121
|
};
|
|
101
122
|
}
|
|
102
123
|
/** Fold one component mount into the report and disposer list. */
|
|
103
|
-
function fold(components, disposers, mount) {
|
|
124
|
+
function fold(components, disposers, mount, mountWarnings) {
|
|
104
125
|
components.push(mount.tally.result());
|
|
105
126
|
disposers.push(...mount.disposers);
|
|
127
|
+
mountWarnings.push(...mount.warnings ?? []);
|
|
106
128
|
}
|
|
107
129
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAOnD,OAAO,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAyC,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,aAAa,EAA6B,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/manifest.d.ts
CHANGED
|
@@ -11,11 +11,15 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module
|
|
13
13
|
*/
|
|
14
|
-
import type { CcPluginManifest } from './types.ts';
|
|
14
|
+
import type { CcPluginManifest, PluginFlavor } from './types.ts';
|
|
15
15
|
/** Extra flags the resolver threads in (not authored in plugin.json). */
|
|
16
16
|
export interface ParsePluginManifestOptions {
|
|
17
17
|
/** Marketplace-root overlay: listed `skills` replace the default `skills/` scan. */
|
|
18
18
|
readonly skillsReplaceDefault?: boolean;
|
|
19
|
+
/** Dialect of the winning manifest candidate (resolver-injected, plan §3.1). */
|
|
20
|
+
readonly flavor?: PluginFlavor;
|
|
21
|
+
/** Resolution warnings to carry on the parsed manifest (S2 promotes to report). */
|
|
22
|
+
readonly warnings?: readonly string[];
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Validate a raw `plugin.json` object into the loader's typed manifest subset.
|
|
@@ -26,4 +30,10 @@ export interface ParsePluginManifestOptions {
|
|
|
26
30
|
* @throws when the manifest is structurally invalid.
|
|
27
31
|
*/
|
|
28
32
|
export declare function parsePluginManifest(raw: unknown, source: string, options?: ParsePluginManifestOptions): CcPluginManifest;
|
|
33
|
+
/**
|
|
34
|
+
* Classify a manifest component path against the v1 glob policy (plan §3.4):
|
|
35
|
+
* `dir/**` is directory-recursive, any other glob metacharacter is unsupported
|
|
36
|
+
* (skipped with a warning, never expanded), everything else is literal.
|
|
37
|
+
*/
|
|
38
|
+
export declare function globPathKind(path: string): 'literal' | 'recursive' | 'unsupported';
|
|
29
39
|
//# sourceMappingURL=manifest.d.ts.map
|
package/lib/manifest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA0B,YAAY,EAAE,MAAM,YAAY,CAAA;AAExF,yEAAyE;AACzE,MAAM,WAAW,0BAA0B;IACzC,oFAAoF;IACpF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;IACvC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACtC;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,0BAA+B,GACvC,gBAAgB,CAuClB;AA4GD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAGlF"}
|
package/lib/manifest.js
CHANGED
|
@@ -27,10 +27,23 @@ export function parsePluginManifest(raw, source, options = {}) {
|
|
|
27
27
|
const commands = normalizeCommands(raw['commands'], name);
|
|
28
28
|
const agents = normalizeStringList(raw['agents'], name, 'agents');
|
|
29
29
|
const skills = normalizeStringList(raw['skills'], name, 'skills');
|
|
30
|
+
// Cursor default-dir inference (plan §3.2 component conventions): an
|
|
31
|
+
// undeclared `rules` still scans `rules/`, as with the implicit dirs.
|
|
32
|
+
const rules = normalizeRules(raw['rules'] ?? ((options.flavor ?? 'cc') === 'cursor' ? 'rules' : undefined), name);
|
|
30
33
|
const { mcpServers, mcpServersPath } = normalizeMcpServers(raw['mcpServers'], name);
|
|
31
34
|
const settings = isRecord(raw['settings']) ? raw['settings'] : {};
|
|
35
|
+
// Cursor-dialect tolerance warnings (plan §3.4): metadata fields are silently
|
|
36
|
+
// tolerated, but these two degrade silently unless surfaced.
|
|
37
|
+
const dialectWarnings = (options.flavor ?? 'cc') === 'cursor'
|
|
38
|
+
? [
|
|
39
|
+
...raw['minClientVersions'] !== undefined ? ['client-version gating is not enforced'] : [],
|
|
40
|
+
...raw['variables'] !== undefined ? ['plugin variables are not prompted; set values via environment'] : [],
|
|
41
|
+
]
|
|
42
|
+
: [];
|
|
32
43
|
return {
|
|
33
44
|
name,
|
|
45
|
+
flavor: options.flavor ?? 'cc',
|
|
46
|
+
warnings: [...options.warnings ?? [], ...dialectWarnings],
|
|
34
47
|
...typeof raw['version'] === 'string' ? { version: raw['version'] } : {},
|
|
35
48
|
...typeof raw['description'] === 'string' ? { description: raw['description'] } : {},
|
|
36
49
|
...raw['author'] !== undefined ? { author: raw['author'] } : {},
|
|
@@ -38,6 +51,7 @@ export function parsePluginManifest(raw, source, options = {}) {
|
|
|
38
51
|
commandsDeclared: raw['commands'] !== undefined,
|
|
39
52
|
agents,
|
|
40
53
|
skills,
|
|
54
|
+
rules,
|
|
41
55
|
skillsReplaceDefault: options.skillsReplaceDefault === true,
|
|
42
56
|
...raw['hooks'] !== undefined ? { hooks: raw['hooks'] } : {},
|
|
43
57
|
mcpServers,
|
|
@@ -102,6 +116,16 @@ function normalizeStringList(raw, name, field) {
|
|
|
102
116
|
return [...raw];
|
|
103
117
|
throw new Error(`plugin ${name}: "${field}" must be a path or a list of paths`);
|
|
104
118
|
}
|
|
119
|
+
/** Rules accept stringOrArray only — the Cursor schema has no map form. */
|
|
120
|
+
function normalizeRules(raw, name) {
|
|
121
|
+
if (raw === undefined)
|
|
122
|
+
return [];
|
|
123
|
+
if (typeof raw === 'string')
|
|
124
|
+
return [raw];
|
|
125
|
+
if (isStringArray(raw))
|
|
126
|
+
return [...raw];
|
|
127
|
+
throw new Error(`plugin ${name}: "rules" must be a path or a list of paths; a map form is not supported`);
|
|
128
|
+
}
|
|
105
129
|
function normalizeMcpServers(raw, name) {
|
|
106
130
|
if (raw === undefined)
|
|
107
131
|
return { mcpServers: {} };
|
|
@@ -109,7 +133,36 @@ function normalizeMcpServers(raw, name) {
|
|
|
109
133
|
return { mcpServers: {}, mcpServersPath: raw }; // an `.mcp.json` path
|
|
110
134
|
if (isRecord(raw))
|
|
111
135
|
return { mcpServers: raw };
|
|
112
|
-
|
|
136
|
+
// Cursor array form (plan §3.4): elements are `.mcp.json` paths or inline records.
|
|
137
|
+
if (Array.isArray(raw)) {
|
|
138
|
+
const servers = {};
|
|
139
|
+
const paths = [];
|
|
140
|
+
for (const item of raw) {
|
|
141
|
+
if (typeof item === 'string')
|
|
142
|
+
paths.push(item);
|
|
143
|
+
else if (isRecord(item))
|
|
144
|
+
Object.assign(servers, item);
|
|
145
|
+
else
|
|
146
|
+
throw new Error(`plugin ${name}: "mcpServers" array elements must be a path or an object map`);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
mcpServers: servers,
|
|
150
|
+
// Single path keeps the existing seam; multiple use the plural field.
|
|
151
|
+
...paths.length === 1 ? { mcpServersPath: paths[0] } : {},
|
|
152
|
+
...paths.length > 0 ? { mcpServersPaths: paths } : {},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`plugin ${name}: "mcpServers" must be a path, a list of paths/objects, or an object map`);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Classify a manifest component path against the v1 glob policy (plan §3.4):
|
|
159
|
+
* `dir/**` is directory-recursive, any other glob metacharacter is unsupported
|
|
160
|
+
* (skipped with a warning, never expanded), everything else is literal.
|
|
161
|
+
*/
|
|
162
|
+
export function globPathKind(path) {
|
|
163
|
+
if (path.endsWith('/**'))
|
|
164
|
+
return 'recursive';
|
|
165
|
+
return /[*?[]/.test(path) ? 'unsupported' : 'literal';
|
|
113
166
|
}
|
|
114
167
|
function isRecord(value) {
|
|
115
168
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|