@memberjunction/cli 2.124.0 → 2.126.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 CHANGED
@@ -689,6 +689,106 @@ mj sync push ./metadata/queries/
689
689
 
690
690
  ---
691
691
 
692
+ ### `mj querygen` - AI-Powered SQL Query Generation
693
+
694
+ Generate domain-specific SQL query templates using artificial intelligence. QueryGen analyzes your database schema, generates business questions, creates SQL queries with Nunjucks templates, tests them, and exports to metadata format.
695
+
696
+ ```bash
697
+ mj querygen [COMMAND] [OPTIONS]
698
+ ```
699
+
700
+ Available querygen commands:
701
+ - `generate` - Generate SQL query templates for entities using AI
702
+ - `validate` - Validate existing query templates
703
+ - `export` - Export queries from database to metadata files
704
+
705
+ **📚 For detailed documentation:** See the [QueryGen README](../QueryGen/README.md)
706
+
707
+ #### Quick Examples:
708
+
709
+ ```bash
710
+ # Generate queries for all entities
711
+ mj querygen generate
712
+
713
+ # Generate for specific entities with verbose output
714
+ mj querygen generate --entities "Customers,Orders" --verbose
715
+
716
+ # Control entity grouping and refinement
717
+ mj querygen generate --max-entities 2 --max-refinements 3
718
+
719
+ # Export to specific directory
720
+ mj querygen generate --output ./metadata/queries
721
+
722
+ # Choose output mode
723
+ mj querygen generate --mode database # Write directly to database
724
+ mj querygen generate --mode both # Both metadata and database
725
+
726
+ # Validate existing queries
727
+ mj querygen validate
728
+
729
+ # Validate specific directory
730
+ mj querygen validate --path ./metadata/queries --verbose
731
+
732
+ # Export queries from database to metadata
733
+ mj querygen export
734
+
735
+ # Export to custom location
736
+ mj querygen export --output ./exported-queries --verbose
737
+ ```
738
+
739
+ #### QueryGen Command Options:
740
+
741
+ **Generate Command:**
742
+ - `-e, --entities <value>`: Specific entities to generate queries for (comma-separated)
743
+ - `-x, --exclude-entities <value>`: Entities to exclude (comma-separated)
744
+ - `-s, --exclude-schemas <value>`: Schemas to exclude (comma-separated)
745
+ - `-m, --max-entities <value>`: Max entities per group (default: 3)
746
+ - `-r, --max-refinements <value>`: Max refinement iterations (default: 3)
747
+ - `-f, --max-fixes <value>`: Max error-fixing attempts (default: 5)
748
+ - `--model <value>`: Preferred AI model
749
+ - `--vendor <value>`: Preferred AI vendor
750
+ - `-o, --output <value>`: Output directory (default: ./metadata/queries)
751
+ - `--mode <option>`: Output mode: metadata|database|both (default: metadata)
752
+ - `-v, --verbose`: Verbose output
753
+
754
+ **Validate Command:**
755
+ - `-p, --path <value>`: Path to queries metadata file or directory (default: ./metadata/queries)
756
+ - `-v, --verbose`: Verbose output
757
+
758
+ **Export Command:**
759
+ - `-o, --output <value>`: Output directory (default: ./metadata/queries)
760
+ - `-v, --verbose`: Verbose output
761
+
762
+ #### QueryGen Features:
763
+
764
+ **11-Phase Pipeline:**
765
+ 1. Entity Analysis - Analyzes database schema and relationships
766
+ 2. Entity Grouping - Creates logical groups of related entities
767
+ 3. Business Question Generation - Uses AI to generate domain questions
768
+ 4. Vector Similarity Search - Finds similar examples for few-shot learning
769
+ 5. SQL Generation - Creates Nunjucks SQL templates with AI
770
+ 6. Query Testing - Executes and validates queries
771
+ 7. Error Fixing - Automatically fixes SQL errors using AI
772
+ 8. Query Evaluation - Assesses query quality
773
+ 9. Query Refinement - Iteratively improves queries
774
+ 10. Testing & Validation - Comprehensive validation workflow
775
+ 11. Metadata Export - Exports to MJ metadata or database
776
+
777
+ **AI-Powered Features:**
778
+ - Generates realistic business questions for your domain
779
+ - Creates SQL queries with proper Nunjucks templating
780
+ - Automatically tests and fixes SQL errors
781
+ - Refines queries based on evaluation feedback
782
+ - Uses few-shot learning with golden query examples
783
+
784
+ **Integration:**
785
+ - Outputs to MemberJunction metadata format
786
+ - Compatible with `mj sync push` for database synchronization
787
+ - Supports both metadata files and direct database writes
788
+ - Uses MJ's Query entity with automatic field/parameter extraction
789
+
790
+ ---
791
+
692
792
  ### Utility Commands
693
793
 
694
794
  #### `mj help`
@@ -721,6 +821,7 @@ The CLI integrates seamlessly with other MemberJunction packages:
721
821
 
722
822
  - **[@memberjunction/codegen-lib](../CodeGenLib)**: Powers the code generation functionality
723
823
  - **[@memberjunction/metadata-sync](../MetadataSync)**: Provides metadata synchronization capabilities ([README](../MetadataSync/README.md))
824
+ - **[@memberjunction/query-gen](../QueryGen)**: AI-powered SQL query template generation ([README](../QueryGen/README.md))
724
825
  - **[@memberjunction/ai-cli](../AI/AICLI)**: Enables AI agent and action execution ([README](../AI/AICLI/README.md))
725
826
  - **[@memberjunction/testing-cli](../TestingFramework/CLI)**: Testing framework for database-driven tests ([README](../TestingFramework/CLI/README.md))
726
827
  - **[@memberjunction/db-auto-doc](../DBAutoDoc)**: AI-powered database documentation generator ([README](../DBAutoDoc/README.md))
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Export extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const query_gen_1 = require("@memberjunction/query-gen");
5
+ const metadata_sync_1 = require("@memberjunction/metadata-sync");
6
+ class Export extends core_1.Command {
7
+ static description = 'Export queries from database to metadata files';
8
+ static examples = [
9
+ `<%= config.bin %> <%= command.id %>`,
10
+ `<%= config.bin %> <%= command.id %> --output ./metadata/queries`,
11
+ `<%= config.bin %> <%= command.id %> --verbose`,
12
+ ];
13
+ static flags = {
14
+ output: core_1.Flags.string({
15
+ char: 'o',
16
+ description: 'Output directory',
17
+ default: './metadata/queries'
18
+ }),
19
+ verbose: core_1.Flags.boolean({ char: 'v', description: 'Verbose output' }),
20
+ };
21
+ async run() {
22
+ const { flags } = await this.parse(Export);
23
+ try {
24
+ // Load MJ configuration and initialize provider
25
+ const mjConfig = (0, metadata_sync_1.loadMJConfig)();
26
+ if (!mjConfig) {
27
+ this.error('No mj.config.cjs found in current directory or parent directories');
28
+ }
29
+ await (0, metadata_sync_1.initializeProvider)(mjConfig);
30
+ // Convert flags to options object for QueryGen
31
+ const options = {
32
+ output: flags.output,
33
+ verbose: flags.verbose
34
+ };
35
+ // Call QueryGen export command
36
+ await (0, query_gen_1.exportCommand)(options);
37
+ }
38
+ catch (error) {
39
+ // QueryGen commands call process.exit(), so this may not be reached
40
+ // But we handle it just in case
41
+ this.error(error);
42
+ }
43
+ }
44
+ }
45
+ exports.default = Export;
@@ -0,0 +1,20 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Generate extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ entities: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ 'exclude-entities': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ 'exclude-schemas': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'max-entities': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ 'target-groups': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ 'max-refinements': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'max-fixes': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ model: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ vendor: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ mode: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const query_gen_1 = require("@memberjunction/query-gen");
5
+ const metadata_sync_1 = require("@memberjunction/metadata-sync");
6
+ const aiengine_1 = require("@memberjunction/aiengine");
7
+ class Generate extends core_1.Command {
8
+ static description = 'Generate SQL query templates for entities using AI';
9
+ static examples = [
10
+ `<%= config.bin %> <%= command.id %>`,
11
+ `<%= config.bin %> <%= command.id %> --entities "Customers,Orders"`,
12
+ `<%= config.bin %> <%= command.id %> --max-entities 5 --verbose`,
13
+ `<%= config.bin %> <%= command.id %> --mode database`,
14
+ ];
15
+ static flags = {
16
+ entities: core_1.Flags.string({
17
+ char: 'e',
18
+ description: 'Specific entities to generate queries for (comma-separated)',
19
+ multiple: false
20
+ }),
21
+ 'exclude-entities': core_1.Flags.string({
22
+ char: 'x',
23
+ description: 'Entities to exclude (comma-separated)',
24
+ multiple: false
25
+ }),
26
+ 'exclude-schemas': core_1.Flags.string({
27
+ char: 's',
28
+ description: 'Schemas to exclude (comma-separated)',
29
+ multiple: false
30
+ }),
31
+ 'max-entities': core_1.Flags.integer({
32
+ char: 'm',
33
+ description: 'Max entities per group',
34
+ default: 3
35
+ }),
36
+ 'target-groups': core_1.Flags.integer({
37
+ char: 't',
38
+ description: 'Target number of entity groups to generate',
39
+ default: 75
40
+ }),
41
+ 'max-refinements': core_1.Flags.integer({
42
+ char: 'r',
43
+ description: 'Max refinement iterations',
44
+ default: 3
45
+ }),
46
+ 'max-fixes': core_1.Flags.integer({
47
+ char: 'f',
48
+ description: 'Max error-fixing attempts',
49
+ default: 5
50
+ }),
51
+ model: core_1.Flags.string({ description: 'Preferred AI model' }),
52
+ vendor: core_1.Flags.string({ description: 'Preferred AI vendor' }),
53
+ output: core_1.Flags.string({
54
+ char: 'o',
55
+ description: 'Output directory',
56
+ default: './metadata/queries'
57
+ }),
58
+ mode: core_1.Flags.string({
59
+ description: 'Output mode: metadata|database|both',
60
+ default: 'metadata',
61
+ options: ['metadata', 'database', 'both']
62
+ }),
63
+ verbose: core_1.Flags.boolean({ char: 'v', description: 'Verbose output' }),
64
+ };
65
+ async run() {
66
+ const { flags } = await this.parse(Generate);
67
+ try {
68
+ // Load MJ configuration and initialize provider
69
+ const mjConfig = (0, metadata_sync_1.loadMJConfig)();
70
+ if (!mjConfig) {
71
+ this.error('No mj.config.cjs found in current directory or parent directories');
72
+ }
73
+ await (0, metadata_sync_1.initializeProvider)(mjConfig);
74
+ // Get system user and initialize AI Engine
75
+ const systemUser = (0, metadata_sync_1.getSystemUser)();
76
+ await aiengine_1.AIEngine.Instance.Config(false, systemUser);
77
+ // Convert flags to options object for QueryGen
78
+ const options = {
79
+ entities: flags.entities,
80
+ excludeEntities: flags['exclude-entities'],
81
+ excludeSchemas: flags['exclude-schemas'],
82
+ maxEntities: flags['max-entities'],
83
+ targetGroupCount: flags['target-groups'],
84
+ maxRefinements: flags['max-refinements'],
85
+ maxFixes: flags['max-fixes'],
86
+ model: flags.model,
87
+ vendor: flags.vendor,
88
+ output: flags.output,
89
+ mode: flags.mode,
90
+ verbose: flags.verbose
91
+ };
92
+ // Call QueryGen generate command
93
+ await (0, query_gen_1.generateCommand)(options);
94
+ }
95
+ catch (error) {
96
+ // QueryGen commands call process.exit(), so this may not be reached
97
+ // But we handle it just in case
98
+ this.error(error);
99
+ }
100
+ }
101
+ }
102
+ exports.default = Generate;
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Validate extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ path: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const query_gen_1 = require("@memberjunction/query-gen");
5
+ const metadata_sync_1 = require("@memberjunction/metadata-sync");
6
+ class Validate extends core_1.Command {
7
+ static description = 'Validate existing query templates';
8
+ static examples = [
9
+ `<%= config.bin %> <%= command.id %>`,
10
+ `<%= config.bin %> <%= command.id %> --path ./metadata/queries`,
11
+ `<%= config.bin %> <%= command.id %> --verbose`,
12
+ ];
13
+ static flags = {
14
+ path: core_1.Flags.string({
15
+ char: 'p',
16
+ description: 'Path to queries metadata file or directory',
17
+ default: './metadata/queries'
18
+ }),
19
+ verbose: core_1.Flags.boolean({ char: 'v', description: 'Verbose output' }),
20
+ };
21
+ async run() {
22
+ const { flags } = await this.parse(Validate);
23
+ try {
24
+ // Load MJ configuration and initialize provider
25
+ const mjConfig = (0, metadata_sync_1.loadMJConfig)();
26
+ if (!mjConfig) {
27
+ this.error('No mj.config.cjs found in current directory or parent directories');
28
+ }
29
+ await (0, metadata_sync_1.initializeProvider)(mjConfig);
30
+ // Convert flags to options object for QueryGen
31
+ const options = {
32
+ path: flags.path,
33
+ verbose: flags.verbose
34
+ };
35
+ // Call QueryGen validate command
36
+ await (0, query_gen_1.validateCommand)(options);
37
+ }
38
+ catch (error) {
39
+ // QueryGen commands call process.exit(), so this may not be reached
40
+ // But we handle it just in case
41
+ this.error(error);
42
+ }
43
+ }
44
+ }
45
+ exports.default = Validate;
@@ -94,6 +94,38 @@
94
94
  "index.js"
95
95
  ]
96
96
  },
97
+ "clean": {
98
+ "aliases": [],
99
+ "args": {},
100
+ "description": "Resets the MemberJunction database to a pre-installation state",
101
+ "examples": [
102
+ "<%= config.bin %> <%= command.id %>\n"
103
+ ],
104
+ "flags": {
105
+ "verbose": {
106
+ "char": "v",
107
+ "description": "Enable additional logging",
108
+ "name": "verbose",
109
+ "allowNo": false,
110
+ "type": "boolean"
111
+ }
112
+ },
113
+ "hasDynamicHelp": false,
114
+ "hiddenAliases": [],
115
+ "id": "clean",
116
+ "pluginAlias": "@memberjunction/cli",
117
+ "pluginName": "@memberjunction/cli",
118
+ "pluginType": "core",
119
+ "strict": true,
120
+ "enableJsonFlag": false,
121
+ "isESM": false,
122
+ "relativePath": [
123
+ "dist",
124
+ "commands",
125
+ "clean",
126
+ "index.js"
127
+ ]
128
+ },
97
129
  "codegen": {
98
130
  "aliases": [],
99
131
  "args": {},
@@ -562,10 +594,10 @@
562
594
  "status.js"
563
595
  ]
564
596
  },
565
- "clean": {
597
+ "install": {
566
598
  "aliases": [],
567
599
  "args": {},
568
- "description": "Resets the MemberJunction database to a pre-installation state",
600
+ "description": "Install MemberJunction",
569
601
  "examples": [
570
602
  "<%= config.bin %> <%= command.id %>\n"
571
603
  ],
@@ -580,7 +612,7 @@
580
612
  },
581
613
  "hasDynamicHelp": false,
582
614
  "hiddenAliases": [],
583
- "id": "clean",
615
+ "id": "install",
584
616
  "pluginAlias": "@memberjunction/cli",
585
617
  "pluginName": "@memberjunction/cli",
586
618
  "pluginType": "core",
@@ -590,7 +622,7 @@
590
622
  "relativePath": [
591
623
  "dist",
592
624
  "commands",
593
- "clean",
625
+ "install",
594
626
  "index.js"
595
627
  ]
596
628
  },
@@ -634,17 +666,28 @@
634
666
  "index.js"
635
667
  ]
636
668
  },
637
- "install": {
669
+ "querygen:export": {
638
670
  "aliases": [],
639
671
  "args": {},
640
- "description": "Install MemberJunction",
672
+ "description": "Export queries from database to metadata files",
641
673
  "examples": [
642
- "<%= config.bin %> <%= command.id %>\n"
674
+ "<%= config.bin %> <%= command.id %>",
675
+ "<%= config.bin %> <%= command.id %> --output ./metadata/queries",
676
+ "<%= config.bin %> <%= command.id %> --verbose"
643
677
  ],
644
678
  "flags": {
679
+ "output": {
680
+ "char": "o",
681
+ "description": "Output directory",
682
+ "name": "output",
683
+ "default": "./metadata/queries",
684
+ "hasDynamicHelp": false,
685
+ "multiple": false,
686
+ "type": "option"
687
+ },
645
688
  "verbose": {
646
689
  "char": "v",
647
- "description": "Enable additional logging",
690
+ "description": "Verbose output",
648
691
  "name": "verbose",
649
692
  "allowNo": false,
650
693
  "type": "boolean"
@@ -652,7 +695,7 @@
652
695
  },
653
696
  "hasDynamicHelp": false,
654
697
  "hiddenAliases": [],
655
- "id": "install",
698
+ "id": "querygen:export",
656
699
  "pluginAlias": "@memberjunction/cli",
657
700
  "pluginName": "@memberjunction/cli",
658
701
  "pluginType": "core",
@@ -662,8 +705,182 @@
662
705
  "relativePath": [
663
706
  "dist",
664
707
  "commands",
665
- "install",
666
- "index.js"
708
+ "querygen",
709
+ "export.js"
710
+ ]
711
+ },
712
+ "querygen:generate": {
713
+ "aliases": [],
714
+ "args": {},
715
+ "description": "Generate SQL query templates for entities using AI",
716
+ "examples": [
717
+ "<%= config.bin %> <%= command.id %>",
718
+ "<%= config.bin %> <%= command.id %> --entities \"Customers,Orders\"",
719
+ "<%= config.bin %> <%= command.id %> --max-entities 5 --verbose",
720
+ "<%= config.bin %> <%= command.id %> --mode database"
721
+ ],
722
+ "flags": {
723
+ "entities": {
724
+ "char": "e",
725
+ "description": "Specific entities to generate queries for (comma-separated)",
726
+ "name": "entities",
727
+ "hasDynamicHelp": false,
728
+ "multiple": false,
729
+ "type": "option"
730
+ },
731
+ "exclude-entities": {
732
+ "char": "x",
733
+ "description": "Entities to exclude (comma-separated)",
734
+ "name": "exclude-entities",
735
+ "hasDynamicHelp": false,
736
+ "multiple": false,
737
+ "type": "option"
738
+ },
739
+ "exclude-schemas": {
740
+ "char": "s",
741
+ "description": "Schemas to exclude (comma-separated)",
742
+ "name": "exclude-schemas",
743
+ "hasDynamicHelp": false,
744
+ "multiple": false,
745
+ "type": "option"
746
+ },
747
+ "max-entities": {
748
+ "char": "m",
749
+ "description": "Max entities per group",
750
+ "name": "max-entities",
751
+ "default": 3,
752
+ "hasDynamicHelp": false,
753
+ "multiple": false,
754
+ "type": "option"
755
+ },
756
+ "target-groups": {
757
+ "char": "t",
758
+ "description": "Target number of entity groups to generate",
759
+ "name": "target-groups",
760
+ "default": 75,
761
+ "hasDynamicHelp": false,
762
+ "multiple": false,
763
+ "type": "option"
764
+ },
765
+ "max-refinements": {
766
+ "char": "r",
767
+ "description": "Max refinement iterations",
768
+ "name": "max-refinements",
769
+ "default": 3,
770
+ "hasDynamicHelp": false,
771
+ "multiple": false,
772
+ "type": "option"
773
+ },
774
+ "max-fixes": {
775
+ "char": "f",
776
+ "description": "Max error-fixing attempts",
777
+ "name": "max-fixes",
778
+ "default": 5,
779
+ "hasDynamicHelp": false,
780
+ "multiple": false,
781
+ "type": "option"
782
+ },
783
+ "model": {
784
+ "description": "Preferred AI model",
785
+ "name": "model",
786
+ "hasDynamicHelp": false,
787
+ "multiple": false,
788
+ "type": "option"
789
+ },
790
+ "vendor": {
791
+ "description": "Preferred AI vendor",
792
+ "name": "vendor",
793
+ "hasDynamicHelp": false,
794
+ "multiple": false,
795
+ "type": "option"
796
+ },
797
+ "output": {
798
+ "char": "o",
799
+ "description": "Output directory",
800
+ "name": "output",
801
+ "default": "./metadata/queries",
802
+ "hasDynamicHelp": false,
803
+ "multiple": false,
804
+ "type": "option"
805
+ },
806
+ "mode": {
807
+ "description": "Output mode: metadata|database|both",
808
+ "name": "mode",
809
+ "default": "metadata",
810
+ "hasDynamicHelp": false,
811
+ "multiple": false,
812
+ "options": [
813
+ "metadata",
814
+ "database",
815
+ "both"
816
+ ],
817
+ "type": "option"
818
+ },
819
+ "verbose": {
820
+ "char": "v",
821
+ "description": "Verbose output",
822
+ "name": "verbose",
823
+ "allowNo": false,
824
+ "type": "boolean"
825
+ }
826
+ },
827
+ "hasDynamicHelp": false,
828
+ "hiddenAliases": [],
829
+ "id": "querygen:generate",
830
+ "pluginAlias": "@memberjunction/cli",
831
+ "pluginName": "@memberjunction/cli",
832
+ "pluginType": "core",
833
+ "strict": true,
834
+ "enableJsonFlag": false,
835
+ "isESM": false,
836
+ "relativePath": [
837
+ "dist",
838
+ "commands",
839
+ "querygen",
840
+ "generate.js"
841
+ ]
842
+ },
843
+ "querygen:validate": {
844
+ "aliases": [],
845
+ "args": {},
846
+ "description": "Validate existing query templates",
847
+ "examples": [
848
+ "<%= config.bin %> <%= command.id %>",
849
+ "<%= config.bin %> <%= command.id %> --path ./metadata/queries",
850
+ "<%= config.bin %> <%= command.id %> --verbose"
851
+ ],
852
+ "flags": {
853
+ "path": {
854
+ "char": "p",
855
+ "description": "Path to queries metadata file or directory",
856
+ "name": "path",
857
+ "default": "./metadata/queries",
858
+ "hasDynamicHelp": false,
859
+ "multiple": false,
860
+ "type": "option"
861
+ },
862
+ "verbose": {
863
+ "char": "v",
864
+ "description": "Verbose output",
865
+ "name": "verbose",
866
+ "allowNo": false,
867
+ "type": "boolean"
868
+ }
869
+ },
870
+ "hasDynamicHelp": false,
871
+ "hiddenAliases": [],
872
+ "id": "querygen:validate",
873
+ "pluginAlias": "@memberjunction/cli",
874
+ "pluginName": "@memberjunction/cli",
875
+ "pluginType": "core",
876
+ "strict": true,
877
+ "enableJsonFlag": false,
878
+ "isESM": false,
879
+ "relativePath": [
880
+ "dist",
881
+ "commands",
882
+ "querygen",
883
+ "validate.js"
667
884
  ]
668
885
  },
669
886
  "sync:file-reset": {
@@ -2285,5 +2502,5 @@
2285
2502
  ]
2286
2503
  }
2287
2504
  },
2288
- "version": "2.124.0"
2505
+ "version": "2.126.0"
2289
2506
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/cli",
3
- "version": "2.124.0",
3
+ "version": "2.126.0",
4
4
  "description": "MemberJunction command line tools",
5
5
  "keywords": [
6
6
  "oclif"
@@ -51,13 +51,14 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "@inquirer/prompts": "^5.0.1",
54
- "@memberjunction/ai-cli": "2.124.0",
55
- "@memberjunction/codegen-lib": "2.124.0",
56
- "@memberjunction/core": "2.124.0",
57
- "@memberjunction/db-auto-doc": "2.124.0",
58
- "@memberjunction/metadata-sync": "2.124.0",
59
- "@memberjunction/sqlserver-dataprovider": "2.124.0",
60
- "@memberjunction/testing-cli": "2.124.0",
54
+ "@memberjunction/ai-cli": "2.126.0",
55
+ "@memberjunction/codegen-lib": "2.126.0",
56
+ "@memberjunction/core": "2.126.0",
57
+ "@memberjunction/db-auto-doc": "2.126.0",
58
+ "@memberjunction/metadata-sync": "2.126.0",
59
+ "@memberjunction/query-gen": "2.126.0",
60
+ "@memberjunction/sqlserver-dataprovider": "2.126.0",
61
+ "@memberjunction/testing-cli": "2.126.0",
61
62
  "@oclif/core": "^3",
62
63
  "@oclif/plugin-help": "^6",
63
64
  "@oclif/plugin-version": "^2.0.17",