ado-sync 0.1.41 → 0.1.43

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.
Files changed (45) hide show
  1. package/dist/ai/summarizer.d.ts +1 -1
  2. package/dist/ai/summarizer.js.map +1 -1
  3. package/dist/azure/test-cases.js +2 -0
  4. package/dist/azure/test-cases.js.map +1 -1
  5. package/dist/config.js +1 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/parsers/csharp.js +4 -2
  8. package/dist/parsers/csharp.js.map +1 -1
  9. package/dist/parsers/dart.js +1 -0
  10. package/dist/parsers/dart.js.map +1 -1
  11. package/dist/parsers/go.d.ts +18 -0
  12. package/dist/parsers/go.js +201 -0
  13. package/dist/parsers/go.js.map +1 -0
  14. package/dist/parsers/java.js +4 -2
  15. package/dist/parsers/java.js.map +1 -1
  16. package/dist/parsers/javascript.js +1 -0
  17. package/dist/parsers/javascript.js.map +1 -1
  18. package/dist/parsers/kotlin.d.ts +20 -0
  19. package/dist/parsers/kotlin.js +257 -0
  20. package/dist/parsers/kotlin.js.map +1 -0
  21. package/dist/parsers/php.d.ts +22 -0
  22. package/dist/parsers/php.js +205 -0
  23. package/dist/parsers/php.js.map +1 -0
  24. package/dist/parsers/python.js +4 -2
  25. package/dist/parsers/python.js.map +1 -1
  26. package/dist/parsers/robot.d.ts +22 -0
  27. package/dist/parsers/robot.js +230 -0
  28. package/dist/parsers/robot.js.map +1 -0
  29. package/dist/parsers/ruby.d.ts +20 -0
  30. package/dist/parsers/ruby.js +185 -0
  31. package/dist/parsers/ruby.js.map +1 -0
  32. package/dist/parsers/rust.d.ts +18 -0
  33. package/dist/parsers/rust.js +193 -0
  34. package/dist/parsers/rust.js.map +1 -0
  35. package/dist/parsers/testcafe.js +1 -0
  36. package/dist/parsers/testcafe.js.map +1 -1
  37. package/dist/sync/engine.js +75 -3
  38. package/dist/sync/engine.js.map +1 -1
  39. package/dist/sync/publish-results.js +403 -1
  40. package/dist/sync/publish-results.js.map +1 -1
  41. package/dist/sync/writeback.d.ts +27 -1
  42. package/dist/sync/writeback.js +177 -2
  43. package/dist/sync/writeback.js.map +1 -1
  44. package/dist/types.d.ts +13 -1
  45. package/package.json +1 -1
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Ruby RSpec parser for azure-test-sync.
4
+ *
5
+ * Detects it 'description' and it "description" blocks in *_spec.rb files.
6
+ *
7
+ * Source mapping:
8
+ * it 'title' → TC Title (with enclosing describe/context prefix)
9
+ * # Numbered lines in comment above → TC Steps
10
+ * # @{tagPrefix}:N above it → Azure TC ID
11
+ * # @tags: smoke, regression → TC Tags
12
+ * # @smoke (single-word) → TC Tag
13
+ * filePath::full description → automatedTestName
14
+ *
15
+ * ID writeback:
16
+ * Inserts / updates # @tc:12345 immediately above the it line.
17
+ *
18
+ * Path-based auto-tagging: directory segments starting with '@' become tags.
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.parseRubyFile = parseRubyFile;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ const shared_1 = require("./shared");
58
+ // ─── Test detection ───────────────────────────────────────────────────────────
59
+ // Matches: it 'title' or it "title" (with optional whitespace)
60
+ const IT_RE = /^\s*it\s+(['"])(.*?)\1/;
61
+ // Matches: describe/context/RSpec.describe blocks
62
+ const DESCRIBE_RE = /^\s*(?:RSpec\.)?(?:describe|context|feature)\s+(['"])(.*?)\1/;
63
+ function findEnclosingContexts(lines, itLineIdx) {
64
+ const itIndent = getIndent(lines[itLineIdx]);
65
+ const contexts = [];
66
+ for (let i = itLineIdx - 1; i >= 0; i--) {
67
+ const line = lines[i];
68
+ if (!line.trim())
69
+ continue;
70
+ const lineIndent = getIndent(line);
71
+ if (lineIndent >= itIndent)
72
+ continue;
73
+ const m = line.match(DESCRIBE_RE);
74
+ if (m) {
75
+ contexts.unshift({ description: m[2], indent: lineIndent });
76
+ }
77
+ }
78
+ return contexts.map((c) => c.description);
79
+ }
80
+ function getIndent(line) {
81
+ return (line.match(/^(\s*)/) ?? ['', ''])[1].length;
82
+ }
83
+ function extractCommentBlockAbove(lines, itLineIdx, tagPrefix) {
84
+ const docLines = [];
85
+ let azureId;
86
+ const tags = [];
87
+ const idRe = new RegExp(`#\\s*@${tagPrefix}:(\\d+)`);
88
+ const tagsRe = /^#\s*@tags:\s*(.+)/i;
89
+ const singleTagRe = /^#\s*@(\w+)\s*$/;
90
+ for (let i = itLineIdx - 1; i >= 0 && i >= itLineIdx - 30; i--) {
91
+ const trimmed = lines[i].trim();
92
+ if (trimmed === '')
93
+ break;
94
+ if (!trimmed.startsWith('#'))
95
+ break;
96
+ // Stop at enclosing block boundary keywords
97
+ if (/^\s*(?:describe|context|before|after|let|subject)\b/.test(lines[i]))
98
+ break;
99
+ const idMatch = trimmed.match(idRe);
100
+ if (idMatch) {
101
+ if (azureId === undefined)
102
+ azureId = parseInt(idMatch[1], 10);
103
+ continue;
104
+ }
105
+ const tagsMatch = trimmed.match(tagsRe);
106
+ if (tagsMatch) {
107
+ for (const t of tagsMatch[1].split(',').map((s) => s.trim()).filter(Boolean)) {
108
+ tags.push(t);
109
+ }
110
+ continue;
111
+ }
112
+ const singleTagMatch = trimmed.match(singleTagRe);
113
+ if (singleTagMatch && singleTagMatch[1] !== tagPrefix) {
114
+ tags.push(singleTagMatch[1]);
115
+ continue;
116
+ }
117
+ const content = trimmed.replace(/^#\s?/, '');
118
+ if (content)
119
+ docLines.unshift(content);
120
+ }
121
+ return { docLines, azureId, tags };
122
+ }
123
+ // ─── Title / steps from comment block ────────────────────────────────────────
124
+ const NUMBERED_STEP_RE = /^\d+\.\s+(.+)$/;
125
+ const CHECK_RE = /^[Cc]heck:\s+(.+)$/;
126
+ const META_RE = /^(?:test\s+case|user\s+story)[\s:]/i;
127
+ function parseSummary(docLines, itDescription, contexts) {
128
+ let titleFromDoc = '';
129
+ const steps = [];
130
+ for (const line of docLines) {
131
+ if (!line || META_RE.test(line))
132
+ continue;
133
+ const numMatch = NUMBERED_STEP_RE.exec(line);
134
+ if (numMatch) {
135
+ const content = numMatch[1].trim();
136
+ const checkMatch = CHECK_RE.exec(content);
137
+ if (checkMatch) {
138
+ steps.push({ keyword: 'Then', text: checkMatch[1].trim() });
139
+ }
140
+ else {
141
+ steps.push({ keyword: 'Step', text: content });
142
+ }
143
+ continue;
144
+ }
145
+ if (!titleFromDoc)
146
+ titleFromDoc = line;
147
+ }
148
+ const contextPrefix = contexts.length > 0 ? `${contexts.join(' ')} ` : '';
149
+ const title = titleFromDoc || `${contextPrefix}${itDescription}`.trim();
150
+ return { title, steps };
151
+ }
152
+ // ─── Public parser ────────────────────────────────────────────────────────────
153
+ function parseRubyFile(filePath, tagPrefix, linkConfigs) {
154
+ const source = fs.readFileSync(filePath, 'utf8');
155
+ const lines = source.split('\n');
156
+ const pathTags = (0, shared_1.extractPathTags)(filePath);
157
+ const results = [];
158
+ // Derive a relative path for automatedTestName
159
+ const relPath = path.relative(process.cwd(), filePath).replace(/\\/g, '/');
160
+ for (let i = 0; i < lines.length; i++) {
161
+ const m = lines[i].match(IT_RE);
162
+ if (!m)
163
+ continue;
164
+ const itDescription = m[2];
165
+ const { docLines, azureId, tags: commentTags } = extractCommentBlockAbove(lines, i, tagPrefix);
166
+ const contexts = findEnclosingContexts(lines, i);
167
+ const allTags = [...new Set([...pathTags, ...commentTags])];
168
+ const { title, steps } = parseSummary(docLines, itDescription, contexts);
169
+ const fullDescription = [...contexts, itDescription].join(' ');
170
+ const automatedTestName = `${relPath}::${fullDescription}`;
171
+ results.push({
172
+ filePath,
173
+ title,
174
+ steps,
175
+ tags: allTags,
176
+ azureId: azureId !== undefined && !isNaN(azureId) ? azureId : undefined,
177
+ line: i + 1,
178
+ linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
179
+ automatedTestName,
180
+ titleIsHeuristic: false,
181
+ });
182
+ }
183
+ return results;
184
+ }
185
+ //# sourceMappingURL=ruby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../src/parsers/ruby.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Rust testing parser for azure-test-sync.
3
+ *
4
+ * Detects #[test] attributed functions in Rust source files.
5
+ *
6
+ * Source mapping:
7
+ * /// or // doc comment above #[test] → TC Title + Steps
8
+ * // @{tagPrefix}:N above #[test] → Azure TC ID
9
+ * // @tags: smoke, regression → TC Tags
10
+ * module::function_name → automatedTestName
11
+ *
12
+ * ID writeback:
13
+ * Inserts / updates // @tc:12345 immediately above the #[test] line.
14
+ *
15
+ * Path-based auto-tagging: directory segments starting with '@' become tags.
16
+ */
17
+ import { LinkConfig, ParsedTest } from '../types';
18
+ export declare function parseRustFile(filePath: string, tagPrefix: string, linkConfigs?: LinkConfig[]): ParsedTest[];
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /**
3
+ * Rust testing parser for azure-test-sync.
4
+ *
5
+ * Detects #[test] attributed functions in Rust source files.
6
+ *
7
+ * Source mapping:
8
+ * /// or // doc comment above #[test] → TC Title + Steps
9
+ * // @{tagPrefix}:N above #[test] → Azure TC ID
10
+ * // @tags: smoke, regression → TC Tags
11
+ * module::function_name → automatedTestName
12
+ *
13
+ * ID writeback:
14
+ * Inserts / updates // @tc:12345 immediately above the #[test] line.
15
+ *
16
+ * Path-based auto-tagging: directory segments starting with '@' become tags.
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.parseRustFile = parseRustFile;
53
+ const fs = __importStar(require("fs"));
54
+ const shared_1 = require("./shared");
55
+ // ─── Test attribute detection ─────────────────────────────────────────────────
56
+ const TEST_ATTR_RE = /^\s*#\[(?:tokio::)?test(?:\(.*\))?\]\s*$/;
57
+ const FN_RE = /^\s*(?:pub\s+)?(?:async\s+)?fn\s+(\w+)\s*\(/;
58
+ // ─── Module path building ─────────────────────────────────────────────────────
59
+ function findModulePath(lines, testAttrLineIdx) {
60
+ const testIndent = (lines[testAttrLineIdx].match(/^(\s*)/) ?? ['', ''])[1].length;
61
+ const modules = [];
62
+ for (let i = testAttrLineIdx - 1; i >= 0; i--) {
63
+ const line = lines[i];
64
+ const lineIndent = (line.match(/^(\s*)/) ?? ['', ''])[1].length;
65
+ if (lineIndent >= testIndent)
66
+ continue;
67
+ const m = line.trim().match(/^(?:pub\s+)?mod\s+(\w+)\s*\{?/);
68
+ if (m) {
69
+ modules.unshift(m[1]);
70
+ }
71
+ }
72
+ return modules.join('::');
73
+ }
74
+ function extractCommentBlockAbove(lines, attrLineIdx, tagPrefix) {
75
+ const docLines = [];
76
+ let azureId;
77
+ const tags = [];
78
+ const idRe = new RegExp(`//\\s*@${tagPrefix}:(\\d+)`);
79
+ const tagsRe = /\/\/\s*@tags:\s*(.+)/i;
80
+ const singleTagRe = /\/\/\s*@(\w+)\s*$/;
81
+ const docRe = /^\/\/[\/!]?\s?(.*)$/; // matches //, ///, //!
82
+ for (let i = attrLineIdx - 1; i >= 0 && i >= attrLineIdx - 40; i--) {
83
+ const trimmed = lines[i].trim();
84
+ if (trimmed === '')
85
+ break;
86
+ // Must be a comment line
87
+ if (!trimmed.startsWith('//') && !trimmed.startsWith('#['))
88
+ break;
89
+ // Skip other attributes like #[ignore], #[should_panic]
90
+ if (trimmed.startsWith('#['))
91
+ continue;
92
+ const idMatch = trimmed.match(idRe);
93
+ if (idMatch) {
94
+ if (azureId === undefined)
95
+ azureId = parseInt(idMatch[1], 10);
96
+ continue;
97
+ }
98
+ const tagsMatch = trimmed.match(tagsRe);
99
+ if (tagsMatch) {
100
+ for (const t of tagsMatch[1].split(',').map((s) => s.trim()).filter(Boolean)) {
101
+ tags.push(t);
102
+ }
103
+ continue;
104
+ }
105
+ const singleTagMatch = trimmed.match(singleTagRe);
106
+ if (singleTagMatch && singleTagMatch[1] !== tagPrefix) {
107
+ tags.push(singleTagMatch[1]);
108
+ continue;
109
+ }
110
+ const docMatch = trimmed.match(docRe);
111
+ if (docMatch && docMatch[1] !== undefined) {
112
+ docLines.unshift(docMatch[1]);
113
+ }
114
+ }
115
+ return { docLines, azureId, tags };
116
+ }
117
+ // ─── Title / steps ────────────────────────────────────────────────────────────
118
+ const NUMBERED_STEP_RE = /^\d+\.\s+(.+)$/;
119
+ const CHECK_RE = /^[Cc]heck:\s+(.+)$/;
120
+ const META_RE = /^(?:test\s+case|user\s+story)[\s:]/i;
121
+ function parseSummary(docLines, fnName) {
122
+ let title = '';
123
+ const steps = [];
124
+ for (const line of docLines) {
125
+ if (!line || META_RE.test(line))
126
+ continue;
127
+ const numMatch = NUMBERED_STEP_RE.exec(line);
128
+ if (numMatch) {
129
+ const content = numMatch[1].trim();
130
+ const checkMatch = CHECK_RE.exec(content);
131
+ if (checkMatch) {
132
+ steps.push({ keyword: 'Then', text: checkMatch[1].trim() });
133
+ }
134
+ else {
135
+ steps.push({ keyword: 'Step', text: content });
136
+ }
137
+ continue;
138
+ }
139
+ if (!title)
140
+ title = line;
141
+ }
142
+ const titleIsHeuristic = !title;
143
+ if (!title) {
144
+ // it_works → It works
145
+ title = fnName.replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
146
+ }
147
+ return { title, steps, titleIsHeuristic };
148
+ }
149
+ // ─── Public parser ────────────────────────────────────────────────────────────
150
+ function parseRustFile(filePath, tagPrefix, linkConfigs) {
151
+ const source = fs.readFileSync(filePath, 'utf8');
152
+ const lines = source.split('\n');
153
+ const pathTags = (0, shared_1.extractPathTags)(filePath);
154
+ const results = [];
155
+ for (let i = 0; i < lines.length; i++) {
156
+ const trimmed = lines[i].trim();
157
+ if (!TEST_ATTR_RE.test(trimmed))
158
+ continue;
159
+ // Find the fn declaration (within the next 5 lines)
160
+ let fnName = '';
161
+ let fnLineIdx = -1;
162
+ for (let j = i + 1; j < lines.length && j <= i + 5; j++) {
163
+ const m = lines[j].trim().match(FN_RE);
164
+ if (m) {
165
+ fnName = m[1];
166
+ fnLineIdx = j;
167
+ break;
168
+ }
169
+ }
170
+ if (!fnName)
171
+ continue;
172
+ const modulePath = findModulePath(lines, i);
173
+ const { docLines, azureId, tags: commentTags } = extractCommentBlockAbove(lines, i, tagPrefix);
174
+ const allTags = [...new Set([...pathTags, ...commentTags])];
175
+ const { title, steps, titleIsHeuristic } = parseSummary(docLines, fnName);
176
+ const automatedTestName = modulePath ? `${modulePath}::${fnName}` : fnName;
177
+ results.push({
178
+ filePath,
179
+ title,
180
+ steps,
181
+ tags: allTags,
182
+ azureId: azureId !== undefined && !isNaN(azureId) ? azureId : undefined,
183
+ line: i + 1, // 1-based line of #[test]
184
+ linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
185
+ automatedTestName,
186
+ titleIsHeuristic,
187
+ });
188
+ // Skip to after fn declaration to avoid re-processing
189
+ i = fnLineIdx;
190
+ }
191
+ return results;
192
+ }
193
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../src/parsers/rust.ts"],"names":[],"mappings":"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"}
@@ -317,6 +317,7 @@ function parseTestCafeFile(filePath, tagPrefix, linkConfigs) {
317
317
  line: testLineIdx + 1, // 1-based; writeback starts from here
318
318
  linkRefs: (0, shared_1.extractLinkRefs)(allTags, linkConfigs),
319
319
  automatedTestName,
320
+ titleIsHeuristic: false,
320
321
  });
321
322
  }
322
323
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"testcafe.js","sourceRoot":"","sources":["../../src/parsers/testcafe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testcafe.js","sourceRoot":"","sources":["../../src/parsers/testcafe.ts"],"names":[],"mappings":"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"}
@@ -54,10 +54,16 @@ const csv_1 = require("../parsers/csv");
54
54
  const dart_1 = require("../parsers/dart");
55
55
  const excel_1 = require("../parsers/excel");
56
56
  const gherkin_1 = require("../parsers/gherkin");
57
+ const go_1 = require("../parsers/go");
57
58
  const java_1 = require("../parsers/java");
58
59
  const javascript_1 = require("../parsers/javascript");
60
+ const kotlin_1 = require("../parsers/kotlin");
59
61
  const markdown_1 = require("../parsers/markdown");
62
+ const php_1 = require("../parsers/php");
60
63
  const python_1 = require("../parsers/python");
64
+ const robot_1 = require("../parsers/robot");
65
+ const ruby_1 = require("../parsers/ruby");
66
+ const rust_1 = require("../parsers/rust");
61
67
  const swift_1 = require("../parsers/swift");
62
68
  const testcafe_1 = require("../parsers/testcafe");
63
69
  const cache_1 = require("./cache");
@@ -139,6 +145,24 @@ async function parseLocalFiles(filePaths, config, tagsFilter) {
139
145
  case 'flutter':
140
146
  tests = (0, dart_1.parseDartFile)(fp, tagPrefix, linkConfigs);
141
147
  break;
148
+ case 'robot':
149
+ tests = (0, robot_1.parseRobotFile)(fp, tagPrefix, linkConfigs);
150
+ break;
151
+ case 'go':
152
+ tests = (0, go_1.parseGoFile)(fp, tagPrefix, linkConfigs);
153
+ break;
154
+ case 'rspec':
155
+ tests = (0, ruby_1.parseRubyFile)(fp, tagPrefix, linkConfigs);
156
+ break;
157
+ case 'phpunit':
158
+ tests = (0, php_1.parsePhpFile)(fp, tagPrefix, linkConfigs);
159
+ break;
160
+ case 'rust':
161
+ tests = (0, rust_1.parseRustFile)(fp, tagPrefix, linkConfigs);
162
+ break;
163
+ case 'kotlin':
164
+ tests = (0, kotlin_1.parseKotlinFile)(fp, tagPrefix, linkConfigs);
165
+ break;
142
166
  default:
143
167
  tests = (0, markdown_1.parseMarkdownFile)(fp, tagPrefix, linkConfigs, attachmentsConfig);
144
168
  }
@@ -245,7 +269,8 @@ async function push(config, configDir, opts = {}) {
245
269
  aiDone++;
246
270
  opts.onAiProgress?.(aiDone, allTargets.length, test.title);
247
271
  if (needsSteps) {
248
- test.title = result.title;
272
+ if (test.titleIsHeuristic !== false)
273
+ test.title = result.title;
249
274
  test.steps = result.steps;
250
275
  }
251
276
  if (needsDescription && result.description)
@@ -290,7 +315,13 @@ async function pushSingle(config, configDir, opts) {
290
315
  aiDone++;
291
316
  opts.onAiProgress?.(aiDone, aiTargets.length, test.title);
292
317
  if (needsSteps) {
293
- test.title = result.title;
318
+ // Only replace the title when it was heuristically generated (e.g. from a
319
+ // method name transformation). If titleIsHeuristic is false the title came
320
+ // directly from the source file (it('…'), test('…'), etc.) and must not be
321
+ // overridden — that would produce a different title on every push and break
322
+ // the Azure ID match on subsequent runs.
323
+ if (test.titleIsHeuristic !== false)
324
+ test.title = result.title;
294
325
  test.steps = result.steps;
295
326
  }
296
327
  if (needsDescription && result.description) {
@@ -315,6 +346,33 @@ async function pushSingle(config, configDir, opts) {
315
346
  const pendingWritebacks = [];
316
347
  // Load local cache for conflict detection and skip optimisation
317
348
  const cache = (0, cache_1.loadCache)(configDir);
349
+ // ── automatedTestName fallback matching ───────────────────────────────────
350
+ // When markAutomated is true and a local test has no @tc:ID annotation, try
351
+ // to find its existing TC in Azure by AutomatedTestName. This recovers from
352
+ // situations where writeback files were not committed (e.g. first push was a
353
+ // dry-run, or the developer didn't stage the file changes). Without this,
354
+ // every unlinked test would be created as a new TC on each push, causing the
355
+ // plan to grow unboundedly while old TCs accumulate as ado-sync:removed.
356
+ const markAutomated = config.sync?.markAutomated ?? false;
357
+ const recoveredIds = new Set(); // "filePath:line" keys
358
+ let preloadedRemoteTcs;
359
+ const unlinkedWithAtName = tests.filter(t => !t.azureId && t.automatedTestName);
360
+ if (markAutomated && unlinkedWithAtName.length > 0) {
361
+ try {
362
+ preloadedRemoteTcs = await (0, test_cases_1.getTestCasesInSuite)(client, config);
363
+ const byAtName = new Map(preloadedRemoteTcs
364
+ .filter(tc => tc.automatedTestName)
365
+ .map(tc => [tc.automatedTestName, tc]));
366
+ for (const test of unlinkedWithAtName) {
367
+ const match = byAtName.get(test.automatedTestName);
368
+ if (match) {
369
+ test.azureId = match.id;
370
+ recoveredIds.add(`${test.filePath}:${test.line}`);
371
+ }
372
+ }
373
+ }
374
+ catch { /* best-effort: if pre-load fails, continue without matching */ }
375
+ }
318
376
  let done = 0;
319
377
  const reportProgress = (result) => {
320
378
  results.push(result);
@@ -455,6 +513,18 @@ async function pushSingle(config, configDir, opts) {
455
513
  }
456
514
  }
457
515
  }
516
+ // Write back recovered IDs (matched by automatedTestName above).
517
+ // These tests had their azureId set in the pre-pass but were not in pendingWritebacks
518
+ // (no new TC was created). Queue them so the source annotation is restored.
519
+ if (!opts.dryRun && !disableLocal && recoveredIds.size > 0) {
520
+ const alreadyQueued = new Set(pendingWritebacks.map((wb) => `${wb.test.filePath}:${wb.test.line}`));
521
+ for (const test of tests) {
522
+ const key = `${test.filePath}:${test.line}`;
523
+ if (test.azureId && recoveredIds.has(key) && !alreadyQueued.has(key)) {
524
+ pendingWritebacks.push({ test, newId: test.azureId });
525
+ }
526
+ }
527
+ }
458
528
  // Apply ID writebacks in descending line order per file so earlier insertions
459
529
  // don't shift line numbers for subsequent writebacks in the same file.
460
530
  if (!opts.dryRun && pendingWritebacks.length) {
@@ -475,7 +545,9 @@ async function pushSingle(config, configDir, opts) {
475
545
  // Removed TC detection: find suite TCs not referenced by any local test
476
546
  if (!opts.dryRun || true /* show removed in dry-run too */) {
477
547
  try {
478
- const remoteTcs = await (0, test_cases_1.getTestCasesInSuite)(client, config);
548
+ // Reuse the pre-loaded remote TCs if we already fetched them for automatedTestName
549
+ // matching, otherwise fetch now. This avoids a redundant round-trip.
550
+ const remoteTcs = preloadedRemoteTcs ?? await (0, test_cases_1.getTestCasesInSuite)(client, config);
479
551
  const localIds = new Set([
480
552
  ...tests.map((t) => t.azureId).filter(Boolean),
481
553
  ...createdIds,