@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 +223 -37
- package/dist/index.js.map +1 -1
- package/dist/program.js +223 -37
- package/dist/program.js.map +1 -1
- package/package.json +2 -2
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
|
|
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
|
|
2366
|
+
let checked;
|
|
2364
2367
|
try {
|
|
2365
|
-
|
|
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
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
14175
|
-
|
|
14176
|
-
|
|
14177
|
-
|
|
14178
|
-
|
|
14179
|
-
|
|
14180
|
-
|
|
14181
|
-
|
|
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
|
-
|
|
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),
|
|
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
|
-
|
|
14650
|
-
|
|
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 =
|
|
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:
|
|
14671
|
-
el('td', { class: 'n', text: value('behind', r.behind, num) }),
|
|
14672
|
-
el('td', { class: 'n', text:
|
|
14673
|
-
el('td', { text:
|
|
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
|
-
|
|
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.
|
|
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
|
}
|