nfunc-mcp 0.1.0 → 0.3.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.
Files changed (35) hide show
  1. package/README.md +88 -43
  2. package/dist/index.js +23 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/mappers/a11yDedupe.d.ts +25 -0
  5. package/dist/mappers/a11yDedupe.js +95 -0
  6. package/dist/mappers/a11yDedupe.js.map +1 -0
  7. package/dist/mappers/compositeScore.d.ts +23 -0
  8. package/dist/mappers/compositeScore.js +107 -0
  9. package/dist/mappers/compositeScore.js.map +1 -0
  10. package/dist/mappers/correlator.js +94 -33
  11. package/dist/mappers/correlator.js.map +1 -1
  12. package/dist/mappers/defectFormatter.js +129 -15
  13. package/dist/mappers/defectFormatter.js.map +1 -1
  14. package/dist/mappers/priorityMapper.d.ts +38 -0
  15. package/dist/mappers/priorityMapper.js +126 -0
  16. package/dist/mappers/priorityMapper.js.map +1 -1
  17. package/dist/tools/accessibility.js +72 -31
  18. package/dist/tools/accessibility.js.map +1 -1
  19. package/dist/tools/lighthouse.d.ts +14 -0
  20. package/dist/tools/lighthouse.js +134 -34
  21. package/dist/tools/lighthouse.js.map +1 -1
  22. package/dist/tools/qaGate.js +117 -70
  23. package/dist/tools/qaGate.js.map +1 -1
  24. package/dist/tools/staticAnalysis.js +15 -67
  25. package/dist/tools/staticAnalysis.js.map +1 -1
  26. package/dist/utils/eslintConfigDetector.d.ts +13 -0
  27. package/dist/utils/eslintConfigDetector.js +65 -2
  28. package/dist/utils/eslintConfigDetector.js.map +1 -1
  29. package/dist/utils/eslintRunner.d.ts +9 -0
  30. package/dist/utils/eslintRunner.js +103 -0
  31. package/dist/utils/eslintRunner.js.map +1 -0
  32. package/dist/utils/outputParsers.d.ts +25 -0
  33. package/dist/utils/outputParsers.js +42 -0
  34. package/dist/utils/outputParsers.js.map +1 -1
  35. package/package.json +2 -2
@@ -1,21 +1,28 @@
1
1
  import { z } from "zod";
2
- import { fileURLToPath } from "url";
3
2
  import { resolve } from "path";
4
3
  import { runShell } from "../utils/shellRunner.js";
5
- import { parseLighthouseJSON, parsePa11yJSON, parseESLintJSON, parseSemgrepJSON, } from "../utils/outputParsers.js";
4
+ import { parseLighthouseJSON, parsePa11yJSON, parseSemgrepJSON, } from "../utils/outputParsers.js";
6
5
  import { formatLighthouseFinding, formatA11yFinding, formatStaticAnalysisFinding, } from "../mappers/defectFormatter.js";
7
- import { detectESLintConfig } from "../utils/eslintConfigDetector.js";
6
+ import { dedupeA11yFindings } from "../mappers/a11yDedupe.js";
7
+ import { lighthouseSubScore, a11ySubScore, staticSubScore, compositeScore, } from "../mappers/compositeScore.js";
8
+ import { formFactorArgs } from "./lighthouse.js";
9
+ import { runESLint } from "../utils/eslintRunner.js";
8
10
  import { correlate, } from "../mappers/correlator.js";
9
11
  import { generateHtmlReport } from "../utils/reportGenerator.js";
10
- const BASELINE_CONFIG_PATH = fileURLToPath(new URL("../config/qa-mcp-baseline.eslint.config.js", import.meta.url));
11
12
  const PRIORITY_ORDER = { P1: 0, P2: 1, P3: 2 };
12
13
  // ---------------------------------------------------------------------------
13
14
  // Per-tool runners — each returns a structured result and never throws.
14
15
  // Errors are surfaced as the `error` field so a partial failure in one tool
15
16
  // doesn't prevent the other two from contributing findings.
16
17
  // ---------------------------------------------------------------------------
17
- async function runLighthouse(url) {
18
- const result = await runShell("lighthouse", [url, "--output=json", "--quiet", "--chrome-flags=--headless"], { timeoutMs: 120_000 });
18
+ async function runLighthouse(url, formFactor) {
19
+ const result = await runShell("lighthouse", [
20
+ url,
21
+ "--output=json",
22
+ "--quiet",
23
+ "--chrome-flags=--headless",
24
+ ...formFactorArgs(formFactor),
25
+ ], { timeoutMs: 180_000 });
19
26
  if (result.exitCode === -1 && !result.stdout && !result.stderr) {
20
27
  return { scores: {}, ttfb_ms: null, findings: [], error: "Lighthouse is not installed or not found in PATH." };
21
28
  }
@@ -39,25 +46,30 @@ async function runLighthouse(url) {
39
46
  };
40
47
  }
41
48
  }
42
- async function runA11y(url) {
43
- const result = await runShell("pa11y", [url, "--reporter", "json", "--standard", "WCAG2AA"], { timeoutMs: 120_000 });
44
- if (result.exitCode === -1 && !result.stdout && !result.stderr) {
49
+ async function runA11y(url, engines) {
50
+ const results = await Promise.all(engines.map((e) => runShell("pa11y", [url, "--reporter", "json", "--standard", "WCAG2AA", "--runner", e], { timeoutMs: 120_000 })));
51
+ if (results.every((r) => r.exitCode === -1 && !r.stdout && !r.stderr)) {
45
52
  return { violation_count: 0, findings: [], error: "pa11y is not installed or not found in PATH." };
46
53
  }
47
54
  // pa11y exits 2 when violations are found — that is a successful run.
48
- const ranOk = result.exitCode === 0 || result.exitCode === 2;
49
- if (!ranOk || !result.stdout) {
50
- return { violation_count: 0, findings: [], error: `pa11y failed (exit ${result.exitCode}): ${result.stderr.slice(0, 300)}` };
55
+ const usable = results.filter((r) => (r.exitCode === 0 || r.exitCode === 2) && r.stdout);
56
+ if (usable.length === 0) {
57
+ const r = results[0];
58
+ return { violation_count: 0, findings: [], error: `pa11y failed (exit ${r.exitCode}): ${r.stderr.slice(0, 300)}` };
51
59
  }
52
60
  try {
53
- const parsed = parsePa11yJSON(result.stdout);
54
- const findings = [];
55
- for (const v of parsed.violations) {
56
- const f = formatA11yFinding(v);
57
- if (f)
58
- findings.push(f);
61
+ const rawFindings = [];
62
+ for (const result of usable) {
63
+ for (const v of parsePa11yJSON(result.stdout).violations) {
64
+ const f = formatA11yFinding(v);
65
+ if (f)
66
+ rawFindings.push(f);
67
+ }
59
68
  }
60
- return { violation_count: findings.length, findings };
69
+ // Dedup before the findings reach the correlator and the composite score —
70
+ // 35 copies of one defect otherwise floor the score and swamp all_findings.
71
+ const { findings, rawCount } = dedupeA11yFindings(rawFindings);
72
+ return { violation_count: findings.length, raw_violation_count: rawCount, findings };
61
73
  }
62
74
  catch (err) {
63
75
  return {
@@ -67,42 +79,16 @@ async function runA11y(url) {
67
79
  }
68
80
  }
69
81
  async function runStatic(absPath) {
70
- const { hasConfig } = detectESLintConfig(absPath);
71
- const eslintConfigUsed = hasConfig ? "project" : "qa-mcp-baseline";
72
- const eslintArgs = [
73
- ".", "--format", "json",
74
- "--ignore-pattern", "node_modules",
75
- "--ignore-pattern", "dist",
76
- ];
77
- if (!hasConfig)
78
- eslintArgs.push("--config", BASELINE_CONFIG_PATH);
79
82
  const semgrepArgs = [
80
83
  "--config=p/javascript", "--config=p/typescript",
81
84
  "--json", "--exclude", "node_modules", ".",
82
85
  ];
83
- // ESLint and Semgrep themselves run in parallel inside the static runner.
84
- const [eslintResult, semgrepResult] = await Promise.all([
85
- runShell("eslint", eslintArgs, { timeoutMs: 120_000, cwd: absPath }),
86
+ const [eslintRun, semgrepResult] = await Promise.all([
87
+ runESLint(absPath),
86
88
  runShell("semgrep", semgrepArgs, { timeoutMs: 180_000, cwd: absPath }),
87
89
  ]);
88
- const allIssues = [];
89
- const warnings = [];
90
- if (eslintResult.exitCode === -1 && !eslintResult.stdout && !eslintResult.stderr) {
91
- warnings.push("ESLint not installed — ESLint analysis skipped.");
92
- }
93
- else if (eslintResult.exitCode === 2) {
94
- warnings.push(`ESLint configuration error: ${eslintResult.stderr.slice(0, 200)}`);
95
- }
96
- else if (eslintResult.stdout) {
97
- try {
98
- for (const issue of parseESLintJSON(eslintResult.stdout).issues) {
99
- allIssues.push({ source: "eslint", file: issue.filePath, line: issue.line, column: issue.column, ruleId: issue.ruleId, message: issue.message, severity: issue.severity });
100
- }
101
- }
102
- catch {
103
- warnings.push("ESLint output could not be parsed.");
104
- }
105
- }
90
+ const allIssues = [...eslintRun.issues];
91
+ const warnings = [...eslintRun.warnings];
106
92
  if (semgrepResult.exitCode === -1 && !semgrepResult.stdout && !semgrepResult.stderr) {
107
93
  warnings.push("Semgrep not installed — Semgrep analysis skipped.");
108
94
  }
@@ -116,7 +102,7 @@ async function runStatic(absPath) {
116
102
  warnings.push("Semgrep output could not be parsed.");
117
103
  }
118
104
  }
119
- // Deduplicate by file:line (same logic as staticAnalysis.ts).
105
+ // Deduplicate by file:line.
120
106
  const dedupMap = new Map();
121
107
  for (const issue of allIssues) {
122
108
  const f = formatStaticAnalysisFinding(issue);
@@ -129,7 +115,7 @@ async function runStatic(absPath) {
129
115
  }
130
116
  }
131
117
  const findings = Array.from(dedupMap.values());
132
- return { issue_count: findings.length, eslint_config_used: eslintConfigUsed, findings, warnings };
118
+ return { issue_count: findings.length, eslint_config_used: eslintRun.config_used, findings, warnings };
133
119
  }
134
120
  // ---------------------------------------------------------------------------
135
121
  // Report assembly helpers
@@ -144,18 +130,14 @@ function buildVerdict(findings) {
144
130
  return "ADVISORY";
145
131
  return "CLEAR";
146
132
  }
147
- // Option 5: severity-weighted composite score (100 = perfect health)
148
- function buildCompositeScore(findings) {
149
- let score = 100;
150
- for (const f of findings) {
151
- if (f.priority === "P1")
152
- score -= 15;
153
- else if (f.priority === "P2")
154
- score -= 7;
155
- else
156
- score -= 3;
157
- }
158
- return Math.max(0, score);
133
+ // Composite score. See src/mappers/compositeScore.ts for why this is a
134
+ // weighted mean of per-tool sub-scores rather than one global subtraction.
135
+ function buildSubScores(lhData, a11yData, staticData) {
136
+ return {
137
+ lighthouse: lhData && !lhData.error ? lighthouseSubScore(lhData.scores) : null,
138
+ pa11y: a11yData && !a11yData.error ? a11ySubScore(a11yData.findings) : null,
139
+ static: staticData ? staticSubScore(staticData.findings) : null,
140
+ };
159
141
  }
160
142
  // Option 3: compact per-tool scorecard
161
143
  // Any argument may be null when the caller did not supply the corresponding
@@ -190,10 +172,14 @@ function buildScorecard(lhData, a11yData, staticData) {
190
172
  else {
191
173
  const hasP1 = a11yData.findings.some((f) => f.priority === "P1");
192
174
  const hasP2 = a11yData.findings.some((f) => f.priority === "P2");
175
+ const raw = a11yData.raw_violation_count;
193
176
  entries.push({
194
177
  tool: "pa11y",
195
178
  gate: hasP1 ? "FAIL" : hasP2 ? "WARN" : "PASS",
196
179
  issues: a11yData.violation_count,
180
+ ...(raw !== undefined && raw > a11yData.violation_count
181
+ ? { raw_issues: raw }
182
+ : {}),
197
183
  });
198
184
  }
199
185
  if (staticData === null) {
@@ -255,6 +241,21 @@ const inputShape = {
255
241
  .optional()
256
242
  .describe("Optional free-text context about the project (e.g. 'React SPA', 'checkout flow', " +
257
243
  "'marketing site'). Pass anything the user mentions about what the app is or does."),
244
+ form_factor: z
245
+ .enum(["mobile", "desktop", "both"])
246
+ .optional()
247
+ .describe("Lighthouse device profile: 'desktop' (default, unthrottled), 'mobile' " +
248
+ "(throttled slow 4G with a 4x CPU slowdown, which scores far lower for " +
249
+ "the same page), or 'both'. The profiles render different DOM and find " +
250
+ "different accessibility and SEO defects, so 'both' is the thorough " +
251
+ "choice; it runs concurrently and costs little extra wall time."),
252
+ a11y_runner: z
253
+ .enum(["htmlcs", "axe", "both"])
254
+ .optional()
255
+ .describe("pa11y engine: 'htmlcs' (default) for WCAG techniques, structure, " +
256
+ "labels and forms; 'axe' for materially better ARIA and computed " +
257
+ "contrast coverage; 'both' to merge them. Choose 'axe' or 'both' when " +
258
+ "the code under test involves ARIA or a component library."),
258
259
  };
259
260
  export function registerQaGateTool(server) {
260
261
  server.registerTool("run_qa_gate", {
@@ -280,7 +281,7 @@ export function registerQaGateTool(server) {
280
281
  "If any individual tool is not installed, the report is still produced from the others — " +
281
282
  "it never fails completely.",
282
283
  inputSchema: inputShape,
283
- }, async ({ url, path: targetPath }) => {
284
+ }, async ({ url, path: targetPath, form_factor, a11y_runner }) => {
284
285
  if (!url && !targetPath) {
285
286
  return {
286
287
  content: [{ type: "text", text: JSON.stringify({
@@ -290,13 +291,55 @@ export function registerQaGateTool(server) {
290
291
  isError: true,
291
292
  };
292
293
  }
294
+ const requestedFF = form_factor ?? "desktop";
295
+ const factors = requestedFF === "both" ? ["mobile", "desktop"] : [requestedFF];
296
+ const requestedRunner = a11y_runner ?? "htmlcs";
297
+ const engines = requestedRunner === "both" ? ["htmlcs", "axe"] : [requestedRunner];
293
298
  // Only run the tools we have inputs for. null means deliberately skipped,
294
299
  // not a failure — the scorecard will show SKIPPED for those entries.
295
- const [lhData, a11yData, staticData] = await Promise.all([
296
- url ? runLighthouse(url) : null,
297
- url ? runA11y(url) : null,
300
+ // Every leg including each Lighthouse form factor — runs concurrently.
301
+ const [lhRuns, a11yData, staticData] = await Promise.all([
302
+ url
303
+ ? Promise.all(factors.map(async (ff) => ({ ff, data: await runLighthouse(url, ff) })))
304
+ : null,
305
+ url ? runA11y(url, engines) : null,
298
306
  targetPath ? runStatic(resolve(targetPath)) : null,
299
307
  ]);
308
+ // Collapse the form factors into one Lighthouse view for the rest of the
309
+ // report. Findings are merged on audit_id and tagged with the form
310
+ // factors they affect; scores keep the worst per category, since a page
311
+ // is only as healthy as its weaker profile.
312
+ const lhOk = lhRuns?.filter((r) => !r.data.error) ?? [];
313
+ const lhData = !lhRuns
314
+ ? null
315
+ : lhOk.length === 0
316
+ ? lhRuns[0].data
317
+ : (() => {
318
+ const scores = {};
319
+ for (const { data } of lhOk) {
320
+ for (const [k, v] of Object.entries(data.scores)) {
321
+ scores[k] = k in scores ? Math.min(scores[k], v) : v;
322
+ }
323
+ }
324
+ const merged = new Map();
325
+ for (const { ff, data } of lhOk) {
326
+ for (const f of data.findings) {
327
+ const key = String(f.evidence["audit_id"]);
328
+ const hit = merged.get(key);
329
+ if (hit)
330
+ hit._ff.push(ff);
331
+ else
332
+ merged.set(key, { ...f, _ff: [ff] });
333
+ }
334
+ }
335
+ const findings = Array.from(merged.values()).map(({ _ff, ...f }) => ({
336
+ ...f,
337
+ evidence: factors.length > 1
338
+ ? { ...f.evidence, affects_form_factors: _ff, form_factor_specific: _ff.length === 1 }
339
+ : f.evidence,
340
+ }));
341
+ return { scores, ttfb_ms: lhOk[0].data.ttfb_ms, findings };
342
+ })();
300
343
  // Surface tool errors but don't abort — partial reports are still useful.
301
344
  const errors = [];
302
345
  if (lhData?.error)
@@ -339,12 +382,16 @@ export function registerQaGateTool(server) {
339
382
  ...(staticData ? ["eslint", "semgrep"] : []),
340
383
  ];
341
384
  const readiness = buildVerdict(allFindings);
342
- const compositeScore = buildCompositeScore(allFindings);
385
+ const subScores = buildSubScores(lhData, a11yData, staticData);
386
+ const composite = compositeScore(subScores);
343
387
  const scorecard = buildScorecard(lhData, a11yData, staticData);
344
388
  const summary = buildSummary(allFindings, toolsRan, readiness, correlations_count);
345
389
  const report = {
346
390
  release_readiness: readiness,
347
- composite_score: compositeScore,
391
+ composite_score: composite,
392
+ // Per-tool 0–100 health, so a low composite is attributable rather than
393
+ // just low. Null means the tool did not run or did not produce a score.
394
+ sub_scores: subScores,
348
395
  scorecard,
349
396
  ...(staticData ? { eslint_config_used: staticData.eslint_config_used } : {}),
350
397
  summary,
@@ -361,7 +408,7 @@ export function registerQaGateTool(server) {
361
408
  url,
362
409
  path: targetPath,
363
410
  release_readiness: readiness,
364
- composite_score: compositeScore,
411
+ composite_score: composite ?? 0,
365
412
  scorecard,
366
413
  summary,
367
414
  corroborated_findings: corroboratedFindings,
@@ -1 +1 @@
1
- {"version":3,"file":"qaGate.js","sourceRoot":"","sources":["../../src/tools/qaGate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"qaGate.js","sourceRoot":"","sources":["../../src/tools/qaGate.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,16 @@
1
1
  import { z } from "zod";
2
- import { fileURLToPath } from "url";
3
2
  import { resolve } from "path";
4
3
  import { runShell } from "../utils/shellRunner.js";
5
- import { parseESLintJSON, parseSemgrepJSON } from "../utils/outputParsers.js";
6
- import { detectESLintConfig } from "../utils/eslintConfigDetector.js";
4
+ import { parseSemgrepJSON } from "../utils/outputParsers.js";
5
+ import { runESLint } from "../utils/eslintRunner.js";
7
6
  import { formatStaticAnalysisFinding, } from "../mappers/defectFormatter.js";
8
- const BASELINE_CONFIG_PATH = fileURLToPath(new URL("../config/qa-mcp-baseline.eslint.config.js", import.meta.url));
9
7
  const PRIORITY_ORDER = { P1: 0, P2: 1, P3: 2 };
10
8
  function higherPriority(a, b) {
11
9
  return PRIORITY_ORDER[a.priority] <= PRIORITY_ORDER[b.priority] ? a : b;
12
10
  }
13
- function isNotInstalled(stderr, stdout, exitCode) {
11
+ function isSemgrepNotInstalled(stderr, stdout, exitCode) {
14
12
  if (exitCode !== -1)
15
13
  return false;
16
- // When execa fails with ENOENT (command not found), the process never starts
17
- // so stderr is an empty string — we can't rely on string-matching alone.
18
14
  if (!stderr && !stdout)
19
15
  return true;
20
16
  return (stderr.includes("ENOENT") ||
@@ -40,72 +36,23 @@ export function registerStaticAnalysisTool(server) {
40
36
  inputSchema: inputShape,
41
37
  }, async ({ path: targetPath, ruleset }) => {
42
38
  const absPath = resolve(targetPath);
43
- // --- Decide ESLint config strategy ---
44
- const { hasConfig } = detectESLintConfig(absPath);
45
- const eslintConfigUsed = hasConfig ? "project" : "qa-mcp-baseline";
46
- // ESLint flat config resolves `files` globs relative to cwd, not the
47
- // config file location. Always lint "." and run from absPath so that
48
- // "**/*.js" correctly matches files inside the target directory.
49
- const eslintArgs = [".", "--format", "json"];
50
- if (!hasConfig) {
51
- eslintArgs.push("--config", BASELINE_CONFIG_PATH);
52
- }
53
- eslintArgs.push("--ignore-pattern", "node_modules", "--ignore-pattern", "dist");
54
39
  // --- Semgrep args ---
55
40
  const semgrepRulesets = ruleset
56
41
  ? [`--config=${ruleset}`]
57
42
  : ["--config=p/javascript", "--config=p/typescript"];
58
- const semgrepArgs = [
59
- ...semgrepRulesets,
60
- "--json",
61
- "--exclude",
62
- "node_modules",
63
- ".",
64
- ];
65
- // Run both tools in parallel, rooted at the target directory.
66
- const [eslintResult, semgrepResult] = await Promise.all([
67
- runShell("eslint", eslintArgs, { timeoutMs: 120_000, cwd: absPath }),
43
+ const semgrepArgs = [...semgrepRulesets, "--json", "--exclude", "node_modules", "."];
44
+ // Run ESLint (per-package aware) and Semgrep in parallel.
45
+ const [eslintRun, semgrepResult] = await Promise.all([
46
+ runESLint(absPath),
68
47
  runShell("semgrep", semgrepArgs, { timeoutMs: 180_000, cwd: absPath }),
69
48
  ]);
70
49
  const toolsRun = [];
71
- const warnings = [];
72
- const allIssues = [];
73
- // --- ESLint ---
74
- // Exit 0 = no issues, exit 1 = issues found, exit 2 = config/fatal error.
75
- // Exit -1 = tool not found or timeout.
76
- if (isNotInstalled(eslintResult.stderr, eslintResult.stdout, eslintResult.exitCode)) {
77
- warnings.push("ESLint is not installed or not found in PATH — skipping ESLint analysis.");
78
- }
79
- else if (eslintResult.exitCode === 2) {
80
- warnings.push(`ESLint configuration error: ${eslintResult.stderr.slice(0, 500)}`);
81
- }
82
- else if (eslintResult.stdout) {
83
- try {
84
- const parsed = parseESLintJSON(eslintResult.stdout);
85
- for (const issue of parsed.issues) {
86
- allIssues.push({
87
- source: "eslint",
88
- file: issue.filePath,
89
- line: issue.line,
90
- column: issue.column,
91
- ruleId: issue.ruleId,
92
- message: issue.message,
93
- severity: issue.severity,
94
- });
95
- }
96
- toolsRun.push("eslint");
97
- }
98
- catch {
99
- warnings.push("Failed to parse ESLint JSON output.");
100
- }
101
- }
102
- else {
103
- // Exit 0 with no stdout = no files matched (e.g. only TS files with JS-only baseline).
50
+ const warnings = [...eslintRun.warnings];
51
+ const allIssues = [...eslintRun.issues];
52
+ if (eslintRun.ran)
104
53
  toolsRun.push("eslint");
105
- }
106
54
  // --- Semgrep ---
107
- // Exit 0 = no matches, exit 1 = matches found, exit 2 = error.
108
- if (isNotInstalled(semgrepResult.stderr, semgrepResult.stdout, semgrepResult.exitCode)) {
55
+ if (isSemgrepNotInstalled(semgrepResult.stderr, semgrepResult.stdout, semgrepResult.exitCode)) {
109
56
  warnings.push("Semgrep is not installed or not found in PATH — skipping Semgrep analysis.");
110
57
  }
111
58
  else if (semgrepResult.exitCode === 2) {
@@ -113,8 +60,7 @@ export function registerStaticAnalysisTool(server) {
113
60
  }
114
61
  else if (semgrepResult.stdout) {
115
62
  try {
116
- const parsed = parseSemgrepJSON(semgrepResult.stdout);
117
- for (const finding of parsed.findings) {
63
+ for (const finding of parseSemgrepJSON(semgrepResult.stdout).findings) {
118
64
  allIssues.push({
119
65
  source: "semgrep",
120
66
  file: finding.filePath,
@@ -158,10 +104,12 @@ export function registerStaticAnalysisTool(server) {
158
104
  const report = {
159
105
  path: absPath,
160
106
  tools_run: toolsRun,
161
- eslint_config_used: eslintConfigUsed,
107
+ eslint_config_used: eslintRun.config_used,
162
108
  issue_count: findings.length,
163
109
  findings,
164
110
  };
111
+ if (eslintRun.packages.length > 0)
112
+ report["eslint_packages"] = eslintRun.packages;
165
113
  if (warnings.length > 0)
166
114
  report["warnings"] = warnings;
167
115
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"staticAnalysis.js","sourceRoot":"","sources":["../../src/tools/staticAnalysis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"staticAnalysis.js","sourceRoot":"","sources":["../../src/tools/staticAnalysis.ts"],"names":[],"mappings":"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"}
@@ -3,3 +3,16 @@ export interface ESLintConfigResult {
3
3
  configFile: string | null;
4
4
  }
5
5
  export declare function detectESLintConfig(targetPath: string): ESLintConfigResult;
6
+ /**
7
+ * Recursively discovers subdirectories (up to maxDepth) that have their own
8
+ * ESLint config. Does not recurse into a directory that already has a config —
9
+ * ESLint handles nested configs from that point on.
10
+ */
11
+ export declare function discoverESLintPackages(rootPath: string, maxDepth?: number): string[];
12
+ /**
13
+ * Resolves the nearest local ESLint binary by walking up from startPath.
14
+ * Using a local binary avoids version mismatches (e.g. project uses v8 but
15
+ * the global ESLint is v9/v10 which dropped .eslintrc.* support).
16
+ * Falls back to the global "eslint" command if no local binary is found.
17
+ */
18
+ export declare function resolveESLintBinary(startPath: string): string;
@@ -1,5 +1,5 @@
1
- import { existsSync } from "fs";
2
- import { join } from "path";
1
+ import { existsSync, readdirSync, statSync } from "fs";
2
+ import { join, resolve } from "path";
3
3
  // Checked in priority order: flat config first, then legacy formats.
4
4
  const CONFIG_FILES = [
5
5
  "eslint.config.js",
@@ -10,6 +10,10 @@ const CONFIG_FILES = [
10
10
  ".eslintrc.yaml",
11
11
  ".eslintrc",
12
12
  ];
13
+ const SKIP_DIRS = new Set([
14
+ "node_modules", "dist", ".git", ".next", "build", "out", "coverage",
15
+ ".turbo", ".cache", ".vercel", "__pycache__",
16
+ ]);
13
17
  export function detectESLintConfig(targetPath) {
14
18
  for (const file of CONFIG_FILES) {
15
19
  if (existsSync(join(targetPath, file))) {
@@ -18,4 +22,63 @@ export function detectESLintConfig(targetPath) {
18
22
  }
19
23
  return { hasConfig: false, configFile: null };
20
24
  }
25
+ /**
26
+ * Recursively discovers subdirectories (up to maxDepth) that have their own
27
+ * ESLint config. Does not recurse into a directory that already has a config —
28
+ * ESLint handles nested configs from that point on.
29
+ */
30
+ export function discoverESLintPackages(rootPath, maxDepth = 3) {
31
+ const packages = [];
32
+ function walk(dir, depth) {
33
+ if (depth > maxDepth)
34
+ return;
35
+ let entries;
36
+ try {
37
+ entries = readdirSync(dir);
38
+ }
39
+ catch {
40
+ return;
41
+ }
42
+ for (const entry of entries) {
43
+ if (SKIP_DIRS.has(entry))
44
+ continue;
45
+ const full = join(dir, entry);
46
+ try {
47
+ if (!statSync(full).isDirectory())
48
+ continue;
49
+ }
50
+ catch {
51
+ continue;
52
+ }
53
+ if (detectESLintConfig(full).hasConfig) {
54
+ packages.push(full);
55
+ // Stop descending — ESLint resolves nested configs from here.
56
+ }
57
+ else {
58
+ walk(full, depth + 1);
59
+ }
60
+ }
61
+ }
62
+ walk(rootPath, 1);
63
+ return packages;
64
+ }
65
+ /**
66
+ * Resolves the nearest local ESLint binary by walking up from startPath.
67
+ * Using a local binary avoids version mismatches (e.g. project uses v8 but
68
+ * the global ESLint is v9/v10 which dropped .eslintrc.* support).
69
+ * Falls back to the global "eslint" command if no local binary is found.
70
+ */
71
+ export function resolveESLintBinary(startPath) {
72
+ let dir = resolve(startPath);
73
+ for (let i = 0; i < 7; i++) {
74
+ const candidate = join(dir, "node_modules", ".bin", "eslint");
75
+ if (existsSync(candidate))
76
+ return candidate;
77
+ const parent = resolve(join(dir, ".."));
78
+ if (parent === dir)
79
+ break;
80
+ dir = parent;
81
+ }
82
+ return "eslint";
83
+ }
21
84
  //# sourceMappingURL=eslintConfigDetector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslintConfigDetector.js","sourceRoot":"","sources":["../../src/utils/eslintConfigDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,qEAAqE;AACrE,MAAM,YAAY,GAAG;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,WAAW;CACZ,CAAC;AAOF,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"eslintConfigDetector.js","sourceRoot":"","sources":["../../src/utils/eslintConfigDetector.ts"],"names":[],"mappings":"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"}