@codyswann/lisa 2.234.0 → 2.235.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.
Files changed (68) hide show
  1. package/dist/cli/ui-ci-quality-jobs-compute.d.ts +46 -0
  2. package/dist/cli/ui-ci-quality-jobs-compute.d.ts.map +1 -0
  3. package/dist/cli/ui-ci-quality-jobs-compute.js +178 -0
  4. package/dist/cli/ui-ci-quality-jobs-compute.js.map +1 -0
  5. package/dist/cli/ui-ci-quality-jobs-parse.d.ts +15 -0
  6. package/dist/cli/ui-ci-quality-jobs-parse.d.ts.map +1 -0
  7. package/dist/cli/ui-ci-quality-jobs-parse.js +109 -0
  8. package/dist/cli/ui-ci-quality-jobs-parse.js.map +1 -0
  9. package/dist/cli/ui-ci-quality-jobs.d.ts +22 -0
  10. package/dist/cli/ui-ci-quality-jobs.d.ts.map +1 -0
  11. package/dist/cli/ui-ci-quality-jobs.js +160 -0
  12. package/dist/cli/ui-ci-quality-jobs.js.map +1 -0
  13. package/dist/cli/ui-cmd.d.ts +1 -0
  14. package/dist/cli/ui-cmd.d.ts.map +1 -1
  15. package/dist/cli/ui-cmd.js +3 -0
  16. package/dist/cli/ui-cmd.js.map +1 -1
  17. package/package.json +1 -1
  18. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-agy/plugin.json +1 -1
  21. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  24. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-agy/plugin.json +1 -1
  31. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  51. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-agy/plugin.json +1 -1
  56. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  61. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  66. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  68. package/ui/index.html +193 -31
package/ui/index.html CHANGED
@@ -4454,7 +4454,12 @@
4454
4454
  t: "text",
4455
4455
  v: "oxlint then ESLint over the whole repo — the fast rule set",
4456
4456
  },
4457
- { t: "status", v: true },
4457
+ {
4458
+ t: "status",
4459
+ jobId: "lint",
4460
+ v: null,
4461
+ reason: "checking…",
4462
+ },
4458
4463
  ],
4459
4464
  [
4460
4465
  { t: "mono", v: "🐢 Slow Lint Rules" },
@@ -4462,22 +4467,42 @@
4462
4467
  t: "text",
4463
4468
  v: "The expensive rules deferred from local lint (import cycles, namespace checks)",
4464
4469
  },
4465
- { t: "status", v: true },
4470
+ {
4471
+ t: "status",
4472
+ jobId: "lint_slow",
4473
+ v: null,
4474
+ reason: "checking…",
4475
+ },
4466
4476
  ],
4467
4477
  [
4468
4478
  { t: "mono", v: "🔍 Type Check" },
4469
4479
  { t: "text", v: "tsc --noEmit across the project" },
4470
- { t: "status", v: true },
4480
+ {
4481
+ t: "status",
4482
+ jobId: "typecheck",
4483
+ v: null,
4484
+ reason: "checking…",
4485
+ },
4471
4486
  ],
4472
4487
  [
4473
4488
  { t: "mono", v: "📐 Check Formatting" },
4474
4489
  { t: "text", v: "Prettier in check mode — no writes" },
4475
- { t: "status", v: true },
4490
+ {
4491
+ t: "status",
4492
+ jobId: "format",
4493
+ v: null,
4494
+ reason: "checking…",
4495
+ },
4476
4496
  ],
4477
4497
  [
4478
4498
  { t: "mono", v: "🏗️ Build" },
4479
4499
  { t: "text", v: "Compiles the project to catch build breaks" },
4480
- { t: "status", v: true },
4500
+ {
4501
+ t: "status",
4502
+ jobId: "build",
4503
+ v: null,
4504
+ reason: "checking…",
4505
+ },
4481
4506
  ],
4482
4507
  [
4483
4508
  { t: "mono", v: "🧪 Run Unit Tests" },
@@ -4485,12 +4510,22 @@
4485
4510
  t: "text",
4486
4511
  v: "Unit suite with the coverage floors from Testing & coverage enforced",
4487
4512
  },
4488
- { t: "status", v: true },
4513
+ {
4514
+ t: "status",
4515
+ jobId: "test:unit",
4516
+ v: null,
4517
+ reason: "checking…",
4518
+ },
4489
4519
  ],
4490
4520
  [
4491
4521
  { t: "mono", v: "🧪 Run Integration Tests" },
4492
4522
  { t: "text", v: "Integration suite (30-minute timeout)" },
4493
- { t: "status", v: true },
4523
+ {
4524
+ t: "status",
4525
+ jobId: "test:integration",
4526
+ v: null,
4527
+ reason: "checking…",
4528
+ },
4494
4529
  ],
4495
4530
  [
4496
4531
  { t: "mono", v: "🧪 Run E2E Tests" },
@@ -4498,7 +4533,12 @@
4498
4533
  t: "text",
4499
4534
  v: "Playwright end-to-end tests, auto-detected from playwright.config + a test:e2e script",
4500
4535
  },
4501
- { t: "status", v: true },
4536
+ {
4537
+ t: "status",
4538
+ jobId: "test:e2e",
4539
+ v: null,
4540
+ reason: "checking…",
4541
+ },
4502
4542
  ],
4503
4543
  [
4504
4544
  { t: "mono", v: "🎭 Playwright E2E Tests" },
@@ -4506,7 +4546,12 @@
4506
4546
  t: "text",
4507
4547
  v: "Web-export e2e run — a required check on staging via ruleset",
4508
4548
  },
4509
- { t: "status", v: true },
4549
+ {
4550
+ t: "status",
4551
+ jobId: "playwright_e2e",
4552
+ v: null,
4553
+ reason: "checking…",
4554
+ },
4510
4555
  ],
4511
4556
  [
4512
4557
  { t: "mono", v: "📱 Maestro Cloud E2E" },
@@ -4514,7 +4559,12 @@
4514
4559
  t: "text",
4515
4560
  v: "Mobile end-to-end flows on Maestro Cloud",
4516
4561
  },
4517
- { t: "status", v: true },
4562
+ {
4563
+ t: "status",
4564
+ jobId: "maestro_e2e",
4565
+ v: null,
4566
+ reason: "checking…",
4567
+ },
4518
4568
  ],
4519
4569
  [
4520
4570
  { t: "mono", v: "🧭 E2E Route Coverage" },
@@ -4522,7 +4572,12 @@
4522
4572
  t: "text",
4523
4573
  v: "Static gate: % of expo-router routes reached by Playwright specs and Maestro flows, against the floors in e2e.thresholds.json — auto-enabled on Expo projects, a no-op elsewhere",
4524
4574
  },
4525
- { t: "status", v: true },
4575
+ {
4576
+ t: "status",
4577
+ jobId: "e2e_coverage",
4578
+ v: null,
4579
+ reason: "checking…",
4580
+ },
4526
4581
  ],
4527
4582
  [
4528
4583
  { t: "mono", v: "🧬 Mutation Testing Gate" },
@@ -4532,9 +4587,9 @@
4532
4587
  },
4533
4588
  {
4534
4589
  t: "status",
4535
- v: false,
4536
- reason:
4537
- "mutation gate is disabled (quality.mutation.gate.enabled)",
4590
+ jobId: "test:mutation",
4591
+ v: null,
4592
+ reason: "checking…",
4538
4593
  },
4539
4594
  ],
4540
4595
  [
@@ -4543,7 +4598,12 @@
4543
4598
  t: "text",
4544
4599
  v: "Requires feat/fix PRs to add or extend an e2e verification spec",
4545
4600
  },
4546
- { t: "status", v: false, reason: "verify_enforced is off" },
4601
+ {
4602
+ t: "status",
4603
+ jobId: "verification_coverage",
4604
+ v: null,
4605
+ reason: "checking…",
4606
+ },
4547
4607
  ],
4548
4608
  [
4549
4609
  { t: "mono", v: "🗑️ Dead Code Detection" },
@@ -4551,7 +4611,12 @@
4551
4611
  t: "text",
4552
4612
  v: "knip — unused files, exports, and dependencies",
4553
4613
  },
4554
- { t: "status", v: true },
4614
+ {
4615
+ t: "status",
4616
+ jobId: "dead_code",
4617
+ v: null,
4618
+ reason: "checking…",
4619
+ },
4555
4620
  ],
4556
4621
  [
4557
4622
  { t: "mono", v: "🔎 AST Grep Scan" },
@@ -4559,7 +4624,12 @@
4559
4624
  t: "text",
4560
4625
  v: "Structural code rules from sgconfig.yml",
4561
4626
  },
4562
- { t: "status", v: true },
4627
+ {
4628
+ t: "status",
4629
+ jobId: "sg_scan",
4630
+ v: null,
4631
+ reason: "checking…",
4632
+ },
4563
4633
  ],
4564
4634
  [
4565
4635
  { t: "mono", v: "🔒 Security Scan" },
@@ -4567,20 +4637,31 @@
4567
4637
  t: "text",
4568
4638
  v: "Dependency audit — high and critical advisories in production dependencies",
4569
4639
  },
4570
- { t: "status", v: true },
4640
+ {
4641
+ t: "status",
4642
+ jobId: "npm_security_scan",
4643
+ v: null,
4644
+ reason: "checking…",
4645
+ },
4571
4646
  ],
4572
4647
  [
4573
4648
  { t: "mono", v: "🔍 SonarCloud SAST" },
4574
4649
  { t: "text", v: "Static analysis via SonarCloud" },
4575
- { t: "status", v: true },
4650
+ {
4651
+ t: "status",
4652
+ jobId: "sonarcloud",
4653
+ v: null,
4654
+ reason: "checking…",
4655
+ },
4576
4656
  ],
4577
4657
  [
4578
4658
  { t: "mono", v: "🛡️ Snyk" },
4579
4659
  { t: "text", v: "Snyk dependency vulnerability scan" },
4580
4660
  {
4581
4661
  t: "status",
4582
- v: false,
4583
- reason: "SNYK_TOKEN secret is not set",
4662
+ jobId: "snyk",
4663
+ v: null,
4664
+ reason: "checking…",
4584
4665
  },
4585
4666
  ],
4586
4667
  [
@@ -4589,15 +4670,21 @@
4589
4670
  t: "text",
4590
4671
  v: "Secret scanning — also a required check via the base ruleset",
4591
4672
  },
4592
- { t: "status", v: true },
4673
+ {
4674
+ t: "status",
4675
+ jobId: "secret_scanning",
4676
+ v: null,
4677
+ reason: "checking…",
4678
+ },
4593
4679
  ],
4594
4680
  [
4595
4681
  { t: "mono", v: "📜 FOSSA" },
4596
4682
  { t: "text", v: "License compliance check" },
4597
4683
  {
4598
4684
  t: "status",
4599
- v: false,
4600
- reason: "FOSSA_API_KEY secret is not set",
4685
+ jobId: "license_compliance",
4686
+ v: null,
4687
+ reason: "checking…",
4601
4688
  },
4602
4689
  ],
4603
4690
  [
@@ -4606,7 +4693,12 @@
4606
4693
  t: "text",
4607
4694
  v: "DAST baseline scan against zap_target_url with per-rule IGNORE/WARN/FAIL decisions",
4608
4695
  },
4609
- { t: "status", v: true },
4696
+ {
4697
+ t: "status",
4698
+ jobId: "zap_baseline",
4699
+ v: null,
4700
+ reason: "checking…",
4701
+ },
4610
4702
  ],
4611
4703
  [
4612
4704
  { t: "mono", v: "🧾 Compliance Validation" },
@@ -4616,8 +4708,9 @@
4616
4708
  },
4617
4709
  {
4618
4710
  t: "status",
4619
- v: false,
4620
- reason: "no compliance_framework configured",
4711
+ jobId: "compliance_validation",
4712
+ v: null,
4713
+ reason: "checking…",
4621
4714
  },
4622
4715
  ],
4623
4716
  [
@@ -4626,7 +4719,12 @@
4626
4719
  t: "text",
4627
4720
  v: "Pauses the run until the target GitHub environment’s reviewers approve",
4628
4721
  },
4629
- { t: "status", v: true },
4722
+ {
4723
+ t: "status",
4724
+ jobId: "approval_gate",
4725
+ v: null,
4726
+ reason: "checking…",
4727
+ },
4630
4728
  ],
4631
4729
  ],
4632
4730
  },
@@ -5546,13 +5644,20 @@
5546
5644
  chip.appendChild(el("span", "", esc(cell.v)));
5547
5645
  td.appendChild(chip);
5548
5646
  } else if (cell.t === "status") {
5549
- if (cell.v) {
5647
+ if (cell.jobId) td.dataset.jobId = cell.jobId;
5648
+ if (cell.v === true) {
5550
5649
  td.appendChild(el("span", "badge pass", "✓ active"));
5551
- } else {
5650
+ } else if (cell.v === false) {
5552
5651
  td.appendChild(el("span", "badge fail", "✗ off"));
5553
5652
  if (cell.reason) {
5554
5653
  td.appendChild(el("span", "status-why", esc(cell.reason)));
5555
5654
  }
5655
+ } else {
5656
+ // null/undefined = unknown — never fabricate "off" or "active"
5657
+ td.appendChild(el("span", "badge warn", "unknown"));
5658
+ if (cell.reason) {
5659
+ td.appendChild(el("span", "status-why", esc(cell.reason)));
5660
+ }
5556
5661
  }
5557
5662
  } else if (cell.t === "run") {
5558
5663
  const cls =
@@ -6152,6 +6257,58 @@
6152
6257
  "@codyswann/lisa · unknown (invalid-value: lisa-version probe returned an unusable value)"
6153
6258
  );
6154
6259
  }
6260
+ /**
6261
+ * Paint the CI Quality jobs Active column from the ci-quality-jobs probe.
6262
+ * Never leaves a fabricated active/off value when the probe is unknown.
6263
+ * @param probes - Live-status probe map from /api/status
6264
+ */
6265
+ function applyCiQualityJobs(probes) {
6266
+ const table = (DATA.sections.ci.blocks || []).find(
6267
+ block => block.type === "table" && block.card === "Quality jobs"
6268
+ );
6269
+ if (!table) return;
6270
+ const result = normalizeLiveStatusResult(
6271
+ probes && Object.hasOwn(probes, "ci-quality-jobs")
6272
+ ? probes["ci-quality-jobs"]
6273
+ : {
6274
+ state: "unknown",
6275
+ reason: "missing-probe",
6276
+ message: "The ci-quality-jobs probe was not reported",
6277
+ }
6278
+ );
6279
+ const byId = new Map();
6280
+ if (
6281
+ result.state === "value" &&
6282
+ result.value &&
6283
+ typeof result.value === "object" &&
6284
+ Array.isArray(result.value.jobs)
6285
+ ) {
6286
+ result.value.jobs.forEach(job => {
6287
+ if (job && typeof job.id === "string") byId.set(job.id, job);
6288
+ });
6289
+ }
6290
+ table.rows.forEach(cells => {
6291
+ const status = cells.find(cell => cell.t === "status" && cell.jobId);
6292
+ if (!status) return;
6293
+ if (result.state !== "value") {
6294
+ status.v = null;
6295
+ status.reason =
6296
+ result.reason + (result.message ? ": " + result.message : "");
6297
+ return;
6298
+ }
6299
+ const job = byId.get(status.jobId);
6300
+ if (!job) {
6301
+ status.v = null;
6302
+ status.reason = "missing-job: probe omitted " + status.jobId;
6303
+ return;
6304
+ }
6305
+ status.v = job.active;
6306
+ status.reason = typeof job.reason === "string" ? job.reason : "";
6307
+ });
6308
+ const current = activeSection;
6309
+ renderAll();
6310
+ showSection(current);
6311
+ }
6155
6312
  async function hydrateLiveStatuses() {
6156
6313
  try {
6157
6314
  const response = await fetch("/api/status", {
@@ -6161,14 +6318,19 @@
6161
6318
  const snapshot = await response.json();
6162
6319
  const probes = liveStatusProbeMap(snapshot);
6163
6320
  renderLiveStatuses(probes);
6321
+ // Quality jobs re-renders the page; paint the version chip after.
6322
+ applyCiQualityJobs(probes);
6164
6323
  applyLisaVersion(probes);
6165
6324
  } catch (error) {
6325
+ const message =
6326
+ error instanceof Error ? error.message : String(error);
6166
6327
  const unavailable = {
6167
6328
  state: "unknown",
6168
6329
  reason: "status-unavailable",
6169
- message: error instanceof Error ? error.message : String(error),
6330
+ message,
6170
6331
  };
6171
6332
  renderLiveStatuses({ transport: unavailable });
6333
+ applyCiQualityJobs({ "ci-quality-jobs": unavailable });
6172
6334
  applyLisaVersion({ "lisa-version": unavailable });
6173
6335
  }
6174
6336
  }