@qlucent/fishi-core 0.16.2 → 0.16.5

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/dist/index.js +52 -23
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15274,10 +15274,10 @@ function getDashboardHtml() {
15274
15274
  <main>
15275
15275
  <!-- Stat cards -->
15276
15276
  <div class="stat-grid">
15277
+ <div class="card"><div class="card-label">Total Events</div><div class="card-value" id="statEvents">\u2014</div></div>
15278
+ <div class="card"><div class="card-label">Gates Passed</div><div class="card-value" id="statGates">\u2014</div></div>
15279
+ <div class="card"><div class="card-label">Checkpoints</div><div class="card-value" id="statCheckpoints">\u2014</div></div>
15277
15280
  <div class="card"><div class="card-label">Agent Completions</div><div class="card-value" id="statCompletions">\u2014</div></div>
15278
- <div class="card"><div class="card-label">Files Changed</div><div class="card-value" id="statFiles">\u2014</div></div>
15279
- <div class="card"><div class="card-label">Total Tokens</div><div class="card-value" id="statTokens">\u2014</div></div>
15280
- <div class="card"><div class="card-label">Dynamic Agents</div><div class="card-value" id="statDynamic">\u2014</div></div>
15281
15281
  </div>
15282
15282
 
15283
15283
  <!-- Phase bar -->
@@ -15300,12 +15300,12 @@ function getDashboardHtml() {
15300
15300
  <!-- Bottom row -->
15301
15301
  <div class="bottom-grid">
15302
15302
  <div class="panel">
15303
- <div class="panel-title">Tokens by Model</div>
15304
- <div id="tokensPanel"><span class="empty-msg">No data.</span></div>
15303
+ <div class="panel-title">Checkpoints</div>
15304
+ <div id="checkpointsPanel"><span class="empty-msg">No checkpoints.</span></div>
15305
15305
  </div>
15306
15306
  <div class="panel">
15307
- <div class="panel-title">Tools Used</div>
15308
- <div id="toolsPanel"><span class="empty-msg">No data.</span></div>
15307
+ <div class="panel-title">TaskBoard</div>
15308
+ <div id="taskboardPanel"><span class="empty-msg">No tasks.</span></div>
15309
15309
  </div>
15310
15310
  <div class="panel">
15311
15311
  <div class="panel-title">Gates</div>
@@ -15315,7 +15315,7 @@ function getDashboardHtml() {
15315
15315
  </main>
15316
15316
 
15317
15317
  <script>
15318
- const PHASES = ['init', 'discovery', 'planning', 'development', 'testing', 'review', 'deployed'];
15318
+ const PHASES = ['init', 'discovery', 'prd', 'architecture', 'sprint_planning', 'development', 'deployment', 'deployed'];
15319
15319
 
15320
15320
  function fmt(n) {
15321
15321
  if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
@@ -15369,12 +15369,36 @@ function getDashboardHtml() {
15369
15369
  ).join('');
15370
15370
  }
15371
15371
 
15372
- function renderKV(data, panelId, keyClass) {
15373
- const panel = document.getElementById(panelId);
15374
- const entries = Object.entries(data).sort((a, b) => b[1] - a[1]);
15375
- if (!entries.length) { panel.innerHTML = '<span class="empty-msg">No data.</span>'; return; }
15376
- panel.innerHTML = entries.map(([k, v]) =>
15377
- \`<div class="kv-row"><span class="kv-key">\${k}</span><span class="kv-val">\${fmt(v)}</span></div>\`
15372
+ function renderCheckpoints(events) {
15373
+ const panel = document.getElementById('checkpointsPanel');
15374
+ const checkpoints = events.filter(e => e.type === 'checkpoint.created').slice(-5).reverse();
15375
+ if (!checkpoints.length) { panel.innerHTML = '<span class="empty-msg">No checkpoints.</span>'; return; }
15376
+ panel.innerHTML = checkpoints.map(c =>
15377
+ \`<div class="kv-row">
15378
+ <span class="kv-key">#\${c.data?.checkpointId || '?'} \u2014 \${c.data?.phase || 'unknown'}</span>
15379
+ <span class="kv-val">\${fmtTime(c.timestamp)}</span>
15380
+ </div>\`
15381
+ ).join('');
15382
+ }
15383
+
15384
+ function renderTaskboard(events) {
15385
+ const panel = document.getElementById('taskboardPanel');
15386
+ // Get latest checkpoint with taskCounts
15387
+ const withCounts = events.filter(e => e.data?.taskCounts).reverse();
15388
+ if (!withCounts.length) { panel.innerHTML = '<span class="empty-msg">No task data.</span>'; return; }
15389
+ const tc = withCounts[0].data.taskCounts;
15390
+ const cols = [
15391
+ { name: 'Backlog', count: tc.backlog || 0, color: '#6b7280' },
15392
+ { name: 'Ready', count: tc.ready || 0, color: '#f59e0b' },
15393
+ { name: 'In Progress', count: tc.inProgress || 0, color: '#3b82f6' },
15394
+ { name: 'Review', count: tc.review || 0, color: '#a855f7' },
15395
+ { name: 'Done', count: tc.done || 0, color: '#22c55e' },
15396
+ ];
15397
+ panel.innerHTML = cols.map(c =>
15398
+ \`<div class="kv-row">
15399
+ <span class="kv-key" style="color:\${c.color}">\${c.name}</span>
15400
+ <span class="kv-val">\${c.count}</span>
15401
+ </div>\`
15378
15402
  ).join('');
15379
15403
  }
15380
15404
 
@@ -15382,10 +15406,11 @@ function getDashboardHtml() {
15382
15406
  const panel = document.getElementById('gatesPanel');
15383
15407
  if (!gates || !gates.length) { panel.innerHTML = '<span class="empty-msg">No gates.</span>'; return; }
15384
15408
  panel.innerHTML = gates.map(g => {
15385
- const cls = g.status === 'passed' ? 'passed' : g.status === 'failed' ? 'failed' : 'pending';
15409
+ const cls = g.status === 'approved' ? 'passed' : g.status === 'rejected' ? 'failed' : g.status === 'skipped' ? 'pending' : 'pending';
15410
+ const label = g.phase || g.name || 'unknown';
15386
15411
  return \`<div class="gate-row">
15387
15412
  <span class="gate-dot \${cls}"></span>
15388
- <span class="gate-name">\${g.name}</span>
15413
+ <span class="gate-name">\${label}</span>
15389
15414
  <span class="gate-status \${cls}">\${g.status}</span>
15390
15415
  </div>\`;
15391
15416
  }).join('');
@@ -15402,17 +15427,21 @@ function getDashboardHtml() {
15402
15427
  dot.classList.remove('offline');
15403
15428
 
15404
15429
  const s = data.summary || {};
15430
+ const events = data.events || [];
15431
+ const gates = data.gates || [];
15432
+
15433
+ // Stat cards
15434
+ document.getElementById('statEvents').textContent = fmt(events.length);
15435
+ document.getElementById('statGates').textContent = fmt(gates.filter(g => g.status === 'approved').length);
15436
+ document.getElementById('statCheckpoints').textContent = fmt(events.filter(e => e.type === 'checkpoint.created').length);
15405
15437
  document.getElementById('statCompletions').textContent = fmt(s.totalAgentCompletions || 0);
15406
- document.getElementById('statFiles').textContent = fmt(s.totalFilesChanged || 0);
15407
- document.getElementById('statTokens').textContent = fmt(s.totalTokens || 0);
15408
- document.getElementById('statDynamic').textContent = fmt(s.dynamicAgentsCreated || 0);
15409
15438
 
15410
15439
  renderPhase(data.phase || 'init');
15411
- renderEvents(data.events || []);
15440
+ renderEvents(events);
15412
15441
  renderAgents(data.agentSummary || {});
15413
- renderKV(s.tokensByModel || {}, 'tokensPanel');
15414
- renderKV(s.toolsUsed || {}, 'toolsPanel');
15415
- renderGates(data.gates || []);
15442
+ renderCheckpoints(events);
15443
+ renderTaskboard(events);
15444
+ renderGates(gates);
15416
15445
 
15417
15446
  lu.textContent = 'Updated: ' + new Date().toLocaleTimeString();
15418
15447
  } catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qlucent/fishi-core",
3
- "version": "0.16.2",
3
+ "version": "0.16.5",
4
4
  "description": "Shared templates, types, and generators for the FISHI framework",
5
5
  "license": "MIT",
6
6
  "type": "module",