@memberjunction/cli 6.2.0-edge.4 → 6.2.0-edge.5

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.
@@ -988,112 +988,6 @@
988
988
  "usage.js"
989
989
  ]
990
990
  },
991
- "bump": {
992
- "aliases": [],
993
- "args": {},
994
- "description": "Bumps MemberJunction dependency versions",
995
- "examples": [
996
- {
997
- "command": "<%= config.bin %> <%= command.id %>",
998
- "description": "Bump all @memberjunction/* dependencies in the current directory's package.json to the CLI version"
999
- },
1000
- {
1001
- "command": "<%= config.bin %> <%= command.id %> -rdv",
1002
- "description": "Preview all recursive packages bumps without writing any changes."
1003
- },
1004
- {
1005
- "command": "<%= config.bin %> <%= command.id %> -rqt v2.10.0 | xargs -n1 -I{} npm install --prefix {}",
1006
- "description": "Recursively bump all @memberjunction/* dependencies in all packages to version v2.10.0 and output only the paths containing the updated package.json files. Pipe the output to xargs to run npm install in each directory and update the package-lock.json files as well."
1007
- }
1008
- ],
1009
- "flags": {
1010
- "verbose": {
1011
- "char": "v",
1012
- "description": "Enable additional logging",
1013
- "name": "verbose",
1014
- "allowNo": false,
1015
- "type": "boolean"
1016
- },
1017
- "recursive": {
1018
- "char": "r",
1019
- "description": "Bump version in current directory and all subdirectories",
1020
- "name": "recursive",
1021
- "allowNo": false,
1022
- "type": "boolean"
1023
- },
1024
- "tag": {
1025
- "char": "t",
1026
- "description": "Version tag to bump target for bump (e.g. v2.10.0), defaults to the CLI version",
1027
- "name": "tag",
1028
- "hasDynamicHelp": false,
1029
- "multiple": false,
1030
- "type": "option"
1031
- },
1032
- "quiet": {
1033
- "char": "q",
1034
- "description": "Only output paths for updated packages",
1035
- "name": "quiet",
1036
- "allowNo": false,
1037
- "type": "boolean"
1038
- },
1039
- "dry": {
1040
- "char": "d",
1041
- "description": "Dry run, do not write changes to package.json files",
1042
- "name": "dry",
1043
- "allowNo": false,
1044
- "type": "boolean"
1045
- }
1046
- },
1047
- "hasDynamicHelp": false,
1048
- "hiddenAliases": [],
1049
- "id": "bump",
1050
- "pluginAlias": "@memberjunction/cli",
1051
- "pluginName": "@memberjunction/cli",
1052
- "pluginType": "core",
1053
- "strict": true,
1054
- "enableJsonFlag": false,
1055
- "isESM": true,
1056
- "relativePath": [
1057
- "dist",
1058
- "commands",
1059
- "bump",
1060
- "index.js"
1061
- ]
1062
- },
1063
- "bump:usage": {
1064
- "aliases": [],
1065
- "args": {},
1066
- "description": "Show usage, flags, examples, and runtime hints for every `mj bump` command.",
1067
- "flags": {
1068
- "format": {
1069
- "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
1070
- "name": "format",
1071
- "hasDynamicHelp": false,
1072
- "multiple": false,
1073
- "options": [
1074
- "text",
1075
- "json",
1076
- "md"
1077
- ],
1078
- "type": "option"
1079
- }
1080
- },
1081
- "hasDynamicHelp": false,
1082
- "hiddenAliases": [],
1083
- "id": "bump:usage",
1084
- "pluginAlias": "@memberjunction/cli",
1085
- "pluginName": "@memberjunction/cli",
1086
- "pluginType": "core",
1087
- "strict": true,
1088
- "enableJsonFlag": false,
1089
- "isESM": true,
1090
- "relativePath": [
1091
- "dist",
1092
- "commands",
1093
- "bump",
1094
- "usage.js"
1095
- ]
1096
- },
1097
991
  "bundle": {
1098
992
  "aliases": [],
1099
993
  "args": {},
@@ -1311,6 +1205,112 @@
1311
1205
  "usage.js"
1312
1206
  ]
1313
1207
  },
1208
+ "bump": {
1209
+ "aliases": [],
1210
+ "args": {},
1211
+ "description": "Bumps MemberJunction dependency versions",
1212
+ "examples": [
1213
+ {
1214
+ "command": "<%= config.bin %> <%= command.id %>",
1215
+ "description": "Bump all @memberjunction/* dependencies in the current directory's package.json to the CLI version"
1216
+ },
1217
+ {
1218
+ "command": "<%= config.bin %> <%= command.id %> -rdv",
1219
+ "description": "Preview all recursive packages bumps without writing any changes."
1220
+ },
1221
+ {
1222
+ "command": "<%= config.bin %> <%= command.id %> -rqt v2.10.0 | xargs -n1 -I{} npm install --prefix {}",
1223
+ "description": "Recursively bump all @memberjunction/* dependencies in all packages to version v2.10.0 and output only the paths containing the updated package.json files. Pipe the output to xargs to run npm install in each directory and update the package-lock.json files as well."
1224
+ }
1225
+ ],
1226
+ "flags": {
1227
+ "verbose": {
1228
+ "char": "v",
1229
+ "description": "Enable additional logging",
1230
+ "name": "verbose",
1231
+ "allowNo": false,
1232
+ "type": "boolean"
1233
+ },
1234
+ "recursive": {
1235
+ "char": "r",
1236
+ "description": "Bump version in current directory and all subdirectories",
1237
+ "name": "recursive",
1238
+ "allowNo": false,
1239
+ "type": "boolean"
1240
+ },
1241
+ "tag": {
1242
+ "char": "t",
1243
+ "description": "Version tag to bump target for bump (e.g. v2.10.0), defaults to the CLI version",
1244
+ "name": "tag",
1245
+ "hasDynamicHelp": false,
1246
+ "multiple": false,
1247
+ "type": "option"
1248
+ },
1249
+ "quiet": {
1250
+ "char": "q",
1251
+ "description": "Only output paths for updated packages",
1252
+ "name": "quiet",
1253
+ "allowNo": false,
1254
+ "type": "boolean"
1255
+ },
1256
+ "dry": {
1257
+ "char": "d",
1258
+ "description": "Dry run, do not write changes to package.json files",
1259
+ "name": "dry",
1260
+ "allowNo": false,
1261
+ "type": "boolean"
1262
+ }
1263
+ },
1264
+ "hasDynamicHelp": false,
1265
+ "hiddenAliases": [],
1266
+ "id": "bump",
1267
+ "pluginAlias": "@memberjunction/cli",
1268
+ "pluginName": "@memberjunction/cli",
1269
+ "pluginType": "core",
1270
+ "strict": true,
1271
+ "enableJsonFlag": false,
1272
+ "isESM": true,
1273
+ "relativePath": [
1274
+ "dist",
1275
+ "commands",
1276
+ "bump",
1277
+ "index.js"
1278
+ ]
1279
+ },
1280
+ "bump:usage": {
1281
+ "aliases": [],
1282
+ "args": {},
1283
+ "description": "Show usage, flags, examples, and runtime hints for every `mj bump` command.",
1284
+ "flags": {
1285
+ "format": {
1286
+ "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
1287
+ "name": "format",
1288
+ "hasDynamicHelp": false,
1289
+ "multiple": false,
1290
+ "options": [
1291
+ "text",
1292
+ "json",
1293
+ "md"
1294
+ ],
1295
+ "type": "option"
1296
+ }
1297
+ },
1298
+ "hasDynamicHelp": false,
1299
+ "hiddenAliases": [],
1300
+ "id": "bump:usage",
1301
+ "pluginAlias": "@memberjunction/cli",
1302
+ "pluginName": "@memberjunction/cli",
1303
+ "pluginType": "core",
1304
+ "strict": true,
1305
+ "enableJsonFlag": false,
1306
+ "isESM": true,
1307
+ "relativePath": [
1308
+ "dist",
1309
+ "commands",
1310
+ "bump",
1311
+ "usage.js"
1312
+ ]
1313
+ },
1314
1314
  "clean": {
1315
1315
  "aliases": [],
1316
1316
  "args": {},
@@ -1967,6 +1967,12 @@
1967
1967
  "hasDynamicHelp": false,
1968
1968
  "multiple": false,
1969
1969
  "type": "option"
1970
+ },
1971
+ "skip-sampling": {
1972
+ "description": "Skip table data sampling pass (useful for large databases or when schema/dictionary is already provided)",
1973
+ "name": "skip-sampling",
1974
+ "allowNo": false,
1975
+ "type": "boolean"
1970
1976
  }
1971
1977
  },
1972
1978
  "hasDynamicHelp": false,
@@ -2178,6 +2184,58 @@
2178
2184
  "hasDynamicHelp": false,
2179
2185
  "multiple": false,
2180
2186
  "type": "option"
2187
+ },
2188
+ "erd-mode": {
2189
+ "description": "ERD layout: full, clusters (one diagram per subject area) or both",
2190
+ "name": "erd-mode",
2191
+ "hasDynamicHelp": false,
2192
+ "multiple": false,
2193
+ "options": [
2194
+ "full",
2195
+ "clusters",
2196
+ "both"
2197
+ ],
2198
+ "type": "option"
2199
+ },
2200
+ "erd-columns": {
2201
+ "description": "Columns drawn per entity: all, keys (PK/FK only) or none",
2202
+ "name": "erd-columns",
2203
+ "hasDynamicHelp": false,
2204
+ "multiple": false,
2205
+ "options": [
2206
+ "all",
2207
+ "keys",
2208
+ "none"
2209
+ ],
2210
+ "type": "option"
2211
+ },
2212
+ "erd-hub-min-inbound": {
2213
+ "description": "A table referenced by at least this many tables is a subject-area hub",
2214
+ "name": "erd-hub-min-inbound",
2215
+ "hasDynamicHelp": false,
2216
+ "multiple": false,
2217
+ "type": "option"
2218
+ },
2219
+ "erd-lookup-max-rows": {
2220
+ "description": "A table that references nothing and has fewer rows than this is a reference table",
2221
+ "name": "erd-lookup-max-rows",
2222
+ "hasDynamicHelp": false,
2223
+ "multiple": false,
2224
+ "type": "option"
2225
+ },
2226
+ "erd-page-size": {
2227
+ "description": "Tables per diagram page beyond the hub",
2228
+ "name": "erd-page-size",
2229
+ "hasDynamicHelp": false,
2230
+ "multiple": false,
2231
+ "type": "option"
2232
+ },
2233
+ "erd-min-cluster-size": {
2234
+ "description": "Subject areas smaller than this fold into a neighbour",
2235
+ "name": "erd-min-cluster-size",
2236
+ "hasDynamicHelp": false,
2237
+ "multiple": false,
2238
+ "type": "option"
2181
2239
  }
2182
2240
  },
2183
2241
  "hasDynamicHelp": false,
@@ -3531,34 +3589,30 @@
3531
3589
  "validate.js"
3532
3590
  ]
3533
3591
  },
3534
- "queue:backlog": {
3592
+ "rubric:diff": {
3535
3593
  "aliases": [],
3536
- "args": {},
3537
- "description": "Show the autoscaler metric for one subscription: claimable pending plus in-flight deliveries",
3538
- "examples": [
3539
- "<%= config.bin %> <%= command.id %> --subscription venue-import",
3540
- "<%= config.bin %> <%= command.id %> --subscription venue-import --json"
3541
- ],
3542
- "flags": {
3543
- "subscription": {
3544
- "char": "s",
3545
- "description": "Subscription name",
3546
- "name": "subscription",
3547
- "required": true,
3548
- "hasDynamicHelp": false,
3549
- "multiple": false,
3550
- "type": "option"
3594
+ "args": {
3595
+ "rubric": {
3596
+ "description": "Rubric name or id",
3597
+ "name": "rubric",
3598
+ "required": true
3551
3599
  },
3552
- "json": {
3553
- "description": "Print JSON instead of text",
3554
- "name": "json",
3555
- "allowNo": false,
3556
- "type": "boolean"
3600
+ "from": {
3601
+ "description": "Version 1.2.0 or id",
3602
+ "name": "from",
3603
+ "required": true
3604
+ },
3605
+ "to": {
3606
+ "description": "Version 1.2.0 or id",
3607
+ "name": "to",
3608
+ "required": true
3557
3609
  }
3558
3610
  },
3611
+ "description": "Print the version bump between two rubric versions.",
3612
+ "flags": {},
3559
3613
  "hasDynamicHelp": false,
3560
3614
  "hiddenAliases": [],
3561
- "id": "queue:backlog",
3615
+ "id": "rubric:diff",
3562
3616
  "pluginAlias": "@memberjunction/cli",
3563
3617
  "pluginName": "@memberjunction/cli",
3564
3618
  "pluginType": "core",
@@ -3568,52 +3622,76 @@
3568
3622
  "relativePath": [
3569
3623
  "dist",
3570
3624
  "commands",
3571
- "queue",
3572
- "backlog.js"
3625
+ "rubric",
3626
+ "diff.js"
3573
3627
  ]
3574
3628
  },
3575
- "queue:dead-letters": {
3629
+ "rubric:evaluate": {
3576
3630
  "aliases": [],
3577
3631
  "args": {},
3578
- "description": "List a work-queue subscription's dead-lettered deliveries",
3579
- "examples": [
3580
- "<%= config.bin %> <%= command.id %> --subscription integration.apply --page-size 20"
3581
- ],
3632
+ "description": "Evaluate one record against a rubric. Does not publish.",
3582
3633
  "flags": {
3583
- "subscription": {
3584
- "char": "s",
3585
- "description": "Subscription name",
3586
- "name": "subscription",
3634
+ "rubric": {
3635
+ "description": "Rubric name or id, optionally @version",
3636
+ "name": "rubric",
3587
3637
  "required": true,
3588
3638
  "hasDynamicHelp": false,
3589
3639
  "multiple": false,
3590
3640
  "type": "option"
3591
3641
  },
3592
- "cursor": {
3593
- "description": "nextCursor from a previous page",
3594
- "name": "cursor",
3642
+ "entity": {
3643
+ "description": "Subject entity name",
3644
+ "name": "entity",
3645
+ "required": true,
3595
3646
  "hasDynamicHelp": false,
3596
3647
  "multiple": false,
3597
3648
  "type": "option"
3598
3649
  },
3599
- "page-size": {
3600
- "description": "Items per page (1–500)",
3601
- "name": "page-size",
3602
- "default": 50,
3650
+ "record": {
3651
+ "description": "Subject record id",
3652
+ "name": "record",
3653
+ "required": true,
3603
3654
  "hasDynamicHelp": false,
3604
3655
  "multiple": false,
3605
3656
  "type": "option"
3606
3657
  },
3607
- "json": {
3608
- "description": "Print JSON instead of a table",
3609
- "name": "json",
3610
- "allowNo": false,
3611
- "type": "boolean"
3658
+ "evaluator": {
3659
+ "description": "A registered evaluator: LLM, Decision, Agent, Deterministic, or a custom one",
3660
+ "name": "evaluator",
3661
+ "default": "LLM",
3662
+ "hasDynamicHelp": false,
3663
+ "multiple": false,
3664
+ "type": "option"
3665
+ },
3666
+ "prompt": {
3667
+ "description": "LLM: the judge prompt composed into Rubric Evaluator (default Rubric Evaluator - Default Judge). Decision: the decision prompt (default Default Decision)",
3668
+ "name": "prompt",
3669
+ "hasDynamicHelp": false,
3670
+ "multiple": false,
3671
+ "type": "option"
3672
+ },
3673
+ "model": {
3674
+ "description": "AI Model ID to pin. Otherwise the prompt's bindings choose",
3675
+ "name": "model",
3676
+ "hasDynamicHelp": false,
3677
+ "multiple": false,
3678
+ "type": "option"
3679
+ },
3680
+ "mode": {
3681
+ "description": "LLM only: SinglePass or PerCriterion",
3682
+ "name": "mode",
3683
+ "hasDynamicHelp": false,
3684
+ "multiple": false,
3685
+ "options": [
3686
+ "SinglePass",
3687
+ "PerCriterion"
3688
+ ],
3689
+ "type": "option"
3612
3690
  }
3613
3691
  },
3614
3692
  "hasDynamicHelp": false,
3615
3693
  "hiddenAliases": [],
3616
- "id": "queue:dead-letters",
3694
+ "id": "rubric:evaluate",
3617
3695
  "pluginAlias": "@memberjunction/cli",
3618
3696
  "pluginName": "@memberjunction/cli",
3619
3697
  "pluginType": "core",
@@ -3623,49 +3701,18 @@
3623
3701
  "relativePath": [
3624
3702
  "dist",
3625
3703
  "commands",
3626
- "queue",
3627
- "dead-letters.js"
3704
+ "rubric",
3705
+ "evaluate.js"
3628
3706
  ]
3629
3707
  },
3630
- "queue:discard": {
3708
+ "rubric": {
3631
3709
  "aliases": [],
3632
3710
  "args": {},
3633
- "description": "Discard one pending or dead-lettered work-queue delivery, or cancel one that is in flight",
3634
- "examples": [
3635
- "<%= config.bin %> <%= command.id %> --subscription integration.apply --delivery <id> --reason \"bad batch, republished\""
3636
- ],
3637
- "flags": {
3638
- "subscription": {
3639
- "char": "s",
3640
- "description": "Subscription name",
3641
- "name": "subscription",
3642
- "required": true,
3643
- "hasDynamicHelp": false,
3644
- "multiple": false,
3645
- "type": "option"
3646
- },
3647
- "delivery": {
3648
- "char": "d",
3649
- "description": "DeliveryID to discard",
3650
- "name": "delivery",
3651
- "required": true,
3652
- "hasDynamicHelp": false,
3653
- "multiple": false,
3654
- "type": "option"
3655
- },
3656
- "reason": {
3657
- "char": "r",
3658
- "description": "Why the work is dropped (at most 1000 characters)",
3659
- "name": "reason",
3660
- "required": true,
3661
- "hasDynamicHelp": false,
3662
- "multiple": false,
3663
- "type": "option"
3664
- }
3665
- },
3711
+ "description": "List, show, diff, validate, and evaluate rubrics.",
3712
+ "flags": {},
3666
3713
  "hasDynamicHelp": false,
3667
3714
  "hiddenAliases": [],
3668
- "id": "queue:discard",
3715
+ "id": "rubric",
3669
3716
  "pluginAlias": "@memberjunction/cli",
3670
3717
  "pluginName": "@memberjunction/cli",
3671
3718
  "pluginType": "core",
@@ -3675,39 +3722,18 @@
3675
3722
  "relativePath": [
3676
3723
  "dist",
3677
3724
  "commands",
3678
- "queue",
3679
- "discard.js"
3725
+ "rubric",
3726
+ "index.js"
3680
3727
  ]
3681
3728
  },
3682
- "queue:export-topology": {
3729
+ "rubric:list": {
3683
3730
  "aliases": [],
3684
3731
  "args": {},
3685
- "description": "Write the topology manifest for one transport (input to the Terraform module)",
3686
- "examples": [
3687
- "<%= config.bin %> <%= command.id %> --transport AWS-prod --output infrastructure/work-queue/manifest.json"
3688
- ],
3689
- "flags": {
3690
- "transport": {
3691
- "char": "t",
3692
- "description": "Transport name",
3693
- "name": "transport",
3694
- "required": true,
3695
- "hasDynamicHelp": false,
3696
- "multiple": false,
3697
- "type": "option"
3698
- },
3699
- "output": {
3700
- "char": "o",
3701
- "description": "File to write; stdout when omitted",
3702
- "name": "output",
3703
- "hasDynamicHelp": false,
3704
- "multiple": false,
3705
- "type": "option"
3706
- }
3707
- },
3732
+ "description": "List rubrics.",
3733
+ "flags": {},
3708
3734
  "hasDynamicHelp": false,
3709
3735
  "hiddenAliases": [],
3710
- "id": "queue:export-topology",
3736
+ "id": "rubric:list",
3711
3737
  "pluginAlias": "@memberjunction/cli",
3712
3738
  "pluginName": "@memberjunction/cli",
3713
3739
  "pluginType": "core",
@@ -3717,34 +3743,24 @@
3717
3743
  "relativePath": [
3718
3744
  "dist",
3719
3745
  "commands",
3720
- "queue",
3721
- "export-topology.js"
3746
+ "rubric",
3747
+ "list.js"
3722
3748
  ]
3723
3749
  },
3724
- "queue:import-bindings": {
3750
+ "rubric:show": {
3725
3751
  "aliases": [],
3726
3752
  "args": {
3727
- "file": {
3728
- "description": "BindingImport JSON file",
3729
- "name": "file",
3753
+ "rubric": {
3754
+ "description": "Rubric name or id, optionally @version",
3755
+ "name": "rubric",
3730
3756
  "required": true
3731
3757
  }
3732
3758
  },
3733
- "description": "Record cloud resource bindings (Terraform output) on work-queue topics and subscriptions",
3734
- "examples": [
3735
- "terraform output -json mj_work_queue_bindings > bindings.json && <%= config.bin %> <%= command.id %> bindings.json"
3736
- ],
3737
- "flags": {
3738
- "json": {
3739
- "description": "Print issues as JSON",
3740
- "name": "json",
3741
- "allowNo": false,
3742
- "type": "boolean"
3743
- }
3744
- },
3759
+ "description": "Show a rubric version and its criteria.",
3760
+ "flags": {},
3745
3761
  "hasDynamicHelp": false,
3746
3762
  "hiddenAliases": [],
3747
- "id": "queue:import-bindings",
3763
+ "id": "rubric:show",
3748
3764
  "pluginAlias": "@memberjunction/cli",
3749
3765
  "pluginName": "@memberjunction/cli",
3750
3766
  "pluginType": "core",
@@ -3754,23 +3770,24 @@
3754
3770
  "relativePath": [
3755
3771
  "dist",
3756
3772
  "commands",
3757
- "queue",
3758
- "import-bindings.js"
3773
+ "rubric",
3774
+ "show.js"
3759
3775
  ]
3760
3776
  },
3761
- "queue": {
3777
+ "rubric:validate": {
3762
3778
  "aliases": [],
3763
- "args": {},
3764
- "description": "Operate the durable work queue",
3765
- "examples": [
3766
- "<%= config.bin %> <%= command.id %> publish --topic samples.hello --payload '{\"name\":\"Paul\"}'",
3767
- "<%= config.bin %> <%= command.id %> stats",
3768
- "<%= config.bin %> <%= command.id %> dead-letters --subscription email.unsubscribe"
3769
- ],
3779
+ "args": {
3780
+ "file": {
3781
+ "description": "JSON snapshot file",
3782
+ "name": "file",
3783
+ "required": true
3784
+ }
3785
+ },
3786
+ "description": "Check a rubric snapshot file for duplicate keys, gates, weights, and scales.",
3770
3787
  "flags": {},
3771
3788
  "hasDynamicHelp": false,
3772
3789
  "hiddenAliases": [],
3773
- "id": "queue",
3790
+ "id": "rubric:validate",
3774
3791
  "pluginAlias": "@memberjunction/cli",
3775
3792
  "pluginName": "@memberjunction/cli",
3776
3793
  "pluginType": "core",
@@ -3780,64 +3797,64 @@
3780
3797
  "relativePath": [
3781
3798
  "dist",
3782
3799
  "commands",
3783
- "queue",
3784
- "index.js"
3800
+ "rubric",
3801
+ "validate.js"
3785
3802
  ]
3786
3803
  },
3787
- "queue:partitions": {
3804
+ "sql-audit": {
3788
3805
  "aliases": [],
3789
3806
  "args": {},
3790
- "description": "List a work-queue subscription's in-flight or blocked partition keys",
3807
+ "description": "Compare source and target databases for migration verification",
3791
3808
  "examples": [
3792
- "<%= config.bin %> <%= command.id %> --subscription integration.apply --condition Blocked"
3809
+ "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\"",
3810
+ "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\" --output report.txt",
3811
+ "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\" --source-schema __mj --target-schema __mj"
3793
3812
  ],
3794
3813
  "flags": {
3795
- "subscription": {
3796
- "char": "s",
3797
- "description": "Subscription name",
3798
- "name": "subscription",
3814
+ "source": {
3815
+ "description": "Source database connection string (mssql://... or postgres://...)",
3816
+ "name": "source",
3799
3817
  "required": true,
3800
3818
  "hasDynamicHelp": false,
3801
3819
  "multiple": false,
3802
3820
  "type": "option"
3803
3821
  },
3804
- "condition": {
3805
- "description": "Only keys in this condition",
3806
- "name": "condition",
3822
+ "target": {
3823
+ "description": "Target database connection string (mssql://... or postgres://...)",
3824
+ "name": "target",
3825
+ "required": true,
3807
3826
  "hasDynamicHelp": false,
3808
3827
  "multiple": false,
3809
- "options": [
3810
- "Idle",
3811
- "InFlight",
3812
- "Blocked"
3813
- ],
3814
3828
  "type": "option"
3815
3829
  },
3816
- "cursor": {
3817
- "description": "nextCursor from a previous page",
3818
- "name": "cursor",
3830
+ "source-schema": {
3831
+ "description": "Source schema name",
3832
+ "name": "source-schema",
3833
+ "default": "__mj",
3819
3834
  "hasDynamicHelp": false,
3820
3835
  "multiple": false,
3821
3836
  "type": "option"
3822
3837
  },
3823
- "page-size": {
3824
- "description": "Items per page (1–500)",
3825
- "name": "page-size",
3826
- "default": 50,
3838
+ "target-schema": {
3839
+ "description": "Target schema name",
3840
+ "name": "target-schema",
3841
+ "default": "__mj",
3827
3842
  "hasDynamicHelp": false,
3828
3843
  "multiple": false,
3829
3844
  "type": "option"
3830
3845
  },
3831
- "json": {
3832
- "description": "Print JSON instead of a table",
3833
- "name": "json",
3834
- "allowNo": false,
3835
- "type": "boolean"
3846
+ "output": {
3847
+ "char": "o",
3848
+ "description": "Save report to file",
3849
+ "name": "output",
3850
+ "hasDynamicHelp": false,
3851
+ "multiple": false,
3852
+ "type": "option"
3836
3853
  }
3837
3854
  },
3838
3855
  "hasDynamicHelp": false,
3839
3856
  "hiddenAliases": [],
3840
- "id": "queue:partitions",
3857
+ "id": "sql-audit",
3841
3858
  "pluginAlias": "@memberjunction/cli",
3842
3859
  "pluginName": "@memberjunction/cli",
3843
3860
  "pluginType": "core",
@@ -3847,80 +3864,31 @@
3847
3864
  "relativePath": [
3848
3865
  "dist",
3849
3866
  "commands",
3850
- "queue",
3851
- "partitions.js"
3867
+ "sql-audit",
3868
+ "index.js"
3852
3869
  ]
3853
3870
  },
3854
- "queue:publish": {
3871
+ "sql-audit:usage": {
3855
3872
  "aliases": [],
3856
3873
  "args": {},
3857
- "description": "Publish messages to a work-queue topic from this machine through MJ code (no API key needed)",
3858
- "examples": [
3859
- "<%= config.bin %> <%= command.id %> --topic samples.hello --payload '{\"name\":\"Paul\"}'",
3860
- "<%= config.bin %> <%= command.id %> --topic samples.hello --payload '{\"sleepMs\":60000}' --partition-key customer-42",
3861
- "<%= config.bin %> <%= command.id %> --topic samples.hello --count 5 --partition-key k1 --attribute source=demo"
3862
- ],
3874
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sql-audit` command.",
3863
3875
  "flags": {
3864
- "topic": {
3865
- "char": "t",
3866
- "description": "Topic name",
3867
- "name": "topic",
3868
- "required": true,
3869
- "hasDynamicHelp": false,
3870
- "multiple": false,
3871
- "type": "option"
3872
- },
3873
- "payload": {
3874
- "char": "p",
3875
- "description": "Message payload as JSON",
3876
- "name": "payload",
3877
- "default": "{}",
3878
- "hasDynamicHelp": false,
3879
- "multiple": false,
3880
- "type": "option"
3881
- },
3882
- "partition-key": {
3883
- "char": "k",
3884
- "description": "PartitionKey for Exclusive / Ordered subscriptions",
3885
- "name": "partition-key",
3886
- "hasDynamicHelp": false,
3887
- "multiple": false,
3888
- "type": "option"
3889
- },
3890
- "dedup-key": {
3891
- "description": "DeduplicationKey: a repeat within the topic TTL is reported as Duplicate",
3892
- "name": "dedup-key",
3893
- "hasDynamicHelp": false,
3894
- "multiple": false,
3895
- "type": "option"
3896
- },
3897
- "attribute": {
3898
- "char": "a",
3899
- "description": "Message attribute as key=value (repeatable)",
3900
- "name": "attribute",
3901
- "hasDynamicHelp": false,
3902
- "multiple": true,
3903
- "type": "option"
3904
- },
3905
- "count": {
3906
- "char": "n",
3907
- "description": "How many copies to publish in one batch",
3908
- "name": "count",
3909
- "default": 1,
3876
+ "format": {
3877
+ "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
3878
+ "name": "format",
3910
3879
  "hasDynamicHelp": false,
3911
3880
  "multiple": false,
3881
+ "options": [
3882
+ "text",
3883
+ "json",
3884
+ "md"
3885
+ ],
3912
3886
  "type": "option"
3913
- },
3914
- "json": {
3915
- "description": "Print the publish results as JSON",
3916
- "name": "json",
3917
- "allowNo": false,
3918
- "type": "boolean"
3919
3887
  }
3920
3888
  },
3921
3889
  "hasDynamicHelp": false,
3922
3890
  "hiddenAliases": [],
3923
- "id": "queue:publish",
3891
+ "id": "sql-audit:usage",
3924
3892
  "pluginAlias": "@memberjunction/cli",
3925
3893
  "pluginName": "@memberjunction/cli",
3926
3894
  "pluginType": "core",
@@ -3930,87 +3898,82 @@
3930
3898
  "relativePath": [
3931
3899
  "dist",
3932
3900
  "commands",
3933
- "queue",
3934
- "publish.js"
3901
+ "sql-audit",
3902
+ "usage.js"
3935
3903
  ]
3936
3904
  },
3937
- "queue:replay": {
3905
+ "sql-convert": {
3938
3906
  "aliases": [],
3939
- "args": {},
3940
- "description": "Replay one dead-lettered work-queue delivery",
3907
+ "args": {
3908
+ "source": {
3909
+ "description": "Source SQL file path",
3910
+ "name": "source",
3911
+ "required": true
3912
+ }
3913
+ },
3914
+ "description": "Convert SQL files between database dialects using rule-based BatchConverter engine",
3941
3915
  "examples": [
3942
- "<%= config.bin %> <%= command.id %> --subscription integration.apply --delivery <id> --note \"mapping fixed\""
3916
+ "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres",
3917
+ "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --output converted.sql",
3918
+ "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --schema my_schema",
3919
+ "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --no-header --verbose"
3943
3920
  ],
3944
3921
  "flags": {
3945
- "subscription": {
3946
- "char": "s",
3947
- "description": "Subscription name",
3948
- "name": "subscription",
3922
+ "from": {
3923
+ "description": "Source SQL dialect",
3924
+ "name": "from",
3949
3925
  "required": true,
3950
3926
  "hasDynamicHelp": false,
3951
3927
  "multiple": false,
3952
3928
  "type": "option"
3953
3929
  },
3954
- "delivery": {
3955
- "char": "d",
3956
- "description": "DeliveryID from `mj queue dead-letters`",
3957
- "name": "delivery",
3930
+ "to": {
3931
+ "description": "Target SQL dialect",
3932
+ "name": "to",
3958
3933
  "required": true,
3959
3934
  "hasDynamicHelp": false,
3960
3935
  "multiple": false,
3961
3936
  "type": "option"
3962
3937
  },
3963
- "note": {
3964
- "description": "Operator note stored with the resolution",
3965
- "name": "note",
3938
+ "output": {
3939
+ "char": "o",
3940
+ "description": "Output file path (default: <source>.converted.<ext>)",
3941
+ "name": "output",
3966
3942
  "hasDynamicHelp": false,
3967
3943
  "multiple": false,
3968
3944
  "type": "option"
3969
- }
3970
- },
3971
- "hasDynamicHelp": false,
3972
- "hiddenAliases": [],
3973
- "id": "queue:replay",
3974
- "pluginAlias": "@memberjunction/cli",
3975
- "pluginName": "@memberjunction/cli",
3976
- "pluginType": "core",
3977
- "strict": true,
3978
- "enableJsonFlag": false,
3979
- "isESM": true,
3980
- "relativePath": [
3981
- "dist",
3982
- "commands",
3983
- "queue",
3984
- "replay.js"
3985
- ]
3986
- },
3987
- "queue:stats": {
3988
- "aliases": [],
3989
- "args": {},
3990
- "description": "Show pending, in-flight and dead-lettered counts for work-queue subscriptions",
3991
- "examples": [
3992
- "<%= config.bin %> <%= command.id %>",
3993
- "<%= config.bin %> <%= command.id %> --subscription email.unsubscribe --json"
3994
- ],
3995
- "flags": {
3996
- "subscription": {
3997
- "char": "s",
3998
- "description": "Subscription name; omit for every subscription",
3999
- "name": "subscription",
3945
+ },
3946
+ "schema": {
3947
+ "description": "Target schema name",
3948
+ "name": "schema",
3949
+ "default": "__mj",
4000
3950
  "hasDynamicHelp": false,
4001
3951
  "multiple": false,
4002
3952
  "type": "option"
4003
3953
  },
4004
- "json": {
4005
- "description": "Print JSON instead of a table",
4006
- "name": "json",
3954
+ "no-header": {
3955
+ "description": "Skip PG header (extensions, schema, implicit cast)",
3956
+ "name": "no-header",
3957
+ "allowNo": false,
3958
+ "type": "boolean"
3959
+ },
3960
+ "no-post-process": {
3961
+ "description": "Skip post-processing pass",
3962
+ "name": "no-post-process",
3963
+ "allowNo": false,
3964
+ "type": "boolean"
3965
+ },
3966
+ "verbose": {
3967
+ "char": "v",
3968
+ "description": "Show per-statement progress and detailed report",
3969
+ "name": "verbose",
4007
3970
  "allowNo": false,
4008
3971
  "type": "boolean"
4009
3972
  }
4010
3973
  },
4011
3974
  "hasDynamicHelp": false,
4012
3975
  "hiddenAliases": [],
4013
- "id": "queue:stats",
3976
+ "id": "sql-convert",
4014
3977
  "pluginAlias": "@memberjunction/cli",
4015
3978
  "pluginName": "@memberjunction/cli",
4016
3979
  "pluginType": "core",
@@ -4020,14 +3983,14 @@
4020
3983
  "relativePath": [
4021
3984
  "dist",
4022
3985
  "commands",
4023
- "queue",
4024
- "stats.js"
3986
+ "sql-convert",
3987
+ "index.js"
4025
3988
  ]
4026
3989
  },
4027
- "queue:usage": {
3990
+ "sql-convert:usage": {
4028
3991
  "aliases": [],
4029
3992
  "args": {},
4030
- "description": "Show usage, flags, examples, and runtime hints for every `mj queue` command.",
3993
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sql-convert` command.",
4031
3994
  "flags": {
4032
3995
  "format": {
4033
3996
  "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
@@ -4044,7 +4007,7 @@
4044
4007
  },
4045
4008
  "hasDynamicHelp": false,
4046
4009
  "hiddenAliases": [],
4047
- "id": "queue:usage",
4010
+ "id": "sql-convert:usage",
4048
4011
  "pluginAlias": "@memberjunction/cli",
4049
4012
  "pluginName": "@memberjunction/cli",
4050
4013
  "pluginType": "core",
@@ -4054,37 +4017,87 @@
4054
4017
  "relativePath": [
4055
4018
  "dist",
4056
4019
  "commands",
4057
- "queue",
4020
+ "sql-convert",
4058
4021
  "usage.js"
4059
4022
  ]
4060
4023
  },
4061
- "queue:validate-bindings": {
4024
+ "standards:adopt": {
4062
4025
  "aliases": [],
4063
4026
  "args": {},
4064
- "description": "Validate work-queue topology and cloud bindings; exits 1 on any error",
4027
+ "description": "Adopt MemberJunction standards in this repository (config + CI + npm script + layer declarations)",
4065
4028
  "examples": [
4066
- "<%= config.bin %> <%= command.id %>",
4067
- "<%= config.bin %> <%= command.id %> --transport AWS-prod"
4029
+ {
4030
+ "command": "<%= config.bin %> <%= command.id %>",
4031
+ "description": "Adopt every standard available at this CLI version"
4032
+ },
4033
+ {
4034
+ "command": "<%= config.bin %> <%= command.id %> --ci github --declare-compliant",
4035
+ "description": "Full setup: config, GitHub workflow, npm script, and declare already-compliant packages"
4036
+ },
4037
+ {
4038
+ "command": "<%= config.bin %> <%= command.id %> --dry-run",
4039
+ "description": "Show what would change"
4040
+ },
4041
+ {
4042
+ "command": "<%= config.bin %> <%= command.id %> --upgrade",
4043
+ "description": "Review standards added since this repo adopted, and bump its recorded version"
4044
+ }
4068
4045
  ],
4069
4046
  "flags": {
4070
- "transport": {
4071
- "char": "t",
4072
- "description": "Validate one transport's bindings against its resources",
4073
- "name": "transport",
4047
+ "cwd": {
4048
+ "description": "Repository root. Defaults to the current directory.",
4049
+ "name": "cwd",
4074
4050
  "hasDynamicHelp": false,
4075
4051
  "multiple": false,
4076
4052
  "type": "option"
4077
4053
  },
4078
- "json": {
4079
- "description": "Print issues as JSON",
4080
- "name": "json",
4081
- "allowNo": false,
4082
- "type": "boolean"
4083
- }
4084
- },
4085
- "hasDynamicHelp": false,
4054
+ "check": {
4055
+ "description": "Only adopt these check ids.",
4056
+ "name": "check",
4057
+ "hasDynamicHelp": false,
4058
+ "multiple": true,
4059
+ "type": "option"
4060
+ },
4061
+ "ci": {
4062
+ "description": "Write a CI workflow for this provider.",
4063
+ "name": "ci",
4064
+ "default": "none",
4065
+ "hasDynamicHelp": false,
4066
+ "multiple": false,
4067
+ "options": [
4068
+ "github",
4069
+ "none"
4070
+ ],
4071
+ "type": "option"
4072
+ },
4073
+ "npm-script": {
4074
+ "description": "Add an \"mj:standards\" script to the root package.json.",
4075
+ "name": "npm-script",
4076
+ "allowNo": true,
4077
+ "type": "boolean"
4078
+ },
4079
+ "declare-compliant": {
4080
+ "description": "Declare mjUILayer on packages that already comply. Without this a fresh adoption enforces nothing — every package is undeclared, so every package is skipped.",
4081
+ "name": "declare-compliant",
4082
+ "allowNo": false,
4083
+ "type": "boolean"
4084
+ },
4085
+ "upgrade": {
4086
+ "description": "Enable standards newer than this repo’s recorded StandardsVersion, and bump it.",
4087
+ "name": "upgrade",
4088
+ "allowNo": false,
4089
+ "type": "boolean"
4090
+ },
4091
+ "dry-run": {
4092
+ "description": "Report what would change; write nothing.",
4093
+ "name": "dry-run",
4094
+ "allowNo": false,
4095
+ "type": "boolean"
4096
+ }
4097
+ },
4098
+ "hasDynamicHelp": false,
4086
4099
  "hiddenAliases": [],
4087
- "id": "queue:validate-bindings",
4100
+ "id": "standards:adopt",
4088
4101
  "pluginAlias": "@memberjunction/cli",
4089
4102
  "pluginName": "@memberjunction/cli",
4090
4103
  "pluginType": "core",
@@ -4094,87 +4107,59 @@
4094
4107
  "relativePath": [
4095
4108
  "dist",
4096
4109
  "commands",
4097
- "queue",
4098
- "validate-bindings.js"
4110
+ "standards",
4111
+ "adopt.js"
4099
4112
  ]
4100
4113
  },
4101
- "queue:work": {
4114
+ "standards:check": {
4102
4115
  "aliases": [],
4103
4116
  "args": {},
4104
- "description": "Run work-queue subscriptions in this process: once for a container job, or until stopped",
4117
+ "description": "Run the MemberJunction standards this repository has adopted",
4105
4118
  "examples": [
4106
- "<%= config.bin %> <%= command.id %> --subscription venue-import --once",
4107
- "<%= config.bin %> <%= command.id %> --subscription venue-import --once --max 5 --concurrency 2 --max-duration-ms 3300000",
4108
- "<%= config.bin %> <%= command.id %> --subscription \"*\""
4109
- ],
4110
- "flags": {
4111
- "subscription": {
4112
- "char": "s",
4113
- "description": "Subscription name, or '*' for every MJWorker subscription",
4114
- "name": "subscription",
4115
- "required": true,
4116
- "hasDynamicHelp": false,
4117
- "multiple": false,
4118
- "type": "option"
4119
- },
4120
- "once": {
4121
- "description": "Receive up to --max deliveries, drain and exit (container-job mode)",
4122
- "name": "once",
4123
- "allowNo": false,
4124
- "type": "boolean"
4119
+ {
4120
+ "command": "<%= config.bin %> <%= command.id %>",
4121
+ "description": "Run every adopted standard"
4125
4122
  },
4126
- "max": {
4127
- "dependsOn": [
4128
- "once"
4129
- ],
4130
- "description": "With --once: how many deliveries to receive",
4131
- "name": "max",
4132
- "default": 1,
4133
- "hasDynamicHelp": false,
4134
- "multiple": false,
4135
- "type": "option"
4123
+ {
4124
+ "command": "<%= config.bin %> <%= command.id %> --check ui-layers",
4125
+ "description": "Run one standard"
4136
4126
  },
4137
- "idle-exit-ms": {
4138
- "dependsOn": [
4139
- "once"
4140
- ],
4141
- "description": "With --once: exit after this long with an empty queue",
4142
- "name": "idle-exit-ms",
4143
- "default": 5000,
4127
+ {
4128
+ "command": "<%= config.bin %> <%= command.id %> --strict",
4129
+ "description": "Fail on warnings too"
4130
+ }
4131
+ ],
4132
+ "flags": {
4133
+ "cwd": {
4134
+ "description": "Repository root. Defaults to the current directory.",
4135
+ "name": "cwd",
4144
4136
  "hasDynamicHelp": false,
4145
4137
  "multiple": false,
4146
4138
  "type": "option"
4147
4139
  },
4148
- "max-duration-ms": {
4149
- "dependsOn": [
4150
- "once"
4151
- ],
4152
- "description": "With --once: stop claiming after this long and drain (keep it below the scheduler's job deadline)",
4153
- "name": "max-duration-ms",
4140
+ "check": {
4141
+ "description": "Only run these check ids.",
4142
+ "name": "check",
4154
4143
  "hasDynamicHelp": false,
4155
- "multiple": false,
4144
+ "multiple": true,
4156
4145
  "type": "option"
4157
4146
  },
4158
- "concurrency": {
4159
- "description": "Handlers in flight per subscription",
4160
- "name": "concurrency",
4161
- "default": 1,
4162
- "hasDynamicHelp": false,
4163
- "multiple": false,
4164
- "type": "option"
4147
+ "strict": {
4148
+ "description": "Treat warnings as errors. Use in CI once a newly adopted check is clean.",
4149
+ "name": "strict",
4150
+ "allowNo": false,
4151
+ "type": "boolean"
4165
4152
  },
4166
- "shutdown-drain-ms": {
4167
- "description": "How long in-flight handlers get to finish on exit; the drain can take twice this",
4168
- "name": "shutdown-drain-ms",
4169
- "default": 30000,
4170
- "hasDynamicHelp": false,
4171
- "multiple": false,
4172
- "type": "option"
4153
+ "quiet": {
4154
+ "description": "Print only the summary line.",
4155
+ "name": "quiet",
4156
+ "allowNo": false,
4157
+ "type": "boolean"
4173
4158
  }
4174
4159
  },
4175
4160
  "hasDynamicHelp": false,
4176
4161
  "hiddenAliases": [],
4177
- "id": "queue:work",
4162
+ "id": "standards:check",
4178
4163
  "pluginAlias": "@memberjunction/cli",
4179
4164
  "pluginName": "@memberjunction/cli",
4180
4165
  "pluginType": "core",
@@ -4184,64 +4169,33 @@
4184
4169
  "relativePath": [
4185
4170
  "dist",
4186
4171
  "commands",
4187
- "queue",
4188
- "work.js"
4172
+ "standards",
4173
+ "check.js"
4189
4174
  ]
4190
4175
  },
4191
- "sql-audit": {
4176
+ "standards:list": {
4192
4177
  "aliases": [],
4193
4178
  "args": {},
4194
- "description": "Compare source and target databases for migration verification",
4195
- "examples": [
4196
- "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\"",
4197
- "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\" --output report.txt",
4198
- "<%= config.bin %> sql-audit --source \"mssql://sa:pass@host/db\" --target \"postgres://user:pass@host:5432/db\" --source-schema __mj --target-schema __mj"
4199
- ],
4179
+ "description": "List every MemberJunction standard and this repository’s stance on it",
4200
4180
  "flags": {
4201
- "source": {
4202
- "description": "Source database connection string (mssql://... or postgres://...)",
4203
- "name": "source",
4204
- "required": true,
4205
- "hasDynamicHelp": false,
4206
- "multiple": false,
4207
- "type": "option"
4208
- },
4209
- "target": {
4210
- "description": "Target database connection string (mssql://... or postgres://...)",
4211
- "name": "target",
4212
- "required": true,
4213
- "hasDynamicHelp": false,
4214
- "multiple": false,
4215
- "type": "option"
4216
- },
4217
- "source-schema": {
4218
- "description": "Source schema name",
4219
- "name": "source-schema",
4220
- "default": "__mj",
4221
- "hasDynamicHelp": false,
4222
- "multiple": false,
4223
- "type": "option"
4224
- },
4225
- "target-schema": {
4226
- "description": "Target schema name",
4227
- "name": "target-schema",
4228
- "default": "__mj",
4181
+ "cwd": {
4182
+ "description": "Repository root. Defaults to the current directory.",
4183
+ "name": "cwd",
4229
4184
  "hasDynamicHelp": false,
4230
4185
  "multiple": false,
4231
4186
  "type": "option"
4232
4187
  },
4233
- "output": {
4234
- "char": "o",
4235
- "description": "Save report to file",
4236
- "name": "output",
4237
- "hasDynamicHelp": false,
4238
- "multiple": false,
4239
- "type": "option"
4188
+ "verbose": {
4189
+ "char": "v",
4190
+ "description": "Include the full description of each standard.",
4191
+ "name": "verbose",
4192
+ "allowNo": false,
4193
+ "type": "boolean"
4240
4194
  }
4241
4195
  },
4242
4196
  "hasDynamicHelp": false,
4243
4197
  "hiddenAliases": [],
4244
- "id": "sql-audit",
4198
+ "id": "standards:list",
4245
4199
  "pluginAlias": "@memberjunction/cli",
4246
4200
  "pluginName": "@memberjunction/cli",
4247
4201
  "pluginType": "core",
@@ -4251,14 +4205,14 @@
4251
4205
  "relativePath": [
4252
4206
  "dist",
4253
4207
  "commands",
4254
- "sql-audit",
4255
- "index.js"
4208
+ "standards",
4209
+ "list.js"
4256
4210
  ]
4257
4211
  },
4258
- "sql-audit:usage": {
4212
+ "standards:usage": {
4259
4213
  "aliases": [],
4260
4214
  "args": {},
4261
- "description": "Show usage, flags, examples, and runtime hints for every `mj sql-audit` command.",
4215
+ "description": "Show usage, flags, examples, and runtime hints for every `mj standards` command.",
4262
4216
  "flags": {
4263
4217
  "format": {
4264
4218
  "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
@@ -4275,7 +4229,7 @@
4275
4229
  },
4276
4230
  "hasDynamicHelp": false,
4277
4231
  "hiddenAliases": [],
4278
- "id": "sql-audit:usage",
4232
+ "id": "standards:usage",
4279
4233
  "pluginAlias": "@memberjunction/cli",
4280
4234
  "pluginName": "@memberjunction/cli",
4281
4235
  "pluginType": "core",
@@ -4285,74 +4239,56 @@
4285
4239
  "relativePath": [
4286
4240
  "dist",
4287
4241
  "commands",
4288
- "sql-audit",
4242
+ "standards",
4289
4243
  "usage.js"
4290
4244
  ]
4291
4245
  },
4292
- "sql-convert": {
4246
+ "sync:file-reset": {
4293
4247
  "aliases": [],
4294
- "args": {
4295
- "source": {
4296
- "description": "Source SQL file path",
4297
- "name": "source",
4298
- "required": true
4299
- }
4300
- },
4301
- "description": "Convert SQL files between database dialects using rule-based BatchConverter engine",
4248
+ "args": {},
4249
+ "description": "Reset file metadata sections",
4302
4250
  "examples": [
4303
- "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres",
4304
- "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --output converted.sql",
4305
- "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --schema my_schema",
4306
- "<%= config.bin %> sql-convert ./migration.sql --from tsql --to postgres --no-header --verbose"
4251
+ "<%= config.bin %> <%= command.id %>",
4252
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4253
+ "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
4254
+ "<%= config.bin %> <%= command.id %> --all"
4307
4255
  ],
4308
4256
  "flags": {
4309
- "from": {
4310
- "description": "Source SQL dialect",
4311
- "name": "from",
4312
- "required": true,
4313
- "hasDynamicHelp": false,
4314
- "multiple": false,
4315
- "type": "option"
4316
- },
4317
- "to": {
4318
- "description": "Target SQL dialect",
4319
- "name": "to",
4320
- "required": true,
4257
+ "dir": {
4258
+ "description": "Specific entity directory to reset",
4259
+ "name": "dir",
4321
4260
  "hasDynamicHelp": false,
4322
4261
  "multiple": false,
4323
4262
  "type": "option"
4324
4263
  },
4325
- "output": {
4326
- "char": "o",
4327
- "description": "Output file path (default: <source>.converted.<ext>)",
4328
- "name": "output",
4264
+ "sections": {
4265
+ "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
4266
+ "name": "sections",
4329
4267
  "hasDynamicHelp": false,
4330
4268
  "multiple": false,
4331
4269
  "type": "option"
4332
4270
  },
4333
- "schema": {
4334
- "description": "Target schema name",
4335
- "name": "schema",
4336
- "default": "__mj",
4337
- "hasDynamicHelp": false,
4338
- "multiple": false,
4339
- "type": "option"
4271
+ "all": {
4272
+ "description": "Reset all metadata sections",
4273
+ "name": "all",
4274
+ "allowNo": false,
4275
+ "type": "boolean"
4340
4276
  },
4341
- "no-header": {
4342
- "description": "Skip PG header (extensions, schema, implicit cast)",
4343
- "name": "no-header",
4277
+ "dry-run": {
4278
+ "description": "Show what would be reset without actually resetting",
4279
+ "name": "dry-run",
4344
4280
  "allowNo": false,
4345
4281
  "type": "boolean"
4346
4282
  },
4347
- "no-post-process": {
4348
- "description": "Skip post-processing pass",
4349
- "name": "no-post-process",
4283
+ "force": {
4284
+ "description": "Skip confirmation prompts",
4285
+ "name": "force",
4350
4286
  "allowNo": false,
4351
4287
  "type": "boolean"
4352
4288
  },
4353
4289
  "verbose": {
4354
4290
  "char": "v",
4355
- "description": "Show per-statement progress and detailed report",
4291
+ "description": "Show detailed output",
4356
4292
  "name": "verbose",
4357
4293
  "allowNo": false,
4358
4294
  "type": "boolean"
@@ -4360,41 +4296,7 @@
4360
4296
  },
4361
4297
  "hasDynamicHelp": false,
4362
4298
  "hiddenAliases": [],
4363
- "id": "sql-convert",
4364
- "pluginAlias": "@memberjunction/cli",
4365
- "pluginName": "@memberjunction/cli",
4366
- "pluginType": "core",
4367
- "strict": true,
4368
- "enableJsonFlag": false,
4369
- "isESM": true,
4370
- "relativePath": [
4371
- "dist",
4372
- "commands",
4373
- "sql-convert",
4374
- "index.js"
4375
- ]
4376
- },
4377
- "sql-convert:usage": {
4378
- "aliases": [],
4379
- "args": {},
4380
- "description": "Show usage, flags, examples, and runtime hints for every `mj sql-convert` command.",
4381
- "flags": {
4382
- "format": {
4383
- "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
4384
- "name": "format",
4385
- "hasDynamicHelp": false,
4386
- "multiple": false,
4387
- "options": [
4388
- "text",
4389
- "json",
4390
- "md"
4391
- ],
4392
- "type": "option"
4393
- }
4394
- },
4395
- "hasDynamicHelp": false,
4396
- "hiddenAliases": [],
4397
- "id": "sql-convert:usage",
4299
+ "id": "sync:file-reset",
4398
4300
  "pluginAlias": "@memberjunction/cli",
4399
4301
  "pluginName": "@memberjunction/cli",
4400
4302
  "pluginType": "core",
@@ -4404,87 +4306,69 @@
4404
4306
  "relativePath": [
4405
4307
  "dist",
4406
4308
  "commands",
4407
- "sql-convert",
4408
- "usage.js"
4309
+ "sync",
4310
+ "file-reset.js"
4409
4311
  ]
4410
4312
  },
4411
- "standards:adopt": {
4313
+ "sync:init": {
4412
4314
  "aliases": [],
4413
4315
  "args": {},
4414
- "description": "Adopt MemberJunction standards in this repository (config + CI + npm script + layer declarations)",
4316
+ "description": "Initialize a directory for metadata synchronization.\n\nPrompts at a terminal; runs unattended when piped, spawned, or in CI. To script it,\npass --setup-entity (and --entity/--dir when setting up \"other\").",
4415
4317
  "examples": [
4416
4318
  {
4417
- "command": "<%= config.bin %> <%= command.id %>",
4418
- "description": "Adopt every standard available at this CLI version"
4319
+ "command": "<%= config.bin %> <%= command.id %> --setup-entity=no",
4320
+ "description": "Initialize with no entity directory"
4419
4321
  },
4420
4322
  {
4421
- "command": "<%= config.bin %> <%= command.id %> --ci github --declare-compliant",
4422
- "description": "Full setup: config, GitHub workflow, npm script, and declare already-compliant packages"
4323
+ "command": "<%= config.bin %> <%= command.id %> --setup-entity=ai-prompts",
4324
+ "description": "Initialize and set up the AI Prompts directory"
4423
4325
  },
4424
4326
  {
4425
- "command": "<%= config.bin %> <%= command.id %> --dry-run",
4426
- "description": "Show what would change"
4327
+ "command": "<%= config.bin %> <%= command.id %> --setup-entity=other --entity=\"MJ: AI Models\" --dir=ai-models",
4328
+ "description": "Initialize for an arbitrary entity"
4427
4329
  },
4428
4330
  {
4429
- "command": "<%= config.bin %> <%= command.id %> --upgrade",
4430
- "description": "Review standards added since this repo adopted, and bump its recorded version"
4331
+ "command": "<%= config.bin %> <%= command.id %> --no-interactive --setup-entity=no",
4332
+ "description": "Never prompt, even at a terminal"
4431
4333
  }
4432
4334
  ],
4433
4335
  "flags": {
4434
- "cwd": {
4435
- "description": "Repository root. Defaults to the current directory.",
4436
- "name": "cwd",
4336
+ "setup-entity": {
4337
+ "description": "Which entity directory to set up. Use \"no\" to skip.",
4338
+ "name": "setup-entity",
4437
4339
  "hasDynamicHelp": false,
4438
4340
  "multiple": false,
4341
+ "options": [
4342
+ "ai-prompts",
4343
+ "other",
4344
+ "no"
4345
+ ],
4439
4346
  "type": "option"
4440
4347
  },
4441
- "check": {
4442
- "description": "Only adopt these check ids.",
4443
- "name": "check",
4348
+ "entity": {
4349
+ "description": "Entity name when --setup-entity=other (e.g. \"MJ: AI Models\").",
4350
+ "name": "entity",
4444
4351
  "hasDynamicHelp": false,
4445
- "multiple": true,
4352
+ "multiple": false,
4446
4353
  "type": "option"
4447
4354
  },
4448
- "ci": {
4449
- "description": "Write a CI workflow for this provider.",
4450
- "name": "ci",
4451
- "default": "none",
4355
+ "dir": {
4356
+ "description": "Directory name when --setup-entity=other. Defaults to a slug of --entity.",
4357
+ "name": "dir",
4452
4358
  "hasDynamicHelp": false,
4453
4359
  "multiple": false,
4454
- "options": [
4455
- "github",
4456
- "none"
4457
- ],
4458
4360
  "type": "option"
4459
4361
  },
4460
- "npm-script": {
4461
- "description": "Add an \"mj:standards\" script to the root package.json.",
4462
- "name": "npm-script",
4362
+ "overwrite": {
4363
+ "description": "Overwrite an existing configuration. Without this, an initialized directory is left untouched.",
4364
+ "name": "overwrite",
4463
4365
  "allowNo": true,
4464
4366
  "type": "boolean"
4465
- },
4466
- "declare-compliant": {
4467
- "description": "Declare mjUILayer on packages that already comply. Without this a fresh adoption enforces nothing — every package is undeclared, so every package is skipped.",
4468
- "name": "declare-compliant",
4469
- "allowNo": false,
4470
- "type": "boolean"
4471
- },
4472
- "upgrade": {
4473
- "description": "Enable standards newer than this repo’s recorded StandardsVersion, and bump it.",
4474
- "name": "upgrade",
4475
- "allowNo": false,
4476
- "type": "boolean"
4477
- },
4478
- "dry-run": {
4479
- "description": "Report what would change; write nothing.",
4480
- "name": "dry-run",
4481
- "allowNo": false,
4482
- "type": "boolean"
4483
4367
  }
4484
4368
  },
4485
4369
  "hasDynamicHelp": false,
4486
4370
  "hiddenAliases": [],
4487
- "id": "standards:adopt",
4371
+ "id": "sync:init",
4488
4372
  "pluginAlias": "@memberjunction/cli",
4489
4373
  "pluginName": "@memberjunction/cli",
4490
4374
  "pluginType": "core",
@@ -4494,285 +4378,228 @@
4494
4378
  "relativePath": [
4495
4379
  "dist",
4496
4380
  "commands",
4497
- "standards",
4498
- "adopt.js"
4381
+ "sync",
4382
+ "init.js"
4499
4383
  ]
4500
4384
  },
4501
- "standards:check": {
4385
+ "sync:pull": {
4502
4386
  "aliases": [],
4503
4387
  "args": {},
4504
- "description": "Run the MemberJunction standards this repository has adopted",
4505
- "examples": [
4506
- {
4507
- "command": "<%= config.bin %> <%= command.id %>",
4508
- "description": "Run every adopted standard"
4509
- },
4510
- {
4511
- "command": "<%= config.bin %> <%= command.id %> --check ui-layers",
4512
- "description": "Run one standard"
4513
- },
4514
- {
4515
- "command": "<%= config.bin %> <%= command.id %> --strict",
4516
- "description": "Fail on warnings too"
4517
- }
4518
- ],
4388
+ "description": "Pull metadata from database to local files",
4519
4389
  "flags": {
4520
- "cwd": {
4521
- "description": "Repository root. Defaults to the current directory.",
4522
- "name": "cwd",
4390
+ "format": {
4391
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced). Defaults to text on a terminal and json when stdout is piped.",
4392
+ "name": "format",
4523
4393
  "hasDynamicHelp": false,
4524
4394
  "multiple": false,
4395
+ "options": [
4396
+ "text",
4397
+ "json",
4398
+ "md",
4399
+ "human",
4400
+ "console",
4401
+ "markdown"
4402
+ ],
4525
4403
  "type": "option"
4526
4404
  },
4527
- "check": {
4528
- "description": "Only run these check ids.",
4529
- "name": "check",
4530
- "hasDynamicHelp": false,
4531
- "multiple": true,
4532
- "type": "option"
4405
+ "verbose": {
4406
+ "char": "v",
4407
+ "description": "Show detailed output",
4408
+ "name": "verbose",
4409
+ "allowNo": false,
4410
+ "type": "boolean"
4533
4411
  },
4534
- "strict": {
4535
- "description": "Treat warnings as errors. Use in CI once a newly adopted check is clean.",
4536
- "name": "strict",
4412
+ "no-banner": {
4413
+ "description": "Suppress the startup banner and runtime advisory",
4414
+ "name": "no-banner",
4537
4415
  "allowNo": false,
4538
4416
  "type": "boolean"
4539
4417
  },
4540
- "quiet": {
4541
- "description": "Print only the summary line.",
4542
- "name": "quiet",
4418
+ "no-app-packages": {
4419
+ "description": "Do not load installed Open App server packages (or the host's generated packages) for this run, so records are written with the generic BaseEntity — no custom Save() logic or lifecycle hooks.",
4420
+ "name": "no-app-packages",
4543
4421
  "allowNo": false,
4544
4422
  "type": "boolean"
4545
- }
4546
- },
4547
- "hasDynamicHelp": false,
4548
- "hiddenAliases": [],
4549
- "id": "standards:check",
4550
- "pluginAlias": "@memberjunction/cli",
4551
- "pluginName": "@memberjunction/cli",
4552
- "pluginType": "core",
4553
- "strict": true,
4554
- "enableJsonFlag": false,
4555
- "isESM": true,
4556
- "relativePath": [
4557
- "dist",
4558
- "commands",
4559
- "standards",
4560
- "check.js"
4561
- ]
4562
- },
4563
- "standards:list": {
4564
- "aliases": [],
4565
- "args": {},
4566
- "description": "List every MemberJunction standard and this repository’s stance on it",
4567
- "flags": {
4568
- "cwd": {
4569
- "description": "Repository root. Defaults to the current directory.",
4570
- "name": "cwd",
4423
+ },
4424
+ "interactive": {
4425
+ "description": "Allow interactive prompts. Defaults to on at a terminal and off when piped, spawned, or in CI, so an agent never hangs on a question. Use --no-interactive to force it off.",
4426
+ "name": "interactive",
4427
+ "allowNo": true,
4428
+ "type": "boolean"
4429
+ },
4430
+ "entity": {
4431
+ "description": "Entity name to pull",
4432
+ "name": "entity",
4433
+ "required": true,
4571
4434
  "hasDynamicHelp": false,
4572
4435
  "multiple": false,
4573
4436
  "type": "option"
4574
4437
  },
4575
- "verbose": {
4576
- "char": "v",
4577
- "description": "Include the full description of each standard.",
4578
- "name": "verbose",
4438
+ "filter": {
4439
+ "description": "Additional filter for pulling specific records",
4440
+ "name": "filter",
4441
+ "hasDynamicHelp": false,
4442
+ "multiple": false,
4443
+ "type": "option"
4444
+ },
4445
+ "dry-run": {
4446
+ "description": "Show what would be pulled without actually pulling",
4447
+ "name": "dry-run",
4579
4448
  "allowNo": false,
4580
4449
  "type": "boolean"
4581
- }
4582
- },
4583
- "hasDynamicHelp": false,
4584
- "hiddenAliases": [],
4585
- "id": "standards:list",
4586
- "pluginAlias": "@memberjunction/cli",
4587
- "pluginName": "@memberjunction/cli",
4588
- "pluginType": "core",
4589
- "strict": true,
4590
- "enableJsonFlag": false,
4591
- "isESM": true,
4592
- "relativePath": [
4593
- "dist",
4594
- "commands",
4595
- "standards",
4596
- "list.js"
4597
- ]
4598
- },
4599
- "standards:usage": {
4600
- "aliases": [],
4601
- "args": {},
4602
- "description": "Show usage, flags, examples, and runtime hints for every `mj standards` command.",
4603
- "flags": {
4604
- "format": {
4605
- "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
4606
- "name": "format",
4607
- "hasDynamicHelp": false,
4608
- "multiple": false,
4609
- "options": [
4610
- "text",
4611
- "json",
4612
- "md"
4613
- ],
4614
- "type": "option"
4615
- }
4616
- },
4617
- "hasDynamicHelp": false,
4618
- "hiddenAliases": [],
4619
- "id": "standards:usage",
4620
- "pluginAlias": "@memberjunction/cli",
4621
- "pluginName": "@memberjunction/cli",
4622
- "pluginType": "core",
4623
- "strict": true,
4624
- "enableJsonFlag": false,
4625
- "isESM": true,
4626
- "relativePath": [
4627
- "dist",
4628
- "commands",
4629
- "standards",
4630
- "usage.js"
4631
- ]
4632
- },
4633
- "sync:file-reset": {
4634
- "aliases": [],
4635
- "args": {},
4636
- "description": "Reset file metadata sections",
4637
- "examples": [
4638
- "<%= config.bin %> <%= command.id %>",
4639
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4640
- "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
4641
- "<%= config.bin %> <%= command.id %> --all"
4642
- ],
4643
- "flags": {
4644
- "dir": {
4645
- "description": "Specific entity directory to reset",
4646
- "name": "dir",
4647
- "hasDynamicHelp": false,
4648
- "multiple": false,
4649
- "type": "option"
4650
4450
  },
4651
- "sections": {
4652
- "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
4653
- "name": "sections",
4451
+ "multi-file": {
4452
+ "description": "Create a single file with multiple records (provide filename)",
4453
+ "name": "multi-file",
4654
4454
  "hasDynamicHelp": false,
4655
4455
  "multiple": false,
4656
4456
  "type": "option"
4657
4457
  },
4658
- "all": {
4659
- "description": "Reset all metadata sections",
4660
- "name": "all",
4458
+ "no-validate": {
4459
+ "description": "Skip validation before pull",
4460
+ "name": "no-validate",
4661
4461
  "allowNo": false,
4662
4462
  "type": "boolean"
4663
4463
  },
4664
- "dry-run": {
4665
- "description": "Show what would be reset without actually resetting",
4666
- "name": "dry-run",
4667
- "allowNo": false,
4464
+ "update-existing": {
4465
+ "description": "Update existing records during pull (default: the folder config, else true)",
4466
+ "name": "update-existing",
4467
+ "allowNo": true,
4668
4468
  "type": "boolean"
4669
4469
  },
4670
- "force": {
4671
- "description": "Skip confirmation prompts",
4672
- "name": "force",
4673
- "allowNo": false,
4470
+ "create-new": {
4471
+ "description": "Create new files for records not found locally (default: the folder config, else true)",
4472
+ "name": "create-new",
4473
+ "allowNo": true,
4674
4474
  "type": "boolean"
4675
4475
  },
4676
- "verbose": {
4677
- "char": "v",
4678
- "description": "Show detailed output",
4679
- "name": "verbose",
4476
+ "backup-before-update": {
4477
+ "description": "Create backups before updating files",
4478
+ "name": "backup-before-update",
4680
4479
  "allowNo": false,
4681
4480
  "type": "boolean"
4682
- }
4683
- },
4684
- "hasDynamicHelp": false,
4685
- "hiddenAliases": [],
4686
- "id": "sync:file-reset",
4687
- "pluginAlias": "@memberjunction/cli",
4688
- "pluginName": "@memberjunction/cli",
4689
- "pluginType": "core",
4690
- "strict": true,
4691
- "enableJsonFlag": false,
4692
- "isESM": true,
4693
- "relativePath": [
4694
- "dist",
4695
- "commands",
4696
- "sync",
4697
- "file-reset.js"
4698
- ]
4699
- },
4700
- "sync:init": {
4701
- "aliases": [],
4702
- "args": {},
4703
- "description": "Initialize a directory for metadata synchronization.\n\nPrompts at a terminal; runs unattended when piped, spawned, or in CI. To script it,\npass --setup-entity (and --entity/--dir when setting up \"other\").",
4704
- "examples": [
4705
- {
4706
- "command": "<%= config.bin %> <%= command.id %> --setup-entity=no",
4707
- "description": "Initialize with no entity directory"
4708
- },
4709
- {
4710
- "command": "<%= config.bin %> <%= command.id %> --setup-entity=ai-prompts",
4711
- "description": "Initialize and set up the AI Prompts directory"
4712
- },
4713
- {
4714
- "command": "<%= config.bin %> <%= command.id %> --setup-entity=other --entity=\"MJ: AI Models\" --dir=ai-models",
4715
- "description": "Initialize for an arbitrary entity"
4716
4481
  },
4717
- {
4718
- "command": "<%= config.bin %> <%= command.id %> --no-interactive --setup-entity=no",
4719
- "description": "Never prompt, even at a terminal"
4720
- }
4721
- ],
4722
- "flags": {
4723
- "setup-entity": {
4724
- "description": "Which entity directory to set up. Use \"no\" to skip.",
4725
- "name": "setup-entity",
4482
+ "merge-strategy": {
4483
+ "description": "Merge strategy for updates (default: the folder config, else merge)",
4484
+ "name": "merge-strategy",
4726
4485
  "hasDynamicHelp": false,
4727
4486
  "multiple": false,
4728
4487
  "options": [
4729
- "ai-prompts",
4730
- "other",
4731
- "no"
4488
+ "merge",
4489
+ "overwrite",
4490
+ "skip"
4732
4491
  ],
4733
4492
  "type": "option"
4734
4493
  },
4735
- "entity": {
4736
- "description": "Entity name when --setup-entity=other (e.g. \"MJ: AI Models\").",
4737
- "name": "entity",
4494
+ "backup-directory": {
4495
+ "description": "Custom backup directory (default: .backups)",
4496
+ "name": "backup-directory",
4738
4497
  "hasDynamicHelp": false,
4739
4498
  "multiple": false,
4740
4499
  "type": "option"
4741
4500
  },
4742
- "dir": {
4743
- "description": "Directory name when --setup-entity=other. Defaults to a slug of --entity.",
4744
- "name": "dir",
4501
+ "preserve-fields": {
4502
+ "description": "Comma-separated list of fields to preserve during updates",
4503
+ "name": "preserve-fields",
4504
+ "hasDynamicHelp": false,
4505
+ "multiple": true,
4506
+ "type": "option"
4507
+ },
4508
+ "exclude-fields": {
4509
+ "description": "Comma-separated list of fields to exclude from pull",
4510
+ "name": "exclude-fields",
4511
+ "hasDynamicHelp": false,
4512
+ "multiple": true,
4513
+ "type": "option"
4514
+ },
4515
+ "target-dir": {
4516
+ "description": "Specific target directory (overrides auto-discovery)",
4517
+ "name": "target-dir",
4745
4518
  "hasDynamicHelp": false,
4746
4519
  "multiple": false,
4747
4520
  "type": "option"
4748
4521
  },
4749
- "overwrite": {
4750
- "description": "Overwrite an existing configuration. Without this, an initialized directory is left untouched.",
4751
- "name": "overwrite",
4752
- "allowNo": true,
4522
+ "incremental": {
4523
+ "description": "Only pull records updated since last successful pull",
4524
+ "name": "incremental",
4525
+ "allowNo": false,
4753
4526
  "type": "boolean"
4527
+ },
4528
+ "since": {
4529
+ "description": "Only pull records updated after this ISO 8601 timestamp",
4530
+ "name": "since",
4531
+ "hasDynamicHelp": false,
4532
+ "multiple": false,
4533
+ "type": "option"
4754
4534
  }
4755
4535
  },
4756
4536
  "hasDynamicHelp": false,
4757
4537
  "hiddenAliases": [],
4758
- "id": "sync:init",
4538
+ "id": "sync:pull",
4759
4539
  "pluginAlias": "@memberjunction/cli",
4760
4540
  "pluginName": "@memberjunction/cli",
4761
4541
  "pluginType": "core",
4762
4542
  "strict": true,
4763
4543
  "enableJsonFlag": false,
4544
+ "Examples": [
4545
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
4546
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
4547
+ "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
4548
+ ],
4549
+ "Usage": {
4550
+ "domain": "sync",
4551
+ "command": "sync:pull",
4552
+ "summary": "Pull database records into local metadata files.",
4553
+ "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
4554
+ "flags": [
4555
+ {
4556
+ "name": "--entity",
4557
+ "type": "string",
4558
+ "description": "Entity name to pull (required)"
4559
+ },
4560
+ {
4561
+ "name": "--filter",
4562
+ "type": "string",
4563
+ "description": "Extra SQL filter for which records to pull"
4564
+ },
4565
+ {
4566
+ "name": "--merge-strategy",
4567
+ "type": "merge|overwrite|skip",
4568
+ "description": "How to reconcile existing files"
4569
+ },
4570
+ {
4571
+ "name": "--dry-run",
4572
+ "type": "boolean",
4573
+ "description": "Report what would be pulled without writing"
4574
+ },
4575
+ {
4576
+ "name": "--format",
4577
+ "type": "text|json|md",
4578
+ "description": "Output format (json for machine-readable result)"
4579
+ }
4580
+ ],
4581
+ "examples": [
4582
+ "mj sync pull --entity=\"MJ: AI Prompts\"",
4583
+ "mj sync pull --entity=\"Actions\" --format=json"
4584
+ ],
4585
+ "runtime": {
4586
+ "class": "variable",
4587
+ "typicalSeconds": 15,
4588
+ "note": "scales with number of records matched for --entity"
4589
+ }
4590
+ },
4764
4591
  "isESM": true,
4765
4592
  "relativePath": [
4766
4593
  "dist",
4767
4594
  "commands",
4768
4595
  "sync",
4769
- "init.js"
4596
+ "pull.js"
4770
4597
  ]
4771
4598
  },
4772
- "sync:pull": {
4599
+ "sync:push": {
4773
4600
  "aliases": [],
4774
4601
  "args": {},
4775
- "description": "Pull metadata from database to local files",
4602
+ "description": "Push local file changes to the database",
4776
4603
  "flags": {
4777
4604
  "format": {
4778
4605
  "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced). Defaults to text on a terminal and json when stdout is piped.",
@@ -4814,224 +4641,9 @@
4814
4641
  "allowNo": true,
4815
4642
  "type": "boolean"
4816
4643
  },
4817
- "entity": {
4818
- "description": "Entity name to pull",
4819
- "name": "entity",
4820
- "required": true,
4821
- "hasDynamicHelp": false,
4822
- "multiple": false,
4823
- "type": "option"
4824
- },
4825
- "filter": {
4826
- "description": "Additional filter for pulling specific records",
4827
- "name": "filter",
4828
- "hasDynamicHelp": false,
4829
- "multiple": false,
4830
- "type": "option"
4831
- },
4832
- "dry-run": {
4833
- "description": "Show what would be pulled without actually pulling",
4834
- "name": "dry-run",
4835
- "allowNo": false,
4836
- "type": "boolean"
4837
- },
4838
- "multi-file": {
4839
- "description": "Create a single file with multiple records (provide filename)",
4840
- "name": "multi-file",
4841
- "hasDynamicHelp": false,
4842
- "multiple": false,
4843
- "type": "option"
4844
- },
4845
- "no-validate": {
4846
- "description": "Skip validation before pull",
4847
- "name": "no-validate",
4848
- "allowNo": false,
4849
- "type": "boolean"
4850
- },
4851
- "update-existing": {
4852
- "description": "Update existing records during pull",
4853
- "name": "update-existing",
4854
- "allowNo": false,
4855
- "type": "boolean"
4856
- },
4857
- "create-new": {
4858
- "description": "Create new files for records not found locally",
4859
- "name": "create-new",
4860
- "allowNo": false,
4861
- "type": "boolean"
4862
- },
4863
- "backup-before-update": {
4864
- "description": "Create backups before updating files",
4865
- "name": "backup-before-update",
4866
- "allowNo": false,
4867
- "type": "boolean"
4868
- },
4869
- "merge-strategy": {
4870
- "description": "Merge strategy for updates",
4871
- "name": "merge-strategy",
4872
- "default": "merge",
4873
- "hasDynamicHelp": false,
4874
- "multiple": false,
4875
- "options": [
4876
- "merge",
4877
- "overwrite",
4878
- "skip"
4879
- ],
4880
- "type": "option"
4881
- },
4882
- "backup-directory": {
4883
- "description": "Custom backup directory (default: .backups)",
4884
- "name": "backup-directory",
4885
- "hasDynamicHelp": false,
4886
- "multiple": false,
4887
- "type": "option"
4888
- },
4889
- "preserve-fields": {
4890
- "description": "Comma-separated list of fields to preserve during updates",
4891
- "name": "preserve-fields",
4892
- "hasDynamicHelp": false,
4893
- "multiple": true,
4894
- "type": "option"
4895
- },
4896
- "exclude-fields": {
4897
- "description": "Comma-separated list of fields to exclude from pull",
4898
- "name": "exclude-fields",
4899
- "hasDynamicHelp": false,
4900
- "multiple": true,
4901
- "type": "option"
4902
- },
4903
- "target-dir": {
4904
- "description": "Specific target directory (overrides auto-discovery)",
4905
- "name": "target-dir",
4906
- "hasDynamicHelp": false,
4907
- "multiple": false,
4908
- "type": "option"
4909
- },
4910
- "incremental": {
4911
- "description": "Only pull records updated since last successful pull",
4912
- "name": "incremental",
4913
- "allowNo": false,
4914
- "type": "boolean"
4915
- },
4916
- "since": {
4917
- "description": "Only pull records updated after this ISO 8601 timestamp",
4918
- "name": "since",
4919
- "hasDynamicHelp": false,
4920
- "multiple": false,
4921
- "type": "option"
4922
- }
4923
- },
4924
- "hasDynamicHelp": false,
4925
- "hiddenAliases": [],
4926
- "id": "sync:pull",
4927
- "pluginAlias": "@memberjunction/cli",
4928
- "pluginName": "@memberjunction/cli",
4929
- "pluginType": "core",
4930
- "strict": true,
4931
- "enableJsonFlag": false,
4932
- "Examples": [
4933
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
4934
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
4935
- "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
4936
- ],
4937
- "Usage": {
4938
- "domain": "sync",
4939
- "command": "sync:pull",
4940
- "summary": "Pull database records into local metadata files.",
4941
- "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
4942
- "flags": [
4943
- {
4944
- "name": "--entity",
4945
- "type": "string",
4946
- "description": "Entity name to pull (required)"
4947
- },
4948
- {
4949
- "name": "--filter",
4950
- "type": "string",
4951
- "description": "Extra SQL filter for which records to pull"
4952
- },
4953
- {
4954
- "name": "--merge-strategy",
4955
- "type": "merge|overwrite|skip",
4956
- "description": "How to reconcile existing files"
4957
- },
4958
- {
4959
- "name": "--dry-run",
4960
- "type": "boolean",
4961
- "description": "Report what would be pulled without writing"
4962
- },
4963
- {
4964
- "name": "--format",
4965
- "type": "text|json|md",
4966
- "description": "Output format (json for machine-readable result)"
4967
- }
4968
- ],
4969
- "examples": [
4970
- "mj sync pull --entity=\"MJ: AI Prompts\"",
4971
- "mj sync pull --entity=\"Actions\" --format=json"
4972
- ],
4973
- "runtime": {
4974
- "class": "variable",
4975
- "typicalSeconds": 15,
4976
- "note": "scales with number of records matched for --entity"
4977
- }
4978
- },
4979
- "isESM": true,
4980
- "relativePath": [
4981
- "dist",
4982
- "commands",
4983
- "sync",
4984
- "pull.js"
4985
- ]
4986
- },
4987
- "sync:push": {
4988
- "aliases": [],
4989
- "args": {},
4990
- "description": "Push local file changes to the database",
4991
- "flags": {
4992
- "format": {
4993
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced). Defaults to text on a terminal and json when stdout is piped.",
4994
- "name": "format",
4995
- "hasDynamicHelp": false,
4996
- "multiple": false,
4997
- "options": [
4998
- "text",
4999
- "json",
5000
- "md",
5001
- "human",
5002
- "console",
5003
- "markdown"
5004
- ],
5005
- "type": "option"
5006
- },
5007
- "verbose": {
5008
- "char": "v",
5009
- "description": "Show detailed output",
5010
- "name": "verbose",
5011
- "allowNo": false,
5012
- "type": "boolean"
5013
- },
5014
- "no-banner": {
5015
- "description": "Suppress the startup banner and runtime advisory",
5016
- "name": "no-banner",
5017
- "allowNo": false,
5018
- "type": "boolean"
5019
- },
5020
- "no-app-packages": {
5021
- "description": "Do not load installed Open App server packages (or the host's generated packages) for this run, so records are written with the generic BaseEntity — no custom Save() logic or lifecycle hooks.",
5022
- "name": "no-app-packages",
5023
- "allowNo": false,
5024
- "type": "boolean"
5025
- },
5026
- "interactive": {
5027
- "description": "Allow interactive prompts. Defaults to on at a terminal and off when piped, spawned, or in CI, so an agent never hangs on a question. Use --no-interactive to force it off.",
5028
- "name": "interactive",
5029
- "allowNo": true,
5030
- "type": "boolean"
5031
- },
5032
- "dir": {
5033
- "description": "Specific entity directory to push",
5034
- "name": "dir",
4644
+ "dir": {
4645
+ "description": "Specific entity directory to push",
4646
+ "name": "dir",
5035
4647
  "hasDynamicHelp": false,
5036
4648
  "multiple": false,
5037
4649
  "type": "option"
@@ -5389,110 +5001,92 @@
5389
5001
  "watch.js"
5390
5002
  ]
5391
5003
  },
5392
- "test:compare": {
5004
+ "translate-sql": {
5393
5005
  "aliases": [],
5394
- "args": {
5395
- "runId1": {
5396
- "description": "First test run ID to compare",
5397
- "name": "runId1",
5398
- "required": false
5399
- },
5400
- "runId2": {
5401
- "description": "Second test run ID to compare",
5402
- "name": "runId2",
5403
- "required": false
5404
- }
5405
- },
5406
- "description": "Compare test runs for regression detection",
5006
+ "args": {},
5007
+ "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
5407
5008
  "examples": [
5408
- "<%= config.bin %> <%= command.id %>",
5409
- "<%= config.bin %> <%= command.id %> --latest",
5410
- "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
5411
- "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
5412
- "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
5413
- "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
5414
- "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
5009
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --dry-run",
5010
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope queries",
5011
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --sql \"SELECT TOP 10 [Name] FROM [Users]\"",
5012
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope all --output ./reports"
5415
5013
  ],
5416
5014
  "flags": {
5417
- "version": {
5418
- "char": "v",
5419
- "description": "Compare runs by version",
5420
- "name": "version",
5015
+ "from": {
5016
+ "description": "Source SQL dialect",
5017
+ "name": "from",
5018
+ "required": true,
5421
5019
  "hasDynamicHelp": false,
5422
- "multiple": true,
5020
+ "multiple": false,
5021
+ "options": [
5022
+ "sqlserver",
5023
+ "postgresql"
5024
+ ],
5423
5025
  "type": "option"
5424
5026
  },
5425
- "commit": {
5426
- "char": "c",
5427
- "description": "Compare runs by git commit",
5428
- "name": "commit",
5429
- "hasDynamicHelp": false,
5430
- "multiple": true,
5431
- "type": "option"
5432
- },
5433
- "diff-only": {
5434
- "description": "Show only differences",
5435
- "name": "diff-only",
5436
- "allowNo": false,
5437
- "type": "boolean"
5438
- },
5439
- "latest": {
5440
- "char": "l",
5441
- "description": "Compare the two most recent completed suite runs",
5442
- "name": "latest",
5443
- "allowNo": false,
5444
- "type": "boolean"
5445
- },
5446
- "from-json": {
5447
- "description": "Compare two results.json files directly (no DB). Pass twice: --from-json PREV --from-json CURR",
5448
- "name": "from-json",
5027
+ "to": {
5028
+ "description": "Target SQL dialect",
5029
+ "name": "to",
5030
+ "required": true,
5449
5031
  "hasDynamicHelp": false,
5450
- "multiple": true,
5032
+ "multiple": false,
5033
+ "options": [
5034
+ "sqlserver",
5035
+ "postgresql"
5036
+ ],
5451
5037
  "type": "option"
5452
5038
  },
5453
- "format": {
5454
- "char": "f",
5455
- "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
5456
- "name": "format",
5039
+ "scope": {
5040
+ "description": "What to scan for translation",
5041
+ "name": "scope",
5042
+ "default": "all",
5457
5043
  "hasDynamicHelp": false,
5458
5044
  "multiple": false,
5459
5045
  "options": [
5460
- "text",
5461
- "json",
5462
- "md",
5463
- "human",
5464
- "console",
5465
- "markdown",
5466
- "compact",
5467
- "table"
5046
+ "queries",
5047
+ "views",
5048
+ "filters",
5049
+ "all"
5468
5050
  ],
5469
5051
  "type": "option"
5470
5052
  },
5471
- "output": {
5472
- "char": "o",
5473
- "description": "Output file path",
5474
- "name": "output",
5053
+ "sql": {
5054
+ "description": "Translate a single SQL fragment (inline mode)",
5055
+ "name": "sql",
5475
5056
  "hasDynamicHelp": false,
5476
5057
  "multiple": false,
5477
5058
  "type": "option"
5478
5059
  },
5479
- "verbose": {
5480
- "description": "Show detailed information",
5481
- "name": "verbose",
5060
+ "dry-run": {
5061
+ "description": "Show what would be translated without making changes",
5062
+ "name": "dry-run",
5482
5063
  "allowNo": false,
5483
5064
  "type": "boolean"
5484
5065
  },
5485
- "tag": {
5486
- "description": "Filter suite runs by tag (matches against MJTestSuiteRunEntity.Tags). Useful for isolating runs from a specific source environment in an archive MJ. DB mode only — --from-json ignores this flag.",
5487
- "name": "tag",
5066
+ "review": {
5067
+ "description": "Generate review report only (no writes to database)",
5068
+ "name": "review",
5069
+ "allowNo": false,
5070
+ "type": "boolean"
5071
+ },
5072
+ "output": {
5073
+ "char": "o",
5074
+ "description": "Output directory for the translation report",
5075
+ "name": "output",
5488
5076
  "hasDynamicHelp": false,
5489
5077
  "multiple": false,
5490
5078
  "type": "option"
5079
+ },
5080
+ "force": {
5081
+ "description": "Re-translate even if platform variants already exist",
5082
+ "name": "force",
5083
+ "allowNo": false,
5084
+ "type": "boolean"
5491
5085
  }
5492
5086
  },
5493
5087
  "hasDynamicHelp": false,
5494
5088
  "hiddenAliases": [],
5495
- "id": "test:compare",
5089
+ "id": "translate-sql",
5496
5090
  "pluginAlias": "@memberjunction/cli",
5497
5091
  "pluginName": "@memberjunction/cli",
5498
5092
  "pluginType": "core",
@@ -5502,119 +5096,31 @@
5502
5096
  "relativePath": [
5503
5097
  "dist",
5504
5098
  "commands",
5505
- "test",
5506
- "compare.js"
5099
+ "translate-sql",
5100
+ "index.js"
5507
5101
  ]
5508
5102
  },
5509
- "test:history": {
5103
+ "translate-sql:usage": {
5510
5104
  "aliases": [],
5511
5105
  "args": {},
5512
- "description": "View test execution history",
5513
- "examples": [
5514
- "<%= config.bin %> <%= command.id %>",
5515
- "<%= config.bin %> <%= command.id %> --test=<test-id>",
5516
- "<%= config.bin %> <%= command.id %> --suite=<suite-id>",
5517
- "<%= config.bin %> <%= command.id %> --since=\"2024-01-01\"",
5518
- "<%= config.bin %> <%= command.id %> --limit=50"
5519
- ],
5106
+ "description": "Show usage, flags, examples, and runtime hints for every `mj translate-sql` command.",
5520
5107
  "flags": {
5521
- "test": {
5522
- "char": "t",
5523
- "description": "Filter by test ID",
5524
- "name": "test",
5525
- "hasDynamicHelp": false,
5526
- "multiple": false,
5527
- "type": "option"
5528
- },
5529
- "recent": {
5530
- "char": "r",
5531
- "description": "Number of recent runs to show",
5532
- "name": "recent",
5533
- "hasDynamicHelp": false,
5534
- "multiple": false,
5535
- "type": "option"
5536
- },
5537
- "from": {
5538
- "description": "Show history from date (YYYY-MM-DD)",
5539
- "name": "from",
5540
- "hasDynamicHelp": false,
5541
- "multiple": false,
5542
- "type": "option"
5543
- },
5544
- "status": {
5545
- "char": "s",
5546
- "description": "Filter by status",
5547
- "name": "status",
5548
- "hasDynamicHelp": false,
5549
- "multiple": false,
5550
- "type": "option"
5551
- },
5552
5108
  "format": {
5553
- "char": "f",
5554
- "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
5109
+ "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
5555
5110
  "name": "format",
5556
5111
  "hasDynamicHelp": false,
5557
5112
  "multiple": false,
5558
5113
  "options": [
5559
5114
  "text",
5560
5115
  "json",
5561
- "md",
5562
- "human",
5563
- "console",
5564
- "markdown",
5565
- "compact",
5566
- "table"
5116
+ "md"
5567
5117
  ],
5568
5118
  "type": "option"
5569
- },
5570
- "output": {
5571
- "char": "o",
5572
- "description": "Output file path",
5573
- "name": "output",
5574
- "hasDynamicHelp": false,
5575
- "multiple": false,
5576
- "type": "option"
5577
- },
5578
- "verbose": {
5579
- "char": "v",
5580
- "description": "Show detailed information",
5581
- "name": "verbose",
5582
- "allowNo": false,
5583
- "type": "boolean"
5584
5119
  }
5585
5120
  },
5586
5121
  "hasDynamicHelp": false,
5587
5122
  "hiddenAliases": [],
5588
- "id": "test:history",
5589
- "pluginAlias": "@memberjunction/cli",
5590
- "pluginName": "@memberjunction/cli",
5591
- "pluginType": "core",
5592
- "strict": true,
5593
- "enableJsonFlag": false,
5594
- "isESM": true,
5595
- "relativePath": [
5596
- "dist",
5597
- "commands",
5598
- "test",
5599
- "history.js"
5600
- ]
5601
- },
5602
- "test": {
5603
- "aliases": [],
5604
- "args": {},
5605
- "description": "MemberJunction Testing Framework - Execute and manage tests",
5606
- "examples": [
5607
- "<%= config.bin %> <%= command.id %> run <test-id>",
5608
- "<%= config.bin %> <%= command.id %> run --name=\"Active Members Count\"",
5609
- "<%= config.bin %> <%= command.id %> suite <suite-id>",
5610
- "<%= config.bin %> <%= command.id %> list",
5611
- "<%= config.bin %> <%= command.id %> list --suites",
5612
- "<%= config.bin %> <%= command.id %> validate --all"
5613
- ],
5614
- "flags": {},
5615
- "hasDynamicHelp": false,
5616
- "hiddenAliases": [],
5617
- "id": "test",
5123
+ "id": "translate-sql:usage",
5618
5124
  "pluginAlias": "@memberjunction/cli",
5619
5125
  "pluginName": "@memberjunction/cli",
5620
5126
  "pluginType": "core",
@@ -5624,87 +5130,127 @@
5624
5130
  "relativePath": [
5625
5131
  "dist",
5626
5132
  "commands",
5627
- "test",
5628
- "index.js"
5133
+ "translate-sql",
5134
+ "usage.js"
5629
5135
  ]
5630
5136
  },
5631
- "test:list": {
5137
+ "update:claude": {
5632
5138
  "aliases": [],
5633
5139
  "args": {},
5634
- "description": "List available tests, suites, and types",
5140
+ "description": "Update the Claude Code pack in the current directory.",
5635
5141
  "examples": [
5636
- "<%= config.bin %> <%= command.id %>",
5637
- "<%= config.bin %> <%= command.id %> --suites",
5638
- "<%= config.bin %> <%= command.id %> --types",
5639
- "<%= config.bin %> <%= command.id %> --type=agent-eval",
5640
- "<%= config.bin %> <%= command.id %> --tag=smoke",
5641
- "<%= config.bin %> <%= command.id %> --status=active --verbose"
5142
+ "<%= config.bin %> update:claude",
5143
+ "<%= config.bin %> update:claude --check",
5144
+ "<%= config.bin %> update:claude --refresh-commands",
5145
+ "<%= config.bin %> update:claude --allow-major",
5146
+ "<%= config.bin %> update:claude --json"
5642
5147
  ],
5643
5148
  "flags": {
5644
- "suites": {
5645
- "description": "List test suites instead of tests",
5646
- "name": "suites",
5647
- "allowNo": false,
5648
- "type": "boolean"
5649
- },
5650
- "types": {
5651
- "description": "List test types",
5652
- "name": "types",
5653
- "allowNo": false,
5654
- "type": "boolean"
5655
- },
5656
- "type": {
5657
- "char": "t",
5658
- "description": "Filter by test type",
5659
- "name": "type",
5149
+ "dir": {
5150
+ "description": "Target directory",
5151
+ "name": "dir",
5152
+ "default": ".",
5660
5153
  "hasDynamicHelp": false,
5661
5154
  "multiple": false,
5662
5155
  "type": "option"
5663
5156
  },
5664
- "tag": {
5665
- "description": "Filter by tag",
5666
- "name": "tag",
5157
+ "major": {
5158
+ "description": "Force a specific MJ major (default: detected from package.json)",
5159
+ "name": "major",
5667
5160
  "hasDynamicHelp": false,
5668
5161
  "multiple": false,
5669
5162
  "type": "option"
5670
5163
  },
5671
- "status": {
5672
- "char": "s",
5673
- "description": "Filter by status",
5674
- "name": "status",
5164
+ "ref": {
5165
+ "description": "Git ref to fetch from (branch or tag). Default: main.",
5166
+ "name": "ref",
5675
5167
  "hasDynamicHelp": false,
5676
5168
  "multiple": false,
5677
5169
  "type": "option"
5678
5170
  },
5679
- "format": {
5680
- "char": "f",
5681
- "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
5682
- "name": "format",
5171
+ "from": {
5172
+ "description": "Use a local pack source instead of fetching from GitHub",
5173
+ "name": "from",
5683
5174
  "hasDynamicHelp": false,
5684
5175
  "multiple": false,
5685
- "options": [
5686
- "text",
5687
- "json",
5688
- "md",
5689
- "human",
5690
- "console",
5691
- "markdown",
5692
- "compact",
5693
- "table"
5694
- ],
5695
5176
  "type": "option"
5696
5177
  },
5697
- "output": {
5698
- "char": "o",
5699
- "description": "Output file path",
5700
- "name": "output",
5701
- "hasDynamicHelp": false,
5702
- "multiple": false,
5703
- "type": "option"
5178
+ "offline": {
5179
+ "description": "Forbid network; requires --from <path>",
5180
+ "name": "offline",
5181
+ "allowNo": false,
5182
+ "type": "boolean"
5183
+ },
5184
+ "dry-run": {
5185
+ "description": "Print what would be written; change nothing",
5186
+ "name": "dry-run",
5187
+ "allowNo": false,
5188
+ "type": "boolean"
5189
+ },
5190
+ "yes": {
5191
+ "char": "y",
5192
+ "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
5193
+ "name": "yes",
5194
+ "allowNo": false,
5195
+ "type": "boolean"
5196
+ },
5197
+ "force": {
5198
+ "description": "Overwrite user-customized commands/skills (saves .bak files)",
5199
+ "name": "force",
5200
+ "allowNo": false,
5201
+ "type": "boolean"
5202
+ },
5203
+ "skip-commands": {
5204
+ "description": "Skip seeding .claude/commands/",
5205
+ "name": "skip-commands",
5206
+ "allowNo": false,
5207
+ "type": "boolean"
5208
+ },
5209
+ "skip-skills": {
5210
+ "description": "Skip seeding .claude/skills/",
5211
+ "name": "skip-skills",
5212
+ "allowNo": false,
5213
+ "type": "boolean"
5214
+ },
5215
+ "skip-settings": {
5216
+ "description": "Skip merging .claude/settings.json",
5217
+ "name": "skip-settings",
5218
+ "allowNo": false,
5219
+ "type": "boolean"
5220
+ },
5221
+ "check": {
5222
+ "description": "Compare local pack version to remote without writing anything",
5223
+ "name": "check",
5224
+ "allowNo": false,
5225
+ "type": "boolean"
5226
+ },
5227
+ "refresh-commands": {
5228
+ "description": "Force-resync .claude/commands/* from the pack (saves .bak files)",
5229
+ "name": "refresh-commands",
5230
+ "allowNo": false,
5231
+ "type": "boolean"
5232
+ },
5233
+ "refresh-skills": {
5234
+ "description": "Force-resync .claude/skills/** from the pack (saves .bak files)",
5235
+ "name": "refresh-skills",
5236
+ "allowNo": false,
5237
+ "type": "boolean"
5238
+ },
5239
+ "allow-major": {
5240
+ "description": "Allow the remote pack's major to differ from local MJ's major",
5241
+ "name": "allow-major",
5242
+ "allowNo": false,
5243
+ "type": "boolean"
5244
+ },
5245
+ "json": {
5246
+ "description": "Output as JSON (matches plan §7.5 schema)",
5247
+ "name": "json",
5248
+ "allowNo": false,
5249
+ "type": "boolean"
5704
5250
  },
5705
5251
  "verbose": {
5706
5252
  "char": "v",
5707
- "description": "Show detailed information",
5253
+ "description": "Show progress messages",
5708
5254
  "name": "verbose",
5709
5255
  "allowNo": false,
5710
5256
  "type": "boolean"
@@ -5712,38 +5258,7 @@
5712
5258
  },
5713
5259
  "hasDynamicHelp": false,
5714
5260
  "hiddenAliases": [],
5715
- "id": "test:list",
5716
- "pluginAlias": "@memberjunction/cli",
5717
- "pluginName": "@memberjunction/cli",
5718
- "pluginType": "core",
5719
- "strict": true,
5720
- "enableJsonFlag": false,
5721
- "isESM": true,
5722
- "relativePath": [
5723
- "dist",
5724
- "commands",
5725
- "test",
5726
- "list.js"
5727
- ]
5728
- },
5729
- "test:promote-criteria": {
5730
- "aliases": [],
5731
- "args": {
5732
- "test": {
5733
- "description": "Test name or ID",
5734
- "name": "test",
5735
- "required": true
5736
- }
5737
- },
5738
- "description": "Copy a test's inline judge criteria into a Draft rubric and set Test.RubricID. Does not publish.",
5739
- "examples": [
5740
- "<%= config.bin %> <%= command.id %> <test-id>",
5741
- "<%= config.bin %> <%= command.id %> \"Reply check\""
5742
- ],
5743
- "flags": {},
5744
- "hasDynamicHelp": false,
5745
- "hiddenAliases": [],
5746
- "id": "test:promote-criteria",
5261
+ "id": "update:claude",
5747
5262
  "pluginAlias": "@memberjunction/cli",
5748
5263
  "pluginName": "@memberjunction/cli",
5749
5264
  "pluginType": "core",
@@ -5753,24 +5268,31 @@
5753
5268
  "relativePath": [
5754
5269
  "dist",
5755
5270
  "commands",
5756
- "test",
5757
- "promote-criteria.js"
5271
+ "update",
5272
+ "claude.js"
5758
5273
  ]
5759
5274
  },
5760
- "test:report": {
5275
+ "update:usage": {
5761
5276
  "aliases": [],
5762
- "args": {
5763
- "runId": {
5764
- "description": "Test run ID",
5765
- "name": "runId",
5766
- "required": true
5277
+ "args": {},
5278
+ "description": "Show usage, flags, examples, and runtime hints for every `mj update` command.",
5279
+ "flags": {
5280
+ "format": {
5281
+ "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
5282
+ "name": "format",
5283
+ "hasDynamicHelp": false,
5284
+ "multiple": false,
5285
+ "options": [
5286
+ "text",
5287
+ "json",
5288
+ "md"
5289
+ ],
5290
+ "type": "option"
5767
5291
  }
5768
5292
  },
5769
- "description": "Print the per-criterion rubric breakdown for a test run.",
5770
- "flags": {},
5771
5293
  "hasDynamicHelp": false,
5772
5294
  "hiddenAliases": [],
5773
- "id": "test:report",
5295
+ "id": "update:usage",
5774
5296
  "pluginAlias": "@memberjunction/cli",
5775
5297
  "pluginName": "@memberjunction/cli",
5776
5298
  "pluginType": "core",
@@ -5780,42 +5302,69 @@
5780
5302
  "relativePath": [
5781
5303
  "dist",
5782
5304
  "commands",
5783
- "test",
5784
- "report.js"
5305
+ "update",
5306
+ "usage.js"
5785
5307
  ]
5786
5308
  },
5787
- "test:run": {
5309
+ "test:compare": {
5788
5310
  "aliases": [],
5789
5311
  "args": {
5790
- "testId": {
5791
- "description": "Test ID to execute",
5792
- "name": "testId",
5312
+ "runId1": {
5313
+ "description": "First test run ID to compare",
5314
+ "name": "runId1",
5315
+ "required": false
5316
+ },
5317
+ "runId2": {
5318
+ "description": "Second test run ID to compare",
5319
+ "name": "runId2",
5793
5320
  "required": false
5794
5321
  }
5795
5322
  },
5796
- "description": "Execute a single test by ID or name",
5323
+ "description": "Compare test runs for regression detection",
5797
5324
  "examples": [
5798
- "<%= config.bin %> <%= command.id %> <test-id>",
5799
- "<%= config.bin %> <%= command.id %> --name=\"Active Members Count\"",
5800
- "<%= config.bin %> <%= command.id %> <test-id> --environment=staging",
5801
- "<%= config.bin %> <%= command.id %> <test-id> --format=json --output=results.json",
5802
- "<%= config.bin %> <%= command.id %> <test-id> --dry-run"
5325
+ "<%= config.bin %> <%= command.id %>",
5326
+ "<%= config.bin %> <%= command.id %> --latest",
5327
+ "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
5328
+ "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
5329
+ "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
5330
+ "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
5331
+ "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
5803
5332
  ],
5804
5333
  "flags": {
5805
- "name": {
5806
- "char": "n",
5807
- "description": "Test name to execute",
5808
- "name": "name",
5334
+ "version": {
5335
+ "char": "v",
5336
+ "description": "Compare runs by version",
5337
+ "name": "version",
5809
5338
  "hasDynamicHelp": false,
5810
- "multiple": false,
5339
+ "multiple": true,
5811
5340
  "type": "option"
5812
5341
  },
5813
- "environment": {
5814
- "char": "e",
5815
- "description": "Environment context (dev, staging, prod)",
5816
- "name": "environment",
5342
+ "commit": {
5343
+ "char": "c",
5344
+ "description": "Compare runs by git commit",
5345
+ "name": "commit",
5817
5346
  "hasDynamicHelp": false,
5818
- "multiple": false,
5347
+ "multiple": true,
5348
+ "type": "option"
5349
+ },
5350
+ "diff-only": {
5351
+ "description": "Show only differences",
5352
+ "name": "diff-only",
5353
+ "allowNo": false,
5354
+ "type": "boolean"
5355
+ },
5356
+ "latest": {
5357
+ "char": "l",
5358
+ "description": "Compare the two most recent completed suite runs",
5359
+ "name": "latest",
5360
+ "allowNo": false,
5361
+ "type": "boolean"
5362
+ },
5363
+ "from-json": {
5364
+ "description": "Compare two results.json files directly (no DB). Pass twice: --from-json PREV --from-json CURR",
5365
+ "name": "from-json",
5366
+ "hasDynamicHelp": false,
5367
+ "multiple": true,
5819
5368
  "type": "option"
5820
5369
  },
5821
5370
  "format": {
@@ -5844,36 +5393,15 @@
5844
5393
  "multiple": false,
5845
5394
  "type": "option"
5846
5395
  },
5847
- "dry-run": {
5848
- "description": "Validate without executing",
5849
- "name": "dry-run",
5850
- "allowNo": false,
5851
- "type": "boolean"
5852
- },
5853
5396
  "verbose": {
5854
- "char": "v",
5855
- "description": "Show detailed execution information",
5397
+ "description": "Show detailed information",
5856
5398
  "name": "verbose",
5857
5399
  "allowNo": false,
5858
5400
  "type": "boolean"
5859
5401
  },
5860
- "checks-module": {
5861
- "description": "Module specifier (package name or path) side-effect-imported before the run so its integration check bundles register on the IntegrationCheckRegistry. Durable form: mj.config.cjs `testing.checkModules` (this repo loads '@memberjunction/integration-test-suite' that way).",
5862
- "name": "checks-module",
5863
- "hasDynamicHelp": false,
5864
- "multiple": false,
5865
- "type": "option"
5866
- },
5867
- "rubric": {
5868
- "description": "Rubric override: name or id, optionally @version (1.2.0 or a version id)",
5869
- "name": "rubric",
5870
- "hasDynamicHelp": false,
5871
- "multiple": false,
5872
- "type": "option"
5873
- },
5874
- "oracles-module": {
5875
- "description": "Path to a JS/TS module that exports custom IOracle classes or instances. Each export is registered on the engine before the test runs — used by non-MJ adopters to plug app-specific oracle types without modifying TestingFramework.",
5876
- "name": "oracles-module",
5402
+ "tag": {
5403
+ "description": "Filter suite runs by tag (matches against MJTestSuiteRunEntity.Tags). Useful for isolating runs from a specific source environment in an archive MJ. DB mode only — --from-json ignores this flag.",
5404
+ "name": "tag",
5877
5405
  "hasDynamicHelp": false,
5878
5406
  "multiple": false,
5879
5407
  "type": "option"
@@ -5881,7 +5409,7 @@
5881
5409
  },
5882
5410
  "hasDynamicHelp": false,
5883
5411
  "hiddenAliases": [],
5884
- "id": "test:run",
5412
+ "id": "test:compare",
5885
5413
  "pluginAlias": "@memberjunction/cli",
5886
5414
  "pluginName": "@memberjunction/cli",
5887
5415
  "pluginType": "core",
@@ -5892,91 +5420,48 @@
5892
5420
  "dist",
5893
5421
  "commands",
5894
5422
  "test",
5895
- "run.js"
5423
+ "compare.js"
5896
5424
  ]
5897
5425
  },
5898
- "test:scripts": {
5426
+ "test:history": {
5899
5427
  "aliases": [],
5900
5428
  "args": {},
5901
- "description": "Review and promote recorded replay scripts. A run that re-derives a test which already had a script stores the new one as pending rather than replacing what replay uses, so a UI change never rewrites the suite unnoticed. This is where you see the drift and decide.",
5429
+ "description": "View test execution history",
5902
5430
  "examples": [
5903
5431
  "<%= config.bin %> <%= command.id %>",
5904
- "<%= config.bin %> <%= command.id %> --test \"T042 - Filter Grid\"",
5905
- "<%= config.bin %> <%= command.id %> --promote --test \"T042 - Filter Grid\"",
5906
- "<%= config.bin %> <%= command.id %> --promote --yes",
5907
- "<%= config.bin %> <%= command.id %> --discard --test \"T042 - Filter Grid\""
5432
+ "<%= config.bin %> <%= command.id %> --test=<test-id>",
5433
+ "<%= config.bin %> <%= command.id %> --suite=<suite-id>",
5434
+ "<%= config.bin %> <%= command.id %> --since=\"2024-01-01\"",
5435
+ "<%= config.bin %> <%= command.id %> --limit=50"
5908
5436
  ],
5909
5437
  "flags": {
5910
5438
  "test": {
5911
- "description": "Limit to one test, by name or ID",
5439
+ "char": "t",
5440
+ "description": "Filter by test ID",
5912
5441
  "name": "test",
5913
5442
  "hasDynamicHelp": false,
5914
5443
  "multiple": false,
5915
5444
  "type": "option"
5916
5445
  },
5917
- "promote": {
5918
- "description": "Promote the pending script(s) into the slot replay uses",
5919
- "exclusive": [
5920
- "discard"
5921
- ],
5922
- "name": "promote",
5923
- "allowNo": false,
5924
- "type": "boolean"
5446
+ "recent": {
5447
+ "char": "r",
5448
+ "description": "Number of recent runs to show",
5449
+ "name": "recent",
5450
+ "hasDynamicHelp": false,
5451
+ "multiple": false,
5452
+ "type": "option"
5925
5453
  },
5926
- "discard": {
5927
- "description": "Drop the pending script(s), keeping the promoted one",
5928
- "exclusive": [
5929
- "promote"
5930
- ],
5931
- "name": "discard",
5932
- "allowNo": false,
5933
- "type": "boolean"
5454
+ "from": {
5455
+ "description": "Show history from date (YYYY-MM-DD)",
5456
+ "name": "from",
5457
+ "hasDynamicHelp": false,
5458
+ "multiple": false,
5459
+ "type": "option"
5934
5460
  },
5935
- "yes": {
5936
- "char": "y",
5937
- "description": "Confirm a bulk --promote/--discard that was not narrowed with --test",
5938
- "name": "yes",
5939
- "allowNo": false,
5940
- "type": "boolean"
5941
- }
5942
- },
5943
- "hasDynamicHelp": false,
5944
- "hiddenAliases": [],
5945
- "id": "test:scripts",
5946
- "pluginAlias": "@memberjunction/cli",
5947
- "pluginName": "@memberjunction/cli",
5948
- "pluginType": "core",
5949
- "strict": true,
5950
- "enableJsonFlag": false,
5951
- "isESM": true,
5952
- "relativePath": [
5953
- "dist",
5954
- "commands",
5955
- "test",
5956
- "scripts.js"
5957
- ]
5958
- },
5959
- "test:suite": {
5960
- "aliases": [],
5961
- "args": {
5962
- "suiteId": {
5963
- "description": "Test suite ID to execute",
5964
- "name": "suiteId",
5965
- "required": false
5966
- }
5967
- },
5968
- "description": "Execute a test suite",
5969
- "examples": [
5970
- "<%= config.bin %> <%= command.id %> <suite-id>",
5971
- "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
5972
- "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
5973
- "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
5974
- ],
5975
- "flags": {
5976
- "name": {
5977
- "char": "n",
5978
- "description": "Test suite name to execute",
5979
- "name": "name",
5461
+ "status": {
5462
+ "char": "s",
5463
+ "description": "Filter by status",
5464
+ "name": "status",
5980
5465
  "hasDynamicHelp": false,
5981
5466
  "multiple": false,
5982
5467
  "type": "option"
@@ -6009,67 +5494,15 @@
6009
5494
  },
6010
5495
  "verbose": {
6011
5496
  "char": "v",
6012
- "description": "Show detailed execution information",
5497
+ "description": "Show detailed information",
6013
5498
  "name": "verbose",
6014
5499
  "allowNo": false,
6015
5500
  "type": "boolean"
6016
- },
6017
- "delay": {
6018
- "char": "d",
6019
- "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
6020
- "name": "delay",
6021
- "default": 0,
6022
- "hasDynamicHelp": false,
6023
- "multiple": false,
6024
- "type": "option"
6025
- },
6026
- "parallel": {
6027
- "char": "p",
6028
- "description": "Run tests in parallel with shared browser sessions",
6029
- "name": "parallel",
6030
- "allowNo": false,
6031
- "type": "boolean"
6032
- },
6033
- "max-parallel": {
6034
- "description": "Maximum number of parallel workers (default 4)",
6035
- "name": "max-parallel",
6036
- "default": 4,
6037
- "hasDynamicHelp": false,
6038
- "multiple": false,
6039
- "type": "option"
6040
- },
6041
- "rubric": {
6042
- "description": "Rubric override for every test: name or id, optionally @version",
6043
- "name": "rubric",
6044
- "hasDynamicHelp": false,
6045
- "multiple": false,
6046
- "type": "option"
6047
- },
6048
- "flaky-check": {
6049
- "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
6050
- "name": "flaky-check",
6051
- "hasDynamicHelp": false,
6052
- "multiple": false,
6053
- "type": "option"
6054
- },
6055
- "checks-module": {
6056
- "description": "Module specifier (package name or path) side-effect-imported before the run so its integration check bundles register on the IntegrationCheckRegistry. Durable form: mj.config.cjs `testing.checkModules` (this repo loads '@memberjunction/integration-test-suite' that way).",
6057
- "name": "checks-module",
6058
- "hasDynamicHelp": false,
6059
- "multiple": false,
6060
- "type": "option"
6061
- },
6062
- "oracles-module": {
6063
- "description": "Path to a JS/TS module that exports custom IOracle classes or instances. Each export is registered on the engine before the suite runs — used by non-MJ adopters to plug app-specific oracle types without modifying TestingFramework.",
6064
- "name": "oracles-module",
6065
- "hasDynamicHelp": false,
6066
- "multiple": false,
6067
- "type": "option"
6068
5501
  }
6069
5502
  },
6070
5503
  "hasDynamicHelp": false,
6071
5504
  "hiddenAliases": [],
6072
- "id": "test:suite",
5505
+ "id": "test:history",
6073
5506
  "pluginAlias": "@memberjunction/cli",
6074
5507
  "pluginName": "@memberjunction/cli",
6075
5508
  "pluginType": "core",
@@ -6080,30 +5513,25 @@
6080
5513
  "dist",
6081
5514
  "commands",
6082
5515
  "test",
6083
- "suite.js"
5516
+ "history.js"
6084
5517
  ]
6085
5518
  },
6086
- "test:usage": {
5519
+ "test": {
6087
5520
  "aliases": [],
6088
5521
  "args": {},
6089
- "description": "Show usage, flags, examples, and runtime hints for every `mj test` command.",
6090
- "flags": {
6091
- "format": {
6092
- "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
6093
- "name": "format",
6094
- "hasDynamicHelp": false,
6095
- "multiple": false,
6096
- "options": [
6097
- "text",
6098
- "json",
6099
- "md"
6100
- ],
6101
- "type": "option"
6102
- }
6103
- },
5522
+ "description": "MemberJunction Testing Framework - Execute and manage tests",
5523
+ "examples": [
5524
+ "<%= config.bin %> <%= command.id %> run <test-id>",
5525
+ "<%= config.bin %> <%= command.id %> run --name=\"Active Members Count\"",
5526
+ "<%= config.bin %> <%= command.id %> suite <suite-id>",
5527
+ "<%= config.bin %> <%= command.id %> list",
5528
+ "<%= config.bin %> <%= command.id %> list --suites",
5529
+ "<%= config.bin %> <%= command.id %> validate --all"
5530
+ ],
5531
+ "flags": {},
6104
5532
  "hasDynamicHelp": false,
6105
5533
  "hiddenAliases": [],
6106
- "id": "test:usage",
5534
+ "id": "test",
6107
5535
  "pluginAlias": "@memberjunction/cli",
6108
5536
  "pluginName": "@memberjunction/cli",
6109
5537
  "pluginType": "core",
@@ -6114,47 +5542,56 @@
6114
5542
  "dist",
6115
5543
  "commands",
6116
5544
  "test",
6117
- "usage.js"
5545
+ "index.js"
6118
5546
  ]
6119
5547
  },
6120
- "test:validate": {
5548
+ "test:list": {
6121
5549
  "aliases": [],
6122
- "args": {
6123
- "testId": {
6124
- "description": "Test ID to validate",
6125
- "name": "testId",
6126
- "required": false
6127
- }
6128
- },
6129
- "description": "Validate test definitions without executing",
5550
+ "args": {},
5551
+ "description": "List available tests, suites, and types",
6130
5552
  "examples": [
6131
- "<%= config.bin %> <%= command.id %> <test-id>",
6132
- "<%= config.bin %> <%= command.id %> --all",
5553
+ "<%= config.bin %> <%= command.id %>",
5554
+ "<%= config.bin %> <%= command.id %> --suites",
5555
+ "<%= config.bin %> <%= command.id %> --types",
6133
5556
  "<%= config.bin %> <%= command.id %> --type=agent-eval",
6134
- "<%= config.bin %> <%= command.id %> --all --save-report",
6135
- "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
5557
+ "<%= config.bin %> <%= command.id %> --tag=smoke",
5558
+ "<%= config.bin %> <%= command.id %> --status=active --verbose"
6136
5559
  ],
6137
5560
  "flags": {
6138
- "all": {
6139
- "char": "a",
6140
- "description": "Validate all tests",
6141
- "name": "all",
5561
+ "suites": {
5562
+ "description": "List test suites instead of tests",
5563
+ "name": "suites",
5564
+ "allowNo": false,
5565
+ "type": "boolean"
5566
+ },
5567
+ "types": {
5568
+ "description": "List test types",
5569
+ "name": "types",
6142
5570
  "allowNo": false,
6143
5571
  "type": "boolean"
6144
5572
  },
6145
5573
  "type": {
6146
5574
  "char": "t",
6147
- "description": "Validate tests by type",
5575
+ "description": "Filter by test type",
6148
5576
  "name": "type",
6149
5577
  "hasDynamicHelp": false,
6150
5578
  "multiple": false,
6151
5579
  "type": "option"
6152
5580
  },
6153
- "save-report": {
6154
- "description": "Save validation report to file",
6155
- "name": "save-report",
6156
- "allowNo": false,
6157
- "type": "boolean"
5581
+ "tag": {
5582
+ "description": "Filter by tag",
5583
+ "name": "tag",
5584
+ "hasDynamicHelp": false,
5585
+ "multiple": false,
5586
+ "type": "option"
5587
+ },
5588
+ "status": {
5589
+ "char": "s",
5590
+ "description": "Filter by status",
5591
+ "name": "status",
5592
+ "hasDynamicHelp": false,
5593
+ "multiple": false,
5594
+ "type": "option"
6158
5595
  },
6159
5596
  "format": {
6160
5597
  "char": "f",
@@ -6192,7 +5629,7 @@
6192
5629
  },
6193
5630
  "hasDynamicHelp": false,
6194
5631
  "hiddenAliases": [],
6195
- "id": "test:validate",
5632
+ "id": "test:list",
6196
5633
  "pluginAlias": "@memberjunction/cli",
6197
5634
  "pluginName": "@memberjunction/cli",
6198
5635
  "pluginType": "core",
@@ -6203,95 +5640,969 @@
6203
5640
  "dist",
6204
5641
  "commands",
6205
5642
  "test",
6206
- "validate.js"
5643
+ "list.js"
6207
5644
  ]
6208
5645
  },
6209
- "translate-sql": {
5646
+ "test:promote-criteria": {
6210
5647
  "aliases": [],
6211
- "args": {},
6212
- "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
5648
+ "args": {
5649
+ "test": {
5650
+ "description": "Test name or ID",
5651
+ "name": "test",
5652
+ "required": true
5653
+ }
5654
+ },
5655
+ "description": "Copy a test's inline judge criteria into a Draft rubric and set Test.RubricID. Does not publish.",
6213
5656
  "examples": [
6214
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --dry-run",
6215
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope queries",
6216
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --sql \"SELECT TOP 10 [Name] FROM [Users]\"",
6217
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope all --output ./reports"
5657
+ "<%= config.bin %> <%= command.id %> <test-id>",
5658
+ "<%= config.bin %> <%= command.id %> \"Reply check\""
6218
5659
  ],
6219
- "flags": {
6220
- "from": {
6221
- "description": "Source SQL dialect",
6222
- "name": "from",
6223
- "required": true,
6224
- "hasDynamicHelp": false,
6225
- "multiple": false,
6226
- "options": [
6227
- "sqlserver",
6228
- "postgresql"
5660
+ "flags": {},
5661
+ "hasDynamicHelp": false,
5662
+ "hiddenAliases": [],
5663
+ "id": "test:promote-criteria",
5664
+ "pluginAlias": "@memberjunction/cli",
5665
+ "pluginName": "@memberjunction/cli",
5666
+ "pluginType": "core",
5667
+ "strict": true,
5668
+ "enableJsonFlag": false,
5669
+ "isESM": true,
5670
+ "relativePath": [
5671
+ "dist",
5672
+ "commands",
5673
+ "test",
5674
+ "promote-criteria.js"
5675
+ ]
5676
+ },
5677
+ "test:report": {
5678
+ "aliases": [],
5679
+ "args": {
5680
+ "runId": {
5681
+ "description": "Test run ID",
5682
+ "name": "runId",
5683
+ "required": true
5684
+ }
5685
+ },
5686
+ "description": "Print the per-criterion rubric breakdown for a test run.",
5687
+ "flags": {},
5688
+ "hasDynamicHelp": false,
5689
+ "hiddenAliases": [],
5690
+ "id": "test:report",
5691
+ "pluginAlias": "@memberjunction/cli",
5692
+ "pluginName": "@memberjunction/cli",
5693
+ "pluginType": "core",
5694
+ "strict": true,
5695
+ "enableJsonFlag": false,
5696
+ "isESM": true,
5697
+ "relativePath": [
5698
+ "dist",
5699
+ "commands",
5700
+ "test",
5701
+ "report.js"
5702
+ ]
5703
+ },
5704
+ "test:run": {
5705
+ "aliases": [],
5706
+ "args": {
5707
+ "testId": {
5708
+ "description": "Test ID to execute",
5709
+ "name": "testId",
5710
+ "required": false
5711
+ }
5712
+ },
5713
+ "description": "Execute a single test by ID or name",
5714
+ "examples": [
5715
+ "<%= config.bin %> <%= command.id %> <test-id>",
5716
+ "<%= config.bin %> <%= command.id %> --name=\"Active Members Count\"",
5717
+ "<%= config.bin %> <%= command.id %> <test-id> --environment=staging",
5718
+ "<%= config.bin %> <%= command.id %> <test-id> --format=json --output=results.json",
5719
+ "<%= config.bin %> <%= command.id %> <test-id> --dry-run"
5720
+ ],
5721
+ "flags": {
5722
+ "name": {
5723
+ "char": "n",
5724
+ "description": "Test name to execute",
5725
+ "name": "name",
5726
+ "hasDynamicHelp": false,
5727
+ "multiple": false,
5728
+ "type": "option"
5729
+ },
5730
+ "environment": {
5731
+ "char": "e",
5732
+ "description": "Environment context (dev, staging, prod)",
5733
+ "name": "environment",
5734
+ "hasDynamicHelp": false,
5735
+ "multiple": false,
5736
+ "type": "option"
5737
+ },
5738
+ "format": {
5739
+ "char": "f",
5740
+ "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
5741
+ "name": "format",
5742
+ "hasDynamicHelp": false,
5743
+ "multiple": false,
5744
+ "options": [
5745
+ "text",
5746
+ "json",
5747
+ "md",
5748
+ "human",
5749
+ "console",
5750
+ "markdown",
5751
+ "compact",
5752
+ "table"
5753
+ ],
5754
+ "type": "option"
5755
+ },
5756
+ "output": {
5757
+ "char": "o",
5758
+ "description": "Output file path",
5759
+ "name": "output",
5760
+ "hasDynamicHelp": false,
5761
+ "multiple": false,
5762
+ "type": "option"
5763
+ },
5764
+ "dry-run": {
5765
+ "description": "Validate without executing",
5766
+ "name": "dry-run",
5767
+ "allowNo": false,
5768
+ "type": "boolean"
5769
+ },
5770
+ "verbose": {
5771
+ "char": "v",
5772
+ "description": "Show detailed execution information",
5773
+ "name": "verbose",
5774
+ "allowNo": false,
5775
+ "type": "boolean"
5776
+ },
5777
+ "checks-module": {
5778
+ "description": "Module specifier (package name or path) side-effect-imported before the run so its integration check bundles register on the IntegrationCheckRegistry. Durable form: mj.config.cjs `testing.checkModules` (this repo loads '@memberjunction/integration-test-suite' that way).",
5779
+ "name": "checks-module",
5780
+ "hasDynamicHelp": false,
5781
+ "multiple": false,
5782
+ "type": "option"
5783
+ },
5784
+ "rubric": {
5785
+ "description": "Rubric override: name or id, optionally @version (1.2.0 or a version id)",
5786
+ "name": "rubric",
5787
+ "hasDynamicHelp": false,
5788
+ "multiple": false,
5789
+ "type": "option"
5790
+ },
5791
+ "oracles-module": {
5792
+ "description": "Path to a JS/TS module that exports custom IOracle classes or instances. Each export is registered on the engine before the test runs — used by non-MJ adopters to plug app-specific oracle types without modifying TestingFramework.",
5793
+ "name": "oracles-module",
5794
+ "hasDynamicHelp": false,
5795
+ "multiple": false,
5796
+ "type": "option"
5797
+ }
5798
+ },
5799
+ "hasDynamicHelp": false,
5800
+ "hiddenAliases": [],
5801
+ "id": "test:run",
5802
+ "pluginAlias": "@memberjunction/cli",
5803
+ "pluginName": "@memberjunction/cli",
5804
+ "pluginType": "core",
5805
+ "strict": true,
5806
+ "enableJsonFlag": false,
5807
+ "isESM": true,
5808
+ "relativePath": [
5809
+ "dist",
5810
+ "commands",
5811
+ "test",
5812
+ "run.js"
5813
+ ]
5814
+ },
5815
+ "test:scripts": {
5816
+ "aliases": [],
5817
+ "args": {},
5818
+ "description": "Review and promote recorded replay scripts. A run that re-derives a test which already had a script stores the new one as pending rather than replacing what replay uses, so a UI change never rewrites the suite unnoticed. This is where you see the drift and decide.",
5819
+ "examples": [
5820
+ "<%= config.bin %> <%= command.id %>",
5821
+ "<%= config.bin %> <%= command.id %> --test \"T042 - Filter Grid\"",
5822
+ "<%= config.bin %> <%= command.id %> --promote --test \"T042 - Filter Grid\"",
5823
+ "<%= config.bin %> <%= command.id %> --promote --yes",
5824
+ "<%= config.bin %> <%= command.id %> --discard --test \"T042 - Filter Grid\""
5825
+ ],
5826
+ "flags": {
5827
+ "test": {
5828
+ "description": "Limit to one test, by name or ID",
5829
+ "name": "test",
5830
+ "hasDynamicHelp": false,
5831
+ "multiple": false,
5832
+ "type": "option"
5833
+ },
5834
+ "promote": {
5835
+ "description": "Promote the pending script(s) into the slot replay uses",
5836
+ "exclusive": [
5837
+ "discard"
5838
+ ],
5839
+ "name": "promote",
5840
+ "allowNo": false,
5841
+ "type": "boolean"
5842
+ },
5843
+ "discard": {
5844
+ "description": "Drop the pending script(s), keeping the promoted one",
5845
+ "exclusive": [
5846
+ "promote"
5847
+ ],
5848
+ "name": "discard",
5849
+ "allowNo": false,
5850
+ "type": "boolean"
5851
+ },
5852
+ "yes": {
5853
+ "char": "y",
5854
+ "description": "Confirm a bulk --promote/--discard that was not narrowed with --test",
5855
+ "name": "yes",
5856
+ "allowNo": false,
5857
+ "type": "boolean"
5858
+ }
5859
+ },
5860
+ "hasDynamicHelp": false,
5861
+ "hiddenAliases": [],
5862
+ "id": "test:scripts",
5863
+ "pluginAlias": "@memberjunction/cli",
5864
+ "pluginName": "@memberjunction/cli",
5865
+ "pluginType": "core",
5866
+ "strict": true,
5867
+ "enableJsonFlag": false,
5868
+ "isESM": true,
5869
+ "relativePath": [
5870
+ "dist",
5871
+ "commands",
5872
+ "test",
5873
+ "scripts.js"
5874
+ ]
5875
+ },
5876
+ "test:suite": {
5877
+ "aliases": [],
5878
+ "args": {
5879
+ "suiteId": {
5880
+ "description": "Test suite ID to execute",
5881
+ "name": "suiteId",
5882
+ "required": false
5883
+ }
5884
+ },
5885
+ "description": "Execute a test suite",
5886
+ "examples": [
5887
+ "<%= config.bin %> <%= command.id %> <suite-id>",
5888
+ "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
5889
+ "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
5890
+ "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
5891
+ ],
5892
+ "flags": {
5893
+ "name": {
5894
+ "char": "n",
5895
+ "description": "Test suite name to execute",
5896
+ "name": "name",
5897
+ "hasDynamicHelp": false,
5898
+ "multiple": false,
5899
+ "type": "option"
5900
+ },
5901
+ "format": {
5902
+ "char": "f",
5903
+ "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
5904
+ "name": "format",
5905
+ "hasDynamicHelp": false,
5906
+ "multiple": false,
5907
+ "options": [
5908
+ "text",
5909
+ "json",
5910
+ "md",
5911
+ "human",
5912
+ "console",
5913
+ "markdown",
5914
+ "compact",
5915
+ "table"
5916
+ ],
5917
+ "type": "option"
5918
+ },
5919
+ "output": {
5920
+ "char": "o",
5921
+ "description": "Output file path",
5922
+ "name": "output",
5923
+ "hasDynamicHelp": false,
5924
+ "multiple": false,
5925
+ "type": "option"
5926
+ },
5927
+ "verbose": {
5928
+ "char": "v",
5929
+ "description": "Show detailed execution information",
5930
+ "name": "verbose",
5931
+ "allowNo": false,
5932
+ "type": "boolean"
5933
+ },
5934
+ "delay": {
5935
+ "char": "d",
5936
+ "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
5937
+ "name": "delay",
5938
+ "default": 0,
5939
+ "hasDynamicHelp": false,
5940
+ "multiple": false,
5941
+ "type": "option"
5942
+ },
5943
+ "parallel": {
5944
+ "char": "p",
5945
+ "description": "Run tests in parallel with shared browser sessions",
5946
+ "name": "parallel",
5947
+ "allowNo": false,
5948
+ "type": "boolean"
5949
+ },
5950
+ "max-parallel": {
5951
+ "description": "Maximum number of parallel workers (default 4)",
5952
+ "name": "max-parallel",
5953
+ "default": 4,
5954
+ "hasDynamicHelp": false,
5955
+ "multiple": false,
5956
+ "type": "option"
5957
+ },
5958
+ "rubric": {
5959
+ "description": "Rubric override for every test: name or id, optionally @version",
5960
+ "name": "rubric",
5961
+ "hasDynamicHelp": false,
5962
+ "multiple": false,
5963
+ "type": "option"
5964
+ },
5965
+ "flaky-check": {
5966
+ "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
5967
+ "name": "flaky-check",
5968
+ "hasDynamicHelp": false,
5969
+ "multiple": false,
5970
+ "type": "option"
5971
+ },
5972
+ "checks-module": {
5973
+ "description": "Module specifier (package name or path) side-effect-imported before the run so its integration check bundles register on the IntegrationCheckRegistry. Durable form: mj.config.cjs `testing.checkModules` (this repo loads '@memberjunction/integration-test-suite' that way).",
5974
+ "name": "checks-module",
5975
+ "hasDynamicHelp": false,
5976
+ "multiple": false,
5977
+ "type": "option"
5978
+ },
5979
+ "oracles-module": {
5980
+ "description": "Path to a JS/TS module that exports custom IOracle classes or instances. Each export is registered on the engine before the suite runs — used by non-MJ adopters to plug app-specific oracle types without modifying TestingFramework.",
5981
+ "name": "oracles-module",
5982
+ "hasDynamicHelp": false,
5983
+ "multiple": false,
5984
+ "type": "option"
5985
+ }
5986
+ },
5987
+ "hasDynamicHelp": false,
5988
+ "hiddenAliases": [],
5989
+ "id": "test:suite",
5990
+ "pluginAlias": "@memberjunction/cli",
5991
+ "pluginName": "@memberjunction/cli",
5992
+ "pluginType": "core",
5993
+ "strict": true,
5994
+ "enableJsonFlag": false,
5995
+ "isESM": true,
5996
+ "relativePath": [
5997
+ "dist",
5998
+ "commands",
5999
+ "test",
6000
+ "suite.js"
6001
+ ]
6002
+ },
6003
+ "test:usage": {
6004
+ "aliases": [],
6005
+ "args": {},
6006
+ "description": "Show usage, flags, examples, and runtime hints for every `mj test` command.",
6007
+ "flags": {
6008
+ "format": {
6009
+ "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
6010
+ "name": "format",
6011
+ "hasDynamicHelp": false,
6012
+ "multiple": false,
6013
+ "options": [
6014
+ "text",
6015
+ "json",
6016
+ "md"
6017
+ ],
6018
+ "type": "option"
6019
+ }
6020
+ },
6021
+ "hasDynamicHelp": false,
6022
+ "hiddenAliases": [],
6023
+ "id": "test:usage",
6024
+ "pluginAlias": "@memberjunction/cli",
6025
+ "pluginName": "@memberjunction/cli",
6026
+ "pluginType": "core",
6027
+ "strict": true,
6028
+ "enableJsonFlag": false,
6029
+ "isESM": true,
6030
+ "relativePath": [
6031
+ "dist",
6032
+ "commands",
6033
+ "test",
6034
+ "usage.js"
6035
+ ]
6036
+ },
6037
+ "test:validate": {
6038
+ "aliases": [],
6039
+ "args": {
6040
+ "testId": {
6041
+ "description": "Test ID to validate",
6042
+ "name": "testId",
6043
+ "required": false
6044
+ }
6045
+ },
6046
+ "description": "Validate test definitions without executing",
6047
+ "examples": [
6048
+ "<%= config.bin %> <%= command.id %> <test-id>",
6049
+ "<%= config.bin %> <%= command.id %> --all",
6050
+ "<%= config.bin %> <%= command.id %> --type=agent-eval",
6051
+ "<%= config.bin %> <%= command.id %> --all --save-report",
6052
+ "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
6053
+ ],
6054
+ "flags": {
6055
+ "all": {
6056
+ "char": "a",
6057
+ "description": "Validate all tests",
6058
+ "name": "all",
6059
+ "allowNo": false,
6060
+ "type": "boolean"
6061
+ },
6062
+ "type": {
6063
+ "char": "t",
6064
+ "description": "Validate tests by type",
6065
+ "name": "type",
6066
+ "hasDynamicHelp": false,
6067
+ "multiple": false,
6068
+ "type": "option"
6069
+ },
6070
+ "save-report": {
6071
+ "description": "Save validation report to file",
6072
+ "name": "save-report",
6073
+ "allowNo": false,
6074
+ "type": "boolean"
6075
+ },
6076
+ "format": {
6077
+ "char": "f",
6078
+ "description": "Output format: text (human), json (machine-readable), md (Markdown). Defaults to human output on a terminal and json when stdout is piped. Legacy spellings (console/markdown/compact/table) are accepted.",
6079
+ "name": "format",
6080
+ "hasDynamicHelp": false,
6081
+ "multiple": false,
6082
+ "options": [
6083
+ "text",
6084
+ "json",
6085
+ "md",
6086
+ "human",
6087
+ "console",
6088
+ "markdown",
6089
+ "compact",
6090
+ "table"
6091
+ ],
6092
+ "type": "option"
6093
+ },
6094
+ "output": {
6095
+ "char": "o",
6096
+ "description": "Output file path",
6097
+ "name": "output",
6098
+ "hasDynamicHelp": false,
6099
+ "multiple": false,
6100
+ "type": "option"
6101
+ },
6102
+ "verbose": {
6103
+ "char": "v",
6104
+ "description": "Show detailed information",
6105
+ "name": "verbose",
6106
+ "allowNo": false,
6107
+ "type": "boolean"
6108
+ }
6109
+ },
6110
+ "hasDynamicHelp": false,
6111
+ "hiddenAliases": [],
6112
+ "id": "test:validate",
6113
+ "pluginAlias": "@memberjunction/cli",
6114
+ "pluginName": "@memberjunction/cli",
6115
+ "pluginType": "core",
6116
+ "strict": true,
6117
+ "enableJsonFlag": false,
6118
+ "isESM": true,
6119
+ "relativePath": [
6120
+ "dist",
6121
+ "commands",
6122
+ "test",
6123
+ "validate.js"
6124
+ ]
6125
+ },
6126
+ "queue:backlog": {
6127
+ "aliases": [],
6128
+ "args": {},
6129
+ "description": "Show the autoscaler metric for one subscription: claimable pending plus in-flight deliveries",
6130
+ "examples": [
6131
+ "<%= config.bin %> <%= command.id %> --subscription venue-import",
6132
+ "<%= config.bin %> <%= command.id %> --subscription venue-import --json"
6133
+ ],
6134
+ "flags": {
6135
+ "subscription": {
6136
+ "char": "s",
6137
+ "description": "Subscription name",
6138
+ "name": "subscription",
6139
+ "required": true,
6140
+ "hasDynamicHelp": false,
6141
+ "multiple": false,
6142
+ "type": "option"
6143
+ },
6144
+ "json": {
6145
+ "description": "Print JSON instead of text",
6146
+ "name": "json",
6147
+ "allowNo": false,
6148
+ "type": "boolean"
6149
+ }
6150
+ },
6151
+ "hasDynamicHelp": false,
6152
+ "hiddenAliases": [],
6153
+ "id": "queue:backlog",
6154
+ "pluginAlias": "@memberjunction/cli",
6155
+ "pluginName": "@memberjunction/cli",
6156
+ "pluginType": "core",
6157
+ "strict": true,
6158
+ "enableJsonFlag": false,
6159
+ "isESM": true,
6160
+ "relativePath": [
6161
+ "dist",
6162
+ "commands",
6163
+ "queue",
6164
+ "backlog.js"
6165
+ ]
6166
+ },
6167
+ "queue:dead-letters": {
6168
+ "aliases": [],
6169
+ "args": {},
6170
+ "description": "List a work-queue subscription's dead-lettered deliveries",
6171
+ "examples": [
6172
+ "<%= config.bin %> <%= command.id %> --subscription integration.apply --page-size 20"
6173
+ ],
6174
+ "flags": {
6175
+ "subscription": {
6176
+ "char": "s",
6177
+ "description": "Subscription name",
6178
+ "name": "subscription",
6179
+ "required": true,
6180
+ "hasDynamicHelp": false,
6181
+ "multiple": false,
6182
+ "type": "option"
6183
+ },
6184
+ "cursor": {
6185
+ "description": "nextCursor from a previous page",
6186
+ "name": "cursor",
6187
+ "hasDynamicHelp": false,
6188
+ "multiple": false,
6189
+ "type": "option"
6190
+ },
6191
+ "page-size": {
6192
+ "description": "Items per page (1–500)",
6193
+ "name": "page-size",
6194
+ "default": 50,
6195
+ "hasDynamicHelp": false,
6196
+ "multiple": false,
6197
+ "type": "option"
6198
+ },
6199
+ "json": {
6200
+ "description": "Print JSON instead of a table",
6201
+ "name": "json",
6202
+ "allowNo": false,
6203
+ "type": "boolean"
6204
+ }
6205
+ },
6206
+ "hasDynamicHelp": false,
6207
+ "hiddenAliases": [],
6208
+ "id": "queue:dead-letters",
6209
+ "pluginAlias": "@memberjunction/cli",
6210
+ "pluginName": "@memberjunction/cli",
6211
+ "pluginType": "core",
6212
+ "strict": true,
6213
+ "enableJsonFlag": false,
6214
+ "isESM": true,
6215
+ "relativePath": [
6216
+ "dist",
6217
+ "commands",
6218
+ "queue",
6219
+ "dead-letters.js"
6220
+ ]
6221
+ },
6222
+ "queue:discard": {
6223
+ "aliases": [],
6224
+ "args": {},
6225
+ "description": "Discard one pending or dead-lettered work-queue delivery, or cancel one that is in flight",
6226
+ "examples": [
6227
+ "<%= config.bin %> <%= command.id %> --subscription integration.apply --delivery <id> --reason \"bad batch, republished\""
6228
+ ],
6229
+ "flags": {
6230
+ "subscription": {
6231
+ "char": "s",
6232
+ "description": "Subscription name",
6233
+ "name": "subscription",
6234
+ "required": true,
6235
+ "hasDynamicHelp": false,
6236
+ "multiple": false,
6237
+ "type": "option"
6238
+ },
6239
+ "delivery": {
6240
+ "char": "d",
6241
+ "description": "DeliveryID to discard",
6242
+ "name": "delivery",
6243
+ "required": true,
6244
+ "hasDynamicHelp": false,
6245
+ "multiple": false,
6246
+ "type": "option"
6247
+ },
6248
+ "reason": {
6249
+ "char": "r",
6250
+ "description": "Why the work is dropped (at most 1000 characters)",
6251
+ "name": "reason",
6252
+ "required": true,
6253
+ "hasDynamicHelp": false,
6254
+ "multiple": false,
6255
+ "type": "option"
6256
+ }
6257
+ },
6258
+ "hasDynamicHelp": false,
6259
+ "hiddenAliases": [],
6260
+ "id": "queue:discard",
6261
+ "pluginAlias": "@memberjunction/cli",
6262
+ "pluginName": "@memberjunction/cli",
6263
+ "pluginType": "core",
6264
+ "strict": true,
6265
+ "enableJsonFlag": false,
6266
+ "isESM": true,
6267
+ "relativePath": [
6268
+ "dist",
6269
+ "commands",
6270
+ "queue",
6271
+ "discard.js"
6272
+ ]
6273
+ },
6274
+ "queue:export-topology": {
6275
+ "aliases": [],
6276
+ "args": {},
6277
+ "description": "Write the topology manifest for one transport (input to the Terraform module)",
6278
+ "examples": [
6279
+ "<%= config.bin %> <%= command.id %> --transport AWS-prod --output infrastructure/work-queue/manifest.json"
6280
+ ],
6281
+ "flags": {
6282
+ "transport": {
6283
+ "char": "t",
6284
+ "description": "Transport name",
6285
+ "name": "transport",
6286
+ "required": true,
6287
+ "hasDynamicHelp": false,
6288
+ "multiple": false,
6289
+ "type": "option"
6290
+ },
6291
+ "output": {
6292
+ "char": "o",
6293
+ "description": "File to write; stdout when omitted",
6294
+ "name": "output",
6295
+ "hasDynamicHelp": false,
6296
+ "multiple": false,
6297
+ "type": "option"
6298
+ }
6299
+ },
6300
+ "hasDynamicHelp": false,
6301
+ "hiddenAliases": [],
6302
+ "id": "queue:export-topology",
6303
+ "pluginAlias": "@memberjunction/cli",
6304
+ "pluginName": "@memberjunction/cli",
6305
+ "pluginType": "core",
6306
+ "strict": true,
6307
+ "enableJsonFlag": false,
6308
+ "isESM": true,
6309
+ "relativePath": [
6310
+ "dist",
6311
+ "commands",
6312
+ "queue",
6313
+ "export-topology.js"
6314
+ ]
6315
+ },
6316
+ "queue:import-bindings": {
6317
+ "aliases": [],
6318
+ "args": {
6319
+ "file": {
6320
+ "description": "BindingImport JSON file",
6321
+ "name": "file",
6322
+ "required": true
6323
+ }
6324
+ },
6325
+ "description": "Record cloud resource bindings (Terraform output) on work-queue topics and subscriptions",
6326
+ "examples": [
6327
+ "terraform output -json mj_work_queue_bindings > bindings.json && <%= config.bin %> <%= command.id %> bindings.json"
6328
+ ],
6329
+ "flags": {
6330
+ "json": {
6331
+ "description": "Print issues as JSON",
6332
+ "name": "json",
6333
+ "allowNo": false,
6334
+ "type": "boolean"
6335
+ }
6336
+ },
6337
+ "hasDynamicHelp": false,
6338
+ "hiddenAliases": [],
6339
+ "id": "queue:import-bindings",
6340
+ "pluginAlias": "@memberjunction/cli",
6341
+ "pluginName": "@memberjunction/cli",
6342
+ "pluginType": "core",
6343
+ "strict": true,
6344
+ "enableJsonFlag": false,
6345
+ "isESM": true,
6346
+ "relativePath": [
6347
+ "dist",
6348
+ "commands",
6349
+ "queue",
6350
+ "import-bindings.js"
6351
+ ]
6352
+ },
6353
+ "queue": {
6354
+ "aliases": [],
6355
+ "args": {},
6356
+ "description": "Operate the durable work queue",
6357
+ "examples": [
6358
+ "<%= config.bin %> <%= command.id %> publish --topic samples.hello --payload '{\"name\":\"Paul\"}'",
6359
+ "<%= config.bin %> <%= command.id %> stats",
6360
+ "<%= config.bin %> <%= command.id %> dead-letters --subscription email.unsubscribe"
6361
+ ],
6362
+ "flags": {},
6363
+ "hasDynamicHelp": false,
6364
+ "hiddenAliases": [],
6365
+ "id": "queue",
6366
+ "pluginAlias": "@memberjunction/cli",
6367
+ "pluginName": "@memberjunction/cli",
6368
+ "pluginType": "core",
6369
+ "strict": true,
6370
+ "enableJsonFlag": false,
6371
+ "isESM": true,
6372
+ "relativePath": [
6373
+ "dist",
6374
+ "commands",
6375
+ "queue",
6376
+ "index.js"
6377
+ ]
6378
+ },
6379
+ "queue:partitions": {
6380
+ "aliases": [],
6381
+ "args": {},
6382
+ "description": "List a work-queue subscription's in-flight or blocked partition keys",
6383
+ "examples": [
6384
+ "<%= config.bin %> <%= command.id %> --subscription integration.apply --condition Blocked"
6385
+ ],
6386
+ "flags": {
6387
+ "subscription": {
6388
+ "char": "s",
6389
+ "description": "Subscription name",
6390
+ "name": "subscription",
6391
+ "required": true,
6392
+ "hasDynamicHelp": false,
6393
+ "multiple": false,
6394
+ "type": "option"
6395
+ },
6396
+ "condition": {
6397
+ "description": "Only keys in this condition",
6398
+ "name": "condition",
6399
+ "hasDynamicHelp": false,
6400
+ "multiple": false,
6401
+ "options": [
6402
+ "Idle",
6403
+ "InFlight",
6404
+ "Blocked"
6229
6405
  ],
6230
6406
  "type": "option"
6231
6407
  },
6232
- "to": {
6233
- "description": "Target SQL dialect",
6234
- "name": "to",
6408
+ "cursor": {
6409
+ "description": "nextCursor from a previous page",
6410
+ "name": "cursor",
6411
+ "hasDynamicHelp": false,
6412
+ "multiple": false,
6413
+ "type": "option"
6414
+ },
6415
+ "page-size": {
6416
+ "description": "Items per page (1–500)",
6417
+ "name": "page-size",
6418
+ "default": 50,
6419
+ "hasDynamicHelp": false,
6420
+ "multiple": false,
6421
+ "type": "option"
6422
+ },
6423
+ "json": {
6424
+ "description": "Print JSON instead of a table",
6425
+ "name": "json",
6426
+ "allowNo": false,
6427
+ "type": "boolean"
6428
+ }
6429
+ },
6430
+ "hasDynamicHelp": false,
6431
+ "hiddenAliases": [],
6432
+ "id": "queue:partitions",
6433
+ "pluginAlias": "@memberjunction/cli",
6434
+ "pluginName": "@memberjunction/cli",
6435
+ "pluginType": "core",
6436
+ "strict": true,
6437
+ "enableJsonFlag": false,
6438
+ "isESM": true,
6439
+ "relativePath": [
6440
+ "dist",
6441
+ "commands",
6442
+ "queue",
6443
+ "partitions.js"
6444
+ ]
6445
+ },
6446
+ "queue:publish": {
6447
+ "aliases": [],
6448
+ "args": {},
6449
+ "description": "Publish messages to a work-queue topic from this machine through MJ code (no API key needed)",
6450
+ "examples": [
6451
+ "<%= config.bin %> <%= command.id %> --topic samples.hello --payload '{\"name\":\"Paul\"}'",
6452
+ "<%= config.bin %> <%= command.id %> --topic samples.hello --payload '{\"sleepMs\":60000}' --partition-key customer-42",
6453
+ "<%= config.bin %> <%= command.id %> --topic samples.hello --count 5 --partition-key k1 --attribute source=demo"
6454
+ ],
6455
+ "flags": {
6456
+ "topic": {
6457
+ "char": "t",
6458
+ "description": "Topic name",
6459
+ "name": "topic",
6460
+ "required": true,
6461
+ "hasDynamicHelp": false,
6462
+ "multiple": false,
6463
+ "type": "option"
6464
+ },
6465
+ "payload": {
6466
+ "char": "p",
6467
+ "description": "Message payload as JSON",
6468
+ "name": "payload",
6469
+ "default": "{}",
6470
+ "hasDynamicHelp": false,
6471
+ "multiple": false,
6472
+ "type": "option"
6473
+ },
6474
+ "partition-key": {
6475
+ "char": "k",
6476
+ "description": "PartitionKey for Exclusive / Ordered subscriptions",
6477
+ "name": "partition-key",
6478
+ "hasDynamicHelp": false,
6479
+ "multiple": false,
6480
+ "type": "option"
6481
+ },
6482
+ "dedup-key": {
6483
+ "description": "DeduplicationKey: a repeat within the topic TTL is reported as Duplicate",
6484
+ "name": "dedup-key",
6485
+ "hasDynamicHelp": false,
6486
+ "multiple": false,
6487
+ "type": "option"
6488
+ },
6489
+ "attribute": {
6490
+ "char": "a",
6491
+ "description": "Message attribute as key=value (repeatable)",
6492
+ "name": "attribute",
6493
+ "hasDynamicHelp": false,
6494
+ "multiple": true,
6495
+ "type": "option"
6496
+ },
6497
+ "count": {
6498
+ "char": "n",
6499
+ "description": "How many copies to publish in one batch",
6500
+ "name": "count",
6501
+ "default": 1,
6502
+ "hasDynamicHelp": false,
6503
+ "multiple": false,
6504
+ "type": "option"
6505
+ },
6506
+ "json": {
6507
+ "description": "Print the publish results as JSON",
6508
+ "name": "json",
6509
+ "allowNo": false,
6510
+ "type": "boolean"
6511
+ }
6512
+ },
6513
+ "hasDynamicHelp": false,
6514
+ "hiddenAliases": [],
6515
+ "id": "queue:publish",
6516
+ "pluginAlias": "@memberjunction/cli",
6517
+ "pluginName": "@memberjunction/cli",
6518
+ "pluginType": "core",
6519
+ "strict": true,
6520
+ "enableJsonFlag": false,
6521
+ "isESM": true,
6522
+ "relativePath": [
6523
+ "dist",
6524
+ "commands",
6525
+ "queue",
6526
+ "publish.js"
6527
+ ]
6528
+ },
6529
+ "queue:replay": {
6530
+ "aliases": [],
6531
+ "args": {},
6532
+ "description": "Replay one dead-lettered work-queue delivery",
6533
+ "examples": [
6534
+ "<%= config.bin %> <%= command.id %> --subscription integration.apply --delivery <id> --note \"mapping fixed\""
6535
+ ],
6536
+ "flags": {
6537
+ "subscription": {
6538
+ "char": "s",
6539
+ "description": "Subscription name",
6540
+ "name": "subscription",
6235
6541
  "required": true,
6236
6542
  "hasDynamicHelp": false,
6237
6543
  "multiple": false,
6238
- "options": [
6239
- "sqlserver",
6240
- "postgresql"
6241
- ],
6242
6544
  "type": "option"
6243
6545
  },
6244
- "scope": {
6245
- "description": "What to scan for translation",
6246
- "name": "scope",
6247
- "default": "all",
6546
+ "delivery": {
6547
+ "char": "d",
6548
+ "description": "DeliveryID from `mj queue dead-letters`",
6549
+ "name": "delivery",
6550
+ "required": true,
6248
6551
  "hasDynamicHelp": false,
6249
6552
  "multiple": false,
6250
- "options": [
6251
- "queries",
6252
- "views",
6253
- "filters",
6254
- "all"
6255
- ],
6256
6553
  "type": "option"
6257
6554
  },
6258
- "sql": {
6259
- "description": "Translate a single SQL fragment (inline mode)",
6260
- "name": "sql",
6555
+ "note": {
6556
+ "description": "Operator note stored with the resolution",
6557
+ "name": "note",
6261
6558
  "hasDynamicHelp": false,
6262
6559
  "multiple": false,
6263
6560
  "type": "option"
6264
- },
6265
- "dry-run": {
6266
- "description": "Show what would be translated without making changes",
6267
- "name": "dry-run",
6268
- "allowNo": false,
6269
- "type": "boolean"
6270
- },
6271
- "review": {
6272
- "description": "Generate review report only (no writes to database)",
6273
- "name": "review",
6274
- "allowNo": false,
6275
- "type": "boolean"
6276
- },
6277
- "output": {
6278
- "char": "o",
6279
- "description": "Output directory for the translation report",
6280
- "name": "output",
6561
+ }
6562
+ },
6563
+ "hasDynamicHelp": false,
6564
+ "hiddenAliases": [],
6565
+ "id": "queue:replay",
6566
+ "pluginAlias": "@memberjunction/cli",
6567
+ "pluginName": "@memberjunction/cli",
6568
+ "pluginType": "core",
6569
+ "strict": true,
6570
+ "enableJsonFlag": false,
6571
+ "isESM": true,
6572
+ "relativePath": [
6573
+ "dist",
6574
+ "commands",
6575
+ "queue",
6576
+ "replay.js"
6577
+ ]
6578
+ },
6579
+ "queue:stats": {
6580
+ "aliases": [],
6581
+ "args": {},
6582
+ "description": "Show pending, in-flight and dead-lettered counts for work-queue subscriptions",
6583
+ "examples": [
6584
+ "<%= config.bin %> <%= command.id %>",
6585
+ "<%= config.bin %> <%= command.id %> --subscription email.unsubscribe --json"
6586
+ ],
6587
+ "flags": {
6588
+ "subscription": {
6589
+ "char": "s",
6590
+ "description": "Subscription name; omit for every subscription",
6591
+ "name": "subscription",
6281
6592
  "hasDynamicHelp": false,
6282
6593
  "multiple": false,
6283
6594
  "type": "option"
6284
6595
  },
6285
- "force": {
6286
- "description": "Re-translate even if platform variants already exist",
6287
- "name": "force",
6596
+ "json": {
6597
+ "description": "Print JSON instead of a table",
6598
+ "name": "json",
6288
6599
  "allowNo": false,
6289
6600
  "type": "boolean"
6290
6601
  }
6291
6602
  },
6292
6603
  "hasDynamicHelp": false,
6293
6604
  "hiddenAliases": [],
6294
- "id": "translate-sql",
6605
+ "id": "queue:stats",
6295
6606
  "pluginAlias": "@memberjunction/cli",
6296
6607
  "pluginName": "@memberjunction/cli",
6297
6608
  "pluginType": "core",
@@ -6301,14 +6612,14 @@
6301
6612
  "relativePath": [
6302
6613
  "dist",
6303
6614
  "commands",
6304
- "translate-sql",
6305
- "index.js"
6615
+ "queue",
6616
+ "stats.js"
6306
6617
  ]
6307
6618
  },
6308
- "translate-sql:usage": {
6619
+ "queue:usage": {
6309
6620
  "aliases": [],
6310
6621
  "args": {},
6311
- "description": "Show usage, flags, examples, and runtime hints for every `mj translate-sql` command.",
6622
+ "description": "Show usage, flags, examples, and runtime hints for every `mj queue` command.",
6312
6623
  "flags": {
6313
6624
  "format": {
6314
6625
  "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
@@ -6325,7 +6636,7 @@
6325
6636
  },
6326
6637
  "hasDynamicHelp": false,
6327
6638
  "hiddenAliases": [],
6328
- "id": "translate-sql:usage",
6639
+ "id": "queue:usage",
6329
6640
  "pluginAlias": "@memberjunction/cli",
6330
6641
  "pluginName": "@memberjunction/cli",
6331
6642
  "pluginType": "core",
@@ -6335,135 +6646,37 @@
6335
6646
  "relativePath": [
6336
6647
  "dist",
6337
6648
  "commands",
6338
- "translate-sql",
6649
+ "queue",
6339
6650
  "usage.js"
6340
6651
  ]
6341
6652
  },
6342
- "update:claude": {
6653
+ "queue:validate-bindings": {
6343
6654
  "aliases": [],
6344
6655
  "args": {},
6345
- "description": "Update the Claude Code pack in the current directory.",
6656
+ "description": "Validate work-queue topology and cloud bindings; exits 1 on any error",
6346
6657
  "examples": [
6347
- "<%= config.bin %> update:claude",
6348
- "<%= config.bin %> update:claude --check",
6349
- "<%= config.bin %> update:claude --refresh-commands",
6350
- "<%= config.bin %> update:claude --allow-major",
6351
- "<%= config.bin %> update:claude --json"
6658
+ "<%= config.bin %> <%= command.id %>",
6659
+ "<%= config.bin %> <%= command.id %> --transport AWS-prod"
6352
6660
  ],
6353
6661
  "flags": {
6354
- "dir": {
6355
- "description": "Target directory",
6356
- "name": "dir",
6357
- "default": ".",
6358
- "hasDynamicHelp": false,
6359
- "multiple": false,
6360
- "type": "option"
6361
- },
6362
- "major": {
6363
- "description": "Force a specific MJ major (default: detected from package.json)",
6364
- "name": "major",
6365
- "hasDynamicHelp": false,
6366
- "multiple": false,
6367
- "type": "option"
6368
- },
6369
- "ref": {
6370
- "description": "Git ref to fetch from (branch or tag). Default: main.",
6371
- "name": "ref",
6372
- "hasDynamicHelp": false,
6373
- "multiple": false,
6374
- "type": "option"
6375
- },
6376
- "from": {
6377
- "description": "Use a local pack source instead of fetching from GitHub",
6378
- "name": "from",
6662
+ "transport": {
6663
+ "char": "t",
6664
+ "description": "Validate one transport's bindings against its resources",
6665
+ "name": "transport",
6379
6666
  "hasDynamicHelp": false,
6380
6667
  "multiple": false,
6381
6668
  "type": "option"
6382
6669
  },
6383
- "offline": {
6384
- "description": "Forbid network; requires --from <path>",
6385
- "name": "offline",
6386
- "allowNo": false,
6387
- "type": "boolean"
6388
- },
6389
- "dry-run": {
6390
- "description": "Print what would be written; change nothing",
6391
- "name": "dry-run",
6392
- "allowNo": false,
6393
- "type": "boolean"
6394
- },
6395
- "yes": {
6396
- "char": "y",
6397
- "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
6398
- "name": "yes",
6399
- "allowNo": false,
6400
- "type": "boolean"
6401
- },
6402
- "force": {
6403
- "description": "Overwrite user-customized commands/skills (saves .bak files)",
6404
- "name": "force",
6405
- "allowNo": false,
6406
- "type": "boolean"
6407
- },
6408
- "skip-commands": {
6409
- "description": "Skip seeding .claude/commands/",
6410
- "name": "skip-commands",
6411
- "allowNo": false,
6412
- "type": "boolean"
6413
- },
6414
- "skip-skills": {
6415
- "description": "Skip seeding .claude/skills/",
6416
- "name": "skip-skills",
6417
- "allowNo": false,
6418
- "type": "boolean"
6419
- },
6420
- "skip-settings": {
6421
- "description": "Skip merging .claude/settings.json",
6422
- "name": "skip-settings",
6423
- "allowNo": false,
6424
- "type": "boolean"
6425
- },
6426
- "check": {
6427
- "description": "Compare local pack version to remote without writing anything",
6428
- "name": "check",
6429
- "allowNo": false,
6430
- "type": "boolean"
6431
- },
6432
- "refresh-commands": {
6433
- "description": "Force-resync .claude/commands/* from the pack (saves .bak files)",
6434
- "name": "refresh-commands",
6435
- "allowNo": false,
6436
- "type": "boolean"
6437
- },
6438
- "refresh-skills": {
6439
- "description": "Force-resync .claude/skills/** from the pack (saves .bak files)",
6440
- "name": "refresh-skills",
6441
- "allowNo": false,
6442
- "type": "boolean"
6443
- },
6444
- "allow-major": {
6445
- "description": "Allow the remote pack's major to differ from local MJ's major",
6446
- "name": "allow-major",
6447
- "allowNo": false,
6448
- "type": "boolean"
6449
- },
6450
6670
  "json": {
6451
- "description": "Output as JSON (matches plan §7.5 schema)",
6671
+ "description": "Print issues as JSON",
6452
6672
  "name": "json",
6453
6673
  "allowNo": false,
6454
6674
  "type": "boolean"
6455
- },
6456
- "verbose": {
6457
- "char": "v",
6458
- "description": "Show progress messages",
6459
- "name": "verbose",
6460
- "allowNo": false,
6461
- "type": "boolean"
6462
6675
  }
6463
6676
  },
6464
6677
  "hasDynamicHelp": false,
6465
6678
  "hiddenAliases": [],
6466
- "id": "update:claude",
6679
+ "id": "queue:validate-bindings",
6467
6680
  "pluginAlias": "@memberjunction/cli",
6468
6681
  "pluginName": "@memberjunction/cli",
6469
6682
  "pluginType": "core",
@@ -6473,31 +6686,87 @@
6473
6686
  "relativePath": [
6474
6687
  "dist",
6475
6688
  "commands",
6476
- "update",
6477
- "claude.js"
6689
+ "queue",
6690
+ "validate-bindings.js"
6478
6691
  ]
6479
6692
  },
6480
- "update:usage": {
6693
+ "queue:work": {
6481
6694
  "aliases": [],
6482
6695
  "args": {},
6483
- "description": "Show usage, flags, examples, and runtime hints for every `mj update` command.",
6696
+ "description": "Run work-queue subscriptions in this process: once for a container job, or until stopped",
6697
+ "examples": [
6698
+ "<%= config.bin %> <%= command.id %> --subscription venue-import --once",
6699
+ "<%= config.bin %> <%= command.id %> --subscription venue-import --once --max 5 --concurrency 2 --max-duration-ms 3300000",
6700
+ "<%= config.bin %> <%= command.id %> --subscription \"*\""
6701
+ ],
6484
6702
  "flags": {
6485
- "format": {
6486
- "description": "Output format. Defaults to text on a terminal and json when stdout is piped.",
6487
- "name": "format",
6703
+ "subscription": {
6704
+ "char": "s",
6705
+ "description": "Subscription name, or '*' for every MJWorker subscription",
6706
+ "name": "subscription",
6707
+ "required": true,
6708
+ "hasDynamicHelp": false,
6709
+ "multiple": false,
6710
+ "type": "option"
6711
+ },
6712
+ "once": {
6713
+ "description": "Receive up to --max deliveries, drain and exit (container-job mode)",
6714
+ "name": "once",
6715
+ "allowNo": false,
6716
+ "type": "boolean"
6717
+ },
6718
+ "max": {
6719
+ "dependsOn": [
6720
+ "once"
6721
+ ],
6722
+ "description": "With --once: how many deliveries to receive",
6723
+ "name": "max",
6724
+ "default": 1,
6725
+ "hasDynamicHelp": false,
6726
+ "multiple": false,
6727
+ "type": "option"
6728
+ },
6729
+ "idle-exit-ms": {
6730
+ "dependsOn": [
6731
+ "once"
6732
+ ],
6733
+ "description": "With --once: exit after this long with an empty queue",
6734
+ "name": "idle-exit-ms",
6735
+ "default": 5000,
6488
6736
  "hasDynamicHelp": false,
6489
6737
  "multiple": false,
6490
- "options": [
6491
- "text",
6492
- "json",
6493
- "md"
6738
+ "type": "option"
6739
+ },
6740
+ "max-duration-ms": {
6741
+ "dependsOn": [
6742
+ "once"
6494
6743
  ],
6744
+ "description": "With --once: stop claiming after this long and drain (keep it below the scheduler's job deadline)",
6745
+ "name": "max-duration-ms",
6746
+ "hasDynamicHelp": false,
6747
+ "multiple": false,
6748
+ "type": "option"
6749
+ },
6750
+ "concurrency": {
6751
+ "description": "Handlers in flight per subscription",
6752
+ "name": "concurrency",
6753
+ "default": 1,
6754
+ "hasDynamicHelp": false,
6755
+ "multiple": false,
6756
+ "type": "option"
6757
+ },
6758
+ "shutdown-drain-ms": {
6759
+ "description": "How long in-flight handlers get to finish on exit; the drain can take twice this",
6760
+ "name": "shutdown-drain-ms",
6761
+ "default": 30000,
6762
+ "hasDynamicHelp": false,
6763
+ "multiple": false,
6495
6764
  "type": "option"
6496
6765
  }
6497
6766
  },
6498
6767
  "hasDynamicHelp": false,
6499
6768
  "hiddenAliases": [],
6500
- "id": "update:usage",
6769
+ "id": "queue:work",
6501
6770
  "pluginAlias": "@memberjunction/cli",
6502
6771
  "pluginName": "@memberjunction/cli",
6503
6772
  "pluginType": "core",
@@ -6507,8 +6776,8 @@
6507
6776
  "relativePath": [
6508
6777
  "dist",
6509
6778
  "commands",
6510
- "update",
6511
- "usage.js"
6779
+ "queue",
6780
+ "work.js"
6512
6781
  ]
6513
6782
  },
6514
6783
  "user:clone": {
@@ -7299,218 +7568,6 @@
7299
7568
  "run.js"
7300
7569
  ]
7301
7570
  },
7302
- "rubric:diff": {
7303
- "aliases": [],
7304
- "args": {
7305
- "rubric": {
7306
- "description": "Rubric name or id",
7307
- "name": "rubric",
7308
- "required": true
7309
- },
7310
- "from": {
7311
- "description": "Version 1.2.0 or id",
7312
- "name": "from",
7313
- "required": true
7314
- },
7315
- "to": {
7316
- "description": "Version 1.2.0 or id",
7317
- "name": "to",
7318
- "required": true
7319
- }
7320
- },
7321
- "description": "Print the version bump between two rubric versions.",
7322
- "flags": {},
7323
- "hasDynamicHelp": false,
7324
- "hiddenAliases": [],
7325
- "id": "rubric:diff",
7326
- "pluginAlias": "@memberjunction/cli",
7327
- "pluginName": "@memberjunction/cli",
7328
- "pluginType": "core",
7329
- "strict": true,
7330
- "enableJsonFlag": false,
7331
- "isESM": true,
7332
- "relativePath": [
7333
- "dist",
7334
- "commands",
7335
- "rubric",
7336
- "diff.js"
7337
- ]
7338
- },
7339
- "rubric:evaluate": {
7340
- "aliases": [],
7341
- "args": {},
7342
- "description": "Evaluate one record against a rubric. Does not publish.",
7343
- "flags": {
7344
- "rubric": {
7345
- "description": "Rubric name or id, optionally @version",
7346
- "name": "rubric",
7347
- "required": true,
7348
- "hasDynamicHelp": false,
7349
- "multiple": false,
7350
- "type": "option"
7351
- },
7352
- "entity": {
7353
- "description": "Subject entity name",
7354
- "name": "entity",
7355
- "required": true,
7356
- "hasDynamicHelp": false,
7357
- "multiple": false,
7358
- "type": "option"
7359
- },
7360
- "record": {
7361
- "description": "Subject record id",
7362
- "name": "record",
7363
- "required": true,
7364
- "hasDynamicHelp": false,
7365
- "multiple": false,
7366
- "type": "option"
7367
- },
7368
- "evaluator": {
7369
- "description": "A registered evaluator: LLM, Decision, Agent, Deterministic, or a custom one",
7370
- "name": "evaluator",
7371
- "default": "LLM",
7372
- "hasDynamicHelp": false,
7373
- "multiple": false,
7374
- "type": "option"
7375
- },
7376
- "prompt": {
7377
- "description": "LLM: the judge prompt composed into Rubric Evaluator (default Rubric Evaluator - Default Judge). Decision: the decision prompt (default Default Decision)",
7378
- "name": "prompt",
7379
- "hasDynamicHelp": false,
7380
- "multiple": false,
7381
- "type": "option"
7382
- },
7383
- "model": {
7384
- "description": "AI Model ID to pin. Otherwise the prompt's bindings choose",
7385
- "name": "model",
7386
- "hasDynamicHelp": false,
7387
- "multiple": false,
7388
- "type": "option"
7389
- },
7390
- "mode": {
7391
- "description": "LLM only: SinglePass or PerCriterion",
7392
- "name": "mode",
7393
- "hasDynamicHelp": false,
7394
- "multiple": false,
7395
- "options": [
7396
- "SinglePass",
7397
- "PerCriterion"
7398
- ],
7399
- "type": "option"
7400
- }
7401
- },
7402
- "hasDynamicHelp": false,
7403
- "hiddenAliases": [],
7404
- "id": "rubric:evaluate",
7405
- "pluginAlias": "@memberjunction/cli",
7406
- "pluginName": "@memberjunction/cli",
7407
- "pluginType": "core",
7408
- "strict": true,
7409
- "enableJsonFlag": false,
7410
- "isESM": true,
7411
- "relativePath": [
7412
- "dist",
7413
- "commands",
7414
- "rubric",
7415
- "evaluate.js"
7416
- ]
7417
- },
7418
- "rubric": {
7419
- "aliases": [],
7420
- "args": {},
7421
- "description": "List, show, diff, validate, and evaluate rubrics.",
7422
- "flags": {},
7423
- "hasDynamicHelp": false,
7424
- "hiddenAliases": [],
7425
- "id": "rubric",
7426
- "pluginAlias": "@memberjunction/cli",
7427
- "pluginName": "@memberjunction/cli",
7428
- "pluginType": "core",
7429
- "strict": true,
7430
- "enableJsonFlag": false,
7431
- "isESM": true,
7432
- "relativePath": [
7433
- "dist",
7434
- "commands",
7435
- "rubric",
7436
- "index.js"
7437
- ]
7438
- },
7439
- "rubric:list": {
7440
- "aliases": [],
7441
- "args": {},
7442
- "description": "List rubrics.",
7443
- "flags": {},
7444
- "hasDynamicHelp": false,
7445
- "hiddenAliases": [],
7446
- "id": "rubric:list",
7447
- "pluginAlias": "@memberjunction/cli",
7448
- "pluginName": "@memberjunction/cli",
7449
- "pluginType": "core",
7450
- "strict": true,
7451
- "enableJsonFlag": false,
7452
- "isESM": true,
7453
- "relativePath": [
7454
- "dist",
7455
- "commands",
7456
- "rubric",
7457
- "list.js"
7458
- ]
7459
- },
7460
- "rubric:show": {
7461
- "aliases": [],
7462
- "args": {
7463
- "rubric": {
7464
- "description": "Rubric name or id, optionally @version",
7465
- "name": "rubric",
7466
- "required": true
7467
- }
7468
- },
7469
- "description": "Show a rubric version and its criteria.",
7470
- "flags": {},
7471
- "hasDynamicHelp": false,
7472
- "hiddenAliases": [],
7473
- "id": "rubric:show",
7474
- "pluginAlias": "@memberjunction/cli",
7475
- "pluginName": "@memberjunction/cli",
7476
- "pluginType": "core",
7477
- "strict": true,
7478
- "enableJsonFlag": false,
7479
- "isESM": true,
7480
- "relativePath": [
7481
- "dist",
7482
- "commands",
7483
- "rubric",
7484
- "show.js"
7485
- ]
7486
- },
7487
- "rubric:validate": {
7488
- "aliases": [],
7489
- "args": {
7490
- "file": {
7491
- "description": "JSON snapshot file",
7492
- "name": "file",
7493
- "required": true
7494
- }
7495
- },
7496
- "description": "Check a rubric snapshot file for duplicate keys, gates, weights, and scales.",
7497
- "flags": {},
7498
- "hasDynamicHelp": false,
7499
- "hiddenAliases": [],
7500
- "id": "rubric:validate",
7501
- "pluginAlias": "@memberjunction/cli",
7502
- "pluginName": "@memberjunction/cli",
7503
- "pluginType": "core",
7504
- "strict": true,
7505
- "enableJsonFlag": false,
7506
- "isESM": true,
7507
- "relativePath": [
7508
- "dist",
7509
- "commands",
7510
- "rubric",
7511
- "validate.js"
7512
- ]
7513
- },
7514
7571
  "dev:workspace:clean": {
7515
7572
  "aliases": [],
7516
7573
  "args": {},
@@ -8165,5 +8222,5 @@
8165
8222
  ]
8166
8223
  }
8167
8224
  },
8168
- "version": "6.2.0-edge.4"
8225
+ "version": "6.2.0-edge.5"
8169
8226
  }