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,382 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* DBGraph CLI
|
|
5
|
+
*
|
|
6
|
+
* Command-line interface for the database knowledge graph.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
const index_1 = require("../index");
|
|
46
|
+
const config_1 = require("../config");
|
|
47
|
+
const formatter_1 = require("../context/formatter");
|
|
48
|
+
const introspect_1 = require("../introspect");
|
|
49
|
+
const mcp_1 = require("../mcp");
|
|
50
|
+
const program = new commander_1.Command();
|
|
51
|
+
program
|
|
52
|
+
.name('dbgraph')
|
|
53
|
+
.description('Database knowledge graph for LLM-powered SQL generation')
|
|
54
|
+
.version('0.1.0');
|
|
55
|
+
// ===========================================================================
|
|
56
|
+
// init
|
|
57
|
+
// ===========================================================================
|
|
58
|
+
program
|
|
59
|
+
.command('init')
|
|
60
|
+
.description('Initialize a .dbgraph project (create directory + config + optional index)')
|
|
61
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
62
|
+
.option('-c, --config <path>', 'Path to dbgraph-db.json config file')
|
|
63
|
+
.option('--index', 'Run initial indexing after init')
|
|
64
|
+
.action(async (directory, opts) => {
|
|
65
|
+
const projectRoot = path.resolve(directory);
|
|
66
|
+
// Check not already initialized
|
|
67
|
+
if (index_1.DBGraph.isInitialized(projectRoot)) {
|
|
68
|
+
console.error(`DBGraph already initialized in ${projectRoot}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
// Check if config exists or needs to be created
|
|
72
|
+
const configPath = opts.config || path.join(projectRoot, config_1.CONFIG_FILENAME);
|
|
73
|
+
if (!fs.existsSync(configPath)) {
|
|
74
|
+
console.log(`No ${config_1.CONFIG_FILENAME} found. Creating default config...`);
|
|
75
|
+
fs.writeFileSync(configPath, (0, config_1.generateDefaultConfig)(), 'utf-8');
|
|
76
|
+
console.log(`Created ${configPath}`);
|
|
77
|
+
console.log('Edit this file to add your database connections, then run: dbgraph index');
|
|
78
|
+
}
|
|
79
|
+
console.log(`Initializing DBGraph in ${projectRoot}...`);
|
|
80
|
+
const cg = await index_1.DBGraph.init(projectRoot, {
|
|
81
|
+
config: configPath,
|
|
82
|
+
index: opts.index,
|
|
83
|
+
onProgress: (msg, current, total) => {
|
|
84
|
+
process.stdout.write(`\r${msg} [${current}/${total}]`);
|
|
85
|
+
if (current >= total)
|
|
86
|
+
process.stdout.write('\n');
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
console.log('Done.');
|
|
90
|
+
console.log(`Data directory: ${projectRoot}${path.sep}.dbgraph`);
|
|
91
|
+
cg.close();
|
|
92
|
+
});
|
|
93
|
+
// ===========================================================================
|
|
94
|
+
// index
|
|
95
|
+
// ===========================================================================
|
|
96
|
+
program
|
|
97
|
+
.command('index')
|
|
98
|
+
.description('Run database introspection to populate the knowledge graph')
|
|
99
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
100
|
+
.option('-c, --config <path>', 'Path to dbgraph-db.json config file')
|
|
101
|
+
.action(async (directory, opts) => {
|
|
102
|
+
const projectRoot = path.resolve(directory);
|
|
103
|
+
if (!index_1.DBGraph.isInitialized(projectRoot)) {
|
|
104
|
+
console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
const cg = await index_1.DBGraph.open(projectRoot);
|
|
108
|
+
// Override config if specified
|
|
109
|
+
if (opts.config) {
|
|
110
|
+
cg.setConfig((0, config_1.loadConfig)(opts.config));
|
|
111
|
+
}
|
|
112
|
+
if (!cg.getConfig()) {
|
|
113
|
+
// Try auto-discovering config
|
|
114
|
+
const configPath = (0, config_1.findConfigFile)(projectRoot);
|
|
115
|
+
if (configPath) {
|
|
116
|
+
cg.setConfig((0, config_1.loadConfig)(configPath));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.error('No database configuration found.');
|
|
120
|
+
console.error(`Create a ${config_1.CONFIG_FILENAME} file or pass --config.`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const config = cg.getConfig();
|
|
125
|
+
console.log(`Found ${config.databases.length} database(s) configured:\n`);
|
|
126
|
+
for (const db of config.databases) {
|
|
127
|
+
const hostPort = db.host ? `${db.host}:${db.port || 'default'}` : 'local';
|
|
128
|
+
const schemas = db.schemas?.length ? ` (schemas: ${db.schemas.join(', ')})` : '';
|
|
129
|
+
console.log(` ${db.alias.padEnd(20)} ${db.engine.padEnd(12)} ${hostPort}/${db.database}${schemas}`);
|
|
130
|
+
}
|
|
131
|
+
console.log('\nRunning introspection...\n');
|
|
132
|
+
const result = await cg.indexAll({
|
|
133
|
+
onProgress: (msg, current, total) => {
|
|
134
|
+
process.stdout.write(`\r${msg} [${current}/${total}]`);
|
|
135
|
+
if (current >= total)
|
|
136
|
+
process.stdout.write('\n');
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
console.log('\nIndexing complete:');
|
|
140
|
+
console.log(` Sources indexed: ${result.sourcesIndexed}`);
|
|
141
|
+
console.log(` Nodes created: ${result.nodesCreated}`);
|
|
142
|
+
console.log(` Edges created: ${result.edgesCreated}`);
|
|
143
|
+
if (result.errors.length > 0) {
|
|
144
|
+
console.log('\nErrors:');
|
|
145
|
+
for (const err of result.errors) {
|
|
146
|
+
console.log(` ⚠ ${err}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
cg.close();
|
|
150
|
+
});
|
|
151
|
+
// ===========================================================================
|
|
152
|
+
// serve (MCP)
|
|
153
|
+
// ===========================================================================
|
|
154
|
+
program
|
|
155
|
+
.command('serve')
|
|
156
|
+
.description('Start the MCP server (stdio mode for AI agents)')
|
|
157
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
158
|
+
.option('--mcp', 'Start in MCP mode (default)', true)
|
|
159
|
+
.option('--daemon', 'Start as a background daemon process')
|
|
160
|
+
.option('--path <path>', 'Explicit project path (for agents that don\'t set rootUri)')
|
|
161
|
+
.option('--auto-refresh', 'Check & re-index database schemas on each MCP tool call', false)
|
|
162
|
+
.action(async (directory, opts) => {
|
|
163
|
+
const projectRoot = path.resolve(directory);
|
|
164
|
+
// Don't crash if not initialized — MCP engine handles this gracefully
|
|
165
|
+
// via background init + lazy retry. Tool calls will return proper errors
|
|
166
|
+
// until the user runs `dbgraph init`.
|
|
167
|
+
const server = new mcp_1.MCPServer({
|
|
168
|
+
projectPath: opts.path || projectRoot,
|
|
169
|
+
autoRefresh: opts.autoRefresh,
|
|
170
|
+
});
|
|
171
|
+
if (opts.daemon) {
|
|
172
|
+
console.error('Starting DBGraph daemon...');
|
|
173
|
+
await server.startDaemon(projectRoot);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
server.start();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// ===========================================================================
|
|
180
|
+
// query / search
|
|
181
|
+
// ===========================================================================
|
|
182
|
+
program
|
|
183
|
+
.command('query')
|
|
184
|
+
.description('Search the database knowledge graph')
|
|
185
|
+
.argument('<query>', 'Search term')
|
|
186
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
187
|
+
.option('-k, --kind <kind>', 'Filter by node kind (table, column, view, index, constraint)')
|
|
188
|
+
.option('-l, --limit <number>', 'Maximum results', '20')
|
|
189
|
+
.option('--json', 'Output as JSON')
|
|
190
|
+
.action(async (query, directory, opts) => {
|
|
191
|
+
const projectRoot = path.resolve(directory);
|
|
192
|
+
if (!index_1.DBGraph.isInitialized(projectRoot)) {
|
|
193
|
+
console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
const cg = index_1.DBGraph.openSync(projectRoot);
|
|
197
|
+
const limit = parseInt(opts.limit || '20', 10);
|
|
198
|
+
const results = cg.searchNodes(query, {
|
|
199
|
+
kinds: opts.kind ? [opts.kind] : undefined,
|
|
200
|
+
limit,
|
|
201
|
+
});
|
|
202
|
+
if (opts.json) {
|
|
203
|
+
console.log(JSON.stringify(results, null, 2));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const formatter = new formatter_1.SchemaFormatter();
|
|
207
|
+
console.log(formatter.formatSearchResults(results));
|
|
208
|
+
}
|
|
209
|
+
cg.close();
|
|
210
|
+
});
|
|
211
|
+
// ===========================================================================
|
|
212
|
+
// context
|
|
213
|
+
// ===========================================================================
|
|
214
|
+
program
|
|
215
|
+
.command('context')
|
|
216
|
+
.description('Show full schema context for a table')
|
|
217
|
+
.argument('<name>', 'Table name or qualified name')
|
|
218
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
219
|
+
.action(async (name, directory) => {
|
|
220
|
+
const projectRoot = path.resolve(directory);
|
|
221
|
+
if (!index_1.DBGraph.isInitialized(projectRoot)) {
|
|
222
|
+
console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
const cg = index_1.DBGraph.openSync(projectRoot);
|
|
226
|
+
const context = await cg.buildContext(name);
|
|
227
|
+
console.log(context);
|
|
228
|
+
cg.close();
|
|
229
|
+
});
|
|
230
|
+
// ===========================================================================
|
|
231
|
+
// status
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
program
|
|
234
|
+
.command('status')
|
|
235
|
+
.description('Show DBGraph status and statistics')
|
|
236
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
237
|
+
.action(async (directory) => {
|
|
238
|
+
const projectRoot = path.resolve(directory);
|
|
239
|
+
if (!index_1.DBGraph.isInitialized(projectRoot)) {
|
|
240
|
+
console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
const cg = index_1.DBGraph.openSync(projectRoot);
|
|
244
|
+
const stats = cg.getStats();
|
|
245
|
+
const sources = cg.getSources();
|
|
246
|
+
const configPath = (0, config_1.findConfigFile)(projectRoot);
|
|
247
|
+
console.log('\n=== DBGraph Status ===\n');
|
|
248
|
+
if (configPath) {
|
|
249
|
+
console.log(`Config: ${configPath}`);
|
|
250
|
+
}
|
|
251
|
+
console.log(`Project root: ${projectRoot}`);
|
|
252
|
+
console.log(`DBGraph dir: ${projectRoot}${path.sep}.dbgraph`);
|
|
253
|
+
const journalMode = cg.getJournalMode();
|
|
254
|
+
console.log(`Journal mode: ${journalMode}\n`);
|
|
255
|
+
console.log('Graph Statistics:');
|
|
256
|
+
console.log(` Node count: ${stats.nodeCount.toLocaleString()}`);
|
|
257
|
+
console.log(` Edge count: ${stats.edgeCount.toLocaleString()}`);
|
|
258
|
+
console.log(` Databases: ${stats.dbCount}`);
|
|
259
|
+
console.log(` DB size: ${(stats.dbSizeBytes / 1024).toFixed(1)} KB\n`);
|
|
260
|
+
if (Object.keys(stats.nodesByKind).length > 0) {
|
|
261
|
+
console.log('Nodes by kind:');
|
|
262
|
+
for (const [kind, count] of Object.entries(stats.nodesByKind).sort((a, b) => b[1] - a[1])) {
|
|
263
|
+
console.log(` ${kind.padEnd(16)} ${count}`);
|
|
264
|
+
}
|
|
265
|
+
console.log('');
|
|
266
|
+
}
|
|
267
|
+
if (sources.length > 0) {
|
|
268
|
+
console.log('Database sources:');
|
|
269
|
+
for (const src of sources) {
|
|
270
|
+
const time = new Date(src.indexedAt).toLocaleString();
|
|
271
|
+
console.log(` ${src.alias.padEnd(16)} ${src.engine.padEnd(10)} ${src.displayUri}`);
|
|
272
|
+
console.log(` ${''.padEnd(16)} Indexed: ${time}, Nodes: ${src.nodeCount}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
console.log('No databases indexed yet. Run: dbgraph index');
|
|
277
|
+
}
|
|
278
|
+
cg.close();
|
|
279
|
+
});
|
|
280
|
+
// ===========================================================================
|
|
281
|
+
// sources
|
|
282
|
+
// ===========================================================================
|
|
283
|
+
program
|
|
284
|
+
.command('sources')
|
|
285
|
+
.description('List configured database sources')
|
|
286
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
287
|
+
.option('--json', 'Output as JSON')
|
|
288
|
+
.action(async (directory, opts) => {
|
|
289
|
+
const projectRoot = path.resolve(directory);
|
|
290
|
+
if (!index_1.DBGraph.isInitialized(projectRoot)) {
|
|
291
|
+
console.error(`DBGraph not initialized in ${projectRoot}. Run 'dbgraph init' first.`);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
const cg = index_1.DBGraph.openSync(projectRoot);
|
|
295
|
+
const sources = cg.getSources();
|
|
296
|
+
if (opts.json) {
|
|
297
|
+
console.log(JSON.stringify(sources, null, 2));
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const formatter = new formatter_1.SchemaFormatter();
|
|
301
|
+
const stats = cg.getStats();
|
|
302
|
+
console.log(formatter.formatDatabaseOverview(sources, stats));
|
|
303
|
+
}
|
|
304
|
+
cg.close();
|
|
305
|
+
});
|
|
306
|
+
// ===========================================================================
|
|
307
|
+
// test
|
|
308
|
+
// ===========================================================================
|
|
309
|
+
program
|
|
310
|
+
.command('test')
|
|
311
|
+
.description('Test connections to all configured databases')
|
|
312
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
313
|
+
.option('-c, --config <path>', 'Path to dbgraph-db.json config file')
|
|
314
|
+
.action(async (directory, opts) => {
|
|
315
|
+
const projectRoot = path.resolve(directory);
|
|
316
|
+
// Load config
|
|
317
|
+
const configPath = opts.config || (0, config_1.findConfigFile)(projectRoot);
|
|
318
|
+
if (!configPath) {
|
|
319
|
+
console.error(`No ${config_1.CONFIG_FILENAME} found.`);
|
|
320
|
+
process.exit(1);
|
|
321
|
+
}
|
|
322
|
+
const config = (0, config_1.loadConfig)(configPath);
|
|
323
|
+
console.log(`Testing ${config.databases.length} database(s)...\n`);
|
|
324
|
+
let allOk = true;
|
|
325
|
+
for (const db of config.databases) {
|
|
326
|
+
process.stdout.write(` ${db.alias} (${db.engine})... `);
|
|
327
|
+
try {
|
|
328
|
+
const introspector = (0, introspect_1.createIntrospector)(db);
|
|
329
|
+
const ok = await introspector.testConnection();
|
|
330
|
+
if (ok) {
|
|
331
|
+
console.log('✅ OK');
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
console.log('❌ FAILED (connection returned false)');
|
|
335
|
+
allOk = false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
console.log(`❌ FAILED`);
|
|
340
|
+
console.log(` ${err instanceof Error ? err.message : String(err)}`);
|
|
341
|
+
allOk = false;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
console.log(allOk ? '\nAll connections successful!' : '\nSome connections failed.');
|
|
345
|
+
process.exit(allOk ? 0 : 1);
|
|
346
|
+
});
|
|
347
|
+
// ===========================================================================
|
|
348
|
+
// config
|
|
349
|
+
// ===========================================================================
|
|
350
|
+
program
|
|
351
|
+
.command('config')
|
|
352
|
+
.description('Show or edit the dbgraph-db.json configuration')
|
|
353
|
+
.argument('[directory]', 'Project root directory', '.')
|
|
354
|
+
.option('--show', 'Display the config file contents')
|
|
355
|
+
.option('--init', 'Create a default config file')
|
|
356
|
+
.action(async (directory, opts) => {
|
|
357
|
+
const projectRoot = path.resolve(directory);
|
|
358
|
+
const configPath = (0, config_1.findConfigFile)(projectRoot) || path.join(projectRoot, config_1.CONFIG_FILENAME);
|
|
359
|
+
if (opts.init) {
|
|
360
|
+
if (fs.existsSync(configPath)) {
|
|
361
|
+
console.error(`${configPath} already exists.`);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
fs.writeFileSync(configPath, (0, config_1.generateDefaultConfig)(), 'utf-8');
|
|
365
|
+
console.log(`Created ${configPath}`);
|
|
366
|
+
console.log('Edit this file to add your database connections, then run: dbgraph index');
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
if (!fs.existsSync(configPath)) {
|
|
370
|
+
console.error(`No ${config_1.CONFIG_FILENAME} found. Use --init to create one.`);
|
|
371
|
+
process.exit(1);
|
|
372
|
+
}
|
|
373
|
+
if (opts.show) {
|
|
374
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
375
|
+
console.log(raw);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
// ===========================================================================
|
|
379
|
+
// Parse
|
|
380
|
+
// ===========================================================================
|
|
381
|
+
program.parse(process.argv);
|
|
382
|
+
//# sourceMappingURL=dbgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbgraph.js","sourceRoot":"","sources":["../../src/bin/dbgraph.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DBGraph Configuration
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates the dbgraph-db.json configuration file
|
|
5
|
+
* which specifies which databases to introspect.
|
|
6
|
+
*/
|
|
7
|
+
import { DbConnectionConfig } from './types';
|
|
8
|
+
export declare const CONFIG_FILENAME = "dbgraph-db.json";
|
|
9
|
+
export interface DBGraphConfig {
|
|
10
|
+
/** List of database connections to introspect */
|
|
11
|
+
databases: DbConnectionConfig[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Find the config file by walking up from startPath
|
|
15
|
+
*/
|
|
16
|
+
export declare function findConfigFile(startPath: string): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Load configuration from a file
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadConfig(configPath: string): DBGraphConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Generate a default config file content
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateDefaultConfig(): string;
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAY,MAAM,SAAS,CAAC;AAGvD,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAiE5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA2B9C"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DBGraph Configuration
|
|
4
|
+
*
|
|
5
|
+
* Loads and validates the dbgraph-db.json configuration file
|
|
6
|
+
* which specifies which databases to introspect.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CONFIG_FILENAME = void 0;
|
|
43
|
+
exports.findConfigFile = findConfigFile;
|
|
44
|
+
exports.loadConfig = loadConfig;
|
|
45
|
+
exports.generateDefaultConfig = generateDefaultConfig;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const errors_1 = require("./errors");
|
|
49
|
+
exports.CONFIG_FILENAME = 'dbgraph-db.json';
|
|
50
|
+
/**
|
|
51
|
+
* Find the config file by walking up from startPath
|
|
52
|
+
*/
|
|
53
|
+
function findConfigFile(startPath) {
|
|
54
|
+
let current = path.resolve(startPath);
|
|
55
|
+
const root = path.parse(current).root;
|
|
56
|
+
while (current !== root) {
|
|
57
|
+
const candidate = path.join(current, exports.CONFIG_FILENAME);
|
|
58
|
+
if (fs.existsSync(candidate)) {
|
|
59
|
+
return candidate;
|
|
60
|
+
}
|
|
61
|
+
const parent = path.dirname(current);
|
|
62
|
+
if (parent === current)
|
|
63
|
+
break;
|
|
64
|
+
current = parent;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Load configuration from a file
|
|
70
|
+
*/
|
|
71
|
+
function loadConfig(configPath) {
|
|
72
|
+
if (!fs.existsSync(configPath)) {
|
|
73
|
+
throw new errors_1.ConfigError(`Configuration file not found: ${configPath}`);
|
|
74
|
+
}
|
|
75
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
76
|
+
let parsed;
|
|
77
|
+
// Try JSONC first (with comments), fallback to JSON
|
|
78
|
+
try {
|
|
79
|
+
const jsonc = require('jsonc-parser');
|
|
80
|
+
const errors = [];
|
|
81
|
+
parsed = jsonc.parse(raw, errors);
|
|
82
|
+
if (errors.length > 0) {
|
|
83
|
+
// jsonc-parser is lenient; fall back to JSON for strict validation
|
|
84
|
+
parsed = JSON.parse(raw);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
parsed = JSON.parse(raw);
|
|
89
|
+
}
|
|
90
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
91
|
+
throw new errors_1.ConfigError('Configuration must be a JSON object');
|
|
92
|
+
}
|
|
93
|
+
const databases = parsed.databases;
|
|
94
|
+
if (!Array.isArray(databases)) {
|
|
95
|
+
throw new errors_1.ConfigError('Configuration must contain a "databases" array');
|
|
96
|
+
}
|
|
97
|
+
if (databases.length === 0) {
|
|
98
|
+
throw new errors_1.ConfigError('At least one database must be configured');
|
|
99
|
+
}
|
|
100
|
+
const validEngines = ['postgresql', 'mysql', 'mariadb', 'mssql', 'sqlite', 'oracle', 'mongodb'];
|
|
101
|
+
const validated = [];
|
|
102
|
+
for (let i = 0; i < databases.length; i++) {
|
|
103
|
+
const db = databases[i];
|
|
104
|
+
if (!db.alias)
|
|
105
|
+
throw new errors_1.ConfigError(`Database at index ${i} is missing "alias"`);
|
|
106
|
+
if (!db.engine)
|
|
107
|
+
throw new errors_1.ConfigError(`Database "${db.alias}" is missing "engine"`);
|
|
108
|
+
if (!validEngines.includes(db.engine)) {
|
|
109
|
+
throw new errors_1.ConfigError(`Database "${db.alias}" has unsupported engine "${db.engine}"`);
|
|
110
|
+
}
|
|
111
|
+
if (db.engine === 'sqlite' && !db.path) {
|
|
112
|
+
throw new errors_1.ConfigError(`SQLite database "${db.alias}" must specify "path"`);
|
|
113
|
+
}
|
|
114
|
+
if (db.engine !== 'sqlite' && !db.database) {
|
|
115
|
+
throw new errors_1.ConfigError(`Database "${db.alias}" is missing "database"`);
|
|
116
|
+
}
|
|
117
|
+
validated.push({
|
|
118
|
+
alias: db.alias,
|
|
119
|
+
engine: db.engine,
|
|
120
|
+
host: db.host,
|
|
121
|
+
port: db.port,
|
|
122
|
+
database: db.database ?? path.basename(db.path ?? ''),
|
|
123
|
+
schemas: db.schemas,
|
|
124
|
+
path: db.path,
|
|
125
|
+
auth: db.auth,
|
|
126
|
+
ssl: db.ssl,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return { databases: validated };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generate a default config file content
|
|
133
|
+
*/
|
|
134
|
+
function generateDefaultConfig() {
|
|
135
|
+
return JSON.stringify({
|
|
136
|
+
$schema: 'https://raw.githubusercontent.com/colbymchenry/dbgraph/main/dbgraph-db.schema.json',
|
|
137
|
+
databases: [
|
|
138
|
+
{
|
|
139
|
+
alias: 'local',
|
|
140
|
+
engine: 'postgresql',
|
|
141
|
+
host: 'localhost',
|
|
142
|
+
port: 5432,
|
|
143
|
+
database: 'mydb',
|
|
144
|
+
schemas: ['public'],
|
|
145
|
+
auth: 'user:password',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
alias: 'analytics',
|
|
149
|
+
engine: 'mysql',
|
|
150
|
+
host: 'localhost',
|
|
151
|
+
port: 3306,
|
|
152
|
+
database: 'analytics',
|
|
153
|
+
auth: 'user:password',
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
}, null, 2);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|