@basou/cli 0.71.2 → 0.72.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.
package/dist/program.js CHANGED
@@ -840,11 +840,13 @@ import {
840
840
  assertBasouRootSafe as assertBasouRootSafe3,
841
841
  BOARD_INIT_SAVE,
842
842
  basouPaths as basouPaths4,
843
+ boardDeclarationSnapshot,
843
844
  boardGuide,
844
845
  boardInitText,
845
846
  buildRecord,
846
847
  byCodePoint,
847
848
  diffCells,
849
+ diffDeclarations,
848
850
  diffObserved,
849
851
  displayPath as displayPath3,
850
852
  effortStartOf,
@@ -2343,9 +2345,10 @@ async function doRunBoardMeasure(options, ctx) {
2343
2345
  throw new Error("--model must name a model.");
2344
2346
  }
2345
2347
  const loaded = await loadBoard(options, ctx, "board measure");
2346
- const measurement = await measureLoaded(loaded, ctx, options.model, await previousOf(loaded));
2348
+ const previous = await previousOf(loaded);
2349
+ const measurement = await measureLoaded(loaded, ctx, options.model, previous);
2347
2350
  if (options.json === true) console.log(JSON.stringify(measurement, null, 2));
2348
- else printMeasurementText(measurement, hasRecords(loaded));
2351
+ else printMeasurementText(measurement, hasRecords(loaded), declarationChanges(loaded, previous));
2349
2352
  if (!measurement.complete) process.exitCode = 1;
2350
2353
  return measurement;
2351
2354
  }
@@ -2360,16 +2363,17 @@ async function runBoardRecord(options, ctx = {}) {
2360
2363
  var RecordRefusal = class extends Error {
2361
2364
  };
2362
2365
  async function doRunBoardRecord(options, ctx) {
2363
- let result;
2366
+ let checked;
2364
2367
  try {
2365
- result = await checkAndRecord(options, ctx);
2368
+ checked = await checkAndRecord(options, ctx);
2366
2369
  } catch (error) {
2367
2370
  if (error instanceof RecordRefusal || !(error instanceof Error)) throw error;
2368
2371
  throw new RecordRefusal(`${error.message}
2369
2372
  Nothing was written.`, { cause: error.cause });
2370
2373
  }
2374
+ const { result, declared } = checked;
2371
2375
  if (options.json === true) console.log(JSON.stringify(result, null, 2));
2372
- else printRecordText(result);
2376
+ else printRecordText(result, declared ?? null);
2373
2377
  return result;
2374
2378
  }
2375
2379
  async function checkAndRecord(options, ctx) {
@@ -2410,6 +2414,7 @@ ${parsed.errors.map((e) => ` - ${displayPath3(e)}`).join("\n")}`
2410
2414
  recordedAt,
2411
2415
  recordedWith: { basou: BASOU_CLI_VERSION, build: BASOU_BUILD?.commit ?? null }
2412
2416
  });
2417
+ const declared = options.json === true ? void 0 : declarationChanges(loaded, previous);
2413
2418
  let written = null;
2414
2419
  if (options.dryRun !== true) {
2415
2420
  let name;
@@ -2436,14 +2441,22 @@ ${parsed.errors.map((e) => ` - ${displayPath3(e)}`).join("\n")}`
2436
2441
  };
2437
2442
  }
2438
2443
  return {
2439
- record: written,
2440
- dry_run: options.dryRun === true,
2441
- complete: measurement.complete,
2442
- not_found: measurement.not_found,
2443
- order_anomalies: record.order_anomalies,
2444
- diff
2444
+ result: {
2445
+ record: written,
2446
+ dry_run: options.dryRun === true,
2447
+ complete: measurement.complete,
2448
+ not_found: measurement.not_found,
2449
+ order_anomalies: record.order_anomalies,
2450
+ diff
2451
+ },
2452
+ ...declared === void 0 ? {} : { declared }
2445
2453
  };
2446
2454
  }
2455
+ function declarationChanges(loaded, previous) {
2456
+ const { last } = previous;
2457
+ if (last.status !== "found") return null;
2458
+ return diffDeclarations(last.record.declaration, boardDeclarationSnapshot(loaded.declaration));
2459
+ }
2447
2460
  var INPUT_KEYS = /* @__PURE__ */ new Set([
2448
2461
  "measure_digest",
2449
2462
  "observed",
@@ -2593,7 +2606,7 @@ async function checkRecordsPlace(loaded, recordsDir, shown, notPrivate) {
2593
2606
  }
2594
2607
  }
2595
2608
  }
2596
- function printRecordText(result) {
2609
+ function printRecordText(result, declared) {
2597
2610
  const lines = [
2598
2611
  result.record === null ? "Dry run: the record checked out (nothing was written)." : `Recorded ${displayPath3(result.record)}`
2599
2612
  ];
@@ -2614,7 +2627,11 @@ function printRecordText(result) {
2614
2627
  ` observed ${displayPath3(o.name)}: ${observation(o.before)} -> ${observation(o.after)}`
2615
2628
  );
2616
2629
  }
2617
- lines.push(...diffLines(result.diff.measure, cells.length + observed.length > 0));
2630
+ const declaration = declarationLines(declared);
2631
+ lines.push(
2632
+ ...diffLines(result.diff.measure, cells.length + observed.length + declaration.length > 0),
2633
+ ...declaration
2634
+ );
2618
2635
  }
2619
2636
  if (!result.complete) {
2620
2637
  lines.push(`The measurement recorded is not complete (${result.not_found.length}):`);
@@ -2800,6 +2817,16 @@ function diffLines(diff, more) {
2800
2817
  if (lines.length === 0 && !more) lines.push(" nothing moved");
2801
2818
  return lines;
2802
2819
  }
2820
+ function declarationLines(changes) {
2821
+ if (changes === null) {
2822
+ return [
2823
+ " declaration: not compared (the previous record holds no declaration basou can compare with)"
2824
+ ];
2825
+ }
2826
+ return changes.map(
2827
+ (c) => ` declaration ${displayPath3(c.at)}: ${c.change === "reordered" ? "the order changed" : c.change}`
2828
+ );
2829
+ }
2803
2830
  function shownValue(value) {
2804
2831
  if (value === null) return "not measured";
2805
2832
  if (typeof value === "number") return String(Math.round(value * 1e4) / 1e4);
@@ -2931,12 +2958,18 @@ function axisLines(m) {
2931
2958
  for (const u of a.unjudged) lines.push(` (${u.trigger}) not judged: ${u.why}`);
2932
2959
  return lines;
2933
2960
  }
2934
- function printMeasurementText(m, hasRecords2) {
2961
+ function printMeasurementText(m, hasRecords2, declared) {
2935
2962
  const lines = [displayPath3(m.title)];
2936
2963
  const build = m.measured_with.build === null ? "" : ` (build ${m.measured_with.build})`;
2937
2964
  lines.push(`Measured ${m.measured_at} with basou ${m.measured_with.basou}${build}`);
2938
2965
  if (m.diff !== null) {
2939
- lines.push("", `Since the previous record ${m.diff.against}:`, ...diffLines(m.diff, false));
2966
+ const declaration = declarationLines(declared);
2967
+ lines.push(
2968
+ "",
2969
+ `Since the previous record ${m.diff.against}:`,
2970
+ ...diffLines(m.diff, declaration.length > 0),
2971
+ ...declaration
2972
+ );
2940
2973
  } else if (m.not_found.some((n) => n.at === "diff")) {
2941
2974
  lines.push("", "The previous record could not be read (see Not measured).");
2942
2975
  } else {
@@ -13956,6 +13989,11 @@ var BOARD_HTML = `<!doctype html>
13956
13989
  .chip.blocked { background: var(--chip-blocked); }
13957
13990
  .chip.unverified { background: var(--chip-unverified); }
13958
13991
  .muted { color: var(--fg-2); }
13992
+ .sub { font-size: 12px; color: var(--fg-2); overflow-wrap: anywhere; }
13993
+ ul.sub { margin: 0; padding-left: 18px; }
13994
+ td.wrap { overflow-wrap: anywhere; min-width: 10em; }
13995
+ tr.notes td { padding-top: 0; }
13996
+ .chip.changed { margin-left: 0; margin-right: 6px; background: var(--chip-unverified); }
13959
13997
  .bar { height: 10px; background: var(--fill); border-radius: 5px; min-width: 120px; position: relative; overflow: hidden; }
13960
13998
  .bar span { position: absolute; left: 0; top: 0; bottom: 0; background: var(--s1); }
13961
13999
  figure { margin: 16px 0; }
@@ -14085,6 +14123,60 @@ var BOARD_HTML = `<!doctype html>
14085
14123
  return JSON.stringify(k) + ':' + v;
14086
14124
  }).join(',') + '}';
14087
14125
  }
14126
+ // The parts of a value drawn on one line, and what an http value says of each word.
14127
+ var DOT = ' ' + String.fromCharCode(183) + ' ';
14128
+ var FOUND = String.fromCharCode(10003);
14129
+ var NOT_FOUND = String.fromCharCode(10007);
14130
+ // An http value read as its parts: the status, the redirects, where it
14131
+ // landed, and what it read off the body (when the status is 2xx) or that it
14132
+ // did not. Numbers and strings are drawn as they are.
14133
+ function httpText(h) {
14134
+ var parts = [String(h.status), fill(S.observed.redirects, { n: h.redirects }), h.final_url];
14135
+ if (h.body === null) parts.push(S.observed.bodyNotRead);
14136
+ else if (h.body) {
14137
+ if (h.body.words) {
14138
+ parts.push(h.body.words.map(function (w) { return w.word + ' ' + (w.found ? FOUND : NOT_FOUND); }).join(' '));
14139
+ }
14140
+ if (h.body.count !== undefined) parts.push(fill(S.observed.count, { n: h.body.count }));
14141
+ if (h.body.capture !== undefined) {
14142
+ parts.push(h.body.capture === null ? S.observed.captureNone : fill(S.observed.capture, { value: JSON.stringify(h.body.capture) }));
14143
+ }
14144
+ }
14145
+ return parts.join(DOT);
14146
+ }
14147
+ // A value of an observation as the page draws it: an http value in its
14148
+ // shape read as its parts, one with words beside what it says of each, and
14149
+ // any other as it is (a string) or as JSON. A test lifts this function.
14150
+ function observedText(value, words, http) {
14151
+ if (http) return httpText(http);
14152
+ if (words) return withWords(value, words);
14153
+ return shown(value);
14154
+ }
14155
+ // The value of an observation that moved, and what the previous record
14156
+ // held: a value whose type alone moved ("12" and 12) is drawn as JSON, so
14157
+ // that the two do not read the same. A test lifts this function.
14158
+ function movedText(o) {
14159
+ var m = o.moved;
14160
+ var now = observedText(o.value, o.words, o.http);
14161
+ if (m.status === 'none') return { now: now, then: S.observed.beforeNone };
14162
+ if (m.value === null) {
14163
+ return { now: now, then: S.observed.beforeNotObserved + (m.error ? ' (' + m.error + ')' : '') };
14164
+ }
14165
+ var then = observedText(m.value, m.words, m.http);
14166
+ if ((typeof m.value === 'string') !== (typeof o.value === 'string')) {
14167
+ then = JSON.stringify(m.value);
14168
+ if (then === now) now = JSON.stringify(o.value);
14169
+ }
14170
+ return { now: now, then: fill(S.observed.before, { value: then }) + (m.error ? ' (' + m.error + ')' : '') };
14171
+ }
14172
+ // A measure's value: the paths of a file_paths by how many, a number with
14173
+ // its unit, and a string (a file's name, a capture), which is no amount,
14174
+ // without it.
14175
+ function measureText(m) {
14176
+ if (Array.isArray(m.value)) return num(m.value.length) + ' ' + m.unit;
14177
+ return num(m.value) + (typeof m.value === 'number' ? ' ' + m.unit : '');
14178
+ }
14179
+ function signed(n) { return (n > 0 ? '+' : '') + num(n); }
14088
14180
  function stateName(state) { return S.states[state] || state; }
14089
14181
  function setStatus(message, isErr) {
14090
14182
  var s = $('status');
@@ -14169,17 +14261,36 @@ var BOARD_HTML = `<!doctype html>
14169
14261
  if (s.observed.length === 0) {
14170
14262
  observed = el('p', { class: 'muted', text: S.observed.none });
14171
14263
  } else {
14172
- var rows = s.observed.map(function (o) {
14264
+ var rows = [];
14265
+ s.observed.forEach(function (o) {
14266
+ var cell = el('td', { class: 'wrap' });
14173
14267
  var value;
14174
- if (o.value !== null) value = o.words ? withWords(o.value, o.words) : shown(o.value);
14175
- else if (o.previous && o.previous.status === 'value') value = fill(S.observed.missing, { value: shown(o.previous.value) });
14176
- else if (o.previous && o.previous.status === 'unreadable') value = S.observed.missingPreviousUnreadable;
14177
- else value = S.observed.missingNoPrevious;
14178
- if (o.error) value += ' (' + o.error + ')';
14179
- return el('tr', null, [
14180
- el('td', { text: o.name }), el('td', { text: value }),
14181
- el('td', { text: o.observed_at }), el('td', { text: o.source })
14182
- ]);
14268
+ if (o.value !== null && o.moved) {
14269
+ var pair = movedText(o);
14270
+ cell.appendChild(el('span', { class: 'chip changed', text: S.observed.changed }));
14271
+ value = pair.now;
14272
+ cell.appendChild(el('span', { text: value + (o.error ? ' (' + o.error + ')' : '') }));
14273
+ cell.appendChild(el('div', { class: 'sub', text: pair.then }));
14274
+ } else {
14275
+ if (o.value !== null) value = observedText(o.value, o.words, o.http);
14276
+ else if (o.previous && o.previous.status === 'value') value = fill(S.observed.missing, { value: shown(o.previous.value) });
14277
+ else if (o.previous && o.previous.status === 'unreadable') value = S.observed.missingPreviousUnreadable;
14278
+ else value = S.observed.missingNoPrevious;
14279
+ if (o.error) value += ' (' + o.error + ')';
14280
+ cell.appendChild(el('span', { text: value }));
14281
+ }
14282
+ // What the record's declaration says it is and looks at, under its name.
14283
+ var what = o.kind ? [o.kind].concat(o.looks_at || []).join(DOT) : null;
14284
+ rows.push(el('tr', null, [
14285
+ el('td', null, [el('div', { text: o.name }), what === null ? null : el('div', { class: 'sub', text: what })]),
14286
+ cell,
14287
+ el('td', { text: o.observed_at }), el('td', { class: 'wrap', text: o.source })
14288
+ ]));
14289
+ if (o.notes && o.notes.length > 0) {
14290
+ rows.push(el('tr', { class: 'notes' }, [el('td', { colspan: '4' }, [
14291
+ el('ul', { class: 'sub' }, o.notes.map(function (n) { return el('li', null, [prose(n, 'span')]); }))
14292
+ ])]));
14293
+ }
14183
14294
  });
14184
14295
  observed = el('div', { class: 'scroll' }, [el('table', { class: 'grid' }, [
14185
14296
  el('tr', null, [
@@ -14189,12 +14300,16 @@ var BOARD_HTML = `<!doctype html>
14189
14300
  ].concat(rows))]);
14190
14301
  }
14191
14302
  var observedHeading = el('h3', { text: S.observed.heading }, [reported()]);
14192
- return section(S.sections.summary, false, [
14303
+ var children = [
14193
14304
  el('div', null, [prose(s.text), reported()]),
14194
14305
  tiles,
14195
14306
  observedHeading,
14196
14307
  observed
14197
- ]);
14308
+ ];
14309
+ if (s.previous_record === 'unreadable' && s.observed.length > 0) {
14310
+ children.push(el('p', { class: 'muted', text: S.observed.previousUnreadable }));
14311
+ }
14312
+ return section(S.sections.summary, false, children);
14198
14313
  }
14199
14314
 
14200
14315
  var SVGNS = 'http://www.w3.org/2000/svg';
@@ -14533,6 +14648,27 @@ var BOARD_HTML = `<!doctype html>
14533
14648
  }));
14534
14649
  }
14535
14650
 
14651
+ // Every measure of the record, with the lanes it is drawn in and how much a
14652
+ // number moved since the previous record.
14653
+ function measures(b) {
14654
+ if (b.measures.length === 0) {
14655
+ return section(S.sections.measures, false, [el('p', { class: 'muted', text: S.measures.none })]);
14656
+ }
14657
+ var head = el('tr', null, [
14658
+ el('th', { text: S.measures.id }), el('th', { text: S.measures.value }),
14659
+ el('th', { text: S.measures.lanes }), el('th', { class: 'n', text: S.measures.delta })
14660
+ ]);
14661
+ var rows = b.measures.map(function (m) {
14662
+ return el('tr', { 'data-measure': m.id }, [
14663
+ el('td', null, [el('code', { text: m.id })]),
14664
+ el('td', { class: 'wrap', text: measureText(m) }),
14665
+ el('td', { text: m.lanes.length === 0 ? '-' : m.lanes.join(', ') }),
14666
+ el('td', { class: 'n', text: m.delta === null || m.delta === undefined ? '' : signed(m.delta) })
14667
+ ]);
14668
+ });
14669
+ return section(S.sections.measures, false, [el('div', { class: 'scroll' }, [el('table', { class: 'grid' }, [head].concat(rows))])]);
14670
+ }
14671
+
14536
14672
  function composition(b) {
14537
14673
  if (b.composition.length === 0) {
14538
14674
  return section(S.sections.composition, false, [el('p', { class: 'muted', text: S.composition.none })]);
@@ -14620,7 +14756,8 @@ var BOARD_HTML = `<!doctype html>
14620
14756
  var b = page.board;
14621
14757
  // The board's own title, so that boards open in other tabs can be told apart.
14622
14758
  document.title = b.heading.title;
14623
- [heading(b), summary(b), effort(b, false), matrix(b), lanes(b), composition(b), turns(b), footnotes(b)]
14759
+ [heading(b), summary(b), effort(b, false), matrix(b), lanes(b), measures(b), composition(b), turns(b),
14760
+ recordRepos(b), recordComponents(b), footnotes(b)]
14624
14761
  .forEach(function (node) { root.appendChild(node); });
14625
14762
  }
14626
14763
 
@@ -14646,12 +14783,14 @@ var BOARD_HTML = `<!doctype html>
14646
14783
  function missingIn(l) {
14647
14784
  return function (at) { return l.footnotes.not_found.some(function (n) { return n.at === at; }); };
14648
14785
  }
14649
- function liveRepos(l) {
14650
- var missing = missingIn(l);
14786
+ // The repositories as a table. older: a record of version 1 or 2, which
14787
+ // measured no base, ahead or fetch time (drawn as '-') and held the
14788
+ // commits behind as behind_main.
14789
+ function reposTable(list, missing, older) {
14651
14790
  var labels = [S.live.repo, S.live.branch, S.live.head, S.live.lastCommit, S.live.commits, S.live.uncommitted, S.live.base, S.live.behind, S.live.ahead, S.live.fetchedAt];
14652
14791
  var numeric = [4, 5, 7, 8];
14653
14792
  var head = el('tr', null, labels.map(function (label, i) { return el('th', { class: numeric.indexOf(i) !== -1 ? 'n' : '', text: label }); }));
14654
- var rows = l.repos.map(function (r) {
14793
+ var rows = list.map(function (r) {
14655
14794
  var at = 'repos[' + r.path + ']';
14656
14795
  // A null the measurement says it could not measure, or one that means
14657
14796
  // so (a detached HEAD, no commit yet, no base, no fetch of it on
@@ -14660,6 +14799,7 @@ var BOARD_HTML = `<!doctype html>
14660
14799
  if (v !== null) return show(v);
14661
14800
  return missing(at) || missing(at + '.' + field) ? S.tiles.notMeasured : '-';
14662
14801
  };
14802
+ var unmeasured = function (field, v, show) { return older ? '-' : value(field, v, show); };
14663
14803
  return el('tr', null, [
14664
14804
  el('td', { text: r.name === null ? r.path : r.name }),
14665
14805
  el('td', { text: value('branch', r.branch, String) }),
@@ -14667,13 +14807,59 @@ var BOARD_HTML = `<!doctype html>
14667
14807
  el('td', { text: value('last_commit', r.last_commit, when) }),
14668
14808
  el('td', { class: 'n', text: num(r.commits) }),
14669
14809
  el('td', { class: 'n', text: num(r.uncommitted) }),
14670
- el('td', { text: value('base', r.base, String) }),
14671
- el('td', { class: 'n', text: value('behind', r.behind, num) }),
14672
- el('td', { class: 'n', text: value('ahead', r.ahead, num) }),
14673
- el('td', { text: value('fetched_at', r.fetched_at, when) })
14810
+ el('td', { text: unmeasured('base', r.base, String) }),
14811
+ el('td', { class: 'n', text: value(older ? 'behind_main' : 'behind', r.behind, num) }),
14812
+ el('td', { class: 'n', text: unmeasured('ahead', r.ahead, num) }),
14813
+ el('td', { text: unmeasured('fetched_at', r.fetched_at, when) })
14814
+ ]);
14815
+ });
14816
+ return el('div', { class: 'scroll' }, [el('table', { class: 'grid' }, [head].concat(rows))]);
14817
+ }
14818
+ function liveRepos(l) {
14819
+ return section(S.live.repos, false, [reposTable(l.repos, missingIn(l), false)]);
14820
+ }
14821
+ // The repositories as the record measured them, by its version.
14822
+ function recordRepos(b) {
14823
+ var r = b.repos;
14824
+ if (!r) return section(S.live.repos, false, [el('p', { class: 'muted', text: S.record.reposUnread })]);
14825
+ var children = [reposTable(r.list, missingIn(b), !r.base_measured)];
14826
+ if (!r.base_measured) children.push(el('p', { class: 'muted', text: fill(S.record.notMeasuredByVersion, { version: r.record_version }) }));
14827
+ return section(S.live.repos, false, children);
14828
+ }
14829
+ // The components the record found, by the lanes its registry counts them
14830
+ // in, then those in no lane, those not registered, and those gone.
14831
+ function recordComponents(b) {
14832
+ var c = b.components;
14833
+ if (!c) return section(S.live.components, false, [el('p', { class: 'muted', text: S.record.componentsUnread })]);
14834
+ if (!c.measured) {
14835
+ return section(S.live.components, false, [
14836
+ el('p', { class: 'muted', text: S.record.componentsNotMeasured }),
14837
+ el('ul', null, c.reasons.map(function (reason) { return el('li', { text: reason }); }))
14674
14838
  ]);
14839
+ }
14840
+ var item = function (x) {
14841
+ var kinds = x.kinds === null ? S.record.notFound : x.kinds.join(', ');
14842
+ var parts = [el('code', { text: x.key }), el('span', { class: 'muted', text: ' ' + kinds })];
14843
+ if (x.kind_changed) {
14844
+ parts.push(el('span', { class: 'chip changed', text: fill(S.record.kindChanged, { before: x.kind_changed.before.join(', ') }) }));
14845
+ }
14846
+ if (x.note) parts.push(el('div', { class: 'sub', text: x.note }));
14847
+ return el('li', { 'data-component': x.key }, parts);
14848
+ };
14849
+ var group = function (title, list, empty) {
14850
+ return [el('h3', { text: title }), list.length === 0 ? el('p', { class: 'muted', text: empty }) : el('ul', null, list.map(item))];
14851
+ };
14852
+ var children = [];
14853
+ c.lanes.forEach(function (lane) {
14854
+ children = children.concat(group(lane.name, lane.components, S.record.noComponentInLane));
14675
14855
  });
14676
- return section(S.live.repos, false, [el('div', { class: 'scroll' }, [el('table', { class: 'grid' }, [head].concat(rows))])]);
14856
+ children = children.concat(group(S.record.uncounted, c.uncounted, S.record.none));
14857
+ children = children.concat(group(S.record.unacknowledged, c.unacknowledged, S.record.none));
14858
+ children.push(el('h3', { text: S.record.gone }));
14859
+ children.push(c.gone === null ? el('p', { class: 'muted', text: S.record.goneUnknown })
14860
+ : c.gone.length === 0 ? el('p', { class: 'muted', text: S.record.none })
14861
+ : el('ul', null, c.gone.map(function (key) { return el('li', null, [el('code', { text: key })]); })));
14862
+ return section(S.live.components, false, children);
14677
14863
  }
14678
14864
  function liveTrail(l) {
14679
14865
  var t = l.trail;
@@ -16334,7 +16520,7 @@ function installExperimentalNotice(program, names = EXPERIMENTAL_COMMANDS, write
16334
16520
  function readBuildStamp() {
16335
16521
  if (false) return void 0;
16336
16522
  try {
16337
- return JSON.parse('{"version":"0.71.2","commit":"c7fc0ed","committedAt":"2026-10-19T20:00:28+09:00"}');
16523
+ return JSON.parse('{"version":"0.72.0","commit":"f92df50","committedAt":"2026-10-20T12:15:21+09:00"}');
16338
16524
  } catch {
16339
16525
  return void 0;
16340
16526
  }