diffprism 0.34.1 → 0.36.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/README.md +47 -188
- package/dist/bin.js +213 -227
- package/dist/chunk-DHCVZGHE.js +501 -0
- package/dist/chunk-ITPHDFOS.js +1283 -0
- package/dist/chunk-JSBRDJBE.js +30 -0
- package/dist/{chunk-VASCXEMN.js → chunk-OR6PCPZX.js} +22 -2791
- package/dist/chunk-QGWYCEJN.js +448 -0
- package/dist/chunk-UYZ3A2PB.js +231 -0
- package/dist/demo-JH5YOKTZ.js +10 -0
- package/dist/mcp-server.js +77 -280
- package/dist/src-AMCPIYDZ.js +19 -0
- package/dist/src-JMPTSU3P.js +27 -0
- package/package.json +1 -1
- package/ui-dist/assets/index-CNIXSkOg.js +325 -0
- package/ui-dist/index.html +1 -1
- package/ui-dist/assets/index-BfqEajZq.js +0 -325
package/dist/mcp-server.js
CHANGED
|
@@ -1,119 +1,35 @@
|
|
|
1
1
|
import {
|
|
2
|
-
analyze,
|
|
3
|
-
consumeReviewResult,
|
|
4
2
|
createGitHubClient,
|
|
5
|
-
detectWorktree,
|
|
6
3
|
fetchPullRequest,
|
|
7
4
|
fetchPullRequestDiff,
|
|
8
|
-
getCurrentBranch,
|
|
9
|
-
getDiff,
|
|
10
|
-
isServerAlive,
|
|
11
5
|
normalizePr,
|
|
12
6
|
parsePrRef,
|
|
13
|
-
readReviewResult,
|
|
14
|
-
readWatchFile,
|
|
15
7
|
resolveGitHubToken,
|
|
16
|
-
startReview,
|
|
17
8
|
submitGitHubReview
|
|
18
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-OR6PCPZX.js";
|
|
10
|
+
import {
|
|
11
|
+
ensureServer,
|
|
12
|
+
isServerAlive,
|
|
13
|
+
submitReviewToServer
|
|
14
|
+
} from "./chunk-ITPHDFOS.js";
|
|
15
|
+
import {
|
|
16
|
+
getDiff
|
|
17
|
+
} from "./chunk-QGWYCEJN.js";
|
|
18
|
+
import {
|
|
19
|
+
analyze
|
|
20
|
+
} from "./chunk-DHCVZGHE.js";
|
|
21
|
+
import "./chunk-JSBRDJBE.js";
|
|
19
22
|
|
|
20
23
|
// packages/mcp-server/src/index.ts
|
|
21
|
-
import fs from "fs";
|
|
22
|
-
import path from "path";
|
|
23
24
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
24
25
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
25
26
|
import { z } from "zod";
|
|
26
27
|
var lastGlobalSessionId = null;
|
|
27
28
|
var lastGlobalServerInfo = null;
|
|
28
|
-
async function reviewViaGlobalServer(serverInfo, diffRef, options) {
|
|
29
|
-
const cwd = options.cwd ?? process.cwd();
|
|
30
|
-
const { diffSet, rawDiff } = getDiff(diffRef, { cwd });
|
|
31
|
-
const currentBranch = getCurrentBranch({ cwd });
|
|
32
|
-
if (diffSet.files.length === 0) {
|
|
33
|
-
return {
|
|
34
|
-
decision: "approved",
|
|
35
|
-
comments: [],
|
|
36
|
-
summary: "No changes to review."
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
const briefing = analyze(diffSet);
|
|
40
|
-
const worktreeInfo = detectWorktree({ cwd });
|
|
41
|
-
const payload = {
|
|
42
|
-
reviewId: "",
|
|
43
|
-
// Server assigns the real ID
|
|
44
|
-
diffSet,
|
|
45
|
-
rawDiff,
|
|
46
|
-
briefing,
|
|
47
|
-
metadata: {
|
|
48
|
-
title: options.title,
|
|
49
|
-
description: options.description,
|
|
50
|
-
reasoning: options.reasoning,
|
|
51
|
-
currentBranch,
|
|
52
|
-
worktree: worktreeInfo.isWorktree ? {
|
|
53
|
-
isWorktree: true,
|
|
54
|
-
worktreePath: worktreeInfo.worktreePath,
|
|
55
|
-
mainWorktreePath: worktreeInfo.mainWorktreePath
|
|
56
|
-
} : void 0
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const createResponse = await fetch(
|
|
60
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews`,
|
|
61
|
-
{
|
|
62
|
-
method: "POST",
|
|
63
|
-
headers: { "Content-Type": "application/json" },
|
|
64
|
-
body: JSON.stringify({ payload, projectPath: cwd, diffRef })
|
|
65
|
-
}
|
|
66
|
-
);
|
|
67
|
-
if (!createResponse.ok) {
|
|
68
|
-
throw new Error(`Global server returned ${createResponse.status} on create`);
|
|
69
|
-
}
|
|
70
|
-
const { sessionId } = await createResponse.json();
|
|
71
|
-
lastGlobalSessionId = sessionId;
|
|
72
|
-
lastGlobalServerInfo = serverInfo;
|
|
73
|
-
if (options.annotations?.length) {
|
|
74
|
-
for (const ann of options.annotations) {
|
|
75
|
-
await fetch(
|
|
76
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews/${sessionId}/annotations`,
|
|
77
|
-
{
|
|
78
|
-
method: "POST",
|
|
79
|
-
headers: { "Content-Type": "application/json" },
|
|
80
|
-
body: JSON.stringify({
|
|
81
|
-
file: ann.file,
|
|
82
|
-
line: ann.line,
|
|
83
|
-
body: ann.body,
|
|
84
|
-
type: ann.type,
|
|
85
|
-
confidence: ann.confidence ?? 1,
|
|
86
|
-
category: ann.category ?? "other",
|
|
87
|
-
source: {
|
|
88
|
-
agent: ann.source_agent ?? "unknown",
|
|
89
|
-
tool: "open_review"
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
}
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const pollIntervalMs = 2e3;
|
|
97
|
-
const maxWaitMs = 600 * 1e3;
|
|
98
|
-
const start = Date.now();
|
|
99
|
-
while (Date.now() - start < maxWaitMs) {
|
|
100
|
-
const resultResponse = await fetch(
|
|
101
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews/${sessionId}/result`
|
|
102
|
-
);
|
|
103
|
-
if (resultResponse.ok) {
|
|
104
|
-
const data = await resultResponse.json();
|
|
105
|
-
if (data.result) {
|
|
106
|
-
return data.result;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
110
|
-
}
|
|
111
|
-
throw new Error("Review timed out waiting for submission.");
|
|
112
|
-
}
|
|
113
29
|
async function startMcpServer() {
|
|
114
30
|
const server = new McpServer({
|
|
115
31
|
name: "diffprism",
|
|
116
|
-
version: true ? "0.
|
|
32
|
+
version: true ? "0.36.0" : "0.0.0-dev"
|
|
117
33
|
});
|
|
118
34
|
server.tool(
|
|
119
35
|
"open_review",
|
|
@@ -148,36 +64,21 @@ async function startMcpServer() {
|
|
|
148
64
|
},
|
|
149
65
|
async ({ diff_ref, title, description, reasoning, annotations }) => {
|
|
150
66
|
try {
|
|
151
|
-
const serverInfo = await
|
|
152
|
-
|
|
153
|
-
|
|
67
|
+
const serverInfo = await ensureServer({ silent: true });
|
|
68
|
+
const { result, sessionId } = await submitReviewToServer(
|
|
69
|
+
serverInfo,
|
|
70
|
+
diff_ref,
|
|
71
|
+
{
|
|
154
72
|
title,
|
|
155
73
|
description,
|
|
156
74
|
reasoning,
|
|
157
75
|
cwd: process.cwd(),
|
|
158
|
-
annotations
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
content: [
|
|
162
|
-
{
|
|
163
|
-
type: "text",
|
|
164
|
-
text: JSON.stringify(result2, null, 2)
|
|
165
|
-
}
|
|
166
|
-
]
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
const isDev = fs.existsSync(
|
|
170
|
-
path.join(process.cwd(), "packages", "ui", "src", "App.tsx")
|
|
76
|
+
annotations,
|
|
77
|
+
diffRef: diff_ref
|
|
78
|
+
}
|
|
171
79
|
);
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
title,
|
|
175
|
-
description,
|
|
176
|
-
reasoning,
|
|
177
|
-
cwd: process.cwd(),
|
|
178
|
-
silent: true,
|
|
179
|
-
dev: isDev
|
|
180
|
-
});
|
|
80
|
+
lastGlobalSessionId = sessionId;
|
|
81
|
+
lastGlobalServerInfo = serverInfo;
|
|
181
82
|
return {
|
|
182
83
|
content: [
|
|
183
84
|
{
|
|
@@ -202,7 +103,7 @@ async function startMcpServer() {
|
|
|
202
103
|
);
|
|
203
104
|
server.tool(
|
|
204
105
|
"update_review_context",
|
|
205
|
-
"Push reasoning/context to a running DiffPrism review session. Non-blocking \u2014 returns immediately.
|
|
106
|
+
"Push reasoning/context to a running DiffPrism review session. Non-blocking \u2014 returns immediately. Updates the review UI with agent reasoning without opening a new review. Requires a prior `open_review` call in this session.",
|
|
206
107
|
{
|
|
207
108
|
reasoning: z.string().optional().describe("Agent reasoning about the current changes"),
|
|
208
109
|
title: z.string().optional().describe("Updated title for the review"),
|
|
@@ -214,42 +115,19 @@ async function startMcpServer() {
|
|
|
214
115
|
if (reasoning !== void 0) payload.reasoning = reasoning;
|
|
215
116
|
if (title !== void 0) payload.title = title;
|
|
216
117
|
if (description !== void 0) payload.description = description;
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if (serverInfo) {
|
|
220
|
-
const response2 = await fetch(
|
|
221
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews/${lastGlobalSessionId}/context`,
|
|
222
|
-
{
|
|
223
|
-
method: "POST",
|
|
224
|
-
headers: { "Content-Type": "application/json" },
|
|
225
|
-
body: JSON.stringify(payload)
|
|
226
|
-
}
|
|
227
|
-
);
|
|
228
|
-
if (response2.ok) {
|
|
229
|
-
return {
|
|
230
|
-
content: [
|
|
231
|
-
{
|
|
232
|
-
type: "text",
|
|
233
|
-
text: "Context updated in DiffPrism global server session."
|
|
234
|
-
}
|
|
235
|
-
]
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const watchInfo = readWatchFile();
|
|
241
|
-
if (!watchInfo) {
|
|
118
|
+
const serverInfo = lastGlobalServerInfo ?? await isServerAlive();
|
|
119
|
+
if (!serverInfo || !lastGlobalSessionId) {
|
|
242
120
|
return {
|
|
243
121
|
content: [
|
|
244
122
|
{
|
|
245
123
|
type: "text",
|
|
246
|
-
text: "No DiffPrism session is running.
|
|
124
|
+
text: "No DiffPrism session is running. Use `open_review` to start a review."
|
|
247
125
|
}
|
|
248
126
|
]
|
|
249
127
|
};
|
|
250
128
|
}
|
|
251
129
|
const response = await fetch(
|
|
252
|
-
`http://localhost:${
|
|
130
|
+
`http://localhost:${serverInfo.httpPort}/api/reviews/${lastGlobalSessionId}/context`,
|
|
253
131
|
{
|
|
254
132
|
method: "POST",
|
|
255
133
|
headers: { "Content-Type": "application/json" },
|
|
@@ -257,13 +135,13 @@ async function startMcpServer() {
|
|
|
257
135
|
}
|
|
258
136
|
);
|
|
259
137
|
if (!response.ok) {
|
|
260
|
-
throw new Error(`
|
|
138
|
+
throw new Error(`Server returned ${response.status}`);
|
|
261
139
|
}
|
|
262
140
|
return {
|
|
263
141
|
content: [
|
|
264
142
|
{
|
|
265
143
|
type: "text",
|
|
266
|
-
text: "Context updated in DiffPrism
|
|
144
|
+
text: "Context updated in DiffPrism session."
|
|
267
145
|
}
|
|
268
146
|
]
|
|
269
147
|
};
|
|
@@ -283,7 +161,7 @@ async function startMcpServer() {
|
|
|
283
161
|
);
|
|
284
162
|
server.tool(
|
|
285
163
|
"get_review_result",
|
|
286
|
-
"Fetch the most recent review result from a DiffPrism session. Returns the reviewer's decision and comments if a review has been submitted, or a message indicating no pending result.
|
|
164
|
+
"Fetch the most recent review result from a DiffPrism session. Returns the reviewer's decision and comments if a review has been submitted, or a message indicating no pending result. Use wait=true to block until a result is available. Note: `open_review` already blocks and returns the result \u2014 this tool is only needed for advanced workflows where you want to check results separately.",
|
|
287
165
|
{
|
|
288
166
|
wait: z.boolean().optional().describe("If true, poll until a review result is available (blocks up to timeout)"),
|
|
289
167
|
timeout: z.number().optional().describe("Max wait time in seconds when wait=true (default: 300, max: 600)")
|
|
@@ -292,80 +170,36 @@ async function startMcpServer() {
|
|
|
292
170
|
try {
|
|
293
171
|
const maxWaitMs = Math.min(timeout ?? 300, 600) * 1e3;
|
|
294
172
|
const pollIntervalMs = 2e3;
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews/${lastGlobalSessionId}/result`
|
|
303
|
-
);
|
|
304
|
-
if (response2.ok) {
|
|
305
|
-
const data2 = await response2.json();
|
|
306
|
-
if (data2.result) {
|
|
307
|
-
return {
|
|
308
|
-
content: [
|
|
309
|
-
{
|
|
310
|
-
type: "text",
|
|
311
|
-
text: JSON.stringify(data2.result, null, 2)
|
|
312
|
-
}
|
|
313
|
-
]
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
173
|
+
const serverInfo = lastGlobalServerInfo ?? await isServerAlive();
|
|
174
|
+
if (!serverInfo || !lastGlobalSessionId) {
|
|
175
|
+
return {
|
|
176
|
+
content: [
|
|
177
|
+
{
|
|
178
|
+
type: "text",
|
|
179
|
+
text: "No DiffPrism session is running. Use `open_review` to start a review."
|
|
318
180
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
const response = await fetch(
|
|
181
|
+
]
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (wait) {
|
|
185
|
+
const start = Date.now();
|
|
186
|
+
while (Date.now() - start < maxWaitMs) {
|
|
187
|
+
const response2 = await fetch(
|
|
329
188
|
`http://localhost:${serverInfo.httpPort}/api/reviews/${lastGlobalSessionId}/result`
|
|
330
189
|
);
|
|
331
|
-
if (
|
|
332
|
-
const
|
|
333
|
-
if (
|
|
190
|
+
if (response2.ok) {
|
|
191
|
+
const data = await response2.json();
|
|
192
|
+
if (data.result) {
|
|
334
193
|
return {
|
|
335
194
|
content: [
|
|
336
195
|
{
|
|
337
196
|
type: "text",
|
|
338
|
-
text: JSON.stringify(
|
|
197
|
+
text: JSON.stringify(data.result, null, 2)
|
|
339
198
|
}
|
|
340
199
|
]
|
|
341
200
|
};
|
|
342
201
|
}
|
|
343
202
|
}
|
|
344
|
-
return {
|
|
345
|
-
content: [
|
|
346
|
-
{
|
|
347
|
-
type: "text",
|
|
348
|
-
text: "No pending review result."
|
|
349
|
-
}
|
|
350
|
-
]
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
if (wait) {
|
|
355
|
-
const start = Date.now();
|
|
356
|
-
while (Date.now() - start < maxWaitMs) {
|
|
357
|
-
const data2 = readReviewResult();
|
|
358
|
-
if (data2) {
|
|
359
|
-
consumeReviewResult();
|
|
360
|
-
return {
|
|
361
|
-
content: [
|
|
362
|
-
{
|
|
363
|
-
type: "text",
|
|
364
|
-
text: JSON.stringify(data2.result, null, 2)
|
|
365
|
-
}
|
|
366
|
-
]
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
203
|
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
370
204
|
}
|
|
371
205
|
return {
|
|
@@ -377,23 +211,27 @@ async function startMcpServer() {
|
|
|
377
211
|
]
|
|
378
212
|
};
|
|
379
213
|
}
|
|
380
|
-
const
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
214
|
+
const response = await fetch(
|
|
215
|
+
`http://localhost:${serverInfo.httpPort}/api/reviews/${lastGlobalSessionId}/result`
|
|
216
|
+
);
|
|
217
|
+
if (response.ok) {
|
|
218
|
+
const data = await response.json();
|
|
219
|
+
if (data.result) {
|
|
220
|
+
return {
|
|
221
|
+
content: [
|
|
222
|
+
{
|
|
223
|
+
type: "text",
|
|
224
|
+
text: JSON.stringify(data.result, null, 2)
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
};
|
|
228
|
+
}
|
|
390
229
|
}
|
|
391
|
-
consumeReviewResult();
|
|
392
230
|
return {
|
|
393
231
|
content: [
|
|
394
232
|
{
|
|
395
233
|
type: "text",
|
|
396
|
-
text:
|
|
234
|
+
text: "No pending review result."
|
|
397
235
|
}
|
|
398
236
|
]
|
|
399
237
|
};
|
|
@@ -814,59 +652,18 @@ async function startMcpServer() {
|
|
|
814
652
|
};
|
|
815
653
|
}
|
|
816
654
|
const { payload } = normalizePr(rawDiff, prMetadata, { title, reasoning });
|
|
817
|
-
const serverInfo = await
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
body: JSON.stringify({
|
|
826
|
-
payload,
|
|
827
|
-
projectPath: `github:${owner}/${repo}`,
|
|
828
|
-
diffRef: `PR #${number}`
|
|
829
|
-
})
|
|
830
|
-
}
|
|
831
|
-
);
|
|
832
|
-
if (!createResponse.ok) {
|
|
833
|
-
throw new Error(`Global server returned ${createResponse.status}`);
|
|
834
|
-
}
|
|
835
|
-
const { sessionId } = await createResponse.json();
|
|
836
|
-
lastGlobalSessionId = sessionId;
|
|
837
|
-
lastGlobalServerInfo = serverInfo;
|
|
838
|
-
const pollIntervalMs = 2e3;
|
|
839
|
-
const maxWaitMs = 600 * 1e3;
|
|
840
|
-
const start = Date.now();
|
|
841
|
-
while (Date.now() - start < maxWaitMs) {
|
|
842
|
-
const resultResponse = await fetch(
|
|
843
|
-
`http://localhost:${serverInfo.httpPort}/api/reviews/${sessionId}/result`
|
|
844
|
-
);
|
|
845
|
-
if (resultResponse.ok) {
|
|
846
|
-
const data = await resultResponse.json();
|
|
847
|
-
if (data.result) {
|
|
848
|
-
result = data.result;
|
|
849
|
-
break;
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
655
|
+
const serverInfo = await ensureServer({ silent: true });
|
|
656
|
+
const { result, sessionId } = await submitReviewToServer(
|
|
657
|
+
serverInfo,
|
|
658
|
+
`PR #${number}`,
|
|
659
|
+
{
|
|
660
|
+
injectedPayload: payload,
|
|
661
|
+
projectPath: `github:${owner}/${repo}`,
|
|
662
|
+
diffRef: `PR #${number}`
|
|
853
663
|
}
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
path.join(process.cwd(), "packages", "ui", "src", "App.tsx")
|
|
858
|
-
);
|
|
859
|
-
result = await startReview({
|
|
860
|
-
diffRef: `PR #${number}`,
|
|
861
|
-
title: payload.metadata.title,
|
|
862
|
-
description: payload.metadata.description,
|
|
863
|
-
reasoning: payload.metadata.reasoning,
|
|
864
|
-
cwd: process.cwd(),
|
|
865
|
-
silent: true,
|
|
866
|
-
dev: isDev,
|
|
867
|
-
injectedPayload: payload
|
|
868
|
-
});
|
|
869
|
-
}
|
|
664
|
+
);
|
|
665
|
+
lastGlobalSessionId = sessionId;
|
|
666
|
+
lastGlobalServerInfo = serverInfo;
|
|
870
667
|
if ((post_to_github || result.postToGithub) && result.decision !== "dismissed") {
|
|
871
668
|
const posted = await submitGitHubReview(client, owner, repo, number, result);
|
|
872
669
|
if (posted) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
detectWorktree,
|
|
3
|
+
getCurrentBranch,
|
|
4
|
+
getDiff,
|
|
5
|
+
getGitDiff,
|
|
6
|
+
listBranches,
|
|
7
|
+
listCommits,
|
|
8
|
+
parseDiff
|
|
9
|
+
} from "./chunk-QGWYCEJN.js";
|
|
10
|
+
import "./chunk-JSBRDJBE.js";
|
|
11
|
+
export {
|
|
12
|
+
detectWorktree,
|
|
13
|
+
getCurrentBranch,
|
|
14
|
+
getDiff,
|
|
15
|
+
getGitDiff,
|
|
16
|
+
listBranches,
|
|
17
|
+
listCommits,
|
|
18
|
+
parseDiff
|
|
19
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
analyze,
|
|
3
|
+
categorizeFiles,
|
|
4
|
+
computeComplexityScores,
|
|
5
|
+
computeFileStats,
|
|
6
|
+
detectAffectedModules,
|
|
7
|
+
detectAffectedTests,
|
|
8
|
+
detectNewDependencies,
|
|
9
|
+
detectPatterns,
|
|
10
|
+
detectSecurityPatterns,
|
|
11
|
+
detectTestCoverageGaps,
|
|
12
|
+
generateSummary
|
|
13
|
+
} from "./chunk-DHCVZGHE.js";
|
|
14
|
+
import "./chunk-JSBRDJBE.js";
|
|
15
|
+
export {
|
|
16
|
+
analyze,
|
|
17
|
+
categorizeFiles,
|
|
18
|
+
computeComplexityScores,
|
|
19
|
+
computeFileStats,
|
|
20
|
+
detectAffectedModules,
|
|
21
|
+
detectAffectedTests,
|
|
22
|
+
detectNewDependencies,
|
|
23
|
+
detectPatterns,
|
|
24
|
+
detectSecurityPatterns,
|
|
25
|
+
detectTestCoverageGaps,
|
|
26
|
+
generateSummary
|
|
27
|
+
};
|