@mcp-consultant-tools/azure-devops 27.0.0-beta.1 → 27.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/AzureDevOpsService.d.ts +64 -0
- package/build/AzureDevOpsService.d.ts.map +1 -1
- package/build/AzureDevOpsService.js +424 -2
- package/build/AzureDevOpsService.js.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +991 -13
- package/build/index.js.map +1 -1
- package/build/sync/file-utils.d.ts +86 -0
- package/build/sync/file-utils.d.ts.map +1 -0
- package/build/sync/file-utils.js +224 -0
- package/build/sync/file-utils.js.map +1 -0
- package/build/sync/git-utils.d.ts +31 -0
- package/build/sync/git-utils.d.ts.map +1 -0
- package/build/sync/git-utils.js +116 -0
- package/build/sync/git-utils.js.map +1 -0
- package/build/sync/html-converter.d.ts +32 -0
- package/build/sync/html-converter.d.ts.map +1 -0
- package/build/sync/html-converter.js +91 -0
- package/build/sync/html-converter.js.map +1 -0
- package/build/sync/html-detection.d.ts +93 -0
- package/build/sync/html-detection.d.ts.map +1 -0
- package/build/sync/html-detection.js +169 -0
- package/build/sync/html-detection.js.map +1 -0
- package/build/sync/index.d.ts +12 -0
- package/build/sync/index.d.ts.map +1 -0
- package/build/sync/index.js +12 -0
- package/build/sync/index.js.map +1 -0
- package/build/sync/markdown-serializer.d.ts +136 -0
- package/build/sync/markdown-serializer.d.ts.map +1 -0
- package/build/sync/markdown-serializer.js +646 -0
- package/build/sync/markdown-serializer.js.map +1 -0
- package/build/sync/task-serializer.d.ts +93 -0
- package/build/sync/task-serializer.d.ts.map +1 -0
- package/build/sync/task-serializer.js +395 -0
- package/build/sync/task-serializer.js.map +1 -0
- package/build/tool-examples.d.ts +56 -0
- package/build/tool-examples.d.ts.map +1 -0
- package/build/tool-examples.js +142 -0
- package/build/tool-examples.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Utilities for Work Item Sync
|
|
3
|
+
*
|
|
4
|
+
* Handles git operations for auto-commit functionality.
|
|
5
|
+
* All git operations are optional and fail gracefully.
|
|
6
|
+
*/
|
|
7
|
+
import { exec } from 'node:child_process';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Check if the current directory is a git repository
|
|
13
|
+
*/
|
|
14
|
+
export async function isGitRepo(cwd) {
|
|
15
|
+
try {
|
|
16
|
+
await execAsync('git rev-parse --is-inside-work-tree', {
|
|
17
|
+
cwd: cwd || process.cwd(),
|
|
18
|
+
});
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Git add a file
|
|
27
|
+
*/
|
|
28
|
+
async function gitAdd(filePath, cwd) {
|
|
29
|
+
await execAsync(`git add "${filePath}"`, {
|
|
30
|
+
cwd: cwd || process.cwd(),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Git commit with a message
|
|
35
|
+
*/
|
|
36
|
+
async function gitCommit(message, cwd) {
|
|
37
|
+
const { stdout } = await execAsync(`git commit -m "${message.replace(/"/g, '\\"')}"`, {
|
|
38
|
+
cwd: cwd || process.cwd(),
|
|
39
|
+
});
|
|
40
|
+
return stdout;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Auto-commit a work item file after pull
|
|
44
|
+
* Returns result indicating success or failure (non-blocking)
|
|
45
|
+
*/
|
|
46
|
+
export async function autoCommitPulledFile(filePath, workItemId, revision, cwd) {
|
|
47
|
+
try {
|
|
48
|
+
// Check if we're in a git repo
|
|
49
|
+
if (!await isGitRepo(cwd)) {
|
|
50
|
+
return {
|
|
51
|
+
committed: false,
|
|
52
|
+
error: 'Not a git repository',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Get relative path for cleaner commit message
|
|
56
|
+
const workingDir = cwd || process.cwd();
|
|
57
|
+
const relativePath = path.relative(workingDir, filePath);
|
|
58
|
+
// Add the file
|
|
59
|
+
await gitAdd(filePath, workingDir);
|
|
60
|
+
// Commit with descriptive message
|
|
61
|
+
const commitMessage = `Pull user story #${workItemId} from ADO (rev ${revision})`;
|
|
62
|
+
await gitCommit(commitMessage, workingDir);
|
|
63
|
+
return {
|
|
64
|
+
committed: true,
|
|
65
|
+
message: commitMessage,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Git failures are non-blocking - log and continue
|
|
70
|
+
console.error(`Git auto-commit failed for work item #${workItemId}: ${error.message}`);
|
|
71
|
+
return {
|
|
72
|
+
committed: false,
|
|
73
|
+
error: error.message,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Auto-commit multiple work item files in a single commit
|
|
79
|
+
*/
|
|
80
|
+
export async function autoCommitMultipleFiles(files, revision, cwd) {
|
|
81
|
+
if (files.length === 0) {
|
|
82
|
+
return { committed: false, error: 'No files to commit' };
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
// Check if we're in a git repo
|
|
86
|
+
if (!await isGitRepo(cwd)) {
|
|
87
|
+
return {
|
|
88
|
+
committed: false,
|
|
89
|
+
error: 'Not a git repository',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const workingDir = cwd || process.cwd();
|
|
93
|
+
// Add all files
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
await gitAdd(file.filePath, workingDir);
|
|
96
|
+
}
|
|
97
|
+
// Build commit message
|
|
98
|
+
const ids = files.map(f => `#${f.workItemId}`).join(', ');
|
|
99
|
+
const commitMessage = files.length === 1
|
|
100
|
+
? `Pull user story ${ids} from ADO`
|
|
101
|
+
: `Pull user stories ${ids} from ADO`;
|
|
102
|
+
await gitCommit(commitMessage, workingDir);
|
|
103
|
+
return {
|
|
104
|
+
committed: true,
|
|
105
|
+
message: commitMessage,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error(`Git auto-commit failed: ${error.message}`);
|
|
110
|
+
return {
|
|
111
|
+
committed: false,
|
|
112
|
+
error: error.message,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=git-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/sync/git-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML to Markdown Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts HTML content to Markdown format for ADO work item fields.
|
|
5
|
+
* Used for auto-converting HTML fields to markdown when syncing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Convert HTML content to Markdown
|
|
9
|
+
*
|
|
10
|
+
* @param html - HTML content string
|
|
11
|
+
* @returns Markdown formatted string
|
|
12
|
+
*/
|
|
13
|
+
export declare function htmlToMarkdown(html: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Auto-convert HTML fields to markdown in ADO
|
|
16
|
+
*
|
|
17
|
+
* This function:
|
|
18
|
+
* 1. Converts HTML content to markdown using turndown
|
|
19
|
+
* 2. Updates the field value in ADO with the converted content
|
|
20
|
+
* 3. Sets the field format to Markdown (irreversible)
|
|
21
|
+
*
|
|
22
|
+
* @param service - Azure DevOps service instance
|
|
23
|
+
* @param project - Project name
|
|
24
|
+
* @param workItemId - Work item ID
|
|
25
|
+
* @param currentFields - Current field values from ADO
|
|
26
|
+
* @param fieldsToConvert - Fields to check and convert if HTML
|
|
27
|
+
* @returns Array of field names that were converted
|
|
28
|
+
*/
|
|
29
|
+
export declare function autoConvertFieldsToMarkdown(service: {
|
|
30
|
+
updateWorkItem: (project: string, workItemId: number, operations: any[]) => Promise<any>;
|
|
31
|
+
}, project: string, workItemId: number, currentFields: Record<string, any>, fieldsToConvert: string[]): Promise<string[]>;
|
|
32
|
+
//# sourceMappingURL=html-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-converter.d.ts","sourceRoot":"","sources":["../../src/sync/html-converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2BH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE;IAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;CAAE,EACrG,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCnB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML to Markdown Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts HTML content to Markdown format for ADO work item fields.
|
|
5
|
+
* Used for auto-converting HTML fields to markdown when syncing.
|
|
6
|
+
*/
|
|
7
|
+
import TurndownService from 'turndown';
|
|
8
|
+
import { isHtmlContent } from './html-detection.js';
|
|
9
|
+
const turndown = new TurndownService({
|
|
10
|
+
headingStyle: 'atx', // Use # style headings
|
|
11
|
+
bulletListMarker: '-', // Use - for lists
|
|
12
|
+
codeBlockStyle: 'fenced', // Use ``` for code blocks
|
|
13
|
+
emDelimiter: '*', // Use * for emphasis
|
|
14
|
+
strongDelimiter: '**', // Use ** for strong
|
|
15
|
+
});
|
|
16
|
+
// Configure turndown to handle ADO-specific HTML patterns
|
|
17
|
+
turndown.addRule('adoSpan', {
|
|
18
|
+
filter: ['span'],
|
|
19
|
+
replacement: (content) => content,
|
|
20
|
+
});
|
|
21
|
+
// Remove empty divs that ADO sometimes creates
|
|
22
|
+
turndown.addRule('emptyDiv', {
|
|
23
|
+
filter: (node) => {
|
|
24
|
+
return node.nodeName === 'DIV' && !node.textContent?.trim();
|
|
25
|
+
},
|
|
26
|
+
replacement: () => '',
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Convert HTML content to Markdown
|
|
30
|
+
*
|
|
31
|
+
* @param html - HTML content string
|
|
32
|
+
* @returns Markdown formatted string
|
|
33
|
+
*/
|
|
34
|
+
export function htmlToMarkdown(html) {
|
|
35
|
+
if (!html?.trim())
|
|
36
|
+
return '';
|
|
37
|
+
try {
|
|
38
|
+
const markdown = turndown.turndown(html);
|
|
39
|
+
// Clean up excessive newlines
|
|
40
|
+
return markdown.replace(/\n{3,}/g, '\n\n').trim();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
// If conversion fails, return the original content stripped of HTML tags
|
|
44
|
+
console.error('HTML to markdown conversion failed, stripping tags:', error);
|
|
45
|
+
return html.replace(/<[^>]*>/g, '').trim();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Auto-convert HTML fields to markdown in ADO
|
|
50
|
+
*
|
|
51
|
+
* This function:
|
|
52
|
+
* 1. Converts HTML content to markdown using turndown
|
|
53
|
+
* 2. Updates the field value in ADO with the converted content
|
|
54
|
+
* 3. Sets the field format to Markdown (irreversible)
|
|
55
|
+
*
|
|
56
|
+
* @param service - Azure DevOps service instance
|
|
57
|
+
* @param project - Project name
|
|
58
|
+
* @param workItemId - Work item ID
|
|
59
|
+
* @param currentFields - Current field values from ADO
|
|
60
|
+
* @param fieldsToConvert - Fields to check and convert if HTML
|
|
61
|
+
* @returns Array of field names that were converted
|
|
62
|
+
*/
|
|
63
|
+
export async function autoConvertFieldsToMarkdown(service, project, workItemId, currentFields, fieldsToConvert) {
|
|
64
|
+
const patchOperations = [];
|
|
65
|
+
const convertedFields = [];
|
|
66
|
+
for (const field of fieldsToConvert) {
|
|
67
|
+
const content = currentFields[field];
|
|
68
|
+
if (content && isHtmlContent(content)) {
|
|
69
|
+
const markdownContent = htmlToMarkdown(content);
|
|
70
|
+
// Update content with converted markdown
|
|
71
|
+
patchOperations.push({
|
|
72
|
+
op: 'replace',
|
|
73
|
+
path: `/fields/${field}`,
|
|
74
|
+
value: markdownContent,
|
|
75
|
+
});
|
|
76
|
+
// Set format to markdown (irreversible)
|
|
77
|
+
patchOperations.push({
|
|
78
|
+
op: 'add',
|
|
79
|
+
path: `/multilineFieldsFormat/${field}`,
|
|
80
|
+
value: 'Markdown',
|
|
81
|
+
});
|
|
82
|
+
convertedFields.push(field);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (patchOperations.length > 0) {
|
|
86
|
+
await service.updateWorkItem(project, workItemId, patchOperations);
|
|
87
|
+
console.error(`Auto-converted ${convertedFields.length} HTML field(s) to markdown for work item #${workItemId}: ${convertedFields.join(', ')}`);
|
|
88
|
+
}
|
|
89
|
+
return convertedFields;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=html-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-converter.js","sourceRoot":"","sources":["../../src/sync/html-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Detects whether ADO work item content is HTML (legacy) or Markdown format.
|
|
5
|
+
* ADO supports both formats and we can only sync markdown fields.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Additional custom fields that can be synced.
|
|
9
|
+
* These are configurable via environment variables since field names may vary by organization.
|
|
10
|
+
*
|
|
11
|
+
* Default field names are based on typical ADO custom field patterns.
|
|
12
|
+
* GUID-based fields (like pre/post deployment) may vary between organizations.
|
|
13
|
+
*/
|
|
14
|
+
export interface AdditionalFieldConfig {
|
|
15
|
+
howToTest: string;
|
|
16
|
+
deploymentInformation: string;
|
|
17
|
+
predeploymentSteps: string;
|
|
18
|
+
postdeploymentSteps: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get additional field configuration from environment variables
|
|
22
|
+
* Falls back to common default field names
|
|
23
|
+
*/
|
|
24
|
+
export declare function getAdditionalFieldConfig(): AdditionalFieldConfig;
|
|
25
|
+
/**
|
|
26
|
+
* Human-readable names for additional fields (for display/logging)
|
|
27
|
+
*/
|
|
28
|
+
export declare const ADDITIONAL_FIELD_DISPLAY_NAMES: Record<keyof AdditionalFieldConfig, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Large text fields that support markdown format in Azure DevOps.
|
|
31
|
+
* These are the standard ADO fields that can be set to markdown format.
|
|
32
|
+
*/
|
|
33
|
+
export declare const LARGE_TEXT_FIELDS: readonly ["System.Description", "Microsoft.VSTS.Common.AcceptanceCriteria", "Microsoft.VSTS.TCM.ReproSteps"];
|
|
34
|
+
/**
|
|
35
|
+
* Get all large text fields including custom ones from config.
|
|
36
|
+
* Used to determine which fields should have markdown format set.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getAllLargeTextFields(): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Check if content is HTML format (as opposed to markdown)
|
|
41
|
+
*
|
|
42
|
+
* @param content - The content string to check
|
|
43
|
+
* @returns true if content appears to be HTML, false if markdown or empty
|
|
44
|
+
*/
|
|
45
|
+
export declare function isHtmlContent(content: string | null | undefined): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Field format result type
|
|
48
|
+
*/
|
|
49
|
+
export type FieldFormat = 'markdown' | 'html' | 'not_present';
|
|
50
|
+
/**
|
|
51
|
+
* Result of checking additional field formats
|
|
52
|
+
*/
|
|
53
|
+
export interface AdditionalFieldFormats {
|
|
54
|
+
howToTest: FieldFormat;
|
|
55
|
+
deploymentInformation: FieldFormat;
|
|
56
|
+
predeploymentSteps: FieldFormat;
|
|
57
|
+
postdeploymentSteps: FieldFormat;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Full field format check result
|
|
61
|
+
*/
|
|
62
|
+
export interface FieldFormatResult {
|
|
63
|
+
description: 'markdown' | 'html';
|
|
64
|
+
acceptanceCriteria: 'markdown' | 'html';
|
|
65
|
+
ready: boolean;
|
|
66
|
+
warnings: string[];
|
|
67
|
+
additionalFields: AdditionalFieldFormats;
|
|
68
|
+
details: {
|
|
69
|
+
descriptionLength: number;
|
|
70
|
+
acceptanceCriteriaLength: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check field formats for a work item
|
|
75
|
+
*
|
|
76
|
+
* Primary fields (Description, Acceptance Criteria): If HTML, work item is not ready for sync.
|
|
77
|
+
* Secondary fields (How to Test, Deployment fields): If HTML, warn but allow sync (skip those fields).
|
|
78
|
+
*
|
|
79
|
+
* @param workItem - The work item object from ADO API
|
|
80
|
+
* @returns Object with field format information
|
|
81
|
+
*/
|
|
82
|
+
export declare function checkFieldFormats(workItem: {
|
|
83
|
+
fields?: {
|
|
84
|
+
'System.Description'?: string;
|
|
85
|
+
'Microsoft.VSTS.Common.AcceptanceCriteria'?: string;
|
|
86
|
+
[key: string]: any;
|
|
87
|
+
};
|
|
88
|
+
}): FieldFormatResult;
|
|
89
|
+
/**
|
|
90
|
+
* Get human-readable conversion instructions
|
|
91
|
+
*/
|
|
92
|
+
export declare function getConversionInstructions(): string;
|
|
93
|
+
//# sourceMappingURL=html-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-detection.d.ts","sourceRoot":"","sources":["../../src/sync/html-detection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,CAOhE;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,qBAAqB,EAAE,MAAM,CAKtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,8GAIpB,CAAC;AAEX;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAShD;AA8BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAsBzE;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,aAAa,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,WAAW,CAAC;IACvB,qBAAqB,EAAE,WAAW,CAAC;IACnC,kBAAkB,EAAE,WAAW,CAAC;IAChC,mBAAmB,EAAE,WAAW,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,UAAU,GAAG,MAAM,CAAC;IACjC,kBAAkB,EAAE,UAAU,GAAG,MAAM,CAAC;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,OAAO,EAAE;QACP,iBAAiB,EAAE,MAAM,CAAC;QAC1B,wBAAwB,EAAE,MAAM,CAAC;KAClC,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE;IAC1C,MAAM,CAAC,EAAE;QACP,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,0CAA0C,CAAC,EAAE,MAAM,CAAC;QACpD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH,GAAG,iBAAiB,CAmDpB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAUlD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Detects whether ADO work item content is HTML (legacy) or Markdown format.
|
|
5
|
+
* ADO supports both formats and we can only sync markdown fields.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get additional field configuration from environment variables
|
|
9
|
+
* Falls back to common default field names
|
|
10
|
+
*/
|
|
11
|
+
export function getAdditionalFieldConfig() {
|
|
12
|
+
return {
|
|
13
|
+
howToTest: process.env.AZUREDEVOPS_SYNC_FIELD_HOW_TO_TEST || 'Custom.Howtotest',
|
|
14
|
+
deploymentInformation: process.env.AZUREDEVOPS_SYNC_FIELD_DEPLOYMENT_INFO || 'Custom.Deploymentinformation',
|
|
15
|
+
predeploymentSteps: process.env.AZUREDEVOPS_SYNC_FIELD_PREDEPLOY || 'Custom.7519d1bc-5305-4905-822b-2b380e61b154',
|
|
16
|
+
postdeploymentSteps: process.env.AZUREDEVOPS_SYNC_FIELD_POSTDEPLOY || 'Custom.abd6763f-a242-4938-85ed-bda419e34e7e',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Human-readable names for additional fields (for display/logging)
|
|
21
|
+
*/
|
|
22
|
+
export const ADDITIONAL_FIELD_DISPLAY_NAMES = {
|
|
23
|
+
howToTest: 'How to Test',
|
|
24
|
+
deploymentInformation: 'Deployment Information',
|
|
25
|
+
predeploymentSteps: 'Predeployment Steps',
|
|
26
|
+
postdeploymentSteps: 'Postdeployment Steps',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Large text fields that support markdown format in Azure DevOps.
|
|
30
|
+
* These are the standard ADO fields that can be set to markdown format.
|
|
31
|
+
*/
|
|
32
|
+
export const LARGE_TEXT_FIELDS = [
|
|
33
|
+
'System.Description',
|
|
34
|
+
'Microsoft.VSTS.Common.AcceptanceCriteria',
|
|
35
|
+
'Microsoft.VSTS.TCM.ReproSteps',
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Get all large text fields including custom ones from config.
|
|
39
|
+
* Used to determine which fields should have markdown format set.
|
|
40
|
+
*/
|
|
41
|
+
export function getAllLargeTextFields() {
|
|
42
|
+
const config = getAdditionalFieldConfig();
|
|
43
|
+
return [
|
|
44
|
+
...LARGE_TEXT_FIELDS,
|
|
45
|
+
config.howToTest,
|
|
46
|
+
config.deploymentInformation,
|
|
47
|
+
config.predeploymentSteps,
|
|
48
|
+
config.postdeploymentSteps,
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
// Structural HTML patterns that indicate the content is HTML (not markdown)
|
|
52
|
+
const HTML_STRUCTURAL_PATTERNS = [
|
|
53
|
+
/<div[^>]*>/i, // <div> tags
|
|
54
|
+
/<p[^>]*>/i, // <p> tags
|
|
55
|
+
/<h[1-6][^>]*>/i, // HTML heading tags
|
|
56
|
+
/<strong[^>]*>/i, // <strong> tags (instead of **)
|
|
57
|
+
/<em[^>]*>/i, // <em> tags (instead of *)
|
|
58
|
+
/<ul[^>]*>/i, // HTML unordered lists
|
|
59
|
+
/<ol[^>]*>/i, // HTML ordered lists
|
|
60
|
+
/<li[^>]*>/i, // List items in HTML
|
|
61
|
+
/<table[^>]*>/i, // HTML tables
|
|
62
|
+
/<tr[^>]*>/i, // Table rows
|
|
63
|
+
/<td[^>]*>/i, // Table cells
|
|
64
|
+
/<span[^>]*>/i, // Span elements (ADO often uses these)
|
|
65
|
+
];
|
|
66
|
+
// Markdown patterns that indicate the content is already markdown
|
|
67
|
+
const MARKDOWN_PATTERNS = [
|
|
68
|
+
/^#{1,6}\s+/m, // Markdown headings (# Heading)
|
|
69
|
+
/\*\*[^*]+\*\*/, // Bold text with **
|
|
70
|
+
/^\s*[-*+]\s+/m, // Unordered list items (-, *, +)
|
|
71
|
+
/^\s*\d+\.\s+/m, // Numbered list items (1. item)
|
|
72
|
+
/\[.+?\]\(.+?\)/, // Markdown links [text](url)
|
|
73
|
+
/```[\s\S]*?```/, // Fenced code blocks
|
|
74
|
+
/`[^`]+`/, // Inline code
|
|
75
|
+
/^\s*>\s+/m, // Block quotes
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Check if content is HTML format (as opposed to markdown)
|
|
79
|
+
*
|
|
80
|
+
* @param content - The content string to check
|
|
81
|
+
* @returns true if content appears to be HTML, false if markdown or empty
|
|
82
|
+
*/
|
|
83
|
+
export function isHtmlContent(content) {
|
|
84
|
+
if (!content?.trim()) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
// If clear markdown syntax is present, treat as markdown (even if some inline HTML exists)
|
|
88
|
+
// This handles cases where users mix markdown with allowed inline HTML
|
|
89
|
+
for (const pattern of MARKDOWN_PATTERNS) {
|
|
90
|
+
if (pattern.test(content)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Check for structural HTML patterns that indicate this is HTML content
|
|
95
|
+
for (const pattern of HTML_STRUCTURAL_PATTERNS) {
|
|
96
|
+
if (pattern.test(content)) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Default to markdown (plain text is valid markdown)
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check field formats for a work item
|
|
105
|
+
*
|
|
106
|
+
* Primary fields (Description, Acceptance Criteria): If HTML, work item is not ready for sync.
|
|
107
|
+
* Secondary fields (How to Test, Deployment fields): If HTML, warn but allow sync (skip those fields).
|
|
108
|
+
*
|
|
109
|
+
* @param workItem - The work item object from ADO API
|
|
110
|
+
* @returns Object with field format information
|
|
111
|
+
*/
|
|
112
|
+
export function checkFieldFormats(workItem) {
|
|
113
|
+
const fields = workItem.fields || {};
|
|
114
|
+
const fieldConfig = getAdditionalFieldConfig();
|
|
115
|
+
const description = fields['System.Description'] || '';
|
|
116
|
+
const acceptanceCriteria = fields['Microsoft.VSTS.Common.AcceptanceCriteria'] || '';
|
|
117
|
+
const descriptionIsHtml = isHtmlContent(description);
|
|
118
|
+
const acceptanceCriteriaIsHtml = isHtmlContent(acceptanceCriteria);
|
|
119
|
+
// Check additional fields
|
|
120
|
+
const warnings = [];
|
|
121
|
+
const additionalFields = {
|
|
122
|
+
howToTest: 'not_present',
|
|
123
|
+
deploymentInformation: 'not_present',
|
|
124
|
+
predeploymentSteps: 'not_present',
|
|
125
|
+
postdeploymentSteps: 'not_present',
|
|
126
|
+
};
|
|
127
|
+
// Helper to check an additional field
|
|
128
|
+
const checkAdditionalField = (fieldName, configKey) => {
|
|
129
|
+
const content = fields[fieldName];
|
|
130
|
+
if (!content || !content.trim()) {
|
|
131
|
+
return 'not_present';
|
|
132
|
+
}
|
|
133
|
+
if (isHtmlContent(content)) {
|
|
134
|
+
warnings.push(`${ADDITIONAL_FIELD_DISPLAY_NAMES[configKey]} is HTML - will be skipped`);
|
|
135
|
+
return 'html';
|
|
136
|
+
}
|
|
137
|
+
return 'markdown';
|
|
138
|
+
};
|
|
139
|
+
additionalFields.howToTest = checkAdditionalField(fieldConfig.howToTest, 'howToTest');
|
|
140
|
+
additionalFields.deploymentInformation = checkAdditionalField(fieldConfig.deploymentInformation, 'deploymentInformation');
|
|
141
|
+
additionalFields.predeploymentSteps = checkAdditionalField(fieldConfig.predeploymentSteps, 'predeploymentSteps');
|
|
142
|
+
additionalFields.postdeploymentSteps = checkAdditionalField(fieldConfig.postdeploymentSteps, 'postdeploymentSteps');
|
|
143
|
+
return {
|
|
144
|
+
description: descriptionIsHtml ? 'html' : 'markdown',
|
|
145
|
+
acceptanceCriteria: acceptanceCriteriaIsHtml ? 'html' : 'markdown',
|
|
146
|
+
ready: !descriptionIsHtml && !acceptanceCriteriaIsHtml,
|
|
147
|
+
warnings,
|
|
148
|
+
additionalFields,
|
|
149
|
+
details: {
|
|
150
|
+
descriptionLength: description.length,
|
|
151
|
+
acceptanceCriteriaLength: acceptanceCriteria.length,
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get human-readable conversion instructions
|
|
157
|
+
*/
|
|
158
|
+
export function getConversionInstructions() {
|
|
159
|
+
return `To convert HTML fields to markdown in Azure DevOps:
|
|
160
|
+
1. Open the work item in Azure DevOps
|
|
161
|
+
2. Click in the Description or Acceptance Criteria field
|
|
162
|
+
3. Look for the "Convert to Markdown" button in the toolbar
|
|
163
|
+
4. Click it and confirm the conversion
|
|
164
|
+
5. Save the work item
|
|
165
|
+
6. Re-run the sync command
|
|
166
|
+
|
|
167
|
+
Note: Some organizations may have HTML format enforced. Contact your ADO admin if the option is not available.`;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=html-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-detection.js","sourceRoot":"","sources":["../../src/sync/html-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work Item Sync Module
|
|
3
|
+
*
|
|
4
|
+
* Exports all sync-related utilities for syncing ADO work items to local markdown files.
|
|
5
|
+
*/
|
|
6
|
+
export * from './html-detection.js';
|
|
7
|
+
export * from './html-converter.js';
|
|
8
|
+
export * from './markdown-serializer.js';
|
|
9
|
+
export * from './file-utils.js';
|
|
10
|
+
export * from './git-utils.js';
|
|
11
|
+
export * from './task-serializer.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Work Item Sync Module
|
|
3
|
+
*
|
|
4
|
+
* Exports all sync-related utilities for syncing ADO work items to local markdown files.
|
|
5
|
+
*/
|
|
6
|
+
export * from './html-detection.js';
|
|
7
|
+
export * from './html-converter.js';
|
|
8
|
+
export * from './markdown-serializer.js';
|
|
9
|
+
export * from './file-utils.js';
|
|
10
|
+
export * from './git-utils.js';
|
|
11
|
+
export * from './task-serializer.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
|