@memberjunction/cli 5.51.1 → 5.51.3

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 +1116 -1116
  2. package/package.json +17 -17
@@ -390,6 +390,67 @@
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
+ },
393
454
  "baseline:build": {
394
455
  "aliases": [],
395
456
  "args": {},
@@ -800,67 +861,6 @@
800
861
  "index.js"
801
862
  ]
802
863
  },
803
- "artifacts:reclassify": {
804
- "aliases": [],
805
- "args": {},
806
- "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.",
807
- "examples": [
808
- "<%= config.bin %> <%= command.id %>",
809
- "<%= config.bin %> <%= command.id %> --apply --limit 50"
810
- ],
811
- "flags": {
812
- "conversation-id": {
813
- "description": "Scope to artifacts attached to the given conversation.",
814
- "name": "conversation-id",
815
- "hasDynamicHelp": false,
816
- "multiple": false,
817
- "type": "option"
818
- },
819
- "since": {
820
- "description": "Scope to artifacts created on/after this ISO date.",
821
- "name": "since",
822
- "hasDynamicHelp": false,
823
- "multiple": false,
824
- "type": "option"
825
- },
826
- "limit": {
827
- "description": "Maximum number of rows to inspect.",
828
- "name": "limit",
829
- "default": 100,
830
- "hasDynamicHelp": false,
831
- "multiple": false,
832
- "type": "option"
833
- },
834
- "apply": {
835
- "description": "Write changes. Without this flag, this command only reports what it would do.",
836
- "name": "apply",
837
- "allowNo": false,
838
- "type": "boolean"
839
- },
840
- "verbose": {
841
- "char": "v",
842
- "description": "Print every candidate row, not just the summary.",
843
- "name": "verbose",
844
- "allowNo": false,
845
- "type": "boolean"
846
- }
847
- },
848
- "hasDynamicHelp": false,
849
- "hiddenAliases": [],
850
- "id": "artifacts:reclassify",
851
- "pluginAlias": "@memberjunction/cli",
852
- "pluginName": "@memberjunction/cli",
853
- "pluginType": "core",
854
- "strict": true,
855
- "enableJsonFlag": false,
856
- "isESM": true,
857
- "relativePath": [
858
- "dist",
859
- "commands",
860
- "artifacts",
861
- "reclassify.js"
862
- ]
863
- },
864
864
  "bundle": {
865
865
  "aliases": [],
866
866
  "args": {},
@@ -2911,60 +2911,106 @@
2911
2911
  "index.js"
2912
2912
  ]
2913
2913
  },
2914
- "sync:file-reset": {
2914
+ "test:compare": {
2915
2915
  "aliases": [],
2916
- "args": {},
2917
- "description": "Reset file metadata sections",
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",
2918
2929
  "examples": [
2919
2930
  "<%= config.bin %> <%= command.id %>",
2920
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
2921
- "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
2922
- "<%= config.bin %> <%= command.id %> --all"
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"
2923
2937
  ],
2924
2938
  "flags": {
2925
- "dir": {
2926
- "description": "Specific entity directory to reset",
2927
- "name": "dir",
2939
+ "version": {
2940
+ "char": "v",
2941
+ "description": "Compare runs by version",
2942
+ "name": "version",
2928
2943
  "hasDynamicHelp": false,
2929
- "multiple": false,
2944
+ "multiple": true,
2930
2945
  "type": "option"
2931
2946
  },
2932
- "sections": {
2933
- "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
2934
- "name": "sections",
2947
+ "commit": {
2948
+ "char": "c",
2949
+ "description": "Compare runs by git commit",
2950
+ "name": "commit",
2935
2951
  "hasDynamicHelp": false,
2936
- "multiple": false,
2952
+ "multiple": true,
2937
2953
  "type": "option"
2938
2954
  },
2939
- "all": {
2940
- "description": "Reset all metadata sections",
2941
- "name": "all",
2955
+ "diff-only": {
2956
+ "description": "Show only differences",
2957
+ "name": "diff-only",
2942
2958
  "allowNo": false,
2943
2959
  "type": "boolean"
2944
2960
  },
2945
- "dry-run": {
2946
- "description": "Show what would be reset without actually resetting",
2947
- "name": "dry-run",
2961
+ "latest": {
2962
+ "char": "l",
2963
+ "description": "Compare the two most recent completed suite runs",
2964
+ "name": "latest",
2948
2965
  "allowNo": false,
2949
2966
  "type": "boolean"
2950
2967
  },
2951
- "force": {
2952
- "description": "Skip confirmation prompts",
2953
- "name": "force",
2954
- "allowNo": false,
2955
- "type": "boolean"
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"
2956
2996
  },
2957
2997
  "verbose": {
2958
- "char": "v",
2959
- "description": "Show detailed output",
2998
+ "description": "Show detailed information",
2960
2999
  "name": "verbose",
2961
3000
  "allowNo": false,
2962
3001
  "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"
2963
3009
  }
2964
3010
  },
2965
3011
  "hasDynamicHelp": false,
2966
3012
  "hiddenAliases": [],
2967
- "id": "sync:file-reset",
3013
+ "id": "test:compare",
2968
3014
  "pluginAlias": "@memberjunction/cli",
2969
3015
  "pluginName": "@memberjunction/cli",
2970
3016
  "pluginType": "core",
@@ -2974,443 +3020,425 @@
2974
3020
  "relativePath": [
2975
3021
  "dist",
2976
3022
  "commands",
2977
- "sync",
2978
- "file-reset.js"
3023
+ "test",
3024
+ "compare.js"
2979
3025
  ]
2980
3026
  },
2981
- "sync:init": {
3027
+ "test:history": {
2982
3028
  "aliases": [],
2983
3029
  "args": {},
2984
- "description": "Initialize a directory for metadata synchronization",
3030
+ "description": "View test execution history",
2985
3031
  "examples": [
2986
- "<%= config.bin %> <%= command.id %>"
2987
- ],
2988
- "flags": {},
2989
- "hasDynamicHelp": false,
2990
- "hiddenAliases": [],
2991
- "id": "sync:init",
2992
- "pluginAlias": "@memberjunction/cli",
2993
- "pluginName": "@memberjunction/cli",
2994
- "pluginType": "core",
2995
- "strict": true,
2996
- "enableJsonFlag": false,
2997
- "isESM": true,
2998
- "relativePath": [
2999
- "dist",
3000
- "commands",
3001
- "sync",
3002
- "init.js"
3003
- ]
3004
- },
3005
- "sync:pull": {
3006
- "aliases": [],
3007
- "args": {},
3008
- "description": "Pull metadata from database to local files",
3009
- "examples": [
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"
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"
3013
3037
  ],
3014
3038
  "flags": {
3015
- "format": {
3016
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3017
- "name": "format",
3018
- "default": "text",
3039
+ "test": {
3040
+ "char": "t",
3041
+ "description": "Filter by test ID",
3042
+ "name": "test",
3019
3043
  "hasDynamicHelp": false,
3020
3044
  "multiple": false,
3021
- "options": [
3022
- "text",
3023
- "json",
3024
- "md"
3025
- ],
3026
3045
  "type": "option"
3027
3046
  },
3028
- "verbose": {
3029
- "char": "v",
3030
- "description": "Show detailed output",
3031
- "name": "verbose",
3032
- "allowNo": false,
3033
- "type": "boolean"
3034
- },
3035
- "no-banner": {
3036
- "description": "Suppress the startup banner and runtime advisory",
3037
- "name": "no-banner",
3038
- "allowNo": false,
3039
- "type": "boolean"
3040
- },
3041
- "entity": {
3042
- "description": "Entity name to pull",
3043
- "name": "entity",
3044
- "required": true,
3047
+ "recent": {
3048
+ "char": "r",
3049
+ "description": "Number of recent runs to show",
3050
+ "name": "recent",
3045
3051
  "hasDynamicHelp": false,
3046
3052
  "multiple": false,
3047
3053
  "type": "option"
3048
3054
  },
3049
- "filter": {
3050
- "description": "Additional filter for pulling specific records",
3051
- "name": "filter",
3055
+ "from": {
3056
+ "description": "Show history from date (YYYY-MM-DD)",
3057
+ "name": "from",
3052
3058
  "hasDynamicHelp": false,
3053
3059
  "multiple": false,
3054
3060
  "type": "option"
3055
3061
  },
3056
- "dry-run": {
3057
- "description": "Show what would be pulled without actually pulling",
3058
- "name": "dry-run",
3059
- "allowNo": false,
3060
- "type": "boolean"
3062
+ "status": {
3063
+ "char": "s",
3064
+ "description": "Filter by status",
3065
+ "name": "status",
3066
+ "hasDynamicHelp": false,
3067
+ "multiple": false,
3068
+ "type": "option"
3061
3069
  },
3062
- "multi-file": {
3063
- "description": "Create a single file with multiple records (provide filename)",
3064
- "name": "multi-file",
3070
+ "format": {
3071
+ "char": "f",
3072
+ "description": "Output format",
3073
+ "name": "format",
3074
+ "default": "console",
3065
3075
  "hasDynamicHelp": false,
3066
3076
  "multiple": false,
3077
+ "options": [
3078
+ "console",
3079
+ "json",
3080
+ "markdown"
3081
+ ],
3067
3082
  "type": "option"
3068
3083
  },
3069
- "no-validate": {
3070
- "description": "Skip validation before pull",
3071
- "name": "no-validate",
3072
- "allowNo": false,
3073
- "type": "boolean"
3084
+ "output": {
3085
+ "char": "o",
3086
+ "description": "Output file path",
3087
+ "name": "output",
3088
+ "hasDynamicHelp": false,
3089
+ "multiple": false,
3090
+ "type": "option"
3074
3091
  },
3075
- "update-existing": {
3076
- "description": "Update existing records during pull",
3077
- "name": "update-existing",
3092
+ "verbose": {
3093
+ "char": "v",
3094
+ "description": "Show detailed information",
3095
+ "name": "verbose",
3078
3096
  "allowNo": false,
3079
3097
  "type": "boolean"
3080
- },
3081
- "create-new": {
3082
- "description": "Create new files for records not found locally",
3083
- "name": "create-new",
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"
3127
+ ],
3128
+ "flags": {},
3129
+ "hasDynamicHelp": false,
3130
+ "hiddenAliases": [],
3131
+ "id": "test",
3132
+ "pluginAlias": "@memberjunction/cli",
3133
+ "pluginName": "@memberjunction/cli",
3134
+ "pluginType": "core",
3135
+ "strict": true,
3136
+ "enableJsonFlag": false,
3137
+ "isESM": true,
3138
+ "relativePath": [
3139
+ "dist",
3140
+ "commands",
3141
+ "test",
3142
+ "index.js"
3143
+ ]
3144
+ },
3145
+ "test:list": {
3146
+ "aliases": [],
3147
+ "args": {},
3148
+ "description": "List available tests, suites, and types",
3149
+ "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"
3156
+ ],
3157
+ "flags": {
3158
+ "suites": {
3159
+ "description": "List test suites instead of tests",
3160
+ "name": "suites",
3084
3161
  "allowNo": false,
3085
3162
  "type": "boolean"
3086
3163
  },
3087
- "backup-before-update": {
3088
- "description": "Create backups before updating files",
3089
- "name": "backup-before-update",
3164
+ "types": {
3165
+ "description": "List test types",
3166
+ "name": "types",
3090
3167
  "allowNo": false,
3091
3168
  "type": "boolean"
3092
3169
  },
3093
- "merge-strategy": {
3094
- "description": "Merge strategy for updates",
3095
- "name": "merge-strategy",
3096
- "default": "merge",
3170
+ "type": {
3171
+ "char": "t",
3172
+ "description": "Filter by test type",
3173
+ "name": "type",
3097
3174
  "hasDynamicHelp": false,
3098
3175
  "multiple": false,
3099
- "options": [
3100
- "merge",
3101
- "overwrite",
3102
- "skip"
3103
- ],
3104
3176
  "type": "option"
3105
3177
  },
3106
- "backup-directory": {
3107
- "description": "Custom backup directory (default: .backups)",
3108
- "name": "backup-directory",
3178
+ "tag": {
3179
+ "description": "Filter by tag",
3180
+ "name": "tag",
3109
3181
  "hasDynamicHelp": false,
3110
3182
  "multiple": false,
3111
3183
  "type": "option"
3112
3184
  },
3113
- "preserve-fields": {
3114
- "description": "Comma-separated list of fields to preserve during updates",
3115
- "name": "preserve-fields",
3185
+ "status": {
3186
+ "char": "s",
3187
+ "description": "Filter by status",
3188
+ "name": "status",
3116
3189
  "hasDynamicHelp": false,
3117
- "multiple": true,
3190
+ "multiple": false,
3118
3191
  "type": "option"
3119
3192
  },
3120
- "exclude-fields": {
3121
- "description": "Comma-separated list of fields to exclude from pull",
3122
- "name": "exclude-fields",
3193
+ "format": {
3194
+ "char": "f",
3195
+ "description": "Output format",
3196
+ "name": "format",
3197
+ "default": "console",
3123
3198
  "hasDynamicHelp": false,
3124
- "multiple": true,
3199
+ "multiple": false,
3200
+ "options": [
3201
+ "console",
3202
+ "json",
3203
+ "markdown"
3204
+ ],
3125
3205
  "type": "option"
3126
3206
  },
3127
- "target-dir": {
3128
- "description": "Specific target directory (overrides auto-discovery)",
3129
- "name": "target-dir",
3207
+ "output": {
3208
+ "char": "o",
3209
+ "description": "Output file path",
3210
+ "name": "output",
3130
3211
  "hasDynamicHelp": false,
3131
3212
  "multiple": false,
3132
3213
  "type": "option"
3133
3214
  },
3134
- "incremental": {
3135
- "description": "Only pull records updated since last successful pull",
3136
- "name": "incremental",
3215
+ "verbose": {
3216
+ "char": "v",
3217
+ "description": "Show detailed information",
3218
+ "name": "verbose",
3137
3219
  "allowNo": false,
3138
3220
  "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"
3146
3221
  }
3147
3222
  },
3148
3223
  "hasDynamicHelp": false,
3149
3224
  "hiddenAliases": [],
3150
- "id": "sync:pull",
3225
+ "id": "test:list",
3151
3226
  "pluginAlias": "@memberjunction/cli",
3152
3227
  "pluginName": "@memberjunction/cli",
3153
3228
  "pluginType": "core",
3154
3229
  "strict": true,
3155
3230
  "enableJsonFlag": false,
3156
- "Usage": {
3157
- "domain": "sync",
3158
- "command": "sync:pull",
3159
- "summary": "Pull database records into local metadata files.",
3160
- "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
3161
- "flags": [
3162
- {
3163
- "name": "--entity",
3164
- "type": "string",
3165
- "description": "Entity name to pull (required)"
3166
- },
3167
- {
3168
- "name": "--filter",
3169
- "type": "string",
3170
- "description": "Extra SQL filter for which records to pull"
3171
- },
3172
- {
3173
- "name": "--merge-strategy",
3174
- "type": "merge|overwrite|skip",
3175
- "description": "How to reconcile existing files"
3176
- },
3177
- {
3178
- "name": "--dry-run",
3179
- "type": "boolean",
3180
- "description": "Report what would be pulled without writing"
3181
- },
3182
- {
3183
- "name": "--format",
3184
- "type": "text|json|md",
3185
- "description": "Output format (json for machine-readable result)"
3186
- }
3187
- ],
3188
- "examples": [
3189
- "mj sync pull --entity=\"MJ: AI Prompts\"",
3190
- "mj sync pull --entity=\"Actions\" --format=json"
3191
- ],
3192
- "runtime": {
3193
- "class": "variable",
3194
- "typicalSeconds": 15,
3195
- "note": "scales with number of records matched for --entity"
3196
- }
3197
- },
3198
3231
  "isESM": true,
3199
3232
  "relativePath": [
3200
3233
  "dist",
3201
3234
  "commands",
3202
- "sync",
3203
- "pull.js"
3235
+ "test",
3236
+ "list.js"
3204
3237
  ]
3205
3238
  },
3206
- "sync:push": {
3239
+ "test:run": {
3207
3240
  "aliases": [],
3208
- "args": {},
3209
- "description": "Push local file changes to the database",
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",
3210
3249
  "examples": [
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"
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"
3215
3255
  ],
3216
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
+ },
3217
3273
  "format": {
3218
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3274
+ "char": "f",
3275
+ "description": "Output format",
3219
3276
  "name": "format",
3220
- "default": "text",
3277
+ "default": "console",
3221
3278
  "hasDynamicHelp": false,
3222
3279
  "multiple": false,
3223
3280
  "options": [
3224
- "text",
3281
+ "console",
3225
3282
  "json",
3226
- "md"
3283
+ "markdown"
3227
3284
  ],
3228
3285
  "type": "option"
3229
3286
  },
3230
- "verbose": {
3231
- "char": "v",
3232
- "description": "Show detailed output",
3233
- "name": "verbose",
3234
- "allowNo": false,
3235
- "type": "boolean"
3236
- },
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",
3287
+ "output": {
3288
+ "char": "o",
3289
+ "description": "Output file path",
3290
+ "name": "output",
3246
3291
  "hasDynamicHelp": false,
3247
3292
  "multiple": false,
3248
3293
  "type": "option"
3249
3294
  },
3250
3295
  "dry-run": {
3251
- "description": "Show what would be pushed without actually pushing",
3296
+ "description": "Validate without executing",
3252
3297
  "name": "dry-run",
3253
3298
  "allowNo": false,
3254
3299
  "type": "boolean"
3255
3300
  },
3256
- "ci": {
3257
- "description": "CI mode - no prompts, fail on issues",
3258
- "name": "ci",
3259
- "allowNo": false,
3260
- "type": "boolean"
3261
- },
3262
- "no-validate": {
3263
- "description": "Skip validation before push",
3264
- "name": "no-validate",
3265
- "allowNo": false,
3266
- "type": "boolean"
3267
- },
3268
- "delete-db-only": {
3269
- "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
3270
- "name": "delete-db-only",
3301
+ "verbose": {
3302
+ "char": "v",
3303
+ "description": "Show detailed execution information",
3304
+ "name": "verbose",
3271
3305
  "allowNo": false,
3272
3306
  "type": "boolean"
3273
3307
  },
3274
- "parallel-batch-size": {
3275
- "description": "Number of records to process in parallel (default: 10)",
3276
- "name": "parallel-batch-size",
3277
- "default": 10,
3278
- "hasDynamicHelp": false,
3279
- "multiple": false,
3280
- "type": "option"
3281
- },
3282
- "include": {
3283
- "description": "Only process these directories (comma-separated, supports patterns)",
3284
- "name": "include",
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",
3285
3311
  "hasDynamicHelp": false,
3286
3312
  "multiple": false,
3287
3313
  "type": "option"
3288
3314
  },
3289
- "exclude": {
3290
- "description": "Skip these directories (comma-separated, supports patterns)",
3291
- "name": "exclude",
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",
3292
3318
  "hasDynamicHelp": false,
3293
3319
  "multiple": false,
3294
3320
  "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"
3307
3321
  }
3308
3322
  },
3309
3323
  "hasDynamicHelp": false,
3310
3324
  "hiddenAliases": [],
3311
- "id": "sync:push",
3325
+ "id": "test:run",
3312
3326
  "pluginAlias": "@memberjunction/cli",
3313
3327
  "pluginName": "@memberjunction/cli",
3314
3328
  "pluginType": "core",
3315
3329
  "strict": true,
3316
3330
  "enableJsonFlag": false,
3317
- "Usage": {
3318
- "domain": "sync",
3319
- "command": "sync:push",
3320
- "summary": "Push local metadata files to the database (upsert).",
3321
- "description": "Reads entity directories under --dir and creates/updates matching records. Runs validation first unless --no-validate.",
3322
- "flags": [
3323
- {
3324
- "name": "--dir",
3325
- "type": "string",
3326
- "description": "Entity directory to push"
3327
- },
3328
- {
3329
- "name": "--dry-run",
3330
- "type": "boolean",
3331
- "description": "Report what would change without writing"
3332
- },
3333
- {
3334
- "name": "--ci",
3335
- "type": "boolean",
3336
- "description": "No prompts; non-zero exit on error"
3337
- },
3338
- {
3339
- "name": "--no-validate",
3340
- "type": "boolean",
3341
- "description": "Skip pre-push validation"
3342
- },
3343
- {
3344
- "name": "--incremental",
3345
- "type": "boolean",
3346
- "description": "Skip unchanged files using stored checksums"
3347
- },
3348
- {
3349
- "name": "--format",
3350
- "type": "text|json|md",
3351
- "description": "Output format (json for machine-readable result)"
3352
- }
3353
- ],
3354
- "examples": [
3355
- "mj sync push --dir=ai-agents",
3356
- "mj sync push --ci --format=json"
3357
- ],
3358
- "runtime": {
3359
- "class": "variable",
3360
- "typicalSeconds": 20,
3361
- "note": "scales with number of records in --dir"
3362
- }
3363
- },
3364
3331
  "isESM": true,
3365
3332
  "relativePath": [
3366
3333
  "dist",
3367
3334
  "commands",
3368
- "sync",
3369
- "push.js"
3335
+ "test",
3336
+ "run.js"
3370
3337
  ]
3371
3338
  },
3372
- "sync:status": {
3339
+ "test:suite": {
3373
3340
  "aliases": [],
3374
- "args": {},
3375
- "description": "Show status of local files vs database",
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",
3376
3349
  "examples": [
3377
- "<%= config.bin %> <%= command.id %>",
3378
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3379
- "<%= config.bin %> <%= command.id %> --verbose"
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"
3380
3354
  ],
3381
3355
  "flags": {
3382
- "dir": {
3383
- "description": "Specific entity directory to check status",
3384
- "name": "dir",
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
+ "format": {
3365
+ "char": "f",
3366
+ "description": "Output format",
3367
+ "name": "format",
3368
+ "default": "console",
3369
+ "hasDynamicHelp": false,
3370
+ "multiple": false,
3371
+ "options": [
3372
+ "console",
3373
+ "json",
3374
+ "markdown"
3375
+ ],
3376
+ "type": "option"
3377
+ },
3378
+ "output": {
3379
+ "char": "o",
3380
+ "description": "Output file path",
3381
+ "name": "output",
3385
3382
  "hasDynamicHelp": false,
3386
3383
  "multiple": false,
3387
3384
  "type": "option"
3388
3385
  },
3389
3386
  "verbose": {
3390
3387
  "char": "v",
3391
- "description": "Show detailed field-level differences",
3388
+ "description": "Show detailed execution information",
3392
3389
  "name": "verbose",
3393
3390
  "allowNo": false,
3394
3391
  "type": "boolean"
3395
3392
  },
3396
- "include": {
3397
- "description": "Only process these directories (comma-separated, supports patterns)",
3398
- "name": "include",
3393
+ "delay": {
3394
+ "char": "d",
3395
+ "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
3396
+ "name": "delay",
3397
+ "default": 0,
3399
3398
  "hasDynamicHelp": false,
3400
3399
  "multiple": false,
3401
3400
  "type": "option"
3402
3401
  },
3403
- "exclude": {
3404
- "description": "Skip these directories (comma-separated, supports patterns)",
3405
- "name": "exclude",
3406
- "hasDynamicHelp": false,
3407
- "multiple": false,
3402
+ "parallel": {
3403
+ "char": "p",
3404
+ "description": "Run tests in parallel with shared browser sessions",
3405
+ "name": "parallel",
3406
+ "allowNo": false,
3407
+ "type": "boolean"
3408
+ },
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"
3416
+ },
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",
3420
+ "hasDynamicHelp": false,
3421
+ "multiple": false,
3422
+ "type": "option"
3423
+ },
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",
3427
+ "hasDynamicHelp": false,
3428
+ "multiple": false,
3429
+ "type": "option"
3430
+ },
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",
3434
+ "hasDynamicHelp": false,
3435
+ "multiple": false,
3408
3436
  "type": "option"
3409
3437
  }
3410
3438
  },
3411
3439
  "hasDynamicHelp": false,
3412
3440
  "hiddenAliases": [],
3413
- "id": "sync:status",
3441
+ "id": "test:suite",
3414
3442
  "pluginAlias": "@memberjunction/cli",
3415
3443
  "pluginName": "@memberjunction/cli",
3416
3444
  "pluginType": "core",
@@ -3420,32 +3448,82 @@
3420
3448
  "relativePath": [
3421
3449
  "dist",
3422
3450
  "commands",
3423
- "sync",
3424
- "status.js"
3451
+ "test",
3452
+ "suite.js"
3425
3453
  ]
3426
3454
  },
3427
- "sync:usage": {
3455
+ "test:validate": {
3428
3456
  "aliases": [],
3429
- "args": {},
3430
- "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
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",
3465
+ "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"
3471
+ ],
3431
3472
  "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",
3484
+ "hasDynamicHelp": false,
3485
+ "multiple": false,
3486
+ "type": "option"
3487
+ },
3488
+ "save-report": {
3489
+ "description": "Save validation report to file",
3490
+ "name": "save-report",
3491
+ "allowNo": false,
3492
+ "type": "boolean"
3493
+ },
3432
3494
  "format": {
3495
+ "char": "f",
3433
3496
  "description": "Output format",
3434
3497
  "name": "format",
3435
- "default": "text",
3498
+ "default": "console",
3436
3499
  "hasDynamicHelp": false,
3437
3500
  "multiple": false,
3438
3501
  "options": [
3439
- "text",
3502
+ "console",
3440
3503
  "json",
3441
- "md"
3504
+ "markdown"
3442
3505
  ],
3443
3506
  "type": "option"
3507
+ },
3508
+ "output": {
3509
+ "char": "o",
3510
+ "description": "Output file path",
3511
+ "name": "output",
3512
+ "hasDynamicHelp": false,
3513
+ "multiple": false,
3514
+ "type": "option"
3515
+ },
3516
+ "verbose": {
3517
+ "char": "v",
3518
+ "description": "Show detailed information",
3519
+ "name": "verbose",
3520
+ "allowNo": false,
3521
+ "type": "boolean"
3444
3522
  }
3445
3523
  },
3446
3524
  "hasDynamicHelp": false,
3447
3525
  "hiddenAliases": [],
3448
- "id": "sync:usage",
3526
+ "id": "test:validate",
3449
3527
  "pluginAlias": "@memberjunction/cli",
3450
3528
  "pluginName": "@memberjunction/cli",
3451
3529
  "pluginType": "core",
@@ -3455,52 +3533,96 @@
3455
3533
  "relativePath": [
3456
3534
  "dist",
3457
3535
  "commands",
3458
- "sync",
3459
- "usage.js"
3536
+ "test",
3537
+ "validate.js"
3460
3538
  ]
3461
3539
  },
3462
- "sync:validate": {
3540
+ "translate-sql": {
3463
3541
  "aliases": [],
3464
3542
  "args": {},
3465
- "description": "Validate metadata files",
3543
+ "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
3466
3544
  "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"
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"
3471
3549
  ],
3472
3550
  "flags": {
3473
- "dir": {
3474
- "description": "Specific entity directory to validate",
3475
- "name": "dir",
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,
3476
3567
  "hasDynamicHelp": false,
3477
3568
  "multiple": false,
3569
+ "options": [
3570
+ "sqlserver",
3571
+ "postgresql"
3572
+ ],
3478
3573
  "type": "option"
3479
3574
  },
3480
- "verbose": {
3481
- "char": "v",
3482
- "description": "Show detailed validation output",
3483
- "name": "verbose",
3575
+ "scope": {
3576
+ "description": "What to scan for translation",
3577
+ "name": "scope",
3578
+ "default": "all",
3579
+ "hasDynamicHelp": false,
3580
+ "multiple": false,
3581
+ "options": [
3582
+ "queries",
3583
+ "views",
3584
+ "filters",
3585
+ "all"
3586
+ ],
3587
+ "type": "option"
3588
+ },
3589
+ "sql": {
3590
+ "description": "Translate a single SQL fragment (inline mode)",
3591
+ "name": "sql",
3592
+ "hasDynamicHelp": false,
3593
+ "multiple": false,
3594
+ "type": "option"
3595
+ },
3596
+ "dry-run": {
3597
+ "description": "Show what would be translated without making changes",
3598
+ "name": "dry-run",
3484
3599
  "allowNo": false,
3485
3600
  "type": "boolean"
3486
3601
  },
3487
- "save-report": {
3488
- "description": "Save validation report as markdown file",
3489
- "name": "save-report",
3602
+ "review": {
3603
+ "description": "Generate review report only (no writes to database)",
3604
+ "name": "review",
3490
3605
  "allowNo": false,
3491
3606
  "type": "boolean"
3492
3607
  },
3493
3608
  "output": {
3494
- "description": "Output file path for validation report (default: validation-report.md)",
3609
+ "char": "o",
3610
+ "description": "Output directory for the translation report",
3495
3611
  "name": "output",
3496
3612
  "hasDynamicHelp": false,
3497
3613
  "multiple": false,
3498
3614
  "type": "option"
3615
+ },
3616
+ "force": {
3617
+ "description": "Re-translate even if platform variants already exist",
3618
+ "name": "force",
3619
+ "allowNo": false,
3620
+ "type": "boolean"
3499
3621
  }
3500
3622
  },
3501
3623
  "hasDynamicHelp": false,
3502
3624
  "hiddenAliases": [],
3503
- "id": "sync:validate",
3625
+ "id": "translate-sql",
3504
3626
  "pluginAlias": "@memberjunction/cli",
3505
3627
  "pluginName": "@memberjunction/cli",
3506
3628
  "pluginType": "core",
@@ -3510,165 +3632,135 @@
3510
3632
  "relativePath": [
3511
3633
  "dist",
3512
3634
  "commands",
3513
- "sync",
3514
- "validate.js"
3635
+ "translate-sql",
3636
+ "index.js"
3515
3637
  ]
3516
3638
  },
3517
- "sync:watch": {
3639
+ "update:claude": {
3518
3640
  "aliases": [],
3519
3641
  "args": {},
3520
- "description": "Watch for file changes and sync automatically",
3642
+ "description": "Update the Claude Code pack in the current directory.",
3521
3643
  "examples": [
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"
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"
3526
3649
  ],
3527
3650
  "flags": {
3528
3651
  "dir": {
3529
- "description": "Specific entity directory to watch",
3652
+ "description": "Target directory",
3530
3653
  "name": "dir",
3654
+ "default": ".",
3531
3655
  "hasDynamicHelp": false,
3532
3656
  "multiple": false,
3533
3657
  "type": "option"
3534
3658
  },
3535
- "debounce": {
3536
- "description": "Debounce delay in milliseconds (default: 500)",
3537
- "name": "debounce",
3659
+ "major": {
3660
+ "description": "Force a specific MJ major (default: detected from package.json)",
3661
+ "name": "major",
3538
3662
  "hasDynamicHelp": false,
3539
3663
  "multiple": false,
3540
3664
  "type": "option"
3541
3665
  },
3542
- "no-validate": {
3543
- "description": "Skip validation before sync",
3544
- "name": "no-validate",
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",
3545
3683
  "allowNo": false,
3546
3684
  "type": "boolean"
3547
3685
  },
3548
- "verbose": {
3549
- "char": "v",
3550
- "description": "Show detailed output",
3551
- "name": "verbose",
3686
+ "dry-run": {
3687
+ "description": "Print what would be written; change nothing",
3688
+ "name": "dry-run",
3552
3689
  "allowNo": false,
3553
3690
  "type": "boolean"
3554
- }
3555
- },
3556
- "hasDynamicHelp": false,
3557
- "hiddenAliases": [],
3558
- "id": "sync:watch",
3559
- "pluginAlias": "@memberjunction/cli",
3560
- "pluginName": "@memberjunction/cli",
3561
- "pluginType": "core",
3562
- "strict": true,
3563
- "enableJsonFlag": false,
3564
- "isESM": true,
3565
- "relativePath": [
3566
- "dist",
3567
- "commands",
3568
- "sync",
3569
- "watch.js"
3570
- ]
3571
- },
3572
- "test:compare": {
3573
- "aliases": [],
3574
- "args": {
3575
- "runId1": {
3576
- "description": "First test run ID to compare",
3577
- "name": "runId1",
3578
- "required": false
3579
3691
  },
3580
- "runId2": {
3581
- "description": "Second test run ID to compare",
3582
- "name": "runId2",
3583
- "required": false
3584
- }
3585
- },
3586
- "description": "Compare test runs for regression detection",
3587
- "examples": [
3588
- "<%= config.bin %> <%= command.id %>",
3589
- "<%= config.bin %> <%= command.id %> --latest",
3590
- "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
3591
- "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
3592
- "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
3593
- "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
3594
- "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
3595
- ],
3596
- "flags": {
3597
- "version": {
3598
- "char": "v",
3599
- "description": "Compare runs by version",
3600
- "name": "version",
3601
- "hasDynamicHelp": false,
3602
- "multiple": true,
3603
- "type": "option"
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"
3604
3698
  },
3605
- "commit": {
3606
- "char": "c",
3607
- "description": "Compare runs by git commit",
3608
- "name": "commit",
3609
- "hasDynamicHelp": false,
3610
- "multiple": true,
3611
- "type": "option"
3699
+ "force": {
3700
+ "description": "Overwrite user-customized commands/skills (saves .bak files)",
3701
+ "name": "force",
3702
+ "allowNo": false,
3703
+ "type": "boolean"
3612
3704
  },
3613
- "diff-only": {
3614
- "description": "Show only differences",
3615
- "name": "diff-only",
3705
+ "skip-commands": {
3706
+ "description": "Skip seeding .claude/commands/",
3707
+ "name": "skip-commands",
3616
3708
  "allowNo": false,
3617
3709
  "type": "boolean"
3618
3710
  },
3619
- "latest": {
3620
- "char": "l",
3621
- "description": "Compare the two most recent completed suite runs",
3622
- "name": "latest",
3711
+ "skip-skills": {
3712
+ "description": "Skip seeding .claude/skills/",
3713
+ "name": "skip-skills",
3623
3714
  "allowNo": false,
3624
3715
  "type": "boolean"
3625
3716
  },
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"
3717
+ "skip-settings": {
3718
+ "description": "Skip merging .claude/settings.json",
3719
+ "name": "skip-settings",
3720
+ "allowNo": false,
3721
+ "type": "boolean"
3632
3722
  },
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"
3723
+ "check": {
3724
+ "description": "Compare local pack version to remote without writing anything",
3725
+ "name": "check",
3726
+ "allowNo": false,
3727
+ "type": "boolean"
3646
3728
  },
3647
- "output": {
3648
- "char": "o",
3649
- "description": "Output file path",
3650
- "name": "output",
3651
- "hasDynamicHelp": false,
3652
- "multiple": false,
3653
- "type": "option"
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",
3750
+ "allowNo": false,
3751
+ "type": "boolean"
3654
3752
  },
3655
3753
  "verbose": {
3656
- "description": "Show detailed information",
3754
+ "char": "v",
3755
+ "description": "Show progress messages",
3657
3756
  "name": "verbose",
3658
3757
  "allowNo": false,
3659
3758
  "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"
3667
3759
  }
3668
3760
  },
3669
3761
  "hasDynamicHelp": false,
3670
3762
  "hiddenAliases": [],
3671
- "id": "test:compare",
3763
+ "id": "update:claude",
3672
3764
  "pluginAlias": "@memberjunction/cli",
3673
3765
  "pluginName": "@memberjunction/cli",
3674
3766
  "pluginType": "core",
@@ -3678,78 +3770,56 @@
3678
3770
  "relativePath": [
3679
3771
  "dist",
3680
3772
  "commands",
3681
- "test",
3682
- "compare.js"
3773
+ "update",
3774
+ "claude.js"
3683
3775
  ]
3684
3776
  },
3685
- "test:history": {
3777
+ "sync:file-reset": {
3686
3778
  "aliases": [],
3687
3779
  "args": {},
3688
- "description": "View test execution history",
3780
+ "description": "Reset file metadata sections",
3689
3781
  "examples": [
3690
3782
  "<%= 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"
3783
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3784
+ "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
3785
+ "<%= config.bin %> <%= command.id %> --all"
3695
3786
  ],
3696
3787
  "flags": {
3697
- "test": {
3698
- "char": "t",
3699
- "description": "Filter by test ID",
3700
- "name": "test",
3701
- "hasDynamicHelp": false,
3702
- "multiple": false,
3703
- "type": "option"
3704
- },
3705
- "recent": {
3706
- "char": "r",
3707
- "description": "Number of recent runs to show",
3708
- "name": "recent",
3788
+ "dir": {
3789
+ "description": "Specific entity directory to reset",
3790
+ "name": "dir",
3709
3791
  "hasDynamicHelp": false,
3710
3792
  "multiple": false,
3711
3793
  "type": "option"
3712
3794
  },
3713
- "from": {
3714
- "description": "Show history from date (YYYY-MM-DD)",
3715
- "name": "from",
3795
+ "sections": {
3796
+ "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
3797
+ "name": "sections",
3716
3798
  "hasDynamicHelp": false,
3717
3799
  "multiple": false,
3718
3800
  "type": "option"
3719
3801
  },
3720
- "status": {
3721
- "char": "s",
3722
- "description": "Filter by status",
3723
- "name": "status",
3724
- "hasDynamicHelp": false,
3725
- "multiple": false,
3726
- "type": "option"
3802
+ "all": {
3803
+ "description": "Reset all metadata sections",
3804
+ "name": "all",
3805
+ "allowNo": false,
3806
+ "type": "boolean"
3727
3807
  },
3728
- "format": {
3729
- "char": "f",
3730
- "description": "Output format",
3731
- "name": "format",
3732
- "default": "console",
3733
- "hasDynamicHelp": false,
3734
- "multiple": false,
3735
- "options": [
3736
- "console",
3737
- "json",
3738
- "markdown"
3739
- ],
3740
- "type": "option"
3808
+ "dry-run": {
3809
+ "description": "Show what would be reset without actually resetting",
3810
+ "name": "dry-run",
3811
+ "allowNo": false,
3812
+ "type": "boolean"
3741
3813
  },
3742
- "output": {
3743
- "char": "o",
3744
- "description": "Output file path",
3745
- "name": "output",
3746
- "hasDynamicHelp": false,
3747
- "multiple": false,
3748
- "type": "option"
3814
+ "force": {
3815
+ "description": "Skip confirmation prompts",
3816
+ "name": "force",
3817
+ "allowNo": false,
3818
+ "type": "boolean"
3749
3819
  },
3750
3820
  "verbose": {
3751
3821
  "char": "v",
3752
- "description": "Show detailed information",
3822
+ "description": "Show detailed output",
3753
3823
  "name": "verbose",
3754
3824
  "allowNo": false,
3755
3825
  "type": "boolean"
@@ -3757,7 +3827,7 @@
3757
3827
  },
3758
3828
  "hasDynamicHelp": false,
3759
3829
  "hiddenAliases": [],
3760
- "id": "test:history",
3830
+ "id": "sync:file-reset",
3761
3831
  "pluginAlias": "@memberjunction/cli",
3762
3832
  "pluginName": "@memberjunction/cli",
3763
3833
  "pluginType": "core",
@@ -3767,26 +3837,21 @@
3767
3837
  "relativePath": [
3768
3838
  "dist",
3769
3839
  "commands",
3770
- "test",
3771
- "history.js"
3840
+ "sync",
3841
+ "file-reset.js"
3772
3842
  ]
3773
3843
  },
3774
- "test": {
3844
+ "sync:init": {
3775
3845
  "aliases": [],
3776
3846
  "args": {},
3777
- "description": "MemberJunction Testing Framework - Execute and manage tests",
3847
+ "description": "Initialize a directory for metadata synchronization",
3778
3848
  "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"
3849
+ "<%= config.bin %> <%= command.id %>"
3785
3850
  ],
3786
3851
  "flags": {},
3787
3852
  "hasDynamicHelp": false,
3788
3853
  "hiddenAliases": [],
3789
- "id": "test",
3854
+ "id": "sync:init",
3790
3855
  "pluginAlias": "@memberjunction/cli",
3791
3856
  "pluginName": "@memberjunction/cli",
3792
3857
  "pluginType": "core",
@@ -3796,299 +3861,411 @@
3796
3861
  "relativePath": [
3797
3862
  "dist",
3798
3863
  "commands",
3799
- "test",
3800
- "index.js"
3864
+ "sync",
3865
+ "init.js"
3801
3866
  ]
3802
3867
  },
3803
- "test:list": {
3868
+ "sync:pull": {
3804
3869
  "aliases": [],
3805
3870
  "args": {},
3806
- "description": "List available tests, suites, and types",
3871
+ "description": "Pull metadata from database to local files",
3807
3872
  "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"
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"
3814
3876
  ],
3815
3877
  "flags": {
3816
- "suites": {
3817
- "description": "List test suites instead of tests",
3818
- "name": "suites",
3819
- "allowNo": false,
3878
+ "format": {
3879
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3880
+ "name": "format",
3881
+ "default": "text",
3882
+ "hasDynamicHelp": false,
3883
+ "multiple": false,
3884
+ "options": [
3885
+ "text",
3886
+ "json",
3887
+ "md"
3888
+ ],
3889
+ "type": "option"
3890
+ },
3891
+ "verbose": {
3892
+ "char": "v",
3893
+ "description": "Show detailed output",
3894
+ "name": "verbose",
3895
+ "allowNo": false,
3820
3896
  "type": "boolean"
3821
3897
  },
3822
- "types": {
3823
- "description": "List test types",
3824
- "name": "types",
3898
+ "no-banner": {
3899
+ "description": "Suppress the startup banner and runtime advisory",
3900
+ "name": "no-banner",
3825
3901
  "allowNo": false,
3826
3902
  "type": "boolean"
3827
3903
  },
3828
- "type": {
3829
- "char": "t",
3830
- "description": "Filter by test type",
3831
- "name": "type",
3904
+ "entity": {
3905
+ "description": "Entity name to pull",
3906
+ "name": "entity",
3907
+ "required": true,
3832
3908
  "hasDynamicHelp": false,
3833
3909
  "multiple": false,
3834
3910
  "type": "option"
3835
3911
  },
3836
- "tag": {
3837
- "description": "Filter by tag",
3838
- "name": "tag",
3912
+ "filter": {
3913
+ "description": "Additional filter for pulling specific records",
3914
+ "name": "filter",
3839
3915
  "hasDynamicHelp": false,
3840
3916
  "multiple": false,
3841
3917
  "type": "option"
3842
3918
  },
3843
- "status": {
3844
- "char": "s",
3845
- "description": "Filter by status",
3846
- "name": "status",
3919
+ "dry-run": {
3920
+ "description": "Show what would be pulled without actually pulling",
3921
+ "name": "dry-run",
3922
+ "allowNo": false,
3923
+ "type": "boolean"
3924
+ },
3925
+ "multi-file": {
3926
+ "description": "Create a single file with multiple records (provide filename)",
3927
+ "name": "multi-file",
3847
3928
  "hasDynamicHelp": false,
3848
3929
  "multiple": false,
3849
3930
  "type": "option"
3850
3931
  },
3851
- "format": {
3852
- "char": "f",
3853
- "description": "Output format",
3854
- "name": "format",
3855
- "default": "console",
3932
+ "no-validate": {
3933
+ "description": "Skip validation before pull",
3934
+ "name": "no-validate",
3935
+ "allowNo": false,
3936
+ "type": "boolean"
3937
+ },
3938
+ "update-existing": {
3939
+ "description": "Update existing records during pull",
3940
+ "name": "update-existing",
3941
+ "allowNo": false,
3942
+ "type": "boolean"
3943
+ },
3944
+ "create-new": {
3945
+ "description": "Create new files for records not found locally",
3946
+ "name": "create-new",
3947
+ "allowNo": false,
3948
+ "type": "boolean"
3949
+ },
3950
+ "backup-before-update": {
3951
+ "description": "Create backups before updating files",
3952
+ "name": "backup-before-update",
3953
+ "allowNo": false,
3954
+ "type": "boolean"
3955
+ },
3956
+ "merge-strategy": {
3957
+ "description": "Merge strategy for updates",
3958
+ "name": "merge-strategy",
3959
+ "default": "merge",
3856
3960
  "hasDynamicHelp": false,
3857
3961
  "multiple": false,
3858
3962
  "options": [
3859
- "console",
3860
- "json",
3861
- "markdown"
3963
+ "merge",
3964
+ "overwrite",
3965
+ "skip"
3862
3966
  ],
3863
3967
  "type": "option"
3864
3968
  },
3865
- "output": {
3866
- "char": "o",
3867
- "description": "Output file path",
3868
- "name": "output",
3969
+ "backup-directory": {
3970
+ "description": "Custom backup directory (default: .backups)",
3971
+ "name": "backup-directory",
3869
3972
  "hasDynamicHelp": false,
3870
3973
  "multiple": false,
3871
3974
  "type": "option"
3872
3975
  },
3873
- "verbose": {
3874
- "char": "v",
3875
- "description": "Show detailed information",
3876
- "name": "verbose",
3976
+ "preserve-fields": {
3977
+ "description": "Comma-separated list of fields to preserve during updates",
3978
+ "name": "preserve-fields",
3979
+ "hasDynamicHelp": false,
3980
+ "multiple": true,
3981
+ "type": "option"
3982
+ },
3983
+ "exclude-fields": {
3984
+ "description": "Comma-separated list of fields to exclude from pull",
3985
+ "name": "exclude-fields",
3986
+ "hasDynamicHelp": false,
3987
+ "multiple": true,
3988
+ "type": "option"
3989
+ },
3990
+ "target-dir": {
3991
+ "description": "Specific target directory (overrides auto-discovery)",
3992
+ "name": "target-dir",
3993
+ "hasDynamicHelp": false,
3994
+ "multiple": false,
3995
+ "type": "option"
3996
+ },
3997
+ "incremental": {
3998
+ "description": "Only pull records updated since last successful pull",
3999
+ "name": "incremental",
3877
4000
  "allowNo": false,
3878
4001
  "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"
3879
4009
  }
3880
4010
  },
3881
4011
  "hasDynamicHelp": false,
3882
4012
  "hiddenAliases": [],
3883
- "id": "test:list",
4013
+ "id": "sync:pull",
3884
4014
  "pluginAlias": "@memberjunction/cli",
3885
4015
  "pluginName": "@memberjunction/cli",
3886
4016
  "pluginType": "core",
3887
4017
  "strict": true,
3888
4018
  "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
+ },
3889
4061
  "isESM": true,
3890
4062
  "relativePath": [
3891
4063
  "dist",
3892
4064
  "commands",
3893
- "test",
3894
- "list.js"
4065
+ "sync",
4066
+ "pull.js"
3895
4067
  ]
3896
4068
  },
3897
- "test:run": {
4069
+ "sync:push": {
3898
4070
  "aliases": [],
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",
4071
+ "args": {},
4072
+ "description": "Push local file changes to the database",
3907
4073
  "examples": [
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"
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"
3913
4078
  ],
3914
4079
  "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
- },
3931
4080
  "format": {
3932
- "char": "f",
3933
- "description": "Output format",
4081
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3934
4082
  "name": "format",
3935
- "default": "console",
4083
+ "default": "text",
3936
4084
  "hasDynamicHelp": false,
3937
4085
  "multiple": false,
3938
4086
  "options": [
3939
- "console",
4087
+ "text",
3940
4088
  "json",
3941
- "markdown"
4089
+ "md"
3942
4090
  ],
3943
4091
  "type": "option"
3944
4092
  },
3945
- "output": {
3946
- "char": "o",
3947
- "description": "Output file path",
3948
- "name": "output",
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",
3949
4109
  "hasDynamicHelp": false,
3950
4110
  "multiple": false,
3951
4111
  "type": "option"
3952
4112
  },
3953
4113
  "dry-run": {
3954
- "description": "Validate without executing",
4114
+ "description": "Show what would be pushed without actually pushing",
3955
4115
  "name": "dry-run",
3956
4116
  "allowNo": false,
3957
4117
  "type": "boolean"
3958
4118
  },
3959
- "verbose": {
3960
- "char": "v",
3961
- "description": "Show detailed execution information",
3962
- "name": "verbose",
4119
+ "ci": {
4120
+ "description": "CI mode - no prompts, fail on issues",
4121
+ "name": "ci",
3963
4122
  "allowNo": false,
3964
4123
  "type": "boolean"
3965
4124
  },
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",
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",
4134
+ "allowNo": false,
4135
+ "type": "boolean"
4136
+ },
4137
+ "parallel-batch-size": {
4138
+ "description": "Number of records to process in parallel (default: 10)",
4139
+ "name": "parallel-batch-size",
4140
+ "default": 10,
3969
4141
  "hasDynamicHelp": false,
3970
4142
  "multiple": false,
3971
4143
  "type": "option"
3972
4144
  },
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",
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",
3976
4155
  "hasDynamicHelp": false,
3977
4156
  "multiple": false,
3978
4157
  "type": "option"
4158
+ },
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"
3979
4170
  }
3980
4171
  },
3981
4172
  "hasDynamicHelp": false,
3982
4173
  "hiddenAliases": [],
3983
- "id": "test:run",
4174
+ "id": "sync:push",
3984
4175
  "pluginAlias": "@memberjunction/cli",
3985
4176
  "pluginName": "@memberjunction/cli",
3986
4177
  "pluginType": "core",
3987
4178
  "strict": true,
3988
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"
4225
+ }
4226
+ },
3989
4227
  "isESM": true,
3990
4228
  "relativePath": [
3991
4229
  "dist",
3992
4230
  "commands",
3993
- "test",
3994
- "run.js"
4231
+ "sync",
4232
+ "push.js"
3995
4233
  ]
3996
4234
  },
3997
- "test:suite": {
4235
+ "sync:status": {
3998
4236
  "aliases": [],
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",
4237
+ "args": {},
4238
+ "description": "Show status of local files vs database",
4007
4239
  "examples": [
4008
- "<%= config.bin %> <%= command.id %> <suite-id>",
4009
- "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
4010
- "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
4011
- "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
4240
+ "<%= config.bin %> <%= command.id %>",
4241
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
4242
+ "<%= config.bin %> <%= command.id %> --verbose"
4012
4243
  ],
4013
4244
  "flags": {
4014
- "name": {
4015
- "char": "n",
4016
- "description": "Test suite name to execute",
4017
- "name": "name",
4018
- "hasDynamicHelp": false,
4019
- "multiple": false,
4020
- "type": "option"
4021
- },
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",
4040
- "hasDynamicHelp": false,
4041
- "multiple": false,
4042
- "type": "option"
4043
- },
4044
- "verbose": {
4045
- "char": "v",
4046
- "description": "Show detailed execution information",
4047
- "name": "verbose",
4048
- "allowNo": false,
4049
- "type": "boolean"
4050
- },
4051
- "delay": {
4052
- "char": "d",
4053
- "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
4054
- "name": "delay",
4055
- "default": 0,
4056
- "hasDynamicHelp": false,
4057
- "multiple": false,
4058
- "type": "option"
4059
- },
4060
- "parallel": {
4061
- "char": "p",
4062
- "description": "Run tests in parallel with shared browser sessions",
4063
- "name": "parallel",
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",
4245
+ "dir": {
4246
+ "description": "Specific entity directory to check status",
4247
+ "name": "dir",
4078
4248
  "hasDynamicHelp": false,
4079
4249
  "multiple": false,
4080
4250
  "type": "option"
4081
4251
  },
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",
4252
+ "verbose": {
4253
+ "char": "v",
4254
+ "description": "Show detailed field-level differences",
4255
+ "name": "verbose",
4256
+ "allowNo": false,
4257
+ "type": "boolean"
4258
+ },
4259
+ "include": {
4260
+ "description": "Only process these directories (comma-separated, supports patterns)",
4261
+ "name": "include",
4085
4262
  "hasDynamicHelp": false,
4086
4263
  "multiple": false,
4087
4264
  "type": "option"
4088
4265
  },
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",
4266
+ "exclude": {
4267
+ "description": "Skip these directories (comma-separated, supports patterns)",
4268
+ "name": "exclude",
4092
4269
  "hasDynamicHelp": false,
4093
4270
  "multiple": false,
4094
4271
  "type": "option"
@@ -4096,7 +4273,7 @@
4096
4273
  },
4097
4274
  "hasDynamicHelp": false,
4098
4275
  "hiddenAliases": [],
4099
- "id": "test:suite",
4276
+ "id": "sync:status",
4100
4277
  "pluginAlias": "@memberjunction/cli",
4101
4278
  "pluginName": "@memberjunction/cli",
4102
4279
  "pluginType": "core",
@@ -4106,82 +4283,87 @@
4106
4283
  "relativePath": [
4107
4284
  "dist",
4108
4285
  "commands",
4109
- "test",
4110
- "suite.js"
4286
+ "sync",
4287
+ "status.js"
4111
4288
  ]
4112
4289
  },
4113
- "test:validate": {
4290
+ "sync:usage": {
4114
4291
  "aliases": [],
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
- ],
4292
+ "args": {},
4293
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
4130
4294
  "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
- },
4152
4295
  "format": {
4153
- "char": "f",
4154
4296
  "description": "Output format",
4155
4297
  "name": "format",
4156
- "default": "console",
4298
+ "default": "text",
4157
4299
  "hasDynamicHelp": false,
4158
4300
  "multiple": false,
4159
4301
  "options": [
4160
- "console",
4302
+ "text",
4161
4303
  "json",
4162
- "markdown"
4304
+ "md"
4163
4305
  ],
4164
4306
  "type": "option"
4165
- },
4166
- "output": {
4167
- "char": "o",
4168
- "description": "Output file path",
4169
- "name": "output",
4307
+ }
4308
+ },
4309
+ "hasDynamicHelp": false,
4310
+ "hiddenAliases": [],
4311
+ "id": "sync:usage",
4312
+ "pluginAlias": "@memberjunction/cli",
4313
+ "pluginName": "@memberjunction/cli",
4314
+ "pluginType": "core",
4315
+ "strict": true,
4316
+ "enableJsonFlag": false,
4317
+ "isESM": true,
4318
+ "relativePath": [
4319
+ "dist",
4320
+ "commands",
4321
+ "sync",
4322
+ "usage.js"
4323
+ ]
4324
+ },
4325
+ "sync:validate": {
4326
+ "aliases": [],
4327
+ "args": {},
4328
+ "description": "Validate metadata files",
4329
+ "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"
4334
+ ],
4335
+ "flags": {
4336
+ "dir": {
4337
+ "description": "Specific entity directory to validate",
4338
+ "name": "dir",
4170
4339
  "hasDynamicHelp": false,
4171
4340
  "multiple": false,
4172
4341
  "type": "option"
4173
4342
  },
4174
4343
  "verbose": {
4175
4344
  "char": "v",
4176
- "description": "Show detailed information",
4345
+ "description": "Show detailed validation output",
4177
4346
  "name": "verbose",
4178
4347
  "allowNo": false,
4179
4348
  "type": "boolean"
4349
+ },
4350
+ "save-report": {
4351
+ "description": "Save validation report as markdown file",
4352
+ "name": "save-report",
4353
+ "allowNo": false,
4354
+ "type": "boolean"
4355
+ },
4356
+ "output": {
4357
+ "description": "Output file path for validation report (default: validation-report.md)",
4358
+ "name": "output",
4359
+ "hasDynamicHelp": false,
4360
+ "multiple": false,
4361
+ "type": "option"
4180
4362
  }
4181
4363
  },
4182
4364
  "hasDynamicHelp": false,
4183
4365
  "hiddenAliases": [],
4184
- "id": "test:validate",
4366
+ "id": "sync:validate",
4185
4367
  "pluginAlias": "@memberjunction/cli",
4186
4368
  "pluginName": "@memberjunction/cli",
4187
4369
  "pluginType": "core",
@@ -4191,96 +4373,93 @@
4191
4373
  "relativePath": [
4192
4374
  "dist",
4193
4375
  "commands",
4194
- "test",
4376
+ "sync",
4195
4377
  "validate.js"
4196
4378
  ]
4197
4379
  },
4198
- "translate-sql": {
4380
+ "sync:watch": {
4199
4381
  "aliases": [],
4200
4382
  "args": {},
4201
- "description": "Translate SQL fragments between database dialects (SQL Server ↔ PostgreSQL)",
4383
+ "description": "Watch for file changes and sync automatically",
4202
4384
  "examples": [
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"
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"
4207
4389
  ],
4208
4390
  "flags": {
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,
4225
- "hasDynamicHelp": false,
4226
- "multiple": false,
4227
- "options": [
4228
- "sqlserver",
4229
- "postgresql"
4230
- ],
4231
- "type": "option"
4232
- },
4233
- "scope": {
4234
- "description": "What to scan for translation",
4235
- "name": "scope",
4236
- "default": "all",
4391
+ "dir": {
4392
+ "description": "Specific entity directory to watch",
4393
+ "name": "dir",
4237
4394
  "hasDynamicHelp": false,
4238
4395
  "multiple": false,
4239
- "options": [
4240
- "queries",
4241
- "views",
4242
- "filters",
4243
- "all"
4244
- ],
4245
4396
  "type": "option"
4246
4397
  },
4247
- "sql": {
4248
- "description": "Translate a single SQL fragment (inline mode)",
4249
- "name": "sql",
4398
+ "debounce": {
4399
+ "description": "Debounce delay in milliseconds (default: 500)",
4400
+ "name": "debounce",
4250
4401
  "hasDynamicHelp": false,
4251
4402
  "multiple": false,
4252
4403
  "type": "option"
4253
4404
  },
4254
- "dry-run": {
4255
- "description": "Show what would be translated without making changes",
4256
- "name": "dry-run",
4405
+ "no-validate": {
4406
+ "description": "Skip validation before sync",
4407
+ "name": "no-validate",
4257
4408
  "allowNo": false,
4258
4409
  "type": "boolean"
4259
4410
  },
4260
- "review": {
4261
- "description": "Generate review report only (no writes to database)",
4262
- "name": "review",
4411
+ "verbose": {
4412
+ "char": "v",
4413
+ "description": "Show detailed output",
4414
+ "name": "verbose",
4263
4415
  "allowNo": false,
4264
4416
  "type": "boolean"
4265
- },
4417
+ }
4418
+ },
4419
+ "hasDynamicHelp": false,
4420
+ "hiddenAliases": [],
4421
+ "id": "sync:watch",
4422
+ "pluginAlias": "@memberjunction/cli",
4423
+ "pluginName": "@memberjunction/cli",
4424
+ "pluginType": "core",
4425
+ "strict": true,
4426
+ "enableJsonFlag": false,
4427
+ "isESM": true,
4428
+ "relativePath": [
4429
+ "dist",
4430
+ "commands",
4431
+ "sync",
4432
+ "watch.js"
4433
+ ]
4434
+ },
4435
+ "ai:actions:list": {
4436
+ "aliases": [],
4437
+ "args": {},
4438
+ "description": "List available AI actions",
4439
+ "examples": [
4440
+ "<%= config.bin %> <%= command.id %>",
4441
+ "<%= config.bin %> <%= command.id %> --output=table",
4442
+ "<%= config.bin %> <%= command.id %> --output=json"
4443
+ ],
4444
+ "flags": {
4266
4445
  "output": {
4267
4446
  "char": "o",
4268
- "description": "Output directory for the translation report",
4447
+ "description": "Output format",
4269
4448
  "name": "output",
4449
+ "default": "compact",
4270
4450
  "hasDynamicHelp": false,
4271
4451
  "multiple": false,
4452
+ "options": [
4453
+ "compact",
4454
+ "json",
4455
+ "table"
4456
+ ],
4272
4457
  "type": "option"
4273
- },
4274
- "force": {
4275
- "description": "Re-translate even if platform variants already exist",
4276
- "name": "force",
4277
- "allowNo": false,
4278
- "type": "boolean"
4279
4458
  }
4280
4459
  },
4281
4460
  "hasDynamicHelp": false,
4282
4461
  "hiddenAliases": [],
4283
- "id": "translate-sql",
4462
+ "id": "ai:actions:list",
4284
4463
  "pluginAlias": "@memberjunction/cli",
4285
4464
  "pluginName": "@memberjunction/cli",
4286
4465
  "pluginType": "core",
@@ -4290,135 +4469,78 @@
4290
4469
  "relativePath": [
4291
4470
  "dist",
4292
4471
  "commands",
4293
- "translate-sql",
4294
- "index.js"
4472
+ "ai",
4473
+ "actions",
4474
+ "list.js"
4295
4475
  ]
4296
4476
  },
4297
- "update:claude": {
4477
+ "ai:actions:run": {
4298
4478
  "aliases": [],
4299
4479
  "args": {},
4300
- "description": "Update the Claude Code pack in the current directory.",
4480
+ "description": "Execute an AI action with parameters",
4301
4481
  "examples": [
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"
4482
+ "<%= config.bin %> <%= command.id %> -n \"Get Weather\" --param \"Location=Boston\"",
4483
+ "<%= config.bin %> <%= command.id %> -n \"Get Stock Price\" --param \"Ticker=AAPL\"",
4484
+ "<%= config.bin %> <%= command.id %> -n \"Send Single Message\" --param \"To=user@example.com\" --param \"Subject=Test\" --param \"Body=Hello\" --param \"MessageType=Email\" --param \"Provider=SendGrid\"",
4485
+ "<%= config.bin %> <%= command.id %> -n \"Calculate Expression\" --param \"Expression=2+2*3\" --dry-run"
4307
4486
  ],
4308
4487
  "flags": {
4309
- "dir": {
4310
- "description": "Target directory",
4311
- "name": "dir",
4312
- "default": ".",
4313
- "hasDynamicHelp": false,
4314
- "multiple": false,
4315
- "type": "option"
4316
- },
4317
- "major": {
4318
- "description": "Force a specific MJ major (default: detected from package.json)",
4319
- "name": "major",
4320
- "hasDynamicHelp": false,
4321
- "multiple": false,
4322
- "type": "option"
4323
- },
4324
- "ref": {
4325
- "description": "Git ref to fetch from (branch or tag). Default: main.",
4326
- "name": "ref",
4488
+ "name": {
4489
+ "char": "n",
4490
+ "description": "Action name",
4491
+ "name": "name",
4492
+ "required": true,
4327
4493
  "hasDynamicHelp": false,
4328
4494
  "multiple": false,
4329
4495
  "type": "option"
4330
4496
  },
4331
- "from": {
4332
- "description": "Use a local pack source instead of fetching from GitHub",
4333
- "name": "from",
4497
+ "param": {
4498
+ "char": "p",
4499
+ "description": "Action parameters in key=value format",
4500
+ "name": "param",
4334
4501
  "hasDynamicHelp": false,
4335
- "multiple": false,
4502
+ "multiple": true,
4336
4503
  "type": "option"
4337
4504
  },
4338
- "offline": {
4339
- "description": "Forbid network; requires --from <path>",
4340
- "name": "offline",
4341
- "allowNo": false,
4342
- "type": "boolean"
4343
- },
4344
4505
  "dry-run": {
4345
- "description": "Print what would be written; change nothing",
4506
+ "description": "Validate without executing",
4346
4507
  "name": "dry-run",
4347
4508
  "allowNo": false,
4348
4509
  "type": "boolean"
4349
4510
  },
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
- "allowNo": false,
4409
- "type": "boolean"
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"
4410
4524
  },
4411
4525
  "verbose": {
4412
4526
  "char": "v",
4413
- "description": "Show progress messages",
4527
+ "description": "Show detailed execution information",
4414
4528
  "name": "verbose",
4415
4529
  "allowNo": false,
4416
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"
4417
4539
  }
4418
4540
  },
4419
4541
  "hasDynamicHelp": false,
4420
4542
  "hiddenAliases": [],
4421
- "id": "update:claude",
4543
+ "id": "ai:actions:run",
4422
4544
  "pluginAlias": "@memberjunction/cli",
4423
4545
  "pluginName": "@memberjunction/cli",
4424
4546
  "pluginType": "core",
@@ -4428,8 +4550,9 @@
4428
4550
  "relativePath": [
4429
4551
  "dist",
4430
4552
  "commands",
4431
- "update",
4432
- "claude.js"
4553
+ "ai",
4554
+ "actions",
4555
+ "run.js"
4433
4556
  ]
4434
4557
  },
4435
4558
  "ai:agents:list": {
@@ -4916,129 +5039,6 @@
4916
5039
  "index.js"
4917
5040
  ]
4918
5041
  },
4919
- "ai:actions:list": {
4920
- "aliases": [],
4921
- "args": {},
4922
- "description": "List available AI actions",
4923
- "examples": [
4924
- "<%= config.bin %> <%= command.id %>",
4925
- "<%= config.bin %> <%= command.id %> --output=table",
4926
- "<%= config.bin %> <%= command.id %> --output=json"
4927
- ],
4928
- "flags": {
4929
- "output": {
4930
- "char": "o",
4931
- "description": "Output format",
4932
- "name": "output",
4933
- "default": "compact",
4934
- "hasDynamicHelp": false,
4935
- "multiple": false,
4936
- "options": [
4937
- "compact",
4938
- "json",
4939
- "table"
4940
- ],
4941
- "type": "option"
4942
- }
4943
- },
4944
- "hasDynamicHelp": false,
4945
- "hiddenAliases": [],
4946
- "id": "ai:actions:list",
4947
- "pluginAlias": "@memberjunction/cli",
4948
- "pluginName": "@memberjunction/cli",
4949
- "pluginType": "core",
4950
- "strict": true,
4951
- "enableJsonFlag": false,
4952
- "isESM": true,
4953
- "relativePath": [
4954
- "dist",
4955
- "commands",
4956
- "ai",
4957
- "actions",
4958
- "list.js"
4959
- ]
4960
- },
4961
- "ai:actions:run": {
4962
- "aliases": [],
4963
- "args": {},
4964
- "description": "Execute an AI action with parameters",
4965
- "examples": [
4966
- "<%= config.bin %> <%= command.id %> -n \"Get Weather\" --param \"Location=Boston\"",
4967
- "<%= config.bin %> <%= command.id %> -n \"Get Stock Price\" --param \"Ticker=AAPL\"",
4968
- "<%= config.bin %> <%= command.id %> -n \"Send Single Message\" --param \"To=user@example.com\" --param \"Subject=Test\" --param \"Body=Hello\" --param \"MessageType=Email\" --param \"Provider=SendGrid\"",
4969
- "<%= config.bin %> <%= command.id %> -n \"Calculate Expression\" --param \"Expression=2+2*3\" --dry-run"
4970
- ],
4971
- "flags": {
4972
- "name": {
4973
- "char": "n",
4974
- "description": "Action name",
4975
- "name": "name",
4976
- "required": true,
4977
- "hasDynamicHelp": false,
4978
- "multiple": false,
4979
- "type": "option"
4980
- },
4981
- "param": {
4982
- "char": "p",
4983
- "description": "Action parameters in key=value format",
4984
- "name": "param",
4985
- "hasDynamicHelp": false,
4986
- "multiple": true,
4987
- "type": "option"
4988
- },
4989
- "dry-run": {
4990
- "description": "Validate without executing",
4991
- "name": "dry-run",
4992
- "allowNo": false,
4993
- "type": "boolean"
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:actions: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
- "actions",
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.1"
5483
+ "version": "5.51.3"
5484
5484
  }