lsp-intelligence 0.1.2 → 0.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/README.md +12 -7
- package/dist/analysis/pattern/collectSearchFiles.d.ts +5 -0
- package/dist/analysis/pattern/collectSearchFiles.js +38 -0
- package/dist/analysis/pattern/collectSearchFiles.js.map +1 -0
- package/dist/analysis/pattern/runPatternSearch.d.ts +17 -0
- package/dist/analysis/pattern/runPatternSearch.js +63 -0
- package/dist/analysis/pattern/runPatternSearch.js.map +1 -0
- package/dist/analysis/ts/extractDeclarations.d.ts +7 -0
- package/dist/analysis/ts/extractDeclarations.js +93 -0
- package/dist/analysis/ts/extractDeclarations.js.map +1 -0
- package/dist/analysis/ts/extractUsages.d.ts +7 -0
- package/dist/analysis/ts/extractUsages.js +120 -0
- package/dist/analysis/ts/extractUsages.js.map +1 -0
- package/dist/analysis/ts/parseSourceFile.d.ts +10 -0
- package/dist/analysis/ts/parseSourceFile.js +28 -0
- package/dist/analysis/ts/parseSourceFile.js.map +1 -0
- package/dist/analysis/ts/snippets.d.ts +14 -0
- package/dist/analysis/ts/snippets.js +29 -0
- package/dist/analysis/ts/snippets.js.map +1 -0
- package/dist/analysis/ts/structuralPredicates.d.ts +10 -0
- package/dist/analysis/ts/structuralPredicates.js +170 -0
- package/dist/analysis/ts/structuralPredicates.js.map +1 -0
- package/dist/ast/diffDeclarationShapes.d.ts +16 -0
- package/dist/ast/diffDeclarationShapes.js +179 -0
- package/dist/ast/diffDeclarationShapes.js.map +1 -0
- package/dist/ast/extractExportDeclarations.d.ts +21 -0
- package/dist/ast/extractExportDeclarations.js +218 -0
- package/dist/ast/extractExportDeclarations.js.map +1 -0
- package/dist/ast/findNodeAtPosition.d.ts +12 -0
- package/dist/ast/findNodeAtPosition.js +75 -0
- package/dist/ast/findNodeAtPosition.js.map +1 -0
- package/dist/ast/parseFile.d.ts +10 -0
- package/dist/ast/parseFile.js +29 -0
- package/dist/ast/parseFile.js.map +1 -0
- package/dist/engine/waitForDiagnostics.d.ts +7 -0
- package/dist/engine/waitForDiagnostics.js +16 -0
- package/dist/engine/waitForDiagnostics.js.map +1 -0
- package/dist/git/getBaseFileContent.d.ts +5 -0
- package/dist/git/getBaseFileContent.js +16 -0
- package/dist/git/getBaseFileContent.js.map +1 -0
- package/dist/git/getChangedFiles.d.ts +4 -0
- package/dist/git/getChangedFiles.js +21 -0
- package/dist/git/getChangedFiles.js.map +1 -0
- package/dist/git/getChangedHunks.d.ts +13 -0
- package/dist/git/getChangedHunks.js +51 -0
- package/dist/git/getChangedHunks.js.map +1 -0
- package/dist/git/getMergeBase.d.ts +5 -0
- package/dist/git/getMergeBase.js +23 -0
- package/dist/git/getMergeBase.js.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve/searchScope.d.ts +11 -0
- package/dist/resolve/searchScope.js +52 -0
- package/dist/resolve/searchScope.js.map +1 -0
- package/dist/resolve/targetResolver.d.ts +33 -0
- package/dist/resolve/targetResolver.js +84 -0
- package/dist/resolve/targetResolver.js.map +1 -0
- package/dist/search/families/behaviorFamilies.d.ts +22 -0
- package/dist/search/families/behaviorFamilies.js +90 -0
- package/dist/search/families/behaviorFamilies.js.map +1 -0
- package/dist/search/index/declarationIndex.d.ts +6 -0
- package/dist/search/index/declarationIndex.js +13 -0
- package/dist/search/index/declarationIndex.js.map +1 -0
- package/dist/search/index/types.d.ts +1 -0
- package/dist/search/index/types.js +2 -0
- package/dist/search/index/types.js.map +1 -0
- package/dist/search/index/usageIndex.d.ts +6 -0
- package/dist/search/index/usageIndex.js +13 -0
- package/dist/search/index/usageIndex.js.map +1 -0
- package/dist/search/index/workspaceIndex.d.ts +8 -0
- package/dist/search/index/workspaceIndex.js +91 -0
- package/dist/search/index/workspaceIndex.js.map +1 -0
- package/dist/search/query/parseQuery.d.ts +9 -0
- package/dist/search/query/parseQuery.js +244 -0
- package/dist/search/query/parseQuery.js.map +1 -0
- package/dist/search/query/planQuery.d.ts +9 -0
- package/dist/search/query/planQuery.js +58 -0
- package/dist/search/query/planQuery.js.map +1 -0
- package/dist/search/ranking/assessConfidence.d.ts +6 -0
- package/dist/search/ranking/assessConfidence.js +25 -0
- package/dist/search/ranking/assessConfidence.js.map +1 -0
- package/dist/search/ranking/mergeCandidates.d.ts +10 -0
- package/dist/search/ranking/mergeCandidates.js +46 -0
- package/dist/search/ranking/mergeCandidates.js.map +1 -0
- package/dist/search/ranking/rankCandidates.d.ts +12 -0
- package/dist/search/ranking/rankCandidates.js +58 -0
- package/dist/search/ranking/rankCandidates.js.map +1 -0
- package/dist/search/retrievers/behaviorRetriever.d.ts +7 -0
- package/dist/search/retrievers/behaviorRetriever.js +91 -0
- package/dist/search/retrievers/behaviorRetriever.js.map +1 -0
- package/dist/search/retrievers/identifierRetriever.d.ts +7 -0
- package/dist/search/retrievers/identifierRetriever.js +66 -0
- package/dist/search/retrievers/identifierRetriever.js.map +1 -0
- package/dist/search/retrievers/structuralRetriever.d.ts +11 -0
- package/dist/search/retrievers/structuralRetriever.js +141 -0
- package/dist/search/retrievers/structuralRetriever.js.map +1 -0
- package/dist/search/types.d.ts +121 -0
- package/dist/search/types.js +11 -0
- package/dist/search/types.js.map +1 -0
- package/dist/tools/composites/apiGuard.d.ts +1 -0
- package/dist/tools/composites/apiGuard.js +194 -0
- package/dist/tools/composites/apiGuard.js.map +1 -0
- package/dist/tools/composites/explainError.js +3 -2
- package/dist/tools/composites/explainError.js.map +1 -1
- package/dist/tools/composites/findCode.d.ts +1 -0
- package/dist/tools/composites/findCode.js +68 -0
- package/dist/tools/composites/findCode.js.map +1 -0
- package/dist/tools/composites/findPattern.d.ts +5 -0
- package/dist/tools/composites/findPattern.js +41 -0
- package/dist/tools/composites/findPattern.js.map +1 -0
- package/dist/tools/composites/rootCauseTrace.d.ts +1 -0
- package/dist/tools/composites/rootCauseTrace.js +213 -0
- package/dist/tools/composites/rootCauseTrace.js.map +1 -0
- package/dist/tools/composites/semanticDiff.js +24 -77
- package/dist/tools/composites/semanticDiff.js.map +1 -1
- package/dist/tools/live/liveDiagnostics.js +3 -2
- package/dist/tools/live/liveDiagnostics.js.map +1 -1
- package/dist/tools/primitives/diagnostics.js +2 -2
- package/dist/tools/primitives/diagnostics.js.map +1 -1
- package/dist/tools/registry.d.ts +10 -2
- package/dist/tools/registry.js +7 -2
- package/dist/tools/registry.js.map +1 -1
- package/package.json +8 -4
- package/dist/tools/primitives/typeHierarchy.d.ts +0 -1
- package/dist/tools/primitives/typeHierarchy.js +0 -55
- package/dist/tools/primitives/typeHierarchy.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the smallest AST node covering a given line (0-indexed).
|
|
3
|
+
*/
|
|
4
|
+
export function findNodeAtLine(root, line0) {
|
|
5
|
+
let best = null;
|
|
6
|
+
let bestSize = Infinity;
|
|
7
|
+
const walk = (node) => {
|
|
8
|
+
const range = node.range();
|
|
9
|
+
if (range.start.line <= line0 && range.end.line >= line0) {
|
|
10
|
+
const size = range.end.line - range.start.line;
|
|
11
|
+
if (size < bestSize) {
|
|
12
|
+
best = node;
|
|
13
|
+
bestSize = size;
|
|
14
|
+
}
|
|
15
|
+
for (const child of node.children()) {
|
|
16
|
+
walk(child);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
walk(root);
|
|
21
|
+
if (!best)
|
|
22
|
+
return null;
|
|
23
|
+
return { node: best, kind: classifyNodeKind(best) };
|
|
24
|
+
}
|
|
25
|
+
function classifyNodeKind(node) {
|
|
26
|
+
const kind = String(node.kind());
|
|
27
|
+
if (kind.includes('call'))
|
|
28
|
+
return 'call_expression';
|
|
29
|
+
if (kind.includes('member') || kind.includes('property_access'))
|
|
30
|
+
return 'property_access';
|
|
31
|
+
if (kind.includes('variable') || kind.includes('lexical'))
|
|
32
|
+
return 'variable_declaration';
|
|
33
|
+
if (kind.includes('return'))
|
|
34
|
+
return 'return_statement';
|
|
35
|
+
if (kind.includes('switch'))
|
|
36
|
+
return 'switch_case';
|
|
37
|
+
if (kind.includes('object'))
|
|
38
|
+
return 'object_literal';
|
|
39
|
+
if (kind.includes('function') || kind.includes('arrow'))
|
|
40
|
+
return 'function';
|
|
41
|
+
if (kind.includes('class'))
|
|
42
|
+
return 'class';
|
|
43
|
+
if (kind.includes('if'))
|
|
44
|
+
return 'conditional';
|
|
45
|
+
if (kind.includes('import'))
|
|
46
|
+
return 'import';
|
|
47
|
+
if (kind.includes('export'))
|
|
48
|
+
return 'export';
|
|
49
|
+
return kind;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Classify the error site based on the enclosing AST node.
|
|
53
|
+
*/
|
|
54
|
+
export function classifyErrorSite(root, line0) {
|
|
55
|
+
const result = findNodeAtLine(root, line0);
|
|
56
|
+
if (!result)
|
|
57
|
+
return null;
|
|
58
|
+
const { kind } = result;
|
|
59
|
+
if (kind === 'call_expression')
|
|
60
|
+
return 'bad_call_argument';
|
|
61
|
+
if (kind === 'property_access')
|
|
62
|
+
return 'missing_property_access';
|
|
63
|
+
if (kind === 'switch_case')
|
|
64
|
+
return 'unhandled_enum_member';
|
|
65
|
+
if (kind === 'import')
|
|
66
|
+
return 'bad_import_usage';
|
|
67
|
+
if (kind === 'return_statement')
|
|
68
|
+
return 'wrong_return_type';
|
|
69
|
+
if (kind === 'variable_declaration')
|
|
70
|
+
return 'incompatible_assignment';
|
|
71
|
+
if (kind === 'object_literal')
|
|
72
|
+
return 'missing_object_property';
|
|
73
|
+
return kind;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=findNodeAtPosition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findNodeAtPosition.js","sourceRoot":"","sources":["../../src/ast/findNodeAtPosition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SgNode } from '@ast-grep/napi';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a TypeScript/TSX file into an ast-grep root node.
|
|
4
|
+
* Returns null if parsing fails.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseFile(filePath: string): SgNode | null;
|
|
7
|
+
/**
|
|
8
|
+
* Parse source content directly.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseSource(content: string, isTsx?: boolean): SgNode | null;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { parse, Lang } from '@ast-grep/napi';
|
|
3
|
+
/**
|
|
4
|
+
* Parse a TypeScript/TSX file into an ast-grep root node.
|
|
5
|
+
* Returns null if parsing fails.
|
|
6
|
+
*/
|
|
7
|
+
export function parseFile(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
10
|
+
const lang = filePath.endsWith('.tsx') ? Lang.Tsx : Lang.TypeScript;
|
|
11
|
+
return parse(lang, content).root();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse source content directly.
|
|
19
|
+
*/
|
|
20
|
+
export function parseSource(content, isTsx = false) {
|
|
21
|
+
try {
|
|
22
|
+
const lang = isTsx ? Lang.Tsx : Lang.TypeScript;
|
|
23
|
+
return parse(lang, content).root();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=parseFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFile.js","sourceRoot":"","sources":["../../src/ast/parseFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAe,MAAM,gBAAgB,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACpE,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,KAAK,GAAG,KAAK;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAChD,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DocumentManager } from './DocumentManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wait for diagnostics to be pushed for a URI.
|
|
4
|
+
* Polls every 100ms, returns as soon as diagnostics arrive or timeout hit.
|
|
5
|
+
* Much faster than a fixed sleep when diagnostics arrive quickly.
|
|
6
|
+
*/
|
|
7
|
+
export declare function waitForDiagnostics(docManager: DocumentManager, uri: string, timeoutMs?: number): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait for diagnostics to be pushed for a URI.
|
|
3
|
+
* Polls every 100ms, returns as soon as diagnostics arrive or timeout hit.
|
|
4
|
+
* Much faster than a fixed sleep when diagnostics arrive quickly.
|
|
5
|
+
*/
|
|
6
|
+
export async function waitForDiagnostics(docManager, uri, timeoutMs = 1000) {
|
|
7
|
+
const start = Date.now();
|
|
8
|
+
while (Date.now() - start < timeoutMs) {
|
|
9
|
+
const diags = docManager.getCachedDiagnostics(uri);
|
|
10
|
+
if (diags.length > 0)
|
|
11
|
+
return;
|
|
12
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
13
|
+
}
|
|
14
|
+
// Timeout — diagnostics may still arrive later, but we don't block further
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=waitForDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waitForDiagnostics.js","sourceRoot":"","sources":["../../src/engine/waitForDiagnostics.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAA2B,EAC3B,GAAW,EACX,YAAoB,IAAI;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,2EAA2E;AAC7E,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { relativePath } from '../engine/positions.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get file content at a specific git ref.
|
|
5
|
+
* Returns null if file didn't exist at that ref.
|
|
6
|
+
*/
|
|
7
|
+
export function getBaseFileContent(filePath, base, workspaceRoot) {
|
|
8
|
+
try {
|
|
9
|
+
const relPath = relativePath(filePath, workspaceRoot);
|
|
10
|
+
return execSync(`git show ${base}:${relPath}`, { cwd: workspaceRoot, encoding: 'utf-8' });
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=getBaseFileContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBaseFileContent.js","sourceRoot":"","sources":["../../src/git/getBaseFileContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,IAAY,EACZ,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC,YAAY,IAAI,IAAI,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
/**
|
|
5
|
+
* Get list of changed TypeScript files between base and HEAD.
|
|
6
|
+
*/
|
|
7
|
+
export function getChangedFiles(workspaceRoot, base, filter = (f) => /\.tsx?$/.test(f) && !f.endsWith('.d.ts')) {
|
|
8
|
+
try {
|
|
9
|
+
const diff = execSync(`git diff ${base} --name-only`, { cwd: workspaceRoot, encoding: 'utf-8' });
|
|
10
|
+
return diff
|
|
11
|
+
.trim()
|
|
12
|
+
.split('\n')
|
|
13
|
+
.filter((f) => f && filter(f))
|
|
14
|
+
.map((f) => path.join(workspaceRoot, f))
|
|
15
|
+
.filter((f) => fs.existsSync(f));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=getChangedFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getChangedFiles.js","sourceRoot":"","sources":["../../src/git/getChangedFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,aAAqB,EACrB,IAAY,EACZ,SAAiC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IAEjF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,IAAI,cAAc,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,OAAO,IAAI;aACR,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ChangedHunk {
|
|
2
|
+
file: string;
|
|
3
|
+
startLine: number;
|
|
4
|
+
endLine: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parse git diff to extract changed line ranges per file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getChangedHunks(workspaceRoot: string, base: string): ChangedHunk[];
|
|
10
|
+
/**
|
|
11
|
+
* Check if a specific file changed between base and HEAD.
|
|
12
|
+
*/
|
|
13
|
+
export declare function fileChangedInBranch(filePath: string, base: string, workspaceRoot: string): boolean;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Parse git diff to extract changed line ranges per file.
|
|
5
|
+
*/
|
|
6
|
+
export function getChangedHunks(workspaceRoot, base) {
|
|
7
|
+
try {
|
|
8
|
+
const diff = execSync(`git diff ${base} --unified=0`, { cwd: workspaceRoot, encoding: 'utf-8' });
|
|
9
|
+
return parseHunks(diff, workspaceRoot);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function parseHunks(diff, workspaceRoot) {
|
|
16
|
+
const hunks = [];
|
|
17
|
+
let currentFile = '';
|
|
18
|
+
for (const line of diff.split('\n')) {
|
|
19
|
+
const fileMatch = line.match(/^\+\+\+ b\/(.+)/);
|
|
20
|
+
if (fileMatch) {
|
|
21
|
+
currentFile = path.join(workspaceRoot, fileMatch[1]);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const hunkMatch = line.match(/^@@ .+ \+(\d+)(?:,(\d+))? @@/);
|
|
25
|
+
if (hunkMatch && currentFile.match(/\.tsx?$/)) {
|
|
26
|
+
const start = parseInt(hunkMatch[1]);
|
|
27
|
+
const count = parseInt(hunkMatch[2] ?? '1');
|
|
28
|
+
hunks.push({ file: currentFile, startLine: start, endLine: start + count - 1 });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return hunks;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if a specific file changed between base and HEAD.
|
|
35
|
+
*/
|
|
36
|
+
export function fileChangedInBranch(filePath, base, workspaceRoot) {
|
|
37
|
+
try {
|
|
38
|
+
const relPath = filePath.startsWith(workspaceRoot)
|
|
39
|
+
? filePath.slice(workspaceRoot.length + 1)
|
|
40
|
+
: filePath;
|
|
41
|
+
const diff = execSync(`git diff ${base} --name-only -- "${relPath}"`, {
|
|
42
|
+
cwd: workspaceRoot,
|
|
43
|
+
encoding: 'utf-8',
|
|
44
|
+
});
|
|
45
|
+
return diff.trim().length > 0;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=getChangedHunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getChangedHunks.js","sourceRoot":"","sources":["../../src/git/getChangedHunks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,IAAY;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,IAAI,cAAc,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,OAAO,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,aAAqB;IACrD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChD,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7D,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY,EAAE,aAAqB;IACvF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;YAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,IAAI,oBAAoB,OAAO,GAAG,EAAE;YACpE,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Get the merge-base between HEAD and the target branch.
|
|
4
|
+
* Tries main, then master, then falls back to HEAD~1.
|
|
5
|
+
*/
|
|
6
|
+
export function getMergeBase(workspaceRoot, target) {
|
|
7
|
+
if (target) {
|
|
8
|
+
try {
|
|
9
|
+
return execSync(`git merge-base HEAD ${target}`, { cwd: workspaceRoot, encoding: 'utf-8' }).trim();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return target;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
for (const branch of ['main', 'master', 'develop']) {
|
|
16
|
+
try {
|
|
17
|
+
return execSync(`git merge-base HEAD ${branch}`, { cwd: workspaceRoot, encoding: 'utf-8' }).trim();
|
|
18
|
+
}
|
|
19
|
+
catch { }
|
|
20
|
+
}
|
|
21
|
+
return 'HEAD~1';
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=getMergeBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMergeBase.js","sourceRoot":"","sources":["../../src/git/getMergeBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,MAAe;IACjE,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,uBAAuB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrG,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,uBAAuB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrG,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,10 @@ import { impactTrace } from './tools/composites/impactTrace.js';
|
|
|
27
27
|
import { semanticDiff } from './tools/composites/semanticDiff.js';
|
|
28
28
|
import { findTestFiles } from './tools/composites/findTestFiles.js';
|
|
29
29
|
import { explainError } from './tools/composites/explainError.js';
|
|
30
|
+
import { findPattern } from './tools/composites/findPattern.js';
|
|
31
|
+
import { findCode } from './tools/composites/findCode.js';
|
|
32
|
+
import { apiGuard } from './tools/composites/apiGuard.js';
|
|
33
|
+
import { rootCauseTrace } from './tools/composites/rootCauseTrace.js';
|
|
30
34
|
// Context
|
|
31
35
|
import { outline } from './tools/context/outline.js';
|
|
32
36
|
import { gatherContext } from './tools/context/gatherContext.js';
|
|
@@ -61,6 +65,10 @@ async function main() {
|
|
|
61
65
|
semanticDiff,
|
|
62
66
|
findTestFiles,
|
|
63
67
|
explainError,
|
|
68
|
+
findPattern,
|
|
69
|
+
findCode,
|
|
70
|
+
apiGuard,
|
|
71
|
+
rootCauseTrace,
|
|
64
72
|
// Layer 3: Context
|
|
65
73
|
outline,
|
|
66
74
|
gatherContext,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAEhE,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SearchScope } from '../search/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a search scope from user input.
|
|
4
|
+
* This scope is applied to ALL retrieval backends — declarations, usages, structural, pattern.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveSearchScope(workspaceRoot: string, paths?: string[], includeTests?: boolean): SearchScope;
|
|
7
|
+
/**
|
|
8
|
+
* Collect all TypeScript/TSX files within the search scope.
|
|
9
|
+
* Respects includeTests and SKIP_DIRS.
|
|
10
|
+
*/
|
|
11
|
+
export declare function collectScopeFiles(scope: SearchScope, maxFiles?: number): string[];
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { SKIP_DIRS } from '../engine/types.js';
|
|
4
|
+
const TEST_PATTERN = /\.(spec|test|stories)\.(ts|tsx|js|jsx)$/;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a search scope from user input.
|
|
7
|
+
* This scope is applied to ALL retrieval backends — declarations, usages, structural, pattern.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveSearchScope(workspaceRoot, paths, includeTests) {
|
|
10
|
+
const roots = paths && paths.length > 0
|
|
11
|
+
? paths.map((p) => path.isAbsolute(p) ? p : path.join(workspaceRoot, p))
|
|
12
|
+
: [workspaceRoot];
|
|
13
|
+
return {
|
|
14
|
+
roots,
|
|
15
|
+
includeTests: includeTests ?? false,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Collect all TypeScript/TSX files within the search scope.
|
|
20
|
+
* Respects includeTests and SKIP_DIRS.
|
|
21
|
+
*/
|
|
22
|
+
export function collectScopeFiles(scope, maxFiles = 2000) {
|
|
23
|
+
const files = [];
|
|
24
|
+
for (const root of scope.roots) {
|
|
25
|
+
walkDir(root, files, scope.includeTests, maxFiles, 0);
|
|
26
|
+
if (files.length >= maxFiles)
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
return files;
|
|
30
|
+
}
|
|
31
|
+
function walkDir(dir, files, includeTests, maxFiles, depth) {
|
|
32
|
+
if (depth > 8 || files.length >= maxFiles)
|
|
33
|
+
return;
|
|
34
|
+
try {
|
|
35
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
36
|
+
if (SKIP_DIRS.has(entry))
|
|
37
|
+
continue;
|
|
38
|
+
const full = path.join(dir, entry);
|
|
39
|
+
const stat = fs.statSync(full);
|
|
40
|
+
if (stat.isDirectory()) {
|
|
41
|
+
walkDir(full, files, includeTests, maxFiles, depth + 1);
|
|
42
|
+
}
|
|
43
|
+
else if ((entry.endsWith('.ts') || entry.endsWith('.tsx')) && !entry.endsWith('.d.ts')) {
|
|
44
|
+
if (!includeTests && TEST_PATTERN.test(entry))
|
|
45
|
+
continue;
|
|
46
|
+
files.push(full);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=searchScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchScope.js","sourceRoot":"","sources":["../../src/resolve/searchScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,YAAY,GAAG,yCAAyC,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAAqB,EACrB,KAAgB,EAChB,YAAsB;IAEtB,MAAM,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QACrC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAEpB,OAAO;QACL,KAAK;QACL,YAAY,EAAE,YAAY,IAAI,KAAK;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,WAAmB,IAAI;IAC3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;YAAE,MAAM;IACtC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CACd,GAAW,EACX,KAAe,EACf,YAAqB,EACrB,QAAgB,EAChB,KAAa;IAEb,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO;IAClD,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzF,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { LspEngine } from '../engine/LspEngine.js';
|
|
2
|
+
import type { Diagnostic } from 'vscode-languageserver-protocol';
|
|
3
|
+
export interface ToolTargetInput {
|
|
4
|
+
symbol?: string;
|
|
5
|
+
file_path?: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
column?: number;
|
|
8
|
+
diagnostic_code?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ResolvedTarget {
|
|
11
|
+
symbol?: string;
|
|
12
|
+
uri: string;
|
|
13
|
+
filePath: string;
|
|
14
|
+
position: {
|
|
15
|
+
line: number;
|
|
16
|
+
character: number;
|
|
17
|
+
};
|
|
18
|
+
definitionFilePath?: string;
|
|
19
|
+
confidence: 'high' | 'medium' | 'low';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolve a tool input into a canonical target with file + position.
|
|
23
|
+
* Priority: symbol+file_path > symbol > file_path+line > file_path+diagnostic_code > file_path alone
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveTarget(input: ToolTargetInput, engine: LspEngine): Promise<ResolvedTarget>;
|
|
26
|
+
/**
|
|
27
|
+
* Pick the best diagnostic near a position.
|
|
28
|
+
* Priority: exact code match > exact line > nearest ±2 > first error
|
|
29
|
+
*/
|
|
30
|
+
export declare function pickDiagnostic(diagnostics: Diagnostic[], position: {
|
|
31
|
+
line: number;
|
|
32
|
+
character: number;
|
|
33
|
+
}, diagnosticCode?: string): Diagnostic | undefined;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { toPosition, uriToPath } from '../engine/positions.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a tool input into a canonical target with file + position.
|
|
4
|
+
* Priority: symbol+file_path > symbol > file_path+line > file_path+diagnostic_code > file_path alone
|
|
5
|
+
*/
|
|
6
|
+
export async function resolveTarget(input, engine) {
|
|
7
|
+
// Priority 1: symbol (with optional file hint)
|
|
8
|
+
if (input.symbol) {
|
|
9
|
+
const resolved = await engine.resolveSymbol(input.symbol, input.file_path);
|
|
10
|
+
return {
|
|
11
|
+
symbol: resolved.name,
|
|
12
|
+
uri: resolved.uri,
|
|
13
|
+
filePath: uriToPath(resolved.uri),
|
|
14
|
+
position: resolved.position,
|
|
15
|
+
confidence: 'high',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Priority 2: file_path + line
|
|
19
|
+
if (input.file_path && input.line) {
|
|
20
|
+
const { uri } = await engine.prepareFile(input.file_path);
|
|
21
|
+
const position = toPosition(input.line, input.column ?? 1);
|
|
22
|
+
return {
|
|
23
|
+
uri,
|
|
24
|
+
filePath: input.file_path,
|
|
25
|
+
position,
|
|
26
|
+
confidence: 'medium',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Priority 3: file_path + diagnostic_code
|
|
30
|
+
if (input.file_path && input.diagnostic_code) {
|
|
31
|
+
const { uri } = await engine.prepareFile(input.file_path);
|
|
32
|
+
const { waitForDiagnostics } = await import('../engine/waitForDiagnostics.js');
|
|
33
|
+
await waitForDiagnostics(engine.docManager, uri, 800);
|
|
34
|
+
const diags = engine.docManager.getCachedDiagnostics(uri);
|
|
35
|
+
const match = diags.find((d) => `TS${d.code}` === input.diagnostic_code || String(d.code) === input.diagnostic_code);
|
|
36
|
+
if (match) {
|
|
37
|
+
return {
|
|
38
|
+
uri,
|
|
39
|
+
filePath: input.file_path,
|
|
40
|
+
position: match.range.start,
|
|
41
|
+
confidence: 'high',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Priority 4: file_path alone
|
|
46
|
+
if (input.file_path) {
|
|
47
|
+
const { uri } = await engine.prepareFile(input.file_path);
|
|
48
|
+
return {
|
|
49
|
+
uri,
|
|
50
|
+
filePath: input.file_path,
|
|
51
|
+
position: { line: 0, character: 0 },
|
|
52
|
+
confidence: 'low',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
throw new Error('Provide at least a symbol name or file_path.');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Pick the best diagnostic near a position.
|
|
59
|
+
* Priority: exact code match > exact line > nearest ±2 > first error
|
|
60
|
+
*/
|
|
61
|
+
export function pickDiagnostic(diagnostics, position, diagnosticCode) {
|
|
62
|
+
const errors = diagnostics.filter((d) => d.severity === 1);
|
|
63
|
+
if (errors.length === 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
// Exact diagnostic code match
|
|
66
|
+
if (diagnosticCode) {
|
|
67
|
+
const byCode = errors.find((d) => `TS${d.code}` === diagnosticCode || String(d.code) === diagnosticCode);
|
|
68
|
+
if (byCode)
|
|
69
|
+
return byCode;
|
|
70
|
+
}
|
|
71
|
+
// Exact line match
|
|
72
|
+
const byLine = errors.find((d) => d.range.start.line === position.line);
|
|
73
|
+
if (byLine)
|
|
74
|
+
return byLine;
|
|
75
|
+
// Nearest line within ±2
|
|
76
|
+
const nearby = errors
|
|
77
|
+
.filter((d) => Math.abs(d.range.start.line - position.line) <= 2)
|
|
78
|
+
.sort((a, b) => Math.abs(a.range.start.line - position.line) - Math.abs(b.range.start.line - position.line));
|
|
79
|
+
if (nearby.length > 0)
|
|
80
|
+
return nearby[0];
|
|
81
|
+
// First error
|
|
82
|
+
return errors[0];
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=targetResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targetResolver.js","sourceRoot":"","sources":["../../src/resolve/targetResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavior families — redesigned with classifier/expansion split.
|
|
3
|
+
*
|
|
4
|
+
* classifierTerms: strong terms only. Weak words (use, get, set, call, run, make)
|
|
5
|
+
* must NEVER appear here. These drive mode routing.
|
|
6
|
+
*
|
|
7
|
+
* expansionTerms: broader lexical expansion for recall. May include weaker terms.
|
|
8
|
+
*/
|
|
9
|
+
export interface BehaviorFamily {
|
|
10
|
+
id: string;
|
|
11
|
+
classifierTerms: string[];
|
|
12
|
+
expansionTerms: string[];
|
|
13
|
+
fileHints: string[];
|
|
14
|
+
symbolHints: string[];
|
|
15
|
+
}
|
|
16
|
+
export declare const BEHAVIOR_FAMILIES: BehaviorFamily[];
|
|
17
|
+
/**
|
|
18
|
+
* Score a set of tokens against all families.
|
|
19
|
+
* Uses only classifierTerms for strong matching.
|
|
20
|
+
* Returns per-family scores.
|
|
21
|
+
*/
|
|
22
|
+
export declare function scoreFamilies(tokens: string[]): Record<string, number>;
|