@daghis/teamcity-mcp 1.10.6 → 1.10.7
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/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +7 -0
- package/dist/index.js +103 -13
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.10.7](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.6...teamcity-mcp-v1.10.7) (2025-10-06)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **teamcity:** serialize snapshot dependencies as xml ([#235](https://github.com/Daghis/teamcity-mcp/issues/235)) ([#236](https://github.com/Daghis/teamcity-mcp/issues/236)) ([9cec149](https://github.com/Daghis/teamcity-mcp/commit/9cec14934783f135b408211fefa41ba6a38391c8))
|
|
9
|
+
|
|
3
10
|
## [1.10.6](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.5...teamcity-mcp-v1.10.6) (2025-10-04)
|
|
4
11
|
|
|
5
12
|
|
package/dist/index.js
CHANGED
|
@@ -2321,6 +2321,12 @@ var JSON_HEADERS2 = {
|
|
|
2321
2321
|
Accept: "application/json"
|
|
2322
2322
|
}
|
|
2323
2323
|
};
|
|
2324
|
+
var XML_HEADERS = {
|
|
2325
|
+
headers: {
|
|
2326
|
+
"Content-Type": "application/xml",
|
|
2327
|
+
Accept: "application/json"
|
|
2328
|
+
}
|
|
2329
|
+
};
|
|
2324
2330
|
var JSON_GET_HEADERS2 = {
|
|
2325
2331
|
headers: {
|
|
2326
2332
|
Accept: "application/json"
|
|
@@ -2382,6 +2388,86 @@ var mergeRecords2 = (base, override) => {
|
|
|
2382
2388
|
}
|
|
2383
2389
|
return merged;
|
|
2384
2390
|
};
|
|
2391
|
+
var escapeXml = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
2392
|
+
var attributesToString = (attributes) => {
|
|
2393
|
+
const parts = Object.entries(attributes).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}="${escapeXml(value)}"`);
|
|
2394
|
+
return parts.length > 0 ? ` ${parts.join(" ")}` : "";
|
|
2395
|
+
};
|
|
2396
|
+
var propertiesToXml = (properties) => {
|
|
2397
|
+
if (!properties) {
|
|
2398
|
+
return void 0;
|
|
2399
|
+
}
|
|
2400
|
+
const entries = properties.property;
|
|
2401
|
+
const list = Array.isArray(entries) ? entries : entries != null ? [entries] : [];
|
|
2402
|
+
if (list.length === 0) {
|
|
2403
|
+
return void 0;
|
|
2404
|
+
}
|
|
2405
|
+
const nodes = list.filter((item) => item?.name).map((item) => {
|
|
2406
|
+
const name = item?.name ?? "";
|
|
2407
|
+
const value = item?.value != null ? String(item.value) : "";
|
|
2408
|
+
return `<property name="${escapeXml(name)}" value="${escapeXml(value)}"/>`;
|
|
2409
|
+
});
|
|
2410
|
+
if (nodes.length === 0) {
|
|
2411
|
+
return void 0;
|
|
2412
|
+
}
|
|
2413
|
+
return `<properties>${nodes.join("")}</properties>`;
|
|
2414
|
+
};
|
|
2415
|
+
var sourceBuildTypeToXml = (source) => {
|
|
2416
|
+
if (!source || typeof source !== "object") {
|
|
2417
|
+
return void 0;
|
|
2418
|
+
}
|
|
2419
|
+
const { id, name } = source;
|
|
2420
|
+
if (!id) {
|
|
2421
|
+
return void 0;
|
|
2422
|
+
}
|
|
2423
|
+
const attributes = {
|
|
2424
|
+
id,
|
|
2425
|
+
name
|
|
2426
|
+
};
|
|
2427
|
+
return `<source-buildType${attributesToString(attributes)}/>`;
|
|
2428
|
+
};
|
|
2429
|
+
var dependencyToXml = (dependencyType, payload) => {
|
|
2430
|
+
const root = dependencyType === "artifact" ? "artifact-dependency" : "snapshot-dependency";
|
|
2431
|
+
const normalizeTypeAttribute = (value) => {
|
|
2432
|
+
if (!value) {
|
|
2433
|
+
return void 0;
|
|
2434
|
+
}
|
|
2435
|
+
if (dependencyType === "snapshot" && value === "snapshotDependency") {
|
|
2436
|
+
return "snapshot_dependency";
|
|
2437
|
+
}
|
|
2438
|
+
if (dependencyType === "artifact" && value === "artifactDependency") {
|
|
2439
|
+
return "artifact_dependency";
|
|
2440
|
+
}
|
|
2441
|
+
return value;
|
|
2442
|
+
};
|
|
2443
|
+
const attributes = {
|
|
2444
|
+
id: typeof payload.id === "string" && payload.id.trim() !== "" ? payload.id : void 0,
|
|
2445
|
+
name: typeof payload.name === "string" && payload.name.trim() !== "" ? payload.name : void 0,
|
|
2446
|
+
type: typeof payload.type === "string" && payload.type.trim() !== "" ? normalizeTypeAttribute(payload.type) : void 0,
|
|
2447
|
+
disabled: typeof payload.disabled === "boolean" ? payload.disabled ? "true" : "false" : void 0,
|
|
2448
|
+
inherited: typeof payload.inherited === "boolean" ? payload.inherited ? "true" : "false" : void 0
|
|
2449
|
+
};
|
|
2450
|
+
const fragments = [];
|
|
2451
|
+
const sourceBuildTypeXml = sourceBuildTypeToXml(
|
|
2452
|
+
payload["source-buildType"]
|
|
2453
|
+
);
|
|
2454
|
+
if (sourceBuildTypeXml) {
|
|
2455
|
+
fragments.push(sourceBuildTypeXml);
|
|
2456
|
+
}
|
|
2457
|
+
const propertiesXml = propertiesToXml(payload.properties);
|
|
2458
|
+
if (propertiesXml) {
|
|
2459
|
+
fragments.push(propertiesXml);
|
|
2460
|
+
}
|
|
2461
|
+
return `<${root}${attributesToString(attributes)}>${fragments.join("")}</${root}>`;
|
|
2462
|
+
};
|
|
2463
|
+
var prepareArtifactRequest = (payload) => ({
|
|
2464
|
+
body: payload,
|
|
2465
|
+
headers: JSON_HEADERS2
|
|
2466
|
+
});
|
|
2467
|
+
var prepareSnapshotRequest = (payload) => ({
|
|
2468
|
+
body: dependencyToXml("snapshot", payload),
|
|
2469
|
+
headers: XML_HEADERS
|
|
2470
|
+
});
|
|
2385
2471
|
var BuildDependencyManager = class {
|
|
2386
2472
|
constructor(client) {
|
|
2387
2473
|
this.client = client;
|
|
@@ -2436,36 +2522,40 @@ var BuildDependencyManager = class {
|
|
|
2436
2522
|
}
|
|
2437
2523
|
async createDependency(dependencyType, buildTypeId, payload) {
|
|
2438
2524
|
if (dependencyType === "artifact") {
|
|
2525
|
+
const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
|
|
2439
2526
|
return this.client.modules.buildTypes.addArtifactDependencyToBuildType(
|
|
2440
2527
|
buildTypeId,
|
|
2441
2528
|
void 0,
|
|
2442
|
-
|
|
2443
|
-
|
|
2529
|
+
body2,
|
|
2530
|
+
headers2
|
|
2444
2531
|
);
|
|
2445
2532
|
}
|
|
2533
|
+
const { body, headers } = prepareSnapshotRequest(payload);
|
|
2446
2534
|
return this.client.modules.buildTypes.addSnapshotDependencyToBuildType(
|
|
2447
2535
|
buildTypeId,
|
|
2448
2536
|
void 0,
|
|
2449
|
-
|
|
2450
|
-
|
|
2537
|
+
body,
|
|
2538
|
+
headers
|
|
2451
2539
|
);
|
|
2452
2540
|
}
|
|
2453
2541
|
async replaceDependency(dependencyType, buildTypeId, dependencyId, payload) {
|
|
2454
2542
|
if (dependencyType === "artifact") {
|
|
2543
|
+
const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
|
|
2455
2544
|
return this.client.modules.buildTypes.replaceArtifactDependency(
|
|
2456
2545
|
buildTypeId,
|
|
2457
2546
|
dependencyId,
|
|
2458
2547
|
void 0,
|
|
2459
|
-
|
|
2460
|
-
|
|
2548
|
+
body2,
|
|
2549
|
+
headers2
|
|
2461
2550
|
);
|
|
2462
2551
|
}
|
|
2552
|
+
const { body, headers } = prepareSnapshotRequest(payload);
|
|
2463
2553
|
return this.client.modules.buildTypes.replaceSnapshotDependency(
|
|
2464
2554
|
buildTypeId,
|
|
2465
2555
|
dependencyId,
|
|
2466
2556
|
void 0,
|
|
2467
|
-
|
|
2468
|
-
|
|
2557
|
+
body,
|
|
2558
|
+
headers
|
|
2469
2559
|
);
|
|
2470
2560
|
}
|
|
2471
2561
|
async fetchDependency(dependencyType, buildTypeId, dependencyId) {
|
|
@@ -38706,13 +38796,13 @@ var DEV_TOOLS = [
|
|
|
38706
38796
|
buildRequest.properties = propertiesPayload;
|
|
38707
38797
|
}
|
|
38708
38798
|
const sendXmlFallback = async (error2) => {
|
|
38709
|
-
const
|
|
38710
|
-
const branchPart = branchName ? `<branchName>${
|
|
38711
|
-
const commentPart = commentText ? `<comment><text>${
|
|
38799
|
+
const escapeXml2 = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
38800
|
+
const branchPart = branchName ? `<branchName>${escapeXml2(branchName)}</branchName>` : "";
|
|
38801
|
+
const commentPart = commentText ? `<comment><text>${escapeXml2(commentText)}</text></comment>` : "";
|
|
38712
38802
|
const propertiesPart = propertiesPayload ? `<properties>${propertiesPayload.property.map(
|
|
38713
|
-
(prop) => `<property name="${
|
|
38803
|
+
(prop) => `<property name="${escapeXml2(prop.name)}" value="${escapeXml2(prop.value)}"/>`
|
|
38714
38804
|
).join("")}</properties>` : "";
|
|
38715
|
-
const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${
|
|
38805
|
+
const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${escapeXml2(
|
|
38716
38806
|
typed.buildTypeId
|
|
38717
38807
|
)}"/>${branchPart}${commentPart}${propertiesPart}</build>`;
|
|
38718
38808
|
const response = await adapter.http.post("/app/rest/buildQueue", xml, {
|