claudeup 4.18.0 → 4.22.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.
Files changed (191) hide show
  1. package/bin/claudeup.js +43 -19
  2. package/package.json +14 -19
  3. package/scripts/build-binaries.ts +77 -0
  4. package/scripts/check-optional-deps.ts +49 -0
  5. package/scripts/test-isolated.ts +43 -0
  6. package/src/__tests__/alias-adopt.test.ts +364 -0
  7. package/src/__tests__/alias-parser.test.ts +92 -0
  8. package/src/__tests__/alias-shell-writer.test.ts +7 -0
  9. package/src/__tests__/alias-store.test.ts +77 -0
  10. package/src/__tests__/cli-router.test.ts +65 -0
  11. package/src/__tests__/conventions-integration.test.ts +745 -0
  12. package/src/__tests__/conventions-manager.test.ts +1172 -0
  13. package/src/__tests__/doctor-bins.test.ts +35 -0
  14. package/src/__tests__/doctor.test.ts +450 -0
  15. package/src/__tests__/dual-write-prevention.test.ts +14 -4
  16. package/src/__tests__/file-locking.test.ts +208 -0
  17. package/src/__tests__/gitignore-prerun.test.ts +1 -0
  18. package/src/__tests__/install-command.test.ts +81 -0
  19. package/src/__tests__/install-plan.test.ts +98 -0
  20. package/src/__tests__/manifest.test.ts +136 -0
  21. package/src/__tests__/marketplace-refresh.test.ts +267 -0
  22. package/src/__tests__/plugin-requires.test.ts +133 -0
  23. package/src/__tests__/plugin-setup.test.ts +118 -0
  24. package/src/__tests__/profile-command.test.ts +116 -0
  25. package/src/__tests__/profile-materializer.test.ts +82 -0
  26. package/src/__tests__/profile-sync.test.ts +136 -0
  27. package/src/__tests__/registry-version-resolution.test.ts +74 -0
  28. package/src/__tests__/resolve-executable.test.ts +42 -0
  29. package/src/__tests__/resolver.test.ts +218 -0
  30. package/src/__tests__/symlink-manager.test.ts +99 -0
  31. package/src/__tests__/toolchain.test.ts +56 -0
  32. package/src/cli/claude.ts +21 -0
  33. package/src/cli/doctor.ts +132 -0
  34. package/src/cli/install.ts +360 -0
  35. package/src/cli/profile.ts +166 -0
  36. package/src/cli/router.ts +107 -0
  37. package/src/cli/update.ts +85 -0
  38. package/src/data/alias-flags.ts +11 -1
  39. package/src/data/cli-tools.ts +7 -7
  40. package/src/data/gitignore-defaults.ts +4 -0
  41. package/src/data/marketplaces.ts +12 -0
  42. package/src/data/predefined-profiles.ts +3 -4
  43. package/src/main.tsx +11 -154
  44. package/src/prerunner/index.ts +62 -27
  45. package/src/services/alias-shell-writer.ts +382 -8
  46. package/src/services/alias-store.ts +60 -0
  47. package/src/services/claude-cli.ts +19 -22
  48. package/src/services/claude-settings.ts +99 -26
  49. package/src/services/conventions-manager.ts +865 -0
  50. package/src/services/doctor-bins.ts +49 -0
  51. package/src/services/doctor.ts +509 -0
  52. package/src/services/install-plan.ts +107 -0
  53. package/src/services/manifest.ts +166 -0
  54. package/src/services/marketplace-refresh.ts +173 -0
  55. package/src/services/plugin-manager.ts +7 -1
  56. package/src/services/plugin-requires.ts +215 -0
  57. package/src/services/plugin-setup.ts +61 -4
  58. package/src/services/plugin-version-check.ts +9 -4
  59. package/src/services/profile-materializer.ts +61 -0
  60. package/src/services/profile-sync.ts +150 -0
  61. package/src/services/resolver.ts +293 -0
  62. package/src/services/symlink-manager.ts +146 -0
  63. package/src/services/toolchain.ts +97 -0
  64. package/src/services/version-check.ts +10 -11
  65. package/src/types/index.ts +138 -31
  66. package/src/ui/App.tsx +16 -11
  67. package/src/ui/components/FlagDetailEditor.tsx +0 -0
  68. package/src/ui/components/modals/ConfirmModal.tsx +1 -1
  69. package/src/ui/screens/AliasScreen.tsx +491 -359
  70. package/src/ui/screens/CliToolsScreen.tsx +11 -3
  71. package/src/ui/screens/PluginsScreen.tsx +3 -1
  72. package/src/ui/screens/index.ts +0 -1
  73. package/src/ui/state/reducer.ts +6 -102
  74. package/src/ui/state/types.ts +8 -35
  75. package/src/utils/command-utils.ts +23 -0
  76. package/src/utils/file-locking.ts +144 -0
  77. package/src/data/alias-flags.js +0 -196
  78. package/src/data/cli-tools.js +0 -123
  79. package/src/data/gitignore-defaults.js +0 -24
  80. package/src/data/gitignore-reasons.js +0 -97
  81. package/src/data/gitignore-templates.js +0 -21
  82. package/src/data/marketplaces.js +0 -138
  83. package/src/data/mcp-servers.js +0 -509
  84. package/src/data/predefined-profiles.js +0 -248
  85. package/src/data/settings-catalog.js +0 -625
  86. package/src/data/skill-repos.js +0 -160
  87. package/src/data/statuslines.js +0 -159
  88. package/src/data/statuslines.ts +0 -188
  89. package/src/index.js +0 -4
  90. package/src/index.ts +0 -5
  91. package/src/main.js +0 -170
  92. package/src/prerunner/index.js +0 -252
  93. package/src/services/alias-settings.js +0 -51
  94. package/src/services/alias-shell-writer.js +0 -764
  95. package/src/services/alias-store.js +0 -77
  96. package/src/services/claude-cli.js +0 -189
  97. package/src/services/claude-runner.js +0 -28
  98. package/src/services/claude-settings.js +0 -1223
  99. package/src/services/gitignore-detector.js +0 -155
  100. package/src/services/gitignore-fixer.js +0 -231
  101. package/src/services/gitignore-prerun.js +0 -46
  102. package/src/services/gitignore-resolver.js +0 -143
  103. package/src/services/gitignore-service.js +0 -117
  104. package/src/services/local-marketplace.js +0 -339
  105. package/src/services/marketplace-fetcher.js +0 -96
  106. package/src/services/marketplace-sync.js +0 -94
  107. package/src/services/mcp-registry.js +0 -87
  108. package/src/services/plugin-manager.js +0 -473
  109. package/src/services/plugin-mcp-config.js +0 -177
  110. package/src/services/plugin-setup.js +0 -444
  111. package/src/services/plugin-version-check.js +0 -262
  112. package/src/services/profiles.js +0 -161
  113. package/src/services/settings-manager.js +0 -243
  114. package/src/services/skills-manager.js +0 -393
  115. package/src/services/skillsmp-client.js +0 -87
  116. package/src/services/update-cache.js +0 -52
  117. package/src/services/version-check.js +0 -99
  118. package/src/types/gitignore.js +0 -6
  119. package/src/types/index.js +0 -1
  120. package/src/ui/App.js +0 -346
  121. package/src/ui/adapters/pluginsAdapter.js +0 -139
  122. package/src/ui/adapters/settingsAdapter.js +0 -111
  123. package/src/ui/adapters/skillsAdapter.js +0 -154
  124. package/src/ui/components/CategoryHeader.js +0 -9
  125. package/src/ui/components/EmptyFilterState.js +0 -4
  126. package/src/ui/components/ScopeIndicator.js +0 -30
  127. package/src/ui/components/ScrollableList.js +0 -36
  128. package/src/ui/components/SearchInput.js +0 -19
  129. package/src/ui/components/StyledText.js +0 -39
  130. package/src/ui/components/TabBar.js +0 -19
  131. package/src/ui/components/layout/FooterHints.js +0 -29
  132. package/src/ui/components/layout/Panel.js +0 -6
  133. package/src/ui/components/layout/ProgressBar.js +0 -14
  134. package/src/ui/components/layout/ScopeTabs.js +0 -6
  135. package/src/ui/components/layout/ScreenLayout.js +0 -16
  136. package/src/ui/components/layout/index.js +0 -5
  137. package/src/ui/components/modals/ConfirmModal.js +0 -14
  138. package/src/ui/components/modals/InputModal.js +0 -5
  139. package/src/ui/components/modals/LoadingModal.js +0 -17
  140. package/src/ui/components/modals/MessageModal.js +0 -16
  141. package/src/ui/components/modals/ModalContainer.js +0 -137
  142. package/src/ui/components/modals/SelectModal.js +0 -18
  143. package/src/ui/components/modals/VersionMismatchModal.js +0 -36
  144. package/src/ui/components/modals/index.js +0 -6
  145. package/src/ui/components/primitives/ActionHints.js +0 -13
  146. package/src/ui/components/primitives/DetailSection.js +0 -7
  147. package/src/ui/components/primitives/KeyValueLine.js +0 -8
  148. package/src/ui/components/primitives/ListCategoryRow.js +0 -8
  149. package/src/ui/components/primitives/MetaText.js +0 -8
  150. package/src/ui/components/primitives/ScopeDetail.js +0 -32
  151. package/src/ui/components/primitives/ScopeSquares.js +0 -11
  152. package/src/ui/components/primitives/SelectableRow.js +0 -5
  153. package/src/ui/components/primitives/index.js +0 -8
  154. package/src/ui/hooks/index.js +0 -4
  155. package/src/ui/hooks/useAsyncData.js +0 -77
  156. package/src/ui/hooks/useGitignoreModal.js +0 -74
  157. package/src/ui/hooks/useKeyboard.js +0 -13
  158. package/src/ui/hooks/useKeyboardHandler.js +0 -39
  159. package/src/ui/hooks/useMismatchModal.js +0 -77
  160. package/src/ui/registry.js +0 -1
  161. package/src/ui/renderers/cliToolRenderers.js +0 -54
  162. package/src/ui/renderers/gitignoreRenderers.js +0 -46
  163. package/src/ui/renderers/mcpRenderers.js +0 -26
  164. package/src/ui/renderers/pluginRenderers.js +0 -124
  165. package/src/ui/renderers/profileRenderers.js +0 -177
  166. package/src/ui/renderers/settingsRenderers.js +0 -73
  167. package/src/ui/renderers/skillRenderers.js +0 -138
  168. package/src/ui/screens/AliasScreen.js +0 -1008
  169. package/src/ui/screens/CliToolsScreen.js +0 -338
  170. package/src/ui/screens/EnvVarsScreen.js +0 -152
  171. package/src/ui/screens/GitignoreScreen.js +0 -328
  172. package/src/ui/screens/McpRegistryScreen.js +0 -238
  173. package/src/ui/screens/McpScreen.js +0 -176
  174. package/src/ui/screens/ModelSelectorScreen.js +0 -296
  175. package/src/ui/screens/ModelSelectorScreen.tsx +0 -444
  176. package/src/ui/screens/PluginsScreen.js +0 -766
  177. package/src/ui/screens/ProfilesScreen.js +0 -298
  178. package/src/ui/screens/SkillsScreen.js +0 -549
  179. package/src/ui/screens/StatusLineScreen.js +0 -206
  180. package/src/ui/screens/StatusLineScreen.tsx +0 -416
  181. package/src/ui/screens/index.js +0 -10
  182. package/src/ui/state/AnimationContext.js +0 -34
  183. package/src/ui/state/AppContext.js +0 -162
  184. package/src/ui/state/DimensionsContext.js +0 -71
  185. package/src/ui/state/reducer.js +0 -543
  186. package/src/ui/state/types.js +0 -1
  187. package/src/ui/theme.js +0 -47
  188. package/src/utils/clipboard.js +0 -56
  189. package/src/utils/command-utils.js +0 -19
  190. package/src/utils/fuzzy-search.js +0 -101
  191. 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
- }