@memberjunction/cli 5.45.0 → 5.45.1

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 +1126 -1126
  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": {},
@@ -2266,106 +2266,37 @@
2266
2266
  "rebake.js"
2267
2267
  ]
2268
2268
  },
2269
- "install:claude": {
2269
+ "plugin:add": {
2270
2270
  "aliases": [],
2271
- "args": {},
2272
- "description": "Install or refresh the Claude Code pack in the current directory.",
2271
+ "args": {
2272
+ "package": {
2273
+ "description": "Plugin entry-point specifier (package name, subpath, or relative path)",
2274
+ "name": "package",
2275
+ "required": true
2276
+ }
2277
+ },
2278
+ "description": "Register a CLI plugin package in mj-cli-plugins.json so `mj` loads it at startup.",
2273
2279
  "examples": [
2274
- "<%= config.bin %> install:claude",
2275
- "<%= config.bin %> install:claude --dry-run",
2276
- "<%= config.bin %> install:claude --from ./local-pack",
2277
- "<%= config.bin %> install:claude --json"
2280
+ "<%= config.bin %> <%= command.id %> @my-org/mj-plugin/plugins",
2281
+ "<%= config.bin %> <%= command.id %> ./local-plugins/my-tool"
2278
2282
  ],
2279
2283
  "flags": {
2280
- "dir": {
2281
- "description": "Target directory for the install",
2282
- "name": "dir",
2283
- "default": ".",
2284
- "hasDynamicHelp": false,
2285
- "multiple": false,
2286
- "type": "option"
2287
- },
2288
- "major": {
2289
- "description": "Force a specific MJ major (default: detected from package.json)",
2290
- "name": "major",
2291
- "hasDynamicHelp": false,
2292
- "multiple": false,
2293
- "type": "option"
2294
- },
2295
- "ref": {
2296
- "description": "Git ref to fetch from (branch or tag). Default: main.",
2297
- "name": "ref",
2298
- "hasDynamicHelp": false,
2299
- "multiple": false,
2300
- "type": "option"
2301
- },
2302
- "from": {
2303
- "description": "Use a local pack source instead of fetching from GitHub",
2304
- "name": "from",
2284
+ "format": {
2285
+ "description": "Output format",
2286
+ "name": "format",
2287
+ "default": "text",
2305
2288
  "hasDynamicHelp": false,
2306
2289
  "multiple": false,
2290
+ "options": [
2291
+ "text",
2292
+ "json"
2293
+ ],
2307
2294
  "type": "option"
2308
- },
2309
- "offline": {
2310
- "description": "Forbid network; requires --from <path>",
2311
- "name": "offline",
2312
- "allowNo": false,
2313
- "type": "boolean"
2314
- },
2315
- "dry-run": {
2316
- "description": "Print what would be written; change nothing",
2317
- "name": "dry-run",
2318
- "allowNo": false,
2319
- "type": "boolean"
2320
- },
2321
- "yes": {
2322
- "char": "y",
2323
- "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
2324
- "name": "yes",
2325
- "allowNo": false,
2326
- "type": "boolean"
2327
- },
2328
- "force": {
2329
- "description": "Overwrite user-customized commands/skills (saves .bak files)",
2330
- "name": "force",
2331
- "allowNo": false,
2332
- "type": "boolean"
2333
- },
2334
- "skip-commands": {
2335
- "description": "Skip seeding .claude/commands/",
2336
- "name": "skip-commands",
2337
- "allowNo": false,
2338
- "type": "boolean"
2339
- },
2340
- "skip-skills": {
2341
- "description": "Skip seeding .claude/skills/",
2342
- "name": "skip-skills",
2343
- "allowNo": false,
2344
- "type": "boolean"
2345
- },
2346
- "skip-settings": {
2347
- "description": "Skip merging .claude/settings.json",
2348
- "name": "skip-settings",
2349
- "allowNo": false,
2350
- "type": "boolean"
2351
- },
2352
- "json": {
2353
- "description": "Output as JSON (matches plan §7.5 schema)",
2354
- "name": "json",
2355
- "allowNo": false,
2356
- "type": "boolean"
2357
- },
2358
- "verbose": {
2359
- "char": "v",
2360
- "description": "Show progress messages from the fetcher and merger",
2361
- "name": "verbose",
2362
- "allowNo": false,
2363
- "type": "boolean"
2364
2295
  }
2365
2296
  },
2366
2297
  "hasDynamicHelp": false,
2367
2298
  "hiddenAliases": [],
2368
- "id": "install:claude",
2299
+ "id": "plugin:add",
2369
2300
  "pluginAlias": "@memberjunction/cli",
2370
2301
  "pluginName": "@memberjunction/cli",
2371
2302
  "pluginType": "core",
@@ -2375,190 +2306,25 @@
2375
2306
  "relativePath": [
2376
2307
  "dist",
2377
2308
  "commands",
2378
- "install",
2379
- "claude.js"
2309
+ "plugin",
2310
+ "add.js"
2380
2311
  ]
2381
2312
  },
2382
- "install": {
2313
+ "querygen:export": {
2383
2314
  "aliases": [],
2384
2315
  "args": {},
2385
- "description": "Install MemberJunction from a GitHub release",
2316
+ "description": "Export queries from database to metadata files",
2386
2317
  "examples": [
2387
2318
  "<%= config.bin %> <%= command.id %>",
2388
- "<%= config.bin %> <%= command.id %> -t v4.3.0",
2389
- "<%= config.bin %> <%= command.id %> --dry-run",
2390
- "<%= config.bin %> <%= command.id %> --yes"
2319
+ "<%= config.bin %> <%= command.id %> --output ./metadata/queries",
2320
+ "<%= config.bin %> <%= command.id %> --verbose"
2391
2321
  ],
2392
2322
  "flags": {
2393
- "tag": {
2394
- "char": "t",
2395
- "description": "Release tag to install (e.g. v4.3.0). If omitted, shows a version picker.",
2396
- "name": "tag",
2397
- "hasDynamicHelp": false,
2398
- "multiple": false,
2399
- "type": "option"
2400
- },
2401
- "dir": {
2402
- "description": "Target directory for the installation",
2403
- "name": "dir",
2404
- "default": ".",
2405
- "hasDynamicHelp": false,
2406
- "multiple": false,
2407
- "type": "option"
2408
- },
2409
- "config": {
2410
- "char": "c",
2411
- "description": "Path to JSON config file with install settings (database, auth, ports, etc.)",
2412
- "name": "config",
2413
- "hasDynamicHelp": false,
2414
- "multiple": false,
2415
- "type": "option"
2416
- },
2417
- "legacy": {
2418
- "description": "Use the legacy interactive installer (ZIP-only distribution)",
2419
- "hidden": true,
2420
- "name": "legacy",
2421
- "allowNo": false,
2422
- "type": "boolean"
2423
- },
2424
- "dry-run": {
2425
- "description": "Show the install plan without executing it",
2426
- "name": "dry-run",
2427
- "allowNo": false,
2428
- "type": "boolean"
2429
- },
2430
- "yes": {
2431
- "char": "y",
2432
- "description": "Non-interactive mode: auto-select latest version and accept defaults",
2433
- "name": "yes",
2434
- "allowNo": false,
2435
- "type": "boolean"
2436
- },
2437
- "verbose": {
2438
- "char": "v",
2439
- "description": "Show detailed output",
2440
- "name": "verbose",
2441
- "allowNo": false,
2442
- "type": "boolean"
2443
- },
2444
- "skip-db": {
2445
- "description": "Skip database provisioning phases",
2446
- "name": "skip-db",
2447
- "allowNo": false,
2448
- "type": "boolean"
2449
- },
2450
- "skip-start": {
2451
- "description": "Skip service startup and smoke tests",
2452
- "name": "skip-start",
2453
- "allowNo": false,
2454
- "type": "boolean"
2455
- },
2456
- "no-resume": {
2457
- "description": "Ignore any existing checkpoint and start fresh",
2458
- "name": "no-resume",
2459
- "allowNo": false,
2460
- "type": "boolean"
2461
- },
2462
- "fast": {
2463
- "description": "Fast mode: skip smoke test and optimize post-codegen steps. Re-run without --fast if you encounter issues.",
2464
- "name": "fast",
2465
- "allowNo": false,
2466
- "type": "boolean"
2467
- },
2468
- "overwrite-config": {
2469
- "description": "Overwrite existing config files (.env, mj.config.cjs, environment.ts) instead of preserving them",
2470
- "name": "overwrite-config",
2471
- "allowNo": false,
2472
- "type": "boolean"
2473
- },
2474
- "monorepo": {
2475
- "description": "Install the full MemberJunction source repository instead of the lightweight distribution. Use this for MJ framework development.",
2476
- "name": "monorepo",
2477
- "allowNo": false,
2478
- "type": "boolean"
2479
- },
2480
- "no-claude-pack": {
2481
- "description": "Exclude the Claude Code pack (CLAUDE.md + .claude/ tree) from the scaffold. By default the pack ships with the install so opening Claude Code in your new MJ project gives you the curated MJ-aware experience immediately.",
2482
- "name": "no-claude-pack",
2483
- "allowNo": false,
2484
- "type": "boolean"
2485
- }
2486
- },
2487
- "hasDynamicHelp": false,
2488
- "hiddenAliases": [],
2489
- "id": "install",
2490
- "pluginAlias": "@memberjunction/cli",
2491
- "pluginName": "@memberjunction/cli",
2492
- "pluginType": "core",
2493
- "strict": true,
2494
- "enableJsonFlag": false,
2495
- "isESM": true,
2496
- "relativePath": [
2497
- "dist",
2498
- "commands",
2499
- "install",
2500
- "index.js"
2501
- ]
2502
- },
2503
- "plugin:add": {
2504
- "aliases": [],
2505
- "args": {
2506
- "package": {
2507
- "description": "Plugin entry-point specifier (package name, subpath, or relative path)",
2508
- "name": "package",
2509
- "required": true
2510
- }
2511
- },
2512
- "description": "Register a CLI plugin package in mj-cli-plugins.json so `mj` loads it at startup.",
2513
- "examples": [
2514
- "<%= config.bin %> <%= command.id %> @my-org/mj-plugin/plugins",
2515
- "<%= config.bin %> <%= command.id %> ./local-plugins/my-tool"
2516
- ],
2517
- "flags": {
2518
- "format": {
2519
- "description": "Output format",
2520
- "name": "format",
2521
- "default": "text",
2522
- "hasDynamicHelp": false,
2523
- "multiple": false,
2524
- "options": [
2525
- "text",
2526
- "json"
2527
- ],
2528
- "type": "option"
2529
- }
2530
- },
2531
- "hasDynamicHelp": false,
2532
- "hiddenAliases": [],
2533
- "id": "plugin:add",
2534
- "pluginAlias": "@memberjunction/cli",
2535
- "pluginName": "@memberjunction/cli",
2536
- "pluginType": "core",
2537
- "strict": true,
2538
- "enableJsonFlag": false,
2539
- "isESM": true,
2540
- "relativePath": [
2541
- "dist",
2542
- "commands",
2543
- "plugin",
2544
- "add.js"
2545
- ]
2546
- },
2547
- "querygen:export": {
2548
- "aliases": [],
2549
- "args": {},
2550
- "description": "Export queries from database to metadata files",
2551
- "examples": [
2552
- "<%= config.bin %> <%= command.id %>",
2553
- "<%= config.bin %> <%= command.id %> --output ./metadata/queries",
2554
- "<%= config.bin %> <%= command.id %> --verbose"
2555
- ],
2556
- "flags": {
2557
- "output": {
2558
- "char": "o",
2559
- "description": "Output directory",
2560
- "name": "output",
2561
- "default": "./metadata/queries",
2323
+ "output": {
2324
+ "char": "o",
2325
+ "description": "Output directory",
2326
+ "name": "output",
2327
+ "default": "./metadata/queries",
2562
2328
  "hasDynamicHelp": false,
2563
2329
  "multiple": false,
2564
2330
  "type": "option"
@@ -2911,84 +2677,106 @@
2911
2677
  "index.js"
2912
2678
  ]
2913
2679
  },
2914
- "sync:file-reset": {
2680
+ "test:compare": {
2915
2681
  "aliases": [],
2916
- "args": {},
2917
- "description": "Reset file metadata sections",
2682
+ "args": {
2683
+ "runId1": {
2684
+ "description": "First test run ID to compare",
2685
+ "name": "runId1",
2686
+ "required": false
2687
+ },
2688
+ "runId2": {
2689
+ "description": "Second test run ID to compare",
2690
+ "name": "runId2",
2691
+ "required": false
2692
+ }
2693
+ },
2694
+ "description": "Compare test runs for regression detection",
2918
2695
  "examples": [
2919
2696
  "<%= 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"
2697
+ "<%= config.bin %> <%= command.id %> --latest",
2698
+ "<%= config.bin %> <%= command.id %> <run-id-1> <run-id-2>",
2699
+ "<%= config.bin %> <%= command.id %> -v 5.17.0 -v 5.18.0",
2700
+ "<%= config.bin %> <%= command.id %> -c abc1234 -c def5678",
2701
+ "<%= config.bin %> <%= command.id %> --from-json baseline.json latest.json",
2702
+ "<%= config.bin %> <%= command.id %> --latest --format=markdown --output=report.md"
2923
2703
  ],
2924
2704
  "flags": {
2925
- "dir": {
2926
- "description": "Specific entity directory to reset",
2927
- "name": "dir",
2705
+ "version": {
2706
+ "char": "v",
2707
+ "description": "Compare runs by version",
2708
+ "name": "version",
2928
2709
  "hasDynamicHelp": false,
2929
- "multiple": false,
2710
+ "multiple": true,
2930
2711
  "type": "option"
2931
2712
  },
2932
- "sections": {
2933
- "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
2934
- "name": "sections",
2713
+ "commit": {
2714
+ "char": "c",
2715
+ "description": "Compare runs by git commit",
2716
+ "name": "commit",
2935
2717
  "hasDynamicHelp": false,
2936
- "multiple": false,
2718
+ "multiple": true,
2937
2719
  "type": "option"
2938
2720
  },
2939
- "all": {
2940
- "description": "Reset all metadata sections",
2941
- "name": "all",
2721
+ "diff-only": {
2722
+ "description": "Show only differences",
2723
+ "name": "diff-only",
2942
2724
  "allowNo": false,
2943
2725
  "type": "boolean"
2944
2726
  },
2945
- "dry-run": {
2946
- "description": "Show what would be reset without actually resetting",
2947
- "name": "dry-run",
2727
+ "latest": {
2728
+ "char": "l",
2729
+ "description": "Compare the two most recent completed suite runs",
2730
+ "name": "latest",
2948
2731
  "allowNo": false,
2949
2732
  "type": "boolean"
2950
2733
  },
2951
- "force": {
2952
- "description": "Skip confirmation prompts",
2953
- "name": "force",
2954
- "allowNo": false,
2955
- "type": "boolean"
2734
+ "from-json": {
2735
+ "description": "Compare two results.json files directly (no DB). Pass twice: --from-json PREV --from-json CURR",
2736
+ "name": "from-json",
2737
+ "hasDynamicHelp": false,
2738
+ "multiple": true,
2739
+ "type": "option"
2740
+ },
2741
+ "format": {
2742
+ "char": "f",
2743
+ "description": "Output format",
2744
+ "name": "format",
2745
+ "default": "console",
2746
+ "hasDynamicHelp": false,
2747
+ "multiple": false,
2748
+ "options": [
2749
+ "console",
2750
+ "json",
2751
+ "markdown"
2752
+ ],
2753
+ "type": "option"
2754
+ },
2755
+ "output": {
2756
+ "char": "o",
2757
+ "description": "Output file path",
2758
+ "name": "output",
2759
+ "hasDynamicHelp": false,
2760
+ "multiple": false,
2761
+ "type": "option"
2956
2762
  },
2957
2763
  "verbose": {
2958
- "char": "v",
2959
- "description": "Show detailed output",
2764
+ "description": "Show detailed information",
2960
2765
  "name": "verbose",
2961
2766
  "allowNo": false,
2962
2767
  "type": "boolean"
2963
- }
2768
+ },
2769
+ "tag": {
2770
+ "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.",
2771
+ "name": "tag",
2772
+ "hasDynamicHelp": false,
2773
+ "multiple": false,
2774
+ "type": "option"
2775
+ }
2964
2776
  },
2965
2777
  "hasDynamicHelp": false,
2966
2778
  "hiddenAliases": [],
2967
- "id": "sync:file-reset",
2968
- "pluginAlias": "@memberjunction/cli",
2969
- "pluginName": "@memberjunction/cli",
2970
- "pluginType": "core",
2971
- "strict": true,
2972
- "enableJsonFlag": false,
2973
- "isESM": true,
2974
- "relativePath": [
2975
- "dist",
2976
- "commands",
2977
- "sync",
2978
- "file-reset.js"
2979
- ]
2980
- },
2981
- "sync:init": {
2982
- "aliases": [],
2983
- "args": {},
2984
- "description": "Initialize a directory for metadata synchronization",
2985
- "examples": [
2986
- "<%= config.bin %> <%= command.id %>"
2987
- ],
2988
- "flags": {},
2989
- "hasDynamicHelp": false,
2990
- "hiddenAliases": [],
2991
- "id": "sync:init",
2779
+ "id": "test:compare",
2992
2780
  "pluginAlias": "@memberjunction/cli",
2993
2781
  "pluginName": "@memberjunction/cli",
2994
2782
  "pluginType": "core",
@@ -2998,501 +2786,294 @@
2998
2786
  "relativePath": [
2999
2787
  "dist",
3000
2788
  "commands",
3001
- "sync",
3002
- "init.js"
2789
+ "test",
2790
+ "compare.js"
3003
2791
  ]
3004
2792
  },
3005
- "sync:pull": {
2793
+ "test:history": {
3006
2794
  "aliases": [],
3007
2795
  "args": {},
3008
- "description": "Pull metadata from database to local files",
2796
+ "description": "View test execution history",
3009
2797
  "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"
2798
+ "<%= config.bin %> <%= command.id %>",
2799
+ "<%= config.bin %> <%= command.id %> --test=<test-id>",
2800
+ "<%= config.bin %> <%= command.id %> --suite=<suite-id>",
2801
+ "<%= config.bin %> <%= command.id %> --since=\"2024-01-01\"",
2802
+ "<%= config.bin %> <%= command.id %> --limit=50"
3013
2803
  ],
3014
2804
  "flags": {
3015
- "format": {
3016
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3017
- "name": "format",
3018
- "default": "text",
2805
+ "test": {
2806
+ "char": "t",
2807
+ "description": "Filter by test ID",
2808
+ "name": "test",
3019
2809
  "hasDynamicHelp": false,
3020
2810
  "multiple": false,
3021
- "options": [
3022
- "text",
3023
- "json",
3024
- "md"
3025
- ],
3026
2811
  "type": "option"
3027
2812
  },
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,
2813
+ "recent": {
2814
+ "char": "r",
2815
+ "description": "Number of recent runs to show",
2816
+ "name": "recent",
3045
2817
  "hasDynamicHelp": false,
3046
2818
  "multiple": false,
3047
2819
  "type": "option"
3048
2820
  },
3049
- "filter": {
3050
- "description": "Additional filter for pulling specific records",
3051
- "name": "filter",
2821
+ "from": {
2822
+ "description": "Show history from date (YYYY-MM-DD)",
2823
+ "name": "from",
3052
2824
  "hasDynamicHelp": false,
3053
2825
  "multiple": false,
3054
2826
  "type": "option"
3055
2827
  },
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",
2828
+ "status": {
2829
+ "char": "s",
2830
+ "description": "Filter by status",
2831
+ "name": "status",
3065
2832
  "hasDynamicHelp": false,
3066
2833
  "multiple": false,
3067
2834
  "type": "option"
3068
2835
  },
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",
2836
+ "format": {
2837
+ "char": "f",
2838
+ "description": "Output format",
2839
+ "name": "format",
2840
+ "default": "console",
3097
2841
  "hasDynamicHelp": false,
3098
2842
  "multiple": false,
3099
2843
  "options": [
3100
- "merge",
3101
- "overwrite",
3102
- "skip"
2844
+ "console",
2845
+ "json",
2846
+ "markdown"
3103
2847
  ],
3104
2848
  "type": "option"
3105
2849
  },
3106
- "backup-directory": {
3107
- "description": "Custom backup directory (default: .backups)",
3108
- "name": "backup-directory",
3109
- "hasDynamicHelp": false,
3110
- "multiple": false,
3111
- "type": "option"
3112
- },
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",
2850
+ "output": {
2851
+ "char": "o",
2852
+ "description": "Output file path",
2853
+ "name": "output",
3130
2854
  "hasDynamicHelp": false,
3131
2855
  "multiple": false,
3132
2856
  "type": "option"
3133
2857
  },
3134
- "incremental": {
3135
- "description": "Only pull records updated since last successful pull",
3136
- "name": "incremental",
2858
+ "verbose": {
2859
+ "char": "v",
2860
+ "description": "Show detailed information",
2861
+ "name": "verbose",
3137
2862
  "allowNo": false,
3138
2863
  "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
2864
  }
3147
2865
  },
3148
2866
  "hasDynamicHelp": false,
3149
2867
  "hiddenAliases": [],
3150
- "id": "sync:pull",
2868
+ "id": "test:history",
3151
2869
  "pluginAlias": "@memberjunction/cli",
3152
2870
  "pluginName": "@memberjunction/cli",
3153
2871
  "pluginType": "core",
3154
2872
  "strict": true,
3155
2873
  "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
2874
  "isESM": true,
3199
2875
  "relativePath": [
3200
2876
  "dist",
3201
2877
  "commands",
3202
- "sync",
3203
- "pull.js"
2878
+ "test",
2879
+ "history.js"
3204
2880
  ]
3205
2881
  },
3206
- "sync:push": {
2882
+ "test": {
3207
2883
  "aliases": [],
3208
2884
  "args": {},
3209
- "description": "Push local file changes to the database",
2885
+ "description": "MemberJunction Testing Framework - Execute and manage tests",
3210
2886
  "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"
2887
+ "<%= config.bin %> <%= command.id %> run <test-id>",
2888
+ "<%= config.bin %> <%= command.id %> run --name=\"Active Members Count\"",
2889
+ "<%= config.bin %> <%= command.id %> suite <suite-id>",
2890
+ "<%= config.bin %> <%= command.id %> list",
2891
+ "<%= config.bin %> <%= command.id %> list --suites",
2892
+ "<%= config.bin %> <%= command.id %> validate --all"
3215
2893
  ],
3216
- "flags": {
3217
- "format": {
3218
- "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3219
- "name": "format",
3220
- "default": "text",
3221
- "hasDynamicHelp": false,
3222
- "multiple": false,
3223
- "options": [
3224
- "text",
3225
- "json",
3226
- "md"
3227
- ],
3228
- "type": "option"
3229
- },
3230
- "verbose": {
3231
- "char": "v",
3232
- "description": "Show detailed output",
3233
- "name": "verbose",
2894
+ "flags": {},
2895
+ "hasDynamicHelp": false,
2896
+ "hiddenAliases": [],
2897
+ "id": "test",
2898
+ "pluginAlias": "@memberjunction/cli",
2899
+ "pluginName": "@memberjunction/cli",
2900
+ "pluginType": "core",
2901
+ "strict": true,
2902
+ "enableJsonFlag": false,
2903
+ "isESM": true,
2904
+ "relativePath": [
2905
+ "dist",
2906
+ "commands",
2907
+ "test",
2908
+ "index.js"
2909
+ ]
2910
+ },
2911
+ "test:list": {
2912
+ "aliases": [],
2913
+ "args": {},
2914
+ "description": "List available tests, suites, and types",
2915
+ "examples": [
2916
+ "<%= config.bin %> <%= command.id %>",
2917
+ "<%= config.bin %> <%= command.id %> --suites",
2918
+ "<%= config.bin %> <%= command.id %> --types",
2919
+ "<%= config.bin %> <%= command.id %> --type=agent-eval",
2920
+ "<%= config.bin %> <%= command.id %> --tag=smoke",
2921
+ "<%= config.bin %> <%= command.id %> --status=active --verbose"
2922
+ ],
2923
+ "flags": {
2924
+ "suites": {
2925
+ "description": "List test suites instead of tests",
2926
+ "name": "suites",
3234
2927
  "allowNo": false,
3235
2928
  "type": "boolean"
3236
2929
  },
3237
- "no-banner": {
3238
- "description": "Suppress the startup banner and runtime advisory",
3239
- "name": "no-banner",
2930
+ "types": {
2931
+ "description": "List test types",
2932
+ "name": "types",
3240
2933
  "allowNo": false,
3241
2934
  "type": "boolean"
3242
2935
  },
3243
- "dir": {
3244
- "description": "Specific entity directory to push",
3245
- "name": "dir",
2936
+ "type": {
2937
+ "char": "t",
2938
+ "description": "Filter by test type",
2939
+ "name": "type",
3246
2940
  "hasDynamicHelp": false,
3247
2941
  "multiple": false,
3248
2942
  "type": "option"
3249
2943
  },
3250
- "dry-run": {
3251
- "description": "Show what would be pushed without actually pushing",
3252
- "name": "dry-run",
3253
- "allowNo": false,
3254
- "type": "boolean"
3255
- },
3256
- "ci": {
3257
- "description": "CI mode - no prompts, fail on issues",
3258
- "name": "ci",
3259
- "allowNo": false,
3260
- "type": "boolean"
3261
- },
3262
- "no-validate": {
3263
- "description": "Skip validation before push",
3264
- "name": "no-validate",
3265
- "allowNo": false,
3266
- "type": "boolean"
3267
- },
3268
- "delete-db-only": {
3269
- "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
3270
- "name": "delete-db-only",
3271
- "allowNo": false,
3272
- "type": "boolean"
3273
- },
3274
- "parallel-batch-size": {
3275
- "description": "Number of records to process in parallel (default: 10)",
3276
- "name": "parallel-batch-size",
3277
- "default": 10,
2944
+ "tag": {
2945
+ "description": "Filter by tag",
2946
+ "name": "tag",
3278
2947
  "hasDynamicHelp": false,
3279
2948
  "multiple": false,
3280
2949
  "type": "option"
3281
2950
  },
3282
- "include": {
3283
- "description": "Only process these directories (comma-separated, supports patterns)",
3284
- "name": "include",
2951
+ "status": {
2952
+ "char": "s",
2953
+ "description": "Filter by status",
2954
+ "name": "status",
3285
2955
  "hasDynamicHelp": false,
3286
2956
  "multiple": false,
3287
2957
  "type": "option"
3288
2958
  },
3289
- "exclude": {
3290
- "description": "Skip these directories (comma-separated, supports patterns)",
3291
- "name": "exclude",
2959
+ "format": {
2960
+ "char": "f",
2961
+ "description": "Output format",
2962
+ "name": "format",
2963
+ "default": "console",
3292
2964
  "hasDynamicHelp": false,
3293
2965
  "multiple": false,
2966
+ "options": [
2967
+ "console",
2968
+ "json",
2969
+ "markdown"
2970
+ ],
3294
2971
  "type": "option"
3295
2972
  },
3296
- "incremental": {
3297
- "description": "Skip unchanged files using stored checksums from last push",
3298
- "name": "incremental",
3299
- "allowNo": false,
3300
- "type": "boolean"
2973
+ "output": {
2974
+ "char": "o",
2975
+ "description": "Output file path",
2976
+ "name": "output",
2977
+ "hasDynamicHelp": false,
2978
+ "multiple": false,
2979
+ "type": "option"
3301
2980
  },
3302
- "change-detail": {
3303
- "description": "Write a detailed per-record change report (primary keys + field diffs) to a file",
3304
- "name": "change-detail",
2981
+ "verbose": {
2982
+ "char": "v",
2983
+ "description": "Show detailed information",
2984
+ "name": "verbose",
3305
2985
  "allowNo": false,
3306
2986
  "type": "boolean"
3307
2987
  }
3308
2988
  },
3309
2989
  "hasDynamicHelp": false,
3310
2990
  "hiddenAliases": [],
3311
- "id": "sync:push",
2991
+ "id": "test:list",
3312
2992
  "pluginAlias": "@memberjunction/cli",
3313
2993
  "pluginName": "@memberjunction/cli",
3314
2994
  "pluginType": "core",
3315
2995
  "strict": true,
3316
2996
  "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
2997
  "isESM": true,
3365
2998
  "relativePath": [
3366
2999
  "dist",
3367
3000
  "commands",
3368
- "sync",
3369
- "push.js"
3001
+ "test",
3002
+ "list.js"
3370
3003
  ]
3371
3004
  },
3372
- "sync:status": {
3005
+ "test:run": {
3373
3006
  "aliases": [],
3374
- "args": {},
3375
- "description": "Show status of local files vs database",
3007
+ "args": {
3008
+ "testId": {
3009
+ "description": "Test ID to execute",
3010
+ "name": "testId",
3011
+ "required": false
3012
+ }
3013
+ },
3014
+ "description": "Execute a single test by ID or name",
3376
3015
  "examples": [
3377
- "<%= config.bin %> <%= command.id %>",
3378
- "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3379
- "<%= config.bin %> <%= command.id %> --verbose"
3016
+ "<%= config.bin %> <%= command.id %> <test-id>",
3017
+ "<%= config.bin %> <%= command.id %> --name=\"Active Members Count\"",
3018
+ "<%= config.bin %> <%= command.id %> <test-id> --environment=staging",
3019
+ "<%= config.bin %> <%= command.id %> <test-id> --format=json --output=results.json",
3020
+ "<%= config.bin %> <%= command.id %> <test-id> --dry-run"
3380
3021
  ],
3381
3022
  "flags": {
3382
- "dir": {
3383
- "description": "Specific entity directory to check status",
3384
- "name": "dir",
3023
+ "name": {
3024
+ "char": "n",
3025
+ "description": "Test name to execute",
3026
+ "name": "name",
3385
3027
  "hasDynamicHelp": false,
3386
3028
  "multiple": false,
3387
3029
  "type": "option"
3388
3030
  },
3389
- "verbose": {
3390
- "char": "v",
3391
- "description": "Show detailed field-level differences",
3392
- "name": "verbose",
3393
- "allowNo": false,
3394
- "type": "boolean"
3395
- },
3396
- "include": {
3397
- "description": "Only process these directories (comma-separated, supports patterns)",
3398
- "name": "include",
3031
+ "environment": {
3032
+ "char": "e",
3033
+ "description": "Environment context (dev, staging, prod)",
3034
+ "name": "environment",
3399
3035
  "hasDynamicHelp": false,
3400
3036
  "multiple": false,
3401
3037
  "type": "option"
3402
3038
  },
3403
- "exclude": {
3404
- "description": "Skip these directories (comma-separated, supports patterns)",
3405
- "name": "exclude",
3406
- "hasDynamicHelp": false,
3407
- "multiple": false,
3408
- "type": "option"
3409
- }
3410
- },
3411
- "hasDynamicHelp": false,
3412
- "hiddenAliases": [],
3413
- "id": "sync:status",
3414
- "pluginAlias": "@memberjunction/cli",
3415
- "pluginName": "@memberjunction/cli",
3416
- "pluginType": "core",
3417
- "strict": true,
3418
- "enableJsonFlag": false,
3419
- "isESM": true,
3420
- "relativePath": [
3421
- "dist",
3422
- "commands",
3423
- "sync",
3424
- "status.js"
3425
- ]
3426
- },
3427
- "sync:usage": {
3428
- "aliases": [],
3429
- "args": {},
3430
- "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
3431
- "flags": {
3432
3039
  "format": {
3040
+ "char": "f",
3433
3041
  "description": "Output format",
3434
3042
  "name": "format",
3435
- "default": "text",
3043
+ "default": "console",
3436
3044
  "hasDynamicHelp": false,
3437
3045
  "multiple": false,
3438
3046
  "options": [
3439
- "text",
3047
+ "console",
3440
3048
  "json",
3441
- "md"
3049
+ "markdown"
3442
3050
  ],
3443
3051
  "type": "option"
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",
3052
+ },
3053
+ "output": {
3054
+ "char": "o",
3055
+ "description": "Output file path",
3056
+ "name": "output",
3476
3057
  "hasDynamicHelp": false,
3477
3058
  "multiple": false,
3478
3059
  "type": "option"
3479
3060
  },
3480
- "verbose": {
3481
- "char": "v",
3482
- "description": "Show detailed validation output",
3483
- "name": "verbose",
3061
+ "dry-run": {
3062
+ "description": "Validate without executing",
3063
+ "name": "dry-run",
3484
3064
  "allowNo": false,
3485
3065
  "type": "boolean"
3486
3066
  },
3487
- "save-report": {
3488
- "description": "Save validation report as markdown file",
3489
- "name": "save-report",
3067
+ "verbose": {
3068
+ "char": "v",
3069
+ "description": "Show detailed execution information",
3070
+ "name": "verbose",
3490
3071
  "allowNo": false,
3491
3072
  "type": "boolean"
3492
3073
  },
3493
- "output": {
3494
- "description": "Output file path for validation report (default: validation-report.md)",
3495
- "name": "output",
3074
+ "oracles-module": {
3075
+ "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.",
3076
+ "name": "oracles-module",
3496
3077
  "hasDynamicHelp": false,
3497
3078
  "multiple": false,
3498
3079
  "type": "option"
@@ -3500,7 +3081,7 @@
3500
3081
  },
3501
3082
  "hasDynamicHelp": false,
3502
3083
  "hiddenAliases": [],
3503
- "id": "sync:validate",
3084
+ "id": "test:run",
3504
3085
  "pluginAlias": "@memberjunction/cli",
3505
3086
  "pluginName": "@memberjunction/cli",
3506
3087
  "pluginType": "core",
@@ -3510,52 +3091,106 @@
3510
3091
  "relativePath": [
3511
3092
  "dist",
3512
3093
  "commands",
3513
- "sync",
3514
- "validate.js"
3094
+ "test",
3095
+ "run.js"
3515
3096
  ]
3516
3097
  },
3517
- "sync:watch": {
3098
+ "test:suite": {
3518
3099
  "aliases": [],
3519
- "args": {},
3520
- "description": "Watch for file changes and sync automatically",
3100
+ "args": {
3101
+ "suiteId": {
3102
+ "description": "Test suite ID to execute",
3103
+ "name": "suiteId",
3104
+ "required": false
3105
+ }
3106
+ },
3107
+ "description": "Execute a test suite",
3521
3108
  "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"
3109
+ "<%= config.bin %> <%= command.id %> <suite-id>",
3110
+ "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
3111
+ "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
3112
+ "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
3526
3113
  ],
3527
3114
  "flags": {
3528
- "dir": {
3529
- "description": "Specific entity directory to watch",
3530
- "name": "dir",
3115
+ "name": {
3116
+ "char": "n",
3117
+ "description": "Test suite name to execute",
3118
+ "name": "name",
3531
3119
  "hasDynamicHelp": false,
3532
3120
  "multiple": false,
3533
3121
  "type": "option"
3534
3122
  },
3535
- "debounce": {
3536
- "description": "Debounce delay in milliseconds (default: 500)",
3537
- "name": "debounce",
3123
+ "format": {
3124
+ "char": "f",
3125
+ "description": "Output format",
3126
+ "name": "format",
3127
+ "default": "console",
3538
3128
  "hasDynamicHelp": false,
3539
3129
  "multiple": false,
3130
+ "options": [
3131
+ "console",
3132
+ "json",
3133
+ "markdown"
3134
+ ],
3540
3135
  "type": "option"
3541
3136
  },
3542
- "no-validate": {
3543
- "description": "Skip validation before sync",
3544
- "name": "no-validate",
3545
- "allowNo": false,
3546
- "type": "boolean"
3137
+ "output": {
3138
+ "char": "o",
3139
+ "description": "Output file path",
3140
+ "name": "output",
3141
+ "hasDynamicHelp": false,
3142
+ "multiple": false,
3143
+ "type": "option"
3547
3144
  },
3548
3145
  "verbose": {
3549
3146
  "char": "v",
3550
- "description": "Show detailed output",
3147
+ "description": "Show detailed execution information",
3551
3148
  "name": "verbose",
3552
3149
  "allowNo": false,
3553
3150
  "type": "boolean"
3151
+ },
3152
+ "delay": {
3153
+ "char": "d",
3154
+ "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
3155
+ "name": "delay",
3156
+ "default": 0,
3157
+ "hasDynamicHelp": false,
3158
+ "multiple": false,
3159
+ "type": "option"
3160
+ },
3161
+ "parallel": {
3162
+ "char": "p",
3163
+ "description": "Run tests in parallel with shared browser sessions",
3164
+ "name": "parallel",
3165
+ "allowNo": false,
3166
+ "type": "boolean"
3167
+ },
3168
+ "max-parallel": {
3169
+ "description": "Maximum number of parallel workers (default 4)",
3170
+ "name": "max-parallel",
3171
+ "default": 4,
3172
+ "hasDynamicHelp": false,
3173
+ "multiple": false,
3174
+ "type": "option"
3175
+ },
3176
+ "flaky-check": {
3177
+ "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
3178
+ "name": "flaky-check",
3179
+ "hasDynamicHelp": false,
3180
+ "multiple": false,
3181
+ "type": "option"
3182
+ },
3183
+ "oracles-module": {
3184
+ "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.",
3185
+ "name": "oracles-module",
3186
+ "hasDynamicHelp": false,
3187
+ "multiple": false,
3188
+ "type": "option"
3554
3189
  }
3555
3190
  },
3556
3191
  "hasDynamicHelp": false,
3557
3192
  "hiddenAliases": [],
3558
- "id": "sync:watch",
3193
+ "id": "test:suite",
3559
3194
  "pluginAlias": "@memberjunction/cli",
3560
3195
  "pluginName": "@memberjunction/cli",
3561
3196
  "pluginType": "core",
@@ -3565,71 +3200,49 @@
3565
3200
  "relativePath": [
3566
3201
  "dist",
3567
3202
  "commands",
3568
- "sync",
3569
- "watch.js"
3203
+ "test",
3204
+ "suite.js"
3570
3205
  ]
3571
3206
  },
3572
- "test:compare": {
3207
+ "test:validate": {
3573
3208
  "aliases": [],
3574
3209
  "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",
3210
+ "testId": {
3211
+ "description": "Test ID to validate",
3212
+ "name": "testId",
3583
3213
  "required": false
3584
3214
  }
3585
3215
  },
3586
- "description": "Compare test runs for regression detection",
3216
+ "description": "Validate test definitions without executing",
3587
3217
  "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"
3218
+ "<%= config.bin %> <%= command.id %> <test-id>",
3219
+ "<%= config.bin %> <%= command.id %> --all",
3220
+ "<%= config.bin %> <%= command.id %> --type=agent-eval",
3221
+ "<%= config.bin %> <%= command.id %> --all --save-report",
3222
+ "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
3595
3223
  ],
3596
3224
  "flags": {
3597
- "version": {
3598
- "char": "v",
3599
- "description": "Compare runs by version",
3600
- "name": "version",
3601
- "hasDynamicHelp": false,
3602
- "multiple": true,
3603
- "type": "option"
3225
+ "all": {
3226
+ "char": "a",
3227
+ "description": "Validate all tests",
3228
+ "name": "all",
3229
+ "allowNo": false,
3230
+ "type": "boolean"
3604
3231
  },
3605
- "commit": {
3606
- "char": "c",
3607
- "description": "Compare runs by git commit",
3608
- "name": "commit",
3232
+ "type": {
3233
+ "char": "t",
3234
+ "description": "Validate tests by type",
3235
+ "name": "type",
3609
3236
  "hasDynamicHelp": false,
3610
- "multiple": true,
3237
+ "multiple": false,
3611
3238
  "type": "option"
3612
3239
  },
3613
- "diff-only": {
3614
- "description": "Show only differences",
3615
- "name": "diff-only",
3616
- "allowNo": false,
3617
- "type": "boolean"
3618
- },
3619
- "latest": {
3620
- "char": "l",
3621
- "description": "Compare the two most recent completed suite runs",
3622
- "name": "latest",
3240
+ "save-report": {
3241
+ "description": "Save validation report to file",
3242
+ "name": "save-report",
3623
3243
  "allowNo": false,
3624
3244
  "type": "boolean"
3625
3245
  },
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
3246
  "format": {
3634
3247
  "char": "f",
3635
3248
  "description": "Output format",
@@ -3653,22 +3266,16 @@
3653
3266
  "type": "option"
3654
3267
  },
3655
3268
  "verbose": {
3269
+ "char": "v",
3656
3270
  "description": "Show detailed information",
3657
3271
  "name": "verbose",
3658
3272
  "allowNo": false,
3659
3273
  "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
3274
  }
3668
3275
  },
3669
3276
  "hasDynamicHelp": false,
3670
3277
  "hiddenAliases": [],
3671
- "id": "test:compare",
3278
+ "id": "test:validate",
3672
3279
  "pluginAlias": "@memberjunction/cli",
3673
3280
  "pluginName": "@memberjunction/cli",
3674
3281
  "pluginType": "core",
@@ -3679,77 +3286,55 @@
3679
3286
  "dist",
3680
3287
  "commands",
3681
3288
  "test",
3682
- "compare.js"
3289
+ "validate.js"
3683
3290
  ]
3684
3291
  },
3685
- "test:history": {
3292
+ "sync:file-reset": {
3686
3293
  "aliases": [],
3687
3294
  "args": {},
3688
- "description": "View test execution history",
3295
+ "description": "Reset file metadata sections",
3689
3296
  "examples": [
3690
3297
  "<%= 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"
3298
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3299
+ "<%= config.bin %> <%= command.id %> --sections=\"dependencies,references\"",
3300
+ "<%= config.bin %> <%= command.id %> --all"
3695
3301
  ],
3696
3302
  "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",
3303
+ "dir": {
3304
+ "description": "Specific entity directory to reset",
3305
+ "name": "dir",
3709
3306
  "hasDynamicHelp": false,
3710
3307
  "multiple": false,
3711
3308
  "type": "option"
3712
3309
  },
3713
- "from": {
3714
- "description": "Show history from date (YYYY-MM-DD)",
3715
- "name": "from",
3310
+ "sections": {
3311
+ "description": "Comma-separated list of sections to reset (dependencies,references,related,lookup)",
3312
+ "name": "sections",
3716
3313
  "hasDynamicHelp": false,
3717
3314
  "multiple": false,
3718
3315
  "type": "option"
3719
3316
  },
3720
- "status": {
3721
- "char": "s",
3722
- "description": "Filter by status",
3723
- "name": "status",
3724
- "hasDynamicHelp": false,
3725
- "multiple": false,
3726
- "type": "option"
3317
+ "all": {
3318
+ "description": "Reset all metadata sections",
3319
+ "name": "all",
3320
+ "allowNo": false,
3321
+ "type": "boolean"
3727
3322
  },
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"
3323
+ "dry-run": {
3324
+ "description": "Show what would be reset without actually resetting",
3325
+ "name": "dry-run",
3326
+ "allowNo": false,
3327
+ "type": "boolean"
3741
3328
  },
3742
- "output": {
3743
- "char": "o",
3744
- "description": "Output file path",
3745
- "name": "output",
3746
- "hasDynamicHelp": false,
3747
- "multiple": false,
3748
- "type": "option"
3329
+ "force": {
3330
+ "description": "Skip confirmation prompts",
3331
+ "name": "force",
3332
+ "allowNo": false,
3333
+ "type": "boolean"
3749
3334
  },
3750
3335
  "verbose": {
3751
3336
  "char": "v",
3752
- "description": "Show detailed information",
3337
+ "description": "Show detailed output",
3753
3338
  "name": "verbose",
3754
3339
  "allowNo": false,
3755
3340
  "type": "boolean"
@@ -3757,7 +3342,7 @@
3757
3342
  },
3758
3343
  "hasDynamicHelp": false,
3759
3344
  "hiddenAliases": [],
3760
- "id": "test:history",
3345
+ "id": "sync:file-reset",
3761
3346
  "pluginAlias": "@memberjunction/cli",
3762
3347
  "pluginName": "@memberjunction/cli",
3763
3348
  "pluginType": "core",
@@ -3767,26 +3352,21 @@
3767
3352
  "relativePath": [
3768
3353
  "dist",
3769
3354
  "commands",
3770
- "test",
3771
- "history.js"
3355
+ "sync",
3356
+ "file-reset.js"
3772
3357
  ]
3773
3358
  },
3774
- "test": {
3359
+ "sync:init": {
3775
3360
  "aliases": [],
3776
3361
  "args": {},
3777
- "description": "MemberJunction Testing Framework - Execute and manage tests",
3362
+ "description": "Initialize a directory for metadata synchronization",
3778
3363
  "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"
3364
+ "<%= config.bin %> <%= command.id %>"
3785
3365
  ],
3786
3366
  "flags": {},
3787
3367
  "hasDynamicHelp": false,
3788
3368
  "hiddenAliases": [],
3789
- "id": "test",
3369
+ "id": "sync:init",
3790
3370
  "pluginAlias": "@memberjunction/cli",
3791
3371
  "pluginName": "@memberjunction/cli",
3792
3372
  "pluginType": "core",
@@ -3796,91 +3376,419 @@
3796
3376
  "relativePath": [
3797
3377
  "dist",
3798
3378
  "commands",
3799
- "test",
3800
- "index.js"
3379
+ "sync",
3380
+ "init.js"
3801
3381
  ]
3802
3382
  },
3803
- "test:list": {
3383
+ "sync:pull": {
3804
3384
  "aliases": [],
3805
3385
  "args": {},
3806
- "description": "List available tests, suites, and types",
3386
+ "description": "Pull metadata from database to local files",
3807
3387
  "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"
3388
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Prompts\"",
3389
+ "<%= config.bin %> <%= command.id %> --entity=\"MJ: AI Agents\" --merge-strategy=overwrite",
3390
+ "<%= config.bin %> <%= command.id %> --entity=\"Templates\" --dry-run --verbose"
3814
3391
  ],
3815
3392
  "flags": {
3816
- "suites": {
3817
- "description": "List test suites instead of tests",
3818
- "name": "suites",
3393
+ "format": {
3394
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3395
+ "name": "format",
3396
+ "default": "text",
3397
+ "hasDynamicHelp": false,
3398
+ "multiple": false,
3399
+ "options": [
3400
+ "text",
3401
+ "json",
3402
+ "md"
3403
+ ],
3404
+ "type": "option"
3405
+ },
3406
+ "verbose": {
3407
+ "char": "v",
3408
+ "description": "Show detailed output",
3409
+ "name": "verbose",
3819
3410
  "allowNo": false,
3820
3411
  "type": "boolean"
3821
3412
  },
3822
- "types": {
3823
- "description": "List test types",
3824
- "name": "types",
3413
+ "no-banner": {
3414
+ "description": "Suppress the startup banner and runtime advisory",
3415
+ "name": "no-banner",
3825
3416
  "allowNo": false,
3826
3417
  "type": "boolean"
3827
3418
  },
3828
- "type": {
3829
- "char": "t",
3830
- "description": "Filter by test type",
3831
- "name": "type",
3419
+ "entity": {
3420
+ "description": "Entity name to pull",
3421
+ "name": "entity",
3422
+ "required": true,
3832
3423
  "hasDynamicHelp": false,
3833
3424
  "multiple": false,
3834
3425
  "type": "option"
3835
3426
  },
3836
- "tag": {
3837
- "description": "Filter by tag",
3838
- "name": "tag",
3427
+ "filter": {
3428
+ "description": "Additional filter for pulling specific records",
3429
+ "name": "filter",
3839
3430
  "hasDynamicHelp": false,
3840
3431
  "multiple": false,
3841
3432
  "type": "option"
3842
3433
  },
3843
- "status": {
3844
- "char": "s",
3845
- "description": "Filter by status",
3846
- "name": "status",
3434
+ "dry-run": {
3435
+ "description": "Show what would be pulled without actually pulling",
3436
+ "name": "dry-run",
3437
+ "allowNo": false,
3438
+ "type": "boolean"
3439
+ },
3440
+ "multi-file": {
3441
+ "description": "Create a single file with multiple records (provide filename)",
3442
+ "name": "multi-file",
3443
+ "hasDynamicHelp": false,
3444
+ "multiple": false,
3445
+ "type": "option"
3446
+ },
3447
+ "no-validate": {
3448
+ "description": "Skip validation before pull",
3449
+ "name": "no-validate",
3450
+ "allowNo": false,
3451
+ "type": "boolean"
3452
+ },
3453
+ "update-existing": {
3454
+ "description": "Update existing records during pull",
3455
+ "name": "update-existing",
3456
+ "allowNo": false,
3457
+ "type": "boolean"
3458
+ },
3459
+ "create-new": {
3460
+ "description": "Create new files for records not found locally",
3461
+ "name": "create-new",
3462
+ "allowNo": false,
3463
+ "type": "boolean"
3464
+ },
3465
+ "backup-before-update": {
3466
+ "description": "Create backups before updating files",
3467
+ "name": "backup-before-update",
3468
+ "allowNo": false,
3469
+ "type": "boolean"
3470
+ },
3471
+ "merge-strategy": {
3472
+ "description": "Merge strategy for updates",
3473
+ "name": "merge-strategy",
3474
+ "default": "merge",
3847
3475
  "hasDynamicHelp": false,
3848
3476
  "multiple": false,
3477
+ "options": [
3478
+ "merge",
3479
+ "overwrite",
3480
+ "skip"
3481
+ ],
3482
+ "type": "option"
3483
+ },
3484
+ "backup-directory": {
3485
+ "description": "Custom backup directory (default: .backups)",
3486
+ "name": "backup-directory",
3487
+ "hasDynamicHelp": false,
3488
+ "multiple": false,
3489
+ "type": "option"
3490
+ },
3491
+ "preserve-fields": {
3492
+ "description": "Comma-separated list of fields to preserve during updates",
3493
+ "name": "preserve-fields",
3494
+ "hasDynamicHelp": false,
3495
+ "multiple": true,
3849
3496
  "type": "option"
3850
3497
  },
3498
+ "exclude-fields": {
3499
+ "description": "Comma-separated list of fields to exclude from pull",
3500
+ "name": "exclude-fields",
3501
+ "hasDynamicHelp": false,
3502
+ "multiple": true,
3503
+ "type": "option"
3504
+ },
3505
+ "target-dir": {
3506
+ "description": "Specific target directory (overrides auto-discovery)",
3507
+ "name": "target-dir",
3508
+ "hasDynamicHelp": false,
3509
+ "multiple": false,
3510
+ "type": "option"
3511
+ },
3512
+ "incremental": {
3513
+ "description": "Only pull records updated since last successful pull",
3514
+ "name": "incremental",
3515
+ "allowNo": false,
3516
+ "type": "boolean"
3517
+ },
3518
+ "since": {
3519
+ "description": "Only pull records updated after this ISO 8601 timestamp",
3520
+ "name": "since",
3521
+ "hasDynamicHelp": false,
3522
+ "multiple": false,
3523
+ "type": "option"
3524
+ }
3525
+ },
3526
+ "hasDynamicHelp": false,
3527
+ "hiddenAliases": [],
3528
+ "id": "sync:pull",
3529
+ "pluginAlias": "@memberjunction/cli",
3530
+ "pluginName": "@memberjunction/cli",
3531
+ "pluginType": "core",
3532
+ "strict": true,
3533
+ "enableJsonFlag": false,
3534
+ "Usage": {
3535
+ "domain": "sync",
3536
+ "command": "sync:pull",
3537
+ "summary": "Pull database records into local metadata files.",
3538
+ "description": "Writes records of --entity into the matching entity directory, creating or updating files per the merge strategy.",
3539
+ "flags": [
3540
+ {
3541
+ "name": "--entity",
3542
+ "type": "string",
3543
+ "description": "Entity name to pull (required)"
3544
+ },
3545
+ {
3546
+ "name": "--filter",
3547
+ "type": "string",
3548
+ "description": "Extra SQL filter for which records to pull"
3549
+ },
3550
+ {
3551
+ "name": "--merge-strategy",
3552
+ "type": "merge|overwrite|skip",
3553
+ "description": "How to reconcile existing files"
3554
+ },
3555
+ {
3556
+ "name": "--dry-run",
3557
+ "type": "boolean",
3558
+ "description": "Report what would be pulled without writing"
3559
+ },
3560
+ {
3561
+ "name": "--format",
3562
+ "type": "text|json|md",
3563
+ "description": "Output format (json for machine-readable result)"
3564
+ }
3565
+ ],
3566
+ "examples": [
3567
+ "mj sync pull --entity=\"MJ: AI Prompts\"",
3568
+ "mj sync pull --entity=\"Actions\" --format=json"
3569
+ ],
3570
+ "runtime": {
3571
+ "class": "variable",
3572
+ "typicalSeconds": 15,
3573
+ "note": "scales with number of records matched for --entity"
3574
+ }
3575
+ },
3576
+ "isESM": true,
3577
+ "relativePath": [
3578
+ "dist",
3579
+ "commands",
3580
+ "sync",
3581
+ "pull.js"
3582
+ ]
3583
+ },
3584
+ "sync:push": {
3585
+ "aliases": [],
3586
+ "args": {},
3587
+ "description": "Push local file changes to the database",
3588
+ "examples": [
3589
+ "<%= config.bin %> <%= command.id %>",
3590
+ "<%= config.bin %> <%= command.id %> --dry-run",
3591
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3592
+ "<%= config.bin %> <%= command.id %> --ci --format=json"
3593
+ ],
3594
+ "flags": {
3851
3595
  "format": {
3852
- "char": "f",
3853
- "description": "Output format",
3596
+ "description": "Output format: text (human), json (machine-readable), md (Markdown-fenced)",
3854
3597
  "name": "format",
3855
- "default": "console",
3598
+ "default": "text",
3856
3599
  "hasDynamicHelp": false,
3857
3600
  "multiple": false,
3858
3601
  "options": [
3859
- "console",
3602
+ "text",
3860
3603
  "json",
3861
- "markdown"
3604
+ "md"
3862
3605
  ],
3863
3606
  "type": "option"
3864
3607
  },
3865
- "output": {
3866
- "char": "o",
3867
- "description": "Output file path",
3868
- "name": "output",
3608
+ "verbose": {
3609
+ "char": "v",
3610
+ "description": "Show detailed output",
3611
+ "name": "verbose",
3612
+ "allowNo": false,
3613
+ "type": "boolean"
3614
+ },
3615
+ "no-banner": {
3616
+ "description": "Suppress the startup banner and runtime advisory",
3617
+ "name": "no-banner",
3618
+ "allowNo": false,
3619
+ "type": "boolean"
3620
+ },
3621
+ "dir": {
3622
+ "description": "Specific entity directory to push",
3623
+ "name": "dir",
3624
+ "hasDynamicHelp": false,
3625
+ "multiple": false,
3626
+ "type": "option"
3627
+ },
3628
+ "dry-run": {
3629
+ "description": "Show what would be pushed without actually pushing",
3630
+ "name": "dry-run",
3631
+ "allowNo": false,
3632
+ "type": "boolean"
3633
+ },
3634
+ "ci": {
3635
+ "description": "CI mode - no prompts, fail on issues",
3636
+ "name": "ci",
3637
+ "allowNo": false,
3638
+ "type": "boolean"
3639
+ },
3640
+ "no-validate": {
3641
+ "description": "Skip validation before push",
3642
+ "name": "no-validate",
3643
+ "allowNo": false,
3644
+ "type": "boolean"
3645
+ },
3646
+ "delete-db-only": {
3647
+ "description": "Delete database-only records that reference records being deleted (prevents FK errors)",
3648
+ "name": "delete-db-only",
3649
+ "allowNo": false,
3650
+ "type": "boolean"
3651
+ },
3652
+ "parallel-batch-size": {
3653
+ "description": "Number of records to process in parallel (default: 10)",
3654
+ "name": "parallel-batch-size",
3655
+ "default": 10,
3656
+ "hasDynamicHelp": false,
3657
+ "multiple": false,
3658
+ "type": "option"
3659
+ },
3660
+ "include": {
3661
+ "description": "Only process these directories (comma-separated, supports patterns)",
3662
+ "name": "include",
3663
+ "hasDynamicHelp": false,
3664
+ "multiple": false,
3665
+ "type": "option"
3666
+ },
3667
+ "exclude": {
3668
+ "description": "Skip these directories (comma-separated, supports patterns)",
3669
+ "name": "exclude",
3670
+ "hasDynamicHelp": false,
3671
+ "multiple": false,
3672
+ "type": "option"
3673
+ },
3674
+ "incremental": {
3675
+ "description": "Skip unchanged files using stored checksums from last push",
3676
+ "name": "incremental",
3677
+ "allowNo": false,
3678
+ "type": "boolean"
3679
+ },
3680
+ "change-detail": {
3681
+ "description": "Write a detailed per-record change report (primary keys + field diffs) to a file",
3682
+ "name": "change-detail",
3683
+ "allowNo": false,
3684
+ "type": "boolean"
3685
+ }
3686
+ },
3687
+ "hasDynamicHelp": false,
3688
+ "hiddenAliases": [],
3689
+ "id": "sync:push",
3690
+ "pluginAlias": "@memberjunction/cli",
3691
+ "pluginName": "@memberjunction/cli",
3692
+ "pluginType": "core",
3693
+ "strict": true,
3694
+ "enableJsonFlag": false,
3695
+ "Usage": {
3696
+ "domain": "sync",
3697
+ "command": "sync:push",
3698
+ "summary": "Push local metadata files to the database (upsert).",
3699
+ "description": "Reads entity directories under --dir and creates/updates matching records. Runs validation first unless --no-validate.",
3700
+ "flags": [
3701
+ {
3702
+ "name": "--dir",
3703
+ "type": "string",
3704
+ "description": "Entity directory to push"
3705
+ },
3706
+ {
3707
+ "name": "--dry-run",
3708
+ "type": "boolean",
3709
+ "description": "Report what would change without writing"
3710
+ },
3711
+ {
3712
+ "name": "--ci",
3713
+ "type": "boolean",
3714
+ "description": "No prompts; non-zero exit on error"
3715
+ },
3716
+ {
3717
+ "name": "--no-validate",
3718
+ "type": "boolean",
3719
+ "description": "Skip pre-push validation"
3720
+ },
3721
+ {
3722
+ "name": "--incremental",
3723
+ "type": "boolean",
3724
+ "description": "Skip unchanged files using stored checksums"
3725
+ },
3726
+ {
3727
+ "name": "--format",
3728
+ "type": "text|json|md",
3729
+ "description": "Output format (json for machine-readable result)"
3730
+ }
3731
+ ],
3732
+ "examples": [
3733
+ "mj sync push --dir=ai-agents",
3734
+ "mj sync push --ci --format=json"
3735
+ ],
3736
+ "runtime": {
3737
+ "class": "variable",
3738
+ "typicalSeconds": 20,
3739
+ "note": "scales with number of records in --dir"
3740
+ }
3741
+ },
3742
+ "isESM": true,
3743
+ "relativePath": [
3744
+ "dist",
3745
+ "commands",
3746
+ "sync",
3747
+ "push.js"
3748
+ ]
3749
+ },
3750
+ "sync:status": {
3751
+ "aliases": [],
3752
+ "args": {},
3753
+ "description": "Show status of local files vs database",
3754
+ "examples": [
3755
+ "<%= config.bin %> <%= command.id %>",
3756
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3757
+ "<%= config.bin %> <%= command.id %> --verbose"
3758
+ ],
3759
+ "flags": {
3760
+ "dir": {
3761
+ "description": "Specific entity directory to check status",
3762
+ "name": "dir",
3869
3763
  "hasDynamicHelp": false,
3870
3764
  "multiple": false,
3871
3765
  "type": "option"
3872
3766
  },
3873
3767
  "verbose": {
3874
3768
  "char": "v",
3875
- "description": "Show detailed information",
3769
+ "description": "Show detailed field-level differences",
3876
3770
  "name": "verbose",
3877
3771
  "allowNo": false,
3878
3772
  "type": "boolean"
3773
+ },
3774
+ "include": {
3775
+ "description": "Only process these directories (comma-separated, supports patterns)",
3776
+ "name": "include",
3777
+ "hasDynamicHelp": false,
3778
+ "multiple": false,
3779
+ "type": "option"
3780
+ },
3781
+ "exclude": {
3782
+ "description": "Skip these directories (comma-separated, supports patterns)",
3783
+ "name": "exclude",
3784
+ "hasDynamicHelp": false,
3785
+ "multiple": false,
3786
+ "type": "option"
3879
3787
  }
3880
3788
  },
3881
3789
  "hasDynamicHelp": false,
3882
3790
  "hiddenAliases": [],
3883
- "id": "test:list",
3791
+ "id": "sync:status",
3884
3792
  "pluginAlias": "@memberjunction/cli",
3885
3793
  "pluginName": "@memberjunction/cli",
3886
3794
  "pluginType": "core",
@@ -3890,90 +3798,32 @@
3890
3798
  "relativePath": [
3891
3799
  "dist",
3892
3800
  "commands",
3893
- "test",
3894
- "list.js"
3801
+ "sync",
3802
+ "status.js"
3895
3803
  ]
3896
3804
  },
3897
- "test:run": {
3805
+ "sync:usage": {
3898
3806
  "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",
3907
- "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"
3913
- ],
3807
+ "args": {},
3808
+ "description": "Show usage, flags, examples, and runtime hints for every `mj sync` command.",
3914
3809
  "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
3810
  "format": {
3932
- "char": "f",
3933
3811
  "description": "Output format",
3934
3812
  "name": "format",
3935
- "default": "console",
3813
+ "default": "text",
3936
3814
  "hasDynamicHelp": false,
3937
3815
  "multiple": false,
3938
3816
  "options": [
3939
- "console",
3817
+ "text",
3940
3818
  "json",
3941
- "markdown"
3819
+ "md"
3942
3820
  ],
3943
3821
  "type": "option"
3944
- },
3945
- "output": {
3946
- "char": "o",
3947
- "description": "Output file path",
3948
- "name": "output",
3949
- "hasDynamicHelp": false,
3950
- "multiple": false,
3951
- "type": "option"
3952
- },
3953
- "dry-run": {
3954
- "description": "Validate without executing",
3955
- "name": "dry-run",
3956
- "allowNo": false,
3957
- "type": "boolean"
3958
- },
3959
- "verbose": {
3960
- "char": "v",
3961
- "description": "Show detailed execution information",
3962
- "name": "verbose",
3963
- "allowNo": false,
3964
- "type": "boolean"
3965
- },
3966
- "oracles-module": {
3967
- "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.",
3968
- "name": "oracles-module",
3969
- "hasDynamicHelp": false,
3970
- "multiple": false,
3971
- "type": "option"
3972
3822
  }
3973
3823
  },
3974
3824
  "hasDynamicHelp": false,
3975
3825
  "hiddenAliases": [],
3976
- "id": "test:run",
3826
+ "id": "sync:usage",
3977
3827
  "pluginAlias": "@memberjunction/cli",
3978
3828
  "pluginName": "@memberjunction/cli",
3979
3829
  "pluginType": "core",
@@ -3983,98 +3833,44 @@
3983
3833
  "relativePath": [
3984
3834
  "dist",
3985
3835
  "commands",
3986
- "test",
3987
- "run.js"
3836
+ "sync",
3837
+ "usage.js"
3988
3838
  ]
3989
3839
  },
3990
- "test:suite": {
3840
+ "sync:validate": {
3991
3841
  "aliases": [],
3992
- "args": {
3993
- "suiteId": {
3994
- "description": "Test suite ID to execute",
3995
- "name": "suiteId",
3996
- "required": false
3997
- }
3998
- },
3999
- "description": "Execute a test suite",
3842
+ "args": {},
3843
+ "description": "Validate metadata files",
4000
3844
  "examples": [
4001
- "<%= config.bin %> <%= command.id %> <suite-id>",
4002
- "<%= config.bin %> <%= command.id %> --name=\"Agent Quality Suite\"",
4003
- "<%= config.bin %> <%= command.id %> <suite-id> --format=json",
4004
- "<%= config.bin %> <%= command.id %> <suite-id> --output=suite-results.json"
3845
+ "<%= config.bin %> <%= command.id %>",
3846
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3847
+ "<%= config.bin %> <%= command.id %> --save-report",
3848
+ "<%= config.bin %> <%= command.id %> --verbose"
4005
3849
  ],
4006
3850
  "flags": {
4007
- "name": {
4008
- "char": "n",
4009
- "description": "Test suite name to execute",
4010
- "name": "name",
4011
- "hasDynamicHelp": false,
4012
- "multiple": false,
4013
- "type": "option"
4014
- },
4015
- "format": {
4016
- "char": "f",
4017
- "description": "Output format",
4018
- "name": "format",
4019
- "default": "console",
4020
- "hasDynamicHelp": false,
4021
- "multiple": false,
4022
- "options": [
4023
- "console",
4024
- "json",
4025
- "markdown"
4026
- ],
4027
- "type": "option"
4028
- },
4029
- "output": {
4030
- "char": "o",
4031
- "description": "Output file path",
4032
- "name": "output",
3851
+ "dir": {
3852
+ "description": "Specific entity directory to validate",
3853
+ "name": "dir",
4033
3854
  "hasDynamicHelp": false,
4034
3855
  "multiple": false,
4035
3856
  "type": "option"
4036
3857
  },
4037
3858
  "verbose": {
4038
3859
  "char": "v",
4039
- "description": "Show detailed execution information",
3860
+ "description": "Show detailed validation output",
4040
3861
  "name": "verbose",
4041
3862
  "allowNo": false,
4042
3863
  "type": "boolean"
4043
3864
  },
4044
- "delay": {
4045
- "char": "d",
4046
- "description": "Delay in milliseconds between test executions (avoids Auth0 rate limits)",
4047
- "name": "delay",
4048
- "default": 0,
4049
- "hasDynamicHelp": false,
4050
- "multiple": false,
4051
- "type": "option"
4052
- },
4053
- "parallel": {
4054
- "char": "p",
4055
- "description": "Run tests in parallel with shared browser sessions",
4056
- "name": "parallel",
3865
+ "save-report": {
3866
+ "description": "Save validation report as markdown file",
3867
+ "name": "save-report",
4057
3868
  "allowNo": false,
4058
3869
  "type": "boolean"
4059
3870
  },
4060
- "max-parallel": {
4061
- "description": "Maximum number of parallel workers (default 4)",
4062
- "name": "max-parallel",
4063
- "default": 4,
4064
- "hasDynamicHelp": false,
4065
- "multiple": false,
4066
- "type": "option"
4067
- },
4068
- "flaky-check": {
4069
- "description": "Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5",
4070
- "name": "flaky-check",
4071
- "hasDynamicHelp": false,
4072
- "multiple": false,
4073
- "type": "option"
4074
- },
4075
- "oracles-module": {
4076
- "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.",
4077
- "name": "oracles-module",
3871
+ "output": {
3872
+ "description": "Output file path for validation report (default: validation-report.md)",
3873
+ "name": "output",
4078
3874
  "hasDynamicHelp": false,
4079
3875
  "multiple": false,
4080
3876
  "type": "option"
@@ -4082,7 +3878,7 @@
4082
3878
  },
4083
3879
  "hasDynamicHelp": false,
4084
3880
  "hiddenAliases": [],
4085
- "id": "test:suite",
3881
+ "id": "sync:validate",
4086
3882
  "pluginAlias": "@memberjunction/cli",
4087
3883
  "pluginName": "@memberjunction/cli",
4088
3884
  "pluginType": "core",
@@ -4092,74 +3888,44 @@
4092
3888
  "relativePath": [
4093
3889
  "dist",
4094
3890
  "commands",
4095
- "test",
4096
- "suite.js"
3891
+ "sync",
3892
+ "validate.js"
4097
3893
  ]
4098
3894
  },
4099
- "test:validate": {
3895
+ "sync:watch": {
4100
3896
  "aliases": [],
4101
- "args": {
4102
- "testId": {
4103
- "description": "Test ID to validate",
4104
- "name": "testId",
4105
- "required": false
4106
- }
4107
- },
4108
- "description": "Validate test definitions without executing",
3897
+ "args": {},
3898
+ "description": "Watch for file changes and sync automatically",
4109
3899
  "examples": [
4110
- "<%= config.bin %> <%= command.id %> <test-id>",
4111
- "<%= config.bin %> <%= command.id %> --all",
4112
- "<%= config.bin %> <%= command.id %> --type=agent-eval",
4113
- "<%= config.bin %> <%= command.id %> --all --save-report",
4114
- "<%= config.bin %> <%= command.id %> --all --output=validation-report.md"
3900
+ "<%= config.bin %> <%= command.id %>",
3901
+ "<%= config.bin %> <%= command.id %> --dir=\"ai-prompts\"",
3902
+ "<%= config.bin %> <%= command.id %> --debounce=1000",
3903
+ "<%= config.bin %> <%= command.id %> --no-validate"
4115
3904
  ],
4116
3905
  "flags": {
4117
- "all": {
4118
- "char": "a",
4119
- "description": "Validate all tests",
4120
- "name": "all",
4121
- "allowNo": false,
4122
- "type": "boolean"
4123
- },
4124
- "type": {
4125
- "char": "t",
4126
- "description": "Validate tests by type",
4127
- "name": "type",
4128
- "hasDynamicHelp": false,
4129
- "multiple": false,
4130
- "type": "option"
4131
- },
4132
- "save-report": {
4133
- "description": "Save validation report to file",
4134
- "name": "save-report",
4135
- "allowNo": false,
4136
- "type": "boolean"
4137
- },
4138
- "format": {
4139
- "char": "f",
4140
- "description": "Output format",
4141
- "name": "format",
4142
- "default": "console",
3906
+ "dir": {
3907
+ "description": "Specific entity directory to watch",
3908
+ "name": "dir",
4143
3909
  "hasDynamicHelp": false,
4144
- "multiple": false,
4145
- "options": [
4146
- "console",
4147
- "json",
4148
- "markdown"
4149
- ],
3910
+ "multiple": false,
4150
3911
  "type": "option"
4151
3912
  },
4152
- "output": {
4153
- "char": "o",
4154
- "description": "Output file path",
4155
- "name": "output",
3913
+ "debounce": {
3914
+ "description": "Debounce delay in milliseconds (default: 500)",
3915
+ "name": "debounce",
4156
3916
  "hasDynamicHelp": false,
4157
3917
  "multiple": false,
4158
3918
  "type": "option"
4159
3919
  },
3920
+ "no-validate": {
3921
+ "description": "Skip validation before sync",
3922
+ "name": "no-validate",
3923
+ "allowNo": false,
3924
+ "type": "boolean"
3925
+ },
4160
3926
  "verbose": {
4161
3927
  "char": "v",
4162
- "description": "Show detailed information",
3928
+ "description": "Show detailed output",
4163
3929
  "name": "verbose",
4164
3930
  "allowNo": false,
4165
3931
  "type": "boolean"
@@ -4167,7 +3933,7 @@
4167
3933
  },
4168
3934
  "hasDynamicHelp": false,
4169
3935
  "hiddenAliases": [],
4170
- "id": "test:validate",
3936
+ "id": "sync:watch",
4171
3937
  "pluginAlias": "@memberjunction/cli",
4172
3938
  "pluginName": "@memberjunction/cli",
4173
3939
  "pluginType": "core",
@@ -4177,8 +3943,8 @@
4177
3943
  "relativePath": [
4178
3944
  "dist",
4179
3945
  "commands",
4180
- "test",
4181
- "validate.js"
3946
+ "sync",
3947
+ "watch.js"
4182
3948
  ]
4183
3949
  },
4184
3950
  "translate-sql": {
@@ -4418,6 +4184,240 @@
4418
4184
  "claude.js"
4419
4185
  ]
4420
4186
  },
4187
+ "install:claude": {
4188
+ "aliases": [],
4189
+ "args": {},
4190
+ "description": "Install or refresh the Claude Code pack in the current directory.",
4191
+ "examples": [
4192
+ "<%= config.bin %> install:claude",
4193
+ "<%= config.bin %> install:claude --dry-run",
4194
+ "<%= config.bin %> install:claude --from ./local-pack",
4195
+ "<%= config.bin %> install:claude --json"
4196
+ ],
4197
+ "flags": {
4198
+ "dir": {
4199
+ "description": "Target directory for the install",
4200
+ "name": "dir",
4201
+ "default": ".",
4202
+ "hasDynamicHelp": false,
4203
+ "multiple": false,
4204
+ "type": "option"
4205
+ },
4206
+ "major": {
4207
+ "description": "Force a specific MJ major (default: detected from package.json)",
4208
+ "name": "major",
4209
+ "hasDynamicHelp": false,
4210
+ "multiple": false,
4211
+ "type": "option"
4212
+ },
4213
+ "ref": {
4214
+ "description": "Git ref to fetch from (branch or tag). Default: main.",
4215
+ "name": "ref",
4216
+ "hasDynamicHelp": false,
4217
+ "multiple": false,
4218
+ "type": "option"
4219
+ },
4220
+ "from": {
4221
+ "description": "Use a local pack source instead of fetching from GitHub",
4222
+ "name": "from",
4223
+ "hasDynamicHelp": false,
4224
+ "multiple": false,
4225
+ "type": "option"
4226
+ },
4227
+ "offline": {
4228
+ "description": "Forbid network; requires --from <path>",
4229
+ "name": "offline",
4230
+ "allowNo": false,
4231
+ "type": "boolean"
4232
+ },
4233
+ "dry-run": {
4234
+ "description": "Print what would be written; change nothing",
4235
+ "name": "dry-run",
4236
+ "allowNo": false,
4237
+ "type": "boolean"
4238
+ },
4239
+ "yes": {
4240
+ "char": "y",
4241
+ "description": "Don't prompt (reserved for future interactive paths; currently no-op)",
4242
+ "name": "yes",
4243
+ "allowNo": false,
4244
+ "type": "boolean"
4245
+ },
4246
+ "force": {
4247
+ "description": "Overwrite user-customized commands/skills (saves .bak files)",
4248
+ "name": "force",
4249
+ "allowNo": false,
4250
+ "type": "boolean"
4251
+ },
4252
+ "skip-commands": {
4253
+ "description": "Skip seeding .claude/commands/",
4254
+ "name": "skip-commands",
4255
+ "allowNo": false,
4256
+ "type": "boolean"
4257
+ },
4258
+ "skip-skills": {
4259
+ "description": "Skip seeding .claude/skills/",
4260
+ "name": "skip-skills",
4261
+ "allowNo": false,
4262
+ "type": "boolean"
4263
+ },
4264
+ "skip-settings": {
4265
+ "description": "Skip merging .claude/settings.json",
4266
+ "name": "skip-settings",
4267
+ "allowNo": false,
4268
+ "type": "boolean"
4269
+ },
4270
+ "json": {
4271
+ "description": "Output as JSON (matches plan §7.5 schema)",
4272
+ "name": "json",
4273
+ "allowNo": false,
4274
+ "type": "boolean"
4275
+ },
4276
+ "verbose": {
4277
+ "char": "v",
4278
+ "description": "Show progress messages from the fetcher and merger",
4279
+ "name": "verbose",
4280
+ "allowNo": false,
4281
+ "type": "boolean"
4282
+ }
4283
+ },
4284
+ "hasDynamicHelp": false,
4285
+ "hiddenAliases": [],
4286
+ "id": "install:claude",
4287
+ "pluginAlias": "@memberjunction/cli",
4288
+ "pluginName": "@memberjunction/cli",
4289
+ "pluginType": "core",
4290
+ "strict": true,
4291
+ "enableJsonFlag": false,
4292
+ "isESM": true,
4293
+ "relativePath": [
4294
+ "dist",
4295
+ "commands",
4296
+ "install",
4297
+ "claude.js"
4298
+ ]
4299
+ },
4300
+ "install": {
4301
+ "aliases": [],
4302
+ "args": {},
4303
+ "description": "Install MemberJunction from a GitHub release",
4304
+ "examples": [
4305
+ "<%= config.bin %> <%= command.id %>",
4306
+ "<%= config.bin %> <%= command.id %> -t v4.3.0",
4307
+ "<%= config.bin %> <%= command.id %> --dry-run",
4308
+ "<%= config.bin %> <%= command.id %> --yes"
4309
+ ],
4310
+ "flags": {
4311
+ "tag": {
4312
+ "char": "t",
4313
+ "description": "Release tag to install (e.g. v4.3.0). If omitted, shows a version picker.",
4314
+ "name": "tag",
4315
+ "hasDynamicHelp": false,
4316
+ "multiple": false,
4317
+ "type": "option"
4318
+ },
4319
+ "dir": {
4320
+ "description": "Target directory for the installation",
4321
+ "name": "dir",
4322
+ "default": ".",
4323
+ "hasDynamicHelp": false,
4324
+ "multiple": false,
4325
+ "type": "option"
4326
+ },
4327
+ "config": {
4328
+ "char": "c",
4329
+ "description": "Path to JSON config file with install settings (database, auth, ports, etc.)",
4330
+ "name": "config",
4331
+ "hasDynamicHelp": false,
4332
+ "multiple": false,
4333
+ "type": "option"
4334
+ },
4335
+ "legacy": {
4336
+ "description": "Use the legacy interactive installer (ZIP-only distribution)",
4337
+ "hidden": true,
4338
+ "name": "legacy",
4339
+ "allowNo": false,
4340
+ "type": "boolean"
4341
+ },
4342
+ "dry-run": {
4343
+ "description": "Show the install plan without executing it",
4344
+ "name": "dry-run",
4345
+ "allowNo": false,
4346
+ "type": "boolean"
4347
+ },
4348
+ "yes": {
4349
+ "char": "y",
4350
+ "description": "Non-interactive mode: auto-select latest version and accept defaults",
4351
+ "name": "yes",
4352
+ "allowNo": false,
4353
+ "type": "boolean"
4354
+ },
4355
+ "verbose": {
4356
+ "char": "v",
4357
+ "description": "Show detailed output",
4358
+ "name": "verbose",
4359
+ "allowNo": false,
4360
+ "type": "boolean"
4361
+ },
4362
+ "skip-db": {
4363
+ "description": "Skip database provisioning phases",
4364
+ "name": "skip-db",
4365
+ "allowNo": false,
4366
+ "type": "boolean"
4367
+ },
4368
+ "skip-start": {
4369
+ "description": "Skip service startup and smoke tests",
4370
+ "name": "skip-start",
4371
+ "allowNo": false,
4372
+ "type": "boolean"
4373
+ },
4374
+ "no-resume": {
4375
+ "description": "Ignore any existing checkpoint and start fresh",
4376
+ "name": "no-resume",
4377
+ "allowNo": false,
4378
+ "type": "boolean"
4379
+ },
4380
+ "fast": {
4381
+ "description": "Fast mode: skip smoke test and optimize post-codegen steps. Re-run without --fast if you encounter issues.",
4382
+ "name": "fast",
4383
+ "allowNo": false,
4384
+ "type": "boolean"
4385
+ },
4386
+ "overwrite-config": {
4387
+ "description": "Overwrite existing config files (.env, mj.config.cjs, environment.ts) instead of preserving them",
4388
+ "name": "overwrite-config",
4389
+ "allowNo": false,
4390
+ "type": "boolean"
4391
+ },
4392
+ "monorepo": {
4393
+ "description": "Install the full MemberJunction source repository instead of the lightweight distribution. Use this for MJ framework development.",
4394
+ "name": "monorepo",
4395
+ "allowNo": false,
4396
+ "type": "boolean"
4397
+ },
4398
+ "no-claude-pack": {
4399
+ "description": "Exclude the Claude Code pack (CLAUDE.md + .claude/ tree) from the scaffold. By default the pack ships with the install so opening Claude Code in your new MJ project gives you the curated MJ-aware experience immediately.",
4400
+ "name": "no-claude-pack",
4401
+ "allowNo": false,
4402
+ "type": "boolean"
4403
+ }
4404
+ },
4405
+ "hasDynamicHelp": false,
4406
+ "hiddenAliases": [],
4407
+ "id": "install",
4408
+ "pluginAlias": "@memberjunction/cli",
4409
+ "pluginName": "@memberjunction/cli",
4410
+ "pluginType": "core",
4411
+ "strict": true,
4412
+ "enableJsonFlag": false,
4413
+ "isESM": true,
4414
+ "relativePath": [
4415
+ "dist",
4416
+ "commands",
4417
+ "install",
4418
+ "index.js"
4419
+ ]
4420
+ },
4421
4421
  "ai:actions:list": {
4422
4422
  "aliases": [],
4423
4423
  "args": {},
@@ -5466,5 +5466,5 @@
5466
5466
  ]
5467
5467
  }
5468
5468
  },
5469
- "version": "5.45.0"
5469
+ "version": "5.45.1"
5470
5470
  }