@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/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
|
|
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
|
|
2368
|
+
let checked;
|
|
2366
2369
|
try {
|
|
2367
|
-
|
|
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
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
14177
|
-
|
|
14178
|
-
|
|
14179
|
-
|
|
14180
|
-
|
|
14181
|
-
|
|
14182
|
-
|
|
14183
|
-
|
|
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
|
-
|
|
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),
|
|
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
|
-
|
|
14652
|
-
|
|
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 =
|
|
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:
|
|
14673
|
-
el('td', { class: 'n', text: value('behind', r.behind, num) }),
|
|
14674
|
-
el('td', { class: 'n', text:
|
|
14675
|
-
el('td', { text:
|
|
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
|
-
|
|
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.
|
|
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
|
}
|