@mcp-consultant-tools/azure-devops 27.0.0-beta.1 → 27.0.0-beta.3

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.
@@ -0,0 +1,594 @@
1
+ /**
2
+ * Markdown Serialization Utilities
3
+ *
4
+ * Convert between ADO work items and local markdown files.
5
+ * Uses YAML frontmatter for metadata and markdown sections for content.
6
+ */
7
+ import { isHtmlContent, getAdditionalFieldConfig, ADDITIONAL_FIELD_DISPLAY_NAMES } from './html-detection.js';
8
+ /**
9
+ * Simple YAML serializer for frontmatter
10
+ * Handles basic types: string, number, boolean, arrays
11
+ */
12
+ function serializeFrontmatter(data) {
13
+ const lines = ['---'];
14
+ for (const [key, value] of Object.entries(data)) {
15
+ if (value === undefined || value === null)
16
+ continue;
17
+ if (Array.isArray(value)) {
18
+ if (value.length === 0)
19
+ continue;
20
+ lines.push(`${key}:`);
21
+ for (const item of value) {
22
+ lines.push(`- ${item}`);
23
+ }
24
+ }
25
+ else if (typeof value === 'string') {
26
+ // Quote strings that might be parsed as other types or contain special chars
27
+ if (value.includes(':') || value.includes('#') || value.includes('\n') ||
28
+ value.match(/^[\d.]+$/) || value === 'true' || value === 'false' ||
29
+ value === 'null' || value === '') {
30
+ lines.push(`${key}: "${value.replace(/"/g, '\\"')}"`);
31
+ }
32
+ else {
33
+ lines.push(`${key}: ${value}`);
34
+ }
35
+ }
36
+ else if (typeof value === 'number' || typeof value === 'boolean') {
37
+ lines.push(`${key}: ${value}`);
38
+ }
39
+ }
40
+ lines.push('---');
41
+ return lines.join('\n');
42
+ }
43
+ /**
44
+ * Simple YAML parser for frontmatter
45
+ */
46
+ function parseFrontmatter(yamlContent) {
47
+ const result = {};
48
+ const lines = yamlContent.split('\n');
49
+ let currentKey = null;
50
+ let currentArray = null;
51
+ for (const line of lines) {
52
+ // Skip empty lines
53
+ if (!line.trim())
54
+ continue;
55
+ // Array item
56
+ if (line.match(/^\s*-\s+/)) {
57
+ if (currentKey && currentArray !== null) {
58
+ const value = line.replace(/^\s*-\s+/, '').trim();
59
+ currentArray.push(parseYamlValue(value));
60
+ }
61
+ continue;
62
+ }
63
+ // Key-value pair
64
+ const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*(.*)?$/);
65
+ if (match) {
66
+ // Save previous array if any
67
+ if (currentKey && currentArray !== null) {
68
+ result[currentKey] = currentArray;
69
+ }
70
+ currentKey = match[1];
71
+ const rawValue = match[2]?.trim();
72
+ // Check if this is start of array (no value after colon)
73
+ if (!rawValue) {
74
+ currentArray = [];
75
+ }
76
+ else {
77
+ currentArray = null;
78
+ result[currentKey] = parseYamlValue(rawValue);
79
+ }
80
+ }
81
+ }
82
+ // Save final array if any
83
+ if (currentKey && currentArray !== null) {
84
+ result[currentKey] = currentArray;
85
+ }
86
+ return result;
87
+ }
88
+ /**
89
+ * Parse a YAML value string to appropriate type
90
+ */
91
+ function parseYamlValue(value) {
92
+ // Remove quotes
93
+ if ((value.startsWith('"') && value.endsWith('"')) ||
94
+ (value.startsWith("'") && value.endsWith("'"))) {
95
+ return value.slice(1, -1).replace(/\\"/g, '"');
96
+ }
97
+ // Boolean
98
+ if (value === 'true')
99
+ return true;
100
+ if (value === 'false')
101
+ return false;
102
+ // Null
103
+ if (value === 'null' || value === '~')
104
+ return null;
105
+ // Number
106
+ if (value.match(/^-?\d+$/))
107
+ return parseInt(value, 10);
108
+ if (value.match(/^-?\d+\.\d+$/))
109
+ return parseFloat(value);
110
+ return value;
111
+ }
112
+ /**
113
+ * Convert an ADO work item to markdown file content
114
+ *
115
+ * @param workItem - The work item from ADO API
116
+ * @param revision - The revision number
117
+ * @returns Object with markdown content and list of skipped fields (if any were HTML)
118
+ */
119
+ export function workItemToMarkdown(workItem, revision) {
120
+ const fields = workItem.fields || {};
121
+ const fieldConfig = getAdditionalFieldConfig();
122
+ const skippedFields = [];
123
+ // Build frontmatter data
124
+ const frontmatter = {
125
+ id: workItem.id,
126
+ title: fields['System.Title'] || '',
127
+ type: fields['System.WorkItemType'] || 'Unknown',
128
+ state: fields['System.State'] || '',
129
+ url: workItem._links?.html?.href || `https://dev.azure.com/_workitems/edit/${workItem.id}`,
130
+ };
131
+ // Optional fields
132
+ if (fields['System.AssignedTo']?.displayName) {
133
+ frontmatter.assignedTo = fields['System.AssignedTo'].displayName;
134
+ }
135
+ if (fields['Microsoft.VSTS.Scheduling.StoryPoints'] !== undefined) {
136
+ frontmatter.storyPoints = fields['Microsoft.VSTS.Scheduling.StoryPoints'];
137
+ }
138
+ if (fields['System.Parent']) {
139
+ frontmatter.parent = fields['System.Parent'];
140
+ }
141
+ // MoSCoW priority (custom field - varies by org)
142
+ const moscowField = fields['Custom.MoSCoW'] || fields['Microsoft.VSTS.Common.Priority'];
143
+ if (moscowField) {
144
+ frontmatter.moscow = moscowField;
145
+ }
146
+ // Tags
147
+ if (fields['System.Tags']) {
148
+ frontmatter.tags = fields['System.Tags'].split(';').map((t) => t.trim()).filter((t) => t);
149
+ }
150
+ if (fields['System.AreaPath']) {
151
+ frontmatter.areaPath = fields['System.AreaPath'];
152
+ }
153
+ if (fields['System.IterationPath']) {
154
+ frontmatter.iterationPath = fields['System.IterationPath'];
155
+ }
156
+ // Sync metadata
157
+ frontmatter.lastSyncedRevision = revision;
158
+ frontmatter.lastSyncedAt = new Date().toISOString();
159
+ // Build content sections
160
+ const description = fields['System.Description'] || '';
161
+ const acceptanceCriteria = fields['Microsoft.VSTS.Common.AcceptanceCriteria'] || '';
162
+ let content = serializeFrontmatter(frontmatter);
163
+ content += '\n\n# Description\n\n';
164
+ content += description.trim() || '_No description provided._';
165
+ content += '\n\n---\n\n# Acceptance Criteria\n\n';
166
+ content += acceptanceCriteria.trim() || '_No acceptance criteria provided._';
167
+ // Add additional fields if present and in markdown format
168
+ const addOptionalSection = (fieldName, displayName, sectionTitle) => {
169
+ const fieldContent = fields[fieldName];
170
+ if (!fieldContent || !fieldContent.trim()) {
171
+ return; // Field not present, skip silently
172
+ }
173
+ if (isHtmlContent(fieldContent)) {
174
+ skippedFields.push(`${displayName} (HTML)`);
175
+ return; // HTML format, skip with warning
176
+ }
177
+ content += `\n\n---\n\n# ${sectionTitle}\n\n`;
178
+ content += fieldContent.trim();
179
+ };
180
+ addOptionalSection(fieldConfig.howToTest, ADDITIONAL_FIELD_DISPLAY_NAMES.howToTest, 'How to Test');
181
+ addOptionalSection(fieldConfig.predeploymentSteps, ADDITIONAL_FIELD_DISPLAY_NAMES.predeploymentSteps, 'Predeployment Steps');
182
+ addOptionalSection(fieldConfig.postdeploymentSteps, ADDITIONAL_FIELD_DISPLAY_NAMES.postdeploymentSteps, 'Postdeployment Steps');
183
+ addOptionalSection(fieldConfig.deploymentInformation, ADDITIONAL_FIELD_DISPLAY_NAMES.deploymentInformation, 'Deployment Information');
184
+ content += '\n';
185
+ return { content, skippedFields };
186
+ }
187
+ /**
188
+ * Parse a markdown file to extract frontmatter and content sections
189
+ */
190
+ export function parseWorkItemMarkdown(content) {
191
+ // Extract frontmatter between ---
192
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
193
+ if (!frontmatterMatch) {
194
+ throw new Error('Invalid work item markdown file: missing YAML frontmatter');
195
+ }
196
+ const frontmatterRaw = frontmatterMatch[1];
197
+ const frontmatterData = parseFrontmatter(frontmatterRaw);
198
+ // Validate required fields
199
+ if (!frontmatterData.id || typeof frontmatterData.id !== 'number') {
200
+ throw new Error('Invalid work item markdown file: missing or invalid "id" in frontmatter');
201
+ }
202
+ const frontmatter = {
203
+ id: frontmatterData.id,
204
+ title: frontmatterData.title || '',
205
+ type: frontmatterData.type || 'Unknown',
206
+ state: frontmatterData.state || '',
207
+ url: frontmatterData.url || '',
208
+ assignedTo: frontmatterData.assignedTo,
209
+ storyPoints: frontmatterData.storyPoints,
210
+ parent: frontmatterData.parent,
211
+ moscow: frontmatterData.moscow,
212
+ tags: frontmatterData.tags,
213
+ areaPath: frontmatterData.areaPath,
214
+ iterationPath: frontmatterData.iterationPath,
215
+ lastSyncedRevision: frontmatterData.lastSyncedRevision || 0,
216
+ lastSyncedAt: frontmatterData.lastSyncedAt || '',
217
+ };
218
+ // Extract content after frontmatter
219
+ const contentAfterFrontmatter = content.slice(frontmatterMatch[0].length);
220
+ // Helper to extract a section by heading
221
+ // Looks for # SectionName and captures content until the next # heading or end of file
222
+ const extractSection = (sectionName) => {
223
+ // Match section heading followed by content, stopping at next section divider or heading
224
+ const regex = new RegExp(`#\\s+${escapeRegex(sectionName)}\\s*\\n([\\s\\S]*?)(?=\\n---\\n|\\n#\\s+|$)`, 'i');
225
+ const match = contentAfterFrontmatter.match(regex);
226
+ if (!match)
227
+ return undefined;
228
+ const sectionContent = match[1].trim();
229
+ // Return undefined if it's just the placeholder text
230
+ if (sectionContent === `_No ${sectionName.toLowerCase()} provided._`) {
231
+ return undefined;
232
+ }
233
+ return sectionContent || undefined;
234
+ };
235
+ // Extract primary sections
236
+ let description = extractSection('Description') || '';
237
+ if (description === '_No description provided._') {
238
+ description = '';
239
+ }
240
+ let acceptanceCriteria = extractSection('Acceptance Criteria') || '';
241
+ if (acceptanceCriteria === '_No acceptance criteria provided._') {
242
+ acceptanceCriteria = '';
243
+ }
244
+ // Extract additional fields (optional)
245
+ const additionalFields = {};
246
+ const howToTest = extractSection('How to Test');
247
+ if (howToTest)
248
+ additionalFields.howToTest = howToTest;
249
+ const predeploymentSteps = extractSection('Predeployment Steps');
250
+ if (predeploymentSteps)
251
+ additionalFields.predeploymentSteps = predeploymentSteps;
252
+ const postdeploymentSteps = extractSection('Postdeployment Steps');
253
+ if (postdeploymentSteps)
254
+ additionalFields.postdeploymentSteps = postdeploymentSteps;
255
+ const deploymentInformation = extractSection('Deployment Information');
256
+ if (deploymentInformation)
257
+ additionalFields.deploymentInformation = deploymentInformation;
258
+ return {
259
+ frontmatter,
260
+ description,
261
+ acceptanceCriteria,
262
+ additionalFields,
263
+ rawContent: content,
264
+ };
265
+ }
266
+ /**
267
+ * Escape special regex characters in a string
268
+ */
269
+ function escapeRegex(str) {
270
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
271
+ }
272
+ /**
273
+ * Convert ADO comments to a read-only markdown file
274
+ */
275
+ export function commentsToMarkdown(workItem, comments) {
276
+ const fields = workItem.fields || {};
277
+ const frontmatter = {
278
+ id: workItem.id,
279
+ title: fields['System.Title'] || '',
280
+ commentCount: comments.length,
281
+ lastSyncedAt: new Date().toISOString(),
282
+ };
283
+ let content = serializeFrontmatter(frontmatter);
284
+ content += '\n\n# Comments\n\n';
285
+ content += '> **NOTE**: This file is read-only. Comments cannot be pushed back to ADO.\n\n';
286
+ if (comments.length === 0) {
287
+ content += '_No comments on this work item._\n';
288
+ }
289
+ else {
290
+ // Sort comments by date (oldest first)
291
+ const sortedComments = [...comments].sort((a, b) => {
292
+ const dateA = new Date(a.createdDate || a.publishedDate || 0);
293
+ const dateB = new Date(b.createdDate || b.publishedDate || 0);
294
+ return dateA.getTime() - dateB.getTime();
295
+ });
296
+ sortedComments.forEach((comment, index) => {
297
+ content += '---\n\n';
298
+ content += `## Comment #${index + 1}\n`;
299
+ content += `**Author**: ${comment.createdBy?.displayName || 'Unknown'}\n`;
300
+ content += `**Date**: ${comment.createdDate || comment.publishedDate || 'Unknown'}\n\n`;
301
+ content += `${comment.text || comment.content || ''}\n\n`;
302
+ });
303
+ }
304
+ return content;
305
+ }
306
+ /**
307
+ * Build ADO patch operations from parsed markdown changes
308
+ * Only updates fields that have actually changed
309
+ */
310
+ export function buildPatchOperations(parsed, currentWorkItem) {
311
+ const operations = [];
312
+ const skippedFields = [];
313
+ const currentFields = currentWorkItem.fields || {};
314
+ const fieldConfig = getAdditionalFieldConfig();
315
+ // Check Title
316
+ const currentTitle = currentFields['System.Title'] || '';
317
+ if (parsed.frontmatter.title !== currentTitle) {
318
+ operations.push({
319
+ op: 'replace',
320
+ path: '/fields/System.Title',
321
+ value: parsed.frontmatter.title,
322
+ });
323
+ }
324
+ // Check Description (only if not HTML in ADO)
325
+ const currentDescription = currentFields['System.Description'] || '';
326
+ if (isHtmlContent(currentDescription)) {
327
+ skippedFields.push('Description (HTML in ADO)');
328
+ }
329
+ else if (parsed.description !== currentDescription) {
330
+ operations.push({
331
+ op: currentDescription ? 'replace' : 'add',
332
+ path: '/fields/System.Description',
333
+ value: parsed.description,
334
+ });
335
+ }
336
+ // Check Acceptance Criteria (only if not HTML in ADO)
337
+ const currentAC = currentFields['Microsoft.VSTS.Common.AcceptanceCriteria'] || '';
338
+ if (isHtmlContent(currentAC)) {
339
+ skippedFields.push('Acceptance Criteria (HTML in ADO)');
340
+ }
341
+ else if (parsed.acceptanceCriteria !== currentAC) {
342
+ operations.push({
343
+ op: currentAC ? 'replace' : 'add',
344
+ path: '/fields/Microsoft.VSTS.Common.AcceptanceCriteria',
345
+ value: parsed.acceptanceCriteria,
346
+ });
347
+ }
348
+ // Helper to check and add patch operation for additional field
349
+ const checkAdditionalField = (localValue, fieldName, displayName) => {
350
+ const currentValue = currentFields[fieldName] || '';
351
+ // If the field is HTML in ADO, skip it
352
+ if (currentValue && isHtmlContent(currentValue)) {
353
+ skippedFields.push(`${displayName} (HTML in ADO)`);
354
+ return;
355
+ }
356
+ // Compare values (treat undefined as empty string)
357
+ const localContent = localValue || '';
358
+ if (localContent !== currentValue) {
359
+ operations.push({
360
+ op: currentValue ? 'replace' : 'add',
361
+ path: `/fields/${fieldName}`,
362
+ value: localContent,
363
+ });
364
+ }
365
+ };
366
+ // Check additional fields
367
+ checkAdditionalField(parsed.additionalFields.howToTest, fieldConfig.howToTest, ADDITIONAL_FIELD_DISPLAY_NAMES.howToTest);
368
+ checkAdditionalField(parsed.additionalFields.predeploymentSteps, fieldConfig.predeploymentSteps, ADDITIONAL_FIELD_DISPLAY_NAMES.predeploymentSteps);
369
+ checkAdditionalField(parsed.additionalFields.postdeploymentSteps, fieldConfig.postdeploymentSteps, ADDITIONAL_FIELD_DISPLAY_NAMES.postdeploymentSteps);
370
+ checkAdditionalField(parsed.additionalFields.deploymentInformation, fieldConfig.deploymentInformation, ADDITIONAL_FIELD_DISPLAY_NAMES.deploymentInformation);
371
+ return { operations, skippedFields };
372
+ }
373
+ /**
374
+ * Update the lastSyncedRevision in a markdown file content
375
+ */
376
+ export function updateSyncRevision(content, newRevision) {
377
+ // Update lastSyncedRevision in frontmatter
378
+ const updatedContent = content.replace(/lastSyncedRevision:\s*\d+/, `lastSyncedRevision: ${newRevision}`);
379
+ // Update lastSyncedAt timestamp
380
+ return updatedContent.replace(/lastSyncedAt:\s*[^\n]+/, `lastSyncedAt: ${new Date().toISOString()}`);
381
+ }
382
+ /**
383
+ * Check if a work item frontmatter indicates a new (not yet created) work item
384
+ * New work items don't have an 'id' field
385
+ */
386
+ export function isNewWorkItem(frontmatter) {
387
+ return !frontmatter.id || typeof frontmatter.id !== 'number';
388
+ }
389
+ /**
390
+ * Parse a markdown file for a NEW work item (no id required)
391
+ */
392
+ export function parseNewWorkItemMarkdown(content) {
393
+ // Extract frontmatter between ---
394
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
395
+ if (!frontmatterMatch) {
396
+ throw new Error('Invalid work item markdown file: missing YAML frontmatter');
397
+ }
398
+ const frontmatterRaw = frontmatterMatch[1];
399
+ const frontmatterData = parseFrontmatter(frontmatterRaw);
400
+ // Validate required fields for new work items
401
+ if (!frontmatterData.parent || typeof frontmatterData.parent !== 'number') {
402
+ throw new Error('New work item files require a "parent" field with the parent work item ID');
403
+ }
404
+ if (!frontmatterData.title || typeof frontmatterData.title !== 'string') {
405
+ throw new Error('New work item files require a "title" field');
406
+ }
407
+ const frontmatter = {
408
+ title: frontmatterData.title,
409
+ type: frontmatterData.type || 'User Story',
410
+ state: frontmatterData.state || 'New',
411
+ parent: frontmatterData.parent,
412
+ assignedTo: frontmatterData.assignedTo,
413
+ storyPoints: frontmatterData.storyPoints,
414
+ moscow: frontmatterData.moscow,
415
+ tags: frontmatterData.tags,
416
+ areaPath: frontmatterData.areaPath,
417
+ iterationPath: frontmatterData.iterationPath,
418
+ };
419
+ // Extract content after frontmatter
420
+ const contentAfterFrontmatter = content.slice(frontmatterMatch[0].length);
421
+ // Helper to extract a section by heading (reuse from parseWorkItemMarkdown)
422
+ const extractSection = (sectionName) => {
423
+ const regex = new RegExp(`#\\s+${escapeRegex(sectionName)}\\s*\\n([\\s\\S]*?)(?=\\n---\\n|\\n#\\s+|$)`, 'i');
424
+ const match = contentAfterFrontmatter.match(regex);
425
+ if (!match)
426
+ return undefined;
427
+ const sectionContent = match[1].trim();
428
+ if (sectionContent === `_No ${sectionName.toLowerCase()} provided._`) {
429
+ return undefined;
430
+ }
431
+ return sectionContent || undefined;
432
+ };
433
+ // Extract primary sections
434
+ let description = extractSection('Description') || '';
435
+ if (description === '_No description provided._' || description === '[Your description here]') {
436
+ description = '';
437
+ }
438
+ let acceptanceCriteria = extractSection('Acceptance Criteria') || '';
439
+ if (acceptanceCriteria === '_No acceptance criteria provided._' || acceptanceCriteria === '[Your acceptance criteria here]') {
440
+ acceptanceCriteria = '';
441
+ }
442
+ // Extract additional fields (optional)
443
+ const additionalFields = {};
444
+ const howToTest = extractSection('How to Test');
445
+ if (howToTest)
446
+ additionalFields.howToTest = howToTest;
447
+ const predeploymentSteps = extractSection('Predeployment Steps');
448
+ if (predeploymentSteps)
449
+ additionalFields.predeploymentSteps = predeploymentSteps;
450
+ const postdeploymentSteps = extractSection('Postdeployment Steps');
451
+ if (postdeploymentSteps)
452
+ additionalFields.postdeploymentSteps = postdeploymentSteps;
453
+ const deploymentInformation = extractSection('Deployment Information');
454
+ if (deploymentInformation)
455
+ additionalFields.deploymentInformation = deploymentInformation;
456
+ return {
457
+ frontmatter,
458
+ description,
459
+ acceptanceCriteria,
460
+ additionalFields,
461
+ rawContent: content,
462
+ };
463
+ }
464
+ /**
465
+ * Build ADO fields object for creating a new work item
466
+ * Inherits areaPath and iterationPath from parent work item
467
+ */
468
+ export function buildNewWorkItemFields(parsed, parentWorkItem) {
469
+ const parentFields = parentWorkItem.fields || {};
470
+ const fieldConfig = getAdditionalFieldConfig();
471
+ const fields = {
472
+ 'System.Title': parsed.frontmatter.title,
473
+ 'System.State': parsed.frontmatter.state || 'New',
474
+ };
475
+ // Set description if provided
476
+ if (parsed.description) {
477
+ fields['System.Description'] = parsed.description;
478
+ }
479
+ // Set acceptance criteria if provided
480
+ if (parsed.acceptanceCriteria) {
481
+ fields['Microsoft.VSTS.Common.AcceptanceCriteria'] = parsed.acceptanceCriteria;
482
+ }
483
+ // Story points
484
+ if (parsed.frontmatter.storyPoints !== undefined) {
485
+ fields['Microsoft.VSTS.Scheduling.StoryPoints'] = parsed.frontmatter.storyPoints;
486
+ }
487
+ // MoSCoW (custom field)
488
+ if (parsed.frontmatter.moscow) {
489
+ fields['Custom.MoSCoW'] = parsed.frontmatter.moscow;
490
+ }
491
+ // Tags
492
+ if (parsed.frontmatter.tags && parsed.frontmatter.tags.length > 0) {
493
+ fields['System.Tags'] = parsed.frontmatter.tags.join('; ');
494
+ }
495
+ // Inherit areaPath from parent if not specified
496
+ if (parsed.frontmatter.areaPath) {
497
+ fields['System.AreaPath'] = parsed.frontmatter.areaPath;
498
+ }
499
+ else if (parentFields['System.AreaPath']) {
500
+ fields['System.AreaPath'] = parentFields['System.AreaPath'];
501
+ }
502
+ // Inherit iterationPath from parent if not specified
503
+ if (parsed.frontmatter.iterationPath) {
504
+ fields['System.IterationPath'] = parsed.frontmatter.iterationPath;
505
+ }
506
+ else if (parentFields['System.IterationPath']) {
507
+ fields['System.IterationPath'] = parentFields['System.IterationPath'];
508
+ }
509
+ // Additional fields
510
+ if (parsed.additionalFields.howToTest) {
511
+ fields[fieldConfig.howToTest] = parsed.additionalFields.howToTest;
512
+ }
513
+ if (parsed.additionalFields.predeploymentSteps) {
514
+ fields[fieldConfig.predeploymentSteps] = parsed.additionalFields.predeploymentSteps;
515
+ }
516
+ if (parsed.additionalFields.postdeploymentSteps) {
517
+ fields[fieldConfig.postdeploymentSteps] = parsed.additionalFields.postdeploymentSteps;
518
+ }
519
+ if (parsed.additionalFields.deploymentInformation) {
520
+ fields[fieldConfig.deploymentInformation] = parsed.additionalFields.deploymentInformation;
521
+ }
522
+ return fields;
523
+ }
524
+ /**
525
+ * Generate a new work item template markdown file
526
+ */
527
+ export function generateNewWorkItemTemplate(parentId, parentTitle, project, workItemType = 'User Story') {
528
+ const frontmatter = {
529
+ title: 'New User Story Title',
530
+ type: workItemType,
531
+ state: 'New',
532
+ parent: parentId,
533
+ assignedTo: '',
534
+ storyPoints: '',
535
+ moscow: '',
536
+ tags: [],
537
+ };
538
+ let content = serializeFrontmatter(frontmatter);
539
+ content += '\n\n';
540
+ content += `> Parent: **#${parentId}** - ${parentTitle}\n`;
541
+ content += `> Project: ${project}\n`;
542
+ content += '\n# Description\n\n';
543
+ content += '[Your description here]\n\n';
544
+ content += '---\n\n';
545
+ content += '# Acceptance Criteria\n\n';
546
+ content += '[Your acceptance criteria here]\n';
547
+ return content;
548
+ }
549
+ /**
550
+ * Update a new work item file after creation with the assigned ID
551
+ * Converts it from a "new" file to a synced file with proper frontmatter
552
+ */
553
+ export function convertNewFileToSynced(content, workItemId, revision, url) {
554
+ // Parse the existing content
555
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
556
+ if (!frontmatterMatch) {
557
+ throw new Error('Invalid work item markdown file: missing YAML frontmatter');
558
+ }
559
+ const frontmatterRaw = frontmatterMatch[1];
560
+ const frontmatterData = parseFrontmatter(frontmatterRaw);
561
+ const contentAfterFrontmatter = content.slice(frontmatterMatch[0].length);
562
+ // Build new frontmatter with id and sync metadata
563
+ const newFrontmatter = {
564
+ id: workItemId,
565
+ title: frontmatterData.title || '',
566
+ type: frontmatterData.type || 'User Story',
567
+ state: frontmatterData.state || 'New',
568
+ url: url,
569
+ };
570
+ // Copy optional fields
571
+ if (frontmatterData.assignedTo)
572
+ newFrontmatter.assignedTo = frontmatterData.assignedTo;
573
+ if (frontmatterData.storyPoints)
574
+ newFrontmatter.storyPoints = frontmatterData.storyPoints;
575
+ if (frontmatterData.parent)
576
+ newFrontmatter.parent = frontmatterData.parent;
577
+ if (frontmatterData.moscow)
578
+ newFrontmatter.moscow = frontmatterData.moscow;
579
+ if (frontmatterData.tags && frontmatterData.tags.length > 0)
580
+ newFrontmatter.tags = frontmatterData.tags;
581
+ if (frontmatterData.areaPath)
582
+ newFrontmatter.areaPath = frontmatterData.areaPath;
583
+ if (frontmatterData.iterationPath)
584
+ newFrontmatter.iterationPath = frontmatterData.iterationPath;
585
+ // Add sync metadata
586
+ newFrontmatter.lastSyncedRevision = revision;
587
+ newFrontmatter.lastSyncedAt = new Date().toISOString();
588
+ // Remove the "Parent:" and "Project:" note lines from the content
589
+ let cleanedContent = contentAfterFrontmatter
590
+ .replace(/>\s*Parent:.*\n/i, '')
591
+ .replace(/>\s*Project:.*\n/i, '');
592
+ return serializeFrontmatter(newFrontmatter) + cleanedContent;
593
+ }
594
+ //# sourceMappingURL=markdown-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-serializer.js","sourceRoot":"","sources":["../../src/sync/markdown-serializer.ts"],"names":[],"mappings":"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"}