@securecode-ai/mcp 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +107 -13
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -1
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/attack/agentScanExecutor.js +159 -5
  6. package/dist/attack/agentScanExecutor.js.map +1 -1
  7. package/dist/attack/agentScanLoop.js +157 -3
  8. package/dist/attack/agentScanLoop.js.map +1 -1
  9. package/dist/attack/agentScanProtocol.d.ts +47 -5
  10. package/dist/attack/agentScanProtocol.js +3 -3
  11. package/dist/index.js +218 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp/server.js +62 -0
  14. package/dist/mcp/server.js.map +1 -1
  15. package/dist/mcp/tools.js +80 -3
  16. package/dist/mcp/tools.js.map +1 -1
  17. package/dist/project-map/agentMemory.d.ts +75 -0
  18. package/dist/project-map/agentMemory.js +230 -0
  19. package/dist/project-map/agentMemory.js.map +1 -0
  20. package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
  21. package/dist/project-map/crossFileTaintTracker.js +429 -0
  22. package/dist/project-map/crossFileTaintTracker.js.map +1 -0
  23. package/dist/project-map/endpointDiscovery.d.ts +24 -0
  24. package/dist/project-map/endpointDiscovery.js +101 -0
  25. package/dist/project-map/endpointDiscovery.js.map +1 -0
  26. package/dist/project-map/guardEvaluator.js +37 -0
  27. package/dist/project-map/guardEvaluator.js.map +1 -1
  28. package/dist/project-map/guardPatterns.js +16 -5
  29. package/dist/project-map/guardPatterns.js.map +1 -1
  30. package/dist/project-map/sanitizers.js +10 -0
  31. package/dist/project-map/sanitizers.js.map +1 -1
  32. package/dist/project-map/scanCache.d.ts +67 -0
  33. package/dist/project-map/scanCache.js +169 -0
  34. package/dist/project-map/scanCache.js.map +1 -0
  35. package/dist/project-map/sinkRegistry.js +165 -0
  36. package/dist/project-map/sinkRegistry.js.map +1 -1
  37. package/dist/project-map/taintSources.d.ts +19 -1
  38. package/dist/project-map/taintSources.js +69 -2
  39. package/dist/project-map/taintSources.js.map +1 -1
  40. package/dist/project-map/taintTracker.d.ts +4 -1
  41. package/dist/project-map/taintTracker.js +188 -5
  42. package/dist/project-map/taintTracker.js.map +1 -1
  43. package/dist/tools/agentMemoryTools.d.ts +18 -0
  44. package/dist/tools/agentMemoryTools.js +107 -0
  45. package/dist/tools/agentMemoryTools.js.map +1 -0
  46. package/dist/tools/agentScan.js +206 -33
  47. package/dist/tools/agentScan.js.map +1 -1
  48. package/dist/utils/files.js +19 -2
  49. package/dist/utils/files.js.map +1 -1
  50. package/dist/utils/listFiles.d.ts +17 -0
  51. package/dist/utils/listFiles.js +126 -0
  52. package/dist/utils/listFiles.js.map +1 -0
  53. package/dist/utils/listImports.d.ts +15 -0
  54. package/dist/utils/listImports.js +164 -0
  55. package/dist/utils/listImports.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * MCP tools for agent memory management — record false positives,
4
+ * view memory, and clear memory.
5
+ *
6
+ * These let the user (or the VS Code extension) dismiss findings as false
7
+ * positives so the agent learns not to repeat them in future scans.
8
+ *
9
+ * Storage: <workspaceRoot>/.securecode/agent-memory.json (per-workspace)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.toolRecordFalsePositive = toolRecordFalsePositive;
13
+ exports.toolGetAgentMemory = toolGetAgentMemory;
14
+ exports.toolClearAgentMemory = toolClearAgentMemory;
15
+ exports.toolAddKnownFact = toolAddKnownFact;
16
+ const agentMemory_1 = require("../project-map/agentMemory");
17
+ /** record_false_positive — dismiss a finding so the agent won't report it again. */
18
+ async function toolRecordFalsePositive(ctx, args) {
19
+ const required = ['filePath', 'findingType', 'line', 'evidence', 'reason'];
20
+ for (const field of required) {
21
+ if (!args[field]) {
22
+ throw new Error(`Missing required parameter '${field}' for record_false_positive.`);
23
+ }
24
+ }
25
+ const entry = (0, agentMemory_1.recordFalsePositive)(ctx.workspaceRoot, {
26
+ filePath: args.filePath,
27
+ findingType: args.findingType,
28
+ line: args.line,
29
+ evidence: args.evidence,
30
+ reason: args.reason,
31
+ pattern: args.pattern,
32
+ codeSnippet: args.codeSnippet,
33
+ });
34
+ if (!entry) {
35
+ return { success: false, error: 'Invalid input — could not record false positive.' };
36
+ }
37
+ return {
38
+ success: true,
39
+ recorded: {
40
+ id: entry.id,
41
+ findingType: entry.findingType,
42
+ pattern: entry.pattern,
43
+ reason: entry.reason,
44
+ addedAt: entry.addedAt,
45
+ },
46
+ message: `False positive recorded. The agent will not report similar patterns in future scans of this workspace.`,
47
+ };
48
+ }
49
+ /** get_agent_memory — view all false positives and known facts. */
50
+ async function toolGetAgentMemory(ctx, _args) {
51
+ const memory = (0, agentMemory_1.loadAgentMemory)(ctx.workspaceRoot);
52
+ return {
53
+ falsePositives: {
54
+ count: memory.falsePositives.length,
55
+ entries: memory.falsePositives.map(fp => ({
56
+ id: fp.id,
57
+ findingType: fp.findingType,
58
+ file: fp.file,
59
+ line: fp.line,
60
+ pattern: fp.pattern,
61
+ reason: fp.reason,
62
+ addedAt: fp.addedAt,
63
+ })),
64
+ },
65
+ knownFacts: {
66
+ count: memory.knownFacts.length,
67
+ entries: memory.knownFacts.map(kf => ({
68
+ id: kf.id,
69
+ fact: kf.fact,
70
+ source: kf.source,
71
+ addedAt: kf.addedAt,
72
+ })),
73
+ },
74
+ formatted: (0, agentMemory_1.formatMemoryForPrompt)(memory),
75
+ };
76
+ }
77
+ /** clear_agent_memory — remove all false positives and known facts. */
78
+ async function toolClearAgentMemory(ctx, args) {
79
+ // If a specific false-positive ID is given, remove just that one
80
+ if (args.id) {
81
+ const removed = (0, agentMemory_1.removeFalsePositive)(ctx.workspaceRoot, args.id);
82
+ return { success: removed, message: removed ? `Removed false positive ${args.id}.` : `False positive ${args.id} not found.` };
83
+ }
84
+ const cleared = (0, agentMemory_1.clearAgentMemory)(ctx.workspaceRoot);
85
+ return {
86
+ success: cleared,
87
+ message: cleared
88
+ ? 'All agent memory cleared (false positives + known facts).'
89
+ : 'No agent memory file found — nothing to clear.',
90
+ };
91
+ }
92
+ /** add_known_fact — add a fact about the project the agent should know. */
93
+ async function toolAddKnownFact(ctx, args) {
94
+ if (!args.fact || !args.source) {
95
+ throw new Error('Missing required parameters "fact" and "source" for add_known_fact.');
96
+ }
97
+ const entry = (0, agentMemory_1.addKnownFact)(ctx.workspaceRoot, args.fact, args.source);
98
+ if (!entry) {
99
+ return { success: false, message: 'Fact already exists (duplicate).' };
100
+ }
101
+ return {
102
+ success: true,
103
+ recorded: { id: entry.id, fact: entry.fact, source: entry.source, addedAt: entry.addedAt },
104
+ message: 'Known fact added. The agent will use this in future scans.',
105
+ };
106
+ }
107
+ //# sourceMappingURL=agentMemoryTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentMemoryTools.js","sourceRoot":"","sources":["../../src/tools/agentMemoryTools.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,8 @@ exports.toolAgentScan = toolAgentScan;
22
22
  const client_1 = require("../api/client");
23
23
  const files_1 = require("../utils/files");
24
24
  const mapContext_1 = require("../project-map/mapContext");
25
+ const scanCache_1 = require("../project-map/scanCache");
26
+ const agentMemory_1 = require("../project-map/agentMemory");
25
27
  const agentScanLoop_1 = require("../attack/agentScanLoop");
26
28
  function mapFindingsToCandidates(findings) {
27
29
  return findings.map(f => ({
@@ -32,9 +34,9 @@ function mapFindingsToCandidates(findings) {
32
34
  definitionContext: f.why,
33
35
  }));
34
36
  }
35
- /** Only prove high/critical findings — don't waste credits on low/medium. */
37
+ /** Prove high/critical/medium findings — skip only low. */
36
38
  function shouldProve(finding) {
37
- return finding.severity === 'critical' || finding.severity === 'high';
39
+ return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
38
40
  }
39
41
  async function toolAgentScan(ctx, args) {
40
42
  const progress = args._progress;
@@ -55,6 +57,35 @@ async function toolAgentScan(ctx, args) {
55
57
  else {
56
58
  throw new Error('Either filePath or code must be provided.');
57
59
  }
60
+ // 1b. Validate the code — empty, binary, or too-large files cause confusing
61
+ // downstream errors (HTTP 400/413) that the user can't interpret.
62
+ // The API server has a 2MB body limit; we cap at 1.5MB to leave room for
63
+ // the JSON envelope and transcript.
64
+ const MAX_FILE_BYTES = 1_500_000;
65
+ if (code.trim().length === 0) {
66
+ return {
67
+ status: 'completed',
68
+ summary: 'File is empty — nothing to scan.',
69
+ agentFindings: [],
70
+ findings: [],
71
+ stepsUsed: 0,
72
+ costSpentUsd: 0,
73
+ transcript: [],
74
+ cached: false,
75
+ provenCount: 0,
76
+ };
77
+ }
78
+ // Binary file detection: if the first 1000 bytes contain a NUL byte, it's
79
+ // almost certainly binary (compiled, image, archive). Sending it to the LLM
80
+ // would produce garbage results.
81
+ const headBytes = Buffer.from(code.slice(0, 1000), 'utf8');
82
+ if (headBytes.includes(0)) {
83
+ throw new Error('Cannot scan binary file. SecureCode only scans text source files (.ts, .js, .py, etc.).');
84
+ }
85
+ if (Buffer.byteLength(code, 'utf8') > MAX_FILE_BYTES) {
86
+ const sizeMB = (Buffer.byteLength(code, 'utf8') / 1_000_000).toFixed(1);
87
+ throw new Error(`File too large (${sizeMB}MB). Maximum is 1.5MB. Split the file or scan a specific section using the API directly.`);
88
+ }
58
89
  // 2. Build endpoint context from the project map
59
90
  let endpointContext = [];
60
91
  if (filePath) {
@@ -65,14 +96,53 @@ async function toolAgentScan(ctx, args) {
65
96
  // best-effort — proceed without endpoint context
66
97
  }
67
98
  }
99
+ // 2b. Check scan cache — if the file hasn't changed, return cached results
100
+ const skipCacheRead = !!args._noCache;
101
+ const useCache = !!filePath;
102
+ if (useCache && !skipCacheRead) {
103
+ try {
104
+ const cached = (0, scanCache_1.getCachedScan)(ctx.workspaceRoot, filePath, code);
105
+ if (cached) {
106
+ if (progress)
107
+ progress(1, 1, 'Cached result — file unchanged since last scan.');
108
+ return {
109
+ status: cached.status,
110
+ summary: cached.summary || 'Agent completed (cached).',
111
+ agentFindings: cached.findings,
112
+ findings: [],
113
+ stepsUsed: cached.stepsUsed,
114
+ costSpentUsd: 0,
115
+ transcript: [],
116
+ cached: true,
117
+ provenCount: cached.findings.filter((f) => f.proven === 'PROVEN').length,
118
+ };
119
+ }
120
+ }
121
+ catch (err) {
122
+ // Cache read failure (corrupt file, permissions, etc) should NOT
123
+ // block the scan — just skip the cache and proceed.
124
+ console.warn(`[Agent Scan] Cache read skipped: ${err?.message || err}`);
125
+ }
126
+ }
68
127
  // 3. Run the agent loop
128
+ // Load workspace memory (false positives + known facts) to inject into target
129
+ let workspaceMemory;
130
+ try {
131
+ const memory = (0, agentMemory_1.loadAgentMemory)(ctx.workspaceRoot);
132
+ workspaceMemory = (0, agentMemory_1.formatMemoryForPrompt)(memory) || undefined;
133
+ }
134
+ catch {
135
+ // best-effort — proceed without memory
136
+ }
69
137
  const target = {
70
138
  filePath: filePath || 'inline-code',
71
139
  language,
72
140
  fileContent: code,
73
141
  endpointContext,
142
+ workspaceMemory,
74
143
  };
75
144
  const agentResult = await (0, agentScanLoop_1.runAgentScan)(ctx, target, {
145
+ signal: args._signal,
76
146
  onProgress: (steps, max, msg) => {
77
147
  if (progress)
78
148
  progress(steps, max, msg);
@@ -91,42 +161,103 @@ async function toolAgentScan(ctx, args) {
91
161
  let proveIdx = 0;
92
162
  for (const finding of agentResult.findings) {
93
163
  if (!shouldProve(finding)) {
94
- provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low/medium severity — not proven' });
164
+ provenFindings.push({ ...finding, proven: 'SKIPPED', provenReason: 'Low severity — not proven' });
95
165
  continue;
96
166
  }
97
- try {
98
- if (progress) {
99
- proveIdx++;
100
- progress(proveIdx, proveable.length, `Proving ${finding.type} at line ${finding.line}...`);
167
+ if (progress) {
168
+ proveIdx++;
169
+ progress(proveIdx, proveable.length, `Proving ${finding.type} at line ${finding.line}...`);
170
+ }
171
+ let proved = false;
172
+ for (let attempt = 1; attempt <= 2; attempt++) {
173
+ try {
174
+ const proveResp = await client.postJson('/sandbox/prove', {
175
+ code,
176
+ language,
177
+ vulnerabilityType: finding.type,
178
+ line: finding.line,
179
+ lineEnd: finding.lineEnd,
180
+ evidence: finding.evidence,
181
+ why: finding.why,
182
+ });
183
+ provenFindings.push({
184
+ ...finding,
185
+ proven: proveResp.proven,
186
+ provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
187
+ });
188
+ proved = true;
189
+ break;
190
+ }
191
+ catch (err) {
192
+ if (attempt === 1) {
193
+ console.warn(`[Agent Scan] Prove attempt 1 failed: ${err.message}. Retrying...`);
194
+ await new Promise(r => setTimeout(r, 2000));
195
+ }
196
+ else {
197
+ provenFindings.push({
198
+ ...finding,
199
+ proven: 'INCONCLUSIVE',
200
+ provenReason: `Sandbox prove failed after 2 attempts: ${err.message || err}`,
201
+ });
202
+ }
101
203
  }
102
- const proveResp = await client.postJson('/sandbox/prove', {
204
+ }
205
+ }
206
+ // 4b. Generate fixes for proven/suspected findings
207
+ const fixableFindings = provenFindings.filter(f => f.proven === 'PROVEN' || (f.proven !== 'UNPROVEN' && f.confidence >= 60));
208
+ if (fixableFindings.length > 0 && progress) {
209
+ progress(0, fixableFindings.length, `Generating fixes for ${fixableFindings.length} finding(s)...`);
210
+ }
211
+ let fixIdx = 0;
212
+ for (const finding of fixableFindings) {
213
+ if (progress) {
214
+ fixIdx++;
215
+ progress(fixIdx, fixableFindings.length, `Fixing ${finding.type} at line ${finding.line}...`);
216
+ }
217
+ try {
218
+ const fixResp = await client.postJson('/fix', {
103
219
  code,
104
220
  language,
105
- vulnerabilityType: finding.type,
106
- line: finding.line,
107
- lineEnd: finding.lineEnd,
108
- evidence: finding.evidence,
109
- why: finding.why,
110
- });
111
- provenFindings.push({
112
- ...finding,
113
- proven: proveResp.proven,
114
- provenReason: proveResp.rationale || proveResp.skipReason || proveResp.sandbox?.reason,
221
+ vulnerability: {
222
+ type: finding.type,
223
+ line_start: finding.line,
224
+ line_end: finding.lineEnd || finding.line,
225
+ evidence_snippet: finding.evidence,
226
+ },
115
227
  });
228
+ if (fixResp.fixed_code) {
229
+ finding.fix = {
230
+ fixedCode: fixResp.fixed_code,
231
+ replaceRange: { start_line: finding.line, end_line: finding.lineEnd || finding.line },
232
+ fixSummary: fixResp.fix_summary || '',
233
+ importsNeeded: fixResp.imports_needed,
234
+ confidence: fixResp.confidence,
235
+ };
236
+ }
116
237
  }
117
238
  catch (err) {
118
- // Insufficient credits or API error — skip proving, mark as INCONCLUSIVE
119
- provenFindings.push({
120
- ...finding,
121
- proven: 'INCONCLUSIVE',
122
- provenReason: `Sandbox prove failed: ${err.message || err}`,
123
- });
239
+ // Best-effort — finding stays without fix
240
+ console.warn(`[Agent Scan] Fix generation failed for ${finding.type} at L${finding.line}: ${err.message}`);
124
241
  }
125
242
  }
126
243
  // 5. Map findings → CandidateContext[]
127
244
  const candidateContexts = mapFindingsToCandidates(provenFindings);
128
245
  // 6. If no findings, return early
129
246
  if (candidateContexts.length === 0) {
247
+ if (useCache) {
248
+ try {
249
+ (0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
250
+ findings: provenFindings,
251
+ status: agentResult.status,
252
+ summary: agentResult.summary,
253
+ stepsUsed: agentResult.stepsUsed,
254
+ costSpentUsd: agentResult.costSpentUsd,
255
+ });
256
+ }
257
+ catch (err) {
258
+ console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
259
+ }
260
+ }
130
261
  return {
131
262
  status: agentResult.status,
132
263
  summary: agentResult.summary || 'Agent completed with no findings.',
@@ -140,15 +271,57 @@ async function toolAgentScan(ctx, args) {
140
271
  // 7. POST /scan with scanDepth: 'agent' + candidateContexts
141
272
  // This skips Scout and sends the agent's candidates directly to Juror
142
273
  // + Phase 3 for verification.
143
- const scanResp = await client.postJson('/scan', {
144
- code,
145
- language,
146
- ...(filePath ? { filePath } : {}),
147
- scanDepth: 'agent',
148
- candidateContexts,
149
- ...(endpointContext.length > 0 ? { endpointContext } : {}),
150
- });
151
- // 8. Return merged result with proven stamps
274
+ // If this call fails, return the agent findings without Juror
275
+ // verification (degraded mode) instead of throwing everything away.
276
+ let scanResp = null;
277
+ try {
278
+ scanResp = await client.postJson('/scan', {
279
+ code,
280
+ language,
281
+ ...(filePath ? { filePath } : {}),
282
+ scanDepth: 'agent',
283
+ candidateContexts,
284
+ ...(endpointContext.length > 0 ? { endpointContext } : {}),
285
+ });
286
+ }
287
+ catch (err) {
288
+ // Juror verification failed — return agent findings as-is (degraded).
289
+ // This is better than throwing, which would lose all the agent's work.
290
+ console.warn(`[Agent Scan] Juror verification failed (${err?.message || err}). Returning agent findings without verification.`);
291
+ }
292
+ // 8. Write to cache before returning
293
+ if (useCache) {
294
+ try {
295
+ (0, scanCache_1.writeCachedScan)(ctx.workspaceRoot, filePath, code, {
296
+ findings: provenFindings,
297
+ status: agentResult.status,
298
+ summary: agentResult.summary,
299
+ stepsUsed: agentResult.stepsUsed,
300
+ costSpentUsd: agentResult.costSpentUsd,
301
+ });
302
+ }
303
+ catch (err) {
304
+ console.warn(`[Agent Scan] Cache write skipped: ${err?.message || err}`);
305
+ }
306
+ }
307
+ // 9. Return merged result with proven stamps
308
+ // If Juror failed, scanResp is null — return agent findings as verified=false
309
+ if (!scanResp) {
310
+ return {
311
+ status: agentResult.status,
312
+ summary: (agentResult.summary || 'Agent completed') + ' (Juror verification skipped — degraded)',
313
+ agentFindings: provenFindings,
314
+ verifiedFindings: [],
315
+ allFindings: [],
316
+ degraded: true,
317
+ stepsUsed: agentResult.stepsUsed,
318
+ costSpentUsd: agentResult.costSpentUsd,
319
+ transcript: agentResult.transcript,
320
+ provenCount: provenFindings.filter(f => f.proven === 'PROVEN').length,
321
+ unprovenCount: provenFindings.filter(f => f.proven === 'UNPROVEN').length,
322
+ inconclusiveCount: provenFindings.filter(f => f.proven === 'INCONCLUSIVE').length,
323
+ };
324
+ }
152
325
  return {
153
326
  status: agentResult.status,
154
327
  summary: agentResult.summary,
@@ -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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"}
@@ -47,11 +47,28 @@ const SUPPORTED_EXTENSIONS = {
47
47
  '.ts': 'typescript',
48
48
  '.tsx': 'typescriptreact',
49
49
  '.py': 'python',
50
- '.php': 'php',
50
+ // Note: .php is intentionally omitted — the MCP parserLoader has no
51
+ // tree-sitter-php.wasm. PHP files will return 'Unsupported file type'
52
+ // with a clear message instead of silently producing zero findings.
53
+ '.json': 'json',
54
+ '.yaml': 'yaml',
55
+ '.yml': 'yaml',
56
+ '.toml': 'toml',
57
+ '.ini': 'ini',
58
+ '.env': 'env',
59
+ '.cfg': 'ini',
60
+ '.conf': 'ini',
61
+ '.config': 'ini',
51
62
  };
52
63
  function inferLanguage(filePath) {
53
64
  const ext = path.extname(filePath).toLowerCase();
54
- return SUPPORTED_EXTENSIONS[ext];
65
+ if (SUPPORTED_EXTENSIONS[ext])
66
+ return SUPPORTED_EXTENSIONS[ext];
67
+ // Dotfiles like .env, .env.local, .env.production have no extension
68
+ const base = path.basename(filePath).toLowerCase();
69
+ if (base === '.env' || /^\.env\.[\w.-]+$/.test(base))
70
+ return 'env';
71
+ return undefined;
55
72
  }
56
73
  function isSupportedFile(filePath) {
57
74
  return inferLanguage(filePath) !== undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,sCAGC;AAED,0CAEC;AAED,oDAOC;AAED,sDAWC;AA3CD,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,oBAAoB,GAA2B;IACjD,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,KAAK;CAChB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,SAAgB,oBAAoB,CAAC,aAAqB,EAAE,SAAiB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,+EAA+E,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,qBAAqB,CAAC,aAAqB,EAAE,SAAiB;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,sCASC;AAED,0CAEC;AAED,oDAOC;AAED,sDAWC;AA5DD,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,oBAAoB,GAA2B;IACjD,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,iBAAiB;IACzB,KAAK,EAAE,QAAQ;IACf,oEAAoE;IACpE,sEAAsE;IACtE,oEAAoE;IACpE,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,KAAK;CACnB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAEhE,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,IAAI,KAAK,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnE,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC5C,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,SAAgB,oBAAoB,CAAC,aAAqB,EAAE,SAAiB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,+EAA+E,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,qBAAqB,CAAC,aAAqB,EAAE,SAAiB;IAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * File listing utility — walks a directory and returns source files,
3
+ * respecting .securecodeignore and skip directories.
4
+ */
5
+ export interface ListFilesOptions {
6
+ /** Directory to list (relative to workspace root). Defaults to root. */
7
+ dir?: string;
8
+ /** Optional glob filter (e.g. "*.ts"). */
9
+ glob?: string;
10
+ }
11
+ export interface FileEntry {
12
+ path: string;
13
+ size: number;
14
+ lines: number;
15
+ }
16
+ export declare function listFiles(workspaceRoot: string, options?: ListFilesOptions): FileEntry[];
17
+ export declare function formatFileList(files: FileEntry[]): string;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * File listing utility — walks a directory and returns source files,
4
+ * respecting .securecodeignore and skip directories.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.listFiles = listFiles;
41
+ exports.formatFileList = formatFileList;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const ignore_1 = require("../utils/ignore");
45
+ const SUPPORTED_EXTENSIONS = new Set([
46
+ '.js', '.jsx', '.mjs', '.cjs', '.ts', '.tsx', '.py',
47
+ ]);
48
+ const MAX_FILES = 500;
49
+ function matchGlob(filePath, glob) {
50
+ if (!glob)
51
+ return true;
52
+ // Simple glob: *.ts, *.py, etc — match the extension
53
+ if (glob.startsWith('*.')) {
54
+ const ext = glob.slice(1); // '.ts'
55
+ return filePath.endsWith(ext);
56
+ }
57
+ // Otherwise treat as substring match
58
+ return filePath.includes(glob);
59
+ }
60
+ function listFiles(workspaceRoot, options = {}) {
61
+ const ignorePatterns = (0, ignore_1.readSecurecodeIgnore)(workspaceRoot);
62
+ const searchDir = options.dir
63
+ ? path.resolve(workspaceRoot, options.dir)
64
+ : workspaceRoot;
65
+ const results = [];
66
+ const stack = [searchDir];
67
+ let count = 0;
68
+ while (stack.length > 0 && count < MAX_FILES) {
69
+ const dir = stack.pop();
70
+ let entries;
71
+ try {
72
+ entries = fs.readdirSync(dir, { withFileTypes: true });
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ for (const entry of entries) {
78
+ if (count >= MAX_FILES)
79
+ break;
80
+ const fullPath = path.join(dir, entry.name);
81
+ if (entry.isDirectory()) {
82
+ if (!ignore_1.SKIP_DIRS.has(entry.name) && !entry.name.startsWith('.')) {
83
+ stack.push(fullPath);
84
+ }
85
+ }
86
+ else if (entry.isFile()) {
87
+ const ext = path.extname(entry.name).toLowerCase();
88
+ if (!SUPPORTED_EXTENSIONS.has(ext))
89
+ continue;
90
+ if ((0, ignore_1.isSecretFileName)(fullPath))
91
+ continue;
92
+ const relPath = path.relative(workspaceRoot, fullPath).replace(/\\/g, '/');
93
+ if ((0, ignore_1.isIgnored)(relPath, ignorePatterns))
94
+ continue;
95
+ if (!matchGlob(relPath, options.glob))
96
+ continue;
97
+ let size = 0;
98
+ let lines = 0;
99
+ try {
100
+ const content = fs.readFileSync(fullPath, 'utf8');
101
+ size = Buffer.byteLength(content);
102
+ lines = content.split('\n').length;
103
+ }
104
+ catch { /* best effort */ }
105
+ results.push({ path: relPath, size, lines });
106
+ count++;
107
+ }
108
+ }
109
+ }
110
+ results.sort((a, b) => a.path.localeCompare(b.path));
111
+ return results;
112
+ }
113
+ function formatFileList(files) {
114
+ if (files.length === 0) {
115
+ return 'No source files found.';
116
+ }
117
+ const lines = [`Found ${files.length} source file(s):`];
118
+ for (const f of files) {
119
+ const sizeStr = f.size < 1024
120
+ ? `${f.size}B`
121
+ : `${(f.size / 1024).toFixed(1)}KB`;
122
+ lines.push(` ${f.path} (${f.lines}L, ${sizeStr})`);
123
+ }
124
+ return lines.join('\n');
125
+ }
126
+ //# sourceMappingURL=listFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../src/utils/listFiles.ts"],"names":[],"mappings":"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"}