@beastmode-develeap/beastmode 0.1.244 → 0.1.246

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__ = "20260514-091159-13e57a0";</script>
18
+ <script>window.__BUILD_STAMP__ = "20260514-103241-7d6137c";</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">
@@ -463,7 +463,7 @@ body {
463
463
  min-height: 0;
464
464
  }
465
465
  .page-dashboard-main { min-width: 0; }
466
- .page-dashboard-sidebar { min-width: 0; }
466
+ .page-dashboard-sidebar { min-width: 0; max-height: calc(100vh - 120px); overflow-y: auto; }
467
467
 
468
468
  .page-centered {
469
469
  max-width: 800px;
@@ -3172,16 +3172,11 @@ input[type="range"]::-webkit-slider-thumb {
3172
3172
  }
3173
3173
  .activity-list-wrapper {
3174
3174
  position: relative;
3175
+ max-height: 320px;
3176
+ overflow-y: auto;
3175
3177
  }
3176
3178
  .activity-list-wrapper::after {
3177
- content: '';
3178
- position: absolute;
3179
- bottom: 0;
3180
- left: 0;
3181
- right: 0;
3182
- height: 24px;
3183
- background: linear-gradient(transparent, var(--bg-card));
3184
- pointer-events: none;
3179
+ display: none;
3185
3180
  }
3186
3181
  /* Scenario × Environment Matrix */
3187
3182
  .scenario-matrix-wrapper {
@@ -5575,9 +5570,28 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject, all
5575
5570
  const [envTimeline, setEnvTimeline] = useState(null);
5576
5571
  const [deployModal, setDeployModal] = useState(null);
5577
5572
  const [auditEvents, setAuditEvents] = useState([]);
5573
+ const [pipelineConfig, setPipelineConfig] = useState(null);
5574
+ const [statusError, setStatusError] = useState('');
5578
5575
  const sidebarRef = useRef(null);
5579
5576
  const topCommentRef = useRef(null);
5580
5577
 
5578
+ useEffect(() => {
5579
+ api('GET', '/api/pipeline-config')
5580
+ .then(data => setPipelineConfig(data))
5581
+ .catch(() => {});
5582
+ }, []);
5583
+
5584
+ const validStatuses = useMemo(() => {
5585
+ if (!pipelineConfig) return STATUSES;
5586
+ const typeStages = pipelineConfig.type_stages || {};
5587
+ const taskType = item.task_type || 'code';
5588
+ const stages = typeStages[taskType] || typeStages['code'] || STATUSES;
5589
+ const overlays = new Set(pipelineConfig.overlay_statuses || []);
5590
+ const allowed = new Set([...stages, ...overlays, 'Superseded']);
5591
+ if (item.status) allowed.add(item.status);
5592
+ return STATUSES.filter(s => allowed.has(s));
5593
+ }, [pipelineConfig, item.task_type, item.status]);
5594
+
5581
5595
  useEffect(() => {
5582
5596
  if (!item || !item.extra || !item.extra.current_env) {
5583
5597
  setEnvTimeline(null);
@@ -5806,6 +5820,7 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject, all
5806
5820
  disabled=${item.status === 'Superseded'}
5807
5821
  onChange=${async (e) => {
5808
5822
  const newStatus = e.target.value;
5823
+ setStatusError('');
5809
5824
  if (newStatus === 'Superseded') {
5810
5825
  e.target.value = item.status || 'New';
5811
5826
  setShowSupersededModal(true);
@@ -5814,10 +5829,20 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject, all
5814
5829
  try {
5815
5830
  await api('PATCH', '/api/board/items/' + item.id, { status: newStatus });
5816
5831
  onStatusChange();
5817
- } catch (err) { /* ignore */ }
5832
+ } catch (err) {
5833
+ e.target.value = item.status || 'New';
5834
+ const msg = (err && err.message) || 'Status change failed';
5835
+ setStatusError(msg);
5836
+ setTimeout(() => setStatusError(''), 5000);
5837
+ }
5818
5838
  }}>
5819
- ${STATUSES.map(s => html`<option value=${s} selected=${s === (item.status || 'New')}>${s}</option>`)}
5839
+ ${validStatuses.map(s => html`<option value=${s} selected=${s === (item.status || 'New')}>${s}</option>`)}
5820
5840
  </select>
5841
+ ${statusError && html`
5842
+ <div role="alert" style="color:var(--danger);font-size:11px;margin-top:4px;" data-testid="status-error">
5843
+ ${statusError}
5844
+ </div>
5845
+ `}
5821
5846
 
5822
5847
  <label>Priority</label>
5823
5848
  <select value=${item.priority || ''} onChange=${async (e) => {
@@ -1 +1 @@
1
- 13e57a052f9da6851f746fab720b7527890ac623
1
+ 7d6137c1ec2a4cae70c081689966638e519ff2e4
@@ -1 +1 @@
1
- 20260514-091159-13e57a0
1
+ 20260514-103241-7d6137c
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.244",
3
+ "version": "0.1.246",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {