machineconfig 8.51__py3-none-any.whl → 8.61__py3-none-any.whl

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 (91) hide show
  1. machineconfig/jobs/installer/python_scripts/sysabc.py +13 -34
  2. machineconfig/profile/mapper_dotfiles.toml +3 -3
  3. machineconfig/scripts/python/devops.py +1 -1
  4. machineconfig/scripts/python/devops_navigator.py +1 -1
  5. machineconfig/scripts/python/helper_env/path_manager_tui.py +1 -1
  6. machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +1 -1
  7. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +1 -1
  8. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +8 -4
  9. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +33 -1
  10. machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
  11. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +4 -0
  12. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +90 -6
  13. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +3 -3
  14. machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +41 -15
  15. machineconfig/scripts/python/helpers/helpers_devops/cli_share_temp.py +69 -0
  16. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +4 -4
  17. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/__init__.py +0 -0
  18. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
  19. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
  20. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
  21. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
  22. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
  23. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
  24. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
  25. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
  26. machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +1 -6
  27. machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
  28. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
  29. machineconfig/scripts/python/helpers/helpers_network/{ssh_add_ssh_key.py → ssh/ssh_add_ssh_key.py} +21 -27
  30. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
  31. machineconfig/scripts/python/helpers/helpers_network/{ssh_debug_linux.py → ssh/ssh_debug_linux.py} +70 -51
  32. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
  33. machineconfig/scripts/python/helpers/helpers_network/{ssh_debug_windows.py → ssh/ssh_debug_windows.py} +12 -42
  34. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -0
  35. machineconfig/scripts/python/helpers/helpers_repos/cloud_repo_sync.py +2 -3
  36. machineconfig/scripts/python/helpers/{helpers_terminal/terminal_impl.py → helpers_sessions/attach_impl.py} +16 -25
  37. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +57 -129
  38. machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
  39. machineconfig/scripts/python/mcfg_entry.py +0 -7
  40. machineconfig/scripts/python/sessions.py +95 -14
  41. machineconfig/scripts/python/utils.py +3 -2
  42. machineconfig/settings/shells/bash/init.sh +0 -7
  43. machineconfig/settings/shells/pwsh/init.ps1 +2 -4
  44. machineconfig/settings/shells/wezterm/wezterm.lua +1 -0
  45. machineconfig/settings/shells/wt/settings.json +13 -19
  46. machineconfig/settings/shells/zsh/init.sh +0 -1
  47. machineconfig/settings/zellij/__init__.py +0 -0
  48. machineconfig/settings/zellij/config.kdl +0 -295
  49. machineconfig/settings/zellij/layouts/__init__.py +0 -0
  50. machineconfig/settings/zellij/layouts/st.kdl +0 -1
  51. machineconfig/settings/zellij/layouts/st2.kdl +6 -2
  52. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  53. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +10 -10
  54. machineconfig/utils/installer_utils/installer_cli.py +6 -2
  55. machineconfig/utils/installer_utils/installer_helper.py +50 -34
  56. machineconfig/utils/installer_utils/installer_locator_utils.py +3 -13
  57. machineconfig/utils/options_utils/tv_options.py +1 -1
  58. machineconfig/utils/procs.py +35 -27
  59. machineconfig/utils/schemas/layouts/layout_types.py +10 -0
  60. machineconfig/utils/source_of_truth.py +1 -0
  61. machineconfig/utils/ssh_utils/abc.py +1 -1
  62. {machineconfig-8.51.dist-info → machineconfig-8.61.dist-info}/METADATA +2 -3
  63. {machineconfig-8.51.dist-info → machineconfig-8.61.dist-info}/RECORD +68 -72
  64. {machineconfig-8.51.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
  65. machineconfig/jobs/scripts/bash_scripts/android.sh +0 -2
  66. machineconfig/jobs/scripts/bash_scripts/mount_drive +0 -128
  67. machineconfig/jobs/scripts/bash_scripts/mount_nfs +0 -49
  68. machineconfig/jobs/scripts/bash_scripts/mount_nw_drive +0 -61
  69. machineconfig/jobs/scripts/bash_scripts/mount_smb +0 -3
  70. machineconfig/jobs/scripts/bash_scripts/share_cloud.sh +0 -64
  71. machineconfig/jobs/scripts/bash_scripts/share_nfs +0 -49
  72. machineconfig/jobs/scripts/bash_scripts/start_docker +0 -23
  73. machineconfig/jobs/scripts/powershell_scripts/Restore-ThunderbirdProfile.ps1 +0 -92
  74. machineconfig/jobs/scripts/powershell_scripts/docker.ps1 +0 -7
  75. machineconfig/jobs/scripts/powershell_scripts/mount_nfs.ps1 +0 -42
  76. machineconfig/jobs/scripts/powershell_scripts/mount_nw.ps1 +0 -9
  77. machineconfig/jobs/scripts/powershell_scripts/mount_smb.ps1 +0 -2
  78. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +0 -13
  79. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +0 -4
  80. machineconfig/jobs/scripts/powershell_scripts/power_options.ps1 +0 -7
  81. machineconfig/jobs/scripts/powershell_scripts/share_cloud.cmd +0 -34
  82. machineconfig/jobs/scripts/powershell_scripts/share_smb.ps1 +0 -16
  83. machineconfig/scripts/python/helpers/helpers_network/mount_nfs.py +0 -85
  84. machineconfig/scripts/python/helpers/helpers_network/mount_nw_drive.py +0 -48
  85. machineconfig/scripts/python/helpers/helpers_network/mount_ssh.py +0 -64
  86. machineconfig/scripts/python/terminal.py +0 -58
  87. machineconfig/settings/zellij/config.orig.kdl +0 -295
  88. /machineconfig/{scripts/python/helpers/helpers_terminal → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
  89. /machineconfig/scripts/python/helpers/helpers_network/{ssh_add_identity.py → ssh/ssh_add_identity.py} +0 -0
  90. {machineconfig-8.51.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
  91. {machineconfig-8.51.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
@@ -1,295 +0,0 @@
1
- // If you'd like to override the default keybindings completely, be sure to change "keybinds" to "keybinds clear-defaults=true"
2
- keybinds {
3
- normal {
4
- // uncomment this and adjust key if using copy_on_select=false
5
- // bind "Alt c" { Copy; }
6
- }
7
- locked {
8
- bind "Ctrl g" { SwitchToMode "Normal"; }
9
- }
10
- resize {
11
- bind "Ctrl n" { SwitchToMode "Normal"; }
12
- bind "h" "Left" { Resize "Left"; }
13
- bind "j" "Down" { Resize "Down"; }
14
- bind "k" "Up" { Resize "Up"; }
15
- bind "l" "Right" { Resize "Right"; }
16
- bind "=" "+" { Resize "Increase"; }
17
- bind "-" { Resize "Decrease"; }
18
- }
19
- pane {
20
- bind "Ctrl p" { SwitchToMode "Normal"; }
21
- bind "h" "Left" { MoveFocus "Left"; }
22
- bind "l" "Right" { MoveFocus "Right"; }
23
- bind "j" "Down" { MoveFocus "Down"; }
24
- bind "k" "Up" { MoveFocus "Up"; }
25
- bind "p" { SwitchFocus; }
26
- bind "n" { NewPane; SwitchToMode "Normal"; }
27
- bind "d" { NewPane "Down"; SwitchToMode "Normal"; }
28
- bind "r" { NewPane "Right"; SwitchToMode "Normal"; }
29
- bind "x" { CloseFocus; SwitchToMode "Normal"; }
30
- bind "f" { ToggleFocusFullscreen; SwitchToMode "Normal"; }
31
- bind "z" { TogglePaneFrames; SwitchToMode "Normal"; }
32
- bind "w" { ToggleFloatingPanes; SwitchToMode "Normal"; }
33
- bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Normal"; }
34
- bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;}
35
- }
36
- move {
37
- bind "Ctrl h" { SwitchToMode "Normal"; }
38
- bind "n" "Tab" { MovePane; }
39
- bind "h" "Left" { MovePane "Left"; }
40
- bind "j" "Down" { MovePane "Down"; }
41
- bind "k" "Up" { MovePane "Up"; }
42
- bind "l" "Right" { MovePane "Right"; }
43
- }
44
- tab {
45
- bind "Ctrl t" { SwitchToMode "Normal"; }
46
- bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; }
47
- bind "h" "Left" "Up" "k" { GoToPreviousTab; }
48
- bind "l" "Right" "Down" "j" { GoToNextTab; }
49
- bind "n" { NewTab; SwitchToMode "Normal"; }
50
- bind "x" { CloseTab; SwitchToMode "Normal"; }
51
- bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; }
52
- bind "1" { GoToTab 1; SwitchToMode "Normal"; }
53
- bind "2" { GoToTab 2; SwitchToMode "Normal"; }
54
- bind "3" { GoToTab 3; SwitchToMode "Normal"; }
55
- bind "4" { GoToTab 4; SwitchToMode "Normal"; }
56
- bind "5" { GoToTab 5; SwitchToMode "Normal"; }
57
- bind "6" { GoToTab 6; SwitchToMode "Normal"; }
58
- bind "7" { GoToTab 7; SwitchToMode "Normal"; }
59
- bind "8" { GoToTab 8; SwitchToMode "Normal"; }
60
- bind "9" { GoToTab 9; SwitchToMode "Normal"; }
61
- bind "Tab" { ToggleTab; }
62
- }
63
- scroll {
64
- bind "Ctrl s" { SwitchToMode "Normal"; }
65
- bind "e" { EditScrollback; SwitchToMode "Normal"; }
66
- bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; }
67
- bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; }
68
- bind "j" "Down" { ScrollDown; }
69
- bind "k" "Up" { ScrollUp; }
70
- bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; }
71
- bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; }
72
- bind "d" { HalfPageScrollDown; }
73
- bind "u" { HalfPageScrollUp; }
74
- // uncomment this and adjust key if using copy_on_select=false
75
- // bind "Alt c" { Copy; }
76
- }
77
- search {
78
- bind "Ctrl s" { SwitchToMode "Normal"; }
79
- bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; }
80
- bind "j" "Down" { ScrollDown; }
81
- bind "k" "Up" { ScrollUp; }
82
- bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; }
83
- bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; }
84
- bind "d" { HalfPageScrollDown; }
85
- bind "u" { HalfPageScrollUp; }
86
- bind "n" { Search "down"; }
87
- bind "p" { Search "up"; }
88
- bind "c" { SearchToggleOption "CaseSensitivity"; }
89
- bind "w" { SearchToggleOption "Wrap"; }
90
- bind "o" { SearchToggleOption "WholeWord"; }
91
- }
92
- entersearch {
93
- bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; }
94
- bind "Enter" { SwitchToMode "Search"; }
95
- }
96
- renametab {
97
- bind "Ctrl c" { SwitchToMode "Normal"; }
98
- bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; }
99
- }
100
- renamepane {
101
- bind "Ctrl c" { SwitchToMode "Normal"; }
102
- bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; }
103
- }
104
- session {
105
- bind "Ctrl o" { SwitchToMode "Normal"; }
106
- bind "Ctrl s" { SwitchToMode "Scroll"; }
107
- bind "d" { Detach; }
108
- }
109
- tmux {
110
- bind "[" { SwitchToMode "Scroll"; }
111
- bind "Ctrl b" { Write 2; SwitchToMode "Normal"; }
112
- bind "\"" { NewPane "Down"; SwitchToMode "Normal"; }
113
- bind "%" { NewPane "Right"; SwitchToMode "Normal"; }
114
- bind "z" { ToggleFocusFullscreen; SwitchToMode "Normal"; }
115
- bind "c" { NewTab; SwitchToMode "Normal"; }
116
- bind "," { SwitchToMode "RenameTab"; }
117
- bind "p" { GoToPreviousTab; SwitchToMode "Normal"; }
118
- bind "n" { GoToNextTab; SwitchToMode "Normal"; }
119
- bind "Left" { MoveFocus "Left"; SwitchToMode "Normal"; }
120
- bind "Right" { MoveFocus "Right"; SwitchToMode "Normal"; }
121
- bind "Down" { MoveFocus "Down"; SwitchToMode "Normal"; }
122
- bind "Up" { MoveFocus "Up"; SwitchToMode "Normal"; }
123
- bind "h" { MoveFocus "Left"; SwitchToMode "Normal"; }
124
- bind "l" { MoveFocus "Right"; SwitchToMode "Normal"; }
125
- bind "j" { MoveFocus "Down"; SwitchToMode "Normal"; }
126
- bind "k" { MoveFocus "Up"; SwitchToMode "Normal"; }
127
- bind "o" { FocusNextPane; }
128
- bind "d" { Detach; }
129
- }
130
- shared_except "locked" {
131
- bind "Ctrl g" { SwitchToMode "Locked"; }
132
- bind "Ctrl q" { Quit; }
133
- bind "Alt n" { NewPane; }
134
- bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; }
135
- bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; }
136
- bind "Alt j" "Alt Down" { MoveFocus "Down"; }
137
- bind "Alt k" "Alt Up" { MoveFocus "Up"; }
138
- bind "Alt =" "Alt +" { Resize "Increase"; }
139
- bind "Alt -" { Resize "Decrease"; }
140
- }
141
- shared_except "normal" "locked" {
142
- bind "Enter" "Esc" { SwitchToMode "Normal"; }
143
- }
144
- shared_except "pane" "locked" {
145
- bind "Ctrl p" { SwitchToMode "Pane"; }
146
- }
147
- shared_except "resize" "locked" {
148
- bind "Ctrl n" { SwitchToMode "Resize"; }
149
- }
150
- shared_except "scroll" "locked" {
151
- bind "Ctrl s" { SwitchToMode "Scroll"; }
152
- }
153
- shared_except "session" "locked" {
154
- bind "Ctrl o" { SwitchToMode "Session"; }
155
- }
156
- shared_except "tab" "locked" {
157
- bind "Ctrl t" { SwitchToMode "Tab"; }
158
- }
159
- shared_except "move" "locked" {
160
- bind "Ctrl h" { SwitchToMode "Move"; }
161
- }
162
- shared_except "tmux" "locked" {
163
- bind "Ctrl b" { SwitchToMode "Tmux"; }
164
- }
165
- }
166
-
167
- plugins {
168
- tab-bar { path "tab-bar"; }
169
- status-bar { path "status-bar"; }
170
- strider { path "strider"; }
171
- compact-bar { path "compact-bar"; }
172
- }
173
-
174
- // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP
175
- // eg. when terminal window with an active zellij session is closed
176
- // Options:
177
- // - detach (Default)
178
- // - quit
179
- //
180
- // on_force_close "quit"
181
-
182
- // Send a request for a simplified ui (without arrow fonts) to plugins
183
- // Options:
184
- // - true
185
- // - false (Default)
186
- //
187
- simplified_ui false
188
-
189
- // Choose the path to the default shell that zellij will use for opening new panes
190
- // Default: $SHELL
191
- //
192
- // default_shell "fish"
193
-
194
- // Toggle between having pane frames around the panes
195
- // Options:
196
- // - true (default)
197
- // - false
198
- //
199
- pane_frames false
200
-
201
- // Define color themes for Zellij
202
- // For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes
203
- // Once these themes are defined, one of them should to be selected in the "theme" section of this file
204
- //
205
- // themes {
206
- // dracula {
207
- // fg 248 248 242
208
- // bg 40 42 54
209
- // red 255 85 85
210
- // green 80 250 123
211
- // yellow 241 250 140
212
- // blue 98 114 164
213
- // magenta 255 121 198
214
- // orange 255 184 108
215
- // cyan 139 233 253
216
- // black 0 0 0
217
- // white 255 255 255
218
- // }
219
- // }
220
-
221
- // Choose the theme that is specified in the themes section.
222
- // Default: default
223
- //
224
- // theme "default"
225
-
226
- // The name of the default layout to load on startup
227
- // Default: "default"
228
- //
229
- default_layout "default"
230
-
231
- // Choose the mode that zellij uses when starting up.
232
- // Default: normal
233
- //
234
- // default_mode "locked"
235
-
236
- // Toggle enabling the mouse mode.
237
- // On certain configurations, or terminals this could
238
- // potentially interfere with copying text.
239
- // Options:
240
- // - true (default)
241
- // - false
242
- //
243
- mouse_mode true
244
-
245
- // Configure the scroll back buffer size
246
- // This is the number of lines zellij stores for each pane in the scroll back
247
- // buffer. Excess number of lines are discarded in a FIFO fashion.
248
- // Valid values: positive integers
249
- // Default value: 10000
250
- //
251
- // scroll_buffer_size 10000
252
-
253
- // Provide a command to execute when copying text. The text will be piped to
254
- // the stdin of the program to perform the copy. This can be used with
255
- // terminal emulators which do not support the OSC 52 ANSI control sequence
256
- // that will be used by default if this option is not set.
257
- // Examples:
258
- //
259
- // copy_command "xclip -selection clipboard" // x11
260
- // copy_command "wl-copy" // wayland
261
- // copy_command "pbcopy" // osx
262
-
263
- // Choose the destination for copied text
264
- // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard.
265
- // Does not apply when using copy_command.
266
- // Options:
267
- // - system (default)
268
- // - primary
269
- //
270
- copy_clipboard "primary"
271
-
272
- // Enable or disable automatic copy (and clear) of selection when releasing mouse
273
- // Default: true
274
- //
275
- copy_on_select true
276
-
277
- // Path to the default editor to use to edit pane scrollbuffer
278
- // Default: $EDITOR or $VISUAL
279
- //
280
- // scrollback_editor "/usr/bin/vim"
281
-
282
- // When attaching to an existing session with other users,
283
- // should the session be mirrored (true)
284
- // or should each user have their own cursor (false)
285
- // Default: false
286
- //
287
- mirror_session false
288
-
289
- // The folder in which Zellij will look for layouts
290
- //
291
- // layout_dir "/path/to/my/layout_dir"
292
-
293
- // The folder in which Zellij will look for themes
294
- //
295
- // theme_dir "/path/to/my/theme_dir"
File without changes
@@ -7,7 +7,6 @@ layout {
7
7
  }
8
8
  children
9
9
  }
10
-
11
10
  tab name="📂" focus=false {
12
11
  pane name="yPane" {
13
12
  command "y"
@@ -6,6 +6,10 @@ layout {
6
6
  plugin location="zellij:compact-bar"
7
7
  }
8
8
  children
9
+ pane size=2 borderless=true {
10
+ plugin location="zellij:status-bar"
11
+ }
12
+
9
13
  }
10
14
 
11
15
  tab name="🧑‍💻" {
@@ -39,11 +43,11 @@ layout {
39
43
  }
40
44
  pane name="bottomMiddle" size="70%" {
41
45
  pane name="bottomMiddle1" size="30%" {
42
- command "y"
46
+ command "yazi"
43
47
  }
44
48
  pane name="bottomMiddle2" size="70%" {
45
49
  command "timeout"
46
- args "3s" "cmatrix"
50
+ args "3s" "rusty-rain"
47
51
  close_on_exit true
48
52
  }
49
53
  }
@@ -2,16 +2,16 @@
2
2
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/uv.sh")
3
3
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/scripts/linux/wrap_mcfg")
4
4
 
5
- alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" devops'
6
- alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" cloud'
7
- alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" agents'
8
- alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" sessions'
9
- alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" ftpx'
10
- alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" fire'
11
- alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" croshell'
12
- alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" utils'
13
- alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" terminal'
14
- alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.51" msearch'
5
+ alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" devops'
6
+ alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" cloud'
7
+ alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" agents'
8
+ alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" sessions'
9
+ alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" ftpx'
10
+ alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" fire'
11
+ alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" croshell'
12
+ alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" utils'
13
+ alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" terminal'
14
+ alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.61" msearch'
15
15
 
16
16
  alias d='wrap_in_shell_script devops'
17
17
  alias c='wrap_in_shell_script cloud'
@@ -4,16 +4,16 @@
4
4
  irm "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1" | iex
5
5
  irm "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/scripts/windows/wrap_mcfg.ps1" | iex
6
6
 
7
- function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" devops $args }
8
- function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" cloud $args }
9
- function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" agents $args }
10
- function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" sessions $args }
11
- function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" ftpx $args }
12
- function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" fire $args }
13
- function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" croshell $args }
14
- function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" utils $args }
15
- function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" terminal $args }
16
- function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.51" msearch $args }
7
+ function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" devops $args }
8
+ function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" cloud $args }
9
+ function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" agents $args }
10
+ function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" sessions $args }
11
+ function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" ftpx $args }
12
+ function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" fire $args }
13
+ function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" croshell $args }
14
+ function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" utils $args }
15
+ function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" terminal $args }
16
+ function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.61" msearch $args }
17
17
 
18
18
  function d { wrap_in_shell_script devops @args }
19
19
  function c { wrap_in_shell_script cloud @args }
@@ -121,6 +121,7 @@ def install_clis(clis_names: list[str]):
121
121
  from machineconfig.utils.installer_utils.install_from_url import install_from_binary_url
122
122
  install_from_binary_url(binary_url=a_cli_name)
123
123
  continue
124
+
124
125
  selected_installer = None
125
126
  for installer in all_installers_data:
126
127
  app_name = installer["appName"]
@@ -129,8 +130,11 @@ def install_clis(clis_names: list[str]):
129
130
  break
130
131
  if selected_installer is None:
131
132
  from machineconfig.utils.installer_utils.installer_helper import handle_installer_not_found
132
- handle_installer_not_found(a_cli_name, all_installers_data)
133
- return None
133
+ clis_names_chosen_interactively = handle_installer_not_found(a_cli_name, all_installers_data)
134
+ if len(clis_names_chosen_interactively) == 0:
135
+ continue
136
+ _ = install_clis(clis_names=clis_names_chosen_interactively)
137
+ continue
134
138
  message = Installer(selected_installer).install_robust(version=None) # finish the task
135
139
  total_messages.append(message)
136
140
  if total_messages:
@@ -14,12 +14,9 @@ def get_group_name_to_repr() -> dict[str, str]:
14
14
  return category_display_to_name
15
15
 
16
16
 
17
- def handle_installer_not_found(search_term: str, app_apps: list[InstallerData]) -> None: # type: ignore
17
+ def handle_installer_not_found(search_term: str, app_apps: list[InstallerData]) -> list[str]:
18
18
  """Handle installer not found with friendly suggestions using fuzzy matching."""
19
19
  from difflib import get_close_matches
20
- from rich.console import Console
21
- from rich.panel import Panel
22
- from rich.table import Table
23
20
  all_names = sorted([inst["appName"] for inst in app_apps])
24
21
  name_to_doc = {inst["appName"]: inst["doc"] for inst in app_apps}
25
22
  all_descriptions = {f"{inst['appName']}: {inst['doc']}": inst["appName"] for inst in app_apps}
@@ -41,38 +38,57 @@ def handle_installer_not_found(search_term: str, app_apps: list[InstallerData])
41
38
  + substring_matches
42
39
  )
43
40
  )
44
- top_matches = ordered_matches[:10]
45
- console = Console()
46
41
 
47
- console.print(f"\n❌ '[red]{search_term}[/red]' was not found.", style="bold")
48
- if top_matches:
49
- console.print("🤔 Did you mean one of these?", style="yellow")
50
- table = Table(show_header=True, header_style="bold", box=None, pad_edge=False)
51
- table.add_column("#", justify="right", width=3)
52
- table.add_column("Installer", style="green")
53
- table.add_column("Description", style="dim", overflow="fold")
54
- for i, match in enumerate(top_matches, 1):
55
- table.add_row(f"[cyan]{i}[/cyan]", match, name_to_doc.get(match, ""))
56
- console.print(table)
57
- else:
58
- console.print("📋 Here are some available options:", style="blue")
59
- # Show first 10 installers as examples
60
- if len(all_names) > 10:
61
- sample_names = all_names[:10]
62
- else:
63
- sample_names = all_names
64
- table = Table(show_header=True, header_style="bold", box=None, pad_edge=False)
65
- table.add_column("#", justify="right", width=3)
66
- table.add_column("Installer", style="green")
67
- table.add_column("Description", style="dim", overflow="fold")
68
- for i, name in enumerate(sample_names, 1):
69
- table.add_row(f"[cyan]{i}[/cyan]", name, name_to_doc.get(name, ""))
70
- console.print(table)
71
- if len(all_names) > 10:
72
- console.print(f" [dim]... and {len(all_names) - 10} more[/dim]")
42
+ order_matches_with_docs = [f"{app_name:<20} : " + name_to_doc.get(app_name, "") for app_name in ordered_matches]
43
+ from machineconfig.utils.options import choose_from_options
44
+
45
+ try:
46
+ chosen = choose_from_options(
47
+ options=order_matches_with_docs,
48
+ msg=f"🔍 No installer found for '[red]{search_term}[/red]'. Did you mean one of these?",
49
+ multi=True,
50
+ tv=True
51
+ )
52
+ except KeyboardInterrupt:
53
+ print("\n❌ Selection cancelled by user.")
54
+ return []
55
+ apps_chosen = [app.split(" : ")[0].strip() for app in chosen]
56
+ print(f"➡️ You selected: {apps_chosen}")
57
+ return apps_chosen
58
+ # top_matches = ordered_matches[:10] if len(ordered_matches) > 10 else ordered_matches
59
+ # from rich.console import Console
60
+ # from rich.panel import Panel
61
+ # from rich.table import Table
62
+ # console = Console()
63
+ # console.print(f"\n❌ '[red]{search_term}[/red]' was not found.", style="bold")
64
+ # if top_matches:
65
+ # console.print("🤔 Did you mean one of these?", style="yellow")
66
+ # table = Table(show_header=True, header_style="bold", box=None, pad_edge=False)
67
+ # table.add_column("#", justify="right", width=3)
68
+ # table.add_column("Installer", style="green")
69
+ # table.add_column("Description", style="dim", overflow="fold")
70
+ # for i, match in enumerate(top_matches, 1):
71
+ # table.add_row(f"[cyan]{i}[/cyan]", match, name_to_doc.get(match, ""))
72
+ # console.print(table)
73
+ # else:
74
+ # console.print("📋 Here are some available options:", style="blue")
75
+ # # Show first 10 installers as examples
76
+ # if len(all_names) > 10:
77
+ # sample_names = all_names[:10]
78
+ # else:
79
+ # sample_names = all_names
80
+ # table = Table(show_header=True, header_style="bold", box=None, pad_edge=False)
81
+ # table.add_column("#", justify="right", width=3)
82
+ # table.add_column("Installer", style="green")
83
+ # table.add_column("Description", style="dim", overflow="fold")
84
+ # for i, name in enumerate(sample_names, 1):
85
+ # table.add_row(f"[cyan]{i}[/cyan]", name, name_to_doc.get(name, ""))
86
+ # console.print(table)
87
+ # if len(all_names) > 10:
88
+ # console.print(f" [dim]... and {len(all_names) - 10} more[/dim]")
73
89
 
74
- panel = Panel(f"[bold blue]💡 Use 'ia' to interactively browse all available installers.[/bold blue]\n[bold blue]💡 Use one of the categories: {list(PACKAGE_GROUP2NAMES.keys())}[/bold blue]", title="[yellow]Helpful Tips[/yellow]", border_style="yellow")
75
- console.print(panel)
90
+ # panel = Panel(f"[bold blue]💡 Use 'ia' to interactively browse all available installers.[/bold blue]\n[bold blue]💡 Use one of the categories: {list(PACKAGE_GROUP2NAMES.keys())}[/bold blue]", title="[yellow]Helpful Tips[/yellow]", border_style="yellow")
91
+ # console.print(panel)
76
92
 
77
93
 
78
94
  def install_deb_package(downloaded: Path) -> None:
@@ -144,20 +144,10 @@ def check_tool_exists(tool_name: str) -> bool:
144
144
  standard_checks = [
145
145
  Path("/usr/local/bin").joinpath(tool_name).is_file(),
146
146
  Path("/usr/bin").joinpath(tool_name).is_file(),
147
- root_path.joinpath(tool_name).is_file()
147
+ root_path.joinpath(tool_name).is_file(),
148
+ (Path.home() / ".bun" / "bin" / tool_name ).is_file(),
148
149
  ]
149
- if any(standard_checks):
150
- return True
151
- # Check for npm packages via nvm
152
- npm_check = False
153
- try:
154
- result = subprocess.run(["node", "--version"], capture_output=True, text=True, check=True)
155
- version = result.stdout.strip().lstrip('v')
156
- nvm_bin_path = Path.home() / ".nvm" / "versions" / "node" / f"v{version}" / "bin" / tool_name
157
- npm_check = nvm_bin_path.is_file()
158
- except (subprocess.CalledProcessError, FileNotFoundError):
159
- pass
160
- return npm_check
150
+ return any(standard_checks)
161
151
  else:
162
152
  raise NotImplementedError(f"platform {platform.system()} not implemented")
163
153
 
@@ -15,7 +15,7 @@ def choose_from_dict_with_preview(options_to_preview_mapping: dict[str, Any], ex
15
15
  return select_from_options(options_to_preview_mapping, extension=extension, multi=multi, preview_size_percent=preview_size_percent)
16
16
  else:
17
17
  from machineconfig.utils.options_utils.options_tv_linux import select_from_options
18
- return select_from_options(options_to_preview_mapping, extension=extension, multi=multi, preview_size_percent=preview_size_percent)
18
+ return select_from_options(options_to_preview_mapping= options_to_preview_mapping, extension=extension, multi=multi, preview_size_percent=preview_size_percent)
19
19
 
20
20
 
21
21
  if __name__ == "__main__":