@sensigo/realm-cli 0.37.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,303 @@
1
+ // run-migrate.ts — `realm run migrate --stamp-seals` (issue #367, part 3).
2
+ //
3
+ // The vehicle the shipped `gc --heal` note promises operators. It walks every terminal run and
4
+ // gives each one the seal arm it has always meant, WITHOUT touching the retention clock — which is
5
+ // the whole reason it exists rather than letting `--heal` rewrite the same population and reset
6
+ // `updated_at` on all of it.
7
+ //
8
+ // The sweep is TWO-ARMED, and that is load-bearing. An unstamped-only filter would leave the
9
+ // `incoherent` bucket with no population at all: the records it exists to surface are precisely
10
+ // the STAMPED ones whose arm disagrees with their own prose or markers, and the store boundary
11
+ // deliberately abstains on the abandon-marker case, so nothing else in the system can see them.
12
+ //
13
+ // It writes only through `RunStore.stampSeal`. It never rewrites a record it cannot classify, and
14
+ // never auto-corrects one it finds incoherent — an operator adjudicates those.
15
+ import { Command } from 'commander';
16
+ import { classifyLegacySeal, armToPhase } from '@sensigo/realm';
17
+ function emptyBuckets() {
18
+ return {
19
+ stamped: [],
20
+ already_stamped: [],
21
+ unclassifiable: [],
22
+ incoherent: [],
23
+ skipped_conflict: [],
24
+ failed: [],
25
+ };
26
+ }
27
+ /**
28
+ * Why a record could not be classified — phrased for an operator, and deliberately phrased to
29
+ * avoid the terminal-writer census's own token: a printed diagnostic must never look like source
30
+ * code that writes a seal.
31
+ */
32
+ function whyUnclassifiable(run) {
33
+ if (run.terminal_reason === undefined) {
34
+ return 'no terminal reason recorded and no marker to read';
35
+ }
36
+ return `terminal reason "${run.terminal_reason.slice(0, 80)}" matches no known seal shape`;
37
+ }
38
+ /**
39
+ * The exit taxonomy, aligned with the house rule every other sweep command follows (`gc`'s own,
40
+ * gc.ts): **exit 1 means THIS COMMAND failed to do its job.** A write that errored is that. A
41
+ * record nobody can classify is not — the command did exactly what it should, and said so loudly.
42
+ *
43
+ * That distinction matters more here than usual, because residue is CHRONIC: an unclassifiable
44
+ * record stays unclassifiable, so a nonzero exit on residue would make every scheduled run of this
45
+ * command fail forever, and the first thing an operator does with a chronic alarm is silence it.
46
+ *
47
+ * Automation that genuinely wants to gate on residue opts in with `--detailed-exitcode`, which
48
+ * turns the two outcomes into a three-way: 0 clean · 1 the command failed · 2 succeeded, residue
49
+ * remains. Same shape as `grep`, `git diff --exit-code` and Terraform's `-detailed-exitcode` — a
50
+ * machine-readable answer that needs no prose parsing, and that naive pipelines never inherit.
51
+ */
52
+ export function migrateExitCode(buckets, options = {}) {
53
+ if (buckets.failed.length > 0)
54
+ return 1;
55
+ if (options.detailed === true &&
56
+ (buckets.unclassifiable.length > 0 || buckets.incoherent.length > 0)) {
57
+ return 2;
58
+ }
59
+ return 0;
60
+ }
61
+ /**
62
+ * The sweep. Pure over its injected store, so the acceptance suite drives it directly.
63
+ *
64
+ * `not_terminal` refusals from `stampSeal` are STATED-UNREACHABLE here rather than bucketed: this
65
+ * loop only offers terminal records, and any terminal→live flip bumps `version`, so the CAS
66
+ * refuses first and the record lands in `skipped_conflict`.
67
+ */
68
+ export async function migrateStampSeals(runStore, options = {}) {
69
+ if (runStore.stampSeal === undefined) {
70
+ throw new Error('This store does not implement stampSeal, so `realm run migrate --stamp-seals` cannot ' +
71
+ 'write to it. Records stay readable and correct without migrating — the read path ' +
72
+ 'recovers a legacy arm wherever one is recoverable, and the rest still derive correctly from ' +
73
+ 'the legacy ladder. To materialise the arms, use the tooling that owns ' +
74
+ 'this store.');
75
+ }
76
+ const buckets = emptyBuckets();
77
+ const all = await runStore.list();
78
+ for (const run of all) {
79
+ if (!run.terminal_state)
80
+ continue;
81
+ // ARM 2 — already stamped: audit the arm against the record's own evidence.
82
+ if (run.sealed_by !== undefined) {
83
+ // A ruled record is done. An operator looked at it and said what it is, which outranks
84
+ // anything the classifier can infer from prose — and re-examining it every sweep is exactly
85
+ // the loop the ruling was made to end.
86
+ if (run.sealed_by.adjudicated !== undefined) {
87
+ buckets.already_stamped.push({ id: run.id, verified: true, ruled: true });
88
+ continue;
89
+ }
90
+ // The FULL markers-first classifier, deliberately: the store boundary's comparator abstains
91
+ // on abandon-marker records, and those are exactly the stale arms nothing else observes.
92
+ const classified = classifyLegacySeal(run);
93
+ // PHASE level, not arm level. The classifier can only ever recover `complete` from a
94
+ // completed run's prose, so comparing arms would report every `gate_resolution_complete` and
95
+ // `guard_pass_complete` stamp as a disagreement.
96
+ if (classified === undefined) {
97
+ // Abstained: nothing to compare against. The arm stands, unverified.
98
+ buckets.already_stamped.push({ id: run.id, verified: false });
99
+ }
100
+ else if (armToPhase(classified) === armToPhase(run.sealed_by.arm)) {
101
+ buckets.already_stamped.push({ id: run.id, verified: true });
102
+ }
103
+ else {
104
+ buckets.incoherent.push({
105
+ id: run.id,
106
+ arm: run.sealed_by.arm,
107
+ classified,
108
+ arm_phase: armToPhase(run.sealed_by.arm),
109
+ classified_phase: armToPhase(classified),
110
+ });
111
+ }
112
+ continue;
113
+ }
114
+ // ARM 1 — unstamped: classify, then stamp.
115
+ const arm = classifyLegacySeal(run);
116
+ if (arm === undefined) {
117
+ buckets.unclassifiable.push({ id: run.id, why: whyUnclassifiable(run) });
118
+ continue;
119
+ }
120
+ const phaseBefore = run.run_phase;
121
+ const phaseAfter = armToPhase(arm);
122
+ if (options.force !== true) {
123
+ buckets.stamped.push({ id: run.id, arm, phase_before: phaseBefore, phase_after: phaseAfter });
124
+ continue;
125
+ }
126
+ try {
127
+ // `classified: true` marks this stamp as CLASSIFIER-minted, forever distinguishable from a
128
+ // writer's own assertion. `step` is never fabricated.
129
+ const result = await runStore.stampSeal(run.id, { arm, classified: true }, run.version);
130
+ if (result.stamped) {
131
+ buckets.stamped.push({
132
+ id: run.id,
133
+ arm,
134
+ phase_before: phaseBefore,
135
+ phase_after: result.run.run_phase,
136
+ });
137
+ }
138
+ else {
139
+ // The record gained an arm between the sweep's read and this write; nothing to verify.
140
+ buckets.already_stamped.push({ id: run.id, verified: false });
141
+ }
142
+ }
143
+ catch (err) {
144
+ const code = err.code;
145
+ if (code === 'STATE_SNAPSHOT_MISMATCH') {
146
+ buckets.skipped_conflict.push(run.id);
147
+ }
148
+ else {
149
+ buckets.failed.push({
150
+ id: run.id,
151
+ error: err instanceof Error ? err.message : String(err),
152
+ });
153
+ }
154
+ }
155
+ }
156
+ return buckets;
157
+ }
158
+ /**
159
+ * `armToPhase` is total over `SEAL_ARMS`, and returns JS `undefined` for anything else — so an arm
160
+ * written by a NEWER binary interpolated straight into a report line as "phase undefined", which
161
+ * reads like a bug in this command rather than a record it cannot interpret.
162
+ */
163
+ function phaseLabel(phase) {
164
+ return phase === undefined
165
+ ? 'phase unknown to this binary (written by a newer version?)'
166
+ : `phase ${phase}`;
167
+ }
168
+ /** The ordering instruction, live since the vehicle exists. */
169
+ export const ORDERING_LINE = 'Run `realm run migrate --stamp-seals` BEFORE `realm run gc --heal` after upgrading across ' +
170
+ '#367 if retention clocks matter: heal rewrites the same records and resets updated_at, which ' +
171
+ 'this command deliberately preserves.';
172
+ /** Renders the report. Returned as lines so the output cells can read it without capturing stdout. */
173
+ export function renderMigrateReport(buckets, options = {}) {
174
+ const force = options.force === true;
175
+ const lines = [];
176
+ const nothing = buckets.stamped.length === 0 &&
177
+ buckets.already_stamped.length === 0 &&
178
+ buckets.unclassifiable.length === 0 &&
179
+ buckets.incoherent.length === 0 &&
180
+ buckets.skipped_conflict.length === 0 &&
181
+ buckets.failed.length === 0;
182
+ // "every terminal run already carries its seal arm" is a UNIVERSAL claim, and four different
183
+ // buckets can each falsify it: a record nobody could classify, one whose write failed, one whose
184
+ // arm contradicts itself, and one a concurrent writer moved. It may only be appended when all
185
+ // four are empty. It shipped appended unconditionally, printed directly above the very records
186
+ // that disprove it.
187
+ const everyRunArmed = buckets.unclassifiable.length === 0 &&
188
+ buckets.incoherent.length === 0 &&
189
+ buckets.failed.length === 0 &&
190
+ buckets.skipped_conflict.length === 0;
191
+ if (nothing) {
192
+ lines.push('No terminal runs found to migrate.');
193
+ }
194
+ else if (buckets.stamped.length > 0) {
195
+ lines.push(force
196
+ ? `Stamped ${buckets.stamped.length} run(s) with their seal arm.`
197
+ : `${buckets.stamped.length} run(s) WOULD be stamped:`);
198
+ for (const e of buckets.stamped) {
199
+ const phase = e.phase_before === e.phase_after ? e.phase_after : `${e.phase_before} → ${e.phase_after}`;
200
+ lines.push(` • ${e.id}: ${e.arm} (phase ${phase})`);
201
+ }
202
+ }
203
+ else if (force) {
204
+ lines.push(everyRunArmed
205
+ ? 'Nothing to stamp — every terminal run already carries its seal arm.'
206
+ : 'Nothing was stamped.');
207
+ }
208
+ else {
209
+ lines.push(everyRunArmed
210
+ ? 'Nothing would be stamped — every terminal run already carries its seal arm.'
211
+ : 'Nothing would be stamped.');
212
+ }
213
+ if (buckets.already_stamped.length > 0) {
214
+ // "Coherent" is a finding, and the audit cannot make it when the classifier abstains — a
215
+ // record whose own evidence places it nowhere has an arm that stands UNVERIFIED, not one that
216
+ // has been checked and agreed with.
217
+ // Three disjoint groups, and the arithmetic is pinned by a cell: X + R + U = N.
218
+ const ruled = buckets.already_stamped.filter((e) => e.ruled === true).length;
219
+ const checked = buckets.already_stamped.filter((e) => e.verified && e.ruled !== true).length;
220
+ const unverified = buckets.already_stamped.filter((e) => !e.verified).length;
221
+ if (ruled === 0 && unverified === 0) {
222
+ lines.push(`${buckets.already_stamped.length} run(s) already stamped, and their arms agree with the record.`);
223
+ }
224
+ else {
225
+ // "Their arms agree with the record" would be FALSE for a ruled record whose prose still
226
+ // disagrees — the ruling stands over that disagreement rather than resolving it. So any
227
+ // ruled record forces the split form, and the ruled segment always shows when there is one.
228
+ const segments = [];
229
+ if (checked > 0)
230
+ segments.push(`${checked} checked against the record`);
231
+ if (ruled > 0)
232
+ segments.push(`${ruled} ruled by an operator — the ruling stands`);
233
+ if (unverified > 0) {
234
+ segments.push(`${unverified} unverifiable — nothing in the record to check the arm against`);
235
+ }
236
+ lines.push(`${buckets.already_stamped.length} run(s) already stamped (${segments.join(', ')}).`);
237
+ }
238
+ }
239
+ if (buckets.unclassifiable.length > 0) {
240
+ lines.push(`${buckets.unclassifiable.length} run(s) could NOT be classified and were left untouched:`);
241
+ for (const e of buckets.unclassifiable)
242
+ lines.push(` • ${e.id}: ${e.why}`);
243
+ }
244
+ if (buckets.incoherent.length > 0) {
245
+ lines.push(`${buckets.incoherent.length} run(s) carry an arm that disagrees with their own record — ` +
246
+ `adjudicate these yourself; nothing was rewritten:`);
247
+ for (const e of buckets.incoherent) {
248
+ lines.push(` • ${e.id}: recorded arm '${e.arm}' (${phaseLabel(e.arm_phase)}), but the record's own ` +
249
+ `markers/prose read as '${e.classified}' (${phaseLabel(e.classified_phase)})`);
250
+ }
251
+ }
252
+ if (buckets.skipped_conflict.length > 0) {
253
+ lines.push(`${buckets.skipped_conflict.length} run(s) skipped — a concurrent writer moved them; ` +
254
+ `their own next write path owns them.`);
255
+ for (const id of buckets.skipped_conflict)
256
+ lines.push(` • ${id} (skipped — concurrent write)`);
257
+ }
258
+ if (buckets.failed.length > 0) {
259
+ lines.push(`${buckets.failed.length} run(s) FAILED to stamp and still have no seal arm:`);
260
+ for (const f of buckets.failed)
261
+ lines.push(` ✗ ${f.id}: ${f.error}`);
262
+ }
263
+ // Only offer the next step when there IS one: on a corpus of nothing but unclassifiable records,
264
+ // `--force` stamps exactly nothing, and inviting the operator to run it is a wasted round trip.
265
+ if (!force && buckets.stamped.length > 0)
266
+ lines.push('Re-run with --force to actually stamp.');
267
+ // RESIDUE = terminal runs that will still have no recorded arm when this run ends. A failed
268
+ // write leaves the record armless just as surely as an unclassifiable one does — omitting it
269
+ // printed "Residue: 0" directly above a record that had failed to stamp. In a dry run nothing is
270
+ // written, so the would-be-stamped records still count.
271
+ const residue = buckets.unclassifiable.length + buckets.failed.length + (force ? 0 : buckets.stamped.length);
272
+ const skipped = buckets.skipped_conflict.length > 0
273
+ ? ` (+${buckets.skipped_conflict.length} skipped — arm state unknown until their own writer settles)`
274
+ : '';
275
+ lines.push(`Residue: ${residue} terminal run(s) still without a recorded seal arm.${skipped}`);
276
+ lines.push(ORDERING_LINE);
277
+ return lines;
278
+ }
279
+ export const runMigrateCommand = new Command('migrate')
280
+ .description('Materialise recorded seal arms on legacy terminal runs (issue #367)')
281
+ .requiredOption('--stamp-seals', 'Stamp each terminal run with the seal arm it has always meant')
282
+ .option('--force', 'Actually write the stamps (without this, the sweep is a dry run)')
283
+ .option('--detailed-exitcode', 'Three-way exit for automation: 0 clean, 1 the command failed, 2 succeeded but residue ' +
284
+ 'remains (the shape grep, `git diff --exit-code` and Terraform use). Opt-in, so a naive ' +
285
+ 'pipeline never inherits a chronic alarm from records that can never be classified.')
286
+ .action(async (opts) => {
287
+ const { JsonFileStore } = await import('@sensigo/realm');
288
+ const runStore = new JsonFileStore();
289
+ try {
290
+ const buckets = await migrateStampSeals(runStore, { force: opts.force ?? false });
291
+ for (const line of renderMigrateReport(buckets, { force: opts.force ?? false })) {
292
+ console.log(line);
293
+ }
294
+ process.exitCode = migrateExitCode(buckets, { detailed: opts.detailedExitcode ?? false });
295
+ }
296
+ catch (err) {
297
+ // The batch never started, or stopped before writing — say so, rather than emitting a bare
298
+ // errno an operator has to guess the scope of.
299
+ console.error(`migrate ABORTED before writing anything: ${err instanceof Error ? err.message : String(err)}`);
300
+ process.exit(1);
301
+ }
302
+ });
303
+ //# sourceMappingURL=run-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-migrate.js","sourceRoot":"","sources":["../../src/commands/run-migrate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AA+BA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,+BAQ5B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,WAAW,+BAgBvB,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,+BAM5B,CAAC"}
1
+ {"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAkCA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,+BAQ5B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,WAAW,+BAiBvB,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,+BAM5B,CAAC"}
@@ -25,6 +25,9 @@ import { listCommand } from './commands/list.js';
25
25
  import { mcpCommand } from './commands/mcp.js';
26
26
  import { serveCommand } from './commands/serve.js';
27
27
  import { migrateCommand } from './commands/migrate.js';
28
+ // issue #367 (part 3): the run-scoped sibling of `realm workflow migrate` — different group, no
29
+ // collision.
30
+ import { runMigrateCommand } from './commands/run-migrate.js';
28
31
  import { agentCommand } from './commands/agent.js';
29
32
  import { webhookCommand } from './commands/webhook.js';
30
33
  import { listenCommand } from './commands/listen.js';
@@ -55,6 +58,7 @@ export const runCommands = [
55
58
  reconcileCommand,
56
59
  attemptsCommand,
57
60
  drainCommand,
61
+ runMigrateCommand,
58
62
  ];
59
63
  /** Top-level commands not nested under a subgroup. */
60
64
  export const topLevelCommands = [
@@ -1 +1 @@
1
- {"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;CACf,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,YAAY;IACZ,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,YAAY;CACb,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;CACd,CAAC"}
1
+ {"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,gGAAgG;AAChG,aAAa;AACb,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;CACf,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,YAAY;IACZ,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,iBAAiB;CAClB,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;CACd,CAAC"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import 'dotenv/config';
4
4
  import { Command } from 'commander';
5
5
  import { workflowCommands, runCommands, topLevelCommands } from './commands-registry.js';
6
6
  const program = new Command();
7
- program.name('realm').description('Realm workflow engine CLI').version('0.37.0');
7
+ program.name('realm').description('Realm workflow engine CLI').version('0.39.0');
8
8
  // realm workflow — operations on workflow definitions
9
9
  const workflowCmd = new Command('workflow').description('Manage workflow definitions');
10
10
  for (const cmd of workflowCommands)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sensigo/realm-cli",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -63,9 +63,9 @@
63
63
  "vitest": "^4.1.0"
64
64
  },
65
65
  "dependencies": {
66
- "@sensigo/realm": "^0.37.0",
67
- "@sensigo/realm-mcp": "^0.37.0",
68
- "@sensigo/realm-testing": "^0.37.0",
66
+ "@sensigo/realm": "^0.39.0",
67
+ "@sensigo/realm-mcp": "^0.39.0",
68
+ "@sensigo/realm-testing": "^0.39.0",
69
69
  "@modelcontextprotocol/sdk": "1.30.0",
70
70
  "chalk": "^5.0.0",
71
71
  "commander": "^15.0.0",