fpf-cli 1.1.0 → 1.4.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 (4) hide show
  1. package/LICENSE +201 -674
  2. package/README.md +8 -2
  3. package/fpf +225 -13
  4. package/package.json +3 -2
package/README.md CHANGED
@@ -36,15 +36,18 @@ By default, `fpf` auto-detects your package manager.
36
36
 
37
37
  On macOS, default auto mode uses both `brew` and `bun` together.
38
38
 
39
+ On Linux, default auto mode uses your distro manager plus installed cross-platform managers (`snap`, `flatpak`, `brew`, `npm`, `bun`).
40
+
41
+ On Windows (Git Bash / MSYS / Cygwin), default auto mode uses installed Windows managers (`winget`, `choco`, `scoop`) plus `npm` and `bun`.
42
+
39
43
  ## Supported Managers
40
44
 
41
45
  - Linux: `apt`, `dnf`, `pacman`, `zypper`, `emerge`
46
+ - Windows: `winget`, `choco`, `scoop`
42
47
  - Cross-platform: `snap`, `flatpak`
43
48
  - Dev: `npm`, `bun`
44
49
  - macOS: `brew`
45
50
 
46
- (`winget` intentionally not included.)
47
-
48
51
  ## Manager Override Flags
49
52
 
50
53
  - `-ap` apt
@@ -53,6 +56,9 @@ On macOS, default auto mode uses both `brew` and `bun` together.
53
56
  - `-zy` zypper
54
57
  - `-em` emerge
55
58
  - `-br` brew
59
+ - `-wg` winget
60
+ - `-ch` choco
61
+ - `-sc` scoop
56
62
  - `-sn` snap
57
63
  - `-fp` flatpak
58
64
  - `-np` npm
package/fpf CHANGED
@@ -43,13 +43,13 @@ run_as_root() {
43
43
  }
44
44
 
45
45
  manager_list() {
46
- printf "%s\n" "apt dnf pacman zypper emerge brew snap flatpak npm bun"
46
+ printf "%s\n" "apt dnf pacman zypper emerge brew winget choco scoop snap flatpak npm bun"
47
47
  }
48
48
 
49
49
  manager_supported() {
50
50
  local manager="$1"
51
51
  case "${manager}" in
52
- apt|dnf|pacman|zypper|emerge|brew|snap|flatpak|npm|bun)
52
+ apt|dnf|pacman|zypper|emerge|brew|winget|choco|scoop|snap|flatpak|npm|bun)
53
53
  return 0
54
54
  ;;
55
55
  *)
@@ -79,6 +79,15 @@ manager_command_ready() {
79
79
  brew)
80
80
  command_exists brew
81
81
  ;;
82
+ winget)
83
+ command_exists winget
84
+ ;;
85
+ choco)
86
+ command_exists choco
87
+ ;;
88
+ scoop)
89
+ command_exists scoop
90
+ ;;
82
91
  snap)
83
92
  command_exists snap
84
93
  ;;
@@ -127,6 +136,9 @@ manager_label() {
127
136
  zypper) printf "Zypper" ;;
128
137
  emerge) printf "Portage (emerge)" ;;
129
138
  brew) printf "Homebrew" ;;
139
+ winget) printf "WinGet" ;;
140
+ choco) printf "Chocolatey" ;;
141
+ scoop) printf "Scoop" ;;
130
142
  snap) printf "Snap" ;;
131
143
  flatpak) printf "Flatpak" ;;
132
144
  npm) printf "npm" ;;
@@ -146,6 +158,14 @@ detect_default_manager() {
146
158
  fi
147
159
  fi
148
160
 
161
+ if [[ "${os}" == MINGW* || "${os}" == MSYS* || "${os}" == CYGWIN* || "${os}" == "Windows_NT" ]]; then
162
+ if command_exists winget; then printf "winget"; return; fi
163
+ if command_exists choco; then printf "choco"; return; fi
164
+ if command_exists scoop; then printf "scoop"; return; fi
165
+ if command_exists npm; then printf "npm"; return; fi
166
+ if command_exists bun; then printf "bun"; return; fi
167
+ fi
168
+
149
169
  if [[ "${os}" == "Linux" ]]; then
150
170
  local distro_id=""
151
171
  local distro_like=""
@@ -196,6 +216,9 @@ detect_default_manager() {
196
216
  fi
197
217
 
198
218
  if command_exists brew; then printf "brew"; return; fi
219
+ if command_exists winget; then printf "winget"; return; fi
220
+ if command_exists choco; then printf "choco"; return; fi
221
+ if command_exists scoop; then printf "scoop"; return; fi
199
222
  if command_exists npm; then printf "npm"; return; fi
200
223
  if command_exists bun; then printf "bun"; return; fi
201
224
 
@@ -204,24 +227,67 @@ detect_default_manager() {
204
227
 
205
228
  detect_default_managers() {
206
229
  local os
230
+ local emitted=""
231
+ local primary_manager=""
232
+
233
+ add_detected_manager() {
234
+ local manager_name="$1"
235
+ [[ -n "${manager_name}" ]] || return
236
+ case " ${emitted} " in
237
+ *" ${manager_name} "*)
238
+ return
239
+ ;;
240
+ esac
241
+ if manager_command_ready "${manager_name}"; then
242
+ printf "%s\n" "${manager_name}"
243
+ emitted+=" ${manager_name}"
244
+ fi
245
+ }
246
+
207
247
  os="$(uname -s)"
208
248
 
209
249
  if [[ "${os}" == "Darwin" ]]; then
210
- local found=0
211
- if command_exists brew; then
212
- printf "brew\n"
213
- found=1
250
+ add_detected_manager "brew"
251
+ add_detected_manager "bun"
252
+ if [[ -n "${emitted}" ]]; then
253
+ return
214
254
  fi
215
- if command_exists bun; then
216
- printf "bun\n"
217
- found=1
255
+ fi
256
+
257
+ if [[ "${os}" == MINGW* || "${os}" == MSYS* || "${os}" == CYGWIN* || "${os}" == "Windows_NT" ]]; then
258
+ add_detected_manager "winget"
259
+ add_detected_manager "choco"
260
+ add_detected_manager "scoop"
261
+ add_detected_manager "npm"
262
+ add_detected_manager "bun"
263
+ if [[ -n "${emitted}" ]]; then
264
+ return
218
265
  fi
219
- if [[ "${found}" -eq 1 ]]; then
266
+ fi
267
+
268
+ if [[ "${os}" == "Linux" ]]; then
269
+ primary_manager="$(detect_default_manager)"
270
+ add_detected_manager "${primary_manager}"
271
+
272
+ add_detected_manager "snap"
273
+ add_detected_manager "flatpak"
274
+ add_detected_manager "brew"
275
+ add_detected_manager "npm"
276
+ add_detected_manager "bun"
277
+
278
+ if [[ -n "${emitted}" ]]; then
220
279
  return
221
280
  fi
222
281
  fi
223
282
 
224
- printf "%s\n" "$(detect_default_manager)"
283
+ primary_manager="$(detect_default_manager)"
284
+ add_detected_manager "${primary_manager}"
285
+
286
+ if [[ -n "${emitted}" ]]; then
287
+ return
288
+ fi
289
+
290
+ die "Unable to auto-detect supported package managers. Use --manager."
225
291
  }
226
292
 
227
293
  join_manager_labels() {
@@ -283,6 +349,9 @@ Manager options (one or two-letter style):
283
349
  -zy, --zypper Use Zypper
284
350
  -em, --emerge Use Portage (emerge)
285
351
  -br, --brew Use Homebrew
352
+ -wg, --winget Use WinGet
353
+ -ch, --choco Use Chocolatey
354
+ -sc, --scoop Use Scoop
286
355
  -sn, --snap Use Snap
287
356
  -fp, --flatpak Use Flatpak
288
357
  -np, --npm Use npm (global packages)
@@ -296,7 +365,9 @@ Examples:
296
365
  ${SCRIPT_NAME} -br -R wget
297
366
  ${SCRIPT_NAME} -sn firefox
298
367
  ${SCRIPT_NAME} -fp org.gimp.GIMP
368
+ ${SCRIPT_NAME} -wg Microsoft.VisualStudioCode
299
369
  ${SCRIPT_NAME} -np eslint
370
+ ${SCRIPT_NAME} -ch git
300
371
  ${SCRIPT_NAME} -m apt ripgrep
301
372
 
302
373
  Supported managers:
@@ -353,6 +424,15 @@ parse_args() {
353
424
  -br|--brew)
354
425
  MANAGER_OVERRIDE="brew"
355
426
  ;;
427
+ -wg|--winget)
428
+ MANAGER_OVERRIDE="winget"
429
+ ;;
430
+ -ch|--choco)
431
+ MANAGER_OVERRIDE="choco"
432
+ ;;
433
+ -sc|--scoop)
434
+ MANAGER_OVERRIDE="scoop"
435
+ ;;
356
436
  -sn|--snap)
357
437
  MANAGER_OVERRIDE="snap"
358
438
  ;;
@@ -418,7 +498,7 @@ manager_search_entries() {
418
498
 
419
499
  if [[ -z "${effective_query}" ]]; then
420
500
  case "${manager}" in
421
- apt|dnf|pacman|zypper|emerge|snap|flatpak|npm|bun)
501
+ apt|dnf|pacman|zypper|emerge|winget|choco|scoop|snap|flatpak|npm|bun)
422
502
  effective_query="a"
423
503
  ;;
424
504
  brew)
@@ -490,6 +570,45 @@ manager_search_entries() {
490
570
  brew search "${effective_query}" 2>/dev/null |
491
571
  awk 'NF > 0 { print $1 "\t-" }'
492
572
  ;;
573
+ winget)
574
+ winget search "${effective_query}" --source winget --accept-source-agreements --disable-interactivity 2>/dev/null |
575
+ awk '
576
+ /^[[:space:]]*$/ { next }
577
+ /^Name[[:space:]]+Id[[:space:]]+/ { next }
578
+ /^[-[:space:]]+$/ { next }
579
+ {
580
+ pkg = ""
581
+ desc = "-"
582
+ if (NF >= 2) {
583
+ pkg = $2
584
+ } else if (NF >= 1) {
585
+ pkg = $1
586
+ }
587
+ if (pkg != "") {
588
+ print pkg "\t" desc
589
+ }
590
+ }
591
+ '
592
+ ;;
593
+ choco)
594
+ choco search "${effective_query}" --limit-output 2>/dev/null |
595
+ awk -F'|' 'NF >= 1 && $1 != "" { ver=$2; if (ver == "") ver="-"; print $1 "\tversion " ver }'
596
+ ;;
597
+ scoop)
598
+ scoop search "${effective_query}" 2>/dev/null |
599
+ awk '
600
+ /^[[:space:]]*$/ { next }
601
+ /^[-[:space:]]+$/ { next }
602
+ /^Name[[:space:]]+/ { next }
603
+ {
604
+ name = $1
605
+ $1 = ""
606
+ sub(/^[[:space:]]+/, "", $0)
607
+ if ($0 == "") $0 = "-"
608
+ print name "\t" $0
609
+ }
610
+ '
611
+ ;;
493
612
  snap)
494
613
  snap find "${effective_query}" 2>/dev/null |
495
614
  awk '
@@ -579,6 +698,47 @@ manager_installed_entries() {
579
698
  brew list --versions 2>/dev/null |
580
699
  awk '{ name=$1; $1=""; sub(/^[[:space:]]+/, "", $0); if ($0 == "") $0="installed"; print name "\t" $0 }'
581
700
  ;;
701
+ winget)
702
+ winget list --source winget --accept-source-agreements --disable-interactivity 2>/dev/null |
703
+ awk '
704
+ /^[[:space:]]*$/ { next }
705
+ /^Name[[:space:]]+Id[[:space:]]+/ { next }
706
+ /^[-[:space:]]+$/ { next }
707
+ {
708
+ pkg = ""
709
+ ver = "installed"
710
+ if (NF >= 3) {
711
+ pkg = $2
712
+ ver = $3
713
+ } else if (NF >= 2) {
714
+ pkg = $1
715
+ ver = $2
716
+ } else if (NF >= 1) {
717
+ pkg = $1
718
+ }
719
+ if (pkg != "") {
720
+ print pkg "\t" ver
721
+ }
722
+ }
723
+ '
724
+ ;;
725
+ choco)
726
+ choco list --local-only --limit-output 2>/dev/null |
727
+ awk -F'|' 'NF >= 1 && $1 != "" { ver=$2; if (ver == "") ver="installed"; print $1 "\t" ver }'
728
+ ;;
729
+ scoop)
730
+ scoop list 2>/dev/null |
731
+ awk '
732
+ /^[[:space:]]*$/ { next }
733
+ /^[-[:space:]]+$/ { next }
734
+ /^Name[[:space:]]+/ { next }
735
+ {
736
+ ver = $2
737
+ if (ver == "") ver = "installed"
738
+ print $1 "\t" ver
739
+ }
740
+ '
741
+ ;;
582
742
  snap)
583
743
  snap list 2>/dev/null |
584
744
  awk 'NR > 1 { print $1 "\t" $2 }'
@@ -662,6 +822,15 @@ manager_preview_command() {
662
822
  brew)
663
823
  printf '%s' 'pkg={1}; brew info "$pkg" 2>/dev/null'
664
824
  ;;
825
+ winget)
826
+ printf '%s' 'pkg={1}; winget show --id "$pkg" --exact --source winget --accept-source-agreements --disable-interactivity 2>/dev/null'
827
+ ;;
828
+ choco)
829
+ printf '%s' 'pkg={1}; choco info "$pkg" 2>/dev/null'
830
+ ;;
831
+ scoop)
832
+ printf '%s' 'pkg={1}; scoop info "$pkg" 2>/dev/null'
833
+ ;;
665
834
  snap)
666
835
  printf '%s' 'pkg={1}; snap info "$pkg" 2>/dev/null'
667
836
  ;;
@@ -700,6 +869,18 @@ manager_install() {
700
869
  brew)
701
870
  brew install "$@"
702
871
  ;;
872
+ winget)
873
+ local pkg
874
+ for pkg in "$@"; do
875
+ winget install --id "${pkg}" --exact --source winget --accept-package-agreements --accept-source-agreements --disable-interactivity
876
+ done
877
+ ;;
878
+ choco)
879
+ choco install "$@" -y
880
+ ;;
881
+ scoop)
882
+ scoop install "$@"
883
+ ;;
703
884
  snap)
704
885
  local pkg
705
886
  for pkg in "$@"; do
@@ -745,6 +926,18 @@ manager_remove() {
745
926
  brew)
746
927
  brew uninstall "$@"
747
928
  ;;
929
+ winget)
930
+ local pkg
931
+ for pkg in "$@"; do
932
+ winget uninstall --id "${pkg}" --exact --disable-interactivity
933
+ done
934
+ ;;
935
+ choco)
936
+ choco uninstall "$@" -y
937
+ ;;
938
+ scoop)
939
+ scoop uninstall "$@"
940
+ ;;
748
941
  snap)
749
942
  run_as_root snap remove "$@"
750
943
  ;;
@@ -783,6 +976,15 @@ manager_show_info() {
783
976
  brew)
784
977
  brew info "${package}" 2>/dev/null
785
978
  ;;
979
+ winget)
980
+ winget show --id "${package}" --exact --source winget --accept-source-agreements --disable-interactivity 2>/dev/null
981
+ ;;
982
+ choco)
983
+ choco info "${package}" 2>/dev/null
984
+ ;;
985
+ scoop)
986
+ scoop info "${package}" 2>/dev/null
987
+ ;;
786
988
  snap)
787
989
  snap info "${package}" 2>/dev/null
788
990
  ;;
@@ -824,6 +1026,16 @@ manager_update() {
824
1026
  brew update
825
1027
  brew upgrade
826
1028
  ;;
1029
+ winget)
1030
+ winget upgrade --all --source winget --accept-package-agreements --accept-source-agreements --disable-interactivity
1031
+ ;;
1032
+ choco)
1033
+ choco upgrade all -y
1034
+ ;;
1035
+ scoop)
1036
+ scoop update
1037
+ scoop update "*"
1038
+ ;;
827
1039
  snap)
828
1040
  run_as_root snap refresh
829
1041
  ;;
@@ -862,7 +1074,7 @@ run_fuzzy_selector() {
862
1074
  local header_line="$3"
863
1075
  local preview_cmd
864
1076
 
865
- preview_cmd='bash -c '\''mgr="$1"; pkg="$2"; case "$mgr" in apt) apt-cache show "$pkg" 2>/dev/null; printf "\n"; dpkg -L "$pkg" 2>/dev/null ;; dnf) dnf info "$pkg" 2>/dev/null; printf "\n"; rpm -ql "$pkg" 2>/dev/null ;; pacman) pacman -Si "$pkg" 2>/dev/null; printf "\n"; pacman -Fl "$pkg" 2>/dev/null | awk "{print \$2}" ;; zypper) zypper --non-interactive info "$pkg" 2>/dev/null ;; emerge) emerge --search --color=n "$pkg" 2>/dev/null ;; brew) brew info "$pkg" 2>/dev/null ;; snap) snap info "$pkg" 2>/dev/null ;; flatpak) flatpak info "$pkg" 2>/dev/null || flatpak remote-info flathub "$pkg" 2>/dev/null ;; npm) npm view "$pkg" 2>/dev/null ;; bun) bun info "$pkg" 2>/dev/null || npm view "$pkg" 2>/dev/null ;; esac'\'' _ {1} {2}'
1077
+ preview_cmd='bash -c '\''mgr="$1"; pkg="$2"; case "$mgr" in apt) apt-cache show "$pkg" 2>/dev/null; printf "\n"; dpkg -L "$pkg" 2>/dev/null ;; dnf) dnf info "$pkg" 2>/dev/null; printf "\n"; rpm -ql "$pkg" 2>/dev/null ;; pacman) pacman -Si "$pkg" 2>/dev/null; printf "\n"; pacman -Fl "$pkg" 2>/dev/null | awk "{print \$2}" ;; zypper) zypper --non-interactive info "$pkg" 2>/dev/null ;; emerge) emerge --search --color=n "$pkg" 2>/dev/null ;; brew) brew info "$pkg" 2>/dev/null ;; winget) winget show --id "$pkg" --exact --source winget --accept-source-agreements --disable-interactivity 2>/dev/null ;; choco) choco info "$pkg" 2>/dev/null ;; scoop) scoop info "$pkg" 2>/dev/null ;; snap) snap info "$pkg" 2>/dev/null ;; flatpak) flatpak info "$pkg" 2>/dev/null || flatpak remote-info flathub "$pkg" 2>/dev/null ;; npm) npm view "$pkg" 2>/dev/null ;; bun) bun info "$pkg" 2>/dev/null || npm view "$pkg" 2>/dev/null ;; esac'\'' _ {1} {2}'
866
1078
 
867
1079
  fzf -q "${query}" -e -m \
868
1080
  --delimiter=$'\t' \
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.1.0",
3
+ "version": "1.4.0",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"
@@ -19,11 +19,12 @@
19
19
  "pacman",
20
20
  "zypper",
21
21
  "brew",
22
+ "winget",
22
23
  "npm",
23
24
  "bun"
24
25
  ],
25
26
  "author": "Timmy6942025 <timothy.thomas2011@hotmail.com>",
26
- "license": "GPL-3.0-or-later",
27
+ "license": "Apache-2.0",
27
28
  "repository": {
28
29
  "type": "git",
29
30
  "url": "git+https://github.com/Timmy6942025/fpf-cli.git"