@loadmill/mcp 0.0.2-rc.5 → 0.0.3
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 +40 -2
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +5 -1
- package/dist/constants.js.map +1 -1
- package/dist/http-request.js +1 -5
- package/dist/http-request.js.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp-handler.js +104 -10
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-server.js +1 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools.js +53 -2
- package/dist/tools.js.map +1 -1
- package/dist/utils.d.ts +2 -0
- package/dist/utils.js +41 -0
- package/dist/utils.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Loadmill MCP Server
|
|
2
2
|
|
|
3
|
-
This package provides a STDIO-based MCP
|
|
3
|
+
This package provides a STDIO-based MCP server. It is designed to be integrated into your workflow, allowing LLM interact with Loadmill.
|
|
4
4
|
|
|
5
5
|
## Use Cases
|
|
6
6
|
- Query Loadmill for information
|
|
7
7
|
- Execute Loadmill tests
|
|
8
8
|
- Write and maintain Loadmill tests (TBD)
|
|
9
9
|
|
|
10
|
+
*Note*: As always, when working with MCPs, make sure you are on `Agent` mode
|
|
10
11
|
|
|
11
12
|
## Install
|
|
12
13
|
|
|
@@ -31,4 +32,41 @@ This package provides a STDIO-based MCP (Message Control Protocol) server. It is
|
|
|
31
32
|
"password": true
|
|
32
33
|
}]
|
|
33
34
|
}
|
|
34
|
-
```
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Cursor
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
// other MCP servers...
|
|
43
|
+
"loadmill": {
|
|
44
|
+
"command": "npx",
|
|
45
|
+
"args": ["@loadmill/mcp"],
|
|
46
|
+
"env": {
|
|
47
|
+
"LOADMILL_API_TOKEN": "${env:LOADMILL_API_TOKEN}"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## MCP Capabilities
|
|
55
|
+
|
|
56
|
+
This server declares the following MCP capabilities:
|
|
57
|
+
|
|
58
|
+
- Tools: Supports `list_tools` and `call_tool`.
|
|
59
|
+
- Search Loadmill test suites.
|
|
60
|
+
- Search Loadmill test suite runs.
|
|
61
|
+
- Run a specific test suite.
|
|
62
|
+
- Fetch details of a test suite run.
|
|
63
|
+
- Fetch details of a specific suite flow run.
|
|
64
|
+
- Search Loadmill test plans.
|
|
65
|
+
- Run a specific test plan (with optional labels/overrides).
|
|
66
|
+
- Fetch details of a test plan run.
|
|
67
|
+
- List all available labels in Loadmill.
|
|
68
|
+
|
|
69
|
+
- Prompts: Supports `list_prompts` and `get_prompt`.
|
|
70
|
+
- Investigate failed test: Analyze failed test results and suggest next steps.
|
|
71
|
+
|
|
72
|
+
- Resources: (TBD) Supports `list_resources` and `read_resource` (declared; not yet implemented).
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export declare const MCP_SERVER_NAME = "loadmill-mcp-server";
|
|
2
2
|
export declare const MCP_SERVER_VERSION = "0.0.1";
|
|
3
3
|
export declare const SEARCH_TEST_SUITES = "search_test_suites";
|
|
4
|
+
export declare const SEARCH_TEST_SUITE_RUNS = "search_test_suite_runs";
|
|
4
5
|
export declare const RUN_TEST_SUITE = "run_test_suite";
|
|
5
6
|
export declare const GET_TEST_SUITE_RUN = "get_test_suite_run";
|
|
7
|
+
export declare const GET_TEST_SUITE_FLOW_RUN = "get_test_suite_flow_run";
|
|
6
8
|
export declare const SEARCH_TEST_PLAN = "search_test_plans";
|
|
7
9
|
export declare const RUN_TEST_PLAN = "run_test_plans";
|
|
8
10
|
export declare const GET_TEST_PLAN_RUN = "get_test_plan_run";
|
package/dist/constants.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AVALIABLE_TOOLS = exports.GET_LABELS = exports.GET_TEST_PLAN_RUN = exports.RUN_TEST_PLAN = exports.SEARCH_TEST_PLAN = exports.GET_TEST_SUITE_RUN = exports.RUN_TEST_SUITE = exports.SEARCH_TEST_SUITES = exports.MCP_SERVER_VERSION = exports.MCP_SERVER_NAME = void 0;
|
|
3
|
+
exports.AVALIABLE_TOOLS = exports.GET_LABELS = exports.GET_TEST_PLAN_RUN = exports.RUN_TEST_PLAN = exports.SEARCH_TEST_PLAN = exports.GET_TEST_SUITE_FLOW_RUN = exports.GET_TEST_SUITE_RUN = exports.RUN_TEST_SUITE = exports.SEARCH_TEST_SUITE_RUNS = exports.SEARCH_TEST_SUITES = exports.MCP_SERVER_VERSION = exports.MCP_SERVER_NAME = void 0;
|
|
4
4
|
exports.MCP_SERVER_NAME = 'loadmill-mcp-server';
|
|
5
5
|
exports.MCP_SERVER_VERSION = '0.0.1';
|
|
6
6
|
//tools
|
|
7
7
|
exports.SEARCH_TEST_SUITES = 'search_test_suites';
|
|
8
|
+
exports.SEARCH_TEST_SUITE_RUNS = 'search_test_suite_runs';
|
|
8
9
|
exports.RUN_TEST_SUITE = 'run_test_suite';
|
|
9
10
|
exports.GET_TEST_SUITE_RUN = 'get_test_suite_run';
|
|
11
|
+
exports.GET_TEST_SUITE_FLOW_RUN = 'get_test_suite_flow_run';
|
|
10
12
|
exports.SEARCH_TEST_PLAN = 'search_test_plans';
|
|
11
13
|
exports.RUN_TEST_PLAN = 'run_test_plans';
|
|
12
14
|
exports.GET_TEST_PLAN_RUN = 'get_test_plan_run';
|
|
13
15
|
exports.GET_LABELS = 'get_labels';
|
|
14
16
|
exports.AVALIABLE_TOOLS = [
|
|
15
17
|
exports.SEARCH_TEST_SUITES,
|
|
18
|
+
exports.SEARCH_TEST_SUITE_RUNS,
|
|
16
19
|
exports.RUN_TEST_SUITE,
|
|
17
20
|
exports.GET_TEST_SUITE_RUN,
|
|
21
|
+
exports.GET_TEST_SUITE_FLOW_RUN,
|
|
18
22
|
exports.GET_LABELS,
|
|
19
23
|
exports.SEARCH_TEST_PLAN,
|
|
20
24
|
exports.RUN_TEST_PLAN,
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AACa,QAAA,eAAe,GAAG,qBAAqB,CAAC;AACxC,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAE1C,OAAO;AACM,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,gBAAgB,GAAG,mBAAmB,CAAC;AACvC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AACjC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,UAAU,GAAG,YAAY,CAAC;AAE1B,QAAA,eAAe,GAAG;IAC7B,0BAAkB;IAClB,sBAAc;IACd,0BAAkB;IAClB,kBAAU;IACV,wBAAgB;IAChB,qBAAa;IACb,yBAAiB;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AACa,QAAA,eAAe,GAAG,qBAAqB,CAAC;AACxC,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAE1C,OAAO;AACM,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AACpD,QAAA,gBAAgB,GAAG,mBAAmB,CAAC;AACvC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AACjC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,UAAU,GAAG,YAAY,CAAC;AAE1B,QAAA,eAAe,GAAG;IAC7B,0BAAkB;IAClB,8BAAsB;IACtB,sBAAc;IACd,0BAAkB;IAClB,+BAAuB;IACvB,kBAAU;IACV,wBAAgB;IAChB,qBAAa;IACb,yBAAiB;CAClB,CAAC"}
|
package/dist/http-request.js
CHANGED
|
@@ -13,10 +13,8 @@ const sendHttpRequest = async (options) => {
|
|
|
13
13
|
return await _executeRequest(options);
|
|
14
14
|
}
|
|
15
15
|
catch (err) {
|
|
16
|
-
// eslint-disable-next-line no-console
|
|
17
16
|
console.error(`Error during ${(options.method || HttpMethods.GET).toUpperCase()} request to ${options.url}:`, err);
|
|
18
17
|
if (_shouldRetry(err)) {
|
|
19
|
-
// eslint-disable-next-line no-console
|
|
20
18
|
console.log(`Retrying ${(options.method || HttpMethods.GET).toUpperCase()} request to ${options.url}...`);
|
|
21
19
|
await _delay(RETRY_DELAY_MS);
|
|
22
20
|
return await _executeRequest(options);
|
|
@@ -30,9 +28,7 @@ const _executeRequest = async (options) => {
|
|
|
30
28
|
let request = superagent_1.default[method](url)
|
|
31
29
|
.auth(LOADMILL_API_TOKEN)
|
|
32
30
|
.timeout(DEFAULT_TIMEOUT_MS);
|
|
33
|
-
|
|
34
|
-
request = request.query(query);
|
|
35
|
-
}
|
|
31
|
+
request = request.query({ 'source': 'mcp', ...(query || {}) });
|
|
36
32
|
if (body) {
|
|
37
33
|
request = request.send(body);
|
|
38
34
|
}
|
package/dist/http-request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-request.js","sourceRoot":"","sources":["../src/http-request.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAEpC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC,aAAa;AAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,WAAW;AACxC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAEnD,MAAM,eAAe,GAAG,KAAK,EAAE,OAA2B,EAAE,EAAE;IACnE,IAAI;QACF,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;KACvC;IACD,OAAO,GAAG,EAAE;QACV,
|
|
1
|
+
{"version":3,"file":"http-request.js","sourceRoot":"","sources":["../src/http-request.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AAEpC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC,aAAa;AAC/E,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,WAAW;AACxC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAEnD,MAAM,eAAe,GAAG,KAAK,EAAE,OAA2B,EAAE,EAAE;IACnE,IAAI;QACF,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;KACvC;IACD,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,eAAe,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QACnH,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,eAAe,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;YAC1G,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAC7B,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;SACvC;QACD,MAAM,GAAG,CAAC;KACX;AACH,CAAC,CAAC;AAbW,QAAA,eAAe,mBAa1B;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5D,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC/D,IAAI,OAAO,GAAG,oBAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC;SAClC,IAAI,CAAC,kBAAkB,CAAC;SACxB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAE/D,IAAI,IAAI,EAAE;QACR,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC9B;IAED,OAAO,MAAM,OAAO,CAAC;AACvB,CAAC,CAAC;AAEF,0BAA0B;AAC1B,MAAM,YAAY,GAAG,CAAC,GAAG,EAAW,EAAE;IACpC,OAAO,GAAG,CAAC,OAAO;QAChB,GAAG,CAAC,IAAI,KAAK,cAAc;QAC3B,GAAG,CAAC,IAAI,KAAK,cAAc;QAC3B,GAAG,CAAC,IAAI,KAAK,WAAW;QACxB,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAS/E,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,0BAAW,CAAA;IACX,4BAAa,CAAA;IACb,0BAAW,CAAA;IACX,gCAAiB,CAAA;IACjB,8BAAe,CAAA;AACjB,CAAC,EANW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAMtB"}
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,9 @@ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
4
4
|
const mcp_server_1 = require("./mcp-server");
|
|
5
5
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
6
6
|
transport.onmessage = async (message) => {
|
|
7
|
-
// eslint-disable-next-line no-console
|
|
8
7
|
console.error('Loadmill MCP:\n' + JSON.stringify(message, null, 2));
|
|
9
8
|
};
|
|
10
9
|
transport.onerror = async (error) => {
|
|
11
|
-
// eslint-disable-next-line no-console
|
|
12
10
|
console.error('Loadmill MCP Error:\n' + JSON.stringify(error, null, 2));
|
|
13
11
|
};
|
|
14
12
|
exports.default = async () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA,wEAAiF;AACjF,6CAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;AAE7C,SAAS,CAAC,SAAS,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE;IACtC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA,wEAAiF;AACjF,6CAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;AAE7C,SAAS,CAAC,SAAS,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC;AAEF,SAAS,CAAC,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;IAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAGF,kBAAe,KAAK,IAAI,EAAE;IACxB,MAAM,sBAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC,CAAC"}
|
package/dist/mcp-handler.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.handlers = void 0;
|
|
|
4
4
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
5
5
|
const constants_js_1 = require("./constants.js");
|
|
6
6
|
const tools_js_1 = require("./tools.js");
|
|
7
|
+
const utils_js_1 = require("./utils.js");
|
|
7
8
|
exports.handlers = [
|
|
8
9
|
{
|
|
9
10
|
schema: types_js_1.ListToolsRequestSchema,
|
|
@@ -35,7 +36,25 @@ exports.handlers = [
|
|
|
35
36
|
},
|
|
36
37
|
},
|
|
37
38
|
{
|
|
38
|
-
name:
|
|
39
|
+
name: constants_js_1.SEARCH_TEST_SUITE_RUNS,
|
|
40
|
+
title: 'Search Test Suite Runs',
|
|
41
|
+
description: 'A tool to search for Loadmill test suite runs. Returns a list of test suite runs',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
search: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'free text filter to search for test suites',
|
|
48
|
+
},
|
|
49
|
+
page: {
|
|
50
|
+
type: 'integer',
|
|
51
|
+
description: 'page number for pagination',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: constants_js_1.RUN_TEST_SUITE,
|
|
39
58
|
title: 'Run Test Suite',
|
|
40
59
|
description: 'A tool to run a Loadmill test suite. Returns the id of the running suite',
|
|
41
60
|
inputSchema: {
|
|
@@ -49,9 +68,10 @@ exports.handlers = [
|
|
|
49
68
|
},
|
|
50
69
|
},
|
|
51
70
|
{
|
|
52
|
-
name:
|
|
71
|
+
name: constants_js_1.GET_TEST_SUITE_RUN,
|
|
53
72
|
title: 'Get Test Suite Run',
|
|
54
|
-
description:
|
|
73
|
+
description: `A tool to get a Loadmill test suite run by its ID.
|
|
74
|
+
Returns the run details including the testSuiteFlowRuns list that can be fetched later and is useful for understanding the flow of the test run.`,
|
|
55
75
|
inputSchema: {
|
|
56
76
|
type: 'object',
|
|
57
77
|
properties: {
|
|
@@ -62,6 +82,21 @@ exports.handlers = [
|
|
|
62
82
|
},
|
|
63
83
|
},
|
|
64
84
|
},
|
|
85
|
+
{
|
|
86
|
+
name: constants_js_1.GET_TEST_SUITE_FLOW_RUN,
|
|
87
|
+
title: 'Get Test Suite Flow Run',
|
|
88
|
+
description: `A tool to get a Loadmill test suite flow run by its ID.
|
|
89
|
+
Returns the run details. Use this when investigating the test run results.`,
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
flowRunId: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'ID of the test suite flow run to fetch',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
65
100
|
{
|
|
66
101
|
name: constants_js_1.SEARCH_TEST_PLAN,
|
|
67
102
|
title: 'Search Test Plans',
|
|
@@ -77,13 +112,6 @@ exports.handlers = [
|
|
|
77
112
|
type: 'integer',
|
|
78
113
|
description: 'page number for pagination',
|
|
79
114
|
},
|
|
80
|
-
labels: {
|
|
81
|
-
type: 'array',
|
|
82
|
-
items: {
|
|
83
|
-
type: 'string',
|
|
84
|
-
description: 'filter suites that have flows with these labels',
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
115
|
},
|
|
88
116
|
},
|
|
89
117
|
},
|
|
@@ -98,6 +126,18 @@ exports.handlers = [
|
|
|
98
126
|
type: 'string',
|
|
99
127
|
description: 'ID of the test plan to run',
|
|
100
128
|
},
|
|
129
|
+
labels: {
|
|
130
|
+
type: 'array',
|
|
131
|
+
items: {
|
|
132
|
+
type: 'string',
|
|
133
|
+
description: 'filter suites that have flows with these labels',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
overrideParameters: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: `Parameters to override in the test plan.
|
|
139
|
+
A string of comma separated list of key-value pairs, e.g. "param1=value1,param2=value2".`,
|
|
140
|
+
},
|
|
101
141
|
},
|
|
102
142
|
},
|
|
103
143
|
},
|
|
@@ -141,6 +181,32 @@ exports.handlers = [
|
|
|
141
181
|
return await tool(request.params);
|
|
142
182
|
},
|
|
143
183
|
},
|
|
184
|
+
{
|
|
185
|
+
schema: types_js_1.ListPromptsRequestSchema,
|
|
186
|
+
handler: async (_request) => {
|
|
187
|
+
return { prompts };
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
schema: types_js_1.GetPromptRequestSchema,
|
|
192
|
+
handler: async (req) => {
|
|
193
|
+
const { name, arguments: args = {} } = req.params;
|
|
194
|
+
const prompt = prompts.find((p) => p.name === name);
|
|
195
|
+
if (!prompt) {
|
|
196
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
197
|
+
}
|
|
198
|
+
const required = (prompt.inputSchema?.required ?? []);
|
|
199
|
+
const missing = required.filter((k) => args[k] === undefined);
|
|
200
|
+
if (missing.length) {
|
|
201
|
+
throw new Error(`Missing required prompt arguments: ${missing.join(', ')}`);
|
|
202
|
+
}
|
|
203
|
+
const messages = prompt.messages.map((m) => ({
|
|
204
|
+
role: m.role,
|
|
205
|
+
content: (0, utils_js_1.fillTemplate)(m.content, args),
|
|
206
|
+
}));
|
|
207
|
+
return { messages };
|
|
208
|
+
},
|
|
209
|
+
},
|
|
144
210
|
{
|
|
145
211
|
schema: types_js_1.ListResourcesRequestSchema,
|
|
146
212
|
handler: async (_request) => {
|
|
@@ -154,4 +220,32 @@ exports.handlers = [
|
|
|
154
220
|
},
|
|
155
221
|
},
|
|
156
222
|
];
|
|
223
|
+
const prompts = [
|
|
224
|
+
{
|
|
225
|
+
name: 'investigate_failed_test',
|
|
226
|
+
description: 'Analyze failed test results and suggest next steps',
|
|
227
|
+
messages: [
|
|
228
|
+
{
|
|
229
|
+
role: 'system',
|
|
230
|
+
content: 'You are a QA investigator. Explain failures clearly and suggest next steps.',
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
role: 'user',
|
|
234
|
+
content: `The test '{{test_description}}' has failed.\n\n
|
|
235
|
+
Result:\n{{result}}\n\n
|
|
236
|
+
RedactableResult (extended data):\n{{redactableResult}}\n\n
|
|
237
|
+
Please explain the cause and suggest how to fix it.`,
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
inputSchema: {
|
|
241
|
+
type: 'object',
|
|
242
|
+
properties: {
|
|
243
|
+
test_description: { type: 'string' },
|
|
244
|
+
result: { type: 'string' },
|
|
245
|
+
redactableResult: { type: 'string' },
|
|
246
|
+
},
|
|
247
|
+
required: ['test_description', 'result', 'redactableResult'],
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
];
|
|
157
251
|
//# sourceMappingURL=mcp-handler.js.map
|
package/dist/mcp-handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-handler.js","sourceRoot":"","sources":["../src/mcp-handler.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"mcp-handler.js","sourceRoot":"","sources":["../src/mcp-handler.ts"],"names":[],"mappings":";;;AAAA,iEAS4C;AAE5C,iDAWwB;AACxB,yCAAwC;AACxC,yCAA0C;AAO7B,QAAA,QAAQ,GAAiB;IACpC;QACE,MAAM,EAAE,iCAAsB;QAC9B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,KAAK,GAAG;gBACZ;oBACE,IAAI,EAAE,iCAAkB;oBACxB,KAAK,EAAE,oBAAoB;oBAC3B,WAAW,EAAE,0EAA0E;oBACvF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4CAA4C;6BAC1D;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,4BAA4B;6BAC1C;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;oCACd,WAAW,EAAE,iDAAiD;iCAC/D;6BACF;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,qCAAsB;oBAC5B,KAAK,EAAE,wBAAwB;oBAC/B,WAAW,EAAE,kFAAkF;oBAC/F,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4CAA4C;6BAC1D;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,4BAA4B;6BAC1C;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,6BAAc;oBACpB,KAAK,EAAE,gBAAgB;oBACvB,WAAW,EAAE,0EAA0E;oBACvF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,6BAA6B;6BAC3C;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,iCAAkB;oBACxB,KAAK,EAAE,oBAAoB;oBAC3B,WAAW,EAAE;2JACoI;oBACjJ,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,mCAAmC;6BACjD;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,sCAAuB;oBAC7B,KAAK,EAAE,yBAAyB;oBAChC,WAAW,EAAE;qFAC8D;oBAC3E,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE;gCACT,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,wCAAwC;6BACtD;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,+BAAgB;oBACtB,KAAK,EAAE,mBAAmB;oBAC1B,WAAW,EAAE,uIAAuI;oBACpJ,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4CAA4C;6BAC1D;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,4BAA4B;6BAC1C;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,4BAAa;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,WAAW,EAAE,wEAAwE;oBACrF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4BAA4B;6BAC1C;4BACD,MAAM,EAAE;gCACN,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE;oCACL,IAAI,EAAE,QAAQ;oCACd,WAAW,EAAE,iDAAiD;iCAC/D;6BACF;4BACD,kBAAkB,EAAE;gCAClB,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE;yGAC4E;6BAC1F;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,gCAAiB;oBACvB,KAAK,EAAE,mBAAmB;oBAC1B,WAAW,EAAE,4EAA4E;oBACzF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,kCAAkC;6BAChD;yBACF;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,yBAAU;oBAChB,KAAK,EAAE,YAAY;oBACnB,WAAW,EAAE,mDAAmD;oBAChE,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;qBACf;iBACF;aACF,CAAC;YAEF,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;KACF;IACD;QACE,MAAM,EAAE,gCAAqB;QAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzB,IAAI,CAAC,8BAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAClD,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,cAAc,EACxB,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACvC,CAAC;aACH;YACD,MAAM,IAAI,GAAG,qBAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,CAAC,IAAI,EAAE;gBACT,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,cAAc,EACxB,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACvC,CAAC;aACH;YAED,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;KACF;IACD;QACE,MAAM,EAAE,mCAAwB;QAChC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;KACF;IACD;QACE,MAAM,EAAE,iCAAsB;QAC9B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAElD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;aAC5C;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAa,CAAC;YAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAC9D,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,MAAM,IAAI,KAAK,CACb,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3D,CAAC;aACH;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,IAAA,uBAAY,EAAC,CAAC,CAAC,OAAO,EAAE,IAA+B,CAAC;aAClE,CAAC,CAAC,CAAC;YAEJ,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,CAAC;KACF;IACD;QACE,MAAM,EAAE,qCAA0B;QAClC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,qBAAqB;QACvB,CAAC;KACF;IACD;QACE,MAAM,EAAE,oCAAyB;QACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,qBAAqB;QACvB,CAAC;KACF;CACF,CAAC;AAEF,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,oDAAoD;QACjE,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EACH,6EAA6E;aAClF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EACE;;;qEAGoD;aAC9D;SACF;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACpC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACrC;YACD,QAAQ,EAAE,CAAC,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,CAAC;SAC7D;KACF;CACF,CAAC"}
|
package/dist/mcp-server.js
CHANGED
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";;;AAAA,wEAAmE;AACnE,2CAAkE;AAClE,qDAA4C;AAE5C,IAAI,MAAc,CAAC;AAGnB,MAAM,UAAU,GAAG,GAAG,EAAE;IACtB,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,aAAa,EAAE,CAAC;KAC1B;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,MAAM,GAAG,IAAI,iBAAM,CACjB;QACE,IAAI,EAAE,2BAAe;QACrB,OAAO,EAAE,8BAAkB;KAC5B,EACD;QACE,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";;;AAAA,wEAAmE;AACnE,2CAAkE;AAClE,qDAA4C;AAE5C,IAAI,MAAc,CAAC;AAGnB,MAAM,UAAU,GAAG,GAAG,EAAE;IACtB,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,aAAa,EAAE,CAAC;KAC1B;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,MAAM,GAAG,IAAI,iBAAM,CACjB;QACE,IAAI,EAAE,2BAAe;QACrB,OAAO,EAAE,8BAAkB;KAC5B,EACD;QACE,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAGF,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,EAAE;IACnC,yBAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEW,QAAA,SAAS,GAAG,UAAU,EAAE,CAAC"}
|
package/dist/tools.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.toolsTasks = void 0;
|
|
4
4
|
const http_request_js_1 = require("./http-request.js");
|
|
5
5
|
const constants_js_1 = require("./constants.js");
|
|
6
|
+
const utils_js_1 = require("./utils.js");
|
|
6
7
|
const LOADMILL_URL = process.env.LOADMILL_URL || 'https://app.loadmill.com';
|
|
7
8
|
const BASE_URL = LOADMILL_URL + '/api';
|
|
8
9
|
// todo make sure all return in the same allowed pattern
|
|
@@ -29,6 +30,27 @@ exports.toolsTasks = {
|
|
|
29
30
|
}],
|
|
30
31
|
};
|
|
31
32
|
},
|
|
33
|
+
[constants_js_1.SEARCH_TEST_SUITE_RUNS]: async (params) => {
|
|
34
|
+
const args = params.arguments;
|
|
35
|
+
// eslint-disable-next-line no-console
|
|
36
|
+
console.log('Searching test suite runs with args:', args);
|
|
37
|
+
const response = await (0, http_request_js_1.sendHttpRequest)({
|
|
38
|
+
method: http_request_js_1.HttpMethods.GET,
|
|
39
|
+
url: `${BASE_URL}/test-suites-runs/flows`,
|
|
40
|
+
query: {
|
|
41
|
+
search: args.search || '',
|
|
42
|
+
filter: args.filter || 'All',
|
|
43
|
+
fromDateFilter: args.fromDateFilter || '',
|
|
44
|
+
toDateFilter: args.toDateFilter || '',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
content: [{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: JSON.stringify(response, null, 2),
|
|
51
|
+
}],
|
|
52
|
+
};
|
|
53
|
+
},
|
|
32
54
|
[constants_js_1.RUN_TEST_SUITE]: async (params) => {
|
|
33
55
|
const args = params.arguments;
|
|
34
56
|
// eslint-disable-next-line no-console
|
|
@@ -59,6 +81,21 @@ exports.toolsTasks = {
|
|
|
59
81
|
}],
|
|
60
82
|
};
|
|
61
83
|
},
|
|
84
|
+
[constants_js_1.GET_TEST_SUITE_FLOW_RUN]: async (params) => {
|
|
85
|
+
const args = params.arguments;
|
|
86
|
+
// eslint-disable-next-line no-console
|
|
87
|
+
console.log('Getting test suite flow run with args:', args);
|
|
88
|
+
const response = await (0, http_request_js_1.sendHttpRequest)({
|
|
89
|
+
method: http_request_js_1.HttpMethods.GET,
|
|
90
|
+
url: `${BASE_URL}/test-suites-runs/flows/${args.flowRunId}`,
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
content: [{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: JSON.stringify(response, null, 2),
|
|
96
|
+
}],
|
|
97
|
+
};
|
|
98
|
+
},
|
|
62
99
|
[constants_js_1.SEARCH_TEST_PLAN]: async (params) => {
|
|
63
100
|
const args = params.arguments;
|
|
64
101
|
// eslint-disable-next-line no-console
|
|
@@ -71,7 +108,6 @@ exports.toolsTasks = {
|
|
|
71
108
|
filter: args.filter || 'All',
|
|
72
109
|
fromDateFilter: args.fromDateFilter || '',
|
|
73
110
|
toDateFilter: args.toDateFilter || '',
|
|
74
|
-
labels: args.labels || [],
|
|
75
111
|
},
|
|
76
112
|
});
|
|
77
113
|
return {
|
|
@@ -85,9 +121,16 @@ exports.toolsTasks = {
|
|
|
85
121
|
const args = params.arguments;
|
|
86
122
|
// eslint-disable-next-line no-console
|
|
87
123
|
console.log('Running test plan with args:', args);
|
|
124
|
+
// AI decides to use both for some reason
|
|
125
|
+
const overrideParameters = args.overrideParameters && (0, utils_js_1.toLoadmillParams)(args.overrideParameters);
|
|
126
|
+
const parameters = args.parameters && (0, utils_js_1.toLoadmillParams)(args.parameters);
|
|
88
127
|
const response = await (0, http_request_js_1.sendHttpRequest)({
|
|
89
128
|
method: http_request_js_1.HttpMethods.POST,
|
|
90
129
|
url: `${BASE_URL}/test-plans/${args.id}/run`,
|
|
130
|
+
body: {
|
|
131
|
+
labels: args.labels || [],
|
|
132
|
+
overrideParameters: overrideParameters || parameters || {},
|
|
133
|
+
},
|
|
91
134
|
});
|
|
92
135
|
return {
|
|
93
136
|
content: [{
|
|
@@ -119,10 +162,18 @@ exports.toolsTasks = {
|
|
|
119
162
|
method: http_request_js_1.HttpMethods.GET,
|
|
120
163
|
url: `${BASE_URL}/labels`,
|
|
121
164
|
});
|
|
165
|
+
// drop the colors
|
|
166
|
+
const res = JSON.parse(response.text);
|
|
167
|
+
const labels = res.teamLabels.map(tl => {
|
|
168
|
+
return {
|
|
169
|
+
id: tl.id,
|
|
170
|
+
description: tl.description,
|
|
171
|
+
};
|
|
172
|
+
});
|
|
122
173
|
return {
|
|
123
174
|
content: [{
|
|
124
175
|
type: 'text',
|
|
125
|
-
text: JSON.stringify(
|
|
176
|
+
text: JSON.stringify(labels, null, 2),
|
|
126
177
|
}],
|
|
127
178
|
};
|
|
128
179
|
},
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":";;;AAAA,uDAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fillTemplate = exports.toLoadmillParams = void 0;
|
|
4
|
+
const toLoadmillParams = (rawParams = '') => {
|
|
5
|
+
const parameters = {};
|
|
6
|
+
if (Array.isArray(rawParams)) { // AI shenaniganz
|
|
7
|
+
rawParams = rawParams.join(',');
|
|
8
|
+
}
|
|
9
|
+
rawParams.split(',').forEach(pair => {
|
|
10
|
+
if (!pair) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const pivot = pair.indexOf('=');
|
|
14
|
+
if (pivot <= 0) {
|
|
15
|
+
throw new Error(`Invalid parameter assignment: ${pair}`);
|
|
16
|
+
}
|
|
17
|
+
const name = pair.slice(0, pivot);
|
|
18
|
+
parameters[name] = pair.slice(pivot + 1, pair.length);
|
|
19
|
+
});
|
|
20
|
+
return parameters;
|
|
21
|
+
};
|
|
22
|
+
exports.toLoadmillParams = toLoadmillParams;
|
|
23
|
+
function toStr(v) {
|
|
24
|
+
if (typeof v === 'string') {
|
|
25
|
+
return v;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return JSON.stringify(v, null, 2);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return String(v);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function fillTemplate(tpl, args) {
|
|
35
|
+
return tpl.replace(/{{\s*([\w]+)\s*}}/g, (_, key) => {
|
|
36
|
+
const val = args?.[key];
|
|
37
|
+
return val === undefined || val === null ? '' : toStr(val);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
exports.fillTemplate = fillTemplate;
|
|
41
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AACO,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAE,EAAE,EAAE;IACzD,MAAM,UAAU,GAAG,EAAE,CAAC;IAEtB,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,iBAAiB;QAC/C,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACjC;IAED,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAClC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;SAC1D;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAvBW,QAAA,gBAAgB,oBAuB3B;AAEF,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QACzB,OAAO,CAAC,CAAC;KACV;IACD,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;KACnC;IAAC,MAAM;QACN,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;KAClB;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW,EAAE,IAA6B;IACrE,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AALD,oCAKC"}
|