[object Object]

← back to build-pages

home: top skills + agents rail (fleet-wide tallies surfaced as chips)

83d2712c6a2ebf2381698225f1b6b02613f8a905 · 2026-05-13 17:03:40 -0700 · SteveStudio2

Files touched

Diff

commit 83d2712c6a2ebf2381698225f1b6b02613f8a905
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Wed May 13 17:03:40 2026 -0700

    home: top skills + agents rail (fleet-wide tallies surfaced as chips)
---
 server.js     | 32 ++++++++++++++++++++++++++++++++
 test/smoke.js |  1 +
 2 files changed, 33 insertions(+)

diff --git a/server.js b/server.js
index 7fb8da8..a224341 100644
--- a/server.js
+++ b/server.js
@@ -357,6 +357,38 @@ app.get('/', async (req, res, next) => {
         <p id="bp-recent-meta" class="bp-meta">auto-refreshes every 60s</p>
       </section>
 
+      <section class="bp-section">
+        <h2>Top skills + agents across the fleet</h2>
+        <p class="bp-meta">Auto-extracted from commit messages — how often each skill/agent has been invoked across all 4 build journals.</p>
+        <div class="bp-grid">
+          <div>
+            <h3 style="font-size:15px;margin:0 0 10px;">Skills</h3>
+            <ul class="bp-chips">${(() => {
+              const tallies = new Map();
+              for (const e of entries) {
+                const b = _projectCache.get(e.slug);
+                if (!b) continue;
+                for (const f of b.facets.skills) tallies.set(f.name, (tallies.get(f.name) || 0) + f.count);
+              }
+              return [...tallies.entries()].sort((a,b)=>b[1]-a[1]).slice(0,15).map(([n,c]) => `<li><span>/${esc(n)}</span><b>${c}</b></li>`).join('');
+            })()}</ul>
+          </div>
+          <div>
+            <h3 style="font-size:15px;margin:0 0 10px;">Agents</h3>
+            <ul class="bp-chips">${(() => {
+              const tallies = new Map();
+              for (const e of entries) {
+                const b = _projectCache.get(e.slug);
+                if (!b) continue;
+                for (const f of b.facets.agents) tallies.set(f.name, (tallies.get(f.name) || 0) + f.count);
+              }
+              const out = [...tallies.entries()].sort((a,b)=>b[1]-a[1]).slice(0,15);
+              return out.length ? out.map(([n,c]) => `<li><span>${esc(n)}</span><b>${c}</b></li>`).join('') : '<li class="bp-meta">none detected</li>';
+            })()}</ul>
+          </div>
+        </div>
+      </section>
+
       <section class="bp-section">
         <h2>Search the whole fleet</h2>
         <input id="fleet-q" class="bp-q" type="search" placeholder="search every commit across every project…" autocomplete="off" value="${esc(typeof req.query.q === 'string' ? req.query.q : '')}">
diff --git a/test/smoke.js b/test/smoke.js
index ec363cc..7069136 100644
--- a/test/smoke.js
+++ b/test/smoke.js
@@ -93,6 +93,7 @@ function check(name, cond, hint = '') {
   check('home: fleet totals',      /\d+ projects · \d+ commits · \d+ design-rationale ideas/.test(r.body));
   check('home: recent rail',       /Recent across the fleet/.test(r.body));
   check('home: theme-color',       /name="theme-color"/.test(r.body));
+  check('home: top skills rail',   /Top skills \+ agents/.test(r.body));
   check('home: canonical',         /rel="canonical"/.test(r.body));
   check('home: og:title',          /property="og:title"/.test(r.body));
   check('home: WebSite JSON-LD',   /"@type":"WebSite"/.test(r.body));

← 232a253 api: /api/fleet/{agents,skills} — cross-project aggregated f  ·  back to build-pages  ·  home: velocity counter (commits in last 24h + last 7d) — 200 1af9c2a →