@memberjunction/cli 5.48.0 → 5.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2911,187 +2911,52 @@
2911
2911
  "index.js"
2912
2912
  ]
2913
2913
  },
2914
- "test:compare": {
2914
+ "sync:file-reset": {
2915
2915
  "aliases": [],
2916
- "args": {
2917
- "runId1": {
2918
- "description": "First test run ID to compare",
2919
- "name": "runId1",
2920
- "required": false
2921
- },
2922
- "runId2": {
2923
- "description": "Second test run ID to compare",
2924
- "name": "runId2",
2925
- "required": false
2926
- }
2927
- },
2928
- "description": "Compare test runs for regression detection",
2916
+ "args": {},
2917
+ "description": "Reset file metadata sections",
2929
2918
  "examples": [
2930
2919
  "<%= config.bin %> <%= command.id %>",
2931
- "<%= config.bin %> <%= command.id %> --latest",
2932
- "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
2933
- "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
2934
- "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
2935
- "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
2936
- "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
2920
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
2921
+ "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
2922
+ "<%= config.bin %> <%= command.id %> --all"
2937
2923
  ],
2938
2924
  "flags": {
2939
- "version": {
2940
- "char": "v",
2941
- "description": "Compare runs by version",
2942
- "name": "version",
2925
+ "dir": {
2926
+ "description": "Specific entity directory to reset",
2927
+ "name": "dir",
2943
2928
  "hasDynamicHelp": false,
2944
- "multiple": true,
2929
+ "multiple": false,
2945
2930
  "type": "option"
2946
2931
  },
2947
- "commit": {
2948
- "char": "c",
2949
- "description": "Compare runs by git commit",
2950
- "name": "commit",
2932
+ "sections": {
2933
+ "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
2934
+ "name": "sections",
2951
2935
  "hasDynamicHelp": false,
2952
- "multiple": true,
2936
+ "multiple": false,
2953
2937
  "type": "option"
2954
2938
  },
2955
- "diff-only": {
2956
- "description": "Show only differences",
2957
- "name": "diff-only",
2939
+ "all": {
2940
+ "description": "Reset all metadata sections",
2941
+ "name": "all",
2958
2942
  "allowNo": false,
2959
2943
  "type": "boolean"
2960
2944
  },
2961
- "latest": {
2962
- "char": "l",
2963
- "description": "Compare the two most recent completed suite runs",
2964
- "name": "latest",
2945
+ "dry-run": {
2946
+ "description": "Show what would be reset without actually resetting",
2947
+ "name": "dry-run",
2965
2948
  "allowNo": false,
2966
2949
  "type": "boolean"
2967
2950
  },
2968
- "from-json": {
2969
- "description": "Compare two results.json files directly (no DB). Pass twice: --from-json PREV --from-json CURR",
2970
- "name": "from-json",
2971
- "hasDynamicHelp": false,
2972
- "multiple": true,
2973
- "type": "option"
2974
- },
2975
- "format": {
2976
- "char": "f",
2977
- "description": "Output format",
2978
- "name": "format",
2979
- "default": "console",
2980
- "hasDynamicHelp": false,
2981
- "multiple": false,
2982
- "options": [
2983
- "console",
2984
- "json",
2985
- "markdown"
2986
- ],
2987
- "type": "option"
2988
- },
2989
- "output": {
2990
- "char": "o",
2991
- "description": "Output file path",
2992
- "name": "output",
2993
- "hasDynamicHelp": false,
2994
- "multiple": false,
2995
- "type": "option"
2996
- },
2997
- "verbose": {
2998
- "description": "Show detailed information",
2999
- "name": "verbose",
2951
+ "force": {
2952
+ "description": "Skip confirmation prompts",
2953
+ "name": "force",
3000
2954
  "allowNo": false,
3001
2955
  "type": "boolean"
3002
2956
  },
3003
- "tag": {
3004
- "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.",
3005
- "name": "tag",
3006
- "hasDynamicHelp": false,
3007
- "multiple": false,
3008
- "type": "option"
3009
- }
3010
- },
3011
- "hasDynamicHelp": false,
3012
- "hiddenAliases": [],
3013
- "id": "test:compare",
3014
- "pluginAlias": "@memberjunction/cli",
3015
- "pluginName": "@memberjunction/cli",
3016
- "pluginType": "core",
3017
- "strict": true,
3018
- "enableJsonFlag": false,
3019
- "isESM": true,
3020
- "relativePath": [
3021
- "dist",
3022
- "commands",
3023
- "test",
3024
- "compare.js"
3025
- ]
3026
- },
3027
- "test:history": {
3028
- "aliases": [],
3029
- "args": {},
3030
- "description": "View test execution history",
3031
- "examples": [
3032
- "<%= config.bin %> <%= command.id %>",
3033
- "<%= config.bin %> <%= command.id %> --test=<test-id>",
3034
- "<%= config.bin %> <%= command.id %> --suite=<suite-id>",
3035
- "<%= config.bin %> <%= command.id %> --since=\"2024-01-01\"",
3036
- "<%= config.bin %> <%= command.id %> --limit=50"
3037
- ],
3038
- "flags": {
3039
- "test": {
3040
- "char": "t",
3041
- "description": "Filter by test ID",
3042
- "name": "test",
3043
- "hasDynamicHelp": false,
3044
- "multiple": false,
3045
- "type": "option"
3046
- },
3047
- "recent": {
3048
- "char": "r",
3049
- "description": "Number of recent runs to show",
3050
- "name": "recent",
3051
- "hasDynamicHelp": false,
3052
- "multiple": false,
3053
- "type": "option"
3054
- },
3055
- "from": {
3056
- "description": "Show history from date (YYYY-MM-DD)",
3057
- "name": "from",
3058
- "hasDynamicHelp": false,
3059
- "multiple": false,
3060
- "type": "option"
3061
- },
3062
- "status": {
3063
- "char": "s",
3064
- "description": "Filter by status",
3065
- "name": "status",
3066
- "hasDynamicHelp": false,
3067
- "multiple": false,
3068
- "type": "option"
3069
- },
3070
- "format": {
3071
- "char": "f",
3072
- "description": "Output format",
3073
- "name": "format",
3074
- "default": "console",
3075
- "hasDynamicHelp": false,
3076
- "multiple": false,
3077
- "options": [
3078
- "console",
3079
- "json",
3080
- "markdown"
3081
- ],
3082
- "type": "option"
3083
- },
3084
- "output": {
3085
- "char": "o",
3086
- "description": "Output file path",
3087
- "name": "output",
3088
- "hasDynamicHelp": false,
3089
- "multiple": false,
3090
- "type": "option"
3091
- },
3092
2957
  "verbose": {
3093
2958
  "char": "v",
3094
- "description": "Show detailed information",
2959
+ "description": "Show detailed output",
3095
2960
  "name": "verbose",
3096
2961
  "allowNo": false,
3097
2962
  "type": "boolean"
@@ -3099,7 +2964,7 @@
3099
2964
  },
3100
2965
  "hasDynamicHelp": false,
3101
2966
  "hiddenAliases": [],
3102
- "id": "test:history",
2967
+ "id": "sync:file-reset",
3103
2968
  "pluginAlias": "@memberjunction/cli",
3104
2969
  "pluginName": "@memberjunction/cli",
3105
2970
  "pluginType": "core",
@@ -3109,26 +2974,21 @@
3109
2974
  "relativePath": [
3110
2975
  "dist",
3111
2976
  "commands",
3112
- "test",
3113
- "history.js"
2977
+ "sync",
2978
+ "file-reset.js"
3114
2979
  ]
3115
2980
  },
3116
- "test": {
2981
+ "sync:init": {
3117
2982
  "aliases": [],
3118
2983
  "args": {},
3119
- "description": "MemberJunction Testing Framework - Execute and manage tests",
2984
+ "description": "Initialize a directory for metadata synchronization",
3120
2985
  "examples": [
3121
- "<%= config.bin %> <%= command.id %> run <test-id>",
3122
- "<%= config.bin %> <%= command.id %> run --name=\"Active Members Count\"",
3123
- "<%= config.bin %> <%= command.id %> suite <suite-id>",
3124
- "<%= config.bin %> <%= command.id %> list",
3125
- "<%= config.bin %> <%= command.id %> list --suites",
3126
- "<%= config.bin %> <%= command.id %> validate --all"
2986
+ "<%= config.bin %> <%= command.id %>"
3127
2987
  ],
3128
2988
  "flags": {},
3129
2989
  "hasDynamicHelp": false,
3130
2990
  "hiddenAliases": [],
3131
- "id": "test",
2991
+ "id": "sync:init",
3132
2992
  "pluginAlias": "@memberjunction/cli",
3133
2993
  "pluginName": "@memberjunction/cli",
3134
2994
  "pluginType": "core",
@@ -3138,176 +2998,148 @@
3138
2998
  "relativePath": [
3139
2999
  "dist",
3140
3000
  "commands",
3141
- "test",
3142
- "index.js"
3001
+ "sync",
3002
+ "init.js"
3143
3003
  ]
3144
3004
  },
3145
- "test:list": {
3005
+ "sync:pull": {
3146
3006
  "aliases": [],
3147
3007
  "args": {},
3148
- "description": "List available tests, suites, and types",
3008
+ "description": "Pull metadata from database to local files",
3149
3009
  "examples": [
3150
- "<%= config.bin %> <%= command.id %>",
3151
- "<%= config.bin %> <%= command.id %> --suites",
3152
- "<%= config.bin %> <%= command.id %> --types",
3153
- "<%= config.bin %> <%= command.id %> --type=agent-eval",
3154
- "<%= config.bin %> <%= command.id %> --tag=smoke",
3155
- "<%= config.bin %> <%= command.id %> --status=active --verbose"
3010
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
3011
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
3012
+ "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
3156
3013
  ],
3157
3014
  "flags": {
3158
- "suites": {
3159
- "description": "List test suites instead of tests",
3160
- "name": "suites",
3015
+ "format": {
3016
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3017
+ "name": "format",
3018
+ "default": "text",
3019
+ "hasDynamicHelp": false,
3020
+ "multiple": false,
3021
+ "options": [
3022
+ "text",
3023
+ "json",
3024
+ "md"
3025
+ ],
3026
+ "type": "option"
3027
+ },
3028
+ "verbose": {
3029
+ "char": "v",
3030
+ "description": "Show detailed output",
3031
+ "name": "verbose",
3161
3032
  "allowNo": false,
3162
3033
  "type": "boolean"
3163
3034
  },
3164
- "types": {
3165
- "description": "List test types",
3166
- "name": "types",
3035
+ "no-banner": {
3036
+ "description": "Suppress the startup banner and runtime advisory",
3037
+ "name": "no-banner",
3167
3038
  "allowNo": false,
3168
3039
  "type": "boolean"
3169
3040
  },
3170
- "type": {
3171
- "char": "t",
3172
- "description": "Filter by test type",
3173
- "name": "type",
3041
+ "entity": {
3042
+ "description": "Entity name to pull",
3043
+ "name": "entity",
3044
+ "required": true,
3174
3045
  "hasDynamicHelp": false,
3175
3046
  "multiple": false,
3176
3047
  "type": "option"
3177
3048
  },
3178
- "tag": {
3179
- "description": "Filter by tag",
3180
- "name": "tag",
3049
+ "filter": {
3050
+ "description": "Additional filter for pulling specific records",
3051
+ "name": "filter",
3181
3052
  "hasDynamicHelp": false,
3182
3053
  "multiple": false,
3183
3054
  "type": "option"
3184
3055
  },
3185
- "status": {
3186
- "char": "s",
3187
- "description": "Filter by status",
3188
- "name": "status",
3056
+ "dry-run": {
3057
+ "description": "Show what would be pulled without actually pulling",
3058
+ "name": "dry-run",
3059
+ "allowNo": false,
3060
+ "type": "boolean"
3061
+ },
3062
+ "multi-file": {
3063
+ "description": "Create a single file with multiple records (provide filename)",
3064
+ "name": "multi-file",
3189
3065
  "hasDynamicHelp": false,
3190
3066
  "multiple": false,
3191
3067
  "type": "option"
3192
3068
  },
3193
- "format": {
3194
- "char": "f",
3195
- "description": "Output format",
3196
- "name": "format",
3197
- "default": "console",
3069
+ "no-validate": {
3070
+ "description": "Skip validation before pull",
3071
+ "name": "no-validate",
3072
+ "allowNo": false,
3073
+ "type": "boolean"
3074
+ },
3075
+ "update-existing": {
3076
+ "description": "Update existing records during pull",
3077
+ "name": "update-existing",
3078
+ "allowNo": false,
3079
+ "type": "boolean"
3080
+ },
3081
+ "create-new": {
3082
+ "description": "Create new files for records not found locally",
3083
+ "name": "create-new",
3084
+ "allowNo": false,
3085
+ "type": "boolean"
3086
+ },
3087
+ "backup-before-update": {
3088
+ "description": "Create backups before updating files",
3089
+ "name": "backup-before-update",
3090
+ "allowNo": false,
3091
+ "type": "boolean"
3092
+ },
3093
+ "merge-strategy": {
3094
+ "description": "Merge strategy for updates",
3095
+ "name": "merge-strategy",
3096
+ "default": "merge",
3198
3097
  "hasDynamicHelp": false,
3199
3098
  "multiple": false,
3200
3099
  "options": [
3201
- "console",
3202
- "json",
3203
- "markdown"
3100
+ "merge",
3101
+ "overwrite",
3102
+ "skip"
3204
3103
  ],
3205
3104
  "type": "option"
3206
3105
  },
3207
- "output": {
3208
- "char": "o",
3209
- "description": "Output file path",
3210
- "name": "output",
3211
- "hasDynamicHelp": false,
3212
- "multiple": false,
3213
- "type": "option"
3214
- },
3215
- "verbose": {
3216
- "char": "v",
3217
- "description": "Show detailed information",
3218
- "name": "verbose",
3219
- "allowNo": false,
3220
- "type": "boolean"
3221
- }
3222
- },
3223
- "hasDynamicHelp": false,
3224
- "hiddenAliases": [],
3225
- "id": "test:list",
3226
- "pluginAlias": "@memberjunction/cli",
3227
- "pluginName": "@memberjunction/cli",
3228
- "pluginType": "core",
3229
- "strict": true,
3230
- "enableJsonFlag": false,
3231
- "isESM": true,
3232
- "relativePath": [
3233
- "dist",
3234
- "commands",
3235
- "test",
3236
- "list.js"
3237
- ]
3238
- },
3239
- "test:run": {
3240
- "aliases": [],
3241
- "args": {
3242
- "testId": {
3243
- "description": "Test ID to execute",
3244
- "name": "testId",
3245
- "required": false
3246
- }
3247
- },
3248
- "description": "Execute a single test by ID or name",
3249
- "examples": [
3250
- "<%= config.bin %> <%= command.id %> <test-id>",
3251
- "<%= config.bin %> <%= command.id %> --name=\"Active Members Count\"",
3252
- "<%= config.bin %> <%= command.id %> <test-id> --environment=staging",
3253
- "<%= config.bin %> <%= command.id %> <test-id> --format=json --output=results.json",
3254
- "<%= config.bin %> <%= command.id %> <test-id> --dry-run"
3255
- ],
3256
- "flags": {
3257
- "name": {
3258
- "char": "n",
3259
- "description": "Test name to execute",
3260
- "name": "name",
3106
+ "backup-directory": {
3107
+ "description": "Custom backup directory (default: .backups)",
3108
+ "name": "backup-directory",
3261
3109
  "hasDynamicHelp": false,
3262
3110
  "multiple": false,
3263
3111
  "type": "option"
3264
3112
  },
3265
- "environment": {
3266
- "char": "e",
3267
- "description": "Environment context (dev, staging, prod)",
3268
- "name": "environment",
3113
+ "preserve-fields": {
3114
+ "description": "Comma-separated list of fields to preserve during updates",
3115
+ "name": "preserve-fields",
3269
3116
  "hasDynamicHelp": false,
3270
- "multiple": false,
3117
+ "multiple": true,
3271
3118
  "type": "option"
3272
3119
  },
3273
- "format": {
3274
- "char": "f",
3275
- "description": "Output format",
3276
- "name": "format",
3277
- "default": "console",
3120
+ "exclude-fields": {
3121
+ "description": "Comma-separated list of fields to exclude from pull",
3122
+ "name": "exclude-fields",
3278
3123
  "hasDynamicHelp": false,
3279
- "multiple": false,
3280
- "options": [
3281
- "console",
3282
- "json",
3283
- "markdown"
3284
- ],
3124
+ "multiple": true,
3285
3125
  "type": "option"
3286
3126
  },
3287
- "output": {
3288
- "char": "o",
3289
- "description": "Output file path",
3290
- "name": "output",
3127
+ "target-dir": {
3128
+ "description": "Specific target directory (overrides auto-discovery)",
3129
+ "name": "target-dir",
3291
3130
  "hasDynamicHelp": false,
3292
3131
  "multiple": false,
3293
3132
  "type": "option"
3294
3133
  },
3295
- "dry-run": {
3296
- "description": "Validate without executing",
3297
- "name": "dry-run",
3298
- "allowNo": false,
3299
- "type": "boolean"
3300
- },
3301
- "verbose": {
3302
- "char": "v",
3303
- "description": "Show detailed execution information",
3304
- "name": "verbose",
3134
+ "incremental": {
3135
+ "description": "Only pull records updated since last successful pull",
3136
+ "name": "incremental",
3305
3137
  "allowNo": false,
3306
3138
  "type": "boolean"
3307
3139
  },
3308
- "oracles-module": {
3309
- "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.",
3310
- "name": "oracles-module",
3140
+ "since": {
3141
+ "description": "Only pull records updated after this ISO 8601 timestamp",
3142
+ "name": "since",
3311
3143
  "hasDynamicHelp": false,
3312
3144
  "multiple": false,
3313
3145
  "type": "option"
@@ -3315,201 +3147,270 @@
3315
3147
  },
3316
3148
  "hasDynamicHelp": false,
3317
3149
  "hiddenAliases": [],
3318
- "id": "test:run",
3150
+ "id": "sync:pull",
3319
3151
  "pluginAlias": "@memberjunction/cli",
3320
3152
  "pluginName": "@memberjunction/cli",
3321
3153
  "pluginType": "core",
3322
3154
  "strict": true,
3323
3155
  "enableJsonFlag": false,
3156
+ "Usage": {
3157
+ "domain": "sync",
3158
+ "command": "sync:pull",
3159
+ "summary": "Pull database records into local metadata files.",
3160
+ "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
3161
+ "flags": [
3162
+ {
3163
+ "name": "--entity",
3164
+ "type": "string",
3165
+ "description": "Entity name to pull (required)"
3166
+ },
3167
+ {
3168
+ "name": "--filter",
3169
+ "type": "string",
3170
+ "description": "Extra SQL filter for which records to pull"
3171
+ },
3172
+ {
3173
+ "name": "--merge-strategy",
3174
+ "type": "merge|overwrite|skip",
3175
+ "description": "How to reconcile existing files"
3176
+ },
3177
+ {
3178
+ "name": "--dry-run",
3179
+ "type": "boolean",
3180
+ "description": "Report what would be pulled without writing"
3181
+ },
3182
+ {
3183
+ "name": "--format",
3184
+ "type": "text|json|md",
3185
+ "description": "Output format (json for machine-readable result)"
3186
+ }
3187
+ ],
3188
+ "examples": [
3189
+ "mj sync pull --entity=\"MJ: AI Prompts\"",
3190
+ "mj sync pull --entity=\"Actions\" --format=json"
3191
+ ],
3192
+ "runtime": {
3193
+ "class": "variable",
3194
+ "typicalSeconds": 15,
3195
+ "note": "scales with number of records matched for --entity"
3196
+ }
3197
+ },
3324
3198
  "isESM": true,
3325
3199
  "relativePath": [
3326
3200
  "dist",
3327
3201
  "commands",
3328
- "test",
3329
- "run.js"
3202
+ "sync",
3203
+ "pull.js"
3330
3204
  ]
3331
3205
  },
3332
- "test:suite": {
3206
+ "sync:push": {
3333
3207
  "aliases": [],
3334
- "args": {
3335
- "suiteId": {
3336
- "description": "Test suite ID to execute",
3337
- "name": "suiteId",
3338
- "required": false
3339
- }
3340
- },
3341
- "description": "Execute a test suite",
3208
+ "args": {},
3209
+ "description": "Push local file changes to the database",
3342
3210
  "examples": [
3343
- "<%= config.bin %> <%= command.id %> <suite-id>",
3344
- "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
3345
- "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
3346
- "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
3211
+ "<%= config.bin %> <%= command.id %>",
3212
+ "<%= config.bin %> <%= command.id %> --dry-run",
3213
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3214
+ "<%= config.bin %> <%= command.id %> --ci --format=json"
3347
3215
  ],
3348
3216
  "flags": {
3349
- "name": {
3350
- "char": "n",
3351
- "description": "Test suite name to execute",
3352
- "name": "name",
3353
- "hasDynamicHelp": false,
3354
- "multiple": false,
3355
- "type": "option"
3356
- },
3357
3217
  "format": {
3358
- "char": "f",
3359
- "description": "Output format",
3218
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3360
3219
  "name": "format",
3361
- "default": "console",
3220
+ "default": "text",
3362
3221
  "hasDynamicHelp": false,
3363
3222
  "multiple": false,
3364
3223
  "options": [
3365
- "console",
3224
+ "text",
3366
3225
  "json",
3367
- "markdown"
3226
+ "md"
3368
3227
  ],
3369
3228
  "type": "option"
3370
3229
  },
3371
- "output": {
3372
- "char": "o",
3373
- "description": "Output file path",
3374
- "name": "output",
3375
- "hasDynamicHelp": false,
3376
- "multiple": false,
3377
- "type": "option"
3378
- },
3379
3230
  "verbose": {
3380
3231
  "char": "v",
3381
- "description": "Show detailed execution information",
3232
+ "description": "Show detailed output",
3382
3233
  "name": "verbose",
3383
3234
  "allowNo": false,
3384
3235
  "type": "boolean"
3385
3236
  },
3386
- "delay": {
3387
- "char": "d",
3388
- "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
3389
- "name": "delay",
3390
- "default": 0,
3237
+ "no-banner": {
3238
+ "description": "Suppress the startup banner and runtime advisory",
3239
+ "name": "no-banner",
3240
+ "allowNo": false,
3241
+ "type": "boolean"
3242
+ },
3243
+ "dir": {
3244
+ "description": "Specific entity directory to push",
3245
+ "name": "dir",
3391
3246
  "hasDynamicHelp": false,
3392
3247
  "multiple": false,
3393
3248
  "type": "option"
3394
3249
  },
3395
- "parallel": {
3396
- "char": "p",
3397
- "description": "Run tests in parallel with shared browser sessions",
3398
- "name": "parallel",
3250
+ "dry-run": {
3251
+ "description": "Show what would be pushed without actually pushing",
3252
+ "name": "dry-run",
3399
3253
  "allowNo": false,
3400
3254
  "type": "boolean"
3401
3255
  },
3402
- "max-parallel": {
3403
- "description": "Maximum number of parallel workers (default 4)",
3404
- "name": "max-parallel",
3405
- "default": 4,
3256
+ "ci": {
3257
+ "description": "CI mode - no prompts, fail on issues",
3258
+ "name": "ci",
3259
+ "allowNo": false,
3260
+ "type": "boolean"
3261
+ },
3262
+ "no-validate": {
3263
+ "description": "Skip validation before push",
3264
+ "name": "no-validate",
3265
+ "allowNo": false,
3266
+ "type": "boolean"
3267
+ },
3268
+ "delete-db-only": {
3269
+ "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
3270
+ "name": "delete-db-only",
3271
+ "allowNo": false,
3272
+ "type": "boolean"
3273
+ },
3274
+ "parallel-batch-size": {
3275
+ "description": "Number of records to process in parallel (default: 10)",
3276
+ "name": "parallel-batch-size",
3277
+ "default": 10,
3406
3278
  "hasDynamicHelp": false,
3407
3279
  "multiple": false,
3408
3280
  "type": "option"
3409
3281
  },
3410
- "flaky-check": {
3411
- "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
3412
- "name": "flaky-check",
3282
+ "include": {
3283
+ "description": "Only process these directories (comma-separated, supports patterns)",
3284
+ "name": "include",
3413
3285
  "hasDynamicHelp": false,
3414
3286
  "multiple": false,
3415
3287
  "type": "option"
3416
3288
  },
3417
- "oracles-module": {
3418
- "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.",
3419
- "name": "oracles-module",
3289
+ "exclude": {
3290
+ "description": "Skip these directories (comma-separated, supports patterns)",
3291
+ "name": "exclude",
3420
3292
  "hasDynamicHelp": false,
3421
3293
  "multiple": false,
3422
3294
  "type": "option"
3295
+ },
3296
+ "incremental": {
3297
+ "description": "Skip unchanged files using stored checksums from last push",
3298
+ "name": "incremental",
3299
+ "allowNo": false,
3300
+ "type": "boolean"
3301
+ },
3302
+ "change-detail": {
3303
+ "description": "Write a detailed per-record change report (primary keys + field diffs) to a file",
3304
+ "name": "change-detail",
3305
+ "allowNo": false,
3306
+ "type": "boolean"
3423
3307
  }
3424
3308
  },
3425
3309
  "hasDynamicHelp": false,
3426
3310
  "hiddenAliases": [],
3427
- "id": "test:suite",
3311
+ "id": "sync:push",
3428
3312
  "pluginAlias": "@memberjunction/cli",
3429
3313
  "pluginName": "@memberjunction/cli",
3430
3314
  "pluginType": "core",
3431
3315
  "strict": true,
3432
3316
  "enableJsonFlag": false,
3317
+ "Usage": {
3318
+ "domain": "sync",
3319
+ "command": "sync:push",
3320
+ "summary": "Push local metadata files to the database (upsert).",
3321
+ "description": "Reads entity directories under --dir and creates/updates matching records. Runs validation first unless --no-validate.",
3322
+ "flags": [
3323
+ {
3324
+ "name": "--dir",
3325
+ "type": "string",
3326
+ "description": "Entity directory to push"
3327
+ },
3328
+ {
3329
+ "name": "--dry-run",
3330
+ "type": "boolean",
3331
+ "description": "Report what would change without writing"
3332
+ },
3333
+ {
3334
+ "name": "--ci",
3335
+ "type": "boolean",
3336
+ "description": "No prompts; non-zero exit on error"
3337
+ },
3338
+ {
3339
+ "name": "--no-validate",
3340
+ "type": "boolean",
3341
+ "description": "Skip pre-push validation"
3342
+ },
3343
+ {
3344
+ "name": "--incremental",
3345
+ "type": "boolean",
3346
+ "description": "Skip unchanged files using stored checksums"
3347
+ },
3348
+ {
3349
+ "name": "--format",
3350
+ "type": "text|json|md",
3351
+ "description": "Output format (json for machine-readable result)"
3352
+ }
3353
+ ],
3354
+ "examples": [
3355
+ "mj sync push --dir=ai-agents",
3356
+ "mj sync push --ci --format=json"
3357
+ ],
3358
+ "runtime": {
3359
+ "class": "variable",
3360
+ "typicalSeconds": 20,
3361
+ "note": "scales with number of records in --dir"
3362
+ }
3363
+ },
3433
3364
  "isESM": true,
3434
3365
  "relativePath": [
3435
3366
  "dist",
3436
3367
  "commands",
3437
- "test",
3438
- "suite.js"
3368
+ "sync",
3369
+ "push.js"
3439
3370
  ]
3440
3371
  },
3441
- "test:validate": {
3372
+ "sync:status": {
3442
3373
  "aliases": [],
3443
- "args": {
3444
- "testId": {
3445
- "description": "Test ID to validate",
3446
- "name": "testId",
3447
- "required": false
3448
- }
3449
- },
3450
- "description": "Validate test definitions without executing",
3374
+ "args": {},
3375
+ "description": "Show status of local files vs database",
3451
3376
  "examples": [
3452
- "<%= config.bin %> <%= command.id %> <test-id>",
3453
- "<%= config.bin %> <%= command.id %> --all",
3454
- "<%= config.bin %> <%= command.id %> --type=agent-eval",
3455
- "<%= config.bin %> <%= command.id %> --all --save-report",
3456
- "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
3377
+ "<%= config.bin %> <%= command.id %>",
3378
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3379
+ "<%= config.bin %> <%= command.id %> --verbose"
3457
3380
  ],
3458
3381
  "flags": {
3459
- "all": {
3460
- "char": "a",
3461
- "description": "Validate all tests",
3462
- "name": "all",
3463
- "allowNo": false,
3464
- "type": "boolean"
3465
- },
3466
- "type": {
3467
- "char": "t",
3468
- "description": "Validate tests by type",
3469
- "name": "type",
3382
+ "dir": {
3383
+ "description": "Specific entity directory to check status",
3384
+ "name": "dir",
3470
3385
  "hasDynamicHelp": false,
3471
3386
  "multiple": false,
3472
3387
  "type": "option"
3473
3388
  },
3474
- "save-report": {
3475
- "description": "Save validation report to file",
3476
- "name": "save-report",
3389
+ "verbose": {
3390
+ "char": "v",
3391
+ "description": "Show detailed field-level differences",
3392
+ "name": "verbose",
3477
3393
  "allowNo": false,
3478
3394
  "type": "boolean"
3479
3395
  },
3480
- "format": {
3481
- "char": "f",
3482
- "description": "Output format",
3483
- "name": "format",
3484
- "default": "console",
3396
+ "include": {
3397
+ "description": "Only process these directories (comma-separated, supports patterns)",
3398
+ "name": "include",
3485
3399
  "hasDynamicHelp": false,
3486
3400
  "multiple": false,
3487
- "options": [
3488
- "console",
3489
- "json",
3490
- "markdown"
3491
- ],
3492
3401
  "type": "option"
3493
3402
  },
3494
- "output": {
3495
- "char": "o",
3496
- "description": "Output file path",
3497
- "name": "output",
3403
+ "exclude": {
3404
+ "description": "Skip these directories (comma-separated, supports patterns)",
3405
+ "name": "exclude",
3498
3406
  "hasDynamicHelp": false,
3499
3407
  "multiple": false,
3500
3408
  "type": "option"
3501
- },
3502
- "verbose": {
3503
- "char": "v",
3504
- "description": "Show detailed information",
3505
- "name": "verbose",
3506
- "allowNo": false,
3507
- "type": "boolean"
3508
3409
  }
3509
3410
  },
3510
3411
  "hasDynamicHelp": false,
3511
3412
  "hiddenAliases": [],
3512
- "id": "test:validate",
3413
+ "id": "sync:status",
3513
3414
  "pluginAlias": "@memberjunction/cli",
3514
3415
  "pluginName": "@memberjunction/cli",
3515
3416
  "pluginType": "core",
@@ -3519,64 +3420,32 @@
3519
3420
  "relativePath": [
3520
3421
  "dist",
3521
3422
  "commands",
3522
- "test",
3523
- "validate.js"
3423
+ "sync",
3424
+ "status.js"
3524
3425
  ]
3525
3426
  },
3526
- "sync:file-reset": {
3427
+ "sync:usage": {
3527
3428
  "aliases": [],
3528
3429
  "args": {},
3529
- "description": "Reset file metadata sections",
3530
- "examples": [
3531
- "<%= config.bin %> <%= command.id %>",
3532
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3533
- "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
3534
- "<%= config.bin %> <%= command.id %> --all"
3535
- ],
3430
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
3536
3431
  "flags": {
3537
- "dir": {
3538
- "description": "Specific entity directory to reset",
3539
- "name": "dir",
3540
- "hasDynamicHelp": false,
3541
- "multiple": false,
3542
- "type": "option"
3543
- },
3544
- "sections": {
3545
- "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
3546
- "name": "sections",
3432
+ "format": {
3433
+ "description": "Output format",
3434
+ "name": "format",
3435
+ "default": "text",
3547
3436
  "hasDynamicHelp": false,
3548
3437
  "multiple": false,
3438
+ "options": [
3439
+ "text",
3440
+ "json",
3441
+ "md"
3442
+ ],
3549
3443
  "type": "option"
3550
- },
3551
- "all": {
3552
- "description": "Reset all metadata sections",
3553
- "name": "all",
3554
- "allowNo": false,
3555
- "type": "boolean"
3556
- },
3557
- "dry-run": {
3558
- "description": "Show what would be reset without actually resetting",
3559
- "name": "dry-run",
3560
- "allowNo": false,
3561
- "type": "boolean"
3562
- },
3563
- "force": {
3564
- "description": "Skip confirmation prompts",
3565
- "name": "force",
3566
- "allowNo": false,
3567
- "type": "boolean"
3568
- },
3569
- "verbose": {
3570
- "char": "v",
3571
- "description": "Show detailed output",
3572
- "name": "verbose",
3573
- "allowNo": false,
3574
- "type": "boolean"
3575
3444
  }
3576
3445
  },
3577
3446
  "hasDynamicHelp": false,
3578
3447
  "hiddenAliases": [],
3579
- "id": "sync:file-reset",
3448
+ "id": "sync:usage",
3580
3449
  "pluginAlias": "@memberjunction/cli",
3581
3450
  "pluginName": "@memberjunction/cli",
3582
3451
  "pluginType": "core",
@@ -3587,20 +3456,51 @@
3587
3456
  "dist",
3588
3457
  "commands",
3589
3458
  "sync",
3590
- "file-reset.js"
3459
+ "usage.js"
3591
3460
  ]
3592
3461
  },
3593
- "sync:init": {
3462
+ "sync:validate": {
3594
3463
  "aliases": [],
3595
3464
  "args": {},
3596
- "description": "Initialize a directory for metadata synchronization",
3465
+ "description": "Validate metadata files",
3597
3466
  "examples": [
3598
- "<%= config.bin %> <%= command.id %>"
3467
+ "<%= config.bin %> <%= command.id %>",
3468
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3469
+ "<%= config.bin %> <%= command.id %> --save-report",
3470
+ "<%= config.bin %> <%= command.id %> --verbose"
3599
3471
  ],
3600
- "flags": {},
3472
+ "flags": {
3473
+ "dir": {
3474
+ "description": "Specific entity directory to validate",
3475
+ "name": "dir",
3476
+ "hasDynamicHelp": false,
3477
+ "multiple": false,
3478
+ "type": "option"
3479
+ },
3480
+ "verbose": {
3481
+ "char": "v",
3482
+ "description": "Show detailed validation output",
3483
+ "name": "verbose",
3484
+ "allowNo": false,
3485
+ "type": "boolean"
3486
+ },
3487
+ "save-report": {
3488
+ "description": "Save validation report as markdown file",
3489
+ "name": "save-report",
3490
+ "allowNo": false,
3491
+ "type": "boolean"
3492
+ },
3493
+ "output": {
3494
+ "description": "Output file path for validation report (default: validation-report.md)",
3495
+ "name": "output",
3496
+ "hasDynamicHelp": false,
3497
+ "multiple": false,
3498
+ "type": "option"
3499
+ }
3500
+ },
3601
3501
  "hasDynamicHelp": false,
3602
3502
  "hiddenAliases": [],
3603
- "id": "sync:init",
3503
+ "id": "sync:validate",
3604
3504
  "pluginAlias": "@memberjunction/cli",
3605
3505
  "pluginName": "@memberjunction/cli",
3606
3506
  "pluginType": "core",
@@ -3611,147 +3511,156 @@
3611
3511
  "dist",
3612
3512
  "commands",
3613
3513
  "sync",
3614
- "init.js"
3514
+ "validate.js"
3615
3515
  ]
3616
3516
  },
3617
- "sync:pull": {
3517
+ "sync:watch": {
3618
3518
  "aliases": [],
3619
3519
  "args": {},
3620
- "description": "Pull metadata from database to local files",
3520
+ "description": "Watch for file changes and sync automatically",
3621
3521
  "examples": [
3622
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
3623
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
3624
- "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
3522
+ "<%= config.bin %> <%= command.id %>",
3523
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3524
+ "<%= config.bin %> <%= command.id %> --debounce=1000",
3525
+ "<%= config.bin %> <%= command.id %> --no-validate"
3625
3526
  ],
3626
3527
  "flags": {
3627
- "format": {
3628
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3629
- "name": "format",
3630
- "default": "text",
3528
+ "dir": {
3529
+ "description": "Specific entity directory to watch",
3530
+ "name": "dir",
3531
+ "hasDynamicHelp": false,
3532
+ "multiple": false,
3533
+ "type": "option"
3534
+ },
3535
+ "debounce": {
3536
+ "description": "Debounce delay in milliseconds (default: 500)",
3537
+ "name": "debounce",
3631
3538
  "hasDynamicHelp": false,
3632
3539
  "multiple": false,
3633
- "options": [
3634
- "text",
3635
- "json",
3636
- "md"
3637
- ],
3638
3540
  "type": "option"
3639
3541
  },
3542
+ "no-validate": {
3543
+ "description": "Skip validation before sync",
3544
+ "name": "no-validate",
3545
+ "allowNo": false,
3546
+ "type": "boolean"
3547
+ },
3640
3548
  "verbose": {
3641
3549
  "char": "v",
3642
3550
  "description": "Show detailed output",
3643
3551
  "name": "verbose",
3644
3552
  "allowNo": false,
3645
3553
  "type": "boolean"
3554
+ }
3555
+ },
3556
+ "hasDynamicHelp": false,
3557
+ "hiddenAliases": [],
3558
+ "id": "sync:watch",
3559
+ "pluginAlias": "@memberjunction/cli",
3560
+ "pluginName": "@memberjunction/cli",
3561
+ "pluginType": "core",
3562
+ "strict": true,
3563
+ "enableJsonFlag": false,
3564
+ "isESM": true,
3565
+ "relativePath": [
3566
+ "dist",
3567
+ "commands",
3568
+ "sync",
3569
+ "watch.js"
3570
+ ]
3571
+ },
3572
+ "test:compare": {
3573
+ "aliases": [],
3574
+ "args": {
3575
+ "runId1": {
3576
+ "description": "First test run ID to compare",
3577
+ "name": "runId1",
3578
+ "required": false
3646
3579
  },
3647
- "no-banner": {
3648
- "description": "Suppress the startup banner and runtime advisory",
3649
- "name": "no-banner",
3650
- "allowNo": false,
3651
- "type": "boolean"
3652
- },
3653
- "entity": {
3654
- "description": "Entity name to pull",
3655
- "name": "entity",
3656
- "required": true,
3657
- "hasDynamicHelp": false,
3658
- "multiple": false,
3659
- "type": "option"
3660
- },
3661
- "filter": {
3662
- "description": "Additional filter for pulling specific records",
3663
- "name": "filter",
3580
+ "runId2": {
3581
+ "description": "Second test run ID to compare",
3582
+ "name": "runId2",
3583
+ "required": false
3584
+ }
3585
+ },
3586
+ "description": "Compare test runs for regression detection",
3587
+ "examples": [
3588
+ "<%= config.bin %> <%= command.id %>",
3589
+ "<%= config.bin %> <%= command.id %> --latest",
3590
+ "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
3591
+ "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
3592
+ "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
3593
+ "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
3594
+ "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
3595
+ ],
3596
+ "flags": {
3597
+ "version": {
3598
+ "char": "v",
3599
+ "description": "Compare runs by version",
3600
+ "name": "version",
3664
3601
  "hasDynamicHelp": false,
3665
- "multiple": false,
3602
+ "multiple": true,
3666
3603
  "type": "option"
3667
3604
  },
3668
- "dry-run": {
3669
- "description": "Show what would be pulled without actually pulling",
3670
- "name": "dry-run",
3671
- "allowNo": false,
3672
- "type": "boolean"
3673
- },
3674
- "multi-file": {
3675
- "description": "Create a single file with multiple records (provide filename)",
3676
- "name": "multi-file",
3605
+ "commit": {
3606
+ "char": "c",
3607
+ "description": "Compare runs by git commit",
3608
+ "name": "commit",
3677
3609
  "hasDynamicHelp": false,
3678
- "multiple": false,
3610
+ "multiple": true,
3679
3611
  "type": "option"
3680
3612
  },
3681
- "no-validate": {
3682
- "description": "Skip validation before pull",
3683
- "name": "no-validate",
3684
- "allowNo": false,
3685
- "type": "boolean"
3686
- },
3687
- "update-existing": {
3688
- "description": "Update existing records during pull",
3689
- "name": "update-existing",
3690
- "allowNo": false,
3691
- "type": "boolean"
3692
- },
3693
- "create-new": {
3694
- "description": "Create new files for records not found locally",
3695
- "name": "create-new",
3613
+ "diff-only": {
3614
+ "description": "Show only differences",
3615
+ "name": "diff-only",
3696
3616
  "allowNo": false,
3697
3617
  "type": "boolean"
3698
3618
  },
3699
- "backup-before-update": {
3700
- "description": "Create backups before updating files",
3701
- "name": "backup-before-update",
3619
+ "latest": {
3620
+ "char": "l",
3621
+ "description": "Compare the two most recent completed suite runs",
3622
+ "name": "latest",
3702
3623
  "allowNo": false,
3703
3624
  "type": "boolean"
3704
3625
  },
3705
- "merge-strategy": {
3706
- "description": "Merge strategy for updates",
3707
- "name": "merge-strategy",
3708
- "default": "merge",
3709
- "hasDynamicHelp": false,
3710
- "multiple": false,
3711
- "options": [
3712
- "merge",
3713
- "overwrite",
3714
- "skip"
3715
- ],
3716
- "type": "option"
3717
- },
3718
- "backup-directory": {
3719
- "description": "Custom backup directory (default: .backups)",
3720
- "name": "backup-directory",
3721
- "hasDynamicHelp": false,
3722
- "multiple": false,
3723
- "type": "option"
3724
- },
3725
- "preserve-fields": {
3726
- "description": "Comma-separated list of fields to preserve during updates",
3727
- "name": "preserve-fields",
3626
+ "from-json": {
3627
+ "description": "Compare two results.json files directly (no DB). Pass twice: --from-json PREV --from-json CURR",
3628
+ "name": "from-json",
3728
3629
  "hasDynamicHelp": false,
3729
3630
  "multiple": true,
3730
3631
  "type": "option"
3731
3632
  },
3732
- "exclude-fields": {
3733
- "description": "Comma-separated list of fields to exclude from pull",
3734
- "name": "exclude-fields",
3633
+ "format": {
3634
+ "char": "f",
3635
+ "description": "Output format",
3636
+ "name": "format",
3637
+ "default": "console",
3735
3638
  "hasDynamicHelp": false,
3736
- "multiple": true,
3639
+ "multiple": false,
3640
+ "options": [
3641
+ "console",
3642
+ "json",
3643
+ "markdown"
3644
+ ],
3737
3645
  "type": "option"
3738
3646
  },
3739
- "target-dir": {
3740
- "description": "Specific target directory (overrides auto-discovery)",
3741
- "name": "target-dir",
3647
+ "output": {
3648
+ "char": "o",
3649
+ "description": "Output file path",
3650
+ "name": "output",
3742
3651
  "hasDynamicHelp": false,
3743
3652
  "multiple": false,
3744
3653
  "type": "option"
3745
3654
  },
3746
- "incremental": {
3747
- "description": "Only pull records updated since last successful pull",
3748
- "name": "incremental",
3655
+ "verbose": {
3656
+ "description": "Show detailed information",
3657
+ "name": "verbose",
3749
3658
  "allowNo": false,
3750
3659
  "type": "boolean"
3751
3660
  },
3752
- "since": {
3753
- "description": "Only pull records updated after this ISO 8601 timestamp",
3754
- "name": "since",
3661
+ "tag": {
3662
+ "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.",
3663
+ "name": "tag",
3755
3664
  "hasDynamicHelp": false,
3756
3665
  "multiple": false,
3757
3666
  "type": "option"
@@ -3759,262 +3668,311 @@
3759
3668
  },
3760
3669
  "hasDynamicHelp": false,
3761
3670
  "hiddenAliases": [],
3762
- "id": "sync:pull",
3671
+ "id": "test:compare",
3763
3672
  "pluginAlias": "@memberjunction/cli",
3764
3673
  "pluginName": "@memberjunction/cli",
3765
3674
  "pluginType": "core",
3766
3675
  "strict": true,
3767
3676
  "enableJsonFlag": false,
3768
- "Usage": {
3769
- "domain": "sync",
3770
- "command": "sync:pull",
3771
- "summary": "Pull database records into local metadata files.",
3772
- "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
3773
- "flags": [
3774
- {
3775
- "name": "--entity",
3776
- "type": "string",
3777
- "description": "Entity name to pull (required)"
3778
- },
3779
- {
3780
- "name": "--filter",
3781
- "type": "string",
3782
- "description": "Extra SQL filter for which records to pull"
3783
- },
3784
- {
3785
- "name": "--merge-strategy",
3786
- "type": "merge|overwrite|skip",
3787
- "description": "How to reconcile existing files"
3788
- },
3789
- {
3790
- "name": "--dry-run",
3791
- "type": "boolean",
3792
- "description": "Report what would be pulled without writing"
3793
- },
3794
- {
3795
- "name": "--format",
3796
- "type": "text|json|md",
3797
- "description": "Output format (json for machine-readable result)"
3798
- }
3799
- ],
3800
- "examples": [
3801
- "mj sync pull --entity=\"MJ: AI Prompts\"",
3802
- "mj sync pull --entity=\"Actions\" --format=json"
3803
- ],
3804
- "runtime": {
3805
- "class": "variable",
3806
- "typicalSeconds": 15,
3807
- "note": "scales with number of records matched for --entity"
3808
- }
3809
- },
3810
3677
  "isESM": true,
3811
3678
  "relativePath": [
3812
3679
  "dist",
3813
3680
  "commands",
3814
- "sync",
3815
- "pull.js"
3681
+ "test",
3682
+ "compare.js"
3816
3683
  ]
3817
3684
  },
3818
- "sync:push": {
3685
+ "test:history": {
3819
3686
  "aliases": [],
3820
3687
  "args": {},
3821
- "description": "Push local file changes to the database",
3688
+ "description": "View test execution history",
3822
3689
  "examples": [
3823
3690
  "<%= config.bin %> <%= command.id %>",
3824
- "<%= config.bin %> <%= command.id %> --dry-run",
3825
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3826
- "<%= config.bin %> <%= command.id %> --ci --format=json"
3691
+ "<%= config.bin %> <%= command.id %> --test=<test-id>",
3692
+ "<%= config.bin %> <%= command.id %> --suite=<suite-id>",
3693
+ "<%= config.bin %> <%= command.id %> --since=\"2024-01-01\"",
3694
+ "<%= config.bin %> <%= command.id %> --limit=50"
3827
3695
  ],
3828
3696
  "flags": {
3697
+ "test": {
3698
+ "char": "t",
3699
+ "description": "Filter by test ID",
3700
+ "name": "test",
3701
+ "hasDynamicHelp": false,
3702
+ "multiple": false,
3703
+ "type": "option"
3704
+ },
3705
+ "recent": {
3706
+ "char": "r",
3707
+ "description": "Number of recent runs to show",
3708
+ "name": "recent",
3709
+ "hasDynamicHelp": false,
3710
+ "multiple": false,
3711
+ "type": "option"
3712
+ },
3713
+ "from": {
3714
+ "description": "Show history from date (YYYY-MM-DD)",
3715
+ "name": "from",
3716
+ "hasDynamicHelp": false,
3717
+ "multiple": false,
3718
+ "type": "option"
3719
+ },
3720
+ "status": {
3721
+ "char": "s",
3722
+ "description": "Filter by status",
3723
+ "name": "status",
3724
+ "hasDynamicHelp": false,
3725
+ "multiple": false,
3726
+ "type": "option"
3727
+ },
3829
3728
  "format": {
3830
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3729
+ "char": "f",
3730
+ "description": "Output format",
3831
3731
  "name": "format",
3832
- "default": "text",
3732
+ "default": "console",
3833
3733
  "hasDynamicHelp": false,
3834
3734
  "multiple": false,
3835
3735
  "options": [
3836
- "text",
3736
+ "console",
3837
3737
  "json",
3838
- "md"
3738
+ "markdown"
3839
3739
  ],
3840
3740
  "type": "option"
3841
3741
  },
3842
- "verbose": {
3843
- "char": "v",
3844
- "description": "Show detailed output",
3845
- "name": "verbose",
3846
- "allowNo": false,
3847
- "type": "boolean"
3848
- },
3849
- "no-banner": {
3850
- "description": "Suppress the startup banner and runtime advisory",
3851
- "name": "no-banner",
3852
- "allowNo": false,
3853
- "type": "boolean"
3854
- },
3855
- "dir": {
3856
- "description": "Specific entity directory to push",
3857
- "name": "dir",
3742
+ "output": {
3743
+ "char": "o",
3744
+ "description": "Output file path",
3745
+ "name": "output",
3858
3746
  "hasDynamicHelp": false,
3859
3747
  "multiple": false,
3860
3748
  "type": "option"
3861
3749
  },
3862
- "dry-run": {
3863
- "description": "Show what would be pushed without actually pushing",
3864
- "name": "dry-run",
3750
+ "verbose": {
3751
+ "char": "v",
3752
+ "description": "Show detailed information",
3753
+ "name": "verbose",
3865
3754
  "allowNo": false,
3866
3755
  "type": "boolean"
3867
- },
3868
- "ci": {
3869
- "description": "CI mode - no prompts, fail on issues",
3870
- "name": "ci",
3756
+ }
3757
+ },
3758
+ "hasDynamicHelp": false,
3759
+ "hiddenAliases": [],
3760
+ "id": "test:history",
3761
+ "pluginAlias": "@memberjunction/cli",
3762
+ "pluginName": "@memberjunction/cli",
3763
+ "pluginType": "core",
3764
+ "strict": true,
3765
+ "enableJsonFlag": false,
3766
+ "isESM": true,
3767
+ "relativePath": [
3768
+ "dist",
3769
+ "commands",
3770
+ "test",
3771
+ "history.js"
3772
+ ]
3773
+ },
3774
+ "test": {
3775
+ "aliases": [],
3776
+ "args": {},
3777
+ "description": "MemberJunction Testing Framework - Execute and manage tests",
3778
+ "examples": [
3779
+ "<%= config.bin %> <%= command.id %> run <test-id>",
3780
+ "<%= config.bin %> <%= command.id %> run --name=\"Active Members Count\"",
3781
+ "<%= config.bin %> <%= command.id %> suite <suite-id>",
3782
+ "<%= config.bin %> <%= command.id %> list",
3783
+ "<%= config.bin %> <%= command.id %> list --suites",
3784
+ "<%= config.bin %> <%= command.id %> validate --all"
3785
+ ],
3786
+ "flags": {},
3787
+ "hasDynamicHelp": false,
3788
+ "hiddenAliases": [],
3789
+ "id": "test",
3790
+ "pluginAlias": "@memberjunction/cli",
3791
+ "pluginName": "@memberjunction/cli",
3792
+ "pluginType": "core",
3793
+ "strict": true,
3794
+ "enableJsonFlag": false,
3795
+ "isESM": true,
3796
+ "relativePath": [
3797
+ "dist",
3798
+ "commands",
3799
+ "test",
3800
+ "index.js"
3801
+ ]
3802
+ },
3803
+ "test:list": {
3804
+ "aliases": [],
3805
+ "args": {},
3806
+ "description": "List available tests, suites, and types",
3807
+ "examples": [
3808
+ "<%= config.bin %> <%= command.id %>",
3809
+ "<%= config.bin %> <%= command.id %> --suites",
3810
+ "<%= config.bin %> <%= command.id %> --types",
3811
+ "<%= config.bin %> <%= command.id %> --type=agent-eval",
3812
+ "<%= config.bin %> <%= command.id %> --tag=smoke",
3813
+ "<%= config.bin %> <%= command.id %> --status=active --verbose"
3814
+ ],
3815
+ "flags": {
3816
+ "suites": {
3817
+ "description": "List test suites instead of tests",
3818
+ "name": "suites",
3871
3819
  "allowNo": false,
3872
3820
  "type": "boolean"
3873
3821
  },
3874
- "no-validate": {
3875
- "description": "Skip validation before push",
3876
- "name": "no-validate",
3822
+ "types": {
3823
+ "description": "List test types",
3824
+ "name": "types",
3877
3825
  "allowNo": false,
3878
3826
  "type": "boolean"
3879
3827
  },
3880
- "delete-db-only": {
3881
- "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
3882
- "name": "delete-db-only",
3883
- "allowNo": false,
3884
- "type": "boolean"
3828
+ "type": {
3829
+ "char": "t",
3830
+ "description": "Filter by test type",
3831
+ "name": "type",
3832
+ "hasDynamicHelp": false,
3833
+ "multiple": false,
3834
+ "type": "option"
3885
3835
  },
3886
- "parallel-batch-size": {
3887
- "description": "Number of records to process in parallel (default: 10)",
3888
- "name": "parallel-batch-size",
3889
- "default": 10,
3836
+ "tag": {
3837
+ "description": "Filter by tag",
3838
+ "name": "tag",
3890
3839
  "hasDynamicHelp": false,
3891
3840
  "multiple": false,
3892
3841
  "type": "option"
3893
3842
  },
3894
- "include": {
3895
- "description": "Only process these directories (comma-separated, supports patterns)",
3896
- "name": "include",
3843
+ "status": {
3844
+ "char": "s",
3845
+ "description": "Filter by status",
3846
+ "name": "status",
3897
3847
  "hasDynamicHelp": false,
3898
3848
  "multiple": false,
3899
3849
  "type": "option"
3900
3850
  },
3901
- "exclude": {
3902
- "description": "Skip these directories (comma-separated, supports patterns)",
3903
- "name": "exclude",
3851
+ "format": {
3852
+ "char": "f",
3853
+ "description": "Output format",
3854
+ "name": "format",
3855
+ "default": "console",
3904
3856
  "hasDynamicHelp": false,
3905
3857
  "multiple": false,
3858
+ "options": [
3859
+ "console",
3860
+ "json",
3861
+ "markdown"
3862
+ ],
3906
3863
  "type": "option"
3907
3864
  },
3908
- "incremental": {
3909
- "description": "Skip unchanged files using stored checksums from last push",
3910
- "name": "incremental",
3911
- "allowNo": false,
3912
- "type": "boolean"
3865
+ "output": {
3866
+ "char": "o",
3867
+ "description": "Output file path",
3868
+ "name": "output",
3869
+ "hasDynamicHelp": false,
3870
+ "multiple": false,
3871
+ "type": "option"
3913
3872
  },
3914
- "change-detail": {
3915
- "description": "Write a detailed per-record change report (primary keys + field diffs) to a file",
3916
- "name": "change-detail",
3873
+ "verbose": {
3874
+ "char": "v",
3875
+ "description": "Show detailed information",
3876
+ "name": "verbose",
3917
3877
  "allowNo": false,
3918
3878
  "type": "boolean"
3919
3879
  }
3920
3880
  },
3921
3881
  "hasDynamicHelp": false,
3922
3882
  "hiddenAliases": [],
3923
- "id": "sync:push",
3883
+ "id": "test:list",
3924
3884
  "pluginAlias": "@memberjunction/cli",
3925
3885
  "pluginName": "@memberjunction/cli",
3926
3886
  "pluginType": "core",
3927
3887
  "strict": true,
3928
3888
  "enableJsonFlag": false,
3929
- "Usage": {
3930
- "domain": "sync",
3931
- "command": "sync:push",
3932
- "summary": "Push local metadata files to the database (upsert).",
3933
- "description": "Reads entity directories under --dir and creates/updates matching records. Runs validation first unless --no-validate.",
3934
- "flags": [
3935
- {
3936
- "name": "--dir",
3937
- "type": "string",
3938
- "description": "Entity directory to push"
3939
- },
3940
- {
3941
- "name": "--dry-run",
3942
- "type": "boolean",
3943
- "description": "Report what would change without writing"
3944
- },
3945
- {
3946
- "name": "--ci",
3947
- "type": "boolean",
3948
- "description": "No prompts; non-zero exit on error"
3949
- },
3950
- {
3951
- "name": "--no-validate",
3952
- "type": "boolean",
3953
- "description": "Skip pre-push validation"
3954
- },
3955
- {
3956
- "name": "--incremental",
3957
- "type": "boolean",
3958
- "description": "Skip unchanged files using stored checksums"
3959
- },
3960
- {
3961
- "name": "--format",
3962
- "type": "text|json|md",
3963
- "description": "Output format (json for machine-readable result)"
3964
- }
3965
- ],
3966
- "examples": [
3967
- "mj sync push --dir=ai-agents",
3968
- "mj sync push --ci --format=json"
3969
- ],
3970
- "runtime": {
3971
- "class": "variable",
3972
- "typicalSeconds": 20,
3973
- "note": "scales with number of records in --dir"
3974
- }
3975
- },
3976
3889
  "isESM": true,
3977
3890
  "relativePath": [
3978
3891
  "dist",
3979
3892
  "commands",
3980
- "sync",
3981
- "push.js"
3893
+ "test",
3894
+ "list.js"
3982
3895
  ]
3983
3896
  },
3984
- "sync:status": {
3897
+ "test:run": {
3985
3898
  "aliases": [],
3986
- "args": {},
3987
- "description": "Show status of local files vs database",
3899
+ "args": {
3900
+ "testId": {
3901
+ "description": "Test ID to execute",
3902
+ "name": "testId",
3903
+ "required": false
3904
+ }
3905
+ },
3906
+ "description": "Execute a single test by ID or name",
3988
3907
  "examples": [
3989
- "<%= config.bin %> <%= command.id %>",
3990
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3991
- "<%= config.bin %> <%= command.id %> --verbose"
3908
+ "<%= config.bin %> <%= command.id %> <test-id>",
3909
+ "<%= config.bin %> <%= command.id %> --name=\"Active Members Count\"",
3910
+ "<%= config.bin %> <%= command.id %> <test-id> --environment=staging",
3911
+ "<%= config.bin %> <%= command.id %> <test-id> --format=json --output=results.json",
3912
+ "<%= config.bin %> <%= command.id %> <test-id> --dry-run"
3992
3913
  ],
3993
3914
  "flags": {
3994
- "dir": {
3995
- "description": "Specific entity directory to check status",
3996
- "name": "dir",
3915
+ "name": {
3916
+ "char": "n",
3917
+ "description": "Test name to execute",
3918
+ "name": "name",
3919
+ "hasDynamicHelp": false,
3920
+ "multiple": false,
3921
+ "type": "option"
3922
+ },
3923
+ "environment": {
3924
+ "char": "e",
3925
+ "description": "Environment context (dev, staging, prod)",
3926
+ "name": "environment",
3927
+ "hasDynamicHelp": false,
3928
+ "multiple": false,
3929
+ "type": "option"
3930
+ },
3931
+ "format": {
3932
+ "char": "f",
3933
+ "description": "Output format",
3934
+ "name": "format",
3935
+ "default": "console",
3936
+ "hasDynamicHelp": false,
3937
+ "multiple": false,
3938
+ "options": [
3939
+ "console",
3940
+ "json",
3941
+ "markdown"
3942
+ ],
3943
+ "type": "option"
3944
+ },
3945
+ "output": {
3946
+ "char": "o",
3947
+ "description": "Output file path",
3948
+ "name": "output",
3997
3949
  "hasDynamicHelp": false,
3998
3950
  "multiple": false,
3999
3951
  "type": "option"
4000
3952
  },
3953
+ "dry-run": {
3954
+ "description": "Validate without executing",
3955
+ "name": "dry-run",
3956
+ "allowNo": false,
3957
+ "type": "boolean"
3958
+ },
4001
3959
  "verbose": {
4002
3960
  "char": "v",
4003
- "description": "Show detailed field-level differences",
3961
+ "description": "Show detailed execution information",
4004
3962
  "name": "verbose",
4005
3963
  "allowNo": false,
4006
3964
  "type": "boolean"
4007
3965
  },
4008
- "include": {
4009
- "description": "Only process these directories (comma-separated, supports patterns)",
4010
- "name": "include",
3966
+ "checks-module": {
3967
+ "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).",
3968
+ "name": "checks-module",
4011
3969
  "hasDynamicHelp": false,
4012
3970
  "multiple": false,
4013
3971
  "type": "option"
4014
3972
  },
4015
- "exclude": {
4016
- "description": "Skip these directories (comma-separated, supports patterns)",
4017
- "name": "exclude",
3973
+ "oracles-module": {
3974
+ "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.",
3975
+ "name": "oracles-module",
4018
3976
  "hasDynamicHelp": false,
4019
3977
  "multiple": false,
4020
3978
  "type": "option"
@@ -4022,7 +3980,7 @@
4022
3980
  },
4023
3981
  "hasDynamicHelp": false,
4024
3982
  "hiddenAliases": [],
4025
- "id": "sync:status",
3983
+ "id": "test:run",
4026
3984
  "pluginAlias": "@memberjunction/cli",
4027
3985
  "pluginName": "@memberjunction/cli",
4028
3986
  "pluginType": "core",
@@ -4032,79 +3990,105 @@
4032
3990
  "relativePath": [
4033
3991
  "dist",
4034
3992
  "commands",
4035
- "sync",
4036
- "status.js"
3993
+ "test",
3994
+ "run.js"
4037
3995
  ]
4038
3996
  },
4039
- "sync:usage": {
3997
+ "test:suite": {
4040
3998
  "aliases": [],
4041
- "args": {},
4042
- "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
3999
+ "args": {
4000
+ "suiteId": {
4001
+ "description": "Test suite ID to execute",
4002
+ "name": "suiteId",
4003
+ "required": false
4004
+ }
4005
+ },
4006
+ "description": "Execute a test suite",
4007
+ "examples": [
4008
+ "<%= config.bin %> <%= command.id %> <suite-id>",
4009
+ "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
4010
+ "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
4011
+ "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
4012
+ ],
4043
4013
  "flags": {
4014
+ "name": {
4015
+ "char": "n",
4016
+ "description": "Test suite name to execute",
4017
+ "name": "name",
4018
+ "hasDynamicHelp": false,
4019
+ "multiple": false,
4020
+ "type": "option"
4021
+ },
4044
4022
  "format": {
4023
+ "char": "f",
4045
4024
  "description": "Output format",
4046
4025
  "name": "format",
4047
- "default": "text",
4026
+ "default": "console",
4048
4027
  "hasDynamicHelp": false,
4049
4028
  "multiple": false,
4050
4029
  "options": [
4051
- "text",
4030
+ "console",
4052
4031
  "json",
4053
- "md"
4032
+ "markdown"
4054
4033
  ],
4055
4034
  "type": "option"
4056
- }
4057
- },
4058
- "hasDynamicHelp": false,
4059
- "hiddenAliases": [],
4060
- "id": "sync:usage",
4061
- "pluginAlias": "@memberjunction/cli",
4062
- "pluginName": "@memberjunction/cli",
4063
- "pluginType": "core",
4064
- "strict": true,
4065
- "enableJsonFlag": false,
4066
- "isESM": true,
4067
- "relativePath": [
4068
- "dist",
4069
- "commands",
4070
- "sync",
4071
- "usage.js"
4072
- ]
4073
- },
4074
- "sync:validate": {
4075
- "aliases": [],
4076
- "args": {},
4077
- "description": "Validate metadata files",
4078
- "examples": [
4079
- "<%= config.bin %> <%= command.id %>",
4080
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4081
- "<%= config.bin %> <%= command.id %> --save-report",
4082
- "<%= config.bin %> <%= command.id %> --verbose"
4083
- ],
4084
- "flags": {
4085
- "dir": {
4086
- "description": "Specific entity directory to validate",
4087
- "name": "dir",
4035
+ },
4036
+ "output": {
4037
+ "char": "o",
4038
+ "description": "Output file path",
4039
+ "name": "output",
4088
4040
  "hasDynamicHelp": false,
4089
4041
  "multiple": false,
4090
4042
  "type": "option"
4091
4043
  },
4092
4044
  "verbose": {
4093
4045
  "char": "v",
4094
- "description": "Show detailed validation output",
4046
+ "description": "Show detailed execution information",
4095
4047
  "name": "verbose",
4096
4048
  "allowNo": false,
4097
4049
  "type": "boolean"
4098
4050
  },
4099
- "save-report": {
4100
- "description": "Save validation report as markdown file",
4101
- "name": "save-report",
4051
+ "delay": {
4052
+ "char": "d",
4053
+ "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
4054
+ "name": "delay",
4055
+ "default": 0,
4056
+ "hasDynamicHelp": false,
4057
+ "multiple": false,
4058
+ "type": "option"
4059
+ },
4060
+ "parallel": {
4061
+ "char": "p",
4062
+ "description": "Run tests in parallel with shared browser sessions",
4063
+ "name": "parallel",
4102
4064
  "allowNo": false,
4103
4065
  "type": "boolean"
4104
4066
  },
4105
- "output": {
4106
- "description": "Output file path for validation report (default: validation-report.md)",
4107
- "name": "output",
4067
+ "max-parallel": {
4068
+ "description": "Maximum number of parallel workers (default 4)",
4069
+ "name": "max-parallel",
4070
+ "default": 4,
4071
+ "hasDynamicHelp": false,
4072
+ "multiple": false,
4073
+ "type": "option"
4074
+ },
4075
+ "flaky-check": {
4076
+ "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
4077
+ "name": "flaky-check",
4078
+ "hasDynamicHelp": false,
4079
+ "multiple": false,
4080
+ "type": "option"
4081
+ },
4082
+ "checks-module": {
4083
+ "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).",
4084
+ "name": "checks-module",
4085
+ "hasDynamicHelp": false,
4086
+ "multiple": false,
4087
+ "type": "option"
4088
+ },
4089
+ "oracles-module": {
4090
+ "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.",
4091
+ "name": "oracles-module",
4108
4092
  "hasDynamicHelp": false,
4109
4093
  "multiple": false,
4110
4094
  "type": "option"
@@ -4112,7 +4096,7 @@
4112
4096
  },
4113
4097
  "hasDynamicHelp": false,
4114
4098
  "hiddenAliases": [],
4115
- "id": "sync:validate",
4099
+ "id": "test:suite",
4116
4100
  "pluginAlias": "@memberjunction/cli",
4117
4101
  "pluginName": "@memberjunction/cli",
4118
4102
  "pluginType": "core",
@@ -4122,44 +4106,74 @@
4122
4106
  "relativePath": [
4123
4107
  "dist",
4124
4108
  "commands",
4125
- "sync",
4126
- "validate.js"
4109
+ "test",
4110
+ "suite.js"
4127
4111
  ]
4128
4112
  },
4129
- "sync:watch": {
4113
+ "test:validate": {
4130
4114
  "aliases": [],
4131
- "args": {},
4132
- "description": "Watch for file changes and sync automatically",
4115
+ "args": {
4116
+ "testId": {
4117
+ "description": "Test ID to validate",
4118
+ "name": "testId",
4119
+ "required": false
4120
+ }
4121
+ },
4122
+ "description": "Validate test definitions without executing",
4133
4123
  "examples": [
4134
- "<%= config.bin %> <%= command.id %>",
4135
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4136
- "<%= config.bin %> <%= command.id %> --debounce=1000",
4137
- "<%= config.bin %> <%= command.id %> --no-validate"
4124
+ "<%= config.bin %> <%= command.id %> <test-id>",
4125
+ "<%= config.bin %> <%= command.id %> --all",
4126
+ "<%= config.bin %> <%= command.id %> --type=agent-eval",
4127
+ "<%= config.bin %> <%= command.id %> --all --save-report",
4128
+ "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
4138
4129
  ],
4139
4130
  "flags": {
4140
- "dir": {
4141
- "description": "Specific entity directory to watch",
4142
- "name": "dir",
4131
+ "all": {
4132
+ "char": "a",
4133
+ "description": "Validate all tests",
4134
+ "name": "all",
4135
+ "allowNo": false,
4136
+ "type": "boolean"
4137
+ },
4138
+ "type": {
4139
+ "char": "t",
4140
+ "description": "Validate tests by type",
4141
+ "name": "type",
4143
4142
  "hasDynamicHelp": false,
4144
4143
  "multiple": false,
4145
4144
  "type": "option"
4146
4145
  },
4147
- "debounce": {
4148
- "description": "Debounce delay in milliseconds (default: 500)",
4149
- "name": "debounce",
4146
+ "save-report": {
4147
+ "description": "Save validation report to file",
4148
+ "name": "save-report",
4149
+ "allowNo": false,
4150
+ "type": "boolean"
4151
+ },
4152
+ "format": {
4153
+ "char": "f",
4154
+ "description": "Output format",
4155
+ "name": "format",
4156
+ "default": "console",
4150
4157
  "hasDynamicHelp": false,
4151
4158
  "multiple": false,
4159
+ "options": [
4160
+ "console",
4161
+ "json",
4162
+ "markdown"
4163
+ ],
4152
4164
  "type": "option"
4153
4165
  },
4154
- "no-validate": {
4155
- "description": "Skip validation before sync",
4156
- "name": "no-validate",
4157
- "allowNo": false,
4158
- "type": "boolean"
4166
+ "output": {
4167
+ "char": "o",
4168
+ "description": "Output file path",
4169
+ "name": "output",
4170
+ "hasDynamicHelp": false,
4171
+ "multiple": false,
4172
+ "type": "option"
4159
4173
  },
4160
4174
  "verbose": {
4161
4175
  "char": "v",
4162
- "description": "Show detailed output",
4176
+ "description": "Show detailed information",
4163
4177
  "name": "verbose",
4164
4178
  "allowNo": false,
4165
4179
  "type": "boolean"
@@ -4167,7 +4181,7 @@
4167
4181
  },
4168
4182
  "hasDynamicHelp": false,
4169
4183
  "hiddenAliases": [],
4170
- "id": "sync:watch",
4184
+ "id": "test:validate",
4171
4185
  "pluginAlias": "@memberjunction/cli",
4172
4186
  "pluginName": "@memberjunction/cli",
4173
4187
  "pluginType": "core",
@@ -4177,8 +4191,8 @@
4177
4191
  "relativePath": [
4178
4192
  "dist",
4179
4193
  "commands",
4180
- "sync",
4181
- "watch.js"
4194
+ "test",
4195
+ "validate.js"
4182
4196
  ]
4183
4197
  },
4184
4198
  "translate-sql": {
@@ -5466,5 +5480,5 @@
5466
5480
  ]
5467
5481
  }
5468
5482
  },
5469
- "version": "5.48.0"
5483
+ "version": "5.50.0"
5470
5484
  }