@dsh-cc/plugin-loader 0.7.1-rc.3 → 0.8.0-rc.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.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 +58 -14
- 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/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|
package/lib/mcp.d.ts
CHANGED
package/lib/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,iEAAiE;AACjE,MAAM,WAAW,OAAO;IACtB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;CAC1E;AAED,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;CAClC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,iEAAiE;AACjE,MAAM,WAAW,OAAO;IACtB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;CAC1E;AAED,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;CAClC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BzI"}
|
package/lib/mcp.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
11
|
import { readFileSync } from 'node:fs';
|
|
12
|
-
import { resolve } from 'node:path';
|
|
12
|
+
import { resolve, join } from 'node:path';
|
|
13
13
|
import { ComponentTally } from "./seams.js";
|
|
14
14
|
/**
|
|
15
15
|
* Collect and register a plugin's MCP servers through the optional seam.
|
|
@@ -19,21 +19,94 @@ import { ComponentTally } from "./seams.js";
|
|
|
19
19
|
export function mountMcpServers(options) {
|
|
20
20
|
const tally = new ComponentTally('mcpServers');
|
|
21
21
|
const disposers = [];
|
|
22
|
+
const warnings = [];
|
|
22
23
|
if (options.mcp === undefined) {
|
|
23
24
|
tally.addSkipped('mcp seam "mcp" is not mounted');
|
|
24
|
-
return { disposers, tally };
|
|
25
|
+
return { disposers, tally, warnings };
|
|
25
26
|
}
|
|
26
27
|
const servers = collectServers(options.pluginRoot, options.manifest);
|
|
28
|
+
// Cursor default layout (plan §3.2): a root `mcp.json` is discovered when the
|
|
29
|
+
// manifest declares nothing. CC-flavored behavior is untouched.
|
|
30
|
+
if (options.manifest.flavor === 'cursor' && manifestDeclaresNothing(options.manifest)) {
|
|
31
|
+
Object.assign(servers, readMcpJson(join(options.pluginRoot, 'mcp.json')));
|
|
32
|
+
}
|
|
27
33
|
const entries = Object.entries(servers);
|
|
28
34
|
if (entries.length === 0) {
|
|
29
35
|
tally.addSkipped('plugin declares no MCP servers');
|
|
30
|
-
return { disposers, tally };
|
|
36
|
+
return { disposers, tally, warnings };
|
|
31
37
|
}
|
|
38
|
+
const cursor = options.manifest.flavor === 'cursor';
|
|
32
39
|
for (const [name, config] of entries) {
|
|
33
|
-
|
|
40
|
+
const prepared = cursor ? prepareCursorServer(name, config, options.pluginRoot, tally, warnings) : config;
|
|
41
|
+
if (prepared === undefined)
|
|
42
|
+
continue; // skipped with reason/warning already recorded
|
|
43
|
+
disposers.push(options.mcp.registerServer(name, prepared));
|
|
34
44
|
tally.addLoaded();
|
|
35
45
|
}
|
|
36
|
-
return { disposers, tally };
|
|
46
|
+
return { disposers, tally, warnings };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Cursor-dialect server preparation (plan §3.2): expand `${CURSOR_PLUGIN_ROOT}`
|
|
50
|
+
* to the plugin root, then require every remaining `${VAR}` to resolve against
|
|
51
|
+
* the environment — an unresolved reference fails THAT server with a warning
|
|
52
|
+
* naming the variable (never the whole plugin, never silent empty expansion).
|
|
53
|
+
* Returns `undefined` when the server was skipped.
|
|
54
|
+
*/
|
|
55
|
+
function prepareCursorServer(name, config, pluginRoot, tally, warnings) {
|
|
56
|
+
const substituted = JSON.parse(JSON.stringify(config).split('${CURSOR_PLUGIN_ROOT}').join(pluginRoot));
|
|
57
|
+
const missing = new Set();
|
|
58
|
+
collectUnresolvedVars(substituted, missing);
|
|
59
|
+
if (missing.size > 0) {
|
|
60
|
+
const reason = `skipped mcp server "${name}": environment variable${missing.size === 1 ? '' : 's'} "${[...missing].join('", "')}" not set`;
|
|
61
|
+
tally.addSkipped(reason);
|
|
62
|
+
warnings.push(reason);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
return substituteEnv(substituted);
|
|
66
|
+
}
|
|
67
|
+
/** Interpolate resolved `${VAR}` / `${VAR:-default}` references into string values. */
|
|
68
|
+
function substituteEnv(node) {
|
|
69
|
+
if (typeof node === 'string') {
|
|
70
|
+
return node.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g, (match, name, fallback) => {
|
|
71
|
+
const value = process.env[name];
|
|
72
|
+
if (value !== undefined && value !== '')
|
|
73
|
+
return value;
|
|
74
|
+
if (fallback !== undefined)
|
|
75
|
+
return fallback;
|
|
76
|
+
return match; // unreachable for validated configs; keep the reference visible
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(node))
|
|
80
|
+
return node.map(substituteEnv);
|
|
81
|
+
if (typeof node === 'object' && node !== null) {
|
|
82
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, substituteEnv(value)]));
|
|
83
|
+
}
|
|
84
|
+
return node;
|
|
85
|
+
}
|
|
86
|
+
/** Collect `${VAR}` references with no value in the environment (fallbacks count as resolved). */
|
|
87
|
+
function collectUnresolvedVars(node, missing) {
|
|
88
|
+
if (typeof node === 'string') {
|
|
89
|
+
for (const match of node.matchAll(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-[^}]*)?\}/g)) {
|
|
90
|
+
const variable = match[1];
|
|
91
|
+
if (match[2] === undefined && process.env[variable] === undefined)
|
|
92
|
+
missing.add(variable);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (Array.isArray(node)) {
|
|
97
|
+
for (const item of node)
|
|
98
|
+
collectUnresolvedVars(item, missing);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (typeof node === 'object' && node !== null) {
|
|
102
|
+
for (const value of Object.values(node))
|
|
103
|
+
collectUnresolvedVars(value, missing);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Whether the manifest stayed silent about mcpServers entirely. */
|
|
107
|
+
function manifestDeclaresNothing(manifest) {
|
|
108
|
+
return manifest.mcpServersPath === undefined && manifest.mcpServersPaths === undefined
|
|
109
|
+
&& Object.keys(manifest.mcpServers).length === 0;
|
|
37
110
|
}
|
|
38
111
|
/** Combine inline and file-backed MCP server definitions. */
|
|
39
112
|
function collectServers(pluginRoot, manifest) {
|
|
@@ -42,6 +115,9 @@ function collectServers(pluginRoot, manifest) {
|
|
|
42
115
|
const path = resolve(pluginRoot, manifest.mcpServersPath);
|
|
43
116
|
Object.assign(servers, readMcpJson(path));
|
|
44
117
|
}
|
|
118
|
+
for (const path of manifest.mcpServersPaths ?? []) {
|
|
119
|
+
Object.assign(servers, readMcpJson(resolve(pluginRoot, path)));
|
|
120
|
+
}
|
|
45
121
|
for (const [name, config] of Object.entries(manifest.mcpServers)) {
|
|
46
122
|
servers[name] = config;
|
|
47
123
|
}
|
package/lib/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,18 +9,32 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
|
+
import type { PluginFlavor } from './types.ts';
|
|
12
13
|
/** Resolved raw manifest plus the marketplace replace-default flag. */
|
|
13
14
|
export interface ResolvedPluginManifest {
|
|
14
15
|
/** JSON object to feed `parsePluginManifest`. */
|
|
15
16
|
readonly raw: unknown;
|
|
16
17
|
/** When true, listed `skills` replace the default `skills/` scan. */
|
|
17
18
|
readonly skillsReplaceDefault: boolean;
|
|
19
|
+
/** Which dialect won the candidate lookup (plan §3.1). */
|
|
20
|
+
readonly flavor: PluginFlavor;
|
|
21
|
+
/** Resolution warnings (e.g. dual-manifest precedence); travels on the parsed manifest. */
|
|
22
|
+
readonly warnings: readonly string[];
|
|
18
23
|
}
|
|
19
24
|
/**
|
|
20
25
|
* Locate and return the raw manifest for one plugin root.
|
|
26
|
+
*
|
|
27
|
+
* Preference (plan §3.1): `.claude-plugin/plugin.json`, then
|
|
28
|
+
* `.cursor-plugin/plugin.json`, then top-level `plugin.json`, then a matching
|
|
29
|
+
* `marketplace.json` overlay (requires `nameHint`), then a synthesized
|
|
30
|
+
* `{ name }`. When both nested manifests exist the CC manifest wins and a
|
|
31
|
+
* precedence warning is recorded. A marketplace file with no matching entry is
|
|
32
|
+
* a hard miss — never fall through to synthesis (that would load the whole
|
|
33
|
+
* skills repo).
|
|
34
|
+
*
|
|
21
35
|
* @param root - plugin root directory.
|
|
22
36
|
* @param nameHint - installed plugin name (no `@marketplace`), for overlays.
|
|
23
|
-
* @returns the raw JSON and
|
|
37
|
+
* @returns the raw JSON, flavor, and resolution warnings.
|
|
24
38
|
* @throws when a present file is unreadable/invalid, or a marketplace overlay misses `nameHint`.
|
|
25
39
|
*/
|
|
26
40
|
export declare function resolvePluginManifest(root: string, nameHint?: string): ResolvedPluginManifest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-manifest.d.ts","sourceRoot":"","sources":["../src/resolve-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"resolve-manifest.d.ts","sourceRoot":"","sources":["../src/resolve-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,uEAAuE;AACvE,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,qEAAqE;IACrE,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAwB7F"}
|
package/lib/resolve-manifest.js
CHANGED
|
@@ -11,28 +11,53 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { readFileSync } from 'node:fs';
|
|
13
13
|
import { basename, join, resolve } from 'node:path';
|
|
14
|
-
import {
|
|
15
|
-
/**
|
|
16
|
-
|
|
14
|
+
import { CURSOR_MANIFEST as CURSOR_DIR, MANIFEST_CANDIDATE_DIRS, MARKETPLACE_CANDIDATE_FILES, TOP_LEVEL_MANIFEST, } from "./discovery.js";
|
|
15
|
+
/** Flavor of the winning candidate path: cc dirs/top-level → 'cc', cursor dir → 'cursor'. */
|
|
16
|
+
function flavorOf(manifestPath) {
|
|
17
|
+
return manifestPath.includes(CURSOR_DIR) ? 'cursor' : 'cc';
|
|
18
|
+
}
|
|
17
19
|
/**
|
|
18
20
|
* Locate and return the raw manifest for one plugin root.
|
|
21
|
+
*
|
|
22
|
+
* Preference (plan §3.1): `.claude-plugin/plugin.json`, then
|
|
23
|
+
* `.cursor-plugin/plugin.json`, then top-level `plugin.json`, then a matching
|
|
24
|
+
* `marketplace.json` overlay (requires `nameHint`), then a synthesized
|
|
25
|
+
* `{ name }`. When both nested manifests exist the CC manifest wins and a
|
|
26
|
+
* precedence warning is recorded. A marketplace file with no matching entry is
|
|
27
|
+
* a hard miss — never fall through to synthesis (that would load the whole
|
|
28
|
+
* skills repo).
|
|
29
|
+
*
|
|
19
30
|
* @param root - plugin root directory.
|
|
20
31
|
* @param nameHint - installed plugin name (no `@marketplace`), for overlays.
|
|
21
|
-
* @returns the raw JSON and
|
|
32
|
+
* @returns the raw JSON, flavor, and resolution warnings.
|
|
22
33
|
* @throws when a present file is unreadable/invalid, or a marketplace overlay misses `nameHint`.
|
|
23
34
|
*/
|
|
24
35
|
export function resolvePluginManifest(root, nameHint) {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
const candidates = MANIFEST_CANDIDATE_DIRS.map(dir => join(root, dir, TOP_LEVEL_MANIFEST));
|
|
37
|
+
const items = candidates.map(path => ({ path, raw: readJsonIfPresent(path, root) }));
|
|
38
|
+
const winner = items.find(item => item.raw !== undefined);
|
|
39
|
+
if (winner !== undefined) {
|
|
40
|
+
return {
|
|
41
|
+
raw: winner.raw,
|
|
42
|
+
skillsReplaceDefault: false,
|
|
43
|
+
flavor: flavorOf(winner.path),
|
|
44
|
+
// S2 promotes this carrier into the first-class report warnings array.
|
|
45
|
+
warnings: items.filter(item => item.raw !== undefined).length > 1
|
|
46
|
+
? ['cursor manifest ignored: cc manifest takes precedence']
|
|
47
|
+
: [],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
28
50
|
const top = readJsonIfPresent(join(root, TOP_LEVEL_MANIFEST), root);
|
|
29
51
|
if (top !== undefined)
|
|
30
|
-
return { raw: top, skillsReplaceDefault: false };
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
52
|
+
return { raw: top, skillsReplaceDefault: false, flavor: 'cc', warnings: [] };
|
|
53
|
+
for (const file of MARKETPLACE_CANDIDATE_FILES) {
|
|
54
|
+
const market = readJsonIfPresent(join(root, file), root);
|
|
55
|
+
if (market === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
return { ...overlayFromMarketplace(market, root, nameHint), flavor: 'cc', warnings: [] };
|
|
58
|
+
}
|
|
34
59
|
const name = nameHint ?? basename(resolve(root));
|
|
35
|
-
return { raw: { name }, skillsReplaceDefault: false };
|
|
60
|
+
return { raw: { name }, skillsReplaceDefault: false, flavor: 'cc', warnings: [] };
|
|
36
61
|
}
|
|
37
62
|
/** Marketplace.json present: match `nameHint` or fail; never synthesize. */
|
|
38
63
|
function overlayFromMarketplace(raw, root, nameHint) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-manifest.js","sourceRoot":"","sources":["../src/resolve-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"resolve-manifest.js","sourceRoot":"","sources":["../src/resolve-manifest.ts"],"names":[],"mappings":"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"}
|
package/lib/rules.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount a Cursor plugin's rules (`rules/*.mdc`).
|
|
3
|
+
*
|
|
4
|
+
* Discovers `.mdc` rule files from the default `rules/` directory and any
|
|
5
|
+
* manifest-declared `rules` paths (append-default-dir convention, plan §3.3;
|
|
6
|
+
* S2 glob policy: `dir/**` walks, other metacharacters skip with a warning),
|
|
7
|
+
* parses typed frontmatter (`alwaysApply` boolean, `globs` inline or block
|
|
8
|
+
* YAML list), and merges the entries through the optional `rules` guest seam
|
|
9
|
+
* with copy-on-write disposal mirroring the hooks seam. A missing seam or a
|
|
10
|
+
* malformed rule file tallies skipped — never a load failure, never a throw.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { CcPluginManifest } from './types.ts';
|
|
15
|
+
import { ComponentTally, type RulesSeam } from './seams.ts';
|
|
16
|
+
/** The rules seam: accepts a plugin's parsed rule entries. */
|
|
17
|
+
export { type RulesSeam } from './seams.ts';
|
|
18
|
+
/** Options for mounting one plugin's rules. */
|
|
19
|
+
export interface MountRulesOptions {
|
|
20
|
+
/** The plugin root directory; the default `rules/` dir resolves against it. */
|
|
21
|
+
readonly pluginRoot: string;
|
|
22
|
+
/** The parsed manifest; `rules` paths (cursor default dir included) drive the mount. */
|
|
23
|
+
readonly manifest: CcPluginManifest;
|
|
24
|
+
/** The rules seam (probed; `undefined` to skip rules). */
|
|
25
|
+
readonly rules: RulesSeam | undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Discover and merge a plugin's rules through the optional seam.
|
|
29
|
+
* @param options - plugin root, manifest, and the rules seam.
|
|
30
|
+
* @returns mounted disposers and per-component counts.
|
|
31
|
+
*/
|
|
32
|
+
export declare function mountRules(options: MountRulesOptions): Promise<{
|
|
33
|
+
disposers: (() => void)[];
|
|
34
|
+
tally: ComponentTally;
|
|
35
|
+
warnings: string[];
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAG3D,8DAA8D;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAA;CACtC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoD9I"}
|
package/lib/rules.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mount a Cursor plugin's rules (`rules/*.mdc`).
|
|
3
|
+
*
|
|
4
|
+
* Discovers `.mdc` rule files from the default `rules/` directory and any
|
|
5
|
+
* manifest-declared `rules` paths (append-default-dir convention, plan §3.3;
|
|
6
|
+
* S2 glob policy: `dir/**` walks, other metacharacters skip with a warning),
|
|
7
|
+
* parses typed frontmatter (`alwaysApply` boolean, `globs` inline or block
|
|
8
|
+
* YAML list), and merges the entries through the optional `rules` guest seam
|
|
9
|
+
* with copy-on-write disposal mirroring the hooks seam. A missing seam or a
|
|
10
|
+
* malformed rule file tallies skipped — never a load failure, never a throw.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
15
|
+
import { join, relative, resolve } from 'node:path';
|
|
16
|
+
import { parseCcFrontmatterDocument } from '@dsh-cc/skill-loader';
|
|
17
|
+
import { ComponentTally } from "./seams.js";
|
|
18
|
+
import { globPathKind } from "./manifest.js";
|
|
19
|
+
/**
|
|
20
|
+
* Discover and merge a plugin's rules through the optional seam.
|
|
21
|
+
* @param options - plugin root, manifest, and the rules seam.
|
|
22
|
+
* @returns mounted disposers and per-component counts.
|
|
23
|
+
*/
|
|
24
|
+
export async function mountRules(options) {
|
|
25
|
+
const tally = new ComponentTally('rules');
|
|
26
|
+
const disposers = [];
|
|
27
|
+
const warnings = [];
|
|
28
|
+
// A plugin declaring nothing (cc flavor never declares rules) mounts no
|
|
29
|
+
// rules component at all — zero-change behavior for cc plugins.
|
|
30
|
+
if (options.manifest.rules.length === 0) {
|
|
31
|
+
return { disposers, tally, warnings };
|
|
32
|
+
}
|
|
33
|
+
if (options.rules === undefined) {
|
|
34
|
+
for (const path of options.manifest.rules) {
|
|
35
|
+
tally.addSkipped(`skipped rule path "${path}": rules seam "rules" is not mounted`);
|
|
36
|
+
}
|
|
37
|
+
return { disposers, tally, warnings };
|
|
38
|
+
}
|
|
39
|
+
const files = [];
|
|
40
|
+
for (const declared of options.manifest.rules) {
|
|
41
|
+
// Append-default-dir convention (agents precedent): a declared path that
|
|
42
|
+
// does not already live under `rules/` is read relative to the default dir.
|
|
43
|
+
const relative = declared.startsWith('rules/') || declared === 'rules' ? declared : `rules/${declared}`;
|
|
44
|
+
// Glob policy (plan §3.4): `dir/**` walks recursively; any other glob
|
|
45
|
+
// metacharacter is skipped with a warning, never expanded.
|
|
46
|
+
const kind = globPathKind(relative);
|
|
47
|
+
if (kind === 'unsupported') {
|
|
48
|
+
const reason = `skipped rules entry "${declared}": glob patterns other than a trailing "/**" are not expanded`;
|
|
49
|
+
tally.addSkipped(reason);
|
|
50
|
+
warnings.push(reason);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const before = files.length;
|
|
54
|
+
const resolved = resolve(options.pluginRoot, kind === 'recursive' ? relative.slice(0, -3) : relative);
|
|
55
|
+
await collectRuleFiles(resolved, files);
|
|
56
|
+
if (files.length === before)
|
|
57
|
+
tally.addSkipped(`no rule files found under "${declared}"`);
|
|
58
|
+
}
|
|
59
|
+
if (files.length === 0)
|
|
60
|
+
return { disposers, tally, warnings };
|
|
61
|
+
const entries = [];
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
const entry = await loadRuleFile(file, tally, warnings);
|
|
64
|
+
if (entry !== undefined) {
|
|
65
|
+
entries.push({
|
|
66
|
+
...entry,
|
|
67
|
+
// Paths on the seam are plugin-root-relative (RuleEntry contract).
|
|
68
|
+
path: relative(options.pluginRoot, file),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Merge even when every file was malformed: the seam call is the mount
|
|
73
|
+
// signal (an empty list), matching the never-throw hooks seam behavior.
|
|
74
|
+
// The report tallies loaded rule PATHS (one per parsed entry), per S4.
|
|
75
|
+
for (const _entry of entries)
|
|
76
|
+
tally.addLoaded();
|
|
77
|
+
disposers.push(options.rules.mergePluginRules(options.manifest.name, entries));
|
|
78
|
+
return { disposers, tally, warnings };
|
|
79
|
+
}
|
|
80
|
+
/** Collect `.mdc` files: a `.mdc` path is one file, anything else walks recursively. */
|
|
81
|
+
async function collectRuleFiles(path, found) {
|
|
82
|
+
if (path.endsWith('.mdc')) {
|
|
83
|
+
found.push(path);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await walkMdc(path, found);
|
|
87
|
+
}
|
|
88
|
+
/** Depth-first walk collecting every `.mdc` file under `dir` (absent dir is fine). */
|
|
89
|
+
async function walkMdc(dir, found) {
|
|
90
|
+
let entries;
|
|
91
|
+
try {
|
|
92
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
const child = join(dir, entry.name);
|
|
99
|
+
if (entry.isDirectory())
|
|
100
|
+
await walkMdc(child, found);
|
|
101
|
+
else if (entry.isFile() && entry.name.endsWith('.mdc'))
|
|
102
|
+
found.push(child);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Parse one `.mdc` file's typed frontmatter; malformed files skip with a reason. */
|
|
106
|
+
async function loadRuleFile(file, tally, warnings) {
|
|
107
|
+
const path = file;
|
|
108
|
+
let raw;
|
|
109
|
+
try {
|
|
110
|
+
raw = await readFile(file, 'utf8');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
const reason = `skipped rule "${path}": file could not be read`;
|
|
114
|
+
tally.addSkipped(reason);
|
|
115
|
+
warnings.push(reason);
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
const document = parseCcFrontmatterDocument(raw);
|
|
119
|
+
if (document === undefined) {
|
|
120
|
+
const reason = `skipped rule "${path}": frontmatter could not be parsed`;
|
|
121
|
+
tally.addSkipped(reason);
|
|
122
|
+
warnings.push(reason);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
const typed = typedFields(document.data);
|
|
126
|
+
if (typeof typed === 'string') {
|
|
127
|
+
const reason = `skipped rule "${path}": ${typed}`;
|
|
128
|
+
tally.addSkipped(reason);
|
|
129
|
+
warnings.push(reason);
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
path: file,
|
|
134
|
+
description: typed.description,
|
|
135
|
+
alwaysApply: typed.alwaysApply,
|
|
136
|
+
globs: typed.globs,
|
|
137
|
+
body: document.body,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Coerce the typed rule fields; a string return is a skip reason. */
|
|
141
|
+
function typedFields(data) {
|
|
142
|
+
let description;
|
|
143
|
+
if (data.description !== undefined) {
|
|
144
|
+
if (typeof data.description !== 'string')
|
|
145
|
+
return 'frontmatter field "description" must be a string';
|
|
146
|
+
description = data.description;
|
|
147
|
+
}
|
|
148
|
+
let alwaysApply = false;
|
|
149
|
+
if (data.alwaysApply !== undefined) {
|
|
150
|
+
const raw = data.alwaysApply;
|
|
151
|
+
if (typeof raw === 'boolean')
|
|
152
|
+
alwaysApply = raw;
|
|
153
|
+
else if (raw === 'true')
|
|
154
|
+
alwaysApply = true;
|
|
155
|
+
else if (raw === 'false')
|
|
156
|
+
alwaysApply = false;
|
|
157
|
+
else
|
|
158
|
+
return 'frontmatter field "alwaysApply" must be a boolean';
|
|
159
|
+
}
|
|
160
|
+
let globs = [];
|
|
161
|
+
if (data.globs !== undefined) {
|
|
162
|
+
const raw = data.globs;
|
|
163
|
+
const list = Array.isArray(raw) ? raw : typeof raw === 'string' ? raw.split(',') : null;
|
|
164
|
+
if (list === null || list.some(item => typeof item !== 'string')) {
|
|
165
|
+
return 'frontmatter field "globs" must be a string or a list of strings';
|
|
166
|
+
}
|
|
167
|
+
globs = list.map(item => item.trim()).filter(item => item.length > 0);
|
|
168
|
+
}
|
|
169
|
+
return { description, alwaysApply, globs };
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=rules.js.map
|
package/lib/rules.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
|
package/lib/seams.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
|
-
import type { ComponentKind, ComponentResult } from './types.ts';
|
|
13
|
+
import type { ComponentKind, ComponentResult, RuleEntry } from './types.ts';
|
|
14
14
|
/** A guest MCP seam: registers one named server for tool discovery. */
|
|
15
15
|
export interface McpSeam {
|
|
16
16
|
/**
|
|
@@ -35,6 +35,16 @@ export interface HooksSeam {
|
|
|
35
35
|
*/
|
|
36
36
|
mergePluginHooks(pluginName: string, config: unknown, pluginRoot?: string): () => void;
|
|
37
37
|
}
|
|
38
|
+
/** A guest rules seam: merges a plugin's parsed `.mdc` rule entries. */
|
|
39
|
+
export interface RulesSeam {
|
|
40
|
+
/**
|
|
41
|
+
* Merge a plugin's rules into the host's rule set.
|
|
42
|
+
* @param pluginName - the plugin that owns the rules, for namespacing.
|
|
43
|
+
* @param entries - the parsed rule entries (typed frontmatter + body).
|
|
44
|
+
* @returns the exact disposer that removes the plugin's contributions.
|
|
45
|
+
*/
|
|
46
|
+
mergePluginRules(pluginName: string, entries: readonly RuleEntry[]): () => void;
|
|
47
|
+
}
|
|
38
48
|
/** Probe a guest seam by key, returning `undefined` when the host lacks it. */
|
|
39
49
|
export declare function probe<X>(value: X | undefined): X | undefined;
|
|
40
50
|
/** Accumulates loaded/skipped/failed counts and reasons for one component. */
|
package/lib/seams.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seams.d.ts","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"seams.d.ts","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3E,uEAAuE;AACvE,MAAM,WAAW,OAAO;IACtB;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;CAC1E;AAED,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACxB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAA;CACvF;AAED,wEAAwE;AACxE,MAAM,WAAW,SAAS;IACxB;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,IAAI,CAAA;CAChF;AAED,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAE5D;AAED,8EAA8E;AAC9E,qBAAa,cAAc;IAUb,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC;;;OAGG;gBAC0B,IAAI,EAAE,aAAa;IAEhD,uCAAuC;IACvC,SAAS,IAAI,IAAI;IAIjB,wDAAwD;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKhC,uDAAuD;IACvD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,4CAA4C;IAC5C,MAAM,IAAI,eAAe;CAS1B"}
|
package/lib/seams.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seams.js","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"seams.js","sourceRoot":"","sources":["../src/seams.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAyCH,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAI,KAAoB;IAC3C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,cAAc;IAUI;IATrB,MAAM,GAAG,CAAC,CAAA;IACV,OAAO,GAAG,CAAC,CAAA;IACX,MAAM,GAAG,CAAC,CAAA;IACD,OAAO,GAAa,EAAE,CAAA;IAEvC;;;OAGG;IACH,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,uCAAuC;IACvC,SAAS;QACP,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,uDAAuD;IACvD,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,4CAA4C;IAC5C,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF"}
|
package/lib/skills.d.ts
CHANGED
package/lib/skills.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAQlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAI3C,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,WAAW,CAAA;AAS3C,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,IAAI,CAAA;CACrC;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IACnC,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;IACvC,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CACnC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgDhJ"}
|