@agllama/mcp 0.6.27 → 0.7.0

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 (37) hide show
  1. package/dist/api-client.d.ts +30 -2
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +28 -4
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/server.d.ts.map +1 -1
  6. package/dist/server.js +60 -1
  7. package/dist/server.js.map +1 -1
  8. package/dist/tools/__tests__/prScorer.test.d.ts +2 -0
  9. package/dist/tools/__tests__/prScorer.test.d.ts.map +1 -0
  10. package/dist/tools/__tests__/prScorer.test.js +537 -0
  11. package/dist/tools/__tests__/prScorer.test.js.map +1 -0
  12. package/dist/tools/devLinks.d.ts +5 -22
  13. package/dist/tools/devLinks.d.ts.map +1 -1
  14. package/dist/tools/devLinks.js +15 -110
  15. package/dist/tools/devLinks.js.map +1 -1
  16. package/dist/tools/help.d.ts.map +1 -1
  17. package/dist/tools/help.js +74 -0
  18. package/dist/tools/help.js.map +1 -1
  19. package/dist/tools/index.d.ts +3 -0
  20. package/dist/tools/index.d.ts.map +1 -1
  21. package/dist/tools/index.js +3 -0
  22. package/dist/tools/index.js.map +1 -1
  23. package/dist/tools/prScorer.d.ts +41 -0
  24. package/dist/tools/prScorer.d.ts.map +1 -0
  25. package/dist/tools/prScorer.js +182 -0
  26. package/dist/tools/prScorer.js.map +1 -0
  27. package/dist/tools/prScorerHistory.d.ts +53 -0
  28. package/dist/tools/prScorerHistory.d.ts.map +1 -0
  29. package/dist/tools/prScorerHistory.js +251 -0
  30. package/dist/tools/prScorerHistory.js.map +1 -0
  31. package/dist/tools/prScorerSchema.d.ts +9 -0
  32. package/dist/tools/prScorerSchema.d.ts.map +1 -0
  33. package/dist/tools/prScorerSchema.js +217 -0
  34. package/dist/tools/prScorerSchema.js.map +1 -0
  35. package/dist/types.d.ts +19 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/package.json +2 -2
@@ -0,0 +1,537 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { getPrScorerSchemaToolName, getPrScorerSchemaToolDescription, executeGetPrScorerSchema, getPrScorerRulesToolName, getPrScorerRulesToolSchema, executeGetPrScorerRules, setPrScorerRulesToolName, setPrScorerRulesToolSchema, executeSetPrScorerRules, } from '../prScorer.js';
3
+ import { testPrScorerToolName, testPrScorerToolDescription, testPrScorerToolSchema, executeTestPrScorer, listPrScorerHistoryToolName, listPrScorerHistoryToolDescription, listPrScorerHistoryToolSchema, executeListPrScorerHistory, revertPrScorerToolName, revertPrScorerToolDescription, revertPrScorerToolSchema, executeRevertPrScorer, } from '../prScorerHistory.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Mock api-client and session
6
+ // ---------------------------------------------------------------------------
7
+ vi.mock('../../api-client.js', () => {
8
+ return {
9
+ getApiClient: vi.fn(),
10
+ LlamaApiError: class LlamaApiError extends Error {
11
+ statusCode;
12
+ details;
13
+ constructor(statusCode, message, details) {
14
+ super(message);
15
+ this.statusCode = statusCode;
16
+ this.name = 'LlamaApiError';
17
+ this.details = details;
18
+ }
19
+ },
20
+ };
21
+ });
22
+ vi.mock('../session.js', () => {
23
+ return {
24
+ getSessionDefaults: vi.fn().mockResolvedValue({
25
+ orgSlug: 'test-org',
26
+ projectKey: 'TEST',
27
+ }),
28
+ };
29
+ });
30
+ // ---------------------------------------------------------------------------
31
+ // Tool registration shape
32
+ // ---------------------------------------------------------------------------
33
+ describe('PR Scorer tool registration', () => {
34
+ it('schema tool has a name constant', () => {
35
+ expect(getPrScorerSchemaToolName).toBe('llama_get_pr_scorer_schema');
36
+ });
37
+ it('get-rules tool has a name constant', () => {
38
+ expect(getPrScorerRulesToolName).toBe('llama_get_pr_scorer_rules');
39
+ });
40
+ it('set-rules tool has a name constant', () => {
41
+ expect(setPrScorerRulesToolName).toBe('llama_set_pr_scorer_rules');
42
+ });
43
+ it('schema tool description is at least 500 chars (full DSL reference)', () => {
44
+ expect(getPrScorerSchemaToolDescription.length).toBeGreaterThan(500);
45
+ });
46
+ it('schema tool description includes EBNF keyword "rule :="', () => {
47
+ expect(getPrScorerSchemaToolDescription).toContain('rule');
48
+ expect(getPrScorerSchemaToolDescription).toContain('when');
49
+ expect(getPrScorerSchemaToolDescription).toContain('then');
50
+ });
51
+ it('schema tool description includes variable table', () => {
52
+ expect(getPrScorerSchemaToolDescription).toContain('pr.title');
53
+ expect(getPrScorerSchemaToolDescription).toContain('pr.isDraft');
54
+ expect(getPrScorerSchemaToolDescription).toContain('hasLinkedIssue');
55
+ });
56
+ it('schema tool description includes function table', () => {
57
+ expect(getPrScorerSchemaToolDescription).toContain('pathMatches');
58
+ expect(getPrScorerSchemaToolDescription).toContain('any()');
59
+ expect(getPrScorerSchemaToolDescription).toContain('all()');
60
+ expect(getPrScorerSchemaToolDescription).toContain('count()');
61
+ });
62
+ it('schema tool description includes RE2 note', () => {
63
+ expect(getPrScorerSchemaToolDescription).toContain('RE2');
64
+ });
65
+ it('schema tool description includes both runnable examples', () => {
66
+ expect(getPrScorerSchemaToolDescription).toContain('has tests');
67
+ expect(getPrScorerSchemaToolDescription).toContain('touches env');
68
+ });
69
+ it('get-rules schema accepts orgSlug/projectKey as optional', () => {
70
+ const result = getPrScorerRulesToolSchema.safeParse({});
71
+ expect(result.success).toBe(true);
72
+ });
73
+ it('set-rules schema requires source', () => {
74
+ const missingSource = setPrScorerRulesToolSchema.safeParse({});
75
+ expect(missingSource.success).toBe(false);
76
+ const withSource = setPrScorerRulesToolSchema.safeParse({
77
+ source: 'when pr.isDraft == true then -1 reason "draft"',
78
+ });
79
+ expect(withSource.success).toBe(true);
80
+ });
81
+ });
82
+ // ---------------------------------------------------------------------------
83
+ // executeGetPrScorerSchema
84
+ // ---------------------------------------------------------------------------
85
+ describe('executeGetPrScorerSchema', () => {
86
+ it('returns the DSL reference text directly', async () => {
87
+ const result = await executeGetPrScorerSchema();
88
+ expect(typeof result).toBe('string');
89
+ expect(result.length).toBeGreaterThan(500);
90
+ expect(result).toContain('PR Scorer Rule Language');
91
+ });
92
+ });
93
+ // ---------------------------------------------------------------------------
94
+ // executeGetPrScorerRules
95
+ // ---------------------------------------------------------------------------
96
+ // Realistic PrScorerRuleSetResult shape from the backend
97
+ const makePrScorerRuleSetResult = (overrides = {}) => ({
98
+ id: 'ruleset-1',
99
+ projectId: 'project-1',
100
+ rules: { source: overrides.source ?? 'when pr.isDraft == true then -1 reason "draft"', ast: {} },
101
+ history: Array.from({ length: overrides.historyLength ?? 0 }),
102
+ enabled: overrides.enabled ?? true,
103
+ updatedById: overrides.updatedById ?? 'alice',
104
+ createdAt: '2026-01-01T00:00:00.000Z',
105
+ updatedAt: '2026-01-01T00:00:00.000Z',
106
+ });
107
+ describe('executeGetPrScorerRules', () => {
108
+ beforeEach(() => {
109
+ vi.clearAllMocks();
110
+ });
111
+ it('returns rules from the API on success — reads rules.source and updatedById', async () => {
112
+ const { getApiClient } = await import('../../api-client.js');
113
+ vi.mocked(getApiClient).mockReturnValue({
114
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
115
+ get: vi.fn().mockResolvedValue(makePrScorerRuleSetResult({ source: 'when pr.isDraft == true then -1 reason "draft"', updatedById: 'alice' })),
116
+ });
117
+ const result = JSON.parse(await executeGetPrScorerRules({ orgSlug: 'my-org', projectKey: 'PROJ' }));
118
+ expect(result.success).toBe(true);
119
+ expect(result.source).toContain('draft');
120
+ expect(result.enabled).toBe(true);
121
+ // updatedById (not updatedBy) is the correct field
122
+ expect(result.updatedById).toBe('alice');
123
+ expect(result.historyLength).toBe(0);
124
+ });
125
+ it('returns historyLength from history array length', async () => {
126
+ const { getApiClient } = await import('../../api-client.js');
127
+ vi.mocked(getApiClient).mockReturnValue({
128
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
129
+ get: vi.fn().mockResolvedValue(makePrScorerRuleSetResult({ historyLength: 3 })),
130
+ });
131
+ const result = JSON.parse(await executeGetPrScorerRules({ orgSlug: 'my-org', projectKey: 'PROJ' }));
132
+ expect(result.historyLength).toBe(3);
133
+ });
134
+ it('handles null rules gracefully (empty-row case)', async () => {
135
+ const { getApiClient } = await import('../../api-client.js');
136
+ vi.mocked(getApiClient).mockReturnValue({
137
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
138
+ get: vi.fn().mockResolvedValue({
139
+ id: 'ruleset-1',
140
+ projectId: 'project-1',
141
+ rules: null,
142
+ history: [],
143
+ enabled: false,
144
+ updatedById: null,
145
+ createdAt: '2026-01-01T00:00:00.000Z',
146
+ updatedAt: '2026-01-01T00:00:00.000Z',
147
+ }),
148
+ });
149
+ const result = JSON.parse(await executeGetPrScorerRules({ orgSlug: 'my-org', projectKey: 'PROJ' }));
150
+ expect(result.success).toBe(true);
151
+ expect(result.source).toBe('');
152
+ expect(result.enabled).toBe(false);
153
+ expect(result.updatedById).toBeNull();
154
+ });
155
+ it('uses session defaults when orgSlug/projectKey are omitted', async () => {
156
+ const { getApiClient } = await import('../../api-client.js');
157
+ const getMock = vi.fn().mockResolvedValue(makePrScorerRuleSetResult({ source: '', enabled: false }));
158
+ vi.mocked(getApiClient).mockReturnValue({
159
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
160
+ get: getMock,
161
+ });
162
+ const result = JSON.parse(await executeGetPrScorerRules({}));
163
+ expect(result.success).toBe(true);
164
+ expect(getMock).toHaveBeenCalledWith('/organizations/test-org/projects/TEST/pr-scorer/rules');
165
+ });
166
+ it('returns error when orgSlug missing and no session', async () => {
167
+ const { getSessionDefaults } = await import('../session.js');
168
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce(null);
169
+ const result = JSON.parse(await executeGetPrScorerRules({}));
170
+ expect(result.success).toBe(false);
171
+ expect(result.error).toContain('orgSlug is required');
172
+ });
173
+ it('returns error when projectKey missing and no session', async () => {
174
+ const { getSessionDefaults } = await import('../session.js');
175
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce({ orgSlug: 'my-org' });
176
+ const result = JSON.parse(await executeGetPrScorerRules({}));
177
+ expect(result.success).toBe(false);
178
+ expect(result.error).toContain('projectKey is required');
179
+ });
180
+ });
181
+ // ---------------------------------------------------------------------------
182
+ // executeSetPrScorerRules
183
+ // ---------------------------------------------------------------------------
184
+ describe('executeSetPrScorerRules', () => {
185
+ beforeEach(() => {
186
+ vi.clearAllMocks();
187
+ });
188
+ it('returns success with rules.source from backend shape', async () => {
189
+ const { getApiClient } = await import('../../api-client.js');
190
+ vi.mocked(getApiClient).mockReturnValue({
191
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
192
+ put: vi.fn().mockResolvedValue(makePrScorerRuleSetResult({
193
+ source: 'when pr.isDraft == true then -1 reason "draft"',
194
+ enabled: true,
195
+ updatedById: 'user-1',
196
+ })),
197
+ });
198
+ const result = JSON.parse(await executeSetPrScorerRules({
199
+ orgSlug: 'my-org',
200
+ projectKey: 'PROJ',
201
+ source: 'when pr.isDraft == true then -1 reason "draft"',
202
+ enabled: true,
203
+ }));
204
+ expect(result.success).toBe(true);
205
+ expect(result.source).toContain('draft');
206
+ expect(result.enabled).toBe(true);
207
+ expect(result.updatedById).toBe('user-1');
208
+ expect(result.message).toContain('saved successfully');
209
+ });
210
+ it('returns structured parseErrors array on HTTP 400 using err.details (not JSON.parse)', async () => {
211
+ const { getApiClient, LlamaApiError } = await import('../../api-client.js');
212
+ // Production api-client passes raw details array as third constructor arg
213
+ const rawDetails = [
214
+ { line: 3, column: 12, message: "Expected 'then' keyword" },
215
+ { line: 7, column: 1, message: 'Score +15 exceeds maximum of +10' },
216
+ ];
217
+ vi.mocked(getApiClient).mockReturnValue({
218
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
219
+ put: vi.fn().mockRejectedValue(new LlamaApiError(400, 'PR_SCORER_PARSE_ERROR', rawDetails)),
220
+ });
221
+ const result = JSON.parse(await executeSetPrScorerRules({
222
+ source: 'when pr.isDraft == true thn -1',
223
+ }));
224
+ expect(result.success).toBe(false);
225
+ expect(Array.isArray(result.parseErrors)).toBe(true);
226
+ expect(result.parseErrors).toHaveLength(2);
227
+ expect(result.parseErrors[0]).toMatchObject({
228
+ line: 3,
229
+ column: 12,
230
+ message: "Expected 'then' keyword",
231
+ });
232
+ expect(result.parseErrors[1]).toMatchObject({
233
+ line: 7,
234
+ column: 1,
235
+ message: 'Score +15 exceeds maximum of +10',
236
+ });
237
+ // Must NOT contain a flattened string error
238
+ expect(result.error).toBeUndefined();
239
+ });
240
+ it('returns error on non-parse 400 (no details array)', async () => {
241
+ const { getApiClient, LlamaApiError } = await import('../../api-client.js');
242
+ vi.mocked(getApiClient).mockReturnValue({
243
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
244
+ put: vi.fn().mockRejectedValue(new LlamaApiError(400, 'source is required')),
245
+ });
246
+ const result = JSON.parse(await executeSetPrScorerRules({ source: '' }));
247
+ expect(result.success).toBe(false);
248
+ expect(result.error).toBeDefined();
249
+ expect(result.parseErrors).toBeUndefined();
250
+ });
251
+ it('returns error when orgSlug missing and no session', async () => {
252
+ const { getSessionDefaults } = await import('../session.js');
253
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce(null);
254
+ const result = JSON.parse(await executeSetPrScorerRules({ source: 'when pr.isDraft == true then -1' }));
255
+ expect(result.success).toBe(false);
256
+ expect(result.error).toContain('orgSlug is required');
257
+ });
258
+ });
259
+ // ---------------------------------------------------------------------------
260
+ // Tool registration — new tools
261
+ // ---------------------------------------------------------------------------
262
+ describe('PR Scorer History/Test/Revert tool registration', () => {
263
+ it('test tool has correct name constant', () => {
264
+ expect(testPrScorerToolName).toBe('llama_test_pr_scorer');
265
+ });
266
+ it('list history tool has correct name constant', () => {
267
+ expect(listPrScorerHistoryToolName).toBe('llama_list_pr_scorer_history');
268
+ });
269
+ it('revert tool has correct name constant', () => {
270
+ expect(revertPrScorerToolName).toBe('llama_revert_pr_scorer');
271
+ });
272
+ it('test tool description mentions prId and trace', () => {
273
+ expect(testPrScorerToolDescription).toContain('prId');
274
+ expect(testPrScorerToolDescription).toContain('trace');
275
+ });
276
+ it('list history tool description mentions metadata-only stripping', () => {
277
+ expect(listPrScorerHistoryToolDescription).toContain('metadata');
278
+ });
279
+ it('revert tool description explains 0-indexed most-recent-first', () => {
280
+ expect(revertPrScorerToolDescription).toContain('0-indexed');
281
+ expect(revertPrScorerToolDescription).toContain('most-recent-first');
282
+ });
283
+ it('test schema requires source and prId', () => {
284
+ const missing = testPrScorerToolSchema.safeParse({});
285
+ expect(missing.success).toBe(false);
286
+ const valid = testPrScorerToolSchema.safeParse({
287
+ source: 'when pr.isDraft == true then -1 reason "draft"',
288
+ prId: 'uuid-1234',
289
+ });
290
+ expect(valid.success).toBe(true);
291
+ });
292
+ it('revert schema rejects negative historyIndex', () => {
293
+ const negative = revertPrScorerToolSchema.safeParse({ historyIndex: -1 });
294
+ expect(negative.success).toBe(false);
295
+ });
296
+ it('revert schema rejects non-integer historyIndex', () => {
297
+ const float = revertPrScorerToolSchema.safeParse({ historyIndex: 1.5 });
298
+ expect(float.success).toBe(false);
299
+ });
300
+ it('revert schema accepts historyIndex 0', () => {
301
+ const zero = revertPrScorerToolSchema.safeParse({ historyIndex: 0 });
302
+ expect(zero.success).toBe(true);
303
+ });
304
+ it('list history schema accepts empty input', () => {
305
+ const empty = listPrScorerHistoryToolSchema.safeParse({});
306
+ expect(empty.success).toBe(true);
307
+ });
308
+ });
309
+ // ---------------------------------------------------------------------------
310
+ // executeTestPrScorer
311
+ // ---------------------------------------------------------------------------
312
+ const makeTestResult = () => ({
313
+ score: 3,
314
+ grade: 'B',
315
+ reasons: ['has tests', 'linked issue'],
316
+ flags: [],
317
+ trace: [
318
+ { ruleIndex: 0, matched: true, delta: 1, reason: 'has tests' },
319
+ { ruleIndex: 1, matched: false, delta: 0 },
320
+ { ruleIndex: 2, matched: true, delta: 2, reason: 'linked issue' },
321
+ ],
322
+ });
323
+ describe('executeTestPrScorer', () => {
324
+ beforeEach(() => {
325
+ vi.clearAllMocks();
326
+ });
327
+ it('returns full score/grade/reasons/flags/trace on success', async () => {
328
+ const { getApiClient } = await import('../../api-client.js');
329
+ vi.mocked(getApiClient).mockReturnValue({
330
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
331
+ postPrScorerTest: vi.fn().mockResolvedValue(makeTestResult()),
332
+ });
333
+ const result = JSON.parse(await executeTestPrScorer({
334
+ orgSlug: 'my-org',
335
+ projectKey: 'PROJ',
336
+ source: 'when pr.isDraft == true then -1 reason "draft"',
337
+ prId: 'uuid-1234',
338
+ }));
339
+ expect(result.success).toBe(true);
340
+ expect(result.score).toBe(3);
341
+ expect(result.grade).toBe('B');
342
+ expect(result.reasons).toEqual(['has tests', 'linked issue']);
343
+ expect(result.flags).toEqual([]);
344
+ expect(Array.isArray(result.trace)).toBe(true);
345
+ expect(result.trace).toHaveLength(3);
346
+ expect(result.trace[0]).toMatchObject({ ruleIndex: 0, matched: true, delta: 1 });
347
+ });
348
+ it('uses session defaults when orgSlug/projectKey are omitted', async () => {
349
+ const { getApiClient } = await import('../../api-client.js');
350
+ const mockPost = vi.fn().mockResolvedValue(makeTestResult());
351
+ vi.mocked(getApiClient).mockReturnValue({
352
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
353
+ postPrScorerTest: mockPost,
354
+ });
355
+ const result = JSON.parse(await executeTestPrScorer({
356
+ source: 'when pr.isDraft == true then -1 reason "draft"',
357
+ prId: 'uuid-1234',
358
+ }));
359
+ expect(result.success).toBe(true);
360
+ expect(mockPost).toHaveBeenCalledWith('test-org', 'TEST', expect.any(String), 'uuid-1234');
361
+ });
362
+ it('surfaces structured parseErrors on 400 with details array', async () => {
363
+ const { getApiClient, LlamaApiError } = await import('../../api-client.js');
364
+ const rawDetails = [
365
+ { line: 2, column: 5, message: "Expected 'then' keyword" },
366
+ ];
367
+ vi.mocked(getApiClient).mockReturnValue({
368
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
369
+ postPrScorerTest: vi.fn().mockRejectedValue(new LlamaApiError(400, 'PR_SCORER_PARSE_ERROR', rawDetails)),
370
+ });
371
+ const result = JSON.parse(await executeTestPrScorer({
372
+ orgSlug: 'my-org',
373
+ projectKey: 'PROJ',
374
+ source: 'bad source',
375
+ prId: 'uuid-1234',
376
+ }));
377
+ expect(result.success).toBe(false);
378
+ expect(Array.isArray(result.parseErrors)).toBe(true);
379
+ expect(result.parseErrors[0]).toMatchObject({ line: 2, column: 5 });
380
+ expect(result.error).toBeUndefined();
381
+ });
382
+ it('returns error when orgSlug missing and no session', async () => {
383
+ const { getSessionDefaults } = await import('../session.js');
384
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce(null);
385
+ const result = JSON.parse(await executeTestPrScorer({
386
+ source: 'when pr.isDraft == true then -1',
387
+ prId: 'uuid-1234',
388
+ }));
389
+ expect(result.success).toBe(false);
390
+ expect(result.error).toContain('orgSlug is required');
391
+ });
392
+ });
393
+ // ---------------------------------------------------------------------------
394
+ // executeListPrScorerHistory
395
+ // ---------------------------------------------------------------------------
396
+ const makeRawHistory = () => [
397
+ {
398
+ source: 'when pr.isDraft == true then -1 reason "draft"\nwhen pr.title matches "WIP" then -2',
399
+ ast: { rules: [] },
400
+ savedAt: '2026-05-10T14:22:00.000Z',
401
+ updatedById: 'user-1',
402
+ },
403
+ {
404
+ source: 'when pr.isDraft == true then -1',
405
+ ast: { rules: [] },
406
+ savedAt: '2026-05-08T09:00:00.000Z',
407
+ updatedById: 'user-2',
408
+ },
409
+ ];
410
+ describe('executeListPrScorerHistory', () => {
411
+ beforeEach(() => {
412
+ vi.clearAllMocks();
413
+ });
414
+ it('returns metadata-only entries — source and ast are stripped', async () => {
415
+ const { getApiClient } = await import('../../api-client.js');
416
+ vi.mocked(getApiClient).mockReturnValue({
417
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
418
+ getPrScorerHistory: vi.fn().mockResolvedValue(makeRawHistory()),
419
+ });
420
+ const result = JSON.parse(await executeListPrScorerHistory({ orgSlug: 'my-org', projectKey: 'PROJ' }));
421
+ expect(result.success).toBe(true);
422
+ expect(result.count).toBe(2);
423
+ expect(result.entries[0].source).toBeUndefined();
424
+ expect(result.entries[0].ast).toBeUndefined();
425
+ expect(result.entries[0].savedAt).toBe('2026-05-10T14:22:00.000Z');
426
+ expect(result.entries[0].updatedById).toBe('user-1');
427
+ expect(result.entries[0].index).toBe(0);
428
+ });
429
+ it('includes sourceLineCount and sourceLength derived from source', async () => {
430
+ const { getApiClient } = await import('../../api-client.js');
431
+ vi.mocked(getApiClient).mockReturnValue({
432
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
433
+ getPrScorerHistory: vi.fn().mockResolvedValue(makeRawHistory()),
434
+ });
435
+ const result = JSON.parse(await executeListPrScorerHistory({ orgSlug: 'my-org', projectKey: 'PROJ' }));
436
+ // First entry has 2 lines
437
+ expect(result.entries[0].sourceLineCount).toBe(2);
438
+ expect(typeof result.entries[0].sourceLength).toBe('number');
439
+ expect(result.entries[0].sourceLength).toBeGreaterThan(0);
440
+ });
441
+ it('handles empty history gracefully', async () => {
442
+ const { getApiClient } = await import('../../api-client.js');
443
+ vi.mocked(getApiClient).mockReturnValue({
444
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
445
+ getPrScorerHistory: vi.fn().mockResolvedValue([]),
446
+ });
447
+ const result = JSON.parse(await executeListPrScorerHistory({ orgSlug: 'my-org', projectKey: 'PROJ' }));
448
+ expect(result.success).toBe(true);
449
+ expect(result.count).toBe(0);
450
+ expect(result.entries).toEqual([]);
451
+ });
452
+ it('uses session defaults when orgSlug/projectKey are omitted', async () => {
453
+ const { getApiClient } = await import('../../api-client.js');
454
+ const mockGet = vi.fn().mockResolvedValue([]);
455
+ vi.mocked(getApiClient).mockReturnValue({
456
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
457
+ getPrScorerHistory: mockGet,
458
+ });
459
+ const result = JSON.parse(await executeListPrScorerHistory({}));
460
+ expect(result.success).toBe(true);
461
+ expect(mockGet).toHaveBeenCalledWith('test-org', 'TEST');
462
+ });
463
+ it('returns error when orgSlug missing and no session', async () => {
464
+ const { getSessionDefaults } = await import('../session.js');
465
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce(null);
466
+ const result = JSON.parse(await executeListPrScorerHistory({}));
467
+ expect(result.success).toBe(false);
468
+ expect(result.error).toContain('orgSlug is required');
469
+ });
470
+ });
471
+ // ---------------------------------------------------------------------------
472
+ // executeRevertPrScorer
473
+ // ---------------------------------------------------------------------------
474
+ describe('executeRevertPrScorer', () => {
475
+ beforeEach(() => {
476
+ vi.clearAllMocks();
477
+ });
478
+ it('returns reverted source/enabled on success', async () => {
479
+ const { getApiClient } = await import('../../api-client.js');
480
+ vi.mocked(getApiClient).mockReturnValue({
481
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
482
+ // Server returns the full PrScorerRuleSetResult shape — source nested
483
+ // under `rules.source`, not at the top level.
484
+ postPrScorerRevert: vi.fn().mockResolvedValue({
485
+ rules: {
486
+ source: 'when pr.isDraft == true then -1 reason "draft"',
487
+ ast: { rules: [] },
488
+ },
489
+ enabled: true,
490
+ updatedById: 'user-1',
491
+ }),
492
+ });
493
+ const result = JSON.parse(await executeRevertPrScorer({
494
+ orgSlug: 'my-org',
495
+ projectKey: 'PROJ',
496
+ historyIndex: 0,
497
+ }));
498
+ expect(result.success).toBe(true);
499
+ expect(result.historyIndex).toBe(0);
500
+ expect(result.source).toContain('draft');
501
+ expect(result.enabled).toBe(true);
502
+ expect(result.message).toContain('0');
503
+ });
504
+ it('calls postPrScorerRevert with correct historyIndex', async () => {
505
+ const { getApiClient } = await import('../../api-client.js');
506
+ const mockRevert = vi.fn().mockResolvedValue({
507
+ rules: { source: 'old rules', ast: { rules: [] } },
508
+ enabled: false,
509
+ updatedById: null,
510
+ });
511
+ vi.mocked(getApiClient).mockReturnValue({
512
+ recordToolCall: vi.fn().mockResolvedValue(undefined),
513
+ postPrScorerRevert: mockRevert,
514
+ });
515
+ await executeRevertPrScorer({
516
+ orgSlug: 'my-org',
517
+ projectKey: 'PROJ',
518
+ historyIndex: 2,
519
+ });
520
+ expect(mockRevert).toHaveBeenCalledWith('my-org', 'PROJ', 2);
521
+ });
522
+ it('returns error when orgSlug missing and no session', async () => {
523
+ const { getSessionDefaults } = await import('../session.js');
524
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce(null);
525
+ const result = JSON.parse(await executeRevertPrScorer({ historyIndex: 0 }));
526
+ expect(result.success).toBe(false);
527
+ expect(result.error).toContain('orgSlug is required');
528
+ });
529
+ it('returns error when projectKey missing and no session', async () => {
530
+ const { getSessionDefaults } = await import('../session.js');
531
+ vi.mocked(getSessionDefaults).mockResolvedValueOnce({ orgSlug: 'my-org' });
532
+ const result = JSON.parse(await executeRevertPrScorer({ historyIndex: 0 }));
533
+ expect(result.success).toBe(false);
534
+ expect(result.error).toContain('projectKey is required');
535
+ });
536
+ });
537
+ //# sourceMappingURL=prScorer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prScorer.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/prScorer.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
- export declare const listDevLinksToolName = "llama_list_dev_links";
3
- export declare const listDevLinksToolDescription = "List all dev links (PRs, commits, branches) for an issue.\nReturns linked pull requests, commits, and branches with their status, URL, author, and repository info.";
4
- export declare const listDevLinksToolSchema: z.ZodObject<{
2
+ export declare const getDevLinksToolName = "llama_get_dev_links";
3
+ export declare const getDevLinksToolDescription = "Get all dev links (pull requests, commits) attached to an issue.";
4
+ export declare const getDevLinksToolSchema: z.ZodObject<{
5
5
  orgSlug: z.ZodOptional<z.ZodString>;
6
6
  projectKey: z.ZodOptional<z.ZodString>;
7
7
  issueKey: z.ZodString;
@@ -14,23 +14,6 @@ export declare const listDevLinksToolSchema: z.ZodObject<{
14
14
  orgSlug?: string | undefined;
15
15
  projectKey?: string | undefined;
16
16
  }>;
17
- export type ListDevLinksToolInput = z.infer<typeof listDevLinksToolSchema>;
18
- export declare function executeListDevLinks(input: ListDevLinksToolInput): Promise<string>;
19
- export declare const searchByPrToolName = "llama_search_by_pr";
20
- export declare const searchByPrToolDescription = "Find issues linked to a specific pull request or commit URL.\nParses GitHub PR URLs (e.g., \"https://github.com/owner/repo/pull/123\") and returns all issues that have a dev link to that URL.\nUseful for finding which project issues are connected to a specific PR.";
21
- export declare const searchByPrToolSchema: z.ZodObject<{
22
- orgSlug: z.ZodOptional<z.ZodString>;
23
- projectKey: z.ZodOptional<z.ZodString>;
24
- url: z.ZodString;
25
- }, "strip", z.ZodTypeAny, {
26
- url: string;
27
- orgSlug?: string | undefined;
28
- projectKey?: string | undefined;
29
- }, {
30
- url: string;
31
- orgSlug?: string | undefined;
32
- projectKey?: string | undefined;
33
- }>;
34
- export type SearchByPrToolInput = z.infer<typeof searchByPrToolSchema>;
35
- export declare function executeSearchByPr(input: SearchByPrToolInput): Promise<string>;
17
+ export type GetDevLinksToolInput = z.infer<typeof getDevLinksToolSchema>;
18
+ export declare function executeGetDevLinks(input: GetDevLinksToolInput): Promise<string>;
36
19
  //# sourceMappingURL=devLinks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devLinks.d.ts","sourceRoot":"","sources":["../../src/tools/devLinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,eAAO,MAAM,2BAA2B,wKACiE,CAAC;AAE1G,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAUjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA4EjB;AAMD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,eAAO,MAAM,yBAAyB,6QAEkC,CAAC;AAEzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAU/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CAsFjB"}
1
+ {"version":3,"file":"devLinks.d.ts","sourceRoot":"","sources":["../../src/tools/devLinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,eAAO,MAAM,0BAA0B,qEAAqE,CAAC;AAE7G,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAUhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DrF"}