@daghis/teamcity-mcp 2.3.1 → 2.3.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.2](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.3.1...teamcity-mcp-v2.3.2) (2026-03-10)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * write snapshot dependency options as properties, not XML options ([#406](https://github.com/Daghis/teamcity-mcp/issues/406)) ([#419](https://github.com/Daghis/teamcity-mcp/issues/419)) ([e13fa2d](https://github.com/Daghis/teamcity-mcp/commit/e13fa2dd1be5c387efd9b4fc0e38cb5e15634be4))
9
+
3
10
  ## [2.3.1](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v2.3.0...teamcity-mcp-v2.3.1) (2026-03-10)
4
11
 
5
12
 
package/CLAUDE.md CHANGED
@@ -64,7 +64,7 @@ Type support includes: `password`, `text`, `checkbox`, `select` with spec format
64
64
 
65
65
  When Marc says he wants to "check-in with GitHub", run these steps:
66
66
 
67
- 1. Pull latest pulse stats (via project-pulse MCP, repo: `Daghis/teamcity-mcp`, npm: `@daghis/teamcity-mcp`)
67
+ 1. Snapshot pulse stats (via project-pulse MCP `snapshot_stats`, name: `teamcity-mcp`, repo: `Daghis/teamcity-mcp`, npm: `@daghis/teamcity-mcp`) — this records a data point for trend tracking
68
68
  2. Check new issues
69
69
  3. Check new PRs
70
70
  4. Check security alerts
package/dist/index.js CHANGED
@@ -1205,7 +1205,7 @@ function debug2(message, meta) {
1205
1205
  // package.json
1206
1206
  var package_default = {
1207
1207
  name: "@daghis/teamcity-mcp",
1208
- version: "2.3.1",
1208
+ version: "2.3.2",
1209
1209
  description: "Model Control Protocol server for TeamCity CI/CD integration with AI coding assistants",
1210
1210
  mcpName: "io.github.Daghis/teamcity",
1211
1211
  main: "dist/index.js",
@@ -2780,13 +2780,6 @@ var defaultTypeFor = (dependencyType) => {
2780
2780
  return void 0;
2781
2781
  }
2782
2782
  };
2783
- var SNAPSHOT_DEPENDENCY_OPTION_KEYS = /* @__PURE__ */ new Set([
2784
- "run-build-on-the-same-agent",
2785
- "sync-revisions",
2786
- "take-successful-builds-only",
2787
- "take-started-build-with-same-revisions",
2788
- "do-not-run-new-build-if-there-is-a-suitable-one"
2789
- ]);
2790
2783
  var toStringRecord2 = (input) => {
2791
2784
  if (!input) {
2792
2785
  return {};
@@ -2841,15 +2834,6 @@ var optionsToRecord = (options) => {
2841
2834
  }
2842
2835
  return map;
2843
2836
  };
2844
- var recordToOptions = (record) => {
2845
- const entries = Object.entries(record);
2846
- if (entries.length === 0) {
2847
- return void 0;
2848
- }
2849
- return {
2850
- option: entries.map(([name, value]) => ({ name, value }))
2851
- };
2852
- };
2853
2837
  var mergeRecords2 = (base, override) => {
2854
2838
  const merged = { ...base };
2855
2839
  for (const [key, value] of Object.entries(override)) {
@@ -2881,25 +2865,6 @@ var propertiesToXml2 = (properties) => {
2881
2865
  }
2882
2866
  return `<properties>${nodes.join("")}</properties>`;
2883
2867
  };
2884
- var optionsToXml = (options) => {
2885
- if (!options) {
2886
- return void 0;
2887
- }
2888
- const entries = options.option;
2889
- const list = Array.isArray(entries) ? entries : entries != null ? [entries] : [];
2890
- if (list.length === 0) {
2891
- return void 0;
2892
- }
2893
- const nodes = list.filter((item) => item?.name).map((item) => {
2894
- const name = item?.name ?? "";
2895
- const value = item?.value != null ? String(item.value) : "";
2896
- return `<option name="${escapeXml2(name)}" value="${escapeXml2(value)}"/>`;
2897
- });
2898
- if (nodes.length === 0) {
2899
- return void 0;
2900
- }
2901
- return `<options>${nodes.join("")}</options>`;
2902
- };
2903
2868
  var sourceBuildTypeToXml = (source) => {
2904
2869
  if (!source || typeof source !== "object") {
2905
2870
  return void 0;
@@ -2946,10 +2911,6 @@ var dependencyToXml = (dependencyType, payload) => {
2946
2911
  if (propertiesXml) {
2947
2912
  fragments.push(propertiesXml);
2948
2913
  }
2949
- const optionsXml = optionsToXml(payload.options);
2950
- if (optionsXml) {
2951
- fragments.push(optionsXml);
2952
- }
2953
2914
  return `<${root}${attributesToString2(attributes)}>${fragments.join("")}</${root}>`;
2954
2915
  };
2955
2916
  var prepareArtifactRequest = (payload) => ({
@@ -3076,42 +3037,19 @@ var BuildDependencyManager = class {
3076
3037
  }
3077
3038
  }
3078
3039
  buildPayload(dependencyType, existing, input) {
3079
- const existingSnapshot = existing;
3080
3040
  const baseProperties = propertiesToRecord2(existing?.properties);
3081
- const inputPropertyRecord = toStringRecord2(input.properties);
3082
- const inputExplicitOptions = toStringRecord2(input.options);
3083
- let optionOverrides = {};
3084
- let propertyOverrides = inputPropertyRecord;
3085
- let baseOptions = {};
3086
3041
  if (dependencyType === "snapshot") {
3087
- baseOptions = optionsToRecord(existingSnapshot?.options);
3088
- const knownOptionKeys = /* @__PURE__ */ new Set([
3089
- ...Object.keys(baseOptions),
3090
- ...Object.keys(inputExplicitOptions)
3091
- ]);
3092
- for (const key of SNAPSHOT_DEPENDENCY_OPTION_KEYS) {
3093
- knownOptionKeys.add(key);
3094
- }
3095
- const derivedOptionOverrides = { ...inputExplicitOptions };
3096
- const derivedPropertyOverrides = {};
3097
- for (const [key, value] of Object.entries(inputPropertyRecord)) {
3098
- if (knownOptionKeys.has(key)) {
3099
- derivedOptionOverrides[key] = value;
3100
- } else {
3101
- derivedPropertyOverrides[key] = value;
3102
- }
3103
- }
3104
- optionOverrides = derivedOptionOverrides;
3105
- propertyOverrides = derivedPropertyOverrides;
3106
- } else if (Object.keys(inputExplicitOptions).length > 0) {
3107
- optionOverrides = inputExplicitOptions;
3042
+ const existingOptions = optionsToRecord(
3043
+ existing?.options
3044
+ );
3045
+ Object.assign(baseProperties, existingOptions);
3108
3046
  }
3109
- const mergedProps = mergeRecords2(baseProperties, propertyOverrides);
3047
+ const inputOverrides = mergeRecords2(
3048
+ toStringRecord2(input.properties),
3049
+ toStringRecord2(input.options)
3050
+ );
3051
+ const mergedProps = mergeRecords2(baseProperties, inputOverrides);
3110
3052
  const properties = recordToProperties2(mergedProps);
3111
- let mergedOptions = {};
3112
- if (dependencyType === "snapshot") {
3113
- mergedOptions = mergeRecords2(baseOptions, optionOverrides);
3114
- }
3115
3053
  const resolvedType = input.type ?? existing?.type ?? defaultTypeFor(dependencyType);
3116
3054
  const payload = {
3117
3055
  ...existing ?? {},
@@ -3125,14 +3063,6 @@ var BuildDependencyManager = class {
3125
3063
  } else {
3126
3064
  delete payload.properties;
3127
3065
  }
3128
- if (dependencyType === "snapshot") {
3129
- const options = recordToOptions(mergedOptions);
3130
- if (options) {
3131
- payload.options = options;
3132
- } else {
3133
- delete payload.options;
3134
- }
3135
- }
3136
3066
  const dependsOn = input.dependsOn ?? existing?.["source-buildType"]?.id;
3137
3067
  if (dependsOn) {
3138
3068
  payload["source-buildType"] = { id: dependsOn };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daghis/teamcity-mcp",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "Model Control Protocol server for TeamCity CI/CD integration with AI coding assistants",
5
5
  "mcpName": "io.github.Daghis/teamcity",
6
6
  "main": "dist/index.js",
package/server.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "source": "github"
8
8
  },
9
9
  "websiteUrl": "https://github.com/Daghis/teamcity-mcp",
10
- "version": "2.3.1",
10
+ "version": "2.3.2",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "@daghis/teamcity-mcp",
16
- "version": "2.3.1",
16
+ "version": "2.3.2",
17
17
  "runtimeHint": "npx",
18
18
  "runtimeArguments": [
19
19
  {