@achieveai/azuredevops-mcp 1.2.1 → 1.2.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.
- package/dist/Interfaces/Pipelines.js +3 -0
- package/dist/Interfaces/Pipelines.js.map +1 -0
- package/dist/Interfaces/Wiki.js +3 -0
- package/dist/Interfaces/Wiki.js.map +1 -0
- package/dist/Services/AzureDevOpsService.js +6 -5
- package/dist/Services/AzureDevOpsService.js.map +1 -1
- package/dist/Services/BuildService.js +172 -0
- package/dist/Services/BuildService.js.map +1 -0
- package/dist/Services/EntraAuthHandler.js +83 -18
- package/dist/Services/EntraAuthHandler.js.map +1 -1
- package/dist/Services/GitService.js +129 -0
- package/dist/Services/GitService.js.map +1 -1
- package/dist/Services/WikiService.js +90 -0
- package/dist/Services/WikiService.js.map +1 -0
- package/dist/Services/WorkItemService.js +123 -0
- package/dist/Services/WorkItemService.js.map +1 -1
- package/dist/Tools/BuildTools.js +402 -0
- package/dist/Tools/BuildTools.js.map +1 -0
- package/dist/Tools/GitTools.js +187 -41
- package/dist/Tools/GitTools.js.map +1 -1
- package/dist/Tools/WikiTools.js +137 -0
- package/dist/Tools/WikiTools.js.map +1 -0
- package/dist/Tools/WorkItemTools.js +120 -0
- package/dist/Tools/WorkItemTools.js.map +1 -1
- package/dist/config.js +30 -11
- package/dist/config.js.map +1 -1
- package/dist/index.js +300 -64
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BuildToolMethods = exports.BuildTools = void 0;
|
|
7
|
+
const BuildService_1 = require("../Services/BuildService");
|
|
8
|
+
const Common_1 = require("../Interfaces/Common");
|
|
9
|
+
const getClassMethods_1 = __importDefault(require("../utils/getClassMethods"));
|
|
10
|
+
const formatHelpers_1 = require("../utils/formatHelpers");
|
|
11
|
+
class BuildTools {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.buildService = new BuildService_1.BuildService(config);
|
|
14
|
+
}
|
|
15
|
+
// ── List Builds ──────────────────────────────────────────────────
|
|
16
|
+
async getBuilds(params) {
|
|
17
|
+
try {
|
|
18
|
+
const builds = await this.buildService.getBuilds(params);
|
|
19
|
+
if (builds.length === 0) {
|
|
20
|
+
return (0, Common_1.formatMcpResponse)(builds, `## Builds\n\nNo builds found matching the specified filters.`);
|
|
21
|
+
}
|
|
22
|
+
let md = `## Builds\n\n**${builds.length} build${builds.length !== 1 ? 's' : ''}** found\n\n`;
|
|
23
|
+
const rows = builds.map((b) => [
|
|
24
|
+
`#${b.id || 'N/A'}`,
|
|
25
|
+
(0, formatHelpers_1.truncateText)(b.definition?.name || 'Unknown', 30),
|
|
26
|
+
b.buildNumber || '-',
|
|
27
|
+
getBuildStatusEmoji(b.status) + ' ' + getBuildStatusLabel(b.status),
|
|
28
|
+
getBuildResultEmoji(b.result) + ' ' + getBuildResultLabel(b.result),
|
|
29
|
+
(0, formatHelpers_1.truncateText)(b.sourceBranch?.replace('refs/heads/', '') || '-', 25),
|
|
30
|
+
b.requestedFor?.displayName || '-',
|
|
31
|
+
b.startTime ? (0, formatHelpers_1.formatRelativeDate)(b.startTime) : '-',
|
|
32
|
+
formatDuration(b.startTime, b.finishTime),
|
|
33
|
+
]);
|
|
34
|
+
md += (0, formatHelpers_1.markdownTable)(['ID', 'Pipeline', 'Build #', 'Status', 'Result', 'Branch', 'Requested By', 'Started', 'Duration'], rows);
|
|
35
|
+
return (0, Common_1.formatMcpResponse)(builds, md, false, true);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ── Get Build ────────────────────────────────────────────────────
|
|
42
|
+
async getBuild(params) {
|
|
43
|
+
try {
|
|
44
|
+
const build = await this.buildService.getBuild(params);
|
|
45
|
+
let md = `## Build #${build.id}\n\n`;
|
|
46
|
+
md += `| Property | Value |\n|---|---|\n`;
|
|
47
|
+
md += `| **Pipeline** | ${build.definition?.name || 'Unknown'} |\n`;
|
|
48
|
+
md += `| **Build Number** | ${build.buildNumber || '-'} |\n`;
|
|
49
|
+
md += `| **Status** | ${getBuildStatusEmoji(build.status)} ${getBuildStatusLabel(build.status)} |\n`;
|
|
50
|
+
md += `| **Result** | ${getBuildResultEmoji(build.result)} ${getBuildResultLabel(build.result)} |\n`;
|
|
51
|
+
md += `| **Branch** | \`${build.sourceBranch?.replace('refs/heads/', '') || '-'}\` |\n`;
|
|
52
|
+
md += `| **Source Version** | \`${(0, formatHelpers_1.truncateText)(build.sourceVersion || '-', 12)}\` |\n`;
|
|
53
|
+
md += `| **Requested By** | ${build.requestedFor?.displayName || '-'} |\n`;
|
|
54
|
+
md += `| **Requested For** | ${build.requestedFor?.displayName || '-'} |\n`;
|
|
55
|
+
md += `| **Queue** | ${build.queue?.name || '-'} |\n`;
|
|
56
|
+
md += `| **Start Time** | ${build.startTime ? (0, formatHelpers_1.formatFullDate)(build.startTime) : 'Not started'} |\n`;
|
|
57
|
+
md += `| **Finish Time** | ${build.finishTime ? (0, formatHelpers_1.formatFullDate)(build.finishTime) : 'In progress'} |\n`;
|
|
58
|
+
md += `| **Duration** | ${formatDuration(build.startTime, build.finishTime)} |\n`;
|
|
59
|
+
md += `| **Reason** | ${getBuildReasonLabel(build.reason)} |\n`;
|
|
60
|
+
if (build.tags && build.tags.length > 0) {
|
|
61
|
+
md += `| **Tags** | ${build.tags.join(', ')} |\n`;
|
|
62
|
+
}
|
|
63
|
+
if (build.triggerInfo) {
|
|
64
|
+
md += `\n### Trigger Info\n`;
|
|
65
|
+
md += `| Key | Value |\n|---|---|\n`;
|
|
66
|
+
for (const [key, value] of Object.entries(build.triggerInfo)) {
|
|
67
|
+
md += `| ${key} | ${value} |\n`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return (0, Common_1.formatMcpResponse)(build, md, false, true);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ── Get Build Logs ───────────────────────────────────────────────
|
|
77
|
+
async getBuildLog(params) {
|
|
78
|
+
try {
|
|
79
|
+
const result = await this.buildService.getBuildLogs(params);
|
|
80
|
+
if (params.logId !== undefined) {
|
|
81
|
+
// Specific log content
|
|
82
|
+
const lines = result.lines || [];
|
|
83
|
+
let md = `## Build #${params.buildId} - Log #${params.logId}\n\n`;
|
|
84
|
+
md += `**${lines.length} line${lines.length !== 1 ? 's' : ''}**\n\n`;
|
|
85
|
+
md += '```\n';
|
|
86
|
+
md += lines.join('\n');
|
|
87
|
+
md += '\n```';
|
|
88
|
+
return (0, Common_1.formatMcpResponse)(result, md, false, true);
|
|
89
|
+
}
|
|
90
|
+
// Log metadata list
|
|
91
|
+
const logs = result;
|
|
92
|
+
let md = `## Build #${params.buildId} - Logs\n\n`;
|
|
93
|
+
md += `**${logs.length} log${logs.length !== 1 ? 's' : ''}** available\n\n`;
|
|
94
|
+
if (logs.length > 0) {
|
|
95
|
+
const rows = logs.map((log) => [
|
|
96
|
+
`${log.id || 'N/A'}`,
|
|
97
|
+
log.type || '-',
|
|
98
|
+
`${log.lineCount || 0}`,
|
|
99
|
+
]);
|
|
100
|
+
md += (0, formatHelpers_1.markdownTable)(['Log ID', 'Type', 'Lines'], rows);
|
|
101
|
+
md += `\n\nUse \`getBuildLog\` with a specific \`logId\` to view log content.`;
|
|
102
|
+
}
|
|
103
|
+
return (0, Common_1.formatMcpResponse)(result, md, false, true);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ── Get Build Changes ────────────────────────────────────────────
|
|
110
|
+
async getBuildChanges(params) {
|
|
111
|
+
try {
|
|
112
|
+
const changes = await this.buildService.getBuildChanges(params);
|
|
113
|
+
if (changes.length === 0) {
|
|
114
|
+
return (0, Common_1.formatMcpResponse)(changes, `## Build #${params.buildId} - Changes\n\nNo changes found.`);
|
|
115
|
+
}
|
|
116
|
+
let md = `## Build #${params.buildId} - Changes\n\n`;
|
|
117
|
+
md += `**${changes.length} change${changes.length !== 1 ? 's' : ''}**\n\n`;
|
|
118
|
+
const rows = changes.map((c) => [
|
|
119
|
+
(0, formatHelpers_1.truncateText)(c.id || '-', 12),
|
|
120
|
+
c.author?.displayName || '-',
|
|
121
|
+
(0, formatHelpers_1.truncateText)(c.message || '-', 60),
|
|
122
|
+
c.timestamp ? (0, formatHelpers_1.formatRelativeDate)(c.timestamp) : '-',
|
|
123
|
+
]);
|
|
124
|
+
md += (0, formatHelpers_1.markdownTable)(['Commit', 'Author', 'Message', 'Date'], rows);
|
|
125
|
+
return (0, Common_1.formatMcpResponse)(changes, md, false, true);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── List Definitions ─────────────────────────────────────────────
|
|
132
|
+
async getDefinitions(params) {
|
|
133
|
+
try {
|
|
134
|
+
const definitions = await this.buildService.getDefinitions(params);
|
|
135
|
+
if (definitions.length === 0) {
|
|
136
|
+
return (0, Common_1.formatMcpResponse)(definitions, `## Pipeline Definitions\n\nNo definitions found.`);
|
|
137
|
+
}
|
|
138
|
+
let md = `## Pipeline Definitions\n\n`;
|
|
139
|
+
md += `**${definitions.length} definition${definitions.length !== 1 ? 's' : ''}** found\n\n`;
|
|
140
|
+
const rows = definitions.map((d) => [
|
|
141
|
+
`${d.id || 'N/A'}`,
|
|
142
|
+
d.name || 'Unknown',
|
|
143
|
+
d.path || '\\',
|
|
144
|
+
d.type === 2 ? 'YAML' : d.type === 1 ? 'Designer' : `${d.type || '-'}`,
|
|
145
|
+
d.queueStatus === 0 ? 'Enabled' : d.queueStatus === 1 ? 'Paused' : d.queueStatus === 2 ? 'Disabled' : '-',
|
|
146
|
+
d.latestBuild ? `#${d.latestBuild.id} (${getBuildResultLabel(d.latestBuild.result)})` : '-',
|
|
147
|
+
]);
|
|
148
|
+
md += (0, formatHelpers_1.markdownTable)(['ID', 'Name', 'Path', 'Type', 'Status', 'Latest Build'], rows);
|
|
149
|
+
return (0, Common_1.formatMcpResponse)(definitions, md, false, true);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Get Definition ───────────────────────────────────────────────
|
|
156
|
+
async getDefinition(params) {
|
|
157
|
+
try {
|
|
158
|
+
const def = await this.buildService.getDefinition(params);
|
|
159
|
+
let md = `## Pipeline Definition #${def.id}\n\n`;
|
|
160
|
+
md += `| Property | Value |\n|---|---|\n`;
|
|
161
|
+
md += `| **Name** | ${def.name || 'Unknown'} |\n`;
|
|
162
|
+
md += `| **Path** | ${def.path || '\\'} |\n`;
|
|
163
|
+
md += `| **Type** | ${def.type === 2 ? 'YAML' : def.type === 1 ? 'Designer' : `${def.type || '-'}`} |\n`;
|
|
164
|
+
md += `| **Queue Status** | ${def.queueStatus === 0 ? 'Enabled' : def.queueStatus === 1 ? 'Paused' : 'Disabled'} |\n`;
|
|
165
|
+
md += `| **Default Branch** | \`${def.repository?.defaultBranch?.replace('refs/heads/', '') || '-'}\` |\n`;
|
|
166
|
+
md += `| **Repository** | ${def.repository?.name || '-'} |\n`;
|
|
167
|
+
if (def.process?.yamlFilename) {
|
|
168
|
+
md += `| **YAML File** | \`${def.process.yamlFilename}\` |\n`;
|
|
169
|
+
}
|
|
170
|
+
if (def.latestBuild) {
|
|
171
|
+
md += `\n### Latest Build\n`;
|
|
172
|
+
md += `| Property | Value |\n|---|---|\n`;
|
|
173
|
+
md += `| **Build #** | ${def.latestBuild.buildNumber || '-'} |\n`;
|
|
174
|
+
md += `| **Result** | ${getBuildResultEmoji(def.latestBuild.result)} ${getBuildResultLabel(def.latestBuild.result)} |\n`;
|
|
175
|
+
md += `| **Date** | ${def.latestBuild.finishTime ? (0, formatHelpers_1.formatFullDate)(def.latestBuild.finishTime) : '-'} |\n`;
|
|
176
|
+
}
|
|
177
|
+
return (0, Common_1.formatMcpResponse)(def, md, false, true);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// ── Run Pipeline ─────────────────────────────────────────────────
|
|
184
|
+
async runPipeline(params) {
|
|
185
|
+
try {
|
|
186
|
+
const build = await this.buildService.runPipeline(params);
|
|
187
|
+
let md = `## Pipeline Run Queued\n\n`;
|
|
188
|
+
md += `Build **#${build.id}** has been queued successfully.\n\n`;
|
|
189
|
+
md += `| Property | Value |\n|---|---|\n`;
|
|
190
|
+
md += `| **Build ID** | ${build.id} |\n`;
|
|
191
|
+
md += `| **Build Number** | ${build.buildNumber || 'Pending'} |\n`;
|
|
192
|
+
md += `| **Pipeline** | ${build.definition?.name || 'Unknown'} |\n`;
|
|
193
|
+
md += `| **Status** | ${getBuildStatusEmoji(build.status)} ${getBuildStatusLabel(build.status)} |\n`;
|
|
194
|
+
md += `| **Branch** | \`${build.sourceBranch?.replace('refs/heads/', '') || '-'}\` |\n`;
|
|
195
|
+
md += `| **Requested By** | ${build.requestedBy?.displayName || '-'} |\n`;
|
|
196
|
+
return (0, Common_1.formatMcpResponse)(build, md, false, true);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── List Build Artifacts ─────────────────────────────────────────
|
|
203
|
+
async getBuildArtifacts(params) {
|
|
204
|
+
try {
|
|
205
|
+
const artifacts = await this.buildService.getBuildArtifacts(params);
|
|
206
|
+
if (artifacts.length === 0) {
|
|
207
|
+
return (0, Common_1.formatMcpResponse)(artifacts, `## Build #${params.buildId} - Artifacts\n\nNo artifacts found.`);
|
|
208
|
+
}
|
|
209
|
+
let md = `## Build #${params.buildId} - Artifacts\n\n`;
|
|
210
|
+
md += `**${artifacts.length} artifact${artifacts.length !== 1 ? 's' : ''}**\n\n`;
|
|
211
|
+
const rows = artifacts.map((a) => [
|
|
212
|
+
`${a.id || 'N/A'}`,
|
|
213
|
+
a.name || 'Unknown',
|
|
214
|
+
a.resource?.type || '-',
|
|
215
|
+
a.resource?.url ? '[Download](' + a.resource.url + ')' : '-',
|
|
216
|
+
]);
|
|
217
|
+
md += (0, formatHelpers_1.markdownTable)(['ID', 'Name', 'Type', 'Link'], rows);
|
|
218
|
+
return (0, Common_1.formatMcpResponse)(artifacts, md, false, true);
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// ── Get Build Timeline ───────────────────────────────────────────
|
|
225
|
+
async getBuildTimeline(params) {
|
|
226
|
+
try {
|
|
227
|
+
const timeline = await this.buildService.getBuildTimeline(params);
|
|
228
|
+
const records = timeline?.records || [];
|
|
229
|
+
if (records.length === 0) {
|
|
230
|
+
return (0, Common_1.formatMcpResponse)(timeline, `## Build #${params.buildId} - Timeline\n\nNo timeline records found.`);
|
|
231
|
+
}
|
|
232
|
+
// Group by type: Stage > Job > Task
|
|
233
|
+
// Azure DevOps uses "Phase" for job-level and "Job" for the actual job record
|
|
234
|
+
const stages = records.filter((r) => r.type === 'Stage');
|
|
235
|
+
const phases = records.filter((r) => r.type === 'Phase');
|
|
236
|
+
const jobs = records.filter((r) => r.type === 'Job');
|
|
237
|
+
const tasks = records.filter((r) => r.type === 'Task');
|
|
238
|
+
let md = `## Build #${params.buildId} - Timeline\n\n`;
|
|
239
|
+
md += `**${stages.length} stage(s), ${phases.length + jobs.length} job(s), ${tasks.length} task(s)**\n\n`;
|
|
240
|
+
for (const stage of stages) {
|
|
241
|
+
md += `### ${getTimelineResultEmoji(stage.result)} Stage: ${stage.name || 'Unknown'}\n`;
|
|
242
|
+
md += `Status: ${formatTimelineState(stage.state)} | Result: ${formatTimelineResult(stage.result)} | Duration: ${formatDuration(stage.startTime, stage.finishTime)}\n\n`;
|
|
243
|
+
const stagePhases = phases.filter((p) => p.parentId === stage.id);
|
|
244
|
+
// If no phases, fall back to jobs directly under the stage
|
|
245
|
+
const stageJobs = stagePhases.length > 0 ? stagePhases : jobs.filter((j) => j.parentId === stage.id);
|
|
246
|
+
for (const job of stageJobs) {
|
|
247
|
+
md += `#### ${getTimelineResultEmoji(job.result)} Job: ${job.name || 'Unknown'}\n`;
|
|
248
|
+
md += `Status: ${formatTimelineState(job.state)} | Result: ${formatTimelineResult(job.result)} | Duration: ${formatDuration(job.startTime, job.finishTime)}\n\n`;
|
|
249
|
+
// Tasks may be under Job records (children of Phase), or directly under Phase
|
|
250
|
+
const childJobIds = jobs.filter((j) => j.parentId === job.id).map((j) => j.id);
|
|
251
|
+
const taskParentIds = childJobIds.length > 0 ? childJobIds : [job.id];
|
|
252
|
+
const jobTasks = tasks.filter((t) => taskParentIds.includes(t.parentId));
|
|
253
|
+
if (jobTasks.length > 0) {
|
|
254
|
+
const taskRows = jobTasks.map((t) => [
|
|
255
|
+
getTimelineResultEmoji(t.result),
|
|
256
|
+
(0, formatHelpers_1.truncateText)(t.name || 'Unknown', 40),
|
|
257
|
+
formatTimelineState(t.state),
|
|
258
|
+
formatTimelineResult(t.result),
|
|
259
|
+
formatDuration(t.startTime, t.finishTime),
|
|
260
|
+
]);
|
|
261
|
+
md += (0, formatHelpers_1.markdownTable)(['', 'Task', 'State', 'Result', 'Duration'], taskRows);
|
|
262
|
+
md += '\n\n';
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return (0, Common_1.formatMcpResponse)(timeline, md, false, true);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// ── Get Build Work Items ─────────────────────────────────────────
|
|
273
|
+
async getBuildWorkItems(params) {
|
|
274
|
+
try {
|
|
275
|
+
const workItems = await this.buildService.getBuildWorkItems(params);
|
|
276
|
+
if (workItems.length === 0) {
|
|
277
|
+
return (0, Common_1.formatMcpResponse)(workItems, `## Build #${params.buildId} - Work Items\n\nNo associated work items found.`);
|
|
278
|
+
}
|
|
279
|
+
let md = `## Build #${params.buildId} - Work Items\n\n`;
|
|
280
|
+
md += `**${workItems.length} work item${workItems.length !== 1 ? 's' : ''}**\n\n`;
|
|
281
|
+
const rows = workItems.map((wi) => [
|
|
282
|
+
`#${wi.id || 'N/A'}`,
|
|
283
|
+
wi.url ? `[View](${wi.url})` : '-',
|
|
284
|
+
]);
|
|
285
|
+
md += (0, formatHelpers_1.markdownTable)(['ID', 'Link'], rows);
|
|
286
|
+
return (0, Common_1.formatMcpResponse)(workItems, md, false, true);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
return (0, Common_1.formatErrorResponse)(error);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.BuildTools = BuildTools;
|
|
294
|
+
// ── Export tool method names ──────────────────────────────────────
|
|
295
|
+
exports.BuildToolMethods = (0, getClassMethods_1.default)(BuildTools);
|
|
296
|
+
// ── Helper Functions ─────────────────────────────────────────────
|
|
297
|
+
function getBuildStatusEmoji(status) {
|
|
298
|
+
switch (status) {
|
|
299
|
+
case 1: return '🔄'; // InProgress
|
|
300
|
+
case 2: return '✅'; // Completed
|
|
301
|
+
case 4: return '⏸️'; // Cancelling
|
|
302
|
+
case 8: return '⏳'; // Postponed
|
|
303
|
+
case 32: return '🆕'; // NotStarted
|
|
304
|
+
default: return '❓';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function getBuildStatusLabel(status) {
|
|
308
|
+
switch (status) {
|
|
309
|
+
case 1: return 'In Progress';
|
|
310
|
+
case 2: return 'Completed';
|
|
311
|
+
case 4: return 'Cancelling';
|
|
312
|
+
case 8: return 'Postponed';
|
|
313
|
+
case 32: return 'Not Started';
|
|
314
|
+
default: return 'None';
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function getBuildResultEmoji(result) {
|
|
318
|
+
switch (result) {
|
|
319
|
+
case 2: return '✅'; // Succeeded
|
|
320
|
+
case 4: return '⚠️'; // PartiallySucceeded
|
|
321
|
+
case 8: return '❌'; // Failed
|
|
322
|
+
case 32: return '🚫'; // Canceled
|
|
323
|
+
default: return '➖';
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function getBuildResultLabel(result) {
|
|
327
|
+
switch (result) {
|
|
328
|
+
case 2: return 'Succeeded';
|
|
329
|
+
case 4: return 'Partially Succeeded';
|
|
330
|
+
case 8: return 'Failed';
|
|
331
|
+
case 32: return 'Canceled';
|
|
332
|
+
default: return 'None';
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function getBuildReasonLabel(reason) {
|
|
336
|
+
switch (reason) {
|
|
337
|
+
case 1: return 'Manual';
|
|
338
|
+
case 2: return 'Individual CI';
|
|
339
|
+
case 4: return 'Batch CI';
|
|
340
|
+
case 8: return 'Schedule';
|
|
341
|
+
case 16: return 'Schedule Forced';
|
|
342
|
+
case 32: return 'User Created';
|
|
343
|
+
case 64: return 'Validate Shelveset';
|
|
344
|
+
case 128: return 'Check-in Shelveset';
|
|
345
|
+
case 256: return 'Pull Request';
|
|
346
|
+
case 512: return 'Build Completion';
|
|
347
|
+
case 1024: return 'Resource Trigger';
|
|
348
|
+
default: return `${reason || 'Unknown'}`;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function getTimelineResultEmoji(result) {
|
|
352
|
+
if (result === undefined || result === null)
|
|
353
|
+
return '🔄';
|
|
354
|
+
const r = typeof result === 'number' ? result : String(result).toLowerCase();
|
|
355
|
+
if (r === 0 || r === 'succeeded')
|
|
356
|
+
return '✅';
|
|
357
|
+
if (r === 1 || r === 'succeededwithissues')
|
|
358
|
+
return '⚠️';
|
|
359
|
+
if (r === 2 || r === 'failed')
|
|
360
|
+
return '❌';
|
|
361
|
+
if (r === 3 || r === 'canceled')
|
|
362
|
+
return '🚫';
|
|
363
|
+
if (r === 4 || r === 'skipped')
|
|
364
|
+
return '⏭️';
|
|
365
|
+
return '🔄';
|
|
366
|
+
}
|
|
367
|
+
function formatDuration(start, end) {
|
|
368
|
+
if (!start)
|
|
369
|
+
return '-';
|
|
370
|
+
const startTime = new Date(start).getTime();
|
|
371
|
+
const endTime = end ? new Date(end).getTime() : Date.now();
|
|
372
|
+
const diffMs = endTime - startTime;
|
|
373
|
+
if (diffMs < 0)
|
|
374
|
+
return '-';
|
|
375
|
+
if (diffMs < 1000)
|
|
376
|
+
return '<1s';
|
|
377
|
+
const seconds = Math.floor(diffMs / 1000);
|
|
378
|
+
const minutes = Math.floor(seconds / 60);
|
|
379
|
+
const hours = Math.floor(minutes / 60);
|
|
380
|
+
if (hours > 0)
|
|
381
|
+
return `${hours}h ${minutes % 60}m`;
|
|
382
|
+
if (minutes > 0)
|
|
383
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
384
|
+
return `${seconds}s`;
|
|
385
|
+
}
|
|
386
|
+
function formatTimelineState(state) {
|
|
387
|
+
if (state === undefined || state === null)
|
|
388
|
+
return '-';
|
|
389
|
+
const stateMap = { 0: 'Pending', 1: 'In Progress', 2: 'Completed' };
|
|
390
|
+
if (typeof state === 'number')
|
|
391
|
+
return stateMap[state] || `${state}`;
|
|
392
|
+
return String(state);
|
|
393
|
+
}
|
|
394
|
+
function formatTimelineResult(result) {
|
|
395
|
+
if (result === undefined || result === null)
|
|
396
|
+
return '-';
|
|
397
|
+
const resultMap = { 0: 'Succeeded', 1: 'Succeeded with Issues', 2: 'Failed', 3: 'Canceled', 4: 'Skipped', 5: 'Abandoned' };
|
|
398
|
+
if (typeof result === 'number')
|
|
399
|
+
return resultMap[result] || `${result}`;
|
|
400
|
+
return String(result);
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=BuildTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuildTools.js","sourceRoot":"","sources":["../../src/Tools/BuildTools.ts"],"names":[],"mappings":"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"}
|