machineconfig 5.71__py3-none-any.whl → 5.73__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 (29) hide show
  1. machineconfig/jobs/installer/installer_data.json +6 -6
  2. machineconfig/jobs/installer/package_groups.py +7 -8
  3. machineconfig/scripts/python/agents.py +3 -0
  4. machineconfig/scripts/python/ai/initai.py +19 -16
  5. machineconfig/scripts/python/ai/vscode_tasks.py +32 -0
  6. machineconfig/scripts/python/cloud.py +11 -4
  7. machineconfig/scripts/python/cloud_helpers/cloud_mount.py +10 -18
  8. machineconfig/scripts/python/croshell.py +5 -6
  9. machineconfig/scripts/python/devops.py +1 -1
  10. machineconfig/scripts/python/devops_helpers/cli_config.py +2 -2
  11. machineconfig/scripts/python/devops_helpers/cli_repos.py +1 -1
  12. machineconfig/scripts/python/devops_helpers/cli_self.py +8 -8
  13. machineconfig/scripts/python/entry.py +24 -8
  14. machineconfig/scripts/python/helper_navigator/command_tree.py +29 -16
  15. machineconfig/scripts/python/interactive.py +2 -2
  16. machineconfig/scripts/python/nw/mount_nfs +1 -1
  17. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +1 -1
  18. machineconfig/scripts/python/sessions.py +1 -1
  19. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
  20. machineconfig/setup_linux/web_shortcuts/interactive.sh +7 -7
  21. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +7 -7
  22. machineconfig/utils/installer_utils/installer_class.py +8 -45
  23. machineconfig/utils/path_extended.py +2 -4
  24. machineconfig/utils/ssh.py +1 -1
  25. {machineconfig-5.71.dist-info → machineconfig-5.73.dist-info}/METADATA +1 -1
  26. {machineconfig-5.71.dist-info → machineconfig-5.73.dist-info}/RECORD +29 -28
  27. {machineconfig-5.71.dist-info → machineconfig-5.73.dist-info}/WHEEL +0 -0
  28. {machineconfig-5.71.dist-info → machineconfig-5.73.dist-info}/entry_points.txt +0 -0
  29. {machineconfig-5.71.dist-info → machineconfig-5.73.dist-info}/top_level.txt +0 -0
@@ -1809,14 +1809,14 @@
1809
1809
  "doc": "🐋 A simple terminal UI for both docker and docker-compose",
1810
1810
  "fileNamePattern": {
1811
1811
  "amd64": {
1812
- "linux": null,
1813
- "macos": null,
1814
- "windows": null
1812
+ "linux": "lazydocker_{version}_Linux_x86_64.tar.gz",
1813
+ "macos": "lazydocker_{version}_Darwin_x86_64.tar.gz",
1814
+ "windows": "lazydocker_{version}_Windows_x86_64.zip"
1815
1815
  },
1816
1816
  "arm64": {
1817
- "linux": null,
1818
- "macos": null,
1819
- "windows": null
1817
+ "linux": "lazydocker_{version}_Linux_arm64.tar.gz",
1818
+ "macos": "lazydocker_{version}_Darwin_arm64.tar.gz",
1819
+ "windows": "lazydocker_{version}_Windows_arm64.zip"
1820
1820
  }
1821
1821
  }
1822
1822
  },
@@ -1,7 +1,7 @@
1
1
  from typing import Literal, TypeAlias, Union
2
2
 
3
3
  # AI/LLM Tools - AI-powered coding and chat assistants
4
- PACKAGES_AI_TOOLS = [
4
+ BUNDLE_AI = [
5
5
  "aider",
6
6
  "github-copilot-cli",
7
7
  "gemini",
@@ -244,15 +244,14 @@ PACKAGE_GROUPS: TypeAlias = Literal[
244
244
 
245
245
 
246
246
  # Main ESSENTIAL package list - combines all subgroups
247
- PACKAGES_NAMES_ESSENTIAL = [
247
+ ESSENTIAL = [
248
248
  *PACKAGES_CODE_ANALYSIS,
249
249
  *PACKAGES_SYSTEM_MONITORS,
250
250
  *PACKAGES_TERMINAL_SHELL,
251
251
  *PACKAGES_FILE,
252
- *PACKAGES_AI_TOOLS,
252
+ *BUNDLE_AI,
253
253
  ]
254
- PACKAGES_NAMES_DEV = [
255
- *PACKAGES_AI_TOOLS,
254
+ DEV = [
256
255
  *PACKAGES_TERMINAL_EMULATORS,
257
256
  *PACKAGES_BROWSERS,
258
257
  *PACKAGES_CODE_EDITORS,
@@ -266,9 +265,9 @@ PACKAGES_NAMES_DEV = [
266
265
  ]
267
266
 
268
267
  PACKAGE_GROUP2NAMES: dict[PACKAGE_GROUPS, list[str]] = {
269
- "ESSENTIAL": PACKAGES_NAMES_ESSENTIAL,
270
- "DEV": PACKAGES_NAMES_DEV,
271
- "AI_TOOLS": PACKAGES_AI_TOOLS,
268
+ "ESSENTIAL": ESSENTIAL,
269
+ "DEV": DEV,
270
+ "AI_TOOLS": BUNDLE_AI,
272
271
  "TERMINAL_EMULATORS": PACKAGES_TERMINAL_EMULATORS,
273
272
  "BROWSERS": PACKAGES_BROWSERS,
274
273
  "CODE_EDITORS": PACKAGES_CODE_EDITORS,
@@ -190,7 +190,10 @@ MODEL options: {sep.join(get_args(MODEL))}
190
190
 
191
191
  def main():
192
192
  agents_app = get_app()
193
+ # from trogon.typer import init_tui
194
+ # agents_app_tui = init_tui(agents_app)
193
195
  agents_app()
196
+ # agents_app_tui()
194
197
 
195
198
 
196
199
  if __name__ == "__main__": # pragma: no cover
@@ -7,6 +7,7 @@ from machineconfig.scripts.python.ai.solutions.copilot import github_copilot
7
7
  from machineconfig.scripts.python.ai.solutions.crush import crush
8
8
  from machineconfig.scripts.python.ai.solutions.cursor import cursors
9
9
  from machineconfig.scripts.python.ai.solutions.gemini import gemini
10
+ from machineconfig.scripts.python.ai.vscode_tasks import add_lint_and_type_check_task
10
11
  from machineconfig.utils.accessories import get_repo_root
11
12
 
12
13
 
@@ -15,22 +16,22 @@ def add_ai_configs(repo_root: Path) -> None:
15
16
  if repo_root_resolved is not None:
16
17
  repo_root = repo_root_resolved # this means you can run the command from any subdirectory of the repo.
17
18
 
18
- if repo_root.joinpath("pyproject.toml").exists() is False:
19
- uv_init = input(f"{repo_root} does not seem to be a python project (no pyproject.toml found), would you like to initialize one? (y/n) ")
20
- if uv_init.strip().lower() == "y":
21
- command_to_run = """
22
- uv init --python 3.13
23
- uv venv
24
- uv add --upgrade-package pylint pyright mypy pyrefly ty --dev # linters and type checkers
25
- uv add --upgrade-package pytest --dev
26
- uv add typer --dev
27
-
28
- """
29
- from machineconfig.utils.code import run_shell_script
30
- run_shell_script(command_to_run)
31
- else:
32
- print("Terminating initai ...")
33
- return
19
+ # if repo_root.joinpath("pyproject.toml").exists() is False:
20
+ # uv_init = input(f"{repo_root} does not seem to be a python project (no pyproject.toml found), would you like to initialize one? (y/n) ")
21
+ # if uv_init.strip().lower() == "y":
22
+ # command_to_run = """
23
+ # uv init --python 3.13
24
+ # uv venv
25
+ # uv add --upgrade-package pylint pyright mypy pyrefly ty --dev # linters and type checkers
26
+ # uv add --upgrade-package pytest --dev
27
+ # uv add typer --dev
28
+
29
+ # """
30
+ # from machineconfig.utils.code import run_shell_script
31
+ # run_shell_script(command_to_run)
32
+ # else:
33
+ # print("Terminating initai ...")
34
+ # return
34
35
 
35
36
  dot_ai_dir = repo_root.joinpath(".ai")
36
37
  dot_ai_dir.mkdir(parents=True, exist_ok=True)
@@ -39,6 +40,8 @@ uv add typer --dev
39
40
  generic.create_dot_scripts(repo_root=repo_root)
40
41
  generic.adjust_gitignore(repo_root=repo_root)
41
42
 
43
+ add_lint_and_type_check_task(repo_root=repo_root)
44
+
42
45
  github_copilot.build_configuration(repo_root=repo_root)
43
46
  cursors.build_configuration(repo_root=repo_root)
44
47
  gemini.build_configuration(repo_root=repo_root)
@@ -0,0 +1,32 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+
5
+ def add_lint_and_type_check_task(repo_root: Path) -> None:
6
+ vscode_dir = repo_root / ".vscode"
7
+ vscode_dir.mkdir(parents=True, exist_ok=True)
8
+ tasks_json_path = vscode_dir / "tasks.json"
9
+
10
+ task_to_add = {
11
+ "label": "lint_and_type_check",
12
+ "type": "shell",
13
+ "linux": {"command": "bash", "args": ["./.ai/scripts/lint_and_type_check.sh"]},
14
+ "osx": {"command": "bash", "args": ["./.ai/scripts/lint_and_type_check.sh"]},
15
+ "windows": {"command": "pwsh", "args": ["-File", "./.ai/scripts/lint_and_type_check.ps1"]},
16
+ "presentation": {"reveal": "always", "panel": "new"},
17
+ "problemMatcher": [],
18
+ }
19
+
20
+ if tasks_json_path.exists():
21
+ with tasks_json_path.open("r") as f:
22
+ tasks_config = json.load(f)
23
+ if "tasks" not in tasks_config:
24
+ tasks_config["tasks"] = []
25
+ existing_labels = {task.get("label") for task in tasks_config.get("tasks", [])}
26
+ if "lintAndTypeCheck" not in existing_labels:
27
+ tasks_config["tasks"].append(task_to_add)
28
+ else:
29
+ tasks_config = {"version": "2.0.0", "tasks": [task_to_add]}
30
+
31
+ with tasks_json_path.open("w") as f:
32
+ json.dump(tasks_config, f, indent="\t")
@@ -2,13 +2,20 @@
2
2
  import typer
3
3
  from machineconfig.scripts.python.cloud_helpers.cloud_sync import main as sync_main
4
4
  from machineconfig.scripts.python.cloud_helpers.cloud_copy import main as copy_main
5
- from machineconfig.scripts.python.cloud_helpers.cloud_mount import main as mount_main
5
+ from machineconfig.scripts.python.cloud_helpers.cloud_mount import mount as mount_main
6
6
 
7
7
  def get_app():
8
8
  app = typer.Typer(add_completion=False, no_args_is_help=True)
9
- app.command(name="sync", no_args_is_help=True, help="""🔄 Synchronize files/folders between local and cloud storage.""")(sync_main)
10
- app.command(name="copy", no_args_is_help=True, short_help="""📤 Upload or 📥 Download files/folders to/from cloud storage services like Google Drive, Dropbox, OneDrive, etc.""")(copy_main)
11
- app.command(name="mount", no_args_is_help=True, short_help="""🔗 Mount cloud storage services like Google Drive, Dropbox, OneDrive, etc. as local drives.""")(mount_main)
9
+
10
+ app.command(name="sync", no_args_is_help=True, help="""🔄 [s] Synchronize files/folders between local and cloud storage.""")(sync_main)
11
+ app.command(name="s", no_args_is_help=True, hidden=True)(sync_main) # short alias
12
+
13
+ app.command(name="copy", no_args_is_help=True, short_help="""📤 [c] Upload or 📥 Download files/folders to/from cloud storage services like Google Drive, Dropbox, OneDrive, etc.""")(copy_main)
14
+ app.command(name="c", no_args_is_help=True, hidden=True)(copy_main) # short alias
15
+
16
+ app.command(name="mount", no_args_is_help=True, short_help="""🔗 [m] Mount cloud storage services like Google Drive, Dropbox, OneDrive, etc. as local drives.""")(mount_main)
17
+ app.command(name="m", no_args_is_help=True, hidden=True)(mount_main) # short alias
18
+
12
19
  return app
13
20
 
14
21
 
@@ -52,7 +52,12 @@ mprocs "echo 'see {DEFAULT_MOUNT}/{cloud} for the mounted cloud'; rclone about {
52
52
  return txt
53
53
 
54
54
 
55
- def mount(cloud: Optional[str], network: Optional[str], destination: Optional[str]) -> None:
55
+ def mount(
56
+ cloud: Annotated[Optional[str], typer.Option(help="cloud to mount")] = None,
57
+ destination: Annotated[Optional[str], typer.Option(help="destination to mount")] = None,
58
+ network: Annotated[Optional[str], typer.Option(help="mount network drive")] = None,
59
+ ) -> None:
60
+
56
61
  # draw header box dynamically
57
62
  title = "☁️ Cloud Mount Utility"
58
63
  console.print(Panel(title, title_align="left", border_style="blue"))
@@ -153,21 +158,8 @@ zellij action move-focus up
153
158
  console.print(Panel(f"{title1}\n{title2}", title="Success", border_style="green"))
154
159
 
155
160
 
156
- def main(
157
- cloud: Annotated[Optional[str], typer.Option(help="cloud to mount")] = None,
158
- destination: Annotated[Optional[str], typer.Option(help="destination to mount")] = None,
159
- network: Annotated[Optional[str], typer.Option(help="mount network drive")] = None,
160
- ) -> None:
161
- # draw main title box dynamically
162
- main_title = "☁️ RCLONE CLOUD MOUNT"
163
- console.print(Panel(main_title, title_align="left", border_style="blue"))
164
-
165
- mount(cloud=cloud, network=network, destination=destination)
166
-
167
-
168
- def arg_parser() -> None:
169
- typer.run(main)
170
-
171
161
 
172
- if __name__ == "__main__":
173
- arg_parser()
162
+ def get_app():
163
+ app = typer.Typer(name="cloud-mount", help="Cloud mount utility")
164
+ app.command(name="mount", no_args_is_help=True)(mount)
165
+ return app
@@ -63,10 +63,9 @@ except Exception as e:
63
63
 
64
64
 
65
65
  def croshell(
66
+ path: Annotated[Optional[str], typer.Argument(help="read a file.")] = "",
66
67
  python: Annotated[bool, typer.Option("--python", "-p", help="flag to use python over IPython.")] = False,
67
- fzf: Annotated[bool, typer.Option("--fzf", "-F", help="search with fuzzy finder for python scripts and run them")] = False,
68
68
  profile: Annotated[Optional[str], typer.Option("--profile", "-P", help="ipython profile to use, defaults to default profile.")] = None,
69
- read: Annotated[str, typer.Option("--read", "-r", help="read a binary file.")] = "",
70
69
  jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="run in jupyter interactive console")] = False,
71
70
  streamlit_viewer: Annotated[bool, typer.Option("--stViewer", "-s", help="view in streamlit app")] = False,
72
71
  visidata: Annotated[bool, typer.Option("--visidata", "-V", help="open data file in visidata")] = False,
@@ -79,7 +78,7 @@ def croshell(
79
78
  ipython_profile: Optional[str] = profile
80
79
  file_obj = PathExtended.cwd() # initialization value, could be modified according to args.
81
80
 
82
- if fzf:
81
+ if path == ".":
83
82
  text = "🔍 Searching for Python files..."
84
83
  console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
85
84
  options = [str(item) for item in PathExtended.cwd().search("*.py", r=True)]
@@ -89,7 +88,7 @@ def croshell(
89
88
  text = f"📄 Selected file: {PathExtended(file_selected).name}"
90
89
  console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
91
90
 
92
- elif read != "":
91
+ elif path != "" and path is not None:
93
92
  if streamlit_viewer:
94
93
  # text = "📊 STARTING STREAMLIT VIEWER"
95
94
  # console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
@@ -101,7 +100,7 @@ def croshell(
101
100
  # """
102
101
  # PROGRAM_PATH.write_text(data=final_program, encoding="utf-8")
103
102
  return None
104
- file_obj = PathExtended(str(read).lstrip()).expanduser().absolute()
103
+ file_obj = PathExtended(str(path).lstrip()).expanduser().absolute()
105
104
  program = get_read_data_pycode(str(file_obj))
106
105
  text = f"📄 Reading data from: {file_obj.name}"
107
106
  console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
@@ -150,7 +149,7 @@ from pathlib import Path
150
149
  else:
151
150
  console.print(Panel("❌ Could not determine the local machineconfig repo root. Please ensure the `REPO_ROOT` in `source_of_truth.py` is correctly set to the local path of the machineconfig repo, or do not use the `--local` flag.", title="Error", border_style="red"))
152
151
  return
153
- else: ve_line = """--with "machineconfig[plot]>=5.71" """
152
+ else: ve_line = """--with "machineconfig[plot]>=5.72" """
154
153
  fire_line = f"uv run --python 3.14 {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
155
154
 
156
155
  from machineconfig.utils.code import run_shell_script
@@ -20,7 +20,7 @@ def get_app():
20
20
  import machineconfig.utils.installer_utils.installer as installer_entry_point
21
21
  installer_entry_point.main(which=which, group=group, interactive=interactive)
22
22
  _ = install
23
- app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
23
+ app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
24
24
  app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
25
25
  app.add_typer(cli_repos.get_app(), name="repos")
26
26
  app.add_typer(cli_repos.get_app(), name="r", hidden=True)
@@ -42,7 +42,7 @@ def path():
42
42
  from pathlib import Path
43
43
  path = Path(navigator.__file__).resolve().parent.joinpath("path_manager_tui.py")
44
44
  from machineconfig.utils.code import run_shell_script
45
- run_shell_script(f"""uv run --with "machineconfig>=5.71,textual" {path}""")
45
+ run_shell_script(f"""uv run --with "machineconfig>=5.72,textual" {path}""")
46
46
 
47
47
  def pwsh_theme():
48
48
  """🔗 Select powershell prompt theme."""
@@ -63,7 +63,7 @@ def copy_assets(which: Literal["scripts", "settings", "both"] = typer.Option(...
63
63
 
64
64
 
65
65
  def get_app():
66
- config_apps = typer.Typer(help="⚙️ [c] configuration subcommands", no_args_is_help=True)
66
+ config_apps = typer.Typer(help="⚙️ [c] configuration subcommands", no_args_is_help=True)
67
67
  config_apps.command("private", no_args_is_help=True, help="🔗 [p] Manage private configuration files.")(private)
68
68
  config_apps.command("p", no_args_is_help=True, help="Manage private configuration files.", hidden=True)(private)
69
69
  config_apps.command("public", no_args_is_help=True, help="🔗 [u] Manage public configuration files.")(public)
@@ -162,7 +162,7 @@ def get_app():
162
162
 
163
163
  repos_apps.command(name="push", help="🚀 [p] Push changes across repositories")(push)
164
164
  repos_apps.command(name="p", help="Push changes across repositories", hidden=True)(push)
165
- repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
165
+ repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
166
166
  repos_apps.command(name="P", help="Pull changes across repositories", hidden=True)(pull)
167
167
  repos_apps.command(name="commit", help="💾 [c] Commit changes across repositories")(commit)
168
168
  repos_apps.command(name="c", help="Commit changes across repositories", hidden=True)(commit)
@@ -25,9 +25,9 @@ def install():
25
25
  # main_public_from_parser()
26
26
  import platform
27
27
  if platform.system() == "Windows":
28
- run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.71""")
28
+ run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.72""")
29
29
  else:
30
- run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.71""")
30
+ run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.72""")
31
31
 
32
32
  def navigate():
33
33
  """📚 NAVIGATE command structure with TUI"""
@@ -35,7 +35,7 @@ def navigate():
35
35
  from pathlib import Path
36
36
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
37
37
  from machineconfig.utils.code import run_shell_script
38
- run_shell_script(f"""uv run --with "machineconfig>=5.71,textual" {path}""")
38
+ run_shell_script(f"""uv run --with "machineconfig>=5.72,textual" {path}""")
39
39
 
40
40
 
41
41
  def run_python(ip: str = typer.Argument(..., help="Python command to run in the machineconfig environment"),
@@ -53,14 +53,14 @@ def get_app():
53
53
  cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True)
54
54
  cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE essential repos")(update)
55
55
  cli_app.command("u", no_args_is_help=False, help="UPDATE essential repos", hidden=True)(update)
56
- cli_app.command("interactive", no_args_is_help=False, help="🤖 [ia] INTERACTIVE configuration of machine.")(interactive)
57
- cli_app.command("ia", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
56
+ cli_app.command("interactive", no_args_is_help=False, help="🤖 [i] INTERACTIVE configuration of machine.")(interactive)
57
+ cli_app.command("i", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
58
58
  cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
59
59
  cli_app.command("s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
60
- cli_app.command("install", no_args_is_help=False, help="📋 [i] CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.")(install)
61
- cli_app.command("i", no_args_is_help=False, help="CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.", hidden=True)(install)
60
+ cli_app.command("install", no_args_is_help=False, help="📋 [I] CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.")(install)
61
+ cli_app.command("I", no_args_is_help=False, help="CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.", hidden=True)(install)
62
62
  cli_app.command("navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
63
63
  cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
64
- cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment")(run_python)
64
+ cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment")(run_python)
65
65
  cli_app.command("c", no_args_is_help=False, help="RUN python command/file in the machineconfig environment", hidden=True)(run_python)
66
66
  return cli_app
@@ -12,14 +12,30 @@ from machineconfig.scripts.python.croshell import croshell as croshell_func
12
12
  def get_app():
13
13
  import typer
14
14
  app = typer.Typer(help="MachineConfig CLI - Manage your machine configurations and workflows", no_args_is_help=True)
15
- app.add_typer(get_devops_app(), name="devops", help="DevOps related commands", no_args_is_help=True)
16
- app.add_typer(get_cloud_app(), name="cloud", help="Cloud management commands", no_args_is_help=True)
17
- app.add_typer(get_sessions_app(), name="sessions", help="Session and layout management", no_args_is_help=True)
18
- app.add_typer(get_fire_jobs_app(), name="fire", help="Fire and manage jobs", no_args_is_help=True)
19
- app.add_typer(get_agents_app(), name="agents", help="🤖 AI Agents management commands", no_args_is_help=True)
20
-
21
- app.command("ftpx", no_args_is_help=True, help="File transfer utility though SSH")(ftpx_func)
22
- app.command("croshell", no_args_is_help=False, help="Cross-shell command execution")(croshell_func)
15
+ devops_app = get_devops_app()
16
+ app.add_typer(devops_app, name="devops", help="[d] DevOps related commands", no_args_is_help=True)
17
+ app.add_typer(devops_app, name="d", hidden=True) # short alias
18
+
19
+ cloud_app = get_cloud_app()
20
+ app.add_typer(cloud_app, name="cloud", help="[c] Cloud management commands", no_args_is_help=True)
21
+ app.add_typer(cloud_app, name="c", hidden=True) # short alias
22
+
23
+ sessions_app = get_sessions_app()
24
+ app.add_typer(sessions_app, name="sessions", help="[s] Session and layout management", no_args_is_help=True)
25
+ app.add_typer(sessions_app, name="s", hidden=True) # short alias
26
+
27
+ fire_jobs_app = get_fire_jobs_app()
28
+ app.add_typer(fire_jobs_app, name="fire", help="[f] Fire and manage jobs", no_args_is_help=True)
29
+ app.add_typer(fire_jobs_app, name="f", hidden=True) # short alias
30
+
31
+ agents_app = get_agents_app()
32
+ app.add_typer(agents_app, name="agents", help="[a] 🤖 AI Agents management commands", no_args_is_help=True)
33
+ app.add_typer(agents_app, name="a", hidden=True) # short alias
34
+
35
+ app.command("ftpx", no_args_is_help=True, help="[f] File transfer utility though SSH")(ftpx_func)
36
+ app.command("f", no_args_is_help=True, hidden=True)(ftpx_func) # short alias
37
+ app.command("croshell", no_args_is_help=False, help="[cs] Cross-shell command execution")(croshell_func)
38
+ app.command("cs", no_args_is_help=False, hidden=True)(croshell_func) # short alias
23
39
 
24
40
  return app
25
41
 
@@ -314,14 +314,21 @@ class CommandTree(Tree[CommandInfo]):
314
314
  help_text="devops self navigate"
315
315
  ))
316
316
 
317
- # fire command
318
- self.root.add("🔥 fire - Fire jobs execution", data=CommandInfo(
317
+ # fire command - now a typer sub-app
318
+ fire_node = self.root.add("🔥 fire - Fire jobs execution", data=CommandInfo(
319
319
  name="fire",
320
- description="Execute Python scripts with Fire",
320
+ description="Fire and manage jobs",
321
321
  command="fire",
322
- is_group=False,
323
- module_path="machineconfig.scripts.python.fire_jobs",
324
- help_text="fire <path> [function] --ve <env> --interactive --jupyter --streamlit --debug --loop --remote --zellij_tab <name>"
322
+ is_group=True,
323
+ module_path="machineconfig.scripts.python.fire_jobs"
324
+ ))
325
+
326
+ fire_node.add("🔥 fire - Execute Python/Shell scripts", data=CommandInfo(
327
+ name="fire",
328
+ description="Execute Python scripts, shell scripts, or PowerShell scripts with Fire",
329
+ command="fire",
330
+ parent="fire",
331
+ help_text="fire <path> [function] --ve <env> --cmd --interactive --debug --choose_function --loop --jupyter --submit_to_cloud --remote --module --streamlit --environment <env> --holdDirectory --PathExport --git_pull --optimized --zellij_tab <name> --watch"
325
332
  ))
326
333
 
327
334
  # agents command
@@ -373,6 +380,14 @@ class CommandTree(Tree[CommandInfo]):
373
380
  help_text="agents make-todo"
374
381
  ))
375
382
 
383
+ agents_node.add("🔗 make-symlinks - Create repo symlinks", data=CommandInfo(
384
+ name="make-symlinks",
385
+ description="Create symlinks to the current repo in ~/code_copies/",
386
+ command="agents make-symlinks",
387
+ parent="agents",
388
+ help_text="agents make-symlinks"
389
+ ))
390
+
376
391
  # sessions command
377
392
  sessions_node = self.root.add("🖥️ sessions - Session layouts management", data=CommandInfo(
378
393
  name="sessions",
@@ -406,6 +421,14 @@ class CommandTree(Tree[CommandInfo]):
406
421
  help_text="sessions balance-load --layout-path <file> --max-thresh <num> --thresh-type <number|weight> --breaking-method <moreLayouts|combineTabs> --output-path <file>"
407
422
  ))
408
423
 
424
+ sessions_node.add("💀 kill-process - Kill processes", data=CommandInfo(
425
+ name="kill-process",
426
+ description="Choose a process to kill interactively",
427
+ command="sessions kill-process",
428
+ parent="sessions",
429
+ help_text="sessions kill-process"
430
+ ))
431
+
409
432
  # cloud command
410
433
  cloud_node = self.root.add("☁️ cloud - Cloud storage operations", data=CommandInfo(
411
434
  name="cloud",
@@ -457,14 +480,4 @@ class CommandTree(Tree[CommandInfo]):
457
480
  is_group=False,
458
481
  module_path="machineconfig.scripts.python.ftpx",
459
482
  help_text="ftpx <source> <target> --recursive --zipFirst --cloud"
460
- ))
461
-
462
- # kill_process command
463
- self.root.add("💀 kill_process - Kill processes", data=CommandInfo(
464
- name="kill_process",
465
- description="Kill running processes",
466
- command="kill_process",
467
- is_group=False,
468
- module_path="machineconfig.utils.procs",
469
- help_text="kill_process"
470
483
  ))
@@ -130,9 +130,9 @@ def execute_installations(selected_options: list[str]) -> None:
130
130
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
131
131
  import platform
132
132
  if platform.system() == "Windows":
133
- run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.71""")
133
+ run_shell_script(r"""$HOME\.local\bin\uv.exe tool install machineconfig>=5.72""")
134
134
  else:
135
- run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.71""")
135
+ run_shell_script("""$HOME/.local/bin/uv tool install machineconfig>=5.72""")
136
136
  if "install_ssh_server" in selected_options:
137
137
  console.print(Panel("🔒 [bold red]SSH SERVER[/bold red]\n[italic]Remote access setup[/italic]", border_style="red"))
138
138
  import platform
@@ -5,7 +5,7 @@
5
5
  # mkdir ~/data/local
6
6
  # sudo mount -o nolock,noatime,nodiratime,proto=tcp,timeo=600,retrans=2,noac alex-p51s-5:/home/alex/data/local ./data/local
7
7
 
8
- uv run --python 3.14 --with "machineconfig>=5.71" python -m machineconfig.scripts.python.mount_nfs
8
+ uv run --python 3.14 --with "machineconfig>=5.72" python -m machineconfig.scripts.python.mount_nfs
9
9
  # Check if remote server is reachable and share folder exists
10
10
  if ! ping -c 1 "$remote_server" &> /dev/null; then
11
11
  echo "💥 Error: Remote server $remote_server is not reachable."
@@ -7,7 +7,7 @@ def analyze_repo_development(repo_path: str = typer.Argument(..., help="Path to
7
7
  from pathlib import Path
8
8
  count_lines_path = Path(count_lines.__file__)
9
9
  # --project $HOME/code/ machineconfig --group plot
10
- cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=5.71" {count_lines_path} analyze-over-time {repo_path}"""
10
+ cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=5.72" {count_lines_path} analyze-over-time {repo_path}"""
11
11
  from machineconfig.utils.code import run_shell_script
12
12
  run_shell_script(cmd)
13
13
 
@@ -25,7 +25,7 @@ def balance_load(layout_path: Path = typer.Argument(..., help="Path to the layou
25
25
  def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list[str]], select_interactively: bool) -> list["LayoutConfig"]:
26
26
  import json
27
27
  from machineconfig.utils.options import choose_from_options
28
- from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig, LayoutsFile
28
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
29
29
  layout_file: LayoutsFile = json.loads(layouts_json_file.read_text(encoding="utf-8"))
30
30
  if len(layout_file["layouts"]) == 0:
31
31
  raise ValueError(f"No layouts found in {layouts_json_file}")
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=5.71" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=5.72" 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
@@ -1,25 +1,25 @@
1
1
  #!/bin/bash
2
2
  . <( curl -sSL "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/uv.sh")
3
3
  devops() {
4
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" devops "$@"
4
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" devops "$@"
5
5
  }
6
6
  agents() {
7
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" agents "$@"
7
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" agents "$@"
8
8
  }
9
9
  cloud() {
10
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" cloud "$@"
10
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" cloud "$@"
11
11
  }
12
12
  croshell() {
13
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" croshell "$@"
13
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" croshell "$@"
14
14
  }
15
15
  fire() {
16
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" fire "$@"
16
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" fire "$@"
17
17
  }
18
18
  ftpx() {
19
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" ftpx "$@"
19
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" ftpx "$@"
20
20
  }
21
21
  sessions() {
22
- "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.71" sessions "$@"
22
+ "$HOME/.local/bin/uv" run --python 3.14 --with "machineconfig>=5.72" sessions "$@"
23
23
  }
24
24
 
25
25
  echo "devops command is now defined in this shell session."
@@ -2,30 +2,30 @@
2
2
 
3
3
  iex (iwr "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_windows/uv.ps1").Content
4
4
  function devops {
5
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" devops $args
5
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" devops $args
6
6
  }
7
7
 
8
8
  function cloud {
9
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" cloud $args
9
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" cloud $args
10
10
  }
11
11
 
12
12
  function croshell {
13
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" croshell $args
13
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" croshell $args
14
14
  }
15
15
 
16
16
  function agents {
17
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" agents $args
17
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" agents $args
18
18
  }
19
19
 
20
20
  function fire {
21
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" fire $args
21
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" fire $args
22
22
  }
23
23
 
24
24
  function ftpx {
25
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" ftpx $args
25
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" ftpx $args
26
26
  }
27
27
 
28
28
  function sessions {
29
- & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.71" sessions $args
29
+ & "$HOME\.local\bin\uv.exe" run --python 3.14 --with "machineconfig>=5.72" sessions $args
30
30
  }
31
31
 
@@ -35,22 +35,18 @@ class Installer:
35
35
  def install_robust(self, version: Optional[str]) -> str:
36
36
  try:
37
37
  exe_name = self._get_exe_name()
38
- print(f"🚀 INSTALLING {exe_name.upper()} 🚀")
39
38
  result_old = subprocess.run(f"{exe_name} --version", shell=True, capture_output=True, text=True)
40
39
  old_version_cli = result_old.stdout.strip()
41
- print(f"📊 Current version: {old_version_cli or 'Not installed'}")
40
+ print(f"🚀 INSTALLING {exe_name.upper()} 🚀. 📊 Current version: {old_version_cli or 'Not installed'}")
42
41
  self.install(version=version)
43
42
  result_new = subprocess.run(f"{exe_name} --version", shell=True, capture_output=True, text=True)
44
43
  new_version_cli = result_new.stdout.strip()
45
- print(f"📊 New version: {new_version_cli}")
46
-
47
44
  if old_version_cli == new_version_cli:
48
- print(f"ℹ️ Same version detected: {old_version_cli}")
45
+ # print(f"ℹ️ Same version detected: {old_version_cli}")
49
46
  return f"""📦️ 😑 {exe_name}, same version: {old_version_cli}"""
50
47
  else:
51
- print(f"🚀 Update successful: {old_version_cli} ➡️ {new_version_cli}")
48
+ # print(f"🚀 Update successful: {old_version_cli} ➡️ {new_version_cli}")
52
49
  return f"""📦️ 🤩 {exe_name} updated from {old_version_cli} ➡️ TO ➡️ {new_version_cli}"""
53
-
54
50
  except Exception as ex:
55
51
  exe_name = self._get_exe_name()
56
52
  app_name = self.installer_data["appName"]
@@ -65,19 +61,16 @@ class Installer:
65
61
  installer_arch_os = self.installer_data["fileNamePattern"][arch][os_name]
66
62
  if installer_arch_os is None:
67
63
  raise ValueError(f"No installation pattern for {exe_name} on {os_name} {arch}")
68
-
69
- print(f"🔧 INSTALLATION PROCESS: {exe_name} 🔧")
70
64
  version_to_be_installed: str = "unknown" # Initialize to ensure it's always bound
71
65
  if repo_url == "CMD":
72
- if "npm " in installer_arch_os or "pip " in installer_arch_os or "winget " in installer_arch_os:
66
+ if any(pm in installer_arch_os for pm in ["npm ", "pip ", "winget ", "brew ", "curl "]):
73
67
  package_manager = installer_arch_os.split(" ", maxsplit=1)[0]
74
68
  print(f"📦 Using package manager: {package_manager}")
75
69
  desc = package_manager + " installation"
76
70
  version_to_be_installed = package_manager + "Latest"
77
- print(f"🚀 Running: {installer_arch_os}")
78
- # result = subprocess.run(installer_arch_os, shell=True, capture_output=True, text=True)
79
- from machineconfig.utils.code import run_shell_script
80
- result = run_shell_script(installer_arch_os)
71
+ result = subprocess.run(installer_arch_os, shell=True, capture_output=True, text=False)
72
+ # from machineconfig.utils.code import run_shell_script
73
+ # result = run_shell_script(installer_arch_os)
81
74
  success = result.returncode == 0 and result.stderr == "".encode()
82
75
  if not success:
83
76
  print(f"❌ {desc} failed")
@@ -86,7 +79,6 @@ class Installer:
86
79
  if result.stderr:
87
80
  print(f"STDERR: {result.stderr}")
88
81
  print(f"Return code: {result.returncode}")
89
- print("✅ Package manager installation completed")
90
82
  elif installer_arch_os.endswith((".sh", ".py", ".ps1")):
91
83
  # search for the script, see which path ends with the script name
92
84
  import machineconfig.jobs.installer as module
@@ -102,33 +94,24 @@ class Installer:
102
94
  if installer_arch_os.endswith(".sh"):
103
95
  if platform.system() not in ["Linux", "Darwin"]:
104
96
  raise NotImplementedError(f"Shell script installation not supported on {platform.system()}")
105
- print(f"🚀 Running shell script: {installer_path}")
106
97
  subprocess.run(f"bash {installer_path}", shell=True, check=True)
107
98
  version_to_be_installed = "scripted_installation"
108
- print("✅ Shell script installation completed")
109
99
  elif installer_arch_os.endswith(".ps1"):
110
100
  if platform.system() != "Windows":
111
101
  raise NotImplementedError(f"PowerShell script installation not supported on {platform.system()}")
112
- print(f"🚀 Running PowerShell script: {installer_path}")
113
102
  subprocess.run(f"powershell -ExecutionPolicy Bypass -File {installer_path}", shell=True, check=True)
114
103
  version_to_be_installed = "scripted_installation"
115
- print("✅ PowerShell script installation completed")
116
104
  elif installer_arch_os.endswith(".py"):
117
105
  import runpy
118
106
  runpy.run_path(str(installer_path), run_name=None)["main"](self.installer_data, version=version)
119
107
  version_to_be_installed = str(version)
120
- print("✅ Custom installation completed")
121
108
  elif installer_arch_os.startswith("https://"): # its a url to be downloaded
122
- print(f"📥 Downloading object from URL: {installer_arch_os}")
123
109
  downloaded_object = PathExtended(installer_arch_os).download(folder=INSTALL_TMP_DIR)
124
110
  # object is either a zip containing a binary or a straight out binary.
125
111
  if downloaded_object.suffix in [".zip", ".tar.gz"]:
126
- print(f"📦 Decompressing downloaded archive: {downloaded_object}")
127
112
  downloaded_object = downloaded_object.decompress()
128
- print(f"✅ Decompression completed to: {downloaded_object}")
129
113
  if downloaded_object.suffix in [".exe", ""]: # likely an executable
130
114
  if platform.system() == "Windows":
131
- print("🪟 Installing on Windows...")
132
115
  exe = find_move_delete_windows(downloaded_file_path=downloaded_object, exe_name=exe_name, delete=True, rename_to=exe_name.replace(".exe", "") + ".exe")
133
116
  elif platform.system() in ["Linux", "Darwin"]:
134
117
  system_name = "Linux" if platform.system() == "Linux" else "macOS"
@@ -138,7 +121,6 @@ class Installer:
138
121
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
139
122
  print(error_msg)
140
123
  raise NotImplementedError(error_msg)
141
-
142
124
  _ = exe
143
125
  if exe.name.replace(".exe", "") != exe_name.replace(".exe", ""):
144
126
  from rich import print as pprint
@@ -149,12 +131,10 @@ class Installer:
149
131
  print(f"🔄 Renaming to correct name: {new_exe_name}")
150
132
  exe.with_name(name=new_exe_name, inplace=True, overwrite=True)
151
133
  version_to_be_installed = "downloaded_binary"
152
- print("✅ Downloaded binary installation completed")
153
134
  else:
154
135
  raise NotImplementedError(f"CMD installation method not implemented for: {installer_arch_os}")
155
136
  else:
156
137
  assert repo_url.startswith("https://github.com/"), f"repoURL must be a GitHub URL, got {repo_url}"
157
- print("📥 Downloading from repository...")
158
138
  downloaded, version_to_be_installed = self.download(version=version)
159
139
  if str(downloaded).endswith(".deb"):
160
140
  print(f"📦 Installing .deb package: {downloaded}")
@@ -171,10 +151,8 @@ class Installer:
171
151
  print(f"Return code: {result.returncode}")
172
152
  print("🗑️ Cleaning up .deb package...")
173
153
  downloaded.delete(sure=True)
174
- print("✅ DEB package installation completed")
175
154
  else:
176
155
  if platform.system() == "Windows":
177
- print("🪟 Installing on Windows...")
178
156
  exe = find_move_delete_windows(downloaded_file_path=downloaded, exe_name=exe_name, delete=True, rename_to=exe_name.replace(".exe", "") + ".exe")
179
157
  elif platform.system() in ["Linux", "Darwin"]:
180
158
  system_name = "Linux" if platform.system() == "Linux" else "macOS"
@@ -184,32 +162,23 @@ class Installer:
184
162
  error_msg = f"❌ ERROR: System {platform.system()} not supported"
185
163
  print(error_msg)
186
164
  raise NotImplementedError(error_msg)
187
-
188
165
  _ = exe
189
166
  if exe.name.replace(".exe", "") != exe_name.replace(".exe", ""):
190
167
  from rich import print as pprint
191
168
  from rich.panel import Panel
192
-
193
169
  print("⚠️ Warning: Executable name mismatch")
194
170
  pprint(Panel(f"Expected exe name: [red]{exe_name}[/red] \nAttained name: [red]{exe.name.replace('.exe', '')}[/red]", title="exe name mismatch", subtitle=repo_url))
195
171
  new_exe_name = exe_name + ".exe" if platform.system() == "Windows" else exe_name
196
172
  print(f"🔄 Renaming to correct name: {new_exe_name}")
197
173
  exe.with_name(name=new_exe_name, inplace=True, overwrite=True)
198
-
199
- print(f"💾 Saving version information to: {INSTALL_VERSION_ROOT.joinpath(exe_name)}")
200
174
  INSTALL_VERSION_ROOT.joinpath(exe_name).parent.mkdir(parents=True, exist_ok=True)
201
175
  INSTALL_VERSION_ROOT.joinpath(exe_name).write_text(version_to_be_installed or "unknown", encoding="utf-8")
202
- print("✅ Installation completed successfully!")
203
-
204
176
  def download(self, version: Optional[str]) -> tuple[PathExtended, str]:
205
177
  exe_name = self._get_exe_name()
206
178
  repo_url = self.installer_data["repoURL"]
207
- app_name = self.installer_data["appName"]
208
- print(f"📥 DOWNLOADING: {exe_name} 📥")
209
-
179
+ # app_name = self.installer_data["appName"]
210
180
  download_link: Optional[str] = None
211
181
  version_to_be_installed: Optional[str] = None
212
-
213
182
  if "github" not in repo_url or ".zip" in repo_url or ".tar.gz" in repo_url:
214
183
  # Direct download URL
215
184
  download_link = repo_url
@@ -222,21 +191,15 @@ class Installer:
222
191
  arch = get_normalized_arch()
223
192
  os_name = get_os_name()
224
193
  print(f"🧭 Detected system={os_name} arch={arch}")
225
-
226
194
  # Use existing get_github_release method to get download link and version
227
195
  download_link, version_to_be_installed = self.get_github_release(repo_url, version)
228
-
229
196
  if download_link is None:
230
197
  raise ValueError(f"Could not retrieve download link for {exe_name} version {version or 'latest'}")
231
-
232
198
  print(f"📦 Version to be installed: {version_to_be_installed}")
233
199
  print(f"🔗 Download URL: {download_link}")
234
-
235
200
  assert download_link is not None, "download_link must be set"
236
201
  assert version_to_be_installed is not None, "version_to_be_installed must be set"
237
- print(f"📥 Downloading {app_name} from: {download_link}")
238
202
  downloaded = PathExtended(download_link).download(folder=INSTALL_TMP_DIR).decompress()
239
- print(f"✅ Download and extraction completed to: {downloaded}")
240
203
  return downloaded, version_to_be_installed
241
204
 
242
205
  # --------------------------- Arch / template helpers ---------------------------
@@ -167,7 +167,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
167
167
  print(f"🗑️ ❌ DELETED {repr(self)}.")
168
168
  return self
169
169
 
170
- def move(self, folder: OPLike = None, name: Optional[str] = None, path: OPLike = None, rel2it: bool = False, overwrite: bool = False, verbose: bool = True, parents: bool = True, content: bool = False) -> "PathExtended":
170
+ def move(self, folder: OPLike = None, name: Optional[str] = None, path: OPLike = None, rel2it: bool = False, overwrite: bool = False, verbose: bool = True, parents: bool = True, content: bool = False) -> "PathExtended": # type: ignore
171
171
  path = self._resolve_path(folder=folder, name=name, path=path, default_name=self.absolute().name, rel2it=rel2it)
172
172
  if parents:
173
173
  path.parent.mkdir(parents=True, exist_ok=True)
@@ -193,9 +193,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
193
193
  print(f"🚚 MOVED {repr(self)} ==> {repr(path)}`")
194
194
  return path
195
195
 
196
- def copy(
197
- self, folder: OPLike = None, name: Optional[str] = None, path: OPLike = None, content: bool = False, verbose: bool = True, append: Optional[str] = None, overwrite: bool = False, orig: bool = False
198
- ) -> "PathExtended": # tested %100 # TODO: replace `content` flag with ability to interpret "*" in resolve method.
196
+ def copy(self, folder: OPLike = None, name: Optional[str] = None, path: OPLike = None, content: bool = False, verbose: bool = True, append: Optional[str] = None, overwrite: bool = False, orig: bool = False) -> "PathExtended": # type: ignore
199
197
  dest = self._resolve_path(folder=folder, name=name, path=path, default_name=self.name, rel2it=False)
200
198
  dest = dest.expanduser().resolve()
201
199
  dest.parent.mkdir(parents=True, exist_ok=True)
@@ -6,7 +6,7 @@ from machineconfig.utils.terminal import Response, MACHINE
6
6
  from machineconfig.utils.accessories import pprint
7
7
 
8
8
  UV_RUN_CMD = "$HOME/.local/bin/uv run"
9
- MACHINECONFIG_VERSION = """ "machineconfig>=5.71" """
9
+ MACHINECONFIG_VERSION = """ "machineconfig>=5.72" """
10
10
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
11
11
 
12
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 5.71
3
+ Version: 5.73
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -46,8 +46,8 @@ machineconfig/cluster/templates/cli_trogon.py,sha256=PFWGy8SFYIhT9r3ZV4oIEYfImsQ
46
46
  machineconfig/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  machineconfig/jobs/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  machineconfig/jobs/installer/check_installations.py,sha256=uFuxhgI8rIMtClcGmuc9gpG6iJ7X0__peGUQfGkreT8,10778
49
- machineconfig/jobs/installer/installer_data.json,sha256=MuoXT1Ovl4-_pPSS-XxiUJ67ksWZvunUjXscyq4GnvI,74795
50
- machineconfig/jobs/installer/package_groups.py,sha256=lS8uG-gGLLodJm4grhGuhAJl7shTWfwKB2wGSD0PHzY,5378
49
+ machineconfig/jobs/installer/installer_data.json,sha256=Cf-55djN5SpOpcFEaMDOJRkLD-lkm18smjLIPAU-s3Q,75020
50
+ machineconfig/jobs/installer/package_groups.py,sha256=i4z83F_rk7BVsrwFhz5Vn4SLF0IHxyQBFSxpAaZBl8M,5270
51
51
  machineconfig/jobs/installer/custom/gh.py,sha256=gn7TUSrsLx7uqFqj1Z-iYglS0EYBSgtJ9jWHxaJIfXM,4119
52
52
  machineconfig/jobs/installer/custom/hx.py,sha256=YQClQXqWtGvon8BLFGf1Fp20JPkHgZeEZ6ebmCJQQfI,5838
53
53
  machineconfig/jobs/installer/custom_dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -120,19 +120,20 @@ machineconfig/scripts/linux/other/share_smb,sha256=HZX8BKgMlS9JzkGIYnxTsPvoxEBBu
120
120
  machineconfig/scripts/linux/other/start_docker,sha256=_yDN_PPqgzSUnPT7dmniMTpL4IfeeaGy1a2OL3IJlDU,525
121
121
  machineconfig/scripts/linux/other/switch_ip,sha256=NQfeKMBSbFY3eP6M-BadD-TQo5qMP96DTp77KHk2tU8,613
122
122
  machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
- machineconfig/scripts/python/agents.py,sha256=PNjpI8ve_CP8Y091lWy5YbpI89ApOW1g47bnqXAMDFg,10339
124
- machineconfig/scripts/python/cloud.py,sha256=_05zIiBzG4fKhFytg9mjvMBv4qMUtQJL0RtpYUJFZ3Y,920
125
- machineconfig/scripts/python/croshell.py,sha256=lTPw3UhXDr-fumi4s2FvvOW21XcAOKlJg2m4sa8Mz_o,7193
126
- machineconfig/scripts/python/devops.py,sha256=f9Tc2EQNO1sImE1J6Vp4HlvPozMlgbtO1t84l8knr40,2050
123
+ machineconfig/scripts/python/agents.py,sha256=DIfM7mqi8BhB7PWk-UiBNOYjUzQHdeA1hoS8v3FHKPQ,10446
124
+ machineconfig/scripts/python/cloud.py,sha256=ubLmf06FSdi1NawpQDgUDAtYb9cZSQqHbSUHzAwRIas,1199
125
+ machineconfig/scripts/python/croshell.py,sha256=DPrnIB_Nqg_rRXdZPXZTrfbHX5WmGrsMZzsxEoX1xYo,7083
126
+ machineconfig/scripts/python/devops.py,sha256=fxa-C4J4Ds8etPx8sfJOj32llcGJf7W4rfbE2OEgjzE,2049
127
127
  machineconfig/scripts/python/devops_navigator.py,sha256=4O9_-ACeP748NcMjWQXZF7mBQpMPxqCGhLvPG3DMi4Q,236
128
- machineconfig/scripts/python/entry.py,sha256=0D6xAXpB5aNZ_fyKKr3oXVuiRgZqHUUkbTCHJnq0SLM,1481
128
+ machineconfig/scripts/python/entry.py,sha256=Az7dK1eXHGW5l46Yg10Cd88VChCdhvLAzO3e1A3r56A,2176
129
129
  machineconfig/scripts/python/fire_jobs.py,sha256=O5DrckUGLxGblOcLf_iXU31pmCSpTg-c0hQZxQKD1os,13591
130
130
  machineconfig/scripts/python/ftpx.py,sha256=UBDP6IIfWkaML1uZT1FrfGUUy_Of5LI82IdqEzo05_U,9760
131
- machineconfig/scripts/python/interactive.py,sha256=v_2S-uZck0LcyfWp3q54SA8ROh2xr_F1pFCTO0WtjLs,11790
132
- machineconfig/scripts/python/sessions.py,sha256=91eqV7SMemOZDuIQMqz36-AFbrpvPLbVdR6BZppY1xA,9559
131
+ machineconfig/scripts/python/interactive.py,sha256=TBUfE-oCyPYq9XVxVEoqqhrFoS2lCfd2nRG5maP4QeI,11790
132
+ machineconfig/scripts/python/sessions.py,sha256=Xaol7AzLItb3GIHo_sEVFUpFmTKDeTgqlK3-syqtNxw,9545
133
133
  machineconfig/scripts/python/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  machineconfig/scripts/python/ai/generate_files.py,sha256=VfjKdwgF8O6E4oiRtfWNliibLmmwGe7f9ld6wpOsXTw,14498
135
- machineconfig/scripts/python/ai/initai.py,sha256=53MuUgk92avRPM-U3dy6o_pnEj2thlurC8U6dz41_W0,2089
135
+ machineconfig/scripts/python/ai/initai.py,sha256=9SZtWOcRuwk8ZU3wHOfPzjInERD79ZTYFY8tVACgza4,2260
136
+ machineconfig/scripts/python/ai/vscode_tasks.py,sha256=61wMMIhtNTUO8Zvl8IziEdyadzgi5H0h8ACwq3cw6Ho,1255
136
137
  machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1,sha256=m_z4vzLrvi6bgTZumN8twcbIWb9i8ZHfVJPE8jPdxyc,5074
137
138
  machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh,sha256=Mt9D0LSEwbvVaq_wxTAch4NLyFUuDGHjn6rtEt_9alU,4615
138
139
  machineconfig/scripts/python/ai/solutions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -160,7 +161,7 @@ machineconfig/scripts/python/ai/solutions/opencode/opencode.py,sha256=AbpHGcgLb-
160
161
  machineconfig/scripts/python/cloud_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
162
  machineconfig/scripts/python/cloud_helpers/cloud_copy.py,sha256=7w0bNMPmSlsoYPCaicja7c2uEwxpj3pyA_ZaPqvmsgc,8517
162
163
  machineconfig/scripts/python/cloud_helpers/cloud_helpers.py,sha256=GA-bxXouUmknk9fyQAsPT-Xl3RG9-yBed71a2tu9Pig,4914
163
- machineconfig/scripts/python/cloud_helpers/cloud_mount.py,sha256=GwcXbd5ohoHGESfX5edtCEl2-umDDxH_AZapmFSzc9E,6740
164
+ machineconfig/scripts/python/cloud_helpers/cloud_mount.py,sha256=DEZHwOgFcAVoI-NrBflFLbAjijOYZYq_D5M8xJQdtSQ,6487
164
165
  machineconfig/scripts/python/cloud_helpers/cloud_sync.py,sha256=-xRPOF2S4_Q5QoNOmp_lJ_wWGNyeztEjn0o57V31ZjI,3447
165
166
  machineconfig/scripts/python/cloud_helpers/helpers2.py,sha256=aPGz_3WqZJaqmn_bGMtFFmDlLytnOS5KWacZMgXTDJw,7310
166
167
  machineconfig/scripts/python/cloud_helpers/helpers5.py,sha256=dPBvA9Tcyx9TMgM6On49A1CueGMhBdRzikDnlJGf3J0,1123
@@ -171,12 +172,12 @@ machineconfig/scripts/python/croshell_helpers/start_slidev.py,sha256=HfJReOusTPh
171
172
  machineconfig/scripts/python/croshell_helpers/viewer.py,sha256=heQNjB9fwn3xxbPgMofhv1Lp6Vtkl76YjjexWWBM0pM,2041
172
173
  machineconfig/scripts/python/croshell_helpers/viewer_template.py,sha256=ve3Q1-iKhCLc0VJijKvAeOYp2xaFOeIOC_XW956GWCc,3944
173
174
  machineconfig/scripts/python/devops_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
174
- machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=GE5Z35he2wemMHgsIxvT2lqLsxaoBygGTj5qzzFf7rE,5333
175
+ machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=CRzZ_dTUPt-hSZYr3W4GGK0OO5J0-U6b32kjrwhyI50,5332
175
176
  machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py,sha256=rjTys4FNf9_feP9flWM7Zvq17dxWmetSiGaHPxp25nk,2737
176
177
  machineconfig/scripts/python/devops_helpers/cli_data.py,sha256=kvJ7g2CccjjXIhCwdu_Vlif8JHC0qUoLjuGcTSqT-IU,514
177
178
  machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=U-W6ox-7ctGqQcjFWsDwZKmqQdl1etz9CMOes-B0Wgc,2959
178
- machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=IgyntAJ-qIEnaet3bnhhRg6SI519FgGWDBoQ6mLE7ZQ,12016
179
- machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=p0PckQwaYrsC5BzQgJXiceQzKqDmVOY6BYti60ka2H4,3790
179
+ machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=HJH5ZBob_Uzhc3fDgG9riOeW6YEJt88xTjQYcEUPmUY,12015
180
+ machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=72Hyx4MUDAK8mwn-YNMUMkHxCjkWPgQENQKFL0Q9ok0,3789
180
181
  machineconfig/scripts/python/devops_helpers/cli_share_server.py,sha256=285OzxttCx7YsrpOkaapMKP1eVGHmG5TkkaSQnY7i3c,3976
181
182
  machineconfig/scripts/python/devops_helpers/cli_terminal.py,sha256=k_PzXaiGyE0vXr0Ii1XcJz2A7UvyPJrR31TRWt4RKRI,6019
182
183
  machineconfig/scripts/python/devops_helpers/devops_add_identity.py,sha256=wvjNgqsLmqD2SxbNCW_usqfp0LI-TDvcJJKGOWt2oFw,3775
@@ -193,7 +194,7 @@ machineconfig/scripts/python/env_manager/path_manager_tui.py,sha256=YAZb1KOVpkfT
193
194
  machineconfig/scripts/python/helper_navigator/__init__.py,sha256=6YBy1l9ISjHE0LctVwSRMV_OFq29FOInwXFN0Ff7owM,758
194
195
  machineconfig/scripts/python/helper_navigator/command_builder.py,sha256=tMIonhYPWpdPGaiGPRg8JDCvyW0h2uxL15uL_JyWsnk,4617
195
196
  machineconfig/scripts/python/helper_navigator/command_detail.py,sha256=i4MdiCOVaXdRmLqr4K-F1Mk1u93bl5heIN97cRPCnzg,1692
196
- machineconfig/scripts/python/helper_navigator/command_tree.py,sha256=EcyQmQJNW5HA1Zq_wwl6-uWwyrP1vd0hOWyDQny79Tc,19501
197
+ machineconfig/scripts/python/helper_navigator/command_tree.py,sha256=bppJyuVFSD29_xnGLa2jrea3zeLYAtYuSlzGK7Y1ShE,20215
197
198
  machineconfig/scripts/python/helper_navigator/data_models.py,sha256=62CIZ01rfCD2mKX_ihEVuhNzZ8FDnRSEIIQuyKOtmOg,533
198
199
  machineconfig/scripts/python/helper_navigator/main_app.py,sha256=HhBttfk0bdQfWD9lC8yyoYDKBMzxkpw7NKE0IS7JUFE,8844
199
200
  machineconfig/scripts/python/helper_navigator/search_bar.py,sha256=kDi8Jhxap8wdm7YpDBtfhwcPnSqDPFrV2LqbcSBWMT4,414
@@ -223,7 +224,7 @@ machineconfig/scripts/python/helpers_repos/grource.py,sha256=IywQ1NDPcLXM5Tr9xhm
223
224
  machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=G_quiKOLNkWD5UG8ekexgh9xbpW4Od-J1pLJbLLWnpg,993
224
225
  machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
226
  machineconfig/scripts/python/nw/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
226
- machineconfig/scripts/python/nw/mount_nfs,sha256=9UrqeY_qpog2mdXpw0a6qLkOwJislpqqSAMgn9u46Uk,1855
227
+ machineconfig/scripts/python/nw/mount_nfs,sha256=g5vtvHopepusp-4u2x9dSUe5Xo9vPqIqQJtIGNY9jfY,1855
227
228
  machineconfig/scripts/python/nw/mount_nfs.py,sha256=lOMDY4RS7tx8gsCazVR5tNNwFbaRyO2PJlnwBCDQgCM,3573
228
229
  machineconfig/scripts/python/nw/mount_nw_drive,sha256=BqjGBCbwe5ZAsZDO3L0zHhh_gJfZy1CYOcqXA4Y-WkQ,2262
229
230
  machineconfig/scripts/python/nw/mount_nw_drive.py,sha256=iru6AtnTyvyuk6WxlK5R4lDkuliVpPV5_uBTVVhXtjQ,1550
@@ -235,7 +236,7 @@ machineconfig/scripts/python/nw/wsl_windows_transfer.py,sha256=1ab9l-8MtAxofW5nG
235
236
  machineconfig/scripts/python/repos_helpers/action.py,sha256=t6x9K43Uy7r5aRpdODfsN-5UoMrYXEG2cVw-Y8l9prw,14847
236
237
  machineconfig/scripts/python/repos_helpers/clone.py,sha256=9vGb9NCXT0lkerPzOJjmFfhU8LSzE-_1LDvjkhgnal0,5461
237
238
  machineconfig/scripts/python/repos_helpers/count_lines.py,sha256=ZLEajCLmlFFY969BehabqGOB9_kkpATO3Lt09L7KULk,15968
238
- machineconfig/scripts/python/repos_helpers/count_lines_frontend.py,sha256=lspw1XbLHHmndrbqiTJp2n1PDDD-qGz93et_f_vZP9U,568
239
+ machineconfig/scripts/python/repos_helpers/count_lines_frontend.py,sha256=lN6_P5S0aQTVxddp9EVxDTYbbilo5NJ4cO1nvr8GSP0,568
239
240
  machineconfig/scripts/python/repos_helpers/entrypoint.py,sha256=C-_D03abE0TkVCJ4jZoliUMAhRRkZ77mcwMoPOuieJQ,2827
240
241
  machineconfig/scripts/python/repos_helpers/record.py,sha256=3T5VmMbvywScZhTW2j4cGLK0T2LSWxKfnXkRTxkuLP4,10994
241
242
  machineconfig/scripts/python/repos_helpers/sync.py,sha256=CLLWy2n2gY9beXPF-mblOQ6R7cKoenkJjMiX7tHQsBk,3091
@@ -248,7 +249,7 @@ machineconfig/scripts/windows/fzfrga.bat,sha256=rU_KBMO6ii2EZ0akMnmDk9vpuhKSUZqk
248
249
  machineconfig/scripts/windows/mounts/mount_nfs.ps1,sha256=XrAdzpxE6a4OccSmWJ7YWHJTnsZK8uXnFE5j9GOPA20,2026
249
250
  machineconfig/scripts/windows/mounts/mount_nw.ps1,sha256=puxcfZc3ZCJerm8pj8OZGVoTYkhzp-h7oV-MrksSqIE,454
250
251
  machineconfig/scripts/windows/mounts/mount_smb.ps1,sha256=PzYWpIO9BpwXjdWlUQL9pnMRnOGNSkxfh4bHukJFme8,69
251
- machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=GHhZhUhLEzjMqud4hHBnHIbIRAo3L7LFTK7DN5J_QH0,322
252
+ machineconfig/scripts/windows/mounts/mount_ssh.ps1,sha256=6lJRZ3GENlAK51S8piQj0kGz1_etSUKskEIT15berao,322
252
253
  machineconfig/scripts/windows/mounts/share_cloud.cmd,sha256=exD7JCdxw2LqVjw2MKCYHbVZlEqmelXtwnATng-dhJ4,1028
253
254
  machineconfig/scripts/windows/mounts/share_smb.ps1,sha256=U7x8ULYSjbgzTtiHNSKQuTaZ_apilDvkGV5Xm5hXk5M,384
254
255
  machineconfig/scripts/windows/mounts/unlock_bitlocker.ps1,sha256=Wv-SLscdckV-1mG3p82VXKPY9zW3hgkRmcLUXIZ1daE,253
@@ -363,7 +364,7 @@ machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKG
363
364
  machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
364
365
  machineconfig/setup_linux/ssh/openssh_wsl.sh,sha256=1eeRGrloVB34K5z8yWVUMG5b9pV-WBfHgV9jqXiYgCQ,1398
365
366
  machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJCtkSfBOftt0aFyDZq_eMs,68
366
- machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=bl-J0RkhkT_q-KkA2X9K7AYE1HM5X4ARJ-0XjTmEIDY,880
367
+ machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=yXjczeP-w9vUH2Smb-2hH_QIo8pnd0yrFb1Llbd5YuE,880
367
368
  machineconfig/setup_windows/__init__.py,sha256=NnSVZkIBoxoMgkj-_KAqGonH3YziBIWXOKDEcmNAGTY,386
368
369
  machineconfig/setup_windows/apps.ps1,sha256=G5GqZ9G0aiQr_A-HaahtRdzpaTTdW6n3DRKMZWDTSPc,11214
369
370
  machineconfig/setup_windows/uv.ps1,sha256=mzkFJUQ57dukVQtY7WqAQIVUDMcixnkir8aNM_TYrl4,350
@@ -373,7 +374,7 @@ machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhm
373
374
  machineconfig/setup_windows/ssh/add-sshkey.ps1,sha256=qfPdqCpd9KP3VhH4ifsUm1Xvec7c0QVl4Wt8JIAm9HQ,1653
374
375
  machineconfig/setup_windows/ssh/add_identity.ps1,sha256=b8ZXpmNUSw3IMYvqSY7ClpdWPG39FS7MefoWnRhWN2U,506
375
376
  machineconfig/setup_windows/ssh/openssh-server.ps1,sha256=OMlYQdvuJQNxF5EILLPizB6BZAT3jAmDsv1WcVVxpFQ,2529
376
- machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=qSyMu2dx3nTHBt6N1Tt7Mscqx8fPEWlz86y99ocZcNc,919
377
+ machineconfig/setup_windows/web_shortcuts/interactive.ps1,sha256=7zZ-_N4t-_XAF5tkZfEd5DzpKYAe3VXyKf-5miPtJgk,919
377
378
  machineconfig/setup_windows/wt_and_pwsh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
378
379
  machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py,sha256=ogxJnwpdcpH7N6dFJu95UCNoGYirZKQho_3X0F_hmXs,6791
379
380
  machineconfig/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -385,13 +386,13 @@ machineconfig/utils/links.py,sha256=KM6vIn3hag9FYEzLSHP5MAM9tU_RStw2mCq2_OvmmZA,
385
386
  machineconfig/utils/meta.py,sha256=fDn7cpq6iqAPzX2eKLSK9DZb0870rluR7eLDx5NgNaw,5994
386
387
  machineconfig/utils/notifications.py,sha256=tuXIudcip0tEioG-bm8BbLr3FMDve4f6BktlznBhKxM,9013
387
388
  machineconfig/utils/options.py,sha256=vUO4Kej-vDOv64wHr2HNDyu6PATURpjd7xp6N8OOoJg,7083
388
- machineconfig/utils/path_extended.py,sha256=Xjdn2AVnB8p1jfNMNe2kJutVa5zGnFFJVGZbw-Bp_hg,53200
389
+ machineconfig/utils/path_extended.py,sha256=4RhL0twcIG2kJxmC4r_YzaiTxrYkSRbdh9SO5ObMABw,53122
389
390
  machineconfig/utils/path_helper.py,sha256=0e3Xh3BAEv27oqcezNeVLHJllGmLEgLH4T1l90m-650,8014
390
391
  machineconfig/utils/procs.py,sha256=w75oGKfR7FpT1pGTGd2XscnEOO0IHBWxohLbi69hLqg,11418
391
392
  machineconfig/utils/scheduler.py,sha256=jZ_1yghqA3-aINPRmE_76gboqJc0UElroR7urNOfXKs,14940
392
393
  machineconfig/utils/scheduling.py,sha256=RF1iXJpqf4Dg18jdZWtBixz97KAHC6VKYqTFSpdLWuc,11188
393
394
  machineconfig/utils/source_of_truth.py,sha256=ZAnCRltiM07ig--P6g9_6nEAvNFC4X4ERFTVcvpIYsE,764
394
- machineconfig/utils/ssh.py,sha256=2ssLAz1w_AdhqVOwa2DzH621G9fK3qHT3qyJzCuUEHc,37564
395
+ machineconfig/utils/ssh.py,sha256=HuDfIo6yo6NC5FmsxelSNAVu8LJm9Zl7JQialTpmV94,37564
395
396
  machineconfig/utils/terminal.py,sha256=IlmOByfQG-vjhaFFxxzU5rWzP5_qUzmalRfuey3PAmc,11801
396
397
  machineconfig/utils/upgrade_packages.py,sha256=H96zVJEWXJW07nh5vhjuSCrPtXGqoUb7xeJsFYYdmCI,3330
397
398
  machineconfig/utils/ve.py,sha256=L-6PBXnQGXThiwWgheJMQoisAZOZA6SVCbGw2J-GFnI,2414
@@ -409,14 +410,14 @@ machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
409
410
  machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
410
411
  machineconfig/utils/installer_utils/installer.py,sha256=bWFSIW05hDo6p1BsNqK-yCQL5ZNU_eZxCQW1QLLc-SA,9759
411
412
  machineconfig/utils/installer_utils/installer_abc.py,sha256=ZoMtINHD9cHEu4R5SYUWgHLTAqo4F2a33pBrEOGX4zs,11693
412
- machineconfig/utils/installer_utils/installer_class.py,sha256=UU0ccaNWY16a-ErySkXnxzWnmhPesHNRhfPIVVPtzKA,18363
413
+ machineconfig/utils/installer_utils/installer_class.py,sha256=zkbomiesAgc75BjVoe8KbjCMxaykotJ0dv9vKlm2Kv0,16756
413
414
  machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=Xbi59rU35AzR7HZZ8ZQ8aUu_FjSgijNqc8Sme0rCk2Y,2050
414
415
  machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
415
416
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
416
417
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
417
418
  machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
- machineconfig-5.71.dist-info/METADATA,sha256=i-BuaostGC5S8aXUGDW2ALKojtKhdnOORdqne2JiNYI,3103
419
- machineconfig-5.71.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
420
- machineconfig-5.71.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
421
- machineconfig-5.71.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
422
- machineconfig-5.71.dist-info/RECORD,,
419
+ machineconfig-5.73.dist-info/METADATA,sha256=mKS8xQAp2b7_4QOQnqeZBOHlVKvptEK6247qpr8eYfc,3103
420
+ machineconfig-5.73.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
421
+ machineconfig-5.73.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
422
+ machineconfig-5.73.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
423
+ machineconfig-5.73.dist-info/RECORD,,