claudeup 4.39.0 → 4.39.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudeup",
3
- "version": "4.39.0",
3
+ "version": "4.39.1",
4
4
  "description": "TUI tool for managing Claude Code plugins, MCPs, and configuration",
5
5
  "type": "module",
6
6
  "main": "src/main.tsx",
@@ -64,8 +64,8 @@
64
64
  "typescript": "^5.6.3"
65
65
  },
66
66
  "optionalDependencies": {
67
- "claudeup-darwin-arm64": "4.39.0",
68
- "claudeup-darwin-x64": "4.39.0",
69
- "claudeup-linux-x64": "4.39.0"
67
+ "claudeup-darwin-arm64": "4.39.1",
68
+ "claudeup-darwin-x64": "4.39.1",
69
+ "claudeup-linux-x64": "4.39.1"
70
70
  }
71
71
  }
@@ -29,18 +29,35 @@ export function CategoryHeader({
29
29
  const countBadge = count !== undefined ? ` (${count})` : "";
30
30
  const statusText = status ? ` ${status}` : "";
31
31
 
32
- // Simple format without dynamic line calculation
32
+ // Flex row instead of one flat <text>: a flat text wraps when the pane is
33
+ // narrower than the row ("by MadAppGang" lost its final character and the wrap
34
+ // shifted every item below by one line). Here the dash filler is the only
35
+ // element allowed to shrink to nothing, so the badge survives at any width
36
+ // and the title clips last.
33
37
  return (
34
- <text fg={theme.colors.text}>
35
- <span fg={theme.colors.muted}>{expandIcon}</span>
36
- <span fg={theme.colors.text}>
37
- <strong> {title}</strong>
38
- </span>
39
- <span fg={theme.colors.muted}>{versionBadge}</span>
40
- <span fg={theme.colors.muted}>{countBadge}</span>
41
- <span fg={theme.colors.border}> ────</span>
42
- <span fg={statusColor}>{statusText}</span>
43
- </text>
38
+ <box flexDirection="row" width="100%" height={1} overflow="hidden">
39
+ <box flexShrink={1} minWidth={4} overflow="hidden" height={1}>
40
+ <text fg={theme.colors.text}>
41
+ <span fg={theme.colors.muted}>{expandIcon}</span>
42
+ <span fg={theme.colors.text}>
43
+ <strong> {title}</strong>
44
+ </span>
45
+ <span fg={theme.colors.muted}>{versionBadge}</span>
46
+ <span fg={theme.colors.muted}>{countBadge}</span>
47
+ </text>
48
+ </box>
49
+ {/* flexShrink 100: the filler must be the first thing sacrificed. With equal
50
+ shrink factors yoga takes width from the (larger-basis) title first, which
51
+ clipped a character off the title while all four dashes survived. */}
52
+ <box flexShrink={100} minWidth={0} overflow="hidden" height={1}>
53
+ <text fg={theme.colors.border}> ────</text>
54
+ </box>
55
+ {status ? (
56
+ <box flexShrink={0} height={1}>
57
+ <text fg={statusColor}>{statusText}</text>
58
+ </box>
59
+ ) : null}
60
+ </box>
44
61
  );
45
62
  }
46
63
 
@@ -70,6 +70,14 @@ export function ScrollableList<T>({
70
70
  <box
71
71
  key={getKey ? getKey(item, originalIndex) : `${originalIndex}`}
72
72
  width="100%"
73
+ // height=1 is load-bearing, not cosmetic. overflow="hidden" alone clips
74
+ // CONTENT but lets the box GROW: an over-wide <text> wraps to a second
75
+ // line, the row becomes two lines tall, and every item below shifts —
76
+ // which rendered as a phantom blank line under "Magus Marketing" and
77
+ // the last two plugins composited onto one row. The list's scroll math
78
+ // assumes one line per item; this makes that assumption true.
79
+ height={1}
80
+ flexShrink={0}
73
81
  overflow="hidden"
74
82
  >
75
83
  {renderItem(item, originalIndex, originalIndex === selectedIndex)}