claudeup 4.19.0 → 4.23.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/bin/claudeup.js +43 -19
- package/package.json +14 -19
- package/scripts/build-binaries.ts +77 -0
- package/scripts/check-optional-deps.ts +49 -0
- package/scripts/test-isolated.ts +43 -0
- package/src/__tests__/cli-router.test.ts +65 -0
- package/src/__tests__/conventions-integration.test.ts +745 -0
- package/src/__tests__/conventions-manager.test.ts +1172 -0
- package/src/__tests__/doctor-bins.test.ts +35 -0
- package/src/__tests__/doctor.test.ts +450 -0
- package/src/__tests__/dual-write-prevention.test.ts +14 -4
- package/src/__tests__/file-locking.test.ts +208 -0
- package/src/__tests__/gitignore-prerun.test.ts +1 -0
- package/src/__tests__/install-command.test.ts +81 -0
- package/src/__tests__/install-plan.test.ts +98 -0
- package/src/__tests__/manifest.test.ts +136 -0
- package/src/__tests__/marketplace-badge.test.ts +91 -0
- package/src/__tests__/marketplace-refresh.test.ts +267 -0
- package/src/__tests__/plugin-requires.test.ts +133 -0
- package/src/__tests__/plugin-setup.test.ts +7 -0
- package/src/__tests__/profile-command.test.ts +116 -0
- package/src/__tests__/profile-materializer.test.ts +82 -0
- package/src/__tests__/profile-sync.test.ts +136 -0
- package/src/__tests__/registry-version-resolution.test.ts +74 -0
- package/src/__tests__/resolve-executable.test.ts +42 -0
- package/src/__tests__/resolver.test.ts +218 -0
- package/src/__tests__/symlink-manager.test.ts +99 -0
- package/src/__tests__/toolchain.test.ts +56 -0
- package/src/cli/claude.ts +21 -0
- package/src/cli/doctor.ts +132 -0
- package/src/cli/install.ts +360 -0
- package/src/cli/profile.ts +166 -0
- package/src/cli/router.ts +107 -0
- package/src/cli/update.ts +85 -0
- package/src/data/cli-tools.ts +7 -7
- package/src/data/gitignore-defaults.ts +4 -0
- package/src/data/marketplaces.ts +12 -0
- package/src/data/predefined-profiles.ts +3 -4
- package/src/main.tsx +11 -154
- package/src/prerunner/index.ts +62 -27
- package/src/services/claude-cli.ts +19 -22
- package/src/services/claude-settings.ts +99 -26
- package/src/services/conventions-manager.ts +865 -0
- package/src/services/doctor-bins.ts +49 -0
- package/src/services/doctor.ts +509 -0
- package/src/services/install-plan.ts +107 -0
- package/src/services/manifest.ts +166 -0
- package/src/services/marketplace-refresh.ts +173 -0
- package/src/services/plugin-manager.ts +7 -1
- package/src/services/plugin-requires.ts +215 -0
- package/src/services/plugin-version-check.ts +9 -4
- package/src/services/profile-materializer.ts +61 -0
- package/src/services/profile-sync.ts +150 -0
- package/src/services/resolver.ts +293 -0
- package/src/services/symlink-manager.ts +146 -0
- package/src/services/toolchain.ts +97 -0
- package/src/services/version-check.ts +10 -11
- package/src/types/index.ts +138 -31
- package/src/ui/App.tsx +0 -4
- package/src/ui/adapters/pluginsAdapter.ts +13 -0
- package/src/ui/screens/CliToolsScreen.tsx +11 -3
- package/src/ui/screens/index.ts +0 -1
- package/src/ui/state/reducer.ts +0 -101
- package/src/ui/state/types.ts +0 -35
- package/src/utils/command-utils.ts +23 -0
- package/src/utils/file-locking.ts +144 -0
- package/src/data/alias-flags.js +0 -205
- package/src/data/cli-tools.js +0 -123
- package/src/data/gitignore-defaults.js +0 -24
- package/src/data/gitignore-reasons.js +0 -97
- package/src/data/gitignore-templates.js +0 -21
- package/src/data/marketplaces.js +0 -138
- package/src/data/mcp-servers.js +0 -509
- package/src/data/predefined-profiles.js +0 -248
- package/src/data/settings-catalog.js +0 -625
- package/src/data/skill-repos.js +0 -160
- package/src/data/statuslines.js +0 -159
- package/src/data/statuslines.ts +0 -188
- package/src/index.js +0 -4
- package/src/index.ts +0 -5
- package/src/main.js +0 -170
- package/src/prerunner/index.js +0 -252
- package/src/services/alias-settings.js +0 -51
- package/src/services/alias-shell-writer.js +0 -1018
- package/src/services/alias-store.js +0 -129
- package/src/services/claude-cli.js +0 -189
- package/src/services/claude-runner.js +0 -28
- package/src/services/claude-settings.js +0 -1223
- package/src/services/gitignore-detector.js +0 -155
- package/src/services/gitignore-fixer.js +0 -231
- package/src/services/gitignore-prerun.js +0 -46
- package/src/services/gitignore-resolver.js +0 -143
- package/src/services/gitignore-service.js +0 -117
- package/src/services/local-marketplace.js +0 -339
- package/src/services/marketplace-fetcher.js +0 -96
- package/src/services/marketplace-sync.js +0 -94
- package/src/services/mcp-registry.js +0 -87
- package/src/services/plugin-manager.js +0 -473
- package/src/services/plugin-mcp-config.js +0 -177
- package/src/services/plugin-setup.js +0 -499
- package/src/services/plugin-version-check.js +0 -262
- package/src/services/profiles.js +0 -161
- package/src/services/settings-manager.js +0 -243
- package/src/services/skills-manager.js +0 -393
- package/src/services/skillsmp-client.js +0 -87
- package/src/services/update-cache.js +0 -52
- package/src/services/version-check.js +0 -99
- package/src/types/gitignore.js +0 -6
- package/src/types/index.js +0 -1
- package/src/ui/App.js +0 -355
- package/src/ui/adapters/pluginsAdapter.js +0 -139
- package/src/ui/adapters/settingsAdapter.js +0 -111
- package/src/ui/adapters/skillsAdapter.js +0 -154
- package/src/ui/components/CategoryHeader.js +0 -9
- package/src/ui/components/EmptyFilterState.js +0 -4
- package/src/ui/components/FlagDetailEditor.js +0 -0
- package/src/ui/components/ScopeIndicator.js +0 -30
- package/src/ui/components/ScrollableList.js +0 -36
- package/src/ui/components/SearchInput.js +0 -19
- package/src/ui/components/StyledText.js +0 -39
- package/src/ui/components/TabBar.js +0 -19
- package/src/ui/components/layout/FooterHints.js +0 -29
- package/src/ui/components/layout/Panel.js +0 -6
- package/src/ui/components/layout/ProgressBar.js +0 -14
- package/src/ui/components/layout/ScopeTabs.js +0 -6
- package/src/ui/components/layout/ScreenLayout.js +0 -16
- package/src/ui/components/layout/index.js +0 -5
- package/src/ui/components/modals/ConfirmModal.js +0 -14
- package/src/ui/components/modals/InputModal.js +0 -5
- package/src/ui/components/modals/LoadingModal.js +0 -17
- package/src/ui/components/modals/MessageModal.js +0 -16
- package/src/ui/components/modals/ModalContainer.js +0 -137
- package/src/ui/components/modals/SelectModal.js +0 -18
- package/src/ui/components/modals/VersionMismatchModal.js +0 -36
- package/src/ui/components/modals/index.js +0 -6
- package/src/ui/components/primitives/ActionHints.js +0 -13
- package/src/ui/components/primitives/DetailSection.js +0 -7
- package/src/ui/components/primitives/KeyValueLine.js +0 -8
- package/src/ui/components/primitives/ListCategoryRow.js +0 -8
- package/src/ui/components/primitives/MetaText.js +0 -8
- package/src/ui/components/primitives/ScopeDetail.js +0 -32
- package/src/ui/components/primitives/ScopeSquares.js +0 -11
- package/src/ui/components/primitives/SelectableRow.js +0 -5
- package/src/ui/components/primitives/index.js +0 -8
- package/src/ui/hooks/index.js +0 -4
- package/src/ui/hooks/useAsyncData.js +0 -77
- package/src/ui/hooks/useGitignoreModal.js +0 -74
- package/src/ui/hooks/useKeyboard.js +0 -13
- package/src/ui/hooks/useKeyboardHandler.js +0 -39
- package/src/ui/hooks/useMismatchModal.js +0 -77
- package/src/ui/registry.js +0 -1
- package/src/ui/renderers/cliToolRenderers.js +0 -54
- package/src/ui/renderers/gitignoreRenderers.js +0 -46
- package/src/ui/renderers/mcpRenderers.js +0 -26
- package/src/ui/renderers/pluginRenderers.js +0 -124
- package/src/ui/renderers/profileRenderers.js +0 -177
- package/src/ui/renderers/settingsRenderers.js +0 -73
- package/src/ui/renderers/skillRenderers.js +0 -138
- package/src/ui/screens/AliasScreen.js +0 -1111
- package/src/ui/screens/CliToolsScreen.js +0 -338
- package/src/ui/screens/EnvVarsScreen.js +0 -152
- package/src/ui/screens/GitignoreScreen.js +0 -328
- package/src/ui/screens/McpRegistryScreen.js +0 -238
- package/src/ui/screens/McpScreen.js +0 -176
- package/src/ui/screens/ModelSelectorScreen.js +0 -296
- package/src/ui/screens/ModelSelectorScreen.tsx +0 -444
- package/src/ui/screens/PluginsScreen.js +0 -769
- package/src/ui/screens/ProfilesScreen.js +0 -298
- package/src/ui/screens/SkillsScreen.js +0 -549
- package/src/ui/screens/StatusLineScreen.js +0 -206
- package/src/ui/screens/StatusLineScreen.tsx +0 -416
- package/src/ui/screens/index.js +0 -10
- package/src/ui/state/AnimationContext.js +0 -34
- package/src/ui/state/AppContext.js +0 -162
- package/src/ui/state/DimensionsContext.js +0 -71
- package/src/ui/state/reducer.js +0 -547
- package/src/ui/state/types.js +0 -1
- package/src/ui/theme.js +0 -47
- package/src/utils/clipboard.js +0 -56
- package/src/utils/command-utils.js +0 -19
- package/src/utils/fuzzy-search.js +0 -101
- package/src/utils/string-utils.js +0 -62
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple fuzzy search utility for filtering lists
|
|
3
|
-
* Uses a scoring algorithm that rewards:
|
|
4
|
-
* - Consecutive character matches
|
|
5
|
-
* - Matches at word boundaries
|
|
6
|
-
* - Matches at start of string
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Calculate fuzzy match score for a query against a target string
|
|
10
|
-
* Returns null if no match, otherwise returns score and match indices
|
|
11
|
-
*/
|
|
12
|
-
export function fuzzyMatch(query, target) {
|
|
13
|
-
if (!query)
|
|
14
|
-
return { score: 1, matches: [] };
|
|
15
|
-
const queryLower = query.toLowerCase();
|
|
16
|
-
const targetLower = target.toLowerCase();
|
|
17
|
-
let queryIdx = 0;
|
|
18
|
-
let score = 0;
|
|
19
|
-
const matches = [];
|
|
20
|
-
let prevMatchIdx = -1;
|
|
21
|
-
for (let i = 0; i < targetLower.length && queryIdx < queryLower.length; i++) {
|
|
22
|
-
if (targetLower[i] === queryLower[queryIdx]) {
|
|
23
|
-
matches.push(i);
|
|
24
|
-
// Bonus for consecutive matches
|
|
25
|
-
if (prevMatchIdx === i - 1) {
|
|
26
|
-
score += 5;
|
|
27
|
-
}
|
|
28
|
-
// Bonus for matching at word boundary
|
|
29
|
-
if (i === 0 || /[\s\-_.]/.test(target[i - 1])) {
|
|
30
|
-
score += 10;
|
|
31
|
-
}
|
|
32
|
-
// Bonus for matching at start
|
|
33
|
-
if (i === 0) {
|
|
34
|
-
score += 15;
|
|
35
|
-
}
|
|
36
|
-
// Base score for each match
|
|
37
|
-
score += 1;
|
|
38
|
-
prevMatchIdx = i;
|
|
39
|
-
queryIdx++;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// All query characters must be found
|
|
43
|
-
if (queryIdx !== queryLower.length) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
// Penalty for longer strings (prefer shorter, more precise matches)
|
|
47
|
-
score -= Math.floor(target.length / 10);
|
|
48
|
-
return { score, matches };
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Filter and sort items by fuzzy match score
|
|
52
|
-
*/
|
|
53
|
-
export function fuzzyFilter(items, query, getText) {
|
|
54
|
-
if (!query.trim()) {
|
|
55
|
-
return items.map((item) => ({ item, score: 1, matches: [] }));
|
|
56
|
-
}
|
|
57
|
-
const results = [];
|
|
58
|
-
for (const item of items) {
|
|
59
|
-
const text = getText(item);
|
|
60
|
-
const match = fuzzyMatch(query, text);
|
|
61
|
-
if (match) {
|
|
62
|
-
results.push({
|
|
63
|
-
item,
|
|
64
|
-
score: match.score,
|
|
65
|
-
matches: match.matches,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Sort by score descending
|
|
70
|
-
return results.sort((a, b) => b.score - a.score);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Highlight matched characters in a string
|
|
74
|
-
* Returns array of { text, highlighted } segments
|
|
75
|
-
*/
|
|
76
|
-
export function highlightMatches(text, matches) {
|
|
77
|
-
if (matches.length === 0) {
|
|
78
|
-
return [{ text, highlighted: false }];
|
|
79
|
-
}
|
|
80
|
-
const matchSet = new Set(matches);
|
|
81
|
-
const segments = [];
|
|
82
|
-
let currentSegment = "";
|
|
83
|
-
let isHighlighted = matchSet.has(0);
|
|
84
|
-
for (let i = 0; i < text.length; i++) {
|
|
85
|
-
const shouldHighlight = matchSet.has(i);
|
|
86
|
-
if (shouldHighlight !== isHighlighted) {
|
|
87
|
-
if (currentSegment) {
|
|
88
|
-
segments.push({ text: currentSegment, highlighted: isHighlighted });
|
|
89
|
-
}
|
|
90
|
-
currentSegment = text[i];
|
|
91
|
-
isHighlighted = shouldHighlight;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
currentSegment += text[i];
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (currentSegment) {
|
|
98
|
-
segments.push({ text: currentSegment, highlighted: isHighlighted });
|
|
99
|
-
}
|
|
100
|
-
return segments;
|
|
101
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared string utilities for claudeup
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Format marketplace name for display
|
|
6
|
-
* e.g., "magus" -> "Magus"
|
|
7
|
-
*/
|
|
8
|
-
export function formatMarketplaceName(name) {
|
|
9
|
-
return name
|
|
10
|
-
.split(/[-_]/)
|
|
11
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
12
|
-
.join(" ");
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Validate GitHub repository format (org/repo)
|
|
16
|
-
* Prevents SSRF via malicious repo strings
|
|
17
|
-
*/
|
|
18
|
-
export function isValidGitHubRepo(repo) {
|
|
19
|
-
if (!repo || typeof repo !== "string") {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
// Must match GitHub username/repo format
|
|
23
|
-
// Username: alphanumeric, hyphens (no consecutive, not start/end)
|
|
24
|
-
// Repo: alphanumeric, hyphens, underscores, dots
|
|
25
|
-
const GITHUB_REPO_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]\/[a-zA-Z0-9_.-]+$/;
|
|
26
|
-
// Allow single-char usernames too
|
|
27
|
-
const GITHUB_REPO_PATTERN_SHORT = /^[a-zA-Z0-9]\/[a-zA-Z0-9_.-]+$/;
|
|
28
|
-
if (!GITHUB_REPO_PATTERN.test(repo) &&
|
|
29
|
-
!GITHUB_REPO_PATTERN_SHORT.test(repo)) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
// Blocklist suspicious patterns
|
|
33
|
-
const BLOCKLIST = [
|
|
34
|
-
/\.\./, // Path traversal
|
|
35
|
-
/@/, // URL authority injection
|
|
36
|
-
/:/, // Port specification
|
|
37
|
-
/\s/, // Whitespace
|
|
38
|
-
/%/, // URL encoding
|
|
39
|
-
/\\/, // Backslash
|
|
40
|
-
];
|
|
41
|
-
return !BLOCKLIST.some((pattern) => pattern.test(repo));
|
|
42
|
-
}
|
|
43
|
-
export function parsePluginId(pluginId) {
|
|
44
|
-
if (!pluginId || typeof pluginId !== "string") {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const trimmed = pluginId.trim();
|
|
48
|
-
const atIndex = trimmed.lastIndexOf("@");
|
|
49
|
-
if (atIndex <= 0) {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
const pluginName = trimmed.slice(0, atIndex).trim();
|
|
53
|
-
const marketplace = trimmed.slice(atIndex + 1).trim();
|
|
54
|
-
if (!pluginName || !marketplace) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
pluginName,
|
|
59
|
-
marketplace,
|
|
60
|
-
raw: trimmed,
|
|
61
|
-
};
|
|
62
|
-
}
|