projscan 0.12.0 → 0.14.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 (105) hide show
  1. package/README.md +18 -13
  2. package/dist/analyzers/crossPackageImportCheck.d.ts +13 -0
  3. package/dist/analyzers/crossPackageImportCheck.js +136 -0
  4. package/dist/analyzers/crossPackageImportCheck.js.map +1 -0
  5. package/dist/analyzers/cycleCheck.d.ts +12 -0
  6. package/dist/analyzers/cycleCheck.js +65 -0
  7. package/dist/analyzers/cycleCheck.js.map +1 -0
  8. package/dist/cli/commands/audit.js +8 -2
  9. package/dist/cli/commands/audit.js.map +1 -1
  10. package/dist/cli/commands/dependencies.js +4 -3
  11. package/dist/cli/commands/dependencies.js.map +1 -1
  12. package/dist/cli/commands/explainIssue.d.ts +1 -0
  13. package/dist/cli/commands/explainIssue.js +49 -0
  14. package/dist/cli/commands/explainIssue.js.map +1 -0
  15. package/dist/cli/commands/fixSuggest.d.ts +1 -0
  16. package/dist/cli/commands/fixSuggest.js +71 -0
  17. package/dist/cli/commands/fixSuggest.js.map +1 -0
  18. package/dist/cli/commands/review.d.ts +1 -0
  19. package/dist/cli/commands/review.js +66 -0
  20. package/dist/cli/commands/review.js.map +1 -0
  21. package/dist/cli/index.js +6 -0
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/core/ast.d.ts +20 -0
  24. package/dist/core/ast.js +190 -0
  25. package/dist/core/ast.js.map +1 -1
  26. package/dist/core/auditRunner.d.ts +8 -0
  27. package/dist/core/auditRunner.js +50 -1
  28. package/dist/core/auditRunner.js.map +1 -1
  29. package/dist/core/codeGraph.d.ts +7 -1
  30. package/dist/core/codeGraph.js +2 -0
  31. package/dist/core/codeGraph.js.map +1 -1
  32. package/dist/core/dependencyAnalyzer.d.ts +15 -1
  33. package/dist/core/dependencyAnalyzer.js +115 -18
  34. package/dist/core/dependencyAnalyzer.js.map +1 -1
  35. package/dist/core/explainIssue.d.ts +9 -0
  36. package/dist/core/explainIssue.js +106 -0
  37. package/dist/core/explainIssue.js.map +1 -0
  38. package/dist/core/fileInspector.js +12 -0
  39. package/dist/core/fileInspector.js.map +1 -1
  40. package/dist/core/fixSuggest.d.ts +41 -0
  41. package/dist/core/fixSuggest.js +327 -0
  42. package/dist/core/fixSuggest.js.map +1 -0
  43. package/dist/core/indexCache.js +5 -1
  44. package/dist/core/indexCache.js.map +1 -1
  45. package/dist/core/issueEngine.js +18 -0
  46. package/dist/core/issueEngine.js.map +1 -1
  47. package/dist/core/languages/goAdapter.js +5 -0
  48. package/dist/core/languages/goAdapter.js.map +1 -1
  49. package/dist/core/languages/goFunctions.d.ts +24 -0
  50. package/dist/core/languages/goFunctions.js +99 -0
  51. package/dist/core/languages/goFunctions.js.map +1 -0
  52. package/dist/core/languages/javaAdapter.js +5 -0
  53. package/dist/core/languages/javaAdapter.js.map +1 -1
  54. package/dist/core/languages/javaFunctions.d.ts +22 -0
  55. package/dist/core/languages/javaFunctions.js +87 -0
  56. package/dist/core/languages/javaFunctions.js.map +1 -0
  57. package/dist/core/languages/pythonAdapter.js +5 -0
  58. package/dist/core/languages/pythonAdapter.js.map +1 -1
  59. package/dist/core/languages/pythonFunctions.d.ts +23 -0
  60. package/dist/core/languages/pythonFunctions.js +87 -0
  61. package/dist/core/languages/pythonFunctions.js.map +1 -0
  62. package/dist/core/languages/rubyAdapter.js +5 -0
  63. package/dist/core/languages/rubyAdapter.js.map +1 -1
  64. package/dist/core/languages/rubyFunctions.d.ts +22 -0
  65. package/dist/core/languages/rubyFunctions.js +91 -0
  66. package/dist/core/languages/rubyFunctions.js.map +1 -0
  67. package/dist/core/review.d.ts +21 -0
  68. package/dist/core/review.js +457 -0
  69. package/dist/core/review.js.map +1 -0
  70. package/dist/index.d.ts +5 -1
  71. package/dist/index.js +3 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/mcp/tools/audit.js +7 -2
  74. package/dist/mcp/tools/audit.js.map +1 -1
  75. package/dist/mcp/tools/dependencies.js +11 -5
  76. package/dist/mcp/tools/dependencies.js.map +1 -1
  77. package/dist/mcp/tools/explainIssue.d.ts +2 -0
  78. package/dist/mcp/tools/explainIssue.js +30 -0
  79. package/dist/mcp/tools/explainIssue.js.map +1 -0
  80. package/dist/mcp/tools/file.js +1 -1
  81. package/dist/mcp/tools/file.js.map +1 -1
  82. package/dist/mcp/tools/fixSuggest.d.ts +2 -0
  83. package/dist/mcp/tools/fixSuggest.js +57 -0
  84. package/dist/mcp/tools/fixSuggest.js.map +1 -0
  85. package/dist/mcp/tools/hotspots.js +40 -1
  86. package/dist/mcp/tools/hotspots.js.map +1 -1
  87. package/dist/mcp/tools/review.d.ts +2 -0
  88. package/dist/mcp/tools/review.js +54 -0
  89. package/dist/mcp/tools/review.js.map +1 -0
  90. package/dist/mcp/tools.js +6 -0
  91. package/dist/mcp/tools.js.map +1 -1
  92. package/dist/reporters/consoleReporter.d.ts +9 -1
  93. package/dist/reporters/consoleReporter.js +177 -0
  94. package/dist/reporters/consoleReporter.js.map +1 -1
  95. package/dist/reporters/jsonReporter.d.ts +9 -1
  96. package/dist/reporters/jsonReporter.js +9 -0
  97. package/dist/reporters/jsonReporter.js.map +1 -1
  98. package/dist/reporters/markdownReporter.d.ts +9 -1
  99. package/dist/reporters/markdownReporter.js +141 -0
  100. package/dist/reporters/markdownReporter.js.map +1 -1
  101. package/dist/tool-manifest.json +96 -8
  102. package/dist/types.d.ts +228 -0
  103. package/dist/utils/config.js +27 -0
  104. package/dist/utils/config.js.map +1 -1
  105. package/package.json +4 -2
@@ -1,5 +1,6 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
+ import { detectWorkspaces } from './monorepo.js';
3
4
  const DEPRECATED_PACKAGES = {
4
5
  moment: 'Consider using date-fns or dayjs instead',
5
6
  request: 'Deprecated - use node-fetch, undici, or axios instead',
@@ -12,8 +13,105 @@ const HEAVY_PACKAGES = {
12
13
  underscore: 'Many utilities are now available as native JS methods',
13
14
  jquery: 'Consider using native DOM APIs if possible',
14
15
  };
15
- export async function analyzeDependencies(rootPath) {
16
- const pkgPath = path.join(rootPath, 'package.json');
16
+ /**
17
+ * Analyze project dependencies. Workspace-aware (0.13.0+): in a monorepo the
18
+ * report aggregates across the root manifest plus every workspace package's
19
+ * manifest, with a `byWorkspace` breakdown. In single-package repos behavior
20
+ * is unchanged - `byWorkspace` is omitted.
21
+ */
22
+ export async function analyzeDependencies(rootPath, options = {}) {
23
+ const ws = await detectWorkspaces(rootPath);
24
+ const realWorkspaces = ws.packages.filter((p) => !p.isRoot);
25
+ const isMonorepo = ws.kind !== 'none' && realWorkspaces.length > 0;
26
+ // Single-package: original behavior, no `byWorkspace` field.
27
+ if (!isMonorepo) {
28
+ const one = await analyzeOne(rootPath, undefined);
29
+ if (!one)
30
+ return null;
31
+ // Project-level risks live with the aggregate, not in analyzeOne.
32
+ if (one.totalDependencies > 0) {
33
+ const hasLock = await checkLockfile(rootPath);
34
+ if (!hasLock) {
35
+ one.risks.push({
36
+ name: 'no-lockfile',
37
+ reason: 'No lockfile found - run npm install to generate package-lock.json',
38
+ severity: 'medium',
39
+ });
40
+ }
41
+ }
42
+ return one;
43
+ }
44
+ // Monorepo: analyze each manifest (root, if present, plus each workspace).
45
+ const rootPkg = ws.packages.find((p) => p.isRoot);
46
+ const manifests = [];
47
+ if (rootPkg) {
48
+ manifests.push({
49
+ dir: rootPath,
50
+ relativePath: '',
51
+ name: rootPkg.name,
52
+ isRoot: true,
53
+ });
54
+ }
55
+ for (const wp of realWorkspaces) {
56
+ manifests.push({
57
+ dir: path.join(rootPath, wp.relativePath),
58
+ relativePath: wp.relativePath,
59
+ name: wp.name,
60
+ isRoot: false,
61
+ });
62
+ }
63
+ const filter = options.packageFilter;
64
+ const filtered = filter
65
+ ? manifests.filter((m) => m.name === filter || m.relativePath === filter)
66
+ : manifests;
67
+ if (filter && filtered.length === 0)
68
+ return null;
69
+ const byWorkspace = [];
70
+ let totalDeps = 0;
71
+ let totalDevDeps = 0;
72
+ const aggregateDeps = {};
73
+ const aggregateDevDeps = {};
74
+ const aggregateRisks = [];
75
+ for (const m of filtered) {
76
+ const one = await analyzeOne(m.dir, m.isRoot ? undefined : m.name);
77
+ if (!one)
78
+ continue;
79
+ totalDeps += one.totalDependencies;
80
+ totalDevDeps += one.totalDevDependencies;
81
+ Object.assign(aggregateDeps, one.dependencies);
82
+ Object.assign(aggregateDevDeps, one.devDependencies);
83
+ for (const r of one.risks)
84
+ aggregateRisks.push(r);
85
+ byWorkspace.push({
86
+ workspace: m.name,
87
+ relativePath: m.relativePath,
88
+ isRoot: m.isRoot,
89
+ totalDependencies: one.totalDependencies,
90
+ totalDevDependencies: one.totalDevDependencies,
91
+ risks: one.risks,
92
+ });
93
+ }
94
+ // Re-evaluate aggregate-level risks that need totals across all manifests.
95
+ // The lockfile check is repo-wide, not per-workspace.
96
+ const hasLockfile = await checkLockfile(rootPath);
97
+ if (!hasLockfile && totalDeps > 0) {
98
+ aggregateRisks.push({
99
+ name: 'no-lockfile',
100
+ reason: 'No lockfile found - run npm install to generate package-lock.json',
101
+ severity: 'medium',
102
+ });
103
+ }
104
+ return {
105
+ totalDependencies: totalDeps,
106
+ totalDevDependencies: totalDevDeps,
107
+ dependencies: aggregateDeps,
108
+ devDependencies: aggregateDevDeps,
109
+ risks: aggregateRisks,
110
+ byWorkspace,
111
+ };
112
+ }
113
+ async function analyzeOne(manifestDir, workspaceName) {
114
+ const pkgPath = path.join(manifestDir, 'package.json');
17
115
  let raw;
18
116
  try {
19
117
  raw = await fs.readFile(pkgPath, 'utf-8');
@@ -21,29 +119,35 @@ export async function analyzeDependencies(rootPath) {
21
119
  catch {
22
120
  return null;
23
121
  }
24
- const pkg = JSON.parse(raw);
122
+ let pkg;
123
+ try {
124
+ pkg = JSON.parse(raw);
125
+ }
126
+ catch {
127
+ return null;
128
+ }
25
129
  const dependencies = pkg.dependencies ?? {};
26
130
  const devDependencies = pkg.devDependencies ?? {};
27
131
  const risks = [];
28
- // Check for deprecated packages
132
+ // Deprecated packages
29
133
  for (const [name, reason] of Object.entries(DEPRECATED_PACKAGES)) {
30
134
  if (dependencies[name] || devDependencies[name]) {
31
- risks.push({ name, reason, severity: 'high' });
135
+ risks.push({ name, reason, severity: 'high', workspace: workspaceName });
32
136
  }
33
137
  }
34
- // Check for heavy packages
138
+ // Heavy packages
35
139
  for (const [name, reason] of Object.entries(HEAVY_PACKAGES)) {
36
140
  if (dependencies[name]) {
37
- risks.push({ name, reason, severity: 'medium' });
141
+ risks.push({ name, reason, severity: 'medium', workspace: workspaceName });
38
142
  }
39
143
  }
40
- // Check for excessive dependencies
41
144
  const totalDeps = Object.keys(dependencies).length;
42
145
  if (totalDeps > 100) {
43
146
  risks.push({
44
147
  name: 'excessive-dependencies',
45
148
  reason: `${totalDeps} production dependencies - consider auditing for unused packages`,
46
149
  severity: 'high',
150
+ workspace: workspaceName,
47
151
  });
48
152
  }
49
153
  else if (totalDeps > 50) {
@@ -51,27 +155,20 @@ export async function analyzeDependencies(rootPath) {
51
155
  name: 'many-dependencies',
52
156
  reason: `${totalDeps} production dependencies - review for opportunities to reduce`,
53
157
  severity: 'medium',
158
+ workspace: workspaceName,
54
159
  });
55
160
  }
56
- // Check for wildcard version ranges
161
+ // Wildcard version ranges
57
162
  for (const [name, version] of Object.entries(dependencies)) {
58
163
  if (version === '*' || version.startsWith('>=')) {
59
164
  risks.push({
60
165
  name,
61
166
  reason: `Wildcard version range "${version}" - pin to a specific version for reproducible builds`,
62
167
  severity: 'high',
168
+ workspace: workspaceName,
63
169
  });
64
170
  }
65
171
  }
66
- // Check for missing lockfile
67
- const hasLockfile = await checkLockfile(rootPath);
68
- if (!hasLockfile && totalDeps > 0) {
69
- risks.push({
70
- name: 'no-lockfile',
71
- reason: 'No lockfile found - run npm install to generate package-lock.json',
72
- severity: 'medium',
73
- });
74
- }
75
172
  return {
76
173
  totalDependencies: totalDeps,
77
174
  totalDevDependencies: Object.keys(devDependencies).length,
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyAnalyzer.js","sourceRoot":"","sources":["../../src/core/dependencyAnalyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependencyAnalyzer.js","sourceRoot":"","sources":["../../src/core/dependencyAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Issue, IssueExplanation } from '../types.js';
2
+ /**
3
+ * Build a markdown-friendly deep-dive for one open issue. Used by
4
+ * `projscan_explain_issue` (MCP) and `projscan explain-issue` (CLI). Reads
5
+ * the surrounding code, finds related issues touching the same file, and
6
+ * scans git log for past commits that mention the rule by id - useful when
7
+ * the team has a precedent for handling this issue type.
8
+ */
9
+ export declare function explainIssue(rootPath: string, allIssues: Issue[], issueId: string): Promise<IssueExplanation | null>;
@@ -0,0 +1,106 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readExcerpt, suggestFixForIssue, previewSuggestionForIssue } from './fixSuggest.js';
3
+ const SIMILAR_FIXES_LIMIT = 5;
4
+ const GIT_LOG_TIMEOUT_MS = 5_000;
5
+ /**
6
+ * Build a markdown-friendly deep-dive for one open issue. Used by
7
+ * `projscan_explain_issue` (MCP) and `projscan explain-issue` (CLI). Reads
8
+ * the surrounding code, finds related issues touching the same file, and
9
+ * scans git log for past commits that mention the rule by id - useful when
10
+ * the team has a precedent for handling this issue type.
11
+ */
12
+ export async function explainIssue(rootPath, allIssues, issueId) {
13
+ const issue = allIssues.find((i) => i.id === issueId);
14
+ if (!issue)
15
+ return null;
16
+ const primary = pickPrimaryLocation(issue.locations);
17
+ const excerpt = primary ? await readExcerpt(rootPath, primary, 3) : null;
18
+ // Other issues touching the same primary file.
19
+ const relatedIssues = primary
20
+ ? allIssues
21
+ .filter((other) => other.id !== issue.id &&
22
+ (other.locations ?? []).some((l) => l.file === primary.file))
23
+ .slice(0, 10)
24
+ .map((o) => ({ id: o.id, title: o.title }))
25
+ : [];
26
+ const similarFixes = await searchGitLogForRule(rootPath, ruleKey(issue.id));
27
+ const fix = await suggestFixForIssue(issue, rootPath);
28
+ const headline = previewSuggestionForIssue(issue)?.summary ?? issue.title;
29
+ return {
30
+ issueId: issue.id,
31
+ title: issue.title,
32
+ severity: issue.severity,
33
+ category: issue.category,
34
+ headline,
35
+ excerpt,
36
+ relatedIssues,
37
+ similarFixes,
38
+ fix,
39
+ };
40
+ }
41
+ function pickPrimaryLocation(locations) {
42
+ if (!locations || locations.length === 0)
43
+ return null;
44
+ // First location with a line number wins; otherwise first overall.
45
+ const withLine = locations.find((l) => typeof l.line === 'number');
46
+ return withLine ?? locations[0];
47
+ }
48
+ /**
49
+ * Strip trailing numeric / hash suffixes so a per-instance id like
50
+ * `cycle-detected-3` matches commits mentioning `cycle-detected`. Falls
51
+ * back to the original id when there's no obvious suffix.
52
+ */
53
+ function ruleKey(issueId) {
54
+ // unused-dependency-foo, cycle-detected-3, dep-risk-moment, audit-axios
55
+ // Strip a trailing numeric or single-segment lower/upper-case word so we get
56
+ // the rule prefix; if the suffix is itself meaningful (e.g. dep name), the
57
+ // longer id is also tried below.
58
+ const match = /^([a-z][a-z0-9-]*?)(?:-[A-Za-z0-9_./@-]+)?$/.exec(issueId);
59
+ // Take the first 2 segments as the most stable rule key.
60
+ const segs = issueId.split('-');
61
+ if (segs.length <= 2)
62
+ return match ? match[1] : issueId;
63
+ return segs.slice(0, 2).join('-');
64
+ }
65
+ async function searchGitLogForRule(rootPath, rule) {
66
+ // git log --grep=<rule> --max-count=N --pretty=%H|%ad|%s --date=short
67
+ return new Promise((resolve) => {
68
+ const args = [
69
+ 'log',
70
+ `--grep=${rule}`,
71
+ `--max-count=${SIMILAR_FIXES_LIMIT}`,
72
+ '--pretty=%H|%ad|%s',
73
+ '--date=short',
74
+ '--no-merges',
75
+ ];
76
+ const child = spawn('git', args, { cwd: rootPath, env: process.env });
77
+ let stdout = '';
78
+ let timedOut = false;
79
+ const timer = setTimeout(() => {
80
+ timedOut = true;
81
+ child.kill('SIGKILL');
82
+ resolve([]);
83
+ }, GIT_LOG_TIMEOUT_MS);
84
+ child.stdout.on('data', (d) => (stdout += d.toString()));
85
+ child.on('error', () => {
86
+ clearTimeout(timer);
87
+ resolve([]);
88
+ });
89
+ child.on('close', () => {
90
+ clearTimeout(timer);
91
+ if (timedOut)
92
+ return;
93
+ const out = [];
94
+ for (const line of stdout.split('\n')) {
95
+ if (!line.trim())
96
+ continue;
97
+ const [sha, date, ...rest] = line.split('|');
98
+ if (!sha || !date)
99
+ continue;
100
+ out.push({ sha, date, subject: rest.join('|') });
101
+ }
102
+ resolve(out);
103
+ });
104
+ });
105
+ }
106
+ //# sourceMappingURL=explainIssue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainIssue.js","sourceRoot":"","sources":["../../src/core/explainIssue.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,7 @@ export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
81
81
  let cyclomaticComplexity = null;
82
82
  let fanIn = null;
83
83
  let fanOut = null;
84
+ let functions;
84
85
  const graphFileEntry = graph.files.get(relativePath);
85
86
  if (graphFileEntry) {
86
87
  cyclomaticComplexity = graphFileEntry.parseOk ? graphFileEntry.cyclomaticComplexity : null;
@@ -91,6 +92,16 @@ export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
91
92
  fo++;
92
93
  }
93
94
  fanOut = fo;
95
+ if (graphFileEntry.functions && graphFileEntry.functions.length > 0) {
96
+ functions = [...graphFileEntry.functions]
97
+ .sort((a, b) => b.cyclomaticComplexity - a.cyclomaticComplexity)
98
+ .map((f) => ({
99
+ name: f.name,
100
+ line: f.line,
101
+ endLine: f.endLine,
102
+ cyclomaticComplexity: f.cyclomaticComplexity,
103
+ }));
104
+ }
94
105
  }
95
106
  return {
96
107
  relativePath,
@@ -107,6 +118,7 @@ export async function inspectFile(rootPath, relOrAbsFile, options = {}) {
107
118
  fanIn,
108
119
  fanOut,
109
120
  language,
121
+ functions,
110
122
  };
111
123
  }
112
124
  function mapExportType(kind) {
@@ -1 +1 @@
1
- {"version":3,"file":"fileInspector.js","sourceRoot":"","sources":["../../src/core/fileInspector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileInspector.js","sourceRoot":"","sources":["../../src/core/fileInspector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Issue, IssueLocation, FixSuggestion } from '../types.js';
2
+ /**
3
+ * Pick a template for the issue. Always returns a suggestion - the fallback
4
+ * catches anything without a tailored template. Async because some templates
5
+ * reach into the file system or git for context (none today, but the surface
6
+ * is async-ready).
7
+ */
8
+ export declare function suggestFixForIssue(issue: Issue, rootPath: string): Promise<FixSuggestion>;
9
+ /**
10
+ * Synchronous one-line preview for inline use in projscan_doctor output.
11
+ * Returns the headline a template would render. We can't run the full
12
+ * template synchronously (some are async-shaped); the headline is a
13
+ * lightweight projection that doesn't need IO.
14
+ */
15
+ export declare function previewSuggestionForIssue(issue: Issue): {
16
+ summary: string;
17
+ } | null;
18
+ /**
19
+ * Locate an issue in a doctor result by id. The MCP tool calls this to
20
+ * resolve a fix-suggest request; the issue payload comes from
21
+ * `collectIssues` in the same flow.
22
+ */
23
+ export declare function findIssue(issues: Issue[], issueId: string): Issue | null;
24
+ /**
25
+ * Construct a synthetic Issue when the caller passes file + rule instead of
26
+ * a known id. Useful when an agent wants guidance for a class of issue
27
+ * without first running doctor. The synthetic issue mimics the schema
28
+ * collectIssues would produce, so the same template registry handles it.
29
+ */
30
+ export declare function syntheticIssue(rule: string, file: string, severity?: 'info' | 'warning' | 'error'): Issue;
31
+ /**
32
+ * Read a small excerpt of a file around a 1-based line number. Used by
33
+ * projscan_explain_issue for the "show me the surrounding code" panel.
34
+ * Returns null on any IO failure so callers can render gracefully.
35
+ */
36
+ export declare function readExcerpt(rootPath: string, loc: IssueLocation, context?: number): Promise<{
37
+ file: string;
38
+ startLine: number;
39
+ endLine: number;
40
+ lines: string[];
41
+ } | null>;