machineconfig 7.59__py3-none-any.whl → 7.60__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.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

@@ -4,7 +4,7 @@ from typing import Optional, Literal
4
4
  from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
5
5
  from pathlib import Path
6
6
 
7
- def get_fire_tab_using_uv(func: FunctionType, import_module: bool, uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> tuple[TabConfig, Path]:
7
+ def get_fire_tab_using_uv(func: FunctionType, tab_weight: int, import_module: bool, uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> tuple[TabConfig, Path]:
8
8
  from machineconfig.utils.meta import lambda_to_python_script
9
9
  py_script = lambda_to_python_script(lmb=lambda: func, in_global=True, import_module=import_module)
10
10
  from machineconfig.utils.code import get_uv_command_executing_python_script
@@ -12,7 +12,8 @@ def get_fire_tab_using_uv(func: FunctionType, import_module: bool, uv_with: Opti
12
12
  tab_config: TabConfig = {
13
13
  "command": command_to_run,
14
14
  "startDir": "$HOME",
15
- "tabName": func.__name__
15
+ "tabName": func.__name__,
16
+ "tabWeight": tab_weight
16
17
  }
17
18
  return tab_config, py_script_path
18
19
  def get_fire_tab_using_fire(func: FunctionType):
@@ -38,12 +39,13 @@ def get_fire_tab_using_fire(func: FunctionType):
38
39
 
39
40
 
40
41
 
41
- def make_layout_from_functions(functions: list[FunctionType], import_module: bool, tab_configs: list[TabConfig], layout_name: str, method: Literal["script", "fire"]="fire") -> LayoutConfig:
42
+ def make_layout_from_functions(functions: list[FunctionType], functions_weights: Optional[list[int]], import_module: bool, tab_configs: list[TabConfig],
43
+ layout_name: str, method: Literal["script", "fire"]="fire") -> LayoutConfig:
42
44
  tabs2artifacts: list[tuple[TabConfig, list[Path]]] = []
43
- for a_func in functions:
45
+ for a_func, tab_weight in zip(functions, functions_weights or [1]*len(functions)):
44
46
  match method:
45
47
  case "script":
46
- tab_config, artifact_files_1 = get_fire_tab_using_uv(a_func, import_module=import_module, uv_with=None, uv_project_dir=None)
48
+ tab_config, artifact_files_1 = get_fire_tab_using_uv(a_func, tab_weight=tab_weight, import_module=import_module, uv_with=None, uv_project_dir=None)
47
49
  artifact_files = [artifact_files_1]
48
50
  case "fire":
49
51
  tab_config = get_fire_tab_using_fire(a_func)
@@ -49,14 +49,14 @@ echo "✅ Essential tools installation complete."
49
49
  """
50
50
 
51
51
  bash = r"""
52
- echo "🔄 Updating apt package lists..."
53
- echo "📥 Installing nala package manager..."
54
- echo "📥 Installing essential network tools..."
55
- echo "📥 Installing Node Version Manager (NVM)..."
56
52
  sudo apt update -y || true
57
53
  sudo apt install nala -y || true
58
54
  sudo nala install curl wget gpg lsb-release apt-transport-https -y || true
59
55
  sudo nala install git net-tools htop nano -y || true
56
+ sudo nala install build-essential python3-dev -y || true # C build toolchain: Where build-essential brings gcc, make, etc., and python3-dev ensures headers for your Python version.
57
+ # sudo nala install libssl-dev -y
58
+ # sudo nala install libaa-bin -y
59
+
60
60
  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
61
61
  echo "🔧 Configuring NVM environment..."
62
62
  export NVM_DIR="$HOME/.nvm"
@@ -64,18 +64,19 @@ export NVM_DIR="$HOME/.nvm"
64
64
  echo "📥 Installing latest Node.js..."
65
65
  nvm install node || true
66
66
 
67
+ sudo nala install samba
68
+ sudo nala install fuse3 -y || true
69
+ sudo nala install nfs-common -y || true
70
+
67
71
  # echo 'keyboard-configuration keyboard-configuration/layout select US English' | sudo debconf-set-selections
68
72
  # echo 'keyboard-configuration keyboard-configuration/layoutcode string us' | sudo debconf-set-selections
69
73
  # sudo DEBIAN_FRONTEND=noninteractive nala install -y cmatrix
70
74
  # sudo nala install hollywood -y || true
71
- sudo nala install samba
72
- sudo nala install fuse3 -y || true
73
- sudo nala install nfs-common -y || true
75
+
74
76
  # sudo nala install ffmpeg -y || true # Required by some dev tools
75
77
  # sudo nala install make -y || true # Required by LunarVim and SpaceVim
76
78
  # (curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh) || true
77
- # sudo nala install libssl-dev -y
78
- # sudo nala install libaa-bin -y
79
+
79
80
  """
80
81
 
81
82
 
@@ -107,7 +107,7 @@ def croshell(
107
107
  fire_line = f"uv run --python 3.14 --with visidata,pyarrow vd {str(file_obj)}"
108
108
  elif marimo:
109
109
  if Path.home().joinpath("code/machineconfig").exists(): requirements = f"""--with marimo --project "{str(Path.home().joinpath("code/machineconfig"))}" """
110
- else: requirements = """--python 3.14 --with "marimo,cowsay,machineconfig[plot]>=7.59" """
110
+ else: requirements = """--python 3.14 --with "marimo,cowsay,machineconfig[plot]>=7.60" """
111
111
  fire_line = f"""
112
112
  cd {str(pyfile.parent)}
113
113
  uv run --python 3.14 --with "marimo" marimo convert {pyfile.name} -o marimo_nb.py
@@ -115,14 +115,14 @@ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
115
115
  """
116
116
  elif jupyter:
117
117
  if Path.home().joinpath("code/machineconfig").exists(): requirements = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with jupyterlab """
118
- else: requirements = """--with "cowsay,machineconfig[plot]>=7.59" """
118
+ else: requirements = """--with "cowsay,machineconfig[plot]>=7.60" """
119
119
  fire_line = f"uv run {requirements} jupyter-lab {str(nb_target)}"
120
120
  elif vscode:
121
121
  fire_line = f"""
122
122
  cd {str(pyfile.parent)}
123
123
  uv init --python 3.14
124
124
  uv venv
125
- uv add "cowsay,machineconfig[plot]>=7.59"
125
+ uv add "cowsay,machineconfig[plot]>=7.60"
126
126
  # code serve-web
127
127
  code --new-window {str(pyfile)}
128
128
  """
@@ -130,7 +130,7 @@ code --new-window {str(pyfile)}
130
130
  if interpreter == "ipython": profile = f" --profile {ipython_profile} --no-banner"
131
131
  else: profile = ""
132
132
  if Path.home().joinpath("code/machineconfig").exists(): ve_line = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" """
133
- else: ve_line = """--python 3.14 --with "cowsay,machineconfig[plot]>=7.59" """
133
+ else: ve_line = """--python 3.14 --with "cowsay,machineconfig[plot]>=7.60" """
134
134
  # ve_path_maybe, ipython_profile_maybe = get_ve_path_and_ipython_profile(Path.cwd())
135
135
  # --python 3.14
136
136
  fire_line = f"uv run {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
@@ -12,7 +12,7 @@ import machineconfig.scripts.python.helpers_devops.cli_nw as cli_network
12
12
 
13
13
  def install(which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program names to install, or group name if --group flag is set.")] = None,
14
14
  group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
15
- interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Interactive selection of programs to install.")] = False,
15
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of programs to install.")] = False,
16
16
  ) -> None:
17
17
  """📦 Install packages"""
18
18
  import machineconfig.utils.installer_utils.installer_cli as installer_entry_point
@@ -22,7 +22,6 @@ def install(which: Annotated[Optional[str], typer.Argument(..., help="Comma-sepa
22
22
  def get_app():
23
23
  app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_help_option=False,
24
24
  add_completion=False)
25
- _ = install
26
25
  app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
27
26
  app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
28
27
  app_repos = cli_repos.get_app()
@@ -2,7 +2,7 @@
2
2
  # /// script
3
3
  # requires-python = ">=3.13"
4
4
  # dependencies = [
5
- # "machineconfig>=7.59",
5
+ # "machineconfig>=7.60",
6
6
  # "textual",
7
7
  # "pyperclip",
8
8
  # ]
@@ -52,9 +52,9 @@ def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-n
52
52
  else:
53
53
  import platform
54
54
  if platform.system() == "Windows":
55
- run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=7.59" """)
55
+ run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=7.60" """)
56
56
  else:
57
- run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=7.59" """)
57
+ run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=7.60" """)
58
58
  from machineconfig.profile.create_shell_profile import create_default_shell_profile
59
59
  if not no_copy_assets:
60
60
  create_default_shell_profile() # involves copying assets too
@@ -79,7 +79,7 @@ def navigate():
79
79
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
80
80
  from machineconfig.utils.code import run_shell_script
81
81
  if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
82
- else: executable = """--with "machineconfig>=7.59,textual" """
82
+ else: executable = """--with "machineconfig>=7.60,textual" """
83
83
  run_shell_script(f"""uv run {executable} {path}""")
84
84
 
85
85
 
@@ -105,7 +105,7 @@ git pull originEnc master
105
105
  uv_project_dir = f"""{str(Path.home().joinpath("code/machineconfig"))}"""
106
106
  uv_with = None
107
107
  else:
108
- uv_with = ["machineconfig>=7.59"]
108
+ uv_with = ["machineconfig>=7.60"]
109
109
  uv_project_dir = None
110
110
 
111
111
  import tempfile
@@ -8,7 +8,7 @@ def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help=
8
8
  from pathlib import Path
9
9
  count_lines_path = Path(count_lines.__file__)
10
10
  # --project $HOME/code/ machineconfig --group plot
11
- cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=7.59" {count_lines_path} analyze-over-time {repo_path}"""
11
+ cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=7.60" {count_lines_path} analyze-over-time {repo_path}"""
12
12
  from machineconfig.utils.code import run_shell_script
13
13
  run_shell_script(cmd)
14
14
 
@@ -17,7 +17,7 @@ def path():
17
17
  uv_with = ["textual"]
18
18
  uv_project_dir = None
19
19
  if not Path.home().joinpath("code/machineconfig").exists():
20
- uv_with.append("machineconfig>=7.59")
20
+ uv_with.append("machineconfig>=7.60")
21
21
  else:
22
22
  uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
23
23
  run_shell_script(get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0])
@@ -69,14 +69,14 @@ def find_layout_file(layout_path: str, ) -> Path:
69
69
 
70
70
  def run(ctx: typer.Context,
71
71
  layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
72
- max_tabs: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
73
- max_layouts: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
74
- sleep_inbetween: Annotated[float, typer.Option(..., help="Sleep time in seconds between launching layouts")] = 1.0,
72
+ max_tabs: Annotated[int, typer.Option(..., "--max-tabs", "-mt", help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
73
+ max_layouts: Annotated[int, typer.Option(..., "--max-layouts", "-ml", help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
74
+ sleep_inbetween: Annotated[float, typer.Option(..., "--sleep-inbetween", "-si", help="Sleep time in seconds between launching layouts")] = 1.0,
75
75
  monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
76
76
  parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
77
77
  kill_upon_completion: Annotated[bool, typer.Option(..., "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)")] = False,
78
78
  choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
79
- choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-ia", help="Select layouts interactively")] = False
79
+ choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-i", help="Select layouts interactively")] = False
80
80
  ):
81
81
  """
82
82
  Launch terminal sessions based on a layout configuration file.
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=7.59" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=7.60" python -m machineconfig.scripts.python.mount_ssh
11
11
 
12
12
  net use T: \\sshfs.kr\$user@$host.local
13
13
  # this worked: net use T: \\sshfs\alex@alex-p51s-5.local
@@ -72,15 +72,9 @@ alias x='. $CONFIG_ROOT/scripts/wrap_mcfg explore'
72
72
  # gh copilot explain "Input command is: $x The output is this: $y"
73
73
  # }
74
74
 
75
- # 📦 Node Version Manager
76
- # export NVM_DIR="$HOME/.nvm"
77
- # [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
78
- # [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
79
-
80
75
 
81
76
  # https://github.com/atuinsh/atuin
82
77
  # eval "$(atuin init bash)"
83
-
84
78
  # source /home/alex/.config/broot/launcher/bash/br
85
79
  # eval "$(thefuck --alias)"
86
80
  # from https://github.com/ajeetdsouza/zoxide
@@ -90,7 +84,6 @@ eval "$(starship init zsh)"
90
84
  # LEVE THIS IN THE END TO AVOID EXECUTION FAILURE OF THE REST OF THE SCRIPT
91
85
  # from https://github.com/cantino/mcfly
92
86
  eval "$(mcfly init zsh)"
93
-
94
87
  # Show elapsed runtime
95
88
  # _show_elapsed
96
89
 
@@ -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>=7.59" devops'
6
- alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" cloud'
7
- alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" agents'
8
- alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" sessions'
9
- alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" ftpx'
10
- alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" fire'
11
- alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" croshell'
12
- alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" utils'
13
- alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" terminal'
14
- alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.59" msearch'
5
+ alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" devops'
6
+ alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" cloud'
7
+ alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" agents'
8
+ alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" sessions'
9
+ alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" ftpx'
10
+ alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" fire'
11
+ alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" croshell'
12
+ alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" utils'
13
+ alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" terminal'
14
+ alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=7.60" msearch'
15
15
 
16
16
  alias d='wrap_in_shell_script devops'
17
17
  alias c='wrap_in_shell_script cloud'
@@ -3,16 +3,16 @@
3
3
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1").Content
4
4
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/scripts/windows/wrap_mcfg.ps1").Content
5
5
 
6
- function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" devops $args }
7
- function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" cloud $args }
8
- function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" agents $args }
9
- function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" sessions $args }
10
- function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" ftpx $args }
11
- function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" fire $args }
12
- function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" croshell $args }
13
- function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" utils $args }
14
- function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" terminal $args }
15
- function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.59" msearch $args }
6
+ function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" devops $args }
7
+ function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" cloud $args }
8
+ function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" agents $args }
9
+ function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" sessions $args }
10
+ function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" ftpx $args }
11
+ function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" fire $args }
12
+ function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" croshell $args }
13
+ function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" utils $args }
14
+ function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" terminal $args }
15
+ function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=7.60" msearch $args }
16
16
 
17
17
  function d { wrap_in_shell_script devops @args }
18
18
  function c { wrap_in_shell_script cloud @args }
@@ -1,7 +1,6 @@
1
1
  from machineconfig.utils.path_extended import PathExtended, DECOMPRESS_SUPPORTED_FORMATS
2
- from machineconfig.utils.installer_utils.installer_locator_utils import find_move_delete_linux, find_move_delete_windows
3
2
  from machineconfig.utils.source_of_truth import INSTALL_TMP_DIR, INSTALL_VERSION_ROOT
4
- from machineconfig.utils.installer_utils.installer_locator_utils import check_tool_exists
3
+ from machineconfig.utils.installer_utils.installer_locator_utils import find_move_delete_linux, find_move_delete_windows, check_tool_exists
5
4
  from machineconfig.utils.schemas.installer.installer_types import InstallerData, get_os_name, get_normalized_arch
6
5
 
7
6
  import platform
@@ -60,10 +59,8 @@ class Installer:
60
59
  result_new = subprocess.run(f"{exe_name} --version", shell=True, capture_output=True, text=True)
61
60
  new_version_cli = result_new.stdout.strip()
62
61
  if old_version_cli == new_version_cli:
63
- # print(f"ℹ️ Same version detected: {old_version_cli}")
64
62
  return f"""📦️ 😑 {exe_name}, same version: {old_version_cli}"""
65
63
  else:
66
- # print(f"🚀 Update successful: {old_version_cli} ➡️ {new_version_cli}")
67
64
  return f"""📦️ 🤩 {exe_name} updated from {old_version_cli} ➡️ TO ➡️ {new_version_cli}"""
68
65
  except Exception as ex:
69
66
  exe_name = self._get_exe_name()
@@ -87,8 +84,6 @@ class Installer:
87
84
  desc = package_manager + " installation"
88
85
  version_to_be_installed = package_manager + "Latest"
89
86
  result = subprocess.run(installer_arch_os, shell=True, capture_output=True, text=False)
90
- # from machineconfig.utils.code import run_shell_script
91
- # result = run_shell_script(installer_arch_os)
92
87
  success = result.returncode == 0 and result.stderr == "".encode()
93
88
  if not success:
94
89
  print(f"❌ {desc} failed")
@@ -98,7 +93,6 @@ class Installer:
98
93
  print(f"STDERR: {result.stderr}")
99
94
  print(f"Return code: {result.returncode}")
100
95
  elif installer_arch_os.endswith((".sh", ".py", ".ps1")):
101
- # search for the script, see which path ends with the script name
102
96
  import machineconfig.jobs.installer as module
103
97
  from pathlib import Path
104
98
  search_root = Path(module.__file__).parent
@@ -219,9 +213,6 @@ class Installer:
219
213
  if only_file_in.is_file() and only_file_in.suffix in DECOMPRESS_SUPPORTED_FORMATS: # further decompress
220
214
  downloaded = only_file_in.decompress()
221
215
  return downloaded, version_to_be_installed
222
-
223
- # --------------------------- Arch / template helpers ---------------------------
224
-
225
216
  @staticmethod
226
217
  def _get_repo_name_from_url(repo_url: str) -> str:
227
218
  """Extract owner/repo from GitHub URL."""
@@ -236,23 +227,16 @@ class Installer:
236
227
  def _fetch_github_release_data(repo_name: str, version: Optional[str] = None) -> Optional[dict[str, Any]]:
237
228
  """Fetch release data from GitHub API using requests."""
238
229
  import requests
239
-
240
230
  try:
241
- if version and version.lower() != "latest":
242
- # Fetch specific version
231
+ if version and version.lower() != "latest": # Fetch specific version
243
232
  url = f"https://api.github.com/repos/{repo_name}/releases/tags/{version}"
244
- else:
245
- # Fetch latest release
233
+ else: # Fetch latest release
246
234
  url = f"https://api.github.com/repos/{repo_name}/releases/latest"
247
-
248
235
  response = requests.get(url, timeout=30)
249
-
250
236
  if response.status_code != 200:
251
237
  print(f"❌ Failed to fetch data for {repo_name}: HTTP {response.status_code}")
252
238
  return None
253
-
254
239
  response_data = response.json()
255
-
256
240
  # Check if API returned an error
257
241
  if "message" in response_data:
258
242
  if "API rate limit exceeded" in response_data.get("message", ""):
@@ -5,52 +5,10 @@ from typing import Optional, Annotated
5
5
  from machineconfig.jobs.installer.package_groups import PACKAGE_GROUP2NAMES
6
6
 
7
7
 
8
-
9
- def _handle_installer_not_found(search_term: str, all_names: list[str]) -> None: # type: ignore
10
- """Handle installer not found with friendly suggestions using fuzzy matching."""
11
- from difflib import get_close_matches
12
- from rich.console import Console
13
- from rich.panel import Panel
14
- from rich.table import Table
15
- close_matches = get_close_matches(search_term, all_names, n=5, cutoff=0.4)
16
- console = Console()
17
-
18
- console.print(f"\n❌ '[red]{search_term}[/red]' was not found.", style="bold")
19
- if close_matches:
20
- console.print("🤔 Did you mean one of these?", style="yellow")
21
- table = Table(show_header=False, box=None, pad_edge=False)
22
- for i, match in enumerate(close_matches, 1):
23
- table.add_row(f"[cyan]{i}.[/cyan]", f"[green]{match}[/green]")
24
- console.print(table)
25
- else:
26
- console.print("📋 Here are some available options:", style="blue")
27
- # Show first 10 installers as examples
28
- if len(all_names) > 10:
29
- sample_names = all_names[:10]
30
- else:
31
- sample_names = all_names
32
- table = Table(show_header=False, box=None, pad_edge=False)
33
- for i, name in enumerate(sample_names, 1):
34
- table.add_row(f"[cyan]{i}.[/cyan]", f"[green]{name}[/green]")
35
- console.print(table)
36
- if len(all_names) > 10:
37
- console.print(f" [dim]... and {len(all_names) - 10} more[/dim]")
38
-
39
- 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")
40
- console.print(panel)
41
-
42
-
43
- def main_with_parser():
44
- import typer
45
- app = typer.Typer()
46
- app.command()(main)
47
- app()
48
-
49
-
50
8
  def main(
51
9
  which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program/groups names to install (if --group flag is set).")] = None,
52
10
  group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
53
- interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Interactive selection of programs to install.")] = False,
11
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of programs to install.")] = False,
54
12
  ) -> None:
55
13
  if interactive:
56
14
  return install_interactively()
@@ -111,12 +69,10 @@ def install_interactively():
111
69
  installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=None)
112
70
  installer_options = [Installer(installer_data=x).get_description() for x in installers]
113
71
  category_display_to_name = get_group_name_to_repr()
114
- options = list(category_display_to_name.keys()) + ["─" * 50] + installer_options
72
+ options = list(category_display_to_name.keys()) + installer_options
115
73
  program_names = choose_from_options(multi=True, msg="Categories are prefixed with 📦", options=options, header="🚀 CHOOSE DEV APP OR CATEGORY", fzf=True)
116
74
  installation_messages: list[str] = []
117
75
  for _an_idx, a_program_name in enumerate(program_names):
118
- if a_program_name.startswith("─"): # 50 dashes separator
119
- continue
120
76
  if a_program_name.startswith("📦 "):
121
77
  category_name = category_display_to_name.get(a_program_name)
122
78
  if category_name:
@@ -148,6 +104,39 @@ def install_group(package_group: str):
148
104
  return
149
105
  console = Console()
150
106
  console.print(f"❌ ERROR: Unknown package group: {package_group}. Available groups are: {list(PACKAGE_GROUP2NAMES.keys())}")
107
+ def _handle_installer_not_found(search_term: str, all_names: list[str]) -> None: # type: ignore
108
+ """Handle installer not found with friendly suggestions using fuzzy matching."""
109
+ from difflib import get_close_matches
110
+ from rich.console import Console
111
+ from rich.panel import Panel
112
+ from rich.table import Table
113
+ close_matches = get_close_matches(search_term, all_names, n=5, cutoff=0.4)
114
+ console = Console()
115
+
116
+ console.print(f"\n❌ '[red]{search_term}[/red]' was not found.", style="bold")
117
+ if close_matches:
118
+ console.print("🤔 Did you mean one of these?", style="yellow")
119
+ table = Table(show_header=False, box=None, pad_edge=False)
120
+ for i, match in enumerate(close_matches, 1):
121
+ table.add_row(f"[cyan]{i}.[/cyan]", f"[green]{match}[/green]")
122
+ console.print(table)
123
+ else:
124
+ console.print("📋 Here are some available options:", style="blue")
125
+ # Show first 10 installers as examples
126
+ if len(all_names) > 10:
127
+ sample_names = all_names[:10]
128
+ else:
129
+ sample_names = all_names
130
+ table = Table(show_header=False, box=None, pad_edge=False)
131
+ for i, name in enumerate(sample_names, 1):
132
+ table.add_row(f"[cyan]{i}.[/cyan]", f"[green]{name}[/green]")
133
+ console.print(table)
134
+ if len(all_names) > 10:
135
+ console.print(f" [dim]... and {len(all_names) - 10} more[/dim]")
136
+
137
+ 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")
138
+ console.print(panel)
139
+
151
140
  def install_clis(clis_names: list[str]):
152
141
  from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
153
142
  from machineconfig.utils.installer_utils.installer_runner import get_installers
@@ -173,8 +162,6 @@ def install_clis(clis_names: list[str]):
173
162
  for a_message in total_messages:
174
163
  console.print(f"[blue]• {a_message}[/blue]")
175
164
  return None
176
-
177
-
178
165
  def install_if_missing(which: str):
179
166
  from machineconfig.utils.installer_utils.installer_locator_utils import check_tool_exists
180
167
  exists = check_tool_exists(which)
@@ -13,7 +13,7 @@ class TabConfig(TypedDict):
13
13
  tabName: str
14
14
  startDir: str
15
15
  command: str
16
- tabWeight: NotRequired[int] # Optional, defaults to 1 if not provided
16
+ tabWeight: NotRequired[int]
17
17
 
18
18
 
19
19
  class LayoutConfig(TypedDict):
@@ -8,7 +8,7 @@ from machineconfig.utils.terminal import Response
8
8
  from machineconfig.utils.accessories import pprint, randstr
9
9
  from machineconfig.utils.meta import lambda_to_python_script
10
10
  UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
11
- MACHINECONFIG_VERSION = "machineconfig>=7.59"
11
+ MACHINECONFIG_VERSION = "machineconfig>=7.60"
12
12
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
13
13
 
14
14
  class SSH:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 7.59
3
+ Version: 7.60
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -25,7 +25,7 @@ machineconfig/cluster/sessions_managers/zellij_remote_manager.py,sha256=xzih0y8_
25
25
  machineconfig/cluster/sessions_managers/helpers/enhanced_command_runner.py,sha256=YULt8r3zotkotjdmWRrUq3yGySZW-5e_rQSIZ-IMvjk,5410
26
26
  machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py,sha256=i5TRittC1IWTgMZNyG8AR5qq-3WrGp3xgIx2m5ktT7g,7526
27
27
  machineconfig/cluster/sessions_managers/utils/load_balancer.py,sha256=Y4RQmhROY6o7JXSJXRrBTkoAuEmu1gvmvN_7JKPw5sc,3178
28
- machineconfig/cluster/sessions_managers/utils/maker.py,sha256=QBzzTGK9_KcfxvXd2IdUZANtejBeypcWUl6w-jtUDCM,2657
28
+ machineconfig/cluster/sessions_managers/utils/maker.py,sha256=RaRtMEKcC_WP3urAjrHZcocqUvoQeSRYNRfrnDtjDe8,2859
29
29
  machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py,sha256=OA50j16uUS9ZTjL38TLuR3jufIOln_EszMZpbWyejTo,6972
30
30
  machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py,sha256=LWgK-886QMERLRJwQ4rH2Nr2RGlyKu6P7JYoBMVWMGc,1604
31
31
  machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py,sha256=e75rdp0G8cDfF9SfkJ7LX3TAJ8R3JWR5v-C_SDkDa14,1627
@@ -70,7 +70,7 @@ machineconfig/jobs/installer/custom_dev/lvim.py,sha256=2-wbh_IClTFcFkSYk9EsRiv88
70
70
  machineconfig/jobs/installer/custom_dev/nerdfont.py,sha256=dsPmiqP9AJCack7mNeJ8Qzo4dSOwC0bsupH0Hn3gqSg,4149
71
71
  machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py,sha256=NbmRNNq3Mc-x-UgQxYDy5-cBngMAAax7nEnnvbhbq4Q,5627
72
72
  machineconfig/jobs/installer/custom_dev/redis.py,sha256=bReDLsgy37eJyTU4TXE7FQpKFi-_usQC7bwhfXvZuBU,3259
73
- machineconfig/jobs/installer/custom_dev/sysabc.py,sha256=5VB7GNIgl3vxr5h5mE1OT3uDxIUKaT8o3bU2LX12WK0,5391
73
+ machineconfig/jobs/installer/custom_dev/sysabc.py,sha256=-X0XK4MPtIi70YD4-f5GebtajziBYVTNYa6_wOXs34k,5385
74
74
  machineconfig/jobs/installer/custom_dev/wezterm.py,sha256=yQqRpnaj7I_2q-Ge9HX0leK5-ntUCWpkqgH09cgmh-Q,3063
75
75
  machineconfig/jobs/installer/custom_dev/winget.py,sha256=gLdwM20jKMf2bMV3BAcOg4MkuzwF09CU5OhXvLkPoHo,5738
76
76
  machineconfig/jobs/installer/linux_scripts/brave.sh,sha256=_al_D5iZSwtlDRTeqjjK37nEWai8mrHFk-cZeVws9MY,1389
@@ -111,9 +111,9 @@ machineconfig/scripts/nu/wrap_mcfg.nu,sha256=9heiUHVkHjI_AMXT5QJJixk7ZK_hJNV_A8l
111
111
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
112
  machineconfig/scripts/python/agents.py,sha256=aVbLQDgpngXZm4taHcED4sAxyHvV2_Dz5VW3apPcQcY,10651
113
113
  machineconfig/scripts/python/cloud.py,sha256=yAD6ciKiEtv2CH3g2NScDK5cpCZQi7Vu8yyeehw_cU8,1263
114
- machineconfig/scripts/python/croshell.py,sha256=-Til5fJJIHbhsrorMRTu17uBhzOot8T1HbrlV8m3Sy8,7132
114
+ machineconfig/scripts/python/croshell.py,sha256=eMDBaFphreM78j_YFqfZEHSC89O81wxym3LQ8kreFng,7132
115
115
  machineconfig/scripts/python/define.py,sha256=AtuVac6tJeDMcxtbWmQh1TH3dYAPSGFdO51b75zJVeI,717
116
- machineconfig/scripts/python/devops.py,sha256=foC9jgiUKz0GsqnDuiUYUcJXaM3AasutZlPoc8b59aI,2216
116
+ machineconfig/scripts/python/devops.py,sha256=Nja71JbGPTg7lLQ-O0dg4PYgGKAoIcD2f7reUXEgWY8,2199
117
117
  machineconfig/scripts/python/devops_navigator.py,sha256=5Cm384D4S8_GsvMzTwr0C16D0ktf8_5Mk5bEJncwDO8,237
118
118
  machineconfig/scripts/python/explore.py,sha256=3kNglM1KYp57U8yrbWeHEslN458-xieRuFYsJAhrpIs,1247
119
119
  machineconfig/scripts/python/fire_jobs.py,sha256=zLLgPfqCSpXBeU5kC4XEcojscZFy-K0K3dbbGqkTczU,13135
@@ -121,7 +121,7 @@ machineconfig/scripts/python/ftpx.py,sha256=8tmhKBZgSuhFZZYaT4JAIgeXMKmxJhxg5aJQ
121
121
  machineconfig/scripts/python/interactive.py,sha256=gJLeuqSdlN3AENbeArFsijh_U8KUD61nYCTn02edXEE,11532
122
122
  machineconfig/scripts/python/machineconfig.py,sha256=l211lxHRcQ6BH7x3FwQHSJCYbYs6RJL5e0POjyWAW9A,3048
123
123
  machineconfig/scripts/python/msearch.py,sha256=3NbwJFJtrvPSVyOfa6ogPjD-NVuRJHeAQ1WriDXCduU,737
124
- machineconfig/scripts/python/sessions.py,sha256=OCPFYu7LDPWIYaeAAATVwcViAi6-vig6Vk0HnHuReVg,9477
124
+ machineconfig/scripts/python/sessions.py,sha256=lw_XxifRLpkx9IS382m_fsLd4Ogt1XlG5E05dFnQhw0,9549
125
125
  machineconfig/scripts/python/terminal.py,sha256=PQ2C2flC2UngfeTNYhHLBiwj__kmE12gxZu2ivtr4Kg,5978
126
126
  machineconfig/scripts/python/utils.py,sha256=Gu1Eu3SBBN-0dFuH-wQURRcBD55WOhOtAr1mtBlg_aY,3523
127
127
  machineconfig/scripts/python/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -156,7 +156,7 @@ machineconfig/scripts/python/ai/solutions/opencode/opencode.json,sha256=nahHKRw1
156
156
  machineconfig/scripts/python/ai/solutions/opencode/opencode.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
157
157
  machineconfig/scripts/python/env_manager/__init__.py,sha256=E4LAHbU1wo2dLjE36ntv8U7QNTe8TasujUAYK9SLvWk,6
158
158
  machineconfig/scripts/python/env_manager/path_manager_backend.py,sha256=ZVGlGJALhg7zNABDdwXxL7MFbL2BXPebObipXSLGbic,1552
159
- machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=aeWG_W4rnZbkPIT8QK_mhab3p5EeCPy5Td2N2aXKT04,6932
159
+ machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=SKAcJU7je9KOZZaYOyNssHk5mU09hRBFqONZ5N2peMI,6932
160
160
  machineconfig/scripts/python/helpers_agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
161
  machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py,sha256=YD6-rtudHNip8tx85amSmOZZIHBP9khq4az3dF41j6U,5934
162
162
  machineconfig/scripts/python/helpers_agents/fire_agents_help_search.py,sha256=qIfSS_su2YJ1Gb0_lu4cbjlJlYMBw0v52NTGiSrGjk8,2991
@@ -191,7 +191,7 @@ machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py,sha256=KFIBpAa
191
191
  machineconfig/scripts/python/helpers_devops/cli_data.py,sha256=79Xvx7YnbueruEnl69hrDg2AhVxf_zCUdlVcKfeMGyQ,1774
192
192
  machineconfig/scripts/python/helpers_devops/cli_nw.py,sha256=u_2l5Cc3dFnh0seKrbH9j-Z0bUCrgy45MOM6HCjgkQg,7562
193
193
  machineconfig/scripts/python/helpers_devops/cli_repos.py,sha256=mFrhosIFCCT70d82NYUxp9ta6BYeAHQNhsx7CEmWcg4,12478
194
- machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=__djCnitb378Uh-l3v-cmac7PlBE6CfQ3-3VUo2TDfY,6993
194
+ machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=iKM6HKsJBN5J8rvlwvLS_VCKmf64_s1IiPEj4MhkuGA,6993
195
195
  machineconfig/scripts/python/helpers_devops/cli_share_file.py,sha256=LBQKUCA-3pJlV65vE-6F9uiYF_mwU7G1oF6-hqBS8EQ,6306
196
196
  machineconfig/scripts/python/helpers_devops/cli_share_server.py,sha256=4vUp6dMGACwLYAR3LaROac9aYvzJRQI4_g5bMWOC3rI,6282
197
197
  machineconfig/scripts/python/helpers_devops/cli_terminal.py,sha256=AxGAenzrw-8_hQoMhWnE87ivdJ-h9WJ4bij6nBWVP5A,6023
@@ -228,9 +228,9 @@ machineconfig/scripts/python/helpers_navigator/search_bar.py,sha256=kDi8Jhxap8wd
228
228
  machineconfig/scripts/python/helpers_repos/action.py,sha256=8je051kpGZ7A_GRsQyWKhPZ8xVW7tSm4bnPu6VjxaXk,9755
229
229
  machineconfig/scripts/python/helpers_repos/action_helper.py,sha256=XRCtkGkNrxauqUd9qkxtfJt02Mx2gejSYDLL0jyWn24,6176
230
230
  machineconfig/scripts/python/helpers_repos/clone.py,sha256=9RZgs2OD2RUH6UiZKCuUvRyweDBomAm2lDG2qJmhry0,5436
231
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=eVyU6Eitnm8w7jP_DBw9RbBbt1x66lTNdg6A79BNVV8,11577
231
+ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=eotVhV0_j-uHOY07IoteBCwXsddPYiaRQwo7aOJfiFk,11577
232
232
  machineconfig/scripts/python/helpers_repos/count_lines.py,sha256=Q5c7b-DxvTlQmljoic7niTuiAVyFlwYvkVQ7uRJHiTo,16009
233
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py,sha256=h-FIJT_BqGrxU7MYZT6-oTBm1_fHqjwKguU3lLtKR3o,607
233
+ machineconfig/scripts/python/helpers_repos/count_lines_frontend.py,sha256=sgdt8YLXWmkrHEvmmSjhKTYAtQ2YX-nAudiA-vZRcWU,607
234
234
  machineconfig/scripts/python/helpers_repos/entrypoint.py,sha256=eAM-7trZCPTeep0iTU3_HNqCkF0pYKqMMXNq3vLBsP8,2898
235
235
  machineconfig/scripts/python/helpers_repos/grource.py,sha256=lHxyfsIQr4pbu71Ekqu-9nohR7LXbN2wufw7LPTyOgM,14639
236
236
  machineconfig/scripts/python/helpers_repos/record.py,sha256=1PycYcW7VA-9n9iv1TJXub7qNIQ6I6Z9dEnvbdDm4TU,11099
@@ -239,7 +239,7 @@ machineconfig/scripts/python/helpers_repos/update.py,sha256=cUIMUMm-50HrY6fzxSMZ
239
239
  machineconfig/scripts/python/helpers_sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
240
  machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py,sha256=wCQPpsOeuNz0V7_SopHWLRgYQcQryDdQSDabikVS3AE,3054
241
241
  machineconfig/scripts/python/helpers_utils/download.py,sha256=YiXiCDp3hVk2pxPaOOrrGMY2JdtWXBmRL34LWY15u9U,6649
242
- machineconfig/scripts/python/helpers_utils/path.py,sha256=XeYyGTXVlz90eVoAOwRHdY73L6t_zvaZuve2JBhxUYs,3982
242
+ machineconfig/scripts/python/helpers_utils/path.py,sha256=websDwdmPmjRSRGgkaSdirMfgwK4jvdL4hOtNne7sO8,3982
243
243
  machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
244
  machineconfig/scripts/python/nw/devops_add_identity.py,sha256=aPjcHbTLhxYwWYcandyAHdwuO15ZBu3fB82u6bI0tMQ,3773
245
245
  machineconfig/scripts/python/nw/devops_add_ssh_key.py,sha256=hPmrJb6Q8dbvZBkj00va4najYDKziQ9A7CfZ3TZPccI,9560
@@ -259,7 +259,7 @@ machineconfig/scripts/windows/wrap_mcfg.ps1,sha256=tFCj4wK7B35Uf6kdGCRV7EIr1xZFT
259
259
  machineconfig/scripts/windows/mounts/mount_nfs.ps1,sha256=XrAdzpxE6a4OccSmWJ7YWHJTnsZK8uXnFE5j9GOPA20,2026
260
260
  machineconfig/scripts/windows/mounts/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
261
261
  machineconfig/scripts/windows/mounts/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
262
- machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=wAItjVLBbuLhquxxjxNQNqfJrceU5Te7ArBgu3Vr5Vc,322
262
+ machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=rw-rtJ5G2zFXjXPOWaig3mwcgrB2u7T8wYbT-T_YUp4,322
263
263
  machineconfig/scripts/windows/mounts/share_cloud.cmd,sha256=exD7JCdxw2LqVjw2MKCYHbVZlEqmelXtwnATng-dhJ4,1028
264
264
  machineconfig/scripts/windows/mounts/share_smb.ps1,sha256=U7x8ULYSjbgzTtiHNSKQuTaZ_apilDvkGV5Xm5hXk5M,384
265
265
  machineconfig/scripts/windows/mounts/unlock_bitlocker.ps1,sha256=Wv-SLscdckV-1mG3p82VXKPY9zW3hgkRmcLUXIZ1daE,253
@@ -346,7 +346,7 @@ machineconfig/settings/shells/starship/starship.toml,sha256=d5lWKC0AnTcriRAZV1op
346
346
  machineconfig/settings/shells/vtm/settings.xml,sha256=5TNXd-i0eUGo2w3tuhY9aOkwoJdqih8_HO_U6uL2Dts,18262
347
347
  machineconfig/settings/shells/wezterm/wezterm.lua,sha256=_ERpROSN3XNtbZJgL1jkAb8DhwGjUjOYuAW6p43CA00,6296
348
348
  machineconfig/settings/shells/wt/settings.json,sha256=Nzk9IpD-Bp36wKJAgG7XAa0GVwW3I29xNjUW5AYfxEI,10599
349
- machineconfig/settings/shells/zsh/init.sh,sha256=LcT8AOecHoCtmmkXkSlAROJy-xD1re6wvPEIEzgPN5U,3054
349
+ machineconfig/settings/shells/zsh/init.sh,sha256=46-PVbbuv4h86k6lkSzALCkW7i_qZukfQm5ZFRwAEhs,2821
350
350
  machineconfig/settings/streamlit/config.toml,sha256=O3d4ax88hoW7gm5r51xmCcPssQ8ol-oFz_d0NUDlU4k,483
351
351
  machineconfig/settings/svim/linux/init.toml,sha256=IEEQN_80H0A4NPv7bt5zltEKAbpRkJyCQTJKbu2bBf8,1346
352
352
  machineconfig/settings/svim/windows/init.toml,sha256=djllsYR_rvHNSR715QhqtLdHW8b-SpUZ8QquWEG7gVM,1347
@@ -381,7 +381,7 @@ machineconfig/setup_linux/others/cli_installation.sh,sha256=gVvszYZJgKPRJx2SEaE3
381
381
  machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
382
382
  machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
383
383
  machineconfig/setup_linux/ssh/openssh_wsl.sh,sha256=1eeRGrloVB34K5z8yWVUMG5b9pV-WBfHgV9jqXiYgCQ,1398
384
- machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=L1EPv2--axDZAOfa3rzUizmeL4s8SPMGY5u55Rbu3c8,1606
384
+ machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=H-NlFSckCj64i4RBBGqHa0XnQiYtBaC3_Cs1NHrkwMw,1606
385
385
  machineconfig/setup_mac/__init__.py,sha256=PfdhwY4Ss-rfP7b4-9fvKwxCDtNAd-u1JdhFYnE7CwI,518
386
386
  machineconfig/setup_mac/apps_gui.sh,sha256=3alvddg918oMlJB2aUWJWpGGoaq5atlxcaOwhnyXlRI,9517
387
387
  machineconfig/setup_mac/uv.sh,sha256=CSN8oCBKS-LK1vJJqYOhAMcrouTf4Q_F3cpplc_ddMA,1157
@@ -396,7 +396,7 @@ machineconfig/setup_windows/ssh/add_identity.ps1,sha256=b8ZXpmNUSw3IMYvqSY7ClpdW
396
396
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=OMlYQdvuJQNxF5EILLPizB6BZAT3jAmDsv1WcVVxpFQ,2529
397
397
  machineconfig/setup_windows/ssh/openssh-server_add_key.ps1,sha256=91cL3K4H2saAuzOS1GxGicpc64ZDpgvPY39YPBWyxZI,269
398
398
  machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1,sha256=-7pElYiGFXUvO4dp6rW0LXmNo65h3hFTHJWyHbmO3Xc,745
399
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=wq1ga0JiD98hsgLRrgv-MJ8do-CQFLsRQ49duDO-0Xg,1939
399
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=gSZTCrBApnafzO4Lna-x4eQf1AU3ywocWpRf9Na3muY,1939
400
400
  machineconfig/setup_windows/web_shortcuts/quick_init.ps1,sha256=8TOw-ZxaWA6mZkOICAQtpQfqB2fUyD4HVfqokpxCCqI,655
401
401
  machineconfig/setup_windows/wt_and_pwsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
402
402
  machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=ogxJnwpdcpH7N6dFJu95UCNoGYirZKQho_3X0F_hmXs,6791
@@ -414,7 +414,7 @@ machineconfig/utils/procs.py,sha256=YPA_vEYQGwPd_o_Lc6nOTBo5BrB1tSs8PJ42XiGpenM,
414
414
  machineconfig/utils/scheduler.py,sha256=fguwvINyaupOxdU5Uadyxalh_jXTXDzt0ioEgjEOKcM,14705
415
415
  machineconfig/utils/scheduling.py,sha256=vcJgajeJPSWkJNlarYJSmLvasdOuCtBM4druOAB1Nwc,11089
416
416
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
417
- machineconfig/utils/ssh.py,sha256=IQJW4ptXxEGDA-O3OYH55QI8VWQES7bv7cN4cjcbZXA,39262
417
+ machineconfig/utils/ssh.py,sha256=IAH3teNygY-yy9tRjwS1-V44hE5AKNrntj4jZB7d2GY,39262
418
418
  machineconfig/utils/terminal.py,sha256=VDgsjTjBmMGgZN0YIc0pJ8YksLDrBtiXON1EThy7_is,4264
419
419
  machineconfig/utils/tst.py,sha256=6u1GI49NdcpxH2BYGAusNfY5q9G_ytCGVzFM5b6HYpM,674
420
420
  machineconfig/utils/upgrade_packages.py,sha256=e4iJn_9vL2zCJxAR2dhKJjM0__ALKgI5yB1uBRxSjhQ,6994
@@ -435,17 +435,17 @@ machineconfig/utils/files/ouch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
435
435
  machineconfig/utils/files/ouch/decompress.py,sha256=7qPaEkMerBBXzeZyFn8hLODHZJv1aty-yGgwBxLgVys,1413
436
436
  machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
437
  machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
438
- machineconfig/utils/installer_utils/installer_class.py,sha256=oLkDvJW3zOcBTcFzac2UJPJjTfav0_kIldQQKdqvdVI,18203
439
- machineconfig/utils/installer_utils/installer_cli.py,sha256=ubSh1_SEVsq6pDgrMN3HxXXqd025iybVVKGQEkJeOao,9541
438
+ machineconfig/utils/installer_utils/installer_class.py,sha256=1RJXdyYnrWPp9DSmTaDyvX9m6jAaojTAhA-IQTS9wQk,17561
439
+ machineconfig/utils/installer_utils/installer_cli.py,sha256=dXv8m_h8KlEz8lL9wquIdRp73lu9gWzenpb1wAYJck4,9331
440
440
  machineconfig/utils/installer_utils/installer_locator_utils.py,sha256=_QihkKgi7-IGrQQoy8muD0iL_n65ebvqDgiv43sCudI,8984
441
441
  machineconfig/utils/installer_utils/installer_runner.py,sha256=yHaW2_5XM7NTfS7kWDEhb7MJZAr4GMzs1aR6pOFYBBo,8047
442
442
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=d3pwhmE-EuHPxaIoTTZeUdDUEK9QqtimV8zO3vV-7N4,2052
443
443
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
444
- machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
444
+ machineconfig/utils/schemas/layouts/layout_types.py,sha256=IV45Z_ZTw8S4V-wiZ_lpAVsUX6rSSfDCG7qm5Dk4Oog,1977
445
445
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
446
446
  machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
447
- machineconfig-7.59.dist-info/METADATA,sha256=TWIouQin9dKrXtuGbeZ6mao6QmQEetEuDdrWzmC_Fdw,5939
448
- machineconfig-7.59.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
449
- machineconfig-7.59.dist-info/entry_points.txt,sha256=_JNgkzaa_gVAWyZ6UwPwXXQqURRSvAGhrVQ1RiU2sHc,746
450
- machineconfig-7.59.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
451
- machineconfig-7.59.dist-info/RECORD,,
447
+ machineconfig-7.60.dist-info/METADATA,sha256=MNn8SOdp4YWZwTOEIelU4hS57t27x99kxPQDpDRJduk,5939
448
+ machineconfig-7.60.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
449
+ machineconfig-7.60.dist-info/entry_points.txt,sha256=_JNgkzaa_gVAWyZ6UwPwXXQqURRSvAGhrVQ1RiU2sHc,746
450
+ machineconfig-7.60.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
451
+ machineconfig-7.60.dist-info/RECORD,,