@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.
- package/dist/api-client.d.ts +30 -2
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +28 -4
- package/dist/api-client.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +60 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/__tests__/prScorer.test.d.ts +2 -0
- package/dist/tools/__tests__/prScorer.test.d.ts.map +1 -0
- package/dist/tools/__tests__/prScorer.test.js +537 -0
- package/dist/tools/__tests__/prScorer.test.js.map +1 -0
- package/dist/tools/devLinks.d.ts +5 -22
- package/dist/tools/devLinks.d.ts.map +1 -1
- package/dist/tools/devLinks.js +15 -110
- package/dist/tools/devLinks.js.map +1 -1
- package/dist/tools/help.d.ts.map +1 -1
- package/dist/tools/help.js +74 -0
- package/dist/tools/help.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prScorer.d.ts +41 -0
- package/dist/tools/prScorer.d.ts.map +1 -0
- package/dist/tools/prScorer.js +182 -0
- package/dist/tools/prScorer.js.map +1 -0
- package/dist/tools/prScorerHistory.d.ts +53 -0
- package/dist/tools/prScorerHistory.d.ts.map +1 -0
- package/dist/tools/prScorerHistory.js +251 -0
- package/dist/tools/prScorerHistory.js.map +1 -0
- package/dist/tools/prScorerSchema.d.ts +9 -0
- package/dist/tools/prScorerSchema.d.ts.map +1 -0
- package/dist/tools/prScorerSchema.js +217 -0
- package/dist/tools/prScorerSchema.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- 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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"}
|
package/dist/tools/devLinks.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
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
|
|
18
|
-
export declare function
|
|
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,
|
|
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"}
|