@beastmode-develeap/beastmode 0.1.311 → 0.1.313

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.
@@ -15,7 +15,7 @@
15
15
  }
16
16
  </script>
17
17
  <!--BOARD_DATA-->
18
- <script>window.__BUILD_STAMP__ = "20260529-035638-2e3404c";</script>
18
+ <script>window.__BUILD_STAMP__ = "20260529-052503-1d6b0d6";</script>
19
19
  <link rel="preconnect" href="https://fonts.googleapis.com">
20
20
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
21
21
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
@@ -3551,6 +3551,76 @@ input[type="range"]::-webkit-slider-thumb {
3551
3551
  .loading-text { font-size: 13px; color: var(--text-muted); }
3552
3552
  .empty-text { font-size: 13px; color: var(--text-muted); }
3553
3553
 
3554
+ /* Timeline rail */
3555
+ .timeline-rail {
3556
+ position: relative;
3557
+ padding-left: 32px;
3558
+ }
3559
+ .timeline-rail::before {
3560
+ content: '';
3561
+ position: absolute;
3562
+ left: 11px;
3563
+ top: 16px;
3564
+ bottom: 16px;
3565
+ width: 2px;
3566
+ background: var(--border);
3567
+ }
3568
+ .timeline-rail.single-entry::before {
3569
+ display: none;
3570
+ }
3571
+
3572
+ /* Timeline node */
3573
+ .timeline-node {
3574
+ position: relative;
3575
+ margin-bottom: 8px;
3576
+ }
3577
+ .timeline-dot {
3578
+ position: absolute;
3579
+ left: -25px;
3580
+ top: 14px;
3581
+ width: 8px;
3582
+ height: 8px;
3583
+ border-radius: 50%;
3584
+ background: var(--accent);
3585
+ border: 2px solid var(--bg-card);
3586
+ z-index: 1;
3587
+ }
3588
+ .timeline-dot.dot-system { background: var(--text-muted); }
3589
+ .timeline-dot.dot-bot { background: var(--accent); }
3590
+ .timeline-dot.dot-user { background: var(--info); }
3591
+
3592
+ /* Author badge */
3593
+ .timeline-author-badge {
3594
+ display: inline-block;
3595
+ font-size: 9px;
3596
+ font-weight: 700;
3597
+ letter-spacing: 0.5px;
3598
+ padding: 1px 5px;
3599
+ border-radius: 3px;
3600
+ margin-left: 6px;
3601
+ vertical-align: middle;
3602
+ }
3603
+ .timeline-author-badge.badge-sys {
3604
+ background: var(--bg-input);
3605
+ color: var(--text-muted);
3606
+ }
3607
+ .timeline-author-badge.badge-bot {
3608
+ background: var(--accent-subtle);
3609
+ color: var(--accent);
3610
+ }
3611
+ .timeline-author-badge.badge-user {
3612
+ background: var(--info-subtle);
3613
+ color: var(--info);
3614
+ }
3615
+
3616
+ /* Timeline time label (left gutter) */
3617
+ .timeline-time-gutter {
3618
+ position: absolute;
3619
+ left: -32px;
3620
+ top: 14px;
3621
+ width: 0;
3622
+ }
3623
+
3554
3624
  /* ================================================================
3555
3625
  CREATE TASK MODAL
3556
3626
  ================================================================ */
@@ -5105,6 +5175,14 @@ function CollapsibleUpdate({ html: content }) {
5105
5175
 
5106
5176
  // ── Update Item with threaded replies ──
5107
5177
 
5178
+ function classifyAuthor(creatorName) {
5179
+ const name = (creatorName || '').toLowerCase().trim();
5180
+ if (name === 'system') return { badge: 'SYS', dotClass: 'dot-system', badgeClass: 'badge-sys' };
5181
+ if (name === 'beastmode' || name === 'pipeline' || name.startsWith('daemon'))
5182
+ return { badge: 'BOT', dotClass: 'dot-bot', badgeClass: 'badge-bot' };
5183
+ return { badge: 'USER', dotClass: 'dot-user', badgeClass: 'badge-user' };
5184
+ }
5185
+
5108
5186
  function UpdateItemWithReplies({ update }) {
5109
5187
  const [replies, setReplies] = useState([]);
5110
5188
  const [showReplies, setShowReplies] = useState(false);
@@ -5136,12 +5214,16 @@ function UpdateItemWithReplies({ update }) {
5136
5214
  setPosting(false);
5137
5215
  };
5138
5216
 
5217
+ const { badge, dotClass, badgeClass } = classifyAuthor(update.creator_name || (update.creator && update.creator.name));
5139
5218
  return html`
5140
- <div class="update-item" style="padding:12px;background:var(--bg-input);border-radius:var(--radius-sm);margin-bottom:8px;">
5141
- <div class="update-author" style="font-size:11px;font-weight:600;color:var(--accent);margin-bottom:4px;">
5142
- ${update.creator_name || (update.creator && update.creator.name) || 'system'}
5143
- </div>
5144
- <${CollapsibleUpdate} html=${update.body || update.text_body || ''} />
5219
+ <div class="timeline-node">
5220
+ <span class=${'timeline-dot ' + dotClass} aria-hidden="true"></span>
5221
+ <div class="update-item" style="padding:12px;background:var(--bg-input);border-radius:var(--radius-sm);margin-bottom:8px;">
5222
+ <div class="update-author" style="font-size:11px;font-weight:600;color:var(--accent);margin-bottom:4px;">
5223
+ ${update.creator_name || (update.creator && update.creator.name) || 'system'}
5224
+ <span class=${'timeline-author-badge ' + badgeClass}>${badge}</span>
5225
+ </div>
5226
+ <${CollapsibleUpdate} html=${update.body || update.text_body || ''} />
5145
5227
  <div style="display:flex;justify-content:space-between;align-items:center;margin-top:6px;">
5146
5228
  <div class="update-time" style="font-size:11px;color:var(--text-muted);font-family:var(--font-mono);">
5147
5229
  ${timeAgo(update.created_at)}
@@ -5180,6 +5262,7 @@ function UpdateItemWithReplies({ update }) {
5180
5262
  </div>
5181
5263
  </div>
5182
5264
  ` : null}
5265
+ </div>
5183
5266
  </div>
5184
5267
  `;
5185
5268
  }
@@ -6195,9 +6278,11 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject, all
6195
6278
  <${UpdatesHeader} count=${updates.length} sortNewest=${sortNewest} onToggle=${() => setSortNewest(!sortNewest)} itemId=${item.id} onPosted=${refreshUpdates} />
6196
6279
  ${loadingUpdates ? html`<div class="loading-text">Loading updates...</div>` :
6197
6280
  sortedUpdates.length === 0 ? html`<div class="empty-text">No updates yet</div>` :
6198
- sortedUpdates.map((u, i) => html`
6199
- <${UpdateItemWithReplies} key=${u.id || i} update=${u} />
6200
- `)
6281
+ html`<div class=${'timeline-rail' + (sortedUpdates.length <= 1 ? ' single-entry' : '')}>
6282
+ ${sortedUpdates.map((u, i) => html`
6283
+ <${UpdateItemWithReplies} key=${u.id || i} update=${u} />
6284
+ `)}
6285
+ </div>`
6201
6286
  }
6202
6287
  </div>
6203
6288
  <div style="border-top:1px solid var(--border);padding:0 24px 16px;">
@@ -1 +1 @@
1
- 2e3404ced4ff646069b5675177544d3b030cab78
1
+ 1d6b0d68b3e42c5cb2167ffa1e7a4db72a439f82
@@ -1 +1 @@
1
- 20260529-035638-2e3404c
1
+ 20260529-052503-1d6b0d6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.311",
3
+ "version": "0.1.313",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {