@axiomatic-labs/claudeflow 2.13.79 → 2.13.81

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 (2) hide show
  1. package/lib/panel.js +26 -14
  2. package/package.json +1 -1
package/lib/panel.js CHANGED
@@ -1037,6 +1037,16 @@ function severityFor(id) {
1037
1037
  if (s.observer.servers && s.observer.servers.some((sr) => sr.status === 'unhealthy' || sr.status === 'exited')) return 'warn';
1038
1038
  return 'ok';
1039
1039
  }
1040
+ case 'validators': {
1041
+ if (!s.validators || !s.validators.available) return 'info';
1042
+ // Block > error > pass > skip. Block is the actionable state — the
1043
+ // hook actually halted the agent. Surface it the same way Observer
1044
+ // surfaces unresolved incidents (warn = amber dot in the nav).
1045
+ if (s.validators.stats && s.validators.stats.block > 0) return 'warn';
1046
+ if (s.validators.stats && s.validators.stats.error > 0) return 'warn';
1047
+ if (s.validators.stats && s.validators.stats.pass > 0) return 'ok';
1048
+ return 'info';
1049
+ }
1040
1050
  case 'setupContext': return !s.setupContext.exists ? 'err' : (s.setupContext.toolingComplete ? 'ok' : 'warn');
1041
1051
  case 'activeRun': return s.activeRun.active ? 'info' : 'info';
1042
1052
  case 'doctor': return s.doctor.issueCount > 0 ? 'warn' : 'ok';
@@ -1669,19 +1679,23 @@ function renderValidators() {
1669
1679
 
1670
1680
  const validators = [...new Set(v.runs.map((r) => r.validator))].sort();
1671
1681
  const scopes = [...new Set(v.runs.map((r) => r.scope))].sort();
1682
+ // Reuse the observer-filter CSS class so the Validators tab matches
1683
+ // the visual language of the Observer tab. Pre-v2.13.80 the pills used
1684
+ // a non-existent pill class, falling back to default browser button
1685
+ // styling — light buttons on dark background.
1672
1686
  const validatorPill = (label, value, count) => {
1673
1687
  const a = (validatorsFilter === value);
1674
- const cls = a ? 'pill pill-active' : 'pill';
1688
+ const cls = a ? 'observer-filter active' : 'observer-filter';
1675
1689
  return \`<button class="\${cls}" data-validators-filter="\${escapeHtml(value)}">\${escapeHtml(label)}<span class="muted" style="margin-left:6px;font-size:11px;">\${count}</span></button>\`;
1676
1690
  };
1677
1691
  const statusPill = (label, value, count) => {
1678
1692
  const a = (validatorsStatusFilter === value);
1679
- const cls = a ? 'pill pill-active' : 'pill';
1693
+ const cls = a ? 'observer-filter active' : 'observer-filter';
1680
1694
  return \`<button class="\${cls}" data-validators-status-filter="\${escapeHtml(value)}">\${escapeHtml(label)}<span class="muted" style="margin-left:6px;font-size:11px;">\${count}</span></button>\`;
1681
1695
  };
1682
1696
  const scopePill = (label, value, count) => {
1683
1697
  const a = (validatorsScopeFilter === value);
1684
- const cls = a ? 'pill pill-active' : 'pill';
1698
+ const cls = a ? 'observer-filter active' : 'observer-filter';
1685
1699
  return \`<button class="\${cls}" data-validators-scope-filter="\${escapeHtml(value)}">\${escapeHtml(label)}<span class="muted" style="margin-left:6px;font-size:11px;">\${count}</span></button>\`;
1686
1700
  };
1687
1701
 
@@ -1738,21 +1752,19 @@ function renderValidators() {
1738
1752
  ? 'Clear all history'
1739
1753
  : \`Clear "\${escapeHtml(validatorsScopeFilter)}" history\`;
1740
1754
 
1755
+ const filterRow = (label, pillsHtml) => \`<div style="display:flex;align-items:center;gap:10px;margin:6px 0;flex-wrap:wrap;">
1756
+ <span class="muted" style="font-size:11px;text-transform:uppercase;letter-spacing:0.5px;min-width:74px;">\${label}</span>
1757
+ <div style="display:flex;gap:6px;flex-wrap:wrap;">\${pillsHtml}</div>
1758
+ </div>\`;
1759
+
1741
1760
  return \`<h2>Validators
1742
1761
  <button id="clear-validators" class="btn btn-ghost" style="float:right;font-size:12px;" data-scope="\${escapeHtml(validatorsScopeFilter)}">\${clearLabel}</button>
1743
1762
  </h2>
1744
1763
  <p class="muted" style="margin-top:0;">Last updated \${formatRelativeTime(v.updated_at)} · \${v.stats.total} total run(s): \${v.stats.pass} pass, \${v.stats.block} block, \${v.stats.skip} skip, \${v.stats.error} error.</p>
1745
- <div style="margin:12px 0;">
1746
- <div style="margin-bottom:6px;"><span class="muted" style="font-size:11px;text-transform:uppercase;">Validator</span></div>
1747
- \${validatorPills}
1748
- </div>
1749
- <div style="margin:12px 0;">
1750
- <div style="margin-bottom:6px;"><span class="muted" style="font-size:11px;text-transform:uppercase;">Scope</span></div>
1751
- \${scopePills}
1752
- </div>
1753
- <div style="margin:12px 0;">
1754
- <div style="margin-bottom:6px;"><span class="muted" style="font-size:11px;text-transform:uppercase;">Status</span></div>
1755
- \${statusPills}
1764
+ <div class="card" style="padding:10px 14px;margin:12px 0;">
1765
+ \${filterRow('Validator', validatorPills)}
1766
+ \${filterRow('Scope', scopePills)}
1767
+ \${filterRow('Status', statusPills)}
1756
1768
  </div>
1757
1769
  <div class="card" style="padding:0;">\${runRows || '<p class="muted" style="padding:12px;">No runs match the current filter.</p>'}</div>\`;
1758
1770
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiomatic-labs/claudeflow",
3
- "version": "2.13.79",
3
+ "version": "2.13.81",
4
4
  "description": "Claudeflow — AI-powered development toolkit for Claude Code. Skills, agents, hooks, and quality gates that ship production apps.",
5
5
  "bin": {
6
6
  "claudeflow": "./bin/cli.js"