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