@beastmode-develeap/beastmode 0.1.276 → 0.1.278

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__ = "20260516-135653-88d25be";</script>
18
+ <script>window.__BUILD_STAMP__ = "20260516-141637-ce6d7e2";</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">
@@ -1259,6 +1259,11 @@ input[type="range"]::-webkit-slider-thumb {
1259
1259
  .card-status-age.status-age-info { color: var(--accent); background: var(--accent-subtle); }
1260
1260
  .card-status-age.status-age-warn { color: #fb923c; background: rgba(249, 115, 22, 0.15); }
1261
1261
  .card-status-age.status-age-stale { color: #f87171; background: rgba(239, 68, 68, 0.15); }
1262
+ .card-badge-wrap {
1263
+ /* Flex child wrapper: blockified by parent flex, but sized to content.
1264
+ The inner .card-badge is NOT a direct flex item, so it keeps display:inline-block. */
1265
+ line-height: 0;
1266
+ }
1262
1267
  .card-badge {
1263
1268
  display: inline-block;
1264
1269
  padding: 2px 8px;
@@ -6319,7 +6324,7 @@ function PipelineView({
6319
6324
  ${(() => {
6320
6325
  const cost = costsByItem && costsByItem[String(item.id)];
6321
6326
  const label = cost ? formatCost(cost.total_cost_usd) : null;
6322
- return label ? html`<span class="card-badge badge-cost" title=${'Total cost: ' + label}>${label}</span>` : null;
6327
+ return label ? html`<span class="card-badge-wrap"><span class="card-badge badge-cost" title=${'Total cost: ' + label}>${label}</span></span>` : null;
6323
6328
  })()}
6324
6329
  ${(() => {
6325
6330
  const env = item.extra && item.extra.current_env;
@@ -6736,8 +6741,7 @@ function BoardPage({ selectedProject }) {
6736
6741
  // append ?board=<proj> here. Errors are swallowed: if the cost
6737
6742
  // batch endpoint is unreachable, cards render without badges.
6738
6743
  const fetchCosts = useCallback(() => {
6739
- const proj = localStorage.getItem('beastmode-selected-project') || '';
6740
- const boardParam = (proj && proj !== 'all') ? '?board=' + encodeURIComponent(proj) : '';
6744
+ const boardParam = (selectedProject && selectedProject !== 'all') ? '?board=' + encodeURIComponent(selectedProject) : '';
6741
6745
  fetch('/api/costs/by-items' + boardParam)
6742
6746
  .then(r => r.ok ? r.json() : {})
6743
6747
  .then(data => setCostsByItem(data || {}))
@@ -7531,7 +7535,7 @@ function BoardPage({ selectedProject }) {
7531
7535
  ${(() => {
7532
7536
  const cost = costsByItem && costsByItem[String(item.id)];
7533
7537
  const label = cost ? formatCost(cost.total_cost_usd) : null;
7534
- return label ? html`<span class="card-badge badge-cost" title=${'Total cost: ' + label}>${label}</span>` : null;
7538
+ return label ? html`<span class="card-badge-wrap"><span class="card-badge badge-cost" title=${'Total cost: ' + label}>${label}</span></span>` : null;
7535
7539
  })()}
7536
7540
  ${(() => {
7537
7541
  const env = item.extra && item.extra.current_env;
@@ -11740,6 +11744,24 @@ function App() {
11740
11744
  setSelectedProjectRaw(value);
11741
11745
  }, []);
11742
11746
 
11747
+ // Auto-select the first registered project when localStorage has no prior
11748
+ // choice. Without this, items and costs both route to the default board
11749
+ // (board.db) which doesn't match project board data — no badges render in
11750
+ // a fresh Playwright or incognito session. Multi-project factories default
11751
+ // to the first registered project; users can override via the sidebar.
11752
+ useEffect(() => {
11753
+ if (localStorage.getItem('beastmode-selected-project')) return;
11754
+ fetch('/api/projects')
11755
+ .then(r => r.ok ? r.json() : null)
11756
+ .then(data => {
11757
+ const projects = data && data.projects;
11758
+ if (Array.isArray(projects) && projects.length > 0) {
11759
+ setSelectedProject(projects[0].name);
11760
+ }
11761
+ })
11762
+ .catch(() => {});
11763
+ }, []);
11764
+
11743
11765
  // If ?view=pipeline or ?view=board is in the URL but no hash route is
11744
11766
  // set, the router would default to Dashboard. Redirect to #/board so
11745
11767
  // the board page renders (and BoardPage can read the ?view= param).
@@ -1 +1 @@
1
- 88d25be900a29498978af616d9a62157536b9fd4
1
+ ce6d7e276739e5c17a98d18b9389d76eacab4db0
@@ -1 +1 @@
1
- 20260516-135653-88d25be
1
+ 20260516-141637-ce6d7e2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.276",
3
+ "version": "0.1.278",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {