claudeup 4.18.0 → 4.19.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.
@@ -374,7 +374,8 @@ export function PluginsScreen() {
374
374
  const hasMissing = (missing.pip?.length || 0) +
375
375
  (missing.brew?.length || 0) +
376
376
  (missing.npm?.length || 0) +
377
- (missing.cargo?.length || 0) >
377
+ (missing.cargo?.length || 0) +
378
+ (missing.go?.length || 0) >
378
379
  0;
379
380
  if (!hasMissing)
380
381
  return;
@@ -387,6 +388,8 @@ export function PluginsScreen() {
387
388
  parts.push(`npm: ${missing.npm.join(", ")}`);
388
389
  if (missing.cargo?.length)
389
390
  parts.push(`cargo: ${missing.cargo.join(", ")}`);
391
+ if (missing.go?.length)
392
+ parts.push(`go: ${missing.go.join(", ")}`);
390
393
  const wantInstall = await modal.confirm("Install Dependencies?", `This plugin needs system dependencies:\n\n${parts.join("\n")}\n\nInstall now?`);
391
394
  if (!wantInstall)
392
395
  return;
@@ -486,7 +486,8 @@ export function PluginsScreen() {
486
486
  (missing.pip?.length || 0) +
487
487
  (missing.brew?.length || 0) +
488
488
  (missing.npm?.length || 0) +
489
- (missing.cargo?.length || 0) >
489
+ (missing.cargo?.length || 0) +
490
+ (missing.go?.length || 0) >
490
491
  0;
491
492
 
492
493
  if (!hasMissing) return;
@@ -497,6 +498,7 @@ export function PluginsScreen() {
497
498
  if (missing.npm?.length) parts.push(`npm: ${missing.npm.join(", ")}`);
498
499
  if (missing.cargo?.length)
499
500
  parts.push(`cargo: ${missing.cargo.join(", ")}`);
501
+ if (missing.go?.length) parts.push(`go: ${missing.go.join(", ")}`);
500
502
 
501
503
  const wantInstall = await modal.confirm(
502
504
  "Install Dependencies?",
@@ -7,6 +7,7 @@ export const initialState = {
7
7
  modal: null,
8
8
  progress: null,
9
9
  isSearching: false,
10
+ detailActive: false,
10
11
  // Refresh counter for triggering data refetch
11
12
  dataRefreshVersion: 0,
12
13
  // Screen-specific state
@@ -68,8 +69,9 @@ export function appReducer(state, action) {
68
69
  return {
69
70
  ...state,
70
71
  currentRoute: action.route,
71
- // Clear search state when navigating away
72
+ // Clear transient sub-view state when navigating away
72
73
  isSearching: false,
74
+ detailActive: false,
73
75
  };
74
76
  // =========================================================================
75
77
  // Plugins Screen
@@ -532,6 +534,8 @@ export function appReducer(state, action) {
532
534
  // =========================================================================
533
535
  case "SET_SEARCHING":
534
536
  return { ...state, isSearching: action.isSearching };
537
+ case "SET_DETAIL_ACTIVE":
538
+ return { ...state, detailActive: action.detailActive };
535
539
  // =========================================================================
536
540
  // Data Refresh
537
541
  // =========================================================================
@@ -11,6 +11,7 @@ export const initialState: AppState = {
11
11
  modal: null,
12
12
  progress: null,
13
13
  isSearching: false,
14
+ detailActive: false,
14
15
 
15
16
  // Refresh counter for triggering data refetch
16
17
  dataRefreshVersion: 0,
@@ -83,8 +84,9 @@ export function appReducer(state: AppState, action: AppAction): AppState {
83
84
  return {
84
85
  ...state,
85
86
  currentRoute: action.route,
86
- // Clear search state when navigating away
87
+ // Clear transient sub-view state when navigating away
87
88
  isSearching: false,
89
+ detailActive: false,
88
90
  };
89
91
 
90
92
  // =========================================================================
@@ -603,6 +605,9 @@ export function appReducer(state: AppState, action: AppAction): AppState {
603
605
  case "SET_SEARCHING":
604
606
  return { ...state, isSearching: action.isSearching };
605
607
 
608
+ case "SET_DETAIL_ACTIVE":
609
+ return { ...state, detailActive: action.detailActive };
610
+
606
611
  // =========================================================================
607
612
  // Data Refresh
608
613
  // =========================================================================
@@ -207,6 +207,11 @@ export interface AppState {
207
207
  modal: ModalState | null;
208
208
  progress: ProgressState | null;
209
209
  isSearching: boolean;
210
+ // True while a screen has a focused sub-view open that owns Escape (e.g.
211
+ // the Alias tab's flag-detail editor). The global key handler skips its
212
+ // Escape→navigate branch so Escape backs out of the sub-view instead of
213
+ // jumping to the home tab. Mirrors how `modal`/`isSearching` gate keys.
214
+ detailActive: boolean;
210
215
 
211
216
  // Refresh counter - incremented when marketplace sync completes
212
217
  // Screens can watch this to know when to refetch data
@@ -307,6 +312,9 @@ export type AppAction =
307
312
  // Search state (blocks global key handlers)
308
313
  | { type: "SET_SEARCHING"; isSearching: boolean }
309
314
 
315
+ // Detail sub-view state (gates global Escape→navigate)
316
+ | { type: "SET_DETAIL_ACTIVE"; detailActive: boolean }
317
+
310
318
  // Profiles screen
311
319
  | { type: "PROFILES_SELECT"; index: number }
312
320
  | { type: "PROFILES_DATA_LOADING" }