dbgraph 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/LICENSE +21 -0
- package/README.md +347 -0
- package/dist/bin/dbgraph.d.ts +8 -0
- package/dist/bin/dbgraph.d.ts.map +1 -0
- package/dist/bin/dbgraph.js +382 -0
- package/dist/bin/dbgraph.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +158 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +94 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +288 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +77 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +458 -0
- package/dist/context/index.js.map +1 -0
- package/dist/db/index.d.ts +26 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +127 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +8 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +39 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +46 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +436 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.sql +113 -0
- package/dist/db/sqlite-adapter.d.ts +30 -0
- package/dist/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/db/sqlite-adapter.js +78 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/directory.d.ts +37 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +160 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +46 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +90 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph/traversal.d.ts +157 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +531 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +435 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect/base.d.ts +62 -0
- package/dist/introspect/base.d.ts.map +1 -0
- package/dist/introspect/base.js +107 -0
- package/dist/introspect/base.js.map +1 -0
- package/dist/introspect/connection.d.ts +30 -0
- package/dist/introspect/connection.d.ts.map +1 -0
- package/dist/introspect/connection.js +232 -0
- package/dist/introspect/connection.js.map +1 -0
- package/dist/introspect/index.d.ts +23 -0
- package/dist/introspect/index.d.ts.map +1 -0
- package/dist/introspect/index.js +46 -0
- package/dist/introspect/index.js.map +1 -0
- package/dist/introspect/mysql.d.ts +64 -0
- package/dist/introspect/mysql.d.ts.map +1 -0
- package/dist/introspect/mysql.js +360 -0
- package/dist/introspect/mysql.js.map +1 -0
- package/dist/introspect/postgres.d.ts +55 -0
- package/dist/introspect/postgres.d.ts.map +1 -0
- package/dist/introspect/postgres.js +372 -0
- package/dist/introspect/postgres.js.map +1 -0
- package/dist/introspect/sqlite.d.ts +33 -0
- package/dist/introspect/sqlite.d.ts.map +1 -0
- package/dist/introspect/sqlite.js +207 -0
- package/dist/introspect/sqlite.js.map +1 -0
- package/dist/mcp/engine.d.ts +92 -0
- package/dist/mcp/engine.d.ts.map +1 -0
- package/dist/mcp/engine.js +261 -0
- package/dist/mcp/engine.js.map +1 -0
- package/dist/mcp/index.d.ts +33 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +119 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +9 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +71 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/session.d.ts +35 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +140 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/tools.d.ts +99 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +499 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +78 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +182 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/search/query-parser.d.ts +66 -0
- package/dist/search/query-parser.d.ts.map +1 -0
- package/dist/search/query-parser.js +163 -0
- package/dist/search/query-parser.js.map +1 -0
- package/dist/search/query-utils.d.ts +78 -0
- package/dist/search/query-utils.d.ts.map +1 -0
- package/dist/search/query-utils.js +203 -0
- package/dist/search/query-utils.js.map +1 -0
- package/dist/types.d.ts +279 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +47 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +190 -0
- package/dist/utils.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context Builder
|
|
4
|
+
*
|
|
5
|
+
* Builds rich schema context from the database knowledge graph.
|
|
6
|
+
* Composes table schemas, relationship chains, and formats them
|
|
7
|
+
* as markdown for LLM consumption.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ContextBuilder = void 0;
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// ContextBuilder
|
|
13
|
+
// =============================================================================
|
|
14
|
+
class ContextBuilder {
|
|
15
|
+
projectRoot;
|
|
16
|
+
queries;
|
|
17
|
+
traverser;
|
|
18
|
+
/**
|
|
19
|
+
* @param projectRoot - Root path of the project (used for resolving .dbgraph/)
|
|
20
|
+
* @param queries - QueryBuilder instance for raw lookups
|
|
21
|
+
* @param traverser - GraphTraverser instance for BFS / ancestor / child queries
|
|
22
|
+
*/
|
|
23
|
+
constructor(projectRoot, queries, traverser) {
|
|
24
|
+
this.projectRoot = projectRoot;
|
|
25
|
+
this.queries = queries;
|
|
26
|
+
this.traverser = traverser;
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// getTableSchema
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Build a complete TableSchema description from the graph.
|
|
33
|
+
*
|
|
34
|
+
* Resolution steps:
|
|
35
|
+
* 1. Fetch the table / view node.
|
|
36
|
+
* 2. Fetch child nodes via `contains` edges — separate columns from indexes.
|
|
37
|
+
* 3. Identify primary-key columns via `primary_key` edges.
|
|
38
|
+
* 4. Identify foreign-key columns via `references` edges on each column.
|
|
39
|
+
* 5. Collect index metadata from child index nodes.
|
|
40
|
+
* 6. Collect FK constraints via `foreign_key` edges and incoming `references`.
|
|
41
|
+
* 7. Assemble and return a TableSchema.
|
|
42
|
+
*
|
|
43
|
+
* @param nodeId - The graph node ID of the table or view.
|
|
44
|
+
*/
|
|
45
|
+
async getTableSchema(nodeId) {
|
|
46
|
+
// ---- 1. Fetch the focal node -------------------------------------------
|
|
47
|
+
const tableNode = this.queries.getNodeById(nodeId);
|
|
48
|
+
if (!tableNode) {
|
|
49
|
+
throw new Error(`Node not found: ${nodeId}`);
|
|
50
|
+
}
|
|
51
|
+
if (tableNode.kind !== 'table' && tableNode.kind !== 'view') {
|
|
52
|
+
throw new Error(`Expected table or view node, got "${tableNode.kind}" (${nodeId})`);
|
|
53
|
+
}
|
|
54
|
+
// ---- 2. Children: columns + indexes + constraints -----------------------
|
|
55
|
+
const children = this.traverser.getChildren(nodeId);
|
|
56
|
+
const columnNodes = [];
|
|
57
|
+
const indexNodes = [];
|
|
58
|
+
const constraintNodes = [];
|
|
59
|
+
for (const child of children) {
|
|
60
|
+
switch (child.kind) {
|
|
61
|
+
case 'column':
|
|
62
|
+
columnNodes.push(child);
|
|
63
|
+
break;
|
|
64
|
+
case 'index':
|
|
65
|
+
indexNodes.push(child);
|
|
66
|
+
break;
|
|
67
|
+
case 'constraint':
|
|
68
|
+
case 'foreign_key':
|
|
69
|
+
constraintNodes.push(child);
|
|
70
|
+
break;
|
|
71
|
+
// ignore other child kinds (triggers, sequences, etc.)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ---- 3. Primary-key columns ---------------------------------------------
|
|
75
|
+
const pkEdges = this.queries.getOutgoingEdges(nodeId, ['primary_key']);
|
|
76
|
+
const pkColumnIds = new Set(pkEdges.map((e) => e.target));
|
|
77
|
+
// ---- 4. Foreign-key references from columns ------------------------------
|
|
78
|
+
// `references` edges originate at foreign-key columns and point at
|
|
79
|
+
// referenced columns. We need the referenced column → its parent table.
|
|
80
|
+
const fkColumnMap = new Map();
|
|
81
|
+
for (const col of columnNodes) {
|
|
82
|
+
const refs = this.queries.getOutgoingEdges(col.id, ['references']);
|
|
83
|
+
for (const ref of refs) {
|
|
84
|
+
fkColumnMap.set(col.id, { refColumnId: ref.target });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Resolve referenced column → parent table lookups in a single batch.
|
|
88
|
+
const refColumnIds = [...new Set([...fkColumnMap.values()].map((v) => v.refColumnId))];
|
|
89
|
+
const refColumnNodes = refColumnIds.length > 0
|
|
90
|
+
? this.queries.getNodesByIds(refColumnIds)
|
|
91
|
+
: new Map();
|
|
92
|
+
// For each referenced column, find its parent table via incoming `contains`.
|
|
93
|
+
const refTableCache = new Map();
|
|
94
|
+
function resolveRefTable(colId, queries) {
|
|
95
|
+
if (refTableCache.has(colId))
|
|
96
|
+
return refTableCache.get(colId) ?? null;
|
|
97
|
+
const parents = queries.getIncomingEdges(colId, ['contains']);
|
|
98
|
+
for (const p of parents) {
|
|
99
|
+
const pNode = queries.getNodeById(p.source);
|
|
100
|
+
if (pNode && (pNode.kind === 'table' || pNode.kind === 'view')) {
|
|
101
|
+
refTableCache.set(colId, pNode);
|
|
102
|
+
return pNode;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
refTableCache.set(colId, null);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// ---- 5. Indexes ---------------------------------------------------------
|
|
109
|
+
const indexes = [];
|
|
110
|
+
for (const idx of indexNodes) {
|
|
111
|
+
const meta = idx.metadata ?? {};
|
|
112
|
+
const idxCols = Array.isArray(meta.columns)
|
|
113
|
+
? meta.columns
|
|
114
|
+
: this._getIndexedColumnNames(idx, columnNodes);
|
|
115
|
+
indexes.push({
|
|
116
|
+
name: idx.name,
|
|
117
|
+
columns: idxCols,
|
|
118
|
+
unique: meta.unique ?? false,
|
|
119
|
+
primary: meta.primary ?? false,
|
|
120
|
+
method: meta.method ?? undefined,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// ---- 6. Foreign-key constraints -----------------------------------------
|
|
124
|
+
const foreignKeys = [];
|
|
125
|
+
// 6a. Direct foreign_key edges (table → table constraint nodes)
|
|
126
|
+
const fkConstraintEdges = this.queries.getOutgoingEdges(nodeId, ['foreign_key']);
|
|
127
|
+
for (const fkEdge of fkConstraintEdges) {
|
|
128
|
+
const fkNode = this.queries.getNodeById(fkEdge.target);
|
|
129
|
+
if (!fkNode)
|
|
130
|
+
continue;
|
|
131
|
+
const meta = fkNode.metadata ?? {};
|
|
132
|
+
foreignKeys.push({
|
|
133
|
+
constraintName: fkNode.name,
|
|
134
|
+
columns: Array.isArray(meta.columns)
|
|
135
|
+
? meta.columns
|
|
136
|
+
: [],
|
|
137
|
+
referencedTable: meta.referencedTable ?? fkNode.qualifiedName,
|
|
138
|
+
referencedColumns: Array.isArray(meta.referencedColumns)
|
|
139
|
+
? meta.referencedColumns
|
|
140
|
+
: [],
|
|
141
|
+
onDelete: meta.onDelete ?? undefined,
|
|
142
|
+
onUpdate: meta.onUpdate ?? undefined,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// 6b. Derive FK info from column-level `references` edges when no
|
|
146
|
+
// constraint node exists.
|
|
147
|
+
for (const col of columnNodes) {
|
|
148
|
+
const entry = fkColumnMap.get(col.id);
|
|
149
|
+
if (!entry)
|
|
150
|
+
continue;
|
|
151
|
+
const refColNode = refColumnNodes.get(entry.refColumnId);
|
|
152
|
+
if (!refColNode)
|
|
153
|
+
continue;
|
|
154
|
+
const refTable = resolveRefTable(refColNode.id, this.queries);
|
|
155
|
+
// Avoid duplicating a constraint that was already captured above.
|
|
156
|
+
const refTableName = refTable?.qualifiedName ?? refColNode.qualifiedName;
|
|
157
|
+
const alreadyAdded = foreignKeys.some((fk) => fk.columns.length === 1 &&
|
|
158
|
+
fk.columns[0] === col.name &&
|
|
159
|
+
fk.referencedTable === refTableName);
|
|
160
|
+
if (alreadyAdded)
|
|
161
|
+
continue;
|
|
162
|
+
// Name derived from column name and referenced table
|
|
163
|
+
const constraintName = `fk_${tableNode.name}_${col.name}`;
|
|
164
|
+
foreignKeys.push({
|
|
165
|
+
constraintName,
|
|
166
|
+
columns: [col.name],
|
|
167
|
+
referencedTable: refTableName,
|
|
168
|
+
referencedColumns: [refColNode.name],
|
|
169
|
+
onDelete: undefined,
|
|
170
|
+
onUpdate: undefined,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// ---- 7. Assemble columns ------------------------------------------------
|
|
174
|
+
const primaryKeyColumns = columnNodes
|
|
175
|
+
.filter((c) => pkColumnIds.has(c.id))
|
|
176
|
+
.map((c) => c.name);
|
|
177
|
+
const columns = columnNodes.map((col) => {
|
|
178
|
+
const meta = col.metadata ?? {};
|
|
179
|
+
const fkEntry = fkColumnMap.get(col.id);
|
|
180
|
+
return {
|
|
181
|
+
name: col.name,
|
|
182
|
+
dataType: this._columnDataType(col, meta),
|
|
183
|
+
isNullable: this._columnIsNullable(col, meta),
|
|
184
|
+
defaultValue: this._columnDefault(col, meta),
|
|
185
|
+
isPrimaryKey: pkColumnIds.has(col.id),
|
|
186
|
+
maxLength: meta.maxLength ?? undefined,
|
|
187
|
+
numericPrecision: meta.numericPrecision ?? undefined,
|
|
188
|
+
numericScale: meta.numericScale ?? undefined,
|
|
189
|
+
comment: col.docstring,
|
|
190
|
+
charSet: meta.charSet ?? undefined,
|
|
191
|
+
collation: meta.collation ?? undefined,
|
|
192
|
+
autoIncrement: meta.autoIncrement ?? undefined,
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
// ---- 8. Return ----------------------------------------------------------
|
|
196
|
+
return {
|
|
197
|
+
name: tableNode.name,
|
|
198
|
+
qualifiedName: tableNode.qualifiedName,
|
|
199
|
+
source: tableNode.filePath,
|
|
200
|
+
comment: tableNode.docstring,
|
|
201
|
+
columns,
|
|
202
|
+
primaryKey: primaryKeyColumns,
|
|
203
|
+
foreignKeys,
|
|
204
|
+
indexes,
|
|
205
|
+
kind: tableNode.kind === 'view' ? 'view' : 'table',
|
|
206
|
+
definition: tableNode.signature ?? undefined,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// buildContext
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Build a markdown context string for a table or view.
|
|
214
|
+
*
|
|
215
|
+
* Accepts either:
|
|
216
|
+
* - A graph node ID (exact `id` lookup)
|
|
217
|
+
* - A qualified or simple name (searched via `searchNodes`)
|
|
218
|
+
*
|
|
219
|
+
* The output includes:
|
|
220
|
+
* - Full table schema (columns, PKs, FKs, indexes)
|
|
221
|
+
* - Parent hierarchy (database → schema → table)
|
|
222
|
+
* - Tables that reference this table (incoming FK relationships)
|
|
223
|
+
*
|
|
224
|
+
* @param tableNameOrId - Table name, qualified name, or graph node ID.
|
|
225
|
+
*/
|
|
226
|
+
async buildContext(tableNameOrId) {
|
|
227
|
+
// ------------------------------------------------------------------
|
|
228
|
+
// 1. Resolve node
|
|
229
|
+
// ------------------------------------------------------------------
|
|
230
|
+
let tableNode = this.queries.getNodeById(tableNameOrId);
|
|
231
|
+
if (!tableNode) {
|
|
232
|
+
// Try qualified-name lookup first, then fall back to full-text search
|
|
233
|
+
const exact = this.queries.getNodesByQualifiedName(tableNameOrId);
|
|
234
|
+
if (exact.length > 0) {
|
|
235
|
+
tableNode = exact[0];
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
const results = this.queries.searchNodes(tableNameOrId, {
|
|
239
|
+
kinds: ['table', 'view'],
|
|
240
|
+
limit: 10,
|
|
241
|
+
});
|
|
242
|
+
// Pick the highest-scoring table/view
|
|
243
|
+
const match = results.find((r) => r.node.kind === 'table' || r.node.kind === 'view');
|
|
244
|
+
if (!match) {
|
|
245
|
+
return `**Error:** No table or view found matching "${tableNameOrId}".`;
|
|
246
|
+
}
|
|
247
|
+
tableNode = match.node;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (tableNode.kind !== 'table' && tableNode.kind !== 'view') {
|
|
251
|
+
return `**Error:** "${tableNode.name}" is a **${tableNode.kind}**, not a table or view.`;
|
|
252
|
+
}
|
|
253
|
+
// ------------------------------------------------------------------
|
|
254
|
+
// 2. Build TableSchema
|
|
255
|
+
// ------------------------------------------------------------------
|
|
256
|
+
const schema = await this.getTableSchema(tableNode.id);
|
|
257
|
+
// ------------------------------------------------------------------
|
|
258
|
+
// 3. Ancestor chain (database → schema → table)
|
|
259
|
+
// ------------------------------------------------------------------
|
|
260
|
+
const ancestors = this.traverser.getAncestors(tableNode.id);
|
|
261
|
+
const hierarchy = ancestors
|
|
262
|
+
.filter((a) => a.kind === 'database' || a.kind === 'schema')
|
|
263
|
+
.map((a) => `${a.kind}: ${a.name}`);
|
|
264
|
+
// ------------------------------------------------------------------
|
|
265
|
+
// 4. Inbound references (tables that have FKs pointing at us)
|
|
266
|
+
// ------------------------------------------------------------------
|
|
267
|
+
const incomingRefs = this.queries.getIncomingEdges(tableNode.id, [
|
|
268
|
+
'foreign_key',
|
|
269
|
+
'references',
|
|
270
|
+
]);
|
|
271
|
+
const inboundTableIds = new Set();
|
|
272
|
+
const inboundRefLines = [];
|
|
273
|
+
for (const ref of incomingRefs) {
|
|
274
|
+
const sourceNode = this.queries.getNodeById(ref.source);
|
|
275
|
+
if (!sourceNode)
|
|
276
|
+
continue;
|
|
277
|
+
const tblId = sourceNode.kind === 'column'
|
|
278
|
+
? this._parentTableId(sourceNode)
|
|
279
|
+
: sourceNode.kind === 'foreign_key' || sourceNode.kind === 'constraint'
|
|
280
|
+
? null
|
|
281
|
+
: sourceNode.id;
|
|
282
|
+
if (tblId && !inboundTableIds.has(tblId)) {
|
|
283
|
+
inboundTableIds.add(tblId);
|
|
284
|
+
const tbl = this.queries.getNodeById(tblId);
|
|
285
|
+
if (tbl) {
|
|
286
|
+
inboundRefLines.push(`- \`${tbl.qualifiedName}\``);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ------------------------------------------------------------------
|
|
291
|
+
// 5. Format markdown
|
|
292
|
+
// ------------------------------------------------------------------
|
|
293
|
+
const lines = [];
|
|
294
|
+
const header = schema.kind === 'view' ? 'View' : 'Table';
|
|
295
|
+
lines.push(`## ${header}: ${schema.qualifiedName}`);
|
|
296
|
+
lines.push('');
|
|
297
|
+
if (hierarchy.length > 0) {
|
|
298
|
+
lines.push(`**Path:** ${hierarchy.join(' › ')}`);
|
|
299
|
+
lines.push('');
|
|
300
|
+
}
|
|
301
|
+
// Database source line
|
|
302
|
+
const dbEngine = tableNode.language ?? 'unknown';
|
|
303
|
+
const sourceLabel = schema.source.replace(/^db:\/\//, '');
|
|
304
|
+
lines.push(`**Source:** ${sourceLabel} (${dbEngine})`);
|
|
305
|
+
if (schema.comment) {
|
|
306
|
+
lines.push('');
|
|
307
|
+
lines.push(`> ${schema.comment}`);
|
|
308
|
+
}
|
|
309
|
+
lines.push('');
|
|
310
|
+
// Columns table
|
|
311
|
+
lines.push('### Columns');
|
|
312
|
+
lines.push('');
|
|
313
|
+
lines.push('| # | Column | Type | Nullable | Default | PK | FK | Comment |');
|
|
314
|
+
lines.push('|---|--------|------|----------|---------|----|----|---------|');
|
|
315
|
+
schema.columns.forEach((col, i) => {
|
|
316
|
+
const fk = schema.foreignKeys.find((fk) => fk.columns.includes(col.name));
|
|
317
|
+
const fkDisplay = fk
|
|
318
|
+
? `${fk.referencedTable}(${fk.referencedColumns.join(',')})`
|
|
319
|
+
: '';
|
|
320
|
+
const defaultDisplay = col.defaultValue ?? '';
|
|
321
|
+
const commentDisplay = col.comment ?? '';
|
|
322
|
+
lines.push(`| ${i + 1} | ${col.name} | ${col.dataType} | ${col.isNullable ? 'YES' : 'NO'} | ${defaultDisplay} | ${col.isPrimaryKey ? 'PK' : ''} | ${fkDisplay} | ${commentDisplay} |`);
|
|
323
|
+
});
|
|
324
|
+
lines.push('');
|
|
325
|
+
// Primary key
|
|
326
|
+
if (schema.primaryKey.length > 0) {
|
|
327
|
+
lines.push(`**Primary Key:** ${schema.primaryKey.join(', ')}`);
|
|
328
|
+
lines.push('');
|
|
329
|
+
}
|
|
330
|
+
// Indexes
|
|
331
|
+
if (schema.indexes.length > 0) {
|
|
332
|
+
lines.push('### Indexes');
|
|
333
|
+
lines.push('');
|
|
334
|
+
lines.push('| Name | Columns | Unique | Method |');
|
|
335
|
+
lines.push('|------|---------|--------|--------|');
|
|
336
|
+
for (const idx of schema.indexes) {
|
|
337
|
+
lines.push(`| ${idx.name} | ${idx.columns.join(', ')} | ${idx.unique ? 'YES' : 'NO'} | ${idx.method ?? 'btree'} |`);
|
|
338
|
+
}
|
|
339
|
+
lines.push('');
|
|
340
|
+
}
|
|
341
|
+
// Foreign keys
|
|
342
|
+
if (schema.foreignKeys.length > 0) {
|
|
343
|
+
lines.push('### Foreign Keys');
|
|
344
|
+
lines.push('');
|
|
345
|
+
lines.push('| Constraint | Columns | References | On Delete | On Update |');
|
|
346
|
+
lines.push('|------------|---------|------------|-----------|-----------|');
|
|
347
|
+
for (const fk of schema.foreignKeys) {
|
|
348
|
+
const cols = fk.columns.join(', ');
|
|
349
|
+
const refs = `${fk.referencedTable}(${fk.referencedColumns.join(', ')})`;
|
|
350
|
+
lines.push(`| ${fk.constraintName} | ${cols} | ${refs} | ${fk.onDelete ?? ''} | ${fk.onUpdate ?? ''} |`);
|
|
351
|
+
}
|
|
352
|
+
lines.push('');
|
|
353
|
+
}
|
|
354
|
+
// Inbound references
|
|
355
|
+
if (inboundRefLines.length > 0) {
|
|
356
|
+
lines.push('### Referenced By');
|
|
357
|
+
lines.push('');
|
|
358
|
+
for (const r of inboundRefLines)
|
|
359
|
+
lines.push(r);
|
|
360
|
+
lines.push('');
|
|
361
|
+
}
|
|
362
|
+
// View definition
|
|
363
|
+
if (schema.definition) {
|
|
364
|
+
lines.push('### Definition');
|
|
365
|
+
lines.push('');
|
|
366
|
+
lines.push('```sql');
|
|
367
|
+
lines.push(schema.definition);
|
|
368
|
+
lines.push('```');
|
|
369
|
+
lines.push('');
|
|
370
|
+
}
|
|
371
|
+
return lines.join('\n');
|
|
372
|
+
}
|
|
373
|
+
// ---------------------------------------------------------------------------
|
|
374
|
+
// Private helpers
|
|
375
|
+
// ---------------------------------------------------------------------------
|
|
376
|
+
/**
|
|
377
|
+
* Extract the parent table ID for a column node by tracing its incoming
|
|
378
|
+
* `contains` edge.
|
|
379
|
+
*/
|
|
380
|
+
_parentTableId(columnNode) {
|
|
381
|
+
const parents = this.queries.getIncomingEdges(columnNode.id, ['contains']);
|
|
382
|
+
for (const p of parents) {
|
|
383
|
+
const pNode = this.queries.getNodeById(p.source);
|
|
384
|
+
if (pNode && (pNode.kind === 'table' || pNode.kind === 'view')) {
|
|
385
|
+
return pNode.id;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Resolve the data type for a column node.
|
|
392
|
+
* Priority: metadata.dataType → parse from signature → "unknown".
|
|
393
|
+
*/
|
|
394
|
+
_columnDataType(col, meta) {
|
|
395
|
+
if (typeof meta.dataType === 'string' && meta.dataType.length > 0) {
|
|
396
|
+
return meta.dataType;
|
|
397
|
+
}
|
|
398
|
+
if (col.signature) {
|
|
399
|
+
// Common signature formats:
|
|
400
|
+
// "integer NOT NULL DEFAULT 0"
|
|
401
|
+
// "varchar(255)"
|
|
402
|
+
// "numeric(12,4)"
|
|
403
|
+
const typePart = col.signature.split(/\s+/)[0];
|
|
404
|
+
if (typePart)
|
|
405
|
+
return typePart;
|
|
406
|
+
}
|
|
407
|
+
return 'unknown';
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Determine whether a column is nullable.
|
|
411
|
+
* Priority: metadata.isNullable → parse from signature → true.
|
|
412
|
+
*/
|
|
413
|
+
_columnIsNullable(col, meta) {
|
|
414
|
+
if (typeof meta.isNullable === 'boolean')
|
|
415
|
+
return meta.isNullable;
|
|
416
|
+
if (col.signature) {
|
|
417
|
+
const upper = col.signature.toUpperCase();
|
|
418
|
+
if (upper.includes('NOT NULL'))
|
|
419
|
+
return false;
|
|
420
|
+
if (upper.includes('NULL'))
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Extract default value for a column.
|
|
427
|
+
* Priority: metadata.defaultValue → parse from signature.
|
|
428
|
+
*/
|
|
429
|
+
_columnDefault(col, meta) {
|
|
430
|
+
if (typeof meta.defaultValue === 'string' && meta.defaultValue.length > 0) {
|
|
431
|
+
return meta.defaultValue;
|
|
432
|
+
}
|
|
433
|
+
if (col.signature) {
|
|
434
|
+
// Match DEFAULT <value> (stops at next keyword or end)
|
|
435
|
+
const match = col.signature.match(/\bDEFAULT\s+('(?:[^']|'')*'|[^\s,)]+)/i);
|
|
436
|
+
if (match)
|
|
437
|
+
return match[1];
|
|
438
|
+
}
|
|
439
|
+
return undefined;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Derive which columns an index covers by looking at the index node's
|
|
443
|
+
* metadata or its `indexed_by` edges to column nodes.
|
|
444
|
+
*/
|
|
445
|
+
_getIndexedColumnNames(indexNode, tableColumns) {
|
|
446
|
+
// Prefer metadata.columns
|
|
447
|
+
const meta = indexNode.metadata ?? {};
|
|
448
|
+
if (Array.isArray(meta.columns)) {
|
|
449
|
+
return meta.columns;
|
|
450
|
+
}
|
|
451
|
+
if (typeof meta.column === 'string') {
|
|
452
|
+
return [meta.column];
|
|
453
|
+
}
|
|
454
|
+
return [];
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
exports.ContextBuilder = ContextBuilder;
|
|
458
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Layer
|
|
3
|
+
*/
|
|
4
|
+
import { SqliteDatabase, SqliteBackend } from './sqlite-adapter';
|
|
5
|
+
export { SqliteDatabase, SqliteBackend } from './sqlite-adapter';
|
|
6
|
+
export declare class DatabaseConnection {
|
|
7
|
+
private db;
|
|
8
|
+
private dbPath;
|
|
9
|
+
private backend;
|
|
10
|
+
private constructor();
|
|
11
|
+
static initialize(dbPath: string): DatabaseConnection;
|
|
12
|
+
static open(dbPath: string): DatabaseConnection;
|
|
13
|
+
getDb(): SqliteDatabase;
|
|
14
|
+
getBackend(): SqliteBackend;
|
|
15
|
+
getPath(): string;
|
|
16
|
+
getJournalMode(): string;
|
|
17
|
+
transaction<T>(fn: () => T): T;
|
|
18
|
+
getSize(): number;
|
|
19
|
+
optimize(): void;
|
|
20
|
+
runMaintenance(): void;
|
|
21
|
+
close(): void;
|
|
22
|
+
isOpen(): boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare const DATABASE_FILENAME = "dbgraph.db";
|
|
25
|
+
export declare function getDatabasePath(projectRoot: string): string;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAKjF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYjE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAE/B,OAAO;IAMP,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAuBrD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAiB/C,KAAK,IAAI,cAAc;IACvB,UAAU,IAAI,aAAa;IAC3B,OAAO,IAAI,MAAM;IAEjB,cAAc,IAAI,MAAM;IASxB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAC9B,OAAO,IAAI,MAAM;IAEjB,QAAQ,IAAI,IAAI;IAKhB,cAAc,IAAI,IAAI;IAKtB,KAAK,IAAI,IAAI;IACb,MAAM,IAAI,OAAO;CAClB;AAED,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database Layer
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DATABASE_FILENAME = exports.DatabaseConnection = void 0;
|
|
40
|
+
exports.getDatabasePath = getDatabasePath;
|
|
41
|
+
const sqlite_adapter_1 = require("./sqlite-adapter");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const migrations_1 = require("./migrations");
|
|
45
|
+
function configureConnection(db) {
|
|
46
|
+
db.pragma('foreign_keys = ON');
|
|
47
|
+
db.pragma('busy_timeout = 5000');
|
|
48
|
+
db.pragma('journal_mode = WAL');
|
|
49
|
+
db.pragma('synchronous = NORMAL');
|
|
50
|
+
db.pragma('cache_size = -64000');
|
|
51
|
+
db.pragma('temp_store = MEMORY');
|
|
52
|
+
db.pragma('mmap_size = 268435456');
|
|
53
|
+
}
|
|
54
|
+
class DatabaseConnection {
|
|
55
|
+
db;
|
|
56
|
+
dbPath;
|
|
57
|
+
backend;
|
|
58
|
+
constructor(db, dbPath, backend) {
|
|
59
|
+
this.db = db;
|
|
60
|
+
this.dbPath = dbPath;
|
|
61
|
+
this.backend = backend;
|
|
62
|
+
}
|
|
63
|
+
static initialize(dbPath) {
|
|
64
|
+
const dir = path.dirname(dbPath);
|
|
65
|
+
if (!fs.existsSync(dir)) {
|
|
66
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
const { db, backend } = (0, sqlite_adapter_1.createDatabase)(dbPath);
|
|
69
|
+
configureConnection(db);
|
|
70
|
+
const schemaPath = path.join(__dirname, 'schema.sql');
|
|
71
|
+
const schema = fs.readFileSync(schemaPath, 'utf-8');
|
|
72
|
+
db.exec(schema);
|
|
73
|
+
const currentVersion = (0, migrations_1.getCurrentVersion)(db);
|
|
74
|
+
if (currentVersion < migrations_1.CURRENT_SCHEMA_VERSION) {
|
|
75
|
+
db.prepare('INSERT OR IGNORE INTO schema_versions (version, applied_at, description) VALUES (?, ?, ?)').run(migrations_1.CURRENT_SCHEMA_VERSION, Date.now(), 'Initial schema includes all migrations');
|
|
76
|
+
}
|
|
77
|
+
return new DatabaseConnection(db, dbPath, backend);
|
|
78
|
+
}
|
|
79
|
+
static open(dbPath) {
|
|
80
|
+
if (!fs.existsSync(dbPath)) {
|
|
81
|
+
throw new Error(`Database not found: ${dbPath}`);
|
|
82
|
+
}
|
|
83
|
+
const { db, backend } = (0, sqlite_adapter_1.createDatabase)(dbPath);
|
|
84
|
+
configureConnection(db);
|
|
85
|
+
const conn = new DatabaseConnection(db, dbPath, backend);
|
|
86
|
+
const currentVersion = (0, migrations_1.getCurrentVersion)(db);
|
|
87
|
+
if (currentVersion < migrations_1.CURRENT_SCHEMA_VERSION) {
|
|
88
|
+
(0, migrations_1.runMigrations)(db, currentVersion);
|
|
89
|
+
}
|
|
90
|
+
return conn;
|
|
91
|
+
}
|
|
92
|
+
getDb() { return this.db; }
|
|
93
|
+
getBackend() { return this.backend; }
|
|
94
|
+
getPath() { return this.dbPath; }
|
|
95
|
+
getJournalMode() {
|
|
96
|
+
const raw = this.db.pragma('journal_mode');
|
|
97
|
+
const row = Array.isArray(raw) ? raw[0] : raw;
|
|
98
|
+
const mode = row && typeof row === 'object'
|
|
99
|
+
? row.journal_mode
|
|
100
|
+
: row;
|
|
101
|
+
return String(mode ?? '').toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
transaction(fn) { return this.db.transaction(fn)(); }
|
|
104
|
+
getSize() { return fs.statSync(this.dbPath).size; }
|
|
105
|
+
optimize() {
|
|
106
|
+
this.db.exec('VACUUM');
|
|
107
|
+
this.db.exec('ANALYZE');
|
|
108
|
+
}
|
|
109
|
+
runMaintenance() {
|
|
110
|
+
try {
|
|
111
|
+
this.db.exec('PRAGMA optimize');
|
|
112
|
+
}
|
|
113
|
+
catch { /* ignore */ }
|
|
114
|
+
try {
|
|
115
|
+
this.db.exec('PRAGMA wal_checkpoint(PASSIVE)');
|
|
116
|
+
}
|
|
117
|
+
catch { /* ignore */ }
|
|
118
|
+
}
|
|
119
|
+
close() { this.db.close(); }
|
|
120
|
+
isOpen() { return this.db.open; }
|
|
121
|
+
}
|
|
122
|
+
exports.DatabaseConnection = DatabaseConnection;
|
|
123
|
+
exports.DATABASE_FILENAME = 'dbgraph.db';
|
|
124
|
+
function getDatabasePath(projectRoot) {
|
|
125
|
+
return path.join(projectRoot, '.dbgraph', exports.DATABASE_FILENAME);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Migrations
|
|
3
|
+
*/
|
|
4
|
+
import { SqliteDatabase } from './sqlite-adapter';
|
|
5
|
+
export declare const CURRENT_SCHEMA_VERSION = 1;
|
|
6
|
+
export declare function getCurrentVersion(db: SqliteDatabase): number;
|
|
7
|
+
export declare function runMigrations(db: SqliteDatabase, fromVersion: number): void;
|
|
8
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAYxC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAS5D;AAQD,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAU3E"}
|