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.
Files changed (182) 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__/cli-router.test.ts +65 -0
  7. package/src/__tests__/conventions-integration.test.ts +745 -0
  8. package/src/__tests__/conventions-manager.test.ts +1172 -0
  9. package/src/__tests__/doctor-bins.test.ts +35 -0
  10. package/src/__tests__/doctor.test.ts +450 -0
  11. package/src/__tests__/dual-write-prevention.test.ts +14 -4
  12. package/src/__tests__/file-locking.test.ts +208 -0
  13. package/src/__tests__/gitignore-prerun.test.ts +1 -0
  14. package/src/__tests__/install-command.test.ts +81 -0
  15. package/src/__tests__/install-plan.test.ts +98 -0
  16. package/src/__tests__/manifest.test.ts +136 -0
  17. package/src/__tests__/marketplace-badge.test.ts +91 -0
  18. package/src/__tests__/marketplace-refresh.test.ts +267 -0
  19. package/src/__tests__/plugin-requires.test.ts +133 -0
  20. package/src/__tests__/plugin-setup.test.ts +7 -0
  21. package/src/__tests__/profile-command.test.ts +116 -0
  22. package/src/__tests__/profile-materializer.test.ts +82 -0
  23. package/src/__tests__/profile-sync.test.ts +136 -0
  24. package/src/__tests__/registry-version-resolution.test.ts +74 -0
  25. package/src/__tests__/resolve-executable.test.ts +42 -0
  26. package/src/__tests__/resolver.test.ts +218 -0
  27. package/src/__tests__/symlink-manager.test.ts +99 -0
  28. package/src/__tests__/toolchain.test.ts +56 -0
  29. package/src/cli/claude.ts +21 -0
  30. package/src/cli/doctor.ts +132 -0
  31. package/src/cli/install.ts +360 -0
  32. package/src/cli/profile.ts +166 -0
  33. package/src/cli/router.ts +107 -0
  34. package/src/cli/update.ts +85 -0
  35. package/src/data/cli-tools.ts +7 -7
  36. package/src/data/gitignore-defaults.ts +4 -0
  37. package/src/data/marketplaces.ts +12 -0
  38. package/src/data/predefined-profiles.ts +3 -4
  39. package/src/main.tsx +11 -154
  40. package/src/prerunner/index.ts +62 -27
  41. package/src/services/claude-cli.ts +19 -22
  42. package/src/services/claude-settings.ts +99 -26
  43. package/src/services/conventions-manager.ts +865 -0
  44. package/src/services/doctor-bins.ts +49 -0
  45. package/src/services/doctor.ts +509 -0
  46. package/src/services/install-plan.ts +107 -0
  47. package/src/services/manifest.ts +166 -0
  48. package/src/services/marketplace-refresh.ts +173 -0
  49. package/src/services/plugin-manager.ts +7 -1
  50. package/src/services/plugin-requires.ts +215 -0
  51. package/src/services/plugin-version-check.ts +9 -4
  52. package/src/services/profile-materializer.ts +61 -0
  53. package/src/services/profile-sync.ts +150 -0
  54. package/src/services/resolver.ts +293 -0
  55. package/src/services/symlink-manager.ts +146 -0
  56. package/src/services/toolchain.ts +97 -0
  57. package/src/services/version-check.ts +10 -11
  58. package/src/types/index.ts +138 -31
  59. package/src/ui/App.tsx +0 -4
  60. package/src/ui/adapters/pluginsAdapter.ts +13 -0
  61. package/src/ui/screens/CliToolsScreen.tsx +11 -3
  62. package/src/ui/screens/index.ts +0 -1
  63. package/src/ui/state/reducer.ts +0 -101
  64. package/src/ui/state/types.ts +0 -35
  65. package/src/utils/command-utils.ts +23 -0
  66. package/src/utils/file-locking.ts +144 -0
  67. package/src/data/alias-flags.js +0 -205
  68. package/src/data/cli-tools.js +0 -123
  69. package/src/data/gitignore-defaults.js +0 -24
  70. package/src/data/gitignore-reasons.js +0 -97
  71. package/src/data/gitignore-templates.js +0 -21
  72. package/src/data/marketplaces.js +0 -138
  73. package/src/data/mcp-servers.js +0 -509
  74. package/src/data/predefined-profiles.js +0 -248
  75. package/src/data/settings-catalog.js +0 -625
  76. package/src/data/skill-repos.js +0 -160
  77. package/src/data/statuslines.js +0 -159
  78. package/src/data/statuslines.ts +0 -188
  79. package/src/index.js +0 -4
  80. package/src/index.ts +0 -5
  81. package/src/main.js +0 -170
  82. package/src/prerunner/index.js +0 -252
  83. package/src/services/alias-settings.js +0 -51
  84. package/src/services/alias-shell-writer.js +0 -1018
  85. package/src/services/alias-store.js +0 -129
  86. package/src/services/claude-cli.js +0 -189
  87. package/src/services/claude-runner.js +0 -28
  88. package/src/services/claude-settings.js +0 -1223
  89. package/src/services/gitignore-detector.js +0 -155
  90. package/src/services/gitignore-fixer.js +0 -231
  91. package/src/services/gitignore-prerun.js +0 -46
  92. package/src/services/gitignore-resolver.js +0 -143
  93. package/src/services/gitignore-service.js +0 -117
  94. package/src/services/local-marketplace.js +0 -339
  95. package/src/services/marketplace-fetcher.js +0 -96
  96. package/src/services/marketplace-sync.js +0 -94
  97. package/src/services/mcp-registry.js +0 -87
  98. package/src/services/plugin-manager.js +0 -473
  99. package/src/services/plugin-mcp-config.js +0 -177
  100. package/src/services/plugin-setup.js +0 -499
  101. package/src/services/plugin-version-check.js +0 -262
  102. package/src/services/profiles.js +0 -161
  103. package/src/services/settings-manager.js +0 -243
  104. package/src/services/skills-manager.js +0 -393
  105. package/src/services/skillsmp-client.js +0 -87
  106. package/src/services/update-cache.js +0 -52
  107. package/src/services/version-check.js +0 -99
  108. package/src/types/gitignore.js +0 -6
  109. package/src/types/index.js +0 -1
  110. package/src/ui/App.js +0 -355
  111. package/src/ui/adapters/pluginsAdapter.js +0 -139
  112. package/src/ui/adapters/settingsAdapter.js +0 -111
  113. package/src/ui/adapters/skillsAdapter.js +0 -154
  114. package/src/ui/components/CategoryHeader.js +0 -9
  115. package/src/ui/components/EmptyFilterState.js +0 -4
  116. package/src/ui/components/FlagDetailEditor.js +0 -0
  117. package/src/ui/components/ScopeIndicator.js +0 -30
  118. package/src/ui/components/ScrollableList.js +0 -36
  119. package/src/ui/components/SearchInput.js +0 -19
  120. package/src/ui/components/StyledText.js +0 -39
  121. package/src/ui/components/TabBar.js +0 -19
  122. package/src/ui/components/layout/FooterHints.js +0 -29
  123. package/src/ui/components/layout/Panel.js +0 -6
  124. package/src/ui/components/layout/ProgressBar.js +0 -14
  125. package/src/ui/components/layout/ScopeTabs.js +0 -6
  126. package/src/ui/components/layout/ScreenLayout.js +0 -16
  127. package/src/ui/components/layout/index.js +0 -5
  128. package/src/ui/components/modals/ConfirmModal.js +0 -14
  129. package/src/ui/components/modals/InputModal.js +0 -5
  130. package/src/ui/components/modals/LoadingModal.js +0 -17
  131. package/src/ui/components/modals/MessageModal.js +0 -16
  132. package/src/ui/components/modals/ModalContainer.js +0 -137
  133. package/src/ui/components/modals/SelectModal.js +0 -18
  134. package/src/ui/components/modals/VersionMismatchModal.js +0 -36
  135. package/src/ui/components/modals/index.js +0 -6
  136. package/src/ui/components/primitives/ActionHints.js +0 -13
  137. package/src/ui/components/primitives/DetailSection.js +0 -7
  138. package/src/ui/components/primitives/KeyValueLine.js +0 -8
  139. package/src/ui/components/primitives/ListCategoryRow.js +0 -8
  140. package/src/ui/components/primitives/MetaText.js +0 -8
  141. package/src/ui/components/primitives/ScopeDetail.js +0 -32
  142. package/src/ui/components/primitives/ScopeSquares.js +0 -11
  143. package/src/ui/components/primitives/SelectableRow.js +0 -5
  144. package/src/ui/components/primitives/index.js +0 -8
  145. package/src/ui/hooks/index.js +0 -4
  146. package/src/ui/hooks/useAsyncData.js +0 -77
  147. package/src/ui/hooks/useGitignoreModal.js +0 -74
  148. package/src/ui/hooks/useKeyboard.js +0 -13
  149. package/src/ui/hooks/useKeyboardHandler.js +0 -39
  150. package/src/ui/hooks/useMismatchModal.js +0 -77
  151. package/src/ui/registry.js +0 -1
  152. package/src/ui/renderers/cliToolRenderers.js +0 -54
  153. package/src/ui/renderers/gitignoreRenderers.js +0 -46
  154. package/src/ui/renderers/mcpRenderers.js +0 -26
  155. package/src/ui/renderers/pluginRenderers.js +0 -124
  156. package/src/ui/renderers/profileRenderers.js +0 -177
  157. package/src/ui/renderers/settingsRenderers.js +0 -73
  158. package/src/ui/renderers/skillRenderers.js +0 -138
  159. package/src/ui/screens/AliasScreen.js +0 -1111
  160. package/src/ui/screens/CliToolsScreen.js +0 -338
  161. package/src/ui/screens/EnvVarsScreen.js +0 -152
  162. package/src/ui/screens/GitignoreScreen.js +0 -328
  163. package/src/ui/screens/McpRegistryScreen.js +0 -238
  164. package/src/ui/screens/McpScreen.js +0 -176
  165. package/src/ui/screens/ModelSelectorScreen.js +0 -296
  166. package/src/ui/screens/ModelSelectorScreen.tsx +0 -444
  167. package/src/ui/screens/PluginsScreen.js +0 -769
  168. package/src/ui/screens/ProfilesScreen.js +0 -298
  169. package/src/ui/screens/SkillsScreen.js +0 -549
  170. package/src/ui/screens/StatusLineScreen.js +0 -206
  171. package/src/ui/screens/StatusLineScreen.tsx +0 -416
  172. package/src/ui/screens/index.js +0 -10
  173. package/src/ui/state/AnimationContext.js +0 -34
  174. package/src/ui/state/AppContext.js +0 -162
  175. package/src/ui/state/DimensionsContext.js +0 -71
  176. package/src/ui/state/reducer.js +0 -547
  177. package/src/ui/state/types.js +0 -1
  178. package/src/ui/theme.js +0 -47
  179. package/src/utils/clipboard.js +0 -56
  180. package/src/utils/command-utils.js +0 -19
  181. package/src/utils/fuzzy-search.js +0 -101
  182. package/src/utils/string-utils.js +0 -62
@@ -1,162 +0,0 @@
1
- import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
- import { createContext, useContext, useReducer, } from "react";
3
- import { appReducer, initialState } from "./reducer.js";
4
- // ============================================================================
5
- // Context
6
- // ============================================================================
7
- const AppContext = createContext(null);
8
- export function AppProvider({ children, initialProjectPath, }) {
9
- const [state, dispatch] = useReducer(appReducer, {
10
- ...initialState,
11
- projectPath: initialProjectPath || process.cwd(),
12
- });
13
- return (_jsx(AppContext.Provider, { value: { state, dispatch }, children: children }));
14
- }
15
- // ============================================================================
16
- // Hook: useApp
17
- // ============================================================================
18
- export function useApp() {
19
- const context = useContext(AppContext);
20
- if (!context) {
21
- throw new Error("useApp must be used within an AppProvider");
22
- }
23
- return context;
24
- }
25
- // ============================================================================
26
- // Hook: useNavigation
27
- // ============================================================================
28
- export function useNavigation() {
29
- const { state, dispatch } = useApp();
30
- return {
31
- currentRoute: state.currentRoute,
32
- currentScreen: state.currentRoute.screen,
33
- navigateTo: (route) => {
34
- dispatch({ type: "NAVIGATE", route });
35
- },
36
- navigateToScreen: (screen) => {
37
- dispatch({ type: "NAVIGATE", route: { screen } });
38
- },
39
- };
40
- }
41
- // ============================================================================
42
- // Hook: useModal
43
- // ============================================================================
44
- export function useModal() {
45
- const { dispatch } = useApp();
46
- return {
47
- showModal: (modal) => {
48
- dispatch({ type: "SHOW_MODAL", modal });
49
- },
50
- hideModal: () => {
51
- dispatch({ type: "HIDE_MODAL" });
52
- },
53
- confirm: (title, message) => {
54
- return new Promise((resolve) => {
55
- dispatch({
56
- type: "SHOW_MODAL",
57
- modal: {
58
- type: "confirm",
59
- title,
60
- message,
61
- onConfirm: () => {
62
- dispatch({ type: "HIDE_MODAL" });
63
- resolve(true);
64
- },
65
- onCancel: () => {
66
- dispatch({ type: "HIDE_MODAL" });
67
- resolve(false);
68
- },
69
- },
70
- });
71
- });
72
- },
73
- input: (title, label, defaultValue) => {
74
- return new Promise((resolve) => {
75
- dispatch({
76
- type: "SHOW_MODAL",
77
- modal: {
78
- type: "input",
79
- title,
80
- label,
81
- defaultValue,
82
- onSubmit: (value) => {
83
- dispatch({ type: "HIDE_MODAL" });
84
- resolve(value);
85
- },
86
- onCancel: () => {
87
- dispatch({ type: "HIDE_MODAL" });
88
- resolve(null);
89
- },
90
- },
91
- });
92
- });
93
- },
94
- select: (title, message, options, defaultIndex) => {
95
- return new Promise((resolve) => {
96
- dispatch({
97
- type: "SHOW_MODAL",
98
- modal: {
99
- type: "select",
100
- title,
101
- message,
102
- options,
103
- defaultIndex,
104
- onSelect: (value) => {
105
- dispatch({ type: "HIDE_MODAL" });
106
- resolve(value);
107
- },
108
- onCancel: () => {
109
- dispatch({ type: "HIDE_MODAL" });
110
- resolve(null);
111
- },
112
- },
113
- });
114
- });
115
- },
116
- message: (title, message, variant = "info") => {
117
- return new Promise((resolve) => {
118
- dispatch({
119
- type: "SHOW_MODAL",
120
- modal: {
121
- type: "message",
122
- title,
123
- message,
124
- variant,
125
- onDismiss: () => {
126
- dispatch({ type: "HIDE_MODAL" });
127
- resolve();
128
- },
129
- },
130
- });
131
- });
132
- },
133
- loading: (message) => {
134
- dispatch({
135
- type: "SHOW_MODAL",
136
- modal: {
137
- type: "loading",
138
- message,
139
- },
140
- });
141
- },
142
- };
143
- }
144
- // ============================================================================
145
- // Hook: useProgress
146
- // ============================================================================
147
- export function useProgress() {
148
- const { state, dispatch } = useApp();
149
- return {
150
- progress: state.progress,
151
- isVisible: state.progress !== null,
152
- show: (message, current, total) => {
153
- dispatch({ type: "SHOW_PROGRESS", state: { message, current, total } });
154
- },
155
- update: (state) => {
156
- dispatch({ type: "UPDATE_PROGRESS", state });
157
- },
158
- hide: () => {
159
- dispatch({ type: "HIDE_PROGRESS" });
160
- },
161
- };
162
- }
@@ -1,71 +0,0 @@
1
- import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
- import { createContext, useContext, useState, useEffect } from "react";
3
- import { useRenderer, useOnResize } from "@opentui/react";
4
- const DimensionsContext = createContext(null);
5
- // Fixed heights for layout elements
6
- const SCREEN_HEADER_HEIGHT = 4; // ScreenLayout: border + title row + status/search row + border
7
- const SCREEN_FOOTER_HEIGHT = 2; // ScreenLayout: border-top + footer content
8
- const APP_MARGINS = 1; // buffer for margins/padding
9
- const PROGRESS_HEIGHT = 1; // when visible
10
- function calculateDimensions(columns, rows, showProgress, showDebug, showUpdateBanner, transientBannerCount) {
11
- const terminalWidth = columns;
12
- const terminalHeight = rows;
13
- // Calculate total available height for ScreenLayout (includes its header, panels, footer)
14
- let contentHeight = terminalHeight - APP_MARGINS;
15
- if (showProgress)
16
- contentHeight -= PROGRESS_HEIGHT;
17
- if (showDebug)
18
- contentHeight -= 1;
19
- if (showUpdateBanner)
20
- contentHeight -= 1;
21
- contentHeight -= transientBannerCount;
22
- contentHeight = Math.max(10, contentHeight); // Minimum 10 lines for full layout
23
- // Calculate available content width (accounting for padding)
24
- const contentWidth = Math.max(40, terminalWidth - 4);
25
- // Calculate list panel height for scrollbox
26
- // ScreenLayout uses: panelHeight = contentHeight - 4 (header) - 1 (footer)
27
- // The scrollbox sits inside the panel
28
- const listPanelHeight = Math.max(3, contentHeight - SCREEN_HEADER_HEIGHT - SCREEN_FOOTER_HEIGHT);
29
- return {
30
- terminalWidth,
31
- terminalHeight,
32
- contentHeight,
33
- contentWidth,
34
- listPanelHeight,
35
- };
36
- }
37
- export function DimensionsProvider({ children, showProgress = false, showDebug = false, showUpdateBanner = false, transientBannerCount = 0, }) {
38
- const renderer = useRenderer();
39
- const [dimensions, setDimensions] = useState(() => calculateDimensions(renderer.width, renderer.height, showProgress, showDebug, showUpdateBanner, transientBannerCount));
40
- // Handle terminal resize
41
- useOnResize((width, height) => {
42
- setDimensions(calculateDimensions(width, height, showProgress, showDebug, showUpdateBanner, transientBannerCount));
43
- });
44
- // Update when showProgress/showDebug/showUpdateBanner/transientBannerCount changes
45
- useEffect(() => {
46
- setDimensions(calculateDimensions(renderer.width, renderer.height, showProgress, showDebug, showUpdateBanner, transientBannerCount));
47
- }, [
48
- renderer.width,
49
- renderer.height,
50
- showProgress,
51
- showDebug,
52
- showUpdateBanner,
53
- transientBannerCount,
54
- ]);
55
- return (_jsx(DimensionsContext.Provider, { value: dimensions, children: children }));
56
- }
57
- export function useDimensions() {
58
- const context = useContext(DimensionsContext);
59
- if (!context) {
60
- // Return sensible defaults if used outside provider
61
- return {
62
- terminalWidth: 80,
63
- terminalHeight: 24,
64
- contentHeight: 23, // 24 - 1 margin
65
- contentWidth: 76,
66
- listPanelHeight: 17, // 23 - 4 header - 2 footer
67
- };
68
- }
69
- return context;
70
- }
71
- export default DimensionsContext;