mcp-lint 0.2.0 → 0.4.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 +322 -50
- package/dist/cli/commands/check.js +98 -52
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/compat.js +12 -2
- package/dist/cli/commands/compat.js.map +1 -1
- package/dist/cli/commands/diff.d.ts +2 -0
- package/dist/cli/commands/diff.js +134 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/fix.js +3 -1
- package/dist/cli/commands/fix.js.map +1 -1
- package/dist/cli/commands/preflight.d.ts +2 -0
- package/dist/cli/commands/preflight.js +109 -0
- package/dist/cli/commands/preflight.js.map +1 -0
- package/dist/config/config.d.ts +1 -1
- package/dist/config/config.js +2 -2
- package/dist/config/config.js.map +1 -1
- package/dist/config/plugin-loader.d.ts +6 -0
- package/dist/config/plugin-loader.js +19 -0
- package/dist/config/plugin-loader.js.map +1 -0
- package/dist/config/presets.d.ts +1 -1
- package/dist/config/presets.js +13 -4
- package/dist/config/presets.js.map +1 -1
- package/dist/core/quality-score.d.ts +15 -0
- package/dist/core/quality-score.js +30 -0
- package/dist/core/quality-score.js.map +1 -0
- package/dist/core/rule.d.ts +1 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/preflight/engine.d.ts +2 -0
- package/dist/preflight/engine.js +73 -0
- package/dist/preflight/engine.js.map +1 -0
- package/dist/preflight/index.d.ts +4 -0
- package/dist/preflight/index.js +4 -0
- package/dist/preflight/index.js.map +1 -0
- package/dist/preflight/policy.d.ts +4 -0
- package/dist/preflight/policy.js +97 -0
- package/dist/preflight/policy.js.map +1 -0
- package/dist/preflight/scorer.d.ts +7 -0
- package/dist/preflight/scorer.js +121 -0
- package/dist/preflight/scorer.js.map +1 -0
- package/dist/preflight/types.d.ts +57 -0
- package/dist/preflight/types.js +2 -0
- package/dist/preflight/types.js.map +1 -0
- package/examples/actions/destructive-delete.json +11 -0
- package/examples/actions/rewrite-tmp.json +8 -0
- package/examples/actions/safe-read.json +8 -0
- package/examples/github-action.yml +23 -0
- package/examples/policies/default.yml +59 -0
- package/examples/policies/permissive-dev.yml +33 -0
- package/examples/policies/strict.yml +42 -0
- package/package.json +23 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { LintEngine } from '../../core/engine.js';
|
|
|
5
5
|
import { buildCompatMatrix } from '../../core/compat-matrix.js';
|
|
6
6
|
import { allRules } from '../../rules/index.js';
|
|
7
7
|
import { loadConfig, DEFAULT_CONFIG } from '../../config/config.js';
|
|
8
|
+
import { loadPluginRules } from '../../config/plugin-loader.js';
|
|
8
9
|
import chalk from 'chalk';
|
|
9
10
|
function formatCompatTerminal(matrix, noColor) {
|
|
10
11
|
if (noColor)
|
|
@@ -72,6 +73,7 @@ export function registerCompatCommand(program) {
|
|
|
72
73
|
.option('--format <format>', 'Output format: terminal|json|markdown', 'terminal')
|
|
73
74
|
.option('--no-color', 'Disable terminal colors')
|
|
74
75
|
.option('--config <path>', 'Path to .mcplintrc.json config file')
|
|
76
|
+
.option('--client <client>', 'Show only one client column')
|
|
75
77
|
.option('--server <type>', 'Server transport: stdio|sse')
|
|
76
78
|
.option('--url <url>', 'SSE server URL (use with --server sse)')
|
|
77
79
|
.allowExcessArguments(true)
|
|
@@ -102,9 +104,17 @@ export function registerCompatCommand(program) {
|
|
|
102
104
|
throw new Error('Specify an input file or use --server stdio|sse');
|
|
103
105
|
tools = await loadFile(input);
|
|
104
106
|
}
|
|
105
|
-
const
|
|
107
|
+
const pluginRules = await loadPluginRules(config);
|
|
108
|
+
const engine = new LintEngine([...allRules, ...pluginRules], config);
|
|
106
109
|
const diagnostics = engine.lint(tools);
|
|
107
|
-
|
|
110
|
+
let matrix = buildCompatMatrix(tools, diagnostics);
|
|
111
|
+
if (options.client) {
|
|
112
|
+
const clientId = options.client;
|
|
113
|
+
if (!matrix.clients.includes(clientId)) {
|
|
114
|
+
throw new Error(`Unknown client "${options.client}". Available: ${matrix.clients.join(', ')}`);
|
|
115
|
+
}
|
|
116
|
+
matrix = { ...matrix, clients: [clientId] };
|
|
117
|
+
}
|
|
108
118
|
let output;
|
|
109
119
|
if (options.format === 'json') {
|
|
110
120
|
output = formatCompatJson(matrix);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../src/cli/commands/compat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../src/cli/commands/compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { loadFile } from '../../loaders/file-loader.js';
|
|
2
|
+
import { LintEngine } from '../../core/engine.js';
|
|
3
|
+
import { allRules } from '../../rules/index.js';
|
|
4
|
+
import { loadConfig, DEFAULT_CONFIG } from '../../config/config.js';
|
|
5
|
+
import { loadPluginRules } from '../../config/plugin-loader.js';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
function diffDiagnostics(before, after) {
|
|
8
|
+
const key = (d) => `${d.toolName}::${d.ruleId}::${d.path}`;
|
|
9
|
+
const beforeMap = new Map(before.map((d) => [key(d), d]));
|
|
10
|
+
const afterMap = new Map(after.map((d) => [key(d), d]));
|
|
11
|
+
const fixed = before.filter((d) => !afterMap.has(key(d)));
|
|
12
|
+
const introduced = after.filter((d) => !beforeMap.has(key(d)));
|
|
13
|
+
const unchanged = after.filter((d) => beforeMap.has(key(d)));
|
|
14
|
+
return { fixed, introduced, unchanged };
|
|
15
|
+
}
|
|
16
|
+
function formatDiffTerminal(diff, noColor) {
|
|
17
|
+
if (noColor)
|
|
18
|
+
chalk.level = 0;
|
|
19
|
+
const lines = [''];
|
|
20
|
+
if (diff.introduced.length === 0 && diff.fixed.length === 0) {
|
|
21
|
+
lines.push(chalk.dim('No changes in lint results.\n'));
|
|
22
|
+
return lines.join('\n');
|
|
23
|
+
}
|
|
24
|
+
if (diff.introduced.length > 0) {
|
|
25
|
+
lines.push(chalk.bold.red(`✖ ${diff.introduced.length} new issue${diff.introduced.length !== 1 ? 's' : ''} introduced:`));
|
|
26
|
+
for (const d of diff.introduced) {
|
|
27
|
+
const icon = d.severity === 'error' ? chalk.red('✖') : chalk.yellow('⚠');
|
|
28
|
+
lines.push(` ${icon} [${d.toolName}] ${chalk.red(d.message)}`);
|
|
29
|
+
lines.push(` ${chalk.gray(d.path)} ${chalk.dim(`[${d.ruleId}]`)}`);
|
|
30
|
+
}
|
|
31
|
+
lines.push('');
|
|
32
|
+
}
|
|
33
|
+
if (diff.fixed.length > 0) {
|
|
34
|
+
lines.push(chalk.bold.green(`✔ ${diff.fixed.length} issue${diff.fixed.length !== 1 ? 's' : ''} fixed:`));
|
|
35
|
+
for (const d of diff.fixed) {
|
|
36
|
+
lines.push(` ${chalk.green('✔')} [${d.toolName}] ${chalk.green(d.message)}`);
|
|
37
|
+
lines.push(` ${chalk.gray(d.path)} ${chalk.dim(`[${d.ruleId}]`)}`);
|
|
38
|
+
}
|
|
39
|
+
lines.push('');
|
|
40
|
+
}
|
|
41
|
+
if (diff.unchanged.length > 0) {
|
|
42
|
+
lines.push(chalk.dim(`${diff.unchanged.length} existing issue${diff.unchanged.length !== 1 ? 's' : ''} unchanged.`));
|
|
43
|
+
lines.push('');
|
|
44
|
+
}
|
|
45
|
+
return lines.join('\n');
|
|
46
|
+
}
|
|
47
|
+
function formatDiffJson(diff) {
|
|
48
|
+
return JSON.stringify({
|
|
49
|
+
introduced: diff.introduced,
|
|
50
|
+
fixed: diff.fixed,
|
|
51
|
+
unchanged: diff.unchanged,
|
|
52
|
+
summary: {
|
|
53
|
+
introduced: diff.introduced.length,
|
|
54
|
+
fixed: diff.fixed.length,
|
|
55
|
+
unchanged: diff.unchanged.length,
|
|
56
|
+
},
|
|
57
|
+
}, null, 2) + '\n';
|
|
58
|
+
}
|
|
59
|
+
function formatDiffMarkdown(diff) {
|
|
60
|
+
const lines = [];
|
|
61
|
+
if (diff.introduced.length === 0 && diff.fixed.length === 0) {
|
|
62
|
+
lines.push('_No changes in lint results._');
|
|
63
|
+
return lines.join('\n') + '\n';
|
|
64
|
+
}
|
|
65
|
+
if (diff.introduced.length > 0) {
|
|
66
|
+
lines.push(`### ❌ ${diff.introduced.length} new issue${diff.introduced.length !== 1 ? 's' : ''} introduced`);
|
|
67
|
+
lines.push('');
|
|
68
|
+
for (const d of diff.introduced) {
|
|
69
|
+
lines.push(`- **[${d.toolName}]** \`${d.ruleId}\` — ${d.message}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push('');
|
|
72
|
+
}
|
|
73
|
+
if (diff.fixed.length > 0) {
|
|
74
|
+
lines.push(`### ✅ ${diff.fixed.length} issue${diff.fixed.length !== 1 ? 's' : ''} fixed`);
|
|
75
|
+
lines.push('');
|
|
76
|
+
for (const d of diff.fixed) {
|
|
77
|
+
lines.push(`- **[${d.toolName}]** \`${d.ruleId}\` — ${d.message}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
if (diff.unchanged.length > 0) {
|
|
82
|
+
lines.push(`_${diff.unchanged.length} existing issue${diff.unchanged.length !== 1 ? 's' : ''} unchanged._`);
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n') + '\n';
|
|
85
|
+
}
|
|
86
|
+
export function registerDiffCommand(program) {
|
|
87
|
+
program
|
|
88
|
+
.command('diff <before> <after>')
|
|
89
|
+
.description('Compare lint results between two schema versions')
|
|
90
|
+
.option('--format <format>', 'Output format: terminal|json|markdown', 'terminal')
|
|
91
|
+
.option('--no-color', 'Disable terminal colors')
|
|
92
|
+
.option('--config <path>', 'Path to .mcplintrc.json config file')
|
|
93
|
+
.option('--clients <clients>', 'Comma-separated client filter')
|
|
94
|
+
.action(async (before, after, options) => {
|
|
95
|
+
try {
|
|
96
|
+
const fileConfig = await loadConfig(options.config);
|
|
97
|
+
const cliClients = options.clients
|
|
98
|
+
? options.clients.split(',').map((s) => s.trim())
|
|
99
|
+
: undefined;
|
|
100
|
+
const config = {
|
|
101
|
+
clients: DEFAULT_CONFIG.clients,
|
|
102
|
+
...fileConfig,
|
|
103
|
+
...(cliClients ? { clients: cliClients } : {}),
|
|
104
|
+
};
|
|
105
|
+
const [toolsBefore, toolsAfter] = await Promise.all([
|
|
106
|
+
loadFile(before),
|
|
107
|
+
loadFile(after),
|
|
108
|
+
]);
|
|
109
|
+
const pluginRules = await loadPluginRules(config);
|
|
110
|
+
const engine = new LintEngine([...allRules, ...pluginRules], config);
|
|
111
|
+
const diagBefore = engine.lint(toolsBefore);
|
|
112
|
+
const diagAfter = engine.lint(toolsAfter);
|
|
113
|
+
const diff = diffDiagnostics(diagBefore, diagAfter);
|
|
114
|
+
let output;
|
|
115
|
+
if (options.format === 'json') {
|
|
116
|
+
output = formatDiffJson(diff);
|
|
117
|
+
}
|
|
118
|
+
else if (options.format === 'markdown') {
|
|
119
|
+
output = formatDiffMarkdown(diff);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
output = formatDiffTerminal(diff, !options.color);
|
|
123
|
+
}
|
|
124
|
+
process.stdout.write(output);
|
|
125
|
+
const hasNewErrors = diff.introduced.some((d) => d.severity === 'error');
|
|
126
|
+
process.exit(hasNewErrors ? 1 : 0);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
130
|
+
process.exit(2);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands/fix.js
CHANGED
|
@@ -4,6 +4,7 @@ import { LintEngine } from '../../core/engine.js';
|
|
|
4
4
|
import { allRules } from '../../rules/index.js';
|
|
5
5
|
import { applyFixes } from '../../core/fixer.js';
|
|
6
6
|
import { loadConfig } from '../../config/config.js';
|
|
7
|
+
import { loadPluginRules } from '../../config/plugin-loader.js';
|
|
7
8
|
export function registerFixCommand(program) {
|
|
8
9
|
program
|
|
9
10
|
.command('fix <input>')
|
|
@@ -16,8 +17,9 @@ export function registerFixCommand(program) {
|
|
|
16
17
|
.action(async (input, options) => {
|
|
17
18
|
try {
|
|
18
19
|
const fileConfig = await loadConfig(options.config);
|
|
20
|
+
const pluginRules = await loadPluginRules(fileConfig);
|
|
19
21
|
const tools = await loadFile(input);
|
|
20
|
-
const engine = new LintEngine(allRules, fileConfig);
|
|
22
|
+
const engine = new LintEngine([...allRules, ...pluginRules], fileConfig);
|
|
21
23
|
const diagnostics = engine.lint(tools);
|
|
22
24
|
const onlyRules = options.rules
|
|
23
25
|
? options.rules.split(',').map((r) => r.trim())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../src/cli/commands/fix.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../src/cli/commands/fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { preflight } from '../../preflight/engine.js';
|
|
4
|
+
import { loadPolicy } from '../../preflight/policy.js';
|
|
5
|
+
export function registerPreflightCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command('preflight [action-file]')
|
|
8
|
+
.description('Evaluate a proposed agent action against a policy before execution')
|
|
9
|
+
.option('--policy <path>', 'Path to preflight policy YAML file')
|
|
10
|
+
.option('--format <format>', 'Output format: terminal|json', 'terminal')
|
|
11
|
+
.option('--no-color', 'Disable terminal colors')
|
|
12
|
+
.option('--stdin', 'Read action JSON from stdin')
|
|
13
|
+
.action(async (actionFile, options) => {
|
|
14
|
+
if (!options.color)
|
|
15
|
+
chalk.level = 0;
|
|
16
|
+
try {
|
|
17
|
+
const action = await readAction(actionFile, options.stdin ?? false);
|
|
18
|
+
const policy = options.policy ? await loadPolicy(options.policy) : undefined;
|
|
19
|
+
const decision = preflight(action, policy);
|
|
20
|
+
if (options.format === 'json') {
|
|
21
|
+
process.stdout.write(JSON.stringify(decision, null, 2) + '\n');
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.stdout.write(renderTerminal(decision));
|
|
25
|
+
}
|
|
26
|
+
const exitCode = decisionExitCode(decision);
|
|
27
|
+
process.exit(exitCode);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
31
|
+
process.exit(2);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function readAction(path, stdin) {
|
|
36
|
+
let raw;
|
|
37
|
+
if (stdin || !path) {
|
|
38
|
+
if (process.stdin.isTTY && !stdin) {
|
|
39
|
+
throw new Error('Specify an action file or use --stdin');
|
|
40
|
+
}
|
|
41
|
+
raw = await readStdin();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
raw = await readFile(path, 'utf8');
|
|
45
|
+
}
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
async function readStdin() {
|
|
49
|
+
const chunks = [];
|
|
50
|
+
for await (const chunk of process.stdin) {
|
|
51
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
52
|
+
}
|
|
53
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
54
|
+
}
|
|
55
|
+
function decisionExitCode(d) {
|
|
56
|
+
switch (d.decision) {
|
|
57
|
+
case 'allow':
|
|
58
|
+
case 'allow_with_rewrite':
|
|
59
|
+
return 0;
|
|
60
|
+
case 'require_approval':
|
|
61
|
+
return 1;
|
|
62
|
+
case 'deny':
|
|
63
|
+
return 2;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function renderTerminal(d) {
|
|
67
|
+
const lines = [];
|
|
68
|
+
const decisionColor = d.decision === 'deny'
|
|
69
|
+
? chalk.red
|
|
70
|
+
: d.decision === 'require_approval'
|
|
71
|
+
? chalk.yellow
|
|
72
|
+
: d.decision === 'allow_with_rewrite'
|
|
73
|
+
? chalk.cyan
|
|
74
|
+
: chalk.green;
|
|
75
|
+
lines.push('');
|
|
76
|
+
lines.push(chalk.bold('Preflight Decision'));
|
|
77
|
+
lines.push('─'.repeat(40));
|
|
78
|
+
lines.push(`Decision: ${decisionColor(d.decision.toUpperCase())}`);
|
|
79
|
+
lines.push(`Risk score: ${riskColor(d.risk_score)}`);
|
|
80
|
+
lines.push(`Reversibility: ${d.reversibility}`);
|
|
81
|
+
lines.push(`Est. cost: $${d.estimated_cost_usd.toFixed(2)}`);
|
|
82
|
+
if (d.matched_policies.length > 0) {
|
|
83
|
+
lines.push(`Policies: ${d.matched_policies.join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
if (d.reasons.length > 0) {
|
|
86
|
+
lines.push(`Reasons: ${d.reasons.join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
if (d.safe_alternative) {
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(chalk.bold('Safe alternative:'));
|
|
91
|
+
lines.push(` ${d.safe_alternative.tool_type} → ${d.safe_alternative.action}`);
|
|
92
|
+
if (d.safe_alternative.target) {
|
|
93
|
+
lines.push(` target: ${d.safe_alternative.target}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lines.push('');
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
function riskColor(score) {
|
|
100
|
+
const s = score.toFixed(2);
|
|
101
|
+
if (score >= 0.9)
|
|
102
|
+
return chalk.red(s);
|
|
103
|
+
if (score >= 0.7)
|
|
104
|
+
return chalk.yellow(s);
|
|
105
|
+
if (score >= 0.4)
|
|
106
|
+
return chalk.cyan(s);
|
|
107
|
+
return chalk.green(s);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/cli/commands/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/config/config.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Config } from '../core/rule.js';
|
|
2
2
|
export declare function loadConfig(configPath?: string): Promise<Config>;
|
|
3
|
-
export declare const DEFAULT_CONFIG: Required<Omit<Config, 'rules' | 'extends'>>;
|
|
3
|
+
export declare const DEFAULT_CONFIG: Required<Omit<Config, 'rules' | 'extends' | 'plugins'>>;
|
package/dist/config/config.js
CHANGED
|
@@ -10,7 +10,7 @@ export async function loadConfig(configPath) {
|
|
|
10
10
|
if (configPath) {
|
|
11
11
|
try {
|
|
12
12
|
const raw = await readConfigFile(configPath);
|
|
13
|
-
return applyExtends(raw);
|
|
13
|
+
return await applyExtends(raw);
|
|
14
14
|
}
|
|
15
15
|
catch (err) {
|
|
16
16
|
throw new Error(`Cannot load config from "${configPath}": ${err.message}`);
|
|
@@ -21,7 +21,7 @@ export async function loadConfig(configPath) {
|
|
|
21
21
|
while (true) {
|
|
22
22
|
try {
|
|
23
23
|
const raw = await readConfigFile(resolve(dir, '.mcplintrc.json'));
|
|
24
|
-
return applyExtends(raw);
|
|
24
|
+
return await applyExtends(raw);
|
|
25
25
|
}
|
|
26
26
|
catch {
|
|
27
27
|
// not found here, try parent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAClE,OAAO,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QAC1C,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAA4D;IACrF,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC5F,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export async function loadPluginRules(config) {
|
|
2
|
+
if (!config.plugins?.length)
|
|
3
|
+
return [];
|
|
4
|
+
const extraRules = [];
|
|
5
|
+
for (const pkgName of config.plugins) {
|
|
6
|
+
let mod;
|
|
7
|
+
try {
|
|
8
|
+
mod = (await import(pkgName));
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
throw new Error(`Cannot load plugin "${pkgName}": ${err.message}`);
|
|
12
|
+
}
|
|
13
|
+
const plugin = mod.default ?? mod;
|
|
14
|
+
if (plugin.rules)
|
|
15
|
+
extraRules.push(...plugin.rules);
|
|
16
|
+
}
|
|
17
|
+
return extraRules;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=plugin-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/config/plugin-loader.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAW,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,GAAiB,CAAC;QACtB,IAAI,CAAC;YACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAiB,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,MAAM,GAAkB,GAAkC,CAAC,OAAO,IAAI,GAAG,CAAC;QAChF,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/config/presets.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { Config } from '../core/rule.js';
|
|
2
|
-
export declare function applyExtends(userConfig: Config): Config
|
|
2
|
+
export declare function applyExtends(userConfig: Config): Promise<Config>;
|
package/dist/config/presets.js
CHANGED
|
@@ -29,13 +29,22 @@ const strict = {
|
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
31
|
const PRESETS = { recommended, strict };
|
|
32
|
-
export function applyExtends(userConfig) {
|
|
32
|
+
export async function applyExtends(userConfig) {
|
|
33
33
|
const presetName = userConfig.extends;
|
|
34
34
|
if (!presetName)
|
|
35
35
|
return userConfig;
|
|
36
|
-
|
|
37
|
-
if (
|
|
38
|
-
|
|
36
|
+
let preset;
|
|
37
|
+
if (PRESETS[presetName]) {
|
|
38
|
+
preset = PRESETS[presetName];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
try {
|
|
42
|
+
const mod = await import(presetName);
|
|
43
|
+
preset = (mod.default ?? mod);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new Error(`Unknown preset "${presetName}". Builtin presets: ${Object.keys(PRESETS).join(', ')}`);
|
|
47
|
+
}
|
|
39
48
|
}
|
|
40
49
|
const { extends: _removed, ...restUser } = userConfig;
|
|
41
50
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/config/presets.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAW;IAC1B,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC5F,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,GAAW;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC5F,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE;QACL,mBAAmB,EAAE,OAAO;QAC5B,qBAAqB,EAAE,OAAO;QAC9B,oBAAoB,EAAE,OAAO;QAC7B,eAAe,EAAE,OAAO;QACxB,WAAW,EAAE,OAAO;QACpB,mBAAmB,EAAE,OAAO;QAC5B,0BAA0B,EAAE,OAAO;QACnC,wBAAwB,EAAE,OAAO;QACjC,sBAAsB,EAAE,OAAO;QAC/B,gCAAgC,EAAE,OAAO;QACzC,oCAAoC,EAAE,OAAO;QAC7C,0BAA0B,EAAE,OAAO;QACnC,mBAAmB,EAAE,OAAO;QAC5B,yBAAyB,EAAE,OAAO;QAClC,8BAA8B,EAAE,OAAO;QACvC,iCAAiC,EAAE,OAAO;QAC1C,qBAAqB,EAAE,OAAO;QAC9B,4BAA4B,EAAE,OAAO;KACtC;CACF,CAAC;AAEF,MAAM,OAAO,GAA2B,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAEhE,MAAM,UAAU,YAAY,CAAC,UAAkB;
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/config/presets.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAW;IAC1B,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC5F,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,GAAW;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC5F,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE;QACL,mBAAmB,EAAE,OAAO;QAC5B,qBAAqB,EAAE,OAAO;QAC9B,oBAAoB,EAAE,OAAO;QAC7B,eAAe,EAAE,OAAO;QACxB,WAAW,EAAE,OAAO;QACpB,mBAAmB,EAAE,OAAO;QAC5B,0BAA0B,EAAE,OAAO;QACnC,wBAAwB,EAAE,OAAO;QACjC,sBAAsB,EAAE,OAAO;QAC/B,gCAAgC,EAAE,OAAO;QACzC,oCAAoC,EAAE,OAAO;QAC7C,0BAA0B,EAAE,OAAO;QACnC,mBAAmB,EAAE,OAAO;QAC5B,yBAAyB,EAAE,OAAO;QAClC,8BAA8B,EAAE,OAAO;QACvC,iCAAiC,EAAE,OAAO;QAC1C,qBAAqB,EAAE,OAAO;QAC9B,4BAA4B,EAAE,OAAO;KACtC;CACF,CAAC;AAEF,MAAM,OAAO,GAA2B,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEnC,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,GAAG,CAAE,GAA4B,CAAC,OAAO,IAAI,GAAG,CAAW,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC;IACtD,OAAO;QACL,GAAG,MAAM;QACT,GAAG,QAAQ;QACX,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE;QAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;QAC3C,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Diagnostic } from './diagnostic.js';
|
|
2
|
+
import type { MCPTool } from './rule.js';
|
|
3
|
+
export interface ToolScore {
|
|
4
|
+
toolName: string;
|
|
5
|
+
score: number;
|
|
6
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
7
|
+
errors: number;
|
|
8
|
+
warnings: number;
|
|
9
|
+
}
|
|
10
|
+
export interface QualityReport {
|
|
11
|
+
overall: number;
|
|
12
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
13
|
+
tools: ToolScore[];
|
|
14
|
+
}
|
|
15
|
+
export declare function computeQualityReport(tools: MCPTool[], diagnostics: Diagnostic[]): QualityReport;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function gradeFromScore(score) {
|
|
2
|
+
if (score >= 90)
|
|
3
|
+
return 'A';
|
|
4
|
+
if (score >= 75)
|
|
5
|
+
return 'B';
|
|
6
|
+
if (score >= 60)
|
|
7
|
+
return 'C';
|
|
8
|
+
if (score >= 40)
|
|
9
|
+
return 'D';
|
|
10
|
+
return 'F';
|
|
11
|
+
}
|
|
12
|
+
export function computeQualityReport(tools, diagnostics) {
|
|
13
|
+
const byTool = new Map();
|
|
14
|
+
for (const tool of tools)
|
|
15
|
+
byTool.set(tool.name, []);
|
|
16
|
+
for (const d of diagnostics)
|
|
17
|
+
byTool.get(d.toolName)?.push(d);
|
|
18
|
+
const toolScores = tools.map((tool) => {
|
|
19
|
+
const diags = byTool.get(tool.name) ?? [];
|
|
20
|
+
const errors = diags.filter((d) => d.severity === 'error').length;
|
|
21
|
+
const warnings = diags.filter((d) => d.severity === 'warning').length;
|
|
22
|
+
const score = Math.max(0, 100 - errors * 15 - warnings * 5);
|
|
23
|
+
return { toolName: tool.name, score, grade: gradeFromScore(score), errors, warnings };
|
|
24
|
+
});
|
|
25
|
+
const overall = tools.length === 0
|
|
26
|
+
? 100
|
|
27
|
+
: Math.round(toolScores.reduce((sum, t) => sum + t.score, 0) / toolScores.length);
|
|
28
|
+
return { overall, grade: gradeFromScore(overall), tools: toolScores };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=quality-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-score.js","sourceRoot":"","sources":["../../src/core/quality-score.ts"],"names":[],"mappings":"AAiBA,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAgB,EAAE,WAAyB;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,WAAW;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEpF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC"}
|
package/dist/core/rule.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -5,15 +5,19 @@ import { registerFixCommand } from './cli/commands/fix.js';
|
|
|
5
5
|
import { registerInitCommand } from './cli/commands/init.js';
|
|
6
6
|
import { registerCompatCommand } from './cli/commands/compat.js';
|
|
7
7
|
import { registerExplainCommand } from './cli/commands/explain.js';
|
|
8
|
+
import { registerDiffCommand } from './cli/commands/diff.js';
|
|
9
|
+
import { registerPreflightCommand } from './cli/commands/preflight.js';
|
|
8
10
|
const program = new Command();
|
|
9
11
|
program
|
|
10
12
|
.name('mcp-lint')
|
|
11
13
|
.description('Lint MCP server tool schemas for cross-client compatibility')
|
|
12
|
-
.version('0.
|
|
14
|
+
.version('0.4.0');
|
|
13
15
|
registerCheckCommand(program);
|
|
14
16
|
registerFixCommand(program);
|
|
15
17
|
registerInitCommand(program);
|
|
16
18
|
registerCompatCommand(program);
|
|
17
19
|
registerExplainCommand(program);
|
|
20
|
+
registerDiffCommand(program);
|
|
21
|
+
registerPreflightCommand(program);
|
|
18
22
|
program.parse();
|
|
19
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|