@memberjunction/query-gen 0.0.1 → 2.126.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.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +34 -0
- package/COORDINATOR.md +768 -0
- package/IMPLEMENTATION_PLAN.md +1753 -0
- package/LLM_ENTITY_GROUPING_PLAN.md +977 -0
- package/README.md +675 -29
- package/dist/cli/commands/export.d.ts +15 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +178 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +19 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +282 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +17 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +193 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/config.d.ts +51 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +142 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +57 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/EntityGrouper.d.ts +74 -0
- package/dist/core/EntityGrouper.d.ts.map +1 -0
- package/dist/core/EntityGrouper.js +246 -0
- package/dist/core/EntityGrouper.js.map +1 -0
- package/dist/core/MetadataExporter.d.ts +59 -0
- package/dist/core/MetadataExporter.d.ts.map +1 -0
- package/dist/core/MetadataExporter.js +151 -0
- package/dist/core/MetadataExporter.js.map +1 -0
- package/dist/core/QueryDatabaseWriter.d.ts +50 -0
- package/dist/core/QueryDatabaseWriter.d.ts.map +1 -0
- package/dist/core/QueryDatabaseWriter.js +152 -0
- package/dist/core/QueryDatabaseWriter.js.map +1 -0
- package/dist/core/QueryFixer.d.ts +48 -0
- package/dist/core/QueryFixer.d.ts.map +1 -0
- package/dist/core/QueryFixer.js +115 -0
- package/dist/core/QueryFixer.js.map +1 -0
- package/dist/core/QueryRefiner.d.ts +94 -0
- package/dist/core/QueryRefiner.d.ts.map +1 -0
- package/dist/core/QueryRefiner.js +267 -0
- package/dist/core/QueryRefiner.js.map +1 -0
- package/dist/core/QueryTester.d.ts +70 -0
- package/dist/core/QueryTester.d.ts.map +1 -0
- package/dist/core/QueryTester.js +243 -0
- package/dist/core/QueryTester.js.map +1 -0
- package/dist/core/QueryWriter.d.ts +57 -0
- package/dist/core/QueryWriter.d.ts.map +1 -0
- package/dist/core/QueryWriter.js +184 -0
- package/dist/core/QueryWriter.js.map +1 -0
- package/dist/core/QuestionGenerator.d.ts +58 -0
- package/dist/core/QuestionGenerator.d.ts.map +1 -0
- package/dist/core/QuestionGenerator.js +145 -0
- package/dist/core/QuestionGenerator.js.map +1 -0
- package/dist/data/schema.d.ts +230 -0
- package/dist/data/schema.d.ts.map +1 -0
- package/dist/data/schema.js +6 -0
- package/dist/data/schema.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/PromptNames.d.ts +32 -0
- package/dist/prompts/PromptNames.d.ts.map +1 -0
- package/dist/prompts/PromptNames.js +35 -0
- package/dist/prompts/PromptNames.js.map +1 -0
- package/dist/utils/category-builder.d.ts +28 -0
- package/dist/utils/category-builder.d.ts.map +1 -0
- package/dist/utils/category-builder.js +90 -0
- package/dist/utils/category-builder.js.map +1 -0
- package/dist/utils/entity-helpers.d.ts +49 -0
- package/dist/utils/entity-helpers.d.ts.map +1 -0
- package/dist/utils/entity-helpers.js +189 -0
- package/dist/utils/entity-helpers.js.map +1 -0
- package/dist/utils/error-handlers.d.ts +19 -0
- package/dist/utils/error-handlers.d.ts.map +1 -0
- package/dist/utils/error-handlers.js +41 -0
- package/dist/utils/error-handlers.js.map +1 -0
- package/dist/utils/graph-helpers.d.ts +51 -0
- package/dist/utils/graph-helpers.d.ts.map +1 -0
- package/dist/utils/graph-helpers.js +82 -0
- package/dist/utils/graph-helpers.js.map +1 -0
- package/dist/utils/prompt-helpers.d.ts +25 -0
- package/dist/utils/prompt-helpers.d.ts.map +1 -0
- package/dist/utils/prompt-helpers.js +66 -0
- package/dist/utils/prompt-helpers.js.map +1 -0
- package/dist/utils/query-helpers.d.ts +23 -0
- package/dist/utils/query-helpers.d.ts.map +1 -0
- package/dist/utils/query-helpers.js +34 -0
- package/dist/utils/query-helpers.js.map +1 -0
- package/dist/utils/user-helpers.d.ts +15 -0
- package/dist/utils/user-helpers.d.ts.map +1 -0
- package/dist/utils/user-helpers.js +32 -0
- package/dist/utils/user-helpers.js.map +1 -0
- package/dist/vectors/EmbeddingService.d.ts +58 -0
- package/dist/vectors/EmbeddingService.d.ts.map +1 -0
- package/dist/vectors/EmbeddingService.js +90 -0
- package/dist/vectors/EmbeddingService.js.map +1 -0
- package/dist/vectors/SimilaritySearch.d.ts +51 -0
- package/dist/vectors/SimilaritySearch.d.ts.map +1 -0
- package/dist/vectors/SimilaritySearch.js +85 -0
- package/dist/vectors/SimilaritySearch.js.map +1 -0
- package/docs/API.md +1040 -0
- package/docs/ARCHITECTURE.md +1120 -0
- package/examples/advanced-usage.ts +401 -0
- package/examples/basic-usage.ts +285 -0
- package/package.json +48 -6
- package/src/cli/commands/export.ts +173 -0
- package/src/cli/commands/generate.ts +330 -0
- package/src/cli/commands/validate.ts +185 -0
- package/src/cli/config.ts +203 -0
- package/src/cli/index.ts +63 -0
- package/src/core/EntityGrouper.ts +318 -0
- package/src/core/MetadataExporter.ts +148 -0
- package/src/core/QueryDatabaseWriter.ts +187 -0
- package/src/core/QueryFixer.ts +153 -0
- package/src/core/QueryRefiner.ts +382 -0
- package/src/core/QueryTester.ts +264 -0
- package/src/core/QueryWriter.ts +239 -0
- package/src/core/QuestionGenerator.ts +199 -0
- package/src/data/golden-queries.json +1371 -0
- package/src/data/schema.ts +252 -0
- package/src/index.ts +49 -0
- package/src/prompts/PromptNames.ts +36 -0
- package/src/utils/category-builder.ts +97 -0
- package/src/utils/entity-helpers.ts +203 -0
- package/src/utils/error-handlers.ts +41 -0
- package/src/utils/graph-helpers.ts +99 -0
- package/src/utils/prompt-helpers.ts +79 -0
- package/src/utils/query-helpers.ts +32 -0
- package/src/utils/user-helpers.ts +39 -0
- package/src/vectors/EmbeddingService.ts +109 -0
- package/src/vectors/SimilaritySearch.ts +108 -0
- package/tsconfig.json +39 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validate command - Validate existing query templates
|
|
4
|
+
*
|
|
5
|
+
* Tests existing query metadata files to ensure they are valid:
|
|
6
|
+
* - SQL syntax validation
|
|
7
|
+
* - Parameter validation
|
|
8
|
+
* - Output field validation
|
|
9
|
+
* - Execution testing (optional)
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.validateCommand = void 0;
|
|
39
|
+
const ora_1 = __importDefault(require("ora"));
|
|
40
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const core_1 = require("@memberjunction/core");
|
|
44
|
+
const user_helpers_1 = require("../../utils/user-helpers");
|
|
45
|
+
const QueryTester_1 = require("../../core/QueryTester");
|
|
46
|
+
const error_handlers_1 = require("../../utils/error-handlers");
|
|
47
|
+
const config_1 = require("../config");
|
|
48
|
+
/**
|
|
49
|
+
* Execute the validate command
|
|
50
|
+
*
|
|
51
|
+
* Loads query metadata files and validates each query template.
|
|
52
|
+
* Reports success/failure statistics.
|
|
53
|
+
*/
|
|
54
|
+
async function validateCommand(options) {
|
|
55
|
+
const spinner = (0, ora_1.default)('Initializing validation...').start();
|
|
56
|
+
try {
|
|
57
|
+
const queryPath = String(options.path || './metadata/queries');
|
|
58
|
+
const verbose = Boolean(options.verbose);
|
|
59
|
+
// Load configuration
|
|
60
|
+
const config = (0, config_1.loadConfig)(options);
|
|
61
|
+
// 1. Get system user from UserCache (populated by provider initialization)
|
|
62
|
+
const contextUser = (0, user_helpers_1.getSystemUser)();
|
|
63
|
+
// 2. Verify database connection and load metadata
|
|
64
|
+
spinner.text = 'Loading metadata...';
|
|
65
|
+
// Assume provider is already configured by the calling application
|
|
66
|
+
if (!core_1.Metadata.Provider) {
|
|
67
|
+
throw new Error('Metadata provider not configured. Please ensure database connection is set up before running CLI.');
|
|
68
|
+
}
|
|
69
|
+
spinner.succeed('Metadata loaded');
|
|
70
|
+
// 3. Load query metadata files
|
|
71
|
+
spinner.start(`Loading query files from ${queryPath}...`);
|
|
72
|
+
const queryFiles = await loadQueryFiles(queryPath);
|
|
73
|
+
spinner.succeed(chalk_1.default.green(`Found ${queryFiles.length} query files`));
|
|
74
|
+
// 4. Validate each query
|
|
75
|
+
const dataProvider = core_1.Metadata.Provider.DatabaseConnection;
|
|
76
|
+
let passCount = 0;
|
|
77
|
+
let failCount = 0;
|
|
78
|
+
const errors = [];
|
|
79
|
+
for (let i = 0; i < queryFiles.length; i++) {
|
|
80
|
+
const { file, queries } = queryFiles[i];
|
|
81
|
+
const filePrefix = chalk_1.default.cyan(`[${i + 1}/${queryFiles.length}]`);
|
|
82
|
+
spinner.start(`${filePrefix} Validating ${chalk_1.default.dim(file)}...`);
|
|
83
|
+
for (const queryRecord of queries) {
|
|
84
|
+
try {
|
|
85
|
+
const query = convertMetadataToGeneratedQuery(queryRecord);
|
|
86
|
+
// Create a minimal business question and entity metadata for testing
|
|
87
|
+
const dummyQuestion = {
|
|
88
|
+
userQuestion: queryRecord.fields.UserQuestion || 'Test query',
|
|
89
|
+
description: queryRecord.fields.Description || '',
|
|
90
|
+
technicalDescription: queryRecord.fields.TechnicalDescription || '',
|
|
91
|
+
complexity: 'medium',
|
|
92
|
+
requiresAggregation: false,
|
|
93
|
+
requiresJoins: false,
|
|
94
|
+
entities: []
|
|
95
|
+
};
|
|
96
|
+
const tester = new QueryTester_1.QueryTester(dataProvider, [], dummyQuestion, contextUser, config);
|
|
97
|
+
// Test query execution
|
|
98
|
+
const testResult = await tester.testQuery(query, 1);
|
|
99
|
+
if (testResult.success) {
|
|
100
|
+
passCount++;
|
|
101
|
+
if (verbose) {
|
|
102
|
+
spinner.info(`${filePrefix} ${chalk_1.default.green('✓')} ${queryRecord.fields.Name}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
failCount++;
|
|
107
|
+
const errorMsg = testResult.error || 'Unknown error';
|
|
108
|
+
errors.push({ file, error: `${queryRecord.fields.Name}: ${errorMsg}` });
|
|
109
|
+
if (verbose) {
|
|
110
|
+
spinner.warn(`${filePrefix} ${chalk_1.default.red('✗')} ${queryRecord.fields.Name}: ${errorMsg}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
failCount++;
|
|
116
|
+
const errorMsg = (0, error_handlers_1.extractErrorMessage)(error, 'Query Validation');
|
|
117
|
+
errors.push({ file, error: `${queryRecord.fields.Name}: ${errorMsg}` });
|
|
118
|
+
if (verbose) {
|
|
119
|
+
spinner.warn(`${filePrefix} ${chalk_1.default.red('✗')} ${queryRecord.fields.Name}: ${errorMsg}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
spinner.succeed(`${filePrefix} ${chalk_1.default.dim(file)} complete`);
|
|
124
|
+
}
|
|
125
|
+
// 5. Summary
|
|
126
|
+
if (failCount === 0) {
|
|
127
|
+
spinner.succeed(chalk_1.default.green.bold(`✓ All ${passCount} queries validated successfully!`));
|
|
128
|
+
console.log('\n' + chalk_1.default.green.bold('✓ Validation complete!\n'));
|
|
129
|
+
console.log(chalk_1.default.bold('Summary:'));
|
|
130
|
+
console.log(` Total Queries: ${chalk_1.default.cyan(passCount.toString())}`);
|
|
131
|
+
console.log(` Passed: ${chalk_1.default.green(passCount.toString())}`);
|
|
132
|
+
console.log(` Failed: ${chalk_1.default.green('0')}`);
|
|
133
|
+
process.exit(0);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
spinner.fail(chalk_1.default.yellow(`Validation completed with ${failCount} errors`));
|
|
137
|
+
console.log('\n' + chalk_1.default.yellow.bold('⚠ Validation completed with errors\n'));
|
|
138
|
+
console.log(chalk_1.default.bold('Summary:'));
|
|
139
|
+
console.log(` Total Queries: ${chalk_1.default.cyan((passCount + failCount).toString())}`);
|
|
140
|
+
console.log(` Passed: ${chalk_1.default.green(passCount.toString())}`);
|
|
141
|
+
console.log(` Failed: ${chalk_1.default.red(failCount.toString())}`);
|
|
142
|
+
if (errors.length > 0) {
|
|
143
|
+
console.log('\n' + chalk_1.default.bold('Errors:'));
|
|
144
|
+
for (const { file, error } of errors) {
|
|
145
|
+
console.log(chalk_1.default.red(` ${file}: ${error}`));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
spinner.fail(chalk_1.default.red('Validation failed'));
|
|
153
|
+
console.error(chalk_1.default.red((0, error_handlers_1.extractErrorMessage)(error, 'Query Validation')));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.validateCommand = validateCommand;
|
|
158
|
+
/**
|
|
159
|
+
* Load all query metadata files from the specified directory
|
|
160
|
+
*/
|
|
161
|
+
async function loadQueryFiles(queryPath) {
|
|
162
|
+
const files = [];
|
|
163
|
+
if (!fs.existsSync(queryPath)) {
|
|
164
|
+
throw new Error(`Query path not found: ${queryPath}`);
|
|
165
|
+
}
|
|
166
|
+
const entries = fs.readdirSync(queryPath);
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
const fullPath = path.join(queryPath, entry);
|
|
169
|
+
const stat = fs.statSync(fullPath);
|
|
170
|
+
if (stat.isFile() && entry.endsWith('.json')) {
|
|
171
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
172
|
+
const data = JSON.parse(content);
|
|
173
|
+
// Handle both single query and array formats
|
|
174
|
+
const queries = Array.isArray(data) ? data : [data];
|
|
175
|
+
files.push({ file: entry, queries });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return files;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Convert metadata record to GeneratedQuery format for testing
|
|
182
|
+
*
|
|
183
|
+
* Note: QueryFields and QueryParameters are auto-extracted by QueryEntity.server.ts,
|
|
184
|
+
* so we only validate the SQL itself. The validate command focuses on SQL syntax
|
|
185
|
+
* and execution, not on field/parameter metadata which is managed by MJ.
|
|
186
|
+
*/
|
|
187
|
+
function convertMetadataToGeneratedQuery(record) {
|
|
188
|
+
return {
|
|
189
|
+
sql: record.fields.SQL,
|
|
190
|
+
parameters: [], // Not needed for validation - QueryEntity will extract
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,8CAAsB;AACtB,kDAA0B;AAC1B,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAsE;AACtE,2DAAyD;AACzD,wDAAqD;AACrD,+DAAiE;AAEjE,sCAAuC;AAEvC;;;;;GAKG;AACI,KAAK,UAAU,eAAe,CAAC,OAAgC;IACpE,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,oBAAoB,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEzC,qBAAqB;QACrB,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC;QAEnC,2EAA2E;QAC3E,MAAM,WAAW,GAAG,IAAA,4BAAa,GAAE,CAAC;QAEpC,kDAAkD;QAClD,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACrC,mEAAmE;QACnE,IAAI,CAAC,eAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACvH,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEnC,+BAA+B;QAC/B,OAAO,CAAC,KAAK,CAAC,4BAA4B,SAAS,KAAK,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,SAAS,UAAU,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC;QAEvE,yBAAyB;QACzB,MAAM,YAAY,GAAG,eAAQ,CAAC,QAAQ,CAAC,kBAA0C,CAAC;QAClF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,MAAM,GAA2C,EAAE,CAAC;QAE1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAEjE,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,eAAe,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEhE,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;oBAE3D,qEAAqE;oBACrE,MAAM,aAAa,GAAG;wBACpB,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,YAAY,IAAI,YAAY;wBAC7D,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE;wBACjD,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE;wBACnE,UAAU,EAAE,QAAiB;wBAC7B,mBAAmB,EAAE,KAAK;wBAC1B,aAAa,EAAE,KAAK;wBACpB,QAAQ,EAAE,EAAE;qBACb,CAAC;oBAEF,MAAM,MAAM,GAAG,IAAI,yBAAW,CAAC,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;oBAErF,uBAAuB;oBACvB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAEpD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBACvB,SAAS,EAAE,CAAC;wBACZ,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC/E,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,SAAS,EAAE,CAAC;wBACZ,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,eAAe,CAAC;wBACrD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,EAAE,CAAC,CAAC;wBACxE,IAAI,OAAO,EAAE,CAAC;4BACZ,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;wBAC1F,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACxB,SAAS,EAAE,CAAC;oBACZ,MAAM,QAAQ,GAAG,IAAA,oCAAmB,EAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACxE,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;oBAC1F,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,IAAI,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/D,CAAC;QAED,aAAa;QACb,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,kCAAkC,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,aAAa,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,6BAA6B,SAAS,SAAS,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,aAAa,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1C,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IAEH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,IAAA,oCAAmB,EAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAnHD,0CAmHC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,MAAM,KAAK,GAA4D,EAAE,CAAC;IAE1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,6CAA6C;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,+BAA+B,CAAC,MAA2B;IAClE,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;QACtB,UAAU,EAAE,EAAE,EAAK,uDAAuD;KAC3E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for QueryGen
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration from mj.config.cjs and merges with CLI options
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* QueryGen configuration options
|
|
8
|
+
*/
|
|
9
|
+
export interface QueryGenConfig {
|
|
10
|
+
includeEntities: string[];
|
|
11
|
+
excludeEntities: string[];
|
|
12
|
+
excludeSchemas: string[];
|
|
13
|
+
questionsPerGroup: number;
|
|
14
|
+
minGroupSize: number;
|
|
15
|
+
maxGroupSize: number;
|
|
16
|
+
modelOverride?: string;
|
|
17
|
+
vendorOverride?: string;
|
|
18
|
+
embeddingModel: string;
|
|
19
|
+
maxRefinementIterations: number;
|
|
20
|
+
maxFixingIterations: number;
|
|
21
|
+
topSimilarQueries: number;
|
|
22
|
+
similarityWeights: {
|
|
23
|
+
userQuestion: number;
|
|
24
|
+
description: number;
|
|
25
|
+
technicalDescription: number;
|
|
26
|
+
};
|
|
27
|
+
outputMode: 'metadata' | 'database' | 'both';
|
|
28
|
+
outputDirectory: string;
|
|
29
|
+
outputCategoryDirectory?: string;
|
|
30
|
+
rootQueryCategory: string;
|
|
31
|
+
autoCreateEntityQueryCategories: boolean;
|
|
32
|
+
parallelGenerations: number;
|
|
33
|
+
enableCaching: boolean;
|
|
34
|
+
testWithSampleData: boolean;
|
|
35
|
+
requireMinRows: number;
|
|
36
|
+
maxRefinementRows: number;
|
|
37
|
+
verbose: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Load configuration from mj.config.cjs and merge with CLI options
|
|
41
|
+
*
|
|
42
|
+
* Configuration priority (highest to lowest):
|
|
43
|
+
* 1. CLI options (command line flags)
|
|
44
|
+
* 2. mj.config.cjs queryGen section
|
|
45
|
+
* 3. Default values
|
|
46
|
+
*
|
|
47
|
+
* @param cliOptions - Options provided via command line
|
|
48
|
+
* @returns Merged configuration ready for use
|
|
49
|
+
*/
|
|
50
|
+
export declare function loadConfig(cliOptions: Record<string, unknown>): QueryGenConfig;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAM7B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IAGzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAGrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IAGvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAG5B,iBAAiB,EAAE,MAAM,CAAC;IAG1B,iBAAiB,EAAE;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IAGF,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAGjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+BAA+B,EAAE,OAAO,CAAC;IAGzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IAGvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAsD9E"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration loader for QueryGen
|
|
4
|
+
*
|
|
5
|
+
* Loads configuration from mj.config.cjs and merges with CLI options
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.loadConfig = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Default configuration values
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
includeEntities: [],
|
|
14
|
+
excludeEntities: [],
|
|
15
|
+
excludeSchemas: ['sys', 'INFORMATION_SCHEMA', '__mj'],
|
|
16
|
+
questionsPerGroup: 2,
|
|
17
|
+
minGroupSize: 2, // Multi-entity groups have at least 2 entities
|
|
18
|
+
maxGroupSize: 3, // Keep groups small for focused questions
|
|
19
|
+
embeddingModel: 'text-embedding-3-small',
|
|
20
|
+
maxRefinementIterations: 3,
|
|
21
|
+
maxFixingIterations: 5,
|
|
22
|
+
topSimilarQueries: 5,
|
|
23
|
+
similarityWeights: {
|
|
24
|
+
userQuestion: 0.2,
|
|
25
|
+
description: 0.40,
|
|
26
|
+
technicalDescription: 0.40,
|
|
27
|
+
},
|
|
28
|
+
outputMode: 'metadata',
|
|
29
|
+
outputDirectory: './metadata/queries',
|
|
30
|
+
rootQueryCategory: 'Auto-Generated',
|
|
31
|
+
autoCreateEntityQueryCategories: false,
|
|
32
|
+
parallelGenerations: 1,
|
|
33
|
+
enableCaching: true,
|
|
34
|
+
testWithSampleData: true,
|
|
35
|
+
requireMinRows: 0,
|
|
36
|
+
maxRefinementRows: 10,
|
|
37
|
+
verbose: false,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Load configuration from mj.config.cjs and merge with CLI options
|
|
41
|
+
*
|
|
42
|
+
* Configuration priority (highest to lowest):
|
|
43
|
+
* 1. CLI options (command line flags)
|
|
44
|
+
* 2. mj.config.cjs queryGen section
|
|
45
|
+
* 3. Default values
|
|
46
|
+
*
|
|
47
|
+
* @param cliOptions - Options provided via command line
|
|
48
|
+
* @returns Merged configuration ready for use
|
|
49
|
+
*/
|
|
50
|
+
function loadConfig(cliOptions) {
|
|
51
|
+
// Start with defaults
|
|
52
|
+
const config = { ...DEFAULT_CONFIG };
|
|
53
|
+
// Load mj.config.cjs if it exists
|
|
54
|
+
const mjConfig = loadMjConfig();
|
|
55
|
+
if (mjConfig && mjConfig.queryGen) {
|
|
56
|
+
Object.assign(config, mjConfig.queryGen);
|
|
57
|
+
}
|
|
58
|
+
// Override with CLI options
|
|
59
|
+
if (cliOptions.entities) {
|
|
60
|
+
config.includeEntities = parseArrayOption(cliOptions.entities);
|
|
61
|
+
}
|
|
62
|
+
if (cliOptions.excludeEntities) {
|
|
63
|
+
config.excludeEntities = parseArrayOption(cliOptions.excludeEntities);
|
|
64
|
+
}
|
|
65
|
+
if (cliOptions.excludeSchemas) {
|
|
66
|
+
config.excludeSchemas = parseArrayOption(cliOptions.excludeSchemas);
|
|
67
|
+
}
|
|
68
|
+
if (cliOptions.maxRefinements) {
|
|
69
|
+
config.maxRefinementIterations = parseNumberOption(cliOptions.maxRefinements, 'maxRefinements');
|
|
70
|
+
}
|
|
71
|
+
if (cliOptions.maxFixes) {
|
|
72
|
+
config.maxFixingIterations = parseNumberOption(cliOptions.maxFixes, 'maxFixes');
|
|
73
|
+
}
|
|
74
|
+
if (cliOptions.model) {
|
|
75
|
+
config.modelOverride = String(cliOptions.model);
|
|
76
|
+
}
|
|
77
|
+
if (cliOptions.vendor) {
|
|
78
|
+
config.vendorOverride = String(cliOptions.vendor);
|
|
79
|
+
}
|
|
80
|
+
if (cliOptions.output) {
|
|
81
|
+
config.outputDirectory = String(cliOptions.output);
|
|
82
|
+
}
|
|
83
|
+
if (cliOptions.mode) {
|
|
84
|
+
const mode = String(cliOptions.mode);
|
|
85
|
+
if (mode === 'metadata' || mode === 'database' || mode === 'both') {
|
|
86
|
+
config.outputMode = mode;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
throw new Error(`Invalid output mode: ${mode}. Must be metadata, database, or both`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (cliOptions.verbose) {
|
|
93
|
+
config.verbose = true;
|
|
94
|
+
}
|
|
95
|
+
// Validate entity filtering (includeEntities and excludeEntities are mutually exclusive)
|
|
96
|
+
if (config.includeEntities.length > 0 && config.excludeEntities.length > 0) {
|
|
97
|
+
console.warn('[Warning] Both includeEntities and excludeEntities provided. includeEntities takes precedence, excludeEntities will be ignored.');
|
|
98
|
+
config.excludeEntities = [];
|
|
99
|
+
}
|
|
100
|
+
return config;
|
|
101
|
+
}
|
|
102
|
+
exports.loadConfig = loadConfig;
|
|
103
|
+
/**
|
|
104
|
+
* Load mj.config.cjs from current working directory
|
|
105
|
+
* Returns null if file doesn't exist or can't be loaded
|
|
106
|
+
*/
|
|
107
|
+
function loadMjConfig() {
|
|
108
|
+
try {
|
|
109
|
+
const configPath = require('path').join(process.cwd(), 'mj.config.cjs');
|
|
110
|
+
const fs = require('fs');
|
|
111
|
+
if (fs.existsSync(configPath)) {
|
|
112
|
+
return require(configPath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
// Config file doesn't exist or couldn't be loaded - not an error
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Parse array option from CLI (handles both comma-separated strings and arrays)
|
|
122
|
+
*/
|
|
123
|
+
function parseArrayOption(value) {
|
|
124
|
+
if (Array.isArray(value)) {
|
|
125
|
+
return value.map(String);
|
|
126
|
+
}
|
|
127
|
+
if (typeof value === 'string') {
|
|
128
|
+
return value.split(',').map(s => s.trim());
|
|
129
|
+
}
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parse number option from CLI with validation
|
|
134
|
+
*/
|
|
135
|
+
function parseNumberOption(value, name) {
|
|
136
|
+
const num = Number(value);
|
|
137
|
+
if (isNaN(num) || num < 0) {
|
|
138
|
+
throw new Error(`Invalid ${name}: must be a positive number`);
|
|
139
|
+
}
|
|
140
|
+
return num;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for QueryGen package
|
|
4
|
+
*
|
|
5
|
+
* Usage: mj-querygen <command> [options]
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* generate - Generate queries for entities
|
|
9
|
+
* validate - Validate existing query templates
|
|
10
|
+
* export - Export queries from database to metadata files
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CLI entry point for QueryGen package
|
|
5
|
+
*
|
|
6
|
+
* Usage: mj-querygen <command> [options]
|
|
7
|
+
*
|
|
8
|
+
* Commands:
|
|
9
|
+
* generate - Generate queries for entities
|
|
10
|
+
* validate - Validate existing query templates
|
|
11
|
+
* export - Export queries from database to metadata files
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const commander_1 = require("commander");
|
|
15
|
+
const generate_1 = require("./commands/generate");
|
|
16
|
+
const validate_1 = require("./commands/validate");
|
|
17
|
+
const export_1 = require("./commands/export");
|
|
18
|
+
const packageJson = require('../../package.json');
|
|
19
|
+
const program = new commander_1.Command();
|
|
20
|
+
program
|
|
21
|
+
.name('mj-querygen')
|
|
22
|
+
.description('AI-powered SQL query template generation for MemberJunction')
|
|
23
|
+
.version(packageJson.version);
|
|
24
|
+
program
|
|
25
|
+
.command('generate')
|
|
26
|
+
.description('Generate queries for entities')
|
|
27
|
+
.option('-e, --entities <names...>', 'Specific entities to generate queries for')
|
|
28
|
+
.option('-x, --exclude-entities <names...>', 'Entities to exclude')
|
|
29
|
+
.option('-s, --exclude-schemas <names...>', 'Schemas to exclude')
|
|
30
|
+
.option('-m, --max-entities <number>', 'Max entities per group', '3')
|
|
31
|
+
.option('-r, --max-refinements <number>', 'Max refinement iterations', '3')
|
|
32
|
+
.option('-f, --max-fixes <number>', 'Max error-fixing attempts', '5')
|
|
33
|
+
.option('--model <name>', 'Preferred AI model')
|
|
34
|
+
.option('--vendor <name>', 'Preferred AI vendor')
|
|
35
|
+
.option('-o, --output <path>', 'Output directory')
|
|
36
|
+
.option('--mode <mode>', 'Output mode: metadata|database|both')
|
|
37
|
+
.option('-v, --verbose', 'Verbose output')
|
|
38
|
+
.action(generate_1.generateCommand);
|
|
39
|
+
program
|
|
40
|
+
.command('validate')
|
|
41
|
+
.description('Validate existing query templates')
|
|
42
|
+
.option('-p, --path <path>', 'Path to queries metadata file', './metadata/queries')
|
|
43
|
+
.option('-v, --verbose', 'Verbose output')
|
|
44
|
+
.action(validate_1.validateCommand);
|
|
45
|
+
program
|
|
46
|
+
.command('export')
|
|
47
|
+
.description('Export queries from database to metadata files')
|
|
48
|
+
.option('-o, --output <path>', 'Output directory')
|
|
49
|
+
.option('-v, --verbose', 'Verbose output')
|
|
50
|
+
.action(export_1.exportCommand);
|
|
51
|
+
// Parse command line arguments
|
|
52
|
+
program.parse();
|
|
53
|
+
// Show help if no command provided
|
|
54
|
+
if (!process.argv.slice(2).length) {
|
|
55
|
+
program.outputHelp();
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;GASG;;AAEH,yCAAoC;AACpC,kDAAsD;AACtD,kDAAsD;AACtD,8CAAkD;AAElD,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,2BAA2B,EAAE,2CAA2C,CAAC;KAChF,MAAM,CAAC,mCAAmC,EAAE,qBAAqB,CAAC;KAClE,MAAM,CAAC,kCAAkC,EAAE,oBAAoB,CAAC;KAChE,MAAM,CAAC,6BAA6B,EAAE,wBAAwB,EAAE,GAAG,CAAC;KACpE,MAAM,CAAC,gCAAgC,EAAE,2BAA2B,EAAE,GAAG,CAAC;KAC1E,MAAM,CAAC,0BAA0B,EAAE,2BAA2B,EAAE,GAAG,CAAC;KACpE,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;KAC9C,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,0BAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,oBAAoB,CAAC;KAClF,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,0BAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-based Entity Grouper
|
|
3
|
+
*
|
|
4
|
+
* Uses AI to generate semantically meaningful entity groupings based on
|
|
5
|
+
* business context and schema understanding, replacing the deterministic
|
|
6
|
+
* hub-and-spoke algorithm with intelligent semantic analysis.
|
|
7
|
+
*/
|
|
8
|
+
import { EntityInfo, UserInfo } from '@memberjunction/core';
|
|
9
|
+
import { EntityGroup } from '../data/schema';
|
|
10
|
+
import { QueryGenConfig } from '../cli/config';
|
|
11
|
+
/**
|
|
12
|
+
* Generates entity groups using LLM-based semantic analysis
|
|
13
|
+
*
|
|
14
|
+
* This class replaces the deterministic hub-and-spoke algorithm with an
|
|
15
|
+
* intelligent approach that understands business context and generates
|
|
16
|
+
* meaningful entity combinations for query generation.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EntityGrouper {
|
|
19
|
+
private readonly promptName;
|
|
20
|
+
private readonly config;
|
|
21
|
+
constructor(config: QueryGenConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Generate semantically meaningful entity groups using LLM analysis
|
|
24
|
+
*
|
|
25
|
+
* Note: The LLM determines the optimal number and size of entity groups based on
|
|
26
|
+
* business domain understanding. Makes separate LLM calls for each schema to
|
|
27
|
+
* avoid mixing entities from different databases.
|
|
28
|
+
*
|
|
29
|
+
* @param entities - All entities to analyze
|
|
30
|
+
* @param contextUser - User context for server-side operations
|
|
31
|
+
* @returns Array of validated entity groups with business context
|
|
32
|
+
*/
|
|
33
|
+
generateEntityGroups(entities: EntityInfo[], contextUser: UserInfo): Promise<EntityGroup[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Group entities by schema name
|
|
36
|
+
*/
|
|
37
|
+
private groupEntitiesBySchema;
|
|
38
|
+
/**
|
|
39
|
+
* Prepare schema data for LLM prompt
|
|
40
|
+
*
|
|
41
|
+
* Note: The LLM will determine appropriate group count based on business
|
|
42
|
+
* domain understanding and schema complexity. We provide the full entity
|
|
43
|
+
* schema and relationship graph for intelligent analysis.
|
|
44
|
+
*
|
|
45
|
+
* @param entities - Entities within a single schema
|
|
46
|
+
* @param schemaName - Name of the schema being processed
|
|
47
|
+
*/
|
|
48
|
+
private prepareSchemaData;
|
|
49
|
+
/**
|
|
50
|
+
* Call LLM via AIPromptRunner to generate entity groups
|
|
51
|
+
*/
|
|
52
|
+
private callLLMForGrouping;
|
|
53
|
+
/**
|
|
54
|
+
* Validate LLM output and convert to EntityGroup objects
|
|
55
|
+
*/
|
|
56
|
+
private validateAndConvertGroups;
|
|
57
|
+
/**
|
|
58
|
+
* Extract relationships between entities in a group
|
|
59
|
+
*/
|
|
60
|
+
private extractRelationships;
|
|
61
|
+
/**
|
|
62
|
+
* Check if all entities in a group are connected by relationships
|
|
63
|
+
*
|
|
64
|
+
* Uses BFS to verify all entities are reachable from the first entity
|
|
65
|
+
*/
|
|
66
|
+
private isConnected;
|
|
67
|
+
/**
|
|
68
|
+
* Remove duplicate or highly similar groups
|
|
69
|
+
*
|
|
70
|
+
* Groups are considered duplicates if they contain the exact same set of entities
|
|
71
|
+
*/
|
|
72
|
+
private deduplicateGroups;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=EntityGrouper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityGrouper.d.ts","sourceRoot":"","sources":["../../src/core/EntityGrouper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAA0B,QAAQ,EAAa,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAmB/C;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,cAAc;IAIlC;;;;;;;;;;OAUG;IACG,oBAAoB,CACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,WAAW,EAAE,QAAQ,GACpB,OAAO,CAAC,WAAW,EAAE,CAAC;IA0CzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;YACW,kBAAkB;IA6BhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyDhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAyCnB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CAgB1B"}
|