@memberjunction/cli 6.2.0-edge.1 → 6.2.0-edge.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 (134) hide show
  1. package/dist/commands/agent/init.d.ts +12 -0
  2. package/dist/commands/agent/init.d.ts.map +1 -1
  3. package/dist/commands/agent/init.js +42 -8
  4. package/dist/commands/agent/init.js.map +1 -1
  5. package/dist/commands/migrate/convert.d.ts.map +1 -1
  6. package/dist/commands/migrate/convert.js +15 -1
  7. package/dist/commands/migrate/convert.js.map +1 -1
  8. package/dist/commands/migrate/rebake.d.ts.map +1 -1
  9. package/dist/commands/migrate/rebake.js +7 -0
  10. package/dist/commands/migrate/rebake.js.map +1 -1
  11. package/dist/commands/queue/backlog.d.ts +11 -0
  12. package/dist/commands/queue/backlog.d.ts.map +1 -0
  13. package/dist/commands/queue/backlog.js +32 -0
  14. package/dist/commands/queue/backlog.js.map +1 -0
  15. package/dist/commands/queue/dead-letters.d.ts +13 -0
  16. package/dist/commands/queue/dead-letters.d.ts.map +1 -0
  17. package/dist/commands/queue/dead-letters.js +35 -0
  18. package/dist/commands/queue/dead-letters.js.map +1 -0
  19. package/dist/commands/queue/discard.d.ts +12 -0
  20. package/dist/commands/queue/discard.d.ts.map +1 -0
  21. package/dist/commands/queue/discard.js +45 -0
  22. package/dist/commands/queue/discard.js.map +1 -0
  23. package/dist/commands/queue/export-topology.d.ts +12 -0
  24. package/dist/commands/queue/export-topology.d.ts.map +1 -0
  25. package/dist/commands/queue/export-topology.js +40 -0
  26. package/dist/commands/queue/export-topology.js.map +1 -0
  27. package/dist/commands/queue/import-bindings.d.ts +14 -0
  28. package/dist/commands/queue/import-bindings.d.ts.map +1 -0
  29. package/dist/commands/queue/import-bindings.js +41 -0
  30. package/dist/commands/queue/import-bindings.js.map +1 -0
  31. package/dist/commands/queue/index.d.ts +7 -0
  32. package/dist/commands/queue/index.d.ts.map +1 -0
  33. package/dist/commands/queue/index.js +25 -0
  34. package/dist/commands/queue/index.js.map +1 -0
  35. package/dist/commands/queue/partitions.d.ts +14 -0
  36. package/dist/commands/queue/partitions.d.ts.map +1 -0
  37. package/dist/commands/queue/partitions.js +36 -0
  38. package/dist/commands/queue/partitions.js.map +1 -0
  39. package/dist/commands/queue/publish.d.ts +35 -0
  40. package/dist/commands/queue/publish.d.ts.map +1 -0
  41. package/dist/commands/queue/publish.js +94 -0
  42. package/dist/commands/queue/publish.js.map +1 -0
  43. package/dist/commands/queue/replay.d.ts +12 -0
  44. package/dist/commands/queue/replay.d.ts.map +1 -0
  45. package/dist/commands/queue/replay.js +42 -0
  46. package/dist/commands/queue/replay.js.map +1 -0
  47. package/dist/commands/queue/stats.d.ts +11 -0
  48. package/dist/commands/queue/stats.d.ts.map +1 -0
  49. package/dist/commands/queue/stats.js +35 -0
  50. package/dist/commands/queue/stats.js.map +1 -0
  51. package/dist/commands/queue/usage.d.ts +7 -0
  52. package/dist/commands/queue/usage.d.ts.map +1 -0
  53. package/dist/commands/queue/usage.js +10 -0
  54. package/dist/commands/queue/usage.js.map +1 -0
  55. package/dist/commands/queue/validate-bindings.d.ts +12 -0
  56. package/dist/commands/queue/validate-bindings.d.ts.map +1 -0
  57. package/dist/commands/queue/validate-bindings.js +37 -0
  58. package/dist/commands/queue/validate-bindings.js.map +1 -0
  59. package/dist/commands/queue/work.d.ts +20 -0
  60. package/dist/commands/queue/work.d.ts.map +1 -0
  61. package/dist/commands/queue/work.js +77 -0
  62. package/dist/commands/queue/work.js.map +1 -0
  63. package/dist/commands/rubric/diff.d.ts +11 -0
  64. package/dist/commands/rubric/diff.d.ts.map +1 -0
  65. package/dist/commands/rubric/diff.js +20 -0
  66. package/dist/commands/rubric/diff.js.map +1 -0
  67. package/dist/commands/rubric/evaluate.d.ts +15 -0
  68. package/dist/commands/rubric/evaluate.d.ts.map +1 -0
  69. package/dist/commands/rubric/evaluate.js +28 -0
  70. package/dist/commands/rubric/evaluate.js.map +1 -0
  71. package/dist/commands/rubric/index.d.ts +6 -0
  72. package/dist/commands/rubric/index.d.ts.map +1 -0
  73. package/dist/commands/rubric/index.js +13 -0
  74. package/dist/commands/rubric/index.js.map +1 -0
  75. package/dist/commands/rubric/list.d.ts +6 -0
  76. package/dist/commands/rubric/list.d.ts.map +1 -0
  77. package/dist/commands/rubric/list.js +14 -0
  78. package/dist/commands/rubric/list.js.map +1 -0
  79. package/dist/commands/rubric/show.d.ts +9 -0
  80. package/dist/commands/rubric/show.d.ts.map +1 -0
  81. package/dist/commands/rubric/show.js +16 -0
  82. package/dist/commands/rubric/show.js.map +1 -0
  83. package/dist/commands/rubric/validate.d.ts +9 -0
  84. package/dist/commands/rubric/validate.d.ts.map +1 -0
  85. package/dist/commands/rubric/validate.js +16 -0
  86. package/dist/commands/rubric/validate.js.map +1 -0
  87. package/dist/commands/test/index.d.ts.map +1 -1
  88. package/dist/commands/test/index.js +2 -0
  89. package/dist/commands/test/index.js.map +1 -1
  90. package/dist/commands/test/promote-criteria.d.ts +10 -0
  91. package/dist/commands/test/promote-criteria.d.ts.map +1 -0
  92. package/dist/commands/test/promote-criteria.js +25 -0
  93. package/dist/commands/test/promote-criteria.js.map +1 -0
  94. package/dist/commands/test/report.d.ts +9 -0
  95. package/dist/commands/test/report.d.ts.map +1 -0
  96. package/dist/commands/test/report.js +18 -0
  97. package/dist/commands/test/report.js.map +1 -0
  98. package/dist/commands/test/run.d.ts +1 -0
  99. package/dist/commands/test/run.d.ts.map +1 -1
  100. package/dist/commands/test/run.js +4 -0
  101. package/dist/commands/test/run.js.map +1 -1
  102. package/dist/commands/test/suite.d.ts +1 -0
  103. package/dist/commands/test/suite.d.ts.map +1 -1
  104. package/dist/commands/test/suite.js +4 -0
  105. package/dist/commands/test/suite.js.map +1 -1
  106. package/dist/hooks/postrun.d.ts +1 -1
  107. package/dist/init-templates/citizen-builder/.env.example +6 -0
  108. package/dist/init-templates/citizen-builder/docker/Dockerfile +10 -2
  109. package/dist/init-templates/citizen-builder/docker-compose.yml +6 -0
  110. package/dist/init-templates/citizen-builder/scripts/docker-entrypoint.sh +56 -20
  111. package/dist/lib/domain-profiles.d.ts.map +1 -1
  112. package/dist/lib/domain-profiles.js +4 -0
  113. package/dist/lib/domain-profiles.js.map +1 -1
  114. package/dist/lib/work-queue/queue-format.d.ts +17 -0
  115. package/dist/lib/work-queue/queue-format.d.ts.map +1 -0
  116. package/dist/lib/work-queue/queue-format.js +125 -0
  117. package/dist/lib/work-queue/queue-format.js.map +1 -0
  118. package/dist/lib/work-queue/queue-session.d.ts +9 -0
  119. package/dist/lib/work-queue/queue-session.d.ts.map +1 -0
  120. package/dist/lib/work-queue/queue-session.js +8 -0
  121. package/dist/lib/work-queue/queue-session.js.map +1 -0
  122. package/dist/lib/work-queue/queue-worker.d.ts +24 -0
  123. package/dist/lib/work-queue/queue-worker.d.ts.map +1 -0
  124. package/dist/lib/work-queue/queue-worker.js +50 -0
  125. package/dist/lib/work-queue/queue-worker.js.map +1 -0
  126. package/dist/light-commands.d.ts.map +1 -1
  127. package/dist/light-commands.js +3 -0
  128. package/dist/light-commands.js.map +1 -1
  129. package/dist/utils/open-app-context.d.ts +6 -0
  130. package/dist/utils/open-app-context.d.ts.map +1 -1
  131. package/dist/utils/open-app-context.js +3 -3
  132. package/dist/utils/open-app-context.js.map +1 -1
  133. package/oclif.manifest.json +3522 -2581
  134. package/package.json +24 -22
@@ -0,0 +1,77 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { MJWorkLogger, SharedProviderSource, WorkQueueEngine, WorkQueueHost } from '@memberjunction/work-queue-engine';
3
+ import { OpenWorkQueueSession } from '../../lib/work-queue/queue-session.js';
4
+ import { RunUntilStopped, WorkerStartFailure } from '../../lib/work-queue/queue-worker.js';
5
+ // Registers the 'AWS' transport driver factory and manifest enricher for this command only (work-queue 03 §0).
6
+ import '@memberjunction/work-queue-engine/aws';
7
+ const DEFAULT_IDLE_EXIT_MS = 5000;
8
+ const DEFAULT_SHUTDOWN_DRAIN_MS = 30000;
9
+ export default class QueueWork extends Command {
10
+ static { this.description = 'Run work-queue subscriptions in this process: once for a container job, or until stopped'; }
11
+ static { this.examples = [
12
+ '<%= config.bin %> <%= command.id %> --subscription venue-import --once',
13
+ '<%= config.bin %> <%= command.id %> --subscription venue-import --once --max 5 --concurrency 2 --max-duration-ms 3300000',
14
+ '<%= config.bin %> <%= command.id %> --subscription "*"',
15
+ ]; }
16
+ static { this.flags = {
17
+ subscription: Flags.string({ char: 's', description: "Subscription name, or '*' for every MJWorker subscription", required: true }),
18
+ once: Flags.boolean({ description: 'Receive up to --max deliveries, drain and exit (container-job mode)', default: false }),
19
+ max: Flags.integer({ description: 'With --once: how many deliveries to receive', default: 1, min: 1, dependsOn: ['once'] }),
20
+ 'idle-exit-ms': Flags.integer({ description: 'With --once: exit after this long with an empty queue', default: DEFAULT_IDLE_EXIT_MS, min: 0, dependsOn: ['once'] }),
21
+ 'max-duration-ms': Flags.integer({ description: "With --once: stop claiming after this long and drain (keep it below the scheduler's job deadline)", min: 1000, dependsOn: ['once'] }),
22
+ concurrency: Flags.integer({ description: 'Handlers in flight per subscription', default: 1, min: 1 }),
23
+ 'shutdown-drain-ms': Flags.integer({ description: 'How long in-flight handlers get to finish on exit; the drain can take twice this', default: DEFAULT_SHUTDOWN_DRAIN_MS, min: 0 }),
24
+ }; }
25
+ async run() {
26
+ const { flags } = await this.parse(QueueWork);
27
+ const session = await OpenWorkQueueSession();
28
+ let failure = null;
29
+ try {
30
+ await WorkQueueEngine.Instance.Config(false, session.User, session.Provider);
31
+ const host = new WorkQueueHost({
32
+ InstanceID: `mj-queue-work-${process.pid}`,
33
+ Subscriptions: [{ Name: flags.subscription, Concurrency: flags.concurrency }],
34
+ IdlePollMinMs: 250, IdlePollMaxMs: 2000, ShutdownDrainMs: flags['shutdown-drain-ms'],
35
+ SweeperIntervalMs: 0, ReconcileIntervalMs: 0, // a short-lived job neither sweeps nor re-plans
36
+ }, WorkQueueEngine.Instance, session.User, session.Provider, new MJWorkLogger('[mj queue work]'), { ProviderSource: new SharedProviderSource(session.Provider) });
37
+ failure = flags.once ? await this.runOnce(host, flags) : await this.runUntilSignal(host, flags.subscription);
38
+ }
39
+ catch (error) {
40
+ failure = error instanceof Error ? error.message : String(error);
41
+ }
42
+ finally {
43
+ await session.Close(); // only after the drain: RunUntilStopped awaits host.Shutdown() first
44
+ }
45
+ if (failure) {
46
+ this.error(failure, { exit: 1 });
47
+ }
48
+ }
49
+ /** One-shot mode. Exit 0 for an empty queue, a spent budget, MaxDuration or a signal; non-zero when nothing could run. */
50
+ async runOnce(host, flags) {
51
+ let result = { Processed: 0, Reason: 'Shutdown' };
52
+ const work = host
53
+ .RunOnce({ MaxDeliveries: flags.max, IdleExitMs: flags['idle-exit-ms'], MaxDurationMs: flags['max-duration-ms'] })
54
+ .then(r => { result = r; });
55
+ await RunUntilStopped(host, work);
56
+ // RunOnce returns at once when nothing could run (Task 3b); the health says why. The host is shut down by now,
57
+ // so a subscription that did run reports HOST_SHUT_DOWN_REASON.
58
+ const startFailure = WorkerStartFailure(host.GetHealth(), flags.subscription);
59
+ if (startFailure) {
60
+ return startFailure;
61
+ }
62
+ this.log(`Processed ${result.Processed} deliver${result.Processed === 1 ? 'y' : 'ies'} (${result.Reason}).`);
63
+ return null;
64
+ }
65
+ async runUntilSignal(host, requested) {
66
+ await host.Start();
67
+ const startFailure = WorkerStartFailure(host.GetHealth(), requested);
68
+ if (startFailure) {
69
+ await host.Shutdown();
70
+ return startFailure;
71
+ }
72
+ this.log(`Running ${requested}; send SIGINT or SIGTERM to stop.`);
73
+ await RunUntilStopped(host, new Promise(() => undefined));
74
+ return null;
75
+ }
76
+ }
77
+ //# sourceMappingURL=work.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work.js","sourceRoot":"","sources":["../../../src/commands/queue/work.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricDiff extends Command {
3
+ static description: string;
4
+ static args: {
5
+ rubric: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
6
+ from: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ to: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAyD;IAC3E,MAAM,CAAC,IAAI;;;;MAIT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
@@ -0,0 +1,20 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ export default class RubricDiff extends Command {
3
+ static { this.description = 'Print the version bump between two rubric versions.'; }
4
+ static { this.args = {
5
+ rubric: Args.string({ description: 'Rubric name or id', required: true }),
6
+ from: Args.string({ description: 'Version 1.2.0 or id', required: true }),
7
+ to: Args.string({ description: 'Version 1.2.0 or id', required: true }),
8
+ }; }
9
+ async run() {
10
+ const { CloseMJProvider, RubricCommands } = await import('@memberjunction/testing-cli');
11
+ const { args } = await this.parse(RubricDiff);
12
+ try {
13
+ await new RubricCommands().Diff(args.rubric, args.from, args.to);
14
+ }
15
+ finally {
16
+ await CloseMJProvider();
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/rubric/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;aACtC,gBAAW,GAAG,qDAAqD,CAAC;aACpE,SAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACxE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACxF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricEvaluate extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ rubric: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
6
+ entity: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ record: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ evaluator: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ prompt: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ model: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ mode: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,MAAM,CAAC,WAAW,SAA6D;IAC/E,MAAM,CAAC,KAAK;;;;;;;;MAQV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAa3B"}
@@ -0,0 +1,28 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ export default class RubricEvaluate extends Command {
3
+ static { this.description = 'Evaluate one record against a rubric. Does not publish.'; }
4
+ static { this.flags = {
5
+ rubric: Flags.string({ required: true, description: 'Rubric name or id, optionally @version' }),
6
+ entity: Flags.string({ required: true, description: 'Subject entity name' }),
7
+ record: Flags.string({ required: true, description: 'Subject record id' }),
8
+ evaluator: Flags.string({ description: 'A registered evaluator: LLM, Decision, Agent, Deterministic, or a custom one', default: 'LLM' }),
9
+ prompt: Flags.string({ description: 'LLM: the judge prompt composed into Rubric Evaluator (default Rubric Evaluator - Default Judge). Decision: the decision prompt (default Default Decision)' }),
10
+ model: Flags.string({ description: 'AI Model ID to pin. Otherwise the prompt\'s bindings choose' }),
11
+ mode: Flags.string({ description: 'LLM only: SinglePass or PerCriterion', options: ['SinglePass', 'PerCriterion'] }),
12
+ }; }
13
+ async run() {
14
+ const { CloseMJProvider, RubricCommands } = await import('@memberjunction/testing-cli');
15
+ const { flags } = await this.parse(RubricEvaluate);
16
+ try {
17
+ await new RubricCommands().Evaluate(flags.rubric, flags.entity, flags.record, flags.evaluator, {
18
+ ...(flags.prompt ? { PromptName: flags.prompt } : {}),
19
+ ...(flags.model ? { ModelID: flags.model } : {}),
20
+ ...(flags.mode === 'SinglePass' || flags.mode === 'PerCriterion' ? { Mode: flags.mode } : {}),
21
+ });
22
+ }
23
+ finally {
24
+ await CloseMJProvider();
25
+ }
26
+ }
27
+ }
28
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../src/commands/rubric/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;aAC1C,gBAAW,GAAG,yDAAyD,CAAC;aACxE,UAAK,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;QAC/F,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;QAC5E,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;QAC1E,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8EAA8E,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACxI,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2JAA2J,EAAE,CAAC;QAClM,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC;QACnG,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;KACrH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACxF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE;gBAC7F,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9F,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricIndex extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAC,WAAW,SAAuD;IAEnE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ3B"}
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricIndex extends Command {
3
+ static { this.description = 'List, show, diff, validate, and evaluate rubrics.'; }
4
+ async run() {
5
+ this.log('Rubric commands:');
6
+ this.log(' mj rubric list');
7
+ this.log(' mj rubric show <rubric>[@version]');
8
+ this.log(' mj rubric diff <rubric> <version> <version>');
9
+ this.log(' mj rubric validate <file>');
10
+ this.log(' mj rubric evaluate --rubric <rubric> --entity <name> --record <id>');
11
+ }
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/rubric/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;aACvC,gBAAW,GAAG,mDAAmD,CAAC;IAEzE,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACnF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricList extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAAmB;IAE/B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ3B"}
@@ -0,0 +1,14 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricList extends Command {
3
+ static { this.description = 'List rubrics.'; }
4
+ async run() {
5
+ const { CloseMJProvider, RubricCommands } = await import('@memberjunction/testing-cli');
6
+ try {
7
+ await new RubricCommands().List();
8
+ }
9
+ finally {
10
+ await CloseMJProvider();
11
+ }
12
+ }
13
+ }
14
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/rubric/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;aACtC,gBAAW,GAAG,eAAe,CAAC;IAErC,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACxF,IAAI,CAAC;YACH,MAAM,IAAI,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricShow extends Command {
3
+ static description: string;
4
+ static args: {
5
+ rubric: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAA6C;IAC/D,MAAM,CAAC,IAAI;;MAAsG;IAE3G,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
@@ -0,0 +1,16 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ export default class RubricShow extends Command {
3
+ static { this.description = 'Show a rubric version and its criteria.'; }
4
+ static { this.args = { rubric: Args.string({ description: 'Rubric name or id, optionally @version', required: true }) }; }
5
+ async run() {
6
+ const { CloseMJProvider, RubricCommands } = await import('@memberjunction/testing-cli');
7
+ const { args } = await this.parse(RubricShow);
8
+ try {
9
+ await new RubricCommands().Show(args.rubric);
10
+ }
11
+ finally {
12
+ await CloseMJProvider();
13
+ }
14
+ }
15
+ }
16
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/rubric/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;aACtC,gBAAW,GAAG,yCAAyC,CAAC;aACxD,SAAI,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAEjH,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACxF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class RubricValidate extends Command {
3
+ static description: string;
4
+ static args: {
5
+ file: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/commands/rubric/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,MAAM,CAAC,WAAW,SAAkF;IACpG,MAAM,CAAC,IAAI;;MAAgF;IAErF,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
@@ -0,0 +1,16 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ export default class RubricValidate extends Command {
3
+ static { this.description = 'Check a rubric snapshot file for duplicate keys, gates, weights, and scales.'; }
4
+ static { this.args = { file: Args.string({ description: 'JSON snapshot file', required: true }) }; }
5
+ async run() {
6
+ const { CloseMJProvider, RubricCommands } = await import('@memberjunction/testing-cli');
7
+ const { args } = await this.parse(RubricValidate);
8
+ try {
9
+ new RubricCommands().Validate(args.file);
10
+ }
11
+ finally {
12
+ await CloseMJProvider();
13
+ }
14
+ }
15
+ }
16
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/rubric/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;aAC1C,gBAAW,GAAG,8EAA8E,CAAC;aAC7F,SAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAE3F,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACxF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,IAAI,cAAc,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAAiE;IAEnF,MAAM,CAAC,QAAQ,WAOb;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAAiE;IAEnF,MAAM,CAAC,QAAQ,WAOb;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB3B"}
@@ -16,6 +16,8 @@ export default class Test extends Command {
16
16
  this.log(' mj test suite <suite-id> - Execute a test suite');
17
17
  this.log(' mj test list - List available tests');
18
18
  this.log(' mj test validate - Validate test definitions');
19
+ this.log(' mj test promote-criteria <test> - Copy inline criteria into a Draft rubric');
20
+ this.log(' mj test report <run-id> - Print the per-criterion rubric breakdown');
19
21
  this.log(' mj test history - View test execution history');
20
22
  this.log(' mj test compare - Compare test runs for regressions');
21
23
  this.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;aAChC,gBAAW,GAAG,6DAA6D,CAAC;aAE5E,aAAQ,GAAG;QAChB,mDAAmD;QACnD,uEAAuE;QACvE,sDAAsD;QACtD,0CAA0C;QAC1C,mDAAmD;QACnD,oDAAoD;KACrD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC1E,IAAI,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC9E,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;aAChC,gBAAW,GAAG,6DAA6D,CAAC;aAE5E,aAAQ,GAAG;QAChB,mDAAmD;QACnD,uEAAuE;QACvE,sDAAsD;QACtD,0CAA0C;QAC1C,mDAAmD;QACnD,oDAAoD;KACrD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC1E,IAAI,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QACzF,IAAI,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC9E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class TestPromoteCriteria extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ test: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=promote-criteria.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote-criteria.d.ts","sourceRoot":"","sources":["../../../src/commands/test/promote-criteria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,OAAO;IACtD,MAAM,CAAC,WAAW,SAAuG;IAEzH,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
@@ -0,0 +1,25 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ export default class TestPromoteCriteria extends Command {
3
+ static { this.description = 'Copy a test\'s inline judge criteria into a Draft rubric and set Test.RubricID. Does not publish.'; }
4
+ static { this.examples = [
5
+ '<%= config.bin %> <%= command.id %> <test-id>',
6
+ '<%= config.bin %> <%= command.id %> "Reply check"',
7
+ ]; }
8
+ static { this.args = {
9
+ test: Args.string({
10
+ description: 'Test name or ID',
11
+ required: true,
12
+ }),
13
+ }; }
14
+ async run() {
15
+ const { PromoteCriteriaCommand } = await import('@memberjunction/testing-cli');
16
+ const { args } = await this.parse(TestPromoteCriteria);
17
+ try {
18
+ await new PromoteCriteriaCommand().Execute(args.test);
19
+ }
20
+ catch (error) {
21
+ this.error(error);
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=promote-criteria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promote-criteria.js","sourceRoot":"","sources":["../../../src/commands/test/promote-criteria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,OAAO;aAC/C,gBAAW,GAAG,mGAAmG,CAAC;aAElH,aAAQ,GAAG;QAChB,+CAA+C;QAC/C,mDAAmD;KACpD,CAAC;aAEK,SAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,iBAAiB;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC/E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,IAAI,sBAAsB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class TestReport extends Command {
3
+ static description: string;
4
+ static args: {
5
+ runId: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
6
+ };
7
+ run(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/commands/test/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,WAAW,SAA8D;IAEhF,MAAM,CAAC,IAAI;;MAET;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
@@ -0,0 +1,18 @@
1
+ import { Args, Command } from '@oclif/core';
2
+ export default class TestReport extends Command {
3
+ static { this.description = 'Print the per-criterion rubric breakdown for a test run.'; }
4
+ static { this.args = {
5
+ runId: Args.string({ description: 'Test run ID', required: true }),
6
+ }; }
7
+ async run() {
8
+ const { CloseMJProvider, ReportCommand } = await import('@memberjunction/testing-cli');
9
+ const { args } = await this.parse(TestReport);
10
+ try {
11
+ await new ReportCommand().execute(args.runId, {}, undefined);
12
+ }
13
+ finally {
14
+ await CloseMJProvider();
15
+ }
16
+ }
17
+ }
18
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/test/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;aACtC,gBAAW,GAAG,0DAA0D,CAAC;aAEzE,SAAI,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACvF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,SAAkB,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC"}
@@ -13,6 +13,7 @@ export default class TestRun extends Command {
13
13
  'dry-run': import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
14
14
  verbose: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
15
15
  'checks-module': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ rubric: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
17
  'oracles-module': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
17
18
  };
18
19
  run(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAyC;IAE3D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;MAmCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA6B3B"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,WAAW,SAAyC;IAE3D,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;MAsCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B3B"}
@@ -43,6 +43,9 @@ export default class TestRun extends Command {
43
43
  'integration check bundles register on the IntegrationCheckRegistry. Durable form: ' +
44
44
  "mj.config.cjs `testing.checkModules` (this repo loads '@memberjunction/integration-test-suite' that way).",
45
45
  }),
46
+ rubric: Flags.string({
47
+ description: 'Rubric override: name or id, optionally @version (1.2.0 or a version id)',
48
+ }),
46
49
  'oracles-module': Flags.string({
47
50
  description: 'Path to a JS/TS module that exports custom IOracle classes or instances. ' +
48
51
  'Each export is registered on the engine before the test runs — used by non-MJ ' +
@@ -68,6 +71,7 @@ export default class TestRun extends Command {
68
71
  output: flags.output,
69
72
  dryRun: flags['dry-run'],
70
73
  verbose: flags.verbose,
74
+ rubric: flags.rubric,
71
75
  oraclesModule: flags['oracles-module'],
72
76
  checksModule: flags['checks-module'],
73
77
  });
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEpG,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;aACnC,gBAAW,GAAG,qCAAqC,CAAC;aAEpD,aAAQ,GAAG;QAChB,+CAA+C;QAC/C,mEAAmE;QACnE,qEAAqE;QACrE,mFAAmF;QACnF,yDAAyD;KAC1D,CAAC;aAEK,SAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,oBAAoB;YACjC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;aAEK,UAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sBAAsB;SACpC,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0CAA0C;SACxD,CAAC;QACF,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kBAAkB;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE,KAAK;SACf,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;YAC5B,WAAW,EACT,qFAAqF;gBACrF,oFAAoF;gBACpF,2GAA2G;SAC9G,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC7B,WAAW,EACT,2EAA2E;gBAC3E,gFAAgF;gBAChF,gFAAgF;SACnF,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAEnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,yCAAyC;YACzC,2EAA2E;YAC3E,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,mBAAmB,CAAC;oBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,SAAkB;oBAC1B,aAAa,EAAE,SAAkB;oBACjC,GAAG,EAAE,eAAe;iBACrB,CAAC;gBACF,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;gBACtC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC;aACrC,CAAC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/test/run.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export default class TestSuite extends Command {
13
13
  delay: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
14
  parallel: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
15
15
  'max-parallel': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ rubric: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
17
  'flaky-check': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
17
18
  'checks-module': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
18
19
  'oracles-module': import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA0B;IAE5C,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;MA4CV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA+B3B"}
1
+ {"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAC5C,MAAM,CAAC,WAAW,SAA0B;IAE5C,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;MA+CV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgC3B"}
@@ -43,6 +43,9 @@ export default class TestSuite extends Command {
43
43
  description: 'Maximum number of parallel workers (default 4)',
44
44
  default: 4,
45
45
  }),
46
+ rubric: Flags.string({
47
+ description: 'Rubric override for every test: name or id, optionally @version',
48
+ }),
46
49
  'flaky-check': Flags.integer({
47
50
  description: 'Run each test N times to detect flakiness (variance > 0.3 or mixed pass/fail = flaky). Recommended: 3 or 5',
48
51
  }),
@@ -78,6 +81,7 @@ export default class TestSuite extends Command {
78
81
  parallel: flags.parallel,
79
82
  maxParallel: flags['max-parallel'],
80
83
  flakyCheck: flags['flaky-check'],
84
+ rubric: flags.rubric,
81
85
  oraclesModule: flags['oracles-module'],
82
86
  checksModule: flags['checks-module'],
83
87
  });
@@ -1 +1 @@
1
- {"version":3,"file":"suite.js","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suite.js","sourceRoot":"","sources":["../../../src/commands/test/suite.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Cleanup hook that runs after any command completes.
3
3
  *
4
4
  * Only `mj app *` commands open an mssql connection pool (through
5
- * `ensureProviderInitialized` in utils/open-app-context.ts). The pool keeps
5
+ * `EnsureProviderInitialized` in utils/open-app-context.ts). The pool keeps
6
6
  * sockets alive, which pins the Node event loop open and makes the CLI appear
7
7
  * to hang after the command finishes printing its output — so for those
8
8
  * commands we close it here.
@@ -2,6 +2,12 @@
2
2
  # MemberJunction Citizen Agent Builder Environment Configuration
3
3
  # ==============================================================================
4
4
 
5
+ # MemberJunction Version
6
+ # The release this workspace runs: both the CLI inside the container and the MemberJunction
7
+ # install it creates. `mj agent init` sets it to its own version so the container matches the CLI
8
+ # that scaffolded the workspace. To move to another release, change it and run: docker compose build
9
+ MJ_VERSION=
10
+
5
11
  # Database Configuration
6
12
  DB_PASSWORD=TestPassword123!
7
13
  DB_PORT=1433
@@ -8,8 +8,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
8
8
  procps \
9
9
  && rm -rf /var/lib/apt/lists/*
10
10
 
11
- # Install MemberJunction CLI and process manager globally
12
- RUN npm install -g @memberjunction/cli pm2 pnpm
11
+ # The MemberJunction release this workspace was scaffolded for. `mj agent init` writes it to
12
+ # .env from its own version and docker-compose.yml passes it in, so the CLI inside the container
13
+ # is the same release as the one that created the workspace. Never install unpinned: that
14
+ # resolves npm's `latest` tag, which can be a different major line from the scaffolding CLI.
15
+ ARG MJ_VERSION
16
+ RUN if [ -z "$MJ_VERSION" ]; then \
17
+ echo "ERROR: the MJ_VERSION build arg is required. Set MJ_VERSION in .env ('mj agent init' writes it)." >&2; \
18
+ exit 1; \
19
+ fi \
20
+ && npm install -g "@memberjunction/cli@${MJ_VERSION}" pm2 pnpm
13
21
 
14
22
  WORKDIR /workspace
15
23
 
@@ -23,6 +23,10 @@ services:
23
23
  build:
24
24
  context: .
25
25
  dockerfile: docker/Dockerfile
26
+ args:
27
+ # Required: the CLI and MemberJunction release inside the container must match the CLI
28
+ # that scaffolded this workspace. `mj agent init` writes it to .env.
29
+ MJ_VERSION: "${MJ_VERSION:?MJ_VERSION is not set in .env - re-run mj agent init, or set it to the MemberJunction version to install}"
26
30
  platform: linux/amd64
27
31
  restart: unless-stopped
28
32
  depends_on:
@@ -37,6 +41,8 @@ services:
37
41
  DB_USERNAME: "sa"
38
42
  DB_PASSWORD: "${DB_PASSWORD:-TestPassword123!}"
39
43
  DB_DATABASE: "${DB_DATABASE:-MemberJunction}"
44
+ # Tells the entrypoint which MemberJunction release `mj install` must fetch
45
+ MJ_VERSION: "${MJ_VERSION}"
40
46
  MJ_BASE_ENCRYPTION_KEY: "${MJ_BASE_ENCRYPTION_KEY:-0123456789abcdef0123456789abcdef}"
41
47
  # LLM Provider API Keys
42
48
  AI_VENDOR_API_KEY__OpenAILLM: "${OPENAI_API_KEY:-}"