@achieveai/azuredevops-mcp 1.3.15 → 1.3.17

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 (100) hide show
  1. package/dist/Services/AzureDevOpsService.js +4 -3
  2. package/dist/Services/AzureDevOpsService.js.map +1 -1
  3. package/dist/Services/BuildService.project.test.js +91 -0
  4. package/dist/Services/BuildService.project.test.js.map +1 -0
  5. package/dist/Services/GitService.js +101 -75
  6. package/dist/Services/GitService.js.map +1 -1
  7. package/dist/Services/GitService.project.test.js +407 -0
  8. package/dist/Services/GitService.project.test.js.map +1 -0
  9. package/dist/Services/WorkItemService.js +105 -25
  10. package/dist/Services/WorkItemService.js.map +1 -1
  11. package/dist/Tools/WorkItemTools.js +1 -1
  12. package/dist/Tools/WorkItemTools.js.map +1 -1
  13. package/dist/index.js +40 -18
  14. package/dist/index.js.map +1 -1
  15. package/dist/package.json +59 -0
  16. package/dist/src/Interfaces/AIAssisted.js +3 -0
  17. package/dist/src/Interfaces/AIAssisted.js.map +1 -0
  18. package/dist/src/Interfaces/ArtifactManagement.js +3 -0
  19. package/dist/src/Interfaces/ArtifactManagement.js.map +1 -0
  20. package/dist/src/Interfaces/AzureDevOps.js +3 -0
  21. package/dist/src/Interfaces/AzureDevOps.js.map +1 -0
  22. package/dist/src/Interfaces/BoardsAndSprints.js +3 -0
  23. package/dist/src/Interfaces/BoardsAndSprints.js.map +1 -0
  24. package/dist/src/Interfaces/CodeAndRepositories.js +3 -0
  25. package/dist/src/Interfaces/CodeAndRepositories.js.map +1 -0
  26. package/dist/src/Interfaces/Common.js +134 -0
  27. package/dist/src/Interfaces/Common.js.map +1 -0
  28. package/dist/src/Interfaces/CostResourceManagement.js +3 -0
  29. package/dist/src/Interfaces/CostResourceManagement.js.map +1 -0
  30. package/dist/src/Interfaces/DevSecOps.js +3 -0
  31. package/dist/src/Interfaces/DevSecOps.js.map +1 -0
  32. package/dist/src/Interfaces/ExternalIntegrations.js +3 -0
  33. package/dist/src/Interfaces/ExternalIntegrations.js.map +1 -0
  34. package/dist/src/Interfaces/HybridCrossPlatform.js +3 -0
  35. package/dist/src/Interfaces/HybridCrossPlatform.js.map +1 -0
  36. package/dist/src/Interfaces/Pipelines.js +3 -0
  37. package/dist/src/Interfaces/Pipelines.js.map +1 -0
  38. package/dist/src/Interfaces/ProjectManagement.js +3 -0
  39. package/dist/src/Interfaces/ProjectManagement.js.map +1 -0
  40. package/dist/src/Interfaces/TestingCapabilities.js +3 -0
  41. package/dist/src/Interfaces/TestingCapabilities.js.map +1 -0
  42. package/dist/src/Interfaces/Wiki.js +3 -0
  43. package/dist/src/Interfaces/Wiki.js.map +1 -0
  44. package/dist/src/Interfaces/WorkItems.js +3 -0
  45. package/dist/src/Interfaces/WorkItems.js.map +1 -0
  46. package/dist/src/Services/AIAssistedDevelopmentService.js +195 -0
  47. package/dist/src/Services/AIAssistedDevelopmentService.js.map +1 -0
  48. package/dist/src/Services/ArtifactManagementService.js +346 -0
  49. package/dist/src/Services/ArtifactManagementService.js.map +1 -0
  50. package/dist/src/Services/AzureDevOpsService.js +385 -0
  51. package/dist/src/Services/AzureDevOpsService.js.map +1 -0
  52. package/dist/src/Services/BoardsSprintsService.js +339 -0
  53. package/dist/src/Services/BoardsSprintsService.js.map +1 -0
  54. package/dist/src/Services/BuildService.js +405 -0
  55. package/dist/src/Services/BuildService.js.map +1 -0
  56. package/dist/src/Services/DevSecOpsService.js +307 -0
  57. package/dist/src/Services/DevSecOpsService.js.map +1 -0
  58. package/dist/src/Services/EntraAuthHandler.js +337 -0
  59. package/dist/src/Services/EntraAuthHandler.js.map +1 -0
  60. package/dist/src/Services/GitService.js +1595 -0
  61. package/dist/src/Services/GitService.js.map +1 -0
  62. package/dist/src/Services/ProjectService.js +257 -0
  63. package/dist/src/Services/ProjectService.js.map +1 -0
  64. package/dist/src/Services/TestingCapabilitiesService.js +149 -0
  65. package/dist/src/Services/TestingCapabilitiesService.js.map +1 -0
  66. package/dist/src/Services/WikiService.js +90 -0
  67. package/dist/src/Services/WikiService.js.map +1 -0
  68. package/dist/src/Services/WorkItemService.js +885 -0
  69. package/dist/src/Services/WorkItemService.js.map +1 -0
  70. package/dist/src/Tools/AIAssistedDevelopmentTools.js +137 -0
  71. package/dist/src/Tools/AIAssistedDevelopmentTools.js.map +1 -0
  72. package/dist/src/Tools/ArtifactManagementTools.js +140 -0
  73. package/dist/src/Tools/ArtifactManagementTools.js.map +1 -0
  74. package/dist/src/Tools/BoardsSprintsTools.js +338 -0
  75. package/dist/src/Tools/BoardsSprintsTools.js.map +1 -0
  76. package/dist/src/Tools/BuildTools.js +468 -0
  77. package/dist/src/Tools/BuildTools.js.map +1 -0
  78. package/dist/src/Tools/DevSecOpsTools.js +147 -0
  79. package/dist/src/Tools/DevSecOpsTools.js.map +1 -0
  80. package/dist/src/Tools/GitTools.js +1475 -0
  81. package/dist/src/Tools/GitTools.js.map +1 -0
  82. package/dist/src/Tools/ProjectTools.js +360 -0
  83. package/dist/src/Tools/ProjectTools.js.map +1 -0
  84. package/dist/src/Tools/TestingCapabilitiesTools.js +157 -0
  85. package/dist/src/Tools/TestingCapabilitiesTools.js.map +1 -0
  86. package/dist/src/Tools/WikiTools.js +137 -0
  87. package/dist/src/Tools/WikiTools.js.map +1 -0
  88. package/dist/src/Tools/WorkItemTools.js +862 -0
  89. package/dist/src/Tools/WorkItemTools.js.map +1 -0
  90. package/dist/src/config.js +176 -0
  91. package/dist/src/config.js.map +1 -0
  92. package/dist/src/index.js +1716 -0
  93. package/dist/src/index.js.map +1 -0
  94. package/dist/src/utils/formatHelpers.js +257 -0
  95. package/dist/src/utils/formatHelpers.js.map +1 -0
  96. package/dist/src/utils/getClassMethods.js +8 -0
  97. package/dist/src/utils/getClassMethods.js.map +1 -0
  98. package/dist/src/utils/repositoryResolver.js +40 -0
  99. package/dist/src/utils/repositoryResolver.js.map +1 -0
  100. package/package.json +5 -3
@@ -0,0 +1,407 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Tests that the `project` parameter is correctly propagated from service method
5
+ * params to the underlying Azure DevOps API calls, instead of always using
6
+ * the default config project.
7
+ *
8
+ * This was the root cause of project override not working for threads/comments
9
+ * while it worked for build APIs.
10
+ */
11
+ const vitest_1 = require("vitest");
12
+ // ── Mock the azure-devops-node-api module ────────────────────────────
13
+ const mockGetThreads = vitest_1.vi.fn().mockResolvedValue([]);
14
+ const mockGetPullRequestThread = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
15
+ const mockCreateThread = vitest_1.vi.fn().mockResolvedValue({ id: 1, comments: [] });
16
+ const mockCreateComment = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
17
+ const mockUpdateThread = vitest_1.vi.fn().mockResolvedValue({ id: 1 });
18
+ const mockGetPullRequests = vitest_1.vi.fn().mockResolvedValue([]);
19
+ const mockGetPullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
20
+ const mockCreatePullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 99 });
21
+ const mockUpdatePullRequest = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
22
+ const mockCreatePullRequestReviewer = vitest_1.vi.fn().mockResolvedValue({});
23
+ const mockDeletePullRequestReviewer = vitest_1.vi.fn().mockResolvedValue(undefined);
24
+ const mockGetPullRequestWorkItemRefs = vitest_1.vi.fn().mockResolvedValue([]);
25
+ const mockGetPullRequestIterations = vitest_1.vi.fn().mockResolvedValue([{ id: 1 }]);
26
+ const mockGetPullRequestIterationChanges = vitest_1.vi.fn().mockResolvedValue({ changeEntries: [] });
27
+ const mockGetBranches = vitest_1.vi.fn().mockResolvedValue([{ name: 'main', commit: { commitId: 'abc123' } }]);
28
+ const mockUpdateRefs = vitest_1.vi.fn().mockResolvedValue([{ name: 'refs/heads/new-branch' }]);
29
+ const REPO_GUID = 'c5e7435f-113e-4328-9d8a-726f094bfa95';
30
+ const mockGetRepository = vitest_1.vi.fn().mockResolvedValue({ id: REPO_GUID, name: 'MyRepo' });
31
+ const mockGetRepositories = vitest_1.vi.fn().mockResolvedValue([{ id: REPO_GUID, name: 'MyRepo' }]);
32
+ const mockConnect = vitest_1.vi.fn().mockResolvedValue({ authenticatedUser: { id: 'user-123' } });
33
+ const mockGetWorkItems = vitest_1.vi.fn().mockResolvedValue([]);
34
+ const mockGetItems = vitest_1.vi.fn().mockResolvedValue([]);
35
+ const mockGetItemContent = vitest_1.vi.fn().mockResolvedValue(Buffer.from('file content'));
36
+ const mockGetBlobContent = vitest_1.vi.fn().mockResolvedValue(Buffer.from('blob content'));
37
+ const mockGetPullRequestById = vitest_1.vi.fn().mockResolvedValue({ pullRequestId: 42 });
38
+ const mockGetCommits = vitest_1.vi.fn().mockResolvedValue([]);
39
+ const mockGitApi = {
40
+ getThreads: mockGetThreads,
41
+ getPullRequestThread: mockGetPullRequestThread,
42
+ createThread: mockCreateThread,
43
+ createComment: mockCreateComment,
44
+ updateThread: mockUpdateThread,
45
+ getPullRequests: mockGetPullRequests,
46
+ getPullRequest: mockGetPullRequest,
47
+ createPullRequest: mockCreatePullRequest,
48
+ updatePullRequest: mockUpdatePullRequest,
49
+ createPullRequestReviewer: mockCreatePullRequestReviewer,
50
+ deletePullRequestReviewer: mockDeletePullRequestReviewer,
51
+ getPullRequestWorkItemRefs: mockGetPullRequestWorkItemRefs,
52
+ getPullRequestIterations: mockGetPullRequestIterations,
53
+ getPullRequestIterationChanges: mockGetPullRequestIterationChanges,
54
+ getBranches: mockGetBranches,
55
+ updateRefs: mockUpdateRefs,
56
+ getRepository: mockGetRepository,
57
+ getRepositories: mockGetRepositories,
58
+ getItems: mockGetItems,
59
+ getItemContent: mockGetItemContent,
60
+ getBlobContent: mockGetBlobContent,
61
+ getPullRequestById: mockGetPullRequestById,
62
+ getCommits: mockGetCommits,
63
+ };
64
+ const mockWorkItemTrackingApi = {
65
+ getWorkItems: mockGetWorkItems,
66
+ };
67
+ vitest_1.vi.mock('azure-devops-node-api', () => {
68
+ class MockWebApi {
69
+ constructor() {
70
+ this.getGitApi = vitest_1.vi.fn().mockResolvedValue(mockGitApi);
71
+ this.getWorkItemTrackingApi = vitest_1.vi.fn().mockResolvedValue(mockWorkItemTrackingApi);
72
+ this.getPolicyApi = vitest_1.vi.fn().mockResolvedValue({ getPolicyEvaluations: vitest_1.vi.fn().mockResolvedValue([]) });
73
+ this.getCoreApi = vitest_1.vi.fn().mockResolvedValue({ getProject: vitest_1.vi.fn().mockResolvedValue({ id: 'proj-guid' }) });
74
+ this.connect = mockConnect;
75
+ }
76
+ }
77
+ return {
78
+ WebApi: MockWebApi,
79
+ getPersonalAccessTokenHandler: vitest_1.vi.fn().mockReturnValue({}),
80
+ };
81
+ });
82
+ // Import after mocking
83
+ const GitService_1 = require("./GitService");
84
+ const DEFAULT_PROJECT = 'DefaultProject';
85
+ const OVERRIDE_PROJECT = 'OverrideProject';
86
+ function createService() {
87
+ return new GitService_1.GitService({
88
+ orgUrl: 'https://dev.azure.com/test',
89
+ project: DEFAULT_PROJECT,
90
+ personalAccessToken: 'fake-pat',
91
+ });
92
+ }
93
+ (0, vitest_1.describe)('GitService project parameter propagation', () => {
94
+ let service;
95
+ (0, vitest_1.beforeEach)(() => {
96
+ vitest_1.vi.clearAllMocks();
97
+ service = createService();
98
+ });
99
+ // ── getPullRequestComments ──────────────────────────────────────
100
+ (0, vitest_1.describe)('getPullRequestComments', () => {
101
+ (0, vitest_1.it)('uses config.project by default', async () => {
102
+ await service.getPullRequestComments({
103
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
104
+ pullRequestId: 42,
105
+ });
106
+ (0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, DEFAULT_PROJECT);
107
+ });
108
+ (0, vitest_1.it)('uses override project when provided', async () => {
109
+ await service.getPullRequestComments({
110
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
111
+ pullRequestId: 42,
112
+ project: OVERRIDE_PROJECT,
113
+ });
114
+ (0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
115
+ });
116
+ (0, vitest_1.it)('uses override project for single thread retrieval', async () => {
117
+ await service.getPullRequestComments({
118
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
119
+ pullRequestId: 42,
120
+ threadId: 7,
121
+ project: OVERRIDE_PROJECT,
122
+ });
123
+ (0, vitest_1.expect)(mockGetPullRequestThread).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
124
+ });
125
+ });
126
+ // ── addPullRequestComment ──────────────────────────────────────
127
+ (0, vitest_1.describe)('addPullRequestComment', () => {
128
+ (0, vitest_1.it)('uses config.project by default', async () => {
129
+ await service.addPullRequestComment({
130
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
131
+ pullRequestId: 42,
132
+ comment: 'LGTM',
133
+ });
134
+ (0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, DEFAULT_PROJECT);
135
+ });
136
+ (0, vitest_1.it)('uses override project when provided', async () => {
137
+ await service.addPullRequestComment({
138
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
139
+ pullRequestId: 42,
140
+ comment: 'LGTM',
141
+ project: OVERRIDE_PROJECT,
142
+ });
143
+ (0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
144
+ });
145
+ });
146
+ // ── addPullRequestFileComment ──────────────────────────────────
147
+ (0, vitest_1.describe)('addPullRequestFileComment', () => {
148
+ (0, vitest_1.it)('uses override project when provided', async () => {
149
+ await service.addPullRequestFileComment({
150
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
151
+ pullRequestId: 42,
152
+ path: '/src/foo.ts',
153
+ comment: 'This file needs tests',
154
+ project: OVERRIDE_PROJECT,
155
+ });
156
+ (0, vitest_1.expect)(mockCreateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
157
+ });
158
+ });
159
+ // ── replyToComment ─────────────────────────────────────────────
160
+ (0, vitest_1.describe)('replyToComment', () => {
161
+ (0, vitest_1.it)('uses config.project by default', async () => {
162
+ await service.replyToComment({
163
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
164
+ pullRequestId: 42,
165
+ threadId: 7,
166
+ comment: 'Fixed',
167
+ });
168
+ (0, vitest_1.expect)(mockCreateComment).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, DEFAULT_PROJECT);
169
+ });
170
+ (0, vitest_1.it)('uses override project when provided', async () => {
171
+ await service.replyToComment({
172
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
173
+ pullRequestId: 42,
174
+ threadId: 7,
175
+ comment: 'Fixed',
176
+ project: OVERRIDE_PROJECT,
177
+ });
178
+ (0, vitest_1.expect)(mockCreateComment).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
179
+ });
180
+ });
181
+ // ── updatePullRequestThread ────────────────────────────────────
182
+ (0, vitest_1.describe)('updatePullRequestThread', () => {
183
+ (0, vitest_1.it)('uses config.project by default', async () => {
184
+ await service.updatePullRequestThread({
185
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
186
+ pullRequestId: 42,
187
+ threadId: 7,
188
+ status: 'fixed',
189
+ });
190
+ (0, vitest_1.expect)(mockUpdateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, DEFAULT_PROJECT);
191
+ });
192
+ (0, vitest_1.it)('uses override project when provided', async () => {
193
+ await service.updatePullRequestThread({
194
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
195
+ pullRequestId: 42,
196
+ threadId: 7,
197
+ status: 'closed',
198
+ project: OVERRIDE_PROJECT,
199
+ });
200
+ (0, vitest_1.expect)(mockUpdateThread).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 7, OVERRIDE_PROJECT);
201
+ });
202
+ });
203
+ // ── getPullRequests ────────────────────────────────────────────
204
+ (0, vitest_1.describe)('getPullRequests', () => {
205
+ (0, vitest_1.it)('uses override project when provided', async () => {
206
+ await service.getPullRequests({
207
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
208
+ project: OVERRIDE_PROJECT,
209
+ });
210
+ (0, vitest_1.expect)(mockGetPullRequests).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', vitest_1.expect.any(Object), OVERRIDE_PROJECT, undefined, 0, 50);
211
+ });
212
+ });
213
+ // ── createPullRequest ──────────────────────────────────────────
214
+ (0, vitest_1.describe)('createPullRequest', () => {
215
+ (0, vitest_1.it)('uses override project when provided', async () => {
216
+ await service.createPullRequest({
217
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
218
+ sourceRefName: 'refs/heads/feature',
219
+ targetRefName: 'refs/heads/main',
220
+ title: 'My PR',
221
+ project: OVERRIDE_PROJECT,
222
+ });
223
+ (0, vitest_1.expect)(mockCreatePullRequest).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
224
+ });
225
+ });
226
+ // ── getPullRequest ─────────────────────────────────────────────
227
+ (0, vitest_1.describe)('getPullRequest', () => {
228
+ (0, vitest_1.it)('uses override project when provided', async () => {
229
+ await service.getPullRequest({
230
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
231
+ pullRequestId: 42,
232
+ project: OVERRIDE_PROJECT,
233
+ });
234
+ (0, vitest_1.expect)(mockGetPullRequest).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
235
+ });
236
+ });
237
+ // ── approvePullRequest ─────────────────────────────────────────
238
+ (0, vitest_1.describe)('approvePullRequest', () => {
239
+ (0, vitest_1.it)('uses override project when provided', async () => {
240
+ await service.approvePullRequest({
241
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
242
+ pullRequestId: 42,
243
+ project: OVERRIDE_PROJECT,
244
+ });
245
+ (0, vitest_1.expect)(mockCreatePullRequestReviewer).toHaveBeenCalledWith({ vote: 10 }, 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-123', OVERRIDE_PROJECT);
246
+ });
247
+ });
248
+ // ── mergePullRequest ───────────────────────────────────────────
249
+ (0, vitest_1.describe)('mergePullRequest', () => {
250
+ (0, vitest_1.it)('uses override project when provided', async () => {
251
+ await service.mergePullRequest({
252
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
253
+ pullRequestId: 42,
254
+ project: OVERRIDE_PROJECT,
255
+ });
256
+ (0, vitest_1.expect)(mockUpdatePullRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ status: 3 }), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
257
+ });
258
+ });
259
+ // ── updatePullRequest ──────────────────────────────────────────
260
+ (0, vitest_1.describe)('updatePullRequest', () => {
261
+ (0, vitest_1.it)('uses override project when provided', async () => {
262
+ await service.updatePullRequest({
263
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
264
+ pullRequestId: 42,
265
+ title: 'New Title',
266
+ project: OVERRIDE_PROJECT,
267
+ });
268
+ (0, vitest_1.expect)(mockUpdatePullRequest).toHaveBeenCalledWith(vitest_1.expect.objectContaining({ title: 'New Title' }), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, OVERRIDE_PROJECT);
269
+ });
270
+ });
271
+ // ── updatePullRequestReviewers ─────────────────────────────────
272
+ (0, vitest_1.describe)('updatePullRequestReviewers', () => {
273
+ (0, vitest_1.it)('uses override project for adding reviewers', async () => {
274
+ await service.updatePullRequestReviewers({
275
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
276
+ pullRequestId: 42,
277
+ reviewersToAdd: ['user-abc'],
278
+ project: OVERRIDE_PROJECT,
279
+ });
280
+ (0, vitest_1.expect)(mockCreatePullRequestReviewer).toHaveBeenCalledWith(vitest_1.expect.any(Object), 'c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-abc', OVERRIDE_PROJECT);
281
+ });
282
+ (0, vitest_1.it)('uses override project for removing reviewers', async () => {
283
+ await service.updatePullRequestReviewers({
284
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
285
+ pullRequestId: 42,
286
+ reviewersToRemove: ['user-xyz'],
287
+ project: OVERRIDE_PROJECT,
288
+ });
289
+ (0, vitest_1.expect)(mockDeletePullRequestReviewer).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', 42, 'user-xyz', OVERRIDE_PROJECT);
290
+ });
291
+ });
292
+ // ── createBranch ───────────────────────────────────────────────
293
+ (0, vitest_1.describe)('createBranch', () => {
294
+ (0, vitest_1.it)('uses override project when provided', async () => {
295
+ await service.createBranch({
296
+ repository: 'c5e7435f-113e-4328-9d8a-726f094bfa95',
297
+ branchName: 'feature/new',
298
+ sourceRef: 'main',
299
+ project: OVERRIDE_PROJECT,
300
+ });
301
+ (0, vitest_1.expect)(mockGetBranches).toHaveBeenCalledWith('c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
302
+ (0, vitest_1.expect)(mockUpdateRefs).toHaveBeenCalledWith(vitest_1.expect.any(Array), 'c5e7435f-113e-4328-9d8a-726f094bfa95', OVERRIDE_PROJECT);
303
+ });
304
+ });
305
+ // ── browseRepository ─────────────────────────────────────────
306
+ (0, vitest_1.describe)('browseRepository', () => {
307
+ (0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
308
+ await service.browseRepository({
309
+ repository: 'MyRepo',
310
+ project: OVERRIDE_PROJECT,
311
+ });
312
+ (0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
313
+ });
314
+ });
315
+ // ── getFileContent ──────────────────────────────────────────
316
+ (0, vitest_1.describe)('getFileContent', () => {
317
+ (0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
318
+ await service.getFileContent({
319
+ repository: 'MyRepo',
320
+ path: '/src/index.ts',
321
+ project: OVERRIDE_PROJECT,
322
+ });
323
+ (0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
324
+ });
325
+ });
326
+ // ── getCommitHistory ────────────────────────────────────────
327
+ (0, vitest_1.describe)('getCommitHistory', () => {
328
+ (0, vitest_1.it)('uses projectId for resolveRepositoryId and API call', async () => {
329
+ await service.getCommitHistory({
330
+ repository: 'MyRepo',
331
+ projectId: OVERRIDE_PROJECT,
332
+ });
333
+ (0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
334
+ (0, vitest_1.expect)(mockGetCommits).toHaveBeenCalledWith(REPO_GUID, vitest_1.expect.any(Object), OVERRIDE_PROJECT);
335
+ });
336
+ });
337
+ // ── getPullRequestWorkItemRefs ──────────────────────────────
338
+ (0, vitest_1.describe)('getPullRequestWorkItemRefs', () => {
339
+ (0, vitest_1.it)('uses override project when provided', async () => {
340
+ await service.getPullRequestWorkItemRefs(REPO_GUID, 42, OVERRIDE_PROJECT);
341
+ (0, vitest_1.expect)(mockGetPullRequestWorkItemRefs).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
342
+ });
343
+ (0, vitest_1.it)('uses config.project by default', async () => {
344
+ await service.getPullRequestWorkItemRefs(REPO_GUID, 42);
345
+ (0, vitest_1.expect)(mockGetPullRequestWorkItemRefs).toHaveBeenCalledWith(REPO_GUID, 42, DEFAULT_PROJECT);
346
+ });
347
+ });
348
+ // ── getPolicyEvaluations ────────────────────────────────────
349
+ (0, vitest_1.describe)('getPolicyEvaluations', () => {
350
+ (0, vitest_1.it)('uses override project when provided', async () => {
351
+ const mockGetPolicyEvaluations = vitest_1.vi.fn().mockResolvedValue([]);
352
+ const mockGetProject = vitest_1.vi.fn().mockResolvedValue({ id: 'proj-guid' });
353
+ // Access the mock to set up the policy and core APIs
354
+ const policyApi = await service.connection.getPolicyApi();
355
+ policyApi.getPolicyEvaluations = mockGetPolicyEvaluations;
356
+ const coreApi = await service.connection.getCoreApi();
357
+ coreApi.getProject = mockGetProject;
358
+ await service.getPolicyEvaluations(REPO_GUID, 42, OVERRIDE_PROJECT);
359
+ (0, vitest_1.expect)(mockGetProject).toHaveBeenCalledWith(OVERRIDE_PROJECT);
360
+ (0, vitest_1.expect)(mockGetPolicyEvaluations).toHaveBeenCalledWith(OVERRIDE_PROJECT, vitest_1.expect.stringContaining('proj-guid'));
361
+ });
362
+ });
363
+ // ── completePullRequest ─────────────────────────────────────
364
+ (0, vitest_1.describe)('completePullRequest', () => {
365
+ (0, vitest_1.it)('uses override project for resolveRepositoryId', async () => {
366
+ await service.completePullRequest({
367
+ repository: 'MyRepo',
368
+ pullRequestId: 42,
369
+ status: 'completed',
370
+ mergeStrategy: 'squash',
371
+ project: OVERRIDE_PROJECT,
372
+ });
373
+ (0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
374
+ });
375
+ });
376
+ // ── getPullRequestChangesCount ──────────────────────────────
377
+ (0, vitest_1.describe)('getPullRequestChangesCount', () => {
378
+ (0, vitest_1.it)('passes project through to getLatestPullRequestIteration', async () => {
379
+ await service.getPullRequestChangesCount({
380
+ repository: REPO_GUID,
381
+ pullRequestId: 42,
382
+ project: OVERRIDE_PROJECT,
383
+ });
384
+ // getLatestPullRequestIteration calls getPullRequestIterations with project
385
+ (0, vitest_1.expect)(mockGetPullRequestIterations).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
386
+ // getPullRequestIterationChanges also uses project
387
+ (0, vitest_1.expect)(mockGetPullRequestIterationChanges).toHaveBeenCalledWith(REPO_GUID, 42, 1, OVERRIDE_PROJECT);
388
+ });
389
+ });
390
+ // ── resolveRepositoryId with project override ──────────────────
391
+ (0, vitest_1.describe)('resolveRepositoryId with project override', () => {
392
+ (0, vitest_1.it)('passes project to listRepositories when resolving repo name', async () => {
393
+ // Use a repository name (not a GUID) to trigger resolution
394
+ await service.getPullRequestComments({
395
+ repository: 'MyRepo',
396
+ pullRequestId: 42,
397
+ project: OVERRIDE_PROJECT,
398
+ });
399
+ // resolveRepositoryId calls listRepositories which calls getRepositories
400
+ // The first arg should be the override project
401
+ (0, vitest_1.expect)(mockGetRepositories).toHaveBeenCalledWith(OVERRIDE_PROJECT, undefined, undefined);
402
+ // And the resolved GUID should be used for getThreads
403
+ (0, vitest_1.expect)(mockGetThreads).toHaveBeenCalledWith(REPO_GUID, 42, OVERRIDE_PROJECT);
404
+ });
405
+ });
406
+ });
407
+ //# sourceMappingURL=GitService.project.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitService.project.test.js","sourceRoot":"","sources":["../../src/Services/GitService.project.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,43 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.WorkItemService = void 0;
4
37
  const WorkItemTrackingInterfaces_1 = require("azure-devops-node-api/interfaces/WorkItemTrackingInterfaces");
5
38
  const VSSInterfaces_1 = require("azure-devops-node-api/interfaces/common/VSSInterfaces");
6
39
  const AzureDevOpsService_1 = require("./AzureDevOpsService");
40
+ const crypto = __importStar(require("crypto"));
7
41
  const formatHelpers_1 = require("../utils/formatHelpers");
8
42
  /** Rich-text fields that expect HTML — markdown is auto-converted for these */
9
43
  const RICH_TEXT_FIELDS = new Set([
@@ -16,15 +50,49 @@ const RICH_TEXT_FIELDS = new Set([
16
50
  class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
17
51
  constructor(config) {
18
52
  super(config);
53
+ this.wiqlCache = new Map();
54
+ this.CACHE_TTL_MS = 60000; // 60 seconds
55
+ }
56
+ /**
57
+ * Get a cached WIQL result or undefined if not found / expired.
58
+ */
59
+ getCachedWiql(cacheKey) {
60
+ const entry = this.wiqlCache.get(cacheKey);
61
+ if (entry && Date.now() - entry.timestamp < this.CACHE_TTL_MS) {
62
+ return entry.result;
63
+ }
64
+ if (entry) {
65
+ this.wiqlCache.delete(cacheKey);
66
+ }
67
+ return undefined;
68
+ }
69
+ /**
70
+ * Store a WIQL result in the cache.
71
+ */
72
+ setCachedWiql(cacheKey, result) {
73
+ this.wiqlCache.set(cacheKey, { result, timestamp: Date.now() });
74
+ }
75
+ /**
76
+ * Build a cache key from the query string and project.
77
+ */
78
+ buildWiqlCacheKey(query, top) {
79
+ const hash = crypto.createHash('md5').update(query).digest('hex');
80
+ return `${this.config.project}:${hash}:${top ?? 'none'}`;
19
81
  }
20
82
  /**
21
83
  * Query work items using WIQL
22
84
  */
23
- async listWorkItems(wiqlQuery) {
85
+ async listWorkItems(wiqlQuery, top) {
24
86
  try {
87
+ const serverTop = top ?? 200;
88
+ const cacheKey = this.buildWiqlCacheKey(wiqlQuery, serverTop);
89
+ const cached = this.getCachedWiql(cacheKey);
90
+ if (cached)
91
+ return cached;
25
92
  const witApi = await this.getWorkItemTrackingApi();
26
- // Execute the WIQL query
27
- const queryResult = await this.withAuthRetry(() => witApi.queryByWiql({ query: wiqlQuery }, { project: this.config.project }));
93
+ // Execute the WIQL query with server-side top limit
94
+ const queryResult = await this.withAuthRetry(() => witApi.queryByWiql({ query: wiqlQuery }, { project: this.config.project }, undefined, serverTop));
95
+ this.setCachedWiql(cacheKey, queryResult);
28
96
  return queryResult;
29
97
  }
30
98
  catch (error) {
@@ -215,23 +283,27 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
215
283
  async searchWorkItems(params) {
216
284
  try {
217
285
  const witApi = await this.getWorkItemTrackingApi();
218
- const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
219
- FROM WorkItems
220
- WHERE [System.TeamProject] = @project
286
+ const serverTop = params.top || 50;
287
+ const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
288
+ FROM WorkItems
289
+ WHERE [System.TeamProject] = @project
221
290
  AND (
222
291
  [System.Title] CONTAINS '${params.searchText}'
223
292
  OR [System.Description] CONTAINS '${params.searchText}'
224
293
  )
225
294
  ORDER BY [System.CreatedDate] DESC`;
226
- const queryResult = await witApi.queryByWiql({
295
+ const cacheKey = this.buildWiqlCacheKey(query, serverTop);
296
+ const cached = this.getCachedWiql(cacheKey);
297
+ const queryResult = cached ?? await witApi.queryByWiql({
227
298
  query
228
299
  }, {
229
300
  project: this.config.project
230
- });
301
+ }, undefined, serverTop);
302
+ if (!cached)
303
+ this.setCachedWiql(cacheKey, queryResult);
231
304
  // Get full work item details if we have results
232
305
  if (queryResult.workItems && queryResult.workItems.length > 0) {
233
306
  const workItemIds = queryResult.workItems
234
- .slice(0, params.top || 50) // Limit results to avoid too many API calls
235
307
  .map((wi) => wi.id);
236
308
  // Fetch detailed work item information
237
309
  const detailedWorkItems = await witApi.getWorkItems(workItemIds, [
@@ -298,17 +370,24 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
298
370
  async getRecentWorkItems(params) {
299
371
  try {
300
372
  const witApi = await this.getWorkItemTrackingApi();
301
- const query = `SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate]
302
- FROM WorkItems
303
- WHERE [System.TeamProject] = @project
373
+ const days = params.days || 30;
374
+ const top = params.top || 10;
375
+ const skip = params.skip || 0;
376
+ const serverTop = skip + top; // fetch enough to cover the pagination window
377
+ const query = `SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate]
378
+ FROM WorkItems
379
+ WHERE [System.TeamProject] = @project
380
+ AND [System.ChangedDate] >= @today - ${days}
304
381
  ORDER BY [System.ChangedDate] DESC`;
305
- const queryResult = await witApi.queryByWiql({
382
+ const cacheKey = this.buildWiqlCacheKey(query, serverTop);
383
+ const cached = this.getCachedWiql(cacheKey);
384
+ const queryResult = cached ?? await witApi.queryByWiql({
306
385
  query
307
386
  }, {
308
387
  project: this.config.project
309
- });
310
- const top = params.top || 10;
311
- const skip = params.skip || 0;
388
+ }, undefined, serverTop);
389
+ if (!cached)
390
+ this.setCachedWiql(cacheKey, queryResult);
312
391
  if (queryResult.workItems) {
313
392
  queryResult.workItems = queryResult.workItems.slice(skip, skip + top);
314
393
  }
@@ -329,21 +408,22 @@ class WorkItemService extends AzureDevOpsService_1.AzureDevOpsService {
329
408
  if (params.state) {
330
409
  stateCondition = `AND [System.State] = '${params.state}'`;
331
410
  }
332
- const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
333
- FROM WorkItems
334
- WHERE [System.TeamProject] = @project
411
+ const serverTop = params.top || 100;
412
+ const query = `SELECT [System.Id], [System.Title], [System.State], [System.CreatedDate]
413
+ FROM WorkItems
414
+ WHERE [System.TeamProject] = @project
335
415
  AND [System.AssignedTo] = @me
336
416
  ${stateCondition}
337
417
  ORDER BY [System.CreatedDate] DESC`;
338
- const queryResult = await witApi.queryByWiql({
418
+ const cacheKey = this.buildWiqlCacheKey(query, serverTop);
419
+ const cached = this.getCachedWiql(cacheKey);
420
+ const queryResult = cached ?? await witApi.queryByWiql({
339
421
  query
340
422
  }, {
341
423
  project: this.config.project
342
- });
343
- const top = params.top || 100;
344
- if (queryResult.workItems) {
345
- queryResult.workItems = queryResult.workItems.slice(0, top);
346
- }
424
+ }, undefined, serverTop);
425
+ if (!cached)
426
+ this.setCachedWiql(cacheKey, queryResult);
347
427
  return queryResult;
348
428
  }
349
429
  catch (error) {