@web-marketing-hr/azure-devops-mcp 2.3.5
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/LICENSE.md +21 -0
- package/README.md +238 -0
- package/dist/auth.js +117 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.js +35 -0
- package/dist/logger.js.map +1 -0
- package/dist/org-tenants.js +79 -0
- package/dist/org-tenants.js.map +1 -0
- package/dist/prompts.js +21 -0
- package/dist/prompts.js.map +1 -0
- package/dist/shared/domains.js +126 -0
- package/dist/shared/domains.js.map +1 -0
- package/dist/shared/tool-validation.js +93 -0
- package/dist/shared/tool-validation.js.map +1 -0
- package/dist/tools/advanced-security.js +109 -0
- package/dist/tools/advanced-security.js.map +1 -0
- package/dist/tools/auth.js +64 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/core.js +96 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/pipelines.js +322 -0
- package/dist/tools/pipelines.js.map +1 -0
- package/dist/tools/repositories.js +938 -0
- package/dist/tools/repositories.js.map +1 -0
- package/dist/tools/search.js +211 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/test-plans.js +387 -0
- package/dist/tools/test-plans.js.map +1 -0
- package/dist/tools/wiki.js +390 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/tools/work-items.js +1007 -0
- package/dist/tools/work-items.js.map +1 -0
- package/dist/tools/work.js +299 -0
- package/dist/tools/work.js.map +1 -0
- package/dist/tools.js +30 -0
- package/dist/tools.js.map +1 -0
- package/dist/useragent.js +21 -0
- package/dist/useragent.js.map +1 -0
- package/dist/utils.js +94 -0
- package/dist/utils.js.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { apiVersion } from "../utils.js";
|
|
5
|
+
const WIKI_TOOLS = {
|
|
6
|
+
list_wikis: "wiki_list_wikis",
|
|
7
|
+
get_wiki: "wiki_get_wiki",
|
|
8
|
+
list_wiki_pages: "wiki_list_pages",
|
|
9
|
+
get_wiki_page: "wiki_get_page",
|
|
10
|
+
get_wiki_page_content: "wiki_get_page_content",
|
|
11
|
+
create_or_update_page: "wiki_create_or_update_page",
|
|
12
|
+
};
|
|
13
|
+
function configureWikiTools(server, tokenProvider, connectionProvider, userAgentProvider) {
|
|
14
|
+
server.tool(WIKI_TOOLS.get_wiki, "Get the wiki by wikiIdentifier", {
|
|
15
|
+
wikiIdentifier: z.string().describe("The unique identifier of the wiki."),
|
|
16
|
+
project: z.string().optional().describe("The project name or ID where the wiki is located. If not provided, the default project will be used."),
|
|
17
|
+
}, async ({ wikiIdentifier, project }) => {
|
|
18
|
+
try {
|
|
19
|
+
const connection = await connectionProvider();
|
|
20
|
+
const wikiApi = await connection.getWikiApi();
|
|
21
|
+
const wiki = await wikiApi.getWiki(wikiIdentifier, project);
|
|
22
|
+
if (!wiki) {
|
|
23
|
+
return { content: [{ type: "text", text: "No wiki found" }], isError: true };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(wiki, null, 2) }],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: `Error fetching wiki: ${errorMessage}` }],
|
|
33
|
+
isError: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.tool(WIKI_TOOLS.list_wikis, "Retrieve a list of wikis for an organization or project.", {
|
|
38
|
+
project: z.string().optional().describe("The project name or ID to filter wikis. If not provided, all wikis in the organization will be returned."),
|
|
39
|
+
}, async ({ project }) => {
|
|
40
|
+
try {
|
|
41
|
+
const connection = await connectionProvider();
|
|
42
|
+
const wikiApi = await connection.getWikiApi();
|
|
43
|
+
const wikis = await wikiApi.getAllWikis(project);
|
|
44
|
+
if (!wikis) {
|
|
45
|
+
return { content: [{ type: "text", text: "No wikis found" }], isError: true };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: "text", text: JSON.stringify(wikis, null, 2) }],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
53
|
+
return {
|
|
54
|
+
content: [{ type: "text", text: `Error fetching wikis: ${errorMessage}` }],
|
|
55
|
+
isError: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
server.tool(WIKI_TOOLS.list_wiki_pages, "Retrieve a list of wiki pages for a specific wiki and project.", {
|
|
60
|
+
wikiIdentifier: z.string().describe("The unique identifier of the wiki."),
|
|
61
|
+
project: z.string().describe("The project name or ID where the wiki is located."),
|
|
62
|
+
top: z.number().default(20).describe("The maximum number of pages to return. Defaults to 20."),
|
|
63
|
+
continuationToken: z.string().optional().describe("Token for pagination to retrieve the next set of pages."),
|
|
64
|
+
pageViewsForDays: z.number().optional().describe("Number of days to retrieve page views for. If not specified, page views are not included."),
|
|
65
|
+
}, async ({ wikiIdentifier, project, top = 20, continuationToken, pageViewsForDays }) => {
|
|
66
|
+
try {
|
|
67
|
+
const connection = await connectionProvider();
|
|
68
|
+
const wikiApi = await connection.getWikiApi();
|
|
69
|
+
const pagesBatchRequest = {
|
|
70
|
+
top,
|
|
71
|
+
continuationToken,
|
|
72
|
+
pageViewsForDays,
|
|
73
|
+
};
|
|
74
|
+
const pages = await wikiApi.getPagesBatch(pagesBatchRequest, project, wikiIdentifier);
|
|
75
|
+
if (!pages) {
|
|
76
|
+
return { content: [{ type: "text", text: "No wiki pages found" }], isError: true };
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: "text", text: JSON.stringify(pages, null, 2) }],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: `Error fetching wiki pages: ${errorMessage}` }],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.tool(WIKI_TOOLS.get_wiki_page, "Retrieve wiki page metadata by path. This tool does not return page content.", {
|
|
91
|
+
wikiIdentifier: z.string().describe("The unique identifier of the wiki."),
|
|
92
|
+
project: z.string().describe("The project name or ID where the wiki is located."),
|
|
93
|
+
path: z.string().describe("The path of the wiki page (e.g., '/Home' or '/Documentation/Setup')."),
|
|
94
|
+
recursionLevel: z
|
|
95
|
+
.enum(["None", "OneLevel", "OneLevelPlusNestedEmptyFolders", "Full"])
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Recursion level for subpages. 'None' returns only the specified page. 'OneLevel' includes direct children. 'Full' includes all descendants."),
|
|
98
|
+
}, async ({ wikiIdentifier, project, path, recursionLevel }) => {
|
|
99
|
+
try {
|
|
100
|
+
const connection = await connectionProvider();
|
|
101
|
+
const accessToken = await tokenProvider();
|
|
102
|
+
// Normalize the path
|
|
103
|
+
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
|
|
104
|
+
//const encodedPath = encodeURIComponent(normalizedPath);
|
|
105
|
+
// Build the URL for the wiki page API
|
|
106
|
+
const baseUrl = connection.serverUrl.replace(/\/$/, "");
|
|
107
|
+
const params = new URLSearchParams({
|
|
108
|
+
"path": normalizedPath,
|
|
109
|
+
"api-version": apiVersion,
|
|
110
|
+
});
|
|
111
|
+
if (recursionLevel) {
|
|
112
|
+
params.append("recursionLevel", recursionLevel);
|
|
113
|
+
}
|
|
114
|
+
const url = `${baseUrl}/${project}/_apis/wiki/wikis/${wikiIdentifier}/pages?${params.toString()}`;
|
|
115
|
+
const isBasicAuth = process.env["ADO_MCP_AUTH_TYPE"] == "basic";
|
|
116
|
+
const authHeader = isBasicAuth ? `Basic ${Buffer.from(":" + accessToken).toString("base64")}` : `Bearer ${accessToken}`;
|
|
117
|
+
const response = await fetch(url, {
|
|
118
|
+
headers: {
|
|
119
|
+
"Authorization": authHeader,
|
|
120
|
+
"User-Agent": userAgentProvider(),
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const errorText = await response.text();
|
|
125
|
+
throw new Error(`Failed to get wiki page (${response.status}): ${errorText}`);
|
|
126
|
+
}
|
|
127
|
+
const pageData = await response.json();
|
|
128
|
+
return {
|
|
129
|
+
content: [{ type: "text", text: JSON.stringify(pageData, null, 2) }],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
134
|
+
return {
|
|
135
|
+
content: [{ type: "text", text: `Error fetching wiki page metadata: ${errorMessage}` }],
|
|
136
|
+
isError: true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
server.tool(WIKI_TOOLS.get_wiki_page_content, "Retrieve wiki page content. Provide either a 'url' parameter OR the combination of 'wikiIdentifier' and 'project' parameters.", {
|
|
141
|
+
url: z
|
|
142
|
+
.string()
|
|
143
|
+
.optional()
|
|
144
|
+
.describe("The full URL of the wiki page to retrieve content for. If provided, wikiIdentifier, project, and path are ignored. Supported patterns: https://dev.azure.com/{org}/{project}/_wiki/wikis/{wikiIdentifier}?pagePath=%2FMy%20Page and https://dev.azure.com/{org}/{project}/_wiki/wikis/{wikiIdentifier}/{pageId}/Page-Title"),
|
|
145
|
+
wikiIdentifier: z.string().optional().describe("The unique identifier of the wiki. Required if url is not provided."),
|
|
146
|
+
project: z.string().optional().describe("The project name or ID where the wiki is located. Required if url is not provided."),
|
|
147
|
+
path: z.string().optional().describe("The path of the wiki page to retrieve content for. Optional, defaults to root page if not provided."),
|
|
148
|
+
}, async ({ url, wikiIdentifier, project, path }) => {
|
|
149
|
+
try {
|
|
150
|
+
const hasUrl = !!url;
|
|
151
|
+
const hasPair = !!wikiIdentifier && !!project;
|
|
152
|
+
if (hasUrl && hasPair) {
|
|
153
|
+
return { content: [{ type: "text", text: "Error fetching wiki page content: Provide either 'url' OR 'wikiIdentifier' with 'project', not both." }], isError: true };
|
|
154
|
+
}
|
|
155
|
+
if (!hasUrl && !hasPair) {
|
|
156
|
+
return { content: [{ type: "text", text: "Error fetching wiki page content: You must provide either 'url' OR both 'wikiIdentifier' and 'project'." }], isError: true };
|
|
157
|
+
}
|
|
158
|
+
const connection = await connectionProvider();
|
|
159
|
+
const wikiApi = await connection.getWikiApi();
|
|
160
|
+
let resolvedProject = project;
|
|
161
|
+
let resolvedWiki = wikiIdentifier;
|
|
162
|
+
let resolvedPath = path;
|
|
163
|
+
let pageContent;
|
|
164
|
+
if (url) {
|
|
165
|
+
const parsed = parseWikiUrl(url);
|
|
166
|
+
if ("error" in parsed) {
|
|
167
|
+
return { content: [{ type: "text", text: `Error fetching wiki page content: ${parsed.error}` }], isError: true };
|
|
168
|
+
}
|
|
169
|
+
resolvedProject = parsed.project;
|
|
170
|
+
resolvedWiki = parsed.wikiIdentifier;
|
|
171
|
+
if (parsed.pagePath) {
|
|
172
|
+
resolvedPath = parsed.pagePath;
|
|
173
|
+
}
|
|
174
|
+
if (parsed.pageId) {
|
|
175
|
+
try {
|
|
176
|
+
const accessToken = await tokenProvider();
|
|
177
|
+
const baseUrl = connection.serverUrl.replace(/\/$/, "");
|
|
178
|
+
const restUrl = `${baseUrl}/${resolvedProject}/_apis/wiki/wikis/${resolvedWiki}/pages/${parsed.pageId}?includeContent=true&api-version=7.1`;
|
|
179
|
+
const isBasicAuth = process.env["ADO_MCP_AUTH_TYPE"] == "basic";
|
|
180
|
+
const authHeader = isBasicAuth ? `Basic ${Buffer.from(":" + accessToken).toString("base64")}` : `Bearer ${accessToken}`;
|
|
181
|
+
const resp = await fetch(restUrl, {
|
|
182
|
+
headers: {
|
|
183
|
+
"Authorization": authHeader,
|
|
184
|
+
"User-Agent": userAgentProvider(),
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
if (resp.ok) {
|
|
188
|
+
const json = await resp.json();
|
|
189
|
+
if (json && typeof json.content === "string") {
|
|
190
|
+
pageContent = json.content;
|
|
191
|
+
}
|
|
192
|
+
else if (json && json.path) {
|
|
193
|
+
resolvedPath = json.path;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (resp.status === 404) {
|
|
197
|
+
return { content: [{ type: "text", text: `Error fetching wiki page content: Page with id ${parsed.pageId} not found` }], isError: true };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch { }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (!pageContent) {
|
|
204
|
+
if (!resolvedPath) {
|
|
205
|
+
resolvedPath = "/";
|
|
206
|
+
}
|
|
207
|
+
if (!resolvedProject || !resolvedWiki) {
|
|
208
|
+
return { content: [{ type: "text", text: "Project and wikiIdentifier must be defined to fetch wiki page content." }], isError: true };
|
|
209
|
+
}
|
|
210
|
+
const stream = await wikiApi.getPageText(resolvedProject, resolvedWiki, resolvedPath, undefined, undefined, true);
|
|
211
|
+
if (!stream) {
|
|
212
|
+
return { content: [{ type: "text", text: "No wiki page content found" }], isError: true };
|
|
213
|
+
}
|
|
214
|
+
pageContent = await streamToString(stream);
|
|
215
|
+
}
|
|
216
|
+
return { content: [{ type: "text", text: JSON.stringify(pageContent, null, 2) }] };
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
220
|
+
return {
|
|
221
|
+
content: [{ type: "text", text: `Error fetching wiki page content: ${errorMessage}` }],
|
|
222
|
+
isError: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
server.tool(WIKI_TOOLS.create_or_update_page, "Create or update a wiki page with content.", {
|
|
227
|
+
wikiIdentifier: z.string().describe("The unique identifier or name of the wiki."),
|
|
228
|
+
path: z.string().describe("The path of the wiki page (e.g., '/Home' or '/Documentation/Setup')."),
|
|
229
|
+
content: z.string().describe("The content of the wiki page in markdown format."),
|
|
230
|
+
project: z.string().optional().describe("The project name or ID where the wiki is located. If not provided, the default project will be used."),
|
|
231
|
+
etag: z.string().optional().describe("ETag for editing existing pages (optional, will be fetched if not provided)."),
|
|
232
|
+
branch: z.string().default("wikiMaster").describe("The branch name for the wiki repository. Defaults to 'wikiMaster' which is the default branch for Azure DevOps wikis."),
|
|
233
|
+
}, async ({ wikiIdentifier, path, content, project, etag, branch = "wikiMaster" }) => {
|
|
234
|
+
try {
|
|
235
|
+
const connection = await connectionProvider();
|
|
236
|
+
const accessToken = await tokenProvider();
|
|
237
|
+
// Normalize the path
|
|
238
|
+
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
|
|
239
|
+
const encodedPath = encodeURIComponent(normalizedPath);
|
|
240
|
+
// Build the URL for the wiki page API with version descriptor
|
|
241
|
+
const baseUrl = connection.serverUrl;
|
|
242
|
+
const projectParam = project || "";
|
|
243
|
+
const url = `${baseUrl}/${projectParam}/_apis/wiki/wikis/${wikiIdentifier}/pages?path=${encodedPath}&versionDescriptor.versionType=branch&versionDescriptor.version=${encodeURIComponent(branch)}&api-version=7.1`;
|
|
244
|
+
const isBasicAuth = process.env["ADO_MCP_AUTH_TYPE"] == "basic";
|
|
245
|
+
const authHeader = isBasicAuth ? `Basic ${Buffer.from(":" + accessToken).toString("base64")}` : `Bearer ${accessToken}`;
|
|
246
|
+
// First, try to create a new page (PUT without ETag)
|
|
247
|
+
try {
|
|
248
|
+
const createResponse = await fetch(url, {
|
|
249
|
+
method: "PUT",
|
|
250
|
+
headers: {
|
|
251
|
+
"Authorization": authHeader,
|
|
252
|
+
"Content-Type": "application/json",
|
|
253
|
+
"User-Agent": userAgentProvider(),
|
|
254
|
+
},
|
|
255
|
+
body: JSON.stringify({ content: content }),
|
|
256
|
+
});
|
|
257
|
+
if (createResponse.ok) {
|
|
258
|
+
const result = await createResponse.json();
|
|
259
|
+
return {
|
|
260
|
+
content: [
|
|
261
|
+
{
|
|
262
|
+
type: "text",
|
|
263
|
+
text: `Successfully created wiki page at path: ${normalizedPath}. Response: ${JSON.stringify(result, null, 2)}`,
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// If creation failed with 409 (Conflict) or 500 (Page exists), try to update it
|
|
269
|
+
if (createResponse.status === 409 || createResponse.status === 500) {
|
|
270
|
+
// Page exists, we need to get the ETag and update it
|
|
271
|
+
let currentEtag = etag;
|
|
272
|
+
if (!currentEtag) {
|
|
273
|
+
// Fetch current page to get ETag
|
|
274
|
+
const getResponse = await fetch(url, {
|
|
275
|
+
method: "GET",
|
|
276
|
+
headers: {
|
|
277
|
+
"Authorization": authHeader,
|
|
278
|
+
"User-Agent": userAgentProvider(),
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
if (getResponse.ok) {
|
|
282
|
+
currentEtag = getResponse.headers.get("etag") || getResponse.headers.get("ETag") || undefined;
|
|
283
|
+
if (!currentEtag) {
|
|
284
|
+
const pageData = await getResponse.json();
|
|
285
|
+
currentEtag = pageData.eTag;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (!currentEtag) {
|
|
289
|
+
throw new Error("Could not retrieve ETag for existing page");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Now update the existing page with ETag
|
|
293
|
+
const updateResponse = await fetch(url, {
|
|
294
|
+
method: "PUT",
|
|
295
|
+
headers: {
|
|
296
|
+
"Authorization": authHeader,
|
|
297
|
+
"Content-Type": "application/json",
|
|
298
|
+
"User-Agent": userAgentProvider(),
|
|
299
|
+
"If-Match": currentEtag,
|
|
300
|
+
},
|
|
301
|
+
body: JSON.stringify({ content: content }),
|
|
302
|
+
});
|
|
303
|
+
if (updateResponse.ok) {
|
|
304
|
+
const result = await updateResponse.json();
|
|
305
|
+
return {
|
|
306
|
+
content: [
|
|
307
|
+
{
|
|
308
|
+
type: "text",
|
|
309
|
+
text: `Successfully updated wiki page at path: ${normalizedPath}. Response: ${JSON.stringify(result, null, 2)}`,
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const errorText = await updateResponse.text();
|
|
316
|
+
throw new Error(`Failed to update page (${updateResponse.status}): ${errorText}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const errorText = await createResponse.text();
|
|
321
|
+
throw new Error(`Failed to create page (${createResponse.status}): ${errorText}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (fetchError) {
|
|
325
|
+
throw fetchError;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
330
|
+
return {
|
|
331
|
+
content: [{ type: "text", text: `Error creating/updating wiki page: ${errorMessage}` }],
|
|
332
|
+
isError: true,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
function streamToString(stream) {
|
|
338
|
+
return new Promise((resolve, reject) => {
|
|
339
|
+
let data = "";
|
|
340
|
+
stream.setEncoding("utf8");
|
|
341
|
+
stream.on("data", (chunk) => (data += chunk));
|
|
342
|
+
stream.on("end", () => resolve(data));
|
|
343
|
+
stream.on("error", reject);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// Helper to parse Azure DevOps wiki page URLs.
|
|
347
|
+
// Supported examples:
|
|
348
|
+
// - https://dev.azure.com/org/project/_wiki/wikis/wikiIdentifier?wikiVersion=GBmain&pagePath=%2FHome
|
|
349
|
+
// - https://dev.azure.com/org/project/_wiki/wikis/wikiIdentifier/123/Title-Of-Page
|
|
350
|
+
// Returns either a structured object OR an error message inside { error }.
|
|
351
|
+
function parseWikiUrl(url) {
|
|
352
|
+
try {
|
|
353
|
+
const u = new URL(url);
|
|
354
|
+
// Path segments after host
|
|
355
|
+
// Expect pattern: /{project}/_wiki/wikis/{wikiIdentifier}[/{pageId}/...]
|
|
356
|
+
const segments = u.pathname.split("/").filter(Boolean); // remove empty
|
|
357
|
+
const idx = segments.findIndex((s) => s === "_wiki");
|
|
358
|
+
if (idx < 1 || segments[idx + 1] !== "wikis") {
|
|
359
|
+
return { error: "URL does not match expected wiki pattern (missing /_wiki/wikis/ segment)." };
|
|
360
|
+
}
|
|
361
|
+
const project = segments[idx - 1];
|
|
362
|
+
const wikiIdentifier = segments[idx + 2];
|
|
363
|
+
if (!project || !wikiIdentifier) {
|
|
364
|
+
return { error: "Could not extract project or wikiIdentifier from URL." };
|
|
365
|
+
}
|
|
366
|
+
// Query form with pagePath
|
|
367
|
+
const pagePathParam = u.searchParams.get("pagePath");
|
|
368
|
+
if (pagePathParam) {
|
|
369
|
+
let decoded = decodeURIComponent(pagePathParam);
|
|
370
|
+
if (!decoded.startsWith("/"))
|
|
371
|
+
decoded = "/" + decoded;
|
|
372
|
+
return { project, wikiIdentifier, pagePath: decoded };
|
|
373
|
+
}
|
|
374
|
+
// Path ID form: .../wikis/{wikiIdentifier}/{pageId}/...
|
|
375
|
+
const afterWiki = segments.slice(idx + 3); // elements after wikiIdentifier
|
|
376
|
+
if (afterWiki.length >= 1) {
|
|
377
|
+
const maybeId = parseInt(afterWiki[0], 10);
|
|
378
|
+
if (!isNaN(maybeId)) {
|
|
379
|
+
return { project, wikiIdentifier, pageId: maybeId };
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// If nothing else specified, treat as root page
|
|
383
|
+
return { project, wikiIdentifier, pagePath: "/" };
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return { error: "Invalid URL format." };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
export { WIKI_TOOLS, configureWikiTools };
|
|
390
|
+
//# sourceMappingURL=wiki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/tools/wiki.ts"],"names":[],"mappings":"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"}
|