@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.
Files changed (87) hide show
  1. package/README.md +147 -0
  2. package/README.pt-BR.md +147 -0
  3. package/dist/analysis/DependencyAnalyzer.d.ts +8 -0
  4. package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
  5. package/dist/analysis/DependencyAnalyzer.js +13 -0
  6. package/dist/analysis/DependencyAnalyzer.js.map +1 -0
  7. package/dist/analysis/ImpactAnalyzer.d.ts +25 -0
  8. package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
  9. package/dist/analysis/ImpactAnalyzer.js +41 -0
  10. package/dist/analysis/ImpactAnalyzer.js.map +1 -0
  11. package/dist/cli/Watcher.d.ts +40 -0
  12. package/dist/cli/Watcher.d.ts.map +1 -0
  13. package/dist/cli/Watcher.js +80 -0
  14. package/dist/cli/Watcher.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +243 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/core/AnalysisCache.d.ts +43 -0
  20. package/dist/core/AnalysisCache.d.ts.map +1 -0
  21. package/dist/core/AnalysisCache.js +120 -0
  22. package/dist/core/AnalysisCache.js.map +1 -0
  23. package/dist/core/Codebase.d.ts +39 -0
  24. package/dist/core/Codebase.d.ts.map +1 -0
  25. package/dist/core/Codebase.js +122 -0
  26. package/dist/core/Codebase.js.map +1 -0
  27. package/dist/core/errors.d.ts +15 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +29 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/interfaces.d.ts +6 -0
  32. package/dist/core/interfaces.d.ts.map +1 -0
  33. package/dist/core/interfaces.js +2 -0
  34. package/dist/core/interfaces.js.map +1 -0
  35. package/dist/core/types.d.ts +29 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +2 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/discovery/FileScanner.d.ts +13 -0
  40. package/dist/discovery/FileScanner.d.ts.map +1 -0
  41. package/dist/discovery/FileScanner.js +55 -0
  42. package/dist/discovery/FileScanner.js.map +1 -0
  43. package/dist/discovery/IgnoreMatcher.d.ts +11 -0
  44. package/dist/discovery/IgnoreMatcher.d.ts.map +1 -0
  45. package/dist/discovery/IgnoreMatcher.js +30 -0
  46. package/dist/discovery/IgnoreMatcher.js.map +1 -0
  47. package/dist/discovery/ProjectDetector.d.ts +17 -0
  48. package/dist/discovery/ProjectDetector.d.ts.map +1 -0
  49. package/dist/discovery/ProjectDetector.js +82 -0
  50. package/dist/discovery/ProjectDetector.js.map +1 -0
  51. package/dist/graph/DependencyGraph.d.ts +48 -0
  52. package/dist/graph/DependencyGraph.d.ts.map +1 -0
  53. package/dist/graph/DependencyGraph.js +114 -0
  54. package/dist/graph/DependencyGraph.js.map +1 -0
  55. package/dist/graph/GraphBuilder.d.ts +11 -0
  56. package/dist/graph/GraphBuilder.d.ts.map +1 -0
  57. package/dist/graph/GraphBuilder.js +22 -0
  58. package/dist/graph/GraphBuilder.js.map +1 -0
  59. package/dist/index/FileIndex.d.ts +12 -0
  60. package/dist/index/FileIndex.d.ts.map +1 -0
  61. package/dist/index/FileIndex.js +26 -0
  62. package/dist/index/FileIndex.js.map +1 -0
  63. package/dist/index/SymbolIndex.d.ts +18 -0
  64. package/dist/index/SymbolIndex.d.ts.map +1 -0
  65. package/dist/index/SymbolIndex.js +40 -0
  66. package/dist/index/SymbolIndex.js.map +1 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +4 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/parsers/Parser.d.ts +3 -0
  72. package/dist/parsers/Parser.d.ts.map +1 -0
  73. package/dist/parsers/Parser.js +2 -0
  74. package/dist/parsers/Parser.js.map +1 -0
  75. package/dist/parsers/ParserRegistry.d.ts +7 -0
  76. package/dist/parsers/ParserRegistry.d.ts.map +1 -0
  77. package/dist/parsers/ParserRegistry.js +10 -0
  78. package/dist/parsers/ParserRegistry.js.map +1 -0
  79. package/dist/parsers/typescript/TypeScriptParser.d.ts +9 -0
  80. package/dist/parsers/typescript/TypeScriptParser.d.ts.map +1 -0
  81. package/dist/parsers/typescript/TypeScriptParser.js +134 -0
  82. package/dist/parsers/typescript/TypeScriptParser.js.map +1 -0
  83. package/dist/search/CodeSearch.d.ts +20 -0
  84. package/dist/search/CodeSearch.d.ts.map +1 -0
  85. package/dist/search/CodeSearch.js +54 -0
  86. package/dist/search/CodeSearch.js.map +1 -0
  87. 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"}
@@ -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,4 @@
1
+ // Public API — only expose what consumers need
2
+ export { Codebase } from './core/Codebase.js';
3
+ export { CACHE_DIR_NAME } from './core/AnalysisCache.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ export type { CodeParser } from '../core/interfaces.js';
2
+ export type { ParsedFile } from '../core/types.js';
3
+ //# sourceMappingURL=Parser.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/parsers/Parser.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { CodeParser } from '../core/interfaces.js';
2
+ export declare class ParserRegistry {
3
+ private parsers;
4
+ register(parser: CodeParser): void;
5
+ getParser(language: string): CodeParser | undefined;
6
+ }
7
+ //# sourceMappingURL=ParserRegistry.d.ts.map
@@ -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,10 @@
1
+ export class ParserRegistry {
2
+ parsers = [];
3
+ register(parser) {
4
+ this.parsers.push(parser);
5
+ }
6
+ getParser(language) {
7
+ return this.parsers.find(p => p.supports(language));
8
+ }
9
+ }
10
+ //# sourceMappingURL=ParserRegistry.js.map
@@ -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
+ }