@colbymchenry/codegraph 0.3.1 → 0.4.8
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.
Potentially problematic release.
This version of @colbymchenry/codegraph might be problematic. Click here for more details.
- package/LICENSE +21 -21
- package/README.md +647 -641
- package/dist/bin/codegraph.d.ts +7 -2
- package/dist/bin/codegraph.d.ts.map +1 -1
- package/dist/bin/codegraph.js +360 -140
- package/dist/bin/codegraph.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/context/index.d.ts +17 -4
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +182 -15
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +16 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +11 -12
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +19 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +221 -107
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +154 -149
- package/dist/directory.d.ts +13 -1
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +62 -19
- package/dist/directory.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -1
- package/dist/errors.js.map +1 -1
- package/dist/extraction/grammars.d.ts +9 -4
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +133 -65
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +119 -7
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +62 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +937 -34
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +6 -2
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +6 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -73
- package/dist/index.js.map +1 -1
- package/dist/installer/banner.js +7 -7
- package/dist/installer/claude-md-template.js +32 -32
- package/dist/installer/config-writer.d.ts +9 -0
- package/dist/installer/config-writer.d.ts.map +1 -1
- package/dist/installer/config-writer.js +78 -0
- package/dist/installer/config-writer.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +11 -9
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/index.d.ts +14 -3
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +109 -29
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +62 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +414 -43
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +2 -0
- package/dist/mcp/transport.js.map +1 -1
- package/dist/resolution/frameworks/index.d.ts +1 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/dist/resolution/frameworks/index.js +5 -1
- package/dist/resolution/frameworks/index.js.map +1 -1
- package/dist/resolution/frameworks/svelte.d.ts +9 -0
- package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
- package/dist/resolution/frameworks/svelte.js +268 -0
- package/dist/resolution/frameworks/svelte.js.map +1 -0
- package/dist/resolution/index.d.ts +11 -2
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +94 -13
- package/dist/resolution/index.js.map +1 -1
- package/dist/sentry.d.ts +22 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +159 -0
- package/dist/sentry.js.map +1 -0
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -5
- package/dist/sync/index.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +45 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +114 -3
- package/dist/utils.js.map +1 -1
- package/dist/vectors/embedder.d.ts +1 -1
- package/dist/vectors/embedder.d.ts.map +1 -1
- package/dist/vectors/embedder.js +2 -2
- package/dist/vectors/embedder.js.map +1 -1
- package/dist/vectors/search.d.ts.map +1 -1
- package/dist/vectors/search.js +33 -32
- package/dist/vectors/search.js.map +1 -1
- package/package.json +72 -67
- package/scripts/patch-tree-sitter-dart.js +112 -0
- package/scripts/postinstall.js +71 -68
- package/dist/sync/git-hooks.d.ts +0 -66
- package/dist/sync/git-hooks.d.ts.map +0 -1
- package/dist/sync/git-hooks.js +0 -281
- package/dist/sync/git-hooks.js.map +0 -1
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
package/dist/db/migrations.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAqBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAU/D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,CAKvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAU3E"}
|
package/dist/db/migrations.js
CHANGED
|
@@ -14,7 +14,7 @@ exports.getMigrationHistory = getMigrationHistory;
|
|
|
14
14
|
/**
|
|
15
15
|
* Current schema version
|
|
16
16
|
*/
|
|
17
|
-
exports.CURRENT_SCHEMA_VERSION =
|
|
17
|
+
exports.CURRENT_SCHEMA_VERSION = 2;
|
|
18
18
|
/**
|
|
19
19
|
* All migrations in order
|
|
20
20
|
*
|
|
@@ -22,17 +22,16 @@ exports.CURRENT_SCHEMA_VERSION = 1;
|
|
|
22
22
|
* Future migrations go here.
|
|
23
23
|
*/
|
|
24
24
|
const migrations = [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// },
|
|
25
|
+
{
|
|
26
|
+
version: 2,
|
|
27
|
+
description: 'Add filePath and language to unresolved_refs for performance',
|
|
28
|
+
up: (db) => {
|
|
29
|
+
db.exec(`
|
|
30
|
+
ALTER TABLE unresolved_refs ADD COLUMN file_path TEXT;
|
|
31
|
+
ALTER TABLE unresolved_refs ADD COLUMN language TEXT;
|
|
32
|
+
`);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
36
35
|
];
|
|
37
36
|
/**
|
|
38
37
|
* Get the current schema version from the database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/db/queries.d.ts
CHANGED
|
@@ -54,6 +54,10 @@ export declare class QueryBuilder {
|
|
|
54
54
|
* Get all nodes of a specific kind
|
|
55
55
|
*/
|
|
56
56
|
getNodesByKind(kind: NodeKind): Node[];
|
|
57
|
+
/**
|
|
58
|
+
* Get all nodes in the database
|
|
59
|
+
*/
|
|
60
|
+
getAllNodes(): Node[];
|
|
57
61
|
/**
|
|
58
62
|
* Search nodes by name using FTS with fallback to LIKE for better matching
|
|
59
63
|
*
|
|
@@ -72,6 +76,17 @@ export declare class QueryBuilder {
|
|
|
72
76
|
* Useful for camelCase matching (e.g., "signIn" finds "signInWithGoogle")
|
|
73
77
|
*/
|
|
74
78
|
private searchNodesLike;
|
|
79
|
+
/**
|
|
80
|
+
* Find nodes by exact name match
|
|
81
|
+
*
|
|
82
|
+
* Used for hybrid search - looks up symbols by exact name or case-insensitive match.
|
|
83
|
+
* Returns high-confidence matches for known symbol names extracted from query.
|
|
84
|
+
*
|
|
85
|
+
* @param names - Array of symbol names to look up
|
|
86
|
+
* @param options - Search options (kinds, languages, limit)
|
|
87
|
+
* @returns SearchResult array with exact matches scored at 1.0
|
|
88
|
+
*/
|
|
89
|
+
findNodesByExactName(names: string[], options?: SearchOptions): SearchResult[];
|
|
75
90
|
/**
|
|
76
91
|
* Insert a new edge
|
|
77
92
|
*/
|
|
@@ -116,6 +131,10 @@ export declare class QueryBuilder {
|
|
|
116
131
|
* Insert an unresolved reference
|
|
117
132
|
*/
|
|
118
133
|
insertUnresolvedRef(ref: UnresolvedReference): void;
|
|
134
|
+
/**
|
|
135
|
+
* Insert multiple unresolved references in a single transaction
|
|
136
|
+
*/
|
|
137
|
+
insertUnresolvedRefsBatch(refs: UnresolvedReference[]): void;
|
|
119
138
|
/**
|
|
120
139
|
* Delete unresolved references from a node
|
|
121
140
|
*/
|
package/dist/db/queries.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EAER,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EAER,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAwHlB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAG9B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAGrC,OAAO,CAAC,KAAK,CAsBN;gBAEK,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAQjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAqE5B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAQhC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IA4D5B;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS5B;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAazC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAuBpC;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAUxC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE;IAQtC;;OAEG;IACH,WAAW,IAAI,IAAI,EAAE;IAKrB;;;;;;;OAOG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE;IAcvE;;OAEG;IACH,OAAO,CAAC,cAAc;IAkDtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAwDvB;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE;IA4ClF;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAkB5B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAQhC;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO3C;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE;IAc9D;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE;IAkB9D;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IA4BlC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUlC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAQlD;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAQ3B;;OAEG;IACH,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,EAAE;IAY/D;;OAEG;IACH,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IAoBnD;;OAEG;IACH,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,IAAI;IA0B5D;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAS5C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAmBxD;;OAEG;IACH,uBAAuB,IAAI,mBAAmB,EAAE;IAchD;;OAEG;IACH,yBAAyB,IAAI,IAAI;IAIjC;;OAEG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAUrD;;OAEG;IACH,QAAQ,IAAI,UAAU;IAiDtB;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
|
package/dist/db/queries.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.QueryBuilder = void 0;
|
|
9
|
+
const utils_1 = require("../utils");
|
|
9
10
|
/**
|
|
10
11
|
* Convert database row to Node object
|
|
11
12
|
*/
|
|
@@ -28,8 +29,8 @@ function rowToNode(row) {
|
|
|
28
29
|
isAsync: row.is_async === 1,
|
|
29
30
|
isStatic: row.is_static === 1,
|
|
30
31
|
isAbstract: row.is_abstract === 1,
|
|
31
|
-
decorators: row.decorators ?
|
|
32
|
-
typeParameters: row.type_parameters ?
|
|
32
|
+
decorators: row.decorators ? (0, utils_1.safeJsonParse)(row.decorators, undefined) : undefined,
|
|
33
|
+
typeParameters: row.type_parameters ? (0, utils_1.safeJsonParse)(row.type_parameters, undefined) : undefined,
|
|
33
34
|
updatedAt: row.updated_at,
|
|
34
35
|
};
|
|
35
36
|
}
|
|
@@ -41,7 +42,7 @@ function rowToEdge(row) {
|
|
|
41
42
|
source: row.source,
|
|
42
43
|
target: row.target,
|
|
43
44
|
kind: row.kind,
|
|
44
|
-
metadata: row.metadata ?
|
|
45
|
+
metadata: row.metadata ? (0, utils_1.safeJsonParse)(row.metadata, undefined) : undefined,
|
|
45
46
|
line: row.line ?? undefined,
|
|
46
47
|
column: row.col ?? undefined,
|
|
47
48
|
};
|
|
@@ -58,7 +59,7 @@ function rowToFileRecord(row) {
|
|
|
58
59
|
modifiedAt: row.modified_at,
|
|
59
60
|
indexedAt: row.indexed_at,
|
|
60
61
|
nodeCount: row.node_count,
|
|
61
|
-
errors: row.errors ?
|
|
62
|
+
errors: row.errors ? (0, utils_1.safeJsonParse)(row.errors, undefined) : undefined,
|
|
62
63
|
};
|
|
63
64
|
}
|
|
64
65
|
/**
|
|
@@ -82,44 +83,70 @@ class QueryBuilder {
|
|
|
82
83
|
*/
|
|
83
84
|
insertNode(node) {
|
|
84
85
|
if (!this.stmts.insertNode) {
|
|
85
|
-
this.stmts.insertNode = this.db.prepare(`
|
|
86
|
-
INSERT INTO nodes (
|
|
87
|
-
id, kind, name, qualified_name, file_path, language,
|
|
88
|
-
start_line, end_line, start_column, end_column,
|
|
89
|
-
docstring, signature, visibility,
|
|
90
|
-
is_exported, is_async, is_static, is_abstract,
|
|
91
|
-
decorators, type_parameters, updated_at
|
|
92
|
-
) VALUES (
|
|
93
|
-
@id, @kind, @name, @qualifiedName, @filePath, @language,
|
|
94
|
-
@startLine, @endLine, @startColumn, @endColumn,
|
|
95
|
-
@docstring, @signature, @visibility,
|
|
96
|
-
@isExported, @isAsync, @isStatic, @isAbstract,
|
|
97
|
-
@decorators, @typeParameters, @updatedAt
|
|
98
|
-
)
|
|
86
|
+
this.stmts.insertNode = this.db.prepare(`
|
|
87
|
+
INSERT OR REPLACE INTO nodes (
|
|
88
|
+
id, kind, name, qualified_name, file_path, language,
|
|
89
|
+
start_line, end_line, start_column, end_column,
|
|
90
|
+
docstring, signature, visibility,
|
|
91
|
+
is_exported, is_async, is_static, is_abstract,
|
|
92
|
+
decorators, type_parameters, updated_at
|
|
93
|
+
) VALUES (
|
|
94
|
+
@id, @kind, @name, @qualifiedName, @filePath, @language,
|
|
95
|
+
@startLine, @endLine, @startColumn, @endColumn,
|
|
96
|
+
@docstring, @signature, @visibility,
|
|
97
|
+
@isExported, @isAsync, @isStatic, @isAbstract,
|
|
98
|
+
@decorators, @typeParameters, @updatedAt
|
|
99
|
+
)
|
|
99
100
|
`);
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
102
|
+
// Validate required fields to prevent SQLite bind errors
|
|
103
|
+
if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
|
|
104
|
+
console.error('[CodeGraph] Skipping node with missing required fields:', {
|
|
105
|
+
id: node.id,
|
|
106
|
+
kind: node.kind,
|
|
107
|
+
name: node.name,
|
|
108
|
+
filePath: node.filePath,
|
|
109
|
+
language: node.language,
|
|
110
|
+
});
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
this.stmts.insertNode.run({
|
|
115
|
+
id: node.id,
|
|
116
|
+
kind: node.kind,
|
|
117
|
+
name: node.name,
|
|
118
|
+
qualifiedName: node.qualifiedName ?? node.name,
|
|
119
|
+
filePath: node.filePath,
|
|
120
|
+
language: node.language,
|
|
121
|
+
startLine: node.startLine ?? 0,
|
|
122
|
+
endLine: node.endLine ?? 0,
|
|
123
|
+
startColumn: node.startColumn ?? 0,
|
|
124
|
+
endColumn: node.endColumn ?? 0,
|
|
125
|
+
docstring: node.docstring ?? null,
|
|
126
|
+
signature: node.signature ?? null,
|
|
127
|
+
visibility: node.visibility ?? null,
|
|
128
|
+
isExported: node.isExported ? 1 : 0,
|
|
129
|
+
isAsync: node.isAsync ? 1 : 0,
|
|
130
|
+
isStatic: node.isStatic ? 1 : 0,
|
|
131
|
+
isAbstract: node.isAbstract ? 1 : 0,
|
|
132
|
+
decorators: node.decorators ? JSON.stringify(node.decorators) : null,
|
|
133
|
+
typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
|
|
134
|
+
updatedAt: node.updatedAt ?? Date.now(),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const { captureException } = require('../sentry');
|
|
139
|
+
captureException(error, {
|
|
140
|
+
operation: 'insertNode',
|
|
141
|
+
nodeId: node.id,
|
|
142
|
+
nodeKind: node.kind,
|
|
143
|
+
nodeName: node.name,
|
|
144
|
+
filePath: node.filePath,
|
|
145
|
+
language: node.language,
|
|
146
|
+
startLine: node.startLine,
|
|
147
|
+
});
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
123
150
|
}
|
|
124
151
|
/**
|
|
125
152
|
* Insert multiple nodes in a transaction
|
|
@@ -136,43 +163,48 @@ class QueryBuilder {
|
|
|
136
163
|
*/
|
|
137
164
|
updateNode(node) {
|
|
138
165
|
if (!this.stmts.updateNode) {
|
|
139
|
-
this.stmts.updateNode = this.db.prepare(`
|
|
140
|
-
UPDATE nodes SET
|
|
141
|
-
kind = @kind,
|
|
142
|
-
name = @name,
|
|
143
|
-
qualified_name = @qualifiedName,
|
|
144
|
-
file_path = @filePath,
|
|
145
|
-
language = @language,
|
|
146
|
-
start_line = @startLine,
|
|
147
|
-
end_line = @endLine,
|
|
148
|
-
start_column = @startColumn,
|
|
149
|
-
end_column = @endColumn,
|
|
150
|
-
docstring = @docstring,
|
|
151
|
-
signature = @signature,
|
|
152
|
-
visibility = @visibility,
|
|
153
|
-
is_exported = @isExported,
|
|
154
|
-
is_async = @isAsync,
|
|
155
|
-
is_static = @isStatic,
|
|
156
|
-
is_abstract = @isAbstract,
|
|
157
|
-
decorators = @decorators,
|
|
158
|
-
type_parameters = @typeParameters,
|
|
159
|
-
updated_at = @updatedAt
|
|
160
|
-
WHERE id = @id
|
|
166
|
+
this.stmts.updateNode = this.db.prepare(`
|
|
167
|
+
UPDATE nodes SET
|
|
168
|
+
kind = @kind,
|
|
169
|
+
name = @name,
|
|
170
|
+
qualified_name = @qualifiedName,
|
|
171
|
+
file_path = @filePath,
|
|
172
|
+
language = @language,
|
|
173
|
+
start_line = @startLine,
|
|
174
|
+
end_line = @endLine,
|
|
175
|
+
start_column = @startColumn,
|
|
176
|
+
end_column = @endColumn,
|
|
177
|
+
docstring = @docstring,
|
|
178
|
+
signature = @signature,
|
|
179
|
+
visibility = @visibility,
|
|
180
|
+
is_exported = @isExported,
|
|
181
|
+
is_async = @isAsync,
|
|
182
|
+
is_static = @isStatic,
|
|
183
|
+
is_abstract = @isAbstract,
|
|
184
|
+
decorators = @decorators,
|
|
185
|
+
type_parameters = @typeParameters,
|
|
186
|
+
updated_at = @updatedAt
|
|
187
|
+
WHERE id = @id
|
|
161
188
|
`);
|
|
162
189
|
}
|
|
163
190
|
// Invalidate cache before update
|
|
164
191
|
this.nodeCache.delete(node.id);
|
|
192
|
+
// Validate required fields
|
|
193
|
+
if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
|
|
194
|
+
console.error('[CodeGraph] Skipping node update with missing required fields:', node.id);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
165
197
|
this.stmts.updateNode.run({
|
|
166
198
|
id: node.id,
|
|
167
199
|
kind: node.kind,
|
|
168
200
|
name: node.name,
|
|
169
|
-
qualifiedName: node.qualifiedName,
|
|
201
|
+
qualifiedName: node.qualifiedName ?? node.name,
|
|
170
202
|
filePath: node.filePath,
|
|
171
203
|
language: node.language,
|
|
172
|
-
startLine: node.startLine,
|
|
173
|
-
endLine: node.endLine,
|
|
174
|
-
startColumn: node.startColumn,
|
|
175
|
-
endColumn: node.endColumn,
|
|
204
|
+
startLine: node.startLine ?? 0,
|
|
205
|
+
endLine: node.endLine ?? 0,
|
|
206
|
+
startColumn: node.startColumn ?? 0,
|
|
207
|
+
endColumn: node.endColumn ?? 0,
|
|
176
208
|
docstring: node.docstring ?? null,
|
|
177
209
|
signature: node.signature ?? null,
|
|
178
210
|
visibility: node.visibility ?? null,
|
|
@@ -182,7 +214,7 @@ class QueryBuilder {
|
|
|
182
214
|
isAbstract: node.isAbstract ? 1 : 0,
|
|
183
215
|
decorators: node.decorators ? JSON.stringify(node.decorators) : null,
|
|
184
216
|
typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
|
|
185
|
-
updatedAt: node.updatedAt,
|
|
217
|
+
updatedAt: node.updatedAt ?? Date.now(),
|
|
186
218
|
});
|
|
187
219
|
}
|
|
188
220
|
/**
|
|
@@ -273,6 +305,13 @@ class QueryBuilder {
|
|
|
273
305
|
const rows = this.stmts.getNodesByKind.all(kind);
|
|
274
306
|
return rows.map(rowToNode);
|
|
275
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Get all nodes in the database
|
|
310
|
+
*/
|
|
311
|
+
getAllNodes() {
|
|
312
|
+
const rows = this.db.prepare('SELECT * FROM nodes').all();
|
|
313
|
+
return rows.map(rowToNode);
|
|
314
|
+
}
|
|
276
315
|
/**
|
|
277
316
|
* Search nodes by name using FTS with fallback to LIKE for better matching
|
|
278
317
|
*
|
|
@@ -307,11 +346,11 @@ class QueryBuilder {
|
|
|
307
346
|
if (!ftsQuery) {
|
|
308
347
|
return [];
|
|
309
348
|
}
|
|
310
|
-
let sql = `
|
|
311
|
-
SELECT nodes.*, bm25(nodes_fts) as score
|
|
312
|
-
FROM nodes_fts
|
|
313
|
-
JOIN nodes ON nodes_fts.id = nodes.id
|
|
314
|
-
WHERE nodes_fts MATCH ?
|
|
349
|
+
let sql = `
|
|
350
|
+
SELECT nodes.*, bm25(nodes_fts) as score
|
|
351
|
+
FROM nodes_fts
|
|
352
|
+
JOIN nodes ON nodes_fts.id = nodes.id
|
|
353
|
+
WHERE nodes_fts MATCH ?
|
|
315
354
|
`;
|
|
316
355
|
const params = [ftsQuery];
|
|
317
356
|
if (kinds && kinds.length > 0) {
|
|
@@ -342,21 +381,21 @@ class QueryBuilder {
|
|
|
342
381
|
*/
|
|
343
382
|
searchNodesLike(query, options) {
|
|
344
383
|
const { kinds, languages, limit = 100, offset = 0 } = options;
|
|
345
|
-
let sql = `
|
|
346
|
-
SELECT nodes.*,
|
|
347
|
-
CASE
|
|
348
|
-
WHEN name = ? THEN 1.0
|
|
349
|
-
WHEN name LIKE ? THEN 0.9
|
|
350
|
-
WHEN name LIKE ? THEN 0.8
|
|
351
|
-
WHEN qualified_name LIKE ? THEN 0.7
|
|
352
|
-
ELSE 0.5
|
|
353
|
-
END as score
|
|
354
|
-
FROM nodes
|
|
355
|
-
WHERE (
|
|
356
|
-
name LIKE ? OR
|
|
357
|
-
qualified_name LIKE ? OR
|
|
358
|
-
name LIKE ?
|
|
359
|
-
)
|
|
384
|
+
let sql = `
|
|
385
|
+
SELECT nodes.*,
|
|
386
|
+
CASE
|
|
387
|
+
WHEN name = ? THEN 1.0
|
|
388
|
+
WHEN name LIKE ? THEN 0.9
|
|
389
|
+
WHEN name LIKE ? THEN 0.8
|
|
390
|
+
WHEN qualified_name LIKE ? THEN 0.7
|
|
391
|
+
ELSE 0.5
|
|
392
|
+
END as score
|
|
393
|
+
FROM nodes
|
|
394
|
+
WHERE (
|
|
395
|
+
name LIKE ? OR
|
|
396
|
+
qualified_name LIKE ? OR
|
|
397
|
+
name LIKE ?
|
|
398
|
+
)
|
|
360
399
|
`;
|
|
361
400
|
// Pattern variants for better matching
|
|
362
401
|
const exactMatch = query;
|
|
@@ -387,6 +426,48 @@ class QueryBuilder {
|
|
|
387
426
|
score: row.score,
|
|
388
427
|
}));
|
|
389
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* Find nodes by exact name match
|
|
431
|
+
*
|
|
432
|
+
* Used for hybrid search - looks up symbols by exact name or case-insensitive match.
|
|
433
|
+
* Returns high-confidence matches for known symbol names extracted from query.
|
|
434
|
+
*
|
|
435
|
+
* @param names - Array of symbol names to look up
|
|
436
|
+
* @param options - Search options (kinds, languages, limit)
|
|
437
|
+
* @returns SearchResult array with exact matches scored at 1.0
|
|
438
|
+
*/
|
|
439
|
+
findNodesByExactName(names, options = {}) {
|
|
440
|
+
if (names.length === 0)
|
|
441
|
+
return [];
|
|
442
|
+
const { kinds, languages, limit = 50 } = options;
|
|
443
|
+
// Build query with exact matches (case-insensitive)
|
|
444
|
+
let sql = `
|
|
445
|
+
SELECT nodes.*,
|
|
446
|
+
CASE
|
|
447
|
+
WHEN name COLLATE NOCASE IN (${names.map(() => '?').join(',')}) THEN 1.0
|
|
448
|
+
ELSE 0.9
|
|
449
|
+
END as score
|
|
450
|
+
FROM nodes
|
|
451
|
+
WHERE name COLLATE NOCASE IN (${names.map(() => '?').join(',')})
|
|
452
|
+
`;
|
|
453
|
+
// Duplicate names for both SELECT and WHERE clauses
|
|
454
|
+
const params = [...names, ...names];
|
|
455
|
+
if (kinds && kinds.length > 0) {
|
|
456
|
+
sql += ` AND kind IN (${kinds.map(() => '?').join(',')})`;
|
|
457
|
+
params.push(...kinds);
|
|
458
|
+
}
|
|
459
|
+
if (languages && languages.length > 0) {
|
|
460
|
+
sql += ` AND language IN (${languages.map(() => '?').join(',')})`;
|
|
461
|
+
params.push(...languages);
|
|
462
|
+
}
|
|
463
|
+
sql += ' ORDER BY score DESC, length(name) ASC LIMIT ?';
|
|
464
|
+
params.push(limit);
|
|
465
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
466
|
+
return rows.map((row) => ({
|
|
467
|
+
node: rowToNode(row),
|
|
468
|
+
score: row.score,
|
|
469
|
+
}));
|
|
470
|
+
}
|
|
390
471
|
// ===========================================================================
|
|
391
472
|
// Edge Operations
|
|
392
473
|
// ===========================================================================
|
|
@@ -395,9 +476,9 @@ class QueryBuilder {
|
|
|
395
476
|
*/
|
|
396
477
|
insertEdge(edge) {
|
|
397
478
|
if (!this.stmts.insertEdge) {
|
|
398
|
-
this.stmts.insertEdge = this.db.prepare(`
|
|
399
|
-
INSERT INTO edges (source, target, kind, metadata, line, col)
|
|
400
|
-
VALUES (@source, @target, @kind, @metadata, @line, @col)
|
|
479
|
+
this.stmts.insertEdge = this.db.prepare(`
|
|
480
|
+
INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col)
|
|
481
|
+
VALUES (@source, @target, @kind, @metadata, @line, @col)
|
|
401
482
|
`);
|
|
402
483
|
}
|
|
403
484
|
this.stmts.insertEdge.run({
|
|
@@ -466,17 +547,17 @@ class QueryBuilder {
|
|
|
466
547
|
*/
|
|
467
548
|
upsertFile(file) {
|
|
468
549
|
if (!this.stmts.upsertFile) {
|
|
469
|
-
this.stmts.upsertFile = this.db.prepare(`
|
|
470
|
-
INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
|
|
471
|
-
VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
|
|
472
|
-
ON CONFLICT(path) DO UPDATE SET
|
|
473
|
-
content_hash = @contentHash,
|
|
474
|
-
language = @language,
|
|
475
|
-
size = @size,
|
|
476
|
-
modified_at = @modifiedAt,
|
|
477
|
-
indexed_at = @indexedAt,
|
|
478
|
-
node_count = @nodeCount,
|
|
479
|
-
errors = @errors
|
|
550
|
+
this.stmts.upsertFile = this.db.prepare(`
|
|
551
|
+
INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
|
|
552
|
+
VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
|
|
553
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
554
|
+
content_hash = @contentHash,
|
|
555
|
+
language = @language,
|
|
556
|
+
size = @size,
|
|
557
|
+
modified_at = @modifiedAt,
|
|
558
|
+
indexed_at = @indexedAt,
|
|
559
|
+
node_count = @nodeCount,
|
|
560
|
+
errors = @errors
|
|
480
561
|
`);
|
|
481
562
|
}
|
|
482
563
|
this.stmts.upsertFile.run({
|
|
@@ -540,9 +621,9 @@ class QueryBuilder {
|
|
|
540
621
|
*/
|
|
541
622
|
insertUnresolvedRef(ref) {
|
|
542
623
|
if (!this.stmts.insertUnresolved) {
|
|
543
|
-
this.stmts.insertUnresolved = this.db.prepare(`
|
|
544
|
-
INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates)
|
|
545
|
-
VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates)
|
|
624
|
+
this.stmts.insertUnresolved = this.db.prepare(`
|
|
625
|
+
INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, file_path, language, candidates)
|
|
626
|
+
VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @filePath, @language, @candidates)
|
|
546
627
|
`);
|
|
547
628
|
}
|
|
548
629
|
this.stmts.insertUnresolved.run({
|
|
@@ -551,9 +632,38 @@ class QueryBuilder {
|
|
|
551
632
|
referenceKind: ref.referenceKind,
|
|
552
633
|
line: ref.line,
|
|
553
634
|
col: ref.column,
|
|
635
|
+
filePath: ref.filePath ?? null,
|
|
636
|
+
language: ref.language ?? null,
|
|
554
637
|
candidates: ref.candidates ? JSON.stringify(ref.candidates) : null,
|
|
555
638
|
});
|
|
556
639
|
}
|
|
640
|
+
/**
|
|
641
|
+
* Insert multiple unresolved references in a single transaction
|
|
642
|
+
*/
|
|
643
|
+
insertUnresolvedRefsBatch(refs) {
|
|
644
|
+
if (refs.length === 0)
|
|
645
|
+
return;
|
|
646
|
+
if (!this.stmts.insertUnresolved) {
|
|
647
|
+
this.stmts.insertUnresolved = this.db.prepare(`
|
|
648
|
+
INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, file_path, language, candidates)
|
|
649
|
+
VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @filePath, @language, @candidates)
|
|
650
|
+
`);
|
|
651
|
+
}
|
|
652
|
+
this.db.transaction(() => {
|
|
653
|
+
for (const ref of refs) {
|
|
654
|
+
this.stmts.insertUnresolved.run({
|
|
655
|
+
fromNodeId: ref.fromNodeId,
|
|
656
|
+
referenceName: ref.referenceName,
|
|
657
|
+
referenceKind: ref.referenceKind,
|
|
658
|
+
line: ref.line,
|
|
659
|
+
col: ref.column,
|
|
660
|
+
filePath: ref.filePath ?? null,
|
|
661
|
+
language: ref.language ?? null,
|
|
662
|
+
candidates: ref.candidates ? JSON.stringify(ref.candidates) : null,
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
})();
|
|
666
|
+
}
|
|
557
667
|
/**
|
|
558
668
|
* Delete unresolved references from a node
|
|
559
669
|
*/
|
|
@@ -577,7 +687,9 @@ class QueryBuilder {
|
|
|
577
687
|
referenceKind: row.reference_kind,
|
|
578
688
|
line: row.line,
|
|
579
689
|
column: row.col,
|
|
580
|
-
|
|
690
|
+
filePath: row.file_path ?? undefined,
|
|
691
|
+
language: row.language ?? undefined,
|
|
692
|
+
candidates: row.candidates ? (0, utils_1.safeJsonParse)(row.candidates, []) : undefined,
|
|
581
693
|
}));
|
|
582
694
|
}
|
|
583
695
|
/**
|
|
@@ -591,7 +703,9 @@ class QueryBuilder {
|
|
|
591
703
|
referenceKind: row.reference_kind,
|
|
592
704
|
line: row.line,
|
|
593
705
|
column: row.col,
|
|
594
|
-
|
|
706
|
+
filePath: row.file_path ?? undefined,
|
|
707
|
+
language: row.language ?? undefined,
|
|
708
|
+
candidates: row.candidates ? (0, utils_1.safeJsonParse)(row.candidates, []) : undefined,
|
|
595
709
|
}));
|
|
596
710
|
}
|
|
597
711
|
/**
|