@securecode-ai/mcp 0.4.10 → 0.5.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.
@@ -185,3 +185,17 @@ export interface SandboxProveResponse {
185
185
  };
186
186
  scanCredits?: number;
187
187
  }
188
+ export interface VerifyGenerateResponse {
189
+ canTest: boolean;
190
+ testScript?: string;
191
+ runner?: string;
192
+ description?: string;
193
+ skipReason?: string;
194
+ scanCredits?: number;
195
+ }
196
+ export interface VerifyAnalyzeResponse {
197
+ verdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
198
+ reason: string;
199
+ shouldRetry: boolean;
200
+ scanCredits?: number;
201
+ }
@@ -0,0 +1,31 @@
1
+ import type { ApiClient } from '../api/client';
2
+ export interface VerifyFinding {
3
+ type: string;
4
+ line: number;
5
+ lineEnd?: number;
6
+ evidence: string;
7
+ why: string;
8
+ severity: string;
9
+ }
10
+ export interface VerifyLoopOptions {
11
+ finding: VerifyFinding;
12
+ filePath: string;
13
+ code: string;
14
+ relatedFiles: Array<{
15
+ filePath: string;
16
+ content: string;
17
+ relationship: string;
18
+ }>;
19
+ workspaceRoot: string;
20
+ language: string;
21
+ client: ApiClient;
22
+ onProgress?: (round: number, maxRounds: number, message: string) => void;
23
+ }
24
+ export interface VerifyLoopResult {
25
+ verdict: 'PROVEN' | 'UNPROVEN' | 'INCONCLUSIVE';
26
+ reason: string;
27
+ roundsUsed: number;
28
+ testScript: string;
29
+ testOutput: string;
30
+ }
31
+ export declare function runVerifyLoop(opts: VerifyLoopOptions): Promise<VerifyLoopResult>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runVerifyLoop = runVerifyLoop;
4
+ const localTestRunner_1 = require("../utils/localTestRunner");
5
+ const MAX_ROUNDS = 8;
6
+ async function runVerifyLoop(opts) {
7
+ const { finding, filePath, code, relatedFiles, workspaceRoot, language, client, onProgress } = opts;
8
+ const previousErrors = [];
9
+ let lastTestScript = '';
10
+ let lastTestOutput = '';
11
+ for (let round = 1; round <= MAX_ROUNDS; round++) {
12
+ onProgress?.(round, MAX_ROUNDS, `Round ${round}: generating test...`);
13
+ const genResp = await client.postJson('/verify/generate', {
14
+ code,
15
+ language,
16
+ vulnerabilityType: finding.type,
17
+ line: finding.line,
18
+ lineEnd: finding.lineEnd,
19
+ evidence: finding.evidence,
20
+ why: finding.why,
21
+ filePath,
22
+ relatedFiles,
23
+ previousErrors: previousErrors.length > 0 ? previousErrors : undefined,
24
+ });
25
+ if (!genResp.canTest || !genResp.testScript) {
26
+ return {
27
+ verdict: 'INCONCLUSIVE',
28
+ reason: genResp.skipReason || 'Could not generate a test for this vulnerability type.',
29
+ roundsUsed: round,
30
+ testScript: '',
31
+ testOutput: '',
32
+ };
33
+ }
34
+ lastTestScript = genResp.testScript;
35
+ const runner = genResp.runner || (language === 'typescript' ? 'tsx' : 'node');
36
+ onProgress?.(round, MAX_ROUNDS, `Round ${round}: running test...`);
37
+ const testResult = await (0, localTestRunner_1.runLocalTest)(genResp.testScript, runner, workspaceRoot);
38
+ lastTestOutput = testResult.output;
39
+ onProgress?.(round, MAX_ROUNDS, `Round ${round}: analyzing result...`);
40
+ const analyzeResp = await client.postJson('/verify/analyze', {
41
+ vulnerabilityType: finding.type,
42
+ line: finding.line,
43
+ evidence: finding.evidence,
44
+ why: finding.why,
45
+ testScript: genResp.testScript,
46
+ stdout: testResult.output,
47
+ stderr: '',
48
+ exitCode: testResult.exitCode,
49
+ round,
50
+ maxRounds: MAX_ROUNDS,
51
+ });
52
+ if (analyzeResp.verdict === 'PROVEN') {
53
+ return { verdict: 'PROVEN', reason: analyzeResp.reason, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
54
+ }
55
+ if (analyzeResp.verdict === 'UNPROVEN') {
56
+ return { verdict: 'UNPROVEN', reason: analyzeResp.reason, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
57
+ }
58
+ if (!analyzeResp.shouldRetry || round >= MAX_ROUNDS) {
59
+ return { verdict: 'INCONCLUSIVE', reason: analyzeResp.reason || `Could not verify after ${round} round(s).`, roundsUsed: round, testScript: lastTestScript, testOutput: lastTestOutput };
60
+ }
61
+ previousErrors.push(`Round ${round}: ${testResult.verdict} — ${testResult.output.slice(0, 500)}`);
62
+ }
63
+ return { verdict: 'INCONCLUSIVE', reason: `Exhausted all ${MAX_ROUNDS} rounds.`, roundsUsed: MAX_ROUNDS, testScript: lastTestScript, testOutput: lastTestOutput };
64
+ }
65
+ //# sourceMappingURL=verifyLoop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyLoop.js","sourceRoot":"","sources":["../../src/attack/verifyLoop.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,19 @@
1
1
  /**
2
- * securecode.agent-scan MCP tool — agent-mode scan with exploit proof.
2
+ * securecode.agent-scan MCP tool — agent-mode scan with exploit verification.
3
3
  *
4
4
  * An AI investigator that reads files, traces data flows, checks guards,
5
5
  * and compares endpoint policies to find vulnerabilities. Each high/critical
6
- * finding is then sent to the sandbox for PROVEN/UNPROVEN verification before
7
- * the Juror confirms it.
6
+ * finding is then verified by the verify subagent — a round-based loop that
7
+ * generates a local integration test, runs it on the user's machine, and
8
+ * analyzes the output for a PROVEN/UNPROVEN/INCONCLUSIVE verdict.
8
9
  *
9
10
  * Flow:
10
11
  * 1. Resolve code + language from filePath
11
12
  * 2. Build endpoint context from the project map
12
13
  * 3. Run the agent loop (POST /agent/scan/start + /step loop)
13
- * 4. For each high/critical finding → POST /sandbox/prove → PROVEN/UNPROVEN
14
- * 5. Map agent findings → CandidateContext[]
15
- * 6. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
16
- * Juror + Phase 3 verify the agent's candidates)
17
- * 7. Return merged result (agent findings + proven stamps + Juror-verified)
14
+ * 4. For each finding → runVerifyLoop (generate test → run locally → analyze)
15
+ * 5. Generate fixes for proven/suspected findings
16
+ * 6. Return result with proven stamps
18
17
  */
19
18
  import type { ServerContext } from '../mcp/types';
20
19
  export declare function toolAgentScan(ctx: ServerContext, args: any): Promise<unknown>;
@@ -1,21 +1,20 @@
1
1
  "use strict";
2
2
  /**
3
- * securecode.agent-scan MCP tool — agent-mode scan with exploit proof.
3
+ * securecode.agent-scan MCP tool — agent-mode scan with exploit verification.
4
4
  *
5
5
  * An AI investigator that reads files, traces data flows, checks guards,
6
6
  * and compares endpoint policies to find vulnerabilities. Each high/critical
7
- * finding is then sent to the sandbox for PROVEN/UNPROVEN verification before
8
- * the Juror confirms it.
7
+ * finding is then verified by the verify subagent — a round-based loop that
8
+ * generates a local integration test, runs it on the user's machine, and
9
+ * analyzes the output for a PROVEN/UNPROVEN/INCONCLUSIVE verdict.
9
10
  *
10
11
  * Flow:
11
12
  * 1. Resolve code + language from filePath
12
13
  * 2. Build endpoint context from the project map
13
14
  * 3. Run the agent loop (POST /agent/scan/start + /step loop)
14
- * 4. For each high/critical finding → POST /sandbox/prove → PROVEN/UNPROVEN
15
- * 5. Map agent findings → CandidateContext[]
16
- * 6. POST /scan with scanDepth: 'agent' + candidateContexts (skips Scout,
17
- * Juror + Phase 3 verify the agent's candidates)
18
- * 7. Return merged result (agent findings + proven stamps + Juror-verified)
15
+ * 4. For each finding → runVerifyLoop (generate test → run locally → analyze)
16
+ * 5. Generate fixes for proven/suspected findings
17
+ * 6. Return result with proven stamps
19
18
  */
20
19
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
20
  if (k2 === undefined) k2 = k;
@@ -59,89 +58,11 @@ const mapContext_1 = require("../project-map/mapContext");
59
58
  const scanCache_1 = require("../project-map/scanCache");
60
59
  const agentMemory_1 = require("../project-map/agentMemory");
61
60
  const agentScanLoop_1 = require("../attack/agentScanLoop");
62
- function mapFindingsToCandidates(findings) {
63
- return findings.map(f => ({
64
- line: f.line,
65
- lineEnd: f.lineEnd,
66
- type: f.type,
67
- snippet: f.evidence,
68
- definitionContext: f.why,
69
- }));
70
- }
61
+ const verifyLoop_1 = require("../attack/verifyLoop");
71
62
  /** Prove high/critical/medium findings — skip only low. */
72
63
  function shouldProve(finding) {
73
64
  return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
74
65
  }
75
- /** Run a test script locally on the user's machine where the project is installed.
76
- * Writes the script to a temp file, runs it with the specified runner, reads the output.
77
- * Returns the verdict (pass/fail/error/timeout) and the output. */
78
- async function runLocalTest(testScript, runner, workspaceRoot) {
79
- const fs = require('fs');
80
- const path = require('path');
81
- const { execFileSync } = require('child_process');
82
- const testDir = path.join(workspaceRoot, '.securecode');
83
- if (!fs.existsSync(testDir))
84
- fs.mkdirSync(testDir, { recursive: true });
85
- const ext = runner === 'tsx' || runner === 'ts' ? '.test.ts' : '.test.js';
86
- const testFile = path.join(testDir, `prove-test-${Date.now()}${ext}`);
87
- const outputFile = path.join(testDir, `prove-test-${Date.now()}.out`);
88
- try {
89
- fs.writeFileSync(testFile, testScript, 'utf8');
90
- let stdout = '';
91
- let stderr = '';
92
- let exitCode;
93
- let timedOut = false;
94
- try {
95
- const runnerBin = runner === 'tsx' ? 'npx' : runner;
96
- const runnerArgs = runner === 'tsx' ? ['tsx', testFile] : [testFile];
97
- stdout = execFileSync(runnerBin, runnerArgs, {
98
- cwd: workspaceRoot,
99
- timeout: 30000,
100
- encoding: 'utf8',
101
- stdio: ['pipe', 'pipe', 'pipe'],
102
- env: { ...process.env, NODE_OPTIONS: '--loader tsx' },
103
- });
104
- exitCode = 0;
105
- }
106
- catch (err) {
107
- stdout = err.stdout || '';
108
- stderr = err.stderr || '';
109
- exitCode = err.status ?? 1;
110
- if (err.signal === 'SIGTERM')
111
- timedOut = true;
112
- }
113
- const output = stdout + stderr;
114
- const hasPass = /PASS:/i.test(output);
115
- const hasFail = /FAIL:/i.test(output);
116
- if (timedOut) {
117
- return { verdict: 'timeout', output: 'Test timed out after 30s' };
118
- }
119
- if (hasPass) {
120
- return { verdict: 'pass', output: output.slice(0, 2000) };
121
- }
122
- if (hasFail) {
123
- return { verdict: 'fail', output: output.slice(0, 2000) };
124
- }
125
- // No PASS/FAIL marker — check exit code
126
- if (exitCode === 0) {
127
- return { verdict: 'pass', output: output.slice(0, 2000) };
128
- }
129
- return { verdict: 'error', output: output.slice(0, 2000) };
130
- }
131
- catch (err) {
132
- return { verdict: 'error', output: err.message || String(err) };
133
- }
134
- finally {
135
- try {
136
- fs.unlinkSync(testFile);
137
- }
138
- catch { }
139
- try {
140
- fs.unlinkSync(outputFile);
141
- }
142
- catch { }
143
- }
144
- }
145
66
  async function toolAgentScan(ctx, args) {
146
67
  const progress = args._progress;
147
68
  // 1. Resolve code + language
@@ -264,100 +185,78 @@ async function toolAgentScan(ctx, args) {
264
185
  if (agentResult.status === 'spawn_failed') {
265
186
  throw new Error(agentResult.error || 'Agent scan failed to start.');
266
187
  }
267
- // 4. Prove each high/critical finding via the sandbox
188
+ // 4. Verify each finding via the verify subagent (replaces sandbox prove + juror)
268
189
  const client = new client_1.ApiClient({ baseUrl: ctx.apiUrl, token: ctx.apiToken });
269
190
  const provenFindings = [];
270
191
  const proveable = agentResult.findings.filter(shouldProve);
271
192
  if (proveable.length > 0 && progress) {
272
- progress(0, proveable.length, `Proving ${proveable.length} finding(s) in sandbox...`);
193
+ progress(0, proveable.length, `Verifying ${proveable.length} finding(s)...`);
273
194
  }
274
195
  let proveIdx = 0;
275
196
  for (const finding of agentResult.findings) {
276
197
  if (!shouldProve(finding)) {
277
- provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not proven' });
198
+ provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not verified' });
278
199
  continue;
279
200
  }
280
201
  if (progress) {
281
202
  proveIdx++;
282
- progress(proveIdx, proveable.length, `Proving ${finding.type} at line ${finding.line}...`);
203
+ progress(proveIdx, proveable.length, `Verifying ${finding.type} at line ${finding.line}...`);
283
204
  }
284
- // Try local integration test first (100% proof — runs against real code)
285
- let proved = false;
286
205
  try {
287
- const localTestResp = await client.postJson('/sandbox/prove/local', {
206
+ const result = await (0, verifyLoop_1.runVerifyLoop)({
207
+ finding: {
208
+ type: finding.type,
209
+ line: finding.line,
210
+ lineEnd: finding.lineEnd,
211
+ evidence: finding.evidence,
212
+ why: finding.why,
213
+ severity: finding.severity,
214
+ },
215
+ filePath: filePath || '',
288
216
  code,
289
- language,
290
- vulnerabilityType: finding.type,
291
- line: finding.line,
292
- lineEnd: finding.lineEnd,
293
- evidence: finding.evidence,
294
- why: finding.why,
295
- filePath,
296
217
  relatedFiles: relatedFiles.map(rf => ({
297
218
  filePath: rf.filePath,
298
219
  content: rf.content,
299
220
  relationship: rf.relationship,
300
221
  })),
222
+ workspaceRoot: ctx.workspaceRoot,
223
+ language,
224
+ client,
225
+ onProgress: (round, maxR, msg) => {
226
+ if (progress)
227
+ progress(proveIdx, proveable.length, `Verify round ${round}/${maxR}: ${msg}`);
228
+ },
229
+ });
230
+ provenFindings.push({
231
+ ...finding,
232
+ proven: result.verdict,
233
+ provenReason: result.reason,
301
234
  });
302
- if (localTestResp.canTest && localTestResp.testScript) {
303
- // Run the test locally
304
- const testResult = await runLocalTest(localTestResp.testScript, localTestResp.runner || (language === 'typescript' ? 'tsx' : 'node'), ctx.workspaceRoot);
305
- if (testResult.verdict === 'pass') {
306
- provenFindings.push({
307
- ...finding,
308
- proven: 'PROVEN',
309
- provenReason: `Local integration test PASSED: ${testResult.output.slice(0, 200)}`,
310
- });
311
- proved = true;
312
- }
313
- else if (testResult.verdict === 'fail') {
314
- provenFindings.push({
315
- ...finding,
316
- proven: 'UNPROVEN',
317
- provenReason: `Local integration test FAILED (exploit was blocked): ${testResult.output.slice(0, 200)}`,
318
- });
319
- proved = true;
320
- }
321
- // If error/timeout, fall through to sandbox prove
322
- }
323
235
  }
324
236
  catch (err) {
325
- console.warn(`[Agent Scan] Local test failed: ${err.message}. Falling back to sandbox prove.`);
326
- }
327
- // Fall back to sandbox prove if local test didn't give a definitive answer
328
- if (!proved) {
329
- for (let attempt = 1; attempt <= 2; attempt++) {
330
- try {
331
- const proveResp = await client.postJson('/sandbox/prove', {
332
- code,
333
- language,
334
- vulnerabilityType: finding.type,
335
- line: finding.line,
336
- lineEnd: finding.lineEnd,
337
- evidence: finding.evidence,
338
- why: finding.why,
339
- });
340
- provenFindings.push({
341
- ...finding,
342
- proven: proveResp.proven,
343
- provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
344
- });
345
- proved = true;
346
- break;
347
- }
348
- catch (err) {
349
- if (attempt === 1) {
350
- console.warn(`[Agent Scan] Prove attempt 1 failed: ${err.message}. Retrying...`);
351
- await new Promise(r => setTimeout(r, 2000));
352
- }
353
- else {
354
- provenFindings.push({
355
- ...finding,
356
- proven: 'INCONCLUSIVE',
357
- provenReason: `Sandbox prove failed after 2 attempts: ${err.message || err}`,
358
- });
359
- }
360
- }
237
+ console.warn(`[Agent Scan] Verify loop failed: ${err.message}. Falling back to sandbox prove.`);
238
+ try {
239
+ const proveResp = await client.postJson('/sandbox/prove', {
240
+ code,
241
+ language,
242
+ vulnerabilityType: finding.type,
243
+ line: finding.line,
244
+ lineEnd: finding.lineEnd,
245
+ evidence: finding.evidence,
246
+ why: finding.why,
247
+ });
248
+ provenFindings.push({
249
+ ...finding,
250
+ proven: proveResp.proven,
251
+ provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
252
+ });
253
+ }
254
+ catch (err2) {
255
+ provenFindings.push({
256
+ ...finding,
257
+ proven: 'INCONCLUSIVE',
258
+ provenReason: `Verify failed: ${err.message}; Sandbox fallback also failed: ${err2.message}`,
259
+ });
361
260
  }
362
261
  }
363
262
  }
@@ -398,57 +297,7 @@ async function toolAgentScan(ctx, args) {
398
297
  console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
399
298
  }
400
299
  }
401
- // 5. Map findings → CandidateContext[]
402
- const candidateContexts = mapFindingsToCandidates(provenFindings);
403
- // 6. If no findings, return early
404
- if (candidateContexts.length === 0) {
405
- if (useCache) {
406
- try {
407
- (0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
408
- findings: provenFindings,
409
- status: agentResult.status,
410
- summary: agentResult.summary,
411
- stepsUsed: agentResult.stepsUsed,
412
- costSpentUsd: agentResult.costSpentUsd,
413
- });
414
- }
415
- catch (err) {
416
- console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
417
- }
418
- }
419
- return {
420
- status: agentResult.status,
421
- summary: agentResult.summary || 'Agent completed with no findings.',
422
- findings: [],
423
- agentFindings: provenFindings,
424
- stepsUsed: agentResult.stepsUsed,
425
- costSpentUsd: agentResult.costSpentUsd,
426
- transcript: agentResult.transcript,
427
- };
428
- }
429
- // 7. POST /scan with scanDepth: 'agent' + candidateContexts
430
- // This skips Scout and sends the agent's candidates directly to Juror
431
- // + Phase 3 for verification.
432
- // If this call fails, return the agent findings without Juror
433
- // verification (degraded mode) instead of throwing everything away.
434
- let scanResp = null;
435
- try {
436
- scanResp = await client.postJson('/scan', {
437
- code,
438
- language,
439
- ...(filePath ? { filePath } : {}),
440
- scanDepth: 'agent',
441
- candidateContexts,
442
- ...(endpointContext.length > 0 ? { endpointContext } : {}),
443
- ...(relatedFiles.length > 0 ? { workspaceHints: { relatedFiles } } : {}),
444
- });
445
- }
446
- catch (err) {
447
- // Juror verification failed — return agent findings as-is (degraded).
448
- // This is better than throwing, which would lose all the agent's work.
449
- console.warn(`[Agent Scan] Juror verification failed (${err?.message || err}). Returning agent findings without verification.`);
450
- }
451
- // 8. Write to cache before returning
300
+ // 5. Write to cache before returning
452
301
  if (useCache) {
453
302
  try {
454
303
  (0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
@@ -463,37 +312,13 @@ async function toolAgentScan(ctx, args) {
463
312
  console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
464
313
  }
465
314
  }
466
- // 9. Return merged result with proven stamps
467
- // If Juror failed, scanResp is null — return agent findings as verified=false
468
- if (!scanResp) {
469
- return {
470
- status: agentResult.status,
471
- summary: (agentResult.summary || 'Agent completed') + ' (Juror verification skipped — degraded)',
472
- agentFindings: provenFindings,
473
- verifiedFindings: [],
474
- allFindings: [],
475
- degraded: true,
476
- stepsUsed: agentResult.stepsUsed,
477
- costSpentUsd: agentResult.costSpentUsd,
478
- transcript: agentResult.transcript,
479
- provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
480
- unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
481
- inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
482
- notReproducibleCount: provenFindings.filter(f => f.proven === 'NOT_REPRODUCIBLE').length,
483
- skippedCount: provenFindings.filter(f => f.proven === 'SKIPPED').length,
484
- };
485
- }
315
+ // 6. Return result — the verify subagent IS the verifier (no separate Juror call)
486
316
  return {
487
317
  status: agentResult.status,
488
318
  summary: agentResult.summary,
489
319
  agentFindings: provenFindings,
490
- verifiedFindings: scanResp.finalFindings || [],
491
- allFindings: scanResp.findings || [],
492
- scanId: scanResp.scanId,
493
- scanType: scanResp.scanType,
494
- degraded: scanResp.degraded,
495
- scanCredits: scanResp.scanCredits,
496
- plan: scanResp.plan,
320
+ verifiedFindings: provenFindings.filter(f => f.proven === 'PROVEN'),
321
+ allFindings: [],
497
322
  stepsUsed: agentResult.stepsUsed,
498
323
  costSpentUsd: agentResult.costSpentUsd,
499
324
  transcript: agentResult.transcript,
@@ -1 +1 @@
1
- {"version":3,"file":"agentScan.js","sourceRoot":"","sources":["../../src/tools/agentScan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentScan.js","sourceRoot":"","sources":["../../src/tools/agentScan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface LocalTestResult {
2
+ verdict: 'pass' | 'fail' | 'error' | 'timeout';
3
+ output: string;
4
+ exitCode: number;
5
+ }
6
+ export declare function runLocalTest(script: string, runner: string, workspaceRoot: string): Promise<LocalTestResult>;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runLocalTest = runLocalTest;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const testSafety_1 = require("./testSafety");
41
+ const PASS_PATTERN = /^PASS:\s*(.+)$/m;
42
+ const FAIL_PATTERN = /^FAIL:\s*(.+)$/m;
43
+ const TIMEOUT_MS = 30_000;
44
+ async function runLocalTest(script, runner, workspaceRoot) {
45
+ const safety = (0, testSafety_1.checkTestSafety)(script, workspaceRoot);
46
+ if (!safety.allowed) {
47
+ return { verdict: 'error', output: `Test script blocked: ${safety.reason}`, exitCode: -1 };
48
+ }
49
+ const testDir = path.join(workspaceRoot, '.securecode');
50
+ if (!fs.existsSync(testDir))
51
+ fs.mkdirSync(testDir, { recursive: true });
52
+ const ext = runner === 'tsx' || runner === 'ts' ? '.test.ts' : '.test.js';
53
+ const testFile = path.join(testDir, `verify-test-${Date.now()}-${Math.random().toString(36).slice(2, 8)}${ext}`);
54
+ try {
55
+ fs.writeFileSync(testFile, script, 'utf8');
56
+ let stdout = '';
57
+ let stderr = '';
58
+ let exitCode = 0;
59
+ let timedOut = false;
60
+ try {
61
+ const runnerBin = runner === 'tsx' ? 'npx' : runner;
62
+ const runnerArgs = runner === 'tsx' ? ['tsx', testFile] : [testFile];
63
+ stdout = (0, child_process_1.execFileSync)(runnerBin, runnerArgs, {
64
+ cwd: workspaceRoot,
65
+ timeout: TIMEOUT_MS,
66
+ encoding: 'utf8',
67
+ stdio: ['pipe', 'pipe', 'pipe'],
68
+ env: { ...process.env, NODE_ENV: 'test' },
69
+ });
70
+ }
71
+ catch (err) {
72
+ stdout = err.stdout || '';
73
+ stderr = err.stderr || '';
74
+ exitCode = err.status ?? 1;
75
+ if (err.signal === 'SIGTERM')
76
+ timedOut = true;
77
+ }
78
+ const output = (stdout + '\n' + stderr).trim();
79
+ if (timedOut) {
80
+ return { verdict: 'timeout', output: 'Test timed out after 30s', exitCode: -1 };
81
+ }
82
+ if (PASS_PATTERN.test(output)) {
83
+ return { verdict: 'pass', output, exitCode };
84
+ }
85
+ if (FAIL_PATTERN.test(output)) {
86
+ return { verdict: 'fail', output, exitCode };
87
+ }
88
+ if (exitCode === 0) {
89
+ return { verdict: 'error', output: output + '\nTest exited 0 but did not print PASS: or FAIL:', exitCode };
90
+ }
91
+ return { verdict: 'error', output, exitCode };
92
+ }
93
+ catch (err) {
94
+ return { verdict: 'error', output: err.message || String(err), exitCode: -1 };
95
+ }
96
+ finally {
97
+ try {
98
+ fs.unlinkSync(testFile);
99
+ }
100
+ catch { }
101
+ }
102
+ }
103
+ //# sourceMappingURL=localTestRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localTestRunner.js","sourceRoot":"","sources":["../../src/utils/localTestRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function checkTestSafety(script: string, _workspaceRoot: string): {
2
+ allowed: boolean;
3
+ reason: string;
4
+ };
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkTestSafety = checkTestSafety;
4
+ const BLOCKED_MODULES = new Set(['child_process', 'net', 'cluster', 'worker_threads']);
5
+ const BLOCKED_PATTERNS = [
6
+ { pattern: /process\.exit\s*\(/g, reason: () => 'process.exit() masks test results — use console.error + throw instead' },
7
+ { pattern: /require\s*\(\s*[a-zA-Z_$][a-zA-Z0-9_$]*\s*\)/g, reason: () => 'dynamic require with variable is not statically checkable' },
8
+ ];
9
+ const ALLOWED_IMPORT_PREFIXES = ['node:', 'effect', 'bun', 'bun:', '@synara/', './', '../'];
10
+ const BLOCKED_MODULE_REASONS = {
11
+ child_process: 'child_process is blocked — use only for testing command injection with mock spawns',
12
+ net: 'net is blocked — use HTTP libraries instead',
13
+ cluster: 'cluster is blocked',
14
+ worker_threads: 'worker_threads is blocked',
15
+ };
16
+ function checkTestSafety(script, _workspaceRoot) {
17
+ for (const { pattern, reason } of BLOCKED_PATTERNS) {
18
+ pattern.lastIndex = 0;
19
+ if (pattern.test(script)) {
20
+ return { allowed: false, reason: reason('') };
21
+ }
22
+ }
23
+ const importRegex = /(?:import\s+[^;]+?from\s*|require\s*\(\s*)["']([^"']+)["']/g;
24
+ let match;
25
+ while ((match = importRegex.exec(script)) !== null) {
26
+ const mod = match[1];
27
+ if (BLOCKED_MODULES.has(mod)) {
28
+ return { allowed: false, reason: BLOCKED_MODULE_REASONS[mod] || mod };
29
+ }
30
+ if (mod.startsWith('node:') || mod.startsWith('./') || mod.startsWith('../'))
31
+ continue;
32
+ if (mod.startsWith('effect') || mod.startsWith('bun') || mod.startsWith('@synara/'))
33
+ continue;
34
+ if (ALLOWED_IMPORT_PREFIXES.some(p => mod.startsWith(p)))
35
+ continue;
36
+ }
37
+ return { allowed: true, reason: '' };
38
+ }
39
+ //# sourceMappingURL=testSafety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testSafety.js","sourceRoot":"","sources":["../../src/utils/testSafety.ts"],"names":[],"mappings":";;AAgBA,0CAqBC;AArCD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEvF,MAAM,gBAAgB,GAAgE;IAClF,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,uEAAuE,EAAE;IACzH,EAAE,OAAO,EAAE,+CAA+C,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,2DAA2D,EAAE;CAC1I,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAE5F,MAAM,sBAAsB,GAA2B;IACnD,aAAa,EAAE,oFAAoF;IACnG,GAAG,EAAE,6CAA6C;IAClD,OAAO,EAAE,oBAAoB;IAC7B,cAAc,EAAE,2BAA2B;CAC9C,CAAC;AAEF,SAAgB,eAAe,CAAC,MAAc,EAAE,cAAsB;IAClE,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACjD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,6DAA6D,CAAC;IAClF,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC1E,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QACvF,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAC9F,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;IACvE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@securecode-ai/mcp",
3
- "version": "0.4.10",
3
+ "version": "0.5.0",
4
4
  "description": "Standalone SecureCode MCP server — scan, map, fix, and attack tools for AI coding assistants. Works without the VS Code extension.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {