brew-tui 2.3.1 → 3.0.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 (31) hide show
  1. package/build/{brew-tui-bar-installer-PCHNYMZL.js → brew-tui-bar-installer-5JMU46HK.js} +3 -3
  2. package/build/{brewfile-manager-DNRM6CQ7.js → brewfile-manager-KHDIFP23.js} +3 -3
  3. package/build/{chunk-UZMGXQKF.js → chunk-6VLQW2JL.js} +2 -2
  4. package/build/{chunk-SDQYHY2L.js → chunk-A7U3NZYM.js} +9 -11
  5. package/build/chunk-A7U3NZYM.js.map +1 -0
  6. package/build/{chunk-CCAT52XY.js → chunk-J3O7LVP7.js} +2 -2
  7. package/build/{chunk-PYDQHHI2.js → chunk-KRVYMXTP.js} +2 -2
  8. package/build/{chunk-7R4ME2NC.js → chunk-WBYR6CIO.js} +2 -2
  9. package/build/{chunk-KR6EAHEE.js → chunk-X3TEZUER.js} +2 -2
  10. package/build/{chunk-I5VZR55J.js → chunk-Y3OFIGIC.js} +3 -41
  11. package/build/chunk-Y3OFIGIC.js.map +1 -0
  12. package/build/{doctor-D56LDODR.js → doctor-3PQZV7OV.js} +8 -8
  13. package/build/doctor-3PQZV7OV.js.map +1 -0
  14. package/build/index.js +18 -24
  15. package/build/index.js.map +1 -1
  16. package/build/postinstall.js +2 -2
  17. package/build/{sync-engine-KTH4K3NG.js → sync-engine-6OL6VOVB.js} +4 -4
  18. package/build/{version-check-UUJMLUK6.js → version-check-NMOGXFF6.js} +2 -2
  19. package/package.json +3 -2
  20. package/build/chunk-I5VZR55J.js.map +0 -1
  21. package/build/chunk-SDQYHY2L.js.map +0 -1
  22. package/build/doctor-D56LDODR.js.map +0 -1
  23. /package/build/{brew-tui-bar-installer-PCHNYMZL.js.map → brew-tui-bar-installer-5JMU46HK.js.map} +0 -0
  24. /package/build/{brewfile-manager-DNRM6CQ7.js.map → brewfile-manager-KHDIFP23.js.map} +0 -0
  25. /package/build/{chunk-UZMGXQKF.js.map → chunk-6VLQW2JL.js.map} +0 -0
  26. /package/build/{chunk-CCAT52XY.js.map → chunk-J3O7LVP7.js.map} +0 -0
  27. /package/build/{chunk-PYDQHHI2.js.map → chunk-KRVYMXTP.js.map} +0 -0
  28. /package/build/{chunk-7R4ME2NC.js.map → chunk-WBYR6CIO.js.map} +0 -0
  29. /package/build/{chunk-KR6EAHEE.js.map → chunk-X3TEZUER.js.map} +0 -0
  30. /package/build/{sync-engine-KTH4K3NG.js.map → sync-engine-6OL6VOVB.js.map} +0 -0
  31. /package/build/{version-check-UUJMLUK6.js.map → version-check-NMOGXFF6.js.map} +0 -0
@@ -6,9 +6,9 @@ import {
6
6
  launchBrewTUIBar,
7
7
  syncAndLaunchBrewTUIBar,
8
8
  uninstallBrewTUIBar
9
- } from "./chunk-I5VZR55J.js";
9
+ } from "./chunk-Y3OFIGIC.js";
10
10
  import "./chunk-NRRQECXA.js";
11
- import "./chunk-SDQYHY2L.js";
11
+ import "./chunk-A7U3NZYM.js";
12
12
  import "./chunk-KDHEUNRI.js";
13
13
  export {
14
14
  bundleIdAt,
@@ -19,4 +19,4 @@ export {
19
19
  syncAndLaunchBrewTUIBar,
20
20
  uninstallBrewTUIBar
21
21
  };
22
- //# sourceMappingURL=brew-tui-bar-installer-PCHNYMZL.js.map
22
+ //# sourceMappingURL=brew-tui-bar-installer-5JMU46HK.js.map
@@ -5,8 +5,8 @@ import {
5
5
  loadBrewfile,
6
6
  reconcile,
7
7
  saveBrewfile
8
- } from "./chunk-UZMGXQKF.js";
9
- import "./chunk-SDQYHY2L.js";
8
+ } from "./chunk-6VLQW2JL.js";
9
+ import "./chunk-A7U3NZYM.js";
10
10
  import "./chunk-OXDZ4DCK.js";
11
11
  import "./chunk-KDHEUNRI.js";
12
12
  import "./chunk-LFGDNAXH.js";
@@ -18,4 +18,4 @@ export {
18
18
  reconcile,
19
19
  saveBrewfile
20
20
  };
21
- //# sourceMappingURL=brewfile-manager-DNRM6CQ7.js.map
21
+ //# sourceMappingURL=brewfile-manager-KHDIFP23.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  t
3
- } from "./chunk-SDQYHY2L.js";
3
+ } from "./chunk-A7U3NZYM.js";
4
4
  import {
5
5
  BREW_BIN,
6
6
  captureSnapshot,
@@ -870,4 +870,4 @@ export {
870
870
  computeDrift,
871
871
  reconcile
872
872
  };
873
- //# sourceMappingURL=chunk-UZMGXQKF.js.map
873
+ //# sourceMappingURL=chunk-6VLQW2JL.js.map
@@ -291,14 +291,14 @@ var en = {
291
291
  account_emailLabel: "Email:",
292
292
  account_nameLabel: "Name:",
293
293
  account_planLabel: "Plan:",
294
- account_monthlyPrice: "9.95\u20AC/month",
294
+ account_monthlyPrice: "5.45\u20AC/month",
295
295
  account_yearlyPrice: "82\u20AC/year",
296
296
  account_keyLabel: "Key:",
297
297
  account_expiresLabel: "Expires:",
298
298
  account_activatedLabel: "Activated:",
299
299
  account_upgradeTitle: "Upgrade to Brew-TUI Pro",
300
300
  account_unlockDesc: "Unlock Profiles, Smart Cleanup, History, Security Audit, and Brew-TUI-Bar (macOS menu bar companion).",
301
- account_pricing: "9.95\u20AC/month or 82\u20AC/year (save 31%)",
301
+ account_pricing: "5.45\u20AC/month or 48\u20AC/year (save 27%)",
302
302
  account_runActivate: "Run:",
303
303
  account_activateCmd: "brew-tui activate <key>",
304
304
  account_licenseExpired: "Your license has expired. Renew to continue using Pro features.",
@@ -323,7 +323,7 @@ var en = {
323
323
  upgrade_historyDesc: "Track every install, uninstall, and upgrade with timestamps. Search and filter your package management history.",
324
324
  upgrade_security: "Security Audit",
325
325
  upgrade_securityDesc: "Scan installed packages against known vulnerabilities (CVEs). See severity levels, affected versions, and available fixes.",
326
- upgrade_pricing: "9.95\u20AC/month or 82\u20AC/year (save 31%)",
326
+ upgrade_pricing: "5.45\u20AC/month or 48\u20AC/year (save 27%)",
327
327
  upgrade_teamFeature: "{{title}} \u2014 Team tier",
328
328
  upgrade_teamPricing: "8\u20AC/seat/month or 81.60\u20AC/seat/year (save 15%) \u2014 from 3 seats",
329
329
  upgrade_buyAt: "Buy at:",
@@ -331,7 +331,7 @@ var en = {
331
331
  upgrade_buyUrlTeam: "https://buy.polar.sh/polar_cl_CO6xqSzKgFiQJwXnhZYGqisOP04Wspi0KKZSn38NjFZ?quantity=3",
332
332
  upgrade_activateWith: "Then activate with:",
333
333
  upgrade_activateCmd: "brew-tui activate <your-license-key>",
334
- upgrade_proLabel: "Brew-TUI Pro \u2014 9.95\u20AC/month or 82\u20AC/year \u2014 Includes Brew-TUI-Bar for macOS",
334
+ upgrade_proLabel: "Brew-TUI Pro \u2014 5.45\u20AC/month or 48\u20AC/year \u2014 Includes Brew-TUI-Bar for macOS",
335
335
  upgrade_teamLabel: "Brew-TUI Team \u2014 8\u20AC/seat/month \u2014 Includes everything in Pro plus Compliance",
336
336
  // ── Progress Log ──
337
337
  progress_noOutput: "No output yet",
@@ -374,7 +374,6 @@ var en = {
374
374
  cli_brewtuibarAutoFailed: "\u26A0 Brew-TUI-Bar auto-launch failed: {{error}}",
375
375
  cli_brewtuibarUpdating: "Updating Brew-TUI-Bar from {{installed}} to {{expected}} to match Brew-TUI...",
376
376
  cli_brewtuibarVersionMismatch: "\u26A0 Brew-TUI-Bar {{installed}} is out of sync with Brew-TUI {{expected}}. Run: brew-tui install-brew-tui-bar --force",
377
- cli_brewtuibarLegacyAlias: "\u26A0 `{{legacy}}` is deprecated and will be removed in 2.1.0. Use `brew-tui {{current}}` instead.",
378
377
  cli_brewtuibarForeignBundle: "\u2718 /Applications/Brew-TUI-Bar.app exists but its bundle ID is `{{id}}`, not com.molinesdesigns.brewtuibar. Refusing to touch a foreign app. Remove or rename it first.",
379
378
  postinstall_skipped: "Note: Brew-TUI-Bar auto-install skipped: {{error}}",
380
379
  postinstall_manualHint: "You can install it manually later with: brew-tui install-brew-tui-bar",
@@ -815,14 +814,14 @@ var es = {
815
814
  account_emailLabel: "Email:",
816
815
  account_nameLabel: "Nombre:",
817
816
  account_planLabel: "Plan:",
818
- account_monthlyPrice: "9,95\u20AC/mes",
817
+ account_monthlyPrice: "5,45\u20AC/mes",
819
818
  account_yearlyPrice: "82\u20AC/a\xF1o",
820
819
  account_keyLabel: "Clave:",
821
820
  account_expiresLabel: "Expira:",
822
821
  account_activatedLabel: "Activado:",
823
822
  account_upgradeTitle: "Actualiza a Brew-TUI Pro",
824
823
  account_unlockDesc: "Desbloquea Perfiles, Limpieza Inteligente, Historial, Auditor\xEDa de Seguridad y Brew-TUI-Bar (barra de men\xFA macOS).",
825
- account_pricing: "9,95\u20AC/mes o 82\u20AC/a\xF1o (ahorra 31%)",
824
+ account_pricing: "5,45\u20AC/mes o 48\u20AC/a\xF1o (ahorra 27%)",
826
825
  account_runActivate: "Ejecuta:",
827
826
  account_activateCmd: "brew-tui activate <clave>",
828
827
  account_licenseExpired: "Tu licencia ha expirado. Renueva para seguir usando las funciones Pro.",
@@ -847,7 +846,7 @@ var es = {
847
846
  upgrade_historyDesc: "Rastrea cada instalaci\xF3n, desinstalaci\xF3n y actualizaci\xF3n con marcas de tiempo. Busca y filtra tu historial de gesti\xF3n de paquetes.",
848
847
  upgrade_security: "Auditor\xEDa de Seguridad",
849
848
  upgrade_securityDesc: "Escanea paquetes instalados contra vulnerabilidades conocidas (CVEs). Ve niveles de severidad, versiones afectadas y correcciones disponibles.",
850
- upgrade_pricing: "9,95\u20AC/mes o 82\u20AC/a\xF1o (ahorra 31%)",
849
+ upgrade_pricing: "5,45\u20AC/mes o 48\u20AC/a\xF1o (ahorra 27%)",
851
850
  upgrade_teamFeature: "{{title}} \u2014 Tier Team",
852
851
  upgrade_teamPricing: "8\u20AC/seat/mes o 81,60\u20AC/seat/a\xF1o (ahorra 15%) \u2014 desde 3 seats",
853
852
  upgrade_buyAt: "Compra en:",
@@ -855,7 +854,7 @@ var es = {
855
854
  upgrade_buyUrlTeam: "https://buy.polar.sh/polar_cl_CO6xqSzKgFiQJwXnhZYGqisOP04Wspi0KKZSn38NjFZ?quantity=3",
856
855
  upgrade_activateWith: "Luego activa con:",
857
856
  upgrade_activateCmd: "brew-tui activate <tu-clave-de-licencia>",
858
- upgrade_proLabel: "Brew-TUI Pro \u2014 9,95\u20AC/mes o 82\u20AC/a\xF1o \u2014 Incluye Brew-TUI-Bar para macOS",
857
+ upgrade_proLabel: "Brew-TUI Pro \u2014 5,45\u20AC/mes o 48\u20AC/a\xF1o \u2014 Incluye Brew-TUI-Bar para macOS",
859
858
  upgrade_teamLabel: "Brew-TUI Team \u2014 8\u20AC/seat/mes \u2014 Incluye todo Pro m\xE1s Compliance",
860
859
  // ── Progress Log ──
861
860
  progress_noOutput: "Sin salida a\xFAn",
@@ -898,7 +897,6 @@ var es = {
898
897
  cli_brewtuibarAutoFailed: "\u26A0 No se pudo lanzar Brew-TUI-Bar autom\xE1ticamente: {{error}}",
899
898
  cli_brewtuibarUpdating: "Actualizando Brew-TUI-Bar de {{installed}} a {{expected}} para igualar Brew-TUI...",
900
899
  cli_brewtuibarVersionMismatch: "\u26A0 Brew-TUI-Bar {{installed}} no coincide con Brew-TUI {{expected}}. Ejecuta: brew-tui install-brew-tui-bar --force",
901
- cli_brewtuibarLegacyAlias: "\u26A0 `{{legacy}}` est\xE1 obsoleto y se eliminar\xE1 en 2.1.0. Usa `brew-tui {{current}}` en su lugar.",
902
900
  cli_brewtuibarForeignBundle: "\u2718 /Applications/Brew-TUI-Bar.app existe pero su bundle ID es `{{id}}`, no com.molinesdesigns.brewtuibar. No se tocar\xE1 una app ajena. Elim\xEDnala o ren\xF3mbrala primero.",
903
901
  postinstall_skipped: "Nota: instalaci\xF3n autom\xE1tica de Brew-TUI-Bar saltada: {{error}}",
904
902
  postinstall_manualHint: "Puedes instalarla manualmente m\xE1s tarde con: brew-tui install-brew-tui-bar",
@@ -1097,4 +1095,4 @@ export {
1097
1095
  t,
1098
1096
  tp
1099
1097
  };
1100
- //# sourceMappingURL=chunk-SDQYHY2L.js.map
1098
+ //# sourceMappingURL=chunk-A7U3NZYM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n/index.ts","../src/i18n/en.ts","../src/i18n/es.ts"],"sourcesContent":["import { create } from 'zustand';\nimport en from './en.js';\nimport es from './es.js';\nimport type { Translations, TranslationKey } from './en.js';\n\nexport type Locale = 'en' | 'es';\n\nconst locales: Record<Locale, Translations> = { en, es };\n\nfunction isLocale(s: string): s is Locale {\n return s === 'en' || s === 'es';\n}\n\nfunction detectLocale(): Locale {\n const flag = process.argv.find((a) => a.startsWith('--lang='));\n if (flag) {\n const code = flag.split('=')[1];\n if (code && isLocale(code)) return code;\n }\n const env = process.env.LANG ?? process.env.LC_ALL ?? process.env.LC_MESSAGES ?? '';\n const prefix = env.split(/[_.]/)[0] ?? '';\n if (isLocale(prefix)) return prefix;\n return 'en';\n}\n\n// ── Locale store ──\ninterface LocaleState {\n locale: Locale;\n setLocale: (locale: Locale) => void;\n}\n\nexport const useLocaleStore = create<LocaleState>((set) => ({\n locale: detectLocale(),\n setLocale: (locale) => set({ locale }),\n}));\n\nexport function getLocale(): Locale {\n return useLocaleStore.getState().locale;\n}\n\n// ── Translation function ──\nexport function t(key: TranslationKey, values?: Record<string, string | number>): string {\n const locale = useLocaleStore.getState().locale;\n let text: string = locales[locale][key] ?? locales['en'][key] ?? key;\n if (values) {\n for (const [k, v] of Object.entries(values)) {\n text = text.replaceAll(`{{${k}}}`, String(v));\n }\n }\n return text;\n}\n\n// ── Plural helper ──\nexport function tp(baseKey: string, count: number, values?: Record<string, string | number>): string {\n const suffix = count === 1 ? '_one' : '_other';\n return t(`${baseKey}${suffix}` as TranslationKey, { count, ...values });\n}\n\nexport type { TranslationKey, Translations };\n","const en = {\n // ── App chrome ──\n app_title: 'Brew-TUI',\n pro_badge: 'PRO',\n app_version: 'Brew-TUI v{{version}}',\n\n // ── UX-002: first-run welcome ──\n welcome_title: 'Welcome to Brew-TUI',\n welcome_intro: 'A visual terminal interface for Homebrew. Browse installed packages, see what is outdated, manage services and run upgrades — all from the keyboard.',\n welcome_keysHeader: 'Essential keys',\n welcome_keyMenu: 'Open the side menu (then ↑↓ + Enter)',\n welcome_keyAction: 'Run the matching footer action',\n welcome_keyMove: 'Move up / down in lists',\n welcome_keySearch: 'Open the search view',\n welcome_keySelect: 'Open / confirm the highlighted item',\n welcome_keyBack: 'Go back / cancel',\n welcome_keyLocale: 'Toggle language (English / Spanish)',\n welcome_keyQuit: 'Quit Brew-TUI',\n welcome_proHeader: 'Optional Pro features',\n welcome_proIntro: 'Profiles, smart cleanup, history, security audit, sync and more — activate from the Account view with a license key.',\n welcome_continueHint: 'Press Enter, Space or Esc to continue →',\n\n // ── View labels (header tab bar) ──\n view_dashboard: 'Dashboard',\n view_installed: 'Installed',\n view_search: 'Search',\n view_outdated: 'Outdated',\n view_packageInfo: 'Pkg Info',\n view_services: 'Services',\n view_doctor: 'Doctor',\n view_profiles: 'Profiles',\n view_smartCleanup: 'Cleanup',\n view_history: 'History',\n view_rollback: 'Rollback',\n view_brewfile: 'Brewfile',\n view_sync: 'Sync',\n view_securityAudit: 'Security',\n view_account: 'Account',\n\n // ── Keyboard hint actions ──\n hint_navigate: 'navigate',\n hint_next: 'next',\n hint_quit: 'quit',\n hint_filter: 'filter',\n hint_info: 'info',\n hint_toggle: 'toggle',\n hint_typeToSearch: 'type to search',\n hint_install: 'install',\n hint_uninstall: 'uninstall',\n hint_upgrade: 'upgrade',\n hint_upgradeAll: 'upgrade all',\n hint_back: 'back',\n hint_start: 'start',\n hint_stop: 'stop',\n hint_restart: 'restart',\n hint_refresh: 'refresh',\n hint_new: 'new',\n hint_details: 'details',\n hint_import: 'import',\n hint_delete: 'delete',\n hint_clean: 'clean',\n hint_all: 'all',\n hint_search: 'search',\n hint_clear: 'clear',\n hint_scan: 'scan',\n hint_expand: 'expand',\n hint_cancel: 'cancel',\n hint_force: 'force uninstall (ignore deps)',\n hint_rescan: 'rescan',\n hint_deactivate: 'deactivate',\n hint_promo: 'promo code',\n hint_importProfile: 'import this profile',\n hint_lang: 'lang',\n hint_replay: 'replay',\n hint_edit: 'edit',\n hint_pin: 'pin/unpin',\n hint_rollback_confirm: 'rollback',\n hint_add: 'add',\n hint_reconcile: 'reconcile',\n hint_export: 'export',\n hint_apply: 'apply',\n hint_revalidate: 'revalidate',\n hint_select: 'select',\n hint_sync: 'sync now',\n hint_conflict: 'resolve',\n hint_rollback: 'rollback',\n hint_check_compliance: 'check compliance',\n hint_switchTab: 'switch tab',\n hint_useLocal: 'use local',\n hint_menuOpen: 'M: menu · S: search · L: lang',\n hint_menuMode: '↑↓: move · ↵: select · esc/m: close',\n // Split variants so the side-menu hint can render the M/m as a separate\n // blinking element while the rest stays static.\n hint_menuOpen_suffix: ': menu · S: search · L: lang',\n hint_menuMode_prefix: '↑↓: move · ↵: select · esc/',\n hint_menuMode_suffix: ': close',\n hint_chooseNumber: 'Choose an option by pressing its number:',\n\n // ── Loading / progress ──\n loading_default: 'Loading...',\n loading_fetchingBrew: 'Fetching Homebrew data...',\n loading_installed: 'Loading installed packages...',\n loading_outdated: 'Checking for outdated packages...',\n loading_services: 'Loading services...',\n loading_doctor: 'Running brew doctor... (this may take a moment)',\n loading_profiles: 'Loading profiles...',\n loading_cleanup: 'Analyzing packages... (checking disk usage)',\n loading_history: 'Loading history...',\n loading_security: 'Scanning packages against OSV vulnerability database...',\n loading_searching: 'Searching...',\n loading_package: 'Loading {{name}}...',\n\n // ── Confirm dialog ──\n confirm_yes: '[Y]es',\n confirm_no: '[N]o',\n confirm_brewfile_reconcile: 'Reconcile Brewfile? Will install {{missing}} missing and reinstall {{wrongVer}} mismatched packages.',\n confirm_sync_now: 'Sync now with iCloud? This pushes local state and pulls remote changes.',\n confirm_sync_apply: 'Apply {{count}} conflict resolution(s)? Selected versions will be installed.',\n confirm_compliance_remediate: 'Remediate {{count}} actionable violation(s)? Will install missing packages and align mismatched versions.',\n\n // ── Error ──\n error_prefix: 'Error: ',\n\n // ── Common ──\n common_andMore: '...and {{count}} more',\n common_exit: '(exit {{code}})',\n common_yes: 'yes',\n common_no: 'no',\n\n // ── Relative time ──\n time_justNow: 'just now',\n time_minutesAgo: '{{n}}m ago',\n time_hoursAgo: '{{n}}h ago',\n time_daysAgo: '{{n}}d ago',\n time_monthsAgo: '{{n}}mo ago',\n\n // ── Badges ──\n badge_outdated: 'outdated',\n badge_pinned: 'pinned',\n badge_kegOnly: 'keg-only',\n badge_dep: 'dep',\n badge_installed: 'installed',\n badge_deprecated: 'deprecated',\n badge_ok: 'ok',\n badge_fail: 'fail',\n badge_error: 'error',\n\n // ── Dashboard ──\n dashboard_pro_status: 'Pro Status',\n dashboard_security: 'Security',\n dashboard_cves: '{{count}} CVEs',\n dashboard_no_cves: 'No CVEs',\n dashboard_brewfile: 'Brewfile',\n dashboard_sync: 'Sync',\n dashboard_sync_never: 'Never synced',\n dashboard_sync_ago: '{{time}} ago',\n dashboard_compliance: 'Compliance',\n dashboard_compliance_violations: '{{count}} violations',\n dashboard_compliance_ok: 'OK',\n dashboard_overview: 'Overview',\n dashboard_formulae: 'Formulae',\n dashboard_casks: 'Casks',\n dashboard_outdated: 'Outdated',\n dashboard_services: 'Services',\n dashboard_systemInfo: 'System Info',\n dashboard_homebrew: 'Homebrew:',\n dashboard_prefix: 'Prefix:',\n dashboard_updated: 'Updated:',\n dashboard_outdatedPackages: 'Outdated Packages',\n dashboard_serviceErrors: 'Service Errors',\n dashboard_partialData: 'Some Homebrew sections failed to load:',\n dashboard_statError: 'ERR',\n\n // ── Installed ──\n installed_formulaeCount: 'Formulae ({{count}})',\n installed_casksCount: 'Casks ({{count}})',\n installed_filterDisplay: 'Filter: \"{{query}}\" ({{count}} matches)',\n installed_noPackages: 'No packages found',\n installed_confirmUninstall: 'Uninstall {{name}}?',\n\n // ── Search ──\n search_placeholder: 'Search Homebrew packages... (enter to search)',\n search_resultsFor: 'Results for',\n search_escToClear: '(esc to clear)',\n search_installing: 'Installing package...',\n search_installComplete: 'Installation complete!',\n search_confirmInstall: 'Install {{name}}?',\n search_formulaeHeader: '=== Formulae ({{count}})',\n search_casksHeader: '=== Casks ({{count}})',\n search_noResults: 'No results found',\n search_minChars: 'Type at least 2 characters to search.',\n\n // ── Outdated ──\n outdated_title: 'Outdated Packages ({{count}})',\n outdated_upgrading: 'Upgrading...',\n outdated_upgradeComplete: 'Upgrade complete!',\n outdated_pressRefresh: '(press r to refresh)',\n outdated_upToDate: 'Everything is up to date!',\n outdated_confirmAll: 'Upgrade all {{count}} packages?',\n outdated_confirmSingle: 'Upgrade {{name}}?',\n outdated_pinned: '[pinned]',\n\n // ── Package Info ──\n pkgInfo_noPackage: 'No package selected. Go to Installed and press Enter on a package.',\n pkgInfo_notFound: 'Package not found',\n pkgInfo_installing: 'Installing {{name}}...',\n pkgInfo_uninstalling: 'Uninstalling {{name}}...',\n pkgInfo_upgrading: 'Upgrading {{name}}...',\n pkgInfo_done: 'Done!',\n pkgInfo_confirmInstall: 'install {{name}}?',\n pkgInfo_confirmUninstall: 'uninstall {{name}}?',\n pkgInfo_confirmUpgrade: 'upgrade {{name}}?',\n pkgInfo_details: 'Details',\n pkgInfo_homepage: 'Homepage:',\n pkgInfo_license: 'License:',\n pkgInfo_tap: 'Tap:',\n pkgInfo_stable: 'Stable:',\n pkgInfo_installed: 'Installed:',\n pkgInfo_bottle: 'Bottle:',\n pkgInfo_onRequest: 'On request:',\n pkgInfo_noDependency: 'no (dependency)',\n pkgInfo_dependencies: 'Dependencies ({{count}})',\n pkgInfo_caveats: 'Caveats',\n\n // ── Services ──\n services_title: 'Homebrew Services',\n services_titleCount: 'Homebrew Services ({{count}})',\n services_noServices: 'No services found',\n services_name: 'Name',\n services_status: 'Status',\n services_user: 'User',\n services_processing: 'Processing...',\n services_confirmStop: 'Stop service {{name}}?',\n services_confirmRestart: 'Restart service {{name}}?',\n\n // ── Doctor ──\n doctor_title: 'Homebrew Doctor',\n doctor_clean: 'Your system is ready to brew.',\n doctor_warningsNotCaptured: 'Doctor finished with warnings but none were captured.',\n\n // ── Profiles ──\n profiles_title: 'Package Profiles ({{count}})',\n profiles_importTitle: 'Importing profile...',\n profiles_importComplete: 'Import complete. Press any key.',\n profiles_importPartial: 'Import finished with errors. Check the log above.',\n profiles_createName: 'Create Profile \\u2014 Name:',\n profiles_namePlaceholder: 'e.g. work, personal, project-x',\n profiles_createDesc: 'Create Profile \"{{name}}\" \\u2014 Description:',\n profiles_descPlaceholder: 'Brief description of this setup',\n profiles_created: 'Created: {{date}}',\n profiles_formulaeCount: 'Formulae ({{count}})',\n profiles_casksCount: 'Casks ({{count}})',\n profiles_confirmDelete: 'Delete profile \"{{name}}\"?',\n profiles_noProfiles: 'No profiles saved yet.',\n profiles_press: 'Press',\n profiles_exportHint: 'to export your current setup as a profile.',\n profiles_editName: 'Edit Profile \\u2014 Name:',\n profiles_editDesc: 'Edit Profile \"{{name}}\" \\u2014 Description:',\n\n // ── Smart Cleanup ──\n cleanup_title: 'Smart Cleanup',\n cleanup_cleaning: 'Cleaning up...',\n cleanup_complete: 'Cleanup complete! Press r to re-analyze.',\n cleanup_orphans: 'Orphans',\n cleanup_reclaimable: 'Reclaimable',\n cleanup_selected: 'Selected',\n cleanup_confirmUninstall: 'Uninstall {{count}} packages?',\n cleanup_confirmForce: 'Some packages have dependencies. Force uninstall {{count}} packages? (ignores dependencies)',\n cleanup_depError: 'Some packages could not be removed due to dependencies.',\n cleanup_systemClean: 'No orphaned packages found. Your system is clean!',\n\n // ── History ──\n history_title: 'Action History ({{count}})',\n history_filterLabel: 'filter: {{filter}}',\n history_searchPlaceholder: 'Search packages...',\n history_confirmClear: 'Clear all {{count}} history entries?',\n history_noEntries: 'No history entries',\n history_noEntriesFor: 'No history entries for \"{{filter}}\"',\n history_all: '(all)',\n history_actionInstall: 'install',\n history_actionUninstall: 'uninstall',\n history_actionUpgrade: 'upgrade',\n history_actionUpgradeAll: 'upgrade-all',\n history_confirmReplay: 'Re-run: {{action}} {{name}}?',\n history_replayAll: 'Re-run: upgrade all packages?',\n\n // ── Security Audit ──\n security_rollback_hint: 'R: open Rollback for version restoration',\n security_title: 'Security Audit',\n security_scanned: 'Scanned',\n security_vulnerable: 'Vulnerable',\n security_critical: 'Critical',\n security_high: 'High',\n security_medium: 'Medium',\n security_noVulns: 'No known vulnerabilities found in your installed packages!',\n security_coverage_warning: 'Note: OSV scans the Bitnami dataset, which does not cover every Homebrew formula. Absence of CVEs is not a guarantee of safety.',\n security_fixedIn: 'Fixed in: {{version}}',\n security_confirmUpgrade: 'Upgrade {{name}} to fix vulnerabilities?',\n\n // ── Account ──\n account_title: 'Account & License',\n account_confirmDeactivate: 'Deactivate your Pro license on this machine?',\n account_statusLabel: 'Status:',\n account_pro: '[Pro]',\n account_team: '[Team]',\n account_free: '[Free]',\n account_expired: '[Expired]',\n account_emailLabel: 'Email:',\n account_nameLabel: 'Name:',\n account_planLabel: 'Plan:',\n account_monthlyPrice: '5.45\\u20AC/month',\n account_yearlyPrice: '82\\u20AC/year',\n account_keyLabel: 'Key:',\n account_expiresLabel: 'Expires:',\n account_activatedLabel: 'Activated:',\n account_upgradeTitle: 'Upgrade to Brew-TUI Pro',\n account_unlockDesc: 'Unlock Profiles, Smart Cleanup, History, Security Audit, and Brew-TUI-Bar (macOS menu bar companion).',\n account_pricing: '5.45\\u20AC/month or 48\\u20AC/year (save 27%)',\n account_runActivate: 'Run:',\n account_activateCmd: 'brew-tui activate <key>',\n account_licenseExpired: 'Your license has expired. Renew to continue using Pro features.',\n account_deactivating: 'Deactivating...',\n account_loading: 'Loading license status...',\n account_revalidating: 'Revalidating with server...',\n account_promoTitle: 'Redeem Promo Code',\n account_promoLabel: 'Code:',\n account_promoValidating: 'Validating promo code...',\n account_promoSuccess: 'Promo code redeemed! Pro access until {{expires}}.',\n account_promoInvalid: 'Invalid or expired promo code.',\n account_promoError: 'Could not validate promo code. Check your connection.',\n account_promoEsc: 'esc: cancel',\n account_promoHint: 'p: redeem promo code',\n\n // ── Upgrade Prompt ──\n upgrade_proFeature: '{{title}} \\u2014 Pro Feature',\n upgrade_profiles: 'Package Profiles',\n upgrade_profilesDesc: 'Export and import your Homebrew setup across machines. Save named profiles for work, personal, or project-specific configurations.',\n upgrade_cleanup: 'Smart Cleanup',\n upgrade_cleanupDesc: 'Find orphaned packages, analyze disk usage per package, and reclaim disk space with one-click intelligent cleanup.',\n upgrade_history: 'Action History',\n upgrade_historyDesc: 'Track every install, uninstall, and upgrade with timestamps. Search and filter your package management history.',\n upgrade_security: 'Security Audit',\n upgrade_securityDesc: 'Scan installed packages against known vulnerabilities (CVEs). See severity levels, affected versions, and available fixes.',\n upgrade_pricing: '5.45\\u20AC/month or 48\\u20AC/year (save 27%)',\n upgrade_teamFeature: '{{title}} \\u2014 Team tier',\n upgrade_teamPricing: '8\\u20AC/seat/month or 81.60\\u20AC/seat/year (save 15%) \\u2014 from 3 seats',\n upgrade_buyAt: 'Buy at:',\n upgrade_buyUrl: 'https://buy.polar.sh/polar_cl_yQsiUeDelyyEQznbWffD1j77JAyP24ra7iEVQ22PA4h',\n upgrade_buyUrlTeam: 'https://buy.polar.sh/polar_cl_CO6xqSzKgFiQJwXnhZYGqisOP04Wspi0KKZSn38NjFZ?quantity=3',\n upgrade_activateWith: 'Then activate with:',\n upgrade_activateCmd: 'brew-tui activate <your-license-key>',\n upgrade_proLabel: 'Brew-TUI Pro \\u2014 5.45\\u20AC/month or 48\\u20AC/year \\u2014 Includes Brew-TUI-Bar for macOS',\n upgrade_teamLabel: 'Brew-TUI Team \\u2014 8\\u20AC/seat/month \\u2014 Includes everything in Pro plus Compliance',\n\n // ── Progress Log ──\n progress_noOutput: 'No output yet',\n\n // ── Search Input ──\n searchInput_placeholder: 'Type to filter...',\n\n // ── Profile Manager ──\n profileMgr_tapping: 'Tapping {{name}}...',\n profileMgr_installing: 'Installing {{name}}...',\n profileMgr_installingCask: 'Installing cask {{name}}...',\n profileMgr_importDone: 'Done! Installed {{count}} packages.',\n\n // ── CLI ──\n cli_usageActivate: 'Usage: brew-tui activate <license-key>',\n cli_activated: '\\u2714 Pro activated for {{email}}',\n cli_plan: ' Plan: {{plan}}',\n cli_expires: ' Expires: {{date}}',\n cli_activationFailed: '\\u2718 Activation failed: {{error}}',\n cli_noLicense: 'No active license found.',\n cli_deactivated: '\\u2714 License deactivated.',\n cli_planFree: 'Plan: Free',\n cli_planPro: 'Plan: Pro',\n cli_planExpired: 'Plan: Expired',\n cli_confirmDeactivate: 'Deactivate your Pro license on this machine? (y/N): ',\n cli_deactivateCancelled: 'Deactivation cancelled.',\n cli_upgradeHint: 'Run `brew-tui activate <key>` to upgrade to Pro.',\n cli_revalidateHint: 'Run `brew-tui revalidate` to refresh your current license.',\n cli_email: 'Email: {{email}}',\n cli_status: 'Status: {{status}}',\n cli_revalidated: '\\u2714 License revalidated.',\n cli_revalidateGrace: '\\u26A0 Could not reach the server. Your current license remains usable within the offline grace period.',\n cli_revalidateFailed: '\\u2718 License revalidation failed. Renew your subscription or activate a valid key.',\n cli_rateLimited: 'Too many activation attempts. Try again in {{minutes}} minutes.',\n cli_cooldown: 'Please wait before trying again.',\n cli_brewtuibarInstalling: 'Downloading Brew-TUI-Bar...',\n cli_brewtuibarInstalled: '\\u2714 Brew-TUI-Bar installed to /Applications/Brew-TUI-Bar.app',\n cli_brewtuibarAlreadyInstalled: 'Brew-TUI-Bar is already installed. Use --force to reinstall.',\n cli_brewtuibarUninstalled: '\\u2714 Brew-TUI-Bar removed from /Applications.',\n cli_brewtuibarNotInstalled: 'Brew-TUI-Bar is not installed.',\n cli_brewtuibarMacOnly: '\\u2718 Brew-TUI-Bar is only available on macOS.',\n cli_brewtuibarDownloadFailed: '\\u2718 Failed to download Brew-TUI-Bar: {{error}}',\n cli_brewtuibarAutoFailed: '\\u26A0 Brew-TUI-Bar auto-launch failed: {{error}}',\n cli_brewtuibarUpdating: 'Updating Brew-TUI-Bar from {{installed}} to {{expected}} to match Brew-TUI...',\n cli_brewtuibarVersionMismatch: '\\u26A0 Brew-TUI-Bar {{installed}} is out of sync with Brew-TUI {{expected}}. Run: brew-tui install-brew-tui-bar --force',\n cli_brewtuibarForeignBundle: '\\u2718 /Applications/Brew-TUI-Bar.app exists but its bundle ID is `{{id}}`, not com.molinesdesigns.brewtuibar. Refusing to touch a foreign app. Remove or rename it first.',\n postinstall_skipped: 'Note: Brew-TUI-Bar auto-install skipped: {{error}}',\n postinstall_manualHint: 'You can install it manually later with: brew-tui install-brew-tui-bar',\n cli_versionMismatchWarning: '⚠ Brew-TUI-Bar {{installed}} is out of sync with this CLI ({{expected}}). It will be updated automatically the next time you run `brew-tui` or restart the app.',\n cli_deactivateRemoteFailed: '\\u26A0 Warning: Could not reach the server to deactivate remotely. The license was removed locally but may still count as active.',\n\n // ── License degradation (Layer 15) ──\n license_offlineWarning: 'Your license has not been validated for {{days}} days. Please connect to the internet.',\n\n // ── Plurals ──\n plural_vulns_one: '({{count}} vuln)',\n plural_vulns_other: '({{count}} vulns)',\n plural_warnings_one: '{{count}} warning',\n plural_warnings_other: '{{count}} warnings',\n\n // ── Scroll indicators ──\n scroll_moreAbove: '\\u2191 {{count}} more',\n scroll_moreBelow: '\\u2193 {{count}} more',\n\n // ── SCR-001: Cleanup warning ──\n cleanup_warning_system_tools: 'Warning: detected orphans may include dependencies of tools not managed by Homebrew. Review the list before proceeding.',\n\n // ── SCR-002: Installed column headers ──\n installed_col_package: 'Package',\n installed_col_version: 'Version',\n installed_col_status: 'Status',\n\n // ── SCR-003: Search failed ──\n search_failed: 'Search failed',\n\n // ── SCR-007: Deactivate failed ──\n deactivate_failed: 'Deactivation failed',\n\n // ── ACC-005: Version labels ──\n version_installed: 'installed:',\n version_available: 'available:',\n\n // ── SCR-006: Upgrade-all replay warning ──\n upgrade_all_warning: 'Note: this will upgrade all currently outdated packages, which may differ from the original set.',\n\n // ── SEG-007: Delete account ──\n delete_account_confirm: 'Delete all Brew-TUI data (~/.brew-tui)? This removes your license, profiles, and history. This cannot be undone.',\n delete_account_success: 'All Brew-TUI data has been removed.',\n\n // ── SCR-012: Upgrade All packages list ──\n outdated_upgradeAllList: 'Packages to upgrade: {{list}}',\n\n // ── SCR-005: Profile import summary ──\n profiles_importSummary: 'This profile contains {{formulae}} formulae and {{casks}} casks. Continue?',\n\n // ── SCR-017: Network error ��─\n security_networkError: 'Could not reach OSV.dev vulnerability database. Check your internet connection.',\n\n // ── ARQ-004: Dashboard last updated ──\n dashboard_lastUpdated: 'Last updated: {{time}}',\n\n // ── SCR-014: Services last error ──\n services_lastError: 'Last error: {{error}}',\n services_errorPermission: 'Permission denied — this service requires sudo. Run the action from a terminal with elevated privileges.',\n\n // ── SCR-010: Generic network error ──\n error_network: 'Network error: unable to reach the server.',\n\n // ── ARQ-005: Security cache ──\n security_cachedResults: 'Showing cached results ({{time}} ago). Press r to rescan.',\n\n // ── Impact Analysis ──\n impact_brewfile_hint: '\\u{1F4A1} Add to Brewfile to pin this version before upgrading',\n impact_analyzing: 'Analyzing upgrade impact...',\n impact_high: 'HIGH RISK',\n impact_medium: 'MEDIUM RISK',\n impact_low: 'LOW RISK',\n impact_affects: 'affects {{count}} installed packages',\n impact_usedBy: 'Used by: {{packages}}',\n impact_hint: 'Select package to see upgrade impact',\n impact_reason_critical_package: 'Critical system package',\n impact_reason_major_bump: 'Major version change',\n impact_reason_many_deps: '{{count}} packages depend on this',\n\n // ── Rollback ──\n rollback_title: 'Rollback \\u2014 Restore Previous State',\n rollback_no_snapshots: 'No snapshots available. Snapshots are captured automatically after each operation.',\n rollback_select_snapshot: 'Select a snapshot to restore',\n rollback_snapshot_label: '{{label}} \\u2014 {{date}}',\n rollback_snapshot_auto: 'Auto',\n rollback_diff_empty: 'No changes detected between this snapshot and current state',\n rollback_confirm: 'Roll back {{count}} package(s) to this state?',\n rollback_strategy_bottle: 'from bottle cache',\n rollback_strategy_versioned: 'from versioned formula',\n rollback_strategy_pin: 'pin only (version not restorable)',\n rollback_strategy_unavailable: 'cannot restore',\n rollback_executing: 'Rolling back...',\n rollback_executing_no_cancel: 'Rollback in progress — cancellation is not safe and will be ignored.',\n rollback_success: 'Rollback completed',\n rollback_error: 'Rollback failed: {{error}}',\n rollback_item_downgrade: '{{name}}: {{from}} \\u2192 {{to}}',\n rollback_item_remove: 'Remove: {{name}}',\n rollback_item_install: 'Install: {{name}} {{version}}',\n rollback_warning_cask: 'Casks will be pinned only (version restoration not supported)',\n rollback_capturing: 'Capturing current snapshot...',\n\n // ── Sync ──\n sync_title: 'Cross-machine Sync',\n sync_disabled: 'Sync is not configured. Press s to set up iCloud sync.',\n sync_status_ok: 'In sync',\n sync_status_drift: '{{count}} change(s) from other machines',\n sync_status_conflict: '{{count}} conflict(s) need resolution',\n sync_last_sync: 'Last sync: {{date}}',\n sync_machine: 'This machine: {{name}}',\n sync_other_machines: 'Other machines: {{names}}',\n sync_syncing: 'Syncing...',\n sync_success: 'Sync complete',\n sync_error: 'Sync failed: {{error}}',\n sync_conflict_title: 'Conflict: {{package}}',\n sync_conflict_local: 'This machine: {{version}}',\n sync_conflict_remote: '{{machine}}: {{version}}',\n sync_conflict_use_local: 'Keep local',\n sync_conflict_use_remote: 'Use remote',\n sync_setup_icloud: 'Setting up iCloud sync...',\n sync_no_icloud: 'iCloud Drive not found. Ensure iCloud Drive is enabled in System Settings.',\n\n // ── Upgrade Prompt — Sync ──\n upgrade_sync: 'Cross-machine Sync',\n upgrade_syncDesc: 'Keep your Homebrew setup in sync across multiple Macs via iCloud Drive. Automatically merge installations and resolve conflicts.',\n\n // ── Brewfile ──\n brewfile_title: 'Declarative Brewfile',\n brewfile_compliant: 'compliant',\n brewfile_no_brewfile: 'No Brewfile found. Press n to create one from your current installation.',\n brewfile_create_name: 'Brewfile name (Enter to confirm):',\n brewfile_created: 'Brewfile created: {{name}}',\n brewfile_drift_missing: '{{count}} packages missing',\n brewfile_drift_extra: '{{count}} extra packages',\n brewfile_drift_wrong: '{{count}} wrong versions',\n brewfile_reconciling: 'Reconciling...',\n brewfile_reconcile_success: 'Reconciliation complete',\n brewfile_reconcile_error: 'Reconciliation failed: {{error}}',\n brewfile_exported: 'Exported to {{path}}',\n brewfile_formulae_count: '{{count}} formulae',\n brewfile_casks_count: '{{count}} casks',\n brewfile_strict_mode: 'Strict mode',\n brewfile_in_sync: '✓ System is in sync with Brewfile',\n brewfile_computing_drift: 'Computing drift...',\n\n // ── Compliance ──\n view_compliance: 'Compliance',\n compliance_title: 'Team Compliance',\n compliance_no_policy: 'No policy loaded. Press i to import a policy file.',\n compliance_score: '{{score}}% compliant',\n compliance_violations: '{{count}} violation(s)',\n compliance_ok: 'Fully compliant',\n compliance_import_prompt: 'Policy file path (Enter to confirm):',\n compliance_import_error: 'Failed to load policy: {{error}}',\n compliance_violation_missing: 'Missing: {{name}} (required)',\n compliance_violation_forbidden: 'Forbidden: {{name}} — {{reason}}',\n compliance_violation_version: 'Wrong version: {{name}} (required {{required}}, installed {{installed}})',\n compliance_violation_extra: 'Extra package: {{name}}',\n compliance_remediating: 'Remediating...',\n compliance_remediate_success: 'Remediation complete',\n compliance_remediate_error: 'Remediation failed: {{error}}',\n compliance_export_done: 'Report exported to {{path}}',\n compliance_press_r_hint: 'Press r to run compliance check.',\n compliance_machine: 'Machine: {{name}}',\n compliance_policy_name: 'Policy: {{name}}',\n compliance_policy_by: 'Maintained by: {{maintainer}}',\n\n // ── Upgrade Prompt — Compliance ──\n upgrade_compliance: 'Team Compliance',\n upgrade_complianceDesc: 'Enforce package policies across your team. Define required, forbidden, and version-pinned packages and automatically remediate deviations.',\n\n // ── Upgrade Prompt — Rollback / Brewfile ──\n upgrade_rollback: 'Smart Rollback',\n upgrade_rollbackDesc: 'Restore your Homebrew state from any past snapshot. Brew-TUI captures a snapshot before every install and upgrade so you can roll back a bad update with one keystroke.',\n upgrade_brewfile: 'Declarative Brewfile',\n upgrade_brewfileDesc: 'Pin your toolchain in a versioned Brewfile and reconcile any machine to it. Drift score, missing/extra detection and one-keystroke alignment.',\n};\n\nexport default en;\nexport type Translations = { [K in keyof typeof en]: string };\nexport type TranslationKey = keyof typeof en;\n","import type { Translations } from './en.js';\n\nconst es: Translations = {\n // ── App chrome ──\n app_title: 'Brew-TUI',\n pro_badge: 'PRO',\n app_version: 'Brew-TUI v{{version}}',\n\n // ── UX-002: bienvenida en primera ejecución ──\n welcome_title: 'Bienvenido a Brew-TUI',\n welcome_intro: 'Una interfaz visual de terminal para Homebrew. Explora paquetes instalados, ve cuáles están desactualizados, gestiona servicios y ejecuta upgrades — todo con el teclado.',\n welcome_keysHeader: 'Teclas esenciales',\n welcome_keyMenu: 'Abrir el menú lateral (luego ↑↓ + Enter)',\n welcome_keyAction: 'Ejecutar la acción del footer correspondiente',\n welcome_keyMove: 'Subir / bajar en listas',\n welcome_keySearch: 'Abrir la vista de búsqueda',\n welcome_keySelect: 'Abrir / confirmar el elemento seleccionado',\n welcome_keyBack: 'Volver / cancelar',\n welcome_keyLocale: 'Cambiar idioma (inglés / español)',\n welcome_keyQuit: 'Salir de Brew-TUI',\n welcome_proHeader: 'Funcionalidades Pro opcionales',\n welcome_proIntro: 'Perfiles, limpieza inteligente, historial, auditoría de seguridad, sync y más — actívalas desde la vista Cuenta con una clave de licencia.',\n welcome_continueHint: 'Pulsa Enter, Espacio o Esc para continuar →',\n\n // ── View labels (header tab bar) ──\n view_dashboard: 'Inicio',\n view_installed: 'Instalados',\n view_search: 'Buscar',\n view_outdated: 'Desactual.',\n view_packageInfo: 'Info Paq.',\n view_services: 'Servicios',\n view_doctor: 'Doctor',\n view_profiles: 'Perfiles',\n view_smartCleanup: 'Limpieza',\n view_history: 'Historial',\n view_rollback: 'Rollback',\n view_brewfile: 'Brewfile',\n view_sync: 'Sync',\n view_securityAudit: 'Seguridad',\n view_account: 'Cuenta',\n\n // ── Keyboard hint actions ──\n hint_navigate: 'navegar',\n hint_next: 'siguiente',\n hint_quit: 'salir',\n hint_filter: 'filtrar',\n hint_info: 'info',\n hint_toggle: 'cambiar',\n hint_typeToSearch: 'escribe para buscar',\n hint_install: 'instalar',\n hint_uninstall: 'desinstalar',\n hint_upgrade: 'actualizar',\n hint_upgradeAll: 'actualizar todo',\n hint_back: 'volver',\n hint_start: 'iniciar',\n hint_stop: 'detener',\n hint_restart: 'reiniciar',\n hint_refresh: 'refrescar',\n hint_new: 'nuevo',\n hint_details: 'detalles',\n hint_import: 'importar',\n hint_delete: 'eliminar',\n hint_clean: 'limpiar',\n hint_all: 'todo',\n hint_search: 'buscar',\n hint_clear: 'borrar',\n hint_scan: 'escanear',\n hint_expand: 'expandir',\n hint_cancel: 'cancelar',\n hint_force: 'forzar (ignorar deps)',\n hint_rescan: 're-escanear',\n hint_deactivate: 'desactivar',\n hint_promo: 'c\\u00F3digo promo',\n hint_importProfile: 'importar este perfil',\n hint_lang: 'idioma',\n hint_replay: 'repetir',\n hint_edit: 'editar',\n hint_pin: 'fijar/desfijar',\n hint_rollback_confirm: 'revertir',\n hint_add: 'a\\u00F1adir',\n hint_reconcile: 'reconciliar',\n hint_export: 'exportar',\n hint_apply: 'aplicar',\n hint_revalidate: 'revalidar',\n hint_select: 'seleccionar',\n hint_sync: 'sincronizar',\n hint_conflict: 'resolver',\n hint_rollback: 'revertir',\n hint_check_compliance: 'verificar conformidad',\n hint_switchTab: 'cambiar pestaña',\n hint_useLocal: 'usar local',\n hint_menuOpen: 'M: menú · S: buscar · L: idioma',\n hint_menuMode: '↑↓: mover · ↵: seleccionar · esc/m: cerrar',\n hint_menuOpen_suffix: ': menú · S: buscar · L: idioma',\n hint_menuMode_prefix: '↑↓: mover · ↵: seleccionar · esc/',\n hint_menuMode_suffix: ': cerrar',\n hint_chooseNumber: 'Elige una opción pulsando su número:',\n\n // ── Loading / progress ──\n loading_default: 'Cargando...',\n loading_fetchingBrew: 'Obteniendo datos de Homebrew...',\n loading_installed: 'Cargando paquetes instalados...',\n loading_outdated: 'Buscando paquetes desactualizados...',\n loading_services: 'Cargando servicios...',\n loading_doctor: 'Ejecutando brew doctor... (puede tardar un momento)',\n loading_profiles: 'Cargando perfiles...',\n loading_cleanup: 'Analizando paquetes... (verificando uso de disco)',\n loading_history: 'Cargando historial...',\n loading_security: 'Escaneando paquetes en la base de datos de vulnerabilidades OSV...',\n loading_searching: 'Buscando...',\n loading_package: 'Cargando {{name}}...',\n\n // ── Confirm dialog ──\n confirm_yes: '[S]\\u00ED',\n confirm_no: '[N]o',\n confirm_brewfile_reconcile: '¿Reconciliar Brewfile? Instalará {{missing}} paquetes faltantes y reinstalará {{wrongVer}} con versión incorrecta.',\n confirm_sync_now: '¿Sincronizar ahora con iCloud? Se subirá el estado local y se descargarán los cambios remotos.',\n confirm_sync_apply: '¿Aplicar {{count}} resolución(es) de conflicto? Se instalarán las versiones seleccionadas.',\n confirm_compliance_remediate: '¿Remediar {{count}} violación(es) accionable(s)? Se instalarán los paquetes faltantes y se alinearán las versiones desviadas.',\n\n // ── Error ──\n error_prefix: 'Error: ',\n\n // ── Common ──\n common_andMore: '...y {{count}} m\\u00E1s',\n common_exit: '(salida {{code}})',\n common_yes: 's\\u00ED',\n common_no: 'no',\n\n // ── Relative time ──\n time_justNow: 'ahora',\n time_minutesAgo: 'hace {{n}}m',\n time_hoursAgo: 'hace {{n}}h',\n time_daysAgo: 'hace {{n}}d',\n time_monthsAgo: 'hace {{n}}me',\n\n // ── Badges ──\n badge_outdated: 'desactualizado',\n badge_pinned: 'fijado',\n badge_kegOnly: 'keg-only',\n badge_dep: 'dep',\n badge_installed: 'instalado',\n badge_deprecated: 'obsoleto',\n badge_ok: 'ok',\n badge_fail: 'fallo',\n badge_error: 'error',\n\n // ── Dashboard ──\n dashboard_pro_status: 'Estado Pro',\n dashboard_security: 'Seguridad',\n dashboard_cves: '{{count}} CVEs',\n dashboard_no_cves: 'Sin CVEs',\n dashboard_brewfile: 'Brewfile',\n dashboard_sync: 'Sync',\n dashboard_sync_never: 'Nunca sincronizado',\n dashboard_sync_ago: 'hace {{time}}',\n dashboard_compliance: 'Conformidad',\n dashboard_compliance_violations: '{{count}} violaciones',\n dashboard_compliance_ok: 'OK',\n dashboard_overview: 'Resumen',\n dashboard_formulae: 'Formulae',\n dashboard_casks: 'Casks',\n dashboard_outdated: 'Desactualizados',\n dashboard_services: 'Servicios',\n dashboard_systemInfo: 'Info del Sistema',\n dashboard_homebrew: 'Homebrew:',\n dashboard_prefix: 'Prefijo:',\n dashboard_updated: 'Actualizado:',\n dashboard_outdatedPackages: 'Paquetes Desactualizados',\n dashboard_serviceErrors: 'Errores de Servicios',\n dashboard_partialData: 'Algunas secciones de Homebrew no pudieron cargarse:',\n dashboard_statError: 'ERR',\n\n // ── Installed ──\n installed_formulaeCount: 'Formulae ({{count}})',\n installed_casksCount: 'Casks ({{count}})',\n installed_filterDisplay: 'Filtro: \"{{query}}\" ({{count}} coincidencias)',\n installed_noPackages: 'No se encontraron paquetes',\n installed_confirmUninstall: '\\u00BFDesinstalar {{name}}?',\n\n // ── Search ──\n search_placeholder: 'Buscar paquetes Homebrew... (enter para buscar)',\n search_resultsFor: 'Resultados para',\n search_escToClear: '(esc para limpiar)',\n search_installing: 'Instalando paquete...',\n search_installComplete: '\\u00A1Instalaci\\u00F3n completa!',\n search_confirmInstall: '\\u00BFInstalar {{name}}?',\n search_formulaeHeader: '=== Formulae ({{count}})',\n search_casksHeader: '=== Casks ({{count}})',\n search_noResults: 'Sin resultados',\n search_minChars: 'Escribe al menos 2 caracteres para buscar.',\n\n // ── Outdated ──\n outdated_title: 'Paquetes Desactualizados ({{count}})',\n outdated_upgrading: 'Actualizando...',\n outdated_upgradeComplete: '\\u00A1Actualizaci\\u00F3n completa!',\n outdated_pressRefresh: '(presiona r para refrescar)',\n outdated_upToDate: '\\u00A1Todo est\\u00E1 al d\\u00EDa!',\n outdated_confirmAll: '\\u00BFActualizar los {{count}} paquetes?',\n outdated_confirmSingle: '\\u00BFActualizar {{name}}?',\n outdated_pinned: '[fijado]',\n\n // ── Package Info ──\n pkgInfo_noPackage: 'Ning\\u00FAn paquete seleccionado. Ve a Instalados y presiona Enter en un paquete.',\n pkgInfo_notFound: 'Paquete no encontrado',\n pkgInfo_installing: 'Instalando {{name}}...',\n pkgInfo_uninstalling: 'Desinstalando {{name}}...',\n pkgInfo_upgrading: 'Actualizando {{name}}...',\n pkgInfo_done: '\\u00A1Listo!',\n pkgInfo_confirmInstall: '\\u00BFinstalar {{name}}?',\n pkgInfo_confirmUninstall: '\\u00BFdesinstalar {{name}}?',\n pkgInfo_confirmUpgrade: '\\u00BFactualizar {{name}}?',\n pkgInfo_details: 'Detalles',\n pkgInfo_homepage: 'Web:',\n pkgInfo_license: 'Licencia:',\n pkgInfo_tap: 'Tap:',\n pkgInfo_stable: 'Estable:',\n pkgInfo_installed: 'Instalado:',\n pkgInfo_bottle: 'Bottle:',\n pkgInfo_onRequest: 'Por solicitud:',\n pkgInfo_noDependency: 'no (dependencia)',\n pkgInfo_dependencies: 'Dependencias ({{count}})',\n pkgInfo_caveats: 'Advertencias',\n\n // ── Services ──\n services_title: 'Servicios Homebrew',\n services_titleCount: 'Servicios Homebrew ({{count}})',\n services_noServices: 'No se encontraron servicios',\n services_name: 'Nombre',\n services_status: 'Estado',\n services_user: 'Usuario',\n services_processing: 'Procesando...',\n services_confirmStop: '\\u00BFDetener servicio {{name}}?',\n services_confirmRestart: '\\u00BFReiniciar servicio {{name}}?',\n\n // ── Doctor ──\n doctor_title: 'Homebrew Doctor',\n doctor_clean: 'Tu sistema est\\u00E1 listo para brew.',\n doctor_warningsNotCaptured: 'Doctor termin\\u00F3 con advertencias pero no se capturaron.',\n\n // ── Profiles ──\n profiles_title: 'Perfiles de Paquetes ({{count}})',\n profiles_importTitle: 'Importando perfil...',\n profiles_importComplete: 'Importaci\\u00F3n completa. Presiona cualquier tecla.',\n profiles_importPartial: 'Importaci\\u00F3n finalizada con errores. Revisa el registro arriba.',\n profiles_createName: 'Crear Perfil \\u2014 Nombre:',\n profiles_namePlaceholder: 'ej. trabajo, personal, proyecto-x',\n profiles_createDesc: 'Crear Perfil \"{{name}}\" \\u2014 Descripci\\u00F3n:',\n profiles_descPlaceholder: 'Breve descripci\\u00F3n de esta configuraci\\u00F3n',\n profiles_created: 'Creado: {{date}}',\n profiles_formulaeCount: 'Formulae ({{count}})',\n profiles_casksCount: 'Casks ({{count}})',\n profiles_confirmDelete: '\\u00BFEliminar perfil \"{{name}}\"?',\n profiles_noProfiles: 'A\\u00FAn no hay perfiles guardados.',\n profiles_press: 'Presiona',\n profiles_exportHint: 'para exportar tu configuraci\\u00F3n actual como perfil.',\n profiles_editName: 'Editar Perfil \\u2014 Nombre:',\n profiles_editDesc: 'Editar Perfil \"{{name}}\" \\u2014 Descripci\\u00F3n:',\n\n // ── Smart Cleanup ──\n cleanup_title: 'Limpieza Inteligente',\n cleanup_cleaning: 'Limpiando...',\n cleanup_complete: '\\u00A1Limpieza completa! Presiona r para re-analizar.',\n cleanup_orphans: 'Hu\\u00E9rfanos',\n cleanup_reclaimable: 'Recuperable',\n cleanup_selected: 'Seleccionados',\n cleanup_confirmUninstall: '\\u00BFDesinstalar {{count}} paquetes?',\n cleanup_confirmForce: 'Algunos paquetes tienen dependencias. \\u00BFForzar desinstalaci\\u00F3n de {{count}} paquetes? (ignora dependencias)',\n cleanup_depError: 'Algunos paquetes no pudieron eliminarse por dependencias.',\n cleanup_systemClean: '\\u00A1No se encontraron paquetes hu\\u00E9rfanos. Tu sistema est\\u00E1 limpio!',\n\n // ── History ──\n history_title: 'Historial de Acciones ({{count}})',\n history_filterLabel: 'filtro: {{filter}}',\n history_searchPlaceholder: 'Buscar paquetes...',\n history_confirmClear: '\\u00BFBorrar las {{count}} entradas del historial?',\n history_noEntries: 'Sin entradas en el historial',\n history_noEntriesFor: 'Sin entradas en el historial para \"{{filter}}\"',\n history_all: '(todos)',\n history_actionInstall: 'instalar',\n history_actionUninstall: 'desinstalar',\n history_actionUpgrade: 'actualizar',\n history_actionUpgradeAll: 'actualizar-todo',\n history_confirmReplay: '\\u00BFRe-ejecutar: {{action}} {{name}}?',\n history_replayAll: '\\u00BFRe-ejecutar: actualizar todos los paquetes?',\n\n // ── Security Audit ──\n security_title: 'Auditor\\u00EDa de Seguridad',\n security_scanned: 'Escaneados',\n security_vulnerable: 'Vulnerables',\n security_critical: 'Cr\\u00EDticos',\n security_high: 'Altos',\n security_medium: 'Medios',\n security_noVulns: '\\u00A1No se encontraron vulnerabilidades conocidas en tus paquetes instalados!',\n security_coverage_warning: 'Nota: OSV escanea el dataset Bitnami, que no cubre todas las f\\u00F3rmulas de Homebrew. La ausencia de CVEs no garantiza seguridad total.',\n security_fixedIn: 'Corregido en: {{version}}',\n security_confirmUpgrade: '\\u00BFActualizar {{name}} para corregir vulnerabilidades?',\n\n // ── Account ──\n account_title: 'Cuenta y Licencia',\n account_confirmDeactivate: '\\u00BFDesactivar tu licencia Pro en esta m\\u00E1quina?',\n account_statusLabel: 'Estado:',\n account_pro: '[Pro]',\n account_team: '[Team]',\n account_free: '[Gratis]',\n account_expired: '[Expirada]',\n account_emailLabel: 'Email:',\n account_nameLabel: 'Nombre:',\n account_planLabel: 'Plan:',\n account_monthlyPrice: '5,45\\u20AC/mes',\n account_yearlyPrice: '82\\u20AC/a\\u00F1o',\n account_keyLabel: 'Clave:',\n account_expiresLabel: 'Expira:',\n account_activatedLabel: 'Activado:',\n account_upgradeTitle: 'Actualiza a Brew-TUI Pro',\n account_unlockDesc: 'Desbloquea Perfiles, Limpieza Inteligente, Historial, Auditor\\u00EDa de Seguridad y Brew-TUI-Bar (barra de men\\u00FA macOS).',\n account_pricing: '5,45\\u20AC/mes o 48\\u20AC/a\\u00F1o (ahorra 27%)',\n account_runActivate: 'Ejecuta:',\n account_activateCmd: 'brew-tui activate <clave>',\n account_licenseExpired: 'Tu licencia ha expirado. Renueva para seguir usando las funciones Pro.',\n account_deactivating: 'Desactivando...',\n account_loading: 'Cargando estado de la licencia...',\n account_revalidating: 'Revalidando con el servidor...',\n account_promoTitle: 'Canjear C\\u00F3digo Promocional',\n account_promoLabel: 'C\\u00F3digo:',\n account_promoValidating: 'Validando c\\u00F3digo promocional...',\n account_promoSuccess: '\\u00A1C\\u00F3digo canjeado! Acceso Pro hasta {{expires}}.',\n account_promoInvalid: 'C\\u00F3digo inv\\u00E1lido o expirado.',\n account_promoError: 'No se pudo validar el c\\u00F3digo. Comprueba tu conexi\\u00F3n.',\n account_promoEsc: 'esc: cancelar',\n account_promoHint: 'p: canjear c\\u00F3digo promocional',\n\n // ── Upgrade Prompt ──\n upgrade_proFeature: '{{title}} \\u2014 Funci\\u00F3n Pro',\n upgrade_profiles: 'Perfiles de Paquetes',\n upgrade_profilesDesc: 'Exporta e importa tu configuraci\\u00F3n de Homebrew entre m\\u00E1quinas. Guarda perfiles con nombre para trabajo, personal o proyectos espec\\u00EDficos.',\n upgrade_cleanup: 'Limpieza Inteligente',\n upgrade_cleanupDesc: 'Encuentra paquetes hu\\u00E9rfanos, analiza uso de disco por paquete y recupera espacio con limpieza inteligente de un clic.',\n upgrade_history: 'Historial de Acciones',\n upgrade_historyDesc: 'Rastrea cada instalaci\\u00F3n, desinstalaci\\u00F3n y actualizaci\\u00F3n con marcas de tiempo. Busca y filtra tu historial de gesti\\u00F3n de paquetes.',\n upgrade_security: 'Auditor\\u00EDa de Seguridad',\n upgrade_securityDesc: 'Escanea paquetes instalados contra vulnerabilidades conocidas (CVEs). Ve niveles de severidad, versiones afectadas y correcciones disponibles.',\n upgrade_pricing: '5,45\\u20AC/mes o 48\\u20AC/a\\u00F1o (ahorra 27%)',\n upgrade_teamFeature: '{{title}} \\u2014 Tier Team',\n upgrade_teamPricing: '8\\u20AC/seat/mes o 81,60\\u20AC/seat/a\\u00F1o (ahorra 15%) \\u2014 desde 3 seats',\n upgrade_buyAt: 'Compra en:',\n upgrade_buyUrl: 'https://buy.polar.sh/polar_cl_yQsiUeDelyyEQznbWffD1j77JAyP24ra7iEVQ22PA4h',\n upgrade_buyUrlTeam: 'https://buy.polar.sh/polar_cl_CO6xqSzKgFiQJwXnhZYGqisOP04Wspi0KKZSn38NjFZ?quantity=3',\n upgrade_activateWith: 'Luego activa con:',\n upgrade_activateCmd: 'brew-tui activate <tu-clave-de-licencia>',\n upgrade_proLabel: 'Brew-TUI Pro \\u2014 5,45\\u20AC/mes o 48\\u20AC/a\\u00F1o \\u2014 Incluye Brew-TUI-Bar para macOS',\n upgrade_teamLabel: 'Brew-TUI Team \\u2014 8\\u20AC/seat/mes \\u2014 Incluye todo Pro m\\u00E1s Compliance',\n\n // ── Progress Log ──\n progress_noOutput: 'Sin salida a\\u00FAn',\n\n // ── Search Input ──\n searchInput_placeholder: 'Escribe para filtrar...',\n\n // ── Profile Manager ──\n profileMgr_tapping: 'A\\u00F1adiendo tap {{name}}...',\n profileMgr_installing: 'Instalando {{name}}...',\n profileMgr_installingCask: 'Instalando cask {{name}}...',\n profileMgr_importDone: '\\u00A1Listo! {{count}} paquetes instalados.',\n\n // ── CLI ──\n cli_usageActivate: 'Uso: brew-tui activate <clave-de-licencia>',\n cli_activated: '\\u2714 Pro activado para {{email}}',\n cli_plan: ' Plan: {{plan}}',\n cli_expires: ' Expira: {{date}}',\n cli_activationFailed: '\\u2718 Activaci\\u00F3n fallida: {{error}}',\n cli_noLicense: 'No se encontr\\u00F3 licencia activa.',\n cli_deactivated: '\\u2714 Licencia desactivada.',\n cli_planFree: 'Plan: Gratis',\n cli_planPro: 'Plan: Pro',\n cli_planExpired: 'Plan: Expirada',\n cli_confirmDeactivate: '\\u00BFDesactivar tu licencia Pro en esta m\\u00E1quina? (s/N): ',\n cli_deactivateCancelled: 'Desactivaci\\u00F3n cancelada.',\n cli_upgradeHint: 'Ejecuta `brew-tui activate <clave>` para actualizar a Pro.',\n cli_revalidateHint: 'Ejecuta `brew-tui revalidate` para refrescar tu licencia actual.',\n cli_email: 'Email: {{email}}',\n cli_status: 'Estado: {{status}}',\n cli_revalidated: '\\u2714 Licencia revalidada.',\n cli_revalidateGrace: '\\u26A0 No se pudo contactar al servidor. Tu licencia actual sigue siendo usable dentro del periodo de gracia offline.',\n cli_revalidateFailed: '\\u2718 La revalidaci\\u00F3n de la licencia fall\\u00F3. Renueva tu suscripci\\u00F3n o activa una clave v\\u00E1lida.',\n cli_rateLimited: 'Demasiados intentos de activaci\\u00F3n. Int\\u00E9ntalo en {{minutes}} minutos.',\n cli_cooldown: 'Por favor espera antes de intentar de nuevo.',\n cli_brewtuibarInstalling: 'Descargando Brew-TUI-Bar...',\n cli_brewtuibarInstalled: '\\u2714 Brew-TUI-Bar instalado en /Applications/Brew-TUI-Bar.app',\n cli_brewtuibarAlreadyInstalled: 'Brew-TUI-Bar ya est\\u00E1 instalado. Usa --force para reinstalar.',\n cli_brewtuibarUninstalled: '\\u2714 Brew-TUI-Bar eliminado de /Applications.',\n cli_brewtuibarNotInstalled: 'Brew-TUI-Bar no est\\u00E1 instalado.',\n cli_brewtuibarMacOnly: '\\u2718 Brew-TUI-Bar solo est\\u00E1 disponible en macOS.',\n cli_brewtuibarDownloadFailed: '\\u2718 Error al descargar Brew-TUI-Bar: {{error}}',\n cli_brewtuibarAutoFailed: '\\u26A0 No se pudo lanzar Brew-TUI-Bar automáticamente: {{error}}',\n cli_brewtuibarUpdating: 'Actualizando Brew-TUI-Bar de {{installed}} a {{expected}} para igualar Brew-TUI...',\n cli_brewtuibarVersionMismatch: '\\u26A0 Brew-TUI-Bar {{installed}} no coincide con Brew-TUI {{expected}}. Ejecuta: brew-tui install-brew-tui-bar --force',\n cli_brewtuibarForeignBundle: '\\u2718 /Applications/Brew-TUI-Bar.app existe pero su bundle ID es `{{id}}`, no com.molinesdesigns.brewtuibar. No se tocar\\u00E1 una app ajena. Elim\\u00EDnala o ren\\u00F3mbrala primero.',\n postinstall_skipped: 'Nota: instalaci\\u00F3n autom\\u00E1tica de Brew-TUI-Bar saltada: {{error}}',\n postinstall_manualHint: 'Puedes instalarla manualmente m\\u00E1s tarde con: brew-tui install-brew-tui-bar',\n cli_versionMismatchWarning: '\\u26A0 Brew-TUI-Bar {{installed}} no coincide con esta CLI ({{expected}}). Se actualizar\\u00E1 autom\\u00E1ticamente la pr\\u00F3xima vez que ejecutes `brew-tui` o reinicies la app.',\n cli_deactivateRemoteFailed: '\\u26A0 Advertencia: No se pudo contactar al servidor para desactivar remotamente. La licencia se elimin\\u00F3 localmente pero puede seguir contando como activa.',\n\n // ── License degradation (Layer 15) ──\n license_offlineWarning: 'Tu licencia no se ha validado en {{days}} d\\u00EDas. Por favor con\\u00E9ctate a internet.',\n\n // ── Plurals ──\n plural_vulns_one: '({{count}} vuln)',\n plural_vulns_other: '({{count}} vulns)',\n plural_warnings_one: '{{count}} advertencia',\n plural_warnings_other: '{{count}} advertencias',\n\n // ── Scroll indicators ──\n scroll_moreAbove: '\\u2191 {{count}} m\\u00E1s',\n scroll_moreBelow: '\\u2193 {{count}} m\\u00E1s',\n\n // ── SCR-001: Cleanup warning ──\n cleanup_warning_system_tools: 'Advertencia: los hu\\u00E9rfanos detectados pueden incluir dependencias de herramientas no gestionadas por Homebrew. Revisa la lista antes de continuar.',\n\n // ── SCR-002: Installed column headers ──\n installed_col_package: 'Paquete',\n installed_col_version: 'Versi\\u00F3n',\n installed_col_status: 'Estado',\n\n // ── SCR-003: Search failed ──\n search_failed: 'B\\u00FAsqueda fallida',\n\n // ── SCR-007: Deactivate failed ──\n deactivate_failed: 'Error al desactivar',\n\n // ── ACC-005: Version labels ──\n version_installed: 'instalado:',\n version_available: 'disponible:',\n\n // ── SCR-006: Upgrade-all replay warning ──\n upgrade_all_warning: 'Nota: esto actualizar\\u00E1 todos los paquetes desactualizados actualmente, que pueden diferir del conjunto original.',\n\n // ── SEG-007: Delete account ──\n delete_account_confirm: '\\u00BFEliminar todos los datos de Brew-TUI (~/.brew-tui)? Esto elimina tu licencia, perfiles e historial. Esta acci\\u00F3n no se puede deshacer.',\n delete_account_success: 'Todos los datos de Brew-TUI han sido eliminados.',\n\n // ── SCR-012: Upgrade All packages list ──\n outdated_upgradeAllList: 'Paquetes a actualizar: {{list}}',\n\n // ── SCR-005: Profile import summary ──\n profiles_importSummary: 'Este perfil contiene {{formulae}} formulae y {{casks}} casks. \\u00BFContinuar?',\n\n // ── SCR-017: Network error ──\n security_networkError: 'No se pudo conectar con la base de datos de vulnerabilidades OSV.dev. Verifica tu conexi\\u00F3n a internet.',\n\n // ── ARQ-004: Dashboard last updated ──\n dashboard_lastUpdated: '\\u00DAltima actualizaci\\u00F3n: {{time}}',\n\n // ── SCR-014: Services last error ──\n services_lastError: '\\u00DAltimo error: {{error}}',\n services_errorPermission: 'Permiso denegado \\u2014 este servicio requiere sudo. Ej\\u00E9cutalo desde un terminal con privilegios elevados.',\n\n // ── SCR-010: Generic network error ──\n error_network: 'Error de red: no se puede conectar con el servidor.',\n\n // ── ARQ-005: Security cache ──\n security_rollback_hint: 'R: abrir Rollback para restaurar versiones',\n security_cachedResults: 'Mostrando resultados en cach\\u00E9 (hace {{time}}). Presiona r para re-escanear.',\n\n // ── Impact Analysis ──\n impact_brewfile_hint: '\\u{1F4A1} Añade al Brewfile para fijar esta versión antes de actualizar',\n impact_analyzing: 'Analizando impacto de actualizaci\\u00F3n...',\n impact_high: 'RIESGO ALTO',\n impact_medium: 'RIESGO MEDIO',\n impact_low: 'RIESGO BAJO',\n impact_affects: 'afecta {{count}} paquetes instalados',\n impact_usedBy: 'Usado por: {{packages}}',\n impact_hint: 'Selecciona un paquete para ver el impacto',\n impact_reason_critical_package: 'Paquete cr\\u00EDtico del sistema',\n impact_reason_major_bump: 'Cambio de versi\\u00F3n mayor',\n impact_reason_many_deps: '{{count}} paquetes dependen de este',\n\n // ── Rollback ──\n rollback_title: 'Rollback \\u2014 Restaurar Estado Anterior',\n rollback_no_snapshots: 'No hay snapshots disponibles. Los snapshots se capturan autom\\u00E1ticamente tras cada operaci\\u00F3n.',\n rollback_select_snapshot: 'Selecciona un snapshot para restaurar',\n rollback_snapshot_label: '{{label}} \\u2014 {{date}}',\n rollback_snapshot_auto: 'Auto',\n rollback_diff_empty: 'No se detectaron cambios entre este snapshot y el estado actual',\n rollback_confirm: '\\u00BFRevertir {{count}} paquete(s) a este estado?',\n rollback_strategy_bottle: 'desde cach\\u00E9 de bottle',\n rollback_strategy_versioned: 'desde formula versionada',\n rollback_strategy_pin: 'solo fijar (versi\\u00F3n no restaurable)',\n rollback_strategy_unavailable: 'no se puede restaurar',\n rollback_executing: 'Revirtiendo...',\n rollback_executing_no_cancel: 'Rollback en curso — la cancelación no es segura y se ignorará.',\n rollback_success: 'Rollback completado',\n rollback_error: 'Rollback fallido: {{error}}',\n rollback_item_downgrade: '{{name}}: {{from}} \\u2192 {{to}}',\n rollback_item_remove: 'Eliminar: {{name}}',\n rollback_item_install: 'Instalar: {{name}} {{version}}',\n rollback_warning_cask: 'Los Casks solo se fijar\\u00E1n (restauraci\\u00F3n de versi\\u00F3n no disponible)',\n rollback_capturing: 'Capturando snapshot actual...',\n\n // ── Sync ──\n sync_title: 'Sincronización entre máquinas',\n sync_disabled: 'Sync no está configurado. Pulsa s para configurar iCloud sync.',\n sync_status_ok: 'Sincronizado',\n sync_status_drift: '{{count}} cambio(s) desde otras máquinas',\n sync_status_conflict: '{{count}} conflicto(s) requieren resolución',\n sync_last_sync: 'Última sync: {{date}}',\n sync_machine: 'Esta máquina: {{name}}',\n sync_other_machines: 'Otras máquinas: {{names}}',\n sync_syncing: 'Sincronizando...',\n sync_success: 'Sincronización completa',\n sync_error: 'Sync fallida: {{error}}',\n sync_conflict_title: 'Conflicto: {{package}}',\n sync_conflict_local: 'Esta máquina: {{version}}',\n sync_conflict_remote: '{{machine}}: {{version}}',\n sync_conflict_use_local: 'Mantener local',\n sync_conflict_use_remote: 'Usar remoto',\n sync_setup_icloud: 'Configurando iCloud sync...',\n sync_no_icloud: 'iCloud Drive no encontrado. Asegúrate de que iCloud Drive está activado en Ajustes del Sistema.',\n\n // ── Upgrade Prompt — Sync ──\n upgrade_sync: 'Sincronización entre máquinas',\n upgrade_syncDesc: 'Mantén tu configuración de Homebrew sincronizada entre varios Macs mediante iCloud Drive. Fusiona instalaciones automáticamente y resuelve conflictos.',\n\n // ── Brewfile ──\n brewfile_title: 'Brewfile Declarativo',\n brewfile_compliant: 'en conformidad',\n brewfile_no_brewfile: 'No se encontró Brewfile. Pulsa n para crear uno desde tu instalación actual.',\n brewfile_create_name: 'Nombre del Brewfile (Enter para confirmar):',\n brewfile_created: 'Brewfile creado: {{name}}',\n brewfile_drift_missing: '{{count}} paquetes faltantes',\n brewfile_drift_extra: '{{count}} paquetes extra',\n brewfile_drift_wrong: '{{count}} versiones incorrectas',\n brewfile_reconciling: 'Reconciliando...',\n brewfile_reconcile_success: 'Reconciliación completa',\n brewfile_reconcile_error: 'Reconciliación fallida: {{error}}',\n brewfile_exported: 'Exportado a {{path}}',\n brewfile_formulae_count: '{{count}} formulae',\n brewfile_casks_count: '{{count}} casks',\n brewfile_strict_mode: 'Modo estricto',\n brewfile_in_sync: '✓ El sistema coincide con el Brewfile',\n brewfile_computing_drift: 'Calculando deriva...',\n\n // ── Compliance ──\n view_compliance: 'Compliance',\n compliance_title: 'Conformidad de Equipo',\n compliance_no_policy: 'No hay política cargada. Pulsa i para importar un archivo de política.',\n compliance_score: '{{score}}% en conformidad',\n compliance_violations: '{{count}} violación(es)',\n compliance_ok: 'Totalmente en conformidad',\n compliance_import_prompt: 'Ruta del archivo de política (Enter para confirmar):',\n compliance_import_error: 'Error al cargar la política: {{error}}',\n compliance_violation_missing: 'Faltante: {{name}} (requerido)',\n compliance_violation_forbidden: 'Prohibido: {{name}} — {{reason}}',\n compliance_violation_version: 'Versión incorrecta: {{name}} (requerida {{required}}, instalada {{installed}})',\n compliance_violation_extra: 'Paquete extra: {{name}}',\n compliance_remediating: 'Remediando...',\n compliance_remediate_success: 'Remediación completa',\n compliance_remediate_error: 'Remediación fallida: {{error}}',\n compliance_export_done: 'Informe exportado a {{path}}',\n compliance_press_r_hint: 'Pulsa r para ejecutar la comprobación de cumplimiento.',\n compliance_machine: 'Máquina: {{name}}',\n compliance_policy_name: 'Política: {{name}}',\n compliance_policy_by: 'Mantenida por: {{maintainer}}',\n\n // ── Upgrade Prompt — Compliance ──\n upgrade_compliance: 'Conformidad de Equipo',\n upgrade_complianceDesc: 'Aplica políticas de paquetes en todo tu equipo. Define paquetes requeridos, prohibidos y con versión fijada, y remedia desviaciones automáticamente.',\n\n // ── Upgrade Prompt — Rollback / Brewfile ──\n upgrade_rollback: 'Rollback Inteligente',\n upgrade_rollbackDesc: 'Restaura tu estado de Homebrew desde cualquier snapshot pasado. Brew-TUI captura un snapshot antes de cada install/upgrade para que revertir una actualización fallida sea una pulsación.',\n upgrade_brewfile: 'Brewfile Declarativo',\n upgrade_brewfileDesc: 'Fija tu toolchain en un Brewfile versionado y reconcilia cualquier máquina contra él. Score de deriva, detección de faltantes/sobrantes y alineación con una pulsación.',\n};\n\nexport default es;\n"],"mappings":"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","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  loadLicense,
7
7
  needsRevalidation,
8
8
  revalidate
9
- } from "./chunk-PYDQHHI2.js";
9
+ } from "./chunk-KRVYMXTP.js";
10
10
  import {
11
11
  ensureDataDirs
12
12
  } from "./chunk-LFGDNAXH.js";
@@ -135,4 +135,4 @@ export {
135
135
  verifyStoreIntegrity,
136
136
  useLicenseStore
137
137
  };
138
- //# sourceMappingURL=chunk-CCAT52XY.js.map
138
+ //# sourceMappingURL=chunk-J3O7LVP7.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-NRRQECXA.js";
4
4
  import {
5
5
  t
6
- } from "./chunk-SDQYHY2L.js";
6
+ } from "./chunk-A7U3NZYM.js";
7
7
  import {
8
8
  LICENSE_PATH,
9
9
  ensureDataDirs,
@@ -393,4 +393,4 @@ export {
393
393
  revalidate,
394
394
  deactivate
395
395
  };
396
- //# sourceMappingURL=chunk-PYDQHHI2.js.map
396
+ //# sourceMappingURL=chunk-KRVYMXTP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadLicense
3
- } from "./chunk-PYDQHHI2.js";
3
+ } from "./chunk-KRVYMXTP.js";
4
4
  import {
5
5
  captureSnapshot
6
6
  } from "./chunk-OXDZ4DCK.js";
@@ -339,4 +339,4 @@ export {
339
339
  sync,
340
340
  applyConflictResolutions
341
341
  };
342
- //# sourceMappingURL=chunk-7R4ME2NC.js.map
342
+ //# sourceMappingURL=chunk-WBYR6CIO.js.map
@@ -6,7 +6,7 @@ var execFileAsync = promisify(execFile);
6
6
  var BREWTUIBAR_INFO_PLIST = "/Applications/Brew-TUI-Bar.app/Contents/Info.plist";
7
7
  var CONTRACT_VERSION = 1;
8
8
  function expectedVersion() {
9
- return "2.3.1";
9
+ return "3.0.0";
10
10
  }
11
11
  async function readBrewTUIBarVersion() {
12
12
  try {
@@ -62,4 +62,4 @@ export {
62
62
  compareSemver,
63
63
  checkBrewTUIBarVersion
64
64
  };
65
- //# sourceMappingURL=chunk-KR6EAHEE.js.map
65
+ //# sourceMappingURL=chunk-X3TEZUER.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-NRRQECXA.js";
4
4
  import {
5
5
  t
6
- } from "./chunk-SDQYHY2L.js";
6
+ } from "./chunk-A7U3NZYM.js";
7
7
 
8
8
  // src/lib/brew-tui-bar-installer.ts
9
9
  import { rm, access, readFile } from "fs/promises";
@@ -18,9 +18,6 @@ var execFileAsync = promisify(execFile);
18
18
  var BREWTUIBAR_APP_PATH = "/Applications/Brew-TUI-Bar.app";
19
19
  var BREWTUIBAR_BUNDLE_ID = "com.molinesdesigns.brewtuibar";
20
20
  var BREWTUIBAR_PROCESS_NAME = "Brew-TUI-Bar";
21
- var LEGACY_APP_PATH = "/Applications/BrewBar.app";
22
- var LEGACY_BUNDLE_ID = "com.molinesdesigns.brewbar";
23
- var LEGACY_PROCESS_NAME = "BrewBar";
24
21
  var DOWNLOAD_URL = "https://github.com/MoLinesDesigns/Brew-TUI/releases/latest/download/Brew-TUI-Bar.app.zip";
25
22
  var MAX_SIZE = 200 * 1024 * 1024;
26
23
  async function isBrewTUIBarInstalled() {
@@ -47,40 +44,6 @@ async function bundleIdAt(appPath) {
47
44
  async function installedBundleId() {
48
45
  return bundleIdAt(BREWTUIBAR_APP_PATH);
49
46
  }
50
- async function removeLegacyBundleIfOurs() {
51
- if (process.platform !== "darwin") return;
52
- try {
53
- await access(LEGACY_APP_PATH);
54
- } catch {
55
- return;
56
- }
57
- const legacyId = await bundleIdAt(LEGACY_APP_PATH);
58
- if (legacyId !== LEGACY_BUNDLE_ID) return;
59
- try {
60
- const { stdout } = await execFileAsync("pgrep", ["-x", LEGACY_PROCESS_NAME]);
61
- if (stdout.trim().length > 0) {
62
- try {
63
- await execFileAsync("osascript", ["-e", `tell application "${LEGACY_PROCESS_NAME}" to quit`]);
64
- } catch {
65
- }
66
- for (let i = 0; i < 15; i++) {
67
- try {
68
- const { stdout: s } = await execFileAsync("pgrep", ["-x", LEGACY_PROCESS_NAME]);
69
- if (s.trim().length === 0) break;
70
- } catch {
71
- break;
72
- }
73
- await new Promise((r) => setTimeout(r, 200));
74
- }
75
- try {
76
- await execFileAsync("pkill", ["-x", LEGACY_PROCESS_NAME]);
77
- } catch {
78
- }
79
- }
80
- } catch {
81
- }
82
- await rm(LEGACY_APP_PATH, { recursive: true, force: true });
83
- }
84
47
  async function isBrewTUIBarRunning() {
85
48
  if (process.platform !== "darwin") return false;
86
49
  try {
@@ -198,7 +161,6 @@ async function installBrewTUIBar(_isPro, force = false) {
198
161
  if (wasRunning) {
199
162
  await quitBrewTUIBar();
200
163
  }
201
- await removeLegacyBundleIfOurs();
202
164
  if (force && await isBrewTUIBarInstalled()) {
203
165
  await rm(BREWTUIBAR_APP_PATH, { recursive: true, force: true });
204
166
  }
@@ -224,7 +186,7 @@ async function launchBrewTUIBar() {
224
186
  }
225
187
  async function syncAndLaunchBrewTUIBar() {
226
188
  if (process.platform !== "darwin") return;
227
- const { checkBrewTUIBarVersion } = await import("./version-check-UUJMLUK6.js");
189
+ const { checkBrewTUIBarVersion } = await import("./version-check-NMOGXFF6.js");
228
190
  try {
229
191
  if (!await isBrewTUIBarInstalled()) {
230
192
  console.log(t("cli_brewtuibarInstalling"));
@@ -263,4 +225,4 @@ export {
263
225
  syncAndLaunchBrewTUIBar,
264
226
  uninstallBrewTUIBar
265
227
  };
266
- //# sourceMappingURL=chunk-I5VZR55J.js.map
228
+ //# sourceMappingURL=chunk-Y3OFIGIC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/brew-tui-bar-installer.ts"],"sourcesContent":["import { rm, access, readFile } from 'node:fs/promises';\nimport { createWriteStream } from 'node:fs';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { pipeline } from 'node:stream/promises';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { t } from '../i18n/index.js';\nimport { fetchWithTimeout } from './fetch-timeout.js';\n\nconst execFileAsync = promisify(execFile);\nconst BREWTUIBAR_APP_PATH = '/Applications/Brew-TUI-Bar.app';\nconst BREWTUIBAR_BUNDLE_ID = 'com.molinesdesigns.brewtuibar';\nconst BREWTUIBAR_PROCESS_NAME = 'Brew-TUI-Bar';\nconst DOWNLOAD_URL = 'https://github.com/MoLinesDesigns/Brew-TUI/releases/latest/download/Brew-TUI-Bar.app.zip';\nconst MAX_SIZE = 200 * 1024 * 1024; // 200 MB\n\nexport async function isBrewTUIBarInstalled(): Promise<boolean> {\n try {\n await access(BREWTUIBAR_APP_PATH);\n return true;\n } catch {\n return false;\n }\n}\n\n/// Reads CFBundleIdentifier of an installed .app bundle. Used to detect when\n/// another app has claimed a path we care about (e.g. a third-party clone at\n/// /Applications/Brew-TUI-Bar.app, or a foreign app sitting at the legacy\n/// /Applications/BrewBar.app path). Exported so `doctor` can surface the\n/// installed bundle ID in its diagnostic dump.\nexport async function bundleIdAt(appPath: string): Promise<string | null> {\n if (process.platform !== 'darwin') return null;\n try {\n const { stdout } = await execFileAsync('defaults', [\n 'read',\n `${appPath}/Contents/Info.plist`,\n 'CFBundleIdentifier',\n ]);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nasync function installedBundleId(): Promise<string | null> {\n return bundleIdAt(BREWTUIBAR_APP_PATH);\n}\n\n/// Returns true if the Brew-TUI-Bar process is currently running.\n/// Used by the installer to decide whether to quit + relaunch after an update.\nexport async function isBrewTUIBarRunning(): Promise<boolean> {\n if (process.platform !== 'darwin') return false;\n try {\n const { stdout } = await execFileAsync('pgrep', ['-x', BREWTUIBAR_PROCESS_NAME]);\n return stdout.trim().length > 0;\n } catch {\n // pgrep exits 1 when no match; that means \"not running\", not a failure.\n return false;\n }\n}\n\n/// Asks Brew-TUI-Bar to quit gracefully (LSUIElement → no dialogs), then falls back\n/// to pkill if it hasn't exited within 3 s. Required before reemplazar el bundle:\n/// `ditto -xk` sobre una app en ejecución deja un bundle viejo con un Info.plist\n/// nuevo, lo cual confunde el monitor de last-action y los watchers FSEvents.\nasync function quitBrewTUIBar(): Promise<void> {\n if (process.platform !== 'darwin') return;\n try {\n await execFileAsync('osascript', ['-e', `tell application \"${BREWTUIBAR_PROCESS_NAME}\" to quit`]);\n } catch {\n /* osascript falla si la app no está registrada; pasamos a pkill */\n }\n for (let i = 0; i < 15; i++) {\n if (!(await isBrewTUIBarRunning())) return;\n await new Promise((r) => setTimeout(r, 200));\n }\n try {\n await execFileAsync('pkill', ['-x', BREWTUIBAR_PROCESS_NAME]);\n } catch {\n /* nada que matar */\n }\n}\n\n/// Install Brew-TUI-Bar. As of 2.1.0 we no longer gate on Pro: Free users get\n/// the bundle too and see the in-app upgrade prompt when they click the menu\n/// bar icon. The `_isPro` parameter is kept for backwards compatibility with\n/// existing call sites but is ignored.\nexport async function installBrewTUIBar(_isPro: boolean, force = false): Promise<void> {\n // macOS only\n if (process.platform !== 'darwin') {\n throw new Error(t('cli_brewtuibarMacOnly'));\n }\n\n // If an app already exists at our install path, verify it's ours before\n // we touch it. Defends against name collisions with third-party clones.\n if (await isBrewTUIBarInstalled()) {\n const id = await installedBundleId();\n if (id && id !== BREWTUIBAR_BUNDLE_ID) {\n throw new Error(t('cli_brewtuibarForeignBundle', { id }));\n }\n if (!force) {\n throw new Error(t('cli_brewtuibarAlreadyInstalled'));\n }\n }\n\n // EP-013: Use unique temp path\n const TMP_ZIP = join(tmpdir(), 'Brew-TUI-Bar-' + randomUUID() + '.zip');\n\n // Download zip (120s timeout for large binary)\n const res = await fetchWithTimeout(DOWNLOAD_URL, {}, 120_000);\n if (!res.ok || !res.body) {\n throw new Error(t('cli_brewtuibarDownloadFailed', { error: `HTTP ${res.status}` }));\n }\n\n // Reject downloads larger than 200 MB (from Content-Length header)\n const contentLength = Number(res.headers.get('content-length') ?? '0');\n if (contentLength > MAX_SIZE) {\n throw new Error(t('cli_brewtuibarDownloadFailed', { error: 'Download exceeds 200 MB size limit' }));\n }\n\n // EP-005: Track downloaded bytes during the stream\n let downloadedBytes = 0;\n\n // Progress reporting: TTYs get an in-place \\r-updated line; non-TTYs (e.g.\n // brew install captures stdout into a log) get a chunked one-line-per-25%\n // report so the log stays readable. Either way, callers see the install\n // is progressing, not hanging.\n const isTTY = process.stdout.isTTY ?? false;\n let lastReportedQuarter = -1;\n\n function reportProgress(): void {\n const totalMB = contentLength > 0 ? (contentLength / 1024 / 1024).toFixed(1) : null;\n const doneMB = (downloadedBytes / 1024 / 1024).toFixed(1);\n const pct = contentLength > 0 ? Math.floor((downloadedBytes / contentLength) * 100) : -1;\n\n if (isTTY) {\n // Pad to 60 chars so the previous (possibly longer) line is fully erased.\n const line = totalMB\n ? ` ${doneMB} MB / ${totalMB} MB (${pct}%)`\n : ` ${doneMB} MB`;\n process.stdout.write('\\r' + line.padEnd(60, ' '));\n } else if (pct >= 0) {\n const quarter = Math.floor(pct / 25);\n if (quarter > lastReportedQuarter) {\n lastReportedQuarter = quarter;\n console.log(` ${pct}% (${doneMB} MB / ${totalMB} MB)`);\n }\n }\n }\n\n // Write to tmp file with byte counting\n const fileStream = createWriteStream(TMP_ZIP);\n const transformedBody = new ReadableStream({\n async start(controller) {\n const bodyReader = (res.body as ReadableStream<Uint8Array>).getReader();\n try {\n while (true) {\n const { done, value } = await bodyReader.read();\n if (done) break;\n downloadedBytes += value.length;\n if (downloadedBytes > MAX_SIZE) {\n controller.error(new Error('Download exceeds 200 MB limit'));\n return;\n }\n controller.enqueue(value);\n reportProgress();\n }\n controller.close();\n } catch (err) {\n controller.error(err);\n }\n },\n });\n await pipeline(transformedBody as unknown as NodeJS.ReadableStream, fileStream);\n // Newline so the next log line ('✔ installed…') starts clean after the \\r line.\n if (isTTY) process.stdout.write('\\n');\n\n // SEG-001: SHA-256 integrity check with proper error handling\n let expectedHash: string | null = null;\n try {\n const checksumRes = await fetchWithTimeout(`${DOWNLOAD_URL}.sha256`, {}, 15_000);\n if (checksumRes.ok) {\n const text = await checksumRes.text();\n // EP-009: Validate split result is defined\n const hash = text.trim().split(/\\s+/)[0];\n // EP-010: Validate hash format\n if (hash && /^[0-9a-f]{64}$/i.test(hash)) {\n expectedHash = hash.toLowerCase();\n }\n }\n } catch {\n /* checksum file not available */\n }\n\n if (expectedHash) {\n const fileBuffer = await readFile(TMP_ZIP);\n const actual = createHash('sha256').update(fileBuffer).digest('hex');\n if (actual !== expectedHash) {\n await rm(TMP_ZIP, { force: true }).catch(() => {});\n throw new Error(t('cli_brewtuibarDownloadFailed', { error: 'SHA-256 mismatch: binary may have been tampered with' }));\n }\n } else {\n // NUEVO-003: Treat missing checksum as fatal — don't install unverified binaries\n await rm(TMP_ZIP, { force: true }).catch(() => {});\n throw new Error(t('cli_brewtuibarDownloadFailed', { error: 'SHA-256 checksum unavailable — cannot verify download integrity' }));\n }\n\n // Si Brew-TUI-Bar está corriendo, cerrarla antes de tocar el bundle. Sin esto\n // `ditto -xk` sobreescribe los recursos de un proceso vivo y la app queda\n // en estado degradado hasta el próximo lanzamiento.\n const wasRunning = await isBrewTUIBarRunning();\n if (wasRunning) {\n await quitBrewTUIBar();\n }\n\n // Remove old app if force reinstall\n if (force && await isBrewTUIBarInstalled()) {\n await rm(BREWTUIBAR_APP_PATH, { recursive: true, force: true });\n }\n\n // Unzip to /Applications\n try {\n await execFileAsync('ditto', ['-xk', TMP_ZIP, '/Applications/']);\n } catch (err) {\n throw new Error(t('cli_brewtuibarDownloadFailed', { error: err instanceof Error ? err.message : String(err) }), { cause: err });\n } finally {\n // Clean up tmp zip\n await rm(TMP_ZIP, { force: true }).catch(() => {});\n }\n\n // Si estaba corriendo antes de la actualización, relanzarla para que el\n // usuario vuelva a ver el ícono en la menubar sin pasos manuales.\n if (wasRunning) {\n await launchBrewTUIBar();\n }\n}\n\n/// Launches Brew-TUI-Bar detached from the parent process so it survives terminal close.\n/// `open -g -a` runs the app in the background without bringing it to foreground.\nexport async function launchBrewTUIBar(): Promise<void> {\n if (process.platform !== 'darwin') return;\n if (!await isBrewTUIBarInstalled()) return;\n try {\n await execFileAsync('open', ['-g', '-a', BREWTUIBAR_APP_PATH]);\n } catch {\n // Non-fatal: may already be running, or LaunchServices may need a moment.\n }\n}\n\n/// One-shot \"install if missing, update if outdated, launch\" flow shared by\n/// the CLI cold-start (`ensureBrewTUIBarRunning`) and the npm postinstall.\n/// All errors are swallowed and logged as warnings — callers should never\n/// have their install/launch fail just because the menu bar app is unhappy.\nexport async function syncAndLaunchBrewTUIBar(): Promise<void> {\n if (process.platform !== 'darwin') return;\n\n const { checkBrewTUIBarVersion } = await import('./version-check.js');\n\n try {\n if (!(await isBrewTUIBarInstalled())) {\n console.log(t('cli_brewtuibarInstalling'));\n await installBrewTUIBar(false, false);\n console.log(t('cli_brewtuibarInstalled'));\n } else {\n // Reinstall in place when the installed bundle is older than the CLI.\n // Same contract enforced by `checkBrewTUIBarVersion`, so the menubar\n // app and CLI always agree on the license/IPC schema.\n const status = await checkBrewTUIBarVersion();\n if (status.kind === 'outdated') {\n console.log(t('cli_brewtuibarUpdating', { installed: status.installed, expected: status.expected }));\n await installBrewTUIBar(false, true);\n console.log(t('cli_brewtuibarInstalled'));\n }\n }\n await launchBrewTUIBar();\n } catch (err) {\n console.warn(t('cli_brewtuibarAutoFailed', { error: err instanceof Error ? err.message : String(err) }));\n }\n}\n\nexport async function uninstallBrewTUIBar(): Promise<void> {\n if (!await isBrewTUIBarInstalled()) {\n throw new Error(t('cli_brewtuibarNotInstalled'));\n }\n // Refuse to delete a foreign app that happens to live at the same path.\n const id = await installedBundleId();\n if (id && id !== BREWTUIBAR_BUNDLE_ID) {\n throw new Error(t('cli_brewtuibarForeignBundle', { id }));\n }\n\n await rm(BREWTUIBAR_APP_PATH, { recursive: true, force: true });\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  checkBrewTUIBarVersion,
3
3
  readBrewTUIBarVersion
4
- } from "./chunk-KR6EAHEE.js";
4
+ } from "./chunk-X3TEZUER.js";
5
5
  import {
6
6
  useLicenseStore
7
- } from "./chunk-CCAT52XY.js";
7
+ } from "./chunk-J3O7LVP7.js";
8
8
  import {
9
9
  bundleIdAt,
10
10
  isBrewTUIBarInstalled,
11
11
  isBrewTUIBarRunning
12
- } from "./chunk-I5VZR55J.js";
13
- import "./chunk-PYDQHHI2.js";
12
+ } from "./chunk-Y3OFIGIC.js";
13
+ import "./chunk-KRVYMXTP.js";
14
14
  import "./chunk-NRRQECXA.js";
15
- import "./chunk-SDQYHY2L.js";
15
+ import "./chunk-A7U3NZYM.js";
16
16
  import "./chunk-KDHEUNRI.js";
17
17
  import "./chunk-LFGDNAXH.js";
18
18
 
@@ -53,7 +53,7 @@ async function findBrewBinary() {
53
53
  }
54
54
  }
55
55
  async function runDoctor() {
56
- const cliVersion = "2.3.1";
56
+ const cliVersion = "3.0.0";
57
57
  console.log(format("Brew-TUI", [
58
58
  { label: "CLI version", value: cliVersion },
59
59
  { label: "Platform", value: `${process.platform} (${arch()})` },
@@ -94,7 +94,7 @@ async function runDoctor() {
94
94
  { label: "Bundle ID", value: legacyId ?? "(unreadable)" },
95
95
  {
96
96
  label: "Note",
97
- value: legacyId === "com.molinesdesigns.brewbar" ? "will be cleaned up on next `brew-tui install-brew-tui-bar`" : "foreign app \u2014 not ours, not touching"
97
+ value: legacyId === "com.molinesdesigns.brewbar" ? "remove manually: rm -rf /Applications/BrewBar.app" : "foreign app \u2014 not ours, not touching"
98
98
  }
99
99
  ]));
100
100
  console.log("");
@@ -130,4 +130,4 @@ async function runDoctor() {
130
130
  export {
131
131
  runDoctor
132
132
  };
133
- //# sourceMappingURL=doctor-D56LDODR.js.map
133
+ //# sourceMappingURL=doctor-3PQZV7OV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/doctor.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { access, stat } from 'node:fs/promises';\nimport { homedir, arch } from 'node:os';\nimport { join } from 'node:path';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { bundleIdAt, isBrewTUIBarInstalled, isBrewTUIBarRunning } from './brew-tui-bar-installer.js';\nimport { readBrewTUIBarVersion, checkBrewTUIBarVersion } from './version-check.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst EXPECTED_BUNDLE_ID = 'com.molinesdesigns.brewtuibar';\nconst APP_PATH = '/Applications/Brew-TUI-Bar.app';\nconst LEGACY_APP_PATH = '/Applications/BrewBar.app';\n\ntype Line = { label: string; value: string; ok?: boolean | null };\n\nfunction format(section: string, lines: Line[]): string {\n const out: string[] = [`=== ${section} ===`];\n const maxLabel = lines.reduce((m, l) => Math.max(m, l.label.length), 0);\n for (const l of lines) {\n const pad = ' '.repeat(maxLabel - l.label.length);\n const mark = l.ok === true ? ' ✓' : l.ok === false ? ' ✘' : '';\n out.push(` ${l.label}${pad} ${l.value}${mark}`);\n }\n return out.join('\\n');\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findBrewBinary(): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync('which', ['brew']);\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n\n/// Plain-text diagnostic dump for the user / support. No Ink, no colors —\n/// users will paste this into bug reports. Each section is best-effort:\n/// individual probes can fail without aborting the whole report.\nexport async function runDoctor(): Promise<void> {\n const cliVersion = process.env.APP_VERSION ?? '0.0.0';\n\n // ── Brew-TUI ──────────────────────────────────────────────────────────\n console.log(format('Brew-TUI', [\n { label: 'CLI version', value: cliVersion },\n { label: 'Platform', value: `${process.platform} (${arch()})` },\n { label: 'Node', value: process.version },\n ]));\n console.log('');\n\n // ── Brew-TUI-Bar (macOS only) ─────────────────────────────────────────\n if (process.platform === 'darwin') {\n const lines: Line[] = [];\n try {\n const installed = await isBrewTUIBarInstalled();\n if (!installed) {\n lines.push({ label: 'Installed', value: 'no' });\n } else {\n lines.push({ label: 'Installed at', value: APP_PATH, ok: true });\n const appVersion = await readBrewTUIBarVersion();\n lines.push({ label: 'App version', value: appVersion ?? '(unreadable)' });\n const status = await checkBrewTUIBarVersion();\n const statusLabel = status.kind === 'ok' ? 'in sync'\n : status.kind === 'outdated' ? `outdated (expected ${status.expected})`\n : status.kind === 'newer' ? `app is newer than CLI (CLI expects ${status.expected})`\n : status.kind === 'not-installed' ? 'not installed'\n : `unknown (${status.reason})`;\n lines.push({ label: 'Version status', value: statusLabel, ok: status.kind === 'ok' });\n const bundleId = await bundleIdAt(APP_PATH);\n lines.push({\n label: 'Bundle ID',\n value: bundleId ?? '(unreadable)',\n ok: bundleId === EXPECTED_BUNDLE_ID ? true : bundleId ? false : null,\n });\n const running = await isBrewTUIBarRunning();\n lines.push({ label: 'Process running', value: running ? 'yes' : 'no' });\n }\n } catch (err) {\n lines.push({ label: '(probe error)', value: err instanceof Error ? err.message : String(err) });\n }\n console.log(format('Brew-TUI-Bar (macOS companion)', lines));\n console.log('');\n\n // Legacy bundle from the BrewBar era. As of 3.0.0 we no longer auto-clean\n // it (the cask `brewbar` is `disable!` and the in-process cleanup helper\n // was retired); the doctor still reports it so users can wipe it manually.\n if (await pathExists(LEGACY_APP_PATH)) {\n const legacyId = await bundleIdAt(LEGACY_APP_PATH);\n console.log(format('Legacy BrewBar.app', [\n { label: 'Path', value: LEGACY_APP_PATH },\n { label: 'Bundle ID', value: legacyId ?? '(unreadable)' },\n {\n label: 'Note',\n value: legacyId === 'com.molinesdesigns.brewbar'\n ? 'remove manually: rm -rf /Applications/BrewBar.app'\n : 'foreign app — not ours, not touching',\n },\n ]));\n console.log('');\n }\n }\n\n // ── License ───────────────────────────────────────────────────────────\n const licLines: Line[] = [];\n try {\n await useLicenseStore.getState().initialize();\n const { status, license, degradation } = useLicenseStore.getState();\n const tierLabel = status === 'pro' ? 'Pro' : status === 'expired' ? 'Expired' : 'Free';\n licLines.push({ label: 'Tier', value: tierLabel });\n if (license) {\n licLines.push({ label: 'Email', value: license.customerEmail });\n licLines.push({ label: 'Activated at', value: license.activatedAt });\n if (license.expiresAt) licLines.push({ label: 'Expires at', value: license.expiresAt });\n licLines.push({ label: 'Last validated', value: license.lastValidatedAt });\n }\n licLines.push({ label: 'Degradation', value: degradation });\n } catch (err) {\n licLines.push({ label: '(probe error)', value: err instanceof Error ? err.message : String(err) });\n }\n console.log(format('License', licLines));\n console.log('');\n\n // ── Environment ───────────────────────────────────────────────────────\n const dataDir = join(homedir(), '.brew-tui');\n const machineIdPath = join(dataDir, 'machine-id');\n const machineIdPresent = await stat(machineIdPath).then(() => true).catch(() => false);\n console.log(format('Environment', [\n { label: 'brew binary', value: (await findBrewBinary()) ?? '(not on PATH)' },\n { label: 'Data directory', value: dataDir },\n { label: 'machine-id', value: machineIdPresent ? 'present' : '(not created — appears after first activate)' },\n ]));\n}\n"],"mappings":"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","names":[]}