rulesync 3.22.1 → 3.23.0
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 +19 -0
- package/dist/index.cjs +47 -33
- package/dist/index.js +47 -33
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -460,6 +460,25 @@ When enabling modular-mcp, each MCP server must have a `description` field. Exam
|
|
|
460
460
|
}
|
|
461
461
|
```
|
|
462
462
|
|
|
463
|
+
You can also configure `exposed` to exclude specific MCP servers from modular-mcp. It is optional and default to `false`. If you specify `exposed: true`, the MCP server is always loaded in the initial context.
|
|
464
|
+
|
|
465
|
+
```diff
|
|
466
|
+
// .rulesync/mcp.json
|
|
467
|
+
{
|
|
468
|
+
"mcpServers": {
|
|
469
|
+
"context7": {
|
|
470
|
+
+ "exposed": true,
|
|
471
|
+
"type": "stdio",
|
|
472
|
+
"command": "npx",
|
|
473
|
+
"args": [
|
|
474
|
+
"-y",
|
|
475
|
+
"@upstash/context7-mcp"
|
|
476
|
+
],
|
|
477
|
+
"env": {}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
463
482
|
To demonstrate the effect of modular-mcp, please see the following example:
|
|
464
483
|
|
|
465
484
|
<details>
|
package/dist/index.cjs
CHANGED
|
@@ -46,10 +46,7 @@ function isZodErrorLike(error) {
|
|
|
46
46
|
}
|
|
47
47
|
function formatError(error) {
|
|
48
48
|
if (error instanceof import_zod.ZodError || isZodErrorLike(error)) {
|
|
49
|
-
return error.issues
|
|
50
|
-
const path2 = issue.path.length > 0 ? `${issue.path.join(".")}: ` : "";
|
|
51
|
-
return `${path2}${issue.message}`;
|
|
52
|
-
}).join("; ");
|
|
49
|
+
return `Zod raw error: ${JSON.stringify(error.issues)}`;
|
|
53
50
|
}
|
|
54
51
|
if (error instanceof Error) {
|
|
55
52
|
return `${error.name}: ${error.message}`;
|
|
@@ -2743,14 +2740,18 @@ var McpServerBaseSchema = import_mini12.z.object({
|
|
|
2743
2740
|
kiroAutoBlock: import_mini12.z.optional(import_mini12.z.array(import_mini12.z.string())),
|
|
2744
2741
|
headers: import_mini12.z.optional(import_mini12.z.record(import_mini12.z.string(), import_mini12.z.string()))
|
|
2745
2742
|
});
|
|
2746
|
-
var
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2743
|
+
var RulesyncMcpServersSchema = import_mini12.z.union([
|
|
2744
|
+
import_mini12.z.extend(McpServerBaseSchema, {
|
|
2745
|
+
targets: import_mini12.z.optional(RulesyncTargetsSchema),
|
|
2746
|
+
description: import_mini12.z.optional(import_mini12.z.string()),
|
|
2747
|
+
exposed: import_mini12.z.optional(import_mini12.z.literal(false))
|
|
2748
|
+
}),
|
|
2749
|
+
import_mini12.z.extend(McpServerBaseSchema, {
|
|
2750
|
+
targets: import_mini12.z.optional(RulesyncTargetsSchema),
|
|
2751
|
+
description: import_mini12.z.undefined(),
|
|
2752
|
+
exposed: import_mini12.z.literal(true)
|
|
2753
|
+
})
|
|
2754
|
+
]);
|
|
2754
2755
|
var RulesyncMcpConfigSchema = import_mini12.z.object({
|
|
2755
2756
|
mcpServers: import_mini12.z.record(import_mini12.z.string(), RulesyncMcpServersSchema)
|
|
2756
2757
|
});
|
|
@@ -2781,17 +2782,6 @@ var RulesyncMcp = class _RulesyncMcp extends RulesyncFile {
|
|
|
2781
2782
|
};
|
|
2782
2783
|
}
|
|
2783
2784
|
validate() {
|
|
2784
|
-
if (this.modularMcp) {
|
|
2785
|
-
const result = ModularMcpServersSchema.safeParse(this.json.mcpServers);
|
|
2786
|
-
if (!result.success) {
|
|
2787
|
-
return {
|
|
2788
|
-
success: false,
|
|
2789
|
-
error: new Error(
|
|
2790
|
-
`Invalid MCP server configuration for modular-mcp: ${formatError(result.error)}`
|
|
2791
|
-
)
|
|
2792
|
-
};
|
|
2793
|
-
}
|
|
2794
|
-
}
|
|
2795
2785
|
return { success: true, error: null };
|
|
2796
2786
|
}
|
|
2797
2787
|
static async fromFile({
|
|
@@ -2841,20 +2831,40 @@ var RulesyncMcp = class _RulesyncMcp extends RulesyncFile {
|
|
|
2841
2831
|
modularMcp
|
|
2842
2832
|
});
|
|
2843
2833
|
}
|
|
2844
|
-
|
|
2845
|
-
if (
|
|
2846
|
-
return
|
|
2834
|
+
getExposedServers() {
|
|
2835
|
+
if (!this.json || typeof this.json !== "object") {
|
|
2836
|
+
return {};
|
|
2837
|
+
}
|
|
2838
|
+
if (!this.json.mcpServers || typeof this.json.mcpServers !== "object") {
|
|
2839
|
+
return {};
|
|
2847
2840
|
}
|
|
2841
|
+
return Object.fromEntries(
|
|
2842
|
+
Object.entries(this.json.mcpServers).filter(([, serverConfig]) => serverConfig.exposed === true).map(([serverName, serverConfig]) => [
|
|
2843
|
+
serverName,
|
|
2844
|
+
(0, import_object.omit)(serverConfig, ["description", "exposed"])
|
|
2845
|
+
])
|
|
2846
|
+
);
|
|
2847
|
+
}
|
|
2848
|
+
getJson({ modularMcp = false } = {}) {
|
|
2848
2849
|
if (!this.json || typeof this.json !== "object") {
|
|
2849
2850
|
return this.json;
|
|
2850
2851
|
}
|
|
2851
2852
|
if (!this.json.mcpServers || typeof this.json.mcpServers !== "object") {
|
|
2852
2853
|
return this.json;
|
|
2853
2854
|
}
|
|
2855
|
+
if (modularMcp) {
|
|
2856
|
+
const mcpServersForModularMcp = Object.fromEntries(
|
|
2857
|
+
Object.entries(this.json.mcpServers).filter(([, serverConfig]) => !serverConfig.exposed).map(([serverName, serverConfig]) => [serverName, (0, import_object.omit)(serverConfig, ["exposed"])])
|
|
2858
|
+
);
|
|
2859
|
+
return {
|
|
2860
|
+
...this.json,
|
|
2861
|
+
mcpServers: mcpServersForModularMcp
|
|
2862
|
+
};
|
|
2863
|
+
}
|
|
2854
2864
|
const mcpServersWithoutDescription = Object.fromEntries(
|
|
2855
2865
|
Object.entries(this.json.mcpServers).map(([serverName, serverConfig]) => [
|
|
2856
2866
|
serverName,
|
|
2857
|
-
(0, import_object.omit)(serverConfig, ["description"])
|
|
2867
|
+
(0, import_object.omit)(serverConfig, ["description", "exposed"])
|
|
2858
2868
|
])
|
|
2859
2869
|
);
|
|
2860
2870
|
return {
|
|
@@ -3107,11 +3117,15 @@ var ClaudecodeMcp = class _ClaudecodeMcp extends ToolMcp {
|
|
|
3107
3117
|
const json = JSON.parse(fileContent);
|
|
3108
3118
|
const mcpJson = modularMcp ? {
|
|
3109
3119
|
...json,
|
|
3110
|
-
mcpServers:
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3120
|
+
mcpServers: {
|
|
3121
|
+
...global ? ModularMcp.getMcpServers({
|
|
3122
|
+
baseDir,
|
|
3123
|
+
global: true,
|
|
3124
|
+
relativeDirPath: this.getSettablePaths({ global: true }).relativeDirPath
|
|
3125
|
+
}) : ModularMcp.getMcpServers({ baseDir, global: false }),
|
|
3126
|
+
// Merge exposed servers
|
|
3127
|
+
...rulesyncMcp.getExposedServers()
|
|
3128
|
+
}
|
|
3115
3129
|
} : { ...json, mcpServers: rulesyncMcp.getJson({ modularMcp: false }).mcpServers };
|
|
3116
3130
|
return new _ClaudecodeMcp({
|
|
3117
3131
|
baseDir,
|
|
@@ -8515,7 +8529,7 @@ async function mcpCommand({ version }) {
|
|
|
8515
8529
|
}
|
|
8516
8530
|
|
|
8517
8531
|
// src/cli/index.ts
|
|
8518
|
-
var getVersion = () => "3.
|
|
8532
|
+
var getVersion = () => "3.23.0";
|
|
8519
8533
|
var main = async () => {
|
|
8520
8534
|
const program = new import_commander.Command();
|
|
8521
8535
|
const version = getVersion();
|
package/dist/index.js
CHANGED
|
@@ -23,10 +23,7 @@ function isZodErrorLike(error) {
|
|
|
23
23
|
}
|
|
24
24
|
function formatError(error) {
|
|
25
25
|
if (error instanceof ZodError || isZodErrorLike(error)) {
|
|
26
|
-
return error.issues
|
|
27
|
-
const path2 = issue.path.length > 0 ? `${issue.path.join(".")}: ` : "";
|
|
28
|
-
return `${path2}${issue.message}`;
|
|
29
|
-
}).join("; ");
|
|
26
|
+
return `Zod raw error: ${JSON.stringify(error.issues)}`;
|
|
30
27
|
}
|
|
31
28
|
if (error instanceof Error) {
|
|
32
29
|
return `${error.name}: ${error.message}`;
|
|
@@ -2720,14 +2717,18 @@ var McpServerBaseSchema = z12.object({
|
|
|
2720
2717
|
kiroAutoBlock: z12.optional(z12.array(z12.string())),
|
|
2721
2718
|
headers: z12.optional(z12.record(z12.string(), z12.string()))
|
|
2722
2719
|
});
|
|
2723
|
-
var
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2720
|
+
var RulesyncMcpServersSchema = z12.union([
|
|
2721
|
+
z12.extend(McpServerBaseSchema, {
|
|
2722
|
+
targets: z12.optional(RulesyncTargetsSchema),
|
|
2723
|
+
description: z12.optional(z12.string()),
|
|
2724
|
+
exposed: z12.optional(z12.literal(false))
|
|
2725
|
+
}),
|
|
2726
|
+
z12.extend(McpServerBaseSchema, {
|
|
2727
|
+
targets: z12.optional(RulesyncTargetsSchema),
|
|
2728
|
+
description: z12.undefined(),
|
|
2729
|
+
exposed: z12.literal(true)
|
|
2730
|
+
})
|
|
2731
|
+
]);
|
|
2731
2732
|
var RulesyncMcpConfigSchema = z12.object({
|
|
2732
2733
|
mcpServers: z12.record(z12.string(), RulesyncMcpServersSchema)
|
|
2733
2734
|
});
|
|
@@ -2758,17 +2759,6 @@ var RulesyncMcp = class _RulesyncMcp extends RulesyncFile {
|
|
|
2758
2759
|
};
|
|
2759
2760
|
}
|
|
2760
2761
|
validate() {
|
|
2761
|
-
if (this.modularMcp) {
|
|
2762
|
-
const result = ModularMcpServersSchema.safeParse(this.json.mcpServers);
|
|
2763
|
-
if (!result.success) {
|
|
2764
|
-
return {
|
|
2765
|
-
success: false,
|
|
2766
|
-
error: new Error(
|
|
2767
|
-
`Invalid MCP server configuration for modular-mcp: ${formatError(result.error)}`
|
|
2768
|
-
)
|
|
2769
|
-
};
|
|
2770
|
-
}
|
|
2771
|
-
}
|
|
2772
2762
|
return { success: true, error: null };
|
|
2773
2763
|
}
|
|
2774
2764
|
static async fromFile({
|
|
@@ -2818,20 +2808,40 @@ var RulesyncMcp = class _RulesyncMcp extends RulesyncFile {
|
|
|
2818
2808
|
modularMcp
|
|
2819
2809
|
});
|
|
2820
2810
|
}
|
|
2821
|
-
|
|
2822
|
-
if (
|
|
2823
|
-
return
|
|
2811
|
+
getExposedServers() {
|
|
2812
|
+
if (!this.json || typeof this.json !== "object") {
|
|
2813
|
+
return {};
|
|
2814
|
+
}
|
|
2815
|
+
if (!this.json.mcpServers || typeof this.json.mcpServers !== "object") {
|
|
2816
|
+
return {};
|
|
2824
2817
|
}
|
|
2818
|
+
return Object.fromEntries(
|
|
2819
|
+
Object.entries(this.json.mcpServers).filter(([, serverConfig]) => serverConfig.exposed === true).map(([serverName, serverConfig]) => [
|
|
2820
|
+
serverName,
|
|
2821
|
+
omit(serverConfig, ["description", "exposed"])
|
|
2822
|
+
])
|
|
2823
|
+
);
|
|
2824
|
+
}
|
|
2825
|
+
getJson({ modularMcp = false } = {}) {
|
|
2825
2826
|
if (!this.json || typeof this.json !== "object") {
|
|
2826
2827
|
return this.json;
|
|
2827
2828
|
}
|
|
2828
2829
|
if (!this.json.mcpServers || typeof this.json.mcpServers !== "object") {
|
|
2829
2830
|
return this.json;
|
|
2830
2831
|
}
|
|
2832
|
+
if (modularMcp) {
|
|
2833
|
+
const mcpServersForModularMcp = Object.fromEntries(
|
|
2834
|
+
Object.entries(this.json.mcpServers).filter(([, serverConfig]) => !serverConfig.exposed).map(([serverName, serverConfig]) => [serverName, omit(serverConfig, ["exposed"])])
|
|
2835
|
+
);
|
|
2836
|
+
return {
|
|
2837
|
+
...this.json,
|
|
2838
|
+
mcpServers: mcpServersForModularMcp
|
|
2839
|
+
};
|
|
2840
|
+
}
|
|
2831
2841
|
const mcpServersWithoutDescription = Object.fromEntries(
|
|
2832
2842
|
Object.entries(this.json.mcpServers).map(([serverName, serverConfig]) => [
|
|
2833
2843
|
serverName,
|
|
2834
|
-
omit(serverConfig, ["description"])
|
|
2844
|
+
omit(serverConfig, ["description", "exposed"])
|
|
2835
2845
|
])
|
|
2836
2846
|
);
|
|
2837
2847
|
return {
|
|
@@ -3084,11 +3094,15 @@ var ClaudecodeMcp = class _ClaudecodeMcp extends ToolMcp {
|
|
|
3084
3094
|
const json = JSON.parse(fileContent);
|
|
3085
3095
|
const mcpJson = modularMcp ? {
|
|
3086
3096
|
...json,
|
|
3087
|
-
mcpServers:
|
|
3088
|
-
|
|
3089
|
-
|
|
3090
|
-
|
|
3091
|
-
|
|
3097
|
+
mcpServers: {
|
|
3098
|
+
...global ? ModularMcp.getMcpServers({
|
|
3099
|
+
baseDir,
|
|
3100
|
+
global: true,
|
|
3101
|
+
relativeDirPath: this.getSettablePaths({ global: true }).relativeDirPath
|
|
3102
|
+
}) : ModularMcp.getMcpServers({ baseDir, global: false }),
|
|
3103
|
+
// Merge exposed servers
|
|
3104
|
+
...rulesyncMcp.getExposedServers()
|
|
3105
|
+
}
|
|
3092
3106
|
} : { ...json, mcpServers: rulesyncMcp.getJson({ modularMcp: false }).mcpServers };
|
|
3093
3107
|
return new _ClaudecodeMcp({
|
|
3094
3108
|
baseDir,
|
|
@@ -8492,7 +8506,7 @@ async function mcpCommand({ version }) {
|
|
|
8492
8506
|
}
|
|
8493
8507
|
|
|
8494
8508
|
// src/cli/index.ts
|
|
8495
|
-
var getVersion = () => "3.
|
|
8509
|
+
var getVersion = () => "3.23.0";
|
|
8496
8510
|
var main = async () => {
|
|
8497
8511
|
const program = new Command();
|
|
8498
8512
|
const version = getVersion();
|