purecontext-mcp 1.1.7 → 1.2.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.
- package/AGENT_INSTRUCTIONS.md +393 -0
- package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
- package/AST-SEARCH.md +274 -0
- package/CHANGELOG.md +62 -0
- package/CODE-INTELLIGENCE.md +369 -0
- package/HEALTH-DASHBOARDS.md +241 -0
- package/README.md +7 -0
- package/REFACTORING-SAFELY.md +279 -0
- package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
- package/USER-GUIDE.md +14 -0
- package/VISUALIZING-CODE.md +199 -0
- package/WORKFLOW-TECH-DEBT.md +286 -0
- package/dist/core/db/dep-store.d.ts +75 -0
- package/dist/core/db/dep-store.d.ts.map +1 -1
- package/dist/core/db/dep-store.js +277 -0
- package/dist/core/db/dep-store.js.map +1 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +12 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/index-manager.js +1 -1
- package/dist/core/index-manager.js.map +1 -1
- package/dist/core/token-tracker.d.ts +0 -9
- package/dist/core/token-tracker.d.ts.map +1 -1
- package/dist/core/token-tracker.js +0 -21
- package/dist/core/token-tracker.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/diagram-renderer.d.ts +83 -0
- package/dist/graph/diagram-renderer.d.ts.map +1 -0
- package/dist/graph/diagram-renderer.js +294 -0
- package/dist/graph/diagram-renderer.js.map +1 -0
- package/dist/graph/graph-traversal.d.ts +92 -0
- package/dist/graph/graph-traversal.d.ts.map +1 -1
- package/dist/graph/graph-traversal.js +440 -2
- package/dist/graph/graph-traversal.js.map +1 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +30 -1
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +145 -0
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/_meta.d.ts +0 -2
- package/dist/server/tools/_meta.d.ts.map +1 -1
- package/dist/server/tools/_meta.js +1 -4
- package/dist/server/tools/_meta.js.map +1 -1
- package/dist/server/tools/check-delete-safe.d.ts +50 -0
- package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
- package/dist/server/tools/check-delete-safe.js +308 -0
- package/dist/server/tools/check-delete-safe.js.map +1 -0
- package/dist/server/tools/check-move-safe.d.ts +44 -0
- package/dist/server/tools/check-move-safe.d.ts.map +1 -0
- package/dist/server/tools/check-move-safe.js +266 -0
- package/dist/server/tools/check-move-safe.js.map +1 -0
- package/dist/server/tools/check-rename-safe.d.ts +48 -0
- package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
- package/dist/server/tools/check-rename-safe.js +218 -0
- package/dist/server/tools/check-rename-safe.js.map +1 -0
- package/dist/server/tools/diff-health-radar.d.ts +44 -0
- package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
- package/dist/server/tools/diff-health-radar.js +192 -0
- package/dist/server/tools/diff-health-radar.js.map +1 -0
- package/dist/server/tools/find-cycles.d.ts +31 -0
- package/dist/server/tools/find-cycles.d.ts.map +1 -0
- package/dist/server/tools/find-cycles.js +85 -0
- package/dist/server/tools/find-cycles.js.map +1 -0
- package/dist/server/tools/find-implementations.d.ts +47 -0
- package/dist/server/tools/find-implementations.d.ts.map +1 -0
- package/dist/server/tools/find-implementations.js +167 -0
- package/dist/server/tools/find-implementations.js.map +1 -0
- package/dist/server/tools/find-untested-symbols.d.ts +52 -0
- package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
- package/dist/server/tools/find-untested-symbols.js +308 -0
- package/dist/server/tools/find-untested-symbols.js.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.js +292 -0
- package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
- package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
- package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-call-hierarchy.js +119 -0
- package/dist/server/tools/get-call-hierarchy.js.map +1 -0
- package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
- package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-class-hierarchy.js +125 -0
- package/dist/server/tools/get-class-hierarchy.js.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.js +282 -0
- package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
- package/dist/server/tools/get-coupling-map.d.ts +39 -0
- package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
- package/dist/server/tools/get-coupling-map.js +107 -0
- package/dist/server/tools/get-coupling-map.js.map +1 -0
- package/dist/server/tools/get-debt-report.d.ts +44 -0
- package/dist/server/tools/get-debt-report.d.ts.map +1 -0
- package/dist/server/tools/get-debt-report.js +606 -0
- package/dist/server/tools/get-debt-report.js.map +1 -0
- package/dist/server/tools/get-entry-points.d.ts +79 -0
- package/dist/server/tools/get-entry-points.d.ts.map +1 -0
- package/dist/server/tools/get-entry-points.js +362 -0
- package/dist/server/tools/get-entry-points.js.map +1 -0
- package/dist/server/tools/get-public-api.d.ts +53 -0
- package/dist/server/tools/get-public-api.d.ts.map +1 -0
- package/dist/server/tools/get-public-api.js +218 -0
- package/dist/server/tools/get-public-api.js.map +1 -0
- package/dist/server/tools/get-savings-stats.d.ts.map +1 -1
- package/dist/server/tools/get-savings-stats.js +1 -3
- package/dist/server/tools/get-savings-stats.js.map +1 -1
- package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
- package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
- package/dist/server/tools/get-test-coverage-map.js +588 -0
- package/dist/server/tools/get-test-coverage-map.js.map +1 -0
- package/dist/server/tools/get-todos.d.ts +51 -0
- package/dist/server/tools/get-todos.d.ts.map +1 -0
- package/dist/server/tools/get-todos.js +180 -0
- package/dist/server/tools/get-todos.js.map +1 -0
- package/dist/server/tools/get-type-graph.d.ts +73 -0
- package/dist/server/tools/get-type-graph.d.ts.map +1 -0
- package/dist/server/tools/get-type-graph.js +437 -0
- package/dist/server/tools/get-type-graph.js.map +1 -0
- package/dist/server/tools/health-radar.d.ts +50 -0
- package/dist/server/tools/health-radar.d.ts.map +1 -0
- package/dist/server/tools/health-radar.js +426 -0
- package/dist/server/tools/health-radar.js.map +1 -0
- package/dist/server/tools/plan-refactoring.d.ts +74 -0
- package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
- package/dist/server/tools/plan-refactoring.js +644 -0
- package/dist/server/tools/plan-refactoring.js.map +1 -0
- package/dist/server/tools/render-call-graph.d.ts +40 -0
- package/dist/server/tools/render-call-graph.d.ts.map +1 -0
- package/dist/server/tools/render-call-graph.js +215 -0
- package/dist/server/tools/render-call-graph.js.map +1 -0
- package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
- package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/render-class-hierarchy.js +265 -0
- package/dist/server/tools/render-class-hierarchy.js.map +1 -0
- package/dist/server/tools/render-dep-matrix.d.ts +38 -0
- package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
- package/dist/server/tools/render-dep-matrix.js +186 -0
- package/dist/server/tools/render-dep-matrix.js.map +1 -0
- package/dist/server/tools/render-diagram.d.ts +47 -0
- package/dist/server/tools/render-diagram.d.ts.map +1 -0
- package/dist/server/tools/render-diagram.js +266 -0
- package/dist/server/tools/render-diagram.js.map +1 -0
- package/dist/server/tools/render-import-graph.d.ts +41 -0
- package/dist/server/tools/render-import-graph.d.ts.map +1 -0
- package/dist/server/tools/render-import-graph.js +158 -0
- package/dist/server/tools/render-import-graph.js.map +1 -0
- package/dist/server/tools/search-ast.d.ts +55 -0
- package/dist/server/tools/search-ast.d.ts.map +1 -0
- package/dist/server/tools/search-ast.js +279 -0
- package/dist/server/tools/search-ast.js.map +1 -0
- package/dist/server/tools/search-by-complexity.d.ts +92 -0
- package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
- package/dist/server/tools/search-by-complexity.js +268 -0
- package/dist/server/tools/search-by-complexity.js.map +1 -0
- package/dist/server/tools/search-by-decorator.d.ts +48 -0
- package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
- package/dist/server/tools/search-by-decorator.js +518 -0
- package/dist/server/tools/search-by-decorator.js.map +1 -0
- package/dist/server/tools/search-by-signature.d.ts +56 -0
- package/dist/server/tools/search-by-signature.d.ts.map +1 -0
- package/dist/server/tools/search-by-signature.js +200 -0
- package/dist/server/tools/search-by-signature.js.map +1 -0
- package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
- package/dist/ui/assets/{DependencyGraph-CDtBHM0U.js → DependencyGraph-BSMhzwWV.js} +6 -6
- package/dist/ui/assets/{NotFound-Cdt6X8pl.js → NotFound-CipFP_s1.js} +1 -1
- package/dist/ui/assets/RepoDetail-Dfp5z5Kq.js +1 -0
- package/dist/ui/assets/{RepoList-B9LaZvob.js → RepoList-BKtST3hB.js} +1 -1
- package/dist/ui/assets/{Search-CLqv2KGV.js → Search-DzhGDViy.js} +1 -1
- package/dist/ui/assets/{SymbolView-BlbDR1DU.js → SymbolView-ryVEwAHG.js} +1 -1
- package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
- package/dist/ui/assets/{index-i3Q1XbEh.js → index-nX2chMqi.js} +6 -6
- package/dist/ui/assets/{useSearch-mbMk6-M1.js → useSearch-BnBCRKui.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/dev/jcodemunch-gap-analysis.md +198 -0
- package/package.json +9 -1
- package/user-manual.md +2466 -0
- package/dist/ui/assets/BlastRadius-BDZWhEk-.js +0 -1
- package/dist/ui/assets/RepoDetail-M6WaYbZ3.js +0 -1
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get-test-coverage-map.ts
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: get_test_coverage_map
|
|
5
|
+
*
|
|
6
|
+
* Parses a coverage JSON report (Istanbul/NYC or V8/c8 format) and maps
|
|
7
|
+
* line-level coverage data to symbols in the indexed codebase. Returns
|
|
8
|
+
* per-file coverage metrics and per-symbol covered/uncovered status.
|
|
9
|
+
*
|
|
10
|
+
* Supported formats:
|
|
11
|
+
* Istanbul/NYC — coverage-final.json produced by nyc, jest --coverage,
|
|
12
|
+
* vitest --coverage.reporter=json, c8 (json reporter).
|
|
13
|
+
* Keys are absolute file paths; values have statementMap,
|
|
14
|
+
* fnMap, branchMap, s, f, b counters.
|
|
15
|
+
*
|
|
16
|
+
* V8 — coverage produced by Node --experimental-vm-modules or
|
|
17
|
+
* c8 json-summary. An array of {url, functions} objects
|
|
18
|
+
* where url is a file:// URI and functions carry byte-range
|
|
19
|
+
* hit counts.
|
|
20
|
+
*
|
|
21
|
+
* Detection strategy:
|
|
22
|
+
* - Top-level object → Istanbul
|
|
23
|
+
* - Top-level array → V8
|
|
24
|
+
* Auto-detected by default; override with the `format` parameter.
|
|
25
|
+
*
|
|
26
|
+
* Symbol coverage:
|
|
27
|
+
* Symbols are matched to coverage functions by exact name. If no name
|
|
28
|
+
* match is found, line-range overlap is used as a fallback.
|
|
29
|
+
* This is a static heuristic — minified or transpiled code may reduce
|
|
30
|
+
* accuracy. For precise coverage, ensure the coverage report was generated
|
|
31
|
+
* from the same (or source-mapped) code that was indexed.
|
|
32
|
+
*
|
|
33
|
+
* Differs from related tools:
|
|
34
|
+
* find_untested_symbols — name-based heuristic, no coverage file needed
|
|
35
|
+
* get_complexity_hotspots — complexity ranking without coverage data
|
|
36
|
+
* get_quality_metrics — per-symbol quality scoring, not coverage
|
|
37
|
+
*/
|
|
38
|
+
import { z } from 'zod';
|
|
39
|
+
import { readFileSync } from 'fs';
|
|
40
|
+
import { openDatabase, getRepo } from '../../core/db/schema.js';
|
|
41
|
+
import { buildMeta } from './_meta.js';
|
|
42
|
+
export const name = 'get_test_coverage_map';
|
|
43
|
+
export const description = 'Parse a coverage JSON report (Istanbul/NYC or V8/c8 format) and map ' +
|
|
44
|
+
'line-level coverage to symbols in the indexed codebase. Returns per-file ' +
|
|
45
|
+
'statement, function, branch, and line coverage metrics together with ' +
|
|
46
|
+
'per-symbol covered/uncovered status and call counts. ' +
|
|
47
|
+
'Use this to answer "which functions are untested?" with line-accuracy, ' +
|
|
48
|
+
'or to build a coverage heat map across the codebase.' +
|
|
49
|
+
'\n\nSupported report formats: Istanbul/NYC (coverage-final.json), ' +
|
|
50
|
+
'V8/c8 (json reporter). Format is auto-detected.' +
|
|
51
|
+
'\n\nDiffers from related tools:' +
|
|
52
|
+
'\n find_untested_symbols — name-based heuristic, no coverage file needed' +
|
|
53
|
+
'\n get_complexity_hotspots — complexity ranking without coverage data' +
|
|
54
|
+
'\n get_quality_metrics — per-symbol quality scoring, not coverage';
|
|
55
|
+
// ─── Input schema ──────────────────────────────────────────────────────────────
|
|
56
|
+
export const inputSchema = {
|
|
57
|
+
repoId: z.string().describe('Repository ID returned by index_folder or list_repos'),
|
|
58
|
+
coveragePath: z
|
|
59
|
+
.string()
|
|
60
|
+
.describe('Absolute path to the coverage JSON file ' +
|
|
61
|
+
'(e.g. "/project/coverage/coverage-final.json"). ' +
|
|
62
|
+
'Supports Istanbul/NYC and V8/c8 formats.'),
|
|
63
|
+
scope: z
|
|
64
|
+
.string()
|
|
65
|
+
.optional()
|
|
66
|
+
.describe('Restrict to a directory prefix (e.g. "src/services/"). ' +
|
|
67
|
+
'Omit to analyse the whole repo.'),
|
|
68
|
+
filePath: z
|
|
69
|
+
.string()
|
|
70
|
+
.optional()
|
|
71
|
+
.describe('Restrict to a specific source file (relative to repo root).'),
|
|
72
|
+
minCoverage: z
|
|
73
|
+
.number().min(0).max(100)
|
|
74
|
+
.optional()
|
|
75
|
+
.describe('Return only files whose line coverage is BELOW this threshold (0–100). ' +
|
|
76
|
+
'Omit to return all covered files.'),
|
|
77
|
+
includeUncoveredLines: z
|
|
78
|
+
.boolean()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('When true, include the list of uncovered line numbers per file. ' +
|
|
81
|
+
'Default false (keeps response size small).'),
|
|
82
|
+
limit: z
|
|
83
|
+
.number().int().min(1).max(100)
|
|
84
|
+
.optional()
|
|
85
|
+
.describe('Maximum number of files to return (default 20).'),
|
|
86
|
+
format: z
|
|
87
|
+
.enum(['auto', 'istanbul', 'v8'])
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('Coverage format. Default "auto" (detect from JSON structure).'),
|
|
90
|
+
};
|
|
91
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Detect the coverage format from the parsed JSON value.
|
|
94
|
+
*/
|
|
95
|
+
function detectFormat(parsed) {
|
|
96
|
+
if (Array.isArray(parsed)) {
|
|
97
|
+
// V8: array of { url, functions } objects
|
|
98
|
+
return 'v8';
|
|
99
|
+
}
|
|
100
|
+
if (parsed !== null && typeof parsed === 'object') {
|
|
101
|
+
// Istanbul: keys are file paths; values have statementMap, s, fnMap, f
|
|
102
|
+
return 'istanbul';
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Normalise a path to forward-slash form for cross-platform comparison.
|
|
108
|
+
*/
|
|
109
|
+
function normSlashes(p) {
|
|
110
|
+
return p.replace(/\\/g, '/');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert a `file://` URL to an absolute path string.
|
|
114
|
+
* Handles Windows drive letters (file:///D:/path → D:/path).
|
|
115
|
+
*/
|
|
116
|
+
function fileUrlToPath(url) {
|
|
117
|
+
if (url.startsWith('file:///')) {
|
|
118
|
+
const p = decodeURIComponent(url.slice(8));
|
|
119
|
+
// Windows: starts with drive letter
|
|
120
|
+
if (/^[A-Za-z]:/.test(p))
|
|
121
|
+
return p;
|
|
122
|
+
return '/' + p;
|
|
123
|
+
}
|
|
124
|
+
if (url.startsWith('file://')) {
|
|
125
|
+
return decodeURIComponent(url.slice(7));
|
|
126
|
+
}
|
|
127
|
+
return url;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Try to resolve an absolute coverage path to a path relative to repoRoot.
|
|
131
|
+
* Returns null if the file is outside the repo.
|
|
132
|
+
*/
|
|
133
|
+
function toRelativePath(absPath, repoRoot) {
|
|
134
|
+
const norm = normSlashes(absPath);
|
|
135
|
+
const root = normSlashes(repoRoot).replace(/\/$/, '');
|
|
136
|
+
if (norm.startsWith(root + '/')) {
|
|
137
|
+
return norm.slice(root.length + 1);
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Compute the 1-based line number of a byte offset in a buffer.
|
|
143
|
+
*/
|
|
144
|
+
function lineOf(buf, byteOffset) {
|
|
145
|
+
const limit = Math.min(byteOffset, buf.length);
|
|
146
|
+
let line = 1;
|
|
147
|
+
for (let i = 0; i < limit; i++) {
|
|
148
|
+
if (buf[i] === 0x0a)
|
|
149
|
+
line++;
|
|
150
|
+
}
|
|
151
|
+
return line;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Compute covered and uncovered line sets from an Istanbul statementMap + s.
|
|
155
|
+
*/
|
|
156
|
+
function computeIstanbulLines(statementMap, s) {
|
|
157
|
+
// line → whether any statement on this line was executed
|
|
158
|
+
const lineAny = new Map();
|
|
159
|
+
for (const [idx, range] of Object.entries(statementMap)) {
|
|
160
|
+
const count = s[idx] ?? 0;
|
|
161
|
+
const line = range.start.line;
|
|
162
|
+
const prev = lineAny.get(line) ?? false;
|
|
163
|
+
lineAny.set(line, prev || count > 0);
|
|
164
|
+
}
|
|
165
|
+
const covered = new Set();
|
|
166
|
+
const uncovered = new Set();
|
|
167
|
+
for (const [line, isCovered] of lineAny) {
|
|
168
|
+
if (isCovered)
|
|
169
|
+
covered.add(line);
|
|
170
|
+
else
|
|
171
|
+
uncovered.add(line);
|
|
172
|
+
}
|
|
173
|
+
return { covered, uncovered };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* From an Istanbul fnMap + f, find the call count for a symbol name.
|
|
177
|
+
* Falls back to line-range overlap.
|
|
178
|
+
*/
|
|
179
|
+
function istanbulFnCallCount(symbolName, symbolStartLine, symbolEndLine, fnMap, f) {
|
|
180
|
+
// 1. Exact name match
|
|
181
|
+
for (const [idx, fn] of Object.entries(fnMap)) {
|
|
182
|
+
if (fn.name === symbolName) {
|
|
183
|
+
return f[idx] ?? 0;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 2. Line-range overlap: function's start line inside symbol's lines
|
|
187
|
+
for (const [idx, fn] of Object.entries(fnMap)) {
|
|
188
|
+
const fnLine = fn.loc.start.line;
|
|
189
|
+
if (fnLine >= symbolStartLine && fnLine <= symbolEndLine) {
|
|
190
|
+
return f[idx] ?? 0;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* From a V8 script's functions, find the call count for a symbol name.
|
|
197
|
+
* Returns null when no match found.
|
|
198
|
+
*/
|
|
199
|
+
function v8FnCallCount(symbolName, functions) {
|
|
200
|
+
for (const fn of functions) {
|
|
201
|
+
if (fn.functionName === symbolName) {
|
|
202
|
+
// Max count across ranges indicates the function was called
|
|
203
|
+
return fn.ranges.reduce((max, r) => Math.max(max, r.count), 0);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Compute V8 function coverage metrics for a script.
|
|
210
|
+
*/
|
|
211
|
+
function computeV8FunctionCoverage(functions) {
|
|
212
|
+
// Skip "(top-level)" / "(anonymous)" entries that wrap the module
|
|
213
|
+
const named = functions.filter((fn) => fn.functionName !== '' &&
|
|
214
|
+
fn.functionName !== '(top-level)' &&
|
|
215
|
+
!fn.functionName.startsWith('(anonymous'));
|
|
216
|
+
const total = named.length;
|
|
217
|
+
const covered = named.filter((fn) => fn.ranges.some((r) => r.count > 0)).length;
|
|
218
|
+
return { totalFunctions: total, coveredFunctions: covered };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Compute line coverage from V8 byte ranges + file content.
|
|
222
|
+
* Returns the set of covered lines and uncovered lines.
|
|
223
|
+
*/
|
|
224
|
+
function computeV8Lines(content, functions) {
|
|
225
|
+
if (content.length === 0)
|
|
226
|
+
return { covered: new Set(), uncovered: new Set() };
|
|
227
|
+
// Build a per-byte coverage map using function ranges
|
|
228
|
+
const coveredBytes = new Uint8Array(content.length);
|
|
229
|
+
for (const fn of functions) {
|
|
230
|
+
for (const range of fn.ranges) {
|
|
231
|
+
if (range.count > 0) {
|
|
232
|
+
const end = Math.min(range.endOffset, content.length);
|
|
233
|
+
for (let i = range.startOffset; i < end; i++) {
|
|
234
|
+
coveredBytes[i] = 1;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Convert to line coverage: a line is covered if any byte on it is covered
|
|
240
|
+
const covered = new Set();
|
|
241
|
+
const uncovered = new Set();
|
|
242
|
+
let line = 1;
|
|
243
|
+
let lineHasCoveredByte = false;
|
|
244
|
+
let lineHasCode = false;
|
|
245
|
+
for (let i = 0; i < content.length; i++) {
|
|
246
|
+
const byte = content[i];
|
|
247
|
+
if (byte !== 0x0a && byte !== 0x0d && byte !== 0x20 && byte !== 0x09) {
|
|
248
|
+
lineHasCode = true;
|
|
249
|
+
}
|
|
250
|
+
if (coveredBytes[i])
|
|
251
|
+
lineHasCoveredByte = true;
|
|
252
|
+
if (byte === 0x0a) {
|
|
253
|
+
if (lineHasCode) {
|
|
254
|
+
if (lineHasCoveredByte)
|
|
255
|
+
covered.add(line);
|
|
256
|
+
else
|
|
257
|
+
uncovered.add(line);
|
|
258
|
+
}
|
|
259
|
+
line++;
|
|
260
|
+
lineHasCoveredByte = false;
|
|
261
|
+
lineHasCode = false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Last line (no trailing newline)
|
|
265
|
+
if (lineHasCode) {
|
|
266
|
+
if (lineHasCoveredByte)
|
|
267
|
+
covered.add(line);
|
|
268
|
+
else
|
|
269
|
+
uncovered.add(line);
|
|
270
|
+
}
|
|
271
|
+
return { covered, uncovered };
|
|
272
|
+
}
|
|
273
|
+
// ─── Istanbul file processing ──────────────────────────────────────────────────
|
|
274
|
+
function processIstanbulFile(relPath, fileCov, symbols, fileContent, includeUncoveredLines) {
|
|
275
|
+
// Statement coverage
|
|
276
|
+
const totalStatements = Object.keys(fileCov.statementMap).length;
|
|
277
|
+
const coveredStatements = Object.values(fileCov.s).filter((c) => c > 0).length;
|
|
278
|
+
const statementCoverage = totalStatements > 0
|
|
279
|
+
? Math.round((coveredStatements / totalStatements) * 10000) / 100
|
|
280
|
+
: null;
|
|
281
|
+
// Function coverage
|
|
282
|
+
const totalFunctions = Object.keys(fileCov.fnMap).length;
|
|
283
|
+
const coveredFunctions = Object.values(fileCov.f).filter((c) => c > 0).length;
|
|
284
|
+
const functionCoverage = totalFunctions > 0
|
|
285
|
+
? Math.round((coveredFunctions / totalFunctions) * 10000) / 100
|
|
286
|
+
: 100;
|
|
287
|
+
// Branch coverage
|
|
288
|
+
const totalBranchSides = Object.values(fileCov.b).reduce((sum, arr) => sum + arr.length, 0);
|
|
289
|
+
const coveredBranchSides = Object.values(fileCov.b).reduce((sum, arr) => sum + arr.filter((c) => c > 0).length, 0);
|
|
290
|
+
const branchCoverage = totalBranchSides > 0
|
|
291
|
+
? Math.round((coveredBranchSides / totalBranchSides) * 10000) / 100
|
|
292
|
+
: null;
|
|
293
|
+
// Line coverage (from statements)
|
|
294
|
+
const { covered: coveredLines, uncovered: uncoveredLines } = computeIstanbulLines(fileCov.statementMap, fileCov.s);
|
|
295
|
+
const totalLines = coveredLines.size + uncoveredLines.size;
|
|
296
|
+
const lineCoverage = totalLines > 0
|
|
297
|
+
? Math.round((coveredLines.size / totalLines) * 10000) / 100
|
|
298
|
+
: 100;
|
|
299
|
+
// Symbol coverage
|
|
300
|
+
const symbolEntries = [];
|
|
301
|
+
for (const sym of symbols) {
|
|
302
|
+
const startLine = fileContent ? lineOf(fileContent, sym.start_byte) : 1;
|
|
303
|
+
const endByteClamped = Math.min(sym.end_byte, fileContent ? fileContent.length : sym.end_byte);
|
|
304
|
+
const endLine = fileContent ? lineOf(fileContent, endByteClamped) : startLine + (sym.line_count ?? 1) - 1;
|
|
305
|
+
const callCount = istanbulFnCallCount(sym.name, startLine, endLine, fileCov.fnMap, fileCov.f);
|
|
306
|
+
symbolEntries.push({
|
|
307
|
+
symbolId: sym.id,
|
|
308
|
+
name: sym.name,
|
|
309
|
+
kind: sym.kind,
|
|
310
|
+
startLine,
|
|
311
|
+
covered: callCount !== null ? callCount > 0 : false,
|
|
312
|
+
callCount: callCount ?? 0,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
const entry = {
|
|
316
|
+
filePath: relPath,
|
|
317
|
+
lineCoverage,
|
|
318
|
+
statementCoverage,
|
|
319
|
+
functionCoverage,
|
|
320
|
+
branchCoverage,
|
|
321
|
+
totalStatements,
|
|
322
|
+
coveredStatements,
|
|
323
|
+
totalFunctions,
|
|
324
|
+
coveredFunctions,
|
|
325
|
+
totalBranches: Object.keys(fileCov.branchMap).length,
|
|
326
|
+
coveredBranchSides,
|
|
327
|
+
symbols: symbolEntries,
|
|
328
|
+
};
|
|
329
|
+
if (includeUncoveredLines) {
|
|
330
|
+
entry.uncoveredLines = [...uncoveredLines].sort((a, b) => a - b);
|
|
331
|
+
}
|
|
332
|
+
return entry;
|
|
333
|
+
}
|
|
334
|
+
// ─── V8 file processing ────────────────────────────────────────────────────────
|
|
335
|
+
function processV8File(relPath, script, symbols, fileContent, includeUncoveredLines) {
|
|
336
|
+
const { totalFunctions, coveredFunctions } = computeV8FunctionCoverage(script.functions);
|
|
337
|
+
const functionCoverage = totalFunctions > 0
|
|
338
|
+
? Math.round((coveredFunctions / totalFunctions) * 10000) / 100
|
|
339
|
+
: 100;
|
|
340
|
+
// Line coverage from V8 byte ranges (requires file content)
|
|
341
|
+
let lineCoverage = 100;
|
|
342
|
+
let coveredLineCount = 0;
|
|
343
|
+
let uncoveredLineArr = [];
|
|
344
|
+
const coveredLinesSet = new Set();
|
|
345
|
+
const uncoveredLinesSet = new Set();
|
|
346
|
+
if (fileContent && fileContent.length > 0) {
|
|
347
|
+
const { covered, uncovered } = computeV8Lines(fileContent, script.functions);
|
|
348
|
+
coveredLinesSet.entries();
|
|
349
|
+
const totalLinesWithCode = covered.size + uncovered.size;
|
|
350
|
+
lineCoverage =
|
|
351
|
+
totalLinesWithCode > 0
|
|
352
|
+
? Math.round((covered.size / totalLinesWithCode) * 10000) / 100
|
|
353
|
+
: 100;
|
|
354
|
+
coveredLineCount = covered.size;
|
|
355
|
+
for (const l of covered)
|
|
356
|
+
coveredLinesSet.add(l);
|
|
357
|
+
for (const l of uncovered)
|
|
358
|
+
uncoveredLinesSet.add(l);
|
|
359
|
+
if (includeUncoveredLines) {
|
|
360
|
+
uncoveredLineArr = [...uncovered].sort((a, b) => a - b);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Symbol coverage
|
|
364
|
+
const symbolEntries = [];
|
|
365
|
+
for (const sym of symbols) {
|
|
366
|
+
const startLine = fileContent ? lineOf(fileContent, sym.start_byte) : 1;
|
|
367
|
+
const callCount = v8FnCallCount(sym.name, script.functions);
|
|
368
|
+
symbolEntries.push({
|
|
369
|
+
symbolId: sym.id,
|
|
370
|
+
name: sym.name,
|
|
371
|
+
kind: sym.kind,
|
|
372
|
+
startLine,
|
|
373
|
+
covered: callCount !== null ? callCount > 0 : false,
|
|
374
|
+
callCount: callCount ?? 0,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
const entry = {
|
|
378
|
+
filePath: relPath,
|
|
379
|
+
lineCoverage,
|
|
380
|
+
statementCoverage: null, // V8 doesn't have statement-level data
|
|
381
|
+
functionCoverage,
|
|
382
|
+
branchCoverage: null, // V8 basic format doesn't expose branch data
|
|
383
|
+
totalStatements: 0,
|
|
384
|
+
coveredStatements: 0,
|
|
385
|
+
totalFunctions,
|
|
386
|
+
coveredFunctions,
|
|
387
|
+
totalBranches: 0,
|
|
388
|
+
coveredBranchSides: 0,
|
|
389
|
+
symbols: symbolEntries,
|
|
390
|
+
};
|
|
391
|
+
if (includeUncoveredLines) {
|
|
392
|
+
entry.uncoveredLines = uncoveredLineArr;
|
|
393
|
+
}
|
|
394
|
+
void coveredLineCount; // used above
|
|
395
|
+
return entry;
|
|
396
|
+
}
|
|
397
|
+
// ─── Handler ───────────────────────────────────────────────────────────────────
|
|
398
|
+
export async function handler(args) {
|
|
399
|
+
const t0 = Date.now();
|
|
400
|
+
const { repoId, coveragePath, includeUncoveredLines = false, limit = 20, format = 'auto', } = args;
|
|
401
|
+
const db = openDatabase(repoId);
|
|
402
|
+
try {
|
|
403
|
+
// ── Validate repo ─────────────────────────────────────────────────────────
|
|
404
|
+
const repo = getRepo(db, repoId);
|
|
405
|
+
if (!repo) {
|
|
406
|
+
return {
|
|
407
|
+
content: [{
|
|
408
|
+
type: 'text',
|
|
409
|
+
text: JSON.stringify({ error: `Repo "${repoId}" not found. Run index_folder first.` }),
|
|
410
|
+
}],
|
|
411
|
+
isError: true,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
// ── Read coverage file ────────────────────────────────────────────────────
|
|
415
|
+
let rawJson;
|
|
416
|
+
try {
|
|
417
|
+
rawJson = readFileSync(coveragePath, 'utf8');
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
return {
|
|
421
|
+
content: [{
|
|
422
|
+
type: 'text',
|
|
423
|
+
text: JSON.stringify({
|
|
424
|
+
error: `Cannot read coverage file: "${coveragePath}". Check the path and permissions.`,
|
|
425
|
+
}),
|
|
426
|
+
}],
|
|
427
|
+
isError: true,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
let parsed;
|
|
431
|
+
try {
|
|
432
|
+
parsed = JSON.parse(rawJson);
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
return {
|
|
436
|
+
content: [{
|
|
437
|
+
type: 'text',
|
|
438
|
+
text: JSON.stringify({
|
|
439
|
+
error: `Coverage file is not valid JSON: "${coveragePath}".`,
|
|
440
|
+
}),
|
|
441
|
+
}],
|
|
442
|
+
isError: true,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
// ── Detect format ─────────────────────────────────────────────────────────
|
|
446
|
+
const detectedFormat = format !== 'auto' ? format : detectFormat(parsed);
|
|
447
|
+
if (!detectedFormat) {
|
|
448
|
+
return {
|
|
449
|
+
content: [{
|
|
450
|
+
type: 'text',
|
|
451
|
+
text: JSON.stringify({
|
|
452
|
+
error: `Unrecognised coverage format in "${coveragePath}". ` +
|
|
453
|
+
'Expected Istanbul (object with file paths as keys) or V8 (array of script objects).',
|
|
454
|
+
}),
|
|
455
|
+
}],
|
|
456
|
+
isError: true,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
const repoRoot = repo.rootPath;
|
|
460
|
+
// ── Build coverage entry map: relPath → FileCoverageEntry ─────────────────
|
|
461
|
+
const fileEntries = [];
|
|
462
|
+
if (detectedFormat === 'istanbul') {
|
|
463
|
+
const istanbul = parsed;
|
|
464
|
+
for (const [absPath, fileCov] of Object.entries(istanbul)) {
|
|
465
|
+
const relPath = toRelativePath(absPath, repoRoot);
|
|
466
|
+
if (!relPath)
|
|
467
|
+
continue;
|
|
468
|
+
// Scope / filePath filters
|
|
469
|
+
if (args.scope) {
|
|
470
|
+
const prefix = args.scope.endsWith('/') ? args.scope : `${args.scope}/`;
|
|
471
|
+
if (relPath !== args.scope && !relPath.startsWith(prefix))
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
if (args.filePath && relPath !== args.filePath)
|
|
475
|
+
continue;
|
|
476
|
+
// Load symbols for this file from DB
|
|
477
|
+
const symbols = db
|
|
478
|
+
.prepare(`SELECT id, name, kind, file_path, start_byte, end_byte,
|
|
479
|
+
signature, summary, COALESCE(line_count, 1) AS line_count
|
|
480
|
+
FROM symbols
|
|
481
|
+
WHERE repo_id = ? AND file_path = ?`)
|
|
482
|
+
.all(repoId, relPath);
|
|
483
|
+
// Load file content for line number computation
|
|
484
|
+
const row = db
|
|
485
|
+
.prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ?')
|
|
486
|
+
.get(repoId, relPath);
|
|
487
|
+
const fileContent = row?.raw_content ?? null;
|
|
488
|
+
const entry = processIstanbulFile(relPath, fileCov, symbols, fileContent, includeUncoveredLines);
|
|
489
|
+
fileEntries.push(entry);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
// V8
|
|
494
|
+
const v8 = parsed;
|
|
495
|
+
for (const script of v8) {
|
|
496
|
+
const absPath = fileUrlToPath(script.url);
|
|
497
|
+
const relPath = toRelativePath(absPath, repoRoot);
|
|
498
|
+
if (!relPath)
|
|
499
|
+
continue;
|
|
500
|
+
// Scope / filePath filters
|
|
501
|
+
if (args.scope) {
|
|
502
|
+
const prefix = args.scope.endsWith('/') ? args.scope : `${args.scope}/`;
|
|
503
|
+
if (relPath !== args.scope && !relPath.startsWith(prefix))
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
if (args.filePath && relPath !== args.filePath)
|
|
507
|
+
continue;
|
|
508
|
+
const symbols = db
|
|
509
|
+
.prepare(`SELECT id, name, kind, file_path, start_byte, end_byte,
|
|
510
|
+
signature, summary, COALESCE(line_count, 1) AS line_count
|
|
511
|
+
FROM symbols
|
|
512
|
+
WHERE repo_id = ? AND file_path = ?`)
|
|
513
|
+
.all(repoId, relPath);
|
|
514
|
+
const row = db
|
|
515
|
+
.prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ?')
|
|
516
|
+
.get(repoId, relPath);
|
|
517
|
+
const fileContent = row?.raw_content ?? null;
|
|
518
|
+
const entry = processV8File(relPath, script, symbols, fileContent, includeUncoveredLines);
|
|
519
|
+
fileEntries.push(entry);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
// ── minCoverage filter ────────────────────────────────────────────────────
|
|
523
|
+
const filteredEntries = args.minCoverage !== undefined
|
|
524
|
+
? fileEntries.filter((e) => e.lineCoverage < args.minCoverage)
|
|
525
|
+
: fileEntries;
|
|
526
|
+
// ── Sort by lineCoverage ascending (worst coverage first) ─────────────────
|
|
527
|
+
filteredEntries.sort((a, b) => a.lineCoverage - b.lineCoverage);
|
|
528
|
+
// ── Truncation ────────────────────────────────────────────────────────────
|
|
529
|
+
const truncated = filteredEntries.length > limit;
|
|
530
|
+
const visible = filteredEntries.slice(0, limit);
|
|
531
|
+
// ── Summary ───────────────────────────────────────────────────────────────
|
|
532
|
+
const allEntries = filteredEntries; // before truncation
|
|
533
|
+
const avgLineCoverage = allEntries.length > 0
|
|
534
|
+
? Math.round((allEntries.reduce((s, e) => s + e.lineCoverage, 0) / allEntries.length) * 100) / 100
|
|
535
|
+
: 0;
|
|
536
|
+
const avgFunctionCoverage = allEntries.length > 0
|
|
537
|
+
? Math.round((allEntries.reduce((s, e) => s + e.functionCoverage, 0) / allEntries.length) * 100) / 100
|
|
538
|
+
: 0;
|
|
539
|
+
const stmtFiles = allEntries.filter((e) => e.statementCoverage !== null);
|
|
540
|
+
const avgStatementCoverage = stmtFiles.length > 0
|
|
541
|
+
? Math.round((stmtFiles.reduce((s, e) => s + (e.statementCoverage ?? 0), 0) / stmtFiles.length) *
|
|
542
|
+
100) / 100
|
|
543
|
+
: null;
|
|
544
|
+
const branchFiles = allEntries.filter((e) => e.branchCoverage !== null);
|
|
545
|
+
const avgBranchCoverage = branchFiles.length > 0
|
|
546
|
+
? Math.round((branchFiles.reduce((s, e) => s + (e.branchCoverage ?? 0), 0) / branchFiles.length) *
|
|
547
|
+
100) / 100
|
|
548
|
+
: null;
|
|
549
|
+
// Aggregate symbol counts across all entries (not just visible)
|
|
550
|
+
const allSymbols = allEntries.flatMap((e) => e.symbols);
|
|
551
|
+
const totalSymbols = allSymbols.length;
|
|
552
|
+
const coveredSymbols = allSymbols.filter((s) => s.covered).length;
|
|
553
|
+
// ── Token estimate ─────────────────────────────────────────────────────────
|
|
554
|
+
const tokenEstimate = Math.ceil(visible.reduce((sum, e) => sum +
|
|
555
|
+
e.filePath.length +
|
|
556
|
+
e.symbols.reduce((s2, sym) => s2 + sym.name.length + 30, 0) +
|
|
557
|
+
(e.uncoveredLines ? e.uncoveredLines.length * 5 : 0) +
|
|
558
|
+
120, 0) / 4);
|
|
559
|
+
return {
|
|
560
|
+
content: [{
|
|
561
|
+
type: 'text',
|
|
562
|
+
text: JSON.stringify({
|
|
563
|
+
repoId,
|
|
564
|
+
coveragePath,
|
|
565
|
+
format: detectedFormat,
|
|
566
|
+
summary: {
|
|
567
|
+
totalFiles: allEntries.length,
|
|
568
|
+
avgLineCoverage,
|
|
569
|
+
avgStatementCoverage,
|
|
570
|
+
avgFunctionCoverage,
|
|
571
|
+
avgBranchCoverage,
|
|
572
|
+
totalSymbols,
|
|
573
|
+
coveredSymbols,
|
|
574
|
+
uncoveredSymbols: totalSymbols - coveredSymbols,
|
|
575
|
+
},
|
|
576
|
+
files: visible,
|
|
577
|
+
truncated,
|
|
578
|
+
_tokenEstimate: tokenEstimate,
|
|
579
|
+
_meta: buildMeta({ timingMs: Date.now() - t0 }),
|
|
580
|
+
}, null, 2),
|
|
581
|
+
}],
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
finally {
|
|
585
|
+
db.close();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=get-test-coverage-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-test-coverage-map.js","sourceRoot":"","sources":["../../../src/server/tools/get-test-coverage-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get-todos.ts
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: get_todos
|
|
5
|
+
*
|
|
6
|
+
* Scans indexed file content for TODO/FIXME/HACK/NOTE/OPTIMIZE/BUG/XXX
|
|
7
|
+
* comment tags. Returns each occurrence with its file path, line number,
|
|
8
|
+
* tag type, optional assignee (e.g. TODO(alice):), and the comment text.
|
|
9
|
+
*
|
|
10
|
+
* Designed for:
|
|
11
|
+
* - Tracking outstanding work items embedded in source code
|
|
12
|
+
* - Generating a tech-debt inventory from comment annotations
|
|
13
|
+
* - Finding all FIXMEs before a release cutoff
|
|
14
|
+
* - Auditing comment hygiene across a codebase
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
18
|
+
export declare const name = "get_todos";
|
|
19
|
+
export declare const description: string;
|
|
20
|
+
export declare const inputSchema: {
|
|
21
|
+
repoId: z.ZodString;
|
|
22
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
23
|
+
TODO: "TODO";
|
|
24
|
+
FIXME: "FIXME";
|
|
25
|
+
HACK: "HACK";
|
|
26
|
+
NOTE: "NOTE";
|
|
27
|
+
OPTIMIZE: "OPTIMIZE";
|
|
28
|
+
BUG: "BUG";
|
|
29
|
+
XXX: "XXX";
|
|
30
|
+
}>>>;
|
|
31
|
+
filePath: z.ZodOptional<z.ZodString>;
|
|
32
|
+
assignee: z.ZodOptional<z.ZodString>;
|
|
33
|
+
groupByFile: z.ZodOptional<z.ZodBoolean>;
|
|
34
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
35
|
+
};
|
|
36
|
+
export interface TodoItem {
|
|
37
|
+
filePath: string;
|
|
38
|
+
line: number;
|
|
39
|
+
tag: string;
|
|
40
|
+
assignee: string | null;
|
|
41
|
+
text: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function handler(args: {
|
|
44
|
+
repoId: string;
|
|
45
|
+
tags?: string[];
|
|
46
|
+
filePath?: string;
|
|
47
|
+
assignee?: string;
|
|
48
|
+
groupByFile?: boolean;
|
|
49
|
+
limit?: number;
|
|
50
|
+
}): Promise<CallToolResult>;
|
|
51
|
+
//# sourceMappingURL=get-todos.d.ts.map
|