@raeseoklee/mcp-workbench-plugin-junit 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/dist/generator.d.ts +8 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +54 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RunReport } from "@mcp-workbench/plugin-sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Generates JUnit XML compatible with GitHub Actions, Jenkins, GitLab CI, etc.
|
|
4
|
+
*
|
|
5
|
+
* Schema: https://www.ibm.com/docs/en/developer-for-zos/16.0?topic=formats-junit-xml-format
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateJUnit(report: RunReport, specFile?: string): string;
|
|
8
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates JUnit XML compatible with GitHub Actions, Jenkins, GitLab CI, etc.
|
|
3
|
+
*
|
|
4
|
+
* Schema: https://www.ibm.com/docs/en/developer-for-zos/16.0?topic=formats-junit-xml-format
|
|
5
|
+
*/
|
|
6
|
+
export function generateJUnit(report, specFile) {
|
|
7
|
+
const suiteName = specFile ?? "mcp-workbench";
|
|
8
|
+
const totalTime = (report.durationMs / 1000).toFixed(3);
|
|
9
|
+
const testcases = report.tests.map((t) => renderTestcase(t, suiteName)).join("\n ");
|
|
10
|
+
return [
|
|
11
|
+
`<?xml version="1.0" encoding="UTF-8"?>`,
|
|
12
|
+
`<testsuites name="MCP Workbench" time="${totalTime}" tests="${report.total}" failures="${report.failed}" errors="${report.errors}" skipped="${report.skipped}">`,
|
|
13
|
+
` <testsuite name="${esc(suiteName)}" tests="${report.total}" failures="${report.failed}" errors="${report.errors}" skipped="${report.skipped}" time="${totalTime}">`,
|
|
14
|
+
` ${testcases}`,
|
|
15
|
+
` </testsuite>`,
|
|
16
|
+
`</testsuites>`,
|
|
17
|
+
].join("\n");
|
|
18
|
+
}
|
|
19
|
+
function renderTestcase(t, suiteName) {
|
|
20
|
+
const time = (t.durationMs / 1000).toFixed(3);
|
|
21
|
+
const classname = esc(suiteName);
|
|
22
|
+
const name = esc(t.description ? `${t.testId}: ${t.description}` : t.testId);
|
|
23
|
+
const open = `<testcase name="${name}" classname="${classname}" time="${time}">`;
|
|
24
|
+
if (t.status === "skipped") {
|
|
25
|
+
return `${open}\n <skipped/>\n </testcase>`;
|
|
26
|
+
}
|
|
27
|
+
if (t.status === "error") {
|
|
28
|
+
const msg = esc(t.error ?? "Unknown error");
|
|
29
|
+
return `${open}\n <error message="${msg}"/>\n </testcase>`;
|
|
30
|
+
}
|
|
31
|
+
if (t.status === "failed") {
|
|
32
|
+
const failures = t.assertionResults
|
|
33
|
+
.filter((a) => !a.passed)
|
|
34
|
+
.map((a) => {
|
|
35
|
+
const label = esc(a.assertion.label ?? a.assertion.kind);
|
|
36
|
+
const msg = esc(a.message ?? `Assertion "${a.assertion.kind}" failed`);
|
|
37
|
+
const body = a.diff ? `\n${esc(a.diff)}` : "";
|
|
38
|
+
return `<failure message="${msg}" type="${label}">${body}</failure>`;
|
|
39
|
+
})
|
|
40
|
+
.join("\n ");
|
|
41
|
+
return `${open}\n ${failures}\n </testcase>`;
|
|
42
|
+
}
|
|
43
|
+
// passed
|
|
44
|
+
return `${open}</testcase>`;
|
|
45
|
+
}
|
|
46
|
+
function esc(s) {
|
|
47
|
+
return s
|
|
48
|
+
.replace(/&/g, "&")
|
|
49
|
+
.replace(/</g, "<")
|
|
50
|
+
.replace(/>/g, ">")
|
|
51
|
+
.replace(/"/g, """)
|
|
52
|
+
.replace(/'/g, "'");
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,2BAA2B,CAAC;AAIhF,QAAA,MAAM,MAAM,EAAE,eAqBb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { PLUGIN_API_VERSION } from "./version.js";
|
|
4
|
+
import { generateJUnit } from "./generator.js";
|
|
5
|
+
const plugin = {
|
|
6
|
+
manifest: {
|
|
7
|
+
name: "@mcp-workbench/plugin-junit",
|
|
8
|
+
version: "0.4.0",
|
|
9
|
+
apiVersion: PLUGIN_API_VERSION,
|
|
10
|
+
description: "Generates JUnit XML test report for CI systems",
|
|
11
|
+
contributes: { reporters: ["junit"] },
|
|
12
|
+
},
|
|
13
|
+
register(ctx) {
|
|
14
|
+
ctx.registerReporter({
|
|
15
|
+
name: "junit",
|
|
16
|
+
description: "JUnit XML report (GitHub Actions, Jenkins, GitLab CI)",
|
|
17
|
+
async generate({ report, specFile, outputPath }) {
|
|
18
|
+
const xml = generateJUnit(report, specFile);
|
|
19
|
+
const out = resolve(outputPath ?? "mcp-workbench-report.xml");
|
|
20
|
+
await writeFile(out, xml, "utf8");
|
|
21
|
+
ctx.logger.info(`JUnit XML report written to ${out}`);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
export default plugin;
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,MAAM,GAAoB;IAC9B,QAAQ,EAAE;QACR,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,gDAAgD;QAC7D,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE;KACtC;IAED,QAAQ,CAAC,GAAkB;QACzB,GAAG,CAAC,gBAAgB,CAAC;YACnB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,uDAAuD;YACpE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;gBAC7C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,0BAA0B,CAAC,CAAC;gBAC9D,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAQ,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@raeseoklee/mcp-workbench-plugin-junit",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "MCP Workbench plugin — generates JUnit XML test report for CI systems",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"test": "vitest run --passWithNoTests",
|
|
19
|
+
"clean": "rm -rf dist"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@raeseoklee/mcp-workbench-plugin-sdk": "workspace:*"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"typescript": "^5.6.0",
|
|
26
|
+
"vitest": "^2.0.0",
|
|
27
|
+
"@types/node": "^22.0.0"
|
|
28
|
+
},
|
|
29
|
+
"license": "Apache-2.0",
|
|
30
|
+
"keywords": ["mcp", "model-context-protocol", "plugin", "reporter", "junit", "ci"],
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/raeseoklee/mcp-workbench.git"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=20.0.0"
|
|
37
|
+
},
|
|
38
|
+
"files": ["dist"],
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
}
|
|
42
|
+
}
|