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.
- package/package.json +1 -1
- package/src/__tests__/alias-adopt.test.ts +364 -0
- package/src/__tests__/alias-parser.test.ts +92 -0
- package/src/__tests__/alias-shell-writer.test.ts +7 -0
- package/src/__tests__/alias-store.test.ts +77 -0
- package/src/__tests__/plugin-setup.test.ts +111 -0
- package/src/data/alias-flags.js +10 -1
- package/src/data/alias-flags.ts +11 -1
- package/src/services/alias-shell-writer.js +262 -8
- package/src/services/alias-shell-writer.ts +382 -8
- package/src/services/alias-store.js +52 -0
- package/src/services/alias-store.ts +60 -0
- package/src/services/plugin-setup.js +59 -4
- package/src/services/plugin-setup.ts +61 -4
- package/src/ui/App.js +16 -7
- package/src/ui/App.tsx +16 -7
- package/src/ui/components/FlagDetailEditor.js +0 -0
- package/src/ui/components/FlagDetailEditor.tsx +0 -0
- package/src/ui/components/modals/ConfirmModal.js +1 -1
- package/src/ui/components/modals/ConfirmModal.tsx +1 -1
- package/src/ui/screens/AliasScreen.js +380 -277
- package/src/ui/screens/AliasScreen.tsx +491 -359
- package/src/ui/screens/PluginsScreen.js +4 -1
- package/src/ui/screens/PluginsScreen.tsx +3 -1
- package/src/ui/state/reducer.js +5 -1
- package/src/ui/state/reducer.ts +6 -1
- package/src/ui/state/types.ts +8 -0
|
@@ -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?",
|
package/src/ui/state/reducer.js
CHANGED
|
@@ -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
|
|
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
|
// =========================================================================
|
package/src/ui/state/reducer.ts
CHANGED
|
@@ -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
|
|
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
|
// =========================================================================
|
package/src/ui/state/types.ts
CHANGED
|
@@ -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" }
|