@eduardo-afonso/codebase-intelligence 0.1.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 +147 -0
- package/README.pt-BR.md +147 -0
- package/dist/analysis/DependencyAnalyzer.d.ts +8 -0
- package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
- package/dist/analysis/DependencyAnalyzer.js +13 -0
- package/dist/analysis/DependencyAnalyzer.js.map +1 -0
- package/dist/analysis/ImpactAnalyzer.d.ts +25 -0
- package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/analysis/ImpactAnalyzer.js +41 -0
- package/dist/analysis/ImpactAnalyzer.js.map +1 -0
- package/dist/cli/Watcher.d.ts +40 -0
- package/dist/cli/Watcher.d.ts.map +1 -0
- package/dist/cli/Watcher.js +80 -0
- package/dist/cli/Watcher.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +243 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/AnalysisCache.d.ts +43 -0
- package/dist/core/AnalysisCache.d.ts.map +1 -0
- package/dist/core/AnalysisCache.js +120 -0
- package/dist/core/AnalysisCache.js.map +1 -0
- package/dist/core/Codebase.d.ts +39 -0
- package/dist/core/Codebase.d.ts.map +1 -0
- package/dist/core/Codebase.js +122 -0
- package/dist/core/Codebase.js.map +1 -0
- package/dist/core/errors.d.ts +15 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +29 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/interfaces.d.ts +6 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +2 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/discovery/FileScanner.d.ts +13 -0
- package/dist/discovery/FileScanner.d.ts.map +1 -0
- package/dist/discovery/FileScanner.js +55 -0
- package/dist/discovery/FileScanner.js.map +1 -0
- package/dist/discovery/IgnoreMatcher.d.ts +11 -0
- package/dist/discovery/IgnoreMatcher.d.ts.map +1 -0
- package/dist/discovery/IgnoreMatcher.js +30 -0
- package/dist/discovery/IgnoreMatcher.js.map +1 -0
- package/dist/discovery/ProjectDetector.d.ts +17 -0
- package/dist/discovery/ProjectDetector.d.ts.map +1 -0
- package/dist/discovery/ProjectDetector.js +82 -0
- package/dist/discovery/ProjectDetector.js.map +1 -0
- package/dist/graph/DependencyGraph.d.ts +48 -0
- package/dist/graph/DependencyGraph.d.ts.map +1 -0
- package/dist/graph/DependencyGraph.js +114 -0
- package/dist/graph/DependencyGraph.js.map +1 -0
- package/dist/graph/GraphBuilder.d.ts +11 -0
- package/dist/graph/GraphBuilder.d.ts.map +1 -0
- package/dist/graph/GraphBuilder.js +22 -0
- package/dist/graph/GraphBuilder.js.map +1 -0
- package/dist/index/FileIndex.d.ts +12 -0
- package/dist/index/FileIndex.d.ts.map +1 -0
- package/dist/index/FileIndex.js +26 -0
- package/dist/index/FileIndex.js.map +1 -0
- package/dist/index/SymbolIndex.d.ts +18 -0
- package/dist/index/SymbolIndex.d.ts.map +1 -0
- package/dist/index/SymbolIndex.js +40 -0
- package/dist/index/SymbolIndex.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/Parser.d.ts +3 -0
- package/dist/parsers/Parser.d.ts.map +1 -0
- package/dist/parsers/Parser.js +2 -0
- package/dist/parsers/Parser.js.map +1 -0
- package/dist/parsers/ParserRegistry.d.ts +7 -0
- package/dist/parsers/ParserRegistry.d.ts.map +1 -0
- package/dist/parsers/ParserRegistry.js +10 -0
- package/dist/parsers/ParserRegistry.js.map +1 -0
- package/dist/parsers/typescript/TypeScriptParser.d.ts +9 -0
- package/dist/parsers/typescript/TypeScriptParser.d.ts.map +1 -0
- package/dist/parsers/typescript/TypeScriptParser.js +134 -0
- package/dist/parsers/typescript/TypeScriptParser.js.map +1 -0
- package/dist/search/CodeSearch.d.ts +20 -0
- package/dist/search/CodeSearch.d.ts.map +1 -0
- package/dist/search/CodeSearch.js +54 -0
- package/dist/search/CodeSearch.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolIndex.js","sourceRoot":"","sources":["../../src/index/SymbolIndex.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,WAAW;IACd,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzC,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzC,GAAG,GAAiB,EAAE,CAAC;IAExB,GAAG,CAAC,MAAkB;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,OAAqB;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAEM,WAAW,CAAC,KAAkB;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,UAAU,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Codebase } from './core/Codebase.js';
|
|
2
|
+
export type { CodebaseOptions } from './core/Codebase.js';
|
|
3
|
+
export type { CodebaseFile, CodeSymbol, CodeDependency, SupportedLanguage, SymbolKind, DependencyType, ParsedFile } from './core/types.js';
|
|
4
|
+
export type { ProjectInfo } from './discovery/ProjectDetector.js';
|
|
5
|
+
export type { SymbolQuery } from './index/SymbolIndex.js';
|
|
6
|
+
export type { SearchResult, SearchOptions, SearchMode } from './search/CodeSearch.js';
|
|
7
|
+
export { CACHE_DIR_NAME } from './core/AnalysisCache.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAc9C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/parsers/Parser.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/parsers/Parser.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParserRegistry.d.ts","sourceRoot":"","sources":["../../src/parsers/ParserRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAoB;IAE5B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAExC;IAEM,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEzD;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParserRegistry.js","sourceRoot":"","sources":["../../src/parsers/ParserRegistry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACjB,OAAO,GAAiB,EAAE,CAAC;IAE5B,QAAQ,CAAC,MAAkB;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEM,SAAS,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CodeParser } from '../../core/interfaces.js';
|
|
2
|
+
import type { ParsedFile } from '../../core/types.js';
|
|
3
|
+
export declare class TypeScriptParser implements CodeParser {
|
|
4
|
+
private project;
|
|
5
|
+
constructor();
|
|
6
|
+
supports(language: string): boolean;
|
|
7
|
+
parse(filePath: string): Promise<ParsedFile>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=TypeScriptParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeScriptParser.d.ts","sourceRoot":"","sources":["../../../src/parsers/typescript/TypeScriptParser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAwD,MAAM,qBAAqB,CAAC;AAG5G,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,OAAO,CAAU;IAEzB,cAEC;IAEM,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzC;IAEY,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoIxD;CACF"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Project, SyntaxKind, Node, ClassDeclaration, InterfaceDeclaration, TypeAliasDeclaration, FunctionDeclaration, VariableStatement } from 'ts-morph';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { ParseError } from '../../core/errors.js';
|
|
4
|
+
export class TypeScriptParser {
|
|
5
|
+
project;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.project = new Project();
|
|
8
|
+
}
|
|
9
|
+
supports(language) {
|
|
10
|
+
return language === 'typescript' || language === 'javascript';
|
|
11
|
+
}
|
|
12
|
+
async parse(filePath) {
|
|
13
|
+
// In a real scenario we'd read the file content, but ts-morph can do it or we can pass it in.
|
|
14
|
+
// The prompt says `parse(file: string)` where `file` is the absolute path.
|
|
15
|
+
let sourceFile = this.project.getSourceFile(filePath);
|
|
16
|
+
if (!sourceFile) {
|
|
17
|
+
try {
|
|
18
|
+
this.project.addSourceFileAtPath(filePath);
|
|
19
|
+
sourceFile = this.project.getSourceFile(filePath);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
throw new ParseError(filePath, e);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!sourceFile) {
|
|
26
|
+
throw new ParseError(filePath, new Error("Could not create source file"));
|
|
27
|
+
}
|
|
28
|
+
const symbols = [];
|
|
29
|
+
const dependencies = [];
|
|
30
|
+
// Extract imports
|
|
31
|
+
const importDeclarations = sourceFile.getImportDeclarations();
|
|
32
|
+
for (const importDecl of importDeclarations) {
|
|
33
|
+
const moduleSpecifier = importDecl.getModuleSpecifierValue();
|
|
34
|
+
let target = moduleSpecifier;
|
|
35
|
+
let type = 'unresolved';
|
|
36
|
+
if (moduleSpecifier.startsWith('.')) {
|
|
37
|
+
// Resolve relative path roughly
|
|
38
|
+
const dir = path.dirname(filePath);
|
|
39
|
+
target = path.resolve(dir, moduleSpecifier).replace(/\\/g, '/');
|
|
40
|
+
// If it doesn't have an extension, it's hard to know exactly without checking FS,
|
|
41
|
+
// but we'll register the resolved path as target. We'll keep it 'import' type,
|
|
42
|
+
// but it might need '.ts' or '/index.ts' appended later.
|
|
43
|
+
type = 'import';
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Absolute or node_modules
|
|
47
|
+
type = 'import';
|
|
48
|
+
}
|
|
49
|
+
dependencies.push({
|
|
50
|
+
source: filePath.replace(/\\/g, '/'),
|
|
51
|
+
target,
|
|
52
|
+
type
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Extract Symbols
|
|
56
|
+
const addSymbol = (name, kind, node, parentId) => {
|
|
57
|
+
const id = `${filePath}#${name}`;
|
|
58
|
+
const symbol = {
|
|
59
|
+
id,
|
|
60
|
+
name,
|
|
61
|
+
kind,
|
|
62
|
+
file: filePath.replace(/\\/g, '/'),
|
|
63
|
+
startLine: node.getStartLineNumber(),
|
|
64
|
+
endLine: node.getEndLineNumber()
|
|
65
|
+
};
|
|
66
|
+
if (parentId)
|
|
67
|
+
symbol.parentId = parentId;
|
|
68
|
+
symbols.push(symbol);
|
|
69
|
+
return id;
|
|
70
|
+
};
|
|
71
|
+
// Classes
|
|
72
|
+
for (const cls of sourceFile.getClasses()) {
|
|
73
|
+
const className = cls.getName();
|
|
74
|
+
if (!className)
|
|
75
|
+
continue;
|
|
76
|
+
const classId = addSymbol(className, 'class', cls);
|
|
77
|
+
// Methods
|
|
78
|
+
for (const method of cls.getMethods()) {
|
|
79
|
+
const methodName = method.getName();
|
|
80
|
+
addSymbol(methodName, 'method', method, classId);
|
|
81
|
+
}
|
|
82
|
+
// Extends / Implements
|
|
83
|
+
const baseClass = cls.getBaseClass();
|
|
84
|
+
if (baseClass) {
|
|
85
|
+
const baseName = baseClass.getName();
|
|
86
|
+
if (baseName) {
|
|
87
|
+
dependencies.push({ source: classId, target: baseName, type: 'extends' });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const impl of cls.getImplements()) {
|
|
91
|
+
dependencies.push({ source: classId, target: impl.getText(), type: 'implements' });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Interfaces
|
|
95
|
+
for (const iface of sourceFile.getInterfaces()) {
|
|
96
|
+
const ifaceName = iface.getName();
|
|
97
|
+
const ifaceId = addSymbol(ifaceName, 'interface', iface);
|
|
98
|
+
for (const ext of iface.getExtends()) {
|
|
99
|
+
dependencies.push({ source: ifaceId, target: ext.getText(), type: 'extends' });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Type Aliases
|
|
103
|
+
for (const typeAlias of sourceFile.getTypeAliases()) {
|
|
104
|
+
addSymbol(typeAlias.getName(), 'typeAlias', typeAlias);
|
|
105
|
+
}
|
|
106
|
+
// Functions
|
|
107
|
+
for (const func of sourceFile.getFunctions()) {
|
|
108
|
+
const funcName = func.getName();
|
|
109
|
+
if (funcName) {
|
|
110
|
+
addSymbol(funcName, 'function', func);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Module-level Variables
|
|
114
|
+
for (const varStmt of sourceFile.getVariableStatements()) {
|
|
115
|
+
for (const varDecl of varStmt.getDeclarations()) {
|
|
116
|
+
addSymbol(varDecl.getName(), 'variable', varDecl);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Prepare a mock CodebaseFile since we just parsed it directly from path.
|
|
120
|
+
// In a real scenario, the caller would pass the CodebaseFile, but interface says `file: string`.
|
|
121
|
+
const codebaseFile = {
|
|
122
|
+
path: filePath,
|
|
123
|
+
relativePath: path.basename(filePath), // Rough mock
|
|
124
|
+
language: this.supports('typescript') ? 'typescript' : 'javascript',
|
|
125
|
+
size: sourceFile.getFullText().length
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
file: codebaseFile,
|
|
129
|
+
symbols,
|
|
130
|
+
dependencies
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=TypeScriptParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeScriptParser.js","sourceRoot":"","sources":["../../../src/parsers/typescript/TypeScriptParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CodebaseFile, CodeSymbol } from '../core/types.js';
|
|
2
|
+
export type SearchMode = 'lexical';
|
|
3
|
+
export interface SearchOptions {
|
|
4
|
+
mode?: SearchMode;
|
|
5
|
+
caseSensitive?: boolean;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SearchResult {
|
|
9
|
+
file: string;
|
|
10
|
+
symbol?: string;
|
|
11
|
+
score: number;
|
|
12
|
+
matches: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare class CodeSearch {
|
|
15
|
+
private files;
|
|
16
|
+
private symbols;
|
|
17
|
+
constructor(files: CodebaseFile[], symbols: CodeSymbol[]);
|
|
18
|
+
search(query: string, options?: SearchOptions): SearchResult[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=CodeSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeSearch.d.ts","sourceRoot":"","sources":["../../src/search/CodeSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAAe;IAE9B,YAAY,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAGvD;IAEM,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE,CAmDxE;CACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export class CodeSearch {
|
|
2
|
+
files;
|
|
3
|
+
symbols;
|
|
4
|
+
constructor(files, symbols) {
|
|
5
|
+
this.files = files;
|
|
6
|
+
this.symbols = symbols;
|
|
7
|
+
}
|
|
8
|
+
search(query, options = {}) {
|
|
9
|
+
const { caseSensitive = false, limit } = options;
|
|
10
|
+
const normalizedQuery = caseSensitive ? query : query.toLowerCase();
|
|
11
|
+
const results = [];
|
|
12
|
+
// 1. Symbol matches (name-based)
|
|
13
|
+
for (const symbol of this.symbols) {
|
|
14
|
+
const normalizedName = caseSensitive ? symbol.name : symbol.name.toLowerCase();
|
|
15
|
+
if (normalizedName.includes(normalizedQuery)) {
|
|
16
|
+
const isExact = normalizedName === normalizedQuery;
|
|
17
|
+
results.push({
|
|
18
|
+
file: symbol.file,
|
|
19
|
+
symbol: symbol.name,
|
|
20
|
+
score: isExact ? 1.0 : 0.7,
|
|
21
|
+
matches: [`symbol:${symbol.kind}:${symbol.name}`]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// 2. File path matches (deduplicate from symbol results)
|
|
26
|
+
const filesWithSymbolMatches = new Set(results.map(r => r.file));
|
|
27
|
+
for (const file of this.files) {
|
|
28
|
+
if (filesWithSymbolMatches.has(file.path))
|
|
29
|
+
continue; // already covered
|
|
30
|
+
const normalizedPath = caseSensitive ? file.relativePath : file.relativePath.toLowerCase();
|
|
31
|
+
const normalizedBasename = caseSensitive
|
|
32
|
+
? file.relativePath.split('/').pop() ?? ''
|
|
33
|
+
: (file.relativePath.split('/').pop() ?? '').toLowerCase();
|
|
34
|
+
if (normalizedBasename.includes(normalizedQuery)) {
|
|
35
|
+
results.push({
|
|
36
|
+
file: file.path,
|
|
37
|
+
score: 0.6,
|
|
38
|
+
matches: [`file:${file.relativePath}`]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else if (normalizedPath.includes(normalizedQuery)) {
|
|
42
|
+
results.push({
|
|
43
|
+
file: file.path,
|
|
44
|
+
score: 0.5,
|
|
45
|
+
matches: [`path:${file.relativePath}`]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Sort by score descending
|
|
50
|
+
results.sort((a, b) => b.score - a.score);
|
|
51
|
+
return limit !== undefined ? results.slice(0, limit) : results;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=CodeSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeSearch.js","sourceRoot":"","sources":["../../src/search/CodeSearch.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eduardo-afonso/codebase-intelligence",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Analyze and understand codebases programmatically — file scanning, symbol indexing, dependency graphs, and code search.",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"codebase-intelligence": "./dist/cli/index.js"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/EdochaPAfonso/Codebase-intelligence"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "tsx src/index.ts",
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"test": "vitest",
|
|
30
|
+
"test:run": "vitest run",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"lint": "eslint . --ext .ts",
|
|
33
|
+
"clean": "rm -rf dist"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [],
|
|
36
|
+
"author": "",
|
|
37
|
+
"license": "ISC",
|
|
38
|
+
"type": "module",
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "^26.5.0",
|
|
41
|
+
"tsx": "^4.23.13",
|
|
42
|
+
"typescript": "^7.0.2"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"commander": "^15.0.0",
|
|
46
|
+
"fast-glob": "^3.3.3",
|
|
47
|
+
"ts-morph": "^28.0.0",
|
|
48
|
+
"vitest": "^5.0.0",
|
|
49
|
+
"zod": "^4.5.4"
|
|
50
|
+
}
|
|
51
|
+
}
|