claudeup 4.35.0 → 4.36.0
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 +4 -4
- package/src/__tests__/git-worktree.test.ts +108 -0
- package/src/__tests__/scope-squares.test.tsx +165 -0
- package/src/__tests__/theme-adaptive-colors.test.ts +307 -0
- package/src/__tests__/uppercase-keybindings.test.ts +101 -0
- package/src/__tests__/worktree-registry-resolution.test.ts +107 -0
- package/src/main.tsx +21 -5
- package/src/opentui.d.ts +21 -12
- package/src/services/claude-settings.ts +37 -7
- package/src/services/git-worktree.ts +129 -0
- package/src/services/plugin-manager.ts +10 -1
- package/src/ui/App.tsx +19 -12
- package/src/ui/adapters/pluginsAdapter.ts +174 -168
- package/src/ui/adapters/settingsAdapter.ts +119 -116
- package/src/ui/adapters/skillsAdapter.ts +203 -196
- package/src/ui/components/CategoryHeader.tsx +9 -8
- package/src/ui/components/EmptyFilterState.tsx +10 -5
- package/src/ui/components/FlagDetailEditor.tsx +0 -0
- package/src/ui/components/ScopeIndicator.tsx +10 -6
- package/src/ui/components/ScrollableList.tsx +3 -2
- package/src/ui/components/SearchInput.tsx +2 -1
- package/src/ui/components/StyledText.tsx +5 -4
- package/src/ui/components/TabBar.tsx +4 -3
- package/src/ui/components/layout/FooterHints.tsx +37 -30
- package/src/ui/components/layout/Panel.tsx +6 -5
- package/src/ui/components/layout/ProgressBar.tsx +7 -6
- package/src/ui/components/layout/ScopeTabs.tsx +6 -5
- package/src/ui/components/layout/ScreenLayout.tsx +27 -24
- package/src/ui/components/layout/index.ts +3 -3
- package/src/ui/components/modals/ConfirmModal.tsx +12 -11
- package/src/ui/components/modals/InputModal.tsx +14 -6
- package/src/ui/components/modals/LoadingModal.tsx +6 -5
- package/src/ui/components/modals/MessageModal.tsx +9 -8
- package/src/ui/components/modals/SelectModal.tsx +11 -7
- package/src/ui/components/modals/VersionMismatchModal.tsx +14 -16
- package/src/ui/components/primitives/ActionHints.tsx +26 -26
- package/src/ui/components/primitives/DetailSection.tsx +13 -12
- package/src/ui/components/primitives/KeyValueLine.tsx +9 -8
- package/src/ui/components/primitives/ListCategoryRow.tsx +25 -27
- package/src/ui/components/primitives/MetaText.tsx +3 -3
- package/src/ui/components/primitives/ScopeDetail.tsx +48 -48
- package/src/ui/components/primitives/ScopeSquares.tsx +47 -22
- package/src/ui/components/primitives/SelectableRow.tsx +22 -16
- package/src/ui/hooks/useGitignoreModal.ts +78 -74
- package/src/ui/registry.ts +11 -11
- package/src/ui/renderers/cliToolRenderers.tsx +260 -203
- package/src/ui/renderers/gitignoreRenderers.tsx +43 -42
- package/src/ui/renderers/mcpRenderers.tsx +121 -117
- package/src/ui/renderers/pluginRenderers.tsx +528 -471
- package/src/ui/renderers/profileRenderers.tsx +346 -300
- package/src/ui/renderers/settingsRenderers.tsx +183 -176
- package/src/ui/renderers/skillRenderers.tsx +410 -326
- package/src/ui/screens/AliasScreen.tsx +1336 -1309
- package/src/ui/screens/CliToolsScreen.tsx +92 -40
- package/src/ui/screens/EnvVarsScreen.tsx +19 -13
- package/src/ui/screens/GitignoreScreen.tsx +510 -493
- package/src/ui/screens/McpRegistryScreen.tsx +28 -21
- package/src/ui/screens/McpScreen.tsx +12 -3
- package/src/ui/screens/PluginsScreen.tsx +17 -7
- package/src/ui/screens/ProfilesScreen.tsx +39 -23
- package/src/ui/screens/SkillsScreen.tsx +832 -688
- package/src/ui/theme-mode.ts +73 -0
- package/src/ui/theme.ts +147 -53
|
@@ -5,141 +5,145 @@ import { theme } from "../theme.js";
|
|
|
5
5
|
// ─── List item types ───────────────────────────────────────────────────────────
|
|
6
6
|
|
|
7
7
|
export type McpListItem =
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
| { kind: "category"; label: string }
|
|
9
|
+
| { kind: "server"; server: McpServer; isInstalled: boolean };
|
|
10
10
|
|
|
11
11
|
// ─── Row renderers ─────────────────────────────────────────────────────────────
|
|
12
12
|
|
|
13
13
|
export function renderMcpRow(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
item: McpListItem,
|
|
15
|
+
_index: number,
|
|
16
|
+
isSelected: boolean,
|
|
17
17
|
): React.ReactNode {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
if (item.kind === "category") {
|
|
19
|
+
return (
|
|
20
|
+
<text fg={theme.selection.bg}>
|
|
21
|
+
<strong>
|
|
22
|
+
{"▸ "}
|
|
23
|
+
{item.label}
|
|
24
|
+
</strong>
|
|
25
|
+
</text>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
const { server, isInstalled } = item;
|
|
30
|
+
const icon = isInstalled ? "●" : "○";
|
|
31
|
+
const iconColor = isInstalled ? theme.colors.success : theme.colors.muted;
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
if (isSelected) {
|
|
34
|
+
return (
|
|
35
|
+
<text bg={theme.selection.bg} fg={theme.selection.fg}>
|
|
36
|
+
{" "}
|
|
37
|
+
{icon} {server.name}{" "}
|
|
38
|
+
</text>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
</text>
|
|
47
|
-
);
|
|
42
|
+
return (
|
|
43
|
+
<text fg={theme.colors.text}>
|
|
44
|
+
<span fg={iconColor}>{icon}</span>
|
|
45
|
+
<span fg={theme.colors.text}> {server.name}</span>
|
|
46
|
+
{server.requiresConfig ? <span fg={theme.colors.warning}> ⚙</span> : null}
|
|
47
|
+
</text>
|
|
48
|
+
);
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
// ─── Detail renderer ───────────────────────────────────────────────────────────
|
|
51
52
|
|
|
52
53
|
export function renderMcpDetail(
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
item: McpListItem | undefined,
|
|
55
|
+
loading: boolean,
|
|
55
56
|
): React.ReactNode {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
if (loading) {
|
|
58
|
+
return <text fg={theme.colors.muted}>Loading MCP servers...</text>;
|
|
59
|
+
}
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
61
|
+
if (!item || item.kind === "category") {
|
|
62
|
+
return (
|
|
63
|
+
<box
|
|
64
|
+
flexDirection="column"
|
|
65
|
+
alignItems="center"
|
|
66
|
+
justifyContent="center"
|
|
67
|
+
flexGrow={1}
|
|
68
|
+
>
|
|
69
|
+
<text fg={theme.colors.muted}>Select a server to see details</text>
|
|
70
|
+
</box>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
const { server, isInstalled } = item;
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
76
|
+
return (
|
|
77
|
+
<box flexDirection="column">
|
|
78
|
+
<box marginBottom={1}>
|
|
79
|
+
<text fg={theme.colors.info}>
|
|
80
|
+
<strong>
|
|
81
|
+
{"⚡ "}
|
|
82
|
+
{server.name}
|
|
83
|
+
</strong>
|
|
84
|
+
</text>
|
|
85
|
+
{server.requiresConfig ? (
|
|
86
|
+
<text fg={theme.colors.warning}> ⚙</text>
|
|
87
|
+
) : null}
|
|
88
|
+
</box>
|
|
85
89
|
|
|
86
|
-
|
|
90
|
+
<text fg={theme.colors.muted}>{server.description}</text>
|
|
87
91
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
92
|
+
<box marginTop={1} flexDirection="column">
|
|
93
|
+
<box>
|
|
94
|
+
<text fg={theme.colors.muted}>{"Status "}</text>
|
|
95
|
+
{isInstalled ? (
|
|
96
|
+
<text fg={theme.colors.success}>{"● Installed"}</text>
|
|
97
|
+
) : (
|
|
98
|
+
<text fg={theme.colors.muted}>{"○ Not installed"}</text>
|
|
99
|
+
)}
|
|
100
|
+
</box>
|
|
101
|
+
<box>
|
|
102
|
+
<text fg={theme.colors.muted}>{"Type "}</text>
|
|
103
|
+
<text fg={theme.colors.text}>
|
|
104
|
+
{server.type === "http" ? "HTTP" : "Command"}
|
|
105
|
+
</text>
|
|
106
|
+
</box>
|
|
107
|
+
{server.type === "http" ? (
|
|
108
|
+
<box>
|
|
109
|
+
<text fg={theme.colors.muted}>{"URL "}</text>
|
|
110
|
+
<text fg={theme.colors.link}>{server.url}</text>
|
|
111
|
+
</box>
|
|
112
|
+
) : (
|
|
113
|
+
<box>
|
|
114
|
+
<text fg={theme.colors.muted}>{"Command "}</text>
|
|
115
|
+
<text fg={theme.colors.info}>{server.command}</text>
|
|
116
|
+
</box>
|
|
117
|
+
)}
|
|
118
|
+
{server.requiresConfig ? (
|
|
119
|
+
<box>
|
|
120
|
+
<text fg={theme.colors.muted}>{"Config "}</text>
|
|
121
|
+
<text fg={theme.colors.warning}>
|
|
122
|
+
{server.configFields?.length ?? 0} fields required
|
|
123
|
+
</text>
|
|
124
|
+
</box>
|
|
125
|
+
) : null}
|
|
126
|
+
</box>
|
|
123
127
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
128
|
+
<box marginTop={2}>
|
|
129
|
+
{isInstalled ? (
|
|
130
|
+
<box>
|
|
131
|
+
<text bg={theme.colors.danger} fg={theme.hints.fg}>
|
|
132
|
+
{" "}
|
|
133
|
+
Enter{" "}
|
|
134
|
+
</text>
|
|
135
|
+
<text fg={theme.colors.muted}> Remove server</text>
|
|
136
|
+
</box>
|
|
137
|
+
) : (
|
|
138
|
+
<box>
|
|
139
|
+
<text bg={theme.colors.success} fg={theme.hints.fg}>
|
|
140
|
+
{" "}
|
|
141
|
+
Enter{" "}
|
|
142
|
+
</text>
|
|
143
|
+
<text fg={theme.colors.muted}> Install server</text>
|
|
144
|
+
</box>
|
|
145
|
+
)}
|
|
146
|
+
</box>
|
|
147
|
+
</box>
|
|
148
|
+
);
|
|
145
149
|
}
|