@codyswann/lisa 2.283.0 → 2.285.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/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +34 -2
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +2 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/plugins/lisa/rules/eager/dependency-trust-classes.md +43 -0
- package/plugins/lisa/rules/reference/dependency-trust-classes.md +243 -0
- package/plugins/lisa/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/rules/eager/dependency-trust-classes.md +43 -0
- package/plugins/lisa-copilot/rules/reference/dependency-trust-classes.md +243 -0
- package/plugins/lisa-copilot/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/dependency-trust-classes-reference.mdc +248 -0
- package/plugins/lisa-cursor/rules/dependency-trust-classes.mdc +48 -0
- package/plugins/lisa-cursor/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/rules/eager/dependency-trust-classes.md +43 -0
- package/plugins/src/base/rules/reference/dependency-trust-classes.md +243 -0
- package/plugins/src/base/skills/lisa-task-decomposition/SKILL.md +26 -0
- package/scripts/check-duplicate-versions.mjs +715 -0
- package/ui/index.html +195 -43
package/ui/index.html
CHANGED
|
@@ -1522,68 +1522,65 @@
|
|
|
1522
1522
|
card: "Required",
|
|
1523
1523
|
items: [
|
|
1524
1524
|
{
|
|
1525
|
+
id: "setup.install",
|
|
1525
1526
|
label: "Install Lisa and apply templates",
|
|
1526
1527
|
desc: "Detects the project’s stacks, applies project-owned templates, agent surfaces, and git hooks. External plugin/runtime installation is reported separately and never inferred from project files.",
|
|
1527
1528
|
command: "bun add -d @codyswann/lisa && bunx lisa",
|
|
1528
|
-
done: true,
|
|
1529
1529
|
},
|
|
1530
1530
|
{
|
|
1531
|
+
id: "setup.sync",
|
|
1531
1532
|
label: "Populate configuration",
|
|
1532
1533
|
desc: "Fills every missing .lisa.config.json setting (absorbing existing artifact values first) and syncs mirrored files. No unset configs.",
|
|
1533
1534
|
command: "lisa sync",
|
|
1534
|
-
done: true,
|
|
1535
1535
|
},
|
|
1536
1536
|
{
|
|
1537
|
+
id: "setup.agent-ready",
|
|
1537
1538
|
label: "Make the project agent-ready (brownfield)",
|
|
1538
1539
|
desc: "Builds the knowledge wiki through read-only, redacted ingestion; records every source as complete, partial, or unavailable; and writes wiki/gaps.md. Answer inline, re-run in a new session, repeat until every source is complete and zero gaps remain. Greenfield projects are ready by construction.",
|
|
1539
1540
|
command: "/lisa:agent-ready",
|
|
1540
|
-
done: false,
|
|
1541
|
-
why: "wiki/gaps.md has 2 open gaps",
|
|
1542
1541
|
},
|
|
1543
1542
|
{
|
|
1543
|
+
id: "setup.standards",
|
|
1544
1544
|
label: "Adopt the standards (conformance refactor)",
|
|
1545
1545
|
desc: "Apply Lisa's full lint rules, guardrails, and thresholds — the project goes red by design — then agents refactor to automated conformance without changing business logic. Empirical product verification remains a separate Verify-factory gate.",
|
|
1546
1546
|
command:
|
|
1547
1547
|
"/lisa:improve:* · /lisa:fix:linter-error · lisa standards-proof",
|
|
1548
|
-
done: false,
|
|
1549
|
-
why: "blocked by agent-ready",
|
|
1550
1548
|
},
|
|
1551
1549
|
{
|
|
1550
|
+
id: "setup.tracker",
|
|
1552
1551
|
label: "Connect the work tracker",
|
|
1553
1552
|
desc: "Verifies the workflow status names and writes the tracker section. This project: JIRA, project ACME.",
|
|
1554
1553
|
command: "/lisa:setup:jira | github | linear",
|
|
1555
|
-
done: true,
|
|
1556
1554
|
},
|
|
1557
1555
|
{
|
|
1556
|
+
id: "setup.prd-source",
|
|
1558
1557
|
label: "Connect the PRD source",
|
|
1559
1558
|
desc: "Wires the product-requirements queue and its lifecycle vocabulary. This project: Notion.",
|
|
1560
1559
|
command: "/lisa:setup:notion | confluence | linear | github",
|
|
1561
|
-
done: true,
|
|
1562
1560
|
},
|
|
1563
1561
|
{
|
|
1562
|
+
id: "setup.github-governance",
|
|
1564
1563
|
label: "Apply GitHub repository governance",
|
|
1565
1564
|
desc: "Repo settings (merge-only), rulesets with required checks, write deploy key, deployment environments with approval gates.",
|
|
1566
1565
|
command: "/lisa:setup:github-repo",
|
|
1567
|
-
done: true,
|
|
1568
1566
|
},
|
|
1569
1567
|
{
|
|
1568
|
+
id: "setup.secrets",
|
|
1570
1569
|
label: "Provision CI secrets",
|
|
1571
1570
|
desc: "CLAUDE_CODE_OAUTH_TOKEN, GITGUARDIAN_API_KEY, SONAR_TOKEN, per-environment AWS accounts, and the optional scanners.",
|
|
1572
1571
|
command: "gh secret set …",
|
|
1573
|
-
done: false,
|
|
1574
|
-
why: "2 missing: SNYK_TOKEN, FOSSA_API_KEY",
|
|
1575
1572
|
},
|
|
1576
1573
|
{
|
|
1574
|
+
id: "setup.automations",
|
|
1577
1575
|
label: "Schedule the automations",
|
|
1578
1576
|
desc: "Creates the six-automation fleet — intake, repair, and the QA / Product Planning / Monitoring loops — on the harness’s native scheduler.",
|
|
1579
1577
|
command: "/lisa:setup-automations",
|
|
1580
|
-
done: false,
|
|
1581
1578
|
},
|
|
1582
1579
|
{
|
|
1580
|
+
id: "setup.exploration",
|
|
1583
1581
|
label: "Configure exploration environments",
|
|
1584
1582
|
desc: "Per-environment mutation policy and test identity so agents can use the product safely (production defaults to forbidden).",
|
|
1585
1583
|
command: ".lisa.config.json exploration.*",
|
|
1586
|
-
done: false,
|
|
1587
1584
|
},
|
|
1588
1585
|
],
|
|
1589
1586
|
},
|
|
@@ -1592,17 +1589,17 @@
|
|
|
1592
1589
|
card: "Optional",
|
|
1593
1590
|
items: [
|
|
1594
1591
|
{
|
|
1592
|
+
id: "setup.wiki",
|
|
1595
1593
|
label: "Install the LLM wiki",
|
|
1596
1594
|
desc: "In-repo knowledge base agents read and maintain.",
|
|
1597
1595
|
command: "/lisa:wiki:install",
|
|
1598
|
-
done: false,
|
|
1599
1596
|
optional: true,
|
|
1600
1597
|
},
|
|
1601
1598
|
{
|
|
1599
|
+
id: "setup.starter-provenance",
|
|
1602
1600
|
label: "Record starter provenance",
|
|
1603
1601
|
desc: "Which starter repo(s) this project descends from, enabling starter sync (planned).",
|
|
1604
1602
|
command: ".lisa.config.json starter.*",
|
|
1605
|
-
done: false,
|
|
1606
1603
|
optional: true,
|
|
1607
1604
|
},
|
|
1608
1605
|
],
|
|
@@ -5085,6 +5082,30 @@
|
|
|
5085
5082
|
let healthChipState = { state: "idle" };
|
|
5086
5083
|
/* Durable Health view model projected by every whole-page render. */
|
|
5087
5084
|
let healthViewState = { state: "idle" };
|
|
5085
|
+
const SETUP_READINESS_CHECKS = [
|
|
5086
|
+
"setup.install",
|
|
5087
|
+
"setup.sync",
|
|
5088
|
+
"setup.agent-ready",
|
|
5089
|
+
"setup.standards",
|
|
5090
|
+
"setup.tracker",
|
|
5091
|
+
"setup.prd-source",
|
|
5092
|
+
"setup.github-governance",
|
|
5093
|
+
"setup.secrets",
|
|
5094
|
+
"setup.automations",
|
|
5095
|
+
"setup.exploration",
|
|
5096
|
+
"setup.wiki",
|
|
5097
|
+
"setup.starter-provenance",
|
|
5098
|
+
];
|
|
5099
|
+
const SETUP_READINESS_UNAVAILABLE =
|
|
5100
|
+
"Setup readiness is unavailable. Re-open the console after checking the local Lisa service.";
|
|
5101
|
+
/* Durable Setup state survives every whole-page live-status re-render. */
|
|
5102
|
+
let setupReadinessState = {
|
|
5103
|
+
state: "loading",
|
|
5104
|
+
findings: new Map(),
|
|
5105
|
+
message: "Checking current setup readiness.",
|
|
5106
|
+
};
|
|
5107
|
+
let setupReadinessGeneration = 0;
|
|
5108
|
+
let setupReadinessInFlight = null;
|
|
5088
5109
|
|
|
5089
5110
|
function el(tag, cls, html) {
|
|
5090
5111
|
const node = document.createElement(tag);
|
|
@@ -5711,6 +5732,7 @@
|
|
|
5711
5732
|
|
|
5712
5733
|
function buildChecklist(block) {
|
|
5713
5734
|
const card = el("div", "card");
|
|
5735
|
+
card.dataset.setupChecklist = block.card;
|
|
5714
5736
|
const head = el("div", "card-head");
|
|
5715
5737
|
const note = el("span", "note");
|
|
5716
5738
|
const countDone = () =>
|
|
@@ -5724,35 +5746,38 @@
|
|
|
5724
5746
|
card.appendChild(head);
|
|
5725
5747
|
const body = el("div", "card-body");
|
|
5726
5748
|
block.items.forEach(item => {
|
|
5727
|
-
const
|
|
5749
|
+
const finding = setupReadinessState.findings.get(item.id);
|
|
5750
|
+
const isDone = finding && finding.status === "pass";
|
|
5751
|
+
const reason =
|
|
5752
|
+
setupReadinessState.state === "result" && finding
|
|
5753
|
+
? finding.reason
|
|
5754
|
+
: setupReadinessState.message;
|
|
5755
|
+
const row = el("div", "check-item" + (isDone ? " done" : ""));
|
|
5756
|
+
row.dataset.setupCheck = item.id;
|
|
5728
5757
|
const right = el("div", "check-right");
|
|
5729
|
-
|
|
5730
|
-
|
|
5731
|
-
|
|
5732
|
-
|
|
5733
|
-
|
|
5734
|
-
|
|
5735
|
-
|
|
5736
|
-
|
|
5737
|
-
|
|
5738
|
-
|
|
5739
|
-
)
|
|
5740
|
-
|
|
5741
|
-
|
|
5742
|
-
|
|
5743
|
-
|
|
5744
|
-
el(
|
|
5745
|
-
"span",
|
|
5746
|
-
"status-why",
|
|
5747
|
-
"read-only: setup checklist state has not shipped yet"
|
|
5748
|
-
)
|
|
5749
|
-
);
|
|
5750
|
-
};
|
|
5758
|
+
right.appendChild(
|
|
5759
|
+
el(
|
|
5760
|
+
"span",
|
|
5761
|
+
"badge " +
|
|
5762
|
+
(isDone
|
|
5763
|
+
? "pass"
|
|
5764
|
+
: finding?.status === "fail"
|
|
5765
|
+
? "fail"
|
|
5766
|
+
: "warn"),
|
|
5767
|
+
isDone ? "done" : "pending"
|
|
5768
|
+
)
|
|
5769
|
+
);
|
|
5770
|
+
if (!isDone) {
|
|
5771
|
+
right.appendChild(el("span", "status-why", esc(reason)));
|
|
5772
|
+
}
|
|
5751
5773
|
const ck = el("button", "ck");
|
|
5752
5774
|
ck.type = "button";
|
|
5753
5775
|
ck.disabled = true;
|
|
5754
|
-
ck.title =
|
|
5755
|
-
ck.setAttribute(
|
|
5776
|
+
ck.title = reason;
|
|
5777
|
+
ck.setAttribute(
|
|
5778
|
+
"aria-label",
|
|
5779
|
+
item.label + ": " + (isDone ? "done" : "pending") + ". " + reason
|
|
5780
|
+
);
|
|
5756
5781
|
row.appendChild(ck);
|
|
5757
5782
|
const content = el("div", "check-content");
|
|
5758
5783
|
const lab = el("div", "check-label", esc(item.label));
|
|
@@ -5765,7 +5790,6 @@
|
|
|
5765
5790
|
content.appendChild(el("span", "keychip", esc(item.command)));
|
|
5766
5791
|
}
|
|
5767
5792
|
row.appendChild(content);
|
|
5768
|
-
refreshRight();
|
|
5769
5793
|
row.appendChild(right);
|
|
5770
5794
|
body.appendChild(row);
|
|
5771
5795
|
});
|
|
@@ -5947,6 +5971,7 @@
|
|
|
5947
5971
|
|
|
5948
5972
|
let activeSection = "overview";
|
|
5949
5973
|
function showSection(sid) {
|
|
5974
|
+
const previousSection = activeSection;
|
|
5950
5975
|
activeSection = sid;
|
|
5951
5976
|
document
|
|
5952
5977
|
.querySelectorAll(".section")
|
|
@@ -5962,6 +5987,11 @@
|
|
|
5962
5987
|
history.replaceState(null, "", "#" + sid);
|
|
5963
5988
|
applyFilter(document.getElementById("search").value);
|
|
5964
5989
|
window.scrollTo({ top: 0 });
|
|
5990
|
+
if (sid === "setup" && previousSection !== "setup") {
|
|
5991
|
+
void hydrateSetupReadiness({
|
|
5992
|
+
refresh: setupReadinessGeneration > 0,
|
|
5993
|
+
});
|
|
5994
|
+
}
|
|
5965
5995
|
}
|
|
5966
5996
|
|
|
5967
5997
|
function applyFilter(query) {
|
|
@@ -6677,6 +6707,128 @@
|
|
|
6677
6707
|
}
|
|
6678
6708
|
}
|
|
6679
6709
|
|
|
6710
|
+
/** Validate the strict three-field Setup readiness transport contract. */
|
|
6711
|
+
function requireSetupReadinessResult(candidate) {
|
|
6712
|
+
const isObject = value =>
|
|
6713
|
+
value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6714
|
+
const hasExactKeys = (value, keys) =>
|
|
6715
|
+
isObject(value) &&
|
|
6716
|
+
Object.keys(value).sort().join(",") === [...keys].sort().join(",");
|
|
6717
|
+
const canonicalUtc = value => {
|
|
6718
|
+
if (
|
|
6719
|
+
typeof value !== "string" ||
|
|
6720
|
+
!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u.test(value)
|
|
6721
|
+
) {
|
|
6722
|
+
return false;
|
|
6723
|
+
}
|
|
6724
|
+
const instant = new Date(value);
|
|
6725
|
+
return (
|
|
6726
|
+
!Number.isNaN(instant.valueOf()) && instant.toISOString() === value
|
|
6727
|
+
);
|
|
6728
|
+
};
|
|
6729
|
+
const readableReason = value =>
|
|
6730
|
+
typeof value === "string" &&
|
|
6731
|
+
value.trim() === value &&
|
|
6732
|
+
value.length > 0 &&
|
|
6733
|
+
new TextEncoder().encode(value).length <= 2000 &&
|
|
6734
|
+
!Array.from(value).some(character => {
|
|
6735
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
6736
|
+
return (
|
|
6737
|
+
codePoint <= 0x1f ||
|
|
6738
|
+
(codePoint >= 0x7f && codePoint <= 0x9f) ||
|
|
6739
|
+
(codePoint >= 0x202a && codePoint <= 0x202e) ||
|
|
6740
|
+
(codePoint >= 0x2066 && codePoint <= 0x2069)
|
|
6741
|
+
);
|
|
6742
|
+
});
|
|
6743
|
+
if (
|
|
6744
|
+
!hasExactKeys(candidate, [
|
|
6745
|
+
"schemaVersion",
|
|
6746
|
+
"observedAt",
|
|
6747
|
+
"findings",
|
|
6748
|
+
]) ||
|
|
6749
|
+
candidate.schemaVersion !== 1 ||
|
|
6750
|
+
!canonicalUtc(candidate.observedAt) ||
|
|
6751
|
+
!Array.isArray(candidate.findings) ||
|
|
6752
|
+
candidate.findings.length !== SETUP_READINESS_CHECKS.length
|
|
6753
|
+
) {
|
|
6754
|
+
throw new TypeError(
|
|
6755
|
+
"Setup readiness response is not valid schema v1 JSON"
|
|
6756
|
+
);
|
|
6757
|
+
}
|
|
6758
|
+
const findings = new Map();
|
|
6759
|
+
candidate.findings.forEach((finding, index) => {
|
|
6760
|
+
if (
|
|
6761
|
+
!hasExactKeys(finding, ["check", "layer", "status", "reason"]) ||
|
|
6762
|
+
finding.check !== SETUP_READINESS_CHECKS[index] ||
|
|
6763
|
+
finding.layer !== "deterministic" ||
|
|
6764
|
+
!["pass", "warn", "fail"].includes(finding.status) ||
|
|
6765
|
+
!readableReason(finding.reason)
|
|
6766
|
+
) {
|
|
6767
|
+
throw new TypeError(
|
|
6768
|
+
"Setup readiness response contains an invalid finding"
|
|
6769
|
+
);
|
|
6770
|
+
}
|
|
6771
|
+
findings.set(finding.check, finding);
|
|
6772
|
+
});
|
|
6773
|
+
return findings;
|
|
6774
|
+
}
|
|
6775
|
+
|
|
6776
|
+
/** Rebuild only the two Setup checklist cards from durable readiness state. */
|
|
6777
|
+
function repaintSetupChecklist() {
|
|
6778
|
+
const section = document.getElementById("section-setup");
|
|
6779
|
+
if (!section) return;
|
|
6780
|
+
const blocks = DATA.sections.setup.blocks.filter(
|
|
6781
|
+
block => block.type === "checklist"
|
|
6782
|
+
);
|
|
6783
|
+
const cards = section.querySelectorAll("[data-setup-checklist]");
|
|
6784
|
+
blocks.forEach((block, index) => {
|
|
6785
|
+
if (cards[index]) cards[index].replaceWith(buildChecklist(block));
|
|
6786
|
+
});
|
|
6787
|
+
}
|
|
6788
|
+
|
|
6789
|
+
/** Read current Setup readiness with same-entry dedupe and stale-response protection. */
|
|
6790
|
+
function hydrateSetupReadiness({ refresh = false } = {}) {
|
|
6791
|
+
if (!refresh && setupReadinessInFlight) {
|
|
6792
|
+
return setupReadinessInFlight;
|
|
6793
|
+
}
|
|
6794
|
+
setupReadinessState = {
|
|
6795
|
+
state: "loading",
|
|
6796
|
+
findings: new Map(),
|
|
6797
|
+
message: "Checking current setup readiness.",
|
|
6798
|
+
};
|
|
6799
|
+
repaintSetupChecklist();
|
|
6800
|
+
const generation = ++setupReadinessGeneration;
|
|
6801
|
+
const request = (async () => {
|
|
6802
|
+
let nextState;
|
|
6803
|
+
try {
|
|
6804
|
+
const response = await fetch("/api/setup-readiness", {
|
|
6805
|
+
cache: "no-store",
|
|
6806
|
+
});
|
|
6807
|
+
if (!response.ok) throw new Error(SETUP_READINESS_UNAVAILABLE);
|
|
6808
|
+
nextState = {
|
|
6809
|
+
state: "result",
|
|
6810
|
+
findings: requireSetupReadinessResult(await response.json()),
|
|
6811
|
+
message: "",
|
|
6812
|
+
};
|
|
6813
|
+
} catch {
|
|
6814
|
+
nextState = {
|
|
6815
|
+
state: "error",
|
|
6816
|
+
findings: new Map(),
|
|
6817
|
+
message: SETUP_READINESS_UNAVAILABLE,
|
|
6818
|
+
};
|
|
6819
|
+
}
|
|
6820
|
+
if (generation === setupReadinessGeneration) {
|
|
6821
|
+
setupReadinessState = nextState;
|
|
6822
|
+
repaintSetupChecklist();
|
|
6823
|
+
}
|
|
6824
|
+
if (setupReadinessInFlight === request) {
|
|
6825
|
+
setupReadinessInFlight = null;
|
|
6826
|
+
}
|
|
6827
|
+
})();
|
|
6828
|
+
setupReadinessInFlight = request;
|
|
6829
|
+
return request;
|
|
6830
|
+
}
|
|
6831
|
+
|
|
6680
6832
|
/** Run exactly one deterministic Health v1 check through the local server. */
|
|
6681
6833
|
async function runHealthCheck() {
|
|
6682
6834
|
const button = document.getElementById("runHealthCheckButton");
|
|
@@ -7224,11 +7376,11 @@
|
|
|
7224
7376
|
function boot() {
|
|
7225
7377
|
hydrateFromLiveConfig();
|
|
7226
7378
|
renderAll();
|
|
7227
|
-
void hydrateLiveStatuses();
|
|
7228
|
-
void hydrateHealth();
|
|
7229
7379
|
showSection(location.hash ? location.hash.slice(1) : "overview");
|
|
7230
7380
|
if (!document.getElementById("section-" + activeSection))
|
|
7231
7381
|
showSection("overview");
|
|
7382
|
+
void hydrateLiveStatuses();
|
|
7383
|
+
void hydrateHealth();
|
|
7232
7384
|
}
|
|
7233
7385
|
if (document.readyState === "loading") {
|
|
7234
7386
|
document.addEventListener("DOMContentLoaded", boot);
|