@structured-world/gitlab-mcp 4.5.0 → 5.1.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 +1 -0
- package/dist/config.js +23 -23
- package/dist/config.js.map +1 -1
- package/dist/entities/core/index.d.ts +5 -5
- package/dist/entities/core/index.js +1 -1
- package/dist/entities/core/registry.d.ts +1 -1
- package/dist/entities/core/registry.js +149 -149
- package/dist/entities/core/registry.js.map +1 -1
- package/dist/entities/core/schema-readonly.d.ts +1 -1
- package/dist/entities/core/schema-readonly.js +132 -132
- package/dist/entities/core/schema-readonly.js.map +1 -1
- package/dist/entities/core/schema.d.ts +1 -1
- package/dist/entities/core/schema.js +59 -59
- package/dist/entities/files/index.d.ts +5 -5
- package/dist/entities/files/index.js +1 -1
- package/dist/entities/files/registry.d.ts +1 -1
- package/dist/entities/files/registry.js +32 -32
- package/dist/entities/files/registry.js.map +1 -1
- package/dist/entities/files/schema-readonly.d.ts +1 -1
- package/dist/entities/files/schema-readonly.js +10 -10
- package/dist/entities/files/schema.d.ts +1 -1
- package/dist/entities/files/schema.js +19 -19
- package/dist/entities/index.d.ts +10 -10
- package/dist/entities/labels/index.d.ts +5 -5
- package/dist/entities/labels/index.js +1 -1
- package/dist/entities/labels/registry.d.ts +1 -1
- package/dist/entities/labels/registry.js +31 -31
- package/dist/entities/labels/registry.js.map +1 -1
- package/dist/entities/labels/schema-readonly.d.ts +1 -1
- package/dist/entities/labels/schema-readonly.js +7 -7
- package/dist/entities/labels/schema.d.ts +1 -1
- package/dist/entities/labels/schema.js +11 -11
- package/dist/entities/milestones/index.d.ts +5 -5
- package/dist/entities/milestones/index.js +1 -1
- package/dist/entities/milestones/registry.d.ts +1 -1
- package/dist/entities/milestones/registry.js +49 -49
- package/dist/entities/milestones/registry.js.map +1 -1
- package/dist/entities/milestones/schema-readonly.d.ts +2 -2
- package/dist/entities/milestones/schema-readonly.js +11 -11
- package/dist/entities/milestones/schema.d.ts +1 -1
- package/dist/entities/milestones/schema.js +18 -18
- package/dist/entities/milestones/schema.js.map +1 -1
- package/dist/entities/mrs/index.d.ts +5 -5
- package/dist/entities/mrs/index.js +1 -1
- package/dist/entities/mrs/registry.d.ts +1 -1
- package/dist/entities/mrs/registry.js +118 -118
- package/dist/entities/mrs/registry.js.map +1 -1
- package/dist/entities/mrs/schema-readonly.d.ts +1 -1
- package/dist/entities/mrs/schema-readonly.js +47 -47
- package/dist/entities/mrs/schema-readonly.js.map +1 -1
- package/dist/entities/mrs/schema.d.ts +1 -1
- package/dist/entities/mrs/schema.js +86 -86
- package/dist/entities/mrs/schema.js.map +1 -1
- package/dist/entities/pipelines/index.d.ts +5 -5
- package/dist/entities/pipelines/index.js +1 -1
- package/dist/entities/pipelines/registry.d.ts +1 -1
- package/dist/entities/pipelines/registry.js +58 -58
- package/dist/entities/pipelines/registry.js.map +1 -1
- package/dist/entities/pipelines/schema-readonly.d.ts +1 -1
- package/dist/entities/pipelines/schema-readonly.js +65 -65
- package/dist/entities/pipelines/schema.d.ts +1 -1
- package/dist/entities/pipelines/schema.js +15 -15
- package/dist/entities/shared.d.ts +1 -1
- package/dist/entities/shared.js +7 -7
- package/dist/entities/utils.d.ts +1 -1
- package/dist/entities/utils.js +5 -5
- package/dist/entities/utils.js.map +1 -1
- package/dist/entities/variables/index.d.ts +5 -5
- package/dist/entities/variables/index.js +1 -1
- package/dist/entities/variables/registry.d.ts +1 -1
- package/dist/entities/variables/registry.js +29 -29
- package/dist/entities/variables/registry.js.map +1 -1
- package/dist/entities/variables/schema-readonly.d.ts +1 -1
- package/dist/entities/variables/schema-readonly.js +4 -4
- package/dist/entities/variables/schema.d.ts +1 -1
- package/dist/entities/variables/schema.js +32 -32
- package/dist/entities/variables/schema.js.map +1 -1
- package/dist/entities/wiki/index.d.ts +5 -5
- package/dist/entities/wiki/index.js +1 -1
- package/dist/entities/wiki/registry.d.ts +1 -1
- package/dist/entities/wiki/registry.js +26 -26
- package/dist/entities/wiki/registry.js.map +1 -1
- package/dist/entities/wiki/schema-readonly.d.ts +1 -1
- package/dist/entities/wiki/schema-readonly.js +4 -4
- package/dist/entities/wiki/schema.d.ts +1 -1
- package/dist/entities/wiki/schema.js +11 -11
- package/dist/entities/workitems/index.d.ts +5 -5
- package/dist/entities/workitems/index.js +1 -1
- package/dist/entities/workitems/registry.d.ts +1 -1
- package/dist/entities/workitems/registry.js +55 -55
- package/dist/entities/workitems/registry.js.map +1 -1
- package/dist/entities/workitems/schema-readonly.d.ts +1 -1
- package/dist/entities/workitems/schema-readonly.js +25 -25
- package/dist/entities/workitems/schema-readonly.js.map +1 -1
- package/dist/entities/workitems/schema.d.ts +1 -1
- package/dist/entities/workitems/schema.js +11 -11
- package/dist/graphql/DynamicWorkItemsQuery.d.ts +2 -2
- package/dist/graphql/DynamicWorkItemsQuery.js +47 -47
- package/dist/graphql/DynamicWorkItemsQuery.js.map +1 -1
- package/dist/graphql/client.d.ts +1 -1
- package/dist/graphql/client.js +4 -4
- package/dist/graphql/client.js.map +1 -1
- package/dist/graphql/index.d.ts +2 -2
- package/dist/graphql/workItems.d.ts +33 -33
- package/dist/graphql/workItems.js +29 -29
- package/dist/handlers.d.ts +1 -1
- package/dist/handlers.js +20 -20
- package/dist/handlers.js.map +1 -1
- package/dist/http-client.js +3 -3
- package/dist/logger.js +4 -4
- package/dist/registry-manager.d.ts +1 -1
- package/dist/registry-manager.js +27 -27
- package/dist/server.d.ts +1 -1
- package/dist/server.js +46 -46
- package/dist/services/ConnectionManager.d.ts +4 -4
- package/dist/services/ConnectionManager.js +13 -13
- package/dist/services/GitLabVersionDetector.d.ts +2 -2
- package/dist/services/GitLabVersionDetector.js +41 -41
- package/dist/services/GitLabVersionDetector.js.map +1 -1
- package/dist/services/SchemaIntrospector.d.ts +1 -1
- package/dist/services/SchemaIntrospector.js +42 -42
- package/dist/services/SchemaIntrospector.js.map +1 -1
- package/dist/services/ToolAvailability.d.ts +2 -2
- package/dist/services/ToolAvailability.js +279 -279
- package/dist/services/ToolAvailability.js.map +1 -1
- package/dist/services/WidgetAvailability.d.ts +3 -3
- package/dist/services/WidgetAvailability.js +32 -32
- package/dist/structured-world-gitlab-mcp-5.1.0.tgz +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types.js +4 -4
- package/dist/utils/fetch.d.ts +4 -4
- package/dist/utils/fetch.js +15 -15
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/idConversion.js +33 -33
- package/dist/utils/idConversion.js.map +1 -1
- package/dist/utils/namespace.d.ts +2 -2
- package/dist/utils/namespace.js +13 -13
- package/dist/utils/smart-user-search.d.ts +1 -1
- package/dist/utils/smart-user-search.js +10 -10
- package/package.json +1 -1
- package/dist/structured-world-gitlab-mcp-4.5.0.tgz +0 -0
package/dist/server.js
CHANGED
|
@@ -25,68 +25,68 @@ exports.server = new index_js_1.Server({
|
|
|
25
25
|
function determineTransportMode() {
|
|
26
26
|
const args = process.argv.slice(2);
|
|
27
27
|
logger_1.logger.info(`Transport mode detection: args=${JSON.stringify(args)}, PORT=${config_1.PORT}`);
|
|
28
|
-
if (args.includes(
|
|
29
|
-
logger_1.logger.info(
|
|
30
|
-
return
|
|
28
|
+
if (args.includes("stdio")) {
|
|
29
|
+
logger_1.logger.info("Selected stdio mode (explicit argument)");
|
|
30
|
+
return "stdio";
|
|
31
31
|
}
|
|
32
32
|
if (process.env.PORT) {
|
|
33
|
-
logger_1.logger.info(
|
|
34
|
-
return
|
|
33
|
+
logger_1.logger.info("Selected dual transport mode (SSE + StreamableHTTP) - PORT environment variable detected");
|
|
34
|
+
return "dual";
|
|
35
35
|
}
|
|
36
|
-
logger_1.logger.info(
|
|
37
|
-
return
|
|
36
|
+
logger_1.logger.info("Selected stdio mode (no PORT environment variable)");
|
|
37
|
+
return "stdio";
|
|
38
38
|
}
|
|
39
39
|
async function startServer() {
|
|
40
40
|
await (0, handlers_1.setupHandlers)(exports.server);
|
|
41
41
|
const transportMode = determineTransportMode();
|
|
42
42
|
switch (transportMode) {
|
|
43
|
-
case
|
|
43
|
+
case "stdio": {
|
|
44
44
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
45
45
|
await exports.server.connect(transport);
|
|
46
|
-
logger_1.logger.info(
|
|
46
|
+
logger_1.logger.info("GitLab MCP Server running on stdio");
|
|
47
47
|
break;
|
|
48
48
|
}
|
|
49
|
-
case
|
|
50
|
-
logger_1.logger.info(
|
|
49
|
+
case "sse": {
|
|
50
|
+
logger_1.logger.info("Setting up SSE mode with MCP SDK...");
|
|
51
51
|
const app = (0, express_1.default)();
|
|
52
52
|
app.use(express_1.default.json());
|
|
53
53
|
const sseTransports = {};
|
|
54
|
-
app.get(
|
|
55
|
-
logger_1.logger.debug(
|
|
56
|
-
const transport = new sse_js_1.SSEServerTransport(
|
|
54
|
+
app.get("/sse", async (req, res) => {
|
|
55
|
+
logger_1.logger.debug("SSE endpoint hit!");
|
|
56
|
+
const transport = new sse_js_1.SSEServerTransport("/messages", res);
|
|
57
57
|
await exports.server.connect(transport);
|
|
58
58
|
const sessionId = transport.sessionId;
|
|
59
59
|
sseTransports[sessionId] = transport;
|
|
60
60
|
logger_1.logger.debug(`SSE transport created with session: ${sessionId}`);
|
|
61
61
|
});
|
|
62
|
-
app.post(
|
|
63
|
-
logger_1.logger.debug(
|
|
62
|
+
app.post("/messages", async (req, res) => {
|
|
63
|
+
logger_1.logger.debug("Messages endpoint hit!");
|
|
64
64
|
const sessionId = req.query.sessionId;
|
|
65
65
|
if (!sessionId || !sseTransports[sessionId]) {
|
|
66
|
-
return res.status(404).json({ error:
|
|
66
|
+
return res.status(404).json({ error: "Session not found" });
|
|
67
67
|
}
|
|
68
68
|
try {
|
|
69
69
|
const transport = sseTransports[sessionId];
|
|
70
70
|
await transport.handlePostMessage(req, res, req.body);
|
|
71
71
|
}
|
|
72
72
|
catch (error) {
|
|
73
|
-
logger_1.logger.error({ err: error },
|
|
74
|
-
res.status(500).json({ error:
|
|
73
|
+
logger_1.logger.error({ err: error }, "Error handling SSE message");
|
|
74
|
+
res.status(500).json({ error: "Internal server error" });
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
app.listen(Number(config_1.PORT), config_1.HOST, () => {
|
|
78
78
|
const url = `http://${config_1.HOST}:${config_1.PORT}`;
|
|
79
79
|
logger_1.logger.info(`GitLab MCP Server SSE running on ${url}`);
|
|
80
|
-
logger_1.logger.info(
|
|
80
|
+
logger_1.logger.info("SSE server started successfully");
|
|
81
81
|
});
|
|
82
82
|
break;
|
|
83
83
|
}
|
|
84
|
-
case
|
|
84
|
+
case "streamable-http": {
|
|
85
85
|
const app = (0, express_1.default)();
|
|
86
86
|
app.use(express_1.default.json());
|
|
87
87
|
const streamableTransports = {};
|
|
88
|
-
app.all(
|
|
89
|
-
const sessionId = req.headers[
|
|
88
|
+
app.all("/mcp", async (req, res) => {
|
|
89
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
90
90
|
try {
|
|
91
91
|
let transport;
|
|
92
92
|
if (sessionId && sessionId in streamableTransports) {
|
|
@@ -110,48 +110,48 @@ async function startServer() {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
catch (error) {
|
|
113
|
-
logger_1.logger.error({ err: error },
|
|
114
|
-
res.status(500).json({ error:
|
|
113
|
+
logger_1.logger.error({ err: error }, "Error in StreamableHTTP transport");
|
|
114
|
+
res.status(500).json({ error: "Internal server error" });
|
|
115
115
|
}
|
|
116
116
|
});
|
|
117
117
|
app.listen(Number(config_1.PORT), config_1.HOST, () => {
|
|
118
118
|
const url = `http://${config_1.HOST}:${config_1.PORT}`;
|
|
119
119
|
logger_1.logger.info(`GitLab MCP Server running on ${url}/mcp`);
|
|
120
|
-
logger_1.logger.info(
|
|
120
|
+
logger_1.logger.info("Supports both SSE (GET) and JSON-RPC (POST) on same endpoint");
|
|
121
121
|
});
|
|
122
122
|
break;
|
|
123
123
|
}
|
|
124
|
-
case
|
|
125
|
-
logger_1.logger.info(
|
|
124
|
+
case "dual": {
|
|
125
|
+
logger_1.logger.info("Setting up dual transport mode (SSE + StreamableHTTP)...");
|
|
126
126
|
const app = (0, express_1.default)();
|
|
127
127
|
app.use(express_1.default.json());
|
|
128
128
|
const sseTransports = {};
|
|
129
129
|
const streamableTransports = {};
|
|
130
|
-
app.get(
|
|
131
|
-
logger_1.logger.debug(
|
|
132
|
-
const transport = new sse_js_1.SSEServerTransport(
|
|
130
|
+
app.get("/sse", async (req, res) => {
|
|
131
|
+
logger_1.logger.debug("SSE endpoint hit!");
|
|
132
|
+
const transport = new sse_js_1.SSEServerTransport("/messages", res);
|
|
133
133
|
await exports.server.connect(transport);
|
|
134
134
|
const sessionId = transport.sessionId;
|
|
135
135
|
sseTransports[sessionId] = transport;
|
|
136
136
|
logger_1.logger.debug(`SSE transport created with session: ${sessionId}`);
|
|
137
137
|
});
|
|
138
|
-
app.post(
|
|
139
|
-
logger_1.logger.debug(
|
|
138
|
+
app.post("/messages", async (req, res) => {
|
|
139
|
+
logger_1.logger.debug("SSE messages endpoint hit!");
|
|
140
140
|
const sessionId = req.query.sessionId;
|
|
141
141
|
if (!sessionId || !sseTransports[sessionId]) {
|
|
142
|
-
return res.status(404).json({ error:
|
|
142
|
+
return res.status(404).json({ error: "Session not found" });
|
|
143
143
|
}
|
|
144
144
|
try {
|
|
145
145
|
const transport = sseTransports[sessionId];
|
|
146
146
|
await transport.handlePostMessage(req, res, req.body);
|
|
147
147
|
}
|
|
148
148
|
catch (error) {
|
|
149
|
-
logger_1.logger.error({ err: error },
|
|
150
|
-
res.status(500).json({ error:
|
|
149
|
+
logger_1.logger.error({ err: error }, "Error handling SSE message");
|
|
150
|
+
res.status(500).json({ error: "Internal server error" });
|
|
151
151
|
}
|
|
152
152
|
});
|
|
153
|
-
app.all(
|
|
154
|
-
const sessionId = req.headers[
|
|
153
|
+
app.all("/mcp", async (req, res) => {
|
|
154
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
155
155
|
try {
|
|
156
156
|
let transport;
|
|
157
157
|
if (sessionId && sessionId in streamableTransports) {
|
|
@@ -175,28 +175,28 @@ async function startServer() {
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
catch (error) {
|
|
178
|
-
logger_1.logger.error({ err: error },
|
|
179
|
-
res.status(500).json({ error:
|
|
178
|
+
logger_1.logger.error({ err: error }, "Error in StreamableHTTP transport");
|
|
179
|
+
res.status(500).json({ error: "Internal server error" });
|
|
180
180
|
}
|
|
181
181
|
});
|
|
182
182
|
app.listen(Number(config_1.PORT), config_1.HOST, () => {
|
|
183
183
|
const url = `http://${config_1.HOST}:${config_1.PORT}`;
|
|
184
184
|
logger_1.logger.info(`GitLab MCP Server running on ${url}`);
|
|
185
|
-
logger_1.logger.info(
|
|
185
|
+
logger_1.logger.info("🔄 Dual Transport Mode Active:");
|
|
186
186
|
logger_1.logger.info(` 📡 SSE endpoint: ${url}/sse (backwards compatibility)`);
|
|
187
187
|
logger_1.logger.info(` 🚀 StreamableHTTP endpoint: ${url}/mcp (modern, supports SSE + JSON-RPC)`);
|
|
188
|
-
logger_1.logger.info(
|
|
188
|
+
logger_1.logger.info("Clients can use either transport as needed");
|
|
189
189
|
});
|
|
190
190
|
break;
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
-
process.on(
|
|
195
|
-
logger_1.logger.info(
|
|
194
|
+
process.on("SIGINT", () => {
|
|
195
|
+
logger_1.logger.info("Shutting down GitLab MCP Server...");
|
|
196
196
|
process.exit(0);
|
|
197
197
|
});
|
|
198
|
-
process.on(
|
|
199
|
-
logger_1.logger.info(
|
|
198
|
+
process.on("SIGTERM", () => {
|
|
199
|
+
logger_1.logger.info("Shutting down GitLab MCP Server...");
|
|
200
200
|
process.exit(0);
|
|
201
201
|
});
|
|
202
202
|
//# sourceMappingURL=server.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { GraphQLClient } from
|
|
2
|
-
import { GitLabVersionDetector, GitLabInstanceInfo } from
|
|
3
|
-
import { SchemaIntrospector, SchemaInfo } from
|
|
1
|
+
import { GraphQLClient } from "../graphql/client";
|
|
2
|
+
import { GitLabVersionDetector, GitLabInstanceInfo } from "./GitLabVersionDetector";
|
|
3
|
+
import { SchemaIntrospector, SchemaInfo } from "./SchemaIntrospector";
|
|
4
4
|
export declare class ConnectionManager {
|
|
5
5
|
private static instance;
|
|
6
6
|
private client;
|
|
@@ -19,7 +19,7 @@ export declare class ConnectionManager {
|
|
|
19
19
|
getSchemaIntrospector(): SchemaIntrospector;
|
|
20
20
|
getInstanceInfo(): GitLabInstanceInfo;
|
|
21
21
|
getSchemaInfo(): SchemaInfo;
|
|
22
|
-
isFeatureAvailable(feature: keyof GitLabInstanceInfo[
|
|
22
|
+
isFeatureAvailable(feature: keyof GitLabInstanceInfo["features"]): boolean;
|
|
23
23
|
getTier(): string;
|
|
24
24
|
getVersion(): string;
|
|
25
25
|
isWidgetAvailable(widgetType: string): boolean;
|
|
@@ -27,7 +27,7 @@ class ConnectionManager {
|
|
|
27
27
|
}
|
|
28
28
|
try {
|
|
29
29
|
if (!config_1.GITLAB_BASE_URL || !config_1.GITLAB_TOKEN) {
|
|
30
|
-
throw new Error(
|
|
30
|
+
throw new Error("GitLab base URL and token are required");
|
|
31
31
|
}
|
|
32
32
|
const endpoint = `${config_1.GITLAB_BASE_URL}/api/graphql`;
|
|
33
33
|
this.client = new client_1.GraphQLClient(endpoint, {
|
|
@@ -40,12 +40,12 @@ class ConnectionManager {
|
|
|
40
40
|
const cached = ConnectionManager.introspectionCache.get(endpoint);
|
|
41
41
|
const now = Date.now();
|
|
42
42
|
if (cached && now - cached.timestamp < ConnectionManager.CACHE_TTL) {
|
|
43
|
-
logger_1.logger.info(
|
|
43
|
+
logger_1.logger.info("Using cached GraphQL introspection data");
|
|
44
44
|
this.instanceInfo = cached.instanceInfo;
|
|
45
45
|
this.schemaInfo = cached.schemaInfo;
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
logger_1.logger.debug(
|
|
48
|
+
logger_1.logger.debug("Introspecting GitLab GraphQL schema...");
|
|
49
49
|
const [instanceInfo, schemaInfo] = await Promise.all([
|
|
50
50
|
this.versionDetector.detectInstance(),
|
|
51
51
|
this.schemaIntrospector.introspectSchema(),
|
|
@@ -57,7 +57,7 @@ class ConnectionManager {
|
|
|
57
57
|
schemaInfo,
|
|
58
58
|
timestamp: now,
|
|
59
59
|
});
|
|
60
|
-
logger_1.logger.info(
|
|
60
|
+
logger_1.logger.info("GraphQL schema introspection completed");
|
|
61
61
|
}
|
|
62
62
|
this.isInitialized = true;
|
|
63
63
|
logger_1.logger.info({
|
|
@@ -70,40 +70,40 @@ class ConnectionManager {
|
|
|
70
70
|
: [],
|
|
71
71
|
widgetTypes: this.schemaInfo?.workItemWidgetTypes.length || 0,
|
|
72
72
|
schemaTypes: this.schemaInfo?.typeDefinitions.size || 0,
|
|
73
|
-
},
|
|
73
|
+
}, "GitLab instance and schema detected");
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
|
-
logger_1.logger.error({ err: error },
|
|
76
|
+
logger_1.logger.error({ err: error }, "Failed to initialize connection");
|
|
77
77
|
throw error;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
getClient() {
|
|
81
81
|
if (!this.client) {
|
|
82
|
-
throw new Error(
|
|
82
|
+
throw new Error("Connection not initialized. Call initialize() first.");
|
|
83
83
|
}
|
|
84
84
|
return this.client;
|
|
85
85
|
}
|
|
86
86
|
getVersionDetector() {
|
|
87
87
|
if (!this.versionDetector) {
|
|
88
|
-
throw new Error(
|
|
88
|
+
throw new Error("Connection not initialized. Call initialize() first.");
|
|
89
89
|
}
|
|
90
90
|
return this.versionDetector;
|
|
91
91
|
}
|
|
92
92
|
getSchemaIntrospector() {
|
|
93
93
|
if (!this.schemaIntrospector) {
|
|
94
|
-
throw new Error(
|
|
94
|
+
throw new Error("Connection not initialized. Call initialize() first.");
|
|
95
95
|
}
|
|
96
96
|
return this.schemaIntrospector;
|
|
97
97
|
}
|
|
98
98
|
getInstanceInfo() {
|
|
99
99
|
if (!this.instanceInfo) {
|
|
100
|
-
throw new Error(
|
|
100
|
+
throw new Error("Connection not initialized. Call initialize() first.");
|
|
101
101
|
}
|
|
102
102
|
return this.instanceInfo;
|
|
103
103
|
}
|
|
104
104
|
getSchemaInfo() {
|
|
105
105
|
if (!this.schemaInfo) {
|
|
106
|
-
throw new Error(
|
|
106
|
+
throw new Error("Connection not initialized. Call initialize() first.");
|
|
107
107
|
}
|
|
108
108
|
return this.schemaInfo;
|
|
109
109
|
}
|
|
@@ -115,13 +115,13 @@ class ConnectionManager {
|
|
|
115
115
|
}
|
|
116
116
|
getTier() {
|
|
117
117
|
if (!this.instanceInfo) {
|
|
118
|
-
return
|
|
118
|
+
return "unknown";
|
|
119
119
|
}
|
|
120
120
|
return this.instanceInfo.tier;
|
|
121
121
|
}
|
|
122
122
|
getVersion() {
|
|
123
123
|
if (!this.instanceInfo) {
|
|
124
|
-
return
|
|
124
|
+
return "unknown";
|
|
125
125
|
}
|
|
126
126
|
return this.instanceInfo.version;
|
|
127
127
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GraphQLClient } from
|
|
2
|
-
export type GitLabTier =
|
|
1
|
+
import { GraphQLClient } from "../graphql/client";
|
|
2
|
+
export type GitLabTier = "free" | "premium" | "ultimate";
|
|
3
3
|
export interface GitLabFeatures {
|
|
4
4
|
workItems: boolean;
|
|
5
5
|
epics: boolean;
|
|
@@ -59,7 +59,7 @@ const FEATURE_DETECTION_QUERY = (0, graphql_tag_1.gql) `
|
|
|
59
59
|
class GitLabVersionDetector {
|
|
60
60
|
client;
|
|
61
61
|
cachedInfo = null;
|
|
62
|
-
testGroupPath =
|
|
62
|
+
testGroupPath = "test";
|
|
63
63
|
constructor(client) {
|
|
64
64
|
this.client = client;
|
|
65
65
|
}
|
|
@@ -93,7 +93,7 @@ class GitLabVersionDetector {
|
|
|
93
93
|
}
|
|
94
94
|
async detectVersionFallback() {
|
|
95
95
|
try {
|
|
96
|
-
const baseUrl = this.client.endpoint.replace(
|
|
96
|
+
const baseUrl = this.client.endpoint.replace("/api/graphql", "");
|
|
97
97
|
const response = await (0, fetch_1.enhancedFetch)(`${baseUrl}/api/v4/version`);
|
|
98
98
|
if (response.ok) {
|
|
99
99
|
const data = (await response.json());
|
|
@@ -103,18 +103,18 @@ class GitLabVersionDetector {
|
|
|
103
103
|
catch (error) {
|
|
104
104
|
logger_1.logger.warn(`Failed to detect version via REST API: ${error instanceof Error ? error.message : String(error)}`);
|
|
105
105
|
}
|
|
106
|
-
return
|
|
106
|
+
return "unknown";
|
|
107
107
|
}
|
|
108
108
|
async detectTier() {
|
|
109
109
|
try {
|
|
110
110
|
const response = await this.client.request(LICENSE_QUERY);
|
|
111
111
|
if (response.currentLicense) {
|
|
112
|
-
const plan = response.currentLicense.plan?.toLowerCase() ??
|
|
113
|
-
if (plan.includes(
|
|
114
|
-
return
|
|
112
|
+
const plan = response.currentLicense.plan?.toLowerCase() ?? "";
|
|
113
|
+
if (plan.includes("ultimate") || plan.includes("gold")) {
|
|
114
|
+
return "ultimate";
|
|
115
115
|
}
|
|
116
|
-
else if (plan.includes(
|
|
117
|
-
return
|
|
116
|
+
else if (plan.includes("premium") || plan.includes("silver")) {
|
|
117
|
+
return "premium";
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -131,56 +131,56 @@ class GitLabVersionDetector {
|
|
|
131
131
|
const group = response.group;
|
|
132
132
|
if (group?.epicsEnabled) {
|
|
133
133
|
const hasIterations = (group.iterationsEnabled?.nodes?.length ?? 0) > 0;
|
|
134
|
-
const hasAdvancedWorkItems = group.workItemTypesEnabled?.nodes?.some(
|
|
134
|
+
const hasAdvancedWorkItems = group.workItemTypesEnabled?.nodes?.some(type => ["OBJECTIVE", "KEY_RESULT", "REQUIREMENT"].includes(type.name)) ?? false;
|
|
135
135
|
if (hasAdvancedWorkItems) {
|
|
136
|
-
return
|
|
136
|
+
return "ultimate";
|
|
137
137
|
}
|
|
138
138
|
else if (hasIterations) {
|
|
139
|
-
return
|
|
139
|
+
return "premium";
|
|
140
140
|
}
|
|
141
141
|
else {
|
|
142
|
-
return
|
|
142
|
+
return "premium";
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
catch (error) {
|
|
147
147
|
logger_1.logger.debug(`Feature detection failed, assuming free tier: ${error instanceof Error ? error.message : String(error)}`);
|
|
148
148
|
}
|
|
149
|
-
return
|
|
149
|
+
return "free";
|
|
150
150
|
}
|
|
151
151
|
determineFeatures(version, tier) {
|
|
152
152
|
const versionNumber = this.parseVersion(version);
|
|
153
153
|
const features = {
|
|
154
154
|
workItems: versionNumber >= 15.0,
|
|
155
|
-
epics: tier !==
|
|
156
|
-
iterations: tier !==
|
|
157
|
-
roadmaps: tier !==
|
|
158
|
-
portfolioManagement: tier ===
|
|
159
|
-
advancedSearch: tier !==
|
|
160
|
-
codeReview: tier !==
|
|
161
|
-
securityDashboard: tier ===
|
|
162
|
-
complianceFramework: tier ===
|
|
163
|
-
valueStreamAnalytics: tier !==
|
|
164
|
-
customFields: tier ===
|
|
165
|
-
okrs: tier ===
|
|
166
|
-
healthStatus: tier ===
|
|
167
|
-
weight: tier !==
|
|
168
|
-
multiLevelEpics: tier ===
|
|
169
|
-
serviceDesk: tier !==
|
|
170
|
-
requirements: tier ===
|
|
171
|
-
qualityManagement: tier ===
|
|
172
|
-
timeTracking: tier !==
|
|
173
|
-
crmContacts: tier ===
|
|
174
|
-
vulnerabilities: tier ===
|
|
175
|
-
errorTracking: tier ===
|
|
176
|
-
designManagement: tier !==
|
|
177
|
-
linkedResources: tier !==
|
|
178
|
-
emailParticipants: tier !==
|
|
155
|
+
epics: tier !== "free" && versionNumber >= 10.2,
|
|
156
|
+
iterations: tier !== "free" && versionNumber >= 13.1,
|
|
157
|
+
roadmaps: tier !== "free" && versionNumber >= 10.8,
|
|
158
|
+
portfolioManagement: tier === "ultimate" && versionNumber >= 12.0,
|
|
159
|
+
advancedSearch: tier !== "free" && versionNumber >= 11.0,
|
|
160
|
+
codeReview: tier !== "free" && versionNumber >= 11.0,
|
|
161
|
+
securityDashboard: tier === "ultimate" && versionNumber >= 11.1,
|
|
162
|
+
complianceFramework: tier === "ultimate" && versionNumber >= 13.0,
|
|
163
|
+
valueStreamAnalytics: tier !== "free" && versionNumber >= 12.3,
|
|
164
|
+
customFields: tier === "ultimate" && versionNumber >= 17.0,
|
|
165
|
+
okrs: tier === "ultimate" && versionNumber >= 15.7,
|
|
166
|
+
healthStatus: tier === "ultimate" && versionNumber >= 13.1,
|
|
167
|
+
weight: tier !== "free" && versionNumber >= 12.0,
|
|
168
|
+
multiLevelEpics: tier === "ultimate" && versionNumber >= 11.7,
|
|
169
|
+
serviceDesk: tier !== "free" && versionNumber >= 9.1,
|
|
170
|
+
requirements: tier === "ultimate" && versionNumber >= 13.1,
|
|
171
|
+
qualityManagement: tier === "ultimate" && versionNumber >= 13.0,
|
|
172
|
+
timeTracking: tier !== "free" && versionNumber >= 8.14,
|
|
173
|
+
crmContacts: tier === "ultimate" && versionNumber >= 14.0,
|
|
174
|
+
vulnerabilities: tier === "ultimate" && versionNumber >= 12.5,
|
|
175
|
+
errorTracking: tier === "ultimate" && versionNumber >= 12.7,
|
|
176
|
+
designManagement: tier !== "free" && versionNumber >= 12.2,
|
|
177
|
+
linkedResources: tier !== "free" && versionNumber >= 16.5,
|
|
178
|
+
emailParticipants: tier !== "free" && versionNumber >= 16.0,
|
|
179
179
|
};
|
|
180
180
|
return features;
|
|
181
181
|
}
|
|
182
182
|
parseVersion(version) {
|
|
183
|
-
if (!version || version ===
|
|
183
|
+
if (!version || version === "unknown")
|
|
184
184
|
return 0;
|
|
185
185
|
const match = version.match(/^(\d+)\.(\d+)/);
|
|
186
186
|
if (!match)
|
|
@@ -195,19 +195,19 @@ class GitLabVersionDetector {
|
|
|
195
195
|
}
|
|
196
196
|
isFeatureAvailable(feature) {
|
|
197
197
|
if (!this.cachedInfo) {
|
|
198
|
-
throw new Error(
|
|
198
|
+
throw new Error("Instance info not detected yet. Call detectInstance() first.");
|
|
199
199
|
}
|
|
200
200
|
return this.cachedInfo.features[feature];
|
|
201
201
|
}
|
|
202
202
|
getTier() {
|
|
203
203
|
if (!this.cachedInfo) {
|
|
204
|
-
throw new Error(
|
|
204
|
+
throw new Error("Instance info not detected yet. Call detectInstance() first.");
|
|
205
205
|
}
|
|
206
206
|
return this.cachedInfo.tier;
|
|
207
207
|
}
|
|
208
208
|
getVersion() {
|
|
209
209
|
if (!this.cachedInfo) {
|
|
210
|
-
throw new Error(
|
|
210
|
+
throw new Error("Instance info not detected yet. Call detectInstance() first.");
|
|
211
211
|
}
|
|
212
212
|
return this.cachedInfo.version;
|
|
213
213
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitLabVersionDetector.js","sourceRoot":"","sources":["../../src/services/GitLabVersionDetector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GitLabVersionDetector.js","sourceRoot":"","sources":["../../src/services/GitLabVersionDetector.ts"],"names":[],"mappings":"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"}
|