brew-tui 0.8.1 → 0.9.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/build/{brewbar-installer-DCF37YM3.js → brewbar-installer-LCENEWJB.js} +2 -2
- package/build/{brewfile-manager-6LXONGSA.js → brewfile-manager-G7Q4IOG3.js} +4 -4
- package/build/{chunk-VLREAA5F.js → chunk-BRXZG7ZL.js} +2 -2
- package/build/{chunk-QZZZAAWG.js → chunk-IGDHDXUH.js} +11 -1
- package/build/chunk-IGDHDXUH.js.map +1 -0
- package/build/{chunk-FIPCCYL6.js → chunk-J6HCX7RG.js} +2 -2
- package/build/{chunk-OHMNJ3EA.js → chunk-MHHIHUCY.js} +15 -9
- package/build/chunk-MHHIHUCY.js.map +1 -0
- package/build/{chunk-3VDIKVS3.js → chunk-QX5DEW3S.js} +3 -3
- package/build/{chunk-JYHINZVV.js → chunk-VQJBFXZN.js} +2 -2
- package/build/{chunk-3OIVIQWW.js → chunk-VXTPR2FD.js} +4 -4
- package/build/compliance-checker-IXZHIMQG.js +12 -0
- package/build/{history-logger-FJ3HZSFU.js → history-logger-SB5UG5BQ.js} +3 -3
- package/build/index.js +297 -251
- package/build/index.js.map +1 -1
- package/build/{snapshot-JDRSBMG6.js → snapshot-ZOJETCED.js} +3 -3
- package/build/{sync-engine-CIL6C44Z.js → sync-engine-IKKIWF2Y.js} +5 -5
- package/build/{version-check-LEJWNDQK.js → version-check-GUAV5TWD.js} +2 -2
- package/package.json +1 -1
- package/build/chunk-OHMNJ3EA.js.map +0 -1
- package/build/chunk-QZZZAAWG.js.map +0 -1
- package/build/compliance-checker-MAREAFDH.js +0 -12
- /package/build/{brewbar-installer-DCF37YM3.js.map → brewbar-installer-LCENEWJB.js.map} +0 -0
- /package/build/{brewfile-manager-6LXONGSA.js.map → brewfile-manager-G7Q4IOG3.js.map} +0 -0
- /package/build/{chunk-VLREAA5F.js.map → chunk-BRXZG7ZL.js.map} +0 -0
- /package/build/{chunk-FIPCCYL6.js.map → chunk-J6HCX7RG.js.map} +0 -0
- /package/build/{chunk-3VDIKVS3.js.map → chunk-QX5DEW3S.js.map} +0 -0
- /package/build/{chunk-JYHINZVV.js.map → chunk-VQJBFXZN.js.map} +0 -0
- /package/build/{chunk-3OIVIQWW.js.map → chunk-VXTPR2FD.js.map} +0 -0
- /package/build/{compliance-checker-MAREAFDH.js.map → compliance-checker-IXZHIMQG.js.map} +0 -0
- /package/build/{history-logger-FJ3HZSFU.js.map → history-logger-SB5UG5BQ.js.map} +0 -0
- /package/build/{snapshot-JDRSBMG6.js.map → snapshot-ZOJETCED.js.map} +0 -0
- /package/build/{sync-engine-CIL6C44Z.js.map → sync-engine-IKKIWF2Y.js.map} +0 -0
- /package/build/{version-check-LEJWNDQK.js.map → version-check-GUAV5TWD.js.map} +0 -0
package/build/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
loadBrewfile,
|
|
6
6
|
reconcile,
|
|
7
7
|
saveBrewfile
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-QX5DEW3S.js";
|
|
9
9
|
import {
|
|
10
10
|
activate,
|
|
11
11
|
applyConflictResolutions,
|
|
@@ -19,17 +19,17 @@ import {
|
|
|
19
19
|
readSyncEnvelope,
|
|
20
20
|
revalidate,
|
|
21
21
|
sync
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-VXTPR2FD.js";
|
|
23
23
|
import {
|
|
24
24
|
checkCompliance
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-J6HCX7RG.js";
|
|
26
26
|
import {
|
|
27
27
|
captureSnapshot,
|
|
28
28
|
execBrew,
|
|
29
29
|
loadSnapshots,
|
|
30
30
|
saveSnapshot,
|
|
31
31
|
streamBrew
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-BRXZG7ZL.js";
|
|
33
33
|
import {
|
|
34
34
|
exportReport,
|
|
35
35
|
loadPolicy
|
|
@@ -39,14 +39,15 @@ import {
|
|
|
39
39
|
clearHistory,
|
|
40
40
|
detectAction,
|
|
41
41
|
loadHistory
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-VQJBFXZN.js";
|
|
43
43
|
import {
|
|
44
44
|
DATA_DIR,
|
|
45
45
|
ONBOARDING_FLAG_PATH,
|
|
46
46
|
PROFILES_DIR,
|
|
47
47
|
ensureDataDirs,
|
|
48
|
-
getMachineId
|
|
49
|
-
|
|
48
|
+
getMachineId,
|
|
49
|
+
writeLastAction
|
|
50
|
+
} from "./chunk-IGDHDXUH.js";
|
|
50
51
|
import {
|
|
51
52
|
fetchWithRetry,
|
|
52
53
|
fetchWithTimeout,
|
|
@@ -54,7 +55,7 @@ import {
|
|
|
54
55
|
t,
|
|
55
56
|
tp,
|
|
56
57
|
useLocaleStore
|
|
57
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-MHHIHUCY.js";
|
|
58
59
|
import {
|
|
59
60
|
logger
|
|
60
61
|
} from "./chunk-KDHEUNRI.js";
|
|
@@ -76,12 +77,11 @@ import { Box, Text as Text2, useStdout } from "ink";
|
|
|
76
77
|
|
|
77
78
|
// src/stores/navigation-store.ts
|
|
78
79
|
import { create } from "zustand";
|
|
79
|
-
var
|
|
80
|
+
var MENU_VIEWS = [
|
|
80
81
|
"dashboard",
|
|
81
82
|
"installed",
|
|
82
83
|
"outdated",
|
|
83
84
|
"package-info",
|
|
84
|
-
"search",
|
|
85
85
|
"services",
|
|
86
86
|
"doctor",
|
|
87
87
|
"profiles",
|
|
@@ -99,6 +99,8 @@ var useNavigationStore = create((set, get) => ({
|
|
|
99
99
|
selectedPackage: null,
|
|
100
100
|
selectedPackageType: null,
|
|
101
101
|
viewHistory: [],
|
|
102
|
+
menuMode: false,
|
|
103
|
+
menuCursor: 0,
|
|
102
104
|
navigate: (view) => {
|
|
103
105
|
const { currentView, viewHistory } = get();
|
|
104
106
|
if (view === currentView) return;
|
|
@@ -108,7 +110,11 @@ var useNavigationStore = create((set, get) => ({
|
|
|
108
110
|
});
|
|
109
111
|
},
|
|
110
112
|
goBack: () => {
|
|
111
|
-
const { viewHistory } = get();
|
|
113
|
+
const { viewHistory, menuMode } = get();
|
|
114
|
+
if (menuMode) {
|
|
115
|
+
set({ menuMode: false });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
112
118
|
if (viewHistory.length === 0) return;
|
|
113
119
|
const prev = viewHistory[viewHistory.length - 1];
|
|
114
120
|
set({
|
|
@@ -116,16 +122,37 @@ var useNavigationStore = create((set, get) => ({
|
|
|
116
122
|
viewHistory: viewHistory.slice(0, -1)
|
|
117
123
|
});
|
|
118
124
|
},
|
|
119
|
-
selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type })
|
|
125
|
+
selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),
|
|
126
|
+
enterMenuMode: () => {
|
|
127
|
+
const { currentView } = get();
|
|
128
|
+
const idx = MENU_VIEWS.indexOf(currentView);
|
|
129
|
+
set({ menuMode: true, menuCursor: idx >= 0 ? idx : 0 });
|
|
130
|
+
},
|
|
131
|
+
exitMenuMode: () => set({ menuMode: false }),
|
|
132
|
+
moveMenuCursor: (delta) => {
|
|
133
|
+
const { menuCursor } = get();
|
|
134
|
+
const next = menuCursor + delta;
|
|
135
|
+
if (next < 0 || next >= MENU_VIEWS.length) return;
|
|
136
|
+
set({ menuCursor: next });
|
|
137
|
+
},
|
|
138
|
+
selectMenuItem: () => {
|
|
139
|
+
const { menuCursor, currentView, viewHistory } = get();
|
|
140
|
+
const target = MENU_VIEWS[menuCursor];
|
|
141
|
+
if (!target) {
|
|
142
|
+
set({ menuMode: false });
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (target === currentView) {
|
|
146
|
+
set({ menuMode: false });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
set({
|
|
150
|
+
currentView: target,
|
|
151
|
+
viewHistory: [...viewHistory.slice(-19), currentView],
|
|
152
|
+
menuMode: false
|
|
153
|
+
});
|
|
154
|
+
}
|
|
120
155
|
}));
|
|
121
|
-
function getNextView(current) {
|
|
122
|
-
const idx = VIEWS.indexOf(current);
|
|
123
|
-
return VIEWS[(idx + 1) % VIEWS.length];
|
|
124
|
-
}
|
|
125
|
-
function getPrevView(current) {
|
|
126
|
-
const idx = VIEWS.indexOf(current);
|
|
127
|
-
return VIEWS[(idx - 1 + VIEWS.length) % VIEWS.length];
|
|
128
|
-
}
|
|
129
156
|
|
|
130
157
|
// src/lib/license/feature-gate.ts
|
|
131
158
|
var PRO_VIEWS = /* @__PURE__ */ new Set([
|
|
@@ -313,98 +340,49 @@ var VIEW_LABEL_KEYS = {
|
|
|
313
340
|
compliance: "view_compliance",
|
|
314
341
|
account: "view_account"
|
|
315
342
|
};
|
|
316
|
-
|
|
317
|
-
dashboard: "1",
|
|
318
|
-
installed: "2",
|
|
319
|
-
search: "",
|
|
320
|
-
outdated: "3",
|
|
321
|
-
"package-info": "",
|
|
322
|
-
services: "4",
|
|
323
|
-
doctor: "5",
|
|
324
|
-
profiles: "6",
|
|
325
|
-
"smart-cleanup": "7",
|
|
326
|
-
history: "8",
|
|
327
|
-
"security-audit": "9",
|
|
328
|
-
rollback: "",
|
|
329
|
-
brewfile: "",
|
|
330
|
-
sync: "",
|
|
331
|
-
compliance: "",
|
|
332
|
-
account: "0"
|
|
333
|
-
};
|
|
334
|
-
var TAB_VIEWS = [
|
|
335
|
-
"dashboard",
|
|
336
|
-
"installed",
|
|
337
|
-
"outdated",
|
|
338
|
-
"package-info",
|
|
339
|
-
"services",
|
|
340
|
-
"doctor",
|
|
341
|
-
"profiles",
|
|
342
|
-
"smart-cleanup",
|
|
343
|
-
"history",
|
|
344
|
-
"rollback",
|
|
345
|
-
"brewfile",
|
|
346
|
-
"sync",
|
|
347
|
-
"security-audit",
|
|
348
|
-
"compliance",
|
|
349
|
-
"account"
|
|
350
|
-
];
|
|
351
|
-
function MenuItem({ view, currentView }) {
|
|
352
|
-
const key = VIEW_KEYS[view];
|
|
343
|
+
function MenuItem({ view, currentView, cursorView, menuMode }) {
|
|
353
344
|
const viewLabel = t(VIEW_LABEL_KEYS[view]);
|
|
354
345
|
const isPro = isProView(view) || isTeamView(view);
|
|
355
|
-
const
|
|
346
|
+
const isCurrent = view === currentView;
|
|
347
|
+
const isCursor = menuMode && view === cursorView;
|
|
356
348
|
const isAccount = view === "account";
|
|
357
|
-
const
|
|
349
|
+
const indicatorColor = isCursor ? COLORS.brand : COLORS.success;
|
|
350
|
+
const labelColor = isCursor ? COLORS.brand : isCurrent ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary;
|
|
351
|
+
const showArrow = menuMode ? isCursor : isCurrent;
|
|
358
352
|
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
359
|
-
|
|
353
|
+
showArrow ? /* @__PURE__ */ jsxs(Text2, { color: indicatorColor, bold: true, children: [
|
|
360
354
|
"\u25B6",
|
|
361
355
|
" "
|
|
362
356
|
] }) : /* @__PURE__ */ jsx2(Text2, { children: " " }),
|
|
363
|
-
/* @__PURE__ */ jsx2(Text2, { bold:
|
|
364
|
-
/* @__PURE__ */ jsxs(Text2, { bold: isActive, underline: isActive, color: isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary, children: [
|
|
365
|
-
" ",
|
|
366
|
-
viewLabel
|
|
367
|
-
] }),
|
|
357
|
+
/* @__PURE__ */ jsx2(Text2, { bold: showArrow, underline: !menuMode && isCurrent, color: labelColor, children: viewLabel }),
|
|
368
358
|
isPro && /* @__PURE__ */ jsxs(Text2, { color: COLORS.brand, bold: true, children: [
|
|
369
359
|
" ",
|
|
370
360
|
t("pro_badge")
|
|
371
361
|
] })
|
|
372
362
|
] });
|
|
373
363
|
}
|
|
374
|
-
var COL1_VIEWS =
|
|
375
|
-
var COL2_VIEWS =
|
|
364
|
+
var COL1_VIEWS = MENU_VIEWS.slice(0, 6);
|
|
365
|
+
var COL2_VIEWS = MENU_VIEWS.slice(6);
|
|
376
366
|
function Header() {
|
|
377
367
|
const currentView = useNavigationStore((s) => s.currentView);
|
|
368
|
+
const menuMode = useNavigationStore((s) => s.menuMode);
|
|
369
|
+
const menuCursor = useNavigationStore((s) => s.menuCursor);
|
|
378
370
|
useLocaleStore((s) => s.locale);
|
|
379
371
|
const { stdout } = useStdout();
|
|
380
372
|
const cols = stdout?.columns ?? 80;
|
|
381
373
|
const isNarrow = cols < 95;
|
|
374
|
+
const cursorView = menuMode ? MENU_VIEWS[menuCursor] ?? null : null;
|
|
382
375
|
const logoBlock = /* @__PURE__ */ jsx2(Box, { flexDirection: "column", flexShrink: 0, children: LOGO_BREW.map((brew, i) => /* @__PURE__ */ jsxs(Box, { children: [
|
|
383
376
|
/* @__PURE__ */ jsx2(GradientText, { colors: GRADIENTS.gold, children: brew }),
|
|
384
377
|
/* @__PURE__ */ jsx2(GradientText, { colors: GRADIENTS.darkGold, children: LOGO_TUI[i] })
|
|
385
378
|
] }, `logo-${i}`)) });
|
|
386
|
-
const
|
|
379
|
+
const menuBorderColor = menuMode ? COLORS.brand : COLORS.lavender;
|
|
380
|
+
const menuBlock = /* @__PURE__ */ jsxs(Box, { borderStyle: "round", borderColor: menuBorderColor, paddingX: SPACING.xs, flexDirection: "column", alignSelf: isNarrow ? "flex-start" : "center", children: [
|
|
387
381
|
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
|
|
388
|
-
/* @__PURE__ */ jsx2(Box, { flexDirection: "column", children: COL1_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView }, view)) }),
|
|
389
|
-
/* @__PURE__ */ jsx2(Box, { flexDirection: "column", marginLeft: SPACING.sm, children: COL2_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView }, view)) })
|
|
382
|
+
/* @__PURE__ */ jsx2(Box, { flexDirection: "column", children: COL1_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView, cursorView, menuMode }, view)) }),
|
|
383
|
+
/* @__PURE__ */ jsx2(Box, { flexDirection: "column", marginLeft: SPACING.sm, children: COL2_VIEWS.map((view) => /* @__PURE__ */ jsx2(MenuItem, { view, currentView, cursorView, menuMode }, view)) })
|
|
390
384
|
] }),
|
|
391
|
-
/* @__PURE__ */
|
|
392
|
-
/* @__PURE__ */ jsx2(Text2, { bold: true, color: COLORS.white, children: "S" }),
|
|
393
|
-
/* @__PURE__ */ jsxs(Text2, { color: COLORS.textSecondary, children: [
|
|
394
|
-
" ",
|
|
395
|
-
t("hint_search")
|
|
396
|
-
] }),
|
|
397
|
-
/* @__PURE__ */ jsxs(Text2, { color: COLORS.lavender, children: [
|
|
398
|
-
" ",
|
|
399
|
-
"\u2503",
|
|
400
|
-
" "
|
|
401
|
-
] }),
|
|
402
|
-
/* @__PURE__ */ jsx2(Text2, { bold: true, color: COLORS.white, children: "L" }),
|
|
403
|
-
/* @__PURE__ */ jsxs(Text2, { color: COLORS.textSecondary, children: [
|
|
404
|
-
" ",
|
|
405
|
-
t("hint_lang")
|
|
406
|
-
] })
|
|
407
|
-
] })
|
|
385
|
+
/* @__PURE__ */ jsx2(Box, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: menuBorderColor, marginTop: SPACING.none, children: menuMode ? /* @__PURE__ */ jsx2(Text2, { color: COLORS.brand, children: t("hint_menuMode") }) : /* @__PURE__ */ jsx2(Text2, { color: COLORS.textSecondary, children: t("hint_menuOpen") }) })
|
|
408
386
|
] });
|
|
409
387
|
if (isNarrow) {
|
|
410
388
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: SPACING.xs, children: [
|
|
@@ -423,25 +401,27 @@ import React2 from "react";
|
|
|
423
401
|
import { Box as Box2, Text as Text3 } from "ink";
|
|
424
402
|
import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
425
403
|
var VIEW_HINT_DEFS = {
|
|
426
|
-
dashboard: [["1
|
|
427
|
-
installed: [["/", "hint_filter"], ["enter", "hint_info"], ["
|
|
428
|
-
search: [["
|
|
429
|
-
outdated: [["enter", "hint_upgrade"], ["
|
|
430
|
-
"package-info": [["
|
|
431
|
-
services: [["
|
|
432
|
-
doctor: [["
|
|
433
|
-
profiles: [["
|
|
434
|
-
"smart-cleanup": [["enter", "hint_toggle"], ["
|
|
435
|
-
history: [["/", "hint_search"], ["enter", "hint_replay"], ["
|
|
436
|
-
"security-audit": [["
|
|
437
|
-
rollback: [["j/k", "hint_navigate"], ["enter", "hint_select"], ["
|
|
438
|
-
brewfile: [["
|
|
439
|
-
sync: [["
|
|
440
|
-
compliance: [["
|
|
441
|
-
account: [["
|
|
404
|
+
dashboard: [["1", "hint_refresh"]],
|
|
405
|
+
installed: [["/", "hint_filter"], ["enter", "hint_info"], ["1", "hint_uninstall"], ["2", "hint_switchTab"]],
|
|
406
|
+
search: [["enter", "hint_details"], ["1", "hint_install"]],
|
|
407
|
+
outdated: [["enter", "hint_upgrade"], ["1", "hint_upgradeAll"], ["2", "hint_pin"], ["3", "hint_refresh"]],
|
|
408
|
+
"package-info": [["1", "hint_install"], ["2", "hint_uninstall"], ["3", "hint_upgrade"]],
|
|
409
|
+
services: [["1", "hint_start"], ["2", "hint_stop"], ["3", "hint_restart"], ["4", "hint_refresh"]],
|
|
410
|
+
doctor: [["1", "hint_refresh"]],
|
|
411
|
+
profiles: [["enter", "hint_details"], ["1", "hint_new"], ["2", "hint_edit"], ["3", "hint_import"], ["4", "hint_delete"]],
|
|
412
|
+
"smart-cleanup": [["enter", "hint_toggle"], ["1", "hint_all"], ["2", "hint_clean"], ["3", "hint_force"], ["4", "hint_refresh"]],
|
|
413
|
+
history: [["/", "hint_search"], ["enter", "hint_replay"], ["1", "hint_filter"], ["2", "hint_clear"]],
|
|
414
|
+
"security-audit": [["enter", "hint_details"], ["1", "hint_scan"], ["2", "hint_upgrade"]],
|
|
415
|
+
rollback: [["j/k", "hint_navigate"], ["enter", "hint_select"], ["1", "hint_rollback_confirm"]],
|
|
416
|
+
brewfile: [["1", "hint_new"], ["2", "hint_refresh"], ["3", "hint_reconcile"]],
|
|
417
|
+
sync: [["1", "hint_sync"], ["2", "hint_refresh"], ["3", "hint_conflict"], ["4", "hint_useLocal"]],
|
|
418
|
+
compliance: [["1", "hint_scan"], ["2", "hint_import"], ["3", "hint_export"], ["4", "hint_clean"]],
|
|
419
|
+
account: [["1", "hint_promo"], ["2", "hint_deactivate"]]
|
|
442
420
|
};
|
|
421
|
+
function hasNumberedActions(defs) {
|
|
422
|
+
return defs.some(([key]) => /^\d+$/.test(key));
|
|
423
|
+
}
|
|
443
424
|
function HintItem({ def }) {
|
|
444
|
-
if (def.length === 1) return /* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t(def[0]) });
|
|
445
425
|
return /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
446
426
|
/* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: def[0] }),
|
|
447
427
|
/* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
|
|
@@ -450,32 +430,50 @@ function HintItem({ def }) {
|
|
|
450
430
|
}
|
|
451
431
|
function Footer() {
|
|
452
432
|
const currentView = useNavigationStore((s) => s.currentView);
|
|
433
|
+
const menuMode = useNavigationStore((s) => s.menuMode);
|
|
453
434
|
const locale = useLocaleStore((s) => s.locale);
|
|
454
435
|
const defs = VIEW_HINT_DEFS[currentView] ?? [];
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
436
|
+
const showChoose = hasNumberedActions(defs) && !menuMode;
|
|
437
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
|
|
438
|
+
showChoose && /* @__PURE__ */ jsx3(Box2, { paddingX: SPACING.xs, children: /* @__PURE__ */ jsx3(Text3, { color: COLORS.text, children: t("hint_chooseNumber") }) }),
|
|
439
|
+
/* @__PURE__ */ jsxs2(Box2, { borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: COLORS.gold, paddingX: SPACING.xs, flexWrap: "wrap", children: [
|
|
440
|
+
!menuMode && defs.map((def, i) => /* @__PURE__ */ jsxs2(React2.Fragment, { children: [
|
|
459
441
|
i > 0 && /* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
|
|
460
442
|
" ",
|
|
461
443
|
"\u2502",
|
|
462
444
|
" "
|
|
463
445
|
] }),
|
|
464
446
|
/* @__PURE__ */ jsx3(HintItem, { def })
|
|
465
|
-
] },
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
447
|
+
] }, `${def[0]}:${def[1]}`)),
|
|
448
|
+
!menuMode && defs.length > 0 && /* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
|
|
449
|
+
" ",
|
|
450
|
+
"\u2502",
|
|
451
|
+
" "
|
|
452
|
+
] }),
|
|
453
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "esc" }),
|
|
454
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
|
|
455
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t("hint_back") }),
|
|
456
|
+
/* @__PURE__ */ jsxs2(Text3, { color: COLORS.border, children: [
|
|
457
|
+
" ",
|
|
458
|
+
"\u2502",
|
|
459
|
+
" "
|
|
460
|
+
] }),
|
|
461
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "q" }),
|
|
462
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
|
|
463
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.gold, dimColor: true, children: t("hint_quit") }),
|
|
464
|
+
/* @__PURE__ */ jsxs2(Text3, { color: COLORS.lavender, children: [
|
|
465
|
+
" ",
|
|
466
|
+
"\u2503",
|
|
467
|
+
" "
|
|
468
|
+
] }),
|
|
469
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.text, bold: true, children: "L" }),
|
|
470
|
+
/* @__PURE__ */ jsx3(Text3, { color: COLORS.textSecondary, children: ":" }),
|
|
471
|
+
/* @__PURE__ */ jsxs2(Text3, { color: COLORS.gold, dimColor: true, children: [
|
|
472
|
+
t("hint_lang"),
|
|
473
|
+
"(",
|
|
474
|
+
locale,
|
|
475
|
+
")"
|
|
476
|
+
] })
|
|
479
477
|
] })
|
|
480
478
|
] });
|
|
481
479
|
}
|
|
@@ -629,27 +627,42 @@ var useModalStore = create3((set) => ({
|
|
|
629
627
|
}));
|
|
630
628
|
|
|
631
629
|
// src/hooks/use-keyboard.ts
|
|
632
|
-
var VIEW_KEYS2 = {
|
|
633
|
-
"1": "dashboard",
|
|
634
|
-
"2": "installed",
|
|
635
|
-
"3": "outdated",
|
|
636
|
-
"4": "services",
|
|
637
|
-
"5": "doctor",
|
|
638
|
-
"6": "profiles",
|
|
639
|
-
"7": "smart-cleanup",
|
|
640
|
-
"8": "history",
|
|
641
|
-
"9": "security-audit",
|
|
642
|
-
"0": "account"
|
|
643
|
-
};
|
|
644
630
|
function useGlobalKeyboard(opts) {
|
|
645
631
|
const navigate = useNavigationStore((s) => s.navigate);
|
|
646
|
-
const currentView = useNavigationStore((s) => s.currentView);
|
|
647
632
|
const goBack = useNavigationStore((s) => s.goBack);
|
|
633
|
+
const menuMode = useNavigationStore((s) => s.menuMode);
|
|
634
|
+
const enterMenuMode = useNavigationStore((s) => s.enterMenuMode);
|
|
635
|
+
const exitMenuMode = useNavigationStore((s) => s.exitMenuMode);
|
|
636
|
+
const moveMenuCursor = useNavigationStore((s) => s.moveMenuCursor);
|
|
637
|
+
const selectMenuItem = useNavigationStore((s) => s.selectMenuItem);
|
|
648
638
|
const { locale, setLocale } = useLocaleStore();
|
|
649
639
|
const modalOpen = useModalStore((s) => s.isOpen);
|
|
650
640
|
useInput((input, key) => {
|
|
651
641
|
if (opts?.disabled) return;
|
|
652
642
|
if (modalOpen) return;
|
|
643
|
+
if (menuMode) {
|
|
644
|
+
if (input === "q" || key.ctrl && input === "c") {
|
|
645
|
+
opts?.onQuit?.();
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
if (key.escape || input === "m") {
|
|
649
|
+
exitMenuMode();
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
if (key.upArrow) {
|
|
653
|
+
moveMenuCursor(-1);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
if (key.downArrow) {
|
|
657
|
+
moveMenuCursor(1);
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
if (key.return) {
|
|
661
|
+
selectMenuItem();
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
653
666
|
if (input === "q" || key.ctrl && input === "c") {
|
|
654
667
|
opts?.onQuit?.();
|
|
655
668
|
return;
|
|
@@ -658,12 +671,8 @@ function useGlobalKeyboard(opts) {
|
|
|
658
671
|
goBack();
|
|
659
672
|
return;
|
|
660
673
|
}
|
|
661
|
-
if (
|
|
662
|
-
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
if (key.tab) {
|
|
666
|
-
navigate(getNextView(currentView));
|
|
674
|
+
if (input === "m") {
|
|
675
|
+
enterMenuMode();
|
|
667
676
|
return;
|
|
668
677
|
}
|
|
669
678
|
if (input === "S") {
|
|
@@ -674,9 +683,6 @@ function useGlobalKeyboard(opts) {
|
|
|
674
683
|
setLocale(locale === "en" ? "es" : "en");
|
|
675
684
|
return;
|
|
676
685
|
}
|
|
677
|
-
if (input in VIEW_KEYS2) {
|
|
678
|
-
navigate(VIEW_KEYS2[input]);
|
|
679
|
-
}
|
|
680
686
|
}, { isActive: !opts?.disabled });
|
|
681
687
|
}
|
|
682
688
|
|
|
@@ -705,14 +711,24 @@ async function markOnboardingComplete() {
|
|
|
705
711
|
|
|
706
712
|
// src/views/welcome.tsx
|
|
707
713
|
import { useEffect } from "react";
|
|
708
|
-
import { Box as Box4, Text as Text4
|
|
714
|
+
import { Box as Box4, Text as Text4 } from "ink";
|
|
715
|
+
|
|
716
|
+
// src/hooks/use-view-input.ts
|
|
717
|
+
import { useInput as useInput2 } from "ink";
|
|
718
|
+
function useViewInput(handler, opts) {
|
|
719
|
+
const menuMode = useNavigationStore((s) => s.menuMode);
|
|
720
|
+
const baseActive = opts?.isActive ?? true;
|
|
721
|
+
useInput2(handler, { ...opts, isActive: baseActive && !menuMode });
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// src/views/welcome.tsx
|
|
709
725
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
710
726
|
function WelcomeView({ onContinue }) {
|
|
711
727
|
useEffect(() => {
|
|
712
728
|
return () => {
|
|
713
729
|
};
|
|
714
730
|
}, []);
|
|
715
|
-
|
|
731
|
+
useViewInput((input, key) => {
|
|
716
732
|
if (key.return || input === " " || key.escape) {
|
|
717
733
|
void markOnboardingComplete().finally(onContinue);
|
|
718
734
|
}
|
|
@@ -724,30 +740,30 @@ function WelcomeView({ onContinue }) {
|
|
|
724
740
|
/* @__PURE__ */ jsx5(Text4, { color: COLORS.muted, children: t("welcome_keysHeader") }),
|
|
725
741
|
/* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingLeft: SPACING.sm, marginTop: SPACING.xs, children: [
|
|
726
742
|
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
727
|
-
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "
|
|
728
|
-
"
|
|
729
|
-
t("
|
|
730
|
-
] }),
|
|
731
|
-
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
732
|
-
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Tab" }),
|
|
733
|
-
" ",
|
|
734
|
-
t("welcome_keyCycleView")
|
|
743
|
+
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "m" }),
|
|
744
|
+
" ",
|
|
745
|
+
t("welcome_keyMenu")
|
|
735
746
|
] }),
|
|
736
747
|
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
737
|
-
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "
|
|
748
|
+
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "\u2191 \u2193" }),
|
|
738
749
|
" ",
|
|
739
750
|
t("welcome_keyMove")
|
|
740
751
|
] }),
|
|
741
752
|
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
742
|
-
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "
|
|
743
|
-
"
|
|
744
|
-
t("
|
|
753
|
+
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "1-9" }),
|
|
754
|
+
" ",
|
|
755
|
+
t("welcome_keyAction")
|
|
745
756
|
] }),
|
|
746
757
|
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
747
758
|
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Enter" }),
|
|
748
759
|
" ",
|
|
749
760
|
t("welcome_keySelect")
|
|
750
761
|
] }),
|
|
762
|
+
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
763
|
+
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "S" }),
|
|
764
|
+
" ",
|
|
765
|
+
t("welcome_keySearch")
|
|
766
|
+
] }),
|
|
751
767
|
/* @__PURE__ */ jsxs4(Text4, { children: [
|
|
752
768
|
/* @__PURE__ */ jsx5(Text4, { color: COLORS.gold, bold: true, children: "Esc" }),
|
|
753
769
|
" ",
|
|
@@ -838,7 +854,7 @@ function UpgradePrompt({ viewId }) {
|
|
|
838
854
|
|
|
839
855
|
// src/views/dashboard.tsx
|
|
840
856
|
import { useEffect as useEffect2, useMemo as useMemo2 } from "react";
|
|
841
|
-
import { Box as Box9, Text as Text11,
|
|
857
|
+
import { Box as Box9, Text as Text11, useStdout as useStdout3 } from "ink";
|
|
842
858
|
|
|
843
859
|
// src/stores/brew-store.ts
|
|
844
860
|
import { create as create4 } from "zustand";
|
|
@@ -1988,8 +2004,8 @@ function DashboardView() {
|
|
|
1988
2004
|
useEffect2(() => {
|
|
1989
2005
|
fetchAll();
|
|
1990
2006
|
}, []);
|
|
1991
|
-
|
|
1992
|
-
if (input === "r" || input === "R") {
|
|
2007
|
+
useViewInput((input) => {
|
|
2008
|
+
if (input === "r" || input === "R" || input === "1") {
|
|
1993
2009
|
void fetchAll();
|
|
1994
2010
|
}
|
|
1995
2011
|
});
|
|
@@ -2096,7 +2112,7 @@ function DashboardView() {
|
|
|
2096
2112
|
|
|
2097
2113
|
// src/views/installed.tsx
|
|
2098
2114
|
import { useState as useState3, useMemo as useMemo3, useEffect as useEffect6 } from "react";
|
|
2099
|
-
import { Box as Box15, Text as Text17,
|
|
2115
|
+
import { Box as Box15, Text as Text17, useStdout as useStdout4 } from "ink";
|
|
2100
2116
|
|
|
2101
2117
|
// src/hooks/use-debounce.ts
|
|
2102
2118
|
import { useState, useEffect as useEffect3 } from "react";
|
|
@@ -2117,7 +2133,7 @@ async function logToHistory(args, success, error) {
|
|
|
2117
2133
|
if (!detected) return;
|
|
2118
2134
|
try {
|
|
2119
2135
|
const isPro = useLicenseStore.getState().isPro();
|
|
2120
|
-
const { appendEntry: appendEntry2 } = await import("./history-logger-
|
|
2136
|
+
const { appendEntry: appendEntry2 } = await import("./history-logger-SB5UG5BQ.js");
|
|
2121
2137
|
await appendEntry2(isPro, detected.action, detected.packageName, success, error);
|
|
2122
2138
|
} catch {
|
|
2123
2139
|
}
|
|
@@ -2169,7 +2185,7 @@ function useBrewStream() {
|
|
|
2169
2185
|
}
|
|
2170
2186
|
const MUTATING_COMMANDS = /* @__PURE__ */ new Set(["install", "uninstall", "upgrade", "pin", "unpin", "tap", "untap"]);
|
|
2171
2187
|
if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? "")) {
|
|
2172
|
-
void import("./snapshot-
|
|
2188
|
+
void import("./snapshot-ZOJETCED.js").then(({ captureSnapshot: captureSnapshot2, saveSnapshot: saveSnapshot2 }) => {
|
|
2173
2189
|
captureSnapshot2().then((s) => saveSnapshot2(s)).catch((err) => logger.warn("snapshot: capture/save failed", { error: String(err) }));
|
|
2174
2190
|
});
|
|
2175
2191
|
}
|
|
@@ -2210,7 +2226,7 @@ function SearchInput({ defaultValue, onChange, placeholder, isActive = true }) {
|
|
|
2210
2226
|
|
|
2211
2227
|
// src/components/common/confirm-dialog.tsx
|
|
2212
2228
|
import { useEffect as useEffect5 } from "react";
|
|
2213
|
-
import { Box as Box11, Text as Text13, useInput as
|
|
2229
|
+
import { Box as Box11, Text as Text13, useInput as useInput3 } from "ink";
|
|
2214
2230
|
import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2215
2231
|
function ConfirmDialog({ message, onConfirm, onCancel }) {
|
|
2216
2232
|
const locale = useLocaleStore((s) => s.locale);
|
|
@@ -2221,7 +2237,7 @@ function ConfirmDialog({ message, onConfirm, onCancel }) {
|
|
|
2221
2237
|
closeModal();
|
|
2222
2238
|
};
|
|
2223
2239
|
}, []);
|
|
2224
|
-
|
|
2240
|
+
useInput3((input, key) => {
|
|
2225
2241
|
if (input === "y" || input === "Y") onConfirm();
|
|
2226
2242
|
else if (locale === "es" && (input === "s" || input === "S")) onConfirm();
|
|
2227
2243
|
else if (input === "n" || input === "N") onCancel();
|
|
@@ -2327,7 +2343,7 @@ function InstalledView() {
|
|
|
2327
2343
|
(p) => p.name.toLowerCase().includes(lower) || p.desc.toLowerCase().includes(lower)
|
|
2328
2344
|
);
|
|
2329
2345
|
}, [formulae, casks, tab, debouncedFilter]);
|
|
2330
|
-
|
|
2346
|
+
useViewInput((input, key) => {
|
|
2331
2347
|
if (confirmUninstall) return;
|
|
2332
2348
|
if (stream.isRunning) {
|
|
2333
2349
|
if (key.escape) stream.cancel();
|
|
@@ -2351,7 +2367,7 @@ function InstalledView() {
|
|
|
2351
2367
|
setIsSearching(true);
|
|
2352
2368
|
return;
|
|
2353
2369
|
}
|
|
2354
|
-
if (input === "u" && allItems[cursor]) {
|
|
2370
|
+
if ((input === "u" || input === "1") && allItems[cursor]) {
|
|
2355
2371
|
setConfirmUninstall(allItems[cursor].name);
|
|
2356
2372
|
return;
|
|
2357
2373
|
}
|
|
@@ -2366,7 +2382,7 @@ function InstalledView() {
|
|
|
2366
2382
|
} else if (key.return && allItems[cursor]) {
|
|
2367
2383
|
selectPackage(allItems[cursor].name, tab === "formulae" ? "formula" : "cask");
|
|
2368
2384
|
navigate("package-info");
|
|
2369
|
-
} else if (input === "f") {
|
|
2385
|
+
} else if (input === "f" || input === "2") {
|
|
2370
2386
|
setTab((t2) => t2 === "formulae" ? "casks" : "formulae");
|
|
2371
2387
|
setCursor(0);
|
|
2372
2388
|
}
|
|
@@ -2487,7 +2503,7 @@ function InstalledView() {
|
|
|
2487
2503
|
|
|
2488
2504
|
// src/views/search.tsx
|
|
2489
2505
|
import { useState as useState4, useCallback as useCallback2, useEffect as useEffect7, useRef as useRef2 } from "react";
|
|
2490
|
-
import { Box as Box16, Text as Text18
|
|
2506
|
+
import { Box as Box16, Text as Text18 } from "ink";
|
|
2491
2507
|
import { TextInput as TextInput2 } from "@inkjs/ui";
|
|
2492
2508
|
import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2493
2509
|
function SearchView() {
|
|
@@ -2541,7 +2557,7 @@ function SearchView() {
|
|
|
2541
2557
|
const visibleFormulae = results ? results.formulae.slice(0, MAX_VISIBLE) : [];
|
|
2542
2558
|
const visibleCasks = results ? results.casks.slice(0, MAX_VISIBLE) : [];
|
|
2543
2559
|
const allVisible = [...visibleFormulae, ...visibleCasks];
|
|
2544
|
-
|
|
2560
|
+
useViewInput((input, key) => {
|
|
2545
2561
|
if (stream.isRunning) {
|
|
2546
2562
|
if (key.escape) stream.cancel();
|
|
2547
2563
|
return;
|
|
@@ -2562,7 +2578,7 @@ function SearchView() {
|
|
|
2562
2578
|
navigate("package-info");
|
|
2563
2579
|
return;
|
|
2564
2580
|
}
|
|
2565
|
-
if (input === "i" && allVisible[cursor]) {
|
|
2581
|
+
if ((input === "i" || input === "1") && allVisible[cursor]) {
|
|
2566
2582
|
setConfirmInstall(allVisible[cursor]);
|
|
2567
2583
|
return;
|
|
2568
2584
|
}
|
|
@@ -2673,7 +2689,7 @@ function SearchView() {
|
|
|
2673
2689
|
|
|
2674
2690
|
// src/views/outdated.tsx
|
|
2675
2691
|
import { useEffect as useEffect8, useMemo as useMemo4, useRef as useRef3, useState as useState5 } from "react";
|
|
2676
|
-
import { Box as Box17, Text as Text19,
|
|
2692
|
+
import { Box as Box17, Text as Text19, useStdout as useStdout5 } from "ink";
|
|
2677
2693
|
import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2678
2694
|
function ImpactPanel({ impact }) {
|
|
2679
2695
|
const riskColor = impact.risk === "high" ? COLORS.error : impact.risk === "medium" ? COLORS.warning : COLORS.success;
|
|
@@ -2702,6 +2718,7 @@ function OutdatedView() {
|
|
|
2702
2718
|
const [cursor, setCursor] = useState5(0);
|
|
2703
2719
|
const [confirmAction, setConfirmAction] = useState5(null);
|
|
2704
2720
|
const hasRefreshed = useRef3(false);
|
|
2721
|
+
const pendingUpgradeRef = useRef3(null);
|
|
2705
2722
|
const [impact, setImpact] = useState5(null);
|
|
2706
2723
|
const [impactLoading, setImpactLoading] = useState5(false);
|
|
2707
2724
|
useEffect8(() => {
|
|
@@ -2710,7 +2727,20 @@ function OutdatedView() {
|
|
|
2710
2727
|
useEffect8(() => {
|
|
2711
2728
|
if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {
|
|
2712
2729
|
hasRefreshed.current = true;
|
|
2713
|
-
void fetchOutdated()
|
|
2730
|
+
void fetchOutdated().then(() => {
|
|
2731
|
+
const pkgs = pendingUpgradeRef.current;
|
|
2732
|
+
if (!pkgs) return;
|
|
2733
|
+
pendingUpgradeRef.current = null;
|
|
2734
|
+
const state = useBrewStore.getState().outdated;
|
|
2735
|
+
const remaining = state.formulae.length + state.casks.length;
|
|
2736
|
+
void writeLastAction({
|
|
2737
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2738
|
+
action: "upgrade",
|
|
2739
|
+
packages: pkgs,
|
|
2740
|
+
remainingOutdated: remaining,
|
|
2741
|
+
source: "brew-tui"
|
|
2742
|
+
}).catch((err) => logger.warn("Failed to write last-action.json", err));
|
|
2743
|
+
});
|
|
2714
2744
|
}
|
|
2715
2745
|
}, [stream.isRunning, stream.error]);
|
|
2716
2746
|
const allOutdated = useMemo4(
|
|
@@ -2745,7 +2775,7 @@ function OutdatedView() {
|
|
|
2745
2775
|
cancelled = true;
|
|
2746
2776
|
};
|
|
2747
2777
|
}, [debouncedCursor, stream.isRunning]);
|
|
2748
|
-
|
|
2778
|
+
useViewInput((input, key) => {
|
|
2749
2779
|
if (stream.isRunning) {
|
|
2750
2780
|
if (key.escape) stream.cancel();
|
|
2751
2781
|
return;
|
|
@@ -2755,7 +2785,7 @@ function OutdatedView() {
|
|
|
2755
2785
|
stream.clear();
|
|
2756
2786
|
return;
|
|
2757
2787
|
}
|
|
2758
|
-
if (input === "r") {
|
|
2788
|
+
if (input === "r" || input === "3") {
|
|
2759
2789
|
stream.clear();
|
|
2760
2790
|
void fetchOutdated();
|
|
2761
2791
|
}
|
|
@@ -2768,13 +2798,13 @@ function OutdatedView() {
|
|
|
2768
2798
|
setCursor((c) => Math.max(c - 1, 0));
|
|
2769
2799
|
} else if (key.return && allOutdated[cursor]) {
|
|
2770
2800
|
setConfirmAction({ type: "single", name: allOutdated[cursor].name });
|
|
2771
|
-
} else if (input === "A" && allOutdated.length > 0) {
|
|
2801
|
+
} else if ((input === "A" || input === "1") && allOutdated.length > 0) {
|
|
2772
2802
|
setConfirmAction({ type: "all" });
|
|
2773
|
-
} else if (input === "p" && allOutdated[cursor]) {
|
|
2803
|
+
} else if ((input === "p" || input === "2") && allOutdated[cursor]) {
|
|
2774
2804
|
const pkg = allOutdated[cursor];
|
|
2775
2805
|
void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());
|
|
2776
2806
|
return;
|
|
2777
|
-
} else if (input === "r") {
|
|
2807
|
+
} else if (input === "r" || input === "3") {
|
|
2778
2808
|
void fetchOutdated();
|
|
2779
2809
|
}
|
|
2780
2810
|
});
|
|
@@ -2826,8 +2856,10 @@ ${t("outdated_upgradeAllList", { list: allOutdated.map((p) => p.name).join(", ")
|
|
|
2826
2856
|
onConfirm: () => {
|
|
2827
2857
|
hasRefreshed.current = false;
|
|
2828
2858
|
if (confirmAction.type === "all") {
|
|
2859
|
+
pendingUpgradeRef.current = allOutdated.map((p) => p.name);
|
|
2829
2860
|
void stream.run(["upgrade"]);
|
|
2830
2861
|
} else if (confirmAction.name) {
|
|
2862
|
+
pendingUpgradeRef.current = [confirmAction.name];
|
|
2831
2863
|
void stream.run(["upgrade", confirmAction.name]);
|
|
2832
2864
|
}
|
|
2833
2865
|
setConfirmAction(null);
|
|
@@ -2868,7 +2900,7 @@ ${t("outdated_upgradeAllList", { list: allOutdated.map((p) => p.name).join(", ")
|
|
|
2868
2900
|
|
|
2869
2901
|
// src/views/package-info.tsx
|
|
2870
2902
|
import { useEffect as useEffect9, useRef as useRef4, useState as useState6 } from "react";
|
|
2871
|
-
import { Box as Box18, Text as Text20
|
|
2903
|
+
import { Box as Box18, Text as Text20 } from "ink";
|
|
2872
2904
|
import { Fragment as Fragment4, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2873
2905
|
var ACTION_PROGRESS_KEYS = {
|
|
2874
2906
|
install: "pkgInfo_installing",
|
|
@@ -2932,9 +2964,23 @@ function PackageInfoView() {
|
|
|
2932
2964
|
}
|
|
2933
2965
|
}).catch(() => {
|
|
2934
2966
|
});
|
|
2967
|
+
const action = activeActionRef.current;
|
|
2968
|
+
if (action === "upgrade" || action === "install" || action === "uninstall") {
|
|
2969
|
+
void useBrewStore.getState().fetchOutdated().then(() => {
|
|
2970
|
+
const out = useBrewStore.getState().outdated;
|
|
2971
|
+
const remaining = out.formulae.length + out.casks.length;
|
|
2972
|
+
void writeLastAction({
|
|
2973
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2974
|
+
action,
|
|
2975
|
+
packages: [packageName],
|
|
2976
|
+
remainingOutdated: remaining,
|
|
2977
|
+
source: "brew-tui"
|
|
2978
|
+
}).catch((err) => logger.warn("Failed to write last-action.json", err));
|
|
2979
|
+
});
|
|
2980
|
+
}
|
|
2935
2981
|
}
|
|
2936
2982
|
}, [stream.isRunning, stream.error]);
|
|
2937
|
-
|
|
2983
|
+
useViewInput((input, key) => {
|
|
2938
2984
|
if (stream.isRunning) {
|
|
2939
2985
|
if (key.escape) stream.cancel();
|
|
2940
2986
|
return;
|
|
@@ -2942,11 +2988,11 @@ function PackageInfoView() {
|
|
|
2942
2988
|
if (confirmAction) return;
|
|
2943
2989
|
if (!formula) return;
|
|
2944
2990
|
const isInstalled2 = formula.installed.length > 0;
|
|
2945
|
-
if (input === "i" && !isInstalled2) {
|
|
2991
|
+
if ((input === "i" || input === "1") && !isInstalled2) {
|
|
2946
2992
|
setConfirmAction("install");
|
|
2947
|
-
} else if (input === "u" && isInstalled2) {
|
|
2993
|
+
} else if ((input === "u" || input === "2") && isInstalled2) {
|
|
2948
2994
|
setConfirmAction("uninstall");
|
|
2949
|
-
} else if (input === "U" && isInstalled2 && formula.outdated) {
|
|
2995
|
+
} else if ((input === "U" || input === "3") && isInstalled2 && formula.outdated) {
|
|
2950
2996
|
setConfirmAction("upgrade");
|
|
2951
2997
|
}
|
|
2952
2998
|
});
|
|
@@ -3066,7 +3112,7 @@ function PackageInfoView() {
|
|
|
3066
3112
|
|
|
3067
3113
|
// src/views/services.tsx
|
|
3068
3114
|
import { useEffect as useEffect10, useState as useState7 } from "react";
|
|
3069
|
-
import { Box as Box19, Text as Text21,
|
|
3115
|
+
import { Box as Box19, Text as Text21, useStdout as useStdout6 } from "ink";
|
|
3070
3116
|
import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
3071
3117
|
var STATUS_VARIANTS = {
|
|
3072
3118
|
started: "success",
|
|
@@ -3094,7 +3140,7 @@ function ServicesView() {
|
|
|
3094
3140
|
useEffect10(() => {
|
|
3095
3141
|
fetchServices();
|
|
3096
3142
|
}, []);
|
|
3097
|
-
|
|
3143
|
+
useViewInput((input, key) => {
|
|
3098
3144
|
if (actionInProgress) return;
|
|
3099
3145
|
if (confirmAction) return;
|
|
3100
3146
|
if (lastError) {
|
|
@@ -3104,7 +3150,7 @@ function ServicesView() {
|
|
|
3104
3150
|
setCursor((c) => Math.min(c + 1, Math.max(0, services.length - 1)));
|
|
3105
3151
|
} else if (input === "k" || key.upArrow) {
|
|
3106
3152
|
setCursor((c) => Math.max(c - 1, 0));
|
|
3107
|
-
} else if (input === "r") {
|
|
3153
|
+
} else if (input === "r" || input === "4") {
|
|
3108
3154
|
void fetchServices();
|
|
3109
3155
|
}
|
|
3110
3156
|
const svc = services[cursor];
|
|
@@ -3119,9 +3165,9 @@ function ServicesView() {
|
|
|
3119
3165
|
if (storeError) setLastError(humaniseServiceError(storeError));
|
|
3120
3166
|
});
|
|
3121
3167
|
};
|
|
3122
|
-
if (input === "s") doAction("start");
|
|
3123
|
-
else if (input === "x") setConfirmAction({ type: "stop", name: svc.name });
|
|
3124
|
-
else if (input === "R") setConfirmAction({ type: "restart", name: svc.name });
|
|
3168
|
+
if (input === "s" || input === "1") doAction("start");
|
|
3169
|
+
else if (input === "x" || input === "2") setConfirmAction({ type: "stop", name: svc.name });
|
|
3170
|
+
else if (input === "R" || input === "3") setConfirmAction({ type: "restart", name: svc.name });
|
|
3125
3171
|
});
|
|
3126
3172
|
if (loading.services) return /* @__PURE__ */ jsx21(Loading, { message: t("loading_services") });
|
|
3127
3173
|
if (errors.services) return /* @__PURE__ */ jsx21(ErrorMessage, { message: errors.services });
|
|
@@ -3194,7 +3240,7 @@ function ServicesView() {
|
|
|
3194
3240
|
|
|
3195
3241
|
// src/views/doctor.tsx
|
|
3196
3242
|
import { useEffect as useEffect11, useRef as useRef5 } from "react";
|
|
3197
|
-
import { Box as Box20, Text as Text22
|
|
3243
|
+
import { Box as Box20, Text as Text22 } from "ink";
|
|
3198
3244
|
import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
3199
3245
|
function DoctorView() {
|
|
3200
3246
|
const { doctorWarnings, doctorClean, loading, errors, fetchDoctor } = useBrewStore();
|
|
@@ -3208,8 +3254,8 @@ function DoctorView() {
|
|
|
3208
3254
|
useEffect11(() => {
|
|
3209
3255
|
fetchDoctor();
|
|
3210
3256
|
}, []);
|
|
3211
|
-
|
|
3212
|
-
if (input === "r") void fetchDoctor();
|
|
3257
|
+
useViewInput((input) => {
|
|
3258
|
+
if (input === "r" || input === "1") void fetchDoctor();
|
|
3213
3259
|
});
|
|
3214
3260
|
if (loading.doctor) return /* @__PURE__ */ jsx22(Loading, { message: t("loading_doctor") });
|
|
3215
3261
|
if (errors.doctor) return /* @__PURE__ */ jsx22(ErrorMessage, { message: errors.doctor });
|
|
@@ -3229,7 +3275,7 @@ function DoctorView() {
|
|
|
3229
3275
|
|
|
3230
3276
|
// src/views/profiles.tsx
|
|
3231
3277
|
import { useEffect as useEffect12, useRef as useRef6, useState as useState8 } from "react";
|
|
3232
|
-
import { Box as Box25
|
|
3278
|
+
import { Box as Box25 } from "ink";
|
|
3233
3279
|
|
|
3234
3280
|
// src/stores/profile-store.ts
|
|
3235
3281
|
import { create as create9 } from "zustand";
|
|
@@ -3618,13 +3664,13 @@ function ProfilesView() {
|
|
|
3618
3664
|
}
|
|
3619
3665
|
return void 0;
|
|
3620
3666
|
}, [mode]);
|
|
3621
|
-
|
|
3667
|
+
useViewInput((input, key) => {
|
|
3622
3668
|
if (mode !== "list" || confirmDelete) return;
|
|
3623
|
-
if (input === "n") {
|
|
3669
|
+
if (input === "n" || input === "1") {
|
|
3624
3670
|
setMode("create-name");
|
|
3625
3671
|
return;
|
|
3626
3672
|
}
|
|
3627
|
-
if (input === "d" && profileNames[cursor]) {
|
|
3673
|
+
if ((input === "d" || input === "4") && profileNames[cursor]) {
|
|
3628
3674
|
setConfirmDelete(true);
|
|
3629
3675
|
return;
|
|
3630
3676
|
}
|
|
@@ -3633,25 +3679,25 @@ function ProfilesView() {
|
|
|
3633
3679
|
setMode("detail");
|
|
3634
3680
|
return;
|
|
3635
3681
|
}
|
|
3636
|
-
if (input === "i" && profileNames[cursor]) {
|
|
3682
|
+
if ((input === "i" || input === "3") && profileNames[cursor]) {
|
|
3637
3683
|
void prepareImport(profileNames[cursor]);
|
|
3638
3684
|
return;
|
|
3639
3685
|
}
|
|
3640
3686
|
if (input === "j" || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, profileNames.length - 1)));
|
|
3641
3687
|
else if (input === "k" || key.upArrow) setCursor((c) => Math.max(c - 1, 0));
|
|
3642
3688
|
});
|
|
3643
|
-
|
|
3689
|
+
useViewInput((input, key) => {
|
|
3644
3690
|
if (key.escape || input === "q") {
|
|
3645
3691
|
setMode("list");
|
|
3646
3692
|
return;
|
|
3647
3693
|
}
|
|
3648
|
-
if (input === "e" && selectedProfile) {
|
|
3694
|
+
if ((input === "e" || input === "2") && selectedProfile) {
|
|
3649
3695
|
setEditName(selectedProfile.name);
|
|
3650
3696
|
setEditDesc(selectedProfile.description);
|
|
3651
3697
|
setMode("edit-name");
|
|
3652
3698
|
}
|
|
3653
3699
|
}, { isActive: mode === "detail" });
|
|
3654
|
-
|
|
3700
|
+
useViewInput(() => {
|
|
3655
3701
|
setMode("list");
|
|
3656
3702
|
}, { isActive: mode === "importing" && !importRunning });
|
|
3657
3703
|
const prepareImport = async (name) => {
|
|
@@ -3786,7 +3832,7 @@ function ProfilesView() {
|
|
|
3786
3832
|
|
|
3787
3833
|
// src/views/smart-cleanup.tsx
|
|
3788
3834
|
import { useEffect as useEffect13, useRef as useRef7, useState as useState9 } from "react";
|
|
3789
|
-
import { Box as Box26, Text as Text27
|
|
3835
|
+
import { Box as Box26, Text as Text27 } from "ink";
|
|
3790
3836
|
|
|
3791
3837
|
// src/stores/cleanup-store.ts
|
|
3792
3838
|
import { create as create10 } from "zustand";
|
|
@@ -3926,17 +3972,17 @@ function SmartCleanupView() {
|
|
|
3926
3972
|
}, [stream.isRunning, stream.error]);
|
|
3927
3973
|
const candidates = summary?.candidates ?? [];
|
|
3928
3974
|
const isDependencyError = stream.error != null && stream.lines.some((l) => l.includes("Refusing to uninstall") || l.includes("required by"));
|
|
3929
|
-
|
|
3975
|
+
useViewInput((input, key) => {
|
|
3930
3976
|
if (stream.isRunning) {
|
|
3931
3977
|
if (key.escape) stream.cancel();
|
|
3932
3978
|
return;
|
|
3933
3979
|
}
|
|
3934
3980
|
if (confirmClean || confirmForce) return;
|
|
3935
|
-
if (input === "F" && isDependencyError && failedNames.length > 0) {
|
|
3981
|
+
if ((input === "F" || input === "3") && isDependencyError && failedNames.length > 0) {
|
|
3936
3982
|
setConfirmForce(true);
|
|
3937
3983
|
return;
|
|
3938
3984
|
}
|
|
3939
|
-
if (input === "r") {
|
|
3985
|
+
if (input === "r" || input === "4") {
|
|
3940
3986
|
stream.clear();
|
|
3941
3987
|
setFailedNames([]);
|
|
3942
3988
|
void analyze();
|
|
@@ -3946,11 +3992,11 @@ function SmartCleanupView() {
|
|
|
3946
3992
|
toggleSelect(candidates[cursor].name);
|
|
3947
3993
|
return;
|
|
3948
3994
|
}
|
|
3949
|
-
if (input === "a") {
|
|
3995
|
+
if (input === "a" || input === "1") {
|
|
3950
3996
|
selectAll();
|
|
3951
3997
|
return;
|
|
3952
3998
|
}
|
|
3953
|
-
if (input === "c" && selected.size > 0) {
|
|
3999
|
+
if ((input === "c" || input === "2") && selected.size > 0) {
|
|
3954
4000
|
setConfirmClean(true);
|
|
3955
4001
|
return;
|
|
3956
4002
|
}
|
|
@@ -4042,7 +4088,7 @@ function SmartCleanupView() {
|
|
|
4042
4088
|
|
|
4043
4089
|
// src/views/history.tsx
|
|
4044
4090
|
import { useEffect as useEffect14, useState as useState10, useMemo as useMemo5 } from "react";
|
|
4045
|
-
import { Box as Box27, Text as Text28,
|
|
4091
|
+
import { Box as Box27, Text as Text28, useStdout as useStdout7 } from "ink";
|
|
4046
4092
|
|
|
4047
4093
|
// src/stores/history-store.ts
|
|
4048
4094
|
import { create as create11 } from "zustand";
|
|
@@ -4128,7 +4174,7 @@ function HistoryView() {
|
|
|
4128
4174
|
}
|
|
4129
4175
|
return result;
|
|
4130
4176
|
}, [entries, filter, debouncedQuery]);
|
|
4131
|
-
|
|
4177
|
+
useViewInput((input, key) => {
|
|
4132
4178
|
if (confirmClear || confirmReplay || stream.isRunning) return;
|
|
4133
4179
|
if (isSearching) {
|
|
4134
4180
|
if (key.escape) {
|
|
@@ -4141,13 +4187,13 @@ function HistoryView() {
|
|
|
4141
4187
|
setIsSearching(true);
|
|
4142
4188
|
return;
|
|
4143
4189
|
}
|
|
4144
|
-
if (input === "f") {
|
|
4190
|
+
if (input === "f" || input === "1") {
|
|
4145
4191
|
const idx = FILTERS.indexOf(filter);
|
|
4146
4192
|
setFilter(FILTERS[(idx + 1) % FILTERS.length]);
|
|
4147
4193
|
setCursor(0);
|
|
4148
4194
|
return;
|
|
4149
4195
|
}
|
|
4150
|
-
if (input === "c" && entries.length > 0) {
|
|
4196
|
+
if ((input === "c" || input === "2") && entries.length > 0) {
|
|
4151
4197
|
setConfirmClear(true);
|
|
4152
4198
|
return;
|
|
4153
4199
|
}
|
|
@@ -4242,7 +4288,7 @@ function HistoryView() {
|
|
|
4242
4288
|
|
|
4243
4289
|
// src/views/security-audit.tsx
|
|
4244
4290
|
import { useEffect as useEffect15, useState as useState11 } from "react";
|
|
4245
|
-
import { Box as Box28, Text as Text29
|
|
4291
|
+
import { Box as Box28, Text as Text29 } from "ink";
|
|
4246
4292
|
import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
4247
4293
|
var SEVERITY_COLORS = {
|
|
4248
4294
|
CRITICAL: COLORS.error,
|
|
@@ -4272,9 +4318,9 @@ function SecurityAuditView() {
|
|
|
4272
4318
|
scan();
|
|
4273
4319
|
}, []);
|
|
4274
4320
|
const results = summary?.results ?? [];
|
|
4275
|
-
|
|
4321
|
+
useViewInput((input, key) => {
|
|
4276
4322
|
if (confirmUpgrade || stream.isRunning) return;
|
|
4277
|
-
if (input === "r") {
|
|
4323
|
+
if (input === "r" || input === "1") {
|
|
4278
4324
|
void scan(true);
|
|
4279
4325
|
return;
|
|
4280
4326
|
}
|
|
@@ -4282,7 +4328,7 @@ function SecurityAuditView() {
|
|
|
4282
4328
|
navigate("rollback");
|
|
4283
4329
|
return;
|
|
4284
4330
|
}
|
|
4285
|
-
if (input === "u" && results[cursor]) {
|
|
4331
|
+
if ((input === "u" || input === "2") && results[cursor]) {
|
|
4286
4332
|
setConfirmUpgrade(results[cursor].packageName);
|
|
4287
4333
|
return;
|
|
4288
4334
|
}
|
|
@@ -4374,7 +4420,7 @@ function SecurityAuditView() {
|
|
|
4374
4420
|
|
|
4375
4421
|
// src/views/account.tsx
|
|
4376
4422
|
import { useState as useState12 } from "react";
|
|
4377
|
-
import { Box as Box29, Text as Text30
|
|
4423
|
+
import { Box as Box29, Text as Text30 } from "ink";
|
|
4378
4424
|
import { TextInput as TextInput5 } from "@inkjs/ui";
|
|
4379
4425
|
|
|
4380
4426
|
// src/lib/license/promo.ts
|
|
@@ -4462,7 +4508,7 @@ function AccountView() {
|
|
|
4462
4508
|
const [promoLoading, setPromoLoading] = useState12(false);
|
|
4463
4509
|
const [promoResult, setPromoResult] = useState12(null);
|
|
4464
4510
|
const [revalidating, setRevalidating] = useState12(false);
|
|
4465
|
-
|
|
4511
|
+
useViewInput((input, key) => {
|
|
4466
4512
|
if (confirmDeactivate || deactivating || promoMode || revalidating) {
|
|
4467
4513
|
if (key.escape && promoMode) {
|
|
4468
4514
|
setPromoMode(false);
|
|
@@ -4470,10 +4516,10 @@ function AccountView() {
|
|
|
4470
4516
|
}
|
|
4471
4517
|
return;
|
|
4472
4518
|
}
|
|
4473
|
-
if (input === "d" && status === "pro") {
|
|
4519
|
+
if ((input === "d" || input === "2") && status === "pro") {
|
|
4474
4520
|
setConfirmDeactivate(true);
|
|
4475
4521
|
}
|
|
4476
|
-
if (input === "p") {
|
|
4522
|
+
if (input === "p" || input === "1") {
|
|
4477
4523
|
setPromoMode(true);
|
|
4478
4524
|
setPromoResult(null);
|
|
4479
4525
|
}
|
|
@@ -4607,14 +4653,14 @@ function AccountView() {
|
|
|
4607
4653
|
status === "pro" || status === "team" || status === "expired" ? `v ${t("hint_revalidate")} ` : "",
|
|
4608
4654
|
revalidating ? t("account_revalidating") : "",
|
|
4609
4655
|
" ",
|
|
4610
|
-
t("app_version", { version: "0.
|
|
4656
|
+
t("app_version", { version: "0.9.0" })
|
|
4611
4657
|
] }) })
|
|
4612
4658
|
] });
|
|
4613
4659
|
}
|
|
4614
4660
|
|
|
4615
4661
|
// src/views/rollback.tsx
|
|
4616
4662
|
import { useCallback as useCallback3, useEffect as useEffect16, useRef as useRef8, useState as useState13 } from "react";
|
|
4617
|
-
import { Box as Box30, Text as Text31
|
|
4663
|
+
import { Box as Box30, Text as Text31 } from "ink";
|
|
4618
4664
|
|
|
4619
4665
|
// src/stores/rollback-store.ts
|
|
4620
4666
|
import { create as create12 } from "zustand";
|
|
@@ -4944,7 +4990,7 @@ function RollbackView() {
|
|
|
4944
4990
|
}
|
|
4945
4991
|
}
|
|
4946
4992
|
}, [isPro]);
|
|
4947
|
-
|
|
4993
|
+
useViewInput((input, key) => {
|
|
4948
4994
|
if (phase === "executing") return;
|
|
4949
4995
|
if (phase === "result") {
|
|
4950
4996
|
if (key.escape || input === "r") {
|
|
@@ -4973,7 +5019,7 @@ function RollbackView() {
|
|
|
4973
5019
|
} else if (key.return && snapshots[cursor]) {
|
|
4974
5020
|
void selectSnapshot(snapshots[cursor], isPro());
|
|
4975
5021
|
setPhase("plan");
|
|
4976
|
-
} else if (input === "r") {
|
|
5022
|
+
} else if (input === "r" || input === "1") {
|
|
4977
5023
|
void fetchSnapshots(isPro());
|
|
4978
5024
|
}
|
|
4979
5025
|
});
|
|
@@ -5038,7 +5084,7 @@ function RollbackView() {
|
|
|
5038
5084
|
|
|
5039
5085
|
// src/views/brewfile.tsx
|
|
5040
5086
|
import { useCallback as useCallback4, useEffect as useEffect17, useRef as useRef9, useState as useState14 } from "react";
|
|
5041
|
-
import { Box as Box31, Text as Text32
|
|
5087
|
+
import { Box as Box31, Text as Text32 } from "ink";
|
|
5042
5088
|
import { TextInput as TextInput6 } from "@inkjs/ui";
|
|
5043
5089
|
import { jsx as jsx33, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
5044
5090
|
function DriftScore({ score }) {
|
|
@@ -5128,7 +5174,7 @@ function BrewfileView() {
|
|
|
5128
5174
|
}
|
|
5129
5175
|
}
|
|
5130
5176
|
}, [schema, isPro]);
|
|
5131
|
-
|
|
5177
|
+
useViewInput((input, key) => {
|
|
5132
5178
|
if (phase === "reconciling") return;
|
|
5133
5179
|
if (phase === "confirming-reconcile") return;
|
|
5134
5180
|
if (phase === "result") {
|
|
@@ -5139,15 +5185,15 @@ function BrewfileView() {
|
|
|
5139
5185
|
return;
|
|
5140
5186
|
}
|
|
5141
5187
|
if (phase === "creating") return;
|
|
5142
|
-
if (input === "n") {
|
|
5188
|
+
if (input === "n" || input === "1") {
|
|
5143
5189
|
setPhase("creating");
|
|
5144
5190
|
return;
|
|
5145
5191
|
}
|
|
5146
|
-
if (input === "r") {
|
|
5192
|
+
if (input === "r" || input === "2") {
|
|
5147
5193
|
void load();
|
|
5148
5194
|
return;
|
|
5149
5195
|
}
|
|
5150
|
-
if (input === "c") {
|
|
5196
|
+
if (input === "c" || input === "3") {
|
|
5151
5197
|
const needsReconcile = drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0);
|
|
5152
5198
|
if (needsReconcile) {
|
|
5153
5199
|
setPhase("confirming-reconcile");
|
|
@@ -5267,7 +5313,7 @@ function BrewfileView() {
|
|
|
5267
5313
|
|
|
5268
5314
|
// src/views/sync.tsx
|
|
5269
5315
|
import { useCallback as useCallback5, useEffect as useEffect18, useState as useState15 } from "react";
|
|
5270
|
-
import { Box as Box32, Text as Text33
|
|
5316
|
+
import { Box as Box32, Text as Text33 } from "ink";
|
|
5271
5317
|
import { Fragment as Fragment6, jsx as jsx34, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
5272
5318
|
function OverviewSection({
|
|
5273
5319
|
config,
|
|
@@ -5412,7 +5458,7 @@ function SyncView() {
|
|
|
5412
5458
|
await resolveConflicts(resolutions);
|
|
5413
5459
|
setPhase("result");
|
|
5414
5460
|
}, [conflictEntries, resolveConflicts]);
|
|
5415
|
-
|
|
5461
|
+
useViewInput((input, key) => {
|
|
5416
5462
|
if (phase === "syncing") return;
|
|
5417
5463
|
if (phase === "confirming-sync" || phase === "confirming-apply") return;
|
|
5418
5464
|
if (phase === "result") {
|
|
@@ -5454,20 +5500,20 @@ function SyncView() {
|
|
|
5454
5500
|
return;
|
|
5455
5501
|
}
|
|
5456
5502
|
}
|
|
5457
|
-
if (input === "s") {
|
|
5503
|
+
if (input === "s" || input === "1") {
|
|
5458
5504
|
setPhase("confirming-sync");
|
|
5459
5505
|
return;
|
|
5460
5506
|
}
|
|
5461
|
-
if (input === "c" && conflicts.length > 0) {
|
|
5507
|
+
if ((input === "c" || input === "3") && conflicts.length > 0) {
|
|
5462
5508
|
setCursor(0);
|
|
5463
5509
|
setPhase("conflicts");
|
|
5464
5510
|
return;
|
|
5465
5511
|
}
|
|
5466
|
-
if (input === "c" && lastResult?.success) {
|
|
5512
|
+
if ((input === "c" || input === "3") && lastResult?.success) {
|
|
5467
5513
|
navigate("compliance");
|
|
5468
5514
|
return;
|
|
5469
5515
|
}
|
|
5470
|
-
if (input === "r") {
|
|
5516
|
+
if (input === "r" || input === "2") {
|
|
5471
5517
|
void initialize(isPro());
|
|
5472
5518
|
return;
|
|
5473
5519
|
}
|
|
@@ -5547,7 +5593,7 @@ function SyncView() {
|
|
|
5547
5593
|
|
|
5548
5594
|
// src/views/compliance.tsx
|
|
5549
5595
|
import { useCallback as useCallback6, useEffect as useEffect19, useRef as useRef10, useState as useState16 } from "react";
|
|
5550
|
-
import { Box as Box33, Text as Text34
|
|
5596
|
+
import { Box as Box33, Text as Text34 } from "ink";
|
|
5551
5597
|
import { TextInput as TextInput7 } from "@inkjs/ui";
|
|
5552
5598
|
|
|
5553
5599
|
// src/lib/compliance/compliance-remediator.ts
|
|
@@ -5735,7 +5781,7 @@ function ComplianceView() {
|
|
|
5735
5781
|
}
|
|
5736
5782
|
}
|
|
5737
5783
|
}, [report, isPro, runCheck]);
|
|
5738
|
-
|
|
5784
|
+
useViewInput((input, key) => {
|
|
5739
5785
|
if (phase === "remediating" || phase === "importing") return;
|
|
5740
5786
|
if (phase === "confirming-remediate") return;
|
|
5741
5787
|
if (phase === "result") {
|
|
@@ -5745,19 +5791,19 @@ function ComplianceView() {
|
|
|
5745
5791
|
}
|
|
5746
5792
|
return;
|
|
5747
5793
|
}
|
|
5748
|
-
if (input === "i") {
|
|
5794
|
+
if (input === "i" || input === "2") {
|
|
5749
5795
|
setPhase("importing");
|
|
5750
5796
|
return;
|
|
5751
5797
|
}
|
|
5752
|
-
if (input === "r" && policy) {
|
|
5798
|
+
if ((input === "r" || input === "1") && policy) {
|
|
5753
5799
|
handleRecheck();
|
|
5754
5800
|
return;
|
|
5755
5801
|
}
|
|
5756
|
-
if (input === "e" && report) {
|
|
5802
|
+
if ((input === "e" || input === "3") && report) {
|
|
5757
5803
|
void handleExport();
|
|
5758
5804
|
return;
|
|
5759
5805
|
}
|
|
5760
|
-
if (input === "c" && report) {
|
|
5806
|
+
if ((input === "c" || input === "4") && report) {
|
|
5761
5807
|
const actionable = report.violations.filter(
|
|
5762
5808
|
(v) => v.type === "missing" || v.type === "wrong-version"
|
|
5763
5809
|
);
|
|
@@ -6015,7 +6061,7 @@ async function reportError(err, context = {}) {
|
|
|
6015
6061
|
const config = await resolveConfig();
|
|
6016
6062
|
if (!config.enabled || !config.endpoint) return;
|
|
6017
6063
|
const machineId = await getMachineId();
|
|
6018
|
-
const version = true ? "0.
|
|
6064
|
+
const version = true ? "0.9.0" : "unknown";
|
|
6019
6065
|
await postReport(buildReport("error", err, context, machineId, version), config);
|
|
6020
6066
|
}
|
|
6021
6067
|
async function installCrashReporter() {
|
|
@@ -6024,7 +6070,7 @@ async function installCrashReporter() {
|
|
|
6024
6070
|
if (!config.enabled || !config.endpoint) return;
|
|
6025
6071
|
_installed = true;
|
|
6026
6072
|
const machineId = await getMachineId();
|
|
6027
|
-
const version = true ? "0.
|
|
6073
|
+
const version = true ? "0.9.0" : "unknown";
|
|
6028
6074
|
process.on("uncaughtException", (err) => {
|
|
6029
6075
|
void postReport(buildReport("fatal", err, { kind: "uncaughtException" }, machineId, version), config);
|
|
6030
6076
|
});
|
|
@@ -6039,7 +6085,7 @@ import { jsx as jsx37 } from "react/jsx-runtime";
|
|
|
6039
6085
|
var [, , command, arg] = process.argv;
|
|
6040
6086
|
async function runCli() {
|
|
6041
6087
|
if (command === "--version" || command === "-v" || command === "version") {
|
|
6042
|
-
process.stdout.write("0.
|
|
6088
|
+
process.stdout.write("0.9.0\n");
|
|
6043
6089
|
return;
|
|
6044
6090
|
}
|
|
6045
6091
|
await ensureDataDirs();
|
|
@@ -6134,7 +6180,7 @@ async function runCli() {
|
|
|
6134
6180
|
}
|
|
6135
6181
|
if (isPro) {
|
|
6136
6182
|
try {
|
|
6137
|
-
const { loadSnapshots: loadSnapshots2 } = await import("./snapshot-
|
|
6183
|
+
const { loadSnapshots: loadSnapshots2 } = await import("./snapshot-ZOJETCED.js");
|
|
6138
6184
|
const snapshots = await loadSnapshots2();
|
|
6139
6185
|
if (snapshots.length > 0) {
|
|
6140
6186
|
const latest = snapshots[0];
|
|
@@ -6146,7 +6192,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
|
|
|
6146
6192
|
} catch {
|
|
6147
6193
|
}
|
|
6148
6194
|
try {
|
|
6149
|
-
const { loadBrewfile: loadBrewfile2, computeDrift: computeDrift2 } = await import("./brewfile-manager-
|
|
6195
|
+
const { loadBrewfile: loadBrewfile2, computeDrift: computeDrift2 } = await import("./brewfile-manager-G7Q4IOG3.js");
|
|
6150
6196
|
const schema = await loadBrewfile2();
|
|
6151
6197
|
if (schema) {
|
|
6152
6198
|
const drift = await computeDrift2(schema);
|
|
@@ -6155,7 +6201,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
|
|
|
6155
6201
|
} catch {
|
|
6156
6202
|
}
|
|
6157
6203
|
try {
|
|
6158
|
-
const { loadSyncConfig: loadSyncConfig2 } = await import("./sync-engine-
|
|
6204
|
+
const { loadSyncConfig: loadSyncConfig2 } = await import("./sync-engine-IKKIWF2Y.js");
|
|
6159
6205
|
const syncConfig = await loadSyncConfig2();
|
|
6160
6206
|
if (syncConfig?.lastSync) {
|
|
6161
6207
|
console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);
|
|
@@ -6164,7 +6210,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
|
|
|
6164
6210
|
}
|
|
6165
6211
|
try {
|
|
6166
6212
|
const { loadPolicy: loadPolicy2 } = await import("./policy-io-EECGRKNA.js");
|
|
6167
|
-
const { checkCompliance: checkCompliance2 } = await import("./compliance-checker-
|
|
6213
|
+
const { checkCompliance: checkCompliance2 } = await import("./compliance-checker-IXZHIMQG.js");
|
|
6168
6214
|
const policy = await loadPolicy2(`${process.env["HOME"] ?? "~"}/.brew-tui/policy.yaml`).catch(() => null);
|
|
6169
6215
|
if (policy) {
|
|
6170
6216
|
const report = await checkCompliance2(policy, true);
|
|
@@ -6178,7 +6224,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
|
|
|
6178
6224
|
if (command === "install-brewbar") {
|
|
6179
6225
|
await useLicenseStore.getState().initialize();
|
|
6180
6226
|
const isPro = useLicenseStore.getState().isPro();
|
|
6181
|
-
const { installBrewBar } = await import("./brewbar-installer-
|
|
6227
|
+
const { installBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
|
|
6182
6228
|
try {
|
|
6183
6229
|
await installBrewBar(isPro, arg === "--force");
|
|
6184
6230
|
console.log(t("cli_brewbarInstalled"));
|
|
@@ -6189,7 +6235,7 @@ Snapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt)
|
|
|
6189
6235
|
return;
|
|
6190
6236
|
}
|
|
6191
6237
|
if (command === "uninstall-brewbar") {
|
|
6192
|
-
const { uninstallBrewBar } = await import("./brewbar-installer-
|
|
6238
|
+
const { uninstallBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
|
|
6193
6239
|
try {
|
|
6194
6240
|
await uninstallBrewBar();
|
|
6195
6241
|
console.log(t("cli_brewbarUninstalled"));
|
|
@@ -6220,8 +6266,8 @@ async function ensureBrewBarRunning() {
|
|
|
6220
6266
|
if (process.platform !== "darwin") return;
|
|
6221
6267
|
await useLicenseStore.getState().initialize();
|
|
6222
6268
|
if (!useLicenseStore.getState().isPro()) return;
|
|
6223
|
-
const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import("./brewbar-installer-
|
|
6224
|
-
const { checkBrewBarVersion } = await import("./version-check-
|
|
6269
|
+
const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import("./brewbar-installer-LCENEWJB.js");
|
|
6270
|
+
const { checkBrewBarVersion } = await import("./version-check-GUAV5TWD.js");
|
|
6225
6271
|
try {
|
|
6226
6272
|
if (!await isBrewBarInstalled()) {
|
|
6227
6273
|
console.log(t("cli_brewbarInstalling"));
|