@mcp-consultant-tools/azure-devops 30.0.0-beta.9 → 31.0.0-beta.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.
Files changed (129) 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/context-factory.d.ts.map +1 -1
  16. package/build/context-factory.js +10 -4
  17. package/build/context-factory.js.map +1 -1
  18. package/build/schemas.d.ts +13 -0
  19. package/build/schemas.d.ts.map +1 -0
  20. package/build/schemas.js +47 -0
  21. package/build/schemas.js.map +1 -0
  22. package/build/services/checklist-service.d.ts.map +1 -1
  23. package/build/services/checklist-service.js +3 -0
  24. package/build/services/checklist-service.js.map +1 -1
  25. package/build/services/index.d.ts +1 -0
  26. package/build/services/index.d.ts.map +1 -1
  27. package/build/services/index.js +1 -0
  28. package/build/services/index.js.map +1 -1
  29. package/build/services/sync-service.d.ts.map +1 -1
  30. package/build/services/sync-service.js +75 -14
  31. package/build/services/sync-service.js.map +1 -1
  32. package/build/services/test-service.d.ts +106 -0
  33. package/build/services/test-service.d.ts.map +1 -0
  34. package/build/services/test-service.js +245 -0
  35. package/build/services/test-service.js.map +1 -0
  36. package/build/services/work-item-service.d.ts +29 -1
  37. package/build/services/work-item-service.d.ts.map +1 -1
  38. package/build/services/work-item-service.js +66 -6
  39. package/build/services/work-item-service.js.map +1 -1
  40. package/build/sync/annotation-parser.d.ts +52 -0
  41. package/build/sync/annotation-parser.d.ts.map +1 -0
  42. package/build/sync/annotation-parser.js +83 -0
  43. package/build/sync/annotation-parser.js.map +1 -0
  44. package/build/sync/field-aliases.d.ts +35 -0
  45. package/build/sync/field-aliases.d.ts.map +1 -0
  46. package/build/sync/field-aliases.js +76 -0
  47. package/build/sync/field-aliases.js.map +1 -0
  48. package/build/sync/html-converter.d.ts.map +1 -1
  49. package/build/sync/html-converter.js +12 -2
  50. package/build/sync/html-converter.js.map +1 -1
  51. package/build/sync/html-detection.d.ts +18 -65
  52. package/build/sync/html-detection.d.ts.map +1 -1
  53. package/build/sync/html-detection.js +72 -113
  54. package/build/sync/html-detection.js.map +1 -1
  55. package/build/sync/image-handler.d.ts +66 -0
  56. package/build/sync/image-handler.d.ts.map +1 -0
  57. package/build/sync/image-handler.js +135 -0
  58. package/build/sync/image-handler.js.map +1 -0
  59. package/build/sync/image-manifest.d.ts +66 -0
  60. package/build/sync/image-manifest.d.ts.map +1 -0
  61. package/build/sync/image-manifest.js +96 -0
  62. package/build/sync/image-manifest.js.map +1 -0
  63. package/build/sync/image-sync.d.ts +88 -0
  64. package/build/sync/image-sync.d.ts.map +1 -0
  65. package/build/sync/image-sync.js +274 -0
  66. package/build/sync/image-sync.js.map +1 -0
  67. package/build/sync/index.d.ts +7 -0
  68. package/build/sync/index.d.ts.map +1 -1
  69. package/build/sync/index.js +7 -0
  70. package/build/sync/index.js.map +1 -1
  71. package/build/sync/legacy-mappings.d.ts +37 -0
  72. package/build/sync/legacy-mappings.d.ts.map +1 -0
  73. package/build/sync/legacy-mappings.js +75 -0
  74. package/build/sync/legacy-mappings.js.map +1 -0
  75. package/build/sync/markdown-serializer.d.ts +54 -60
  76. package/build/sync/markdown-serializer.d.ts.map +1 -1
  77. package/build/sync/markdown-serializer.js +607 -545
  78. package/build/sync/markdown-serializer.js.map +1 -1
  79. package/build/sync/task-serializer.d.ts.map +1 -1
  80. package/build/sync/task-serializer.js +46 -8
  81. package/build/sync/task-serializer.js.map +1 -1
  82. package/build/sync/template-loader.d.ts +56 -0
  83. package/build/sync/template-loader.d.ts.map +1 -0
  84. package/build/sync/template-loader.js +138 -0
  85. package/build/sync/template-loader.js.map +1 -0
  86. package/build/sync/templates/bug.md +25 -0
  87. package/build/sync/templates/epic.md +23 -0
  88. package/build/sync/templates/feature.md +23 -0
  89. package/build/sync/templates/task.md +14 -0
  90. package/build/sync/templates/user-story.md +26 -0
  91. package/build/tool-examples.d.ts +20 -0
  92. package/build/tool-examples.d.ts.map +1 -1
  93. package/build/tool-examples.js +41 -0
  94. package/build/tool-examples.js.map +1 -1
  95. package/build/tools/build-tools.d.ts.map +1 -1
  96. package/build/tools/build-tools.js +7 -6
  97. package/build/tools/build-tools.js.map +1 -1
  98. package/build/tools/checklist-tools.d.ts.map +1 -1
  99. package/build/tools/checklist-tools.js +6 -5
  100. package/build/tools/checklist-tools.js.map +1 -1
  101. package/build/tools/index.d.ts +1 -0
  102. package/build/tools/index.d.ts.map +1 -1
  103. package/build/tools/index.js +5 -2
  104. package/build/tools/index.js.map +1 -1
  105. package/build/tools/pull-request-tools.d.ts.map +1 -1
  106. package/build/tools/pull-request-tools.js +15 -14
  107. package/build/tools/pull-request-tools.js.map +1 -1
  108. package/build/tools/sync-tools.d.ts.map +1 -1
  109. package/build/tools/sync-tools.js +9 -8
  110. package/build/tools/sync-tools.js.map +1 -1
  111. package/build/tools/test-tools.d.ts +3 -0
  112. package/build/tools/test-tools.d.ts.map +1 -0
  113. package/build/tools/test-tools.js +184 -0
  114. package/build/tools/test-tools.js.map +1 -0
  115. package/build/tools/variable-group-tools.d.ts.map +1 -1
  116. package/build/tools/variable-group-tools.js +2 -1
  117. package/build/tools/variable-group-tools.js.map +1 -1
  118. package/build/tools/visualize-tools.d.ts.map +1 -1
  119. package/build/tools/visualize-tools.js +2 -1
  120. package/build/tools/visualize-tools.js.map +1 -1
  121. package/build/tools/wiki-tools.d.ts.map +1 -1
  122. package/build/tools/wiki-tools.js +4 -3
  123. package/build/tools/wiki-tools.js.map +1 -1
  124. package/build/tools/work-item-tools.d.ts.map +1 -1
  125. package/build/tools/work-item-tools.js +42 -11
  126. package/build/tools/work-item-tools.js.map +1 -1
  127. package/build/types.d.ts +2 -0
  128. package/build/types.d.ts.map +1 -1
  129. 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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"}
@@ -1,7 +1,10 @@
1
+ import type { PiiProtectionPipeline } from '@mcp-consultant-tools/core';
1
2
  import type { AzureDevOpsClient } from '../azure-devops-client.js';
2
3
  export declare class WorkItemService {
3
4
  private readonly client;
4
- constructor(client: AzureDevOpsClient);
5
+ private readonly piiPipeline?;
6
+ constructor(client: AzureDevOpsClient, piiPipeline?: PiiProtectionPipeline | undefined);
7
+ private redact;
5
8
  private static readonly SUMMARY_FIELDS;
6
9
  getWorkItem(project: string, workItemId: number): Promise<any>;
7
10
  queryWorkItems(project: string, wiql: string, maxResults?: number): Promise<any>;
@@ -17,6 +20,31 @@ export declare class WorkItemService {
17
20
  url: string;
18
21
  attributes?: Record<string, any>;
19
22
  }>): Promise<any>;
23
+ /**
24
+ * Download a work item attachment by its GUID and write it to disk.
25
+ *
26
+ * The endpoint `_apis/wit/attachments/{guid}?download=true` returns the raw
27
+ * binary content. We write it to `{outputDir}/{filename}`.
28
+ */
29
+ downloadAttachment(project: string, attachmentGuid: string, urlFileName: string, outputDir: string, outputFileName?: string): Promise<{
30
+ filePath: string;
31
+ fileName: string;
32
+ size: number;
33
+ guid: string;
34
+ }>;
35
+ /**
36
+ * Upload a local file as a work item attachment.
37
+ *
38
+ * The endpoint `_apis/wit/attachments?fileName={name}&uploadType=simple`
39
+ * accepts the raw file bytes (octet-stream) and returns the attachment URL
40
+ * which can be embedded in HTML fields as `<img src="...">`.
41
+ */
42
+ uploadAttachment(project: string, filePath: string, fileName?: string): Promise<{
43
+ id: string;
44
+ url: string;
45
+ fileName: string;
46
+ size: number;
47
+ }>;
20
48
  deleteWorkItem(project: string, workItemId: number): Promise<any>;
21
49
  }
22
50
  //# 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":"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"}
@@ -1,12 +1,22 @@
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 {
7
9
  client;
8
- constructor(client) {
10
+ piiPipeline;
11
+ constructor(client, piiPipeline) {
9
12
  this.client = client;
13
+ this.piiPipeline = piiPipeline;
14
+ }
15
+ redact(data) {
16
+ if (!this.piiPipeline?.isEnabled)
17
+ return { data };
18
+ const r = this.piiPipeline.redactResponse('workitem', data);
19
+ return { data: r.data, piiReport: r.report };
10
20
  }
11
21
  static SUMMARY_FIELDS = [
12
22
  'System.Id',
@@ -23,16 +33,18 @@ export class WorkItemService {
23
33
  async getWorkItem(project, workItemId) {
24
34
  this.client.validateProject(project);
25
35
  const response = await this.client.get(`${project}/_apis/wit/workitems/${workItemId}?$expand=all&api-version=${this.client.apiVersion}`);
26
- return {
36
+ const shaped = {
27
37
  id: response.id,
28
38
  rev: response.rev,
29
39
  url: response.url,
30
- fields: response.fields,
40
+ fields: response.fields || {},
31
41
  relations: response.relations || [],
32
42
  _links: response._links,
33
43
  commentVersionRef: response.commentVersionRef,
34
44
  project
35
45
  };
46
+ const { data, piiReport } = this.redact(shaped);
47
+ return piiReport ? { ...data, piiReport } : data;
36
48
  }
37
49
  async queryWorkItems(project, wiql, maxResults = 200) {
38
50
  this.client.validateProject(project);
@@ -52,12 +64,14 @@ export class WorkItemService {
52
64
  ids: workItemIds,
53
65
  $expand: 'all'
54
66
  });
55
- return {
67
+ const shaped = {
56
68
  query: wiql,
57
69
  project,
58
70
  totalCount: workItems.value.length,
59
71
  workItems: workItems.value
60
72
  };
73
+ const { data, piiReport } = this.redact(shaped);
74
+ return piiReport ? { ...data, piiReport } : data;
61
75
  }
62
76
  async runSavedQuery(project, queryId, maxResults = 50, detail = 'summary', fields, groupBy) {
63
77
  this.client.validateProject(project);
@@ -200,7 +214,7 @@ export class WorkItemService {
200
214
  return {
201
215
  id: response.id,
202
216
  rev: response.rev,
203
- fields: response.fields,
217
+ fields: response.fields || {},
204
218
  project
205
219
  };
206
220
  }
@@ -263,12 +277,58 @@ export class WorkItemService {
263
277
  return {
264
278
  id: response.id,
265
279
  rev: response.rev,
266
- fields: response.fields,
280
+ fields: response.fields || {},
267
281
  relations: response.relations || [],
268
282
  url: response._links?.html?.href,
269
283
  project
270
284
  };
271
285
  }
286
+ // ==================== WORK ITEM ATTACHMENT OPERATIONS ====================
287
+ /**
288
+ * Download a work item attachment by its GUID and write it to disk.
289
+ *
290
+ * The endpoint `_apis/wit/attachments/{guid}?download=true` returns the raw
291
+ * binary content. We write it to `{outputDir}/{filename}`.
292
+ */
293
+ async downloadAttachment(project, attachmentGuid, urlFileName, outputDir, outputFileName) {
294
+ this.client.validateProject(project);
295
+ 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');
296
+ fs.mkdirSync(outputDir, { recursive: true });
297
+ const localName = outputFileName ?? urlFileName;
298
+ const filePath = path.join(outputDir, localName);
299
+ fs.writeFileSync(filePath, Buffer.from(response.data));
300
+ return {
301
+ filePath,
302
+ fileName: localName,
303
+ size: response.data.byteLength,
304
+ guid: attachmentGuid,
305
+ };
306
+ }
307
+ /**
308
+ * Upload a local file as a work item attachment.
309
+ *
310
+ * The endpoint `_apis/wit/attachments?fileName={name}&uploadType=simple`
311
+ * accepts the raw file bytes (octet-stream) and returns the attachment URL
312
+ * which can be embedded in HTML fields as `<img src="...">`.
313
+ */
314
+ async uploadAttachment(project, filePath, fileName) {
315
+ this.client.validateProject(project);
316
+ if (!this.client.config.enableWorkItemWrite) {
317
+ throw new Error('Work item write operations are disabled. Set AZUREDEVOPS_ENABLE_WORK_ITEM_WRITE=true to enable.');
318
+ }
319
+ if (!fs.existsSync(filePath)) {
320
+ throw new Error(`Attachment file not found: ${filePath}`);
321
+ }
322
+ const data = fs.readFileSync(filePath);
323
+ const finalName = fileName || path.basename(filePath);
324
+ 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' });
325
+ return {
326
+ id: response.data.id,
327
+ url: response.data.url,
328
+ fileName: finalName,
329
+ size: data.byteLength,
330
+ };
331
+ }
272
332
  async deleteWorkItem(project, workItemId) {
273
333
  this.client.validateProject(project);
274
334
  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":"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"}
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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"}