@memberjunction/cli 5.51.3 → 5.51.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/oclif.manifest.json +1237 -1237
  2. package/package.json +17 -17
@@ -390,67 +390,6 @@
390
390
  "upgrade.js"
391
391
  ]
392
392
  },
393
- "artifacts:reclassify": {
394
- "aliases": [],
395
- "args": {},
396
- "description": "Upgrade-recovery utility for v5.35 artifact unification. Re-evaluates rows whose TypeID is the deleted JSON fallback but whose actual content does not parse as JSON. Normally a no-op: the v5.35 backfill migration handles this automatically. This command is only relevant when the migration ran BEFORE the artifact-type metadata (Generic Text / Generic Binary) was pushed via `mj sync push`, in which case the migration prints a notice telling you to run this. Reports \"no candidates\" once everything is reconciled. Dry-run by default; --apply writes through Record Changes.",
397
- "examples": [
398
- "<%= config.bin %> <%= command.id %>",
399
- "<%= config.bin %> <%= command.id %> --apply --limit 50"
400
- ],
401
- "flags": {
402
- "conversation-id": {
403
- "description": "Scope to artifacts attached to the given conversation.",
404
- "name": "conversation-id",
405
- "hasDynamicHelp": false,
406
- "multiple": false,
407
- "type": "option"
408
- },
409
- "since": {
410
- "description": "Scope to artifacts created on/after this ISO date.",
411
- "name": "since",
412
- "hasDynamicHelp": false,
413
- "multiple": false,
414
- "type": "option"
415
- },
416
- "limit": {
417
- "description": "Maximum number of rows to inspect.",
418
- "name": "limit",
419
- "default": 100,
420
- "hasDynamicHelp": false,
421
- "multiple": false,
422
- "type": "option"
423
- },
424
- "apply": {
425
- "description": "Write changes. Without this flag, this command only reports what it would do.",
426
- "name": "apply",
427
- "allowNo": false,
428
- "type": "boolean"
429
- },
430
- "verbose": {
431
- "char": "v",
432
- "description": "Print every candidate row, not just the summary.",
433
- "name": "verbose",
434
- "allowNo": false,
435
- "type": "boolean"
436
- }
437
- },
438
- "hasDynamicHelp": false,
439
- "hiddenAliases": [],
440
- "id": "artifacts:reclassify",
441
- "pluginAlias": "@memberjunction/cli",
442
- "pluginName": "@memberjunction/cli",
443
- "pluginType": "core",
444
- "strict": true,
445
- "enableJsonFlag": false,
446
- "isESM": true,
447
- "relativePath": [
448
- "dist",
449
- "commands",
450
- "artifacts",
451
- "reclassify.js"
452
- ]
453
- },
454
393
  "baseline:build": {
455
394
  "aliases": [],
456
395
  "args": {},
@@ -789,6 +728,67 @@
789
728
  "roundtrip.js"
790
729
  ]
791
730
  },
731
+ "artifacts:reclassify": {
732
+ "aliases": [],
733
+ "args": {},
734
+ "description": "Upgrade-recovery utility for v5.35 artifact unification. Re-evaluates rows whose TypeID is the deleted JSON fallback but whose actual content does not parse as JSON. Normally a no-op: the v5.35 backfill migration handles this automatically. This command is only relevant when the migration ran BEFORE the artifact-type metadata (Generic Text / Generic Binary) was pushed via `mj sync push`, in which case the migration prints a notice telling you to run this. Reports \"no candidates\" once everything is reconciled. Dry-run by default; --apply writes through Record Changes.",
735
+ "examples": [
736
+ "<%= config.bin %> <%= command.id %>",
737
+ "<%= config.bin %> <%= command.id %> --apply --limit 50"
738
+ ],
739
+ "flags": {
740
+ "conversation-id": {
741
+ "description": "Scope to artifacts attached to the given conversation.",
742
+ "name": "conversation-id",
743
+ "hasDynamicHelp": false,
744
+ "multiple": false,
745
+ "type": "option"
746
+ },
747
+ "since": {
748
+ "description": "Scope to artifacts created on/after this ISO date.",
749
+ "name": "since",
750
+ "hasDynamicHelp": false,
751
+ "multiple": false,
752
+ "type": "option"
753
+ },
754
+ "limit": {
755
+ "description": "Maximum number of rows to inspect.",
756
+ "name": "limit",
757
+ "default": 100,
758
+ "hasDynamicHelp": false,
759
+ "multiple": false,
760
+ "type": "option"
761
+ },
762
+ "apply": {
763
+ "description": "Write changes. Without this flag, this command only reports what it would do.",
764
+ "name": "apply",
765
+ "allowNo": false,
766
+ "type": "boolean"
767
+ },
768
+ "verbose": {
769
+ "char": "v",
770
+ "description": "Print every candidate row, not just the summary.",
771
+ "name": "verbose",
772
+ "allowNo": false,
773
+ "type": "boolean"
774
+ }
775
+ },
776
+ "hasDynamicHelp": false,
777
+ "hiddenAliases": [],
778
+ "id": "artifacts:reclassify",
779
+ "pluginAlias": "@memberjunction/cli",
780
+ "pluginName": "@memberjunction/cli",
781
+ "pluginType": "core",
782
+ "strict": true,
783
+ "enableJsonFlag": false,
784
+ "isESM": true,
785
+ "relativePath": [
786
+ "dist",
787
+ "commands",
788
+ "artifacts",
789
+ "reclassify.js"
790
+ ]
791
+ },
792
792
  "bump": {
793
793
  "aliases": [],
794
794
  "args": {},
@@ -2911,106 +2911,60 @@
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"
2951
+ "force": {
2952
+ "description": "Skip confirmation prompts",
2953
+ "name": "force",
2954
+ "allowNo": false,
2955
+ "type": "boolean"
2996
2956
  },
2997
2957
  "verbose": {
2998
- "description": "Show detailed information",
2958
+ "char": "v",
2959
+ "description": "Show detailed output",
2999
2960
  "name": "verbose",
3000
2961
  "allowNo": false,
3001
2962
  "type": "boolean"
3002
- },
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
2963
  }
3010
2964
  },
3011
2965
  "hasDynamicHelp": false,
3012
2966
  "hiddenAliases": [],
3013
- "id": "test:compare",
2967
+ "id": "sync:file-reset",
3014
2968
  "pluginAlias": "@memberjunction/cli",
3015
2969
  "pluginName": "@memberjunction/cli",
3016
2970
  "pluginType": "core",
@@ -3020,115 +2974,21 @@
3020
2974
  "relativePath": [
3021
2975
  "dist",
3022
2976
  "commands",
3023
- "test",
3024
- "compare.js"
2977
+ "sync",
2978
+ "file-reset.js"
3025
2979
  ]
3026
2980
  },
3027
- "test:history": {
2981
+ "sync:init": {
3028
2982
  "aliases": [],
3029
2983
  "args": {},
3030
- "description": "View test execution history",
2984
+ "description": "Initialize a directory for metadata synchronization",
3031
2985
  "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
- "verbose": {
3093
- "char": "v",
3094
- "description": "Show detailed information",
3095
- "name": "verbose",
3096
- "allowNo": false,
3097
- "type": "boolean"
3098
- }
3099
- },
3100
- "hasDynamicHelp": false,
3101
- "hiddenAliases": [],
3102
- "id": "test:history",
3103
- "pluginAlias": "@memberjunction/cli",
3104
- "pluginName": "@memberjunction/cli",
3105
- "pluginType": "core",
3106
- "strict": true,
3107
- "enableJsonFlag": false,
3108
- "isESM": true,
3109
- "relativePath": [
3110
- "dist",
3111
- "commands",
3112
- "test",
3113
- "history.js"
3114
- ]
3115
- },
3116
- "test": {
3117
- "aliases": [],
3118
- "args": {},
3119
- "description": "MemberJunction Testing Framework - Execute and manage tests",
3120
- "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,392 +2998,419 @@
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",
3106
+ "backup-directory": {
3107
+ "description": "Custom backup directory (default: .backups)",
3108
+ "name": "backup-directory",
3211
3109
  "hasDynamicHelp": false,
3212
3110
  "multiple": false,
3213
3111
  "type": "option"
3214
3112
  },
3215
- "verbose": {
3216
- "char": "v",
3217
- "description": "Show detailed information",
3218
- "name": "verbose",
3113
+ "preserve-fields": {
3114
+ "description": "Comma-separated list of fields to preserve during updates",
3115
+ "name": "preserve-fields",
3116
+ "hasDynamicHelp": false,
3117
+ "multiple": true,
3118
+ "type": "option"
3119
+ },
3120
+ "exclude-fields": {
3121
+ "description": "Comma-separated list of fields to exclude from pull",
3122
+ "name": "exclude-fields",
3123
+ "hasDynamicHelp": false,
3124
+ "multiple": true,
3125
+ "type": "option"
3126
+ },
3127
+ "target-dir": {
3128
+ "description": "Specific target directory (overrides auto-discovery)",
3129
+ "name": "target-dir",
3130
+ "hasDynamicHelp": false,
3131
+ "multiple": false,
3132
+ "type": "option"
3133
+ },
3134
+ "incremental": {
3135
+ "description": "Only pull records updated since last successful pull",
3136
+ "name": "incremental",
3219
3137
  "allowNo": false,
3220
3138
  "type": "boolean"
3139
+ },
3140
+ "since": {
3141
+ "description": "Only pull records updated after this ISO 8601 timestamp",
3142
+ "name": "since",
3143
+ "hasDynamicHelp": false,
3144
+ "multiple": false,
3145
+ "type": "option"
3221
3146
  }
3222
3147
  },
3223
3148
  "hasDynamicHelp": false,
3224
3149
  "hiddenAliases": [],
3225
- "id": "test:list",
3150
+ "id": "sync:pull",
3226
3151
  "pluginAlias": "@memberjunction/cli",
3227
3152
  "pluginName": "@memberjunction/cli",
3228
3153
  "pluginType": "core",
3229
3154
  "strict": true,
3230
3155
  "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",
3261
- "hasDynamicHelp": false,
3262
- "multiple": false,
3263
- "type": "option"
3264
- },
3265
- "environment": {
3266
- "char": "e",
3267
- "description": "Environment context (dev, staging, prod)",
3268
- "name": "environment",
3269
- "hasDynamicHelp": false,
3270
- "multiple": false,
3271
- "type": "option"
3272
- },
3273
- "format": {
3274
- "char": "f",
3275
- "description": "Output format",
3276
- "name": "format",
3277
- "default": "console",
3278
- "hasDynamicHelp": false,
3279
- "multiple": false,
3280
- "options": [
3281
- "console",
3282
- "json",
3283
- "markdown"
3284
- ],
3285
- "type": "option"
3286
- },
3287
- "output": {
3288
- "char": "o",
3289
- "description": "Output file path",
3290
- "name": "output",
3291
- "hasDynamicHelp": false,
3292
- "multiple": false,
3293
- "type": "option"
3294
- },
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",
3305
- "allowNo": false,
3306
- "type": "boolean"
3307
- },
3308
- "checks-module": {
3309
- "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).",
3310
- "name": "checks-module",
3311
- "hasDynamicHelp": false,
3312
- "multiple": false,
3313
- "type": "option"
3314
- },
3315
- "oracles-module": {
3316
- "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.",
3317
- "name": "oracles-module",
3318
- "hasDynamicHelp": false,
3319
- "multiple": false,
3320
- "type": "option"
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"
3321
3196
  }
3322
3197
  },
3323
- "hasDynamicHelp": false,
3324
- "hiddenAliases": [],
3325
- "id": "test:run",
3326
- "pluginAlias": "@memberjunction/cli",
3327
- "pluginName": "@memberjunction/cli",
3328
- "pluginType": "core",
3329
- "strict": true,
3330
- "enableJsonFlag": false,
3331
3198
  "isESM": true,
3332
3199
  "relativePath": [
3333
3200
  "dist",
3334
3201
  "commands",
3335
- "test",
3336
- "run.js"
3202
+ "sync",
3203
+ "pull.js"
3337
3204
  ]
3338
3205
  },
3339
- "test:suite": {
3206
+ "sync:push": {
3340
3207
  "aliases": [],
3341
- "args": {
3342
- "suiteId": {
3343
- "description": "Test suite ID to execute",
3344
- "name": "suiteId",
3345
- "required": false
3346
- }
3347
- },
3348
- "description": "Execute a test suite",
3208
+ "args": {},
3209
+ "description": "Push local file changes to the database",
3349
3210
  "examples": [
3350
- "<%= config.bin %> <%= command.id %> <suite-id>",
3351
- "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
3352
- "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
3353
- "<%= 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"
3354
3215
  ],
3355
3216
  "flags": {
3356
- "name": {
3357
- "char": "n",
3358
- "description": "Test suite name to execute",
3359
- "name": "name",
3360
- "hasDynamicHelp": false,
3361
- "multiple": false,
3362
- "type": "option"
3363
- },
3364
3217
  "format": {
3365
- "char": "f",
3366
- "description": "Output format",
3218
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3367
3219
  "name": "format",
3368
- "default": "console",
3220
+ "default": "text",
3369
3221
  "hasDynamicHelp": false,
3370
3222
  "multiple": false,
3371
3223
  "options": [
3372
- "console",
3224
+ "text",
3373
3225
  "json",
3374
- "markdown"
3226
+ "md"
3375
3227
  ],
3376
3228
  "type": "option"
3377
3229
  },
3378
- "output": {
3379
- "char": "o",
3380
- "description": "Output file path",
3381
- "name": "output",
3382
- "hasDynamicHelp": false,
3383
- "multiple": false,
3384
- "type": "option"
3385
- },
3386
3230
  "verbose": {
3387
3231
  "char": "v",
3388
- "description": "Show detailed execution information",
3232
+ "description": "Show detailed output",
3389
3233
  "name": "verbose",
3390
3234
  "allowNo": false,
3391
3235
  "type": "boolean"
3392
3236
  },
3393
- "delay": {
3394
- "char": "d",
3395
- "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
3396
- "name": "delay",
3397
- "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",
3398
3246
  "hasDynamicHelp": false,
3399
3247
  "multiple": false,
3400
3248
  "type": "option"
3401
3249
  },
3402
- "parallel": {
3403
- "char": "p",
3404
- "description": "Run tests in parallel with shared browser sessions",
3405
- "name": "parallel",
3250
+ "dry-run": {
3251
+ "description": "Show what would be pushed without actually pushing",
3252
+ "name": "dry-run",
3406
3253
  "allowNo": false,
3407
3254
  "type": "boolean"
3408
3255
  },
3409
- "max-parallel": {
3410
- "description": "Maximum number of parallel workers (default 4)",
3411
- "name": "max-parallel",
3412
- "default": 4,
3413
- "hasDynamicHelp": false,
3414
- "multiple": false,
3415
- "type": "option"
3256
+ "ci": {
3257
+ "description": "CI mode - no prompts, fail on issues",
3258
+ "name": "ci",
3259
+ "allowNo": false,
3260
+ "type": "boolean"
3416
3261
  },
3417
- "flaky-check": {
3418
- "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
3419
- "name": "flaky-check",
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,
3420
3278
  "hasDynamicHelp": false,
3421
3279
  "multiple": false,
3422
3280
  "type": "option"
3423
3281
  },
3424
- "checks-module": {
3425
- "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).",
3426
- "name": "checks-module",
3282
+ "include": {
3283
+ "description": "Only process these directories (comma-separated, supports patterns)",
3284
+ "name": "include",
3427
3285
  "hasDynamicHelp": false,
3428
3286
  "multiple": false,
3429
3287
  "type": "option"
3430
3288
  },
3431
- "oracles-module": {
3432
- "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.",
3433
- "name": "oracles-module",
3289
+ "exclude": {
3290
+ "description": "Skip these directories (comma-separated, supports patterns)",
3291
+ "name": "exclude",
3434
3292
  "hasDynamicHelp": false,
3435
3293
  "multiple": false,
3436
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"
3437
3307
  }
3438
3308
  },
3439
3309
  "hasDynamicHelp": false,
3440
3310
  "hiddenAliases": [],
3441
- "id": "test:suite",
3311
+ "id": "sync:push",
3442
3312
  "pluginAlias": "@memberjunction/cli",
3443
3313
  "pluginName": "@memberjunction/cli",
3444
3314
  "pluginType": "core",
3445
3315
  "strict": true,
3446
3316
  "enableJsonFlag": false,
3447
- "isESM": true,
3448
- "relativePath": [
3449
- "dist",
3450
- "commands",
3451
- "test",
3452
- "suite.js"
3453
- ]
3454
- },
3455
- "test:validate": {
3456
- "aliases": [],
3457
- "args": {
3458
- "testId": {
3459
- "description": "Test ID to validate",
3460
- "name": "testId",
3461
- "required": false
3462
- }
3463
- },
3464
- "description": "Validate test definitions without executing",
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
+ },
3364
+ "isESM": true,
3365
+ "relativePath": [
3366
+ "dist",
3367
+ "commands",
3368
+ "sync",
3369
+ "push.js"
3370
+ ]
3371
+ },
3372
+ "sync:status": {
3373
+ "aliases": [],
3374
+ "args": {},
3375
+ "description": "Show status of local files vs database",
3465
3376
  "examples": [
3466
- "<%= config.bin %> <%= command.id %> <test-id>",
3467
- "<%= config.bin %> <%= command.id %> --all",
3468
- "<%= config.bin %> <%= command.id %> --type=agent-eval",
3469
- "<%= config.bin %> <%= command.id %> --all --save-report",
3470
- "<%= 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"
3471
3380
  ],
3472
3381
  "flags": {
3473
- "all": {
3474
- "char": "a",
3475
- "description": "Validate all tests",
3476
- "name": "all",
3477
- "allowNo": false,
3478
- "type": "boolean"
3479
- },
3480
- "type": {
3481
- "char": "t",
3482
- "description": "Validate tests by type",
3483
- "name": "type",
3382
+ "dir": {
3383
+ "description": "Specific entity directory to check status",
3384
+ "name": "dir",
3484
3385
  "hasDynamicHelp": false,
3485
3386
  "multiple": false,
3486
3387
  "type": "option"
3487
3388
  },
3488
- "save-report": {
3489
- "description": "Save validation report to file",
3490
- "name": "save-report",
3389
+ "verbose": {
3390
+ "char": "v",
3391
+ "description": "Show detailed field-level differences",
3392
+ "name": "verbose",
3491
3393
  "allowNo": false,
3492
3394
  "type": "boolean"
3493
3395
  },
3494
- "format": {
3495
- "char": "f",
3496
- "description": "Output format",
3497
- "name": "format",
3498
- "default": "console",
3396
+ "include": {
3397
+ "description": "Only process these directories (comma-separated, supports patterns)",
3398
+ "name": "include",
3499
3399
  "hasDynamicHelp": false,
3500
3400
  "multiple": false,
3501
- "options": [
3502
- "console",
3503
- "json",
3504
- "markdown"
3505
- ],
3506
3401
  "type": "option"
3507
3402
  },
3508
- "output": {
3509
- "char": "o",
3510
- "description": "Output file path",
3511
- "name": "output",
3403
+ "exclude": {
3404
+ "description": "Skip these directories (comma-separated, supports patterns)",
3405
+ "name": "exclude",
3512
3406
  "hasDynamicHelp": false,
3513
3407
  "multiple": false,
3514
3408
  "type": "option"
3515
- },
3516
- "verbose": {
3517
- "char": "v",
3518
- "description": "Show detailed information",
3519
- "name": "verbose",
3520
- "allowNo": false,
3521
- "type": "boolean"
3522
3409
  }
3523
3410
  },
3524
3411
  "hasDynamicHelp": false,
3525
3412
  "hiddenAliases": [],
3526
- "id": "test:validate",
3413
+ "id": "sync:status",
3527
3414
  "pluginAlias": "@memberjunction/cli",
3528
3415
  "pluginName": "@memberjunction/cli",
3529
3416
  "pluginType": "core",
@@ -3533,96 +3420,87 @@
3533
3420
  "relativePath": [
3534
3421
  "dist",
3535
3422
  "commands",
3536
- "test",
3537
- "validate.js"
3423
+ "sync",
3424
+ "status.js"
3538
3425
  ]
3539
3426
  },
3540
- "translate-sql": {
3427
+ "sync:usage": {
3541
3428
  "aliases": [],
3542
3429
  "args": {},
3543
- "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
3544
- "examples": [
3545
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --dry-run",
3546
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope queries",
3547
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --sql \"SELECT TOP 10 [Name] FROM [Users]\"",
3548
- "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope all --output ./reports"
3549
- ],
3430
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
3550
3431
  "flags": {
3551
- "from": {
3552
- "description": "Source SQL dialect",
3553
- "name": "from",
3554
- "required": true,
3555
- "hasDynamicHelp": false,
3556
- "multiple": false,
3557
- "options": [
3558
- "sqlserver",
3559
- "postgresql"
3560
- ],
3561
- "type": "option"
3562
- },
3563
- "to": {
3564
- "description": "Target SQL dialect",
3565
- "name": "to",
3566
- "required": true,
3567
- "hasDynamicHelp": false,
3568
- "multiple": false,
3569
- "options": [
3570
- "sqlserver",
3571
- "postgresql"
3572
- ],
3573
- "type": "option"
3574
- },
3575
- "scope": {
3576
- "description": "What to scan for translation",
3577
- "name": "scope",
3578
- "default": "all",
3432
+ "format": {
3433
+ "description": "Output format",
3434
+ "name": "format",
3435
+ "default": "text",
3579
3436
  "hasDynamicHelp": false,
3580
3437
  "multiple": false,
3581
3438
  "options": [
3582
- "queries",
3583
- "views",
3584
- "filters",
3585
- "all"
3439
+ "text",
3440
+ "json",
3441
+ "md"
3586
3442
  ],
3587
3443
  "type": "option"
3588
- },
3589
- "sql": {
3590
- "description": "Translate a single SQL fragment (inline mode)",
3591
- "name": "sql",
3444
+ }
3445
+ },
3446
+ "hasDynamicHelp": false,
3447
+ "hiddenAliases": [],
3448
+ "id": "sync:usage",
3449
+ "pluginAlias": "@memberjunction/cli",
3450
+ "pluginName": "@memberjunction/cli",
3451
+ "pluginType": "core",
3452
+ "strict": true,
3453
+ "enableJsonFlag": false,
3454
+ "isESM": true,
3455
+ "relativePath": [
3456
+ "dist",
3457
+ "commands",
3458
+ "sync",
3459
+ "usage.js"
3460
+ ]
3461
+ },
3462
+ "sync:validate": {
3463
+ "aliases": [],
3464
+ "args": {},
3465
+ "description": "Validate metadata files",
3466
+ "examples": [
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"
3471
+ ],
3472
+ "flags": {
3473
+ "dir": {
3474
+ "description": "Specific entity directory to validate",
3475
+ "name": "dir",
3592
3476
  "hasDynamicHelp": false,
3593
3477
  "multiple": false,
3594
3478
  "type": "option"
3595
3479
  },
3596
- "dry-run": {
3597
- "description": "Show what would be translated without making changes",
3598
- "name": "dry-run",
3480
+ "verbose": {
3481
+ "char": "v",
3482
+ "description": "Show detailed validation output",
3483
+ "name": "verbose",
3599
3484
  "allowNo": false,
3600
3485
  "type": "boolean"
3601
3486
  },
3602
- "review": {
3603
- "description": "Generate review report only (no writes to database)",
3604
- "name": "review",
3487
+ "save-report": {
3488
+ "description": "Save validation report as markdown file",
3489
+ "name": "save-report",
3605
3490
  "allowNo": false,
3606
3491
  "type": "boolean"
3607
3492
  },
3608
3493
  "output": {
3609
- "char": "o",
3610
- "description": "Output directory for the translation report",
3494
+ "description": "Output file path for validation report (default: validation-report.md)",
3611
3495
  "name": "output",
3612
3496
  "hasDynamicHelp": false,
3613
3497
  "multiple": false,
3614
3498
  "type": "option"
3615
- },
3616
- "force": {
3617
- "description": "Re-translate even if platform variants already exist",
3618
- "name": "force",
3619
- "allowNo": false,
3620
- "type": "boolean"
3621
3499
  }
3622
3500
  },
3623
3501
  "hasDynamicHelp": false,
3624
3502
  "hiddenAliases": [],
3625
- "id": "translate-sql",
3503
+ "id": "sync:validate",
3626
3504
  "pluginAlias": "@memberjunction/cli",
3627
3505
  "pluginName": "@memberjunction/cli",
3628
3506
  "pluginType": "core",
@@ -3632,127 +3510,44 @@
3632
3510
  "relativePath": [
3633
3511
  "dist",
3634
3512
  "commands",
3635
- "translate-sql",
3636
- "index.js"
3513
+ "sync",
3514
+ "validate.js"
3637
3515
  ]
3638
3516
  },
3639
- "update:claude": {
3517
+ "sync:watch": {
3640
3518
  "aliases": [],
3641
3519
  "args": {},
3642
- "description": "Update the Claude Code pack in the current directory.",
3520
+ "description": "Watch for file changes and sync automatically",
3643
3521
  "examples": [
3644
- "<%= config.bin %> update:claude",
3645
- "<%= config.bin %> update:claude --check",
3646
- "<%= config.bin %> update:claude --refresh-commands",
3647
- "<%= config.bin %> update:claude --allow-major",
3648
- "<%= config.bin %> update:claude --json"
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"
3649
3526
  ],
3650
3527
  "flags": {
3651
3528
  "dir": {
3652
- "description": "Target directory",
3529
+ "description": "Specific entity directory to watch",
3653
3530
  "name": "dir",
3654
- "default": ".",
3655
3531
  "hasDynamicHelp": false,
3656
3532
  "multiple": false,
3657
3533
  "type": "option"
3658
3534
  },
3659
- "major": {
3660
- "description": "Force a specific MJ major (default: detected from package.json)",
3661
- "name": "major",
3535
+ "debounce": {
3536
+ "description": "Debounce delay in milliseconds (default: 500)",
3537
+ "name": "debounce",
3662
3538
  "hasDynamicHelp": false,
3663
3539
  "multiple": false,
3664
3540
  "type": "option"
3665
3541
  },
3666
- "ref": {
3667
- "description": "Git ref to fetch from (branch or tag). Default: main.",
3668
- "name": "ref",
3669
- "hasDynamicHelp": false,
3670
- "multiple": false,
3671
- "type": "option"
3672
- },
3673
- "from": {
3674
- "description": "Use a local pack source instead of fetching from GitHub",
3675
- "name": "from",
3676
- "hasDynamicHelp": false,
3677
- "multiple": false,
3678
- "type": "option"
3679
- },
3680
- "offline": {
3681
- "description": "Forbid network; requires --from <path>",
3682
- "name": "offline",
3683
- "allowNo": false,
3684
- "type": "boolean"
3685
- },
3686
- "dry-run": {
3687
- "description": "Print what would be written; change nothing",
3688
- "name": "dry-run",
3689
- "allowNo": false,
3690
- "type": "boolean"
3691
- },
3692
- "yes": {
3693
- "char": "y",
3694
- "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
3695
- "name": "yes",
3696
- "allowNo": false,
3697
- "type": "boolean"
3698
- },
3699
- "force": {
3700
- "description": "Overwrite user-customized commands/skills (saves .bak files)",
3701
- "name": "force",
3702
- "allowNo": false,
3703
- "type": "boolean"
3704
- },
3705
- "skip-commands": {
3706
- "description": "Skip seeding .claude/commands/",
3707
- "name": "skip-commands",
3708
- "allowNo": false,
3709
- "type": "boolean"
3710
- },
3711
- "skip-skills": {
3712
- "description": "Skip seeding .claude/skills/",
3713
- "name": "skip-skills",
3714
- "allowNo": false,
3715
- "type": "boolean"
3716
- },
3717
- "skip-settings": {
3718
- "description": "Skip merging .claude/settings.json",
3719
- "name": "skip-settings",
3720
- "allowNo": false,
3721
- "type": "boolean"
3722
- },
3723
- "check": {
3724
- "description": "Compare local pack version to remote without writing anything",
3725
- "name": "check",
3726
- "allowNo": false,
3727
- "type": "boolean"
3728
- },
3729
- "refresh-commands": {
3730
- "description": "Force-resync .claude/commands/* from the pack (saves .bak files)",
3731
- "name": "refresh-commands",
3732
- "allowNo": false,
3733
- "type": "boolean"
3734
- },
3735
- "refresh-skills": {
3736
- "description": "Force-resync .claude/skills/** from the pack (saves .bak files)",
3737
- "name": "refresh-skills",
3738
- "allowNo": false,
3739
- "type": "boolean"
3740
- },
3741
- "allow-major": {
3742
- "description": "Allow the remote pack's major to differ from local MJ's major",
3743
- "name": "allow-major",
3744
- "allowNo": false,
3745
- "type": "boolean"
3746
- },
3747
- "json": {
3748
- "description": "Output as JSON (matches plan §7.5 schema)",
3749
- "name": "json",
3542
+ "no-validate": {
3543
+ "description": "Skip validation before sync",
3544
+ "name": "no-validate",
3750
3545
  "allowNo": false,
3751
3546
  "type": "boolean"
3752
3547
  },
3753
3548
  "verbose": {
3754
3549
  "char": "v",
3755
- "description": "Show progress messages",
3550
+ "description": "Show detailed output",
3756
3551
  "name": "verbose",
3757
3552
  "allowNo": false,
3758
3553
  "type": "boolean"
@@ -3760,7 +3555,7 @@
3760
3555
  },
3761
3556
  "hasDynamicHelp": false,
3762
3557
  "hiddenAliases": [],
3763
- "id": "update:claude",
3558
+ "id": "sync:watch",
3764
3559
  "pluginAlias": "@memberjunction/cli",
3765
3560
  "pluginName": "@memberjunction/cli",
3766
3561
  "pluginType": "core",
@@ -3770,88 +3565,110 @@
3770
3565
  "relativePath": [
3771
3566
  "dist",
3772
3567
  "commands",
3773
- "update",
3774
- "claude.js"
3568
+ "sync",
3569
+ "watch.js"
3775
3570
  ]
3776
3571
  },
3777
- "sync:file-reset": {
3572
+ "test:compare": {
3778
3573
  "aliases": [],
3779
- "args": {},
3780
- "description": "Reset file metadata sections",
3574
+ "args": {
3575
+ "runId1": {
3576
+ "description": "First test run ID to compare",
3577
+ "name": "runId1",
3578
+ "required": false
3579
+ },
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",
3781
3587
  "examples": [
3782
3588
  "<%= config.bin %> <%= command.id %>",
3783
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3784
- "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
3785
- "<%= config.bin %> <%= command.id %> --all"
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"
3786
3595
  ],
3787
3596
  "flags": {
3788
- "dir": {
3789
- "description": "Specific entity directory to reset",
3790
- "name": "dir",
3597
+ "version": {
3598
+ "char": "v",
3599
+ "description": "Compare runs by version",
3600
+ "name": "version",
3791
3601
  "hasDynamicHelp": false,
3792
- "multiple": false,
3602
+ "multiple": true,
3793
3603
  "type": "option"
3794
3604
  },
3795
- "sections": {
3796
- "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
3797
- "name": "sections",
3605
+ "commit": {
3606
+ "char": "c",
3607
+ "description": "Compare runs by git commit",
3608
+ "name": "commit",
3798
3609
  "hasDynamicHelp": false,
3799
- "multiple": false,
3610
+ "multiple": true,
3800
3611
  "type": "option"
3801
3612
  },
3802
- "all": {
3803
- "description": "Reset all metadata sections",
3804
- "name": "all",
3613
+ "diff-only": {
3614
+ "description": "Show only differences",
3615
+ "name": "diff-only",
3805
3616
  "allowNo": false,
3806
3617
  "type": "boolean"
3807
3618
  },
3808
- "dry-run": {
3809
- "description": "Show what would be reset without actually resetting",
3810
- "name": "dry-run",
3619
+ "latest": {
3620
+ "char": "l",
3621
+ "description": "Compare the two most recent completed suite runs",
3622
+ "name": "latest",
3811
3623
  "allowNo": false,
3812
3624
  "type": "boolean"
3813
3625
  },
3814
- "force": {
3815
- "description": "Skip confirmation prompts",
3816
- "name": "force",
3817
- "allowNo": false,
3818
- "type": "boolean"
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",
3629
+ "hasDynamicHelp": false,
3630
+ "multiple": true,
3631
+ "type": "option"
3632
+ },
3633
+ "format": {
3634
+ "char": "f",
3635
+ "description": "Output format",
3636
+ "name": "format",
3637
+ "default": "console",
3638
+ "hasDynamicHelp": false,
3639
+ "multiple": false,
3640
+ "options": [
3641
+ "console",
3642
+ "json",
3643
+ "markdown"
3644
+ ],
3645
+ "type": "option"
3646
+ },
3647
+ "output": {
3648
+ "char": "o",
3649
+ "description": "Output file path",
3650
+ "name": "output",
3651
+ "hasDynamicHelp": false,
3652
+ "multiple": false,
3653
+ "type": "option"
3819
3654
  },
3820
3655
  "verbose": {
3821
- "char": "v",
3822
- "description": "Show detailed output",
3656
+ "description": "Show detailed information",
3823
3657
  "name": "verbose",
3824
3658
  "allowNo": false,
3825
3659
  "type": "boolean"
3660
+ },
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",
3664
+ "hasDynamicHelp": false,
3665
+ "multiple": false,
3666
+ "type": "option"
3826
3667
  }
3827
3668
  },
3828
3669
  "hasDynamicHelp": false,
3829
3670
  "hiddenAliases": [],
3830
- "id": "sync:file-reset",
3831
- "pluginAlias": "@memberjunction/cli",
3832
- "pluginName": "@memberjunction/cli",
3833
- "pluginType": "core",
3834
- "strict": true,
3835
- "enableJsonFlag": false,
3836
- "isESM": true,
3837
- "relativePath": [
3838
- "dist",
3839
- "commands",
3840
- "sync",
3841
- "file-reset.js"
3842
- ]
3843
- },
3844
- "sync:init": {
3845
- "aliases": [],
3846
- "args": {},
3847
- "description": "Initialize a directory for metadata synchronization",
3848
- "examples": [
3849
- "<%= config.bin %> <%= command.id %>"
3850
- ],
3851
- "flags": {},
3852
- "hasDynamicHelp": false,
3853
- "hiddenAliases": [],
3854
- "id": "sync:init",
3671
+ "id": "test:compare",
3855
3672
  "pluginAlias": "@memberjunction/cli",
3856
3673
  "pluginName": "@memberjunction/cli",
3857
3674
  "pluginType": "core",
@@ -3861,411 +3678,417 @@
3861
3678
  "relativePath": [
3862
3679
  "dist",
3863
3680
  "commands",
3864
- "sync",
3865
- "init.js"
3681
+ "test",
3682
+ "compare.js"
3866
3683
  ]
3867
3684
  },
3868
- "sync:pull": {
3685
+ "test:history": {
3869
3686
  "aliases": [],
3870
3687
  "args": {},
3871
- "description": "Pull metadata from database to local files",
3688
+ "description": "View test execution history",
3872
3689
  "examples": [
3873
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
3874
- "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
3875
- "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
3690
+ "<%= config.bin %> <%= command.id %>",
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"
3876
3695
  ],
3877
3696
  "flags": {
3878
- "format": {
3879
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3880
- "name": "format",
3881
- "default": "text",
3697
+ "test": {
3698
+ "char": "t",
3699
+ "description": "Filter by test ID",
3700
+ "name": "test",
3882
3701
  "hasDynamicHelp": false,
3883
3702
  "multiple": false,
3884
- "options": [
3885
- "text",
3886
- "json",
3887
- "md"
3888
- ],
3889
3703
  "type": "option"
3890
3704
  },
3891
- "verbose": {
3892
- "char": "v",
3893
- "description": "Show detailed output",
3894
- "name": "verbose",
3895
- "allowNo": false,
3896
- "type": "boolean"
3897
- },
3898
- "no-banner": {
3899
- "description": "Suppress the startup banner and runtime advisory",
3900
- "name": "no-banner",
3901
- "allowNo": false,
3902
- "type": "boolean"
3903
- },
3904
- "entity": {
3905
- "description": "Entity name to pull",
3906
- "name": "entity",
3907
- "required": true,
3705
+ "recent": {
3706
+ "char": "r",
3707
+ "description": "Number of recent runs to show",
3708
+ "name": "recent",
3908
3709
  "hasDynamicHelp": false,
3909
3710
  "multiple": false,
3910
3711
  "type": "option"
3911
3712
  },
3912
- "filter": {
3913
- "description": "Additional filter for pulling specific records",
3914
- "name": "filter",
3713
+ "from": {
3714
+ "description": "Show history from date (YYYY-MM-DD)",
3715
+ "name": "from",
3915
3716
  "hasDynamicHelp": false,
3916
3717
  "multiple": false,
3917
3718
  "type": "option"
3918
3719
  },
3919
- "dry-run": {
3920
- "description": "Show what would be pulled without actually pulling",
3921
- "name": "dry-run",
3922
- "allowNo": false,
3923
- "type": "boolean"
3720
+ "status": {
3721
+ "char": "s",
3722
+ "description": "Filter by status",
3723
+ "name": "status",
3724
+ "hasDynamicHelp": false,
3725
+ "multiple": false,
3726
+ "type": "option"
3924
3727
  },
3925
- "multi-file": {
3926
- "description": "Create a single file with multiple records (provide filename)",
3927
- "name": "multi-file",
3728
+ "format": {
3729
+ "char": "f",
3730
+ "description": "Output format",
3731
+ "name": "format",
3732
+ "default": "console",
3928
3733
  "hasDynamicHelp": false,
3929
3734
  "multiple": false,
3735
+ "options": [
3736
+ "console",
3737
+ "json",
3738
+ "markdown"
3739
+ ],
3930
3740
  "type": "option"
3931
3741
  },
3932
- "no-validate": {
3933
- "description": "Skip validation before pull",
3934
- "name": "no-validate",
3935
- "allowNo": false,
3936
- "type": "boolean"
3742
+ "output": {
3743
+ "char": "o",
3744
+ "description": "Output file path",
3745
+ "name": "output",
3746
+ "hasDynamicHelp": false,
3747
+ "multiple": false,
3748
+ "type": "option"
3937
3749
  },
3938
- "update-existing": {
3939
- "description": "Update existing records during pull",
3940
- "name": "update-existing",
3750
+ "verbose": {
3751
+ "char": "v",
3752
+ "description": "Show detailed information",
3753
+ "name": "verbose",
3941
3754
  "allowNo": false,
3942
3755
  "type": "boolean"
3943
- },
3944
- "create-new": {
3945
- "description": "Create new files for records not found locally",
3946
- "name": "create-new",
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",
3947
3819
  "allowNo": false,
3948
3820
  "type": "boolean"
3949
3821
  },
3950
- "backup-before-update": {
3951
- "description": "Create backups before updating files",
3952
- "name": "backup-before-update",
3822
+ "types": {
3823
+ "description": "List test types",
3824
+ "name": "types",
3953
3825
  "allowNo": false,
3954
3826
  "type": "boolean"
3955
3827
  },
3956
- "merge-strategy": {
3957
- "description": "Merge strategy for updates",
3958
- "name": "merge-strategy",
3959
- "default": "merge",
3828
+ "type": {
3829
+ "char": "t",
3830
+ "description": "Filter by test type",
3831
+ "name": "type",
3960
3832
  "hasDynamicHelp": false,
3961
3833
  "multiple": false,
3962
- "options": [
3963
- "merge",
3964
- "overwrite",
3965
- "skip"
3966
- ],
3967
3834
  "type": "option"
3968
3835
  },
3969
- "backup-directory": {
3970
- "description": "Custom backup directory (default: .backups)",
3971
- "name": "backup-directory",
3836
+ "tag": {
3837
+ "description": "Filter by tag",
3838
+ "name": "tag",
3972
3839
  "hasDynamicHelp": false,
3973
3840
  "multiple": false,
3974
3841
  "type": "option"
3975
3842
  },
3976
- "preserve-fields": {
3977
- "description": "Comma-separated list of fields to preserve during updates",
3978
- "name": "preserve-fields",
3843
+ "status": {
3844
+ "char": "s",
3845
+ "description": "Filter by status",
3846
+ "name": "status",
3979
3847
  "hasDynamicHelp": false,
3980
- "multiple": true,
3848
+ "multiple": false,
3981
3849
  "type": "option"
3982
3850
  },
3983
- "exclude-fields": {
3984
- "description": "Comma-separated list of fields to exclude from pull",
3985
- "name": "exclude-fields",
3851
+ "format": {
3852
+ "char": "f",
3853
+ "description": "Output format",
3854
+ "name": "format",
3855
+ "default": "console",
3986
3856
  "hasDynamicHelp": false,
3987
- "multiple": true,
3857
+ "multiple": false,
3858
+ "options": [
3859
+ "console",
3860
+ "json",
3861
+ "markdown"
3862
+ ],
3988
3863
  "type": "option"
3989
3864
  },
3990
- "target-dir": {
3991
- "description": "Specific target directory (overrides auto-discovery)",
3992
- "name": "target-dir",
3865
+ "output": {
3866
+ "char": "o",
3867
+ "description": "Output file path",
3868
+ "name": "output",
3993
3869
  "hasDynamicHelp": false,
3994
3870
  "multiple": false,
3995
3871
  "type": "option"
3996
3872
  },
3997
- "incremental": {
3998
- "description": "Only pull records updated since last successful pull",
3999
- "name": "incremental",
3873
+ "verbose": {
3874
+ "char": "v",
3875
+ "description": "Show detailed information",
3876
+ "name": "verbose",
4000
3877
  "allowNo": false,
4001
3878
  "type": "boolean"
4002
- },
4003
- "since": {
4004
- "description": "Only pull records updated after this ISO 8601 timestamp",
4005
- "name": "since",
4006
- "hasDynamicHelp": false,
4007
- "multiple": false,
4008
- "type": "option"
4009
3879
  }
4010
3880
  },
4011
3881
  "hasDynamicHelp": false,
4012
3882
  "hiddenAliases": [],
4013
- "id": "sync:pull",
3883
+ "id": "test:list",
4014
3884
  "pluginAlias": "@memberjunction/cli",
4015
3885
  "pluginName": "@memberjunction/cli",
4016
3886
  "pluginType": "core",
4017
3887
  "strict": true,
4018
3888
  "enableJsonFlag": false,
4019
- "Usage": {
4020
- "domain": "sync",
4021
- "command": "sync:pull",
4022
- "summary": "Pull database records into local metadata files.",
4023
- "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
4024
- "flags": [
4025
- {
4026
- "name": "--entity",
4027
- "type": "string",
4028
- "description": "Entity name to pull (required)"
4029
- },
4030
- {
4031
- "name": "--filter",
4032
- "type": "string",
4033
- "description": "Extra SQL filter for which records to pull"
4034
- },
4035
- {
4036
- "name": "--merge-strategy",
4037
- "type": "merge|overwrite|skip",
4038
- "description": "How to reconcile existing files"
4039
- },
4040
- {
4041
- "name": "--dry-run",
4042
- "type": "boolean",
4043
- "description": "Report what would be pulled without writing"
4044
- },
4045
- {
4046
- "name": "--format",
4047
- "type": "text|json|md",
4048
- "description": "Output format (json for machine-readable result)"
4049
- }
4050
- ],
4051
- "examples": [
4052
- "mj sync pull --entity=\"MJ: AI Prompts\"",
4053
- "mj sync pull --entity=\"Actions\" --format=json"
4054
- ],
4055
- "runtime": {
4056
- "class": "variable",
4057
- "typicalSeconds": 15,
4058
- "note": "scales with number of records matched for --entity"
4059
- }
4060
- },
4061
3889
  "isESM": true,
4062
3890
  "relativePath": [
4063
3891
  "dist",
4064
3892
  "commands",
4065
- "sync",
4066
- "pull.js"
3893
+ "test",
3894
+ "list.js"
4067
3895
  ]
4068
3896
  },
4069
- "sync:push": {
3897
+ "test:run": {
4070
3898
  "aliases": [],
4071
- "args": {},
4072
- "description": "Push local file changes to the 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",
4073
3907
  "examples": [
4074
- "<%= config.bin %> <%= command.id %>",
4075
- "<%= config.bin %> <%= command.id %> --dry-run",
4076
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4077
- "<%= config.bin %> <%= command.id %> --ci --format=json"
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"
4078
3913
  ],
4079
3914
  "flags": {
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
+ },
4080
3931
  "format": {
4081
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3932
+ "char": "f",
3933
+ "description": "Output format",
4082
3934
  "name": "format",
4083
- "default": "text",
3935
+ "default": "console",
4084
3936
  "hasDynamicHelp": false,
4085
3937
  "multiple": false,
4086
3938
  "options": [
4087
- "text",
3939
+ "console",
4088
3940
  "json",
4089
- "md"
3941
+ "markdown"
4090
3942
  ],
4091
3943
  "type": "option"
4092
3944
  },
4093
- "verbose": {
4094
- "char": "v",
4095
- "description": "Show detailed output",
4096
- "name": "verbose",
4097
- "allowNo": false,
4098
- "type": "boolean"
4099
- },
4100
- "no-banner": {
4101
- "description": "Suppress the startup banner and runtime advisory",
4102
- "name": "no-banner",
4103
- "allowNo": false,
4104
- "type": "boolean"
4105
- },
4106
- "dir": {
4107
- "description": "Specific entity directory to push",
4108
- "name": "dir",
3945
+ "output": {
3946
+ "char": "o",
3947
+ "description": "Output file path",
3948
+ "name": "output",
4109
3949
  "hasDynamicHelp": false,
4110
3950
  "multiple": false,
4111
3951
  "type": "option"
4112
3952
  },
4113
3953
  "dry-run": {
4114
- "description": "Show what would be pushed without actually pushing",
3954
+ "description": "Validate without executing",
4115
3955
  "name": "dry-run",
4116
3956
  "allowNo": false,
4117
3957
  "type": "boolean"
4118
3958
  },
4119
- "ci": {
4120
- "description": "CI mode - no prompts, fail on issues",
4121
- "name": "ci",
4122
- "allowNo": false,
4123
- "type": "boolean"
4124
- },
4125
- "no-validate": {
4126
- "description": "Skip validation before push",
4127
- "name": "no-validate",
4128
- "allowNo": false,
4129
- "type": "boolean"
4130
- },
4131
- "delete-db-only": {
4132
- "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
4133
- "name": "delete-db-only",
3959
+ "verbose": {
3960
+ "char": "v",
3961
+ "description": "Show detailed execution information",
3962
+ "name": "verbose",
4134
3963
  "allowNo": false,
4135
3964
  "type": "boolean"
4136
3965
  },
4137
- "parallel-batch-size": {
4138
- "description": "Number of records to process in parallel (default: 10)",
4139
- "name": "parallel-batch-size",
4140
- "default": 10,
4141
- "hasDynamicHelp": false,
4142
- "multiple": false,
4143
- "type": "option"
4144
- },
4145
- "include": {
4146
- "description": "Only process these directories (comma-separated, supports patterns)",
4147
- "name": "include",
4148
- "hasDynamicHelp": false,
4149
- "multiple": false,
4150
- "type": "option"
4151
- },
4152
- "exclude": {
4153
- "description": "Skip these directories (comma-separated, supports patterns)",
4154
- "name": "exclude",
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",
4155
3969
  "hasDynamicHelp": false,
4156
3970
  "multiple": false,
4157
3971
  "type": "option"
4158
3972
  },
4159
- "incremental": {
4160
- "description": "Skip unchanged files using stored checksums from last push",
4161
- "name": "incremental",
4162
- "allowNo": false,
4163
- "type": "boolean"
4164
- },
4165
- "change-detail": {
4166
- "description": "Write a detailed per-record change report (primary keys + field diffs) to a file",
4167
- "name": "change-detail",
4168
- "allowNo": false,
4169
- "type": "boolean"
4170
- }
4171
- },
4172
- "hasDynamicHelp": false,
4173
- "hiddenAliases": [],
4174
- "id": "sync:push",
4175
- "pluginAlias": "@memberjunction/cli",
4176
- "pluginName": "@memberjunction/cli",
4177
- "pluginType": "core",
4178
- "strict": true,
4179
- "enableJsonFlag": false,
4180
- "Usage": {
4181
- "domain": "sync",
4182
- "command": "sync:push",
4183
- "summary": "Push local metadata files to the database (upsert).",
4184
- "description": "Reads entity directories under --dir and creates/updates matching records. Runs validation first unless --no-validate.",
4185
- "flags": [
4186
- {
4187
- "name": "--dir",
4188
- "type": "string",
4189
- "description": "Entity directory to push"
4190
- },
4191
- {
4192
- "name": "--dry-run",
4193
- "type": "boolean",
4194
- "description": "Report what would change without writing"
4195
- },
4196
- {
4197
- "name": "--ci",
4198
- "type": "boolean",
4199
- "description": "No prompts; non-zero exit on error"
4200
- },
4201
- {
4202
- "name": "--no-validate",
4203
- "type": "boolean",
4204
- "description": "Skip pre-push validation"
4205
- },
4206
- {
4207
- "name": "--incremental",
4208
- "type": "boolean",
4209
- "description": "Skip unchanged files using stored checksums"
4210
- },
4211
- {
4212
- "name": "--format",
4213
- "type": "text|json|md",
4214
- "description": "Output format (json for machine-readable result)"
4215
- }
4216
- ],
4217
- "examples": [
4218
- "mj sync push --dir=ai-agents",
4219
- "mj sync push --ci --format=json"
4220
- ],
4221
- "runtime": {
4222
- "class": "variable",
4223
- "typicalSeconds": 20,
4224
- "note": "scales with number of records in --dir"
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",
3976
+ "hasDynamicHelp": false,
3977
+ "multiple": false,
3978
+ "type": "option"
4225
3979
  }
4226
3980
  },
3981
+ "hasDynamicHelp": false,
3982
+ "hiddenAliases": [],
3983
+ "id": "test:run",
3984
+ "pluginAlias": "@memberjunction/cli",
3985
+ "pluginName": "@memberjunction/cli",
3986
+ "pluginType": "core",
3987
+ "strict": true,
3988
+ "enableJsonFlag": false,
4227
3989
  "isESM": true,
4228
3990
  "relativePath": [
4229
3991
  "dist",
4230
3992
  "commands",
4231
- "sync",
4232
- "push.js"
3993
+ "test",
3994
+ "run.js"
4233
3995
  ]
4234
3996
  },
4235
- "sync:status": {
3997
+ "test:suite": {
4236
3998
  "aliases": [],
4237
- "args": {},
4238
- "description": "Show status of local files vs database",
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",
4239
4007
  "examples": [
4240
- "<%= config.bin %> <%= command.id %>",
4241
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4242
- "<%= config.bin %> <%= command.id %> --verbose"
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"
4243
4012
  ],
4244
4013
  "flags": {
4245
- "dir": {
4246
- "description": "Specific entity directory to check status",
4247
- "name": "dir",
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
+ },
4022
+ "format": {
4023
+ "char": "f",
4024
+ "description": "Output format",
4025
+ "name": "format",
4026
+ "default": "console",
4027
+ "hasDynamicHelp": false,
4028
+ "multiple": false,
4029
+ "options": [
4030
+ "console",
4031
+ "json",
4032
+ "markdown"
4033
+ ],
4034
+ "type": "option"
4035
+ },
4036
+ "output": {
4037
+ "char": "o",
4038
+ "description": "Output file path",
4039
+ "name": "output",
4248
4040
  "hasDynamicHelp": false,
4249
4041
  "multiple": false,
4250
4042
  "type": "option"
4251
4043
  },
4252
4044
  "verbose": {
4253
4045
  "char": "v",
4254
- "description": "Show detailed field-level differences",
4046
+ "description": "Show detailed execution information",
4255
4047
  "name": "verbose",
4256
4048
  "allowNo": false,
4257
4049
  "type": "boolean"
4258
4050
  },
4259
- "include": {
4260
- "description": "Only process these directories (comma-separated, supports patterns)",
4261
- "name": "include",
4051
+ "delay": {
4052
+ "char": "d",
4053
+ "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
4054
+ "name": "delay",
4055
+ "default": 0,
4262
4056
  "hasDynamicHelp": false,
4263
4057
  "multiple": false,
4264
4058
  "type": "option"
4265
4059
  },
4266
- "exclude": {
4267
- "description": "Skip these directories (comma-separated, supports patterns)",
4268
- "name": "exclude",
4060
+ "parallel": {
4061
+ "char": "p",
4062
+ "description": "Run tests in parallel with shared browser sessions",
4063
+ "name": "parallel",
4064
+ "allowNo": false,
4065
+ "type": "boolean"
4066
+ },
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",
4269
4092
  "hasDynamicHelp": false,
4270
4093
  "multiple": false,
4271
4094
  "type": "option"
@@ -4273,7 +4096,7 @@
4273
4096
  },
4274
4097
  "hasDynamicHelp": false,
4275
4098
  "hiddenAliases": [],
4276
- "id": "sync:status",
4099
+ "id": "test:suite",
4277
4100
  "pluginAlias": "@memberjunction/cli",
4278
4101
  "pluginName": "@memberjunction/cli",
4279
4102
  "pluginType": "core",
@@ -4283,32 +4106,82 @@
4283
4106
  "relativePath": [
4284
4107
  "dist",
4285
4108
  "commands",
4286
- "sync",
4287
- "status.js"
4109
+ "test",
4110
+ "suite.js"
4288
4111
  ]
4289
4112
  },
4290
- "sync:usage": {
4113
+ "test:validate": {
4291
4114
  "aliases": [],
4292
- "args": {},
4293
- "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
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",
4123
+ "examples": [
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"
4129
+ ],
4294
4130
  "flags": {
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",
4142
+ "hasDynamicHelp": false,
4143
+ "multiple": false,
4144
+ "type": "option"
4145
+ },
4146
+ "save-report": {
4147
+ "description": "Save validation report to file",
4148
+ "name": "save-report",
4149
+ "allowNo": false,
4150
+ "type": "boolean"
4151
+ },
4295
4152
  "format": {
4153
+ "char": "f",
4296
4154
  "description": "Output format",
4297
4155
  "name": "format",
4298
- "default": "text",
4156
+ "default": "console",
4299
4157
  "hasDynamicHelp": false,
4300
4158
  "multiple": false,
4301
4159
  "options": [
4302
- "text",
4160
+ "console",
4303
4161
  "json",
4304
- "md"
4162
+ "markdown"
4305
4163
  ],
4306
4164
  "type": "option"
4165
+ },
4166
+ "output": {
4167
+ "char": "o",
4168
+ "description": "Output file path",
4169
+ "name": "output",
4170
+ "hasDynamicHelp": false,
4171
+ "multiple": false,
4172
+ "type": "option"
4173
+ },
4174
+ "verbose": {
4175
+ "char": "v",
4176
+ "description": "Show detailed information",
4177
+ "name": "verbose",
4178
+ "allowNo": false,
4179
+ "type": "boolean"
4307
4180
  }
4308
4181
  },
4309
4182
  "hasDynamicHelp": false,
4310
4183
  "hiddenAliases": [],
4311
- "id": "sync:usage",
4184
+ "id": "test:validate",
4312
4185
  "pluginAlias": "@memberjunction/cli",
4313
4186
  "pluginName": "@memberjunction/cli",
4314
4187
  "pluginType": "core",
@@ -4318,52 +4191,96 @@
4318
4191
  "relativePath": [
4319
4192
  "dist",
4320
4193
  "commands",
4321
- "sync",
4322
- "usage.js"
4194
+ "test",
4195
+ "validate.js"
4323
4196
  ]
4324
4197
  },
4325
- "sync:validate": {
4198
+ "translate-sql": {
4326
4199
  "aliases": [],
4327
4200
  "args": {},
4328
- "description": "Validate metadata files",
4201
+ "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
4329
4202
  "examples": [
4330
- "<%= config.bin %> <%= command.id %>",
4331
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4332
- "<%= config.bin %> <%= command.id %> --save-report",
4333
- "<%= config.bin %> <%= command.id %> --verbose"
4203
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --dry-run",
4204
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope queries",
4205
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --sql \"SELECT TOP 10 [Name] FROM [Users]\"",
4206
+ "<%= config.bin %> translate-sql --from sqlserver --to postgresql --scope all --output ./reports"
4334
4207
  ],
4335
4208
  "flags": {
4336
- "dir": {
4337
- "description": "Specific entity directory to validate",
4338
- "name": "dir",
4209
+ "from": {
4210
+ "description": "Source SQL dialect",
4211
+ "name": "from",
4212
+ "required": true,
4213
+ "hasDynamicHelp": false,
4214
+ "multiple": false,
4215
+ "options": [
4216
+ "sqlserver",
4217
+ "postgresql"
4218
+ ],
4219
+ "type": "option"
4220
+ },
4221
+ "to": {
4222
+ "description": "Target SQL dialect",
4223
+ "name": "to",
4224
+ "required": true,
4339
4225
  "hasDynamicHelp": false,
4340
4226
  "multiple": false,
4227
+ "options": [
4228
+ "sqlserver",
4229
+ "postgresql"
4230
+ ],
4341
4231
  "type": "option"
4342
4232
  },
4343
- "verbose": {
4344
- "char": "v",
4345
- "description": "Show detailed validation output",
4346
- "name": "verbose",
4233
+ "scope": {
4234
+ "description": "What to scan for translation",
4235
+ "name": "scope",
4236
+ "default": "all",
4237
+ "hasDynamicHelp": false,
4238
+ "multiple": false,
4239
+ "options": [
4240
+ "queries",
4241
+ "views",
4242
+ "filters",
4243
+ "all"
4244
+ ],
4245
+ "type": "option"
4246
+ },
4247
+ "sql": {
4248
+ "description": "Translate a single SQL fragment (inline mode)",
4249
+ "name": "sql",
4250
+ "hasDynamicHelp": false,
4251
+ "multiple": false,
4252
+ "type": "option"
4253
+ },
4254
+ "dry-run": {
4255
+ "description": "Show what would be translated without making changes",
4256
+ "name": "dry-run",
4347
4257
  "allowNo": false,
4348
4258
  "type": "boolean"
4349
4259
  },
4350
- "save-report": {
4351
- "description": "Save validation report as markdown file",
4352
- "name": "save-report",
4260
+ "review": {
4261
+ "description": "Generate review report only (no writes to database)",
4262
+ "name": "review",
4353
4263
  "allowNo": false,
4354
4264
  "type": "boolean"
4355
4265
  },
4356
4266
  "output": {
4357
- "description": "Output file path for validation report (default: validation-report.md)",
4267
+ "char": "o",
4268
+ "description": "Output directory for the translation report",
4358
4269
  "name": "output",
4359
4270
  "hasDynamicHelp": false,
4360
4271
  "multiple": false,
4361
4272
  "type": "option"
4273
+ },
4274
+ "force": {
4275
+ "description": "Re-translate even if platform variants already exist",
4276
+ "name": "force",
4277
+ "allowNo": false,
4278
+ "type": "boolean"
4362
4279
  }
4363
4280
  },
4364
4281
  "hasDynamicHelp": false,
4365
4282
  "hiddenAliases": [],
4366
- "id": "sync:validate",
4283
+ "id": "translate-sql",
4367
4284
  "pluginAlias": "@memberjunction/cli",
4368
4285
  "pluginName": "@memberjunction/cli",
4369
4286
  "pluginType": "core",
@@ -4373,44 +4290,127 @@
4373
4290
  "relativePath": [
4374
4291
  "dist",
4375
4292
  "commands",
4376
- "sync",
4377
- "validate.js"
4293
+ "translate-sql",
4294
+ "index.js"
4378
4295
  ]
4379
4296
  },
4380
- "sync:watch": {
4297
+ "update:claude": {
4381
4298
  "aliases": [],
4382
4299
  "args": {},
4383
- "description": "Watch for file changes and sync automatically",
4300
+ "description": "Update the Claude Code pack in the current directory.",
4384
4301
  "examples": [
4385
- "<%= config.bin %> <%= command.id %>",
4386
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4387
- "<%= config.bin %> <%= command.id %> --debounce=1000",
4388
- "<%= config.bin %> <%= command.id %> --no-validate"
4302
+ "<%= config.bin %> update:claude",
4303
+ "<%= config.bin %> update:claude --check",
4304
+ "<%= config.bin %> update:claude --refresh-commands",
4305
+ "<%= config.bin %> update:claude --allow-major",
4306
+ "<%= config.bin %> update:claude --json"
4389
4307
  ],
4390
4308
  "flags": {
4391
4309
  "dir": {
4392
- "description": "Specific entity directory to watch",
4310
+ "description": "Target directory",
4393
4311
  "name": "dir",
4312
+ "default": ".",
4394
4313
  "hasDynamicHelp": false,
4395
4314
  "multiple": false,
4396
4315
  "type": "option"
4397
4316
  },
4398
- "debounce": {
4399
- "description": "Debounce delay in milliseconds (default: 500)",
4400
- "name": "debounce",
4317
+ "major": {
4318
+ "description": "Force a specific MJ major (default: detected from package.json)",
4319
+ "name": "major",
4401
4320
  "hasDynamicHelp": false,
4402
4321
  "multiple": false,
4403
4322
  "type": "option"
4404
4323
  },
4405
- "no-validate": {
4406
- "description": "Skip validation before sync",
4407
- "name": "no-validate",
4324
+ "ref": {
4325
+ "description": "Git ref to fetch from (branch or tag). Default: main.",
4326
+ "name": "ref",
4327
+ "hasDynamicHelp": false,
4328
+ "multiple": false,
4329
+ "type": "option"
4330
+ },
4331
+ "from": {
4332
+ "description": "Use a local pack source instead of fetching from GitHub",
4333
+ "name": "from",
4334
+ "hasDynamicHelp": false,
4335
+ "multiple": false,
4336
+ "type": "option"
4337
+ },
4338
+ "offline": {
4339
+ "description": "Forbid network; requires --from <path>",
4340
+ "name": "offline",
4341
+ "allowNo": false,
4342
+ "type": "boolean"
4343
+ },
4344
+ "dry-run": {
4345
+ "description": "Print what would be written; change nothing",
4346
+ "name": "dry-run",
4347
+ "allowNo": false,
4348
+ "type": "boolean"
4349
+ },
4350
+ "yes": {
4351
+ "char": "y",
4352
+ "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
4353
+ "name": "yes",
4354
+ "allowNo": false,
4355
+ "type": "boolean"
4356
+ },
4357
+ "force": {
4358
+ "description": "Overwrite user-customized commands/skills (saves .bak files)",
4359
+ "name": "force",
4360
+ "allowNo": false,
4361
+ "type": "boolean"
4362
+ },
4363
+ "skip-commands": {
4364
+ "description": "Skip seeding .claude/commands/",
4365
+ "name": "skip-commands",
4366
+ "allowNo": false,
4367
+ "type": "boolean"
4368
+ },
4369
+ "skip-skills": {
4370
+ "description": "Skip seeding .claude/skills/",
4371
+ "name": "skip-skills",
4372
+ "allowNo": false,
4373
+ "type": "boolean"
4374
+ },
4375
+ "skip-settings": {
4376
+ "description": "Skip merging .claude/settings.json",
4377
+ "name": "skip-settings",
4378
+ "allowNo": false,
4379
+ "type": "boolean"
4380
+ },
4381
+ "check": {
4382
+ "description": "Compare local pack version to remote without writing anything",
4383
+ "name": "check",
4384
+ "allowNo": false,
4385
+ "type": "boolean"
4386
+ },
4387
+ "refresh-commands": {
4388
+ "description": "Force-resync .claude/commands/* from the pack (saves .bak files)",
4389
+ "name": "refresh-commands",
4390
+ "allowNo": false,
4391
+ "type": "boolean"
4392
+ },
4393
+ "refresh-skills": {
4394
+ "description": "Force-resync .claude/skills/** from the pack (saves .bak files)",
4395
+ "name": "refresh-skills",
4396
+ "allowNo": false,
4397
+ "type": "boolean"
4398
+ },
4399
+ "allow-major": {
4400
+ "description": "Allow the remote pack's major to differ from local MJ's major",
4401
+ "name": "allow-major",
4402
+ "allowNo": false,
4403
+ "type": "boolean"
4404
+ },
4405
+ "json": {
4406
+ "description": "Output as JSON (matches plan §7.5 schema)",
4407
+ "name": "json",
4408
4408
  "allowNo": false,
4409
4409
  "type": "boolean"
4410
4410
  },
4411
4411
  "verbose": {
4412
4412
  "char": "v",
4413
- "description": "Show detailed output",
4413
+ "description": "Show progress messages",
4414
4414
  "name": "verbose",
4415
4415
  "allowNo": false,
4416
4416
  "type": "boolean"
@@ -4418,7 +4418,7 @@
4418
4418
  },
4419
4419
  "hasDynamicHelp": false,
4420
4420
  "hiddenAliases": [],
4421
- "id": "sync:watch",
4421
+ "id": "update:claude",
4422
4422
  "pluginAlias": "@memberjunction/cli",
4423
4423
  "pluginName": "@memberjunction/cli",
4424
4424
  "pluginType": "core",
@@ -4428,8 +4428,8 @@
4428
4428
  "relativePath": [
4429
4429
  "dist",
4430
4430
  "commands",
4431
- "sync",
4432
- "watch.js"
4431
+ "update",
4432
+ "claude.js"
4433
4433
  ]
4434
4434
  },
4435
4435
  "ai:actions:list": {
@@ -4499,141 +4499,12 @@
4499
4499
  "description": "Action parameters in key=value format",
4500
4500
  "name": "param",
4501
4501
  "hasDynamicHelp": false,
4502
- "multiple": true,
4503
- "type": "option"
4504
- },
4505
- "dry-run": {
4506
- "description": "Validate without executing",
4507
- "name": "dry-run",
4508
- "allowNo": false,
4509
- "type": "boolean"
4510
- },
4511
- "output": {
4512
- "char": "o",
4513
- "description": "Output format",
4514
- "name": "output",
4515
- "default": "compact",
4516
- "hasDynamicHelp": false,
4517
- "multiple": false,
4518
- "options": [
4519
- "compact",
4520
- "json",
4521
- "table"
4522
- ],
4523
- "type": "option"
4524
- },
4525
- "verbose": {
4526
- "char": "v",
4527
- "description": "Show detailed execution information",
4528
- "name": "verbose",
4529
- "allowNo": false,
4530
- "type": "boolean"
4531
- },
4532
- "timeout": {
4533
- "description": "Execution timeout in milliseconds",
4534
- "name": "timeout",
4535
- "default": 300000,
4536
- "hasDynamicHelp": false,
4537
- "multiple": false,
4538
- "type": "option"
4539
- }
4540
- },
4541
- "hasDynamicHelp": false,
4542
- "hiddenAliases": [],
4543
- "id": "ai:actions:run",
4544
- "pluginAlias": "@memberjunction/cli",
4545
- "pluginName": "@memberjunction/cli",
4546
- "pluginType": "core",
4547
- "strict": true,
4548
- "enableJsonFlag": false,
4549
- "isESM": true,
4550
- "relativePath": [
4551
- "dist",
4552
- "commands",
4553
- "ai",
4554
- "actions",
4555
- "run.js"
4556
- ]
4557
- },
4558
- "ai:agents:list": {
4559
- "aliases": [],
4560
- "args": {},
4561
- "description": "List available AI agents",
4562
- "examples": [
4563
- "<%= config.bin %> <%= command.id %>",
4564
- "<%= config.bin %> <%= command.id %> --output=table",
4565
- "<%= config.bin %> <%= command.id %> --output=json"
4566
- ],
4567
- "flags": {
4568
- "output": {
4569
- "char": "o",
4570
- "description": "Output format",
4571
- "name": "output",
4572
- "default": "compact",
4573
- "hasDynamicHelp": false,
4574
- "multiple": false,
4575
- "options": [
4576
- "compact",
4577
- "json",
4578
- "table"
4579
- ],
4580
- "type": "option"
4581
- }
4582
- },
4583
- "hasDynamicHelp": false,
4584
- "hiddenAliases": [],
4585
- "id": "ai:agents: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
- "ai",
4596
- "agents",
4597
- "list.js"
4598
- ]
4599
- },
4600
- "ai:agents:run": {
4601
- "aliases": [],
4602
- "args": {},
4603
- "description": "Execute an AI agent with a prompt or start interactive chat",
4604
- "examples": [
4605
- "<%= config.bin %> <%= command.id %> -a \"Skip: Requirements Expert\" -p \"Create a dashboard for sales metrics\"",
4606
- "<%= config.bin %> <%= command.id %> -a \"Child Component Generator Sub-agent\" --chat",
4607
- "<%= config.bin %> <%= command.id %> -a \"Skip: Technical Design Expert\" -p \"Build a React component\" --verbose --timeout=600000"
4608
- ],
4609
- "flags": {
4610
- "agent": {
4611
- "char": "a",
4612
- "description": "Agent name",
4613
- "name": "agent",
4614
- "required": true,
4615
- "hasDynamicHelp": false,
4616
- "multiple": false,
4617
- "type": "option"
4618
- },
4619
- "prompt": {
4620
- "char": "p",
4621
- "description": "Prompt to execute",
4622
- "exclusive": [
4623
- "chat"
4624
- ],
4625
- "name": "prompt",
4626
- "hasDynamicHelp": false,
4627
- "multiple": false,
4502
+ "multiple": true,
4628
4503
  "type": "option"
4629
4504
  },
4630
- "chat": {
4631
- "char": "c",
4632
- "description": "Start interactive chat mode",
4633
- "exclusive": [
4634
- "prompt"
4635
- ],
4636
- "name": "chat",
4505
+ "dry-run": {
4506
+ "description": "Validate without executing",
4507
+ "name": "dry-run",
4637
4508
  "allowNo": false,
4638
4509
  "type": "boolean"
4639
4510
  },
@@ -4669,7 +4540,7 @@
4669
4540
  },
4670
4541
  "hasDynamicHelp": false,
4671
4542
  "hiddenAliases": [],
4672
- "id": "ai:agents:run",
4543
+ "id": "ai:actions:run",
4673
4544
  "pluginAlias": "@memberjunction/cli",
4674
4545
  "pluginName": "@memberjunction/cli",
4675
4546
  "pluginType": "core",
@@ -4680,29 +4551,38 @@
4680
4551
  "dist",
4681
4552
  "commands",
4682
4553
  "ai",
4683
- "agents",
4554
+ "actions",
4684
4555
  "run.js"
4685
4556
  ]
4686
4557
  },
4687
- "ai:prompts:list": {
4558
+ "ai:agents:list": {
4688
4559
  "aliases": [],
4689
4560
  "args": {},
4690
- "description": "List available models for prompt execution",
4561
+ "description": "List available AI agents",
4691
4562
  "examples": [
4692
- "<%= config.bin %> <%= command.id %>"
4563
+ "<%= config.bin %> <%= command.id %>",
4564
+ "<%= config.bin %> <%= command.id %> --output=table",
4565
+ "<%= config.bin %> <%= command.id %> --output=json"
4693
4566
  ],
4694
4567
  "flags": {
4695
- "verbose": {
4696
- "char": "v",
4697
- "description": "Show detailed model information",
4698
- "name": "verbose",
4699
- "allowNo": false,
4700
- "type": "boolean"
4568
+ "output": {
4569
+ "char": "o",
4570
+ "description": "Output format",
4571
+ "name": "output",
4572
+ "default": "compact",
4573
+ "hasDynamicHelp": false,
4574
+ "multiple": false,
4575
+ "options": [
4576
+ "compact",
4577
+ "json",
4578
+ "table"
4579
+ ],
4580
+ "type": "option"
4701
4581
  }
4702
4582
  },
4703
4583
  "hasDynamicHelp": false,
4704
4584
  "hiddenAliases": [],
4705
- "id": "ai:prompts:list",
4585
+ "id": "ai:agents:list",
4706
4586
  "pluginAlias": "@memberjunction/cli",
4707
4587
  "pluginName": "@memberjunction/cli",
4708
4588
  "pluginType": "core",
@@ -4713,68 +4593,49 @@
4713
4593
  "dist",
4714
4594
  "commands",
4715
4595
  "ai",
4716
- "prompts",
4596
+ "agents",
4717
4597
  "list.js"
4718
4598
  ]
4719
4599
  },
4720
- "ai:prompts:run": {
4600
+ "ai:agents:run": {
4721
4601
  "aliases": [],
4722
4602
  "args": {},
4723
- "description": "Execute a direct prompt with an AI model",
4603
+ "description": "Execute an AI agent with a prompt or start interactive chat",
4724
4604
  "examples": [
4725
- "<%= config.bin %> <%= command.id %> -p \"Explain quantum computing in simple terms\"",
4726
- "<%= config.bin %> <%= command.id %> -p \"Write a Python function to sort a list\" --model \"gpt-4\"",
4727
- "<%= config.bin %> <%= command.id %> -p \"Translate to French: Hello world\" --temperature 0.3",
4728
- "<%= config.bin %> <%= command.id %> -p \"Generate a haiku\" --system \"You are a poet\" --max-tokens 100"
4605
+ "<%= config.bin %> <%= command.id %> -a \"Skip: Requirements Expert\" -p \"Create a dashboard for sales metrics\"",
4606
+ "<%= config.bin %> <%= command.id %> -a \"Child Component Generator Sub-agent\" --chat",
4607
+ "<%= config.bin %> <%= command.id %> -a \"Skip: Technical Design Expert\" -p \"Build a React component\" --verbose --timeout=600000"
4729
4608
  ],
4730
4609
  "flags": {
4731
- "prompt": {
4732
- "char": "p",
4733
- "description": "The prompt to execute",
4734
- "name": "prompt",
4610
+ "agent": {
4611
+ "char": "a",
4612
+ "description": "Agent name",
4613
+ "name": "agent",
4735
4614
  "required": true,
4736
4615
  "hasDynamicHelp": false,
4737
4616
  "multiple": false,
4738
4617
  "type": "option"
4739
4618
  },
4740
- "model": {
4741
- "char": "m",
4742
- "description": "AI model to use (e.g., gpt-4, claude-3-opus)",
4743
- "name": "model",
4744
- "hasDynamicHelp": false,
4745
- "multiple": false,
4746
- "type": "option"
4747
- },
4748
- "system": {
4749
- "char": "s",
4750
- "description": "System prompt to set context",
4751
- "name": "system",
4752
- "hasDynamicHelp": false,
4753
- "multiple": false,
4754
- "type": "option"
4755
- },
4756
- "temperature": {
4757
- "char": "t",
4758
- "description": "Temperature for response creativity (0.0-2.0)",
4759
- "name": "temperature",
4760
- "hasDynamicHelp": false,
4761
- "multiple": false,
4762
- "type": "option"
4763
- },
4764
- "max-tokens": {
4765
- "description": "Maximum tokens for the response",
4766
- "name": "max-tokens",
4619
+ "prompt": {
4620
+ "char": "p",
4621
+ "description": "Prompt to execute",
4622
+ "exclusive": [
4623
+ "chat"
4624
+ ],
4625
+ "name": "prompt",
4767
4626
  "hasDynamicHelp": false,
4768
4627
  "multiple": false,
4769
4628
  "type": "option"
4770
4629
  },
4771
- "configuration": {
4630
+ "chat": {
4772
4631
  "char": "c",
4773
- "description": "AI Configuration ID to use",
4774
- "name": "configuration",
4775
- "hasDynamicHelp": false,
4776
- "multiple": false,
4777
- "type": "option"
4632
+ "description": "Start interactive chat mode",
4633
+ "exclusive": [
4634
+ "prompt"
4635
+ ],
4636
+ "name": "chat",
4637
+ "allowNo": false,
4638
+ "type": "boolean"
4778
4639
  },
4779
4640
  "output": {
4780
4641
  "char": "o",
@@ -4808,7 +4669,7 @@
4808
4669
  },
4809
4670
  "hasDynamicHelp": false,
4810
4671
  "hiddenAliases": [],
4811
- "id": "ai:prompts:run",
4672
+ "id": "ai:agents:run",
4812
4673
  "pluginAlias": "@memberjunction/cli",
4813
4674
  "pluginName": "@memberjunction/cli",
4814
4675
  "pluginType": "core",
@@ -4819,7 +4680,7 @@
4819
4680
  "dist",
4820
4681
  "commands",
4821
4682
  "ai",
4822
- "prompts",
4683
+ "agents",
4823
4684
  "run.js"
4824
4685
  ]
4825
4686
  },
@@ -5039,6 +4900,145 @@
5039
4900
  "index.js"
5040
4901
  ]
5041
4902
  },
4903
+ "ai:prompts:list": {
4904
+ "aliases": [],
4905
+ "args": {},
4906
+ "description": "List available models for prompt execution",
4907
+ "examples": [
4908
+ "<%= config.bin %> <%= command.id %>"
4909
+ ],
4910
+ "flags": {
4911
+ "verbose": {
4912
+ "char": "v",
4913
+ "description": "Show detailed model information",
4914
+ "name": "verbose",
4915
+ "allowNo": false,
4916
+ "type": "boolean"
4917
+ }
4918
+ },
4919
+ "hasDynamicHelp": false,
4920
+ "hiddenAliases": [],
4921
+ "id": "ai:prompts:list",
4922
+ "pluginAlias": "@memberjunction/cli",
4923
+ "pluginName": "@memberjunction/cli",
4924
+ "pluginType": "core",
4925
+ "strict": true,
4926
+ "enableJsonFlag": false,
4927
+ "isESM": true,
4928
+ "relativePath": [
4929
+ "dist",
4930
+ "commands",
4931
+ "ai",
4932
+ "prompts",
4933
+ "list.js"
4934
+ ]
4935
+ },
4936
+ "ai:prompts:run": {
4937
+ "aliases": [],
4938
+ "args": {},
4939
+ "description": "Execute a direct prompt with an AI model",
4940
+ "examples": [
4941
+ "<%= config.bin %> <%= command.id %> -p \"Explain quantum computing in simple terms\"",
4942
+ "<%= config.bin %> <%= command.id %> -p \"Write a Python function to sort a list\" --model \"gpt-4\"",
4943
+ "<%= config.bin %> <%= command.id %> -p \"Translate to French: Hello world\" --temperature 0.3",
4944
+ "<%= config.bin %> <%= command.id %> -p \"Generate a haiku\" --system \"You are a poet\" --max-tokens 100"
4945
+ ],
4946
+ "flags": {
4947
+ "prompt": {
4948
+ "char": "p",
4949
+ "description": "The prompt to execute",
4950
+ "name": "prompt",
4951
+ "required": true,
4952
+ "hasDynamicHelp": false,
4953
+ "multiple": false,
4954
+ "type": "option"
4955
+ },
4956
+ "model": {
4957
+ "char": "m",
4958
+ "description": "AI model to use (e.g., gpt-4, claude-3-opus)",
4959
+ "name": "model",
4960
+ "hasDynamicHelp": false,
4961
+ "multiple": false,
4962
+ "type": "option"
4963
+ },
4964
+ "system": {
4965
+ "char": "s",
4966
+ "description": "System prompt to set context",
4967
+ "name": "system",
4968
+ "hasDynamicHelp": false,
4969
+ "multiple": false,
4970
+ "type": "option"
4971
+ },
4972
+ "temperature": {
4973
+ "char": "t",
4974
+ "description": "Temperature for response creativity (0.0-2.0)",
4975
+ "name": "temperature",
4976
+ "hasDynamicHelp": false,
4977
+ "multiple": false,
4978
+ "type": "option"
4979
+ },
4980
+ "max-tokens": {
4981
+ "description": "Maximum tokens for the response",
4982
+ "name": "max-tokens",
4983
+ "hasDynamicHelp": false,
4984
+ "multiple": false,
4985
+ "type": "option"
4986
+ },
4987
+ "configuration": {
4988
+ "char": "c",
4989
+ "description": "AI Configuration ID to use",
4990
+ "name": "configuration",
4991
+ "hasDynamicHelp": false,
4992
+ "multiple": false,
4993
+ "type": "option"
4994
+ },
4995
+ "output": {
4996
+ "char": "o",
4997
+ "description": "Output format",
4998
+ "name": "output",
4999
+ "default": "compact",
5000
+ "hasDynamicHelp": false,
5001
+ "multiple": false,
5002
+ "options": [
5003
+ "compact",
5004
+ "json",
5005
+ "table"
5006
+ ],
5007
+ "type": "option"
5008
+ },
5009
+ "verbose": {
5010
+ "char": "v",
5011
+ "description": "Show detailed execution information",
5012
+ "name": "verbose",
5013
+ "allowNo": false,
5014
+ "type": "boolean"
5015
+ },
5016
+ "timeout": {
5017
+ "description": "Execution timeout in milliseconds",
5018
+ "name": "timeout",
5019
+ "default": 300000,
5020
+ "hasDynamicHelp": false,
5021
+ "multiple": false,
5022
+ "type": "option"
5023
+ }
5024
+ },
5025
+ "hasDynamicHelp": false,
5026
+ "hiddenAliases": [],
5027
+ "id": "ai:prompts:run",
5028
+ "pluginAlias": "@memberjunction/cli",
5029
+ "pluginName": "@memberjunction/cli",
5030
+ "pluginType": "core",
5031
+ "strict": true,
5032
+ "enableJsonFlag": false,
5033
+ "isESM": true,
5034
+ "relativePath": [
5035
+ "dist",
5036
+ "commands",
5037
+ "ai",
5038
+ "prompts",
5039
+ "run.js"
5040
+ ]
5041
+ },
5042
5042
  "test:regression:build": {
5043
5043
  "aliases": [],
5044
5044
  "args": {
@@ -5480,5 +5480,5 @@
5480
5480
  ]
5481
5481
  }
5482
5482
  },
5483
- "version": "5.51.3"
5483
+ "version": "5.51.4"
5484
5484
  }