@memberjunction/db-auto-doc 2.117.0 → 2.119.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/README.md +803 -165
- package/bin/run.js +7 -0
- package/dist/api/DBAutoDocAPI.d.ts +252 -0
- package/dist/api/DBAutoDocAPI.d.ts.map +1 -0
- package/dist/api/DBAutoDocAPI.js +530 -0
- package/dist/api/DBAutoDocAPI.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +10 -0
- package/dist/api/index.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -4
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +58 -71
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/export.d.ts +14 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +156 -61
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/generate-queries.d.ts +17 -0
- package/dist/commands/generate-queries.d.ts.map +1 -0
- package/dist/commands/generate-queries.js +182 -0
- package/dist/commands/generate-queries.js.map +1 -0
- package/dist/commands/init.d.ts +3 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +206 -144
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/reset.d.ts +4 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +33 -19
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/AnalysisEngine.d.ts +108 -0
- package/dist/core/AnalysisEngine.d.ts.map +1 -0
- package/dist/core/AnalysisEngine.js +716 -0
- package/dist/core/AnalysisEngine.js.map +1 -0
- package/dist/core/AnalysisOrchestrator.d.ts +41 -0
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
- package/dist/core/AnalysisOrchestrator.js +377 -0
- package/dist/core/AnalysisOrchestrator.js.map +1 -0
- package/dist/core/BackpropagationEngine.d.ts +32 -0
- package/dist/core/BackpropagationEngine.d.ts.map +1 -0
- package/dist/core/BackpropagationEngine.js +121 -0
- package/dist/core/BackpropagationEngine.js.map +1 -0
- package/dist/core/ConvergenceDetector.d.ts +27 -0
- package/dist/core/ConvergenceDetector.d.ts.map +1 -0
- package/dist/core/ConvergenceDetector.js +92 -0
- package/dist/core/ConvergenceDetector.js.map +1 -0
- package/dist/core/GuardrailsManager.d.ts +78 -0
- package/dist/core/GuardrailsManager.d.ts.map +1 -0
- package/dist/core/GuardrailsManager.js +367 -0
- package/dist/core/GuardrailsManager.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/database/Database.d.ts +56 -0
- package/dist/database/Database.d.ts.map +1 -0
- package/dist/database/Database.js +172 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/TopologicalSorter.d.ts +25 -0
- package/dist/database/TopologicalSorter.d.ts.map +1 -0
- package/dist/database/TopologicalSorter.js +150 -0
- package/dist/database/TopologicalSorter.js.map +1 -0
- package/dist/database/index.d.ts +6 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +14 -0
- package/dist/database/index.js.map +1 -0
- package/dist/discovery/ColumnStatsCache.d.ts +91 -0
- package/dist/discovery/ColumnStatsCache.d.ts.map +1 -0
- package/dist/discovery/ColumnStatsCache.js +231 -0
- package/dist/discovery/ColumnStatsCache.js.map +1 -0
- package/dist/discovery/DiscoveryEngine.d.ts +100 -0
- package/dist/discovery/DiscoveryEngine.d.ts.map +1 -0
- package/dist/discovery/DiscoveryEngine.js +726 -0
- package/dist/discovery/DiscoveryEngine.js.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts +57 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js +186 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js.map +1 -0
- package/dist/discovery/FKDetector.d.ts +47 -0
- package/dist/discovery/FKDetector.d.ts.map +1 -0
- package/dist/discovery/FKDetector.js +317 -0
- package/dist/discovery/FKDetector.js.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts +64 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.js +431 -0
- package/dist/discovery/LLMDiscoveryValidator.js.map +1 -0
- package/dist/discovery/LLMSanityChecker.d.ts +38 -0
- package/dist/discovery/LLMSanityChecker.d.ts.map +1 -0
- package/dist/discovery/LLMSanityChecker.js +156 -0
- package/dist/discovery/LLMSanityChecker.js.map +1 -0
- package/dist/discovery/PKDetector.d.ts +62 -0
- package/dist/discovery/PKDetector.d.ts.map +1 -0
- package/dist/discovery/PKDetector.js +436 -0
- package/dist/discovery/PKDetector.js.map +1 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +25 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts +132 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.js +121 -0
- package/dist/drivers/BaseAutoDocDriver.js.map +1 -0
- package/dist/drivers/MySQLDriver.d.ts +61 -0
- package/dist/drivers/MySQLDriver.d.ts.map +1 -0
- package/dist/drivers/MySQLDriver.js +668 -0
- package/dist/drivers/MySQLDriver.js.map +1 -0
- package/dist/drivers/PostgreSQLDriver.d.ts +65 -0
- package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -0
- package/dist/drivers/PostgreSQLDriver.js +704 -0
- package/dist/drivers/PostgreSQLDriver.js.map +1 -0
- package/dist/drivers/SQLServerDriver.d.ts +61 -0
- package/dist/drivers/SQLServerDriver.d.ts.map +1 -0
- package/dist/drivers/SQLServerDriver.js +667 -0
- package/dist/drivers/SQLServerDriver.js.map +1 -0
- package/dist/generators/CSVGenerator.d.ts +35 -0
- package/dist/generators/CSVGenerator.d.ts.map +1 -0
- package/dist/generators/CSVGenerator.js +154 -0
- package/dist/generators/CSVGenerator.js.map +1 -0
- package/dist/generators/HTMLGenerator.d.ts +29 -0
- package/dist/generators/HTMLGenerator.d.ts.map +1 -0
- package/dist/generators/HTMLGenerator.js +710 -0
- package/dist/generators/HTMLGenerator.js.map +1 -0
- package/dist/generators/MarkdownGenerator.d.ts +27 -0
- package/dist/generators/MarkdownGenerator.d.ts.map +1 -0
- package/dist/generators/MarkdownGenerator.js +361 -0
- package/dist/generators/MarkdownGenerator.js.map +1 -0
- package/dist/generators/MermaidGenerator.d.ts +35 -0
- package/dist/generators/MermaidGenerator.d.ts.map +1 -0
- package/dist/generators/MermaidGenerator.js +321 -0
- package/dist/generators/MermaidGenerator.js.map +1 -0
- package/dist/generators/ReportGenerator.d.ts +22 -0
- package/dist/generators/ReportGenerator.d.ts.map +1 -0
- package/dist/generators/ReportGenerator.js +176 -0
- package/dist/generators/ReportGenerator.js.map +1 -0
- package/dist/generators/SQLGenerator.d.ts +31 -0
- package/dist/generators/SQLGenerator.d.ts.map +1 -0
- package/dist/generators/SQLGenerator.js +168 -0
- package/dist/generators/SQLGenerator.js.map +1 -0
- package/dist/generators/SampleQueryGenerator.d.ts +64 -0
- package/dist/generators/SampleQueryGenerator.d.ts.map +1 -0
- package/dist/generators/SampleQueryGenerator.js +500 -0
- package/dist/generators/SampleQueryGenerator.js.map +1 -0
- package/dist/generators/index.d.ts +10 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +19 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +11 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -20
- package/dist/index.js.map +1 -1
- package/dist/prompts/PromptEngine.d.ts +65 -0
- package/dist/prompts/PromptEngine.d.ts.map +1 -0
- package/dist/prompts/PromptEngine.js +305 -0
- package/dist/prompts/PromptEngine.js.map +1 -0
- package/dist/prompts/PromptFileLoader.d.ts +21 -0
- package/dist/prompts/PromptFileLoader.d.ts.map +1 -0
- package/dist/prompts/PromptFileLoader.js +74 -0
- package/dist/prompts/PromptFileLoader.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +11 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/state/IterationTracker.d.ts +64 -0
- package/dist/state/IterationTracker.d.ts.map +1 -0
- package/dist/state/IterationTracker.js +136 -0
- package/dist/state/IterationTracker.js.map +1 -0
- package/dist/state/StateManager.d.ts +79 -0
- package/dist/state/StateManager.d.ts.map +1 -0
- package/dist/state/StateManager.js +348 -0
- package/dist/state/StateManager.js.map +1 -0
- package/dist/state/StateValidator.d.ts +24 -0
- package/dist/state/StateValidator.d.ts.map +1 -0
- package/dist/state/StateValidator.js +147 -0
- package/dist/state/StateValidator.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +13 -0
- package/dist/state/index.js.map +1 -0
- package/dist/types/analysis.d.ts +76 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +6 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +143 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/discovery.d.ts +277 -0
- package/dist/types/discovery.d.ts.map +1 -0
- package/dist/types/discovery.js +7 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/driver.d.ts +148 -0
- package/dist/types/driver.d.ts.map +1 -0
- package/dist/types/driver.js +7 -0
- package/dist/types/driver.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/prompts.d.ts +158 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +6 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/sample-queries.d.ts +172 -0
- package/dist/types/sample-queries.d.ts.map +1 -0
- package/dist/types/sample-queries.js +7 -0
- package/dist/types/sample-queries.js.map +1 -0
- package/dist/types/state.d.ts +291 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +7 -0
- package/dist/types/state.js.map +1 -0
- package/dist/utils/config-loader.d.ts +29 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +163 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +28 -3
- package/dist/ai/simple-ai-client.d.ts +0 -70
- package/dist/ai/simple-ai-client.d.ts.map +0 -1
- package/dist/ai/simple-ai-client.js +0 -181
- package/dist/ai/simple-ai-client.js.map +0 -1
- package/dist/analyzers/analyzer.d.ts +0 -23
- package/dist/analyzers/analyzer.d.ts.map +0 -1
- package/dist/analyzers/analyzer.js +0 -127
- package/dist/analyzers/analyzer.js.map +0 -1
- package/dist/cli-old/cli.d.ts +0 -3
- package/dist/cli-old/cli.d.ts.map +0 -1
- package/dist/cli-old/cli.js +0 -388
- package/dist/cli-old/cli.js.map +0 -1
- package/dist/commands/review.d.ts +0 -11
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -82
- package/dist/commands/review.js.map +0 -1
- package/dist/database/connection.d.ts +0 -40
- package/dist/database/connection.d.ts.map +0 -1
- package/dist/database/connection.js +0 -136
- package/dist/database/connection.js.map +0 -1
- package/dist/database/introspection.d.ts +0 -59
- package/dist/database/introspection.d.ts.map +0 -1
- package/dist/database/introspection.js +0 -124
- package/dist/database/introspection.js.map +0 -1
- package/dist/generators/markdown-generator.d.ts +0 -8
- package/dist/generators/markdown-generator.d.ts.map +0 -1
- package/dist/generators/markdown-generator.js +0 -106
- package/dist/generators/markdown-generator.js.map +0 -1
- package/dist/generators/sql-generator.d.ts +0 -20
- package/dist/generators/sql-generator.d.ts.map +0 -1
- package/dist/generators/sql-generator.js +0 -83
- package/dist/generators/sql-generator.js.map +0 -1
- package/dist/state/state-manager.d.ts +0 -95
- package/dist/state/state-manager.d.ts.map +0 -1
- package/dist/state/state-manager.js +0 -236
- package/dist/state/state-manager.js.map +0 -1
- package/dist/types/state-file.d.ts +0 -124
- package/dist/types/state-file.d.ts.map +0 -1
- package/dist/types/state-file.js +0 -79
- package/dist/types/state-file.js.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generate Queries command - Generate sample SQL queries from existing state
|
|
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 (mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
25
|
+
__setModuleDefault(result, mod);
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
|
+
};
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
const core_1 = require("@oclif/core");
|
|
33
|
+
const ora_1 = __importDefault(require("ora"));
|
|
34
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
35
|
+
const fs = __importStar(require("fs/promises"));
|
|
36
|
+
const path = __importStar(require("path"));
|
|
37
|
+
const config_loader_js_1 = require("../utils/config-loader.js");
|
|
38
|
+
const Database_js_1 = require("../database/Database.js");
|
|
39
|
+
const PromptEngine_js_1 = require("../prompts/PromptEngine.js");
|
|
40
|
+
const SampleQueryGenerator_js_1 = require("../generators/SampleQueryGenerator.js");
|
|
41
|
+
class GenerateQueries extends core_1.Command {
|
|
42
|
+
async run() {
|
|
43
|
+
const { flags } = await this.parse(GenerateQueries);
|
|
44
|
+
const spinner = (0, ora_1.default)();
|
|
45
|
+
try {
|
|
46
|
+
// Load configuration for database connection and AI settings
|
|
47
|
+
spinner.start('Loading configuration');
|
|
48
|
+
const config = await config_loader_js_1.ConfigLoader.load(flags.config);
|
|
49
|
+
spinner.succeed('Configuration loaded');
|
|
50
|
+
// Load existing state
|
|
51
|
+
spinner.start('Loading existing analysis state');
|
|
52
|
+
const stateJson = await fs.readFile(flags['from-state'], 'utf-8');
|
|
53
|
+
const state = JSON.parse(stateJson);
|
|
54
|
+
spinner.succeed(`State loaded: ${state.schemas.length} schemas, ${state.schemas.reduce((sum, s) => sum + s.tables.length, 0)} tables`);
|
|
55
|
+
// Determine output directory
|
|
56
|
+
const outputDir = flags['output-dir'] || path.dirname(flags['from-state']);
|
|
57
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
58
|
+
// Connect to database
|
|
59
|
+
spinner.start('Connecting to database');
|
|
60
|
+
const driverConfig = {
|
|
61
|
+
provider: config.database.provider || 'sqlserver',
|
|
62
|
+
host: config.database.server,
|
|
63
|
+
port: config.database.port,
|
|
64
|
+
database: config.database.database,
|
|
65
|
+
user: config.database.user,
|
|
66
|
+
password: config.database.password,
|
|
67
|
+
encrypt: config.database.encrypt,
|
|
68
|
+
trustServerCertificate: config.database.trustServerCertificate,
|
|
69
|
+
connectionTimeout: config.database.connectionTimeout,
|
|
70
|
+
requestTimeout: config.database.requestTimeout,
|
|
71
|
+
maxConnections: config.database.maxConnections,
|
|
72
|
+
minConnections: config.database.minConnections,
|
|
73
|
+
idleTimeoutMillis: config.database.idleTimeoutMillis
|
|
74
|
+
};
|
|
75
|
+
const db = new Database_js_1.DatabaseConnection(driverConfig);
|
|
76
|
+
await db.connect();
|
|
77
|
+
const testResult = await db.test();
|
|
78
|
+
if (!testResult.success) {
|
|
79
|
+
throw new Error(`Database connection failed: ${testResult.message}`);
|
|
80
|
+
}
|
|
81
|
+
spinner.succeed('Connected to database');
|
|
82
|
+
// Initialize prompt engine
|
|
83
|
+
spinner.start('Initializing AI prompt engine');
|
|
84
|
+
const promptsDir = path.join(__dirname, '../../prompts');
|
|
85
|
+
const promptEngine = new PromptEngine_js_1.PromptEngine(config.ai, promptsDir);
|
|
86
|
+
await promptEngine.initialize();
|
|
87
|
+
spinner.succeed('Prompt engine ready');
|
|
88
|
+
// Build query generation config
|
|
89
|
+
const queryConfig = {
|
|
90
|
+
enabled: true,
|
|
91
|
+
queriesPerTable: flags['queries-per-table'] || config.analysis.sampleQueryGeneration?.queriesPerTable || 5,
|
|
92
|
+
maxExecutionTime: flags['max-execution-time'] || config.analysis.sampleQueryGeneration?.maxExecutionTime || 30000,
|
|
93
|
+
includeMultiQueryPatterns: config.analysis.sampleQueryGeneration?.includeMultiQueryPatterns !== false,
|
|
94
|
+
validateAlignment: config.analysis.sampleQueryGeneration?.validateAlignment !== false,
|
|
95
|
+
tokenBudget: config.analysis.sampleQueryGeneration?.tokenBudget || 100000,
|
|
96
|
+
maxRowsInSample: config.analysis.sampleQueryGeneration?.maxRowsInSample || 10,
|
|
97
|
+
maxTables: config.analysis.sampleQueryGeneration?.maxTables // Optional, defaults to 10 in generator
|
|
98
|
+
};
|
|
99
|
+
// Use AI config from main settings
|
|
100
|
+
const model = config.ai.model;
|
|
101
|
+
const effortLevel = config.ai.effortLevel || 75;
|
|
102
|
+
const maxTokens = config.ai.maxTokens || 16000; // Use config value or default
|
|
103
|
+
// Determine output file paths for incremental writes
|
|
104
|
+
const queriesPath = path.join(outputDir, 'sample-queries.json');
|
|
105
|
+
const summaryPath = path.join(outputDir, 'sample-queries-summary.json');
|
|
106
|
+
// Create generator
|
|
107
|
+
spinner.start('Generating sample queries');
|
|
108
|
+
const generator = new SampleQueryGenerator_js_1.SampleQueryGenerator(queryConfig, promptEngine, db.getDriver(), model, effortLevel, maxTokens, queriesPath, // Pass queries output path for incremental writes
|
|
109
|
+
summaryPath // Pass summary output path for incremental writes
|
|
110
|
+
);
|
|
111
|
+
// Generate queries
|
|
112
|
+
const result = await generator.generateQueries(state.schemas);
|
|
113
|
+
await db.close();
|
|
114
|
+
if (result.success) {
|
|
115
|
+
// Save queries and summary (final write to ensure we have the complete set)
|
|
116
|
+
// Note: Both were already written incrementally during generation
|
|
117
|
+
await fs.writeFile(queriesPath, JSON.stringify(result.queries, null, 2), 'utf-8');
|
|
118
|
+
await fs.writeFile(summaryPath, JSON.stringify(result.summary, null, 2), 'utf-8');
|
|
119
|
+
spinner.succeed('Sample queries generated!');
|
|
120
|
+
this.log(chalk_1.default.green('\n✓ Query generation complete!'));
|
|
121
|
+
this.log(` Total queries: ${result.summary.totalQueriesGenerated}`);
|
|
122
|
+
this.log(` Validated: ${result.summary.queriesValidated}`);
|
|
123
|
+
this.log(` Failed validation: ${result.summary.queriesFailed}`);
|
|
124
|
+
this.log(` Tokens used: ${result.summary.tokensUsed.toLocaleString()}`);
|
|
125
|
+
this.log(` Estimated cost: $${result.summary.estimatedCost.toFixed(2)}`);
|
|
126
|
+
this.log(` Average confidence: ${(result.summary.averageConfidence * 100).toFixed(1)}%`);
|
|
127
|
+
this.log(` Execution time: ${(result.summary.totalExecutionTime / 1000).toFixed(1)}s`);
|
|
128
|
+
this.log(`\n Output files:`);
|
|
129
|
+
this.log(` - ${queriesPath}`);
|
|
130
|
+
this.log(` - ${summaryPath}`);
|
|
131
|
+
this.log(chalk_1.default.blue('\n Query breakdown:'));
|
|
132
|
+
this.log(` By type:`);
|
|
133
|
+
Object.entries(result.summary.queriesByType).forEach(([type, count]) => {
|
|
134
|
+
this.log(` ${type}: ${count}`);
|
|
135
|
+
});
|
|
136
|
+
this.log(` By complexity:`);
|
|
137
|
+
Object.entries(result.summary.queriesByComplexity).forEach(([complexity, count]) => {
|
|
138
|
+
this.log(` ${complexity}: ${count}`);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
spinner.fail('Query generation failed');
|
|
143
|
+
this.error(result.errorMessage || 'Unknown error');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
spinner.fail('Command failed');
|
|
148
|
+
this.error(error.message);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
GenerateQueries.description = 'Generate sample SQL queries from existing analysis state';
|
|
153
|
+
GenerateQueries.examples = [
|
|
154
|
+
'$ db-auto-doc generate-queries --from-state ./output/run-1/state.json',
|
|
155
|
+
'$ db-auto-doc generate-queries --from-state ./output/run-1/state.json --output-dir ./queries',
|
|
156
|
+
'$ db-auto-doc generate-queries --from-state ./output/run-1/state.json --queries-per-table 10'
|
|
157
|
+
];
|
|
158
|
+
GenerateQueries.flags = {
|
|
159
|
+
'from-state': core_1.Flags.string({
|
|
160
|
+
description: 'Path to existing state.json file from previous analysis',
|
|
161
|
+
required: true
|
|
162
|
+
}),
|
|
163
|
+
'output-dir': core_1.Flags.string({
|
|
164
|
+
description: 'Output directory for generated queries',
|
|
165
|
+
required: false
|
|
166
|
+
}),
|
|
167
|
+
config: core_1.Flags.string({
|
|
168
|
+
char: 'c',
|
|
169
|
+
description: 'Path to config file (for database connection and AI settings)',
|
|
170
|
+
default: './config.json'
|
|
171
|
+
}),
|
|
172
|
+
'queries-per-table': core_1.Flags.integer({
|
|
173
|
+
description: 'Number of queries to generate per table',
|
|
174
|
+
required: false
|
|
175
|
+
}),
|
|
176
|
+
'max-execution-time': core_1.Flags.integer({
|
|
177
|
+
description: 'Maximum execution time for query validation (ms)',
|
|
178
|
+
required: false
|
|
179
|
+
})
|
|
180
|
+
};
|
|
181
|
+
exports.default = GenerateQueries;
|
|
182
|
+
//# sourceMappingURL=generate-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-queries.js","sourceRoot":"","sources":["../../src/commands/generate-queries.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command - Initialize new project
|
|
3
|
+
*/
|
|
1
4
|
import { Command } from '@oclif/core';
|
|
2
5
|
export default class Init extends Command {
|
|
3
6
|
static description: string;
|
|
4
7
|
static examples: string[];
|
|
5
|
-
static flags: {
|
|
6
|
-
interactive: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
7
|
-
connection: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
8
|
-
};
|
|
9
8
|
run(): Promise<void>;
|
|
10
9
|
}
|
|
11
10
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAMtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAAwC;IAE1D,MAAM,CAAC,QAAQ,WAA0B;IAEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyN3B"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,163 +1,225 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
2
|
+
/**
|
|
3
|
+
* Init command - Initialize new project
|
|
4
|
+
*/
|
|
25
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
7
|
};
|
|
28
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
9
|
const core_1 = require("@oclif/core");
|
|
30
|
-
const
|
|
31
|
-
const ora_1 = __importDefault(require("ora"));
|
|
32
|
-
const fs = __importStar(require("fs/promises"));
|
|
33
|
-
const path = __importStar(require("path"));
|
|
34
|
-
const connection_1 = require("../database/connection");
|
|
35
|
-
const state_manager_1 = require("../state/state-manager");
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
36
11
|
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const config_loader_js_1 = require("../utils/config-loader.js");
|
|
13
|
+
const Database_js_1 = require("../database/Database.js");
|
|
37
14
|
class Init extends core_1.Command {
|
|
38
15
|
async run() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
16
|
+
this.log(chalk_1.default.blue('DBAutoDoc Initialization\n'));
|
|
17
|
+
// Database configuration
|
|
18
|
+
const dbAnswers = await inquirer_1.default.prompt([
|
|
19
|
+
{
|
|
20
|
+
type: 'input',
|
|
21
|
+
name: 'server',
|
|
22
|
+
message: 'SQL Server host:',
|
|
23
|
+
default: 'localhost'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'input',
|
|
27
|
+
name: 'database',
|
|
28
|
+
message: 'Database name:',
|
|
29
|
+
validate: (input) => input.length > 0 || 'Database name is required'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: 'input',
|
|
33
|
+
name: 'user',
|
|
34
|
+
message: 'Username:',
|
|
35
|
+
default: 'sa'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
type: 'password',
|
|
39
|
+
name: 'password',
|
|
40
|
+
message: 'Password:',
|
|
41
|
+
mask: '*'
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: 'confirm',
|
|
45
|
+
name: 'encrypt',
|
|
46
|
+
message: 'Use encryption?',
|
|
47
|
+
default: true
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'confirm',
|
|
51
|
+
name: 'trustServerCertificate',
|
|
52
|
+
message: 'Trust server certificate?',
|
|
53
|
+
default: false
|
|
63
54
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
55
|
+
]);
|
|
56
|
+
// Test connection
|
|
57
|
+
this.log(chalk_1.default.yellow('\nTesting database connection...'));
|
|
58
|
+
const dbConfig = {
|
|
59
|
+
provider: 'sqlserver',
|
|
60
|
+
host: dbAnswers.server,
|
|
61
|
+
database: dbAnswers.database,
|
|
62
|
+
user: dbAnswers.user,
|
|
63
|
+
password: dbAnswers.password,
|
|
64
|
+
encrypt: dbAnswers.encrypt,
|
|
65
|
+
trustServerCertificate: dbAnswers.trustServerCertificate
|
|
66
|
+
};
|
|
67
|
+
const db = new Database_js_1.DatabaseConnection(dbConfig);
|
|
68
|
+
const testResult = await db.test();
|
|
69
|
+
await db.close();
|
|
70
|
+
if (!testResult.success) {
|
|
71
|
+
this.error(`Connection failed: ${testResult.message}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.log(chalk_1.default.green('✓ Database connection successful!\n'));
|
|
75
|
+
// AI configuration
|
|
76
|
+
const aiAnswers = await inquirer_1.default.prompt([
|
|
77
|
+
{
|
|
78
|
+
type: 'list',
|
|
79
|
+
name: 'provider',
|
|
80
|
+
message: 'AI Provider:',
|
|
81
|
+
choices: ['openai', 'anthropic', 'groq']
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'input',
|
|
85
|
+
name: 'model',
|
|
86
|
+
message: 'Model name:',
|
|
87
|
+
default: (answers) => {
|
|
88
|
+
if (answers.provider === 'openai')
|
|
89
|
+
return 'gpt-4-turbo-preview';
|
|
90
|
+
if (answers.provider === 'anthropic')
|
|
91
|
+
return 'claude-3-opus-20240229';
|
|
92
|
+
if (answers.provider === 'groq')
|
|
93
|
+
return 'mixtral-8x7b-32768';
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: 'password',
|
|
99
|
+
name: 'apiKey',
|
|
100
|
+
message: 'API Key:',
|
|
101
|
+
mask: '*',
|
|
102
|
+
validate: (input) => input.length > 0 || 'API key is required'
|
|
76
103
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
104
|
+
]);
|
|
105
|
+
// Optional seed context
|
|
106
|
+
const contextAnswers = await inquirer_1.default.prompt([
|
|
107
|
+
{
|
|
108
|
+
type: 'confirm',
|
|
109
|
+
name: 'addContext',
|
|
110
|
+
message: 'Add seed context for better analysis?',
|
|
111
|
+
default: true
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'input',
|
|
115
|
+
name: 'overallPurpose',
|
|
116
|
+
message: 'Database overall purpose (e.g., "E-commerce platform"):',
|
|
117
|
+
when: (answers) => answers.addContext
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'input',
|
|
121
|
+
name: 'businessDomains',
|
|
122
|
+
message: 'Business domains (comma-separated, e.g., "Sales, Inventory, Billing"):',
|
|
123
|
+
when: (answers) => answers.addContext
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'input',
|
|
127
|
+
name: 'industryContext',
|
|
128
|
+
message: 'Industry context (e.g., "Healthcare", "Finance"):',
|
|
129
|
+
when: (answers) => answers.addContext
|
|
91
130
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
businessDomains: domains.split(',').map((d) => d.trim()),
|
|
132
|
-
};
|
|
133
|
-
await stateManager.save();
|
|
134
|
-
this.log(chalk_1.default.green('✓ Saved seed context'));
|
|
135
|
-
}
|
|
131
|
+
]);
|
|
132
|
+
// Sample query generation options
|
|
133
|
+
const queryAnswers = await inquirer_1.default.prompt([
|
|
134
|
+
{
|
|
135
|
+
type: 'confirm',
|
|
136
|
+
name: 'enableSampleQueries',
|
|
137
|
+
message: 'Generate sample queries for each table?',
|
|
138
|
+
default: false
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'number',
|
|
142
|
+
name: 'queriesPerTable',
|
|
143
|
+
message: 'Number of queries to generate per table:',
|
|
144
|
+
default: 5,
|
|
145
|
+
when: (answers) => answers.enableSampleQueries,
|
|
146
|
+
validate: (input) => input > 0 || 'Must be greater than 0'
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'number',
|
|
150
|
+
name: 'maxTables',
|
|
151
|
+
message: 'Max number of tables to generate queries for (0 = all tables):',
|
|
152
|
+
default: 10,
|
|
153
|
+
when: (answers) => answers.enableSampleQueries,
|
|
154
|
+
validate: (input) => input >= 0 || 'Must be 0 or greater'
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'number',
|
|
158
|
+
name: 'tokenBudget',
|
|
159
|
+
message: 'Token budget for query generation (0 = unlimited):',
|
|
160
|
+
default: 100000,
|
|
161
|
+
when: (answers) => answers.enableSampleQueries,
|
|
162
|
+
validate: (input) => input >= 0 || 'Must be 0 or greater'
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'number',
|
|
166
|
+
name: 'maxExecutionTime',
|
|
167
|
+
message: 'Max execution time for query validation (ms):',
|
|
168
|
+
default: 30000,
|
|
169
|
+
when: (answers) => answers.enableSampleQueries
|
|
136
170
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
171
|
+
]);
|
|
172
|
+
// Create configuration
|
|
173
|
+
const config = config_loader_js_1.ConfigLoader.createDefault();
|
|
174
|
+
// Update with user inputs
|
|
175
|
+
config.database = {
|
|
176
|
+
server: dbAnswers.server,
|
|
177
|
+
port: 1433,
|
|
178
|
+
database: dbAnswers.database,
|
|
179
|
+
user: dbAnswers.user,
|
|
180
|
+
password: dbAnswers.password,
|
|
181
|
+
encrypt: dbAnswers.encrypt,
|
|
182
|
+
trustServerCertificate: dbAnswers.trustServerCertificate,
|
|
183
|
+
connectionTimeout: 30000
|
|
184
|
+
};
|
|
185
|
+
config.ai = {
|
|
186
|
+
provider: aiAnswers.provider,
|
|
187
|
+
model: aiAnswers.model,
|
|
188
|
+
apiKey: aiAnswers.apiKey,
|
|
189
|
+
temperature: 0.1,
|
|
190
|
+
maxTokens: 4000
|
|
191
|
+
};
|
|
192
|
+
if (contextAnswers.addContext) {
|
|
193
|
+
config['seedContext'] = {
|
|
194
|
+
overallPurpose: contextAnswers.overallPurpose || undefined,
|
|
195
|
+
businessDomains: contextAnswers.businessDomains
|
|
196
|
+
? contextAnswers.businessDomains.split(',').map((d) => d.trim())
|
|
197
|
+
: undefined,
|
|
198
|
+
industryContext: contextAnswers.industryContext || undefined
|
|
199
|
+
};
|
|
142
200
|
}
|
|
143
|
-
|
|
144
|
-
|
|
201
|
+
// Add sample query generation config if enabled
|
|
202
|
+
if (queryAnswers.enableSampleQueries) {
|
|
203
|
+
config.analysis.sampleQueryGeneration = {
|
|
204
|
+
enabled: true,
|
|
205
|
+
queriesPerTable: queryAnswers.queriesPerTable || 5,
|
|
206
|
+
maxExecutionTime: queryAnswers.maxExecutionTime || 30000,
|
|
207
|
+
includeMultiQueryPatterns: true,
|
|
208
|
+
validateAlignment: true,
|
|
209
|
+
tokenBudget: queryAnswers.tokenBudget !== undefined ? queryAnswers.tokenBudget : 100000,
|
|
210
|
+
maxRowsInSample: 10,
|
|
211
|
+
maxTables: queryAnswers.maxTables !== undefined ? queryAnswers.maxTables : 10
|
|
212
|
+
};
|
|
145
213
|
}
|
|
214
|
+
// Save configuration
|
|
215
|
+
await config_loader_js_1.ConfigLoader.save(config, './config.json');
|
|
216
|
+
this.log(chalk_1.default.green('\n✓ Configuration saved to config.json'));
|
|
217
|
+
this.log(chalk_1.default.blue('\nNext steps:'));
|
|
218
|
+
this.log(' 1. Run: db-auto-doc analyze');
|
|
219
|
+
this.log(' 2. Run: db-auto-doc export --sql --markdown');
|
|
146
220
|
}
|
|
147
221
|
}
|
|
148
|
-
Init.description = 'Initialize
|
|
149
|
-
Init.examples = [
|
|
150
|
-
'<%= config.bin %> <%= command.id %>',
|
|
151
|
-
'<%= config.bin %> <%= command.id %> --interactive',
|
|
152
|
-
];
|
|
153
|
-
Init.flags = {
|
|
154
|
-
interactive: core_1.Flags.boolean({
|
|
155
|
-
description: 'Interactive setup',
|
|
156
|
-
default: true,
|
|
157
|
-
}),
|
|
158
|
-
connection: core_1.Flags.string({
|
|
159
|
-
description: 'Connection string (skip prompts)',
|
|
160
|
-
}),
|
|
161
|
-
};
|
|
222
|
+
Init.description = 'Initialize a new DBAutoDoc project';
|
|
223
|
+
Init.examples = ['$ db-auto-doc init'];
|
|
162
224
|
exports.default = Init;
|
|
163
225
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|