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

Files changed (24) hide show
  1. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +1 -1
  2. machineconfig/scripts/python/croshell.py +5 -5
  3. machineconfig/scripts/python/env_manager/env_manager_tui.py +1 -1
  4. machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
  5. machineconfig/scripts/python/helpers_devops/cli_repos.py +3 -3
  6. machineconfig/scripts/python/helpers_devops/cli_self.py +16 -8
  7. machineconfig/scripts/python/helpers_devops/run_script.py +49 -37
  8. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +1 -1
  9. machineconfig/scripts/python/helpers_utils/python.py +4 -4
  10. machineconfig/scripts/python/interactive.py +13 -5
  11. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  12. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +10 -10
  13. machineconfig/utils/code.py +47 -33
  14. machineconfig/utils/options.py +1 -1
  15. machineconfig/utils/ssh.py +4 -4
  16. machineconfig/utils/ssh_utils/abc.py +1 -1
  17. machineconfig/utils/ssh_utils/copy_from_here.py +2 -2
  18. machineconfig/utils/ssh_utils/utils.py +2 -2
  19. {machineconfig-8.12.dist-info → machineconfig-8.14.dist-info}/METADATA +1 -1
  20. {machineconfig-8.12.dist-info → machineconfig-8.14.dist-info}/RECORD +23 -24
  21. machineconfig/jobs/scripts/bash_scripts/mint_keyboard_shortcuts.sh +0 -30
  22. {machineconfig-8.12.dist-info → machineconfig-8.14.dist-info}/WHEEL +0 -0
  23. {machineconfig-8.12.dist-info → machineconfig-8.14.dist-info}/entry_points.txt +0 -0
  24. {machineconfig-8.12.dist-info → machineconfig-8.14.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=8.12" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=8.14" 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
@@ -134,8 +134,8 @@ def croshell(
134
134
  fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata,pyarrow vd {str(file_obj)}"
135
135
  elif marimo:
136
136
  if Path.home().joinpath("code/machineconfig").exists():
137
- requirements = f"""{user_uv_with_line} {uv_project_line} --with marimo """
138
- else: requirements = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "marimo,cowsay,machineconfig[plot]>=8.12" """
137
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with marimo,sqlglot """
138
+ else: requirements = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "marimo,sqlglot,cowsay,machineconfig[plot]>=8.14" """
139
139
  fire_line = f"""
140
140
  cd {str(pyfile.parent)}
141
141
  uv run {uv_python_line} --with "marimo" marimo convert {pyfile.name} -o marimo_nb.py
@@ -144,7 +144,7 @@ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
144
144
  elif jupyter:
145
145
  if Path.home().joinpath("code/machineconfig").exists():
146
146
  requirements = f"""{user_uv_with_line} {uv_project_line} --with jupyterlab """
147
- else: requirements = f"""{user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.12" """
147
+ else: requirements = f"""{user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.14" """
148
148
  fire_line = f"uv run {requirements} {uv_project_line} jupyter-lab {str(nb_target)}"
149
149
  elif vscode:
150
150
  user_uv_add = f"uv add {uv_with}" if uv_with is not None else ""
@@ -152,7 +152,7 @@ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
152
152
  cd {str(pyfile.parent)}
153
153
  uv init {uv_python_line}
154
154
  uv venv
155
- uv add "cowsay,machineconfig[plot]>=8.12"
155
+ uv add "cowsay,machineconfig[plot]>=8.14"
156
156
  uv add {user_uv_add}
157
157
  # code serve-web
158
158
  code --new-window {str(pyfile)}
@@ -162,7 +162,7 @@ code --new-window {str(pyfile)}
162
162
  else: profile = ""
163
163
  if Path.home().joinpath("code/machineconfig").exists():
164
164
  ve_line = f"""{user_uv_with_line} {uv_project_line} """
165
- else: ve_line = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.12" """
165
+ else: ve_line = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.14" """
166
166
  fire_line = f"uv run {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
167
167
 
168
168
  from machineconfig.utils.code import exit_then_run_shell_script
@@ -2,7 +2,7 @@
2
2
  # /// script
3
3
  # requires-python = ">=3.13"
4
4
  # dependencies = [
5
- # "machineconfig>=8.12",
5
+ # "machineconfig>=8.14",
6
6
  # "textual",
7
7
  # "pyperclip",
8
8
  # ]
@@ -2,7 +2,7 @@
2
2
  # /// script
3
3
  # requires-python = ">=3.13"
4
4
  # dependencies = [
5
- # "machineconfig>=8.12",
5
+ # "machineconfig>=8.14",
6
6
  # "textual",
7
7
  # "pyperclip",
8
8
  # ]
@@ -76,7 +76,7 @@ def count_lines_in_repo(repo_path: Annotated[str, typer.Argument(..., help="Path
76
76
  from machineconfig.scripts.python.helpers_repos import repo_analyzer_1
77
77
  repo_analyzer_1.count_historical_line_edits(repo_path=repo_path)
78
78
  from machineconfig.utils.code import run_lambda_function
79
- run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig>=8.12"])
79
+ run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig>=8.14"])
80
80
 
81
81
 
82
82
  def print_python_files_by_size(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
@@ -84,7 +84,7 @@ def print_python_files_by_size(repo_path: Annotated[str, typer.Argument(..., hel
84
84
  from machineconfig.scripts.python.helpers_repos.repo_analyzer_2 import print_python_files_by_size_impl
85
85
  print_python_files_by_size_impl(repo_path=repo_path)
86
86
  from machineconfig.utils.code import run_lambda_function
87
- run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.12"])
87
+ run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.14"])
88
88
 
89
89
 
90
90
  def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
@@ -92,7 +92,7 @@ def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help=
92
92
  from machineconfig.scripts.python.helpers_repos.repo_analyzer_2 import analyze_over_time
93
93
  analyze_over_time(repo_path=repo_path)
94
94
  from machineconfig.utils.code import run_lambda_function
95
- run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.12"])
95
+ run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.14"])
96
96
 
97
97
 
98
98
  def gource_viz(
@@ -94,18 +94,26 @@ uv tool install --upgrade machineconfig
94
94
  create_links_export.main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
95
95
 
96
96
 
97
- def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-na", help="Copy (overwrite) assets to the machine after the update")] = False):
97
+ def install(copy_assets: Annotated[bool, typer.Option("--copy-assets/--no-assets-copy", "-a/-na", help="Copy (overwrite) assets to the machine after the update")] = True,
98
+ dev: Annotated[bool, typer.Option("--dev", "-d", help="Install from local development code instead of PyPI")] = False,
99
+ ):
98
100
  """📋 CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates."""
99
- from machineconfig.utils.code import run_shell_script, get_uv_run_command
101
+ from machineconfig.utils.code import run_shell_script, get_uv_command
100
102
  from pathlib import Path
101
103
  import platform
102
- uv_run_command = get_uv_run_command(platform=platform.system()) # type: ignore
104
+ if dev and not Path.home().joinpath("code/machineconfig").exists():
105
+ # clone: https://github.com/thisismygitrepo/machineconfig.git
106
+ import git
107
+ repo_parent = Path.home().joinpath("code")
108
+ repo_parent.mkdir(parents=True, exist_ok=True)
109
+ git.Repo.clone_from("https://github.com/thisismygitrepo/machineconfig.git", str(repo_parent.joinpath("machineconfig")))
110
+ uv_command = get_uv_command(platform=platform.system())
103
111
  if Path.home().joinpath("code/machineconfig").exists():
104
- run_shell_script(f""" {uv_run_command} tool install --upgrade --editable "{str(Path.home().joinpath("code/machineconfig"))}" """)
112
+ run_shell_script(f""" {uv_command} tool install --upgrade --editable "{str(Path.home().joinpath("code/machineconfig"))}" """)
105
113
  else:
106
- run_shell_script(rf""" {uv_run_command} tool install --upgrade "machineconfig>=8.12" """)
107
- from machineconfig.profile.create_shell_profile import create_default_shell_profile
108
- if not no_copy_assets:
114
+ run_shell_script(rf""" {uv_command} tool install --upgrade "machineconfig>=8.14" """)
115
+ if copy_assets:
116
+ from machineconfig.profile.create_shell_profile import create_default_shell_profile
109
117
  create_default_shell_profile() # involves copying assets too
110
118
 
111
119
 
@@ -128,7 +136,7 @@ def navigate():
128
136
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
129
137
  from machineconfig.utils.code import exit_then_run_shell_script
130
138
  if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
131
- else: executable = """--with "machineconfig>=8.12,textual" """
139
+ else: executable = """--with "machineconfig>=8.14,textual" """
132
140
  exit_then_run_shell_script(f"""uv run {executable} {path}""")
133
141
 
134
142
  def readme():
@@ -5,13 +5,15 @@
5
5
  Recursively Searched Predefined Directories:
6
6
 
7
7
 
8
- * 'private' : $HOME/dotfiles/scripts
8
+ * 'private' : $HOME/dotfiles/scripts
9
9
 
10
- * 'public' : $HOME/.config/machineconfig/scripts
10
+ * 'public' : $HOME/.config/machineconfig/scripts
11
11
 
12
- * 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
12
+ * 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
13
13
 
14
- * 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
14
+ * 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
15
+
16
+ * 'custom' : custom directories from comma separated entry 'scripts' under 'general' section @ ~/dotfiles/machineconfig/defaults.ini
15
17
 
16
18
  """
17
19
 
@@ -22,7 +24,7 @@ from typing import Annotated, Optional, Literal
22
24
 
23
25
 
24
26
  def run_py_script(name: Annotated[str, typer.Argument(help="Name of script to run, e.g., 'a' for a.py, or command to execute")] = "",
25
- where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
27
+ where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d", "custom", "c"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
26
28
  interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of scripts to run")] = False,
27
29
  command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False,
28
30
  # use_machineconfig_env: Annotated[bool, typer.Option(..., "--use-machineconfig-env/--no-use-machineconfig-env", "-m/-nm", help="Whether to use the machineconfig python environment")] = False
@@ -45,15 +47,29 @@ def run_py_script(name: Annotated[str, typer.Argument(help="Name of script to ru
45
47
  else:
46
48
  raise RuntimeError(f"File '{name}' is not a python (.py) file.")
47
49
 
48
- from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT
50
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT, DEFAULTS_PATH
49
51
  private_root = Path.home().joinpath("dotfiles/scripts") # local directory
50
52
  public_root = CONFIG_ROOT.joinpath("scripts") # local machineconfig directory
51
53
  library_root = LIBRARY_ROOT.joinpath("jobs", "scripts")
52
54
 
55
+ def get_custom_roots() -> list[Path]:
56
+ custom_roots: list[Path] = []
57
+ if DEFAULTS_PATH.is_file():
58
+ from configparser import ConfigParser
59
+ config = ConfigParser()
60
+ config.read(DEFAULTS_PATH)
61
+ if config.has_section("general") and config.has_option("general", "scripts"):
62
+ custom_dirs = config.get("general", "scripts").split(",")
63
+ for custom_dir in custom_dirs:
64
+ custom_path = Path(custom_dir.strip()).expanduser().resolve()
65
+ if custom_path.is_dir():
66
+ custom_roots.append(custom_path)
67
+ return custom_roots
68
+
53
69
  roots: list[Path] = []
54
70
  match where:
55
71
  case "all" | "a":
56
- roots = [private_root, public_root, library_root]
72
+ roots = [private_root, public_root, library_root] + get_custom_roots()
57
73
  case "private" | "p":
58
74
  roots = [private_root]
59
75
  case "public" | "b":
@@ -62,42 +78,37 @@ def run_py_script(name: Annotated[str, typer.Argument(help="Name of script to ru
62
78
  roots = [library_root]
63
79
  case "dynamic" | "d":
64
80
  roots = []
81
+ case "custom" | "c":
82
+ roots = get_custom_roots()
65
83
 
66
84
  suffixes: list[str]
67
- import platform
68
- if platform.system() == "Windows":
69
- suffixes = [".py", ".bat", ".cmd", ".ps1"]
70
- elif platform.system() == "Darwin" or platform.system() == "Linux":
71
- suffixes = [".py", ".sh"]
85
+ if "." in name:
86
+ suffixes = [""]
72
87
  else:
73
- suffixes = [".py"]
88
+ import platform
89
+ if platform.system() == "Windows":
90
+ suffixes = [".py", ".bat", ".cmd", ".ps1"]
91
+ elif platform.system() == "Darwin" or platform.system() == "Linux":
92
+ suffixes = [""] # files without suffix could be shell scripts, and that already cover files with .sh suffix without duplications
93
+ else:
94
+ suffixes = [".py"]
74
95
 
75
96
  # Finding target file
76
97
  target_file: Optional[Path] = None
77
98
  potential_matches: list[Path] = []
78
99
  for a_root in roots:
79
100
  for a_suffix in suffixes:
80
- candidates = [a_root.joinpath(name), a_root.joinpath(f"{name}{a_suffix}")]
81
- for result in candidates:
82
- if result.exists() and result.is_file():
83
- target_file = result
84
- break
85
- candidates = [a_file for a_file in a_root.rglob(f"*{name}{a_suffix}") if a_file.is_file()]
86
- if name != "":
87
- candidates += [a_file for a_file in a_root.rglob(f"*{name}*") if a_file.is_file()]
88
- # print(candidates)
89
- if len(candidates) == 1 and candidates[0].stem == name.split(".")[0]: # perfect match with name at least.
90
- target_file = candidates[0]
91
- else:
92
- potential_matches += candidates
93
- # print(target_file)
94
-
95
- if target_file is None and where in ["all", "dynamic"] and not interactive:
101
+ if a_root.joinpath(f"{name}{a_suffix}").is_file():
102
+ target_file = a_root.joinpath(f"{name}{a_suffix}")
103
+ break # perfect match
104
+ potential_matches += [a_file for a_file in a_root.rglob(f"*{name}*{a_suffix}") if a_file.is_file()]
105
+
106
+ if target_file is None and where in ["dynamic", "d"] and not interactive:
96
107
  # src/machineconfig/jobs/scripts/python_scripts/a.py
97
108
  if "." in name:
98
109
  resolved_names: list[str] = [name]
99
110
  else:
100
- resolved_names = [f"{name}{a_suffix}" for a_suffix in suffixes]
111
+ resolved_names = [f"{name}{a_suffix}" for a_suffix in [".py", ".sh", "", ".ps1", ".bat", ".cmd"]]
101
112
  for a_resolved_name in resolved_names:
102
113
  try:
103
114
  url = f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/jobs/scripts_dynamic/{a_resolved_name}"""
@@ -115,9 +126,11 @@ def run_py_script(name: Annotated[str, typer.Argument(help="Name of script to ru
115
126
  pass
116
127
 
117
128
  if target_file is None:
118
- print(f"❌ ERROR: Could not find script '{name}.py'. Checked {len(potential_matches)} candidate files, trying interactively:")
129
+ print(f"Warning: Could not find script '{name}'. Checked {len(potential_matches)} candidate files, trying interactively:")
119
130
  from machineconfig.utils.options import choose_from_options
120
- options = ["/".join(p.parts[-3:]) for p in potential_matches]
131
+ # options = ["/".join(p.parts[-3:]) for p in potential_matches]
132
+
133
+ options = potential_matches
121
134
  chosen_file_part = choose_from_options(options, multi=False, msg="Select the script to run:", tv=True)
122
135
  for an_option, a_path in zip(options, potential_matches):
123
136
  if chosen_file_part == an_option:
@@ -128,13 +141,12 @@ def run_py_script(name: Annotated[str, typer.Argument(help="Name of script to ru
128
141
 
129
142
  print(f"✅ Found script at: {target_file}")
130
143
  if target_file.suffix == ".py":
131
- from machineconfig.utils.code import get_uv_command_executing_python_script, exit_then_run_shell_script
132
- script_content = target_file.read_text(encoding="utf-8")
133
- shell_script, _shell_script_path = get_uv_command_executing_python_script(python_script=script_content, uv_project_dir=None, uv_with=None, prepend_print=False)
144
+ from machineconfig.utils.code import get_uv_command_executing_python_file, exit_then_run_shell_script
145
+ shell_script = get_uv_command_executing_python_file(python_file=str(target_file), uv_project_dir=None, uv_with=None, prepend_print=False)
134
146
  exit_then_run_shell_script(script=shell_script)
135
147
  else:
136
- from machineconfig.utils.code import run_shell_script
137
- run_shell_script(target_file.read_text(encoding="utf-8"))
148
+ from machineconfig.utils.code import run_shell_file
149
+ run_shell_file(script_path=str(target_file), clean_env=False)
138
150
 
139
151
 
140
152
  def copy_script_to_local(name: Annotated[str, typer.Argument(help="Name of the temporary python script to copy, e.g., 'a' for a.py")],
@@ -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>=8.12"]
108
+ uv_with = ["machineconfig>=8.14"]
109
109
  uv_project_dir = None
110
110
 
111
111
  import tempfile
@@ -18,7 +18,7 @@ def tui_env(which: Annotated[Literal["PATH", "p", "ENV", "e"], typer.Argument(he
18
18
  uv_with = ["textual"]
19
19
  uv_project_dir = None
20
20
  if not Path.home().joinpath("code/machineconfig").exists():
21
- uv_with.append("machineconfig>=8.12")
21
+ uv_with.append("machineconfig>=8.14")
22
22
  else:
23
23
  uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
24
24
  run_shell_script(
@@ -147,10 +147,10 @@ class MachineSpecs(TypedDict):
147
147
  def get_machine_specs() -> MachineSpecs:
148
148
  """Write print and return the local machine specs."""
149
149
  import platform
150
- from machineconfig.utils.code import get_uv_run_command
150
+ from machineconfig.utils.code import get_uv_command
151
151
 
152
- uv_run_cmd = get_uv_run_command(platform=platform.system()) # type: ignore
153
- command = f"""{uv_run_cmd} --with distro python -c "import distro; print(distro.name(pretty=True))" """
152
+ uv_cmd = get_uv_command(platform=platform.system()) # type: ignore
153
+ command = f"""{uv_cmd} run --with distro python -c "import distro; print(distro.name(pretty=True))" """
154
154
  import subprocess
155
155
  from pathlib import Path
156
156
  import socket
@@ -12,7 +12,6 @@ for better user experience with checkbox selections.
12
12
  # $res = ls
13
13
  # $name = $res[0].Name
14
14
  # mv $backup_folder $name
15
- #
16
15
 
17
16
 
18
17
  """
@@ -71,6 +70,14 @@ def display_dotfiles_instructions() -> None:
71
70
  header_text = Text("DOTFILES MIGRATION", style="bold yellow")
72
71
  subtitle_text = Text("Configuration transfer options", style="italic yellow")
73
72
  instructions = """
73
+ On remote, run:
74
+ rm ~/dotfiles.zip || true
75
+ ouch c ~/dotfiles dotfiles.zip
76
+ uvx wormhole-magic send ~/dotfiles.zip
77
+ On new machine, run:
78
+ cd $HOME; uvx wormhole-magic receive dotfiles.zip --accept-file
79
+ ouch d ~/dotfiles.zip
80
+
74
81
  🖱️ [bold blue]Method 1: USING MOUSE WITHOUT KB OR BROWSER SHARE[/bold blue]
75
82
  On original machine, run:
76
83
  [dim]cd ~/dotfiles/creds/msc
@@ -85,8 +92,9 @@ def display_dotfiles_instructions() -> None:
85
92
 
86
93
  ☁️ [bold blue]Method 3: USING INTERNET SECURE SHARE[/bold blue]
87
94
  [dim]cd ~
88
- cloud_copy SHARE_URL . --config ss[/dim]
89
- (requires symlinks to be created first)"""
95
+ cloud copy SHARE_URL . --config ss[/dim]
96
+ (requires symlinks to be created first)
97
+ """
90
98
  console.print(Panel(f"📂 {header_text}\n{subtitle_text}\n\n{instructions}", border_style="yellow", padding=(1, 2)))
91
99
 
92
100
 
@@ -122,7 +130,7 @@ def execute_installations(selected_options: list[str]) -> None:
122
130
  if "install_machineconfig" in selected_options:
123
131
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
124
132
  from machineconfig.scripts.python.helpers_devops.cli_self import install
125
- install()
133
+ install(copy_assets=True, dev=False)
126
134
 
127
135
  if "install_ssh_server" in selected_options:
128
136
  console.print(Panel("🔒 [bold red]SSH SERVER[/bold red]\n[italic]Remote access setup[/italic]", border_style="red"))
@@ -155,7 +163,7 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
155
163
  if "retrieve_repositories" in selected_options:
156
164
  console.print(Panel("📚 [bold bright_magenta]REPOSITORIES[/bold bright_magenta]\n[italic]Project code retrieval[/italic]", border_style="bright_magenta"))
157
165
  from machineconfig.scripts.python.helpers_devops import cli_repos
158
- cli_repos.clone(directory=str(Path.home() / "code"), cloud="odg1")
166
+ cli_repos.clone(directory=str(Path.home() / "code"), cloud=None)
159
167
 
160
168
  if "retrieve_data" in selected_options:
161
169
  console.print(Panel("💾 [bold bright_cyan]DATA RETRIEVAL[/bold bright_cyan]\n[italic]Backup restoration[/italic]", border_style="bright_cyan"))
@@ -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.12" devops'
6
- alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" cloud'
7
- alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" agents'
8
- alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" sessions'
9
- alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" ftpx'
10
- alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" fire'
11
- alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" croshell'
12
- alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" utils'
13
- alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" terminal'
14
- alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.12" msearch'
5
+ alias devops='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" devops'
6
+ alias cloud='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" cloud'
7
+ alias agents='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" agents'
8
+ alias sessions='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" sessions'
9
+ alias ftpx='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" ftpx'
10
+ alias fire='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" fire'
11
+ alias croshell='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" croshell'
12
+ alias utils='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" utils'
13
+ alias terminal='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" terminal'
14
+ alias msearch='$HOME/.local/bin/uvx --python 3.14 --from "machineconfig>=8.14" 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>=8.12" devops $args }
7
- function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" cloud $args }
8
- function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" agents $args }
9
- function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" sessions $args }
10
- function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" ftpx $args }
11
- function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" fire $args }
12
- function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" croshell $args }
13
- function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" utils $args }
14
- function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" terminal $args }
15
- function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.12" msearch $args }
6
+ function devops { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" devops $args }
7
+ function cloud { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" cloud $args }
8
+ function agents { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" agents $args }
9
+ function sessions { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" sessions $args }
10
+ function ftpx { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" ftpx $args }
11
+ function fire { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" fire $args }
12
+ function croshell { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" croshell $args }
13
+ function utils { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" utils $args }
14
+ function terminal { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" terminal $args }
15
+ function msearch { & "$HOME\.local\bin\uvx.exe" --python 3.14 --from "machineconfig>=8.14" msearch $args }
16
16
 
17
17
  function d { wrap_in_shell_script devops @args }
18
18
  function c { wrap_in_shell_script cloud @args }
@@ -4,15 +4,15 @@ from machineconfig.utils.accessories import randstr
4
4
  from pathlib import Path
5
5
 
6
6
 
7
- def get_uv_run_command(platform: str) -> str:
7
+ def get_uv_command(platform: str) -> str:
8
8
  res = cast(Literal["Windows", "windows", "nt", "Linux", "linux", "Darwin", "darwin", "macos"], platform)
9
9
  match res:
10
10
  case "Windows" | "windows" | "nt":
11
- return """& "$env:USERPROFILE/.local/bin/uv" run"""
11
+ return """& "$env:USERPROFILE/.local/bin/uv" """
12
12
  case "Linux" | "linux" | "Darwin" | "darwin" | "macos":
13
- return """$HOME/.local/bin/uv run"""
13
+ return """$HOME/.local/bin/uv """
14
14
  case _:
15
- return """$HOME/.local/bin/uv run"""
15
+ return """$HOME/.local/bin/uv """
16
16
 
17
17
  def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
18
18
  import platform
@@ -35,19 +35,8 @@ def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
35
35
  print(f"--- End of {desc} ---")
36
36
 
37
37
 
38
- def get_uv_command_executing_python_script(python_script: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str],
39
- prepend_print: bool = True) -> tuple[str, Path]:
40
- # python file
41
- python_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", randstr() + ".py")
42
- python_file.parent.mkdir(parents=True, exist_ok=True)
43
- if prepend_print:
44
- from machineconfig.utils.meta import lambda_to_python_script
45
- print_code_string = lambda_to_python_script(lambda: print_code(code=python_script, lexer="python", desc="Temporary Python Script", subtitle="Executing via shell script"),
46
- in_global=True, import_module=False)
47
- python_file.write_text(print_code_string + "\n" + python_script, encoding="utf-8")
48
- else:
49
- python_file.write_text(python_script, encoding="utf-8")
50
-
38
+ def get_uv_command_executing_python_file(python_file: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str],
39
+ prepend_print: bool = True, ) -> str:
51
40
  # shell script
52
41
  if uv_with is not None and len(uv_with) > 0:
53
42
  if prepend_print: uv_with.append("rich")
@@ -62,9 +51,24 @@ def get_uv_command_executing_python_script(python_script: str, uv_with: Optional
62
51
  else:
63
52
  uv_project_dir_arg = ""
64
53
  import platform
65
- uv_run = get_uv_run_command(platform=platform.system())
66
- shell_script = f"""{uv_run} {uv_with_arg} {uv_project_dir_arg} {str(python_file)} """
67
54
 
55
+ uv_command = get_uv_command(platform=platform.system())
56
+ shell_script = f"""{uv_command} run {uv_with_arg} {uv_project_dir_arg} {str(python_file)} """
57
+ return shell_script
58
+
59
+
60
+ def get_uv_command_executing_python_script(python_script: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str],
61
+ prepend_print: bool = True, ) -> tuple[str, Path]:
62
+ python_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", randstr() + ".py")
63
+ python_file.parent.mkdir(parents=True, exist_ok=True)
64
+ if prepend_print:
65
+ from machineconfig.utils.meta import lambda_to_python_script
66
+ print_code_string = lambda_to_python_script(lambda: print_code(code=python_script, lexer="python", desc="Temporary Python Script", subtitle="Executing via shell script"),
67
+ in_global=True, import_module=False)
68
+ python_file.write_text(print_code_string + "\n" + python_script, encoding="utf-8")
69
+ else:
70
+ python_file.write_text(python_script, encoding="utf-8")
71
+ shell_script = get_uv_command_executing_python_file(python_file=str(python_file), uv_with=uv_with, uv_project_dir=uv_project_dir, prepend_print=prepend_print)
68
72
  return shell_script, python_file
69
73
 
70
74
 
@@ -95,35 +99,44 @@ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
95
99
  exit_then_run_shell_script(fire_line)
96
100
 
97
101
 
98
- def run_shell_script(script: str, display_script: bool = True, clean_env: bool = False):
99
- import tempfile
102
+ def run_shell_file(script_path: str, clean_env: bool):
100
103
  import platform
101
- from rich.console import Console
102
- from rich.panel import Panel
103
- from rich.syntax import Syntax
104
+ env = {} if clean_env else None
105
+ if platform.system() == "Windows":
106
+ import subprocess
107
+ proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{script_path}"', check=True, shell=True, env=env)
108
+ elif platform.system() == "Linux" or platform.system() == "Darwin":
109
+ import subprocess
110
+ proc = subprocess.run(f"bash {str(script_path)}", check=True, shell=True, env=env)
111
+ else:
112
+ raise NotImplementedError(f"Platform {platform.system()} not supported.")
113
+ return proc
114
+
115
+
116
+ def run_shell_script(script: str, display_script: bool = True, clean_env: bool = False) -> Any:
104
117
 
118
+ import platform
105
119
  if platform.system() == "Windows":
106
120
  suffix = ".ps1"
107
121
  lexer = "powershell"
108
122
  else:
109
123
  suffix = ".sh"
110
124
  lexer = "bash"
125
+
126
+ import tempfile
111
127
  with tempfile.NamedTemporaryFile(mode='w', suffix=suffix, delete=False, encoding='utf-8') as temp_file:
112
128
  temp_file.write(script)
113
129
  temp_shell_script_path = Path(temp_file.name)
130
+
131
+ from rich.panel import Panel
132
+ from rich.syntax import Syntax
133
+ from rich.console import Console
114
134
  console = Console()
115
135
  if display_script:
116
136
  from rich.syntax import Syntax
117
137
  console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 shell script @ {temp_shell_script_path}", subtitle="shell script being executed"), style="bold red")
118
- env = {} if clean_env else None
119
- if platform.system() == "Windows":
120
- import subprocess
121
- proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_shell_script_path}"', check=True, shell=True, env=env)
122
- elif platform.system() == "Linux" or platform.system() == "Darwin":
123
- import subprocess
124
- proc = subprocess.run(f"bash {str(temp_shell_script_path)}", check=True, shell=True, env=env)
125
- else:
126
- raise NotImplementedError(f"Platform {platform.system()} not supported.")
138
+
139
+ proc = run_shell_file(script_path=str(temp_shell_script_path), clean_env=clean_env)
127
140
  # console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_script_path}[/blue]")
128
141
  if proc.returncode != 0:
129
142
  console.print(f"❌ [red]Script execution failed with return code {proc.returncode}:[/red] [blue]{temp_shell_script_path}[/blue]")
@@ -131,6 +144,7 @@ def run_shell_script(script: str, display_script: bool = True, clean_env: bool =
131
144
  console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_shell_script_path}[/blue]")
132
145
  else:
133
146
  console.print(f"⚠️ [yellow]Script executed with warnings (return code {proc.returncode}):[/yellow] [blue]{temp_shell_script_path}[/blue]")
147
+
134
148
  temp_shell_script_path.unlink(missing_ok=True)
135
149
  console.print(f"🗑️ [blue]Temporary script deleted:[/blue] [green]{temp_shell_script_path}[/green]")
136
150
  return proc
@@ -35,7 +35,7 @@ def choose_from_options[T](options: Iterable[T], msg: str, multi: bool, custom_i
35
35
  # the interactive session completes. Do not capture_output or redirect
36
36
  # stdin/stderr here so `tv` stays attached to the terminal.
37
37
  tv_out_path = options_txt_path.with_name(options_txt_path.stem + "_out.txt")
38
- tv_cmd = f"""cat {options_txt_path} | tv --ansi true --source-output "{{strip_ansi}}" > {tv_out_path}"""
38
+ tv_cmd = f"""cat {options_txt_path} | tv --preview-command "bat -n --color=always '{{}}'" --preview-size 30 --ansi true --source-output "{{strip_ansi}}" > {tv_out_path} """
39
39
  res = subprocess.run(tv_cmd, shell=True)
40
40
 
41
41
  # If tv returned a non-zero code and there is no output file, treat it as an error.
@@ -3,7 +3,7 @@ import os
3
3
  from pathlib import Path
4
4
  import platform
5
5
  from machineconfig.scripts.python.helpers_utils.python import MachineSpecs
6
- from machineconfig.utils.code import get_uv_run_command
6
+ from machineconfig.utils.code import get_uv_command
7
7
  import rich.console
8
8
  from machineconfig.utils.terminal import Response
9
9
  from machineconfig.utils.accessories import pprint, randstr
@@ -273,12 +273,12 @@ class SSH:
273
273
  with_clause += ""
274
274
  match on:
275
275
  case "local":
276
- uv_run_cmd = get_uv_run_command(platform=self.local_specs["system"])
276
+ uv_cmd = get_uv_command(platform=self.local_specs["system"])
277
277
  case "remote":
278
- uv_run_cmd = get_uv_run_command(platform=self.remote_specs["system"])
278
+ uv_cmd = get_uv_command(platform=self.remote_specs["system"])
279
279
  case _:
280
280
  raise ValueError(f"Invalid value for 'on': {on}. Must be 'local' or 'remote'")
281
- uv_cmd = f"""{uv_run_cmd} {with_clause} python {py_path.relative_to(Path.home())}"""
281
+ uv_cmd = f"""{uv_cmd} run {with_clause} python {py_path.relative_to(Path.home())}"""
282
282
  return uv_cmd
283
283
 
284
284
  def run_py_remotely(
@@ -1,5 +1,5 @@
1
1
 
2
2
 
3
- MACHINECONFIG_VERSION = "machineconfig>=8.12"
3
+ MACHINECONFIG_VERSION = "machineconfig>=8.14"
4
4
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
5
5
 
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
  from machineconfig.utils.accessories import randstr
6
6
  from machineconfig.utils.meta import lambda_to_python_script
7
7
  from machineconfig.utils.ssh_utils.abc import DEFAULT_PICKLE_SUBDIR
8
- from machineconfig.utils.code import get_uv_run_command
8
+ from machineconfig.utils.code import get_uv_command
9
9
 
10
10
 
11
11
  def copy_from_here(
@@ -96,7 +96,7 @@ def copy_from_here(
96
96
  remote_tmp_py = tmp_py_file.relative_to(Path.home()).as_posix()
97
97
  self.copy_from_here(source_path=str(tmp_py_file), target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=True)
98
98
  self.run_shell_cmd_on_remote(
99
- command=f"""{get_uv_run_command(platform=self.remote_specs['system'])} python {remote_tmp_py}""",
99
+ command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {remote_tmp_py}""",
100
100
  verbose_output=False,
101
101
  description=f"UNZIPPING {target_rel2home}",
102
102
  strict_stderr=True,
@@ -3,7 +3,7 @@ from pathlib import Path
3
3
  from machineconfig.utils.accessories import randstr
4
4
  from machineconfig.utils.meta import lambda_to_python_script
5
5
  from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION, DEFAULT_PICKLE_SUBDIR
6
- from machineconfig.utils.code import get_uv_run_command
6
+ from machineconfig.utils.code import get_uv_command
7
7
  from typing import Union
8
8
 
9
9
 
@@ -36,7 +36,7 @@ def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_ex
36
36
  tmp_remote_path = ".tmp_pyfile.py"
37
37
  self.sftp.put(localpath=str(tmp_py_file), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(tmp_remote_path)))
38
38
  resp = self.run_shell_cmd_on_remote(
39
- command=f"""{get_uv_run_command(platform=self.remote_specs['system'])} python {tmp_remote_path}""",
39
+ command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {tmp_remote_path}""",
40
40
  verbose_output=False,
41
41
  description=f"Creating target dir {path_rel2home}",
42
42
  strict_stderr=True,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 8.12
3
+ Version: 8.14
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -89,7 +89,6 @@ machineconfig/jobs/installer/python_scripts/winget.py,sha256=hxid9fWGLiTsqVqAFxM
89
89
  machineconfig/jobs/installer/python_scripts/yazi.py,sha256=HyFIqQ5i5oeHzruQ3Ymrt6NB670n-2AQGwFiZkLbOjs,4331
90
90
  machineconfig/jobs/scripts/bash_scripts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJCtkSfBOftt0aFyDZq_eMs,68
91
91
  machineconfig/jobs/scripts/bash_scripts/lid.sh,sha256=nUw870lc5p8GA8KT3JI29ob2wKSVKzCvOHIxEjoSTOA,864
92
- machineconfig/jobs/scripts/bash_scripts/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
93
92
  machineconfig/jobs/scripts/bash_scripts/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
94
93
  machineconfig/jobs/scripts/bash_scripts/mount_nfs,sha256=bgP0NmplFZowg48J0KMkUSqteHYGB2PNmhAYvtPJhHk,1756
95
94
  machineconfig/jobs/scripts/bash_scripts/mount_nw_drive,sha256=BqjGBCbwe5ZAsZDO3L0zHhh_gJfZy1CYOcqXA4Y-WkQ,2262
@@ -102,7 +101,7 @@ machineconfig/jobs/scripts/powershell_scripts/docker.ps1,sha256=M8NfsSxH8YlmY92J
102
101
  machineconfig/jobs/scripts/powershell_scripts/mount_nfs.ps1,sha256=XrAdzpxE6a4OccSmWJ7YWHJTnsZK8uXnFE5j9GOPA20,2026
103
102
  machineconfig/jobs/scripts/powershell_scripts/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
104
103
  machineconfig/jobs/scripts/powershell_scripts/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
105
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1,sha256=EI3mYJx7kL-YQY-emYiXA4j4ZvUof_CfhfOyzSkizgU,490
104
+ machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1,sha256=10lTsDiCY6uGrBiZ1844NTJ_jKtqtezOZTlMBG6A6mU,490
106
105
  machineconfig/jobs/scripts/powershell_scripts/obs.ps1,sha256=3SNCjvkaaWMaN6JJAHDMvbvOIHw_zaXF74KalRimnE4,114
107
106
  machineconfig/jobs/scripts/powershell_scripts/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhmNpuM0hgXTQgVJmIRR_7sdcY,182
108
107
  machineconfig/jobs/scripts/powershell_scripts/share_cloud.cmd,sha256=exD7JCdxw2LqVjw2MKCYHbVZlEqmelXtwnATng-dhJ4,1028
@@ -128,12 +127,12 @@ machineconfig/scripts/nu/wrap_mcfg.nu,sha256=9heiUHVkHjI_AMXT5QJJixk7ZK_hJNV_A8l
128
127
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
128
  machineconfig/scripts/python/agents.py,sha256=n8Z40QeRFjuYnmF_4ayL3pVOP5vpAYKMG0ZLy0XflhI,12070
130
129
  machineconfig/scripts/python/cloud.py,sha256=BddtWa8Rg5AF2U22ha4pQ4IvcrKvfeDrmnI3hb0D4Pk,1415
131
- machineconfig/scripts/python/croshell.py,sha256=WufbJ_xals_8LAvNc1xw7VeHRDigYU_JY3zZAb6eMqg,8455
130
+ machineconfig/scripts/python/croshell.py,sha256=ToGdGc5766SV9F_FknvqodFY5L9iTAi3GJk9Z9QMmro,8471
132
131
  machineconfig/scripts/python/devops.py,sha256=vngpKJnRS9Gj3FLeHn4ShTEhZWnUXkiUiTmBdNsK54A,3100
133
132
  machineconfig/scripts/python/devops_navigator.py,sha256=UeqkY9_c22Ce9b1ksFGq-lNwaGCMMHL1LikPhP-QDt8,154
134
133
  machineconfig/scripts/python/fire_jobs.py,sha256=CLGoLBLJXOc1EPK_-w0BPYC2WZsvEvR1on__a8ZxkJ0,14215
135
134
  machineconfig/scripts/python/ftpx.py,sha256=WPRq1HSDcYPCbF9T-pgdepIDj_5Q4fhz4h0Vf_GeXG8,11181
136
- machineconfig/scripts/python/interactive.py,sha256=5DqylL5oMShL8G31Ba1EbKHFsUz9vs8I0gKo8U3Gt_M,11536
135
+ machineconfig/scripts/python/interactive.py,sha256=fmr3gp-KsjUU7Uh0xnKfs0FccGjqEyL_LnznhZvsENg,11814
137
136
  machineconfig/scripts/python/mcfg_entry.py,sha256=PE23iE4NdSOTjFqHzRA6yu48XeZTZM9vgxhk8BAON-g,2797
138
137
  machineconfig/scripts/python/msearch.py,sha256=EXM2U5WgngwJhLx0RPKYnoZ7hxeQZ12pcI3lsHUVR9E,3646
139
138
  machineconfig/scripts/python/sessions.py,sha256=kDopndSXi-wk3nGipNtf9S655FP9JvAEnz8uRk7kuaM,12797
@@ -172,9 +171,9 @@ machineconfig/scripts/python/ai/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
172
171
  machineconfig/scripts/python/ai/utils/generate_files.py,sha256=gx39nVkmZZskR4FZRUtgUiHR2Pzej_yfvF_CjCHK1fI,14520
173
172
  machineconfig/scripts/python/ai/utils/vscode_tasks.py,sha256=OF8q4oKu53lJy8u36h3alHx3XmMhqHaaXZ-T5nr7b18,1481
174
173
  machineconfig/scripts/python/env_manager/__init__.py,sha256=E4LAHbU1wo2dLjE36ntv8U7QNTe8TasujUAYK9SLvWk,6
175
- machineconfig/scripts/python/env_manager/env_manager_tui.py,sha256=nqaN3Q7u53tdlQP9VskdJQIO2s56HUoy5AVk_Budb3k,7055
174
+ machineconfig/scripts/python/env_manager/env_manager_tui.py,sha256=eqgRiFMAS8KmpkRudSIP72pRXbi0zPS7XkQvg6aTIXI,7055
176
175
  machineconfig/scripts/python/env_manager/path_manager_backend.py,sha256=ZVGlGJALhg7zNABDdwXxL7MFbL2BXPebObipXSLGbic,1552
177
- machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=aljd_Zn3H_uUSihTkgWpQCLOkmEeMofM2MDQ62KRmrI,6932
176
+ machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=pi3eoez_wkeqbmaRQKU4dviZqKs93aDDtTkOwrPeLy0,6932
178
177
  machineconfig/scripts/python/helpers/ast_search.py,sha256=-BFLZfJpYyj2CjUVrRigWf6xdfdorBfScJ33S2j9O2I,2515
179
178
  machineconfig/scripts/python/helpers/qr_code.py,sha256=DLZwRI9j8g6qV6XngHEoiStqVYKmXhPjuA_sSTgvf88,5150
180
179
  machineconfig/scripts/python/helpers/repo_rag.py,sha256=WxSLC99SBpnbUyIQjKiuraGgFk0qGzQ1dC9zSUc88hc,13702
@@ -218,15 +217,15 @@ machineconfig/scripts/python/helpers_devops/cli_config.py,sha256=zli4KuUqFFkVjEX
218
217
  machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py,sha256=KFIBpAaBtRn-nP1ILXZmyGlgCi4olKRohoF-HdHORaQ,4034
219
218
  machineconfig/scripts/python/helpers_devops/cli_data.py,sha256=79Xvx7YnbueruEnl69hrDg2AhVxf_zCUdlVcKfeMGyQ,1774
220
219
  machineconfig/scripts/python/helpers_devops/cli_nw.py,sha256=1R7xxP4wO7wZUvIzjrbzwx4Fe8_UsVCY68xAxnXaYbI,11510
221
- machineconfig/scripts/python/helpers_devops/cli_repos.py,sha256=5PPYndihw29hnq-Uyp88j4NBGlfSAFKAe265-ohF8zE,13925
222
- machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=HkAw5Vtf5BZHqHYauGYuqec_oqIRFz9koRdTVElxr74,8917
220
+ machineconfig/scripts/python/helpers_devops/cli_repos.py,sha256=5Sy-lc8gzdik1rgM2RQpeMRKTu46DfoCaE1RrlM-Htg,13925
221
+ machineconfig/scripts/python/helpers_devops/cli_self.py,sha256=gznbz6DPDMUQQWh2E4NERav5NVqVtc3p185RlbpOFBU,9431
223
222
  machineconfig/scripts/python/helpers_devops/cli_share_file.py,sha256=dYZPSI39iDUH69dRYszLIun7Wfn5lCG7stc70YX5Ni8,6417
224
223
  machineconfig/scripts/python/helpers_devops/cli_share_server.py,sha256=FzMEUvZXGLMkndcvox_RiVkUKAPj9ElHKORa8iJcNCE,6506
225
224
  machineconfig/scripts/python/helpers_devops/cli_share_terminal.py,sha256=5G0-qtqcnbVEpKPvHl1mzp-3uEx9fww3CRrpGv1T-f8,6169
226
225
  machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py,sha256=Tyfz5S1QfY_nOhg-ROTp9eILNqYx_i1ootth34frbv0,5540
227
226
  machineconfig/scripts/python/helpers_devops/devops_status.py,sha256=4CXWhuD0h_0VGQLKCNUxVl7pZBboq9jrgZazit1LbWs,20314
228
227
  machineconfig/scripts/python/helpers_devops/devops_update_repos.py,sha256=kSln8_-Wn7Qu0NaKdt-QTN_bBVyTIAWHH8xVYKK-vCM,10133
229
- machineconfig/scripts/python/helpers_devops/run_script.py,sha256=HSNgFQc0oeNwpSMS70qKj0GNSp4QoJQM-qp3slR2Tz0,7994
228
+ machineconfig/scripts/python/helpers_devops/run_script.py,sha256=6PJSMdUFm1p7egPD2I3A9nVrjkgqk3tgBg5EMSLaeSM,8590
230
229
  machineconfig/scripts/python/helpers_devops/themes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
230
  machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1,sha256=58gFOeynADHLTdk8zqEnndBtyNGrln0jvpo76O0UWTw,3136
232
231
  machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
@@ -264,7 +263,7 @@ machineconfig/scripts/python/helpers_network/wifi_conn.py,sha256=wnSs16kHwhELS7w
264
263
  machineconfig/scripts/python/helpers_repos/action.py,sha256=8je051kpGZ7A_GRsQyWKhPZ8xVW7tSm4bnPu6VjxaXk,9755
265
264
  machineconfig/scripts/python/helpers_repos/action_helper.py,sha256=XRCtkGkNrxauqUd9qkxtfJt02Mx2gejSYDLL0jyWn24,6176
266
265
  machineconfig/scripts/python/helpers_repos/clone.py,sha256=9RZgs2OD2RUH6UiZKCuUvRyweDBomAm2lDG2qJmhry0,5436
267
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=5PPkJVEGAsUMksezdpb2Frm4fHTEiGw-7_eWl20PIk4,11689
266
+ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=gI5WlSdNbl6yhfBVhUNA9j66JK8E-S5m23-bPtcTc7A,11689
268
267
  machineconfig/scripts/python/helpers_repos/entrypoint.py,sha256=eAM-7trZCPTeep0iTU3_HNqCkF0pYKqMMXNq3vLBsP8,2898
269
268
  machineconfig/scripts/python/helpers_repos/grource.py,sha256=lHxyfsIQr4pbu71Ekqu-9nohR7LXbN2wufw7LPTyOgM,14639
270
269
  machineconfig/scripts/python/helpers_repos/record.py,sha256=1PycYcW7VA-9n9iv1TJXub7qNIQ6I6Z9dEnvbdDm4TU,11099
@@ -276,7 +275,7 @@ machineconfig/scripts/python/helpers_sessions/__init__.py,sha256=47DEQpj8HBSa-_T
276
275
  machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py,sha256=umimrBrLjGimfZzRlvxHgKdld5S-bRrFZTAk6OOZqq0,3221
277
276
  machineconfig/scripts/python/helpers_utils/download.py,sha256=Yjooy8vwDJpqXAb-J47C8rPSazIEGUPVRR089TrW7iA,6730
278
277
  machineconfig/scripts/python/helpers_utils/pdf.py,sha256=RHYuEJn_xUMj8jMDx0Gi0Xr1yjA_7BLnStGU4N1qV7M,5003
279
- machineconfig/scripts/python/helpers_utils/python.py,sha256=eIVpmtNFI3oI07SXG_tzmz1GPLl7TQkN-6JKlGyzA_4,7153
278
+ machineconfig/scripts/python/helpers_utils/python.py,sha256=1VH6pLEaaOhVbMgfTf2gu8LfbifPq6VCCrFmV0q_kDQ,7141
280
279
  machineconfig/scripts/windows/wrap_mcfg.ps1,sha256=S6WuBYXdm4roQc1YPjSgWBmDFOgWD9hrRw6HHbHfpbE,2174
281
280
  machineconfig/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
281
  machineconfig/settings/broot/br.sh,sha256=7CCJflIAirkiuo1suDCT8BzhVzDdJWEfbAxNDG4VPSI,1455
@@ -433,7 +432,7 @@ machineconfig/setup_linux/__init__.py,sha256=-OGRER8JTu_qhXBHQl0noB6vkVW_y2JA8Bl
433
432
  machineconfig/setup_linux/apps_desktop.sh,sha256=l1jvwK-0zxlcpn7ia7PMWmBr3OddKBmzkpUXwGl5czg,2769
434
433
  machineconfig/setup_linux/apps_gui.sh,sha256=lFPYq7H2bRogPwW6QoEuSr9GnTjHS-jRM_eYg2rjOmM,2301
435
434
  machineconfig/setup_linux/uv.sh,sha256=cyegPmMMB7B3OnVx9KxZiU1JQU3Z_oqboUgwzmW2W40,487
436
- machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=iuAjETHTmxySVXQv76jtUH_J4TIHmh930Uv2EzN6k2Y,1605
435
+ machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=fC_yF3E4TuuaeJdpXbfS7veG6ZTYw0kRDXXeRC8VIeE,1605
437
436
  machineconfig/setup_linux/web_shortcuts/live_from_github.sh,sha256=-zDKAzop3P9-XJ9qaRXCfkpcGHKykrTpzsXa6VPTsmQ,1159
438
437
  machineconfig/setup_mac/__init__.py,sha256=PfdhwY4Ss-rfP7b4-9fvKwxCDtNAd-u1JdhFYnE7CwI,518
439
438
  machineconfig/setup_mac/apps_gui.sh,sha256=3alvddg918oMlJB2aUWJWpGGoaq5atlxcaOwhnyXlRI,9517
@@ -443,17 +442,17 @@ machineconfig/setup_windows/__init__.py,sha256=V9kZaO4lrEygI3rxim_Mzq3TAAbG_Ok5G
443
442
  machineconfig/setup_windows/uv.ps1,sha256=6IwoBSyvyeRBvpBRdzfuNNS5uNsVqYJEVlza-hyuxDc,761
444
443
  machineconfig/setup_windows/ssh/add-sshkey.ps1,sha256=qfPdqCpd9KP3VhH4ifsUm1Xvec7c0QVl4Wt8JIAm9HQ,1653
445
444
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=SoE_WDK5bCwcgoHp4nl-kG1a8Q_ldgSNXDIzB0LW_tY,2584
446
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=8nTvX8yVVaaL9ub314odXTwQLhS3r-_YVxvu8uTwiF8,1939
445
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=dZpYzy0AcmhVYXyB70oQgciZ1bA98iJ8aat0ZNHxv9Y,1939
447
446
  machineconfig/setup_windows/web_shortcuts/live_from_github.ps1,sha256=03JtjjEfMxPN5V1-o5R6dvGpRVKLxq4Mx5VhRjPw5Dw,1402
448
447
  machineconfig/setup_windows/web_shortcuts/quick_init.ps1,sha256=zMT67MFwq_J6gc6O1kIV4FSI9UDE2AUiZon3FBs4GOk,652
449
448
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
450
449
  machineconfig/utils/accessories.py,sha256=4nkK6pjir5zV-t_DZiqaQVK7JrTdC6EkEYiMdz_NPcU,4407
451
- machineconfig/utils/code.py,sha256=p6O-TtlY33E2l1muNDBhLXu-Js9_263U4BmJ1RKWwwc,8864
450
+ machineconfig/utils/code.py,sha256=Y0FMyVc_VojT_GSIS_KcHpTFOGMfz3Oaoq3CDVCEnIE,9400
452
451
  machineconfig/utils/io.py,sha256=6kXNd3t6FCHxZzmPOIKTCdXDRnSdHoy4IqcthwBbYGY,6456
453
452
  machineconfig/utils/links.py,sha256=hmPi5Nfi_8mrLy5dVcRnJGQsqQTuuPtlwB-hrPK7tk0,25044
454
453
  machineconfig/utils/meta.py,sha256=CLkBibpumQGQXJvOhsCeUQSU9-BVdapntTMLlV6RGx0,10528
455
454
  machineconfig/utils/notifications.py,sha256=tuXIudcip0tEioG-bm8BbLr3FMDve4f6BktlznBhKxM,9013
456
- machineconfig/utils/options.py,sha256=dh4PDwLMI2E1uCIEmqjxzAqV5g1VPg5-fw2q42eVs4U,8753
455
+ machineconfig/utils/options.py,sha256=BbjeP4yLuNql15R9CFqHlN5NR7t20Tgnbuh4x_Nf5EY,8821
457
456
  machineconfig/utils/options_tv.py,sha256=N_LaNlXkBU0tFQ1HvqYmEgJxJEo3ebRTsMGZjM77UcY,4133
458
457
  machineconfig/utils/path_extended.py,sha256=7WprxKVo855pFGhM41ZFXaYpLqhG66JkyQ6KzgR6Si4,50851
459
458
  machineconfig/utils/path_helper.py,sha256=RVis6gsJ9mEUPdh3tpyM7F2Ow8TruXpI1AoFqWInr7g,10368
@@ -461,7 +460,7 @@ machineconfig/utils/procs.py,sha256=hpavbXmcEZZaDkueqBnEeMLBjAxHMgNxrRJ5kaCEYms,
461
460
  machineconfig/utils/scheduler.py,sha256=En7M9jgzC5PXDPC5Fq0_RtFf2WDg6fFmsyxYTsW-w6c,14099
462
461
  machineconfig/utils/scheduling.py,sha256=vcJgajeJPSWkJNlarYJSmLvasdOuCtBM4druOAB1Nwc,11089
463
462
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
464
- machineconfig/utils/ssh.py,sha256=jVVvOoVt7F54bwmuahXtFnOG-Ten0eW10CvBvACSBJg,17811
463
+ machineconfig/utils/ssh.py,sha256=BFMu2xanCIiHP-IaP3geFAMwYGWwvxRGa2LbTObmDog,17791
465
464
  machineconfig/utils/terminal.py,sha256=7zi33CpnoEHFoopgzgtNtY1hDOCp0kxeFxzmjTmGo4k,4265
466
465
  machineconfig/utils/tst.py,sha256=6u1GI49NdcpxH2BYGAusNfY5q9G_ytCGVzFM5b6HYpM,674
467
466
  machineconfig/utils/upgrade_packages.py,sha256=zu5oswNQBBwfWCE52khCFEMBc99mC3fEorzRNk99ffw,7295
@@ -492,13 +491,13 @@ machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=d3pwhmE-EuHP
492
491
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
493
492
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=IV45Z_ZTw8S4V-wiZ_lpAVsUX6rSSfDCG7qm5Dk4Oog,1977
494
493
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
495
- machineconfig/utils/ssh_utils/abc.py,sha256=gOea3jBdtCX01KLyI1LpSevzhtnTX2zc5pjp1Nmsp84,103
496
- machineconfig/utils/ssh_utils/copy_from_here.py,sha256=rpUMIEzyTQ4fCRdL8u9lwDa32qGeZY5JyyFvqy0g9Do,5428
494
+ machineconfig/utils/ssh_utils/abc.py,sha256=vcbD1_xzaBgy4MQOYEu3q6eKR62HgLCJxOAC34F2sQ8,103
495
+ machineconfig/utils/ssh_utils/copy_from_here.py,sha256=KcajzrFIwBOARWIZc11amuItdbUnc0mKF7XYIkyCBnQ,5424
497
496
  machineconfig/utils/ssh_utils/copy_to_here.py,sha256=ibDivdzzKC7-1sc6JQn4mzreSY8Tbm4etIsAZrbAZv8,13892
498
- machineconfig/utils/ssh_utils/utils.py,sha256=jj9y3Hzwc4NvcmmAkW-9yHrai4Wi4ZMUU0rErMBGFEs,6326
497
+ machineconfig/utils/ssh_utils/utils.py,sha256=O0dslCi2yjs0ToLJKg7O0nTC3e0_HMtdW4ga_GiYZZc,6322
499
498
  machineconfig/utils/ssh_utils/wsl.py,sha256=nSzZnZ7M4d3mfW2z-57OQIwfVpa114bJVOf9tDLheLE,7865
500
- machineconfig-8.12.dist-info/METADATA,sha256=I-rk3ExCYHCmF5RuXFrTTfvfeWI9jBhnQYTH_dhsFmw,6299
501
- machineconfig-8.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
502
- machineconfig-8.12.dist-info/entry_points.txt,sha256=NpkZIzFVsNgyPe5EdUfY7QLuZovfpWxDQ2r2q3xSwvk,638
503
- machineconfig-8.12.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
504
- machineconfig-8.12.dist-info/RECORD,,
499
+ machineconfig-8.14.dist-info/METADATA,sha256=2zd5eD_sEAE5xQFwq7d2edUENrhatRJ6aTZPtWMwsmY,6299
500
+ machineconfig-8.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
501
+ machineconfig-8.14.dist-info/entry_points.txt,sha256=NpkZIzFVsNgyPe5EdUfY7QLuZovfpWxDQ2r2q3xSwvk,638
502
+ machineconfig-8.14.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
503
+ machineconfig-8.14.dist-info/RECORD,,
@@ -1,30 +0,0 @@
1
- #!/bin/bash
2
- # ⌨️ Linux Mint Keyboard Shortcuts Configuration
3
-
4
- # 🚀 Rofi Launcher Shortcut Settings
5
- KEYBINDING_NAME='Launch Rofi'
6
- KEYBINDING_COMMAND='rofi -show drun'
7
- KEYBINDING_BINDING='<Control><Alt>p'
8
- KEYBINDING_PATH='/org/cinnamon/desktop/keybindings/custom-keybindings/custom0/'
9
-
10
- # 🔑 Configure Shortcut
11
- # Set the name
12
- gsettings set org.cinnamon.desktop.keybindings.custom-keybinding:$KEYBINDING_PATH name "$KEYBINDING_NAME"
13
- # Set the command
14
- gsettings set org.cinnamon.desktop.keybindings.custom-keybinding:$KEYBINDING_PATH command "$KEYBINDING_COMMAND"
15
- # Set the binding
16
- gsettings set org.cinnamon.desktop.keybindings.custom-keybinding:$KEYBINDING_PATH binding "['$KEYBINDING_BINDING']"
17
-
18
- # 📋 Update Keybindings List
19
- # Get the current list of custom keybindings
20
- CURRENT_KEYBINDINGS=$(gsettings get org.cinnamon.desktop.keybindings custom-list)
21
-
22
- # 🔄 Add new keybinding if not present
23
- if [[ "$CURRENT_KEYBINDINGS" != *custom0* ]]; then
24
- if [ "$CURRENT_KEYBINDINGS" = "@as []" ]; then
25
- NEW_KEYBINDINGS="['custom0']"
26
- else
27
- NEW_KEYBINDINGS="${CURRENT_KEYBINDINGS%]*}, 'custom0']"
28
- fi
29
- gsettings set org.cinnamon.desktop.keybindings custom-list "$NEW_KEYBINDINGS"
30
- fi