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