@beastmode-develeap/beastmode 0.1.19 → 0.1.21

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.
@@ -1177,6 +1177,40 @@ input[type="range"]::-webkit-slider-thumb {
1177
1177
  .badge-priority-low { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }
1178
1178
  .badge-type { background: rgba(100, 116, 139, 0.15); color: var(--text-secondary); }
1179
1179
 
1180
+ /* Overlay status badges — more prominent than standard card-badges */
1181
+ .badge-overlay {
1182
+ font-weight: 600;
1183
+ font-size: 0.7rem;
1184
+ letter-spacing: 0.02em;
1185
+ }
1186
+ .badge-overlay-stuck {
1187
+ background: rgba(248, 113, 113, 0.2);
1188
+ color: #f87171;
1189
+ border: 1px solid rgba(248, 113, 113, 0.4);
1190
+ }
1191
+ .badge-overlay-awaiting {
1192
+ background: rgba(249, 115, 22, 0.2);
1193
+ color: #f97316;
1194
+ border: 1px solid rgba(249, 115, 22, 0.4);
1195
+ }
1196
+
1197
+ /* Card-level visual treatment for overlay statuses */
1198
+ .kanban-card[data-overlay="stuck"] {
1199
+ background: rgba(248, 113, 113, 0.04);
1200
+ animation: overlay-pulse 3s ease-in-out infinite;
1201
+ }
1202
+ .kanban-card[data-overlay="awaiting-input"] {
1203
+ background: rgba(249, 115, 22, 0.04);
1204
+ border-left-color: #f97316;
1205
+ }
1206
+ @keyframes overlay-pulse {
1207
+ 0%, 100% { border-left-color: var(--danger); }
1208
+ 50% { border-left-color: rgba(248, 113, 113, 0.4); }
1209
+ }
1210
+ @media (prefers-reduced-motion: reduce) {
1211
+ .kanban-card[data-overlay="stuck"] { animation: none; }
1212
+ }
1213
+
1180
1214
  /* Board stats bar */
1181
1215
  .board-stats-bar {
1182
1216
  display: flex;
@@ -2643,6 +2677,63 @@ function priorityBadgeClass(priority) {
2643
2677
  return 'badge-priority-low';
2644
2678
  }
2645
2679
 
2680
+ function isOverlayStatus(status) {
2681
+ if (!status) return false;
2682
+ const overlays = (typeof PIPELINE_CONFIG !== 'undefined' && PIPELINE_CONFIG && PIPELINE_CONFIG.overlay_statuses)
2683
+ ? PIPELINE_CONFIG.overlay_statuses
2684
+ : ['Stuck', 'Awaiting Input'];
2685
+ return overlays.includes(status);
2686
+ }
2687
+
2688
+ function overlayBadgeClass(status) {
2689
+ if (!status) return '';
2690
+ const s = status.toLowerCase();
2691
+ if (s === 'stuck') return 'badge-overlay-stuck';
2692
+ if (s === 'awaiting input') return 'badge-overlay-awaiting';
2693
+ return '';
2694
+ }
2695
+
2696
+ function overlayBadgeLabel(status) {
2697
+ if (!status) return '';
2698
+ const s = status.toLowerCase();
2699
+ if (s === 'stuck') return '\u26A0 Stuck';
2700
+ if (s === 'awaiting input') return '\u23F3 Awaiting Input';
2701
+ return status;
2702
+ }
2703
+
2704
+ function overlayKey(status) {
2705
+ if (!status) return null;
2706
+ const s = status.toLowerCase();
2707
+ if (s === 'stuck') return 'stuck';
2708
+ if (s === 'awaiting input') return 'awaiting-input';
2709
+ return null;
2710
+ }
2711
+
2712
+ function overlayTooltip(status) {
2713
+ if (!status) return '';
2714
+ const s = status.toLowerCase();
2715
+ if (s === 'stuck') return 'Task is stuck after max retries. Comment \'reset\' to restart or investigate the failure.';
2716
+ if (s === 'awaiting input') return 'BeastMode needs your answer to a question before continuing. Check the task updates.';
2717
+ return '';
2718
+ }
2719
+
2720
+ function getEffectivePipelineColumn(item) {
2721
+ if (!isOverlayStatus(item.status)) return item.status;
2722
+ const stages = (typeof getStagesForType === 'function')
2723
+ ? getStagesForType(item.task_type)
2724
+ : [];
2725
+ if (stages.includes('Working on it')) return 'Working on it';
2726
+ if (stages.includes('In Progress')) return 'In Progress';
2727
+ return stages.find(s => s !== 'New' && s !== 'Ready') || item.status;
2728
+ }
2729
+
2730
+ window.isOverlayStatus = isOverlayStatus;
2731
+ window.overlayBadgeClass = overlayBadgeClass;
2732
+ window.overlayBadgeLabel = overlayBadgeLabel;
2733
+ window.overlayKey = overlayKey;
2734
+ window.overlayTooltip = overlayTooltip;
2735
+ window.getEffectivePipelineColumn = getEffectivePipelineColumn;
2736
+
2646
2737
  // ── HTML Content Renderer (for Monday.com update bodies) ──
2647
2738
 
2648
2739
  function _sanitizeHtml(raw) {
@@ -3585,6 +3676,7 @@ function BoardPage({ selectedProject }) {
3585
3676
  : colItems.map(item => html`
3586
3677
  <div class="kanban-card" key=${item.id}
3587
3678
  data-status=${col.status}
3679
+ data-overlay=${overlayKey(item.status) || ''}
3588
3680
  draggable="true"
3589
3681
  onDragStart=${e => onDragStart(e, item.id)}
3590
3682
  onDragEnd=${onDragEnd}>
@@ -3594,6 +3686,7 @@ function BoardPage({ selectedProject }) {
3594
3686
  <div class="card-id">#${item.id}</div>
3595
3687
  <div class="card-title" style="cursor:pointer;" onClick=${() => setSelectedItem(item)}>${item.name || item.title}</div>
3596
3688
  <div class="card-footer">
3689
+ ${isOverlayStatus(item.status) && html`<span class=${'card-badge badge-overlay ' + overlayBadgeClass(item.status)} title=${overlayTooltip(item.status)}>${overlayBadgeLabel(item.status)}</span>`}
3597
3690
  ${item.parent_epic && html`<span class="card-badge badge-epic">epic:${item.parent_epic}</span>`}
3598
3691
  ${item.priority && html`<span class=${'card-badge ' + priorityBadgeClass(item.priority)}>${item.priority}</span>`}
3599
3692
  ${item.task_type && html`<span class="card-badge badge-type">${item.task_type}</span>`}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {