@probelabs/visor 0.1.79 → 0.1.81
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/check-execution-engine.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +256 -147
- package/dist/providers/ai-check-provider.d.ts +0 -4
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/claude-code-check-provider.d.ts +0 -4
- package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts +6 -0
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/sdk/{check-execution-engine-XBKOCBEK.mjs → check-execution-engine-47OZJFUV.mjs} +2 -2
- package/dist/sdk/{chunk-HDGNSOMS.mjs → chunk-V5PUTL5N.mjs} +186 -140
- package/dist/sdk/chunk-V5PUTL5N.mjs.map +1 -0
- package/dist/sdk/sdk.js +187 -142
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +1 -1
- package/dist/session-registry.d.ts +5 -0
- package/dist/session-registry.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/sdk/chunk-HDGNSOMS.mjs.map +0 -1
- /package/dist/sdk/{check-execution-engine-XBKOCBEK.mjs.map → check-execution-engine-47OZJFUV.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/claude-code-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqB5C;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAOxD;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;;CAOtD;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAiC;;IAOzD,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDvD;;OAEG;YACW,0BAA0B;IAyCxC;;OAEG;
|
|
1
|
+
{"version":3,"file":"claude-code-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/claude-code-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqB5C;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAOxD;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;;CAOtD;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAiC;;IAOzD,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDvD;;OAEG;YACW,0BAA0B;IAyCxC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IAmB3B;;OAEG;YACW,UAAU;IAkExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA4GlC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiBzB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC9C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAgBX,iBAAiB;IA0I/B,sBAAsB,IAAI,MAAM,EAAE;IAiB5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IA0BrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
|
|
@@ -20,8 +20,14 @@ export declare class CommandCheckProvider extends CheckProvider {
|
|
|
20
20
|
* - If it's a JSON string, expose parsed properties via Proxy (e.g., value.key)
|
|
21
21
|
* - When coerced to string (toString/valueOf/Symbol.toPrimitive), return the original raw string
|
|
22
22
|
* - If parsing fails or value is not a string, return the value unchanged
|
|
23
|
+
* - Attempts to extract JSON from the end of the output if full parse fails
|
|
23
24
|
*/
|
|
24
25
|
private makeJsonSmart;
|
|
26
|
+
/**
|
|
27
|
+
* Extract JSON from the end of a string that may contain logs/debug output
|
|
28
|
+
* Looks for the last occurrence of { or [ and tries to parse from there
|
|
29
|
+
*/
|
|
30
|
+
private extractJsonFromEnd;
|
|
25
31
|
/**
|
|
26
32
|
* Recursively apply JSON-smart wrapper to outputs object values
|
|
27
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/command-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAMzD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAU;;IAY1B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAejD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"command-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/command-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAMzD;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAU;;IAY1B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAejD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAAC,aAAa,CAAC;IAyUzB,OAAO,CAAC,kBAAkB;IAkB1B;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAgFrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,2BAA2B;IAgBnC,sBAAsB,IAAI,MAAM,EAAE;IAgB5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC,eAAe,IAAI,MAAM,EAAE;IAQ3B,OAAO,CAAC,uBAAuB;IAkD/B,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,cAAc;IAmEtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,QAAQ;YAWF,qBAAqB;IAiBnC,OAAO,CAAC,uBAAuB;CA6ChC"}
|
package/dist/sdk/{check-execution-engine-XBKOCBEK.mjs → check-execution-engine-47OZJFUV.mjs}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CheckExecutionEngine
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-V5PUTL5N.mjs";
|
|
4
4
|
import "./chunk-FIL2OGF6.mjs";
|
|
5
5
|
import "./chunk-WMJKH4XE.mjs";
|
|
6
6
|
export {
|
|
7
7
|
CheckExecutionEngine
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=check-execution-engine-
|
|
9
|
+
//# sourceMappingURL=check-execution-engine-47OZJFUV.mjs.map
|
|
@@ -20,7 +20,9 @@ var init_session_registry = __esm({
|
|
|
20
20
|
SessionRegistry = class _SessionRegistry {
|
|
21
21
|
static instance;
|
|
22
22
|
sessions = /* @__PURE__ */ new Map();
|
|
23
|
+
exitHandlerRegistered = false;
|
|
23
24
|
constructor() {
|
|
25
|
+
this.registerExitHandlers();
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Get the singleton instance of SessionRegistry
|
|
@@ -54,7 +56,15 @@ var init_session_registry = __esm({
|
|
|
54
56
|
unregisterSession(sessionId) {
|
|
55
57
|
if (this.sessions.has(sessionId)) {
|
|
56
58
|
console.error(`\u{1F5D1}\uFE0F Unregistering AI session: ${sessionId}`);
|
|
59
|
+
const agent = this.sessions.get(sessionId);
|
|
57
60
|
this.sessions.delete(sessionId);
|
|
61
|
+
if (agent && typeof agent.cleanup === "function") {
|
|
62
|
+
try {
|
|
63
|
+
agent.cleanup();
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error(`\u26A0\uFE0F Warning: Failed to cleanup ProbeAgent: ${error}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
58
68
|
}
|
|
59
69
|
}
|
|
60
70
|
/**
|
|
@@ -62,6 +72,14 @@ var init_session_registry = __esm({
|
|
|
62
72
|
*/
|
|
63
73
|
clearAllSessions() {
|
|
64
74
|
console.error(`\u{1F9F9} Clearing all AI sessions (${this.sessions.size} sessions)`);
|
|
75
|
+
for (const [, agent] of this.sessions.entries()) {
|
|
76
|
+
if (agent && typeof agent.cleanup === "function") {
|
|
77
|
+
try {
|
|
78
|
+
agent.cleanup();
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
65
83
|
this.sessions.clear();
|
|
66
84
|
}
|
|
67
85
|
/**
|
|
@@ -76,6 +94,44 @@ var init_session_registry = __esm({
|
|
|
76
94
|
hasSession(sessionId) {
|
|
77
95
|
return this.sessions.has(sessionId);
|
|
78
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Register process exit handlers to cleanup sessions on exit
|
|
99
|
+
*/
|
|
100
|
+
registerExitHandlers() {
|
|
101
|
+
if (this.exitHandlerRegistered) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const cleanupAndExit = (signal) => {
|
|
105
|
+
if (this.sessions.size > 0) {
|
|
106
|
+
console.error(`
|
|
107
|
+
\u{1F9F9} [${signal}] Cleaning up ${this.sessions.size} active AI sessions...`);
|
|
108
|
+
this.clearAllSessions();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
process.on("exit", () => {
|
|
112
|
+
if (this.sessions.size > 0) {
|
|
113
|
+
console.error(`\u{1F9F9} [exit] Cleaning up ${this.sessions.size} active AI sessions...`);
|
|
114
|
+
for (const [, agent] of this.sessions.entries()) {
|
|
115
|
+
if (agent && typeof agent.cleanup === "function") {
|
|
116
|
+
try {
|
|
117
|
+
agent.cleanup();
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
this.sessions.clear();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
process.on("SIGINT", () => {
|
|
126
|
+
cleanupAndExit("SIGINT");
|
|
127
|
+
process.exit(0);
|
|
128
|
+
});
|
|
129
|
+
process.on("SIGTERM", () => {
|
|
130
|
+
cleanupAndExit("SIGTERM");
|
|
131
|
+
process.exit(0);
|
|
132
|
+
});
|
|
133
|
+
this.exitHandlerRegistered = true;
|
|
134
|
+
}
|
|
79
135
|
};
|
|
80
136
|
}
|
|
81
137
|
});
|
|
@@ -1493,7 +1549,7 @@ var PRReviewer = class {
|
|
|
1493
1549
|
async reviewPR(owner, repo, prNumber, prInfo, options = {}) {
|
|
1494
1550
|
const { debug = false, config, checks } = options;
|
|
1495
1551
|
if (config && checks && checks.length > 0) {
|
|
1496
|
-
const { CheckExecutionEngine: CheckExecutionEngine2 } = await import("./check-execution-engine-
|
|
1552
|
+
const { CheckExecutionEngine: CheckExecutionEngine2 } = await import("./check-execution-engine-47OZJFUV.mjs");
|
|
1497
1553
|
const engine = new CheckExecutionEngine2();
|
|
1498
1554
|
const { results } = await engine.executeGroupedChecks(
|
|
1499
1555
|
prInfo,
|
|
@@ -2141,17 +2197,6 @@ var IssueFilter = class {
|
|
|
2141
2197
|
// src/providers/ai-check-provider.ts
|
|
2142
2198
|
import fs3 from "fs/promises";
|
|
2143
2199
|
import path3 from "path";
|
|
2144
|
-
|
|
2145
|
-
// src/providers/claude-code-types.ts
|
|
2146
|
-
async function safeImport(moduleName) {
|
|
2147
|
-
try {
|
|
2148
|
-
return await import(moduleName);
|
|
2149
|
-
} catch {
|
|
2150
|
-
return null;
|
|
2151
|
-
}
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
// src/providers/ai-check-provider.ts
|
|
2155
2200
|
var AICheckProvider = class extends CheckProvider {
|
|
2156
2201
|
aiReviewService;
|
|
2157
2202
|
liquidEngine;
|
|
@@ -2429,54 +2474,6 @@ var AICheckProvider = class extends CheckProvider {
|
|
|
2429
2474
|
);
|
|
2430
2475
|
}
|
|
2431
2476
|
}
|
|
2432
|
-
/**
|
|
2433
|
-
* Setup MCP tools based on AI configuration
|
|
2434
|
-
*/
|
|
2435
|
-
async setupMcpTools(aiConfig) {
|
|
2436
|
-
const tools = [];
|
|
2437
|
-
if (aiConfig.mcpServers) {
|
|
2438
|
-
try {
|
|
2439
|
-
const mcpModule = await safeImport("@modelcontextprotocol/sdk");
|
|
2440
|
-
if (!mcpModule) {
|
|
2441
|
-
console.warn("@modelcontextprotocol/sdk package not found. MCP servers disabled.");
|
|
2442
|
-
return tools;
|
|
2443
|
-
}
|
|
2444
|
-
const createSdkMcpServer = mcpModule.createSdkMcpServer || mcpModule.default?.createSdkMcpServer;
|
|
2445
|
-
if (typeof createSdkMcpServer === "function") {
|
|
2446
|
-
for (const [serverName, serverConfig] of Object.entries(aiConfig.mcpServers)) {
|
|
2447
|
-
try {
|
|
2448
|
-
const server = await createSdkMcpServer({
|
|
2449
|
-
name: serverName,
|
|
2450
|
-
command: serverConfig.command,
|
|
2451
|
-
args: serverConfig.args || [],
|
|
2452
|
-
env: { ...process.env, ...serverConfig.env }
|
|
2453
|
-
});
|
|
2454
|
-
const serverTools = await server.listTools();
|
|
2455
|
-
tools.push(
|
|
2456
|
-
...serverTools.map((tool) => ({
|
|
2457
|
-
name: tool.name,
|
|
2458
|
-
server: serverName
|
|
2459
|
-
}))
|
|
2460
|
-
);
|
|
2461
|
-
} catch (serverError) {
|
|
2462
|
-
console.warn(
|
|
2463
|
-
`Failed to setup MCP server ${serverName}: ${serverError instanceof Error ? serverError.message : "Unknown error"}`
|
|
2464
|
-
);
|
|
2465
|
-
}
|
|
2466
|
-
}
|
|
2467
|
-
} else {
|
|
2468
|
-
console.warn(
|
|
2469
|
-
"createSdkMcpServer function not found in @modelcontextprotocol/sdk. MCP servers disabled."
|
|
2470
|
-
);
|
|
2471
|
-
}
|
|
2472
|
-
} catch (error) {
|
|
2473
|
-
console.warn(
|
|
2474
|
-
`Failed to import MCP SDK: ${error instanceof Error ? error.message : "Unknown error"}. MCP servers disabled.`
|
|
2475
|
-
);
|
|
2476
|
-
}
|
|
2477
|
-
}
|
|
2478
|
-
return tools;
|
|
2479
|
-
}
|
|
2480
2477
|
async execute(prInfo, config, _dependencyResults, sessionInfo) {
|
|
2481
2478
|
if (config.env) {
|
|
2482
2479
|
const result = EnvironmentResolver.withTemporaryEnv(config.env, () => {
|
|
@@ -2533,11 +2530,9 @@ var AICheckProvider = class extends CheckProvider {
|
|
|
2533
2530
|
}
|
|
2534
2531
|
if (Object.keys(mcpServers).length > 0) {
|
|
2535
2532
|
aiConfig.mcpServers = mcpServers;
|
|
2536
|
-
const mcpConfig = { mcpServers };
|
|
2537
|
-
const mcpTools = await this.setupMcpTools(mcpConfig);
|
|
2538
2533
|
if (aiConfig.debug) {
|
|
2539
2534
|
console.error(
|
|
2540
|
-
`\u{1F527} Debug: AI check MCP configured with ${Object.keys(mcpServers).length} servers
|
|
2535
|
+
`\u{1F527} Debug: AI check MCP configured with ${Object.keys(mcpServers).length} servers`
|
|
2541
2536
|
);
|
|
2542
2537
|
}
|
|
2543
2538
|
}
|
|
@@ -3367,6 +3362,17 @@ var LogCheckProvider = class extends CheckProvider {
|
|
|
3367
3362
|
// src/providers/claude-code-check-provider.ts
|
|
3368
3363
|
import fs4 from "fs/promises";
|
|
3369
3364
|
import path4 from "path";
|
|
3365
|
+
|
|
3366
|
+
// src/providers/claude-code-types.ts
|
|
3367
|
+
async function safeImport(moduleName) {
|
|
3368
|
+
try {
|
|
3369
|
+
return await import(moduleName);
|
|
3370
|
+
} catch {
|
|
3371
|
+
return null;
|
|
3372
|
+
}
|
|
3373
|
+
}
|
|
3374
|
+
|
|
3375
|
+
// src/providers/claude-code-check-provider.ts
|
|
3370
3376
|
function isClaudeCodeConstructor(value) {
|
|
3371
3377
|
return typeof value === "function";
|
|
3372
3378
|
}
|
|
@@ -3468,59 +3474,6 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
|
|
|
3468
3474
|
);
|
|
3469
3475
|
}
|
|
3470
3476
|
}
|
|
3471
|
-
/**
|
|
3472
|
-
* Setup MCP tools based on configuration
|
|
3473
|
-
*/
|
|
3474
|
-
async setupMcpTools(config) {
|
|
3475
|
-
const tools = [];
|
|
3476
|
-
if (config.allowedTools) {
|
|
3477
|
-
for (const toolName of config.allowedTools) {
|
|
3478
|
-
tools.push({ name: toolName });
|
|
3479
|
-
}
|
|
3480
|
-
}
|
|
3481
|
-
if (config.mcpServers) {
|
|
3482
|
-
try {
|
|
3483
|
-
const mcpModule = await safeImport("@modelcontextprotocol/sdk");
|
|
3484
|
-
if (!mcpModule) {
|
|
3485
|
-
console.warn("@modelcontextprotocol/sdk package not found. MCP servers disabled.");
|
|
3486
|
-
return tools;
|
|
3487
|
-
}
|
|
3488
|
-
const createSdkMcpServer = mcpModule.createSdkMcpServer || mcpModule.default?.createSdkMcpServer;
|
|
3489
|
-
if (typeof createSdkMcpServer === "function") {
|
|
3490
|
-
for (const [serverName, serverConfig] of Object.entries(config.mcpServers)) {
|
|
3491
|
-
try {
|
|
3492
|
-
const server = await createSdkMcpServer({
|
|
3493
|
-
name: serverName,
|
|
3494
|
-
command: serverConfig.command,
|
|
3495
|
-
args: serverConfig.args || [],
|
|
3496
|
-
env: { ...process.env, ...serverConfig.env }
|
|
3497
|
-
});
|
|
3498
|
-
const serverTools = await server.listTools();
|
|
3499
|
-
tools.push(
|
|
3500
|
-
...serverTools.map((tool) => ({
|
|
3501
|
-
name: tool.name,
|
|
3502
|
-
server: serverName
|
|
3503
|
-
}))
|
|
3504
|
-
);
|
|
3505
|
-
} catch (serverError) {
|
|
3506
|
-
console.warn(
|
|
3507
|
-
`Failed to setup MCP server ${serverName}: ${serverError instanceof Error ? serverError.message : "Unknown error"}`
|
|
3508
|
-
);
|
|
3509
|
-
}
|
|
3510
|
-
}
|
|
3511
|
-
} else {
|
|
3512
|
-
console.warn(
|
|
3513
|
-
"createSdkMcpServer function not found in @modelcontextprotocol/sdk. MCP servers disabled."
|
|
3514
|
-
);
|
|
3515
|
-
}
|
|
3516
|
-
} catch (error) {
|
|
3517
|
-
console.warn(
|
|
3518
|
-
`Failed to import MCP SDK: ${error instanceof Error ? error.message : "Unknown error"}. MCP servers disabled.`
|
|
3519
|
-
);
|
|
3520
|
-
}
|
|
3521
|
-
}
|
|
3522
|
-
return tools;
|
|
3523
|
-
}
|
|
3524
3477
|
/**
|
|
3525
3478
|
* Group files by their file extension for template context
|
|
3526
3479
|
*/
|
|
@@ -3751,14 +3704,18 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
|
|
|
3751
3704
|
const startTime = Date.now();
|
|
3752
3705
|
try {
|
|
3753
3706
|
const client = await this.initializeClaudeCodeClient();
|
|
3754
|
-
const tools = await this.setupMcpTools(claudeCodeConfig);
|
|
3755
3707
|
const query = {
|
|
3756
3708
|
query: processedPrompt,
|
|
3757
|
-
tools: tools.length > 0 ? tools : void 0,
|
|
3758
3709
|
maxTurns: claudeCodeConfig.maxTurns || 5,
|
|
3759
3710
|
systemPrompt: claudeCodeConfig.systemPrompt,
|
|
3760
3711
|
subagent: claudeCodeConfig.subagent
|
|
3761
3712
|
};
|
|
3713
|
+
if (claudeCodeConfig.allowedTools && claudeCodeConfig.allowedTools.length > 0) {
|
|
3714
|
+
query.tools = claudeCodeConfig.allowedTools.map((name) => ({ name }));
|
|
3715
|
+
}
|
|
3716
|
+
if (claudeCodeConfig.mcpServers && Object.keys(claudeCodeConfig.mcpServers).length > 0) {
|
|
3717
|
+
query.mcpServers = claudeCodeConfig.mcpServers;
|
|
3718
|
+
}
|
|
3762
3719
|
let response;
|
|
3763
3720
|
if (sessionInfo?.reuseSession && sessionInfo.parentSessionId) {
|
|
3764
3721
|
response = await client.query({
|
|
@@ -3786,8 +3743,7 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
|
|
|
3786
3743
|
// Claude Code specific debug info
|
|
3787
3744
|
sessionId: response.session_id,
|
|
3788
3745
|
turnCount: response.turn_count,
|
|
3789
|
-
usage: response.usage
|
|
3790
|
-
toolsUsed: tools.map((t) => t.name)
|
|
3746
|
+
usage: response.usage
|
|
3791
3747
|
};
|
|
3792
3748
|
const suppressionEnabled = config.suppressionEnabled !== false;
|
|
3793
3749
|
const issueFilter = new IssueFilter(suppressionEnabled);
|
|
@@ -3953,7 +3909,19 @@ var CommandCheckProvider = class extends CheckProvider {
|
|
|
3953
3909
|
const parsed = JSON.parse(rawOutput);
|
|
3954
3910
|
output = parsed;
|
|
3955
3911
|
} catch {
|
|
3956
|
-
|
|
3912
|
+
const extracted2 = this.extractJsonFromEnd(rawOutput);
|
|
3913
|
+
if (extracted2) {
|
|
3914
|
+
try {
|
|
3915
|
+
output = JSON.parse(extracted2);
|
|
3916
|
+
logger.debug(
|
|
3917
|
+
`\u{1F527} Debug: Extracted and parsed JSON from end of output (${extracted2.length} chars from ${rawOutput.length} total)`
|
|
3918
|
+
);
|
|
3919
|
+
} catch {
|
|
3920
|
+
output = rawOutput;
|
|
3921
|
+
}
|
|
3922
|
+
} else {
|
|
3923
|
+
output = rawOutput;
|
|
3924
|
+
}
|
|
3957
3925
|
}
|
|
3958
3926
|
let finalOutput = output;
|
|
3959
3927
|
if (transform) {
|
|
@@ -4172,6 +4140,7 @@ ${stderrOutput}` : `Command execution failed: ${errorMessage}`;
|
|
|
4172
4140
|
* - If it's a JSON string, expose parsed properties via Proxy (e.g., value.key)
|
|
4173
4141
|
* - When coerced to string (toString/valueOf/Symbol.toPrimitive), return the original raw string
|
|
4174
4142
|
* - If parsing fails or value is not a string, return the value unchanged
|
|
4143
|
+
* - Attempts to extract JSON from the end of the output if full parse fails
|
|
4175
4144
|
*/
|
|
4176
4145
|
makeJsonSmart(value) {
|
|
4177
4146
|
if (typeof value !== "string") {
|
|
@@ -4182,7 +4151,19 @@ ${stderrOutput}` : `Command execution failed: ${errorMessage}`;
|
|
|
4182
4151
|
try {
|
|
4183
4152
|
parsed = JSON.parse(raw);
|
|
4184
4153
|
} catch {
|
|
4185
|
-
|
|
4154
|
+
const jsonMatch = this.extractJsonFromEnd(raw);
|
|
4155
|
+
if (jsonMatch) {
|
|
4156
|
+
try {
|
|
4157
|
+
parsed = JSON.parse(jsonMatch);
|
|
4158
|
+
logger.debug(
|
|
4159
|
+
`\u{1F527} Debug: Extracted JSON from end of output (${jsonMatch.length} chars from ${raw.length} total)`
|
|
4160
|
+
);
|
|
4161
|
+
} catch {
|
|
4162
|
+
return raw;
|
|
4163
|
+
}
|
|
4164
|
+
} else {
|
|
4165
|
+
return raw;
|
|
4166
|
+
}
|
|
4186
4167
|
}
|
|
4187
4168
|
const boxed = new String(raw);
|
|
4188
4169
|
const handler = {
|
|
@@ -4231,6 +4212,24 @@ ${stderrOutput}` : `Command execution failed: ${errorMessage}`;
|
|
|
4231
4212
|
};
|
|
4232
4213
|
return new Proxy(boxed, handler);
|
|
4233
4214
|
}
|
|
4215
|
+
/**
|
|
4216
|
+
* Extract JSON from the end of a string that may contain logs/debug output
|
|
4217
|
+
* Looks for the last occurrence of { or [ and tries to parse from there
|
|
4218
|
+
*/
|
|
4219
|
+
extractJsonFromEnd(text) {
|
|
4220
|
+
const lines = text.split("\n");
|
|
4221
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
4222
|
+
const trimmed = lines[i].trim();
|
|
4223
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
4224
|
+
const candidate = lines.slice(i).join("\n");
|
|
4225
|
+
const trimmedCandidate = candidate.trim();
|
|
4226
|
+
if (trimmedCandidate.startsWith("{") && trimmedCandidate.endsWith("}") || trimmedCandidate.startsWith("[") && trimmedCandidate.endsWith("]")) {
|
|
4227
|
+
return trimmedCandidate;
|
|
4228
|
+
}
|
|
4229
|
+
}
|
|
4230
|
+
}
|
|
4231
|
+
return null;
|
|
4232
|
+
}
|
|
4234
4233
|
/**
|
|
4235
4234
|
* Recursively apply JSON-smart wrapper to outputs object values
|
|
4236
4235
|
*/
|
|
@@ -6987,11 +6986,15 @@ ${expr}
|
|
|
6987
6986
|
for (const depId of directDeps) {
|
|
6988
6987
|
const depRes = results.get(depId);
|
|
6989
6988
|
if (!depRes) continue;
|
|
6990
|
-
const
|
|
6989
|
+
const wasSkipped = (depRes.issues || []).some((issue) => {
|
|
6991
6990
|
const id = issue.ruleId || "";
|
|
6992
|
-
return id.endsWith("/
|
|
6991
|
+
return id.endsWith("/__skipped");
|
|
6993
6992
|
});
|
|
6994
|
-
|
|
6993
|
+
const hasFatalFailure = (depRes.issues || []).some((issue) => {
|
|
6994
|
+
const id = issue.ruleId || "";
|
|
6995
|
+
return id === "command/execution_error" || id.endsWith("/command/execution_error") || id === "command/transform_js_error" || id.endsWith("/command/transform_js_error") || id === "command/transform_error" || id.endsWith("/command/transform_error") || id.endsWith("/forEach/iteration_error");
|
|
6996
|
+
});
|
|
6997
|
+
if (wasSkipped || hasFatalFailure) failedDeps.push(depId);
|
|
6995
6998
|
}
|
|
6996
6999
|
if (failedDeps.length > 0) {
|
|
6997
7000
|
this.recordSkip(checkName, "dependency_failed");
|
|
@@ -7057,7 +7060,9 @@ ${expr}
|
|
|
7057
7060
|
`\u{1F504} Debug: Check "${checkName}" depends on forEach check "${forEachParentName}", executing ${forEachItems.length} times`
|
|
7058
7061
|
);
|
|
7059
7062
|
}
|
|
7060
|
-
logger.info(
|
|
7063
|
+
logger.info(
|
|
7064
|
+
` forEach: processing ${forEachItems.length} items from "${forEachParentName}"...`
|
|
7065
|
+
);
|
|
7061
7066
|
const allIssues = [];
|
|
7062
7067
|
const allOutputs = [];
|
|
7063
7068
|
const aggregatedContents = [];
|
|
@@ -7134,11 +7139,16 @@ ${expr}
|
|
|
7134
7139
|
parent: forEachParentName
|
|
7135
7140
|
}
|
|
7136
7141
|
);
|
|
7142
|
+
const hadFatalError = (itemResult.issues || []).some((issue) => {
|
|
7143
|
+
const id = issue.ruleId || "";
|
|
7144
|
+
return id === "command/execution_error" || id.endsWith("/command/execution_error") || id === "command/transform_js_error" || id.endsWith("/command/transform_js_error") || id === "command/transform_error" || id.endsWith("/command/transform_error");
|
|
7145
|
+
});
|
|
7137
7146
|
const iterationDuration = (Date.now() - iterationStart) / 1e3;
|
|
7138
7147
|
this.recordIterationComplete(
|
|
7139
7148
|
checkName,
|
|
7140
7149
|
iterationStart,
|
|
7141
|
-
|
|
7150
|
+
!hadFatalError,
|
|
7151
|
+
// Success if no fatal errors
|
|
7142
7152
|
itemResult.issues || [],
|
|
7143
7153
|
itemResult.output
|
|
7144
7154
|
);
|
|
@@ -7163,7 +7173,22 @@ ${expr}
|
|
|
7163
7173
|
);
|
|
7164
7174
|
for (const result of forEachResults) {
|
|
7165
7175
|
if (result.status === "rejected") {
|
|
7166
|
-
|
|
7176
|
+
const error = result.reason;
|
|
7177
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
7178
|
+
allIssues.push({
|
|
7179
|
+
ruleId: `${checkName}/forEach/iteration_error`,
|
|
7180
|
+
severity: "error",
|
|
7181
|
+
category: "logic",
|
|
7182
|
+
message: `forEach iteration failed: ${errorMessage}`,
|
|
7183
|
+
file: "",
|
|
7184
|
+
line: 0
|
|
7185
|
+
});
|
|
7186
|
+
if (debug) {
|
|
7187
|
+
log2(
|
|
7188
|
+
`\u{1F504} Debug: forEach iteration for check "${checkName}" failed: ${errorMessage}`
|
|
7189
|
+
);
|
|
7190
|
+
}
|
|
7191
|
+
continue;
|
|
7167
7192
|
}
|
|
7168
7193
|
if (result.value.skipped) {
|
|
7169
7194
|
continue;
|
|
@@ -7231,10 +7256,15 @@ ${expr}
|
|
|
7231
7256
|
debug,
|
|
7232
7257
|
results
|
|
7233
7258
|
);
|
|
7259
|
+
const hadFatalError = (finalResult.issues || []).some((issue) => {
|
|
7260
|
+
const id = issue.ruleId || "";
|
|
7261
|
+
return id === "command/execution_error" || id.endsWith("/command/execution_error") || id === "command/transform_js_error" || id.endsWith("/command/transform_js_error") || id === "command/transform_error" || id.endsWith("/command/transform_error");
|
|
7262
|
+
});
|
|
7234
7263
|
this.recordIterationComplete(
|
|
7235
7264
|
checkName,
|
|
7236
7265
|
checkStartTime,
|
|
7237
|
-
|
|
7266
|
+
!hadFatalError,
|
|
7267
|
+
// Success if no fatal errors
|
|
7238
7268
|
finalResult.issues || [],
|
|
7239
7269
|
finalResult.output
|
|
7240
7270
|
);
|
|
@@ -7322,8 +7352,20 @@ ${expr}
|
|
|
7322
7352
|
if (result.status === "fulfilled" && result.value.result && !result.value.error) {
|
|
7323
7353
|
if (result.value.skipped) {
|
|
7324
7354
|
if (debug) {
|
|
7325
|
-
log2(`\u{1F527} Debug:
|
|
7355
|
+
log2(`\u{1F527} Debug: Storing skip marker for skipped check "${checkName}"`);
|
|
7326
7356
|
}
|
|
7357
|
+
results.set(checkName, {
|
|
7358
|
+
issues: [
|
|
7359
|
+
{
|
|
7360
|
+
ruleId: `${checkName}/__skipped`,
|
|
7361
|
+
severity: "info",
|
|
7362
|
+
category: "logic",
|
|
7363
|
+
message: "Check was skipped",
|
|
7364
|
+
file: "",
|
|
7365
|
+
line: 0
|
|
7366
|
+
}
|
|
7367
|
+
]
|
|
7368
|
+
});
|
|
7327
7369
|
continue;
|
|
7328
7370
|
}
|
|
7329
7371
|
const reviewResult = result.value.result;
|
|
@@ -7348,6 +7390,7 @@ ${expr}
|
|
|
7348
7390
|
} else {
|
|
7349
7391
|
normalizedOutput = [rawOutput];
|
|
7350
7392
|
}
|
|
7393
|
+
logger.info(` Found ${normalizedOutput.length} items for forEach iteration`);
|
|
7351
7394
|
try {
|
|
7352
7395
|
const preview = JSON.stringify(normalizedOutput);
|
|
7353
7396
|
logger.debug(
|
|
@@ -7406,14 +7449,6 @@ ${expr}
|
|
|
7406
7449
|
}
|
|
7407
7450
|
}
|
|
7408
7451
|
}
|
|
7409
|
-
const executionStatistics = this.buildExecutionStatistics();
|
|
7410
|
-
if (logFn === console.log) {
|
|
7411
|
-
this.logExecutionSummary(executionStatistics);
|
|
7412
|
-
}
|
|
7413
|
-
if (shouldStopExecution) {
|
|
7414
|
-
logger.info("");
|
|
7415
|
-
logger.warn(`\u26A0\uFE0F Execution stopped early due to fail-fast`);
|
|
7416
|
-
}
|
|
7417
7452
|
if (debug) {
|
|
7418
7453
|
if (shouldStopExecution) {
|
|
7419
7454
|
log2(
|
|
@@ -7434,6 +7469,14 @@ ${expr}
|
|
|
7434
7469
|
}
|
|
7435
7470
|
}
|
|
7436
7471
|
}
|
|
7472
|
+
const executionStatistics = this.buildExecutionStatistics();
|
|
7473
|
+
if (logFn === console.log) {
|
|
7474
|
+
this.logExecutionSummary(executionStatistics);
|
|
7475
|
+
}
|
|
7476
|
+
if (shouldStopExecution) {
|
|
7477
|
+
logger.info("");
|
|
7478
|
+
logger.warn(`\u26A0\uFE0F Execution stopped early due to fail-fast`);
|
|
7479
|
+
}
|
|
7437
7480
|
return this.aggregateDependencyAwareResults(
|
|
7438
7481
|
results,
|
|
7439
7482
|
dependencyGraph,
|
|
@@ -7652,7 +7695,10 @@ ${expr}
|
|
|
7652
7695
|
`\u2705 Check "${checkName}" completed: ${(result.issues || []).length} issues found (level ${executionGroup.level})`
|
|
7653
7696
|
);
|
|
7654
7697
|
}
|
|
7655
|
-
|
|
7698
|
+
const nonInternalIssues = (result.issues || []).filter(
|
|
7699
|
+
(issue) => !issue.ruleId?.endsWith("/__skipped")
|
|
7700
|
+
);
|
|
7701
|
+
aggregatedIssues.push(...nonInternalIssues);
|
|
7656
7702
|
const resultSummary = result;
|
|
7657
7703
|
const resultContent = resultSummary.content;
|
|
7658
7704
|
if (typeof resultContent === "string" && resultContent.trim()) {
|
|
@@ -8587,4 +8633,4 @@ export {
|
|
|
8587
8633
|
logger,
|
|
8588
8634
|
CheckExecutionEngine
|
|
8589
8635
|
};
|
|
8590
|
-
//# sourceMappingURL=chunk-
|
|
8636
|
+
//# sourceMappingURL=chunk-V5PUTL5N.mjs.map
|