db4ai 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/chunk-3DWAMVV5.js +305 -0
  2. package/dist/chunk-3DWAMVV5.js.map +1 -0
  3. package/dist/chunk-COTPYBYM.js +618 -0
  4. package/dist/chunk-COTPYBYM.js.map +1 -0
  5. package/dist/chunk-EERD6CDF.js +735 -0
  6. package/dist/chunk-EERD6CDF.js.map +1 -0
  7. package/dist/chunk-FUF4HJTC.js +758 -0
  8. package/dist/chunk-FUF4HJTC.js.map +1 -0
  9. package/dist/chunk-JLL6FH5L.js +16 -0
  10. package/dist/chunk-JLL6FH5L.js.map +1 -0
  11. package/dist/chunk-JXFW6AIT.js +192 -0
  12. package/dist/chunk-JXFW6AIT.js.map +1 -0
  13. package/dist/chunk-XLSYCQPG.js +854 -0
  14. package/dist/chunk-XLSYCQPG.js.map +1 -0
  15. package/dist/chunk-Y5IXAS7F.js +569 -0
  16. package/dist/chunk-Y5IXAS7F.js.map +1 -0
  17. package/dist/cli/bin.d.ts +13 -12
  18. package/dist/cli/bin.js +277 -307
  19. package/dist/cli/bin.js.map +1 -1
  20. package/dist/cli/dashboard/index.d.ts +295 -14
  21. package/dist/cli/dashboard/index.js +60 -15
  22. package/dist/cli/dashboard/index.js.map +1 -1
  23. package/dist/cli/index.d.ts +10 -16
  24. package/dist/cli/index.js +94 -47
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/runtime/index.d.ts +52 -23
  27. package/dist/cli/runtime/index.js +10 -704
  28. package/dist/cli/runtime/index.js.map +1 -1
  29. package/dist/cli/scanner/index.d.ts +17 -15
  30. package/dist/cli/scanner/index.js +8 -639
  31. package/dist/cli/scanner/index.js.map +1 -1
  32. package/dist/cli/seed/index.d.ts +16 -12
  33. package/dist/cli/seed/index.js +12 -773
  34. package/dist/cli/seed/index.js.map +1 -1
  35. package/dist/cli/sync/index.d.ts +54 -53
  36. package/dist/cli/sync/index.js +23 -704
  37. package/dist/cli/sync/index.js.map +1 -1
  38. package/dist/cli/terminal.d.ts +9 -8
  39. package/dist/cli/terminal.js +6 -209
  40. package/dist/cli/terminal.js.map +1 -1
  41. package/dist/cli/workflow/index.d.ts +18 -10
  42. package/dist/cli/workflow/index.js +6 -307
  43. package/dist/cli/workflow/index.js.map +1 -1
  44. package/dist/handlers.d.ts +10 -9
  45. package/dist/handlers.js +6 -38
  46. package/dist/handlers.js.map +1 -1
  47. package/dist/index.d.ts +120 -118
  48. package/dist/index.js +1963 -3125
  49. package/dist/index.js.map +1 -1
  50. package/package.json +3 -4
  51. package/dist/cli/bin.d.ts.map +0 -1
  52. package/dist/cli/dashboard/App.d.ts +0 -16
  53. package/dist/cli/dashboard/App.d.ts.map +0 -1
  54. package/dist/cli/dashboard/App.js +0 -116
  55. package/dist/cli/dashboard/App.js.map +0 -1
  56. package/dist/cli/dashboard/components/index.d.ts +0 -70
  57. package/dist/cli/dashboard/components/index.d.ts.map +0 -1
  58. package/dist/cli/dashboard/components/index.js +0 -192
  59. package/dist/cli/dashboard/components/index.js.map +0 -1
  60. package/dist/cli/dashboard/hooks/index.d.ts +0 -76
  61. package/dist/cli/dashboard/hooks/index.d.ts.map +0 -1
  62. package/dist/cli/dashboard/hooks/index.js +0 -201
  63. package/dist/cli/dashboard/hooks/index.js.map +0 -1
  64. package/dist/cli/dashboard/index.d.ts.map +0 -1
  65. package/dist/cli/dashboard/types.d.ts +0 -84
  66. package/dist/cli/dashboard/types.d.ts.map +0 -1
  67. package/dist/cli/dashboard/types.js +0 -5
  68. package/dist/cli/dashboard/types.js.map +0 -1
  69. package/dist/cli/dashboard/views/index.d.ts +0 -51
  70. package/dist/cli/dashboard/views/index.d.ts.map +0 -1
  71. package/dist/cli/dashboard/views/index.js +0 -72
  72. package/dist/cli/dashboard/views/index.js.map +0 -1
  73. package/dist/cli/index.d.ts.map +0 -1
  74. package/dist/cli/runtime/index.d.ts.map +0 -1
  75. package/dist/cli/scanner/index.d.ts.map +0 -1
  76. package/dist/cli/seed/index.d.ts.map +0 -1
  77. package/dist/cli/sync/index.d.ts.map +0 -1
  78. package/dist/cli/terminal.d.ts.map +0 -1
  79. package/dist/cli/workflow/index.d.ts.map +0 -1
  80. package/dist/errors.d.ts +0 -43
  81. package/dist/errors.d.ts.map +0 -1
  82. package/dist/errors.js +0 -47
  83. package/dist/errors.js.map +0 -1
  84. package/dist/handlers.d.ts.map +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/types.d.ts +0 -276
  87. package/dist/types.d.ts.map +0 -1
  88. package/dist/types.js +0 -12
  89. package/dist/types.js.map +0 -1
package/dist/cli/bin.js CHANGED
@@ -1,41 +1,36 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * db4ai CLI - Command Line Interface
4
- *
5
- * Entry point for the db4ai CLI tool.
6
- */
7
- import { existsSync } from 'fs';
8
- import { resolve } from 'path';
9
- // Version from package.json
10
- export const CLI_VERSION = '0.1.0';
11
- const COMMANDS = ['scan', 'seed', 'workflow', 'sync', 'dashboard'];
12
- const COMMAND_DESCRIPTIONS = {
13
- scan: 'Scan project for schemas',
14
- seed: 'Run seed files',
15
- workflow: 'Execute workflows',
16
- sync: 'Synchronize data',
17
- dashboard: 'Launch dashboard',
2
+
3
+ // cli/bin.ts
4
+ import { existsSync } from "fs";
5
+ import { resolve } from "path";
6
+ var CLI_VERSION = "0.1.0";
7
+ var COMMANDS = ["scan", "seed", "workflow", "sync", "dashboard"];
8
+ var COMMAND_DESCRIPTIONS = {
9
+ scan: "Scan project for schemas",
10
+ seed: "Run seed files",
11
+ workflow: "Execute workflows",
12
+ sync: "Synchronize data",
13
+ dashboard: "Launch dashboard"
18
14
  };
19
- // Main help text
20
15
  function getMainHelp() {
21
- let help = 'Usage: db4ai [options] [command]\n\n';
22
- help += 'Commands:\n';
23
- for (const cmd of COMMANDS) {
24
- help += ` ${cmd.padEnd(12)} ${COMMAND_DESCRIPTIONS[cmd]}\n`;
25
- }
26
- help += '\nGlobal Options:\n';
27
- help += ' --version, -v Show version number\n';
28
- help += ' --help, -h Show help\n';
29
- help += ' --config <file> Path to config file\n';
30
- help += ' --verbose Enable verbose output\n';
31
- help += ' --quiet Suppress output\n';
32
- help += ' --no-color Disable colored output\n';
33
- help += ' --json Output as JSON\n';
34
- return help;
16
+ let help = "Usage: db4ai [options] [command]\n\n";
17
+ help += "Commands:\n";
18
+ for (const cmd of COMMANDS) {
19
+ help += ` ${cmd.padEnd(12)} ${COMMAND_DESCRIPTIONS[cmd]}
20
+ `;
21
+ }
22
+ help += "\nGlobal Options:\n";
23
+ help += " --version, -v Show version number\n";
24
+ help += " --help, -h Show help\n";
25
+ help += " --config <file> Path to config file\n";
26
+ help += " --verbose Enable verbose output\n";
27
+ help += " --quiet Suppress output\n";
28
+ help += " --no-color Disable colored output\n";
29
+ help += " --json Output as JSON\n";
30
+ return help;
35
31
  }
36
- // Command-specific help
37
32
  function getScanHelp() {
38
- return `Usage: db4ai scan [options]
33
+ return `Usage: db4ai scan [options]
39
34
 
40
35
  Scan project for schemas
41
36
 
@@ -48,7 +43,7 @@ Options:
48
43
  `;
49
44
  }
50
45
  function getSeedHelp() {
51
- return `Usage: db4ai seed [file] [options]
46
+ return `Usage: db4ai seed [file] [options]
52
47
 
53
48
  Run seed files
54
49
 
@@ -61,7 +56,7 @@ Options:
61
56
  `;
62
57
  }
63
58
  function getWorkflowHelp() {
64
- return `Usage: db4ai workflow [name] [options]
59
+ return `Usage: db4ai workflow [name] [options]
65
60
 
66
61
  Execute workflows
67
62
 
@@ -73,7 +68,7 @@ Options:
73
68
  `;
74
69
  }
75
70
  function getSyncHelp() {
76
- return `Usage: db4ai sync [subcommand] [options]
71
+ return `Usage: db4ai sync [subcommand] [options]
77
72
 
78
73
  Synchronize data
79
74
 
@@ -89,7 +84,7 @@ Options:
89
84
  `;
90
85
  }
91
86
  function getSyncPushHelp() {
92
- return `Usage: db4ai sync push [options]
87
+ return `Usage: db4ai sync push [options]
93
88
 
94
89
  Push local changes to remote
95
90
 
@@ -100,7 +95,7 @@ Options:
100
95
  `;
101
96
  }
102
97
  function getSyncPullHelp() {
103
- return `Usage: db4ai sync pull [options]
98
+ return `Usage: db4ai sync pull [options]
104
99
 
105
100
  Pull remote changes to local
106
101
 
@@ -111,7 +106,7 @@ Options:
111
106
  `;
112
107
  }
113
108
  function getDashboardHelp() {
114
- return `Usage: db4ai dashboard [options]
109
+ return `Usage: db4ai dashboard [options]
115
110
 
116
111
  Launch dashboard
117
112
 
@@ -122,297 +117,272 @@ Options:
122
117
  --help Show help
123
118
  `;
124
119
  }
125
- // Find similar commands for typo suggestions
126
120
  function findSimilarCommand(input) {
127
- const threshold = 2; // Levenshtein distance threshold
128
- function levenshtein(a, b) {
129
- const matrix = [];
130
- for (let i = 0; i <= b.length; i++) {
131
- matrix[i] = [i];
132
- }
133
- for (let j = 0; j <= a.length; j++) {
134
- matrix[0][j] = j;
135
- }
136
- for (let i = 1; i <= b.length; i++) {
137
- for (let j = 1; j <= a.length; j++) {
138
- if (b.charAt(i - 1) === a.charAt(j - 1)) {
139
- matrix[i][j] = matrix[i - 1][j - 1];
140
- }
141
- else {
142
- matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
143
- }
144
- }
145
- }
146
- return matrix[b.length][a.length];
121
+ const threshold = 2;
122
+ function levenshtein(a, b) {
123
+ const matrix = [];
124
+ for (let i = 0; i <= b.length; i++) {
125
+ matrix[i] = [i];
147
126
  }
148
- let closest = null;
149
- let closestDistance = Infinity;
150
- for (const cmd of COMMANDS) {
151
- const distance = levenshtein(input, cmd);
152
- if (distance < closestDistance && distance <= threshold) {
153
- closest = cmd;
154
- closestDistance = distance;
155
- }
127
+ for (let j = 0; j <= a.length; j++) {
128
+ matrix[0][j] = j;
156
129
  }
157
- return closest;
158
- }
159
- /**
160
- * Parse CLI arguments into a structured format
161
- * @param args - Raw command line arguments (process.argv.slice(2))
162
- * @returns Parsed arguments with flags, command, and remaining args
163
- */
164
- export function parseArgs(args) {
165
- const result = {
166
- version: false,
167
- help: false,
168
- args: [],
169
- verbose: false,
170
- quiet: false,
171
- noColor: false,
172
- json: false,
173
- };
174
- let i = 0;
175
- let foundCommand = false;
176
- while (i < args.length) {
177
- const arg = args[i];
178
- if (!foundCommand) {
179
- // Global flags before command
180
- if (arg === '--version' || arg === '-v') {
181
- result.version = true;
182
- i++;
183
- continue;
184
- }
185
- if (arg === '--help' || arg === '-h') {
186
- result.help = true;
187
- i++;
188
- continue;
189
- }
190
- if (arg === '--config') {
191
- result.config = args[i + 1];
192
- i += 2;
193
- continue;
194
- }
195
- if (arg === '--verbose') {
196
- result.verbose = true;
197
- i++;
198
- continue;
199
- }
200
- if (arg === '--quiet') {
201
- result.quiet = true;
202
- i++;
203
- continue;
204
- }
205
- if (arg === '--no-color') {
206
- result.noColor = true;
207
- i++;
208
- continue;
209
- }
210
- if (arg === '--json') {
211
- result.json = true;
212
- i++;
213
- continue;
214
- }
215
- // Check if it's a command
216
- if (COMMANDS.includes(arg)) {
217
- result.command = arg;
218
- foundCommand = true;
219
- i++;
220
- continue;
221
- }
222
- // Unknown argument before command - treat as command (will error later)
223
- if (!arg.startsWith('-')) {
224
- result.command = arg;
225
- foundCommand = true;
226
- i++;
227
- continue;
228
- }
229
- }
230
- // After command, collect all remaining args
231
- if (foundCommand) {
232
- // Check for subcommand (for sync)
233
- if (result.command === 'sync' && !result.subcommand && !arg.startsWith('-')) {
234
- if (arg === 'push' || arg === 'pull') {
235
- result.subcommand = arg;
236
- i++;
237
- continue;
238
- }
239
- }
240
- // Check for global options after command
241
- if (arg === '--verbose') {
242
- result.verbose = true;
243
- i++;
244
- continue;
245
- }
246
- if (arg === '--quiet') {
247
- result.quiet = true;
248
- i++;
249
- continue;
250
- }
251
- if (arg === '--help' || arg === '-h') {
252
- result.help = true;
253
- i++;
254
- continue;
255
- }
256
- if (arg === '--json') {
257
- result.json = true;
258
- i++;
259
- continue;
260
- }
261
- result.args.push(arg);
130
+ for (let i = 1; i <= b.length; i++) {
131
+ for (let j = 1; j <= a.length; j++) {
132
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
133
+ matrix[i][j] = matrix[i - 1][j - 1];
134
+ } else {
135
+ matrix[i][j] = Math.min(
136
+ matrix[i - 1][j - 1] + 1,
137
+ matrix[i][j - 1] + 1,
138
+ matrix[i - 1][j] + 1
139
+ );
262
140
  }
263
- i++;
141
+ }
142
+ }
143
+ return matrix[b.length][a.length];
144
+ }
145
+ let closest = null;
146
+ let closestDistance = Infinity;
147
+ for (const cmd of COMMANDS) {
148
+ const distance = levenshtein(input, cmd);
149
+ if (distance < closestDistance && distance <= threshold) {
150
+ closest = cmd;
151
+ closestDistance = distance;
264
152
  }
265
- return result;
153
+ }
154
+ return closest;
266
155
  }
267
- // Command handlers
268
- export async function handleScan(args, streams) {
269
- // Check for help
270
- if (args.includes('--help') || args.includes('-h')) {
271
- streams.stdout.write(getScanHelp());
272
- return 0;
156
+ function parseArgs(args) {
157
+ const result = {
158
+ version: false,
159
+ help: false,
160
+ args: [],
161
+ verbose: false,
162
+ quiet: false,
163
+ noColor: false,
164
+ json: false
165
+ };
166
+ let i = 0;
167
+ let foundCommand = false;
168
+ while (i < args.length) {
169
+ const arg = args[i];
170
+ if (!foundCommand) {
171
+ if (arg === "--version" || arg === "-v") {
172
+ result.version = true;
173
+ i++;
174
+ continue;
175
+ }
176
+ if (arg === "--help" || arg === "-h") {
177
+ result.help = true;
178
+ i++;
179
+ continue;
180
+ }
181
+ if (arg === "--config") {
182
+ result.config = args[i + 1];
183
+ i += 2;
184
+ continue;
185
+ }
186
+ if (arg === "--verbose") {
187
+ result.verbose = true;
188
+ i++;
189
+ continue;
190
+ }
191
+ if (arg === "--quiet") {
192
+ result.quiet = true;
193
+ i++;
194
+ continue;
195
+ }
196
+ if (arg === "--no-color") {
197
+ result.noColor = true;
198
+ i++;
199
+ continue;
200
+ }
201
+ if (arg === "--json") {
202
+ result.json = true;
203
+ i++;
204
+ continue;
205
+ }
206
+ if (COMMANDS.includes(arg)) {
207
+ result.command = arg;
208
+ foundCommand = true;
209
+ i++;
210
+ continue;
211
+ }
212
+ if (!arg.startsWith("-")) {
213
+ result.command = arg;
214
+ foundCommand = true;
215
+ i++;
216
+ continue;
217
+ }
273
218
  }
274
- // Check for unknown options
275
- for (const arg of args) {
276
- if (arg.startsWith('--') && !['--root', '--include', '--exclude', '--json', '--verbose', '--quiet'].includes(arg)) {
277
- streams.stderr.write(`Unknown option: ${arg}\n`);
278
- return 2;
219
+ if (foundCommand) {
220
+ if (result.command === "sync" && !result.subcommand && !arg.startsWith("-")) {
221
+ if (arg === "push" || arg === "pull") {
222
+ result.subcommand = arg;
223
+ i++;
224
+ continue;
279
225
  }
226
+ }
227
+ if (arg === "--verbose") {
228
+ result.verbose = true;
229
+ i++;
230
+ continue;
231
+ }
232
+ if (arg === "--quiet") {
233
+ result.quiet = true;
234
+ i++;
235
+ continue;
236
+ }
237
+ if (arg === "--help" || arg === "-h") {
238
+ result.help = true;
239
+ i++;
240
+ continue;
241
+ }
242
+ if (arg === "--json") {
243
+ result.json = true;
244
+ i++;
245
+ continue;
246
+ }
247
+ result.args.push(arg);
280
248
  }
281
- // Actual scan implementation would go here
282
- streams.stdout.write('Scanning...\n');
283
- return 0;
249
+ i++;
250
+ }
251
+ return result;
284
252
  }
285
- export async function handleSeed(args, streams) {
286
- // Check for help
287
- if (args.includes('--help') || args.includes('-h')) {
288
- streams.stdout.write(getSeedHelp());
289
- return 0;
253
+ async function handleScan(args, streams) {
254
+ if (args.includes("--help") || args.includes("-h")) {
255
+ streams.stdout.write(getScanHelp());
256
+ return 0;
257
+ }
258
+ for (const arg of args) {
259
+ if (arg.startsWith("--") && !["--root", "--include", "--exclude", "--json", "--verbose", "--quiet"].includes(arg)) {
260
+ streams.stderr.write(`Unknown option: ${arg}
261
+ `);
262
+ return 2;
290
263
  }
291
- // Actual seed implementation would go here
292
- streams.stdout.write('Seeding...\n');
264
+ }
265
+ streams.stdout.write("Scanning...\n");
266
+ return 0;
267
+ }
268
+ async function handleSeed(args, streams) {
269
+ if (args.includes("--help") || args.includes("-h")) {
270
+ streams.stdout.write(getSeedHelp());
293
271
  return 0;
272
+ }
273
+ streams.stdout.write("Seeding...\n");
274
+ return 0;
294
275
  }
295
- export async function handleWorkflow(args, streams) {
296
- // Check for help
297
- if (args.includes('--help') || args.includes('-h')) {
298
- streams.stdout.write(getWorkflowHelp());
299
- return 0;
300
- }
301
- // Actual workflow implementation would go here
302
- streams.stdout.write('Running workflow...\n');
276
+ async function handleWorkflow(args, streams) {
277
+ if (args.includes("--help") || args.includes("-h")) {
278
+ streams.stdout.write(getWorkflowHelp());
303
279
  return 0;
280
+ }
281
+ streams.stdout.write("Running workflow...\n");
282
+ return 0;
304
283
  }
305
- export async function handleSync(args, subcommand, streams) {
306
- // Check for help on main sync command
307
- if (args.includes('--help') || args.includes('-h')) {
308
- if (subcommand === 'push') {
309
- streams.stdout.write(getSyncPushHelp());
310
- }
311
- else if (subcommand === 'pull') {
312
- streams.stdout.write(getSyncPullHelp());
313
- }
314
- else {
315
- streams.stdout.write(getSyncHelp());
316
- }
317
- return 0;
318
- }
319
- // Actual sync implementation would go here
320
- if (subcommand) {
321
- streams.stdout.write(`Syncing (${subcommand})...\n`);
322
- }
323
- else {
324
- streams.stdout.write('Syncing...\n');
284
+ async function handleSync(args, subcommand, streams) {
285
+ if (args.includes("--help") || args.includes("-h")) {
286
+ if (subcommand === "push") {
287
+ streams.stdout.write(getSyncPushHelp());
288
+ } else if (subcommand === "pull") {
289
+ streams.stdout.write(getSyncPullHelp());
290
+ } else {
291
+ streams.stdout.write(getSyncHelp());
325
292
  }
326
293
  return 0;
294
+ }
295
+ if (subcommand) {
296
+ streams.stdout.write(`Syncing (${subcommand})...
297
+ `);
298
+ } else {
299
+ streams.stdout.write("Syncing...\n");
300
+ }
301
+ return 0;
327
302
  }
328
- export async function handleDashboard(args, streams) {
329
- // Check for help
330
- if (args.includes('--help') || args.includes('-h')) {
331
- streams.stdout.write(getDashboardHelp());
332
- return 0;
333
- }
334
- // Actual dashboard implementation would go here
335
- streams.stdout.write('Launching dashboard...\n');
303
+ async function handleDashboard(args, streams) {
304
+ if (args.includes("--help") || args.includes("-h")) {
305
+ streams.stdout.write(getDashboardHelp());
336
306
  return 0;
307
+ }
308
+ streams.stdout.write("Launching dashboard...\n");
309
+ return 0;
337
310
  }
338
- /**
339
- * Main CLI entry point
340
- * @param args - Command line arguments
341
- * @param options - Optional output streams for testing
342
- * @returns Exit code (0 = success, 1 = error, 2 = invalid args)
343
- */
344
- export async function run(args, options = {}) {
345
- const streams = {
346
- stdout: options.stdout || process.stdout,
347
- stderr: options.stderr || process.stderr,
348
- };
349
- const parsed = parseArgs(args);
350
- // Handle version
351
- if (parsed.version) {
352
- if (parsed.json) {
353
- streams.stdout.write(JSON.stringify({ version: CLI_VERSION }) + '\n');
354
- }
355
- else {
356
- streams.stdout.write(CLI_VERSION + '\n');
357
- }
358
- return 0;
359
- }
360
- // Check for config file if specified - do this early, before help
361
- // Only error on missing config if it's a custom config file (not default db4.config.ts/js)
362
- if (parsed.config) {
363
- const configPath = resolve(process.cwd(), parsed.config);
364
- const isDefaultConfig = parsed.config === 'db4.config.ts' || parsed.config === 'db4.config.js';
365
- if (!existsSync(configPath) && !isDefaultConfig) {
366
- streams.stderr.write(`Config file not found: ${parsed.config}\n`);
367
- return 1;
368
- }
369
- }
370
- // Handle help (no command)
371
- if (parsed.help && !parsed.command) {
372
- streams.stdout.write(getMainHelp());
373
- return 0;
374
- }
375
- // No command - show help
376
- if (!parsed.command) {
377
- streams.stdout.write(getMainHelp());
378
- return 0;
311
+ async function run(args, options = {}) {
312
+ const streams = {
313
+ stdout: options.stdout || process.stdout,
314
+ stderr: options.stderr || process.stderr
315
+ };
316
+ const parsed = parseArgs(args);
317
+ if (parsed.version) {
318
+ if (parsed.json) {
319
+ streams.stdout.write(JSON.stringify({ version: CLI_VERSION }) + "\n");
320
+ } else {
321
+ streams.stdout.write(CLI_VERSION + "\n");
379
322
  }
380
- // Check for unknown command
381
- if (!COMMANDS.includes(parsed.command)) {
382
- const similar = findSimilarCommand(parsed.command);
383
- streams.stderr.write(`Unknown command: ${parsed.command}\n`);
384
- if (similar) {
385
- streams.stderr.write(`Did you mean '${similar}'?\n`);
386
- }
387
- streams.stderr.write(`Run 'db4ai --help' for usage.\n`);
388
- return 1;
323
+ return 0;
324
+ }
325
+ if (parsed.config) {
326
+ const configPath = resolve(process.cwd(), parsed.config);
327
+ const isDefaultConfig = parsed.config === "db4.config.ts" || parsed.config === "db4.config.js";
328
+ if (!existsSync(configPath) && !isDefaultConfig) {
329
+ streams.stderr.write(`Config file not found: ${parsed.config}
330
+ `);
331
+ return 1;
389
332
  }
390
- // Route to command handler
391
- // If help flag is set, pass it to the handler
392
- const commandArgs = parsed.help ? ['--help', ...parsed.args] : parsed.args;
393
- switch (parsed.command) {
394
- case 'scan':
395
- return handleScan(commandArgs, streams);
396
- case 'seed':
397
- return handleSeed(commandArgs, streams);
398
- case 'workflow':
399
- return handleWorkflow(commandArgs, streams);
400
- case 'sync':
401
- return handleSync(commandArgs, parsed.subcommand, streams);
402
- case 'dashboard':
403
- return handleDashboard(commandArgs, streams);
404
- default:
405
- streams.stderr.write(`Unknown command: ${parsed.command}\n`);
406
- return 1;
333
+ }
334
+ if (parsed.help && !parsed.command) {
335
+ streams.stdout.write(getMainHelp());
336
+ return 0;
337
+ }
338
+ if (!parsed.command) {
339
+ streams.stdout.write(getMainHelp());
340
+ return 0;
341
+ }
342
+ if (!COMMANDS.includes(parsed.command)) {
343
+ const similar = findSimilarCommand(parsed.command);
344
+ streams.stderr.write(`Unknown command: ${parsed.command}
345
+ `);
346
+ if (similar) {
347
+ streams.stderr.write(`Did you mean '${similar}'?
348
+ `);
407
349
  }
350
+ streams.stderr.write(`Run 'db4ai --help' for usage.
351
+ `);
352
+ return 1;
353
+ }
354
+ const commandArgs = parsed.help ? ["--help", ...parsed.args] : parsed.args;
355
+ switch (parsed.command) {
356
+ case "scan":
357
+ return handleScan(commandArgs, streams);
358
+ case "seed":
359
+ return handleSeed(commandArgs, streams);
360
+ case "workflow":
361
+ return handleWorkflow(commandArgs, streams);
362
+ case "sync":
363
+ return handleSync(commandArgs, parsed.subcommand, streams);
364
+ case "dashboard":
365
+ return handleDashboard(commandArgs, streams);
366
+ default:
367
+ streams.stderr.write(`Unknown command: ${parsed.command}
368
+ `);
369
+ return 1;
370
+ }
408
371
  }
409
- // CLI entry point
410
- if (process.argv[1] === import.meta.url.replace('file://', '') ||
411
- process.argv[1]?.endsWith('/bin.ts') ||
412
- process.argv[1]?.endsWith('/bin.js')) {
413
- const args = process.argv.slice(2);
414
- run(args).then((code) => {
415
- process.exit(code);
416
- });
372
+ if (process.argv[1] === import.meta.url.replace("file://", "") || process.argv[1]?.endsWith("/bin.ts") || process.argv[1]?.endsWith("/bin.js")) {
373
+ const args = process.argv.slice(2);
374
+ run(args).then((code) => {
375
+ process.exit(code);
376
+ });
417
377
  }
378
+ export {
379
+ CLI_VERSION,
380
+ handleDashboard,
381
+ handleScan,
382
+ handleSeed,
383
+ handleSync,
384
+ handleWorkflow,
385
+ parseArgs,
386
+ run
387
+ };
418
388
  //# sourceMappingURL=bin.js.map