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,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;