@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.
Files changed (138) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +34 -0
  3. package/COORDINATOR.md +768 -0
  4. package/IMPLEMENTATION_PLAN.md +1753 -0
  5. package/LLM_ENTITY_GROUPING_PLAN.md +977 -0
  6. package/README.md +675 -29
  7. package/dist/cli/commands/export.d.ts +15 -0
  8. package/dist/cli/commands/export.d.ts.map +1 -0
  9. package/dist/cli/commands/export.js +178 -0
  10. package/dist/cli/commands/export.js.map +1 -0
  11. package/dist/cli/commands/generate.d.ts +19 -0
  12. package/dist/cli/commands/generate.d.ts.map +1 -0
  13. package/dist/cli/commands/generate.js +282 -0
  14. package/dist/cli/commands/generate.js.map +1 -0
  15. package/dist/cli/commands/validate.d.ts +17 -0
  16. package/dist/cli/commands/validate.d.ts.map +1 -0
  17. package/dist/cli/commands/validate.js +193 -0
  18. package/dist/cli/commands/validate.js.map +1 -0
  19. package/dist/cli/config.d.ts +51 -0
  20. package/dist/cli/config.d.ts.map +1 -0
  21. package/dist/cli/config.js +142 -0
  22. package/dist/cli/config.js.map +1 -0
  23. package/dist/cli/index.d.ts +13 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +57 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/core/EntityGrouper.d.ts +74 -0
  28. package/dist/core/EntityGrouper.d.ts.map +1 -0
  29. package/dist/core/EntityGrouper.js +246 -0
  30. package/dist/core/EntityGrouper.js.map +1 -0
  31. package/dist/core/MetadataExporter.d.ts +59 -0
  32. package/dist/core/MetadataExporter.d.ts.map +1 -0
  33. package/dist/core/MetadataExporter.js +151 -0
  34. package/dist/core/MetadataExporter.js.map +1 -0
  35. package/dist/core/QueryDatabaseWriter.d.ts +50 -0
  36. package/dist/core/QueryDatabaseWriter.d.ts.map +1 -0
  37. package/dist/core/QueryDatabaseWriter.js +152 -0
  38. package/dist/core/QueryDatabaseWriter.js.map +1 -0
  39. package/dist/core/QueryFixer.d.ts +48 -0
  40. package/dist/core/QueryFixer.d.ts.map +1 -0
  41. package/dist/core/QueryFixer.js +115 -0
  42. package/dist/core/QueryFixer.js.map +1 -0
  43. package/dist/core/QueryRefiner.d.ts +94 -0
  44. package/dist/core/QueryRefiner.d.ts.map +1 -0
  45. package/dist/core/QueryRefiner.js +267 -0
  46. package/dist/core/QueryRefiner.js.map +1 -0
  47. package/dist/core/QueryTester.d.ts +70 -0
  48. package/dist/core/QueryTester.d.ts.map +1 -0
  49. package/dist/core/QueryTester.js +243 -0
  50. package/dist/core/QueryTester.js.map +1 -0
  51. package/dist/core/QueryWriter.d.ts +57 -0
  52. package/dist/core/QueryWriter.d.ts.map +1 -0
  53. package/dist/core/QueryWriter.js +184 -0
  54. package/dist/core/QueryWriter.js.map +1 -0
  55. package/dist/core/QuestionGenerator.d.ts +58 -0
  56. package/dist/core/QuestionGenerator.d.ts.map +1 -0
  57. package/dist/core/QuestionGenerator.js +145 -0
  58. package/dist/core/QuestionGenerator.js.map +1 -0
  59. package/dist/data/schema.d.ts +230 -0
  60. package/dist/data/schema.d.ts.map +1 -0
  61. package/dist/data/schema.js +6 -0
  62. package/dist/data/schema.js.map +1 -0
  63. package/dist/index.d.ts +28 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +77 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/prompts/PromptNames.d.ts +32 -0
  68. package/dist/prompts/PromptNames.d.ts.map +1 -0
  69. package/dist/prompts/PromptNames.js +35 -0
  70. package/dist/prompts/PromptNames.js.map +1 -0
  71. package/dist/utils/category-builder.d.ts +28 -0
  72. package/dist/utils/category-builder.d.ts.map +1 -0
  73. package/dist/utils/category-builder.js +90 -0
  74. package/dist/utils/category-builder.js.map +1 -0
  75. package/dist/utils/entity-helpers.d.ts +49 -0
  76. package/dist/utils/entity-helpers.d.ts.map +1 -0
  77. package/dist/utils/entity-helpers.js +189 -0
  78. package/dist/utils/entity-helpers.js.map +1 -0
  79. package/dist/utils/error-handlers.d.ts +19 -0
  80. package/dist/utils/error-handlers.d.ts.map +1 -0
  81. package/dist/utils/error-handlers.js +41 -0
  82. package/dist/utils/error-handlers.js.map +1 -0
  83. package/dist/utils/graph-helpers.d.ts +51 -0
  84. package/dist/utils/graph-helpers.d.ts.map +1 -0
  85. package/dist/utils/graph-helpers.js +82 -0
  86. package/dist/utils/graph-helpers.js.map +1 -0
  87. package/dist/utils/prompt-helpers.d.ts +25 -0
  88. package/dist/utils/prompt-helpers.d.ts.map +1 -0
  89. package/dist/utils/prompt-helpers.js +66 -0
  90. package/dist/utils/prompt-helpers.js.map +1 -0
  91. package/dist/utils/query-helpers.d.ts +23 -0
  92. package/dist/utils/query-helpers.d.ts.map +1 -0
  93. package/dist/utils/query-helpers.js +34 -0
  94. package/dist/utils/query-helpers.js.map +1 -0
  95. package/dist/utils/user-helpers.d.ts +15 -0
  96. package/dist/utils/user-helpers.d.ts.map +1 -0
  97. package/dist/utils/user-helpers.js +32 -0
  98. package/dist/utils/user-helpers.js.map +1 -0
  99. package/dist/vectors/EmbeddingService.d.ts +58 -0
  100. package/dist/vectors/EmbeddingService.d.ts.map +1 -0
  101. package/dist/vectors/EmbeddingService.js +90 -0
  102. package/dist/vectors/EmbeddingService.js.map +1 -0
  103. package/dist/vectors/SimilaritySearch.d.ts +51 -0
  104. package/dist/vectors/SimilaritySearch.d.ts.map +1 -0
  105. package/dist/vectors/SimilaritySearch.js +85 -0
  106. package/dist/vectors/SimilaritySearch.js.map +1 -0
  107. package/docs/API.md +1040 -0
  108. package/docs/ARCHITECTURE.md +1120 -0
  109. package/examples/advanced-usage.ts +401 -0
  110. package/examples/basic-usage.ts +285 -0
  111. package/package.json +48 -6
  112. package/src/cli/commands/export.ts +173 -0
  113. package/src/cli/commands/generate.ts +330 -0
  114. package/src/cli/commands/validate.ts +185 -0
  115. package/src/cli/config.ts +203 -0
  116. package/src/cli/index.ts +63 -0
  117. package/src/core/EntityGrouper.ts +318 -0
  118. package/src/core/MetadataExporter.ts +148 -0
  119. package/src/core/QueryDatabaseWriter.ts +187 -0
  120. package/src/core/QueryFixer.ts +153 -0
  121. package/src/core/QueryRefiner.ts +382 -0
  122. package/src/core/QueryTester.ts +264 -0
  123. package/src/core/QueryWriter.ts +239 -0
  124. package/src/core/QuestionGenerator.ts +199 -0
  125. package/src/data/golden-queries.json +1371 -0
  126. package/src/data/schema.ts +252 -0
  127. package/src/index.ts +49 -0
  128. package/src/prompts/PromptNames.ts +36 -0
  129. package/src/utils/category-builder.ts +97 -0
  130. package/src/utils/entity-helpers.ts +203 -0
  131. package/src/utils/error-handlers.ts +41 -0
  132. package/src/utils/graph-helpers.ts +99 -0
  133. package/src/utils/prompt-helpers.ts +79 -0
  134. package/src/utils/query-helpers.ts +32 -0
  135. package/src/utils/user-helpers.ts +39 -0
  136. package/src/vectors/EmbeddingService.ts +109 -0
  137. package/src/vectors/SimilaritySearch.ts +108 -0
  138. 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":"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"}
@@ -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"}