claudeup 4.0.0 → 4.1.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 +1 -1
- package/src/data/cli-tools.ts +1 -2
- package/src/data/marketplaces.js +6 -2
- package/src/data/marketplaces.ts +10 -3
- package/src/data/predefined-profiles.js +69 -12
- package/src/data/predefined-profiles.ts +73 -14
- package/src/prerunner/index.js +71 -7
- package/src/prerunner/index.ts +94 -6
- package/src/services/claude-cli.js +8 -1
- package/src/services/claude-cli.ts +10 -7
- package/src/services/claude-settings.js +28 -11
- package/src/services/claude-settings.ts +47 -18
- package/src/services/plugin-manager.js +40 -4
- package/src/services/plugin-manager.ts +57 -6
- package/src/types/index.ts +33 -0
- package/src/ui/components/ScrollableDetail.js +23 -0
- package/src/ui/components/ScrollableDetail.tsx +55 -0
- package/src/ui/components/layout/ScreenLayout.js +1 -1
- package/src/ui/components/layout/ScreenLayout.tsx +11 -8
- package/src/ui/renderers/profileRenderers.js +15 -10
- package/src/ui/renderers/profileRenderers.tsx +43 -94
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "@opentui/react/jsx-runtime";
|
|
2
2
|
import { theme } from "../theme.js";
|
|
3
3
|
// ─── Helpers ───────────────────────────────────────────────────────────────────
|
|
4
4
|
function truncate(s, maxLen) {
|
|
@@ -31,6 +31,12 @@ export function humanizeKey(key) {
|
|
|
31
31
|
model: "Model",
|
|
32
32
|
outputStyle: "Output",
|
|
33
33
|
alwaysThinkingEnabled: "Thinking",
|
|
34
|
+
includeGitInstructions: "Git Instructions",
|
|
35
|
+
respectGitignore: "Gitignore",
|
|
36
|
+
enableAllProjectMcpServers: "Auto MCP",
|
|
37
|
+
autoUpdatesChannel: "Updates",
|
|
38
|
+
language: "Language",
|
|
39
|
+
cleanupPeriodDays: "Cleanup",
|
|
34
40
|
};
|
|
35
41
|
return labels[key] ?? key;
|
|
36
42
|
}
|
|
@@ -81,24 +87,23 @@ const predefinedRenderer = {
|
|
|
81
87
|
const { profile } = item;
|
|
82
88
|
const pluginCount = profile.magusPlugins.length + profile.anthropicPlugins.length;
|
|
83
89
|
const skillCount = profile.skills.length;
|
|
84
|
-
const
|
|
90
|
+
const countStr = `${pluginCount}p ${skillCount}s`;
|
|
85
91
|
if (isSelected) {
|
|
86
|
-
return (_jsxs("text", { bg:
|
|
92
|
+
return (_jsxs("text", { bg: theme.selection.bg, fg: theme.selection.fg, children: [" ", profile.name, " ", countStr, " "] }));
|
|
87
93
|
}
|
|
88
|
-
return (_jsxs("text", { children: [
|
|
94
|
+
return (_jsxs("text", { children: [_jsxs("span", { fg: "white", children: [" ", profile.name] }), _jsxs("span", { fg: theme.colors.dim, children: [" ", countStr] })] }));
|
|
89
95
|
},
|
|
90
96
|
renderDetail: ({ item }) => {
|
|
91
97
|
const { profile } = item;
|
|
92
|
-
const magusNames = profile.magusPlugins;
|
|
93
|
-
const anthropicNames = profile.anthropicPlugins;
|
|
94
|
-
const magusLines = wrapNames(magusNames);
|
|
95
|
-
const anthropicLines = wrapNames(anthropicNames);
|
|
96
|
-
const skillLines = wrapNames(profile.skills);
|
|
97
98
|
const settingEntries = Object.entries(profile.settings).filter(([k]) => k !== "env");
|
|
98
99
|
const envMap = profile.settings["env"] ?? {};
|
|
99
100
|
const tasksOn = envMap["CLAUDE_CODE_ENABLE_TASKS"] === "true";
|
|
100
101
|
const teamsOn = envMap["CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS"] === "true";
|
|
101
|
-
return (_jsxs("box", { flexDirection: "column", children: [_jsx("
|
|
102
|
+
return (_jsxs("box", { flexDirection: "column", children: [_jsx("box", { children: _jsx("text", { bg: theme.colors.accent, fg: "white", children: _jsxs("strong", { children: [" ", profile.name, " "] }) }) }), _jsx("box", { marginTop: 1, children: _jsx("text", { fg: theme.colors.muted, children: profile.description }) }), _jsx("box", { children: _jsx("text", { fg: theme.colors.muted, children: `\nMagus (${profile.magusPlugins.length})` }) }), _jsx("box", { children: _jsx("text", { fg: "#00bfa5", children: profile.magusPlugins.map((p) => ` ■ ${p}`).join("\n") }) }), _jsx("box", { children: _jsx("text", { fg: theme.colors.muted, children: `\nAnthropic (${profile.anthropicPlugins.length})` }) }), _jsx("box", { children: _jsx("text", { fg: "#b39ddb", children: profile.anthropicPlugins.map((p) => ` ■ ${p}`).join("\n") }) }), profile.skills.length > 0 && (_jsxs(_Fragment, { children: [_jsx("box", { children: _jsx("text", { fg: theme.colors.muted, children: `\nSkills (${profile.skills.length})` }) }), _jsx("box", { children: _jsx("text", { fg: "#ffd54f", children: profile.skills.map((s) => ` ■ ${s}`).join("\n") }) })] })), _jsx("box", { children: _jsx("text", { fg: theme.colors.dim, children: `\n${DIVIDER}` }) }), _jsx("box", { children: _jsx("text", { fg: theme.colors.muted, children: [
|
|
103
|
+
...settingEntries.map(([k, v]) => ` ${humanizeKey(k).padEnd(18)}${humanizeValue(k, v)}`),
|
|
104
|
+
...(tasksOn ? [` ${"Tasks".padEnd(18)}on`] : []),
|
|
105
|
+
...(teamsOn ? [` ${"Agent Teams".padEnd(18)}on`] : []),
|
|
106
|
+
].join("\n") }) }), _jsx("box", { children: _jsx("text", { fg: theme.colors.dim, children: `\n${DIVIDER}` }) }), _jsx("box", { children: _jsx("text", { fg: theme.colors.info, children: " Enter/a to apply" }) })] }));
|
|
102
107
|
},
|
|
103
108
|
};
|
|
104
109
|
// ─── Saved renderer ────────────────────────────────────────────────────────────
|
|
@@ -36,6 +36,12 @@ export function humanizeKey(key: string): string {
|
|
|
36
36
|
model: "Model",
|
|
37
37
|
outputStyle: "Output",
|
|
38
38
|
alwaysThinkingEnabled: "Thinking",
|
|
39
|
+
includeGitInstructions: "Git Instructions",
|
|
40
|
+
respectGitignore: "Gitignore",
|
|
41
|
+
enableAllProjectMcpServers: "Auto MCP",
|
|
42
|
+
autoUpdatesChannel: "Updates",
|
|
43
|
+
language: "Language",
|
|
44
|
+
cleanupPeriodDays: "Cleanup",
|
|
39
45
|
};
|
|
40
46
|
return labels[key] ?? key;
|
|
41
47
|
}
|
|
@@ -106,36 +112,26 @@ const predefinedRenderer: ItemRenderer<{ kind: "predefined"; profile: Predefined
|
|
|
106
112
|
const pluginCount =
|
|
107
113
|
profile.magusPlugins.length + profile.anthropicPlugins.length;
|
|
108
114
|
const skillCount = profile.skills.length;
|
|
109
|
-
const
|
|
110
|
-
`${profile.name} — ${pluginCount} plugins · ${skillCount} skill${skillCount !== 1 ? "s" : ""}`,
|
|
111
|
-
45,
|
|
112
|
-
);
|
|
115
|
+
const countStr = `${pluginCount}p ${skillCount}s`;
|
|
113
116
|
|
|
114
117
|
if (isSelected) {
|
|
115
118
|
return (
|
|
116
|
-
<text bg=
|
|
117
|
-
{" "}
|
|
118
|
-
{label}{" "}
|
|
119
|
+
<text bg={theme.selection.bg} fg={theme.selection.fg}>
|
|
120
|
+
{" "}{profile.name} {countStr}{" "}
|
|
119
121
|
</text>
|
|
120
122
|
);
|
|
121
123
|
}
|
|
122
124
|
|
|
123
125
|
return (
|
|
124
126
|
<text>
|
|
125
|
-
<span fg=
|
|
126
|
-
<span fg={theme.colors.
|
|
127
|
+
<span fg="white">{" "}{profile.name}</span>
|
|
128
|
+
<span fg={theme.colors.dim}> {countStr}</span>
|
|
127
129
|
</text>
|
|
128
130
|
);
|
|
129
131
|
},
|
|
130
132
|
|
|
131
133
|
renderDetail: ({ item }) => {
|
|
132
134
|
const { profile } = item;
|
|
133
|
-
const magusNames = profile.magusPlugins;
|
|
134
|
-
const anthropicNames = profile.anthropicPlugins;
|
|
135
|
-
const magusLines = wrapNames(magusNames);
|
|
136
|
-
const anthropicLines = wrapNames(anthropicNames);
|
|
137
|
-
const skillLines = wrapNames(profile.skills);
|
|
138
|
-
|
|
139
135
|
const settingEntries = Object.entries(profile.settings).filter(
|
|
140
136
|
([k]) => k !== "env",
|
|
141
137
|
);
|
|
@@ -146,89 +142,42 @@ const predefinedRenderer: ItemRenderer<{ kind: "predefined"; profile: Predefined
|
|
|
146
142
|
|
|
147
143
|
return (
|
|
148
144
|
<box flexDirection="column">
|
|
149
|
-
<
|
|
150
|
-
<
|
|
151
|
-
|
|
152
|
-
<box marginTop={1}>
|
|
153
|
-
<text fg={theme.colors.muted}>{profile.description}</text>
|
|
154
|
-
</box>
|
|
155
|
-
<box marginTop={1}>
|
|
156
|
-
<text fg={theme.colors.dim}>{DIVIDER}</text>
|
|
157
|
-
</box>
|
|
158
|
-
<box marginTop={1} flexDirection="column">
|
|
159
|
-
<text fg={theme.colors.muted}>
|
|
160
|
-
Magus plugins ({magusNames.length}):
|
|
145
|
+
<box>
|
|
146
|
+
<text bg={theme.colors.accent} fg="white">
|
|
147
|
+
<strong> {profile.name} </strong>
|
|
161
148
|
</text>
|
|
162
|
-
{magusLines.map((line, i) => (
|
|
163
|
-
<text key={i} fg={theme.colors.info}>
|
|
164
|
-
{" "}
|
|
165
|
-
{line}
|
|
166
|
-
</text>
|
|
167
|
-
))}
|
|
168
|
-
</box>
|
|
169
|
-
<box marginTop={1} flexDirection="column">
|
|
170
|
-
<text fg={theme.colors.muted}>
|
|
171
|
-
Anthropic plugins ({anthropicNames.length}):
|
|
172
|
-
</text>
|
|
173
|
-
{anthropicLines.map((line, i) => (
|
|
174
|
-
<text key={i} fg={theme.colors.warning}>
|
|
175
|
-
{" "}
|
|
176
|
-
{line}
|
|
177
|
-
</text>
|
|
178
|
-
))}
|
|
179
|
-
</box>
|
|
180
|
-
<box marginTop={1} flexDirection="column">
|
|
181
|
-
<text fg={theme.colors.muted}>Skills ({profile.skills.length}):</text>
|
|
182
|
-
{skillLines.map((line, i) => (
|
|
183
|
-
<text key={i} fg={theme.colors.text}>
|
|
184
|
-
{" "}
|
|
185
|
-
{line}
|
|
186
|
-
</text>
|
|
187
|
-
))}
|
|
188
149
|
</box>
|
|
189
150
|
<box marginTop={1}>
|
|
190
|
-
<text fg={theme.colors.
|
|
191
|
-
</box>
|
|
192
|
-
<box marginTop={1} flexDirection="column">
|
|
193
|
-
<text fg={theme.colors.muted}>Settings:</text>
|
|
194
|
-
{settingEntries.map(([k, v]) => (
|
|
195
|
-
<text key={k}>
|
|
196
|
-
<span fg={theme.colors.muted}>
|
|
197
|
-
{" "}
|
|
198
|
-
{humanizeKey(k).padEnd(14)}
|
|
199
|
-
</span>
|
|
200
|
-
<span fg={theme.colors.text}>{humanizeValue(k, v)}</span>
|
|
201
|
-
</text>
|
|
202
|
-
))}
|
|
203
|
-
{tasksOn && (
|
|
204
|
-
<text>
|
|
205
|
-
<span fg={theme.colors.muted}>
|
|
206
|
-
{" "}
|
|
207
|
-
{"Tasks".padEnd(14)}
|
|
208
|
-
</span>
|
|
209
|
-
<span fg={theme.colors.text}>on</span>
|
|
210
|
-
</text>
|
|
211
|
-
)}
|
|
212
|
-
{teamsOn && (
|
|
213
|
-
<text>
|
|
214
|
-
<span fg={theme.colors.muted}>
|
|
215
|
-
{" "}
|
|
216
|
-
{"Agent Teams".padEnd(14)}
|
|
217
|
-
</span>
|
|
218
|
-
<span fg={theme.colors.text}>on</span>
|
|
219
|
-
</text>
|
|
220
|
-
)}
|
|
221
|
-
</box>
|
|
222
|
-
<box marginTop={1}>
|
|
223
|
-
<text fg={theme.colors.dim}>{DIVIDER}</text>
|
|
224
|
-
</box>
|
|
225
|
-
<box marginTop={1}>
|
|
226
|
-
<text bg="blue" fg="white">
|
|
227
|
-
{" "}
|
|
228
|
-
Enter/a{" "}
|
|
229
|
-
</text>
|
|
230
|
-
<text fg={theme.colors.muted}> Apply to project</text>
|
|
151
|
+
<text fg={theme.colors.muted}>{profile.description}</text>
|
|
231
152
|
</box>
|
|
153
|
+
|
|
154
|
+
{/* Magus plugins */}
|
|
155
|
+
<box><text fg={theme.colors.muted}>{`\nMagus (${profile.magusPlugins.length})`}</text></box>
|
|
156
|
+
<box><text fg="#00bfa5">{profile.magusPlugins.map((p) => ` ■ ${p}`).join("\n")}</text></box>
|
|
157
|
+
|
|
158
|
+
{/* Anthropic plugins */}
|
|
159
|
+
<box><text fg={theme.colors.muted}>{`\nAnthropic (${profile.anthropicPlugins.length})`}</text></box>
|
|
160
|
+
<box><text fg="#b39ddb">{profile.anthropicPlugins.map((p) => ` ■ ${p}`).join("\n")}</text></box>
|
|
161
|
+
|
|
162
|
+
{/* Skills */}
|
|
163
|
+
{profile.skills.length > 0 && (
|
|
164
|
+
<>
|
|
165
|
+
<box><text fg={theme.colors.muted}>{`\nSkills (${profile.skills.length})`}</text></box>
|
|
166
|
+
<box><text fg="#ffd54f">{profile.skills.map((s) => ` ■ ${s}`).join("\n")}</text></box>
|
|
167
|
+
</>
|
|
168
|
+
)}
|
|
169
|
+
|
|
170
|
+
{/* Settings */}
|
|
171
|
+
<box><text fg={theme.colors.dim}>{`\n${DIVIDER}`}</text></box>
|
|
172
|
+
<box><text fg={theme.colors.muted}>{[
|
|
173
|
+
...settingEntries.map(([k, v]) => ` ${humanizeKey(k).padEnd(18)}${humanizeValue(k, v)}`),
|
|
174
|
+
...(tasksOn ? [` ${"Tasks".padEnd(18)}on`] : []),
|
|
175
|
+
...(teamsOn ? [` ${"Agent Teams".padEnd(18)}on`] : []),
|
|
176
|
+
].join("\n")}</text></box>
|
|
177
|
+
|
|
178
|
+
{/* Action */}
|
|
179
|
+
<box><text fg={theme.colors.dim}>{`\n${DIVIDER}`}</text></box>
|
|
180
|
+
<box><text fg={theme.colors.info}> Enter/a to apply</text></box>
|
|
232
181
|
</box>
|
|
233
182
|
);
|
|
234
183
|
},
|