@achieveai/azuredevops-mcp 1.3.18 → 1.3.19
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/README.md +76 -0
- package/dist/Interfaces/Common.js +28 -1
- package/dist/Interfaces/Common.js.map +1 -1
- package/dist/Services/BoardsSprintsService.js +6 -0
- package/dist/Services/BoardsSprintsService.js.map +1 -1
- package/dist/Services/BuildService.js +6 -0
- package/dist/Services/BuildService.js.map +1 -1
- package/dist/Services/WorkItemService.js +39 -67
- package/dist/Services/WorkItemService.js.map +1 -1
- package/dist/Tools/GitTools.js +177 -62
- package/dist/Tools/GitTools.js.map +1 -1
- package/dist/Tools/WorkItemTools.js +23 -122
- package/dist/Tools/WorkItemTools.js.map +1 -1
- package/dist/index.js +24 -29
- package/dist/index.js.map +1 -1
- package/dist/utils/apiUsageGuidance.js +336 -0
- package/dist/utils/apiUsageGuidance.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeWiql = analyzeWiql;
|
|
4
|
+
exports.buildListWorkItemsUsageProfile = buildListWorkItemsUsageProfile;
|
|
5
|
+
exports.buildRecentWorkItemsUsageProfile = buildRecentWorkItemsUsageProfile;
|
|
6
|
+
exports.buildMyWorkItemsUsageProfile = buildMyWorkItemsUsageProfile;
|
|
7
|
+
exports.buildSavedQueryUsageProfile = buildSavedQueryUsageProfile;
|
|
8
|
+
exports.buildBuildWorkItemsUsageProfile = buildBuildWorkItemsUsageProfile;
|
|
9
|
+
exports.buildSprintWorkItemsUsageProfile = buildSprintWorkItemsUsageProfile;
|
|
10
|
+
const RATE_LIMIT_HEADERS = [
|
|
11
|
+
'Retry-After',
|
|
12
|
+
'X-RateLimit-Limit',
|
|
13
|
+
'X-RateLimit-Remaining',
|
|
14
|
+
'X-RateLimit-Reset',
|
|
15
|
+
'X-RateLimit-Delay',
|
|
16
|
+
];
|
|
17
|
+
const TSTU_GUIDANCE = 'Azure DevOps does not expose a deterministic per-call TSTU formula. This server reports relative cost and estimated Azure DevOps API round-trips based on query shape, result volume, and requested fields.';
|
|
18
|
+
const QUERY_TEMPLATES = [
|
|
19
|
+
{
|
|
20
|
+
label: 'Recent active work by type and state',
|
|
21
|
+
rationale: 'Bound the query by work item type, state, and a recent changed-date window.',
|
|
22
|
+
query: `SELECT [System.Id]\nFROM WorkItems\nWHERE\n [System.TeamProject] = @project\n AND [System.WorkItemType] = 'Bug'\n AND [System.State] IN ('New', 'Active', 'Resolved')\n AND [System.ChangedDate] >= @Today - 30\nORDER BY [System.ChangedDate] DESC`,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: 'Area-scoped backlog slice',
|
|
26
|
+
rationale: 'Use UNDER on AreaPath instead of substring matching on titles or descriptions.',
|
|
27
|
+
query: `SELECT [System.Id]\nFROM WorkItems\nWHERE\n [System.TeamProject] = @project\n AND [System.AreaPath] UNDER 'Contoso\\Platform'\n AND [System.State] <> 'Closed'\n AND [System.ChangedDate] >= @Today - 14\nORDER BY [System.ChangedDate] DESC`,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: 'My current iteration work',
|
|
31
|
+
rationale: 'Use identity and iteration macros instead of free-text search.',
|
|
32
|
+
query: `SELECT [System.Id]\nFROM WorkItems\nWHERE\n [System.TeamProject] = @project\n AND [System.AssignedTo] = @Me\n AND [System.IterationPath] = @CurrentIteration('[Contoso]\\Web')\n AND [System.State] <> 'Closed'\nORDER BY [System.ChangedDate] DESC`,
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
function estimateHydrationCalls(resultCount) {
|
|
36
|
+
if (resultCount <= 0) {
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
return Math.ceil(resultCount / 200);
|
|
40
|
+
}
|
|
41
|
+
function chooseRelativeCost(score) {
|
|
42
|
+
if (score >= 5) {
|
|
43
|
+
return 'very-high';
|
|
44
|
+
}
|
|
45
|
+
if (score >= 3) {
|
|
46
|
+
return 'high';
|
|
47
|
+
}
|
|
48
|
+
if (score >= 1) {
|
|
49
|
+
return 'medium';
|
|
50
|
+
}
|
|
51
|
+
return 'low';
|
|
52
|
+
}
|
|
53
|
+
function buildCallBreakdown(firstCallLabel, resultCount) {
|
|
54
|
+
const hydrationCalls = estimateHydrationCalls(resultCount);
|
|
55
|
+
const breakdown = [`1 x ${firstCallLabel}`];
|
|
56
|
+
if (hydrationCalls > 0) {
|
|
57
|
+
breakdown.push(`${hydrationCalls} x getWorkItems batch hydrate for ${resultCount} ID${resultCount === 1 ? '' : 's'}`);
|
|
58
|
+
}
|
|
59
|
+
return breakdown;
|
|
60
|
+
}
|
|
61
|
+
function buildFieldPayloadNote(requestedFieldCount) {
|
|
62
|
+
return requestedFieldCount > 12
|
|
63
|
+
? `Large field list (${requestedFieldCount} fields) increases payload size.`
|
|
64
|
+
: `Field list is reasonably scoped at ${requestedFieldCount} field${requestedFieldCount === 1 ? '' : 's'}.`;
|
|
65
|
+
}
|
|
66
|
+
function analyzeWiql(query, top, requestedFieldCount) {
|
|
67
|
+
const usesContains = /\bcontains(?:\s+words)?\b/i.test(query);
|
|
68
|
+
const usesEver = /\bwas\s+ever\b|\bever\b/i.test(query);
|
|
69
|
+
const usesAsOf = /\basof\b/i.test(query);
|
|
70
|
+
const usesWorkItemLinks = /\bfrom\s+workitemlinks\b/i.test(query);
|
|
71
|
+
const hasProjectFilter = /\[System\.TeamProject\]\s*=\s*(?:@project|'|")/i.test(query);
|
|
72
|
+
const hasDateWindow = /(\[System\.(?:ChangedDate|CreatedDate)\]|\[Microsoft\.VSTS\.Common\.ClosedDate\]|@today|@startofday|@startofweek|@startofmonth|@startofyear)/i.test(query);
|
|
73
|
+
const hasAreaFilter = /\[System\.AreaPath\]\s+(?:=|under|not under|in|not in)/i.test(query);
|
|
74
|
+
const hasIterationFilter = /\[System\.IterationPath\]\s+(?:=|under|not under|in|not in)/i.test(query);
|
|
75
|
+
const hasAssignedFilter = /\[System\.AssignedTo\]/i.test(query);
|
|
76
|
+
const hasStateFilter = /\[System\.State\]/i.test(query);
|
|
77
|
+
const hasTypeFilter = /\[System\.WorkItemType\]/i.test(query);
|
|
78
|
+
const hasIdFilter = /\[System\.Id\]\s*(?:=|in|>|<|>=|<=)/i.test(query);
|
|
79
|
+
const narrowFilterCount = [
|
|
80
|
+
hasAreaFilter,
|
|
81
|
+
hasIterationFilter,
|
|
82
|
+
hasAssignedFilter,
|
|
83
|
+
hasStateFilter,
|
|
84
|
+
hasTypeFilter,
|
|
85
|
+
hasIdFilter,
|
|
86
|
+
hasDateWindow,
|
|
87
|
+
].filter(Boolean).length;
|
|
88
|
+
const riskFlags = [];
|
|
89
|
+
if (usesContains) {
|
|
90
|
+
riskFlags.push('Uses CONTAINS / CONTAINS WORDS substring matching, which is expensive for routine listing.');
|
|
91
|
+
}
|
|
92
|
+
if (usesEver) {
|
|
93
|
+
riskFlags.push('Uses EVER / WAS EVER, which scans revision history and can be significantly more expensive.');
|
|
94
|
+
}
|
|
95
|
+
if (usesAsOf) {
|
|
96
|
+
riskFlags.push('Uses ASOF historical evaluation, which is more complex than current-state queries.');
|
|
97
|
+
}
|
|
98
|
+
if (usesWorkItemLinks) {
|
|
99
|
+
riskFlags.push('Uses WorkItemLinks, which is typically more expensive than flat WorkItems queries.');
|
|
100
|
+
}
|
|
101
|
+
if (!hasDateWindow && !usesWorkItemLinks) {
|
|
102
|
+
riskFlags.push('No date window detected. Add ChangedDate or CreatedDate bounds for routine scans.');
|
|
103
|
+
}
|
|
104
|
+
if (narrowFilterCount < 2) {
|
|
105
|
+
riskFlags.push('Query may be broad. Add filters like type, state, assignee, area, iteration, or ID range.');
|
|
106
|
+
}
|
|
107
|
+
if (top > 100) {
|
|
108
|
+
riskFlags.push(`High top value (${top}) increases hydration and payload cost.`);
|
|
109
|
+
}
|
|
110
|
+
if (requestedFieldCount > 12) {
|
|
111
|
+
riskFlags.push(`Large field list (${requestedFieldCount}) increases payload size.`);
|
|
112
|
+
}
|
|
113
|
+
if (!hasProjectFilter) {
|
|
114
|
+
riskFlags.push('Missing explicit TeamProject filter. Keep queries project-bounded whenever possible.');
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
usesContains,
|
|
118
|
+
usesEver,
|
|
119
|
+
usesAsOf,
|
|
120
|
+
usesWorkItemLinks,
|
|
121
|
+
hasProjectFilter,
|
|
122
|
+
hasDateWindow,
|
|
123
|
+
hasAreaFilter,
|
|
124
|
+
hasIterationFilter,
|
|
125
|
+
hasAssignedFilter,
|
|
126
|
+
hasStateFilter,
|
|
127
|
+
hasTypeFilter,
|
|
128
|
+
requestedFieldCount,
|
|
129
|
+
top,
|
|
130
|
+
narrowFilterCount,
|
|
131
|
+
riskFlags,
|
|
132
|
+
bestPractices: [
|
|
133
|
+
'Always keep [System.TeamProject] = @project unless you intentionally need cross-project behavior.',
|
|
134
|
+
'Prefer =, IN, and UNDER filters over substring operators like CONTAINS.',
|
|
135
|
+
'Add a bounded ChangedDate or CreatedDate window using @Today or @StartOfMonth for routine listing.',
|
|
136
|
+
'Use AreaPath UNDER, IterationPath UNDER, @CurrentIteration, and @Me to express structure directly.',
|
|
137
|
+
'Return IDs first, then request only the fields you need in the batch hydration step.',
|
|
138
|
+
'Move repeatable team logic into saved queries and call getQueryResults when possible.',
|
|
139
|
+
],
|
|
140
|
+
avoidPatterns: [
|
|
141
|
+
'Avoid CONTAINS / CONTAINS WORDS for default work item listing.',
|
|
142
|
+
'Avoid EVER / WAS EVER unless you specifically need revision-history semantics.',
|
|
143
|
+
'Avoid large unbounded top values with no date window.',
|
|
144
|
+
'Avoid hydrating broad result sets with oversized field lists.',
|
|
145
|
+
],
|
|
146
|
+
recommendedAlternatives: [
|
|
147
|
+
'Use listWorkItems with exact filters when you know the fields to filter on.',
|
|
148
|
+
'Use getQueryResults when a saved query already exists in Azure DevOps.',
|
|
149
|
+
'Use getRecentlyUpdatedWorkItems or getMyWorkItems for common bounded slices.',
|
|
150
|
+
'Use getWorkItemsBatch after you already know the IDs you need.',
|
|
151
|
+
],
|
|
152
|
+
recommendedTemplates: QUERY_TEMPLATES,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function buildListWorkItemsUsageProfile(options) {
|
|
156
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
157
|
+
let score = 0;
|
|
158
|
+
if (options.queryAnalysis.usesContains)
|
|
159
|
+
score += 3;
|
|
160
|
+
if (options.queryAnalysis.usesEver || options.queryAnalysis.usesAsOf || options.queryAnalysis.usesWorkItemLinks)
|
|
161
|
+
score += 2;
|
|
162
|
+
if (!options.queryAnalysis.hasDateWindow)
|
|
163
|
+
score += 1;
|
|
164
|
+
if (estimatedAdoCalls > 2)
|
|
165
|
+
score += 1;
|
|
166
|
+
if (options.requestedFieldCount > 12)
|
|
167
|
+
score += 1;
|
|
168
|
+
if (options.queryAnalysis.narrowFilterCount < 2)
|
|
169
|
+
score += 1;
|
|
170
|
+
return {
|
|
171
|
+
toolName: 'listWorkItems',
|
|
172
|
+
relativeCost: chooseRelativeCost(score),
|
|
173
|
+
estimatedAdoCalls,
|
|
174
|
+
callBreakdown: buildCallBreakdown('queryByWiql', options.resultCount),
|
|
175
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
176
|
+
costDrivers: [
|
|
177
|
+
'WIQL breadth and selectivity',
|
|
178
|
+
'Returned ID count that must be hydrated',
|
|
179
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
180
|
+
],
|
|
181
|
+
bestFor: [
|
|
182
|
+
'Repeatable, structured work item discovery with exact filters.',
|
|
183
|
+
'Replacing free-text search when the caller knows type, state, assignee, area, iteration, or date bounds.',
|
|
184
|
+
],
|
|
185
|
+
bestPractices: options.queryAnalysis.bestPractices,
|
|
186
|
+
avoid: options.queryAnalysis.avoidPatterns,
|
|
187
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
188
|
+
recommendedAlternativeTools: ['getQueryResults', 'getRecentlyUpdatedWorkItems', 'getMyWorkItems', 'getWorkItemsBatch'],
|
|
189
|
+
queryAuthoring: options.queryAnalysis,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function buildRecentWorkItemsUsageProfile(options) {
|
|
193
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
194
|
+
const score = estimatedAdoCalls > 2 || options.requestedFieldCount > 12 ? 2 : 0;
|
|
195
|
+
return {
|
|
196
|
+
toolName: 'getRecentlyUpdatedWorkItems',
|
|
197
|
+
relativeCost: chooseRelativeCost(score),
|
|
198
|
+
estimatedAdoCalls,
|
|
199
|
+
callBreakdown: buildCallBreakdown('queryByWiql for recent changes', options.resultCount),
|
|
200
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
201
|
+
costDrivers: [
|
|
202
|
+
`ChangedDate window of ${options.days} day${options.days === 1 ? '' : 's'}`,
|
|
203
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
204
|
+
],
|
|
205
|
+
bestFor: [
|
|
206
|
+
'Cheap recent-change monitoring instead of a broad project scan.',
|
|
207
|
+
'Bootstrapping follow-up calls for a small set of recently changed IDs.',
|
|
208
|
+
],
|
|
209
|
+
bestPractices: [
|
|
210
|
+
'Keep the date window tight.',
|
|
211
|
+
'Keep top small for polling or frequent refreshes.',
|
|
212
|
+
'Use getWorkItemsBatch afterward if you need a richer field set for only a few IDs.',
|
|
213
|
+
],
|
|
214
|
+
avoid: [
|
|
215
|
+
'Avoid using this for historical reporting windows that should live in a saved query.',
|
|
216
|
+
'Avoid oversized field lists during frequent polling.',
|
|
217
|
+
],
|
|
218
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
219
|
+
recommendedAlternativeTools: ['listWorkItems', 'getQueryResults', 'getWorkItemsBatch'],
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function buildMyWorkItemsUsageProfile(options) {
|
|
223
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
224
|
+
const score = estimatedAdoCalls > 2 || options.requestedFieldCount > 12 ? 2 : 0;
|
|
225
|
+
return {
|
|
226
|
+
toolName: 'getMyWorkItems',
|
|
227
|
+
relativeCost: chooseRelativeCost(score),
|
|
228
|
+
estimatedAdoCalls,
|
|
229
|
+
callBreakdown: buildCallBreakdown('queryByWiql for @Me', options.resultCount),
|
|
230
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
231
|
+
costDrivers: [
|
|
232
|
+
`ChangedDate window of ${options.days} day${options.days === 1 ? '' : 's'}`,
|
|
233
|
+
options.state ? `State filter on ${options.state}` : 'No explicit state filter',
|
|
234
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
235
|
+
],
|
|
236
|
+
bestFor: [
|
|
237
|
+
'Assigned-to-me slices without inventing custom WIQL.',
|
|
238
|
+
'Personal work views with bounded freshness windows.',
|
|
239
|
+
],
|
|
240
|
+
bestPractices: [
|
|
241
|
+
'Add a state filter when possible.',
|
|
242
|
+
'Keep the day window focused on the current planning horizon.',
|
|
243
|
+
'Use getWorkItemsBatch or getWorkItemById only for the few IDs you actually need to inspect deeply.',
|
|
244
|
+
],
|
|
245
|
+
avoid: [
|
|
246
|
+
'Avoid using this as a substitute for cross-team reporting.',
|
|
247
|
+
'Avoid large top values for routine refreshes.',
|
|
248
|
+
],
|
|
249
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
250
|
+
recommendedAlternativeTools: ['listWorkItems', 'getQueryResults', 'getWorkItemsBatch'],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function buildSavedQueryUsageProfile(options) {
|
|
254
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
255
|
+
const score = estimatedAdoCalls > 2 || options.requestedFieldCount > 12 ? 2 : 0;
|
|
256
|
+
return {
|
|
257
|
+
toolName: 'getQueryResults',
|
|
258
|
+
relativeCost: chooseRelativeCost(score),
|
|
259
|
+
estimatedAdoCalls,
|
|
260
|
+
callBreakdown: buildCallBreakdown('queryById for saved WIQL', options.resultCount),
|
|
261
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
262
|
+
costDrivers: [
|
|
263
|
+
options.queryType ? `Saved query type: ${options.queryType}` : 'Saved query execution',
|
|
264
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
265
|
+
],
|
|
266
|
+
bestFor: [
|
|
267
|
+
'Repeatable team queries already curated in Azure DevOps.',
|
|
268
|
+
'Keeping LLM prompts out of the query-authoring path for stable reporting logic.',
|
|
269
|
+
],
|
|
270
|
+
bestPractices: [
|
|
271
|
+
'Prefer saved queries for recurring dashboards and team workflows.',
|
|
272
|
+
'Still request only the fields you need in hydration.',
|
|
273
|
+
'Keep saved query filters selective and bounded over time when possible.',
|
|
274
|
+
],
|
|
275
|
+
avoid: [
|
|
276
|
+
'Avoid hydrating excessive fields if the saved query is already broad.',
|
|
277
|
+
],
|
|
278
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
279
|
+
recommendedAlternativeTools: ['listWorkItems', 'getWorkItemsBatch'],
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function buildBuildWorkItemsUsageProfile(options) {
|
|
283
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
284
|
+
const score = estimatedAdoCalls > 2 || options.requestedFieldCount > 12 ? 2 : 1;
|
|
285
|
+
return {
|
|
286
|
+
toolName: 'getBuildWorkItems',
|
|
287
|
+
relativeCost: chooseRelativeCost(score),
|
|
288
|
+
estimatedAdoCalls,
|
|
289
|
+
callBreakdown: buildCallBreakdown('getBuildWorkItemsRefs', options.resultCount),
|
|
290
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
291
|
+
costDrivers: [
|
|
292
|
+
'Build-to-work-item association lookup',
|
|
293
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
294
|
+
],
|
|
295
|
+
bestFor: [
|
|
296
|
+
'Inspecting the work items tied to a single known build.',
|
|
297
|
+
],
|
|
298
|
+
bestPractices: [
|
|
299
|
+
'Call this only after you already know the build ID you care about.',
|
|
300
|
+
'Keep the field list narrow for build diagnostics workflows.',
|
|
301
|
+
],
|
|
302
|
+
avoid: [
|
|
303
|
+
'Avoid using this in loops over many builds without backoff or caching.',
|
|
304
|
+
],
|
|
305
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
306
|
+
recommendedAlternativeTools: ['getBuilds', 'getWorkItemsBatch'],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function buildSprintWorkItemsUsageProfile(options) {
|
|
310
|
+
const estimatedAdoCalls = 1 + estimateHydrationCalls(options.resultCount);
|
|
311
|
+
const score = estimatedAdoCalls > 2 || options.requestedFieldCount > 12 ? 2 : 1;
|
|
312
|
+
return {
|
|
313
|
+
toolName: 'getSprintWorkItems',
|
|
314
|
+
relativeCost: chooseRelativeCost(score),
|
|
315
|
+
estimatedAdoCalls,
|
|
316
|
+
callBreakdown: buildCallBreakdown('getIterationWorkItems', options.resultCount),
|
|
317
|
+
tstuGuidance: TSTU_GUIDANCE,
|
|
318
|
+
costDrivers: [
|
|
319
|
+
'Sprint backlog reference lookup',
|
|
320
|
+
buildFieldPayloadNote(options.requestedFieldCount),
|
|
321
|
+
],
|
|
322
|
+
bestFor: [
|
|
323
|
+
'Inspecting the items for one known sprint and team context.',
|
|
324
|
+
],
|
|
325
|
+
bestPractices: [
|
|
326
|
+
'Use this once you already know the sprint ID from getCurrentSprint or getSprints.',
|
|
327
|
+
'Keep the field list limited to planning columns you actually need.',
|
|
328
|
+
],
|
|
329
|
+
avoid: [
|
|
330
|
+
'Avoid repeatedly polling many sprint IDs in a tight loop.',
|
|
331
|
+
],
|
|
332
|
+
rateLimitHeadersToWatch: RATE_LIMIT_HEADERS,
|
|
333
|
+
recommendedAlternativeTools: ['getCurrentSprint', 'getSprints', 'getWorkItemsBatch'],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=apiUsageGuidance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiUsageGuidance.js","sourceRoot":"","sources":["../../src/utils/apiUsageGuidance.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@achieveai/azuredevops-mcp",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.19",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc",
|
|
@@ -56,4 +56,4 @@
|
|
|
56
56
|
"typescript": "^5.9.3",
|
|
57
57
|
"vitest": "^4.1.0"
|
|
58
58
|
}
|
|
59
|
-
}
|
|
59
|
+
}
|