@mcp-consultant-tools/azure-devops 30.0.0-beta.8 → 30.0.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.
Files changed (133) hide show
  1. package/build/azure-devops-client.d.ts.map +1 -1
  2. package/build/azure-devops-client.js +23 -3
  3. package/build/azure-devops-client.js.map +1 -1
  4. package/build/cli/commands/index.d.ts +1 -0
  5. package/build/cli/commands/index.d.ts.map +1 -1
  6. package/build/cli/commands/index.js +3 -0
  7. package/build/cli/commands/index.js.map +1 -1
  8. package/build/cli/commands/test-commands.d.ts +7 -0
  9. package/build/cli/commands/test-commands.d.ts.map +1 -0
  10. package/build/cli/commands/test-commands.js +131 -0
  11. package/build/cli/commands/test-commands.js.map +1 -0
  12. package/build/cli/commands/work-item-commands.d.ts.map +1 -1
  13. package/build/cli/commands/work-item-commands.js +34 -0
  14. package/build/cli/commands/work-item-commands.js.map +1 -1
  15. package/build/cli.js +3 -3
  16. package/build/cli.js.map +1 -1
  17. package/build/context-factory.d.ts.map +1 -1
  18. package/build/context-factory.js +3 -1
  19. package/build/context-factory.js.map +1 -1
  20. package/build/index.js +2 -1
  21. package/build/index.js.map +1 -1
  22. package/build/schemas.d.ts +13 -0
  23. package/build/schemas.d.ts.map +1 -0
  24. package/build/schemas.js +47 -0
  25. package/build/schemas.js.map +1 -0
  26. package/build/services/checklist-service.d.ts.map +1 -1
  27. package/build/services/checklist-service.js +3 -0
  28. package/build/services/checklist-service.js.map +1 -1
  29. package/build/services/index.d.ts +1 -0
  30. package/build/services/index.d.ts.map +1 -1
  31. package/build/services/index.js +1 -0
  32. package/build/services/index.js.map +1 -1
  33. package/build/services/sync-service.d.ts.map +1 -1
  34. package/build/services/sync-service.js +75 -14
  35. package/build/services/sync-service.js.map +1 -1
  36. package/build/services/test-service.d.ts +106 -0
  37. package/build/services/test-service.d.ts.map +1 -0
  38. package/build/services/test-service.js +245 -0
  39. package/build/services/test-service.js.map +1 -0
  40. package/build/services/work-item-service.d.ts +25 -0
  41. package/build/services/work-item-service.d.ts.map +1 -1
  42. package/build/services/work-item-service.js +51 -3
  43. package/build/services/work-item-service.js.map +1 -1
  44. package/build/sync/annotation-parser.d.ts +52 -0
  45. package/build/sync/annotation-parser.d.ts.map +1 -0
  46. package/build/sync/annotation-parser.js +83 -0
  47. package/build/sync/annotation-parser.js.map +1 -0
  48. package/build/sync/field-aliases.d.ts +35 -0
  49. package/build/sync/field-aliases.d.ts.map +1 -0
  50. package/build/sync/field-aliases.js +76 -0
  51. package/build/sync/field-aliases.js.map +1 -0
  52. package/build/sync/html-converter.d.ts.map +1 -1
  53. package/build/sync/html-converter.js +12 -2
  54. package/build/sync/html-converter.js.map +1 -1
  55. package/build/sync/html-detection.d.ts +18 -65
  56. package/build/sync/html-detection.d.ts.map +1 -1
  57. package/build/sync/html-detection.js +72 -113
  58. package/build/sync/html-detection.js.map +1 -1
  59. package/build/sync/image-handler.d.ts +66 -0
  60. package/build/sync/image-handler.d.ts.map +1 -0
  61. package/build/sync/image-handler.js +135 -0
  62. package/build/sync/image-handler.js.map +1 -0
  63. package/build/sync/image-manifest.d.ts +66 -0
  64. package/build/sync/image-manifest.d.ts.map +1 -0
  65. package/build/sync/image-manifest.js +96 -0
  66. package/build/sync/image-manifest.js.map +1 -0
  67. package/build/sync/image-sync.d.ts +88 -0
  68. package/build/sync/image-sync.d.ts.map +1 -0
  69. package/build/sync/image-sync.js +274 -0
  70. package/build/sync/image-sync.js.map +1 -0
  71. package/build/sync/index.d.ts +7 -0
  72. package/build/sync/index.d.ts.map +1 -1
  73. package/build/sync/index.js +7 -0
  74. package/build/sync/index.js.map +1 -1
  75. package/build/sync/legacy-mappings.d.ts +37 -0
  76. package/build/sync/legacy-mappings.d.ts.map +1 -0
  77. package/build/sync/legacy-mappings.js +75 -0
  78. package/build/sync/legacy-mappings.js.map +1 -0
  79. package/build/sync/markdown-serializer.d.ts +54 -60
  80. package/build/sync/markdown-serializer.d.ts.map +1 -1
  81. package/build/sync/markdown-serializer.js +607 -545
  82. package/build/sync/markdown-serializer.js.map +1 -1
  83. package/build/sync/task-serializer.d.ts.map +1 -1
  84. package/build/sync/task-serializer.js +46 -8
  85. package/build/sync/task-serializer.js.map +1 -1
  86. package/build/sync/template-loader.d.ts +56 -0
  87. package/build/sync/template-loader.d.ts.map +1 -0
  88. package/build/sync/template-loader.js +138 -0
  89. package/build/sync/template-loader.js.map +1 -0
  90. package/build/sync/templates/bug.md +25 -0
  91. package/build/sync/templates/epic.md +23 -0
  92. package/build/sync/templates/feature.md +23 -0
  93. package/build/sync/templates/task.md +14 -0
  94. package/build/sync/templates/user-story.md +26 -0
  95. package/build/tool-examples.d.ts +20 -0
  96. package/build/tool-examples.d.ts.map +1 -1
  97. package/build/tool-examples.js +41 -0
  98. package/build/tool-examples.js.map +1 -1
  99. package/build/tools/build-tools.d.ts.map +1 -1
  100. package/build/tools/build-tools.js +7 -6
  101. package/build/tools/build-tools.js.map +1 -1
  102. package/build/tools/checklist-tools.d.ts.map +1 -1
  103. package/build/tools/checklist-tools.js +6 -5
  104. package/build/tools/checklist-tools.js.map +1 -1
  105. package/build/tools/index.d.ts +1 -0
  106. package/build/tools/index.d.ts.map +1 -1
  107. package/build/tools/index.js +5 -2
  108. package/build/tools/index.js.map +1 -1
  109. package/build/tools/pull-request-tools.d.ts.map +1 -1
  110. package/build/tools/pull-request-tools.js +15 -14
  111. package/build/tools/pull-request-tools.js.map +1 -1
  112. package/build/tools/sync-tools.d.ts.map +1 -1
  113. package/build/tools/sync-tools.js +9 -8
  114. package/build/tools/sync-tools.js.map +1 -1
  115. package/build/tools/test-tools.d.ts +3 -0
  116. package/build/tools/test-tools.d.ts.map +1 -0
  117. package/build/tools/test-tools.js +184 -0
  118. package/build/tools/test-tools.js.map +1 -0
  119. package/build/tools/variable-group-tools.d.ts.map +1 -1
  120. package/build/tools/variable-group-tools.js +2 -1
  121. package/build/tools/variable-group-tools.js.map +1 -1
  122. package/build/tools/visualize-tools.d.ts.map +1 -1
  123. package/build/tools/visualize-tools.js +2 -1
  124. package/build/tools/visualize-tools.js.map +1 -1
  125. package/build/tools/wiki-tools.d.ts.map +1 -1
  126. package/build/tools/wiki-tools.js +4 -3
  127. package/build/tools/wiki-tools.js.map +1 -1
  128. package/build/tools/work-item-tools.d.ts.map +1 -1
  129. package/build/tools/work-item-tools.js +42 -11
  130. package/build/tools/work-item-tools.js.map +1 -1
  131. package/build/types.d.ts +2 -0
  132. package/build/types.d.ts.map +1 -1
  133. package/package.json +3 -3
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Test Service - ADO Test Management API
3
+ *
4
+ * Uses _apis/test/ (not _apis/testplan/) to avoid Azure Test Plans license requirement.
5
+ * All runs are created with isAutomated: true to bypass the Test Plan requirement.
6
+ */
7
+ export class TestService {
8
+ client;
9
+ workItem;
10
+ constructor(client, workItem) {
11
+ this.client = client;
12
+ this.workItem = workItem;
13
+ }
14
+ /**
15
+ * Create a test run. Always sets isAutomated: true (no Test Plan needed).
16
+ * Optionally links test cases to the run via hyperlinks.
17
+ */
18
+ async createTestRun(project, name, options) {
19
+ this.client.validateProject(project);
20
+ const body = {
21
+ name,
22
+ isAutomated: true,
23
+ };
24
+ if (options?.comment)
25
+ body.comment = options.comment;
26
+ if (options?.buildId)
27
+ body.build = { id: options.buildId };
28
+ const response = await this.client.post(`${project}/_apis/test/runs?api-version=7.0`, body);
29
+ const runId = response.id;
30
+ const webAccessUrl = response.webAccessUrl ||
31
+ `https://dev.azure.com/${this.client.organization}/${encodeURIComponent(project)}/_testManagement/runs?runId=${runId}&_a=runCharts`;
32
+ // Link test cases to run via hyperlinks (workaround for missing artifact link support)
33
+ if (options?.testCaseIds && options.testCaseIds.length > 0) {
34
+ const dateStr = new Date().toISOString().split('T')[0];
35
+ for (const testCaseId of options.testCaseIds) {
36
+ try {
37
+ await this.workItem.updateWorkItem(project, testCaseId, [
38
+ {
39
+ op: 'add',
40
+ path: '/relations/-',
41
+ value: {
42
+ rel: 'Hyperlink',
43
+ url: webAccessUrl,
44
+ attributes: { comment: `Test Run #${runId} — ${name} (${dateStr})` },
45
+ },
46
+ },
47
+ ]);
48
+ }
49
+ catch (err) {
50
+ // Non-fatal: log but don't fail the run creation
51
+ console.error(`Warning: failed to link test case #${testCaseId} to run #${runId}: ${err.message}`);
52
+ }
53
+ }
54
+ }
55
+ return {
56
+ runId,
57
+ name: response.name,
58
+ url: response.url,
59
+ webAccessUrl,
60
+ };
61
+ }
62
+ /**
63
+ * Add test results to an existing run.
64
+ */
65
+ async addTestResults(project, runId, results) {
66
+ this.client.validateProject(project);
67
+ const body = results.map(r => {
68
+ const result = {
69
+ testCaseTitle: r.title,
70
+ outcome: r.outcome,
71
+ automatedTestName: r.automatedTestName || r.title,
72
+ automatedTestStorage: 'mcp-test',
73
+ };
74
+ if (r.comment)
75
+ result.comment = r.comment;
76
+ if (r.testCaseId)
77
+ result.testCase = { id: r.testCaseId };
78
+ return result;
79
+ });
80
+ const response = await this.client.post(`${project}/_apis/test/runs/${runId}/results?api-version=7.0`, body);
81
+ const resultItems = Array.isArray(response) ? response :
82
+ (response.value || response.results || [response]);
83
+ return {
84
+ count: resultItems.length,
85
+ results: resultItems.map((r) => ({
86
+ id: r.id,
87
+ title: r.testCaseTitle || r.title,
88
+ outcome: r.outcome,
89
+ })),
90
+ };
91
+ }
92
+ /**
93
+ * Mark a test run as completed.
94
+ */
95
+ async completeTestRun(project, runId, comment) {
96
+ this.client.validateProject(project);
97
+ const body = { state: 'Completed' };
98
+ if (comment)
99
+ body.comment = comment;
100
+ const response = await this.client.patch(`${project}/_apis/test/runs/${runId}?api-version=7.0`, body);
101
+ return {
102
+ runId: response.id,
103
+ state: response.state,
104
+ totalTests: response.totalTests ?? 0,
105
+ passedTests: response.passedTests ?? 0,
106
+ failedTests: response.unanalyzedTests ?? response.failedTests ?? 0,
107
+ url: response.webAccessUrl || response.url,
108
+ };
109
+ }
110
+ /**
111
+ * List test runs, optionally filtered by state and date.
112
+ */
113
+ async getTestRuns(project, options) {
114
+ this.client.validateProject(project);
115
+ const params = ['api-version=7.0'];
116
+ const maxRuns = options?.maxRuns ?? 25;
117
+ params.push(`$top=${maxRuns}`);
118
+ if (options?.state)
119
+ params.push(`state=${options.state}`);
120
+ if (options?.fromDate)
121
+ params.push(`minLastUpdatedDate=${options.fromDate}`);
122
+ const response = await this.client.get(`${project}/_apis/test/runs?${params.join('&')}`);
123
+ return (response.value || []).map((r) => ({
124
+ runId: r.id,
125
+ name: r.name,
126
+ state: r.state,
127
+ totalTests: r.totalTests ?? 0,
128
+ passedTests: r.passedTests ?? 0,
129
+ failedTests: r.unanalyzedTests ?? 0,
130
+ completedDate: r.completedDate || '',
131
+ url: r.webAccessUrl || r.url,
132
+ }));
133
+ }
134
+ /**
135
+ * Get results for a specific test run.
136
+ */
137
+ async getTestRunResults(project, runId, outcome) {
138
+ this.client.validateProject(project);
139
+ let endpoint = `${project}/_apis/test/runs/${runId}/results?api-version=7.0`;
140
+ if (outcome)
141
+ endpoint += `&outcomes=${outcome}`;
142
+ const response = await this.client.get(endpoint);
143
+ return (response.value || []).map((r) => ({
144
+ resultId: r.id,
145
+ title: r.testCaseTitle || r.automatedTestName || '',
146
+ outcome: r.outcome,
147
+ comment: r.comment || '',
148
+ testCaseId: r.testCase?.id || null,
149
+ duration: r.durationInMs ?? 0,
150
+ }));
151
+ }
152
+ /**
153
+ * Get test run history for a specific test case.
154
+ * Queries recent runs and filters results by testCase.id.
155
+ */
156
+ async getTestCaseHistory(project, testCaseId) {
157
+ this.client.validateProject(project);
158
+ // Get recent completed runs (last 100)
159
+ const runsResponse = await this.client.get(`${project}/_apis/test/runs?api-version=7.0&state=Completed&$top=100`);
160
+ const runs = runsResponse.value || [];
161
+ const history = [];
162
+ // Check each run for results referencing this test case
163
+ for (const run of runs) {
164
+ try {
165
+ const resultsResponse = await this.client.get(`${project}/_apis/test/runs/${run.id}/results?api-version=7.0`);
166
+ const results = resultsResponse.value || [];
167
+ const match = results.find((r) => r.testCase?.id === testCaseId);
168
+ if (match) {
169
+ history.push({
170
+ runId: run.id,
171
+ runName: run.name,
172
+ outcome: match.outcome,
173
+ completedDate: run.completedDate || '',
174
+ url: run.webAccessUrl || run.url,
175
+ });
176
+ }
177
+ }
178
+ catch {
179
+ // Skip runs we can't read results for
180
+ }
181
+ }
182
+ // Sort by completedDate descending
183
+ history.sort((a, b) => (b.completedDate || '').localeCompare(a.completedDate || ''));
184
+ return history;
185
+ }
186
+ /**
187
+ * Link a test case to a user story (TestedBy) and/or a test run (Hyperlink).
188
+ * Idempotent — checks existing relations before adding.
189
+ */
190
+ async linkTestCase(project, testCaseId, options) {
191
+ this.client.validateProject(project);
192
+ const linked = [];
193
+ // Get existing relations to check for duplicates
194
+ const workItemResponse = await this.client.get(`${project}/_apis/wit/workitems/${testCaseId}?$expand=relations&api-version=${this.client.apiVersion}`);
195
+ const existingRelations = workItemResponse.relations || [];
196
+ // Link to story via TestedBy-Reverse (test case → story)
197
+ if (options.storyId) {
198
+ const storyUrl = `${this.client.baseUrl}/${encodeURIComponent(project)}/_apis/wit/workItems/${options.storyId}`;
199
+ const alreadyLinked = existingRelations.some((r) => r.rel === 'Microsoft.VSTS.Common.TestedBy-Reverse' && r.url?.includes(`/${options.storyId}`));
200
+ if (!alreadyLinked) {
201
+ await this.workItem.updateWorkItem(project, testCaseId, [
202
+ {
203
+ op: 'add',
204
+ path: '/relations/-',
205
+ value: {
206
+ rel: 'Microsoft.VSTS.Common.TestedBy-Reverse',
207
+ url: storyUrl,
208
+ },
209
+ },
210
+ ]);
211
+ linked.push(`TestedBy → Story #${options.storyId}`);
212
+ }
213
+ else {
214
+ linked.push(`TestedBy → Story #${options.storyId} (already exists)`);
215
+ }
216
+ }
217
+ // Link to run via Hyperlink (no artifact link support for test runs)
218
+ if (options.runId) {
219
+ const runUrl = `https://dev.azure.com/${this.client.organization}/${encodeURIComponent(project)}/_testManagement/runs?runId=${options.runId}&_a=runCharts`;
220
+ const alreadyLinked = existingRelations.some((r) => r.rel === 'Hyperlink' && r.url === runUrl);
221
+ if (!alreadyLinked) {
222
+ const comment = options.runSummary
223
+ ? `Test Run #${options.runId} — ${options.runSummary}`
224
+ : `Test Run #${options.runId}`;
225
+ await this.workItem.updateWorkItem(project, testCaseId, [
226
+ {
227
+ op: 'add',
228
+ path: '/relations/-',
229
+ value: {
230
+ rel: 'Hyperlink',
231
+ url: runUrl,
232
+ attributes: { comment },
233
+ },
234
+ },
235
+ ]);
236
+ linked.push(`Hyperlink → Run #${options.runId}`);
237
+ }
238
+ else {
239
+ linked.push(`Hyperlink → Run #${options.runId} (already exists)`);
240
+ }
241
+ }
242
+ return { linked };
243
+ }
244
+ }
245
+ //# sourceMappingURL=test-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-service.js","sourceRoot":"","sources":["../../src/services/test-service.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,31 @@ export declare class WorkItemService {
17
17
  url: string;
18
18
  attributes?: Record<string, any>;
19
19
  }>): Promise<any>;
20
+ /**
21
+ * Download a work item attachment by its GUID and write it to disk.
22
+ *
23
+ * The endpoint `_apis/wit/attachments/{guid}?download=true` returns the raw
24
+ * binary content. We write it to `{outputDir}/{filename}`.
25
+ */
26
+ downloadAttachment(project: string, attachmentGuid: string, urlFileName: string, outputDir: string, outputFileName?: string): Promise<{
27
+ filePath: string;
28
+ fileName: string;
29
+ size: number;
30
+ guid: string;
31
+ }>;
32
+ /**
33
+ * Upload a local file as a work item attachment.
34
+ *
35
+ * The endpoint `_apis/wit/attachments?fileName={name}&uploadType=simple`
36
+ * accepts the raw file bytes (octet-stream) and returns the attachment URL
37
+ * which can be embedded in HTML fields as `<img src="...">`.
38
+ */
39
+ uploadAttachment(project: string, filePath: string, fileName?: string): Promise<{
40
+ id: string;
41
+ url: string;
42
+ fileName: string;
43
+ size: number;
44
+ }>;
20
45
  deleteWorkItem(project: string, workItemId: number): Promise<any>;
21
46
  }
22
47
  //# sourceMappingURL=work-item-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"work-item-service.d.ts","sourceRoot":"","sources":["../../src/services/work-item-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,iBAAiB;IAEtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAWpC;IAEI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAmB9D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCrF,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAW,EACvB,MAAM,GAAE,SAAS,GAAG,MAAkB,EACtC,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC;IAmFT,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ7D,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBtE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1F,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BhH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAoBzF,yBAAyB,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC;IAcV,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,GAAG,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClC,CAAC,GACD,OAAO,CAAC,GAAG,CAAC;IAkET,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAiBxE"}
1
+ {"version":3,"file":"work-item-service.d.ts","sourceRoot":"","sources":["../../src/services/work-item-service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,iBAAiB;IAEtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAWpC;IAEI,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAmB9D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCrF,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAW,EACvB,MAAM,GAAE,SAAS,GAAG,MAAkB,EACtC,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC;IAmFT,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ7D,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBtE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1F,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BhH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAoBzF,yBAAyB,CAC7B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC;IAcV,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,GAAG,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClC,CAAC,GACD,OAAO,CAAC,GAAG,CAAC;IAoEf;;;;;OAKG;IACG,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAwB9E;;;;;;OAMG;IACG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BjE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAiBxE"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Work Item Service - Azure DevOps work item operations
3
3
  */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
4
6
  import { marked } from 'marked';
5
7
  import { getAllLargeTextFields } from '../sync/html-detection.js';
6
8
  export class WorkItemService {
@@ -27,7 +29,7 @@ export class WorkItemService {
27
29
  id: response.id,
28
30
  rev: response.rev,
29
31
  url: response.url,
30
- fields: response.fields,
32
+ fields: response.fields || {},
31
33
  relations: response.relations || [],
32
34
  _links: response._links,
33
35
  commentVersionRef: response.commentVersionRef,
@@ -200,7 +202,7 @@ export class WorkItemService {
200
202
  return {
201
203
  id: response.id,
202
204
  rev: response.rev,
203
- fields: response.fields,
205
+ fields: response.fields || {},
204
206
  project
205
207
  };
206
208
  }
@@ -263,12 +265,58 @@ export class WorkItemService {
263
265
  return {
264
266
  id: response.id,
265
267
  rev: response.rev,
266
- fields: response.fields,
268
+ fields: response.fields || {},
267
269
  relations: response.relations || [],
268
270
  url: response._links?.html?.href,
269
271
  project
270
272
  };
271
273
  }
274
+ // ==================== WORK ITEM ATTACHMENT OPERATIONS ====================
275
+ /**
276
+ * Download a work item attachment by its GUID and write it to disk.
277
+ *
278
+ * The endpoint `_apis/wit/attachments/{guid}?download=true` returns the raw
279
+ * binary content. We write it to `{outputDir}/{filename}`.
280
+ */
281
+ async downloadAttachment(project, attachmentGuid, urlFileName, outputDir, outputFileName) {
282
+ this.client.validateProject(project);
283
+ const response = await this.client.requestRaw(`${project}/_apis/wit/attachments/${attachmentGuid}?fileName=${encodeURIComponent(urlFileName)}&download=true&api-version=${this.client.apiVersion}`, 'GET', undefined, undefined, 'arraybuffer');
284
+ fs.mkdirSync(outputDir, { recursive: true });
285
+ const localName = outputFileName ?? urlFileName;
286
+ const filePath = path.join(outputDir, localName);
287
+ fs.writeFileSync(filePath, Buffer.from(response.data));
288
+ return {
289
+ filePath,
290
+ fileName: localName,
291
+ size: response.data.byteLength,
292
+ guid: attachmentGuid,
293
+ };
294
+ }
295
+ /**
296
+ * Upload a local file as a work item attachment.
297
+ *
298
+ * The endpoint `_apis/wit/attachments?fileName={name}&uploadType=simple`
299
+ * accepts the raw file bytes (octet-stream) and returns the attachment URL
300
+ * which can be embedded in HTML fields as `<img src="...">`.
301
+ */
302
+ async uploadAttachment(project, filePath, fileName) {
303
+ this.client.validateProject(project);
304
+ if (!this.client.config.enableWorkItemWrite) {
305
+ throw new Error('Work item write operations are disabled. Set AZUREDEVOPS_ENABLE_WORK_ITEM_WRITE=true to enable.');
306
+ }
307
+ if (!fs.existsSync(filePath)) {
308
+ throw new Error(`Attachment file not found: ${filePath}`);
309
+ }
310
+ const data = fs.readFileSync(filePath);
311
+ const finalName = fileName || path.basename(filePath);
312
+ const response = await this.client.requestRaw(`${project}/_apis/wit/attachments?fileName=${encodeURIComponent(finalName)}&uploadType=simple&api-version=${this.client.apiVersion}`, 'POST', data, { 'Content-Type': 'application/octet-stream' });
313
+ return {
314
+ id: response.data.id,
315
+ url: response.data.url,
316
+ fileName: finalName,
317
+ size: data.byteLength,
318
+ };
319
+ }
272
320
  async deleteWorkItem(project, workItemId) {
273
321
  this.client.validateProject(project);
274
322
  if (!this.client.config.enableWorkItemDelete) {
@@ -1 +1 @@
1
- {"version":3,"file":"work-item-service.js","sourceRoot":"","sources":["../../src/services/work-item-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAIlE,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAElD,MAAM,CAAU,cAAc,GAAG;QACvC,WAAW;QACX,cAAc;QACd,mBAAmB;QACnB,cAAc;QACd,gCAAgC;QAChC,gCAAgC;QAChC,aAAa;QACb,uCAAuC;QACvC,sCAAsC;QACtC,qBAAqB;KACtB,CAAC;IAEF,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,UAAkB;QACnD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,GAAG,OAAO,wBAAwB,UAAU,4BAA4B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CACjG,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,IAAY,EAAE,aAAqB,GAAG;QAC1E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACxC,GAAG,OAAO,+BAA+B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EACjE,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,OAAO;gBACP,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS;aACtC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;aACpB,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACtC,GAAG,OAAO,yCAAyC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAC3E;YACE,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,KAAK;SACf,CACF,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,IAAI;YACX,OAAO;YACP,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YAClC,SAAS,EAAE,SAAS,CAAC,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,OAAe,EACf,aAAqB,EAAE,EACvB,SAA6B,SAAS,EACtC,MAAiB,EACjB,OAAgB;QAEhB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACvC,GAAG,OAAO,mBAAmB,OAAO,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAC7E,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjE,OAAO;gBACL,OAAO;gBACP,OAAO;gBACP,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;gBAChD,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;QACpD,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS;aACtC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;aACpB,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;QACjC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExF,MAAM,IAAI,GAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;QACvC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACtC,GAAG,OAAO,yCAAyC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAC3E,IAAI,CACL,CAAC;QAEF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE;YAC5C,IAAI,MAAM,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC;YAC1B,OAAO;gBACL,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC;gBAC9B,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC;gBACxB,UAAU,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,IAAI;gBACjF,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC;gBACxB,QAAQ,EAAE,CAAC,CAAC,gCAAgC,CAAC,IAAI,IAAI;gBACrD,QAAQ,EAAE,CAAC,CAAC,gCAAgC,CAAC,IAAI,IAAI;gBACrD,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,IAAI;gBAC9B,WAAW,EAAE,CAAC,CAAC,uCAAuC,CAAC,IAAI,IAAI;gBAC/D,cAAc,EAAE,CAAC,CAAC,sCAAsC,CAAC,IAAI,IAAI;gBACjE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAQ;YAClB,OAAO;YACP,OAAO;YACP,cAAc;YACd,aAAa,EAAE,KAAK,CAAC,MAAM;YAC3B,MAAM;SACP,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAA0B,EAAE,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAI,IAAY,CAAC,OAAO,CAAC,IAAK,IAAY,CAAC,KAAK,IAAI,SAAS,CAAC;gBACvE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAChC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAC3E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,OAAe;QAClD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CACpB,GAAG,OAAO,sBAAsB,OAAO,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,UAAkB;QAC3D,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,GAAG,OAAO,wBAAwB,UAAU,mCAAmC,CAChF,CAAC;QAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QAE3D,OAAO;YACL,UAAU;YACV,OAAO;YACP,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM;YAClD,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC;gBACxC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;gBACzC,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,WAAW;gBAC3C,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,UAAkB,EAAE,WAAmB;QAC/E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QAED,IAAI,SAAS,GAAG,WAAW,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,UAAU,CAAC;QAC9D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,GAAG,OAAO,wBAAwB,UAAU,mCAAmC,EAC/E,EAAE,IAAI,EAAE,SAAS,EAAE,CACpB,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,UAAU;YACV,OAAO;YACP,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,WAAW;YAC1C,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAe,EAAE,UAAkB,EAAE,SAAiB,EAAE,WAAmB;QACrG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QAED,IAAI,SAAS,GAAG,WAAW,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,UAAU,CAAC;QAC9D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACtC,GAAG,OAAO,wBAAwB,UAAU,aAAa,SAAS,0BAA0B,EAC5F,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,EAAE,cAAc,EAAE,kBAAkB,EAAE,CACvC,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,UAAU;YACV,OAAO;YACP,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW;YAC5C,YAAY,EAAE,QAAQ,CAAC,YAAY;SACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,UAAkB,EAAE,eAAsB;QAC9E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACtC,GAAG,OAAO,wBAAwB,UAAU,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EACpF,eAAe,CAChB,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,OAAe,EACf,UAAkB,EAClB,MAAgB;QAEhB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,0BAA0B,KAAK,EAAE;YACvC,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,YAAoB,EACpB,MAAW,EACX,QAAiB,EACjB,SAIE;QAEF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,eAAe,GAAU,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAClC,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,WAAW,KAAK,EAAE;gBACxB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChC,eAAe,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,0BAA0B,KAAK,EAAE;oBACvC,KAAK,EAAE,UAAU;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,wBAAwB,QAAQ,EAAE,CAAC;YAC1G,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE;oBACL,GAAG,EAAE,oCAAoC;oBACzC,GAAG,EAAE,SAAS;iBACf;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC3B,eAAe,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACtC,GAAG,OAAO,yBAAyB,WAAW,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EACtF,eAAe,CAChB,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;YACnC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI;YAChC,OAAO;SACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,UAAkB;QACtD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACvH,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,GAAG,OAAO,wBAAwB,UAAU,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CACrF,CAAC;QAEF,OAAO;YACL,UAAU;YACV,OAAO;YACP,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC"}
1
+ {"version":3,"file":"work-item-service.js","sourceRoot":"","sources":["../../src/services/work-item-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Parse annotated body sections from a synced markdown file.
3
+ *
4
+ * A `##` line is a section boundary ONLY when the first non-empty line that
5
+ * follows it is `<!-- ado-field: REFNAME -->`. Any other `##` line is treated
6
+ * as part of the surrounding annotated section's content — this prevents
7
+ * silent truncation of fields (e.g. Repro Steps) when the field body legitimately
8
+ * contains `##` text.
9
+ *
10
+ * Anything before the first annotated section is the prose preamble.
11
+ */
12
+ export interface AnnotatedSection {
13
+ /** ADO reference name this section maps to. */
14
+ refname: string;
15
+ /** Body content (everything between the annotation and the next `##` heading). */
16
+ content: string;
17
+ /** Heading text as it appears in the file (for error reporting). */
18
+ heading: string;
19
+ /** Index of the heading line in the source (0-based). */
20
+ lineIndex: number;
21
+ }
22
+ export interface LocalOnlySection {
23
+ /** Heading text as it appears in the file. */
24
+ heading: string;
25
+ /** Body content. */
26
+ content: string;
27
+ /** Index of the heading line in the source (0-based). */
28
+ lineIndex: number;
29
+ }
30
+ export interface ParseAnnotationsResult {
31
+ /** Sections that sync to ADO fields. */
32
+ annotated: AnnotatedSection[];
33
+ /** Sections preserved in the file but not synced. */
34
+ localOnly: LocalOnlySection[];
35
+ /** Any content before the first `##` heading (prose preamble). Trimmed. */
36
+ preamble: string;
37
+ }
38
+ /**
39
+ * Parse the body of a markdown file (everything after frontmatter) into
40
+ * annotated and local-only sections.
41
+ */
42
+ export declare function parseAnnotations(body: string): ParseAnnotationsResult;
43
+ /**
44
+ * Build an annotated `##` section as a string.
45
+ */
46
+ export declare function serializeAnnotatedSection(heading: string, refname: string, content: string): string;
47
+ /**
48
+ * Check whether a body has any `<!-- ado-field: ... -->` annotations.
49
+ * Used to decide between annotated parsing and legacy fallback.
50
+ */
51
+ export declare function hasAnnotations(body: string): boolean;
52
+ //# sourceMappingURL=annotation-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotation-parser.d.ts","sourceRoot":"","sources":["../../src/sync/annotation-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,qDAAqD;IACrD,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAsDrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Parse annotated body sections from a synced markdown file.
3
+ *
4
+ * A `##` line is a section boundary ONLY when the first non-empty line that
5
+ * follows it is `<!-- ado-field: REFNAME -->`. Any other `##` line is treated
6
+ * as part of the surrounding annotated section's content — this prevents
7
+ * silent truncation of fields (e.g. Repro Steps) when the field body legitimately
8
+ * contains `##` text.
9
+ *
10
+ * Anything before the first annotated section is the prose preamble.
11
+ */
12
+ const SECTION_HEADING_RE = /^##\s+(.+?)\s*$/;
13
+ const ANNOTATION_RE = /^<!--\s*ado-field:\s*([A-Za-z0-9_.\-]+)\s*-->$/;
14
+ /**
15
+ * Parse the body of a markdown file (everything after frontmatter) into
16
+ * annotated and local-only sections.
17
+ */
18
+ export function parseAnnotations(body) {
19
+ const lines = body.split('\n');
20
+ const annotated = [];
21
+ // Section boundaries: only `##` headings whose next non-empty line is an
22
+ // `<!-- ado-field: REFNAME -->` annotation. All other `##` lines are
23
+ // treated as content of whatever annotated section currently encloses them.
24
+ const sections = [];
25
+ for (let i = 0; i < lines.length; i++) {
26
+ const headingMatch = lines[i].match(SECTION_HEADING_RE);
27
+ if (!headingMatch)
28
+ continue;
29
+ let probe = i + 1;
30
+ while (probe < lines.length && lines[probe].trim() === '')
31
+ probe++;
32
+ if (probe >= lines.length)
33
+ continue;
34
+ const annotationMatch = lines[probe].trim().match(ANNOTATION_RE);
35
+ if (!annotationMatch)
36
+ continue;
37
+ sections.push({
38
+ headingLine: i,
39
+ annotationLine: probe,
40
+ heading: headingMatch[1].trim(),
41
+ refname: annotationMatch[1],
42
+ });
43
+ }
44
+ // Preamble = everything before the first annotated `##` heading.
45
+ const preambleEnd = sections.length > 0 ? sections[0].headingLine : lines.length;
46
+ const preamble = lines.slice(0, preambleEnd).join('\n').trim();
47
+ for (let idx = 0; idx < sections.length; idx++) {
48
+ const current = sections[idx];
49
+ const next = sections[idx + 1];
50
+ const bodyStart = current.annotationLine + 1;
51
+ const bodyEnd = next ? next.headingLine : lines.length;
52
+ const content = lines.slice(bodyStart, bodyEnd).join('\n');
53
+ annotated.push({
54
+ refname: current.refname,
55
+ content: stripTrailingSeparators(content).trim(),
56
+ heading: current.heading,
57
+ lineIndex: current.headingLine,
58
+ });
59
+ }
60
+ // Local-only sections no longer exist under the annotation-strict model.
61
+ // The field is kept on the result for backward compatibility with callers
62
+ // that destructure it.
63
+ return { annotated, localOnly: [], preamble };
64
+ }
65
+ /**
66
+ * Build an annotated `##` section as a string.
67
+ */
68
+ export function serializeAnnotatedSection(heading, refname, content) {
69
+ const body = content.trim() || '';
70
+ return `## ${heading}\n<!-- ado-field: ${refname} -->\n\n${body}\n`;
71
+ }
72
+ /**
73
+ * Check whether a body has any `<!-- ado-field: ... -->` annotations.
74
+ * Used to decide between annotated parsing and legacy fallback.
75
+ */
76
+ export function hasAnnotations(body) {
77
+ return /<!--\s*ado-field:\s*[A-Za-z0-9_.\-]+\s*-->/.test(body);
78
+ }
79
+ function stripTrailingSeparators(content) {
80
+ // Strip trailing `---` horizontal rules used as visual separators between sections.
81
+ return content.replace(/(\n\s*---\s*)+\s*$/, '');
82
+ }
83
+ //# sourceMappingURL=annotation-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotation-parser.js","sourceRoot":"","sources":["../../src/sync/annotation-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Frontmatter key → ADO reference name resolver.
3
+ *
4
+ * Frontmatter in synced markdown files uses raw ADO refnames as keys
5
+ * (e.g. `System.Title`, `Custom.ConsultancyProcess`). A small alias table
6
+ * provides friendly shortcuts for the most common fields so human-written
7
+ * files stay readable.
8
+ *
9
+ * Resolution rules:
10
+ * 1. Reserved keys (sync metadata) are returned as-is with a null refname.
11
+ * 2. Alias → refname lookup (case-sensitive).
12
+ * 3. Unknown keys are passed through unchanged (treated as refnames).
13
+ */
14
+ /** Keys that are sync metadata, never sent to ADO as field updates. */
15
+ export declare const RESERVED_FRONTMATTER_KEYS: Set<string>;
16
+ /**
17
+ * Friendly aliases → ADO reference names. Add entries here when a field is
18
+ * common enough across clients to deserve a short key.
19
+ */
20
+ export declare const FIELD_ALIASES: Record<string, string>;
21
+ /**
22
+ * Resolve a frontmatter key to its ADO refname, or null if the key is reserved
23
+ * sync metadata.
24
+ */
25
+ export declare function resolveRefname(key: string): string | null;
26
+ /**
27
+ * When writing frontmatter from ADO data, pick the friendliest key for a given
28
+ * refname (alias if one exists, else the refname itself).
29
+ */
30
+ export declare function preferredKey(refname: string): string;
31
+ /**
32
+ * True when a frontmatter key is reserved sync metadata (not an ADO field).
33
+ */
34
+ export declare function isReservedKey(key: string): boolean;
35
+ //# sourceMappingURL=field-aliases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-aliases.d.ts","sourceRoot":"","sources":["../../src/sync/field-aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,aASpC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAehD,CAAC;AAWF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD"}