@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.
Files changed (40) hide show
  1. package/build/AzureDevOpsService.d.ts +64 -0
  2. package/build/AzureDevOpsService.d.ts.map +1 -1
  3. package/build/AzureDevOpsService.js +424 -2
  4. package/build/AzureDevOpsService.js.map +1 -1
  5. package/build/index.d.ts.map +1 -1
  6. package/build/index.js +991 -13
  7. package/build/index.js.map +1 -1
  8. package/build/sync/file-utils.d.ts +86 -0
  9. package/build/sync/file-utils.d.ts.map +1 -0
  10. package/build/sync/file-utils.js +224 -0
  11. package/build/sync/file-utils.js.map +1 -0
  12. package/build/sync/git-utils.d.ts +31 -0
  13. package/build/sync/git-utils.d.ts.map +1 -0
  14. package/build/sync/git-utils.js +116 -0
  15. package/build/sync/git-utils.js.map +1 -0
  16. package/build/sync/html-converter.d.ts +32 -0
  17. package/build/sync/html-converter.d.ts.map +1 -0
  18. package/build/sync/html-converter.js +91 -0
  19. package/build/sync/html-converter.js.map +1 -0
  20. package/build/sync/html-detection.d.ts +93 -0
  21. package/build/sync/html-detection.d.ts.map +1 -0
  22. package/build/sync/html-detection.js +169 -0
  23. package/build/sync/html-detection.js.map +1 -0
  24. package/build/sync/index.d.ts +12 -0
  25. package/build/sync/index.d.ts.map +1 -0
  26. package/build/sync/index.js +12 -0
  27. package/build/sync/index.js.map +1 -0
  28. package/build/sync/markdown-serializer.d.ts +136 -0
  29. package/build/sync/markdown-serializer.d.ts.map +1 -0
  30. package/build/sync/markdown-serializer.js +646 -0
  31. package/build/sync/markdown-serializer.js.map +1 -0
  32. package/build/sync/task-serializer.d.ts +93 -0
  33. package/build/sync/task-serializer.d.ts.map +1 -0
  34. package/build/sync/task-serializer.js +395 -0
  35. package/build/sync/task-serializer.js.map +1 -0
  36. package/build/tool-examples.d.ts +56 -0
  37. package/build/tool-examples.d.ts.map +1 -0
  38. package/build/tool-examples.js +142 -0
  39. package/build/tool-examples.js.map +1 -0
  40. 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":"AAAA;;;;;GAKG;AAEH,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;IACnC,YAAY,EAAE,KAAK,EAAS,uBAAuB;IACnD,gBAAgB,EAAE,GAAG,EAAO,kBAAkB;IAC9C,cAAc,EAAE,QAAQ,EAAI,0BAA0B;IACtD,WAAW,EAAE,GAAG,EAAY,qBAAqB;IACjD,eAAe,EAAE,IAAI,EAAO,oBAAoB;CACjD,CAAC,CAAC;AAEH,0DAA0D;AAC1D,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE;IAC1B,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO;CAClC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IACD,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;CACtB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,8BAA8B;QAC9B,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yEAAyE;QACzE,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqG,EACrG,OAAe,EACf,UAAkB,EAClB,aAAkC,EAClC,eAAyB;IAEzB,MAAM,eAAe,GAAU,EAAE,CAAC;IAClC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAEhD,yCAAyC;YACzC,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,WAAW,KAAK,EAAE;gBACxB,KAAK,EAAE,eAAe;aACvB,CAAC,CAAC;YAEH,wCAAwC;YACxC,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,0BAA0B,KAAK,EAAE;gBACvC,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YAEH,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,kBAAkB,eAAe,CAAC,MAAM,6CAA6C,UAAU,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClJ,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -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":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,kBAAkB;QAC/E,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,8BAA8B;QAC3G,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,6CAA6C;QACjH,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,6CAA6C;KACpH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAgD;IACzF,SAAS,EAAE,aAAa;IACxB,qBAAqB,EAAE,wBAAwB;IAC/C,kBAAkB,EAAE,qBAAqB;IACzC,mBAAmB,EAAE,sBAAsB;CAC5C,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oBAAoB;IACpB,0CAA0C;IAC1C,+BAA+B;CACvB,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC1C,OAAO;QACL,GAAG,iBAAiB;QACpB,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,qBAAqB;QAC5B,MAAM,CAAC,kBAAkB;QACzB,MAAM,CAAC,mBAAmB;KAC3B,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,wBAAwB,GAAG;IAC/B,aAAa,EAAO,aAAa;IACjC,WAAW,EAAS,WAAW;IAC/B,gBAAgB,EAAI,oBAAoB;IACxC,gBAAgB,EAAI,gCAAgC;IACpD,YAAY,EAAQ,2BAA2B;IAC/C,YAAY,EAAQ,uBAAuB;IAC3C,YAAY,EAAQ,qBAAqB;IACzC,YAAY,EAAQ,qBAAqB;IACzC,eAAe,EAAK,cAAc;IAClC,YAAY,EAAQ,aAAa;IACjC,YAAY,EAAQ,cAAc;IAClC,cAAc,EAAM,uCAAuC;CAC5D,CAAC;AAEF,kEAAkE;AAClE,MAAM,iBAAiB,GAAG;IACxB,aAAa,EAAY,gCAAgC;IACzD,eAAe,EAAU,oBAAoB;IAC7C,eAAe,EAAU,iCAAiC;IAC1D,eAAe,EAAU,gCAAgC;IACzD,gBAAgB,EAAS,6BAA6B;IACtD,gBAAgB,EAAS,qBAAqB;IAC9C,SAAS,EAAgB,cAAc;IACvC,WAAW,EAAc,eAAe;CACzC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAkC;IAC9D,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2FAA2F;IAC3F,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,KAAK,MAAM,OAAO,IAAI,wBAAwB,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAgCD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAMjC;IACC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,wBAAwB,EAAE,CAAC;IAE/C,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,kBAAkB,GAAG,MAAM,CAAC,0CAA0C,CAAC,IAAI,EAAE,CAAC;IAEpF,MAAM,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,wBAAwB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAEnE,0BAA0B;IAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,gBAAgB,GAA2B;QAC/C,SAAS,EAAE,aAAa;QACxB,qBAAqB,EAAE,aAAa;QACpC,kBAAkB,EAAE,aAAa;QACjC,mBAAmB,EAAE,aAAa;KACnC,CAAC;IAEF,sCAAsC;IACtC,MAAM,oBAAoB,GAAG,CAC3B,SAAiB,EACjB,SAAsC,EACzB,EAAE;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACxF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACtF,gBAAgB,CAAC,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;IAC1H,gBAAgB,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,WAAW,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;IACjH,gBAAgB,CAAC,mBAAmB,GAAG,oBAAoB,CAAC,WAAW,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IAEpH,OAAO;QACL,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;QACpD,kBAAkB,EAAE,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;QAClE,KAAK,EAAE,CAAC,iBAAiB,IAAI,CAAC,wBAAwB;QACtD,QAAQ;QACR,gBAAgB;QAChB,OAAO,EAAE;YACP,iBAAiB,EAAE,WAAW,CAAC,MAAM;YACrC,wBAAwB,EAAE,kBAAkB,CAAC,MAAM;SACpD;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;;;;;+GAQsG,CAAC;AAChH,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.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"}