mcp-use-compat 0.3.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/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/checks/auth.d.ts +2 -0
- package/dist/checks/auth.d.ts.map +1 -0
- package/dist/checks/auth.js +229 -0
- package/dist/checks/auth.js.map +1 -0
- package/dist/checks/calls.d.ts +4 -0
- package/dist/checks/calls.d.ts.map +1 -0
- package/dist/checks/calls.js +192 -0
- package/dist/checks/calls.js.map +1 -0
- package/dist/checks/discovery.d.ts +3 -0
- package/dist/checks/discovery.d.ts.map +1 -0
- package/dist/checks/discovery.js +47 -0
- package/dist/checks/discovery.js.map +1 -0
- package/dist/checks/explanations.d.ts +15 -0
- package/dist/checks/explanations.d.ts.map +1 -0
- package/dist/checks/explanations.js +346 -0
- package/dist/checks/explanations.js.map +1 -0
- package/dist/checks/index.d.ts +3 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +23 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/protocol.d.ts +5 -0
- package/dist/checks/protocol.d.ts.map +1 -0
- package/dist/checks/protocol.js +380 -0
- package/dist/checks/protocol.js.map +1 -0
- package/dist/checks/resources.d.ts +10 -0
- package/dist/checks/resources.d.ts.map +1 -0
- package/dist/checks/resources.js +144 -0
- package/dist/checks/resources.js.map +1 -0
- package/dist/checks/schema.d.ts +21 -0
- package/dist/checks/schema.d.ts.map +1 -0
- package/dist/checks/schema.js +412 -0
- package/dist/checks/schema.js.map +1 -0
- package/dist/checks/sdk.d.ts +10 -0
- package/dist/checks/sdk.d.ts.map +1 -0
- package/dist/checks/sdk.js +68 -0
- package/dist/checks/sdk.js.map +1 -0
- package/dist/checks/tools.d.ts +18 -0
- package/dist/checks/tools.d.ts.map +1 -0
- package/dist/checks/tools.js +422 -0
- package/dist/checks/tools.js.map +1 -0
- package/dist/checks/transport.d.ts +2 -0
- package/dist/checks/transport.d.ts.map +1 -0
- package/dist/checks/transport.js +123 -0
- package/dist/checks/transport.js.map +1 -0
- package/dist/checks/types.d.ts +37 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +5 -0
- package/dist/checks/types.js.map +1 -0
- package/dist/checks/ui.d.ts +2 -0
- package/dist/checks/ui.d.ts.map +1 -0
- package/dist/checks/ui.js +207 -0
- package/dist/checks/ui.js.map +1 -0
- package/dist/checks/util.d.ts +20 -0
- package/dist/checks/util.d.ts.map +1 -0
- package/dist/checks/util.js +42 -0
- package/dist/checks/util.js.map +1 -0
- package/dist/cli.d.ts +110 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/cli.js.map +1 -0
- package/dist/connect/calls.d.ts +13 -0
- package/dist/connect/calls.d.ts.map +1 -0
- package/dist/connect/calls.js +130 -0
- package/dist/connect/calls.js.map +1 -0
- package/dist/connect/http.d.ts +14 -0
- package/dist/connect/http.d.ts.map +1 -0
- package/dist/connect/http.js +122 -0
- package/dist/connect/http.js.map +1 -0
- package/dist/connect/index.d.ts +41 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/index.js +168 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/lists.d.ts +12 -0
- package/dist/connect/lists.d.ts.map +1 -0
- package/dist/connect/lists.js +70 -0
- package/dist/connect/lists.js.map +1 -0
- package/dist/connect/modern.d.ts +13 -0
- package/dist/connect/modern.d.ts.map +1 -0
- package/dist/connect/modern.js +169 -0
- package/dist/connect/modern.js.map +1 -0
- package/dist/connect/session.d.ts +29 -0
- package/dist/connect/session.d.ts.map +1 -0
- package/dist/connect/session.js +96 -0
- package/dist/connect/session.js.map +1 -0
- package/dist/connect/stdio.d.ts +36 -0
- package/dist/connect/stdio.d.ts.map +1 -0
- package/dist/connect/stdio.js +127 -0
- package/dist/connect/stdio.js.map +1 -0
- package/dist/diff.d.ts +23 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +255 -0
- package/dist/diff.js.map +1 -0
- package/dist/evaluate.d.ts +70 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +104 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/explain.d.ts +4 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +46 -0
- package/dist/explain.js.map +1 -0
- package/dist/fix.d.ts +19 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +116 -0
- package/dist/fix.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +85 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +287 -0
- package/dist/oauth.js.map +1 -0
- package/dist/policy.d.ts +29 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +63 -0
- package/dist/policy.js.map +1 -0
- package/dist/profiles/chatgpt.d.ts +3 -0
- package/dist/profiles/chatgpt.d.ts.map +1 -0
- package/dist/profiles/chatgpt.js +29 -0
- package/dist/profiles/chatgpt.js.map +1 -0
- package/dist/profiles/claude-code.d.ts +3 -0
- package/dist/profiles/claude-code.d.ts.map +1 -0
- package/dist/profiles/claude-code.js +62 -0
- package/dist/profiles/claude-code.js.map +1 -0
- package/dist/profiles/claude-desktop.d.ts +3 -0
- package/dist/profiles/claude-desktop.d.ts.map +1 -0
- package/dist/profiles/claude-desktop.js +51 -0
- package/dist/profiles/claude-desktop.js.map +1 -0
- package/dist/profiles/cline.d.ts +4 -0
- package/dist/profiles/cline.d.ts.map +1 -0
- package/dist/profiles/cline.js +118 -0
- package/dist/profiles/cline.js.map +1 -0
- package/dist/profiles/codex.d.ts +4 -0
- package/dist/profiles/codex.d.ts.map +1 -0
- package/dist/profiles/codex.js +168 -0
- package/dist/profiles/codex.js.map +1 -0
- package/dist/profiles/continue.d.ts +4 -0
- package/dist/profiles/continue.d.ts.map +1 -0
- package/dist/profiles/continue.js +93 -0
- package/dist/profiles/continue.js.map +1 -0
- package/dist/profiles/cursor.d.ts +3 -0
- package/dist/profiles/cursor.d.ts.map +1 -0
- package/dist/profiles/cursor.js +52 -0
- package/dist/profiles/cursor.js.map +1 -0
- package/dist/profiles/gemini-cli.d.ts +4 -0
- package/dist/profiles/gemini-cli.d.ts.map +1 -0
- package/dist/profiles/gemini-cli.js +137 -0
- package/dist/profiles/gemini-cli.js.map +1 -0
- package/dist/profiles/goose.d.ts +4 -0
- package/dist/profiles/goose.d.ts.map +1 -0
- package/dist/profiles/goose.js +114 -0
- package/dist/profiles/goose.js.map +1 -0
- package/dist/profiles/index.d.ts +7 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +43 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/opencode.d.ts +3 -0
- package/dist/profiles/opencode.d.ts.map +1 -0
- package/dist/profiles/opencode.js +47 -0
- package/dist/profiles/opencode.js.map +1 -0
- package/dist/profiles/types.d.ts +86 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/vscode-copilot.d.ts +3 -0
- package/dist/profiles/vscode-copilot.d.ts.map +1 -0
- package/dist/profiles/vscode-copilot.js +71 -0
- package/dist/profiles/vscode-copilot.js.map +1 -0
- package/dist/profiles/windsurf.d.ts +4 -0
- package/dist/profiles/windsurf.d.ts.map +1 -0
- package/dist/profiles/windsurf.js +49 -0
- package/dist/profiles/windsurf.js.map +1 -0
- package/dist/project.d.ts +52 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +291 -0
- package/dist/project.js.map +1 -0
- package/dist/reporters/escape.d.ts +7 -0
- package/dist/reporters/escape.d.ts.map +1 -0
- package/dist/reporters/escape.js +15 -0
- package/dist/reporters/escape.js.map +1 -0
- package/dist/reporters/github.d.ts +7 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +19 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +3 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +4 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +3 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +98 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/run.d.ts +14 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +163 -0
- package/dist/run.js.map +1 -0
- package/dist/sdk-facts.d.ts +27 -0
- package/dist/sdk-facts.d.ts.map +1 -0
- package/dist/sdk-facts.js +63 -0
- package/dist/sdk-facts.js.map +1 -0
- package/dist/snapshot.d.ts +189 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +22 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/ui.d.ts +18 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +22 -0
- package/dist/ui.js.map +1 -0
- package/dist/upgrade.d.ts +12 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +115 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -0
- package/schema/report.schema.json +327 -0
package/dist/project.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
3
|
+
/** SDK packages we know, with verified facts about protocol support. */
|
|
4
|
+
export const KNOWN_SDKS = {
|
|
5
|
+
npm: ["@modelcontextprotocol/sdk", "@modelcontextprotocol/server", "mcp-use", "fastmcp", "mcp-framework", "mcp-handler"],
|
|
6
|
+
pypi: ["mcp", "fastmcp"],
|
|
7
|
+
go: ["github.com/modelcontextprotocol/go-sdk", "github.com/mark3labs/mcp-go"],
|
|
8
|
+
crates: ["rmcp"],
|
|
9
|
+
};
|
|
10
|
+
const MANIFESTS = ["package.json", "pyproject.toml", "requirements.txt", "go.mod", "Cargo.toml"];
|
|
11
|
+
const MAX_UP = 6;
|
|
12
|
+
/**
|
|
13
|
+
* Finds the project a stdio server runs from: the cwd, directories of file
|
|
14
|
+
* arguments (e.g. dist/index.js) and a venv interpreter, walking up to the
|
|
15
|
+
* nearest manifest. Reads files only; no network.
|
|
16
|
+
*/
|
|
17
|
+
export function detectProject(command, args, cwd) {
|
|
18
|
+
const starts = new Set();
|
|
19
|
+
const addPath = (p) => {
|
|
20
|
+
const abs = isAbsolute(p) ? p : resolve(cwd, p);
|
|
21
|
+
if (existsSync(abs))
|
|
22
|
+
starts.add(statSync(abs).isDirectory() ? abs : dirname(abs));
|
|
23
|
+
};
|
|
24
|
+
for (const a of args)
|
|
25
|
+
if (!a.startsWith("-") && /[./\\]/.test(a))
|
|
26
|
+
addPath(a);
|
|
27
|
+
if (/[/\\]/.test(command))
|
|
28
|
+
addPath(command);
|
|
29
|
+
starts.add(cwd);
|
|
30
|
+
for (const start of starts) {
|
|
31
|
+
const dir = findUp(start, (d) => MANIFESTS.some((m) => existsSync(join(d, m))));
|
|
32
|
+
if (!dir)
|
|
33
|
+
continue;
|
|
34
|
+
const python = /[/\\]bin[/\\]python[0-9.]*$|[/\\]Scripts[/\\]python\.exe$/i.test(command)
|
|
35
|
+
? isAbsolute(command)
|
|
36
|
+
? command
|
|
37
|
+
: resolve(cwd, command)
|
|
38
|
+
: undefined;
|
|
39
|
+
const sdks = [...detectNpm(dir), ...detectPython(dir, python), ...detectGo(dir), ...detectCargo(dir)];
|
|
40
|
+
if (sdks.length)
|
|
41
|
+
return { dir, sdks };
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
function findUp(start, match) {
|
|
46
|
+
let dir = start;
|
|
47
|
+
for (let i = 0; i <= MAX_UP; i++) {
|
|
48
|
+
if (match(dir))
|
|
49
|
+
return dir;
|
|
50
|
+
const parent = dirname(dir);
|
|
51
|
+
if (parent === dir)
|
|
52
|
+
break;
|
|
53
|
+
dir = parent;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
function readJson(path) {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function readText(path) {
|
|
66
|
+
try {
|
|
67
|
+
return readFileSync(path, "utf8");
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function detectNpm(dir) {
|
|
74
|
+
const pkg = readJson(join(dir, "package.json"));
|
|
75
|
+
if (!pkg)
|
|
76
|
+
return [];
|
|
77
|
+
const deps = { ...pkg.devDependencies, ...pkg.dependencies };
|
|
78
|
+
const lockDir = findUp(dir, (d) => ["pnpm-lock.yaml", "yarn.lock", "bun.lockb", "bun.lock", "package-lock.json"].some((f) => existsSync(join(d, f))));
|
|
79
|
+
const manager = !lockDir
|
|
80
|
+
? "npm"
|
|
81
|
+
: existsSync(join(lockDir, "pnpm-lock.yaml"))
|
|
82
|
+
? "pnpm"
|
|
83
|
+
: existsSync(join(lockDir, "yarn.lock"))
|
|
84
|
+
? "yarn"
|
|
85
|
+
: existsSync(join(lockDir, "bun.lockb")) || existsSync(join(lockDir, "bun.lock"))
|
|
86
|
+
? "bun"
|
|
87
|
+
: "npm";
|
|
88
|
+
return KNOWN_SDKS.npm
|
|
89
|
+
.filter((name) => deps[name])
|
|
90
|
+
.map((name) => {
|
|
91
|
+
const installedDir = findUp(dir, (d) => existsSync(join(d, "node_modules", name, "package.json")));
|
|
92
|
+
const installed = installedDir ? readJson(join(installedDir, "node_modules", name, "package.json"))?.version : undefined;
|
|
93
|
+
return { ecosystem: "npm", name, declared: deps[name], installed, manifest: join(dir, "package.json"), manager };
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Normalised Python distribution name, per PEP 503. */
|
|
97
|
+
const pyName = (n) => n.toLowerCase().replace(/[-_.]+/g, "-");
|
|
98
|
+
function detectPython(dir, python) {
|
|
99
|
+
const sources = [];
|
|
100
|
+
for (const file of ["pyproject.toml", "requirements.txt", "requirements.in"]) {
|
|
101
|
+
const text = readText(join(dir, file));
|
|
102
|
+
if (text)
|
|
103
|
+
sources.push([join(dir, file), text]);
|
|
104
|
+
}
|
|
105
|
+
if (!sources.length)
|
|
106
|
+
return [];
|
|
107
|
+
const manager = existsSync(join(dir, "uv.lock"))
|
|
108
|
+
? "uv"
|
|
109
|
+
: existsSync(join(dir, "poetry.lock"))
|
|
110
|
+
? "poetry"
|
|
111
|
+
: existsSync(join(dir, "Pipfile.lock"))
|
|
112
|
+
? "pipenv"
|
|
113
|
+
: "pip";
|
|
114
|
+
const sitePackages = findSitePackages(dir, python);
|
|
115
|
+
return KNOWN_SDKS.pypi.flatMap((name) => {
|
|
116
|
+
for (const [manifest, text] of sources) {
|
|
117
|
+
const declared = manifest.endsWith(".toml") ? pyprojectRequirement(text, name) : requirementsLine(text, name);
|
|
118
|
+
if (declared === undefined)
|
|
119
|
+
continue;
|
|
120
|
+
return [
|
|
121
|
+
{
|
|
122
|
+
ecosystem: "pypi",
|
|
123
|
+
name,
|
|
124
|
+
declared: declared || undefined,
|
|
125
|
+
installed: sitePackages ? installedPython(sitePackages, name) : undefined,
|
|
126
|
+
manifest,
|
|
127
|
+
manager,
|
|
128
|
+
python,
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
return [];
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
136
|
+
/**
|
|
137
|
+
* The version specifier for `name` in a requirements file ("" if unpinned),
|
|
138
|
+
* or undefined if it isn't listed. Comments and other packages are ignored.
|
|
139
|
+
*/
|
|
140
|
+
export function requirementsLine(text, name) {
|
|
141
|
+
const re = new RegExp(`^${escape(name)}(?:\\[[^\\]]*\\])?\\s*((?:[<>=!~]=?|===)[^;\\s]*(?:\\s*,\\s*(?:[<>=!~]=?|===)[^;\\s]*)*)?\\s*(?:;.*)?$`, "i");
|
|
142
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
143
|
+
const line = raw.replace(/\s+#.*$/, "").replace(/^#.*$/, "").trim();
|
|
144
|
+
const m = re.exec(line);
|
|
145
|
+
if (m)
|
|
146
|
+
return m[1]?.trim() ?? "";
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The specifier for `name` in pyproject.toml: PEP 621 quoted requirements
|
|
152
|
+
* ("mcp[cli]>=1.2") or Poetry tables (mcp = "^1.2" / mcp = { version = "^1.2" }).
|
|
153
|
+
*/
|
|
154
|
+
export function pyprojectRequirement(text, name) {
|
|
155
|
+
const n = escape(name);
|
|
156
|
+
const quoted = new RegExp(`["']\\s*${n}(?:\\[[^\\]]*\\])?\\s*((?:[<>=!~]=?|===)[^"';]*)?\\s*(?:;[^"']*)?["']`, "i").exec(text);
|
|
157
|
+
if (quoted)
|
|
158
|
+
return quoted[1]?.trim() ?? "";
|
|
159
|
+
const poetry = new RegExp(`^\\s*${n}\\s*=\\s*(?:"([^"]*)"|\\{[^}]*version\\s*=\\s*"([^"]*)")`, "im").exec(text);
|
|
160
|
+
if (poetry)
|
|
161
|
+
return (poetry[1] ?? poetry[2] ?? "").trim();
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function findSitePackages(dir, python) {
|
|
165
|
+
const venvs = [
|
|
166
|
+
...(python ? [dirname(dirname(python))] : []),
|
|
167
|
+
join(dir, ".venv"),
|
|
168
|
+
join(dir, "venv"),
|
|
169
|
+
join(dir, "env"),
|
|
170
|
+
];
|
|
171
|
+
for (const venv of venvs) {
|
|
172
|
+
const lib = join(venv, "lib");
|
|
173
|
+
if (!existsSync(lib)) {
|
|
174
|
+
if (existsSync(join(venv, "Lib", "site-packages")))
|
|
175
|
+
return join(venv, "Lib", "site-packages");
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const py = readdirSync(lib).find((d) => d.startsWith("python"));
|
|
179
|
+
if (py && existsSync(join(lib, py, "site-packages")))
|
|
180
|
+
return join(lib, py, "site-packages");
|
|
181
|
+
}
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
function installedPython(sitePackages, name) {
|
|
185
|
+
const entry = readdirSync(sitePackages).find((d) => {
|
|
186
|
+
const m = /^(.+)-([^-]+)\.dist-info$/.exec(d);
|
|
187
|
+
return !!m && pyName(m[1]) === pyName(name);
|
|
188
|
+
});
|
|
189
|
+
return entry ? /-([^-]+)\.dist-info$/.exec(entry)?.[1] : undefined;
|
|
190
|
+
}
|
|
191
|
+
function detectGo(dir) {
|
|
192
|
+
const text = readText(join(dir, "go.mod"));
|
|
193
|
+
if (!text)
|
|
194
|
+
return [];
|
|
195
|
+
return KNOWN_SDKS.go.flatMap((name) => {
|
|
196
|
+
const m = new RegExp(`^\\s*(?:require\\s+)?${name.replace(/[.]/g, "\\.")}\\s+(v[^\\s]+)`, "m").exec(text);
|
|
197
|
+
return m ? [{ ecosystem: "go", name, declared: m[1], installed: m[1], manifest: join(dir, "go.mod"), manager: "go" }] : [];
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function detectCargo(dir) {
|
|
201
|
+
const text = readText(join(dir, "Cargo.toml"));
|
|
202
|
+
if (!text)
|
|
203
|
+
return [];
|
|
204
|
+
return KNOWN_SDKS.crates.flatMap((name) => {
|
|
205
|
+
const m = new RegExp(`^\\s*${name}\\s*=\\s*(?:"([^"]+)"|\\{[^}]*version\\s*=\\s*"([^"]+)")`, "m").exec(text);
|
|
206
|
+
if (!m)
|
|
207
|
+
return [];
|
|
208
|
+
const lock = readText(join(dir, "Cargo.lock"));
|
|
209
|
+
const installed = lock ? new RegExp(`name = "${name}"\\nversion = "([^"]+)"`).exec(lock)?.[1] : undefined;
|
|
210
|
+
return [{ ecosystem: "crates", name, declared: m[1] ?? m[2], installed, manifest: join(dir, "Cargo.toml"), manager: "cargo" }];
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/** Looks up the latest release of each SDK. Failures leave `latest` unset. */
|
|
214
|
+
export async function lookupLatest(sdks, timeoutMs = 4000) {
|
|
215
|
+
await Promise.all(sdks.map(async (sdk) => {
|
|
216
|
+
try {
|
|
217
|
+
sdk.latest = await latestVersion(sdk.ecosystem, sdk.name, timeoutMs);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Offline or registry error: advice falls back to "@latest".
|
|
221
|
+
}
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
async function latestVersion(ecosystem, name, timeoutMs) {
|
|
225
|
+
const get = async (url) => {
|
|
226
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs), headers: { "user-agent": "mcp-use-compat" } });
|
|
227
|
+
return res.ok ? (await res.json()) : undefined;
|
|
228
|
+
};
|
|
229
|
+
switch (ecosystem) {
|
|
230
|
+
case "npm":
|
|
231
|
+
return (await get(`https://registry.npmjs.org/${name.replace("/", "%2f")}/latest`))?.version;
|
|
232
|
+
case "pypi":
|
|
233
|
+
return (await get(`https://pypi.org/pypi/${name}/json`))?.info?.version;
|
|
234
|
+
case "go":
|
|
235
|
+
return (await get(`https://proxy.golang.org/${name}/@latest`))?.Version;
|
|
236
|
+
case "crates":
|
|
237
|
+
return (await get(`https://crates.io/api/v1/crates/${name}`))?.crate?.max_stable_version;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Compares dotted numeric versions (ignores a leading v and pre-release suffixes). */
|
|
241
|
+
export function compareVersions(a, b) {
|
|
242
|
+
const parts = (v) => v
|
|
243
|
+
.replace(/^v/, "")
|
|
244
|
+
.split(/[-+]/)[0]
|
|
245
|
+
.split(".")
|
|
246
|
+
.map((n) => parseInt(n, 10) || 0);
|
|
247
|
+
const [x, y] = [parts(a), parts(b)];
|
|
248
|
+
for (let i = 0; i < Math.max(x.length, y.length); i++) {
|
|
249
|
+
const d = (x[i] ?? 0) - (y[i] ?? 0);
|
|
250
|
+
if (d)
|
|
251
|
+
return d;
|
|
252
|
+
}
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
|
+
export const majorOf = (v) => parseInt(v.replace(/^v/, "").split(".")[0], 10) || 0;
|
|
256
|
+
/** Registry versions end up in shell commands, so only plain version strings are allowed. */
|
|
257
|
+
export const SAFE_VERSION = /^v?[0-9][0-9A-Za-z.+-]*$/;
|
|
258
|
+
/**
|
|
259
|
+
* Shell command that upgrades the SDK to `version` (or the newest) with the
|
|
260
|
+
* project's package manager. Unsafe version strings are ignored (→ "latest").
|
|
261
|
+
*/
|
|
262
|
+
export function upgradeCommand(sdk, requested = sdk.latest) {
|
|
263
|
+
const version = requested && SAFE_VERSION.test(requested) ? requested : undefined;
|
|
264
|
+
const at = version ? `@${version.replace(/^v/, "")}` : "@latest";
|
|
265
|
+
const pin = version ? `>=${version}` : "";
|
|
266
|
+
switch (sdk.manager) {
|
|
267
|
+
case "pnpm":
|
|
268
|
+
return `pnpm add ${sdk.name}${at}`;
|
|
269
|
+
case "yarn":
|
|
270
|
+
return `yarn add ${sdk.name}${at}`;
|
|
271
|
+
case "bun":
|
|
272
|
+
return `bun add ${sdk.name}${at}`;
|
|
273
|
+
case "npm":
|
|
274
|
+
return `npm install ${sdk.name}${at}`;
|
|
275
|
+
case "uv":
|
|
276
|
+
return `uv add "${sdk.name}${pin}"`;
|
|
277
|
+
case "poetry":
|
|
278
|
+
return `poetry add "${sdk.name}${pin ? `@${pin}` : "@latest"}"`;
|
|
279
|
+
case "pipenv":
|
|
280
|
+
return `pipenv install "${sdk.name}${pin}"`;
|
|
281
|
+
case "pip":
|
|
282
|
+
return `${sdk.python ?? "python"} -m pip install --upgrade "${sdk.name}${pin}"`;
|
|
283
|
+
case "go":
|
|
284
|
+
return `go get ${sdk.name}@${version ?? "latest"} && go mod tidy`;
|
|
285
|
+
case "cargo":
|
|
286
|
+
return `cargo add ${sdk.name}${version ? `@${version}` : ""}`;
|
|
287
|
+
default:
|
|
288
|
+
return `upgrade ${sdk.name} to ${version ?? "the latest version"}`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Makes text safe inside a GitHub-flavoured markdown table cell. */
|
|
2
|
+
export declare function cell(text: string | undefined): string;
|
|
3
|
+
/** Escapes a value for a GitHub Actions workflow command message. */
|
|
4
|
+
export declare function annotation(text: string): string;
|
|
5
|
+
/** Escapes a value for a GitHub Actions workflow command property (title=...). */
|
|
6
|
+
export declare function annotationProperty(text: string): string;
|
|
7
|
+
//# sourceMappingURL=escape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/reporters/escape.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrD;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Makes text safe inside a GitHub-flavoured markdown table cell. */
|
|
2
|
+
export function cell(text) {
|
|
3
|
+
if (!text)
|
|
4
|
+
return "";
|
|
5
|
+
return text.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/\r?\n/g, "<br>");
|
|
6
|
+
}
|
|
7
|
+
/** Escapes a value for a GitHub Actions workflow command message. */
|
|
8
|
+
export function annotation(text) {
|
|
9
|
+
return text.replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A");
|
|
10
|
+
}
|
|
11
|
+
/** Escapes a value for a GitHub Actions workflow command property (title=...). */
|
|
12
|
+
export function annotationProperty(text) {
|
|
13
|
+
return annotation(text).replace(/:/g, "%3A").replace(/,/g, "%2C");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/reporters/escape.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,UAAU,IAAI,CAAC,IAAwB;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrF,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Report } from "../evaluate.js";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Actions workflow commands: one annotation per client-independent
|
|
4
|
+
* finding and per client-specific error/warning.
|
|
5
|
+
*/
|
|
6
|
+
export declare function githubReporter(report: Report): string;
|
|
7
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/reporters/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { annotation, annotationProperty } from "./escape.js";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Actions workflow commands: one annotation per client-independent
|
|
4
|
+
* finding and per client-specific error/warning.
|
|
5
|
+
*/
|
|
6
|
+
export function githubReporter(report) {
|
|
7
|
+
const lines = [];
|
|
8
|
+
for (const f of report.findings) {
|
|
9
|
+
if (f.severity === "info")
|
|
10
|
+
continue;
|
|
11
|
+
const level = f.severity === "error" ? "error" : "warning";
|
|
12
|
+
const scope = [f.client, f.subject].filter(Boolean).join(" · ");
|
|
13
|
+
const title = `${f.checkId}${scope ? ` (${scope})` : ""}`;
|
|
14
|
+
const message = f.fix ? `${f.message} Fix: ${f.fix}` : f.message;
|
|
15
|
+
lines.push(`::${level} title=${annotationProperty(title)}::${annotation(message)}`);
|
|
16
|
+
}
|
|
17
|
+
return lines.join("\n") + (lines.length ? "\n" : "");
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/reporters/github.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;YAAE,SAAS;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,kBAAkB,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { OutputFormat } from "../cli.js";
|
|
2
|
+
import type { Report } from "../evaluate.js";
|
|
3
|
+
import { markdownReporter } from "./markdown.js";
|
|
4
|
+
export declare const REPORTERS: Record<OutputFormat, (report: Report) => string>;
|
|
5
|
+
export { markdownReporter };
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAItE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { githubReporter } from "./github.js";
|
|
2
|
+
import { jsonReporter } from "./json.js";
|
|
3
|
+
import { markdownReporter } from "./markdown.js";
|
|
4
|
+
export const REPORTERS = {
|
|
5
|
+
md: markdownReporter,
|
|
6
|
+
json: jsonReporter,
|
|
7
|
+
github: githubReporter,
|
|
8
|
+
};
|
|
9
|
+
export { markdownReporter };
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAqD;IACzE,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,gBAAgB,CAAC;AAarD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwEvD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { cell } from "./escape.js";
|
|
2
|
+
const STATUS_LABEL = {
|
|
3
|
+
pass: "✅ PASS",
|
|
4
|
+
warn: "⚠️ WARN",
|
|
5
|
+
fail: "❌ FAIL",
|
|
6
|
+
info: "ℹ️ INFO",
|
|
7
|
+
skip: "⏭️ SKIP",
|
|
8
|
+
};
|
|
9
|
+
const SEVERITY_LABEL = { error: "❌ error", warn: "⚠️ warn", info: "ℹ️ info" };
|
|
10
|
+
export function markdownReporter(report) {
|
|
11
|
+
const out = [];
|
|
12
|
+
const { server, target } = report;
|
|
13
|
+
const name = [server.name, server.version].filter(Boolean).join(" ") || "MCP server";
|
|
14
|
+
const where = target.kind === "stdio" ? [target.command, ...target.args].join(" ") : target.url;
|
|
15
|
+
out.push(`# MCP Compatibility Report: ${name}`, "");
|
|
16
|
+
const facts = [
|
|
17
|
+
`Target: \`${where}\``,
|
|
18
|
+
server.protocolVersion
|
|
19
|
+
? `Protocol ${server.protocolVersion}${server.era === "modern" ? " (stateless only)" : server.era === "both" ? " (also speaks 2026-07-28)" : ""}`
|
|
20
|
+
: undefined,
|
|
21
|
+
server.connected
|
|
22
|
+
? `${server.counts.tools} tools · ${server.counts.resources} resources · ${server.counts.resourceTemplates} resource templates · ${server.counts.prompts} prompts`
|
|
23
|
+
: "Not connected",
|
|
24
|
+
].filter(Boolean);
|
|
25
|
+
out.push(facts.join(" · "), "");
|
|
26
|
+
if (server.versions?.length) {
|
|
27
|
+
const cells = server.versions.map((v) => `${v.version} ${!v.ok ? "❌" : v.negotiated && v.negotiated !== v.version ? `↪ ${v.negotiated}` : "✅"}`);
|
|
28
|
+
out.push(`Protocol versions: ${cells.join(" · ")}`, "");
|
|
29
|
+
}
|
|
30
|
+
if (report.clients.length > 0) {
|
|
31
|
+
out.push("## Summary", "", "| Client | Pass | Warn | Fail | Info | Skip |", "|---|---|---|---|---|---|");
|
|
32
|
+
for (const c of report.clients) {
|
|
33
|
+
const s = c.summary;
|
|
34
|
+
out.push(`| ${cell(c.displayName)} | ${s.pass} | ${s.warn} | ${s.fail} | ${s.info} | ${s.skip} |`);
|
|
35
|
+
}
|
|
36
|
+
out.push("");
|
|
37
|
+
}
|
|
38
|
+
const general = report.findings.filter((f) => !f.client);
|
|
39
|
+
out.push("## Server issues (all clients)", "");
|
|
40
|
+
if (general.length === 0) {
|
|
41
|
+
out.push("_No client-independent issues found._", "");
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
out.push(...findingTable(general), "");
|
|
45
|
+
}
|
|
46
|
+
for (const c of report.clients) {
|
|
47
|
+
const rows = c.rows.filter((r) => r.status === "fail" || r.status === "warn" || (r.status === "info" && r.source));
|
|
48
|
+
const clientSpecific = rows.filter((r) => report.findings.some((f) => f.client === c.client && f.checkId === r.checkId));
|
|
49
|
+
const fromGeneral = rows.filter((r) => !clientSpecific.includes(r));
|
|
50
|
+
out.push(`## ${c.displayName}`, "");
|
|
51
|
+
if (clientSpecific.length === 0 && fromGeneral.length === 0) {
|
|
52
|
+
out.push("_No issues specific to this client._", "");
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (clientSpecific.length > 0) {
|
|
56
|
+
out.push("| Status | Check | Subject | Message | Source |", "|---|---|---|---|---|");
|
|
57
|
+
for (const r of clientSpecific) {
|
|
58
|
+
out.push(`| ${STATUS_LABEL[r.status]} | \`${r.checkId}\` | ${cell(r.subject)} | ${cell(r.message)} | ${r.source ? `[source](${r.source})` : ""} |`);
|
|
59
|
+
}
|
|
60
|
+
out.push("");
|
|
61
|
+
}
|
|
62
|
+
if (fromGeneral.length > 0) {
|
|
63
|
+
const counts = countBy(fromGeneral.map((r) => r.status));
|
|
64
|
+
out.push(`Server issues above affect ${c.displayName}: ${Object.entries(counts).map(([s, n]) => `${n} ${s}`).join(", ")}.`, "");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const sources = limitationSources(report);
|
|
68
|
+
if (sources.length > 0) {
|
|
69
|
+
out.push("## Client facts referenced", "", ...sources.map((s) => `- ${s}`), "");
|
|
70
|
+
}
|
|
71
|
+
out.push(`<sub>Generated by ${report.tool.name} ${report.tool.version} at ${report.generatedAt}</sub>`, "");
|
|
72
|
+
return out.join("\n");
|
|
73
|
+
}
|
|
74
|
+
function findingTable(findings) {
|
|
75
|
+
const lines = ["| Severity | Check | Subject | Message | Fix |", "|---|---|---|---|---|"];
|
|
76
|
+
for (const f of findings) {
|
|
77
|
+
lines.push(`| ${SEVERITY_LABEL[f.severity]} | \`${f.checkId}\` | ${cell(f.subject)} | ${cell(f.message)} | ${cell(f.fix)} |`);
|
|
78
|
+
}
|
|
79
|
+
return lines;
|
|
80
|
+
}
|
|
81
|
+
function limitationSources(report) {
|
|
82
|
+
const seen = new Set();
|
|
83
|
+
for (const c of report.clients) {
|
|
84
|
+
for (const r of c.rows) {
|
|
85
|
+
if (r.source && (r.status === "warn" || r.status === "fail" || r.status === "info")) {
|
|
86
|
+
seen.add(`${c.displayName}: \`${r.checkId}\`, ${r.source}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return [...seen].sort();
|
|
91
|
+
}
|
|
92
|
+
function countBy(values) {
|
|
93
|
+
const counts = {};
|
|
94
|
+
for (const v of values)
|
|
95
|
+
counts[v] = (counts[v] ?? 0) + 1;
|
|
96
|
+
return counts;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CallOptions, type OAuthLoginOptions, type RunOptions, type TargetOptions } from "./cli.js";
|
|
2
|
+
import { type ConnectOptions } from "./connect/index.js";
|
|
3
|
+
import { type ServerSnapshot } from "./snapshot.js";
|
|
4
|
+
/** Runs the check command. Returns the process exit code. */
|
|
5
|
+
export declare function run(options: RunOptions): Promise<number>;
|
|
6
|
+
export declare function getSnapshot(options: TargetOptions & Pick<ConnectOptions, "versionMatrix" | "probeCalls" | "calls">): Promise<ServerSnapshot>;
|
|
7
|
+
/** Calls one tool, prints its result and any call findings. */
|
|
8
|
+
export declare function runCall(options: CallOptions): Promise<number>;
|
|
9
|
+
export declare function runOAuthLogin(options: OAuthLoginOptions): Promise<number>;
|
|
10
|
+
export declare function runOAuthStatus(): number;
|
|
11
|
+
export declare function runOAuthLogout(url: string): number;
|
|
12
|
+
export declare function listChecks(): number;
|
|
13
|
+
export declare function listClients(): number;
|
|
14
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAErH,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMlE,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAIhF,6DAA6D;AAC7D,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC9D;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,GAAG,YAAY,GAAG,OAAO,CAAC,GACtF,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,+DAA+D;AAC/D,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BnE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB/E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAYpC"}
|